完整源代码:
/*
*版权所有: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——————————