赞
踩
摘 要
设计了一个运动会分数统计系统,该系统可以简单的统计有关于运动会的信息。本系统采用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<stdio.h> #include<string.h> #include<map> #include<stdlib.h> 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 c.school>d.school; } bool cmp2(school c,school d) { return c.man>d.man; } bool cmp3(school c,school d) { return c.woman>d.woman; } 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("file.txt","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("file.txt","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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。