数据结构课程设计多关键字实验报告Word下载.docx
- 文档编号:21457316
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:33
- 大小:389.77KB
数据结构课程设计多关键字实验报告Word下载.docx
《数据结构课程设计多关键字实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计多关键字实验报告Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
总体要求:
1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
题目要求:
(1)假设待排序的记录数不超过10000,表中记录的关键字数不超过5,各个关键字的范围均为0至100。
按用户给定的进行排序的关键字的优先关系,输出排序结果。
(2)约定按LSD法进行多关键字的排序。
在对各个关键字进行排序时采用两种策略:
其一是利用稳定的内部排序法,其二是利用"
分配"
和"
收集"
的方法。
并综合比较这两种策略。
3.课程设计说明书
一需求分析
在进行高考分数的处理时,除了需对总分进行排序外,不同的专业对单科的分数的要求不同,因此尚需在总分相同的情况下,按用户提出的单科分数的次序要求排出考生录取的次序。
针对这一问题,设计一个用C语言描述的高考成绩排名系统。
按学科关键字高考总分进行排序的情况下,各科程序排序。
本程序规定如下:
1.创建高考成绩表包含语文、数学、英语、综合四门成绩,以及考号姓名等考生信息存放到
名为高考成绩.txt文本中。
2.对考生成绩可以实现查找、显示等功能。
3.可以输入成绩进行排序也可以从文件中读取数据进行排序。
4.对学生的成绩排序,在总分不同的时候按照各自的排序,在总分相同的情况下。
5.对单科成绩进行排序时分别用稳定的冒泡排序和“分配”和“收集”的方法进行排序。
二概要设计
1.规定成绩个数、成绩记录的最大记录数、和存储每个成绩的数组队列
#defineMAX_NUM_OF_KEY5
#defineRADIX101
#defineMAX_SPACE1000
2.定义结构体存储考生成绩信息
structSLCell{
intkeys[MAX_NUM_OF_KEY];
charname[20];
intnumber;
intnext;
};
3.定义静态链表
structSLList{
SLCellr[MAX_SPACE];
intkeynum;
intrecnum;
ADTSLList{
数据对象:
D:
D={a|a属于SLList}
数据关系:
R:
数据元素同属一个集合。
基本操作:
P:
SLList*Creat()
操作结果:
用SLList存储输入的考生的信息,但是不存入文件中。
voidread(SLList*l)
操作结果:
从文件中读取考生的各科成绩进行操作。
voidsearch(SLList*l)
可以按考号或姓名查找考生的各科成绩。
voidDistribute(RecordTypel*r,inti,int*f,int*e)
初始条件:
存在以i为下标的关键字。
以下标为i的关键字为准做一趟分配。
voidCollect(RecordTypel*r,inti,int*f,int*e)
以下标为i的关键字为准做一趟收集。
voidRadixSortMaths(SLList*l)
对*l中的成绩做链式基数排序,以数学成绩为关键字排序。
voidRadixSortChinese(SLList*l)
对*l中的成绩做链式基数排序,以语文成绩为关键字排序。
voidRadixSortEnglish(SLList*l)
对*l中的成绩做链式基数排序,以英语成绩为关键字排序。
voidRadixSortzonghe(SLList*l)
对*l中的成绩做链式基数排序,以理综成绩为关键字排序。
voidRadixSort(SLList*l)
按用户选择的关键字排序并输出排序结果
voidRadixSortTotal(SLList*l)
对总分排序
voidShowRank(SLList*l)
按名次顺序输出考生名次考号姓名总分数学英语语文理综分数
}ADTSLList
系统流程图如下:
三详细设计
1.存储文件的书写
2.考生信息输入
SLList*Creat()
3.查找函数
4.链式基数排序
voidDistribute(SLCell*r,inti,int*f,int*e)/*以下标为i的关键字为准做一趟分配*/
{
intj,p;
for(j=RADIX-1;
j>
=0;
--j)//将RADIX个队列初始化为空队列
f[j]=0;
for(p=r[0].next;
p;
p=r[p].next)
{
j=r[p].keys[i];
if(!
f[j])//将下标p所指的节点插入第j个队列中
f[j]=p;
else
r[e[j]].next=p;
e[j]=p;
}
}
voidCollect(SLCell*r,inti,int*f,int*e)/*收集*/
intj,t;
!
f[j];
j--);
//找第一个非空队列
r[0].next=f[j];
t=e[j];
while(j>
=0)
for(j--;
0&
&
//找下一个非空队列
if(f[j]&
{
r[t].next=f[j];
t=e[j];
}//链接两个非空队列
r[t].next=0;
//t指向最后一个非空队列中的最后节点
/*对*l中的成绩做链式基数排序,链表的记录按从小到大的顺序连接*/
voidRadixSortChinese(SLList*l)//语文
intf[101],e[101];
inti;
for(i=0;
i<
l->
recnum;
i++)
l->
r[i].next=i+1;
l->
r[l->
recnum].next=0;
for(i=3;
i>
0;
--i)
Distribute(l->
r,i,f,e);
Collect(l->
voidRadixSortMaths(SLList*l)//数学
for(i=1;
3;
++i)
voidRadixSortEnglish(SLList*l)//英语
4;
voidRadixSortzonghe(SLList*l)//综合
5;
voidRadixSortTotal(SLList*l)//对总分排序
SLCell*r;
r=l->
r;
intf[401],e[401];
intj,p,t;
for(j=400;
--j)
j=r[p].keys[0];
f[j])
}
voidShowRank(SLList*l)//按名次顺序输出考生名次学号姓名总分语文数学英语综合分数
intrank=1,i;
cout<
<
"
名次考号名字总分语文数学英语综合"
endl;
for(i=l->
r[0].next;
rank<
=l->
rank++)
cou<
setw
(2)<
rank;
cout<
setw(10)<
r[i].number<
r[i].name;
cout<
r[i].keys[0];
cout<
r[i].keys[1]<
r[i].keys[2];
cout<
r[i].keys[3]<
r[i].keys[4]<
i=l->
r[i].next;
四设计与调试分析
刚开始的时候我设计了文件的插入、删除、修改、查询等功能,后来我用了静态链表存储,同时在文件读取的时候我设置了每次读取的最大值为10所以在插入、删除之后就出现了乱码的情况,所以我就放弃了插入、删除的功能,只写了查询的功能。
在写查询的时候我本来想用两个子函数和一个查找主函数的,可是后来在主函数中用switch语句调用两个子函数出错。
后来我把函数写在switch语句中就对了。
在选择功能界面和排序界面时也出错了,一开始我用的是switch语句套在switch语句中,总是出现错误,而且检查不出来。
后来我把套在里面的switch语句写在另外一个函数里,然后再调用这样就没有错误了。
写文件的时候把值直接赋给指针了,所以导致我一直出错,后来进过看书弄懂了。
链式基数排序的程序是按照书上的写的,所以没什么大问题。
五用户手册
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,输出排好顺序的考生成绩信息,按总分排序。
六测试成果
1.手动输入考生信息测试结果
2.从文件中读取考生信息进行排序
七附录(源程序清单)
#include<
iostream.h>
fstream.h>
string.h>
iomanip.h>
#include<
stdlib.h>
#defineMAX_NUM_OF_KEY5//关键字最多为5
#defineMAX_SPACE1000//待排序的数最大为1000
//子关键字数组
/*定义一个静态链表*/
SLList*Creat()//手动输入考生的高考成绩信息
SLList*l;
inti=1,flag=1;
l=newSLList;
keynum=5;
recnum=0;
while(flag)//判断是否继续输入
请输入考生考号、姓名、语文、数学、英语、综合"
cin>
>
r[i].number;
r[i].keys[1];
r[i].keys[3];
r[i].keys[4];
r[i].keys[0]=(l->
r[i].keys[1]+l->
r[i].keys[2]+l->
r[i].keys[3]+l->
r[i].keys[4]);
//成绩总和
(l->
recnum)++;
继续输入考生成绩则输入1,否则输入0"
cin>
flag;
i++;
returnl;
voidread(SLList*l)//读入文件
intnum=10;
//定义从文件中读取数据的最大值,可更改
考号姓名语文数学英语综合"
ifstreaminfile("
高考成绩.txt"
ios:
:
in);
//判断文件是否能够打开
if(!
infile)
打开文件失败"
for(inti=1;
=num;
i++)
infile>
infile>
infile.close();
/*查找函数*/
intj;
cout<
按考号查找输入0,按姓名查找输入1"
j;
switch(j)
case0:
请输入考号"
;
number;
for(i=1;
=10;
if(l->
r[i].number==number)//判断输入的学号是否正确
考号名字语文数学英语综合"
}
break;
case1:
请输入姓名"
cin>
name;
for(i=1;
if(strcmp(l->
r[i].name,name)==0)
break;
/*链式基数排序算法*/
recnum]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 关键字 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)