任務:參加運動會有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)按學校編號查詢學校某個項目的情況;可以按項目編號查詢取得前三或前五名的學校。
5)數據存入文件並能隨時查詢
6)規定:輸入數據形式和範圍:可以輸入學校的名稱,運動項目的名稱
輸出形式:有合理的提示,各學校分數爲整形 界面要求:有合理的提示,每個功能可以設立菜單,根據提示,可以完成相關的功能要求。
存儲結構:學生自己根據系統功能要求自己設計,但是要求運動會的相關數據要存儲在數據文件中。
(數據文件的數據讀寫方法等相關內容在c語言程序設計的書上,請自學解決)請在最後的上交資料中指明你用到的存儲結構;
測試數據:要求使用1、全部合法數據;2、整體非法數據;3、局部非法數據。進行程序測試,以保證程序的穩定。測試數據及測試結果請在上交的資料中寫明;
比賽編號 | 獲獎前(3/5)名 | 比賽名稱 | 第一名 | 獲獎人 | 第二名 | 獲獎人 | 第三名 | 獲獎人 | 第四名 | 獲獎人 | 第五名 | 獲獎人 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | 籃球 | 清華大學 | 小華 | 北京大學 | 小明 | 中山大學 | 小韓 | ||||
2 | 3 | 足球 | 中山大學 | 小張 | 浙江大學 | 小周 | 清華大學 | 小華 | ||||
3 | 5 | 網球 | 北京大學 | 小明 | 山東大學 | 小李 | 上海大學 | 小趙 | 清華大學 | 小江 | 中山大學 | 小錢 |
4 | 5 | 體操 | 浙江大學 | 小孫 | 武漢大學 | 小常 | 清華大學 | 小花 | 北京大學 | 小麗 | 北理工 | 小龍 |
5 | 5 | 啦啦操 | 北理工 | 小龍 | 南京大學 | 小高 | 北理工 | 小劉 | 中山大學 | 小張 | 浙江大學 | 小何 |
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
int mark[6][7],n,m,w,per_num;
struct SCHOOL
{
char name[50];//學校名
int mark;//學校編號
int scores;//學校總成績
int score_man;//男團總成績
int score_woman;//女團總成績
int rank_num[30][30];//在某項目中獲得哪些名次
} school[105];
struct TEST
{
int top_num;//該項目取前幾名
int mark;//項目編號
char name[50];//項目名稱
char test_rank[6][50];//項目前幾名是哪幾個學校
char rank_name[6][50];//獲獎人姓名
} test[105];
struct Person
{
char name[50];
char school_name[50];
int rank_honor[105][6];
} person[105];
map<string,int>mp,mp1;
int cmp1(struct SCHOOL aaa,struct SCHOOL bbb)
{
return aaa.mark<bbb.mark;
}
int cmp2(struct SCHOOL aaa,struct SCHOOL bbb)
{
return aaa.scores>bbb.scores;
}
int cmp3(struct SCHOOL aaa,struct SCHOOL bbb)
{
return aaa.score_man>bbb.score_man;
}
int cmp4(struct SCHOOL aaa,struct SCHOOL bbb)
{
return aaa.score_woman>bbb.score_woman;
}
void Sum()
{
for(int i=1; i<=n; i++)
{
school[i].scores=school[i].score_man+school[i].score_woman;
}
}
void Input()
{
int cnt=0,k,x,cnt1=0,k1;
char testname[50];
mp.clear();
mp1.clear();
for(int i=1; i<=w+m; i++)
{
printf("項目編號%d:%s:\n",test[i].mark,test[i].name);
for(int j=1; j<=test[i].top_num; j++)
{
printf(" 獲得該項目第%d名的學校名:",j);
scanf("%s",test[i].test_rank[j]);
printf(" 獲獎人姓名:");
scanf("%s",test[i].rank_name[j]);
if(mp1[test[i].rank_name[j]]==0)//新人名
{
mp1[test[i].rank_name[j]]=++cnt1;
k1=cnt1;
strcpy(person[k1].name,test[i].rank_name[j]);
strcpy(person[k1].school_name,test[i].test_rank[j]);
}
else
{
k1=mp1[test[i].rank_name[j]];
if(strcmp(person[k1].school_name,test[i].rank_name[j]))//重名
{
cnt1++;
int flag=0;
for(int ii=1; ii<cnt; ii++)//所有人
{
if(strcmp(person[ii].name,test[i].rank_name[j])==0&&strcmp(person[ii].school_name,test[i].test_rank[j])==0)
{
flag=1;
k1=mp1[test[i].rank_name[j]];
break;
}
}
if(flag==0)
{
cnt1++;
k1=cnt1;
strcpy(person[k1].name,test[i].rank_name[j]);
strcpy(person[k1].school_name,test[i].test_rank[j]);
}
}
}
person[k1].rank_honor[i][j]=1;
if(mp[test[i].test_rank[j]]==0)
{
mp[test[i].test_rank[j]]=++cnt;
strcpy(school[cnt].name,test[i].test_rank[j]);
school[cnt].mark=cnt;
k=cnt;
}
else
k=mp[test[i].test_rank[j]];
school[k].rank_num[i][j]=1;
if(i<=m)
school[k].score_man+=mark[test[i].top_num][j];
else
school[k].score_woman+=mark[test[i].top_num][j];
}
printf("\n");
}
n=cnt;
per_num=cnt1;
Sum();
return ;
}
void Init()
{
for(int i=1; i<=n; i++)
{
printf(" 學校編號%d : %s\n",school[i].mark,school[i].name);
}
printf("\n");
}
void Init1()
{
for(int i=1; i<=m+w; i++)
{
printf(" 項目編號%d : %s\n",test[i].mark,test[i].name);
}
printf("\n");
}
void Query(int option)
{
while(1)
{
if(option==1)
{
Init1();
sort(school+1,school+n+1,cmp1);
while(1)
{
int x;
printf(" 請輸入項目編號,結束請輸入-1:");
scanf("%d",&x);
if(x==-1)
break;
if(x>w+m)
{
printf(" 輸入不合法,請重新輸入\n");
continue;
}
printf(" %s:\n",test[x].name);
for(int i=1; i<=test[x].top_num; i++)
{
int sum=0;
printf(" 第%d名: %10s ",i,test[x].test_rank[i]);//學校名
printf(" 獲獎人%s: ",test[x].rank_name[i]);//獲獎人
/*for(int j=1; j<=5; j++)
{
if(strcmp(test[x].test_rank[j],test[x].test_rank[i])==0)
sum+=mark[test[x].top_num][j];
}*/
printf(" 得分 : %d\n",mark[test[x].top_num][i]);
}
}
}
else if(option==2)
{
Init();
while(1)
{
int x,sum,flag=0;
printf(" 請輸入學校編號,結束輸入-1\n");
scanf("%d",&x);
if(x==-1)
break;
if(x>n)
{
printf(" 輸入不合法,請重新輸入\n");
continue;
}
printf(" %s :\n",school[x].name);
for(int j=1; j<=w+m; j++)//那個項目
{
sum=0;
flag=0;
for(int k=1; k<=5; k++)//第幾名
{
if(school[x].rank_num[j][k]==1)
{
flag=1;
printf(" %s第%d名",test[j].name,k);
printf(" 獲獎人:%s ",test[j].rank_name[k]);
sum+=mark[test[j].top_num][k];
}
}
if(flag==1)
{
printf("%18s: %d\n","總得分",sum);
}
}
printf("\n");
}
}
else if(option==3)
{
char name[30],school_name[30];
int flag=0,flag1=0;
while(1)
{
flag=0,flag1=0;
printf(" 請輸入人名和學校名(輸入#退出)\n");
printf(" 人名:");
scanf("%s",name);
if(name[0]=='#')
break;
printf(" 學校名:");
scanf("%s",school_name);//學校名
for(int i=1; i<=per_num; i++)
{
if(strcmp(person[i].name,name)==0&&strcmp(person[i].school_name,school_name)==0)
{
flag1=1;
printf(" %s:\n",person[i].name);
for(int k=1; k<=m+w; k++)
{
for(int j=1; j<=5; j++)
{
if(person[i].rank_honor[k][j]==1)
{
printf(" %s第%d名\n",test[k].name,j);
flag=1;
}
}
}
}
if(flag==1)
break;
}
if(flag1==0)
printf(" 信息有誤\n");
else if(flag==0)
printf(" 未取得佳績\n");
printf("\n");
}
printf("\n");
}
else if(option==-1)
{
break;
}
else
{
printf("輸入不合法,請重新輸入\n");
}
printf(" 請選擇查詢方式,輸入-1結束查詢輸\n");
printf(" 1.按項目編號查詢取得前三或前五名的學校\n");
printf(" 2.查詢某個學校的所有信息\n");
printf(" 3.按人名查詢獲獎信息\n");
scanf("%d",&option);
}
}
void Sort(int option)
{
while(1)
{
if(option==1)
{
sort(school+1,school+n+1,cmp1);
for(int i=1; i<=n; i++)
{
printf(" %d.%12s 總分: %2d 男團總分: %2d 女團總分: %2d\n",i,school[i].name,school[i].scores,school[i].score_man,school[i].score_woman);
}
printf("\n");
}
else if(option==2)
{
sort(school+1,school+n+1,cmp2);
for(int i=1; i<=n; i++)
{
printf(" %d.%12s 總分: %2d 男團總分: %2d 女團總分: %2d\n",i,school[i].name,school[i].scores,school[i].score_man,school[i].score_woman);
}
printf("\n");
}
else if(option==3)
{
sort(school+1,school+n+1,cmp3);
for(int i=1; i<=n; i++)
{
printf(" %d.%12s 總分: %2d 男團總分: %2d 女團總分: %2d\n",i,school[i].name,school[i].scores,school[i].score_man,school[i].score_woman);
}
printf("\n");
}
else if(option==4)
{
sort(school+1,school+n+1,cmp4);
for(int i=1; i<=n; i++)
{
printf(" %d.%12s 總分: %2d 男團總分: %2d 女團總分: %2d\n",i,school[i].name,school[i].scores,school[i].score_man,school[i].score_woman);
}
printf("\n");
}
else if(option==-1)
{
break;
}
else
{
printf("輸入不合法,請重新輸入\n");
}
printf(" 請選擇查詢方式,輸入-1結束查詢\n");
printf(" 1.按學校編號排序輸出\n");
printf(" 2.按學校總分排序輸出\n");
printf(" 3.按男團總分排序輸出\n");
printf(" 4.按女團總分排序輸出\n");
scanf("%d",&option);
}
return ;
}
void Intxt()//學校,男子項目,女子項目
{
FILE *fp;
fp=fopen("text.txt","w");
if(fp==NULL)
printf("打開失敗\n");
fprintf(fp,"%-02d %-02d %-02d%158s\n",n,m,w," ");//
fprintf(fp,"%-16s","比賽項目編號");//16
fprintf(fp,"%-16s","比賽項目名稱");//16
fprintf(fp,"%-16s","比賽取前幾名");//16
for(int i=1; i<=5; i++)
{
fprintf(fp," 第%d名 ",i);//12
fprintf(fp,"%-12s","獲獎人姓名");//12
}
fprintf(fp,"%c",'\n');//2
for(int i=1; i<=m+w; i++)
{
fprintf(fp," %02d ",test[i].mark);
fprintf(fp," %-10s ",test[i].name);
fprintf(fp," %d ",test[i].top_num);
for(int j=1; j<=test[i].top_num; j++)
{
fprintf(fp," %-8s ",test[i].test_rank[j]);
fprintf(fp,"%-12s",test[i].rank_name[j]);//12
}
if(test[i].top_num==3)
{
for(int j=1; j<=2; j++)
{
fprintf(fp,"%24s"," ");
}
}
fprintf(fp,"%c",'\n');
}
fprintf(fp,"獲獎學校總共有%d個\n",n);
fprintf(fp,"男子項目有%d個\n",m);
fprintf(fp,"女子項目有%d個\n",w);
fprintf(fp,"%s","****************************************************************************************************************\n");
int flag=0;
fprintf(fp," %s\n","各學校獲獎情況");
fprintf(fp,"%-16s","學校名稱");
fprintf(fp,"%-16s","學校編號");
for(int i=1; i<=m+w; i++)
{
fprintf(fp,"%-16s",test[i].name);//項目名
}
fprintf(fp,"%-16s","總分");
fprintf(fp,"%-16s","男團總分");
fprintf(fp,"%-16s","女團總分");
fprintf(fp,"%c",'\n');
for(int i=1; i<=n; i++)//幾個學校
{
fprintf(fp,"%-16s",school[i].name);//學校名
fprintf(fp," %02d ",school[i].mark);//學校編號
for(int j=1; j<=w+m; j++)//那個項目
{
for(int k=1; k<=5; k++)//第幾名
{
if(school[i].rank_num[j][k]==1)
{
flag+=2;
fprintf(fp," %d",k);
}
}
if(flag==0)
fprintf(fp,"%-16s","未獲得名次");
else
{
for(int k=flag+1; k<=16; k++)
fprintf(fp,"%c",' ');
}
flag=0;
}
fprintf(fp,"%02d ",school[i].scores);//總分
fprintf(fp," %02d ",school[i].score_man);//男團總分
fprintf(fp," %02d ",school[i].score_woman);//女團總分
fprintf(fp,"%c",'\n');
}
fclose(fp);
}
void Outtxt()
{
mp1.clear();
char c,name[30];
int flag=0,cnt=0,k,k1,cnt1=0;
FILE *fp;
fp=fopen("text.txt","r");
if(fp==NULL)
printf("打開失敗\n");
fscanf(fp,"%d%d%d",&n,&m,&w);
printf("%d %d %d\n",m,n,w);
for(int i=1; i<=m+w; i++) //第幾個項目
{
fseek(fp,170*(i+1),0);
fscanf(fp,"%d",&test[i].mark);//項目編號
//printf(" %d ",test[i].mark);
fscanf(fp,"%s",test[i].name);//項目名
//printf(" %s ",test[i].name);
fscanf(fp,"%d",&test[i].top_num);//項目取前幾名
//printf(" %d ",test[i].top_num);
flag=0;
for(int j=1; j<=test[i].top_num; j++)//第幾名
{
fscanf(fp,"%s",test[i].test_rank[j]);
// printf("獲獎學校 %s ",test[i].test_rank[j]);
fscanf(fp,"%s",test[i].rank_name[j]);
//printf("獲獎人 %s ",test[i].rank_name[j]);
if(mp1[test[i].rank_name[j]]==0)//新人名
{
mp1[test[i].rank_name[j]]=++cnt1;
k1=cnt1;
strcpy(person[k1].name,test[i].rank_name[j]);
strcpy(person[k1].school_name,test[i].test_rank[j]);
}
else
{
k1=mp1[test[i].rank_name[j]];
if(strcmp(person[k1].school_name,test[i].rank_name[j]))//重名
{
cnt1++;
int flag=0;
for(int ii=1; ii<cnt; ii++)
{
if(strcmp(person[ii].name,test[i].rank_name[j])==0&&strcmp(person[ii].school_name,test[i].test_rank[j])==0)
{
flag=1;
k1=mp1[test[i].rank_name[j]];
break;
}
}
if(flag==0)
{
cnt1++;
k1=cnt1;
strcpy(person[k1].name,test[i].rank_name[j]);
strcpy(person[k1].school_name,test[i].test_rank[j]);
}
}
}
person[k1].rank_honor[i][j]=1;
//printf("%s\n",test[i].test_rank[j]);
if(mp[test[i].test_rank[j]]==0)
{
mp[test[i].test_rank[j]]=++cnt;
strcpy(school[cnt].name,test[i].test_rank[j]);
school[cnt].mark=cnt;
k=cnt;
}
else
k=mp[test[i].test_rank[j]];
school[k].rank_num[i][j]=1;
if(i<=m)
school[k].score_man+=mark[test[i].top_num][j];
else
school[k].score_woman+=mark[test[i].top_num][j];
}
//printf("\n");
}
per_num=cnt1;
Sum();
fclose(fp);
}
void Output()
{
printf("\n");
for(int i=1; i<=n; i++)
{
printf(" %s:\n",school[i].name);
for(int j=1; j<=w+m; j++)//那個項目
{
for(int k=1; k<=5; k++)//第幾名
{
if(school[i].rank_num[j][k]==1)
{
printf(" %s第%d名",test[j].name,k);
printf(" 獲獎人:%s\n",test[j].rank_name[k]);
}
}
}
printf("\n");
}
}
void mulu()
{
int flag=0,x;
char name[20];
mark[3][1]=5;
mark[3][2]=3,mark[3][3]=2;
mark[5][1]=7;
mark[5][2]=5,mark[5][3]=3;
mark[5][4]=2;
mark[5][5]=1;
printf("==============================運動會分數統計系統===========================\n");
printf(" 1.輸入信息\n");
printf(" 2.查詢系統\n");
printf(" 3.排序輸出\n");
printf(" 4.統計輸出(查看每個學校在各個項目中的獲獎情況)\n");
printf(" 5.寫入文件保存\n");
printf(" 6.讀取文件\n");
printf(" 7.退出程序\n");
printf("==========================================================================\n");
while(1)
{
printf("請輸入操作數:");
scanf("%d",&flag);
if(flag==1)
{
printf(" 請輸入有幾個男子項目:");
scanf("%d",&m);
for(int i=1; i<=m; i++)
{
printf(" 請輸入男子項目%d的名稱:",i);
scanf("%s",test[i].name);
printf(" 該項目取前幾名(3/5):");
scanf("%d",&test[i].top_num);
test[i].mark=i;
printf("\n");
}
printf(" 請輸入有幾個女子項目:");
scanf("%d",&w);
for(int i=1; i<=w; i++)
{
printf(" 請輸入女子項目%d的名稱:",i);
scanf("%s",test[i+m].name);
printf(" 該項目取前幾名(3/5):");
scanf("%d",&test[i+m].top_num);
test[i+m].mark=i+m;
printf("\n");
}
Input();
}
else if(flag==2)
{
int option;
printf(" 請選擇查詢方式,輸入-1結束查詢輸\n");
printf(" 1.按項目編號查詢取得前三或前五名的學校\n");
printf(" 2.按學校編號查詢某個學校的所有信息\n");
printf(" 3.按人名查詢獲獎信息\n");
scanf("%d",&option);
Query(option);
}
else if(flag==3)
{
int option;
printf(" 請選擇查詢方式,輸入-1結束查詢\n");
printf(" 1.按學校編號排序輸出\n");
printf(" 2.按學校總分排序輸出\n");
printf(" 3.按男團總分排序輸出\n");
printf(" 4.按女團總分排序輸出\n");
scanf("%d",&option);
Sort(option);
}
else if(flag==4)
{
Output();
}
else if(flag==5)
{
Intxt();
}
else if(flag==6)
{
Outtxt();
}
else if(flag==7)
{
printf("退出程序\n");
break;
}
else
{
printf("輸入不合法,請重新輸入\n");
}
printf("==============================運動會分數統計系統===========================\n");
printf(" 1.輸入信息\n");
printf(" 2.查詢系統\n");
printf(" 3.排序輸出\n");
printf(" 4.統計輸出(查看每個學校在各個項目中的獲獎情況)\n");
printf(" 5.寫入文件保存\n");
printf(" 6.讀取文件\n");
printf(" 7.退出程序\n");
printf("==========================================================================\n");
}
}
int main()
{
mulu();
return 0;
}