数据结构实训-运动会分数统计

任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)
  功能要求:1).可以输入各个项目的前三名或前五名的成绩;
  2).能统计各学校总分,
  3).可以按学校编号、学校总分、男女团体总分排序输出;
  4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
  规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
  输出形式:有中文提示,各学校分数为整形
  界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
using namespace std;

int m=0,w=0,n=0;

struct Game
{ 
	int gnumber; 
	char gname[20];//比赛名称
	int gscore;//该比赛分数
	int grank;//该比赛的排名 
};

struct Totalscore
{
    int all; 
	int male;//男生比赛的积分 
	int female;//女生比赛的积分
};

struct School 
{
    Game game[40];
    int snumber; 
    char sname[20];//学校名称 
    Totalscore totalscore;
};

void write_to(int &n,int &m,int &w,School school[])//写入文件 
{
	ofstream outfile("score.dat",ios::binary);
	if(!outfile) cerr<<"文件写入错误,请重试!"<<endl; 
	else
	{				
		outfile.write(reinterpret_cast<char *>(&n),sizeof(n));
		outfile.write(reinterpret_cast<char *>(&m),sizeof(m)); 
		outfile.write(reinterpret_cast<char *>(&w),sizeof(w));
		for(int i=0;i<n;i++)
		{
		    outfile.write((char*)&school[i],sizeof(school[i]));
		} 
    	outfile.close();
    	cout<<"文件写入成功!"<<endl<<endl; 
	}
}


void read_from(int &n,int &m,int &w,int &test,School school[])//读取文件 
{
	ifstream infile("score.dat",ios::binary);
	if(!infile) cerr<<"文件读取错误,请重试!"<<endl;  
	else
	{
		infile.read(reinterpret_cast<char *>(&n),sizeof(n));
		infile.read(reinterpret_cast<char *>(&m),sizeof(m)); 
		infile.read(reinterpret_cast<char *>(&w),sizeof(w));
		for(int i=0;i<n;i++)
		{
			infile.read((char*)&school[i],sizeof(school[i]));
		}
		infile.close();
		if(n==0) test=1; 
		cout<<"文件读取成功!当前共有"<<m+w<<"个项目,"<<n<<"个学校的数据。"<<endl<<endl; 
	}
}

void Imput_score(School school[])
{
     int q,s1,s2,s3,i,k; 
	 cout<<"请输入项目编号:";
	                                                                            leap2: 
	 cin>>q;
	 if(q<1||q>m+w)
	 {
 		cout<<"请输入有效数字:";
        goto leap2;
 	 }
	 cout<<"请输入第1名的学校编号:";
	                                                                            leap3:
	 cin>>s1;
	 if(s1<1||s1>n)
	 {
 		cout<<"无该学校编号,请重新输入:";
 		goto leap3;
 	 }
	 school[s1-1].game[q-1].grank=1; 
	 if(q<=m)
	 {
 		school[s1-1].totalscore.male+=5;
 		school[s1-1].totalscore.all+=5;
 	 }
	 else
	 {
 		school[s1-1].totalscore.female+=5;
 		school[s1-1].totalscore.all+=5;
 	 }
	 cout<<"请输入该项目成绩:";
	 cin>>school[s1-1].game[q-1].gscore;
	 cout<<"请输入第2名的学校编号:";
	                                                                            leap4:
	 cin>>s2;
	 if(s2<1||s2>n)
	 {
 		cout<<"无该学校编号,请重新输入:";
 		goto leap4;
 	 }
	 school[s2-1].game[q-1].grank=2; 
	 if(q<=m)
	 {
 		school[s2-1].totalscore.male+=3;
 		school[s2-1].totalscore.all+=3;
 	 }
	 else
	 {
 		school[s2-1].totalscore.female+=3;
 		school[s2-1].totalscore.all+=3;
 	 }
	 cout<<"请输入该项目成绩:";
	 cin>>school[s2-1].game[q-1].gscore;
	 cout<<"请输入第3名的学校编号:";
	                                                                            leap5:
	 cin>>s3;
	 if(s3<1||s3>n)
	 {
 		cout<<"无该学校编号,请重新输入:";
 		goto leap5;
 	 }
	 school[s3-1].game[q-1].grank=3; 
	 if(q<=m)
	 {
 		school[s3-1].totalscore.male+=2;
 		school[s3-1].totalscore.all+=2;
 	 }
	 else
	 {
 		school[s3-1].totalscore.female+=2;
 		school[s3-1].totalscore.all+=2;
 	 }
	 cout<<"请输入该项目成绩:";
	 cin>>school[s3-1].game[q-1].gscore;
     cout<<"是否写入文件(写入请输入1):";
	 cin>>k;
	 if(k==1) write_to(n,m,w,school);
}

void Output_by_schoolnumber(School school[])
{
	int i,j;
	for(i=0;i<n;i++)
	{
	    cout<<"*********************************************************"<<endl;
		cout<<"学校编号:"<<school[i].snumber<<setw(15) 
		<<"学校名称:"<<school[i].sname<<setw(15) 
		<<"总分:"<<school[i].totalscore.all<<endl;
		if(school[i].totalscore.all!=0)
		{ 
		    cout<<"获前三名的项目:"<<endl;
	    	for(j=0;j<m+w;j++)
    		{
    			if(school[i].game[j].grank!=0)
    			{
    			    cout<<"编号"<<school[i].game[j].gnumber<<setw(14)<<"项目名称:"<<school[i].game[j].gname<<setw(10) 
    			    <<school[i].game[j].gscore<<"分"<<setw(8)<<"第"
    				<<school[i].game[j].grank<<"名"<<endl;
    			}
    		}
    		cout<<endl; 
		}
	}
	cout<<"*********************************************************"<<endl;
	cout<<endl;
}

void Output_by_schoolscore(School school[])
{
	int i,j;
	School t;
	School sch2[n];
	for(i=0;i<n;i++) sch2[i]=school[i]; 
	for(i=0;i<n;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(sch2[j].totalscore.all<sch2[j-1].totalscore.all)
	        {t=sch2[j];sch2[j]=sch2[j-1];sch2[j-1]=t;}
		}
	} 
    for(i=n-1;i>=0;i--)
	{
	    cout<<"*********************************************************"<<endl;
		cout<<"学校编号:"<<sch2[i].snumber<<setw(15) 
		<<"学校名称:"<<sch2[i].sname<<setw(15) 
		<<"总分:"<<sch2[i].totalscore.all<<endl;
		if(sch2[i].totalscore.all!=0)
		{ 
		    cout<<"获前三名的项目:"<<endl;
	    	for(j=0;j<m+w;j++)
    		{
    			if(sch2[i].game[j].grank!=0)
    			{
    			    cout<<"编号"<<school[i].game[j].gnumber<<setw(14)<<"项目名称:"<<sch2[i].game[j].gname<<setw(10) 
    			    <<sch2[i].game[j].gscore<<"分"<<setw(8)<<"第"
    				<<sch2[i].game[j].grank<<"名"<<endl;
    			}
    		}
    		cout<<endl; 
		}
		cout<<"*********************************************************"<<endl;
		cout<<endl;
	}
}

void Output_by_malescore(School school[])
{
	int i,j;
	School t;
	School sch2[n];
	for(i=0;i<n;i++) sch2[i]=school[i]; 
	for(i=0;i<n;i++)
	    for(j=n-1;j>i;j--)
		    if(sch2[j].totalscore.male<sch2[j-1].totalscore.male)
	        {t=sch2[j];sch2[j]=sch2[j-1];sch2[j-1]=t;}
    for(i=n-1;i>=0;i--)
	{
	    cout<<"*********************************************************"<<endl;
		cout<<"学校编号:"<<sch2[i].snumber<<setw(15) 
		<<"学校名称:"<<sch2[i].sname<<setw(15) 
		<<"男子总分:"<<sch2[i].totalscore.male<<endl;
		if(sch2[i].totalscore.all!=0)
		{ 
		    cout<<"获前三名的项目:"<<endl;
	    	for(j=0;j<m+w;j++)
    		{
    			if(sch2[i].game[j].grank!=0)
    			{
    			    cout<<"编号"<<school[i].game[j].gnumber<<setw(14)<<"项目名称:"<<sch2[i].game[j].gname<<setw(10) 
    			    <<sch2[i].game[j].gscore<<"分"<<setw(8)<<"第"
    				<<sch2[i].game[j].grank<<"名"<<endl;
    			}
    		}
    		cout<<endl; 
		}
		cout<<"*********************************************************"<<endl;
		cout<<endl;
	}
}

void Output_by_femalescore(School school[])
{
	int i,j;
	School t;
	School sch2[n];
	for(i=0;i<n;i++) sch2[i]=school[i]; 
	for(i=0;i<n;i++)
	    for(j=n-1;j>i;j--)
		    if(sch2[j].totalscore.female<sch2[j-1].totalscore.female)
	        {t=sch2[j];sch2[j]=sch2[j-1];sch2[j-1]=t;}
    for(i=n-1;i>=0;i--)
	{
	    cout<<"*********************************************************"<<endl;
		cout<<"学校编号:"<<sch2[i].snumber<<setw(15) 
		<<"学校名称:"<<sch2[i].sname<<setw(15) 
		<<"女子总分:"<<sch2[i].totalscore.female<<endl;
		if(sch2[i].totalscore.all!=0)
		{ 
		    cout<<"获前三名的项目:"<<endl;
	    	for(j=0;j<m+w;j++)
    		{
    			if(sch2[i].game[j].grank!=0)
    			{
    			    cout<<"编号"<<school[i].game[j].gnumber<<setw(14)<<"项目名称:"<<sch2[i].game[j].gname<<setw(10) 
    			    <<sch2[i].game[j].gscore<<"分"<<setw(8)<<"第"
    				<<sch2[i].game[j].grank<<"名"<<endl;
    			}
    		}
    		cout<<endl; 
		}
		cout<<"*********************************************************"<<endl;
		cout<<endl;
	}
}

void Search_by_schoolnumber(School school[])
{
	int i,j,num1,num2,k=0; 
	cout<<"请输入要查询的学校编号:";
	                                                                            leap6:
	cin>>num1;
	for(i=0;i<n;i++) 
	{   if(school[i].snumber==num1)
	    {
	        k++;
			cout<<"该学校为:"<<school[i].sname<<",请输入要查询的项目编号:"; 
	        cin>>num2;
            for(j=0;j<m+w;j++)
            {   if(school[i].game[j].gnumber==num2)
                {
                	if(school[i].game[j].grank!=0)
				    {
				        cout<<"学校"<<school[i].sname<<"在项目"<<school[i].game[j].gname
				        <<"中分数为"<<school[i].game[j].gscore<<",获得第"<<school[i].game[j].grank<<"名。"<<endl; 
			    	}
                    else cout<<school[i].sname<<"在项目"<<school[i].game[j].gname<<"中没有获奖。"<<endl; 
                    break;
                }   
            }
			break; 
	    }
	}
	if(k==0) 
	{
	    cout<<"暂无该学校信息,请重新输入:";
	    goto leap6; 
	} 
	 
	cout<<endl;
}

void Search_by_gamenumber(School school[])
{
	int i,j,num1; 
	cout<<"请输入要查询的项目编号:";
	                                                                            leap7:
	cin>>num1;
	if(num1<1||num1>m+w)
	{
		cout<<"请输入有效编号:";
		goto leap7; 
	}
	for(i=0;i<n;i++)
	{
	    for(j=0;j<m+w;j++)
	    {
	    	if(school[i].game[j].gnumber==num1&&school[i].game[j].grank==1)
			{   cout<<"第1名:"<<school[i].sname<<setw(12)<<"分数:"<<school[i].game[j].gscore<<endl;
			    break; 
			}
	    }
		for(j=0;j<m+w;j++)
	    {	
		    if(school[i].game[j].gnumber==num1&&school[i].game[j].grank==2)
			{   cout<<"第2名:"<<school[i].sname<<setw(12)<<"分数:"<<school[i].game[j].gscore<<endl;
			    break; 
			}
	    }
	    for(j=0;j<m+w;j++)
	    {
			if(school[i].game[j].gnumber==num1&&school[i].game[j].grank==3)
			{   cout<<"第3名:"<<school[i].sname<<setw(12)<<"分数:"<<school[i].game[j].gscore<<endl;
			    break; 
			}
	    }
	}
	cout<<endl; 
}

int main()
{
	int choose,test=0; 
	School school[20]; 
	read_from(n,m,w,test,school);
	if(test==1)
	{
	    cout<<"请输入男子比赛项目个数:";
	    cin>>m; 
	    cout<<"请输入女子比赛项目个数:";
    	cin>>w;
	    cout<<"请输入学校个数:";
    	cin>>n;
    	int i,j;
    	for(i=0;i<n;i++)
    	{
	 	    cout<<"预设学校名称:";
			cin>>school[i].sname;
		 	school[i].snumber=i+1;
		 	school[i].totalscore.all=0;
		 	school[i].totalscore.female=0;
		 	school[i].totalscore.male=0;
		 	for(j=0;j<m+w;j++)
		 	{
		 	    cout<<"预设项目名称:";
			    cin>>school[i].game[j].gname; 
		 		school[i].game[j].gnumber=j+1;
		 		school[i].game[j].grank=0;
		 		school[i].game[j].gscore=0; 
		 	}
	 	}
	 	test=0;
	 	write_to(n,m,w,school);
	}
	
	while(1)
	{ 
    	cout<<"***************************************************************"<<endl;
		cout<<"-------------------------运动会分数统计------------------------"<<endl;
		cout<<"----------------------1.输入项目前三名成绩---------------------"<<endl;
    	cout<<"----------------------2.按学校编号排序输出---------------------"<<endl; 
        cout<<"----------------------3.按学校总分排序输出---------------------"<<endl; 
        cout<<"----------------------4.按男子团体总分排序输出-----------------"<<endl; 
        cout<<"----------------------5.按女子团体总分排序输出-----------------"<<endl; 
        cout<<"----------------------6.查询学校情况---------------------------"<<endl; 
        cout<<"----------------------7.查询项目情况---------------------------"<<endl; 
        cout<<"----------------------0.返回上一级-----------------------------"<<endl; 
        cout<<"++++++++++++++++++++++请选择:";
                                                                                leap1:
    	cin>>choose;
    	if(choose<0||choose>7)
    	{
	    	cout<<"请输入0-7的数字:";
	    	goto leap1;
	    }
		
		else
		{
		     switch(choose)
		     {
		         case 1:Imput_score(school);break; 
			     case 2:Output_by_schoolnumber(school);break; 
			     case 3:Output_by_schoolscore(school);break;
			     case 4:Output_by_malescore(school);break;
			     case 5:Output_by_femalescore(school);break;
			     case 6:Search_by_schoolnumber(school);break;
			     case 7:Search_by_gamenumber(school);break;
			     case 0:
			     default:cout<<"输入有误,请重新输入:"<<endl;goto leap1;
		     }
		}
	}
	return 0;
}

仅作留档。

发布了30 篇原创文章 · 获赞 12 · 访问量 875

猜你喜欢

转载自blog.csdn.net/weixin_43893854/article/details/104326469
今日推荐