1.运动会分数统计
[问题描述]
参加运动会的n个学校编号为1 ~ n。比赛分成m个男子项目和w个女子项
目,项目编号分别为1~ m和m+1~ m+w。由于各项目参加人数差别较大,有
些项目取前五名,得分顺序为7,5,3, 2,1;还有些项目只取前三名,得分
顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。
[基本要求]
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分,
3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前
三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称
输出形式:有中文提示,各学校分数为整型。
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成
相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关
数据要存储在数据文件中。
测试数据:
[测试数据]
要求使用1、全部合法数据; 2、整体非法数据; 3、局部非法数据。进行
程序测试,以保证程序的稳定。
例如,对于n=4,m=3, w=2,编号为奇数的项目取前五名,编号为偶数
的项目取前三名,设计- -组实例数据。
[实现提示]
可以假设n≤20,m≤30,w≤20,姓名长度不超过20个字符。每个项
目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺
序输入运动员姓名、校名(和成绩)。
========================================
=话不多说,直接上代码
头文件和结构体
#include<stdio.h>
#include<math.h>
#include<process.h>
#define N 20 //学校最大数目
#define M 20 //男子项目最大数
#define W 20 //女子项目最大数
//存放项目信息的结构体
typedef struct
{
int inum;//项目编号
int top;//取名次的数目
int range[5];//名次
int mark[5];//分数
}itemnode;
//存放学校信息的结构体
typedef struct
{
int snum;//学校编号
int score;//学校总分
int mscore;//男子总分
int wscore;//女子总分
itemnode t[M + W];//项目数组
}snode;
snode a[N];//定义一个学校数组
//功能菜单目录
void menu(int n,int m,int w)
{
//n代表学校数,m代表男子数,w代表女子数
int c;
void input(int n,int m,int w);//输入功能
void output(int n,int m,int w);//输入功能
void sortput(int n,int m,int w);//排序输出
void search(int n,int m,int w);//查询功能
printf("\t\t\t欢迎使用\t\t\t\t\t\n");
printf("华信运动会分数统计系统\n\n");
printf("1.信息输入\n");
printf("2.统计输出\n");
printf("3.排序输出\n");
printf("4.信息查询\n");
printf("5.退出系统\n\n");
printf("=======================================================\n\n");
printf("请输入您想要实现的功能(0--4):");
scanf("%d",&c);
switch(c){
case 1:
input(n,m,w);
break;
case 2:
output(n,m,w);
break;
case 3:
sortput(n,m,w);
break;
case 4:
search(n,m,w);
break;
case 5:
printf("感谢使用,祝您天天开心!!\n");
exit(0);//正常退出
default:
printf("您输入有误,请重新输入!");
menu(n,m,w);
}
}
//将信息写入文件中
void savetofile()
{
FILE *fp;//定义一个文件指针
int i;
if(NULL == (fp = fopen("file.txt","w"))){
printf("打开文件失败!\n");
return;
}
for(i = 0;i < N;i ++){
if('\0' != a[i].snum)
if(fwrite(&a[i],sizeof(snode),1,fp) != 1){
printf("存入信息失败!\n");
return;
}
}
fclose(fp);//关闭文件
}
//将信息从文件里取出
void readfromfile()
{
int i;
FILE *fp;
if((fp=fopen("file.txt","rb"))==NULL){
printf("文件打开失败!\n");
return;
}
for(i = 0;i < N;i ++){
fread(&a[i],sizeof(snode),1,fp);
}
fclose(fp);
}
//信息输入功能
void input(int n,int m,int w)
{
int i,j,s,k,q = 1;
for(i = 0;i < n;i ++){
printf("请输入学校的编号:");
scanf("%d",&a[i].snum);
for(j = 0;j < m + w;j ++){
//总的项目的输入
printf("请输入项目编号:");
scanf("%d",&a[i].t[j].inum);
printf("请输入该项目取前3还是前5(输入3或5):");
scanf("%d",&a[i].t[j].top);
if(3 == a[i].t[j].top){
printf("获得的名次的个数(1--3):");
}else if(5 == a[i].t[j].top){
printf("获得的名次的个数(1--5):");
}else{
printf("输入有误!程序退出....");
return;
}
scanf("%d",&k);//输入获得名次的个数
for(s = 0;s < k;s ++){
if(3 == a[i].t[j].top){
printf("请输入获得的名次(1--3):");
}else{
printf("请输入获得的名次(1--5):");
}
scanf("%d",&a[i].t[j].range[s]);//输入所获得的名次的信息
}
printf("\n");
}
}
for(i = 0;i < n;i ++){
//初始化分数
a[i].score=0;//学校总分
a[i].mscore=0;//男子总分
a[i].wscore=0;//女子总分
}
for(i = 0;i < n;i ++){
for(j = 0;j < m + w;j ++){
if(0 == i){
printf("项目%d取得是前3还是前5(输入3或5):",j + 1);
scanf("%d",&a[i].t[j].top);
}
for(s = 0;s < 5;s ++){
if(3 == a[i].t[j].top){
//如果是取前三
switch(a[i].t[j].range[s]){
case 0:
a[i].t[j].mark[s] = 0 ;
break;
case 1:
a[i].t[j].mark[s] = 5;
break;
case 2:
a[i].t[j].mark[s] = 3;
break;
case 3:
a[i].t[j].mark[s] = 2;
break;
}
}else if(5 == a[i].t[j].top){
switch(a[i].t[j].range[s]){
case 0:
a[i].t[j].mark[s] = 0;
break;
case 1:
a[i].t[j].mark[s] = 7;
break;
case 2:
a[i].t[j].mark[s] = 5;
break;
case 3:
a[i].t[j].mark[s] = 3;
break;
case 4:
a[i].t[j].mark[s] = 2;
break;
case 5:
a[i].t[j].mark[s] = 1;
break