软 件 学 院 综合训练项目报告书
课程名称 数据结构 项目名称 运动会分数统计 专业班级 软件14届1班 组 别 3 成 员 李业宏扬 张孝瀚 张岩 任课教师 孙宁
目 录
1
设
计
时
间.。...。。..。。。。.......。.。.。。。。。.。....。。。...。.。。。。。...。。.。......。...。..。.。。。..。.。.。。。。.。。.。1 2
设
计
任
务…..。.。.......。。。。.。..。.。..。。。..。.。。..。。。.。。。...。。.。.。.。..。...。.。.。。。..。....。。.。.。。。.。1 3
设
计
内
容…。.。。.。....。。。.。。。。.。...。.。.。...。。.。。.。.。..。.。。。.。.。......。。。...。.。.....。。.。..。.。.。..1 3
。
1
问
题
分
析.。。。.。..。。。.....。。.....。。.。。.。。。。.。.。。。。..。。..。.。。。.。。
。...。.。....。...。....。...。.。。..1 3
。
2
程
序
设
计。。。.。。。。.。.。.。.。.。.。。。。.。.。.。。。。。...。...。....。.。。。。..。...。..。。。.。.。。。..。。。。。。.。..。..2 3
。
2
。
1
数
据
类
型
的
定
义.。。。.。..。。..。.。。.。.。.。.。.。。.。..。。...。。.。..。....。。。..。.。.。。.。。。.。.。..。.2 3.2
。
2
主
程
序
的
流
程。。。。.....。..。。。...。。..。。.。。..。。..。.。。。。。。。。。.。...。。。。。。。.。..。.。。.。。..。.。。3 3.2.3
函
数
与
类
调
用
关
系
说
明。.。..。。。。..。..。..。..。。.。。。。。。。。..。。.....。。.。。。.。。..。。。。.。..3 3
。
2
。
4
主
要
函
数
伪
代
码。..。。.。。...。.。.....。。。。。。。.。。.。.。.。。。。.。。。。。..。....。.。。。。。。。。...。..。。。4 3
。
3
测
试
与
分
析….。.。.。..。。.。.。.。。.。。。.。。..。。..。。.。..。。...。.。。..。。.。.。..。...。..。..。。。.。。。。..。.4 3.3.1
测
试。.。..。。。。。.。。。....。。..。。。.。。.。.。......。....。。。.。。。。。.。.。。。.......。.。...。。.。。...。。。。。。。。。4 3
。
3.2
分
析。.。...。...。。.。。....。。。..。.....。.。....。.。...。.。。.。。....。。。
..。。。.。.。.。。.。。..。。.....。..。.。。6 3
。
4
代
码..。..。.。....。。。。.。。....。。。.。。........。..。.....。。.。..。。......。。。..。..。...。..。。。。。.。..。。.。。..6 4
总
结
与
展
望。...。。.。。。.。。。..。。。.。.。.....。。。.。。。..。.。..........。。.。.。.。。。.。。.........。。...。。.。13 参
考
文
献.。。...。。。。。。。。..。。。。..。..。。.。.。.。。...。.。。.。。。.。..。......。。。.。。。..。。。..。。.。.。.。。.。。。.....14 成
绩
评
定.。.。。。。。。。。。。.。。.。。..。。。。.。....。。。..。.。。.。....。。。。。.。。。。。。...。.。.。.。.。。。。。。。.。....。。。。.。15
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。院系成绩单 输出所有院系的院系编号及其对应的 项目号、名次、姓名、得分 四项信息。 1
团体总分报表 ①输入男子项目总数 ②输出所有院系的院系编号及其对应的 男团总分 女团总分 总分 三项信息 根据菜单框架,需要以下存储函数: ①用于存储学生记录的节点 ②用于存储节点的结构 以上两个结构用函数对其操作,具体如图所示: next 节点2 节点1 链式结构 ② head ① ③ 外部函数 图3.1.1 数据结构 其中插入记录就是新建一个节点,获取院系成绩单就是输出全部符合某条件的节点数据. 即:这个项目是一个链表的实例。 3.2程序设计 3。2。1数据类型的定义 1. typedef struct Student { int xmid;//项目id 2
int headnum;//选取前几名,3或者5 char *name;//指向选手名字的指针 int yuanid;//院系id int paiming;//排名 struct Student *next;//指向下一个节点的指针 }student; 节点结构体的定义如上。 2.class Cj 对节点记录进行操作的类,具体解释请看3。2。3及3。2.4 具体节点间关系采用链表操作,结构请看图3.1。1 3。2.2主程序流程 1.实例化Cj类并初始化 2。主函数选择菜单: 录入成绩、 获取所有院系成绩单、获取所有院系团体总分、退出 3.具体调用关系请看3。2.3 3。2.3函数与类调用关系说明 struct Student class Cj 实例化 setdata 调用函数 主函数 录入成绩 in() 获取成绩 cj() 团体总分 zf() 退出 return 0 图3.2.1 程序流程 3。2。4主要函数伪代码 3
①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 输入测试数据: 张三 1 1 李四 2 2 王五 1 3 输出为: 再次录入数据,选1 项目号选2 前名次数选5 4
输入 张三 1 1 李四 2 2 王五 1 3 赵六 1 4 侯七 3 5 再次输入2 输出如下: 输入3 男子总项目输入为1 输出如下: 即测试成功(以上王五李四张三为同名男女) 3.3.2分析 1.调试过程中发现最后一个节点没有数据,因此查看代码发现最后一个节点被跳过了。 2。算法的空间复杂度相对较大,构思是否能够用更简便的方法。 3.4 代码 #include head=before=NULL; yuannum=yuan; 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; } } case 2: } switch(pai) { case 1: return 7; return 3; return 2; case 3: case 5: case 2: return 5; return 3; case 3: case 4: return 2; case 5: } return 1; return 0; void outdata(int yuanid) {//输出数据记录 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)); } 7 } stu=stu-〉next; if(stu->yuanid==yuanid) { printf(\" %4d %4d %10s %4d\\n\",stu->xmid,stu—〉paiming,stu-〉name,getscore(stu—〉headnum,stu-〉paiming)); } int nantuan(int nan,int yuan) {//计算男子团体总分 } int nvtuan(int nan,int yuan) {//计算女子团体总分 student *stu=head; int sum=0; while(stu—〉next) 8 } student *stu=head; int sum=0; while(stu—>next) { } if(stu—〉xmid〈=nan && stu—>yuanid==yuan) { } return sum; sum+=getscore(stu—>headnum,stu->paiming); if(stu—〉xmid〈=nan && stu—>yuanid==yuan) { } stu=stu-〉next; sum+=getscore(stu->headnum,stu-〉paiming); }; } { } if(stu-〉xmid>nan && stu—>yuanid==yuan) { } return sum; sum+=getscore(stu-〉headnum,stu—>paiming); if(stu-〉xmid〉nan && stu->yuanid==yuan) { } stu=stu—>next; sum+=getscore(stu—>headnum,stu-〉paiming); void in(Cj *setdata)//录入成绩 { } void cj(Cj *setdata)//获取所有院系成绩单 int temp,temp2,yuan,pai,i; char name[20]; puts(\"请输入项目号\"); scanf(”%d”,&temp); puts(”请输入要取的前名次数”); scanf(\"%d”,&temp2); puts(”请输入各学生成绩,顺序为:姓名 院系编号 排名\"); for(i=0;i } { } return 0; puts(\"1。录入成绩\"); puts(”2。获取所有院系成绩单”); puts(\"3.获取所有院系团体总分\"); puts(\"4.退出”); puts(\"请输入选项\"); scanf(”%d”,&data); switch(data) { case 1: in(&setdata); break; case 2: cj(&setdata); break; case 3: zf(&setdata); break; case 4: } return 0; system(\"cls”); puts(”输入错误,请重新输入”); system(\"pause”); default: 4 总结与展望 从项目设计过程中,我们深切地体会到了链表的重要性、操作的易用性。 11 本次我们小组在做项目时遇到了很多问题,比如在调试过程中发现了很多错误,我们小组齐心协力地解决了这些问题,增长了不少经验. 在开始做项目时组长考虑是否要存储数据到文件中,考虑到组员的能力,我们放弃了这一操作。在解决问题过程中,我们尝试了很多种算法,最后还是感觉链表组员们更能接受一些。 参考文献 [1] 胡学纲。数据结构(C语言版),高等教育出版社 [2] 许卓群,杨东青.数据结构与算法,高等教育出版社 [3] 王卫东.新编考研辅导丛书,数据结构辅导,西安电子科技大学出版社 [4] 刘遵仁。数据结构,人民邮电出版社 1 2 成员分工 姓名 李业宏扬 张孝瀚 张岩 主要工作 组长,写代码 项目测试与流程图绘制及本部分报告填写 其它部分报告填写 备注 成绩评定 成绩 教师签字 1 3 因篇幅问题不能全部显示,请点此查看更多更全内容