5、药店的药品销售统计系统(排序应用)

                                      药店的药品销售统计系统(排序应用)

此报告要用到文件操作,本人使用CodeBlocks,建议放到同一目录下

5、药店的药品销售统计系统(排序应用)

[问题描述]

 

设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号、单价、销售量或销售额做出排名。

 

[实现提示]

 

在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共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. 堆排序

[文件内容]

5、药店的药品销售统计系统(排序应用)

[代码及注释]

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

[简单展示]

5、药店的药品销售统计系统(排序应用)