【实训项目】大奖赛计分系统

完整源代码:


/*
*版权所有: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——————————


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值