数据结构课程设计——药店的药品销售统计系统(排序应用)
藥店的藥品銷售統計系統(排序應用)
問題描述
設計一系統,實現醫藥公司定期對銷售各藥品的記錄進行統計,可按藥品的編號,單價,銷售量或銷售額做出排名。
實現提示
在本設計中,首先從數據文件中讀出各藥品的信息記錄,存儲在順序表中。各藥品的信息包括:藥品編號、藥名、藥品單價、銷出數量、銷售額。藥品編號共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);}elseprintf("文件讀取成功\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;i ++){printf("%s\t\t %s\t\t %0.1f\t\t %d\t\t %0.1f\n",L->data[i].num, L->data[i].name, L->data[i].price, L->data[i].amount, L->data[i].sales);}printf("----------------------------------------------------------------------------------\n\n"); }/* 基數排序算法 */ void Single(Sqlist *L,char cmp,int len,int index) {int i, x;Sqlist T[len+1];for(i = 0; i <= len; ++ i)T[i].length = 0;for(i = 1; i < L->length; ++ i){x = L->data[i].num[index] - cmp;T[x].data[++T[x].length] = L->data[i];}int k = 0, j;for(i = 0; i <= len; ++ i)for(j = 1; j <= T[i].length; ++ j)L->data[++k] = T[i].data[j]; } /* 基數排序實現 */ void Radixsort(Sqlist *L) {int i;for(i = 3; i >= 1; -- i)Single(L,'0',9,i); /*藥品后三位為數字型字符*/Single(L,'A',25,0); /*第一位為大寫字符*/printf("按照藥品編號排序(基數排序)后的結果為:\n");print(L);printf(">>Enter鍵返回主界面\n");system("pause");system("cls"); }/* 冒泡排序 */ void Bubblesort(Sqlist *L) {int i, j;Elemtype tmp;for(i = 0; i < L->length-1; i ++) //控制排序趟數 length為藥品種類數,因為排序到length-1次最后一位數實際上已經是最大值 {for(j = L->length-1; j > i; j --) //從最后一位往前排,此時i為需要排序的最前面一位 {if(L->data[j].price < L->data[j - 1].price){tmp = L->data[j]; //交換Elemtype類型的結構體 L->data[j]= L->data[j-1];L->data[j-1]= tmp;} }} printf("按藥品單價排序(冒泡排序)后如下:\n");print(L);printf(">>>Enter鍵返回主菜單\n");system("pause"); system("cls"); //清屏操作 }/* 快速排序 */ void Quicksort(Sqlist *L, int s, int t) {int i = s, j = t;Elemtype tmp;if(s < t){tmp = L->data[s];while(i != j){while(j > i && L->data[j].amount >= tmp.amount)j --;L->data[i] = L->data[j];while(i < j && L->data[i].amount <= tmp.amount)i ++;L->data[j]= L->data[i];}L->data[i] = tmp;Quicksort(L, s, i-1);Quicksort(L, i+1, t);} }/* 篩選法調整堆*/ void Sift(Elemtype R[], int low, int high) //對L->data[low...high]進行篩選 {int i = low, j = 2 * i; //L->data[j]是L->data[i]的左孩子 Elemtype tmp = R[i];while(j <= high){if(j < high && R[j].sales < R[j + 1].sales)j ++; //若右孩子較大,把j指向右孩子 if(tmp.sales < R[j].sales){R[i] = R[j]; //將L->data[j]調整到雙親結點位置上 i = j; //修改i和j的值,以便繼續向下篩選 j = 2 * i;}else break; //已經是大根堆,篩選結束 }R[i] = tmp; //被篩選的結點的值放入最終位置 } /* 堆排序 */ /* 因為堆排序時數組的下標是從1開始,因此這里我們用重新定義的結構體數組 */ void Heapsort(Sqlist *L,Elemtype R[], int n) {int i;Elemtype tmp;for(i = n/2; i >= 1; i --) //n/2次循環建立初始堆 Sift(R, i, n);for(i = n; i >= 2; i --) //進行n - 1 次循環,完成堆排序 {tmp = R[1]; //R[1] 和R[i]交換 R[1] = R[i];R[i] = tmp;Sift(R, 1, i-1); //篩選 } /* 打印排序完之后的數據信息 */ printf("按藥品銷售額排序(冒堆排序)后如下:\n"); printf("----------------------------------------------------------------------------------\n");printf("藥品種類數:%d\n",L->length);printf("藥品編號\t 藥名\t\t 藥品單價\t\t銷售量\t\t銷售額\n");for(i = 1; i < L->length;i ++){printf("%s\t\t %s\t\t %0.1f\t\t %d\t\t %0.1f\n",R[i].num, R[i].name, R[i].price, R[i].amount, R[i].sales);}printf("----------------------------------------------------------------------------------\n\n");printf(">>>Enter鍵返回主菜單\n");system("pause");system("cls"); }/* 顯示主菜單 */ void Menu() {printf("\n");printf("*--------------------藥店的藥品銷售統計系統--------------------*\n");printf("* 1.按藥品編號排序(基數排序) *\n");printf("* 2.按藥品單價排序(冒泡排序) *\n");printf("* 3.按藥品銷售量排序(快速排序) *\n");printf("* 4.按藥品銷售額排序(堆排序) *\n");printf("* 5.退出系統 *\n");printf("*--------------------------------------------------------------*\n");printf(">>>請輸入您的選擇:\n"); }int main() {int a, i;Sqlist *L; //定義指向順序表類型的指針Elemtype R[Maxsize]; //定義一個結構體數組 L = (Sqlist *)malloc(sizeof(Sqlist)); //給指針L指向的地址動態分配存儲空間 Read(L);print(L);for(i = 0; i < L->length; i ++) //R[]用于存放堆排序時的各藥品的數據信息 R[i + 1] = L->data[i];while(1){Menu();scanf("%d",&a);printf("\n");switch(a) //多分支選擇結構 {case 1 : Radixsort(L); break;case 2 : Bubblesort(L); break;case 3 : Quicksort(L,0,L->length-1);printf("按藥品銷售量排序(快速排序)后如下:\n");print(L);printf("Enter鍵返回主菜單\n");system("pause");system("cls"); break;case 4 : Heapsort(L, R, L->length); break;case 5 : exit(0); break;default: {printf("\n您的輸入有誤,請進入主界面重新輸入\n");printf(">>>Enter重新輸入\n");system("pause");printf("\n"); system("cls"); //清屏操作break;}}}return 0; }簡單展示
如果對你有所幫助就是對博主最好的支持!
最后,想要PPT的童鞋可以私信我哦!
總結
以上是生活随笔為你收集整理的数据结构课程设计——药店的药品销售统计系统(排序应用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2710):重读vue电商网站
- 下一篇: 歌谣--回顾2020 展望2021