藥店的藥品銷售統計系統(排序應用)
要用到文件操作,使用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<stdlib.h>
#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;
}
[簡單展示]