【项目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;
}