数据结构课设任务内容

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

回过头来已经写好了,但却发现我少了一步,没认真读题“按药品编号进行排序时,可采用基数排序法”,写药品编号进行排序时却是按照简单的直接插入排序,现在有点不想重新写入进去,下次再将这个部分的代码迭代掉吧!
看来我还是太懒了,😓太懒是不行的。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值