【问题描述】
参加运动会有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行,另外要求这个程序能够处理大量数据,显然,目前的情况还不满足条件,欢迎在评论区留言。