數據結構課程設計: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;

 

[設計思路]

 

  1. 從文件中讀入數據
  2. 基數排序
  3. 冒泡排序
  4. 快速排序
  5. 堆排序

[文件內容]

[代碼及註釋]

#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;
}

[簡單展示]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章