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");
}
大神帮忙读下代码(代码可能有点蠢,别喷),给点宝贵的建议,也好让小菜我多多学习。