在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共4位,采用字母和数字混合编号,如:A125,前一位为大写字母,后三位为数字,按药品编号进行排序时,可采用基数排序法。对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。用c语言写出代码
时间: 2023-09-13 09:10:12 浏览: 97
嵌入式系统/ARM技术中的SOPC在数据发生系统中的应用
以下是药品管理系统的C语言代码,包括读取数据、排序以及输出结果等功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 1000 // 最大记录数
// 药品信息结构体
typedef struct Drug {
char id[5]; // 药品编号
char name[30]; // 药品名称
float price; // 药品单价
int quantity; // 销售数量
float sales; // 销售额
} Drug;
// 基数排序
void radix_sort(Drug arr[], int n) {
int i, j, k;
int radix = 10; // 基数
int count[radix]; // 每个桶中元素个数
Drug *temp = (Drug *)malloc(n * sizeof(Drug)); // 临时数组
// 从低位到高位依次进行排序
for (k = 0; k < 3; k++) {
// 清空桶中元素个数
memset(count, 0, sizeof(count));
// 统计每个桶中元素个数
for (i = 0; i < n; i++) {
j = arr[i].id[k] - '0';
count[j]++;
}
// 计算每个桶右边界索引
for (i = 1; i < radix; i++) {
count[i] += count[i-1];
}
// 将元素插入到桶中
for (i = n-1; i >= 0; i--) {
j = arr[i].id[k] - '0';
temp[count[j]-1] = arr[i];
count[j]--;
}
// 将排好序的元素复制回原数组
for (i = 0; i < n; i++) {
arr[i] = temp[i];
}
}
free(temp);
}
// 冒泡排序
void bubble_sort(Drug arr[], int n) {
int i, j;
Drug temp;
for (i = 0; i < n-1; i++) {
for (j = 0; j < n-i-1; j++) {
if (arr[j].price > arr[j+1].price) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
// 快速排序
void quick_sort(Drug arr[], int left, int right) {
int i, j;
float pivot;
Drug temp;
if (left < right) {
i = left;
j = right;
pivot = arr[left].quantity;
while (i < j) {
while (i < j && arr[j].quantity <= pivot) {
j--;
}
if (i < j) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
while (i < j && arr[i].quantity >= pivot) {
i++;
}
if (i < j) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[i].quantity = pivot;
quick_sort(arr, left, i-1);
quick_sort(arr, i+1, right);
}
}
// 堆排序
void heap_sort(Drug arr[], int n) {
int i;
Drug temp;
// 建立大根堆
for (i = n/2-1; i >= 0; i--) {
adjust_heap(arr, i, n);
}
// 交换堆顶元素和末尾元素,再重新调整堆
for (i = n-1; i > 0; i--) {
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
adjust_heap(arr, 0, i);
}
}
// 调整堆
void adjust_heap(Drug arr[], int i, int n) {
int j;
Drug temp;
temp = arr[i];
j = 2*i + 1;
while (j < n) {
if (j+1 < n && arr[j].sales < arr[j+1].sales) {
j++;
}
if (arr[j].sales > temp.sales) {
arr[i] = arr[j];
i = j;
j = 2*i + 1;
} else {
break;
}
}
arr[i] = temp;
}
int main() {
Drug drugs[MAX_SIZE]; // 药品信息数组
int n = 0; // 药品数量
int i;
// 读取数据文件
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
printf("Failed to open file!\n");
exit(1);
}
while (!feof(fp) && n < MAX_SIZE) {
fscanf(fp, "%s %s %f %d %f", drugs[n].id, drugs[n].name, &drugs[n].price, &drugs[n].quantity, &drugs[n].sales);
n++;
}
fclose(fp);
// 按药品编号进行排序
radix_sort(drugs, n);
// 按药品单价进行排序
bubble_sort(drugs, n);
// 按销售数量进行排序
quick_sort(drugs, 0, n-1);
// 按销售额进行排序
heap_sort(drugs, n);
// 输出结果
printf("药品编号\t药品名称\t药品单价\t销售数量\t销售额\n");
for (i = 0; i < n; i++) {
printf("%s\t%s\t%.2f\t%d\t%.2f\n", drugs[i].id, drugs[i].name, drugs[i].price, drugs[i].quantity, drugs[i].sales);
}
return 0;
}
```
其中,`radix_sort()`函数实现基数排序,`bubble_sort()`函数实现冒泡排序,`quick_sort()`函数实现快速排序,`heap_sort()`函数实现堆排序,`adjust_heap()`函数实现调整堆。在`main()`函数中,首先读取数据文件中的药品信息,然后分别按药品编号、药品单价、销售数量、销售额进行排序,并输出结果。
阅读全文