数据结构课程设计多关键字实验报告

上传人:一*** 文档编号:54359017 上传时间:2022-02-14 格式:DOC 页数:28 大小:379KB
收藏 版权申诉 举报 下载
数据结构课程设计多关键字实验报告_第1页
第1页 / 共28页
数据结构课程设计多关键字实验报告_第2页
第2页 / 共28页
数据结构课程设计多关键字实验报告_第3页
第3页 / 共28页
资源描述:

《数据结构课程设计多关键字实验报告》由会员分享,可在线阅读,更多相关《数据结构课程设计多关键字实验报告(28页珍藏版)》请在装配图网上搜索。

1、淮 海 工 学 院 计算机工程学院课程设计报告设计名称: 数据结构课程设计 选题名称: 多关键字排 姓 名: 学 号: 专业班级: 系 (院): 计算机工程学院 设计时间: 2013.12.232013.1.5 设计地点: 软件工程实验室、教室 成绩:指导教师评语: 签名: 年 月 日数据结构课程设计报告 第 27 页,共 页1课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的

2、观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。2课程设计任务与要求:任务多关键字的排序是根据多个不同的要求来进行的,在某些方面,有其一定的实用范围。例如:在对高考学生的成绩进行分析和处理的时候,各个学校录取学生除了需要考虑总分的情况,不同的专业对单科的分数的要求也有所不同。因此在总分相同的情况下,还需要根据学校定的单科分数的高低来考虑考生录取的优先次序。总体要求:1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写

3、出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。3、程序设计语言推荐使用C/C+,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);6、 课程设计实践作为培养学生动手能力的一种手段,单独考核。题目要求: (1) 假设待排序的记录数不超过10000,表中记录的关键字数不超过5,各个关键字的范围均为0至100

4、。按用户给定的进行排序的关键字的优先关系,输出排序结果。 (2) 约定按LSD法进行多关键字的排序。在对各个关键字进行排序时采用两种策略:其一是利用稳定的内部排序法,其二是利用分配和收集的方法。并综合比较这两种策略。 3课程设计说明书一 需求分析在进行高考分数的处理时,除了需对总分进行排序外,不同的专业对单科的分数的要求不同,因此尚需在总分相同的情况下,按用户提出的单科分数的次序要求排出考生录取的次序。针对这一问题,设计一个用C语言描述的高考成绩排名系统。按学科关键字高考总分进行排序的情况下,各科程序排序。本程序规定如下:1. 创建高考成绩表包含语文、数学、英语、综合四门成绩,以及考号姓名等考

5、生信息存放到名为高考成绩.txt文本中。2. 对考生成绩可以实现查找、显示等功能。3. 可以输入成绩进行排序也可以从文件中读取数据进行排序。4. 对学生的成绩排序,在总分不同的时候按照各自的排序,在总分相同的情况下。5. 对单科成绩进行排序时分别用稳定的冒泡排序和“分配”和“收集”的方法进行排序。二 概要设计1.规定成绩个数、成绩记录的最大记录数、和存储每个成绩的数组队列#define MAX_NUM_OF_KEY 5#define RADIX 101#define MAX_SPACE 10002.定义结构体存储考生成绩信息struct SLCellint keysMAX_NUM_OF_KEY

6、;char name20;int number; int next; ;3.定义静态链表struct SLListSLCell rMAX_SPACE;int keynum;int recnum;ADT SLList数据对象:D:D=a|a属于SLList数据关系:R:数据元素同属一个集合。基本操作:P:SLList * Creat()操作结果:用SLList存储输入的考生的信息,但是不存入文件中。void read(SLList *l) 操作结果:从文件中读取考生的各科成绩进行操作。void search(SLList *l) 操作结果:可以按考号或姓名查找考生的各科成绩。void Distr

7、ibute(RecordTypel *r,int i,int *f,int *e)初始条件:存在以i为下标的关键字。操作结果:以下标为i的关键字为准做一趟分配。void Collect(RecordTypel *r,int i,int *f,int *e)初始条件:存在以i为下标的关键字。操作结果:以下标为i的关键字为准做一趟收集。void RadixSortMaths(SLList *l)操作结果:对*l中的成绩做链式基数排序,以数学成绩为关键字排序。void RadixSortChinese(SLList *l)操作结果:对*l中的成绩做链式基数排序,以语文成绩为关键字排序。void Ra

8、dixSortEnglish(SLList *l)操作结果:对*l中的成绩做链式基数排序,以英语成绩为关键字排序。void RadixSortzonghe(SLList *l)操作结果:对*l中的成绩做链式基数排序,以理综成绩为关键字排序。void RadixSort(SLList *l) 操作结果:按用户选择的关键字排序并输出排序结果void RadixSortTotal(SLList *l)操作结果:对总分排序void ShowRank(SLList *l)操作结果:按名次顺序输出考生名次 考号 姓名 总分 数学 英语 语文 理综分数ADT SLList系统流程图如下:多关键字排序系统 查

9、询 取得考生信息的方式 各种排序手动输入从文件读取按姓名查询按考号查询总分相同按语文成绩排序总分相同按英语成绩排序总分相同按数学成绩排序总分相同按综合成绩排序考号姓名各科成绩三 详细设计1.存储文件的书写void read(SLList *l)2.考生信息输入SLList * Creat() 3.查找函数void search(SLList *l)4.链式基数排序void Distribute(SLCell *r,int i,int *f,int *e)/*以下标为i的关键字为准做一趟分配*/int j,p;for(j=RADIX-1;j=0;-j)/将RADIX个队列初始化为空队列fj=0;

10、for(p=r0.next;p;p=rp.next)j=rp.keysi;if(!fj)/将下标p所指的节点插入第j个队列中fj=p;elserej.next=p;ej=p;void Collect(SLCell *r,int i,int *f,int *e)/*收集*/int j,t;for(j=RADIX-1;!fj;j-);/找第一个非空队列r0.next=fj;t=ej;while(j=0)for(j-;j0&!fj;j-);/找下一个非空队列if(fj&j=0)rt.next=fj;t=ej;/链接两个非空队列rt.next=0;/t指向最后一个非空队列中的最后节点/*对*l中的成绩

11、做链式基数排序,链表的记录按从小到大的顺序连接*/void RadixSortChinese(SLList *l)/语文int f101,e101;int i;for(i=0;irecnum;i+) l-ri.next=i+1;l-rl-recnum.next=0;for(i=3;i0;-i)Distribute(l-r,i,f,e);Collect(l-r,i,f,e);void RadixSortMaths(SLList *l)/数学int f101,e101;int i;for(i=0;irecnum;i+) l-ri.next=i+1;l-rl-recnum.next=0;for(i=

12、1;ir,i,f,e);Collect(l-r,i,f,e);void RadixSortEnglish(SLList *l)/英语int f101,e101;int i;for(i=0;irecnum;i+) l-ri.next=i+1;l-rl-recnum.next=0;for(i=1;ir,i,f,e);Collect(l-r,i,f,e);void RadixSortzonghe(SLList *l)/综合int f101,e101;int i;for(i=0;irecnum;i+) l-ri.next=i+1;l-rl-recnum.next=0;for(i=1;ir,i,f,e)

13、;Collect(l-r,i,f,e);void RadixSortTotal(SLList *l)/对总分排序SLCell *r;r=l-r;int f401,e401;int j,p,t;for(j=400;j=0;-j) fj=0;for(p=r0.next;p;p=rp.next)j=rp.keys0;if(!fj) fj=p;elserej.next=p;ej=p;for(j=400;!fj;j-);r0.next=fj;t=ej;while(j=0)for(j-;j0&!fj;j-);if(fj&j=0)rt.next=fj;t=ej;rt.next=0;void ShowRank

14、(SLList *l)/按名次顺序输出考生名次 学号 姓名 总分 语文 数学 英语 综合分数int rank=1,i;cout 名次 考号 名字 总分 语文 数学 英语 综合r0.next;rankrecnum;rank+)cousetw(2)rank;coutsetw(10)ri.numbersetw(10)ri.name;coutsetw(10)ri.keys0;cout setw(10)ri.keys1setw(10)ri.keys2;cout setw(10)ri.keys3setw(10)ri.keys4ri.next;四 设计与调试分析刚开始的时候我设计了文件的插入、删除、修改、查

15、询等功能,后来我用了静态链表存储,同时在文件读取的时候我设置了每次读取的最大值为10所以在插入、删除之后就出现了乱码的情况,所以我就放弃了插入、删除的功能,只写了查询的功能。在写查询的时候我本来想用两个子函数和一个查找主函数的,可是后来在主函数中用switch语句调用两个子函数出错。后来我把函数写在switch语句中就对了。在选择功能界面和排序界面时也出错了,一开始我用的是switch语句套在switch语句中,总是出现错误,而且检查不出来。后来我把套在里面的switch语句写在另外一个函数里,然后再调用这样就没有错误了。写文件的时候把值直接赋给指针了,所以导致我一直出错,后来进过看书弄懂了。

16、链式基数排序的程序是按照书上的写的,所以没什么大问题。五 用户手册1 主界面:1手动输入考生成绩进行排序2显示文件中已经存储的考生成绩信息3各种查询考生成绩信息4各种排序5输出排序后的考生成绩信息6.退出2 选择1,进入手动输入考生成绩信息界面:依次分别输入考生考号、姓名、语文、数学、英语、综合,输入完成按回车键。若想继续输入按1,不再输入按0。2 选择2,进入显示考生信息界面(从文件中读取考生成绩信息)3 选择3,进入查询界面:1按考号查找2按姓名查找4 选择4,进入排序界面:1总分相同时按语文成绩排序2总分相同时按英语成绩排序3总分相同时按数学成绩排序4总分相同时按综合成绩排序。5 选择5

17、,输出排好顺序的考生成绩信息,按总分排序。六 测试成果1. 手动输入考生信息测试结果2. 从文件中读取考生信息进行排序七 附录(源程序清单)#include#include#include#include#include #define MAX_NUM_OF_KEY 5 /关键字最多为5#define RADIX 101#define MAX_SPACE 1000 /待排序的数最大为1000struct SLCellint keysMAX_NUM_OF_KEY;/子关键字数组 char name20;int number; int next;/*定义一个静态链表*/struct SLListS

18、LCell rMAX_SPACE;int keynum;int recnum; ;SLList * Creat() /手动输入考生的高考成绩信息SLList *l;int i=1,flag=1;l=new SLList;l-keynum=5;l-recnum=0;while(flag) /判断是否继续输入cout请输入考生考号、姓名、语文、数学、英语、综合l-ri.number; cinl-ri.name; cinl-ri.keys1; cinl-ri.keys2; cinl-ri.keys3; cinl-ri.keys4; l-ri.keys0=(l-ri.keys1+l-ri.keys2+

19、l-ri.keys3+l-ri.keys4);/成绩总和 (l-recnum)+;cout继续输入考生成绩则输入1,否则输入0flag;i+;return l;void read(SLList *l)/读入文件int num=10;/定义从文件中读取数据的最大值,可更改l-keynum=5;l-recnum=0; cout 考号 姓名 语文 数学 英语 综合endl;ifstream infile (高考成绩.txt,ios:in); /判断文件是否能够打开if ( ! infile )cout 打开文件失败endl; for (int i=1;il-ri.number;coutsetw(2)

20、ri.number; infile l-ri.name;coutsetw(10)ri.name;infile l-ri.keys1;coutsetw(10)ri.keys1;infile l-ri.keys2;coutsetw(10)ri.keys2; infile l-ri.keys3;coutsetw(10)ri.keys3;infile l-ri.keys4;coutsetw(10)ri.keys4ri.keys0=(l-ri.keys1+l-ri.keys2+l-ri.keys3+l-ri.keys4); (l-recnum)+; infile.close();/*查找函数*/void

21、 search(SLList *l)char name20;int number; int i;int j;cout按考号查找输入0,按姓名查找输入1j;switch (j) case 0:coutnumber;for (i=1;iri.number=number) /判断输入的学号是否正确 cout 考号 名字 语文 数学 英语 综合endl; cout setw(2)ri.numbersetw(10)ri.name; cout setw(10)ri.keys1setw(10)ri.keys2; cout setw(10)ri.keys3setw(10)ri.keys4endl; break

22、; case 1: coutname;for (i=1;iri.name,name)=0) cout 考号 姓名 语文 数学 英语 综合endl; cout setw(2)ri.numbersetw(10)ri.name; cout setw(10)ri.keys1setw(10)ri.keys2; cout setw(10)ri.keys3setw(10)ri.keys4=0;-j)/将RADIX个队列初始化为空队列fj=0;for(p=r0.next;p;p=rp.next)j=rp.keysi;if(!fj)/将下标p所指的节点插入第j个队列中fj=p;elserej.next=p;ej

23、=p;void Collect(SLCell *r,int i,int *f,int *e)/*收集*/int j,t;for(j=RADIX-1;!fj;j-);/找第一个非空队列r0.next=fj;t=ej;while(j=0)for(j-;j0&!fj;j-);/找下一个非空队列if(fj&j=0)rt.next=fj;t=ej;/链接两个非空队列rt.next=0;/t指向最后一个非空队列中的最后节点/*对*l中的成绩做链式基数排序,链表的记录按从小到大的顺序连接*/void RadixSortChinese(SLList *l)/语文int f101,e101;int i;for(

24、i=0;irecnum;i+) l-ri.next=i+1;l-rl-recnum.next=0;for(i=3;i0;-i)Distribute(l-r,i,f,e);Collect(l-r,i,f,e);void RadixSortMaths(SLList *l)/数学int f101,e101;int i;for(i=0;irecnum;i+) l-ri.next=i+1;l-rl-recnum.next=0;for(i=1;ir,i,f,e);Collect(l-r,i,f,e);void RadixSortEnglish(SLList *l)/英语int f101,e101;int

25、i;for(i=0;irecnum;i+) l-ri.next=i+1;l-rl-recnum.next=0;for(i=1;ir,i,f,e);Collect(l-r,i,f,e);void RadixSortzonghe(SLList *l)/综合int f101,e101;int i;for(i=0;irecnum;i+) l-ri.next=i+1;l-rl-recnum.next=0;for(i=1;ir,i,f,e);Collect(l-r,i,f,e);void RadixSortTotal(SLList *l)/对总分排序SLCell *r;r=l-r;int f401,e40

26、1;int j,p,t;for(j=400;j=0;-j) fj=0;for(p=r0.next;p;p=rp.next)j=rp.keys0;if(!fj) fj=p;elserej.next=p;ej=p;for(j=400;!fj;j-);r0.next=fj;t=ej;while(j=0)for(j-;j0&!fj;j-);if(fj&j=0)rt.next=fj;t=ej;rt.next=0;void ShowRank(SLList *l)/按名次顺序输出考生名次 学号 姓名 总分 语文 数学 英语 综合分数int rank=1,i;cout 名次 考号 名字 总分 语文 数学 英语

27、 综合r0.next;rankrecnum;rank+)cout setw(2)rank;cout setw(10)ri.numbersetw(10)ri.name;cout setw(10)ri.keys0;cout setw(10)ri.keys1setw(10)ri.keys2;cout setw(10)ri.keys3setw(10)ri.keys4ri.next;void RadixSort(SLList *l) int x,k=1;while(k!=0) cout*endl; cout* 你可以选择以下几种操作: *endl; cout* 1.总分相同时按语文成绩排序 *endl;

28、 cout* 2.总分相同时按英语成绩排序 *endl; cout* 3.总分相同时按数学成绩排序 *endl; cout* 4.总分相同时按综合成绩排序 *endl; cout* 5.退出 *endl; cout*endl; coutx; switch(x) case 1: RadixSortChinese(l); RadixSortTotal(l); cout考生成绩已按您的选择排序成功endl; ShowRank(l); break; case 2: RadixSortMaths(l); RadixSortTotal(l); cout考生成绩已按您的选择排序成功endl; ShowRan

29、k(l); break; case 3: RadixSortEnglish(l); RadixSortTotal(l); cout考生成绩已按您的选择排序成功endl; ShowRank(l); break; case 4: RadixSortzonghe(l); RadixSortTotal(l); cout考生成绩已按您的选择排序成功endl; ShowRank(l); break; case 5: return ; break; system(pause); system(cls); int main()int x,flag=1;SLList * L=new SLList;while(f

30、lag!=0) cout*欢迎使用多关键字排序系统*n; cout*-手动输入考生成绩信息进行排序请选-1*n; cout*-显示考生成绩信息请选择-2*n; cout*-各种查询考生成绩信息请选择-3*n; cout*-各种排序请选择-4*n; cout*-输出排序后的考生高考信息请选择-5*n; cout*-退出请选择-6*n; cout*n;coutx;switch(x)case 1: L=Creat(); break; case 2: read(L); break; case 3: search(L); break; case 4:RadixSort(L); break; case 5

31、: ShowRank(L); break; case 6: return 0 ; break; system(pause); system(cls);cout按任意键继续操作endl; system(cls);return 0;4.课程设计心得本次课程设计我做的是多关键字LSD排序,在上数据结构课时,我对链式基数排序的过程和功能实现有了一定的认识,但是对“分配”和“收集”的方法算法程序没怎么弄懂。在做这次实验时,我又重新把书上的算法看了一下,知道LSD(最低位优先)法是从最次位关键字起进行排序,然后再对高一位的关键字进行排序,依次重复,直至对最高位关键字进行排序后便成为一个有序序列。“分配”和

32、“收集”方法是在一趟排序中,将结点分配到相应的链队列中去,然后再链接起来。看不懂的问了一下同学。在开始写需求分析的时候我就照着给的题目进行了分析,进行了一系列的规定。但是,对于比较冒泡排序和链式基数排序的优越性要涉及到算法的执行时间的问题,这一块我不懂也没有学过,看了一下严蔚敏老师的参考程序还是没看懂,所以在需求分析的时候我没有对算法的执行时间进行分析后面也没有进行设计,只是在实验总结的时候对两种算法进行了比较。概要设计我就参考了去年写的学生成绩管理系统和老师提的要求进行了设计画出了系统流程图,设计了插入、删除、修改、查询、排序等功能。本程序最大的亮点我觉得是,我采用了两种方式获取数据:一种是

33、在需要比较的数据比较小的时候可以自己输入数据进行排序,另一种是从文件中读取数据进行排序,对于后面没能写出修改和删除的功能我觉得有点儿遗憾。详细设计的时候,我结合概要设计并参考书上的链式基数排序程序,写出了要定义的基本数据和结构体,然后写出了自己要用到的存储结构,静态链表的一些定义,最后写出了自己实现的功能的函数名以及要引用的变量。在最后没写出的功能就删除掉了。编程过程中,除了用到链式基数排序,我还用到了静态链表这个以前没有用过的数据结构,我把书上静态链表这一章看了一遍,刚开始看不懂,后来多看了几遍就有些懂了。知道在静态链表中用整型的游标代替指针指示结点在数组中的相对位置。但是在写的时候对于插入

34、、删除、修改这些功能我没能用静态你链表写出来,所以就修改了之前的设计,只写了查询功能。在验收的时候我先演示了一遍的我程序功能,然后老师问我文件的问题。问我为什么只能从文件中读取10个,一般不是有多少个旧读取多少个吗?我跟老师说我是10是控制我的for循环地的,因为我之前想写那种输入一个存储一个,然后在读取的,因为对文件不是很熟悉就没写出来,就简单地写了一个只能读取的功能。后来老师叫我讲一下链式基数算法,我发现在讲的过程中我还是有些不懂,所以老师让我把算法看懂,之后看懂了给老师讲解了,老师就让我过了。在实验中,我还总结了一下冒泡排序和 “分配”和“收集”两种方法的优缺点,当记录非常多的时候,后者便体现出优势。从它们所需的辅助储存空间来看,前者很有优势,而后者需要2*RADIX个计数单元。总之,通过这次课程设计,不仅编程能力,找错能力和耐心得到的提高,我对数据结构这门课的理解也加深了。在本实验中主要侧重的是排序的方法,在其它功能上的编写有些失败。希望在以后的学习中自己可以写出这次没有写出的功能。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!