【项目5-体验文件操作】

  先阅读《文件操作初体验》。文件english.dat(含10000个数据的文件在BB平台。为方便校外读者,本文后附100个数据,自行复制粘贴到记事本中保存为文件english.dat))中给出的是2012级10000名新生入学英语分级考试全校同学的成绩。编程序,求出这次考试的平均成绩,并统计各分数段的人数(优秀:≥90,良好:≥80,中等:≥70,及格:≥60,不及格:<60)。运行结果如图所示。

  C++第11周项目5——体验文件操作_#include

  提示:本任务完成困难,可以考虑预做下面的练习

  练习1:从文件中读出学生的成绩,输出最高、最低,以及平均成绩(平均成绩为小数)。

  练习2:从文件中读出学生的成绩,统计90分以上学生的人数并输出。

  拓展1:将输出界面改良下,显示成下面的样子(仅变输出方式)

  C++第11周项目5——体验文件操作_ios_02

  拓展2:将统计结果保存到数据文件statictic.dat中(提示:要写入文件了)


【参考解答】

项目任务参考代码:

#include <fstream>   //操作文件必写
#include<iostream>
using namespace std;
int main( )
{
int s,i,r;
int a=0, b=0,c=0,d=0,e=0;//分别代表优秀、良好、中等、及格、不及格人数
double sum=0,ave;
//以输入的方式(ios::in)打开文件
ifstream infile("english.dat",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0;i<10000;i++)
{
infile>>s;
sum+=s;
r=s/10; //r用于分出“档次”
switch(r)
{
case 10:
case 9:
a++;
break;
case 8:
b++;
break;
case 7:
c++;
break;
case 6:
d++;
break;
default:
e++;
break;
}
}
infile.close(); //读入完毕要关闭文件
//下面对数据的操作和文件就没有关系了,本例输出求得的最大值
ave=sum/10000;
cout<<"平均成绩为:"<<ave<<endl;
cout<<"优秀人数:"<<a<<endl;
cout<<"良好人数:"<<b<<endl;
cout<<"中等人数:"<<c<<endl;
cout<<"及格人数:"<<d<<endl;
cout<<"不及格人数:"<<e<<endl;
return 0;
}


拓展1参考代码:

#include <fstream>   //操作文件必写
#include<iostream>
using namespace std;
int main( )
{
int s,i,r;
int a=0, b=0,c=0,d=0,e=0;//分别代表优秀、良好、中等、及格、不及格人数
double sum=0,ave;
//以输入的方式(ios::in)打开文件
ifstream infile("english.dat",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0;i<10000;i++)
{
infile>>s;
sum+=s;
r=s/10; //r用于分出“档次”
switch(r)
{
case 10:
case 9:
a++;
break;
case 8:
b++;
break;
case 7:
c++;
break;
case 6:
d++;
break;
default:
e++;
break;
}
}
infile.close();

ave=sum/10000;
int max,l; //将存储这几个分数段中的最多人数,l是输出“进度条”的长度
max=a;
if(max<b) max=b;
if(max<c) max=c;
if(max<d) max=d;
if(max<e) max=e;
cout<<"平均成绩为:"<<ave<<endl;
//人数最多的(max)输出20个格子,据此可算出各档需要多少格子

cout<<"优秀 ";
l=double(a)/max*50;
for(i=0;i<l;++i)
cout<<'#';
cout<<" "<<a<<endl;
cout<<"良好 ";
l=double(b)/max*50;
for(i=0;i<l;++i)
cout<<'#';
cout<<" "<<b<<endl;
cout<<"中等 ";
l=double(c)/max*50;
for(i=0;i<l;++i)
cout<<'#';
cout<<" "<<c<<endl;
cout<<"及格 ";
l=double(d)/max*50;
for(i=0;i<l;++i)
cout<<'#';
cout<<" "<<d<<endl;
cout<<"挂科 ";
l=double(e)/max*50;
for(i=0;i<l;++i)
cout<<'#';
cout<<" "<<e<<endl;
return 0;
}



附:本文后附100个数据,自行复制粘贴到记事本中保存为文件english.dat,以便于完成练习。

66

77

97

65

69

79

79

77

69

74

90

73

64

69

69

69

74

71

83

96

87

88

62

76

65

51

66

73

77

78

73

52

78

75

73

60

69

56

76

68

76

77

87

56

61

62

69

64

73

68

62

62

79

88

79

77

71

57

88

69

71

78

74

67

86

55

86

78

81

52

66

67

68

85

72

74

84

64

61

76

71

64

91

72

82

60

70

64

84

75

67

67

85

70

59

72

87

65

55

77