【项目2- 成绩处理】
在数组score中将要存储某小组C程序设计的成绩,请完成下面的处理:
(1)输入小组人数及成绩,要保证成绩在0-100之间;
(2)输出该小组的最高成绩、最低成绩、平均成绩;
(3)输出考得最高成绩和最低成绩的同学的人数;
(4)输出考得最高成绩和最低成绩的同学的学号(设数组下标即学号,可能有相同的成绩)。
(5)(选做)求出所有同学成绩的标准偏差,标准偏差公式为,其中为样本(即某同学成绩),为均值(前面已经求出),N为样本数目;
提示1:可以采用“渐进式”策略,实现一个功能后调试通过,再实现下一个功能。
提示2:界面参考见图
提示3:请思考,如果这里的同学人数很多,例如500、10000名,这个程序中通过键盘输入的方式,已经显得无能为力!如何解决?
int main() { int score[50]; //保存成绩的数组,不会超过50名 int num,i; //小组人数 printf("小组共有多少名同学?"; scanf("%d", &num); printf("请输入学生成绩:\n") //输入num名同学的成绩 //求出并输出最高成绩、最低成绩和平均成绩 //求出并输出考得最高成绩和最低成绩人数以及学号 //求出并输出标准偏差(选做) return 0; }[参考解答]
#include<stdio.h> #include<math.h> int main( ) { int score[50]; //保存成绩的数组,不会超过50名 int num,i; //小组人数 printf("小组共有多少名同学?"); scanf("%d", &num); printf("请输入学生成绩:\n"); //输入num名同学的成绩 for(i=0; i<num; i++) do { printf("输入第 %d 位同学的成绩:", i); scanf("%d", &score[i]); } while(score[i]<0||score[i]>100); //求最高成绩、最低成绩和平均成绩 int max = -1,min=999,sum=0, ave; for(i=0; i<num; i++) { sum+=score[i]; if(max<score[i]) max= score[i]; if(min>score[i]) min = score[i]; } ave=sum/num; printf("\n"); printf("最高成绩为:%d,最低成绩为:%d,平均成绩为:%d\n", max, min, ave); //求考得最高成绩和最低成绩人数 int max_num = 0, min_num =0; for(i=0; i<num; i++) { if(max==score[i]) max_num++; if(min==score[i]) min_num++; } //输出考得最高成绩的人数和学号 printf("取得最高成绩 %d 分的共 %d 人,他们的学号是:", max, max_num); for(i=0; i<num; i++) { if(max==score[i]) printf("%d ", i); } printf("\n"); printf("取得最低成绩 %d 分的共 %d 人,他们的学号是:", min, min_num); //输出考得最低成绩的人数和学号 for(i=0; i<num; i++) { if(min==score[i]) printf("%d ", i); } printf("\n"); //求出并输出标准偏差(选做) sum = 0; int x; //x表示成绩与均值之差 for(i=0; i<num; i++) { x=score[i]-ave;//ave是前面求出的平均成绩 sum+=x*x; } printf("标准偏差为:%.4f\n", sqrt((double)(sum)/(num-1))); return 0; }