【C语言】计算学生平均分系统

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() 是程序的主函数,程序的执行从这里开始。
  • 函数体中,首先定义了四个整数变量 nmi 和 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 字段的第 jj+1 和 j+2 个位置中,表示第 i 个学生的三门课程的成绩;然后将这三门课程的成绩分别累加到数组 course 的第 jj+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,以及他们的成绩。每门课程的平均分分别是 8090 和 100。低于平均分的成绩用数字显示,高于或等于平均分的成绩用空格代替。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值