《数据结构课程设计多关键字排序高考排序》由会员分享,可在线阅读,更多相关《数据结构课程设计多关键字排序高考排序(23页珍藏版)》请在金锄头文库上搜索。
1、淮 海 工 学 院 计算机工程学院课程设计报告设计名称: 数据结构课程设计 选题名称: 多关键字排序 姓 名: 周宣 学 号: 110821120 专业班级: 网络工程081 系 (院): 计算机工程学院 设计时间: 2009.12.282010.1.12 设计地点: 软件工程实验室、教室 成绩:指导教师评语: 签名: 年 月 日1课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系
2、统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。2课程设计任务与要求:任务题目:多关键字的排序【问题描述】 多关键字的排序有其一定的实用范围。例如:在进行高考分数处理时,除了需对总分进行排序外,不同的专业对单科分数的要求不同,因此尚需在总分相同的情况下,按用户提出的单科分数的次序要求排出考生录取的次序。 【基本要求】 (1)假设待排序的记录不超过10000,表中记录的关键字数不超过5,各个学科关键字的范围均为0至100,总分关键字的范围是0-300。按用户给定的进行排序的关键字的优先关系,输出排序结果。 (2)
3、约定按LSD法进行多关键字的排序。在对各个关键字进行排序时采用两种策略:其一是利用稳定的内部排序法,其二是利用“分配”和“收集”的方法。并综合比较这两种策略。 【测试数据】 由随机数产生器生成。 【实现提示】 由于是按LSD方法进行排序,则对每个关键字均可进行整个序列的排序,但在利用通常的内部排序方法进行排序时,必须选用稳定的排序方法要求:1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准
4、函数,加大代码的重用率。 2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。3、程序设计语言推荐使用C/C+,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);6、课程设计实践作为培养学生动手能力的一种手段,单独考核。3课程设计说明书一 需求分析1)选题功能分析【题目的意义】1、 对高考分数按照总分和不同学科的分数按照优先级顺序排出考生录取的次序,以满足不同专业对单科分数的要求。2、 对不同排序策略进行综合比较。【实现的功能】1、 用C
5、语言设计实现一个高考成绩排序系统。2、 创建模拟的高考考生成绩表,存放到txt文档中。考生考号为1,2,3用伪随机数生成器生成各考号学生的各个学科成绩,并计算总分成绩。3、 由于实际中高考考生成绩表是已知的(模拟创建的txt文档),程序能从文件中读取数据。从创建的考生成绩表中读取数据,并对数据处理4、 按照学科的优先级顺序,对学生的成绩排序。既可以以某一学科的单科成绩优先级最高排序,也可以先按总分优先级最高来排序。5、 在对各个关键字即单科成绩进行排序的时候,分别用稳定的内部排序法(冒泡法)以及“分配和搜集”的方法进行排序。6、 能够对冒泡法排序策略和“分配和搜集”方法排序策略进行的执行时间进
6、行比较。7、 输入数据:1各科英文首字母的代号,字符型,如smce 2整型数,0-10000 1输出程序用两种方法进行排序的进程和执行时间 2输出前n名学生的信息二 概要设计1、 伪随机生成的数据包含语文、数学、英语三科成绩。总成绩为语文、数学、英语三科成绩的和。学号按成绩数组的下标赋值,生成学生成绩记录,将该记录保存到txt文档中2、 从上面的txt文档中读取数据到一个二维数组中,以便对学生信息进行处理3、 给出排序的优先关系,根据优先关系由低位向高位逐个关键字进行排序。4、 对单科成绩进行排序的时候,单科成绩虽然是0-100,但总成绩是0-300,所以要建301个队列进行排序,先按“分配”
7、和“搜集”的方法进行一趟“基数排序”;然后再按照稳定的内部排序法(冒泡法)进行排序。将搜集好的或排序好的序列存储,以进行对次优先级的关键字进行再排序。5、 将排序好的学生成绩按照用户提出的提取人数的要求,保存到另一个txt文档中,并输出到屏幕6、 系统用到的抽象数据类型定义double BubTime1,/按第一个关键字代表的学科成绩用冒泡法排序执行的时间 BubTime2,BubTime3,BubTime4,BubTimeSum,/冒泡法排序的总时间DCTime1,/按第一个关键字代表的学科成绩用分配和收集的方法执行的时间DCTime2,DCTime3,DCTime4,DCTimeSum;/
8、分配和收集法排序的总时间int score100005,/随机创建的模拟学生记录源数组bubble100005,/进行冒泡法排序时用来存放学生记录源数组,并且随排序进行数组中的记录发生交换copy100005;/从模拟的学生记录源txt文件中读取学生记录到该数组struct LSD d301;/分配数组,该处考虑到把总分(0-300)也列入优先级序列中,因此建立了301个队列int *c10000;/用来存放收集到的学生记录char x5;/存放有优先关系的学科代号序列7、 系统中的各个函数模块 1:void CreatScore(int score100005);/随机创建学生记录表scor
9、e。正常高考中该表是已知的,不必创建2:void Collect(struct LSD d301,int *c10000);/LSD法排序中的收集函数,即将分配好的记录收集到c指针数组保存3:void InitDivide(struct LSD d301);/用于初始化临时分配数组,在每一次收集后必须做的工作4:double DCSort(struct LSD d301,int *c10000,int n);/分配(Divide)和收集(Collect)排序的方法5:double BubbleSort(int score100005,int n);/冒泡法排序 6:void Print();/
10、将排序结果文件中的记录数据输出到屏幕上7:void savesources(int score100005,int n);/将模拟创建的高考学生信息记录存放到文件中8:void saveresults(int score100005,int n);/按照用户的要求(总成绩在前多少名的学生记录),将这n条学生的记录存放到新的文件中9:void load(int score100005);/从学生高考记录源文件中读取记录到该二维数组中8、 各函数之间的调用关系 1:主函数可以调用除子函数2之外的所有函数 2:子函数4可以调用子函数2和3【功能模块图】 MAINInitDivide(d)Create
11、Score(score)Savesources(score.10000)Lode(copy)DcSort(d,c,0)返回执行时间Collect(d,c)InitDivide(d)BubbleSort(bubble,0)返回执行时间Saveresults(bubble,n)Print()三 详细设计1.抽象数据类型:该数据类型是在分配和收集的时候存放分配成绩数组1 抽象数据类型struct LSDstruct LSD/队列的结构类型,链表存储结构类型int *cur;/当前位置struct LSD *next;/队列中下一个位置;2 CreatScore(int scoreRecordNumb
12、erKeyNumber)函数/*创建一个含有RecordNumber名学生成绩记录的score,包含语文、数学、英语、总分和学号,随机生成语文、数学、英语的成绩。*传递的参数是成绩数组score,无返回值*/void CreatScore(int scoreRecordNumberKeyNumber)/*伪随机生成语文、数学、英语的成绩*/for(i=0;i RecordNumber;i+)for(j=0;j3;j+)scoreij=rand()%101;/成绩的范围是0-100/*总分成绩初始化*/for(i=0;i RecordNumber;i+)scorei3=scorei0+scorei1+scorei2;/总成绩为各科成绩之和/*学号的初始化*/for(i=0;i=0; i-)if(di.cur!=NULL)/当前队列不空,即有学生的成绩分配到该队列p=&di;while(p-cur!=NULL)/当前位置有学生的成绩