药店的药品销售统计系统(排序应用)
问题描述
设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号,单价,销售量或销售额做出排名。
实现提示
在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共4位,采用字母和数字混合编号,如:A125,前一位为大写字母,后三位为数字,按药品编号进行排序时,可采用基数排序法。对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。
需求分析
- 对药品单价的排序采用——冒泡排序
- 对药品销售量排序采用——快速排序
- 对药品销售额的排序用——堆排序
- 对药品编号的排序采用——基数排序
品信息的元素类型定义
typedef struct node //药品信息的元素类型定义
{
char num[30]; //药品的编号
char name[50]; //药品名称
float price; //药品单价
int amount; //销售量
float sales; //销售额
}Elemtype; //定义结构体类型(名称)
存储药品信息的顺序表的定义
typedef struct //存储药品信息的顺序表的定义
{
Elemtype data[Maxsize]; //定义Elemtype类型的结构体数组,存储Maxsize种药的信息 (存放顺序表的元素)
int length; //药品种类数 (顺序表的实际长度)
}Sqlist; //顺序表类型 (名称)
算法设计
首先需要定义一个顺序表类型指针L,并为这个指针L的指向动态分配内存空间。接着从文件里读取数据并存储到指针L所指向的内存空间。然后再把这些刚刚读取到的原始数据进行排序处理并显示出来。
因为要用到文件操作,所以需要将文件和程序放到一起
文件内容(药品数据)
源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Maxsize 100
typedef struct node //药品信息的元素类型定义
{
char num[30]; //药品的编号
char name[50]; //药品名称
float price; //药品单价
int amount; //销售量
float sales; //销售额
}Elemtype; //定义结构体类型(名称)
typedef struct //存储药品信息的顺序表的定义
{
Elemtype data[Maxsize]; //定义Elemtype类型的结构体数组,存储Maxsize种药的信息 (存放顺序表的元素)
int length; //药品种类数 (顺序表的实际长度)
}Sqlist; //顺序表类型 (名称)
/* 读取文件数据 */
void Read(Sqlist *L)
{
FILE *fp;
int i = 0;
if((fp = fopen("medicine.txt","r")) == NULL)
{
printf("Sorry! open file error!\n");
exit(0);
}
else
printf("文件读取成功\n");
while(fscanf(fp, "%s %s %f %d %f", &L->data[i].num, &L->data[i].name, &L->data[i].price, &L->data[i].amount, &L->data[i].sales) != EOF)
{
++i;
}
L->length = i;
fclose(fp);
}
/* 打印数据 */
void print(Sqlist *L)
{
int i;
printf("----------------------------------------------------------------------------------\n");
printf("药品种类数:%d\n",L->length);
printf("药品编号\t 药名\t\t 药品单价\t\t销售量\t\t销售额\n");
for(i = 0; i < L->length