辽宁工程技术大学综合训练项目任务书一数据结构.docx
《辽宁工程技术大学综合训练项目任务书一数据结构.docx》由会员分享,可在线阅读,更多相关《辽宁工程技术大学综合训练项目任务书一数据结构.docx(16页珍藏版)》请在冰豆网上搜索。
辽宁工程技术大学综合训练项目任务书一数据结构
软件学院
综合训练项目报告书
课程名称数据结构
项目名称运动会分数统计
专业班级软件14届1班
组别3
成员业宏扬孝瀚岩
任课教师宁
3.2.1数据类型的定义......................................................................2
3.2.2主程序的流程.........................................................................3
3.2.3函数与类调用关系说明...........................................................3
3.2.4主要函数伪代码......................................................................4
3.3.1测试........................................................................................4
3.3.2分析........................................................................................6
1设计时间
2015年10月20日至2015年11月14日
2设计任务
参加运动会有n个院系,编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1~m,女子m+1~m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些项目取前五名或前三名由学生自己设定。
(m<=20,n<=20)
3设计容
根据设计任务编写程序,要求:
①假设长度不超过20个字符。
每个项目结束时,将其编号、类型符(区分取前五名还是取前三名)输入,并按名次顺序输入运动员、院系编号和成绩。
②产生各院系的成绩单,容包括各院系取得的每项成绩的项目号、名次(成绩)、和得分;
③产生团体总分报表,容包括院系编号、男子团体总分、女子团体总分和团体总分。
④程序运行后有相应功能的选择菜单界面。
3.1问题分析
根据设计容要求,分析如下:
创建菜单,容如下:
菜单1.录入成绩:
①输入项目号,输入取前几名
②循环取名次数次,输入:
、院系编号、排名
三项信息。
菜单2.院系成绩单
输出所有院系的院系编号及其对应的
项目号、名次、、得分
四项信息。
团体总分报表
①输入男子项目总数
②输出所有院系的院系编号及其对应的
男团总分女团总分总分
三项信息
根据菜单框架,需要以下存储函数:
①用于存储学生记录的节点
②用于存储节点的结构
以上两个结构用函数对其操作,具体如图所示:
其中插入记录就是新建一个节点,获取院系成绩单就是输出全部符合某条件的节点数据。
即:
这个项目是一个链表的实例。
3.2程序设计
3.2.1数据类型的定义
1.typedefstructStudent
{
intxmid;//项目id
intheadnum;//选取前几名,3或者5
char*name;//指向选手名字的指针
intyuanid;//院系id
intpaiming;//排名
structStudent*next;//指向下一个节点的指针
}student;
节点结构体的定义如上。
2.classCj
对节点记录进行操作的类,具体解释请看3.2.3及3.2.4
具体节点间关系采用链表操作,结构请看图3.1.1
3.2.2主程序流程
1.实例化Cj类并初始化
2.主函数选择菜单:
录入成绩、获取所有院系成绩单、获取所有院系团体总分、退出
3.具体调用关系请看3.2.3
3.2.3函数与类调用关系说明
3.2.4主要函数伪代码
①Cj类的insert函数:
传入数据
为节点分配存
为节点赋值数据
节点的next域指向上一个before指针指向的节点,若为头节点则指向null
②Cj类的outdata函数
传入条件
遍历链表
如果满足条件,输出改行
③Cj类的nantuan、nvtuan函数
计数变量sum=0
传入院系条件
遍历链表
如果满足院系相等,sum=sum+节点分数
(其中节点分数为调用getscore函数实现)
3.3测试与分析
3.3.1测试
院系数目测试可为5-10个中任意一个,本测试以6个为例
选项选1
项目号选1
选择的名次数为3
输入测试数据:
三11
四22
王五13
输出为:
再次录入数据,选1
项目号选2
前名次数选5
输入
三11
四22
王五13
六14
侯七35
再次输入2
输出如下:
输入3
男子总项目输入为1
输出如下:
即测试成功(以上王五四三为同名男女)
3.3.2分析
1.调试过程中发现最后一个节点没有数据,因此查看代码发现最后一个节点被跳过了。
2.算法的空间复杂度相对较大,构思是否能够用更简便的方法。
3.4代码
#include
#include
#include
typedefstructStudent//student节点
{
intxmid;
intheadnum;
char*name;
intyuanid;
intpaiming;
structStudent*next;
}student;
classCj//cj类,用于处理成绩的类
{
public:
student*head,*before;
intyuannum;
voidinit(intyuan)
{//初始化类
head=before=NULL;
yuannum=yuan;
}
voidinsert(intxmid,intheadnum,char*name,intyuanid,intpaiming)
{//压入节点
head=(student*)malloc(sizeof(student));
head->xmid=xmid;
head->headnum=headnum;
head->name=(char*)malloc(sizeof(char)*(strlen(name)+2));
strcpy(head->name,name);
head->yuanid=yuanid;
head->paiming=paiming;
head->next=before;
before=head;
}
intgetscore(intheadnum,intpai)
{//根据两个数据获取分数
switch(headnum)
{
case3:
switch(pai)
{
case1:
return5;
case2:
return3;
case3:
return2;
}
case5:
switch(pai)
{
case1:
return7;
case2:
return5;
case3:
return3;
case4:
return2;
case5:
return1;
}
}
return0;
}
voidoutdata(intyuanid)
{//输出数据记录
student*stu=head;
while(stu->next)
{
if(stu->yuanid==yuanid)
{
printf("%4d%4d%10s%4d\n",stu->xmid,stu->paiming,stu->name,getscore(stu->headnum,stu->paiming));
}
stu=stu->next;
}
if(stu->yuanid==yuanid)
{
printf("%4d%4d%10s%4d\n",stu->xmid,stu->paiming,stu->name,getscore(stu->headnum,stu->paiming));
}
}
intnantuan(intnan,intyuan)
{//计算男子团体总分
student*stu=head;
intsum=0;
while(stu->next)
{
if(stu->xmid<=nan&&stu->yuanid==yuan)
{
sum+=getscore(stu->headnum,stu->paiming);
}
stu=stu->next;
}
if(stu->xmid<=nan&&stu->yuanid==yuan)
{
sum+=getscore(stu->headnum,stu->paiming);
}
returnsum;
}
intnvtuan(intnan,intyuan)
{//计算女子团体总分
student*stu=head;
intsum=0;
while(stu->next)
{
if(stu->xmid>nan&&stu->yuanid==yuan)
{
sum+=getscore(stu->headnum,stu->paiming);
}
stu=stu->next;
}
if(stu->xmid>nan&&stu->yuanid==yuan)
{
sum+=getscore(stu->headnum,stu->paiming);
}
returnsum;
}
};
voidin(Cj*setdata)//录入成绩
{
inttemp,temp2,yuan,pai,i;
charname[20];
puts("请输入项目号");
scanf("%d",&temp);
puts("请输入要取的前名次数");
scanf("%d",&temp2);
puts("请输入各学生成绩,顺序为:
院系编号排名");
for(i=0;i{
scanf("%s%d%d",&name,&yuan,&pai);
setdata->insert(temp,temp2,name,yuan,pai);
}
}
voidcj(Cj*setdata)//获取所有院系成绩单
{
inti;
for(i=1;i<=setdata->yuannum;i++)
{
printf("院系id:
%d\n",i);
printf("%6s%6s%10s%6s\n","项目id","排名","","得分");
setdata->outdata(i);
}
}
voidzf(Cj*setdata)//获取所有院系团体总分
{
inti,nan;
puts("请输入男子项目总数");
scanf("%d",&nan);
for(i=1;i<=setdata->yuannum;i++)
{
printf("院系id:
%d\n",i);
printf("男子团体总分:
%d\n",setdata->nantuan(nan,i));
printf("女子团体总分:
%d\n",setdata->nvtuan(nan,i));
printf("团体总分:
%d\n",setdata->nantuan(nan,i)+setdata->nvtuan(nan,i));
}
}
intmain()
{
intdata;
Cjsetdata;
printf("请输入院系总数目");
scanf("%d",&data);
setdata.init(data);
while
(1)
{
puts("1.录入成绩");
puts("2.获取所有院系成绩单");
puts("3.获取所有院系团体总分");
puts("4.退出");
puts("请输入选项");
scanf("%d",&data);
switch(data)
{
case1:
in(&setdata);
break;
case2:
cj(&setdata);
break;
case3:
zf(&setdata);
break;
case4:
return0;
default:
system("cls");
puts("输入错误,请重新输入");
system("pause");
}
}
return0;
}
4总结与展望
从项目设计过程中,我们深切地体会到了链表的重要性、操作的易用性。
本次我们小组在做项目时遇到了很多问题,比如在调试过程中发现了很多错误,我们小组齐心协力地解决了这些问题,增长了不少经验。
在开始做项目时组长考虑是否要存储数据到文件中,考虑到组员的能力,我们放弃了这一操作。
在解决问题过程中,我们尝试了很多种算法,最后还是感觉链表组员们更能接受一些。
参考文献
[1]胡学纲.数据结构(C语言版),高等教育
[2]许卓群,东青.数据结构与算法,高等教育
[3]王卫东.新编考研辅导丛书,数据结构辅导,电子科技大学
[4]遵仁.数据结构,人民邮电
成员分工
主要工作
备注
业宏扬
组长,写代码
孝瀚
项目测试与流程图绘制及本部分报告填写
岩
其它部分报告填写
成绩评定
成绩教师签字