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.设计思路
从本地文件读取药品的信息,构建各个方法的
void Allprint(SequenList S){//药库信息的输出
void Read(SequenList &S){//读入文本药品信息
void Numsort(SequenList &S)//编号的直接插入排序
void Pricesort(SequenList &S){//单价的冒泡排序
int Partition(SequenList &S,int low,int high){//对顺序表的子表进行一趟排序,返回枢轴位置
void Qsort(SequenList &S,int low,int high)//销售量的快速排序
void Quicksort(SequenList &S){//销售量的快速排序
void HeapAdjust(SequenList &S,int s,int m){//调整堆
void CreatHeap(SequenList &S){//创建堆
void Salesort(SequenList &S){//销售额的堆排序
3.药品文件的导入
void Allprint(SequenList S){//药库信息的输出
printf("药品编号 药名 单价 销出数量 销售额\n");
for (int i = 1;i <=S.length;i++)
{
printf("%s\t%s\t%.2f\t%d\t%.2f\n",S.r[i].num,S.r[i].name,S.r[i].price,S.r[i].count,S.r[i].sale);
}
}
void Read(SequenList &S){//读入文本药品信息
FILE *fp=fopen("drug.txt","rb");//药品文本的信息
if(fp== NULL)
{
printf("找不到该文件!\n");
exit(0);
}else printf("找到该文件l了!\n");
for(int i = 1;i<MaxSize;i++)
{
int n = fscanf(fp,"%s%s%f%d%f",S.r[i].num,S.r[i].name,&S.r[i].price,&S.r[i].count,&S.r[i].sale);
if (n == -1)
{
S.length=i-1;
fclose(fp);
break;
}
}Allprint(S);
fclose(fp);
}
药品的信息
H125 断肠草 989.9 1 989.9
U111 雷公腾 890.0 1 890.0
A123 鸩酒 654.5 1 654.5
N121 鹤顶红 2333.4 2 4666.8
G120 番木鳖 3452.8 1 3452.8
G134 天然砒霜 123.5 5 617.5
O220 砒石 321.5 3 964.5
N341 金刚石 5552.4 5 27762.0
G654 夹竹桃 645.5 1 645.5
L879 乌头 589.6 3 1768.8
I456 见血封喉 789.4 5 3947.0
A655 奎宁 432.4 4 1729.6
N231 甘草 21.6 500 10800.0
G542 含笑半步颠 1234.8 4 4939.2
剩下的源代码
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#define MaxSize 50
void Numsort(SequenList &S)//编号的直接插入排序
{
int i,j;
for(i=2;i<=S.length;++i){
if(strcmp(S.r[i].num,S.r[i-1].num)<0)
{
S.r[0]=S.r[i];
S.r[i]=S.r[i-1];
for(j=i-2;strcmp(S.r[0].num,S.r[j].num)<0;--j)
S.r[j+1]=S.r[j];
S.r[j+1]=S.r[0];
}
} Allprint(S);
}
void Pricesort(SequenList &S){//单价的冒泡排序
int m=S.length;
int flag=1;
int j;
DataType t;
while((m>0)&&(flag==1)){
flag=0;
for(j=1;j<m;j++)
if(S.r[j].price>S.r[j+1].price)
{ flag=1;
t=S.r[j]; S.r[j]=S.r[j+1];S.r[j+1]=t;
}
--m;
}Allprint(S);
}
int Partition(SequenList &S,int low,int high){//对顺序表的子表进行一趟排序,返回枢轴位置
S.r[0]=S.r[low];
int piv=S.r[low].count;
while(low<high){
while(low<high&&S.r[high].count>=piv)--high;
S.r[low]=S.r[high];
while(low<high&&S.r[low].count<=piv)++low;
S.r[high]=S.r[low];
}
S.r[low]=S.r[0];
return low;
}
void Qsort(SequenList &S,int low,int high)//销售量的快速排序
{
if(low<high)
{
int piv=Partition(S,low,high);
Qsort(S,low,piv-1);
Qsort(S,piv+1,high);
}
}
void Quicksort(SequenList &S){//销售量的快速排序
Qsort(S,1,S.length);
Allprint(S);
}
void HeapAdjust(SequenList &S,int s,int m){//调整堆,m为总长度,s为m折成两半左边的值
DataType rc=S.r[s];
for(int j=2*s;j<=m;j*=2){
if(j<m&&S.r[j].sale<S.r[j+1].sale) ++j;
if(rc.sale>=S.r[j].sale) break;
S.r[s]=S.r[j];
s=j;
}
S.r[s]=rc;
}
void CreatHeap(SequenList &S){//创建堆
int n=S.length;
for(int i=n/2;i>0;--i)
HeapAdjust(S,i,n);
}
void Salesort(SequenList &S){//销售额的堆排序
CreatHeap(S);
DataType t;
for(int i=S.length;i>1;--i){
t=S.r[1];
S.r[1]=S.r[i];
S.r[i]=t;
HeapAdjust(S,1,i-1);
}
Allprint(S);
}
void menu(){
cout<<"****************药品销售统计系统****************"<<endl;
cout<<" 0、查看该药库信息"<<endl;
cout<<" 1、按编号排序"<<endl;
cout<<" 2、按单价排序"<<endl;
cout<<" 3、按销售量排序"<<endl;
cout<<" 4、按销售额排序"<<endl;
cout<<" 5、读入药品信息"<<endl;
cout<<" 6、退出"<<endl;
cout<<"************************************************"<<endl;
cout<<"请选择..."<<endl;
}
int main(){
SequenList S;
int m;
while(m!=6){
menu();
cin>>m;
switch(m){
case 0:Allprint(S);break;
case 1:Numsort(S); break;
case 2: Pricesort(S); break;
case 3: Quicksort(S);break;
case 4: Salesort(S); break;
case 5: Read(S); break;
case 6: cout<<"感谢您的使用!"<<endl; return 0;
default: cout<<"没有该选项!"<<endl;
}
system("pause");
system("cls");
}
return 0;
}
回过头来已经写好了,但却发现我少了一步,没认真读题“按药品编号进行排序时,可采用基数排序法”,写药品编号进行排序时却是按照简单的直接插入排序,现在有点不想重新写入进去,下次再将这个部分的代码迭代掉吧!
看来我还是太懒了,😓太懒是不行的。