数据结构课程设计药品排序.docx
- 文档编号:23155409
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:30
- 大小:458.50KB
数据结构课程设计药品排序.docx
《数据结构课程设计药品排序.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计药品排序.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构课程设计药品排序
课程设计报告
数据结构课程设计:
药店的药品销售统计系统
学院
计算机与通信工程
专业名称
物联网工程
班级学号
学生姓名
指导教师
2015年07月15日
设计要求:
设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号、单价、销售量或销售额做出排名。
选择合适的存储结构,建立药品信息表。
各药品的信息包括:
药品编号、药名、药品单价、销售量、销售额。
对各药品的编号、单价、销售量或销售额进行排序时,可采用多种排序方法,如基数排序、冒泡排序,快速排序、堆排序.
药店的药品销售统计系统
1基本功能描述
在该药品销售统计系统中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。
各药品的信息包括:
药品编号、药名、药品单价、销出数量、销售额。
药品编号共4位,采用字母和数字混合编号,如:
A125,前一位为大写字母,后三位为数字,按药品编号进行排序,采用基数排序法。
在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。
本系统可按药品的编号、单价、销售量或销售额做出排名。
药品信息的元素类型定义:
typedef struct node
{
char num[4]; /*药品编号*/
char name[10]; /*药品名称*/
float price; /*药品单价*/
int count; /*销售数量*/
float sale; /*本药品销售额*/
}DataType;
存储药品信息的顺序表的定义:
typedef struct
{
DataType r[MaxSize];
int length;
}SequenList;
2设计思路
先建立一个名为drug.h的头文件,在头文件里存储结点和顺序表的定义。
然后在main文件中引用drug.h文件,用switch语句实现按药品的编号、单价、销售量或销售额做出排名的功能选择,输出函数调用的结果。
分别用RadixSort、BubbleSort、QuickSort、HeapSort函数实现基数排序、冒泡排序、快速排序和堆排序。
以下为程序流程图:
图1main函数的流程图
基数排序函数由函数Distribute、Collect和RadixSort实现:
图2函数Distribute的流程图
图3函数Collect的流程图图4函数RadixSort的流程图
冒泡排序函数的实现思路:
图5函数BubbleSort的流程图
快速排序由函数Partition、Qsort和函数QuickSort实现
图6函数Partition的流程图图8函数QuickSort的流程图
堆排序由函数HeadAdjus和函数HeapSort实现:
图9函数HeadAdjus的流程图
图10函数HeapSort的流程图
3软件设计
3.1设计步骤
使用GCC编译器编译,使用SublimeText编辑器编辑代码。
新建文件
3.2输入代码
1)建立头文件“drug.h”保存到指定目录。
2)在E盘建立药品目录文件“abd.txt”
3)建立主文件“main”并保存到指定目录。
3.3关键功能的实现
1)将药品信息存入文件中
2)药品编号按基数排序
先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。
再将各组连接起来,便得到一个有序序列。
3)药品单价冒泡排序
比较相邻的元素,如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
两个循环嵌套实现冒泡排序,共进行i=L.length-1趟排序,每次进行L.length-1-i次比较。
4)销售量快速排序
设置两个变量low,high,排序开始的时候:
low=0,high=N-1;以第一个数组元素作为关键数据,赋值给key,即key=A[0];从high开始向前搜索,即由后开始向前搜索(high--),找到第一个小于key的值A[high],A[low]与A[high]交换;从low开始向后搜索,即由前开始向后搜索(low++),找到第一个大于key的A[low],A[low]与A[high]交换;重复前面,直到low=high
5)销售额堆排序
先建成一个小根堆,此堆为初始的无序区再将关键字最小的记录(即堆顶)和无序区的最后一个记录交换,由此得到新的无序区和有序区,由于交换后新的根可能违反堆性质,故应将当前无序区调整为堆。
然后再次将有序区中关键字最小的记录和该区间的最后一个记录交换,由此得到新的无序区和有序区,以此类推。
4结论与心得体会
至从大一的第一个C++课程设计开始,我们就开始慢慢接触在课本之外的知识,学会自己去归纳,自己去总结,自己上网找资料,自己去图书馆学习,我想,这也是大学的教学环境真正的意义所在。
这次的课程设计虽然给的时间很长,但由于考试复习和其他课设的影响,本次课设的时间相对来说还是很紧张的,再加上平时编写代码的经验不足,这次课设还是有一定难度的。
学习了数据结构之后,对于课设的研究内容也有了一定的了解。
经过本次综合课程设计的学习让我受益菲浅。
在综合课程即将结束之时我对在这次的课程设计进行了总结,总结近一周来的收获与不足。
取之长、补之短,在今后的学习和工作中有所受用。
一、让我养成了课后复习的好习惯。
经过这次课程设计,让我深深的懂得课后复习的重要。
只有在课前进行了认真的预习,才能在课上更好的学习,收获的更多、掌握的更多。
课后的复习就是把在上课上的更好学习更多收获,变成真真正正属于自己的东西。
二、培养了我的动手能力。
“实验就是为了让你动手做,去探索一些你未知的或是你尚不是深刻理解的东西。
”每个步骤我都亲自去做,不放弃每次锻炼的机会。
经过这次课程设计,让我的动手能力有了明显的提高。
代码就是要多写,多上机调试,纸上谈兵对于编写程序的学习是大忌,平时的上机实验非常重要,要勤于动手,勤于动脑。
三、让我在探索中求得真知。
对于一个知识尚浅、探索能力还不够的人来说这些探索也非一件易事。
对于这些内容,我在探索中学习、在模仿中理解、在实践中掌握。
四、教会了我改代码的能力。
程序调试常常会有错误,这就需要我们耐下心来一步步的返回去看代码,到底哪里有错误,找到错误原因和改正方法。
但在这中间我也发现了我存在的很多不足。
我的编程能力还不够强,虽然有设计的思路,但是在实践中还是碰到了许多问题,想和做是两码事,让我再次意识到平时练习的重要性。
总之,课程设计让我收获颇丰,同时也让我发现了自身的不足。
在课程设计过程中学得的,我将发挥到其它中去。
也将在今后的学习和工作中不断提高、完善。
在此间发现的不足,我将努力改善,通过学习、实践等方式不断提高。
5参考文献
[1]谭浩强.C++实践.清华大学出版社,2010
[2]王晓东.数据结构与算法设计.机械工业出版社,2012
[3]严蔚敏李冬梅吴伟民.数据结构(C语言版).人民邮电出版社,2011.02.
6附录
6.1调试报告
写完代码运行,发现了一些错误:
进过一番检查调试后,得到了正确结果。
无误的结果显示:
6.2测试结果
6.3关键源代码
1.Drug.h文件中构建关于结点和顺序表的定义
#defineMaxSize50
typedefstructnode
{
charnum[5];/*药品编号*/
charname[10];/*药品名称*/
floatprice;/*药品单价*/
intcount;/*销售数量*/
floatsale;/*本药品销售额*/
intnext;
}DataType;
typedefstruct
{
DataTyper[MaxSize];
intlength;
}SequenList;
2.读入文件功能的实现
K:
\\abd.txt为数据文件的存储路径
fstreamin("K:
\\abd.txt",ios:
:
in);
while(!
in.eof())
{
in>>k.r[k.length].num>>k.r[k.length].name>>k.r[k.length].price>>k.r[k.length].count>>k.r[k.length].sale;
k.length++;
}
in.close();
3.用switch语句实现排序功能的选择
switch(choice)
{
case1:
RadixSort(k);break;//基数排序
case2:
BubbleSort(k);break;//冒泡排序
case3:
QuickSort(k);break;//快速排序
case4:
HeapSort(k);break;//堆排序
default:
cout<<"没有您选择的功能,请确定后重新输入。
"< } cout< cout<<"\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"< cout<<"\t※※"< cout<<"\t※客户跟踪程序※"< cout<<"\t※1、按药品编号排序2、按药品单价排序※"< cout<<"\t※3、按药品销售量排序4、按药品销售额排序※"< cout<<"\t※※"< cout<<"\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"< 4.药品编号基数排序函数 //RadixSort.cpp药品编号基数排序 voidDistribute(DataType*r,inti,int*f,int*e) { intj,p; for(j=0;j<=26;j++)f[j]=0; for(p=r[0].next;p;p=r[p].next) { if(i>0) { j=r[p].num[i]-'0'; if(! f[j])f[j]=p; elser[e[j]].next=p; e[j]=p; //if(m==7)break; } else { j=r[p].num[i]-'A'; if(! f[j])f[j]=p; elser[e[j]].next=p; e[j]=p; } } } voidCollect(DataType*r,inti,int*f,int*e) { intj,t; for(j=0;! f[j];j++); r[0].next=f[j]; t=e[j]; while(j<26) { for(j=j+1;j<25&&! f[j];++j); if(f[j]) { r[t].next=f[j]; t=e[j]; } } r[t].next=0; } voidRadixSort(SequenList&L)// { intf[27],e[26]; inti; for(i=0;i L.r[i].next=i+1; L.r[L.length-1].next=0; for(i=3;i>=0;i--) { Distribute(L.r,i,f,e); Collect(L.r,i,f,e); } cout<<"按药品编号排序后的结果是: "< i=L.r[0].next; while(i) { cout< i=L.r[i].next; } } 5.药品单价冒泡排序函数 //BubbleSort.cpp冒泡排序 voidBubbleSort(SequenList&L) { inti,j; DataTypetemp; for(i=0;i for(j=1;j { if(L.r[j].price>L.r[j+1].price) { temp=L.r[j]; L.r[j]=L.r[j+1]; L.r[j+1]=temp; } } cout<<"按单价排序后的结果是: "< for(i=1;i { cout< } } 所有源码如下: #include"drug.h" #include #include usingnamespacestd; voidRadixSort(SequenList&L); voidBubbleSort(SequenList&S); voidQuickSort(SequenList&L); voidHeapSort(SequenList&H); voidmain() { SequenListk; k.length=1; intchoice; fstreamin("E: \\abd.txt",ios: : in); while(! in.eof()) { in>>k.r[k.length].num>>k.r[k.length].name>>k.r[k.length].price>>k.r[k.length].count>>k.r[k.length].sale; k.length++; } in.close(); cout<<"此系统有如下功能"< cout<<"**************************"< cout<<"1、按药品编号排序"< cout<<"2、按药品单价排序"< cout<<"3、按药品销售量排序"< cout<<"4、按药品销售额排序"< cout<<"0、推出系统"< cout<<"**************************"< cout<<"请输入您的选择: "< cin>>choice; while(choice) { switch(choice) { case1: RadixSort(k);break;//基数排序 case2: BubbleSort(k);break;//冒泡排序 case3: QuickSort(k);break;//快速排序 case4: HeapSort(k);break;//堆排序 default: cout<<"没有您选择的功能,请确定后重新输入。 "< } cout<<"**************************"< cout<<"1、按药品编号排序"< cout<<"2、按药品单价排序"< cout<<"3、按药品销售量排序"< cout<<"4、按药品销售额排序"< cout<<"0、推出系统"< cout<<"**************************"< cout<<"请输入您的选择: "< cin>>choice; } } //RadixSort.cpp药品编号基数排序 voidDistribute(DataType*r,inti,int*f,int*e) { intj,p; for(j=0;j<=26;j++)f[j]=0; for(p=r[0].next;p;p=r[p].next) { if(i>0) { j=r[p].num[i]-'0'; if(! f[j])f[j]=p; elser[e[j]].next=p; e[j]=p; //if(m==7)break; } else { j=r[p].num[i]-'A'; if(! f[j])f[j]=p; elser[e[j]].next=p; e[j]=p; } } } voidCollect(DataType*r,inti,int*f,int*e) { intj,t; for(j=0;! f[j];j++); r[0].next=f[j]; t=e[j]; while(j<26) { for(j=j+1;j<25&&! f[j];++j); if(f[j]) { r[t].next=f[j]; t=e[j]; } } r[t].next=0; } voidRadixSort(SequenList&L)// { intf[27],e[26]; inti; for(i=0;i L.r[i].next=i+1; L.r[L.length-1].next=0; for(i=3;i>=0;i--) { Distribute(L.r,i,f,e); Collect(L.r,i,f,e); } cout<<"按药品编号排序后的结果是: "< i=L.r[0].next; while(i) { cout< i=L.r[i].next; } } //BubbleSort.cpp冒泡排序 voidBubbleSort(SequenList&L) { inti,j; DataTypetemp; for(i=0;i for(j=1;j { if(L.r[j].price>L.r[j+1].price) { temp=L.r[j]; L.r[j]=L.r[j+1]; L.r[j+1]=temp; } } cout<<"按单价排序后的结果是: "< for(i=1;i { cout< } } //QuickSort.cpp快速排序 intPartition(SequenList&L,intlow,inthigh) { intpri; L.r[0]=L.r[low]; pri=L.r[low].count; while(low { while(low L.r[low]=L.r[high]; while(low L.r[high]=L.r[low]; } L.r[low]=L.r[0]; returnlow; } voidQsort(SequenList&L,intlow,inthigh) { intp; if(low { p=Partition(L,low,high); Qsort(L,low,p-1); Qsort(L,p+1,high); } } voidQuickSort(SequenList&L) { Qsort(L,1,L.length-1); cout<<"按销售量排序后的结果是: "< for(inti=1;i { cout< } } //HeapSort.cpp堆排序 voidHeadAdjust(SequenList&H,ints,intm) { intj; DataTyperc=H.r[s]; for(j=2*s;j<=m;j*=2) { if(j if(rc.sale>H.r[j].sale)break; H.r[s]=H.r[j]; s=j; } H.r[s]=rc; } voidHeapSort(SequenList&H) { DataTypetemp; inti; for(i=(H.length-1)/2;i>0;--i) HeadAdjust(H,i,H.length-1); for(i=H.length-1;i>1;--i) { temp=H.r[1]; H.r[1]=H.r[i]; H.r[i]=temp; HeadAdjust(H,1,i-1); } cout<<"按销售额排序后的结果是: "< for(i=1;i { cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 药品 排序
![提示](https://static.bdocx.com/images/bang_tan.gif)