【项目3-成绩统计】
文件english.dat(这个文件中的数据量,超出了你之前所有的体验)中已经有了学生的英语考试成绩数据。
(1)请编程从english.dat中读取数据,求出这次考试的平均成绩,并统计输出优秀人数和不及格人数。请在下面程序基础上填空完成:
#include <stdio.h> #include <stdlib.h> int main() { int score; //读入的成绩 int excelent=0, fail=0,count=0;//分别代表优秀、不及格人数、总人数 double sum=0,ave; //sum: 成绩和,ave: 平均分 //以输入的方式(ios::in)打开文件 FILE ____(1)____; fp=fopen(____(2)____); if(fp==NULL) { printf("open error!\n"); exit(1); } while(fscanf(____(3)____)!=EOF) //当读取成功…… { count++; sum+=score; if(____(4)____) excelent++; else if(score<60) ____(5)____; } ____(6)____; //下面输出结果 ave=sum/count; printf("总人数为:%d\n", count); printf("平均成绩为:%.2f\n", ave); printf("优秀人数:%d\n", excelent); printf("不及格人数:%d\n", fail); return 0; }
[参考解答]
#include <stdio.h> #include <stdlib.h> int main() { int score; //读入的成绩 int excelent=0, fail=0,count=0;//分别代表优秀、不及格人数、总人数 double sum=0,ave; //sum: 成绩和,ave: 平均分 //以输入的方式(ios::in)打开文件 FILE *fp; fp=fopen("english.dat","r"); if(fp==NULL) { printf("open error!\n"); exit(1); } while(fscanf(fp, "%d", &score)!=EOF) //当读取成功…… { count++; sum+=score; if(score>=90) excelent++; else if(score<60) fail++; } fclose(fp); //读入完毕要关闭文件 //下面输出结果 ave=sum/count; printf("总人数为:%d\n", count); printf("平均成绩为:%.2f\n", ave); printf("优秀人数:%d\n", excelent); printf("不及格人数:%d\n", fail); return 0; }
(2)扩充上面的程序,要求将统计结果保存到数据文件statictic.dat中(提示:要用fprintf写入文件了)
[参考解答]
#include <stdio.h> #include <stdlib.h> int main() { int score; //读入的成绩 int excelent=0, fail=0,count=0;//分别代表优秀、不及格人数、总人数 double sum=0,ave; //sum: 成绩和,ave: 平均分 //以输入的方式(ios::in)打开文件 FILE *fp; fp=fopen("english.dat","r"); if(fp==NULL) { printf("source file open error!\n"); exit(1); } while(fscanf(fp, "%d", &score)!=EOF) //当读取成功…… { count++; sum+=score; if(score>=90) excelent++; else if(score<60) fail++; } fclose(fp); //读入完毕要关闭文件 //下面输出结果 ave=sum/count; printf("总人数为:%d\n", count); printf("平均成绩为:%.2f\n", ave); printf("优秀人数:%d\n", excelent); printf("不及格人数:%d\n", fail); fp=fopen("statictic.dat","w"); if(fp==NULL) { printf("output file open error!\n"); exit(1); } fprintf(fp, "总人数为:%d\n", count); fprintf(fp, "平均成绩为:%.2f\n", ave); fprintf(fp, "优秀人数:%d\n", excelent); fprintf(fp, "不及格人数:%d\n", fail); fclose(fp); //读入完毕要关闭文件 //下面打开文件查看结果 return 0; }
(3)(用柱状图输出)编程序,求出这次考试的平均成绩,并统计各分数段的人数(优秀:≥90,良好:≥80,中等:≥70,及格:≥60,不及格:<60)。运行结果如图所示。试着将输出界面改变成成下面的样子(仅变输出方式)
[参考解答]
#include <stdio.h> #include <stdlib.h> int main() { int score; //读入的成绩 int rate; //根据成绩确定的等级 int excelent=0, good=0, medium=0, passing=0, fail=0,count=0;//分别代表优秀、不及格人数、总人数 double sum=0,ave; //sum: 成绩和,ave: 平均分 //以输入的方式(ios::in)打开文件 FILE *fp; fp=fopen("english.dat","r"); if(fp==NULL) { printf("source file open error!\n"); exit(1); } while(fscanf(fp, "%d", &score)!=EOF) //当读取成功…… { count++; sum+=score; rate=score/10; //rate用于分出“档次” switch(rate) { case 10: case 9: excelent++; break; case 8: good++; break; case 7: medium++; break; case 6: passing++; break; default: fail++; break; } } fclose(fp); //读入完毕要关闭文件 //下面输出结果,不同的数字对应的#数目不同 ave=sum/count; int max; //将存储这几个分数段中的最多人数 max=excelent; if(max<good) max=good; if(max<medium) max=medium; if(max<passing) max=passing; if(max<fail) max=fail; printf("平均成绩为:%.2f\n", ave); //现确定各个档次一共输出50个#,据此按比例可算出各档需要多少格子 printf("优秀 "); int l=((double)excelent)/max*50; int i; for(i=0; i<l; ++i) printf("#"); printf(" %d\n", excelent); printf("良好 "); l=((double)good)/max*50; for(i=0; i<l; ++i) printf("#"); printf(" %d\n", good); printf("中等 "); l=((double)medium)/max*50; for(i=0; i<l; ++i) printf("#"); printf(" %d\n", medium); printf("及格 "); l=((double)passing)/max*50; for(i=0; i<l; ++i) printf("#"); printf(" %d\n", passing); printf("挂科 "); l=((double)fail)/max*50; for(i=0; i<l; ++i) printf("#"); printf(" %d\n", fail); return 0; }
时间: 2024-12-22 01:55:14