| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 525 人关注过本帖
标题:C语言新手,刚学完指针小结一习题,大神们帮我看看,多给意见。
取消只看楼主 加入收藏
Adm〃h
Rank: 2
等 级:论坛游民
帖 子:26
专家分:18
注 册:2012-3-26
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:1 
C语言新手,刚学完指针小结一习题,大神们帮我看看,多给意见。
#include <stdio.h>
#include <conio.h>
#define N 4                                                     //题意 4 个学生
#define M 5                                                     //题意 5 门课
#define PASS_FRACTIONAL_LINE 72                                 //及格分数线
#define CONDITIONS 85                                           //标准线为85 (后期判定是否输出)
#define AVERAGE 90                                              //平均分数标准线为90 (后期判定是否输出)
char *ClassName[M]={"数学","语文","物理","化学","英语"};        //指针数组存放各课程名称(方便调用)
int numberAndScores[N][M];                                      //定义一个二维数组存放各学生学号以及各科成绩
void Math_average (int (*pline)[M]);                            //函数声明,计算数学(第一门课)课目 4 位同学的平均分
void Find_two_above();                                          //函数声明,查找两科以上不及格的学生
void Print_pass (int (*pointer)[M],int n);                      //函数声明,输出查找到的两科以上不及格学生的学号以及平均成绩
void Conditions (int (*p)[M]);                                  //函数声明,输出符合标准线(题意 85 )学生的学号
void Format_control ();                                         //函数声明,让格式有序
void main()
{
 int i,j;
 Format_control ();
 printf("\t\t\t    ▲题目\n\n");                              //输出题目
 printf("有一个班 4 个学生,5门课。\n\n①:求第一门课程的平均分;\n②:找出有 2 门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;\n③:找出平均成绩在90分以上或全部课程成绩在85分以上的学生。\n\n");
 Format_control ();
 printf("\t\t\t    ▲学生成绩录入\n\n");
 for (i=0;i<N;i++)
 {
  printf("学号为 %d 的同学:\n",i+1);
  for (j=0;j<M;j++)
  {
   printf("\t\t%s :",*(ClassName+j));
   scanf("%d",&numberAndScores[i][j]);
  }
  printf("\n");                                            //录入对应学生编号的学生成绩
 }
 Format_control ();
 printf("\t\t\t    ▲学生成绩统计表\n\n");
 for (i=0;i<N;i++)
 {
  printf("学号:%d \n\n",i+1);
  for (j=0;j<M;j++)
  {
   printf("      %s :%d 分",*(ClassName+j),numberAndScores[i][j]);
   printf("\n");
  }                                                         //输出各学生编号已经成绩
  printf("\n");
 }
 Format_control ()
 Math_average (&numberAndScores[0]);                           
 Find_two_above();
 Conditions (&numberAndScores[0]);                              //函数调用
}
void Math_average (int (*pline)[M])
{
 float ave,sum=0;                                               
 int i;                                                         // ave 存放平均值,sum 存放累加和,i 循环控制变量
 printf("\t\t\t     ▲ %d 位同学的数学平均分\n\n",N);
 for (i=0;i<N;i++,*pline++)
 {
  sum=sum+**pline;
 }
 i=0;
 ave=sum/N;
 printf("  %.2f 分",ave);
 printf("\n\n\n");                                              //求 ave
 Format_control ();
}
void Find_two_above ()
{
 int i,j,failed,temp=0;                                         //i j 分别控制"行","列",failed 统计失败(不及格)次数.temp 统计是否存在"失败"
 printf("\t\t\t     ▲ 2 门以上课程不及格的学生\n\n");
 for (i=0;i<N;i++)
 {
  failed=0;
  for (j=0;j<M;j++)
  {
   if (numberAndScores[i][j]<=PASS_FRACTIONAL_LINE)        //若 numberAndScores[i][j] <= PASS_FRACTTIONAL_LINE 条件满足
   {
    failed++;                                           // failed+1 (failed统计不及格次数)
   }
  }
  if (failed>=2)                                              // 当 j(列控制循环结束) 判断 failed 次数.如果 >= 2
  {
   Print_pass (&numberAndScores[i],i);                     // 调用 Print_pass 函数
   temp++;                                                 // 当执行到 if 块时,temp++
  }
 }
 if (temp==0)                                                    // 当 temp统计数为 0 时,表示为当前无"失败(无不及格成绩)"
 {
  printf("\t\t\t\t\t\t\t!!! Not find  \n\n");                 // 输出  not find
 }
 Format_control ();
}
void Print_pass (int (*pointer)[M],int n)                           //形参是指向一维数组的指针变量,这里用来接受传递过来的某一行的首地址
{
 int i;
 float ave,sum=0;
 printf("     %d 号同学\n\n",n+1);
 printf("     他的全部成绩如下:\n\n\n");
 for (i=0;i<M;i++)
 {
  sum+=*(*pointer+i);
  printf("           %s:%d 分\n",*(ClassName+i),*(*pointer+i));   
  n++;
 }
 ave=sum/M;
 printf("\n\t\t  平均成绩为:%.2f 分\n",ave);
 printf("\n\n");                                                  // 输出不及格学生的各科成绩已经他的平均成绩
}
void Conditions (int (*p)[M])
{
 int i,j,num,temp=0;
 float ave,sum;
 printf("\t\t ▲ 平均分在 %d 分以上或全课程成绩在 %d 分以上的学生\n\n\n",AVERAGE,CONDITIONS);
 for (i=0;i<N;i++)
 {
  num=0;                                                   
  sum=0;                                                     //初始化 num sum .经过循环后 其值会发生变化而影响下面判断的结果
  for (j=0;j<M;j++)
  {
   sum+=*(*(p+i)+j);
   if (*(*(p+i)+j)>CONDITIONS)                            //当 第一行的第一列>CONDITIONS (题目中提供的达标线)
   {
    num++;                                            //num++ 为检验是否全科达标做铺垫
   }
  }
  ave=sum/N;                                                 //计算 平均值
  if (num==M||ave>AVERAGE)                                   //当 num==M (全科达标)或ave>AVERAGE(总分的平均分高于题目提供的分数)
  {
   printf("   学号 :%d \n",i+1);
   printf("          平均分:%.2f 分,且各科成绩均在 %d 分以上\n\n",ave,CONDITIONS);  //条件成立时,输出
   temp++;                                                
  }
 }                                                             //找出90分以上或全部成绩在85以上的学生。
 if (temp==0)                                                  // 当 temp统计数为 0 时,表示为当前无"失败(无不及格成绩)"
  {
   printf("\t\t\t\t\t\t\t!!! Not find  \n\n");
  }
 Format_control ();
}
void Format_control ()
{
 printf("------------------------------------------------------------------------\n\n");
}

大神帮忙读下代码(代码可能有点蠢,别喷),给点宝贵的建议,也好让小菜我多多学习。
搜索更多相关主题的帖子: include 分数线 C语言 
2012-11-05 00:04
Adm〃h
Rank: 2
等 级:论坛游民
帖 子:26
专家分:18
注 册:2012-3-26
收藏
得分:0 
回复 2楼 wp231957
也就是说代码太蠢,不灵活是吧。。能告诉我写一个这样的代码需要如何对它进行细化吗?

当一个问题思考许久后却还是不得其解时 我会去睡一觉或出去走走之后我可能会灵感爆发。
2012-11-05 15:07
快速回复:C语言新手,刚学完指针小结一习题,大神们帮我看看,多给意见。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044934 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved