数据结构运动会计分系统Word格式.docx
《数据结构运动会计分系统Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构运动会计分系统Word格式.docx(30页珍藏版)》请在冰点文库上搜索。
![数据结构运动会计分系统Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/28/ba556251-d501-4549-a97f-b1101e381087/ba556251-d501-4549-a97f-b1101e3810871.gif)
问题描述:
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;
取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;
哪些取前五名或前三名由学生自己设定。
(m<
=20,n<
=20)
功能要求:
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分,
3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;
可以按项目编号查询取得前三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:
输入数据形式和范围:
可以输入学校的名称,运动项目的名称
输出形式:
有中文提示,各学校分数为整形
界面要求:
有合理的提示,每个功能可以设立菜单,根据提
示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:
要求使用1、全部合法数据;
2、整体非法数据;
3、局部非法数据。
进行程序测试,以保证程序的稳定。
测试数据及测试结果请在上交的资料中写明;
(2)、课程设计的要求
数据结构课程设计用C/C++/C#编程实现。
课程设计的一般步骤:
1.问题描述与分析:
根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?
限制条件是什么?
2.数据结构设计:
为实现每个功能选择的逻辑结构和存储结构,分析原因及合理性。
3.软件结构设计:
设计软件模块之间的结构。
4.算法设计:
算法的设计及算法分析。
每个部分的算法设计说明,可以用流程图描述算法。
5.程序编码:
把详细设计的结果进一步求精为程序设计语言程序。
源程序要按照软件工程的规则来编写,要求结构清晰,重要功能部分要加上清晰的程序注释。
6.调试分析:
掌握调试工具的各种功能,设计测试数据,测试输出的结果。
并进行算法的时间复杂度和空间复杂度的分析。
7.总结:
课程设计过程的收获,遇到问题以及解决问题的思路和方法,程序调试能力的思考,对数据结构这门课程的认识及思考等。
8.编写课程设计报告
2、程序设计描述
2.1运行环境:
MicrosoftVisualC++6.0。
VisualC++(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境。
VisualC++6.0提供的控制台应用程序对学习和掌握标准C++内容非常有利。
“可视”的资源编辑器与MFC类以及应用程序向导,为快速高效地开发出功能强大的Windows应用程序提供了极大的方便。
利用VisualC++
6.0进行Internet、数据库及多媒体等多方面的程序开发也很容易。
2.2系统流程图:
c
mscore
headnode
运
动会
分 itemnode
数统计
Globals
schoolnumscorewscore
itemnummarkrangetop
inputinformation)(
inquiry()main()output()readdata()writedata()h
N
成绩查询
Case2
查询团体总分
Case1
查询各学校成绩
继续
开始---初始化
输入
Y
输入学校及男女项目范围
输入某项目各名次成绩
继续输
Case3
输出查询学校成绩
结束—退出
2.3函数及变量说明:
voidinputinformation()为输入信息函数。
用来输入各个学校各个项目前三名或前五名的成绩,结果取前三名还是前五名自己定,利用swith语句前三名的分数赋为5、3、2,前五名的成绩赋为7,5、3、2、1,未取得成绩则赋为0。
并统计团体总分,男团总分和
女团总分。
voidoutput()为输出函数。
列出一个输出目录利用swich语句使函数按学校编号输出或按学校总分、男团总分、女团总分由高到低排序输出。
利用辅助数组remember[]和冒泡排序的方法使之按分数的由高到低输出。
利用循环语句dowhile()当输入2时返回输出目录,输入0是跳出循环返回主菜单。
voidinquiry()为查询函数。
列车一个查询目录利用swich语句使函数按学校编号或项目编号查询,输出某学校的某个项目的得分情况或某个项目的前几名的学校。
再利用循环语句dowhile()当输入2是返回查询目录,输入0时跳出循环返回主菜单。
voidwritedata()是数据存储函数。
建立一个文件
sportsdata.txt,将输入的数据存入此文件中。
voidreaddata()是读入数据函数。
它将写入sportsdada.txt
中的数据直接调用并显示出来。
voidmain()是主函数。
列出主菜单,利用switch语句调用以上函数实现各个菜单的功能。
3、调试分析
3.1调试过程中出现的问题和处理方式:
为了使系统具有一点的容错性,当输入错误信息时应给出相应提示以正确输入数据,如:
printf("
要查询的项目编号:
"
);
scanf("
%d"
&
s);
if(s>
m+w||s==0)
此次运动会不包括这个项目.\n\n\n"
想在每次查询结束想返回主菜单进行其它项时,应在main()
函数中调用其它函数时再调用main()函数,如:
switch(choice)
{
case1:
inputinformation();
writedata();
readdata();
main();
case2:
output();
case3:
inquiry();
case4:
程序出现语法错误,发现是输入名次信息的地方忘带地址符&
,或是程序不完整,只写了一个大括号。
如:
*****名次:
scanf("
h[i].c[j].range[s]);
3.2调试分析:
(1).函数调用。
函数调用是语言中一块十分重要部分,它可以把一个程序分成若干部分,然后进行配置,所以这块内容对我们很重要。
(2).对结构体的不熟练。
刚开始对结构体不太了解,使调试程序时费了我不少的时间。
结构体的嵌套使我很费力气,通过长时间的运用,终于可以得心应手。
结构体在我的实习中站了很大的比重,我也很重视它。
通过与线性表,循环等的有机搭配,我完成了实习任务。
(3).循环的问题。
这是我很苦恼,大量的循环语句的应用,分
析。
使我很头疼,循环是计算机语言中很重要的部分,什么程序也离不开循环,这个问题的解决使我有了坚实的基础。
对多层循环的应用也有了深刻的理解。
3.3调试结果:
(1)首先运行文件运动会统计分数7.exe:
(2)输入信息:
程序首先赋初值,定义学校的个数为2,男生项目为1,女生项目为1。
输入1得到进入输入信息模块。
按回车键可得到学校的得分信息和按编号获得的所以信息。
(3)输出信息:
输入2进入输出信息模块,该模块分四项:
①按学校编号输出:
②按学校总分输出:
③按男团总分输出:
④按女团总分输出:
⑤输入2返回输出信息模块,输入0返回主菜单。
(4)查询信息:
输入3进入信息查询模块:
①按学校编号查询
②按项目编号查询
③输入错误信息时给出提示:
④输入2继续查询,输入0返回主菜单
(5)调用信息
输入4时显示出所有的信息:
4、总结
(1).调试中所遇到的较重要问题的回顾:
1)提出问题:
所有输入输出内容只能在一屏内显示,学过c语言,很知道”\n”是换行,”\f”是换屏的,可是在这里就是无法实现。
解决问题:
输入clrscr();
2)提出问题:
设置选项,供用户输入选择时,当按任意键时都会跳入下一步操作,或者直接退出系统。
分析问题:
在供用户选择时,提供了几个选项,就写几个case语句,但是当用户输入的并不是这几个数字时,系统就不能做出正确判断。
解决问题:
修改case语句,添加default语句提示出错,要求重新输入;
Default:
clrscr();
/*清屏*/printf("
输入错误,请重新选择"
}
3)提出问题:
当同一项目中有同一学校的两个人时,便不能正确输出或者输出相同人名。
由于同时有两个相同学校编号的人存在,系统在输出时,不能确定那个是正确的,或者用后来的覆盖以前的。
用for函数实现从开始到结尾的遍历。
(2).算法的效率及改进设想
算法的效率:
总的来讲,严重引响执行速度的便是查找,查找任意一个数据,便要将其所在的结构从头至尾遍历一次,耗费大量的时间。
改进设想:
因大部分显示均是以学校为单位,所以将以由有关人的各种信息为集合的结构改为以由有关学校的各种信息为集合的结构。
在这次上机过程中遇到过一些问题,但经过我们不懈努力,解决了部分,还有的现在不能解决,留着我们日后思考和解决。
比如说在运用数据结构排序的时候,方法的选择上,总是想用时间复杂度小的算法,但结果出了问题,最后还是用了我们熟悉的选择法排序。
结构体的运用上感觉不是很熟悉,遇到结构体的时候很陌生,这是以后必须要加强的。
在我们的这个程序中用了两个结构体:
structnode
intnum;
};
structnode*f[22];
我们同样遇到了一些还不能很好解决的问题,在输出的时候不能得到我们想要的效果,在按学校编号排序查询输出的时候,发生了重叠在做了几次修改之后都能使之满意,这有待学习和修改。
在编写之前,做整体的规划很重要,这才能让我们的效率更高和合作得更好。
一周的数据结构上机实习已经结束了,留给我们的路却漫长而幽远。
本次集中上机实验,对我们来说可以算是一次挑战,因为在理论学习中没有好好的掌握,现在要独立完成一个较复杂的程序编写,确实有一点困难。
但我们对于难度一向是以积极迎战的态度来面对,认真积极努力完成这次集中上机的任务。
对我们来说这是一次很好的机会,同时我们也很好的把握了这次机会,认真的完成了此次上机学习的任务,对自己今后在程序编写方面相信会有很大的帮助,在此也对学校安排这样一次学习表示感谢,最后希望自己在数据结构以及计算机的其他学习方面能够得到很好的提高。
今后我们必需认真思考,而且要践行我们的承诺,一步一个脚印的走下去,才可以达到我们预期的彼岸!
仔细回顾数据结构的学习过程,
发现其实他也并不是想象中的那么难
5、附录
源代码:
#include<
stdio.h>
math.h>
#include<
conio.h>
process.h>
#definen2//学校数目#definem1//男子项目数目
#definew1//女子项目数目#definenull0
typedefstruct
intitemnum;
//项目编号
inttop;
//取名次的数目intrange[5];
//名次
intmark[5];
//分数
}itemnode;
//定义项目结点的类型
intschoolnum;
//学校编号intscore;
//学校总分
intmscore;
//男团体总分intwscore;
//女团体总分
itemnodec[m+w];
//项目数组
}headnode;
//定义头结点类型
headnodeh[n];
//定义一个头结点数组
voidinputinformation() //输入信息,建立系统
inti,j,k,s;
for(i=0;
i<
n;
i++)
h[i].score=0;
h[i].mscore=0;
h[i].wscore=0;
} //初始化头结点
for(i=0;
*****学校编号:
h[i].schoolnum);
//输入头结点信息for(j=0;
j<
m+w;
j++)
*****项目编号:
h[i].c[j].itemnum);
printf("
*****取前3名or前5名:
h[i].c[j].top);
*****获得几个名次:
k);
//输入项目信息for(s=0;
s<
5;
s++)
h[i].c[j].range[s]=0,h[i].c[j].mark[s]=0;
//初始化排名和分数for(s=0;
k;
*****名次:
//输入所获名次信息if(h[i].c[j].top==3)
switch(h[i].c[j].range[s])
case0:
h[i].c[j].mark[s]=0;
break;
h[i].c[j].mark[s]=5;
case2:
h[i].c[j].mark[s]=3;
case3:
h[i].c[j].mark[s]=2;
elseswitch(h[i].c[j].range[s])
h[i].c[j].mark[s]=7;
case4:
case5:
h[i].c[j].mark[s]=1;
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];
//是女子项目则记到女子项目里面去
\n"
voidoutput() //输出函数
intchoice,i,j,k;
intremember[n];
intsign;
do
*******************1.按学校编号输出.*******************\n"
*******************2.按学校总分输出.*******************\n"
*******************3.按男团总分输出.*******************\n"
*******************4.按女团总分输出.*******************\n"
\n\n*******************请选择编号
*************************\n\n:
choice);
switch(choice)
\n\n*****学校编号:
%d\n"
h[i].schoolnum);
*****学校总分:
h[i].score);
*****男团总分:
h[i].mscore);
*****女团总分:
%d\n\n\n"
h[i].wscore);
} //按编号顺序输出
break;
i++)remember[i]=i;
for(j=i+1;
j++)if(h[remember[i]].score<
h[j].score)
k=remember[i];
remember[i]=remember[j],remember[j]=k;
} //用冒泡排序方法,用辅助数组记住头结点下标
Printf(“\n\n*****学校编号:
%d\n”,h[remember[i]].schoolnum);
*****学校总分:
h[remember[i]].score);
h[remember[i]].mscore);
h[remember[i]].wscore);
//按所记下标顺序输出
} //按学校总分输出
j++)if(h[remember[i]].mscore<
h[j].mscore)
remember[i]=remember[j];
remember[j]=k;
h[remember[i]].schoolnum);
} //按男团总分输出
j++)if(h[remember[i]].wscore<
h[j].wscore)
remember[i]=remember[j];
*****男团总分:
//按女团总分输出
请选择 2继续,0跳出\n"
sign);
}while(sign==2);
//循环执行输出语句
voidinquiry() //查询函数
int choice;
int i,j,k,s;
\n*****1:
按学校编号查询\n"
\n*****2:
按项目编号查询\n"
\n\n*****请选择查询方式:
//提供两种查询方式scanf("
要查询的学校编号:
i);
if(i>
n)
错误:
这个学校没有参加此次运动会!
\n\n\n"
else
j);
if(j>
m+