运动会分数统计系统数据结构课程设计论文修改版11Word格式文档下载.docx
《运动会分数统计系统数据结构课程设计论文修改版11Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《运动会分数统计系统数据结构课程设计论文修改版11Word格式文档下载.docx(28页珍藏版)》请在冰豆网上搜索。
4.1.3提出问题12
4.1.4分析问题12
4.1.5解决问题12
4.1.6提出问题13
4.1.7分析问题13
4.1.8解决问题13
4.2算法的效率及改进设想13
5心得体会14
附115
附226
附327
附428
附529
参考文献30
一、概述
1.1设计目的
《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
数据结构课程设计是为数据结构课程独立开设的实践性教学环节。
数据结构课程设计对于巩固数据结构知识,加强学生的实际动手能力和提高学生综合素质是十分必要的。
课程设计的目的:
1)要求学生达到熟练掌握C语言的基本知识和技能。
2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。
3)提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
4)培养算法分析能力。
分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。
5)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
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)系统以菜单方式工作
(2)由程序提醒用户填写比赛结果,输入各项目获奖运动员信息。
(3)所有信息记录完毕后,用户可以查询各个学校的比赛成绩
(4)查看参赛学校信息和比赛项目信息等。
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
1.3相关知识
1)链表的存储用法:
是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:
一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
2)文件与结构体存储:
结构体是一种复杂的数据类型,结构体类型的定义只是列出了该结构的组成情况,编译系统并未因此而分配存储空间,当定义了结构体类型的变量或数组后,编译系统才会分配存储空间
3)栈的出栈用法:
堆栈是RAM中划出的一片特殊存储区,用于临时存放一些重要数据(这些数据存放一会后是必须回到原位的),其中数据的位置由堆栈指针确定,而数据的存放和读取则由入栈指令和出栈指令控制,入出必须对应成对的使用才能使压入的数据正确的回到压入前的位置。
4)查找方法:
顺序查找是一种最基本和最简单的查找方法。
它的思路是,从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所要找的元素为止。
否则就是表中没有要找的元素,查找不成功。
对于表中记录的关键字是无序的表,只能采用这种方法。
存储结构:
顺序存储方法:
它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。
由此得到的存储表示称为顺序存储结构。
5)链接存储方法:
它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。
由此得到的存储表示称为链式存储结构。
索引存储方法:
除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
散列存储方法:
就是根据结点的关键字直接计算出该结点的存储地址。
二、系统设计
2.1系统功能要求
1).可以输入各个项目的前三名或前五名的成绩;
这里需要用到栈的存储用法,链表的存储用法,结构存储。
2).能统计各学校总分
这里就应该采用文件与结构体存储,并处理好关系。
3).可以按学校编号、学校总分、男女团体总分排序输出;
这里要用到的是栈的出栈用法,链表的用法,文件等。
4).可以按学校编号查询学校某个项目的情况;
可以按项目编号查询取得前三或前五名的学校。
而这里要用到的是文件,查找方法,存储结构这三大块。
2.2数据结构设计
2.2.1主函数
voidmain()
{
intchoice;
printf("
\n╔===================★welcome★======================╗\n"
);
\n******************运动会比赛计分系统*******************\n"
\n★★★★★★Designby谭斌★★★★★★\n"
\n\n********************1.输入比赛信息*********************\n"
********************2.输出比赛信息*********************\n"
********************3.查询比赛信息*********************\n"
********************4.退出系统*********************\n\n"
╚======================================================╝\n\n\n"
请选择要实现步骤的编号:
\n\n"
scanf("
%d"
&
choice);
switch(choice)
{
case1:
inputinformation();
writedata();
main();
case2:
output();
case3:
inquiry();
case4:
exit(0);
default:
}
}
2.2.2数组
typedefstruct
intitemnum;
//项目编号
inttop;
//取名次的数目
intrange[5];
//名次
intmark[5];
//分数
}itemnode;
//定义项目结点的类型
{
intschoolnum;
//学校编号
intscore;
//学校总分
intmscore;
//男团体总分
intwscore;
//女团体总分
itemnodec[m+w];
//项目数组
}headnode;
//定义头结点类型
headnodeh[n];
//定义一个头结点数组
2.2.3文件的储存
voidwritedata()//把数据存储在文件中
FILE*report;
inti;
if((report=fopen("
sportsdata.txt"
"
w"
))==null)
{
printf("
不能打开文件\n"
exit
(1);
for(i=0;
i<
n;
i++)
fwrite(&
h[i],sizeof(headnode),1,report);
fclose(report);
}
2.3程序流程图
1)设计运动会的学校编号或名称、项目成绩、男女团体总分的数据存储系统设计图
图
(1)
2)查询团体总分程序设计图
图
(2)
3)分数查询系统
见商景阳论文
3)总流程图
图(4)
3调试与运行
3.1调试结果
3.1.1首先运行文件运动会统计分数7.exe
3.1.2输入信息
程序首先赋初值,定义学校的个数为2,男生项目为1,女生项目为1。
输入1得到进入输入信息模块。
按回车键可得到学校的得分信息和按编号获得的所以信息。
3.1.3输出信息
输入2进入输出信息模块,该模块分四项:
(1)按学校编号输出:
(2)按学校总分输出:
(3)按男团总分输出:
(4)按女团总分输出:
(5)输入2返回输出信息模块,输入0返回主菜单。
3.1.4查询信息
3.1.5调用信息
输入4时显示出所有的信息:
3.2调试过程中出现的问题和处理方式
为了使系统具有一点的容错性,当输入错误信息时应给出相应提示以正确输入数据,如:
printf("
要查询的项目编号:
"
scanf("
s);
if(s>
m+w||s==0)
printf("
此次运动会不包括这个项目.\n\n\n"
想在每次查询结束想返回主菜单进行其它项时,应在main()函数中调用其它函数时再调用main()函数,如:
inputinformation();
writedata();
readdata();
main();
output();
inquiry();
readdata();
程序出现语法错误,发现是输入名次信息的地方忘带地址符&
,或是程序不完整,只写了一个大括号。
如:
*****名次:
h[i].c[j].range[s]);
附录五:
总结
4.1调试中所遇到的较重要问题的回顾
4.1.1提出问题
所有输入输出内容只能在一屏内显示,学过c语言,很知道”\n”是换行,”\f”是换屏的,可是在这里就是无法实现。
4.1.2解决问题
输入clrscr();
4.1.3提出问题
设置选项,供用户输入选择时,当按任意键时都会跳入下一步操作,或者直接退出系统。
4.1.4分析问题
在供用户选择时,提供了几个选项,就写几个case语句,但是当用户输入的并不是这几个数字时,系统就不能做出正确判断。
4.1.5解决问题
修改case语句,添加default语句提示出错,要求重新输入;
default:
clrscr();
/*清屏*/
输入错误,请重新选择"
}
4.1.6提出问题
当同一项目中有同一学校的两个人时,便不能正确输出或者输出相同人名。
4.1.7分析问题
由于同时有两个相同学校编号的人存在,系统在输出时,不能确定那个是正确的,或者用后来的覆盖以前的。
4.1.8解决问题
用for函数实现从开始到结尾的遍历。
4.2算法的效率及改进设想
算法的效率:
总的来讲,严重引响执行速度的便是查找,查找任意一个数据,便要将其所在的结构从头至尾遍历一次,耗费大量的时间。
改进设想:
因大部分显示均是以学校为单位,所以将以由有关人的各种信息为集合的结构改为以由有关学校的各种信息为集合的结构。
在这次上机过程中遇到过一些问题,但经过我们不懈努力,解决了部分,还有的现在不能解决,留着我们日后思考和解决。
比如说在运用数据结构排序的时候,方法的选择上,总是想用时间复杂度小的算法,但结果出了问题,最后还是用了我们熟悉的选择法排序。
结构体的运用上感觉不是很熟悉,遇到结构体的时候很陌生,这是以后必须要加强的。
在我们的这个程序中用了两个结构体:
structnode
intnum;
};
structnode*f[22];
我们同样遇到了一些还不能很好解决的问题,在输出的时候不能得到我们想要的效果,在按学校编号排序查询输出的时候,发生了重叠在做了几次修改之后都能使之满意,这有待学习和修改。
在编写之前,做整体的规划很重要,这才能让我们的效率更高和合作得更好。
5心得体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。
回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高.
源代码
#include<
stdio.h>
math.h>
#include<
conio.h>
process.h>
#definen2//学校数目
#definem1//男子项目数目
#definew1//女子项目数目
#definenull0
intitemnum;
inttop;
intrange[5];
intmark[5];
intschoolnum;
intscore;
intmscore;
intwscore;
itemnodec[m+w];
voidinputinformation()//输入信息,建立系统
inti,j,k,s;
for(i=0;
h[i].score=0;
h[i].mscore=0;
h[i].wscore=0;
}//初始化头结点
*****学校编号:
scanf("
h[i].schoolnum);
//输入头结点信息
for(j=0;
j<
m+w;
j++)
*****项目编号:
h[i].c[j].itemnum);
*****取前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;
//初始化排名和分数
k;
//输入所获名次信息
if(h[i].c[j].top==3)
switch(h[i].c[j].range[s])
case0:
h[i].c[j].mark[s]=0;
break;
case1:
h[i].c[j].mark[s]=5;
case2:
h[i].c[j].mark[s]=3;
case3:
h[i].c[j].mark[s]=2;
else
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];
//是男子项目则记到男子分数里面去
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:
switch(choice)
\n\n*****学校编号:
%d\n"
h[i].schoolnum);
*****学校总分:
h[i].score);
*****男团总分:
h[i].mscore);
*****女团总分:
%d\n\n\n"
h[i].wscore);
}//按编号顺序输出
break;
remember[i]=i;
for(j=i+1;
if(h[remember[i]].score<
h[j].score)
k=remember[i];
remember[i]=remember[j],remember[j]=k;
}//用冒泡排序方法,用辅助数组记住头结点下标
h[remember[i]].score);
h[remember[i]].mscore);
h[remember[i]].wscore);
//按所记下标顺序输出
}//按学校总分输出
if(h[remember[i]].mscore<
h[j].mscore)
remember[i]=remember[j];
remember[j]=k;
h[remember[i]].schoolnum);
}//按男团总分输出
if(h[remember[i]].wscore<
h[j].wscore)
//按女团