#include stdioh#include stdlibh#include stringh#includewindowsh#include conioh#define MAX_MENU_SIZE 50 菜单最大数量 菜品结构体typedef struct char name20; 菜品名称 int code; 菜品编码 float price; 菜品价格 Dish; 菜单结构体
以下为修改过的程序:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #include <conio.h> #define MAX_MENU_SIZE 50 // 菜单最大数量
// 菜品结构体 typedef struct { char name[20]; // 菜品名称 int code; // 菜品编码 float price; // 菜品价格 } Dish;
// 菜单结构体 typedef struct { Dish dishes[MAX_MENU_SIZE]; // 菜品数组 int count; // 菜品数量 } Menu;
// 添加菜品 void addDish(Menu* menu) { Dish dish; printf(" \n"); printf("| |\n"); printf("|-------------菜单---------------|\n"); printf("|-------1.鱼子酱-价格:300-------|\n"); printf("|-------2.冰淇淋-价格:40 -------|\n"); printf("|-------3.葱烧海参-价格:200-----|\n"); printf("|-------4.菲力牛排-价格:350-----|\n"); printf("|-------5.三文鱼寿司-价格:300---|\n"); printf("|-------6.鱼翅-价格:600---------|\n"); printf("|-------7.麻辣香锅-价格:50-------|\n"); printf("||\n"); printf("请输入菜品名称:"); scanf("%s", dish.name); printf("请输入菜品编码:"); scanf("%d", &dish.code); printf("请输入菜品价格:"); scanf("%f", &dish.price);
if (menu->count >= MAX_MENU_SIZE) { printf("菜单已满,无法添加菜品!\n"); } else { menu->dishes[menu->count++] = dish; printf("菜品添加成功!\n"); } }
// 删除菜品 void deleteDish(Menu* menu) { int code, index = -1; printf("请输入要删除的菜品编码:"); scanf("%d", &code);
for (int i = 0; i < menu->count; i++) { if (menu->dishes[i].code == code) { index = i; break; } }
if (index == -1) { printf("没有找到要删除的菜品!\n"); } else { for (int i = index; i < menu->count - 1; i++) { menu->dishes[i] = menu->dishes[i + 1]; } menu->count--; printf("菜品删除成功!\n"); } }
// 针对数组中的区间[left, right]进行快速排序 void quickSort(Dish dishes[], int left, int right) { if (left >= right) { return; }
int i = left; // 左指针 int j = right; // 右指针 Dish pivot = dishes[left]; // 基准值
while (i < j) { // 从右往左找第一个小于基准值的元素 while (i < j && dishes[j].price >= pivot.price) { j--; } if (i < j) { dishes[i++] = dishes[j]; }
// 从左往右找第一个大于基准值的元素
while (i < j && dishes[i].price <= pivot.price) {
i++;
}
if (i < j) {
dishes[j--] = dishes[i];
}
}
// 将基准值放到中间位置 dishes[i] = pivot;
// 对基准值的左右两个子区间分别进行快速排序 quickSort(dishes, left, i - 1); quickSort(dishes, i + 1, right); }
// 按菜品价格排序 void sortByPrice(Menu* menu) { quickSort(menu->dishes, 0, menu->count - 1); printf("按价格排序完成!\n"); }
// 折半插入排序 void binaryInsertionSort(Dish arr[], int n) { for (int i = 1; i < n; i++) { Dish temp = arr[i]; int left = 0; // 已经排序好的左边界 int right = i - 1; // 已经排序好的右边界
// 找到要插入位置的下标
while (left <= right) {
int mid = (left + right) / 2;
if (temp.code < arr[mid].code) {
right = mid - 1;
} else {
left = mid + 1;
}
}
// 把要插入的元素后移,空出插入位置
for (int j = i - 1; j >= left; j--) {
arr[j + 1] = arr[j];
}
// 把要插入的元素插入到对应位置
arr[left] = temp;
} }
// 按菜品编码排序 void sortByCode(Menu* menu) { binaryInsertionSort(menu->dishes, menu->count); printf("按编码排序完成!\n"); }
// 遍历菜单 void traverseMenu(Menu* menu) { printf("菜单:\n"); if (menu->count != 0) { for (int i = 0; i < menu->count; i++) { printf("%s\t%d\t%.2f元\n", menu->dishes[i].name, menu->dishes[i].code, menu->dishes[i].price); } } else { printf("当前未点餐\n"); } }
// 保存菜单 void saveMenu(Menu* menu) { FILE* file = fopen("menu.txt", "w"); if (file != NULL) { for (int i = 0; i < menu->count; i++) { fprintf(file, "%s %d %.2f\n", menu->dishes[i].name, menu->dishes[i].code, menu->dishes[i].price); } fclose(file); printf("菜单保存成功!\n"); } else { printf("菜单保存失败!\n"); } }
// 加载菜单 void loadMenu(Menu* menu
原文地址: https://www.cveoy.top/t/topic/g5AZ 著作权归作者所有。请勿转载和采集!