学号姓名C语言程序设计实训课程设计报告.docx
- 文档编号:9842378
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:13
- 大小:52.37KB
学号姓名C语言程序设计实训课程设计报告.docx
《学号姓名C语言程序设计实训课程设计报告.docx》由会员分享,可在线阅读,更多相关《学号姓名C语言程序设计实训课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
学号姓名C语言程序设计实训课程设计报告
齐鲁工业大学信息学院
《数据结构》课程设计报告
题目:
图书管理系统
专业班级:
计科(外包)15-2
学号:
201503091063
姓名:
杨朔蓬
时间:
2016.5.30
一、
需求分析
1.本演示程序中,堆中元素为整数,堆的大小无限制,堆的输入方式与整型数组输入相同,本程序主要是利用堆排序原理进行设计,实现对输入数据的排序和最大元的输出。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;相应的输入数据和运算结果显示在其后。
3.程序执行命令包括:
1)新建大根堆
2)输出最大元素
3)插入元素至大根堆
4)输出大根堆数组
5)输出大根堆(按行)
6)销毁堆
二、概要设计
1.抽象数据类型定义
ADTHeapSort{
数据对象:
D={ai|ai属于Elemset,i=1,2,3........,n,n=>0};
数据关系:
R1={ai=>a2i;ai=>a2i+1};
基本操作:
Init_Sq(&L)
操作结果:
新建一个堆
InitSq(&L)
初始条件:
堆已存在
操作结果:
将输入整数插入到大根堆中
HeapAdjust(SqList&L,ints)
初始条件:
堆已存在
操作结果:
把s调到堆中合适位置
HeapSort(&L)
初始条件:
堆已存在
操作结果:
无序数列调整为一个大顶堆
DelMax(&L)
初始条件:
堆已存在
操作结果:
取出最大元素
DeleteHeap(&L)
操作结果:
销毁堆
PutList(L)
初始条件:
堆已存在
操作结果:
按行输出堆中元素
Load_sq(L)
初始条件:
堆已存在
操作结果:
输出堆数组
}ADTHeapSort
三、详细设计
#include
#include
typedefstruct{
int*key;
intlength;
}SqList;
voidLoad_sq(SqListL){//打印堆数组
inti;
if(L.length){
printf("堆数组为\n:
");
for(i=1;i<=L.length;i++)
printf("%d",L.key[i]);
printf("\n");
}
elseprintf("堆为空!
!
\n");
system("pause");
system("cls");
}
voidPutList(SqListL){//按行打印堆
inth=0,sum=0,item=1;
inti,j,cnt=1,tmp=1;
if(L.length){
while(sum sum+=item; h++; item*=2; } printf("\n------------------------\n"); printf("堆中元素: \n"); for(i=0;i printf("第%d行元素",i+1); for(j=0;j printf("%d",L.key[cnt++]); printf("\n"); tmp*=2; } printf("\n"); } elseprintf("堆为空! ! \n"); system("pause"); system("cls"); } voidHeapAdjust(SqList*L,ints){//调整堆 intj; L->key[0]=L->key[s]; for(j=2*s;j<=L->length;j*=2){ if((j j++; if(L->key[0]>=L->key[j]) break; L->key[s]=L->key[j]; s=j; } L->key[s]=L->key[0]; } voidHeapSort(SqList*L){//建立大顶堆 inti; for(i=L->length/2;i>0;i--) HeapAdjust(L,i); } intInit_Sq(SqList*L){//新建堆 inti; printf("请输入初始堆的长度: "); scanf("%d",&L->length); L->key=(int*)malloc((L->length+1)*sizeof(int)); if(! L->key)exit (1); printf("请输入初始堆的各个元素\n: "); for(i=1;i<=L->length;i++) scanf("%d",&L->key[i]); HeapSort(L); printf("新建堆成功! \n"); system("pause"); system("cls"); return1; } voidInitSq(SqList*L){//插入元素 inta,i,*newkey; intlen=L->length+1; printf("请输入插入元素个数: "); scanf("%d",&a); L->length+=a; newkey=(int*)realloc(L->key,(L->length+1)*sizeof(int)); if(! newkey)exit (2); L->key=newkey; printf("请输入初始堆的各个元素\n: "); for(i=len;i<=L->length;i++) scanf("%d",&L->key[i]); HeapSort(L); printf("插入元素成功! \n"); system("pause"); system("cls"); } voidDelMax(SqList*L){//删除最大元 if(L->length){ printf("最大元素为: %d\n",L->key[1]); L->key[1]=L->key[L->length]; L->length--; HeapAdjust(L,1); } elseprintf("堆为空! ! \n"); system("pause"); system("cls"); } intDeleteHeap(SqList*L){ if(L->length){ free(L->key); L->length=0; L=NULL; printf("销毁完成! \n"); system("pause"); system("cls"); return1; } else{ printf("已为空,无需销毁! \n"); system("pause"); system("cls"); return0; } } voidmenu(){ printf("*****************************\n"); printf("#1、新建大根堆#\n"); printf("#2、输出最大元素#\n"); printf("#3、插入元素至大根堆#\n"); printf("#4、输出大根堆数组#\n"); printf("#5、输出大根堆(按行)#\n"); printf("#6、销毁堆#\n"); printf("#7、退出#\n"); printf("*****************************\n"); printf("请选择\n: "); } voidmenu_2(){ printf("**********************************\n"); printf("*1、从堆中删除后输出*\n"); printf("*2、直接输出*\n"); printf("**********************************\n"); printf("请选择\n: "); } intmain() { inti,j; SqListL; L.length=0; while (1){ menu(); scanf("%d",&i); switch(i){ case1: Init_Sq(&L); break; case2: menu_2(); scanf("%d",&j); if(j==1)DelMax(&L); elseif(j==2){ if(L.length) printf("最大元素为: %d\n",L.key[1]); else printf("堆为空! ! \n"); system("pause"); system("cls"); } break; case3: InitSq(&L); break; case4: Load_sq(L); break; case5: PutList(L); break; case6: DeleteHeap(&L); break; case7: return0; default: printf("无此项! ! ! \n"); system("pause"); system("cls"); } } } 函数调用关系: Main Menumenu_2Init_SqInitSqDelMaxLoad_sqPutListDeleteHeap HeapSortHeapAdjust SqList 四、调试分析 在编程过程中遇到很多问题,比如函数之间参数的传递,刚开始总搞不清楚应该传递什么样的参数,还有在设计堆的筛选中,总是搞不清楚应该怎样筛选,后来经过查阅资料解决了这些问题,程序顺利执行。 执行过程中发现了一些bug,比如在堆为空时执行输出程序会崩溃,这些bug已经顺利解决了。 五、用户手册 1.本程序运行环境为dos操作系统,执行文件为Heap.exe。 2.进入演示程序即显示文本方式的用户界面: 3.选择相应的选项即可进行操作。 六、测试结果 执行命令1: 执行命令2: 执行命令3: 执行命令4: 执行命令5: 执行命令6: 执行命令7: 退出 七、附录 源程序文件名 Heap.c//主程序 八、总结与心得 在本次程序设计中,运用了堆排序的基本原理,在编程的过程中,首先要了解大顶堆的定义,以及如何利用堆排序的原理进行排序,合理的设计筛选模块,先从主函数开始,正确使用特殊语句,以及关键字,在这过程要用到for、while、switch循环语句,最重要的就是要写出正确的判断语句,搞清楚程序的结束的点以及函数的递归调用,在大顶堆的筛选的时候,要明白堆排序的实质,就是从最后一个非叶子节点开始,从它的左右子树开始比较,顺着子树较大的方向往父节点平移,最后和序列的最后一个数据进行交换,把它放置在闲置的空间内。 在编程的完成之后,要进行仔细的检验,找出错误,进行多次验证,确保此程序准确无误,并且要使程序简单明了,便于操作者使用方便。 在进行了此次程序设计之后,明白了如何利用堆排序原理进行对数据的排序,对以前所学的知识进行了巩固,增加了实践的经验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学号 姓名 语言程序设计 课程设计 报告