完整源代码:
/* *版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. * *文件名称:Competitor.cpp *文件标识:无 *内容摘要:该代码用于获取满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 *作 者:单昕昕 *完成日期:2015年7月12日 * *修改记录: *修改日期:无。 *版本号: *修改人:单昕昕 *修改内容: */ #include <fstream> //操作文件必写 #include <iostream> #include <cstdlib> #include <iomanip> #include <cstdio> #include <algorithm> using namespace std; class Competitor { private: double grade[100];//先开一个能存储100个得分的数组 public: int no,rank; //选手编号、排名 double ave; //选手平均分 void input_mark(Competitor &competitor,int rater_number,int competitor_number,int min,int max);//输入各位选手得分,不符合分数范围的要求重新输入;并将选手得分自动保存到目标文件夹 void sort_allgrade(int rater_number,int competitor_number,Competitor &competitor);//将各位选手的个人得分降序排列,方便看出利用最值进行下一步计算 void calculate_mark(int max,int min,Competitor &competitor,int delete_number);//计算删除掉给定数目的最值后选手的平均得分 void renew(Competitor &Competitor,int change_rater,double change_score);//修改选手得分 void writedata(int rater_number,Competitor &competitor);//将修改后的选手得分写入文件中 void storage(int rater_number,int competitor_number,Competitor &competitor);//用(二进制)文件读取将各位选手得分、名次和平均分保存到文件中 void output_mark(int rater_number,int competitor_number,Competitor &competitor);//在屏幕上显示出选手得分 }; class System { public: int rater_number,competitor_number,delete_number;//分别表示评委的人数、选手的人数、要去掉的最值数目 int max,min;//分别表示计分范围的最大值、最小值 void initialize_work();//函数初始化的选择功能菜单 void funtion_work();//大奖赛计分系统的选择功能菜单 void sort_ave(int rater_number,int competitor_number,double s[][2]);//依据各位选手的个人平均分降序排列得出选手名次 void file_read(int *rater_number,int *competitor_number,int *min,int *max,int *delete_number);//从相关文件夹中读取数据进行参数的初始化 void file_write(int *rater_number,int *competitor_number,int *min,int *max,int *delete_number);//输入相关数据完成对各参数的初始化 void renew_grade(int *change_competitor,int *change_rater,double *change_score,int min,int max);//修正选手的分数 }; //下面是普通函数 /* *函数名称:compare *功能描述:比较函数。在sort函数中用到,如果第一个参数小于第二个该函数,返回true。 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 */ bool compare(int a,int b) { return a>b; //降序排列,如果改为return a<b,则为升序 } int main() { int i,j,t; System system; system.initialize_work(); cin>>t; switch(t) { case 1: system.file_read(&system.rater_number,&system.competitor_number,&system.min,&system.max,&system.delete_number); break; case 2: system.file_write(&system.rater_number,&system.competitor_number,&system.min,&system.max,&system.delete_number); break; } Competitor *competitor=new Competitor[system.competitor_number];//开辟动态数组 choose://下面是一个功能菜单的界面,选择完毕后会自动回到原来的菜单选择界面 system.funtion_work(); cin>>t;//选择功能 switch(t) { case 1: { cout<<"请输入选手的成绩:"<<endl; for(i=0; i<system.competitor_number; ++i) { competitor[i].no=i;//录入选手的编号 cout<<"选手"<<competitor[i].no<<":"; competitor[i].input_mark(competitor[i],system.rater_number,system.competitor_number,system.min,system.max);//输入各位选手的得分,同时保存到score文件中 } goto choose; break; } case 2://2.在屏幕上显示所有选手的成绩 { for(i=0; i<system.competitor_number; ++i) { cout<<"选手"<<competitor[i].no<<":"; competitor[i].output_mark(system.rater_number,system.competitor_number,competitor[i]); } goto choose; break; } case 3://3.选手成绩降序排列 { cout<<"选手成绩降序排列如下:"<<endl; for(i=0; i<system.competitor_number; ++i) competitor[i].sort_allgrade(system.rater_number,system.competitor_number,competitor[i]); for(i=0; i<system.competitor_number; ++i) { cout<<"选手"<<competitor[i].no<<":"; competitor[i].output_mark(system.rater_number,system.competitor_number,competitor[i]); } goto choose; break; } case 4://4.选手的最终排名 { cout<<"选手的最终排名为:"<<endl; double s[system.competitor_number][2]; for(i=0; i<system.competitor_number; ++i) competitor[i].calculate_mark(system.rater_number,system.competitor_number,competitor[i],system.delete_number); for(i=0; i<system.competitor_number; ++i) { s[i][0]=competitor[i].no;//数组的第一列是选手编号 s[i][1]=competitor[i].ave;//数组的第二列是选手编号 } cout<<endl; system.sort_ave(system.rater_number,system.competitor_number,s); for(i=0; i<system.competitor_number; ++i) for(j=0; j<system.competitor_number; ++j) if(s[i][0]==competitor[j].no) { competitor[j].rank=i;//录入选手排名 competitor[j].ave=s[i][1];//录入选手平均分 } goto choose; break; } case 5://5.选手的成绩修改 { int change_competitor,change_rater; double change_score; system.renew_grade(&change_competitor,&change_rater,&change_score,system.min,system.max); //cout<<"change_score"<<change_score<<endl; for(i=0; i<system.competitor_number; ++i) if(change_competitor==i)//先定位到选手 { competitor[i].renew(competitor[i],change_rater,change_score);//再定位到评委 break; } for(i=0; i<system.competitor_number; ++i) competitor[i].writedata(system.rater_number,competitor[i]);//将更新后的数据存入一个新的文件 cout<<"文件存入成功!请打开相关文件查看!"<<endl; goto choose; break; } case 6://6.选手的成绩存储 { for(i=0; i<system.competitor_number; ++i) competitor[i].storage(system.rater_number,system.competitor_number,competitor[i]);//分别以ASCII文件和二进制文件的方式存入 goto choose; break; } case 0://0.释放内存并退出 { delete [] competitor; //删除整个对象数组 break; } } return 0; } /* *函数名称:input_mark *功能描述:输入各位选手得分,不符合分数范围的要求重新输入;并将选手得分自动保存到目标文件夹 *输入参数:rater_number-评委人数,competitor_number-选手人数,min-评分范围最小值,max-评分范围最大值 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:含有保存各选手得分到文件中的功能 */ void Competitor::input_mark(Competitor &competitor,int rater_number,int competitor_number,int min,int max) { int i; ofstream outfile("competitor_score.txt",ios::app); //写入文件 if(!outfile) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } for(i=0; i<rater_number ; ) { cin>>competitor.grade[i]; try//异常处理 { if(competitor.grade[i]>=min&&competitor.grade[i]<=max)//检查分数是否在正确的范围内 ++i; else { i--;//不正确就重新输入成绩 throw competitor.grade[i]; } } catch(double) { cerr<<"分数不在正确的范围内!"<<endl; cerr<<"请检查并请重新输入该选手的成绩:"; } } outfile<<"选手"<<competitor.no<<":"<<'\t';//将选手的成绩存到文件中 for(i=0; i<rater_number; ++i) outfile<<competitor.grade[i]<<'\t'; outfile<<'\n'; outfile.close(); //关闭文件。用完了必须关闭,否则会丢失数据 } /* *函数名称:sort_allgrade *功能描述:将各位选手的个人得分降序排列,方便看出利用最值进行下一步计算 *输入参数:rater_number-评委人数,competitor_number-选手人数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:这个功能作用不是很大,主要是为了进行去掉最值的计算而设定的 */ void Competitor::sort_allgrade(int rater_number,int competitor_number,Competitor &competitor) { sort(competitor.grade,competitor.grade+rater_number*competitor_number,compare);//调用系统中的sort函数进行将降序排列,方便去掉最值 } /* *函数名称:calculate_mark *功能描述:计算删除掉给定数目的最值后选手的平均得分 *输入参数:min-评分范围最小值,max-评分范围最大值,delete_number-要删除掉的最值数目 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:无 */ void Competitor::calculate_mark(int rater_number,int competitor_number,Competitor &competitor,int delete_number) { double sum; int i,j; for(i=0; i<competitor_number; ++i) { sum=0; for(j=delete_number; j<rater_number-delete_number; ++j) { sum+=competitor.grade[j]; } } competitor.ave=sum/(rater_number-delete_number);//计算选手平均分 cout<<"选手"<<competitor.no<<",平均分是:"<<(sum/(rater_number-delete_number))<<"分"<<endl; } /* *函数名称:renew *功能描述:修改选手得分 *输入参数:change_rater-要修改分数所属的的评委编号,change_score-更新后的分数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:无 */ void Competitor::renew(Competitor &competitor,int change_rater,double change_score) { double *p;//利用指针取地址对相应给定位置的分数进行修改 p=&competitor.grade[change_rater]; *p=change_score; } /* *函数名称:writedata *功能描述:将修改后的选手得分写入文件中 *输入参数:rater_number-评委人数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:写入一个新的文件,而不是覆盖原有的记录各选手分数的文件 */ void Competitor::writedata(int rater_number,Competitor &competitor) { int i; ofstream file("summary.txt",ios::app); if(!file) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } file<<"选手"<<competitor.no<<":"<<'\t'; for(i=0; i<rater_number; ++i) file<<competitor.grade[i]<<'\t'; file<<'\n'; file.close();//关闭文件 } /* *函数名称:storage *功能描述:用(二进制)文件读取将各位选手得分、名次和平均分保存到文件中 *输入参数:rater_number-评委人数,competitor_number-选手人数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:用两种方式写入,ASCII和二进制 */ void Competitor::storage(int rater_number,int competitor_number,Competitor &competitor) { int i; ofstream file("store.txt",ios::app);//打开分数文件 if(!file) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } file<<"选手"<<competitor.no<<":"<<'\t'; for(i=0; i<rater_number; ++i) file<<competitor.grade[i]<<'\t'; file<<"平均分:"<<competitor.ave; file<<'\t'; file<<"排名:"<<competitor.rank; file<<'\n'; file.close();//关闭文件 //以下为二进制文件写入选手排名及其平均得分 ofstream bfile("binary_store.dat",ios::app|ios::binary); if(!bfile) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } bfile<<"选手"<<competitor.no<<":"<<'\t'; bfile.write((char*)&competitor.no, sizeof(int)); bfile<<":"<<'\t'; for(i=0; i<rater_number; ++i) { bfile.write((char*)&competitor.grade[i], sizeof(double)); bfile<<'\t'; } bfile<<'\n'; bfile<<"平均分:"; bfile.write((char*)&competitor.ave, sizeof(double)); bfile<<'\t'; bfile<<"排名:"; bfile.write((char*)&competitor.rank, sizeof(int)); bfile<<'\n'; bfile.close();//关闭文件 } /* *函数名称:output_mark *功能描述:在屏幕上显示出选手得分 *输入参数:rater_number-评委人数,competitor_number-选手人数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:无 */ void Competitor::output_mark(int rater_number,int n,Competitor &competitor) { int i; for(i=0; i<rater_number; ++i) cout<<competitor.grade[i]<<'\t'; cout<<endl; } /* *函数名称:initialize_work *功能描述:函数初始化的选择功能菜单 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 */ void System::initialize_work() { cout<<"程序初始化中..."<<endl;//以下先给各参数赋值 cout<<"给参数初始化的方式..."<<endl; cout<<"1.从文件读取"<<endl; cout<<"2.手动输入"<<endl; cout<<"请选择:"; } /* *函数名称:funtion_work *功能描述:大奖赛计分系统的选择功能菜单 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 */ void System::funtion_work() { cout<<" ———————————"<<endl; cout<<" 欢迎使用大奖赛计分系统"<<endl; cout<<" ———————————"<<endl; cout<<" | "<<"1.输入选手的成绩 "<<" |"<<endl; cout<<" | "<<"2.所有选手的成绩 "<<" |"<<endl; cout<<" | "<<"3.选手成绩降序排列"<<" |"<<endl; cout<<" | "<<"4.选手的最终排名 "<<" |"<<endl; cout<<" | "<<"5.选手的成绩修改 "<<" |"<<endl; cout<<" | "<<"6.选手的成绩存储 "<<" |"<<endl; cout<<" | "<<"0.退出 "<<" |"<<endl; cout<<" ———————————"<<endl; cout<<"请选择:"; } /* *函数名称:sort_ave *功能描述:依据各位选手的个人平均分降序排列得出选手名次 *输入参数:rater_number-评委人数,competitor_number-选手人数 *输出参数:s[][2]-只存有选手编号及其平均分 *返回值:无 *其他说明:无 */ void System::sort_ave(int rater_number,int competitor_number,double f[][2]) { int i,j,k; double t; for(j=0; j<=rater_number-1; j++)//根据选手平均分冒泡排序算出排名 for(i=0; i<rater_number-j-1; i++) if (f[i][1]<f[i+1][1]) { t=f[i][1]; f[i][1]=f[i+1][1]; f[i+1][1]=t; k=f[i][0]; f[i][0]=f[i+1][0]; f[i+1][0]=k; } for(i=0; i<competitor_number; ++i) { cout<<"第"<<i<<"名:"<<"选手"<<f[i][0]<<endl; } } /* *函数名称:file_read *功能描述:从相关文件夹中读取数据进行参数的初始化 *输入参数:无 *输出参数:rater_number-评委的人数,competitor_number-选手的人数,delete_number-要去掉的最值数目 min-计分范围的最小值,max-计分范围的最大值 *返回值:无 *其他说明:无 */ void System::file_read(int *rater_number,int *competitor_number,int *min,int *max,int *delete_number) { int i; int *parameter=new int[5];//parameter数组用来保存各项参数 ifstream infile("mns_read.txt",ios::in); //测试是否成功打开,打开失败时(如要读的数据文件不存在)退出 if(!infile) { cerr<<"open error!"<<endl; abort(); } for(i=0; i<5; ++i) infile>>parameter[i];//从文件中读取参数 infile.close(); //读入完毕一定要关闭文件 //用读取到的参数分别给各项数值赋值 *rater_number=parameter[0]; *competitor_number=parameter[1]; *min=parameter[2]; *max=parameter[3]; *delete_number=parameter[4]; cout<<"评委的人数:"<<*rater_number<<endl;//将文件中读取到的各项有关参数显示在屏幕上 cout<<"选手的人数:"<<*competitor_number<<endl; cout<<"打分范围:"<<*min<<"-"<<*max<<endl; cout<<"要去掉的最值数目:"<<*delete_number<<endl; delete [] parameter; } /* *函数名称:file_write *功能描述:输入相关数据完成对各参数的初始化 *输入参数:rater_number-评委的人数,competitor_number-选手的人数,delete_number-要去掉的最值数目 min-计分范围的最小值,max-计分范围的最大值 *输出参数:rater_number-评委的人数,competitor_number-选手的人数,delete_number-要去掉的最值数目 min-计分范围的最小值,max-计分范围的最大值 *返回值:无 *其他说明:各数据会以文件形式保存到相关文件夹中 */ void System::file_write(int *rater_number,int *competitor_number,int *min,int *max,int *delete_number) { int *parameter=new int[5];//parameter数组用来保存各项参数 cout<<"请输入:"<<endl;//手动输入各项参数来初始化 cout<<"评委的人数:"; cin>>parameter[0]; cout<<"选手的人数:"; cin>>parameter[1]; cout<<"打分范围(min-max):"; cin>>parameter[2]; cin>>parameter[3]; cout<<"要去掉的最值数目:"; cin>>parameter[4]; *rater_number=parameter[0]; *competitor_number=parameter[1]; *min=parameter[2]; *max=parameter[3]; *delete_number=parameter[4]; ofstream file("mns_write.txt",ios::out); //写入文件 if(!file) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } file<<"评委的人数:"; file<<rater_number<<'\n'; file<<"选手的人数:"; file<<competitor_number<<'\n'; file<<"打分范围:"; file<<min<<"-"<<max<<'\n'; file<<"要去掉的最值数目:"; file<<delete_number<<'\n'; file.close(); delete [] parameter; } /* *函数名称:renew_grade *功能描述:修正选手的分数 *输入参数:change_competitor-选手的编号,change_rater-评委的编号,change_score-修正后的分数 min-计分范围的最小值,max-计分范围的最大值 *输出参数:change_score *返回值:无 *其他说明:无 */ void System::renew_grade(int *change_competitor,int *change_rater,double *change_score,int min,int max) { int cc,cr; double cs; cout<<"请输入要修改的选手编号:"; cin>>cc; *change_competitor=cc; cout<<"请输入评委编号:"; cin>>cr; *change_rater=cr; cout<<"请输入要修改后的成绩:"; cin>>cs; while(cs<min||cs>max) { cerr<<"分数不在正确的范围内!"<<endl; cerr<<"请检查并请重新输入该选手的成绩:"; cin>>cs; } *change_score=cs; }
多文件组织:
——————主函数——main.cpp
/* *版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. * *文件名称:Competitor.cpp *文件标识:无 *内容摘要:该代码用于获取满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 *作 者:单昕昕 *完成日期:2015年7月12日 * *修改记录: *修改日期:无。 *版本号: *修改人:单昕昕 *修改内容: */ #include <fstream> //操作文件必写 #include <iostream> #include <cstdlib> #include <iomanip> #include <cstdio> #include <algorithm> #include "competitor.h" #include "system.h" using namespace std; int main() { int i,j,t; System system; system.initialize_work(); cin>>t; switch(t) { case 1: system.file_read(&system.rater_number,&system.competitor_number,&system.min,&system.max,&system.delete_number); break; case 2: system.file_write(&system.rater_number,&system.competitor_number,&system.min,&system.max,&system.delete_number); break; } Competitor *competitor=new Competitor[system.competitor_number];//开辟动态数组 choose://下面是一个功能菜单的界面,选择完毕后会自动回到原来的菜单选择界面 system.funtion_work(); cin>>t;//选择功能 switch(t) { case 1: { cout<<"请输入选手的成绩:"<<endl; for(i=0; i<system.competitor_number; ++i) { competitor[i].no=i;//录入选手的编号 cout<<"选手"<<competitor[i].no<<":"; competitor[i].input_mark(competitor[i],system.rater_number,system.competitor_number,system.min,system.max);//输入各位选手的得分,同时保存到score文件中 } goto choose; break; } case 2://2.在屏幕上显示所有选手的成绩 { for(i=0; i<system.competitor_number; ++i) { cout<<"选手"<<competitor[i].no<<":"; competitor[i].output_mark(system.rater_number,system.competitor_number,competitor[i]); } goto choose; break; } case 3://3.选手成绩降序排列 { cout<<"选手成绩降序排列如下:"<<endl; for(i=0; i<system.competitor_number; ++i) competitor[i].sort_allgrade(system.rater_number,system.competitor_number,competitor[i]); for(i=0; i<system.competitor_number; ++i) { cout<<"选手"<<competitor[i].no<<":"; competitor[i].output_mark(system.rater_number,system.competitor_number,competitor[i]); } goto choose; break; } case 4://4.选手的最终排名 { cout<<"选手的最终排名为:"<<endl; double s[system.competitor_number][2]; for(i=0; i<system.competitor_number; ++i) competitor[i].calculate_mark(system.rater_number,system.competitor_number,competitor[i],system.delete_number); for(i=0; i<system.competitor_number; ++i) { s[i][0]=competitor[i].no;//数组的第一列是选手编号 s[i][1]=competitor[i].ave;//数组的第二列是选手编号 } cout<<endl; system.sort_ave(system.rater_number,system.competitor_number,s); for(i=0; i<system.competitor_number; ++i) for(j=0; j<system.competitor_number; ++j) if(s[i][0]==competitor[j].no) { competitor[j].rank=i;//录入选手排名 competitor[j].ave=s[i][1];//录入选手平均分 } goto choose; break; } case 5://5.选手的成绩修改 { int change_competitor,change_rater; double change_score; system.renew_grade(&change_competitor,&change_rater,&change_score,system.min,system.max); //cout<<"change_score"<<change_score<<endl; for(i=0; i<system.competitor_number; ++i) if(change_competitor==i)//先定位到选手 { competitor[i].renew(competitor[i],change_rater,change_score);//再定位到评委 break; } for(i=0; i<system.competitor_number; ++i) competitor[i].writedata(system.rater_number,competitor[i]);//将更新后的数据存入一个新的文件 cout<<"文件存入成功!请打开相关文件查看!"<<endl; goto choose; break; } case 6://6.选手的成绩存储 { for(i=0; i<system.competitor_number; ++i) competitor[i].storage(system.rater_number,system.competitor_number,competitor[i]);//分别以ASCII文件和二进制文件的方式存入 goto choose; break; } case 0://0.释放内存并退出 { delete [] competitor; //删除整个对象数组 break; } } return 0; }
——————头文件——competitor.h
#ifndef COMPETITOR_H_INCLUDED #define COMPETITOR_H_INCLUDED class Competitor { private: double grade[100];//先开一个能存储100个得分的数组 public: int no,rank; //选手编号、排名 double ave; //选手平均分 void input_mark(Competitor &competitor,int rater_number,int competitor_number,int min,int max);//输入各位选手得分,不符合分数范围的要求重新输入;并将选手得分自动保存到目标文件夹 void sort_allgrade(int rater_number,int competitor_number,Competitor &competitor);//将各位选手的个人得分降序排列,方便看出利用最值进行下一步计算 void calculate_mark(int max,int min,Competitor &competitor,int delete_number);//计算删除掉给定数目的最值后选手的平均得分 void renew(Competitor &Competitor,int change_rater,double change_score);//修改选手得分 void writedata(int rater_number,Competitor &competitor);//将修改后的选手得分写入文件中 void storage(int rater_number,int competitor_number,Competitor &competitor);//用(二进制)文件读取将各位选手得分、名次和平均分保存到文件中 void output_mark(int rater_number,int competitor_number,Competitor &competitor);//在屏幕上显示出选手得分 }; #endif // COMPETITOR_H_INCLUDED
——————头文件——system.h
#ifndef SYSTEM_H_INCLUDED #define SYSTEM_H_INCLUDED class System { public: int rater_number,competitor_number,delete_number;//分别表示评委的人数、选手的人数、要去掉的最值数目 int max,min;//分别表示计分范围的最大值、最小值 void initialize_work();//函数初始化的选择功能菜单 void funtion_work();//大奖赛计分系统的选择功能菜单 void sort_ave(int rater_number,int competitor_number,double s[][2]);//依据各位选手的个人平均分降序排列得出选手名次 void file_read(int *rater_number,int *competitor_number,int *min,int *max,int *delete_number);//从相关文件夹中读取数据进行参数的初始化 void file_write(int *rater_number,int *competitor_number,int *min,int *max,int *delete_number);//输入相关数据完成对各参数的初始化 void renew_grade(int *change_competitor,int *change_rater,double *change_score,int min,int max);//修正选手的分数 }; #endif // SYSTEM_H_INCLUDED
——————类实现——competitor.cpp
#include <iostream> #include <fstream> #include <cstdlib> #include "competitor.h" #include <algorithm> using namespace std; //下面是普通函数 /* *函数名称:compare *功能描述:比较函数。在sort函数中用到,如果第一个参数小于第二个该函数,返回true。 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 */ bool compare(int a,int b) { return a>b; //升序排列,如果改为return a<b,则为降序 } /* *函数名称:input_mark *功能描述:输入各位选手得分,不符合分数范围的要求重新输入;并将选手得分自动保存到目标文件夹 *输入参数:rater_number-评委人数,competitor_number-选手人数,min-评分范围最小值,max-评分范围最大值 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:含有保存各选手得分到文件中的功能 */ void Competitor::input_mark(Competitor &competitor,int rater_number,int competitor_number,int min,int max) { int i; ofstream outfile("competitor_score.txt",ios::app); //写入文件 if(!outfile) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } for(i=0; i<rater_number ; ) { cin>>competitor.grade[i]; try//异常处理 { if(competitor.grade[i]>=min&&competitor.grade[i]<=max)//检查分数是否在正确的范围内 ++i; else { i--;//不正确就重新输入成绩 throw competitor.grade[i]; } } catch(double) { cerr<<"分数不在正确的范围内!"<<endl; cerr<<"请检查并请重新输入该选手的成绩:"; } } outfile<<"选手"<<competitor.no<<":"<<'\t';//将选手的成绩存到文件中 for(i=0; i<rater_number; ++i) outfile<<competitor.grade[i]<<'\t'; outfile<<'\n'; outfile.close(); //关闭文件。用完了必须关闭,否则会丢失数据 } /* *函数名称:sort_allgrade *功能描述:将各位选手的个人得分降序排列,方便看出利用最值进行下一步计算 *输入参数:rater_number-评委人数,competitor_number-选手人数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:这个功能作用不是很大,主要是为了进行去掉最值的计算而设定的 */ void Competitor::sort_allgrade(int rater_number,int competitor_number,Competitor &competitor) { sort(competitor.grade,competitor.grade+rater_number*competitor_number,compare);//调用系统中的sort函数进行将降序排列,方便去掉最值 } /* *函数名称:calculate_mark *功能描述:计算删除掉给定数目的最值后选手的平均得分 *输入参数:min-评分范围最小值,max-评分范围最大值,delete_number-要删除掉的最值数目 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:无 */ void Competitor::calculate_mark(int rater_number,int competitor_number,Competitor &competitor,int delete_number) { double sum; int i,j; for(i=0; i<competitor_number; ++i) { sum=0; for(j=delete_number; j<rater_number-delete_number; ++j) { sum+=competitor.grade[j]; } } competitor.ave=sum/(rater_number-delete_number);//计算选手平均分 cout<<"选手"<<competitor.no<<",平均分是:"<<(sum/(rater_number-delete_number))<<"分"<<endl; } /* *函数名称:renew *功能描述:修改选手得分 *输入参数:change_rater-要修改分数所属的的评委编号,change_score-更新后的分数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:无 */ void Competitor::renew(Competitor &competitor,int change_rater,double change_score) { double *p;//利用指针取地址对相应给定位置的分数进行修改 p=&competitor.grade[change_rater]; *p=change_score; } /* *函数名称:writedata *功能描述:将修改后的选手得分写入文件中 *输入参数:rater_number-评委人数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:写入一个新的文件,而不是覆盖原有的记录各选手分数的文件 */ void Competitor::writedata(int rater_number,Competitor &competitor) { int i; ofstream file("summary.txt",ios::app); if(!file) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } file<<"选手"<<competitor.no<<":"<<'\t'; for(i=0; i<rater_number; ++i) file<<competitor.grade[i]<<'\t'; file<<'\n'; file.close();//关闭文件 } /* *函数名称:storage *功能描述:用(二进制)文件读取将各位选手得分、名次和平均分保存到文件中 *输入参数:rater_number-评委人数,competitor_number-选手人数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:用两种方式写入,ASCII和二进制 */ void Competitor::storage(int rater_number,int competitor_number,Competitor &competitor) { int i; ofstream file("store.txt",ios::app);//打开分数文件 if(!file) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } file<<"选手"<<competitor.no<<":"<<'\t'; for(i=0; i<rater_number; ++i) file<<competitor.grade[i]<<'\t'; file<<"平均分:"<<competitor.ave; file<<'\t'; file<<"排名:"<<competitor.rank; file<<'\n'; file.close();//关闭文件 //以下为二进制文件写入选手排名及其平均得分 ofstream bfile("binary_store.dat",ios::app|ios::binary); if(!bfile) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } bfile<<"选手"<<competitor.no<<":"<<'\t'; bfile.write((char*)&competitor.no, sizeof(int)); bfile<<":"<<'\t'; for(i=0; i<rater_number; ++i) { bfile.write((char*)&competitor.grade[i], sizeof(double)); bfile<<'\t'; } bfile<<'\n'; bfile<<"平均分:"; bfile.write((char*)&competitor.ave, sizeof(double)); bfile<<'\t'; bfile<<"排名:"; bfile.write((char*)&competitor.rank, sizeof(int)); bfile<<'\n'; bfile.close();//关闭文件 } /* *函数名称:output_mark *功能描述:在屏幕上显示出选手得分 *输入参数:rater_number-评委人数,competitor_number-选手人数 *输出参数:competitor-类Competitor的对象 *返回值:无 *其他说明:无 */ void Competitor::output_mark(int rater_number,int n,Competitor &competitor) { int i; for(i=0; i<rater_number; ++i) cout<<competitor.grade[i]<<'\t'; cout<<endl; }
——————类实现——system.cpp
#include <iostream> #include <fstream> #include <cstdlib> #include "system.h" #include <algorithm> using namespace std; /* *函数名称:initialize_work *功能描述:函数初始化的选择功能菜单 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 */ void System::initialize_work() { cout<<"程序初始化中..."<<endl;//以下先给各参数赋值 cout<<"给参数初始化的方式..."<<endl; cout<<"1.从文件读取"<<endl; cout<<"2.手动输入"<<endl; cout<<"请选择:"; } /* *函数名称:funtion_work *功能描述:大奖赛计分系统的选择功能菜单 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 */ void System::funtion_work() { cout<<" ———————————"<<endl; cout<<" 欢迎使用大奖赛计分系统"<<endl; cout<<" ———————————"<<endl; cout<<" | "<<"1.输入选手的成绩 "<<" |"<<endl; cout<<" | "<<"2.所有选手的成绩 "<<" |"<<endl; cout<<" | "<<"3.选手成绩降序排列"<<" |"<<endl; cout<<" | "<<"4.选手的最终排名 "<<" |"<<endl; cout<<" | "<<"5.选手的成绩修改 "<<" |"<<endl; cout<<" | "<<"6.选手的成绩存储 "<<" |"<<endl; cout<<" | "<<"0.退出 "<<" |"<<endl; cout<<" ———————————"<<endl; cout<<"请选择:"; } /* *函数名称:sort_ave *功能描述:依据各位选手的个人平均分降序排列得出选手名次 *输入参数:rater_number-评委人数,competitor_number-选手人数 *输出参数:s[][2]-只存有选手编号及其平均分 *返回值:无 *其他说明:无 */ void System::sort_ave(int rater_number,int competitor_number,double f[][2]) { int i,j,k; double t; for(j=0; j<=rater_number-1; j++)//根据选手平均分冒泡排序算出排名 for(i=0; i<rater_number-j-1; i++) if (f[i][1]<f[i+1][1]) { t=f[i][1]; f[i][1]=f[i+1][1]; f[i+1][1]=t; k=f[i][0]; f[i][0]=f[i+1][0]; f[i+1][0]=k; } for(i=0; i<competitor_number; ++i) { cout<<"第"<<i<<"名:"<<"选手"<<f[i][0]<<endl; } } /* *函数名称:file_read *功能描述:从相关文件夹中读取数据进行参数的初始化 *输入参数:无 *输出参数:rater_number-评委的人数,competitor_number-选手的人数,delete_number-要去掉的最值数目 min-计分范围的最小值,max-计分范围的最大值 *返回值:无 *其他说明:无 */ void System::file_read(int *rater_number,int *competitor_number,int *min,int *max,int *delete_number) { int i; int *parameter=new int[5];//parameter数组用来保存各项参数 ifstream infile("mns_read.txt",ios::in); //测试是否成功打开,打开失败时(如要读的数据文件不存在)退出 if(!infile) { cerr<<"open error!"<<endl; abort(); } for(i=0; i<5; ++i) infile>>parameter[i];//从文件中读取参数 infile.close(); //读入完毕一定要关闭文件 //用读取到的参数分别给各项数值赋值 *rater_number=parameter[0]; *competitor_number=parameter[1]; *min=parameter[2]; *max=parameter[3]; *delete_number=parameter[4]; cout<<"评委的人数:"<<*rater_number<<endl;//将文件中读取到的各项有关参数显示在屏幕上 cout<<"选手的人数:"<<*competitor_number<<endl; cout<<"打分范围:"<<*min<<"-"<<*max<<endl; cout<<"要去掉的最值数目:"<<*delete_number<<endl; delete [] parameter; } /* *函数名称:file_write *功能描述:输入相关数据完成对各参数的初始化 *输入参数:rater_number-评委的人数,competitor_number-选手的人数,delete_number-要去掉的最值数目 min-计分范围的最小值,max-计分范围的最大值 *输出参数:rater_number-评委的人数,competitor_number-选手的人数,delete_number-要去掉的最值数目 min-计分范围的最小值,max-计分范围的最大值 *返回值:无 *其他说明:各数据会以文件形式保存到相关文件夹中 */ void System::file_write(int *rater_number,int *competitor_number,int *min,int *max,int *delete_number) { int *parameter=new int[5];//parameter数组用来保存各项参数 cout<<"请输入:"<<endl;//手动输入各项参数来初始化 cout<<"评委的人数:"; cin>>parameter[0]; cout<<"选手的人数:"; cin>>parameter[1]; cout<<"打分范围(min-max):"; cin>>parameter[2]; cin>>parameter[3]; cout<<"要去掉的最值数目:"; cin>>parameter[4]; *rater_number=parameter[0]; *competitor_number=parameter[1]; *min=parameter[2]; *max=parameter[3]; *delete_number=parameter[4]; ofstream file("mns_write.txt",ios::out); //写入文件 if(!file) //测试文件打开操作是否成功 { cerr<<"open error!"<<endl; exit(1); //打开不成功,则提示后退出。 } file<<"评委的人数:"; file<<rater_number<<'\n'; file<<"选手的人数:"; file<<competitor_number<<'\n'; file<<"打分范围:"; file<<min<<"-"<<max<<'\n'; file<<"要去掉的最值数目:"; file<<delete_number<<'\n'; file.close(); delete [] parameter; } /* *函数名称:renew_grade *功能描述:修正选手的分数 *输入参数:change_competitor-选手的编号,change_rater-评委的编号,change_score-修正后的分数 min-计分范围的最小值,max-计分范围的最大值 *输出参数:change_score *返回值:无 *其他说明:无 */ void System::renew_grade(int *change_competitor,int *change_rater,double *change_score,int min,int max) { int cc,cr; double cs; cout<<"请输入要修改的选手编号:"; cin>>cc; *change_competitor=cc; cout<<"请输入评委编号:"; cin>>cr; *change_rater=cr; cout<<"请输入要修改后的成绩:"; cin>>cs; while(cs<min||cs>max) { cerr<<"分数不在正确的范围内!"<<endl; cerr<<"请检查并请重新输入该选手的成绩:"; cin>>cs; } *change_score=cs; }
编译通过:
运行结果:
——————文件读取初始化参数——
文件存取:
各文件:
——————手工输入初始化参数——
实训报告:
——————————THE END——————————