关于校运会成绩管理的问题,其中修改比赛成绩、数据读取及存储。三个功能不知道怎么实现,求解答
完成校际运动会成绩管理功能,包括输入项目及参赛成绩,输入参赛学校,统计各校成绩并排序。各项目名次取法有如下几种:
取前5名:第1名得分7,第2名得分5,第3名得分3,第4名得分2,第5名得分1;
取前3名:第1名得分5,第2名得分3,第3名得分2;
用户自定义分数选择,并有查错功能(名次靠前的得分要高于名次靠后的得分)
【实现提示】
(1)显示主菜单功能选项,包括初始化、输入比赛成绩、修改比赛成绩、成绩统计、数据读取及存储。
(2)初始化:从文件读取比赛项目和参赛学校;增加比赛项目及名称;增加参赛学校及名称;
(3)输入各比赛项目比赛成绩:选择项目,输入各名次的选手名及所属学校
(4)统计各学校总分并排序。
(5)输出显示所有参赛项目及已输入成绩,并提示未完成输入的项目。
(6)修改已输入比赛项目成绩:选择项目—>选择待修改名次—>修改该名次选手名及学校
(7)输出到文件,并能从文件进行数据的读取。
#include<stdio.h>
#include<string.h>
struct match //声明一个比赛类型
{
int isMen;//判断是否为男子,1则为男子
char name[100];//比赛名字
char result[3][20];//比赛结果,存储前三名名字
char SchoolOfResult[3][20];//前三名学校名字
}allMatch[100]; //声明所有比赛,默认不超过100;
int main()
{
int i,j, z, n , m, w, temp_flag, flag;
char school[10][20];//学校名称
int score[3];//前三名加分
char temp_result[3][20];//存刚输入的比赛结果,前三名名字
char temp_SchoolOfresult[3][20];//存刚输入的比赛结果前三名学校名字
char temp_name[20];//存刚输入学校名字
int scoreOfSchool[10] = {0,0,0,0,0,0,0,0,0,0};//各学校总分,下标与school对应
printf("输入参赛学校总数、男子竞赛项目数量和女子项目数量:\n");
scanf("%d %d %d",&n,&m,&w);
//struct match allMatch[100]; //声明所有比赛,默认不超过100
printf("\n请输入学校名称:\n");
for(i = 0; i < n; i++)
{
scanf("%s",school[i]);//接受输入的学校名字
}
printf("\n请输入前三名可得分:\n");
for(i = 0;i < 3;i++)//接受输入的前三名加分
{
scanf("%d",&score[i]);
}
printf("\n接下来请输入比、比赛结果:\n(格式:比赛名称 第一名 学校 第二名 学校 第三名 学校)\n男子项目:\n");
for(i = 0; i < m;i++)//男子比赛结果,用for循环
{
allMatch[i].isMen = 1;
scanf("%s %s %s %s %s %s %s",temp_name,temp_result[0],temp_SchoolOfresult[0],temp_result[1],temp_SchoolOfresult[1],temp_result[2],temp_SchoolOfresult[2]);
strcpy(allMatch[i].name , temp_name);
strcpy(allMatch[i].result[0] ,temp_result[0]);
strcpy(allMatch[i].SchoolOfResult[0],temp_SchoolOfresult[0]);
strcpy(allMatch[i].result[1] , temp_result[1]);
strcpy(allMatch[i].SchoolOfResult[1],temp_SchoolOfresult[1]);
strcpy(allMatch[i].result[2] , temp_result[2]);
strcpy(allMatch[i].SchoolOfResult[2],temp_SchoolOfresult[2]);
}//男子for循环
printf("\n女子项目:\n");
for(i = 0; i < w; i++)//女子比赛结果
{
allMatch[m+i].isMen = 0;
scanf("%s %s %s %s %s %s %s",temp_name,temp_result[0],temp_SchoolOfresult[0],temp_result[1],temp_SchoolOfresult[1],temp_result[2],temp_SchoolOfresult[2]);
strcpy(allMatch[m+i].name , temp_name);
strcpy(allMatch[m+i].result[0] ,temp_result[0]);
strcpy(allMatch[m+i].SchoolOfResult[0],temp_SchoolOfresult[0]);
strcpy(allMatch[m+i].result[1] , temp_result[1]);
strcpy(allMatch[m+i].SchoolOfResult[1],temp_SchoolOfresult[1]);
strcpy(allMatch[m+i].result[2] , temp_result[2]);
strcpy(allMatch[m+i].SchoolOfResult[2],temp_SchoolOfresult[2]);
}//女子for循环
printf("\n现在比赛结果输入完毕!您可以选择查询操作。\n");
temp_flag = 1;
while(temp_flag == 1){//判断是否退出,false则退出循环
printf("--------------------------------------\n");
printf("请选择要进行的操作");
printf("\n1.查看各学校总分 \n2.查看各学校各项目结果\n3.结束\n");
printf("--------------------------------------\n");
scanf("%d",&flag);//根据输入的数字选择操作
switch(flag)
{
case 1://输入0则
for(i = 0 ; i < n; i++)
{
scoreOfSchool[i] = 0;
}
printf("\n总共有%d个学校,分别是:\n",n);
for(i = 0; i < n;i++ )
{
printf("%s ",school[i]);//首先打印出n个学校
}
printf("\n");
printf("\n以下是各个学校的得分情况:\n");
for(i = 0;i < (w+m);i++)//循环得到allMatch里的元素
{
for(z = 0;z < 3; z++)//z表示名次,0对应第一名
{
for(j = 0; j < n;j++)//循环与所有学校比较
{
if(strcmp(allMatch[i].SchoolOfResult[z],school[j])==0)//判定学校名字
{
scoreOfSchool[j] += score[z];//对应学校加对应的分数
}
}
}
}
for(i = 0;i < n ;i++)
{
printf("%s %d\n",school[i],scoreOfSchool[i]);//输出所以学校总分
}
break;
case 2://输入1则
printf("\n比赛详细情况:\n比赛项目 男子or女子 第一名(名字和学校)第二名(名字和学校)第三名(名字和学校)\n");
for(i = 0;i<(w+m);i++)
{
printf(" %s ",allMatch[i].name);//输出比赛名字
if(allMatch[i].isMen==1)
{
printf("男子 ");}
else printf("女子 ");
for(j = 0;j < 3;j++)
{
printf("%s ",allMatch[i].result[j]);//输出比赛的前三名 名字
printf("%s ",allMatch[i].SchoolOfResult[j]);
}
printf("\n");
}
break;
case 3://输入3则
temp_flag = 0;//改为false,使得下次进入while结束
break;
}
}
return 0;
}