摘 要
设计了一个运动会分数统计系统,该系统可以简单的统计有关于运动会的信息。本系统采用VC++作为软件开发环境,运用了排序算法和线性表的顺序存储等算法。实现了对运动会数据的存储与排序运算。操作简单,界面清晰,易于为用户所接受。
关键词:算法;运动会;系统
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)规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称
输出形式:有合理的提示,各学校分数为整形
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;
2 问题分析和任务定义
本程序的要求是对运动会信息的统计与分析。要求我们可以将比赛的按各个比赛项目划分,还可以按照学校来划分。还要求有排序的部分,要求成绩可以按照学校、男团和女团排序。并且可以将数据存入文件,也可以从文件里读出数据。限制条件为,各学校的分数的类型都要是整形的,数据都要存储在文件中。
3逻辑设计
(1)结构体
项目{名字,名次,获奖人数,获奖人姓名,获奖排名,得分,性别}
学校{名字,学校总分,男团总分,女团总分,项目}
(2)主函数
包括登录欢迎程序,主菜单,输入程序,查询程序,存读文件程序,退出程序
(3)调用关系图
4 详细设计
(1)项目数据表
本数据表主要是存储每个项目的名字、要取的名次、取得各个名次学生的姓名以及取得的名次和获得的分数
typedef struct//存储项目信息的结构体
{
char name[20];//存储项目的姓名
int top;//存储项目名次的选择
int num;//存储有几个有名次的
int ranking[6];//存储名次
int grade[6];//存储分数
char d[20][20];//存储同学的姓名
int gender;//存储性别
} project;
(2)学校数据表
本数据表主要是介绍各参赛学校的总体情况,包括学校的名字、取得的总分、男团的总分、女团的总分、包括各个项目的数组。
typedef struct//存储学校的信息
{
char name[20];//存学校的姓名
int school;//存学校的总成绩
int man;//存男团的总成绩
int woman;//存女团的总成绩
project b[M+W];//存这个学校的项目
} school;
(3)函数介绍
1、void start() 功能:初始页面
2、void menu() 功能:菜单
3、void Initialization()功能:初始化函数,初始化学校的总分等
4、void input() 功能:输入函数
5、void output() 功能:输出学校信息函数
6、void sortmenu() 功能:排序的菜单
7、void sortput() 功能:排序的函数
8、void outschool() 功能:输出学校的总分
9、void projectout() 功能:输出项目信息的函数
10、void savefile() 功能:存文件的函数
11、void readfile() 功能:读文件的函数
12、void xuexiao() 功能:查询某个学校或者项目的函数
13、void command()功能:命令函数
14、int main()功能:主函数
5 程序编码
#include <iostream>
#include<algorithm>
#include<queue>
#include<>
#include<>
#include<map>
#include<>
using namespace std;
#define M 31
#define W 21
#define S 51
typedef struct//存储项目信息的结构体
{
char name[20];//存储项目的姓名
int top;//存储项目名次的选择
int num;//存储有几个有名次的
int ranking[6];//存储名次
int grade[6];//存储分数
char d[20][20];//存储同学的姓名
int gender;//存储性别
} project;
typedef struct//存储学校的信息
{
char name[20];//存学校的姓名
int school;//存学校的总成绩
int man;//存男团的总成绩
int woman;//存女团的总成绩
project b[M+W];//存这个学校的项目
} school;
school a[S];
int nom,item;
bool cmp1(school c,school d)//排序
{
return >;
}
bool cmp2(school c,school d)
{
return >;
}
bool cmp3(school c,school d)
{
return >;
}
void start()//初始页面
{
int i;
for(i=0; i<10; i++)
printf("\n");
printf(" *****************************************************\n");
printf(" ** **\n");
printf(" >>>>>>>>>>>>>>欢迎使用运动会分数统计项目<<<<<<<<<<<<<\n");
printf(" ** **\n");
printf(" *****************************************************\n");
printf("按任意键进入系统.........");
getchar();
return ;
}
void menu()//菜单
{
printf("******************************************************\n");
printf(" 1:录入运动会信息 \n");
printf(" 2:输出各学校的信息 \n");
printf(" 3:输出排序后的信息 \n");
printf(" 4:输出各项目的信息 \n");
printf(" 5:输出各学校的总分 \n");
printf(" 6:将信息存入文件 \n");
printf(" 7:将信息从文件中读出 \n");
printf(" 8:查询某学校的信息或者某项目的信息 \n");
printf(" 9:退出程序 \n");
printf("******************************************************\n");
}
void Initialization()//初始化函数,初始化学校的总分等
{
int i,j,k;
for(i=1; i<=nom; i++)
{
a[i].school=0;
a[i].man=0;
a[i].woman=0;
for(j=1; j<=item; j++)
{
a[i].b[j].top=0;
a[i].b[j].gender=0;
a[i].b[j].num=0;
for(k=1; k<=5; k++)
{
a[i].b[j].ranking[k]=0;
a[i].b[j].grade[k]=0;
}
}
}
return ;
}
void input()//输入函数
{
printf("请输入学校的总个数: ");
scanf("%d",&nom);
printf("\n");
printf("请输入项目的总个数: ");
scanf("%d",&item);
printf("\n");
int i,j,k;
Initialization();
for(i=1; i<=nom; i++)
{
printf("请输入学校的名称:");
scanf("%s",&a[i].name);
printf("\n");
for(j=1; j<=item; j++)
{
printf("请输入项目的名称:");
scanf("%s",a[i].b[j].name);
printf("\n");
printf("请输入是男子项目还是女子项目 (男子输1,女子输2):");
scanf("%d",&a[i].b[j].gender);
printf("\n");
int sum=0;
if(a[i].b[j].gender==1)
{
printf("请输入此项目取前几名(3或5):");
scanf("%d",&a[i].b[j].top);
printf("\n");
printf("请输入该学校在此项目取得名次的人数:");
scanf("%d",&a[i].b[j].num);
printf("\n");
for(k=1; k<=a[i].b[j].num; k++)
{
printf("请输入获得的名次情况和获得名次的人名:");
scanf("%d %s",&a[i].b[j].ranking[k],&a[i].b[j].d[k]);
printf("\n");
if(a[i].b[j].top==3)
{
if(a[i].b[j].ranking[k]==1)
{
a[i].b[j].grade[k]=5;
}
else if(a[i].b[j].ranking[k]==2)
{
a[i].b[j].grade[k]=3;
}
else if(a[i].b[j].ranking[k]==3)
{
a[i].b[j].grade[k]=2;
}
else
a[i].b[j].grade[k]=0;
}
else if(a[i].b[j].top==5)
{
if(a[i].b[j].ranking[k]==1)
{
a[i].b[j].grade[k]=7;
}
else if(a[i].b[j].ranking[k]==2)
{
a[i].b[j].grade[k]=5;
}
else if(a[i].b[j].ranking[k]==3)
{
a[i].b[j].grade[k]=3;
}
else if(a[i].b[j].ranking[k]==4)
{
a[i].b[j].grade[k]=2;
}
else if(a[i].b[j].ranking[k]==5)
{
a[i].b[j].grade[k]=1;
}
else
a[i].b[j].grade[k]=0;
}
else
{
printf("规定的名次不符合要求\n");
j--;
continue;
}
}
for(k=1; k<=a[i].b[j].num; k++)
sum+=a[i].b[j].grade[k];
a[i].school+=sum;
a[i].man+=sum;
}
else
{
printf("请输入此项目取前几名(3或5):");
scanf("%d",&a[i].b[j].top);
printf("\n");
printf("请输入该学校在此项目取得名次的人数:");
scanf("%d",&a[i].b[j].num);
printf("\n");
for(k=1; k<=a[i].b[j].num; k++)
{
printf("请输入获得的名次情况和获得名次的人名:");
scanf("%d %s",&a[i].b[j].ranking[k],&a[i].b[j].d[k]);
printf("\n");
if(a[i].b[j].top==3)
{
if(a[i].b[j].ranking[k]==1)
{
a[i].b[j].grade[k]=5;
}
else if(a[i].b[j].ranking[k]==2)
{
a[i].b[j].grade[k]=3;
}
else if(a[i].b[j].ranking[k]==3)
{
a[i].b[j].grade[k]=2;
}
else
a[i].b[j].grade[k]=0;
}
else if(a[i].b[j].top==5)
{
if(a[i].b[j].ranking[k]==1)
{
a[i].b[j].grade[k]=7;
}
else if(a[i].b[j].ranking[k]==2)
{
a[i].b[j].grade[k]=5;
}
else if(a[i].b[j].ranking[k]==3)
{
a[i].b[j].grade[k]=3;
}
else if(a[i].b[j].ranking[k]==4)
{
a[i].b[j].grade[k]=2;
}
else if(a[i].b[j].ranking[k]==5)
{
a[i].b[j].grade[k]=1;
}
else
a[i].b[j].grade[k]=0;
}
else
{
printf("规定的名次不符合要求\n");
j--;
continue;
}
}
for(k=1; k<=a[i].b[j].num; k++)
sum+=a[i].b[j].grade[k];
a[i].school+=sum;
a[i].woman+=sum;
}
}
}
return ;
}
void output()//输出学校信息函数
{
int i,j,k;
printf("学校 项目 性别 名次个数 获得名次数 名次 姓名\n");
for(i=1; i<=nom; i++)
{
for(j=1; j<=item; j++)
{
for(k=1; k<=a[i].b[j].num; k++)
{
if(a[i].b[j].gender==1)
printf("%-13s%-8s 男子 %-15d%-15d%-10d%s\n",a[i].name,a[i].b[j].name,a[i].b[j].top,a[i].b[j].num,a[i].b[j].ranking[k],a[i].b[j].d[k]);
else
printf("%-13s%-8s 女子 %-15d%-15d%-10d%s\n",a[i].name,a[i].b[j].name,a[i].b[j].top,a[i].b[j].num,a[i].b[j].ranking[k],a[i].b[j].d[k]);
}
}
}
printf("按任意键继续.........\n");
getchar();
getchar();
return ;
}
void sortmenu()//排序菜单
{
printf("***********************************************\n");
printf(" 1:按照学校的名次排序 \n");
printf(" 2:按照男团的名次排序 \n");
printf(" 3:按照女团的名次排序 \n");
printf(" 4:按照学校的编号输出 \n");
printf(" 5:退出排序系统 \n");
printf("***********************************************\n");
}
void sortput()//排序的函数
{
while(1)
{
system("cls");
sortmenu();
printf("请输入命令:");
int com,i;
scanf("%d",&com);
printf("\n");
if(com==4)
{
output();
}
else if(com==1)
{
printf("按照学校的名次排序为:\n");
sort(a+1,a+nom,cmp1);
for(i=1; i<=nom; i++)
{
printf("排名第%d的学校为:%s\n",i,a[i].name);
}
printf("按任意键继续.......\n");
getchar();
getchar();
}
else if(com==2)
{
printf("按照男团的名次排序为:\n");
sort(a+1,a+nom,cmp2);
for(i=1; i<=nom; i++)
{
printf("排名第%d的学校为:%s\n",i,a[i].name);
}
printf("按任意键继续.......\n");
getchar();
getchar();
}
else if(com==3)
{
printf("按照女团的名次排序为:\n");
sort(a+1,a+nom,cmp3);
for(i=1; i<=nom; i++)
{
printf("排名第%d的学校为:%s\n",i,a[i].name);
}
printf("按任意键继续.......\n");
getchar();
getchar();
}
else if(com==5)
break;
else
printf("无效的命令\n");
}
}
void outschool()//输出学校的总分
{
int i;
for(i=1; i<=nom; i++)
printf("%s学校的总分为%d\n",a[i].name,a[i].school);
printf("按任意键继续.........\n");
getchar();
getchar();
}
void projectout()//输出项目信息的函数
{
int i,j,k,p,q;
for(i=1; i<=item; i++)
{
printf(" %s该项目的排名\n",a[1].b[i].name);
printf(" 学校 名次 姓名\n");
for(j=1; j<=a[1].b[i].top; j++)
{
for(k=1; k<=nom; k++)
{
for(p=1; p<=item; p++)
{
if(strcmp(a[k].b[p].name,a[1].b[i].name)==0)
{
for(q=1; q<=a[k].b[p].num; q++)
{
if(a[k].b[p].ranking[q]==j)
{
printf(" %-10s%-10d%s\n",a[k].name,j,a[k].b[p].d[q]);
}
}
}
}
}
}
printf("\n");
}
printf("按任意键继续......\n");
getchar();
getchar();
}
void savefile()//存文件的函数
{
FILE *fp;
int i;
if((fp=fopen("","w"))==NULL)
{
printf("打不开文件\n");
}
else
{
fwrite(&nom,sizeof(int),1,fp);
fwrite(&item,sizeof(int),1,fp);
for(i=1; i<=nom; i++)
{
if(fwrite(&a[i],sizeof(school),1,fp)!=1)
printf("不能打开文件\n");
}
}
fclose(fp);
printf("按任意键继续.........");
getchar();
getchar();
}
void readfile()//读文件的函数
{
int i;
FILE *fp;
if((fp=fopen("","rb"))==NULL)
{
printf("不能打开文件\n");
}
else
{
fread(&nom,sizeof(int),1,fp);
fread(&item,sizeof(int),1,fp);
for(i=1; i<=nom; i++)
{
fread(&a[i],sizeof(school),1,fp);
}
}
printf("按任意键继续.........");
getchar();
getchar();
}
void xuexiao()//查询某个学校或者项目的函数
{
system("cls");
printf("请输入你要查找学校还是项目(学校输1,项目输2):");
int com;
scanf("%d",&com);
printf("\n");
int i,j,k,p,q;
if(com==1)
{
printf("请输入要查找的学校的名称:");
char s[20];
scanf("%s",s);
printf("\n");
for(i=1; i<=nom; i++)
{
if(strcmp(s,a[i].name)==0)
{
printf("学校 项目 性别 名次个数 获得名次数 名次 姓名\n");
for(j=1; j<=item; j++)
{
for(k=1; k<=a[i].b[j].num; k++)
{
if(a[i].b[j].gender==1)
printf("%-13s%-8s 男子 %-15d%-15d%-10d%s\n",a[i].name,a[i].b[j].name,a[i].b[j].top,a[i].b[j].num,a[i].b[j].ranking[k],a[i].b[j].d[k]);
else
printf("%-13s%-8s 女子 %-15d%-15d%-10d%s\n",a[i].name,a[i].b[j].name,a[i].b[j].top,a[i].b[j].num,a[i].b[j].ranking[k],a[i].b[j].d[k]);
}
}
break;
}
}
if(i==nom+1)
{
printf("没有找到你要查找的学校\n");
}
}
else
{
int flag=0;
printf("请输入要查找的项目的名称:");
char s[20];
scanf("%s",s);
printf("\n");
int d;
for(j=1; j<=item; j++)
{
if(strcmp(a[1].b[j].name,s)==0)
{
printf(" %s该项目的排名\n",a[1].b[i].name);
printf(" 学校 名次 姓名\n");
for(d=1; d<=a[1].b[j].top; d++)
{
for(k=1; k<=nom; k++)
{
for(p=1; p<=item; p++)
{
if(strcmp(a[k].b[p].name,s)==0)
{
for(q=1; q<=a[k].b[p].num; q++)
{
if(a[k].b[p].ranking[q]==d)
{
printf(" %-10s%-10d%s\n",a[k].name,d,a[k].b[p].d[q]);
}
}
}
}
}
}
flag=1;
break;
}
if(flag)
break;
}
}
printf("按任意键继续......");
getchar();
getchar();
}
void command()//命令函数
{
int com;
while(1)
{
system("cls");
menu();
printf("请输入要执行的命令\n");
scanf("%d",&com);
if(com==1)
input();
else if(com==2)
output();
else if(com==3)
sortput();
else if(com==4)
projectout();
else if(com==5)
outschool();
else if(com==6)
savefile();
else if(com==7)
readfile();
else if(com==8)
xuexiao();
else if(com==9)
return ;
else
printf("无效的命令\n");
}
}
int main()//主函数
{
start();
system("cls");
command();
return 0;
}
7 结果分析
本程序的时间复杂度大约为O(N3),主要是在程序的输入和输出。空间复杂度大约为O(N2);
程序的问题及解决过程:开始时程序没有查询学校和项目信息的功能。之后添加了这个功能,用了名字匹配的功能,可以查询相关学校和项目。还有之前的输出格式不好,之后进行了一些改进,比以前好多了。
8 总结
这次的程序设计完成了关于运动会的信息的存储,可以按照学校编号输出,也可以按照排序输出,还可以查询学校或者项目的相关信息。程序中用到了排序算法,在查询学校中用到了匹配。在设计的过程当中遇到了很多的问题,最后通过思考和查找资料等方法将其解决。在设计的过程当中学到了很多,也发现解决一个问题需要有耐心、恒心。通过这次程序设计,使我加深了对数据结构的理解,也提高了自己解决问题的能力。
参考文献
[1] 刘晓华,唐焕玲,肖进杰.数据结构(C语言版)[M].北京:清华大学出版社,2015
[2] 王金鹏.C语言可以这样学[M]. 北京:清华大学出版社,2016