【问题描述】

      参加运动会有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以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
  输出形式:有中文提示,各学校分数为整形
  界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
  存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;

问题分析:这个题目的主要难点在于数据的存储格式,和寻找学校和项目之间的关系。

程序代码如下:

#include<iostream.h>
#include<iomanip.h>
#include<fstream>
#include<stdlib.h>
#include<time.h>

#define girl_item 3		//女生项目数
#define boy_item 2     //男生项目数
#define sh_count 8   //学校数量

using namespace std;
FILE *fp;

class School    //学校
{
private:
public:
	int sid;
	char sname[20];
	int bgrades;
	int ggrades;
	void School_add();				//将信息传给学校对象
	void School_inquiry(int a,int b);   //查询学校a项目b得分情况
	void School_addmark();			//计算各校男女团总分
	void School_getmark();			//统计学校总分
	void School_order(int type);	//排序
};

class Item    //运动项目
{
private:
public:
	int iid;
	char iname[20];
	void Item_search(int a);		//查询a项目的排名情况
};

class Sport:public School,public Item{
private:
public:
	int srank;
	int grades;
	void add_data();			//从文件读取数据
};

Sport sport[sh_count][girl_item+boy_item];
School sh[sh_count];

void Sport::add_data(){
	srand (time(NULL));
	ifstream file("school.txt");

	for(int j=0;j<girl_item+boy_item;j++){
		fp = fopen("school.txt","rb");
		for(int i=0;i<sh_count;i++)
			fscanf(fp,"%d%s",&sport[i][j].sid,&sport[i][j].sname);
		fclose(fp);
	}

	ifstream ifile("item.txt");
	for(j=0;j<girl_item+boy_item;j++){
		fp = fopen("item.txt","rb");
		for(int i=0;i<sh_count;i++)
			fscanf(fp,"%d%10s",&sport[i][j].iid,&sport[i][j].iname);
		fclose(fp);
	}

	for(int i=0;i<sh_count;i++)
		for(int j=0;j<girl_item+boy_item;j++){
			sport[i][j].srank=rand()%8+1;
			for(int k = 0; k < i; k++)
			{
				if(sport[k][j].srank == sport[i][j].srank)
				{
					sport[i][j].srank=rand()%8+1;
					k = -1;
				}
			}
			if(sport[i][j].srank==1) sport[i][j].grades=5;
			else if(sport[i][j].srank==2) sport[i][j].grades=3;
			else if(sport[i][j].srank==3) sport[i][j].grades=1;
			else sport[i][j].grades=0;
	}
}

void School::School_add(){
	for(int i=0;i<sh_count;i++){
		strcpy(sh[i].sname,sport[i][0].sname);
		sh[i].sid=sport[i][0].sid;
	}
}

void School::School_inquiry(int a,int b){          //输出编号为a学校
	cout<<sport[a][0].sid<<"  "<<sport[a][0].sname<<" "<<sport[a][b].srank<<" "<<sport[a][b].grades<<endl;
}

void School::School_addmark(){  //计算男团和女团成绩
	for(int a=0;a<sh_count;a++){
	for(int b=0;b<boy_item;b++)
		sh[a].bgrades+=sport[a][b].grades;
	for(;b<boy_item+girl_item;b++)
		sh[a].ggrades=sport[a][b].grades;
	}
}

void School::School_getmark(){     //统计各学校总分
	for(int i=0;i<sh_count;i++)
	cout<<sport[i][0].sname<<"的成绩为"<<sport[i][0].grades+sport[i][1].grades+sport[i][2].grades+sport[i][3].grades+sport[i][4].grades<<endl;
}

void School::School_order(int type){  //冒泡排序
	School temp;
	int i,j;
	switch(type){
	case 1:         //按总分排序
		for(i=0;i<8;i++)
			for(j=0;j<7;j++)
			if(sh[j].bgrades+sh[j].ggrades>sh[j+1].bgrades+sh[j+1].ggrades){
				temp=sh[j];
				sh[j]=sh[j+1];
				sh[j+1]=temp;
				}
		break;
	case 2:         //男生团体总分
		for(i=0;i<sh_count;i++)
		for(j=0;j<sh_count-1;j++)
			if(sh[j].ggrades>sh[j+1].ggrades){
				temp=sh[j];
				sh[j]=sh[j+1];
				sh[j+1]=temp;
			}
		break;
	case 3:			//女生团体总分
		for(i=0;i<8;i++)
		for(j=0;j<7;j++)
			if(sh[j].bgrades>sh[j+1].bgrades){
				temp=sh[j];
				sh[j]=sh[j+1];
				sh[j+1]=temp;
			}
	case 4:			//按照编号排序
		for(i=0;i<8;i++)
		for(j=0;j<7;j++)
			if(sh[j].sid>sh[j+1].sid){
				temp=sh[j];
				sh[j]=sh[j+1];
				sh[j+1]=temp;
			}
	}
	cout<<sh[0].sid;
	for(i=0;i<sh_count;i++)
		cout<<sh[i].sid<<"  "<<sh[i].sname<<"  "<<sh[i].bgrades<<endl;
}

void Item::Item_search(int a){                        //输出项目的情况
	for(int i=0;i<sh_count;i++){
		if(sport[i][a].srank==1)
			cout<<a<<"项目第一名为"<<sport[i][a].sid<<" "<<sport[i][a].sname<<" "<<sh[i].bgrades+sh[i].ggrades<<endl;
		if(sport[i][a].srank==2)
			cout<<a<<"项目第二名为"<<sport[i][a].sid<<" "<<sport[i][a].sname<<" "<<sh[i].bgrades+sh[i].ggrades<<endl;
		if(sport[i][a].srank==3)
			cout<<a<<"项目第三名为"<<sport[i][a].sid<<" "<<sport[i][a].sname<<" "<<sh[i].bgrades+sh[i].ggrades<<endl;
	  }
}

void main(){
	system("color f0");
	School sh;
	Sport sp;
	Item it;
	int a=1;
	int b,c,d,choise;
	sp.add_data();
	sh.School_add();
	sh.School_addmark();

	while(a!=0){
	cout<<"                                         菜单                           "<<endl;
	cout<<"1、统计并输出各校总分  2、按编号排序输出   3、按学校总分排序输出   4、按男团总分输出"<<endl;
	cout<<"5、按女团总分输出  6、查询某学校某项目的情况  7、查询某项目前三的学校               "<<endl;
	cin>>choise;
	switch(choise){
	case 1:sh.School_getmark(); break;
	case 2:sh.School_order(4);break;
	case 3:sh.School_order(1);break;
	case 4:sh.School_order(2);break;
	case 5:sh.School_order(3);break;
	case 6:cout<<"请输入学校编号和项目编号:";
		cin>>b>>c;
		sh.School_inquiry(b,c);
		break;
	case 7:
		cout<<"请输入项目编号";
		cin>>d;
		it.Item_search(d);
		break;
	case 0:
		a=0;
		break;
	default:
		cout<<"操作非法\n";
	}
	}
	system("exit");
}

当初老师要求这个程序的代码不超过100行,另外要求这个程序能够处理大量数据,显然,目前的情况还不满足条件,欢迎在评论区留言。

03-26 08:07