1.源
#include "stdio.h"
#define N 10 //学生人数上限
#define M 5 //课程门数上限
struct stud
{ char name[10]; //姓名
double course[M];//成绩
double aver; //平均分
}s[N];
int main()
{
int n,m,i,j;
double sum,course[M]={0}; //用于统计每门课程的平均分
scanf("%d,%d",&n,&m); //输入学生人数与课程门数
j=0;
sum=0;
for(i=0;i<n;i++){
scanf("%s",s[i].name);
scanf("%lf %lf %lf",&s[i].course[j],&s[i].course[j+1],&s[i].course[j+2]);
course[j]=s[i].course[j]+course[j];
course[j+1]=s[i].course[j+1]+course[j+1];
course[j+2]=s[i].course[j+2]+course[j+2];
}
printf("name ");
for(j=0;j<m;j++) //求每门课程的平均分
{ course[j]=course[j]/n;
printf("CNO:%d ",j+1);//显示栏目
}
printf("\n");
for(i=0;i<n;i++)
{ printf("%10s",s[i].name);
for(j=0;j<m;j++)
if(s[i].course[j]<course[j])
printf("%5.1f ",s[i].course[j]);
else
printf("%8c",32);
printf("\n");
}
return 0;
}
2.代码思路
#include "stdio.h"
是一个预处理指令,用于包含标准输入输出头文件,以便使用printf()
和scanf()
函数。#define N 10
和#define M 5
是两个宏定义,用于定义两个常量N
和M
,分别表示学生人数和课程门数的上限。struct stud
是一个自定义的结构体类型,用于存储一个学生的信息,包括姓名、成绩和平均分。结构体中,name[10]
是一个长度为10
的字符数组,用于存储姓名;course[M]
是一个长度为M
的双精度浮点数数组,用于存储成绩;aver
是一个双精度浮点数,用于存储平均分。s[N]
是一个长度为N
的结构体数组,用于存储N
个学生的信息。int main()
是程序的主函数,程序的执行从这里开始。- 函数体中,首先定义了四个整数变量
n
、m
、i
和j
,用于表示实际的学生人数、课程门数和循环的控制变量;以及一个双精度浮点数变量sum
,用于存储成绩的总和;以及一个长度为M
的双精度浮点数数组course
,用于存储每门课程的平均分,并初始化为0
。 - 然后使用
scanf("%d,%d",&n,&m)
函数,从标准输入读取两个整数,用逗号分隔,赋值给n
和m
,表示实际的学生人数和课程门数。 - 接着使用一个
for
循环,从i = 0
到i < n
,每次循环中,先使用scanf("%s",s[i].name)
函数,从标准输入读取一个字符串,存储到结构体数组s
的第i
个元素的name
字段中,表示第i
个学生的姓名;然后使用scanf("%lf %lf %lf",&s[i].course[j],&s[i].course[j+1],&s[i].course[j+2])
函数,从标准输入读取三个双精度浮点数,用空格分隔,存储到结构体数组s
的第i
个元素的course
字段的第j
、j+1
和j+2
个位置中,表示第i
个学生的三门课程的成绩;然后将这三门课程的成绩分别累加到数组course
的第j
、j+1
和j+2
个位置中,用于计算每门课程的平均分。 - 然后使用
printf("name ")
函数,打印出姓名栏目的标题,后面跟八个空格。 - 接着使用一个
for
循环,从j = 0
到j < m
,每次循环中,先将数组course
的第j
个元素除以n
,得到第j+1
门课程的平均分,并赋值回数组course
的第j
个元素;然后使用printf("CNO:%d ",j+1)
函数,打印出第j+1
门课程的栏目的标题,格式为CNO:
加上课程编号,后面跟三个空格。 - 然后使用
printf("\n")
函数,输出一个换行符,表示结束标题行的打印。 - 接着使用一个嵌套的
for
循环,打印出每个学生的姓名和低于平均分的成绩。外层循环从i = 0
到i < n
,内层循环从j = 0
到j < m
,每次循环中,先使用printf("%10s",s[i].name)
函数,打印出结构体数组s
的第i
个元素的name
字段的值,表示第i
个学生的姓名,前面跟十个空格;然后判断结构体数组s
的第i
个元素的course
字段的第j
个位置的值是否小于数组course
的第j
个元素的值,如果是,就使用printf("%5.1f ",s[i].course[j])
函数,打印出该成绩,保留一位小数,后面跟三个空格;如果不是,就使用printf("%8c",32)
函数,打印出一个空格字符,其 ASCII 码为32
,前面跟八个空格。内层循环结束后,再使用printf("\n")
函数,输出一个换行符,表示结束一行的打印。 - 最后使用
return 0
语句,结束主函数。
一个可能的输出样例是:
输入:3,3
输入:Alice
输入:80 90 100
输入:Bob
输入:85 95 105
输入:Charlie
输入:75 85 95
输出:name CNO:1 CNO:2 CNO:3
输出: Alice 80.0 90.0
输出: Bob 105.0
输出: Charlie 75.0
这表示用户输入了 3
个学生和 3
门课程,分别是 Alice、Bob 和 Charlie,以及他们的成绩。每门课程的平均分分别是 80
、90
和 100
。低于平均分的成绩用数字显示,高于或等于平均分的成绩用空格代替。