数据结构报告.docx
《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构报告
常州工学院
计算机信息工程学院
课程设计报告
设计名称:
数据结构课程设计
姓名:
殷崧健学号:
09030335
专业班级:
软件工程09软件班
设计时间:
2011.1.8~2011.1.21
设计地点:
秋白楼B708
成绩:
指导教师评语:
签名:
年月日
1.课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:
任务
根据教材《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目或自编的《数据结构课程设计任务书》中提供的题目进行选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。
设计组织方法
1.分组选题:
每班分若干组,每组一个课题(可根据课题工作量大小,合理分配人数,一般不超过3人),每组设组长一名,负责该组设计工作的协调、分工等。
2.设计过程:
1)按组讨论、确定设计方案,确定程序模块,并进行明确分工;
2)各人分别完成自己的设计任务,编写源程序,并调试好;
3)程序汇总、编译。
要求:
1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、设计的题目要求达到一定工作量(600行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每组需提交可独立运行的程序;在源程序中需注明每个模块由哪位同学完成。
5、需独立提交设计报告书(每组一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);在报告中必须将小组成员的分工情况描述清楚,以便考核。
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书
一需求分析
为了简便地对运动会的报名、成绩的录入和统计,本组设计开发了本系统,以解决需求。
当然,本系统只是一个较为简单的系统,仍然存在着一些操作上以及显示上的问题,本组将在以后的学习中进行完善。
问题描述:
参加运动会有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、局部非法数据。
进行程序测试,以保证程序的稳定。
二概要设计
1、结构体:
本系统采用的存储结构为结构化设计理念,主要包括两个数据表:
(1)项目数据表:
运动会开始前必须详细制定本次运动会所需的参赛项目为接下来报名、场地的准备提供依据。
本数据表根据要求设计存储每个项目的编号、名称、要取的名次以及各个名次对应的学校的编号,在初始输入时仅输入项目编号、名称及要取的名次,而各名次对应的学校编号将由系统自动统计。
这也有利于以后项目情况的查询。
typedefstruct
{intitemnum;//项目编号
charitemname[128];//项目名称
inttop;//取名次的数目
intrange[5];//名次
intmark[5];//分数
}itemnode;//定义项目结点的类型
(2)学校数据表:
本数据表储存了各个参赛学校的总体情况,包括学校的编号、名称、男子团体总分、女子团体总分和学校总分。
其中学校编号和名称是提前输入的,而其他三项内容将由系统进行自动统计。
typedefstruct
{
intschoolnum;//学校编号
charschoolname[128];//学校名称
intscore;//学校总分
intmscore;//男团体总分
intwscore;//女团体总分
itemnodec[m+w];//项目数组
}headnode;//定义头结点类型
这两个数据表之间由项目编号和学校编号进行相关联接,形成一个整体。
2、本系统的流程图如下:
N
YY
Y
N
Case2
Case3
Y
Case1
N
Y
N
三详细设计
(1)Voidinputinformation()为信息输入以及建立系统的功能,输入各个学校前三名或者前五名的成绩。
在输入学校的参赛项目时,结果去前三还是去前五由自己决定。
其主要功能代码如下:
for(i=0;i{
printf("*****学校编号:
");
scanf("%d",&h[i].schoolnum);//输入头结点信息
printf("*****学校名称:
");
scanf("%s",h[i].schoolname);
for(j=0;j{printf("*****项目编号:
");
scanf("%d",&h[i].c[j].itemnum);
printf("*****项目名称:
");
scanf("%s",h[i].c[j].itemname);
printf("*****取前3名or前5名:
");
scanf("%d",&h[i].c[j].top);
printf("*****获得几个名次:
");
scanf("%d",&k);//输入项目信息
for(s=0;s<5;s++)
{h[i].c[j].range[s]=0;
h[i].c[j].mark[s]=0;}//初始化排名和分数
for(s=0;s{printf("*****名次:
");
scanf("%d",&h[i].c[j].range[s]);}//输入所获名次信息
(2)voidoutput()为输出函数。
列出一个输出目录,利用swich语句使函数按照学校编号或学校总分、男子团体总分、女子团体总分由高到低的排序输出。
利用辅助数组remember[]和冒泡排序的方法使之按分数由高到低的顺序排列,利用dowhile语句进行循环,返回目录或跳出等。
for(i=0;iremember[i]=i;
for(i=0;i{for(j=i+1;jif(h[remember[i]].score{k=remember[i];
remember[i]=remember[j];
remember[j]=k;}
}//用冒泡排序方法,用辅助数组记住头结点下标
for(i=0;i{
printf("\n\n*****学校编号:
%d\n",h[i].schoolnum);
printf("*****学校名称:
%s\n",h[i].schoolname);
printf("*****学校总分:
%d\n",h[remember[i]].score);
printf("*****男团总分:
%d\n",h[remember[i]].mscore);
printf("*****女团总分:
%d\n\n\n",h[remember[i]].wscore);}
break;
(3)voidinquiry()为查询函数。
列出一个查询目录利用利用swich语句使函数按学校编号或项目编号查询,输出某个学校在某个项目上的成绩或某个项目的前几名的学校,利用dowhile语句进行循环,返回目录或跳出等。
printf("学校名称:
%s\n",h[i-1].schoolname);
printf("项目名称:
%s\n",h[i-1].c[j-1].itemname);
printf("这个项目取前%d名,该学校的成绩如下:
\n",h[0].c[j-1].top);
for(k=0;k<5;k++)
if(h[i-1].c[j-1].range[k]!
=0)
printf("名次:
%d\n",h[i-1].c[j-1].range[k]);
(4)voidmain()为主函数,列出主菜单利用利用swich语句使以上函数实现各个菜单的功能。
想在每次查询结束返回主菜单进行其他项时,应在main()函数中调用其他函数时再调用main()函数。
switch(choice)
{
case1:
inputinformation();writedata();readdata();main();
case2:
output();main();
case3:
inquiry();main();
case4:
readdata();main();
case5:
exit(0);
default:
exit(0);
}
四设计与调试分析
(1)调试过程中出现的问题和处理方式:
为了使系统具有一点的容错性,当输入错误信息时应给出相应提示以正确输入数据,如:
printf("要查询的项目编号:
");
scanf("%d",&s);
if(s>m+w||s==0)
printf("此次运动会不包括这个项目.\n\n\n");
想在每次查询结束想返回主菜单进行其它项时,应在main()函数中调用其它函数时再调用main()函数,如:
switch(choice)
{
case1:
inputinformation();writedata();readdata();main();
case2:
output();main();
case3:
inquiry();main();
case4:
readdata();main();
程序出现语法错误,发现是输入名次信息的地方忘带地址符&,或是程序不完整,只写了一个大括号。
如:
printf("*****名次:
");
scanf("%d",&h[i].c[j].range[s]);
(2)调试分析:
(1).函数调用。
函数调用是语言中一块十分重要部分,它可以把一个程序分成若干部分,然后进行配置,所以这块内容对我们很重要。
(2).对结构体的不熟练。
刚开始对结构体不太了解,使调试程序时费了我不少的时间。
结构体的嵌套使我很费力气,通过长时间的运用,终于可以得心应手。
结构体在我的实习中站了很大的比重,我也很重视它。
通过与线性表,循环等的有机搭配,我完成了实习任务。
(3).循环的问题。
这是我很苦恼,大量的循环语句的应用,分析。
使我很头疼,循环是计算机语言中很重要的部分,什么程序也离不开循环,这个问题的解决使我有了坚实的基础。
对多层循环的应用也有了深刻的理解。
五用户手册
本系统可以输入各个项目的前三名或前五名的成绩;能统计各学校总分,可以按学校编号或名称、学校总分、男女团体总分排序输出;可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
具体操作如下:
1)进入系统输入1进入输入系统,依次输入学校编号、学校名称、该学校参加的比赛项目编号、项目名称、该项目在比赛中取前三或者前五、该校在该项目中获得几个名次、具体名次是多少。
然后依次进行下一个项目的输入直至所有项目结束,开始下一个学校的输入。
2)输入结束后屏幕上会输出刚刚输入的所有资料以及各个学校的总分、男团总分、女团总分。
3)输入2进入输出系统,会有四种选项,一、按学校编号输出;二、按学校总分输出;三、按男团总分输出;四、按女团总分输出。
按学校编号输出则按学校编号依次输出该校的名称以及在本次运动会中所获得的成绩;按学校总分输出则根据学校团体总分由高到低依次输出各个学校的比赛成绩。
下面按男团总分与按女团总分输出同理。
4)输出3进入查询系统,有两个选项,一、按学校编号查询;二、按项目编号查询。
按学校编号查询则输入要查询的学校编号、该校参加的项目编号,输出该校的名称、项目名称在该项目中获得的成绩;按项目编号输入项目编号,输出项目名称、该项目取前三或前五以及取得名次的学校。
5)输入4进入调用系统,查看该程序中所有信息。
六测试成果
测试选取两个学校,2个项目进行,学校一名称:
CZU;学校编号:
1。
学校二名称:
CIT;学校编号:
2。
本次运动会共有2个项目,1个男子项目,1个女子项目,男子项目名称:
aaa;项目编号:
1。
女子项目名称:
bbb;项目编号:
2。
依次输入学校和项目的信息,设定项目一取前3,项目二取前5。
项目一前三名依次为,CZU,CIT,CIT。
项目二前五名依次为:
CZU,CIT,CZU,CIT,CIT。
输出结果为:
******学校编号:
1
******学校名称:
czu
******学校总分:
13
******男团总分:
5
******女团总分:
8
******项目编号:
1
******项目名称:
aaa
******所取名次数量:
3
******名次:
1
对应名次分数
******分数:
5
******项目编号:
2
******项目名称:
bbb
******所取名次数量:
5
******名次:
2
******名次:
4
******名次:
5
对应名次分数
******分数:
5
******分数:
2
******分数:
1
******学校编号:
2
******学校名称:
cit
******学校总分:
15
******男团总分:
5
******女团总分:
10
******项目编号:
1
******项目名称:
aaa
******所取名次数量:
3
******名次:
2
******名次:
3
对应名次分数
******分数:
3
******分数:
2
******项目编号:
2
******项目名称:
bbb
******所取名次数量:
5
******名次:
1
******名次:
3
对应名次分数
******分数:
7
******分数:
3
七附录(源程序清单)
#include
#include
#include
#include
#definen2//学校数目
#definem1//男子项目数目
#definew1//女子项目数目
#definenull0
typedefstruct
{intitemnum;//项目编号
charitemname[128];//项目名称
inttop;//取名次的数目
intrange[5];//名次
intmark[5];//分数
}itemnode;//定义项目结点的类型
typedefstruct
{intschoolnum;//学校编号
charschoolname[128];//学校名称
intscore;//学校总分
intmscore;//男团体总分
intwscore;//女团体总分
itemnodec[m+w];//项目数组
}headnode;//定义头结点类型
headnodeh[n];//定义一个头结点数组
voidinputinformation()//输入信息,建立系统
{inti,j,k,s;//i学校j项目k获得几个名次
for(i=0;i{h[i].score=0;
h[i].mscore=0;
h[i].wscore=0;
}//初始化头结点
for(i=0;i{printf("*****学校编号:
");
scanf("%d",&h[i].schoolnum);//输入头结点信息
printf("*****学校名称:
");
scanf("%s",h[i].schoolname);
for(j=0;j{printf("*****项目编号:
");
scanf("%d",&h[i].c[j].itemnum);
printf("*****项目名称:
");
scanf("%s",h[i].c[j].itemname);
printf("*****取前3名or前5名:
");
scanf("%d",&h[i].c[j].top);
printf("*****获得几个名次:
");
scanf("%d",&k);//输入项目信息
for(s=0;s<5;s++)
{h[i].c[j].range[s]=0;
h[i].c[j].mark[s]=0;//初始化排名和分数
}
for(s=0;s{printf("*****名次:
");
scanf("%d",&h[i].c[j].range[s]);//输入所获名次信息
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;break;
case2:
h[i].c[j].mark[s]=3;break;
case3:
h[i].c[j].mark[s]=2;break;
}
else
switch(h[i].c[j].range[s])
{case0:
h[i].c[j].mark[s]=0;break;
case1:
h[i].c[j].mark[s]=7;break;
case2:
h[i].c[j].mark[s]=5;break;
case3:
h[i].c[j].mark[s]=3;break;
case4:
h[i].c[j].mark[s]=2;break;
case5:
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");
}
}
}
voidoutput()//输出函数
{intchoice,i,j,k;
intremember[n];
intsign;
do
{
printf("*******************1.按学校编号输出.*******************\n");
printf("*******************2.按学校总分输出.*******************\n");
printf("*******************3.按男团总分输出.*******************\n");
printf("*******************4.按女团总分输出.*******************\n");
printf("\n\n*******************请选择编号*************************\n\n:
");
scanf("%d",&choice);
switch(choice)
{case1:
//按学校编号输出
for(i=0;i{printf("\n\n*****学校编号:
%d\n",h[i].schoolnum);
printf("*****学校名称:
%s\n",h[i].schoolname);
printf("*****学校总分:
%d\n",h[i].score);
printf("*****男团总分:
%d\n",h[i].mscore);
printf("*****女团总分:
%d\n\n\n",h[i].wscore);
}
break;
case2:
//按学校总分输出
for(i=0;iremember[i]=i;
for(i=0;i{for(j=i+1;jif(h[remember[i]].score{
k=remember[i];
remember[i]=remember[j];
remember[j]=k;
}
}//用冒泡排序方法,用辅助数组记住头结点下标
for(i=0;i{printf("\n\n*****学校编号:
%d\n",h[i].schoolnum);
printf("*****学校名称:
%s\n",h[i].schoolname);
printf("*****学校总分:
%d\n",h[remember[i]].score);
printf("*****男团总分:
%d\n",h[remember[i]].mscore);
printf("*****女团总分:
%d\n\n\n",h[remember[i]].wscore);//按所记下标顺序输