课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759
【项目7-体验文件操作】
(1-预备)阅读并理解附后的《文件操作初体验》(必要时运行这些程序)。
(2-热身)从键盘读入10名学生的英语成绩,编程求出这次考试的平均成绩,并统计输出优秀人数和不及格人数。
#include <fstream> //操作文件必写
#include<iostream>
#include<cstdlib>
using namespace std;
int main( )
{
int i,s;
int a=0, b=0;//分别代表优秀、不及格人数、总人数
double sum=0,ave; //s: 成绩和,ave: 平均分
//以输入的方式(ios::in)打开文件
for(i=0; i<10; i++)
{
cin>>s;
sum+=s;
if(s>=90)
a++;
else if(s<60)
b++;
}
//下面输出结果
ave=sum/10;
cout<<"平均成绩为:"<<ave<<endl;
cout<<"优秀人数:"<<a<<endl;
cout<<"不及格人数:"<<b<<endl;
return 0;
}
(3-实战)文件english.dat(BB平台下载,该文件要和源程序在同一文件夹中)中已经有了学生的成绩数据,请改编(2)中的程序,编程求出这次考试的平均成绩,并统计输出优秀人数和不及格人数。
#include <fstream> //操作文件必写
#include<iostream>
#include<cstdlib>
using namespace std;
int main( )
{
int s; //读入的成绩
int a=0, b=0,count=0;//分别代表优秀、不及格人数、总人数
double sum=0,ave; //sum: 成绩和,ave: 平均分
//以输入的方式(ios::in)打开文件
ifstream infile("english.dat",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
while(infile>>s) //当读取成功……
{
count++;
sum+=s;
if(s>=90)
a++;
else if(s<60)
b++;
}
infile.close(); //读入完毕要关闭文件
//下面输出结果
ave=sum/count;
cout<<"总人数为:"<<count<<endl;
cout<<"平均成绩为:"<<ave<<endl;
cout<<"优秀人数:"<<a<<endl;
cout<<"不及格人数:"<<b<<endl;
return 0;
}
(4-实战)编程求出这次考试的最高成绩,以及得最高成绩的学生的学号(设学号即是相应数组元素的下标)。
#include <fstream> //操作文件必写
#include<iostream>
#include<cstdlib>
using namespace std;
int main( )
{
int s[10000],max=-1; //读入的成绩
int i,count=0;//分别代表优秀、不及格人数、总人数
//以输入的方式(ios::in)打开文件
ifstream infile("english.dat",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
while(infile>>s[count]) //当读取成功……
{
if(s[count]>max)
max=s[count];
count++;
}
infile.close(); //读入完毕要关闭文件
//下面输出结果
cout<<"总人数为:"<<count<<endl;
cout<<"最高分为:"<<max<<endl;
cout<<"得最高分的同学的学号为:";
for(i=0; i<count; i++)
if(s[i]==max)
cout<<i<<" ";
cout<<endl;
return 0;
}
(5-实战)据统计,这次考试成绩均分为71.49,标准偏差为10.33,请编程将成绩转换为标准分,并将转换后的成绩保存到文件english2.dat中。
标准分算法:Z=(X-A)/S,其中:X为原始分,A为全体考生的平均分,S为该次考试分数的标准偏差。标准分T=500+100Z。
求平均和求标准偏差的工作可以使用项目3中已经编制好的函数完成,为简单起见,也可以直接用题目中给出的数据。
#include <fstream> //操作文件必写
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
double get_avg(int s[], int n);
double get_stdev(int s[], int n);
int main( )
{
int i=0,ss,s[10000]; //读入的成绩
int count=0;//分别代表优秀、不及格人数、总人数
double ave,stdev;
//以输入的方式(ios::in)打开文件
ifstream infile("english.dat",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
while(infile>>ss)
{
s[i]=ss;
i++;
}
count=i;
infile.close(); //读入完毕要关闭文件
ave=get_avg(s,count); //求平均,可以直接赋值题目所给数据71.49
stdev=get_stdev(s,count);//求平均,可以直接用题目所给数据10.33
//转换成标准分
for(i=0; i<count; i++)
s[i]=500+100*(s[i]-ave)/stdev;
//输出到文件
//以输出的方式(ios::out)打开文件
ofstream outfile("english2.dat",ios::out);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0; i<count; i++)
outfile<<s[i]<<endl;
outfile.close();
cout<<"处理完毕!"<<endl;
return 0;
}
/*get_avg函数的功能是求出num名同学成绩中的平均成绩
*入口参数:
s - 存放成绩的数组
n - 学生人数
*返回值:平均成绩
*/
double get_avg(int s[], int n)
{
double sum = 0;
int i;
for(i=0; i<n; i++)
sum+=s[i];
return sum/n;
}
/* get_ stdev函数的功能是求出num名同学成绩的标准偏差
*入口参数:
s - 存放成绩的数组
n - 学生人数
*返回值:标准偏差
*/
double get_stdev(int s[], int n)
{
double sum = 0,mean_score, x;
int i;
mean_score =get_avg(s,n); //此处通过调用函数求均值,体会函数的意义
for(i=0; i<n; i++)
{
x=s[i]-mean_score;
sum+=x*x;
}
return sqrt(sum/(n-1));
}
(6-实战)读取english2.dat中的数据,用项目4中定义的排序函数对数据进行排序,输出完成排序用了多长时间。可以分别调用冒泡排序和选择排序,比较两种算法哪个更快。
#include <fstream> //操作文件必写
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
void bubble_sort(int arr[], int num);
int main( )
{
int s[10000],ss,count=0,i; //读入的成绩
long t1,t2;
//以输入的方式(ios::in)打开文件
ifstream infile("english2.dat",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
while(infile>>ss)
{
s[count]=ss;
count++;
}
infile.close(); //读入完毕要关闭文件
for(i=0; i<count; i++)
{
if(s[i]>1000)
cout<<i<<" "<<s[i]<<endl;
}
t1=time(0);
bubble_sort(s, count); //冒泡排序
t2=time(0);
if(t2-t1==0)
cout<<"太快了,1秒内完成排序!"<<endl;
else
cout<<"冒泡排序费时"<<t2-t1<<"秒"<<endl;
//排序结果输出到文件,每行输出10个,每两个间用空格隔开
//以输出的方式(ios::out)打开文件
ofstream outfile("english3.dat",ios::out);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0; i<count; i++)
{
outfile<<s[i]<<" ";
if((i+1)%10==0)
outfile<<endl;
}
outfile.close();
cout<<"处理完毕!"<<endl;
return 0;
}
void bubble_sort(int arr[], int num)
{
int i,j;
int t;
for(j=0; j<num-1; j++) //共进行num-1趟比较
for(i=0; i<num-j-1; i++) //在每趟中要进行num-j次两两比较
if (arr[i]<arr[i+1]) //如果前面的数小于后面的数
{
t=arr[i]; //交换两个数的位置,使小数下沉
arr[i]=arr[i+1];
arr[i+1]=t;
}
return;
}
采用选择排序的解法:
#include <fstream>
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
void select_sort(int array[],int n);
int main( )
{
int s[10000],ss,count=0,i; //读入的成绩
long t1,t2;
//以输入的方式(ios::in)打开文件
ifstream infile("english2.dat",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
while(infile>>ss)
{
s[count]=ss;
count++;
}
infile.close(); //读入完毕要关闭文件
t1=time(0);
select_sort(s, count); //调用选择排序
t2=time(0);
if(t2-t1==0)
cout<<"太快了,1秒内完成排序!"<<endl;
else
cout<<"冒泡排序费时"<<t2-t1<<"秒"<<endl;
//排序结果输出到文件,每行输出10个,每两个间用空格隔开
//以输出的方式(ios::out)打开文件
ofstream outfile("english3.dat",ios::out);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0; i<count; i++)
{
outfile<<s[i]<<" ";
if((i+1)%10==0)
outfile<<endl;
}
outfile.close();
cout<<"处理完毕!"<<endl;
return 0;
}
void select_sort(int array[],int n) //形参array是数组名
{
int i,j,k,t;
for(i=0; i<n-1; i++)
{
k=i; //先设第i个就为最小
for(j=i+1; j<n; j++)
if(array[j]<array[k])
k=j; //通过循环,得到k为最小
t=array[k]; //交换a[i]和a[k]
array[k]=array[i];
array[i]=t;
}
return;
}
==================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章分类目录(不定期更新) ==|
|== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==|
======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======