5、药店的药品销售统计系统(排序应用)
药店的药品销售统计系统(排序应用)
此报告要用到文件操作,本人使用CodeBlocks,建议放到同一目录下
[问题描述]
设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号、单价、销售量或销售额做出排名。
[实现提示]
在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共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;
[设计思路]
- 从文件中读入数据
- 基数排序
- 冒泡排序
- 快速排序
- 堆排序
[文件内容]
[代码及注释]
#include<iostream>
#include<fstream>
using namespace std;
#define MAXSIZE 111 /*最大药品数*/
int flag=0; /*判断程序是否结束*/
//结构
typedef struct{
string ID; /*药品编号*/
string name; /*药品名称*/
float price; /*药品单价*/
int number; /*药品销量*/
float sale; /*药品销售额*/
}DateType; /*药品类型*/
typedef struct{
DateType medicine[MAXSIZE+1]; /*MAXSIZE种药,0号不使用*/
int length; /*药品种数*/
}SqList; /*顺序表*/
//子函数
bool Read(SqList &L); /*从文件读入数据*/
void Print(SqList &L); /*打印数据*/
void Single(SqList &L,char cmp,int len,int index); /*基数*/
void RadixSort(SqList &L); /*排序*/
void BubbleSort(SqList &L); /*冒泡排序*/
int Partition(SqList &L,int low,int high); /*快*/
void QSort(SqList &L,int low,int high); /*速*/
void QuickSort(SqList &L); /*排序*/
void HeapAdjust(SqList &L,int s,int m); /*堆*/
void CreatHeap(SqList &L); /*排*/
void HeapSort(SqList &L); /*序*/
void Menu(SqList &L); /*操作汇总*/
//具体
bool Read(SqList &L)
{
ifstream in("in.txt");
int k=1;
while(1)
{
in>>L.medicine[k].ID>>L.medicine[k].name>>L.medicine[k].price>>L.medicine[k].number>>L.medicine[k].sale;
if(L.medicine[1].ID=="")
{
cout<<"文件读取失败"<<endl;
cout<<"-------------------------------------"<<endl;
return false;
}
if(L.medicine[k].ID=="")break;
++k;
}
L.length=k-1; /*药品种类赋值*/
cout<<"文件读取成功"<<endl;
}
void Print(SqList &L)
{
cout<<"--------------------------------------------------------------------------"<<endl;
cout<<"药品种类数:"<<L.length<<endl;
cout<<"药品编号"<<" 药品名称"<<" 药品单价"<<" 销售量"<<" 销售额"<<endl;
for(int k=1;k<=L.length;++k)
cout<<" "<<L.medicine[k].ID<<" "<<L.medicine[k].name<<" "<<L.medicine[k].price<<" "<<L.medicine[k].number<<" "<<L.medicine[k].sale<<endl;
cout<<"--------------------------------------------------------------------------"<<endl;
}
void Single(SqList &L,char cmp,int len,int index)
{
SqList T[len+1];
for(int i=0;i<=len;++i)
T[i].length=0;
for(int i=1;i<=L.length;++i)
{
int x=L.medicine[i].ID[index]-cmp;
T[x].medicine[++T[x].length]=L.medicine[i];
}
int k=0;
for(int i=0;i<=len;++i)
for(int j=1;j<=T[i].length;++j)
L.medicine[++k]=T[i].medicine[j];
}
void RadixSort(SqList &L)
{
for(int i=3;i>=1;--i)
Single(L,'0',9,i); /*药品后三位为数字型字符*/
Single(L,'A',25,0); /*第一位为大写字符*/
Print(L);
}
void BubbleSort(SqList &L)
{
for(int i=1;i<L.length;++i)
for(int j=i+1;j<=L.length;++j)
if(L.medicine[i].price>L.medicine[j].price)
{
L.medicine[0]=L.medicine[i];
L.medicine[i]=L.medicine[j];
L.medicine[j]=L.medicine[0];
} /*交换*/
Print(L);
}
int Partition(SqList &L,int low,int high)
{
L.medicine[0]=L.medicine[low];
int temp=L.medicine[low].number;
while(low<high)
{
while(low<high&&L.medicine[high].number>=temp)--high;
L.medicine[low]=L.medicine[high];
while(low<high&&L.medicine[low].number<=temp)++low;
L.medicine[high]=L.medicine[low];
}
L.medicine[low]=L.medicine[0];
return low;
}
void QSort(SqList &L,int low,int high)
{
if(low<high)
{
int mid=Partition(L,low,high);
QSort(L,low,mid-1);
QSort(L,mid+1,high);
}
}
void QuickSort(SqList &L)
{
QSort(L,1,L.length);
Print(L);
}
void HeapAdjust(SqList &L,int s,int m)
{
DateType rc=L.medicine[s];
for(int j=2*s;j<=m;j*=2)
{
if(j<m&&L.medicine[j].sale<L.medicine[j+1].sale)++j;
if(rc.sale>=L.medicine[j].sale)break;
L.medicine[s]=L.medicine[j];
s=j;
}
L.medicine[s]=rc;
}
void CreatHeap(SqList &L)
{
int n=L.length;
for(int i=n/2;i>0;--i)
HeapAdjust(L,i,n);
}
void HeapSort(SqList &L)
{
CreatHeap(L);
for(int i=L.length;i>1;--i)
{
DateType x=L.medicine[1];
L.medicine[1]=L.medicine[i];
L.medicine[i]=x;
HeapAdjust(L,1,i-1);
}
Print(L);
}
void Menu(SqList &L)
{
cout<<" -----------------------------------"<<endl;
cout<<" | 欢迎来到药品销售统计系统 |"<<endl;
cout<<" |-----------------------------------|"<<endl;
cout<<" | 1--编号->基数排序 |"<<endl;
cout<<" | 2--单价->冒泡排序 |"<<endl;
cout<<" | 3--销售量->快速排序 |"<<endl;
cout<<" | 4--销售额->堆排序 |"<<endl;
cout<<" | 其他--退出 |"<<endl;
cout<<" -----------------------------------"<<endl;
int op;
cout<<"输入你的选择:";
cin>>op;
switch(op)
{
case 1:RadixSort(L);break;
case 2:BubbleSort(L);break;
case 3:QuickSort(L);break;
case 4:HeapSort(L);break;
default :flag=1;cout<<"欢迎下次再来!"<<endl;
}
}
int main()
{
SqList L;
if(Read(L))
while(1)
{
Print(L);
Menu(L);
if(flag)break;
system("pause");
system("cls");
}
return 0;
}
[简单展示]