5、药店的药品销售统计系统(排序应用)
[问题描述]
设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号、单价、销售量或销售额做出排名。
[实现提示]
在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共4位,采用字母和数字混合编号,如:A125,前一位为大写字母,后三位为数字,按药品编号进行排序时,可采用基数排序法。对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。
药品信息的元素类型定义:
typedef structnode
{ charnum[4]; /*药品编号*/
char name[10]; /*药品名称*/
float price; /*药品单价*/
int count; /*销售数量*/
float sale; /*本药品销售额*/
}DataType;
存储药品信息的顺序表的定义:
typedef struct
{ DataTyper[MaxSize];
int length;
}SequenList;
一、算法设计
1.本次程序一共需要采用4种排序方法,其中感觉最麻烦的就是桶排序(基数排序)和堆排序了。采用桶排序的时候一共开出来26个队列,0~9算是10个。字母的话可以通过减去ASCⅡ码来实现。例如’A’-’A’就变成了整形当中的0,一直到’Z’-’A’。堆排序中采用的是构造大顶堆。这样,每次还换完成之后,把最大值当道最后一个位置。整个排序做完,那么就是按照从小到大的顺序排列的了。对于文件的导入和存储采用的是ifstream和ofstream,txt文档来保存,简化程序。
各个函数的调用关系如下图所示:
main() |
|
|||||||||
mainjiemian() kaobei() line() |
|
|||||||||
read() |
write() |
math_sort() |
en_queue() init_queue() empty_queue() de_queue() |
bubble_sort() |
heap_sort() |
Swap () |
quick_sort() |
partion() |
jieshu() |
|
display() |
display() |
shift() |
display() |
|
||||||
display() |
|
|||||||||
mainjiemian() |
|
2.本程序中包含16个模块
(1)主函数:intmain();
(2)基数排序:math_sort(Sequnenlist* l);
(3)从队列中取出:Datatypede_queue(Linkqueue * q);
(4)药品进队:voiden_queue(Linkqueue * q, Datatype x);
(5)判断队列是否为空:boolempty_queue(Linkqueue * q);
(6)初始化队列:voidinit_queue(Linkqueue * q);
(7)快速排序:voidquick_sort(Sequnenlist * l, int low, int high);
int partion(Sequnenlist * l, int low, int high);
void Swap(Sequnenlist * l, int i, int j);
(8)冒泡排序:voidbubble_sort(Sequnenlist * l);
(9)堆排序:voidheap_sort(Sequnenlist * l);
void shift(Sequnenlist * l, inti, int m);
(10)拷贝数据:copy(Sequnenlist* l, int i, int j);
(11)结束界面:voidjieshu();