您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页数据结构程序设计运动会分数统计

数据结构程序设计运动会分数统计

来源:华佗小知识


《数据结构》 题 目

课程设计

运动会分数统计

学 院 计算机与软件学院

专 业 网络工程 班 级 2012级1班

小组组长 王颖

小组成员 邹艳云 周彤彤 胡啸 张玉洁指导教师 吴婷婷

起止时间 2013.12.23~2013.12.26

1. 数据结构课程设计任务书

1.1设计目标

运用数据结构和C语言的知识实现运动会的分数统计 1.2 课题描述

参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,

和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 1.3任务要求

1).可以输入各个项目的前三名或前五名的成绩; 2).可以统计各学校总分;

3).可以按学校编号、学校总分、男女团体总分排序输出;

4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得

前三或前五名的学校。

规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入

学校的名称,运动项目的名称) 1.4输出形式

有中文提示,各学校分数为整形 1.5界面要求

有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 1.6存储结构

学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构; 1.7测试数据

1.全部合法数据; 2.整体非法数据; 3.局部非法数据。

进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的材料中写明。

2.总体设计

运动会分数统计 A. 江浦三校运动会比赛成绩输入 B. 江浦三校运动会比赛成绩输出

a. 按学校编号输出:编号1为南京信息工程大学;编号2为南京工业大学;编号3为南京审计学院 b. 按学校总分输出 c. 按男团总分输出 d. 按女团总分输出

C.查询比赛成绩

a.按学校编号查询:编号1为南京信息工程大学;编号2为南京工业大

学;编号3为南京审计学院

b.按项目编号查询:编号1为男子乒乓球;编号2为男子羽毛球;编号3

为女子乒乓球;编号4为女子羽毛球

D.调用统计结果.

3.详细设计

3.1程序中算法的具体说明

a.采用结构体类型数组存储 typedef struct { int itemnum; //项目编号 int top; //取名次的数目 int range[5]; //名次 int mark[5]; //分数

}itemnode; //定义项目结点的类型

typedef struct { int schoolnum; //学校编号 int score; //学校总分 int mscore; //男团体总分 int wscore; //女团体总分

itemnode c[m+w]; //项目数组 }headnode;//定义头结点类型

headnode h[n];//定义一个头结点数组 b.采用数据文件的存储和调用

void writedata() //把数据存储在文件中 { FILE *report; int i; if((report=fopen(\"sportsdata.txt\ { printf(\"不能打开文件\\n\"); exit(1); } for(i=0;i} //按头结点块写入

void readdata() //读出文件中数据的函数

{ FILE *report; int i,j,k,s;

if((report=fopen(\"sportsdata.txt\ { printf(\"file can not be opened\\n\"); exit(1); }

for(i=0;iprintf(\"******学校编号:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\

printf(\"******学校总分:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\

printf(\"******男团总分:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\

printf(\"******女团总分:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\ printf(\"\\n\\n\\n\"); getch(); for(j=0;jprintf(\"******项目编号:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\

printf(\"******所取名次数量:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\ for(s=0;s<5;s++) { fread(&k,sizeof(int),1,report); if(k!=0)

printf(\"******名次:\"), printf(\"%d\\n\ } for(s=0;s<5;s++) { fread(&k,sizeof(int),1,report); if(k!=0) printf(\"******分数:\"),

printf(\"%d\\n\ } } printf(\"\\n\\n\\n\"); getch(); } fclose(report); //关闭文件

} //按照读一个数据就输出一个数据的方式显示数据内容 c.核心算法:冒泡排序 for(i=0;iremember[i]=i; for(i=0;ih[remember[j]].mscore) {k=remember[j];

remember[j]=remember[j+1]; remember[j+1]=k;}

}

3.2算法的设计思想

本程序主要是使用结构体数组来实现操作。一个运动会包括运动项目和参加运动会的学校。因此构造结构体itemnode和headnode。为了操作的方便,设计了一个总目录,选择相应序号进入各个操作,并有错误提示,每完成一个操作程序会提示选择返回目录或退出程序,对于学校总分以及男女团总分的排序使用了冒泡排序。对于各项数据,采用了C语言中存储块读写函数fread和fwrite,实现了运动会分数信息的存储与输出。每个操作前都有操作指南,易于使用。

4.源程序与执行结果

4.1源程序 #include #include #include #include #define n 3//学校数目

#define m 2//男子项目数目 #define w 2//女子项目数目 #define null 0

typedef struct {

int itemnum; //项目编号 int top; //取名次的数目

int range[5]; //名次 int mark[5]; //分数

}itemnode; //定义项目结点的类型

typedef struct {

int schoolnum; //学校编号 int score; //学校总分 int mscore; //男团体总分 int wscore; //女团体总分

itemnode c[m+w]; //项目数组 }headnode;//定义头结点类型

headnode h[n];//定义一个头结点数组

void inputinformation() //输入信息,建立系统 {

int i,j,k,s;

for(i=0;i} //初始化头结点 for(i=0;i{ printf(\"*****编号1为南京信息工程大学;编号2为南京工业大学;编号3为南京审计学院*****\\n\"); printf(\"*****学校编号:\");

scanf(\"%d\ //输入头结点信息

printf(\"*****编号1为男子乒乓球;编号2为男子羽毛球*****\\n*****编号3为女子乒乓球;编号4为女子羽毛球*****\\n\"); for(j=0;jscanf(\"%d\ printf(\"*****取前3名or前5名:\"); scanf(\"%d\

printf(\"*****获得几个名次:\");

scanf(\"%d\ //输入项目信息 for(s=0;s<5;s++)

h[i].c[j].range[s]=0, h[i].c[j].mark[s]=0; //初始化排名和分数 for(s=0;sscanf(\"%d\ //输入所获名次信息 if(h[i].c[j].top==3)

switch(h[i].c[j].range[s]) {

case 0: h[i].c[j].mark[s]=0; break; case 1: h[i].c[j].mark[s]=5; break; case 2: h[i].c[j].mark[s]=3; break; case 3: h[i].c[j].mark[s]=2; break; } else

switch(h[i].c[j].range[s]) {

case 0: h[i].c[j].mark[s]=0; break; case 1: h[i].c[j].mark[s]=7; break; case 2: h[i].c[j].mark[s]=5; break; case 3: h[i].c[j].mark[s]=3; break; case 4: h[i].c[j].mark[s]=2; break; case 5: h[i].c[j].mark[s]=1; break; }

h[i].score=h[i].score+h[i].c[j].mark[s]; //按取前三名还是取前五名分别记分 if(j<=m-1) h[i].mscore=h[i].mscore+h[i].c[j].mark[s]; //是男子项目则记到男子分数里面去 else h[i].wscore=h[i].wscore+h[i].c[j].mark[s]; //是女子项目则记到女子项目里面去 } printf(\"\\n\"); } } }

void output() //输出函数 {

int c,i,j,k;

int remember[n]; int sign;

printf(\"*****编号1为南京信息工程大学;编号2为南京工业大学;编号3为南京审计学院*****\\n\");

printf(\"*****编号1为男子乒乓球;编号2为男子羽毛球*****\\n*****编号3为女子乒乓球;编号4为女子羽毛球*****\\n\");

do {

printf(\"*******************1.按学校编号输出.*******************\\n\");

printf(\"*******************2.按学校总分输出.*******************\\n\");

printf(\"*******************3.按男团总分输出.*******************\\n\");

printf(\"*******************4.按女团总分输出.*******************\\n\");

printf(\"\\n\\n******************* 请选择编号*************************\\n\\n:\"); scanf(\"%d\ switch(c) { case 1: for(i=0;icase 2: for(i=0;ih[remember[j]].score){ k=remember[j]; remember[j]=remember[j+1],remember[j+1]=k;}

} // 用冒泡排序方法,用辅助数组记住头结点下标 for(i=0;iprintf(\"\\n\\n*****学校编号:%d\\n\ printf(\"*****学校总分:%d\\n\" ,h[remember[i]].score); printf(\"*****男团总分:%d\\n\ printf(\"*****女团总分: %d\\n\\n\\n\//按所记下标顺序输出

} //按学校总分输出

break;

case 3: for(i=0;ih[remember[j]].mscore)

{k=remember[j];remember[j]=remember[j+1];remember[j+1]=k;} }

for(i=0;icase 4: for(i=0;ih[remember[j]].wscore) { k=remember[j]; remember[j]=remember[j+1];remember[j+1]=k;} }

for(i=0;ibreak; //按女团总分输出 }

printf(\"请选择 1 继续,0 跳出\\n\"); scanf(\"%d\

}while(sign==2); //循环执行输出语句 }

void inquiry() //查询函数 {

int c; int i,j,k,s;

printf(\"\\n*****1:按学校编号查询\\n\"); printf(\"\\n*****2:按项目编号查询\\n\");

printf(\"\\n\\n*****请选择查询方式:\"); //提供两种查询方式 scanf(\"%d\ switch(c) { case 1: do { printf(\"要查询的学校编号:\"); scanf(\"%d\ if(i>n) printf(\"错误:这个学校没有参加此次运动会!\\n\\n\\n\"); else { printf(\"要查询的项目编号:\"); scanf(\"%d\ if(j>m+w||j==0) printf(\"此次运动会没有这个项目\\n\\n\\n\"); //学校编号超出范围,则输出警告 else {

printf(\"这个项目取前 %d名,该学校的成绩如下:\\n\ for(k=0;k<5;k++) if(h[i-1].c[j-1].range[k]!=0) printf(\"名次:%d\\n\//输出要查询学校项目的成绩 } }

printf(\"请选择 1 继续 , 0 跳出\\n\"); scanf(\"%d\ printf(\"\\n\\n\\n\"); }while(s==2); //循环执行输出语句 break;

case 2: do

{ printf(\"要查询的项目编号:\"); scanf(\"%d\ if(s>m+w||s==0) printf(\"此次运动会不包括这个项目.\\n\\n\\n\"); //项目编号超出范围则输出警告 else { printf(\"该项目取前 %d名,取得名次的学校\\n\ for(i=0; i} //输出该项目取得名次学校的成绩 printf(\"\\n\\n\\n继续 1,跳出 0\\n\"); scanf(\"%d\ printf(\"\\n\\n\\n\"); }while(i==2); break; } }

void writedata() //把数据存储在文件中 {

FILE *report; int i;

if((report=fopen(\"sportsdata.txt\ { printf(\"不能打开文件\\n\"); exit(1); }

for(i=0;i} //按头结点块写入

void readdata() //读出文件中数据的函数 {

FILE *report; int i,j,k,s;

if((report=fopen(\"sportsdata.txt\ { printf(\"file can not be opened\\n\");

exit(1); }

for(i=0;iprintf(\"******学校编号:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\

printf(\"******学校总分:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\

printf(\"******男团总分:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\

printf(\"******女团总分:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\ printf(\"\\n\\n\\n\"); getch();

for(j=0;jprintf(\"******项目编号:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\

printf(\"******所取名次数量:\"); fread(&k,sizeof(int),1,report); printf(\"%d\\n\ for(s=0;s<5;s++) { fread(&k,sizeof(int),1,report); if(k!=0)

printf(\"******名次:\"), printf(\"%d\\n\ } for(s=0;s<5;s++) { fread(&k,sizeof(int),1,report); if(k!=0) printf(\"******分数:\"), printf(\"%d\\n\ } }

printf(\"\\n\\n\\n\"); getch(); }

fclose(report); //关闭文件 } //按照读一个数据就输出一个数据的方式显示数据内容

void main() {

int c;

printf(\"======================欢迎使用======================\\n\"); printf(\"\\n\\n*****************运动会分数统计系统********************\\n\"); printf(\"\\n\\n********************1.输入信息*************************\\n\");

printf(\"********************2.输出信息*************************\\n\"); printf(\"********************3.查询信息*************************\\n\"); printf(\"********************4.调用信息*************************\\n\"); printf(\"********************5.退出系统*************************\\n\\n\\n\");

printf(\"================================================\\n\\n\"); printf(\"********请选择要实现步骤的编号:\\n\\n\"); scanf(\"%d\ switch(c) {

case 1: inputinformation();writedata();readdata();main(); case 2: output();main(); case 3: inquiry();main(); case 4: readdata();main(); case 5: exit(0); default: exit(0); } }

4.2执行结果

5.思想总结

经过小组五人四天坚持不懈的努力,我们终于能够按时按要求很好地完成

了我们的课程设计。虽说这只是一个小小的系统编译,却是凝结了我们小组每个人的智慧与付出,而且过程也并不轻松。

这次的课程设计是编写一个运动会分数统计的的小系统,这里用到了大量的 排序算法,以及C语言中文件的存储和调用,还有各种循环语句,还包括结构体的运用,整个过程不可谓不繁琐。尤其当我们遭遇瓶颈时,每个人都头昏脑涨,想不出对策时,那种苦恼和郁闷。但我们一直坚持下来,并最终顺利完成任务,与我们小组各成员间的配合及相互鼓励是分不开的。程序编译是个复杂的过程,竭一人之智往往很难完成,这时团队合作的优势便可见一斑。每个人分工明确,有助于更快更好地完成任务。 在编写过程,我们小组每个人都或多后少地发现了自身的不足,以及对基本知识掌握的熟练程度的不够,这次的课程设计让我们自省很多,并提高很多。 小组长:20121346003王颖 小组成员:

20121346020 张玉洁 20121346021 邹艳芸 20121346023 周彤彤 20121346024 胡啸

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务