数据结构期末大作业—— 预置菜订购系统
问题描述
预制菜,又称为预制调理食品, 一般指以各类农、畜、禽、水产品为原辅料,配以调味料等辅料,经预选、调制等工艺加工而成的半成品或成品。通常预制菜需要在冷链条件下贮存或运输,供消费者或餐饮环节加工者简单加热或烹饪后食用。现如今社会生活节奏加快,许多年轻人都习惯于订购预制菜作为自己日常三餐,例如:外卖、泡面等速食产品。预制菜也成为了当代人们新的生活方式。本设计解决的问题:为制作预制菜的饭店对菜单和顾客预定的方便管理。
设计内容
(1)输入菜品数据(菜名、价格、数量)放到文件里,可新增菜品,删除菜品,查看菜品库存;在顾客点单时可输出菜单信息,便于顾客浏览。
(2)能记录来订餐顾客信息(姓名、电话、已订菜名、总价格、领取日期),可实现顾客退订功能。
部分界面展示
程序模块
- 系统总界面
void ShowMenu();
void SaveToFile(Food* food_head, Order* order_head);
int main(void) {
Food* food_head = NULL;
Order* order_head = NULL;
Initialize(&food_head, &order_head);
int choice;
while (1) {
printf("欢迎使用预制菜点餐系统!\n");
printf("1. 菜品管理\n");
printf("2. 顾客订单管理\n");
printf("3. 退出\n");
printf("请输入菜单数字进行操作:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
while (1) {
printf("菜品管理:\n");
printf("1. 添加菜品\n");
printf("2. 删除菜品\n");
printf("3. 浏览菜单\n");
printf("4. 查看菜品库存\n");
printf("5. 返回\n");
printf("请输入菜单数字进行操作:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
AddFood(&food_head);
break;
case 2:
DeleteFood(&food_head);
break;
case 3:
DisplayMenu(food_head);
break;
case 4:
QueryMenu(food_head);
case 5:
goto endloop1;
default:
printf("输入错误,请重新选择!\n");
break;
}
}
endloop1:
break;
case 2:
while (1) {
printf("顾客订单管理:\n");
printf("1. 点餐\n");
printf("2. 浏览订单\n");
printf("3. 删除订单\n");
printf("4. 通过电话查找订单\n");
printf("5. 取消订单\n");
printf("6. 返回\n");
printf("请输入菜单数字进行操作:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
AddOrder(&order_head, food_head);
break;
case 2:
DisplayOrder(order_head);
break;
case 3:
DeleteOrder(&order_head);
break;
case 4:
SearchOrderByPhone(order_head);
break;
case 5:
CancelOrder(&order_head);
break;
case 6:
goto endloop2;
default:
printf("输入错误,请重新选择!\n");
break;
}
}
endloop2:
break;
case 3:
printf("谢谢光临!\n");
return 0;
default:
printf("输入错误,请重新选择!\n");
break;
}
}
return 0;
}
- 录入菜品
void AddFood(Food** food_head_ptr) {
char name[MAX_NAME_SZ];
float price;
int quantity;
int choice = 1;
while (choice != 0) {
printf("请输入菜名、价格、数量:\n");
scanf("%s%f%d", name, &price, &quantity);
Food* new_food = (Food*)malloc(sizeof(Food));
if (new_food == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
strcpy(new_food->name, name);
new_food->price = price;
new_food->quantity = quantity;
new_food->next = *food_head_ptr;
*food_head_ptr = new_food;
printf("添加成功!\n");
FILE* fp;
fp = fopen("menu7.txt", "a+");
if (fp == NULL) {
printf("文件打开失败!");
exit(EXIT_FAILURE);
}
fprintf(fp, "%s %.2f %d\n", name, price, quantity);
fclose(fp);
printf("是否继续添加菜品?(1:是,0:否)\n");
scanf("%d", &choice);
}
}
3.浏览菜单
void DisplayMenu(Food* food_head) {
if (food_head == NULL) {
printf("菜单为空!\n");
return;
}
printf("菜名\t价格\t数量\n");
while (food_head != NULL) {
printf("%s\t%.2f\t%d\n", food_head->name, food_head->price, food_head->quantity);
food_head = food_head->next;
}
}
- 删除菜品
void DeleteFood(Food** food_head_ptr) {
char name[MAX_NAME_SZ];
printf("请输入需要删除的菜名:\n");
scanf("%s", name);
Food* prev = NULL;
Food* curr = *food_head_ptr;
while (curr != NULL && strcmp(curr->name, name) != 0) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("该菜品不存在!\n");
}
else if (prev == NULL) {
*food_head_ptr = curr->next;
free(curr);
printf("删除成功!\n");
}
else {
prev->next = curr->next;
free(curr);
printf("删除成功!\n");
}
}
- 点单
void AddOrder(Order** order_head_ptr, Food* food_head) {
char name1[MAX_NAME_SZ];
char phone[MAX_NAME_SZ];
char collect_date[MAX_NAME_SZ];
int is_valid_date = 0;
int more = 1; // 是否继续下单的标志
while (more) {
printf("请输入顾客姓名:\n");
scanf("%s", name1);
printf("请输入顾客电话:\n");
scanf("%s", phone);
Order* new_order = (Order*)malloc(sizeof(Order));
if (new_order == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
Food* menu = NULL;
float total_price = 0;
int choice;
DisplayMenu(food_head);
do {
char food_name[MAX_NAME_SZ];
printf("请输入点餐菜品名称:\n");
scanf("%s", food_name);
Food* prev = NULL;
Food* curr = food_head;
while (curr != NULL && strcmp(curr->name, food_name) != 0) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("该菜品不存在!\n");
}
else {
int quantity;
printf("请输入点餐数量:\n");
scanf("%d", &quantity);
if (quantity > curr->quantity) {
printf("该菜品数量不足!\n");
}
else {
curr->quantity -= quantity;
total_price += (quantity * curr->price);
Food* new_food = (Food*)malloc(sizeof(Food));
if (new_food == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
strcpy(new_food->name, curr->name);
new_food->price = curr->price;
new_food->quantity = quantity;
new_food->next = NULL;
if (menu == NULL) {
menu = new_food;
}
else {
new_food->next = menu;
menu = new_food;
}
}
}
printf("是否继续点餐?(1:是,0:否)\n");
scanf("%d", &choice);
} while (choice != 0);
printf("请输入领取时间(yyyy-mm-dd):\n");
while (!is_valid_date) {
scanf("%s", collect_date);
if (strlen(collect_date) != 10 || collect_date[4] != '-' || collect_date[7] != '-') {
printf("时间格式不正确,请重新输入!\n");
continue;
}
is_valid_date = 1;
}
strcpy(new_order->name1, name1);
strcpy(new_order->phone, phone);
new_order->menu = menu;
new_order->total_price = total_price;
strcpy(new_order->collect_date, collect_date);
new_order->next = *order_head_ptr;
*order_head_ptr = new_order;
printf("下单成功!\n");
printf("总价为:%.2f\n", total_price);
printf("继续下单?(1:是,0:否)\n");
scanf("%d", &more);
is_valid_date = 0; // 重置 is_valid_date 的值
}
}
- 浏览订单
void DisplayOrder(Order* order_head) {
if (order_head == NULL) {
printf("订单为空!\n");
return;
}
printf("----------- 订单信息 -----------\n");
while (order_head != NULL) {
printf("姓名:\t%s\n", order_head->name1);
printf("电话:\t%s\n", order_head->phone);
printf("领取时间:%s\n", order_head->collect_date);
printf("已点餐品:\n");
printf("菜名\t价格\t数量\n");
Food* menu = order_head->menu;
while (menu != NULL) {
printf("%s\t%.2f\t%d\n", menu->name, menu->price, menu->quantity);
menu = menu->next;
}
printf("总价:\t%.2f\n", order_head->total_price);
printf("----------------------------\n");
order_head = order_head->next;
}
}
- 退订
void DeleteOrder(Order** order_head_ptr) {
char phone[MAX_NAME_SZ];
printf("请输入需要删除的顾客电话:\n");
scanf("%s", phone);
Order* prev = NULL;
Order* curr = *order_head_ptr;
while (curr != NULL && strcmp(curr->phone, phone) != 0) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("该订单不存在!\n");
}
else if (prev == NULL) {
*order_head_ptr = curr->next;
free(curr);
printf("删除成功!\n");
}
else {
prev->next = curr->next;
free(curr);
printf("删除成功!\n");
}
}
- 退订部分菜品
void CancelOrder(Order** order_head_ptr) {
char phone[MAX_NAME_SZ];
Order* prev_order = NULL;
Order* curr_order = *order_head_ptr;
int is_valid_date = 0;
while (1) { // 新增循环
printf("请输入需要取消的订单电话:\n");
scanf("%s", phone);
while (curr_order != NULL && strcmp(curr_order->phone, phone) != 0) {
prev_order = curr_order;
curr_order = curr_order->next;
}
if (curr_order == NULL) {
printf("该订单不存在!\n");
continue;
}
printf("请输入取消时间(yyyy-mm-dd):\n");
char date[MAX_NAME_SZ];
while (!is_valid_date) {
scanf("%s", date);
if (strlen(date) != 10 || date[4] != '-' || date[7] != '-') {
printf("时间格式不正确,请重新输入!\n");
continue;
}
is_valid_date = 1;
}
if (strcmp(curr_order->collect_date, date) > 0) {
printf("请输入要取消的菜品名称:\n");
char dish_name[MAX_NAME_SZ];
scanf("%s", dish_name);
Food* dish = curr_order->menu;
Food* prev_dish = NULL;
float total_price = 0;
int flag = 0;
while (dish != NULL) {
if (strcmp(dish->name, dish_name) == 0) {
--dish->quantity; // 仅退订一份
if (dish->quantity == 0) {
if (prev_dish == NULL) {
curr_order->menu = dish->next;
}
else {
prev_dish->next = dish->next;
}
free(dish);
}
printf("退订成功!\n");
flag = 1;
total_price = dish->price;
break;
}
prev_dish = dish;
dish = dish->next;
}
if (flag) {
printf("您剩下的点餐如下:\n");
DisplayMenu(curr_order->menu);
printf("您退订的菜品为:\n");
printf("菜名\t价格\t数量\n");
printf("%s\t%.2f\t%d\n", dish_name, total_price, 1);
printf("您需要退还的钱为:%.2f元\n", total_price);
curr_order->total_price -= total_price;
printf("您已支付的金额为:%.2f元\n", curr_order->total_price);
}else{
printf("取消失败,没有找到该菜品名称\n");
}
}
else {
printf("取消失败!只能在领取时间前一天内取消订单!\n");
}
break;
}
system("pause");
}
9.浏览订单
void SearchOrderByPhone(Order* order_head) {
if (order_head == NULL) {
printf("订单为空!\n");
return;
}
char phone[MAX_NAME_SZ];
printf("请输入顾客电话:\n");
scanf("%s", phone);
while (order_head != NULL) {
if (strcmp(order_head->phone, phone) == 0) {
printf("姓名:%s\n", order_head->name1);
printf("电话:%s\n", order_head->phone);
printf("领取时间:%s\n", order_head->collect_date);
printf("已点餐品:\n");
printf("菜名\t价格\t数量\n");
Food* menu = order_head->menu;
while (menu != NULL) {
printf("%s\t%.2f\t%d\n", menu->name, menu->price, menu->quantity);
menu = menu->next;
}
printf("总价:%.2f\n", order_head->total_price);
printf("----------------------------\n");
}
order_head = order_head->next;
}
}
- 查看库存
void QueryMenu(Food* food_head_ptr)
{
Food* curr = food_head_ptr;
printf("菜名\t库存\n");
while (curr != NULL) {
printf("%s\t%d\n", curr->name, curr->quantity);
curr = curr->next;
}
}
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_NAME_SZ 64
// 定义菜品结构体
typedef struct food {
char name[MAX_NAME_SZ]; //菜品名称
float price; //菜品单价
int quantity; //菜品数量
struct food* next;
} Food;
// 定义订单结构体
typedef struct order {
char name1[MAX_NAME_SZ]; //购买人姓名
char phone[MAX_NAME_SZ]; //购买人电话
Food* menu; //购买的菜品信息
float total_price; //总价
char collect_date[MAX_NAME_SZ]; //领取时间
struct order* next;
} Order;
// 节点初始化
void Initialize(Food** food_head_ptr, Order** order_head_ptr);
// 菜单相关功能函数
void AddFood(Food** food_head_ptr);
void DeleteFood(Food** food_head_ptr);
void DisplayMenu(Food* food_head);
void QueryMenu(Food* food_head_ptr);
// 订单相关功能函数
void AddOrder(Order** order_head_ptr, Food* food_head);
void DisplayOrder(Order* order_head);
void DeleteOrder(Order** order_head_ptr);
void SearchOrderByPhone(Order* order_head);
void CancelOrder(Order** order_head_ptr);
// 界面函数
void ShowMenu();
void SaveToFile(Food* food_head, Order* order_head);
int main(void) {
Food* food_head = NULL;
Order* order_head = NULL;
Initialize(&food_head, &order_head);
int choice;
while (1) {
printf("欢迎使用预制菜点餐系统!\n");
printf("1. 菜品管理\n");
printf("2. 顾客订单管理\n");
printf("3. 退出\n");
printf("请输入菜单数字进行操作:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
while (1) {
printf("菜品管理:\n");
printf("1. 添加菜品\n");
printf("2. 删除菜品\n");
printf("3. 浏览菜单\n");
printf("4. 查看菜品库存\n");
printf("5. 返回\n");
printf("请输入菜单数字进行操作:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
AddFood(&food_head);
break;
case 2:
DeleteFood(&food_head);
break;
case 3:
DisplayMenu(food_head);
break;
case 4:
QueryMenu(food_head);
case 5:
goto endloop1;
default:
printf("输入错误,请重新选择!\n");
break;
}
}
endloop1:
break;
case 2:
while (1) {
printf("顾客订单管理:\n");
printf("1. 点餐\n");
printf("2. 浏览订单\n");
printf("3. 删除订单\n");
printf("4. 通过电话查找订单\n");
printf("5. 取消订单\n");
printf("6. 返回\n");
printf("请输入菜单数字进行操作:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
AddOrder(&order_head, food_head);
break;
case 2:
DisplayOrder(order_head);
break;
case 3:
DeleteOrder(&order_head);
break;
case 4:
SearchOrderByPhone(order_head);
break;
case 5:
CancelOrder(&order_head);
break;
case 6:
goto endloop2;
default:
printf("输入错误,请重新选择!\n");
break;
}
}
endloop2:
break;
case 3:
printf("谢谢光临!\n");
return 0;
default:
printf("输入错误,请重新选择!\n");
break;
}
}
return 0;
}
void Initialize(Food** food_head_ptr, Order** order_head_ptr) {
*food_head_ptr = NULL;
*order_head_ptr = NULL;
// 从文件中读取菜单信息
FILE* fp1;
fp1 = fopen("menu7.txt", "r");
if (fp1 == NULL) {
printf("无法打开文件!\n");
return;
}
char name[MAX_NAME_SZ];
float price;
int quantity;
while (fscanf(fp1, "%s%f%d", name, &price, &quantity) != EOF) {
Food* new_food = (Food*)malloc(sizeof(Food));
if (new_food == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
strcpy(new_food->name, name);
new_food->price = price;
new_food->quantity = quantity;
new_food->next = *food_head_ptr;
*food_head_ptr = new_food;
}
fclose(fp1);
FILE* fp;
fp = fopen("menu_order7.txt", "r");
if (fp == NULL) {
//printf("无法打开订单文件!\n");
return;
}
char name1[MAX_NAME_SZ];
char phone[MAX_NAME_SZ];
char collect_date[MAX_NAME_SZ];
float total_price;
while (fscanf(fp, "%s%s%f%s", name1, phone, &total_price, collect_date) != EOF) {
Order* new_order = (Order*)malloc(sizeof(Order));
if (new_order == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
strcpy(new_order->name1, name1);
strcpy(new_order->phone, phone);
//new_order->menu = NULL;
new_order->total_price = total_price;
strcpy(new_order->collect_date, collect_date);
new_order->next = *order_head_ptr;
*order_head_ptr = new_order;
// 读取点餐信息
char food_name[MAX_NAME_SZ];
int quantity;
float price;
while (fscanf(fp, "%s%d%f", food_name, &quantity, &price) != EOF && strcmp(food_name, "-----") != 0) {
Food* new_food = (Food*)malloc(sizeof(Food));
if (new_food == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
strcpy(new_food->name, food_name);
new_food->quantity = quantity;
new_food->price = price;
new_food->next = new_order->menu;
new_order->menu = new_food;
}
}
fclose(fp);
}
void AddFood(Food** food_head_ptr) {
char name[MAX_NAME_SZ];
float price;
int quantity;
int choice = 1;
while (choice != 0) {
printf("请输入菜名、价格、数量:\n");
scanf("%s%f%d", name, &price, &quantity);
Food* new_food = (Food*)malloc(sizeof(Food));
if (new_food == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
strcpy(new_food->name, name);
new_food->price = price;
new_food->quantity = quantity;
new_food->next = *food_head_ptr;
*food_head_ptr = new_food;
printf("添加成功!\n");
FILE* fp;
fp = fopen("menu7.txt", "a+");
if (fp == NULL) {
printf("文件打开失败!");
exit(EXIT_FAILURE);
}
fprintf(fp, "%s %.2f %d\n", name, price, quantity);
fclose(fp);
printf("是否继续添加菜品?(1:是,0:否)\n");
scanf("%d", &choice);
}
}
void DeleteFood(Food** food_head_ptr) {
char name[MAX_NAME_SZ];
printf("请输入需要删除的菜名:\n");
scanf("%s", name);
Food* prev = NULL;
Food* curr = *food_head_ptr;
while (curr != NULL && strcmp(curr->name, name) != 0) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("该菜品不存在!\n");
}
else if (prev == NULL) {
*food_head_ptr = curr->next;
free(curr);
printf("删除成功!\n");
}
else {
prev->next = curr->next;
free(curr);
printf("删除成功!\n");
}
}
void DisplayMenu(Food* food_head) {
if (food_head == NULL) {
printf("菜单为空!\n");
return;
}
printf("菜名\t价格\t数量\n");
while (food_head != NULL) {
printf("%s\t%.2f\t%d\n", food_head->name, food_head->price, food_head->quantity);
food_head = food_head->next;
}
}
void QueryMenu(Food* food_head_ptr)
{
Food* curr = food_head_ptr;
printf("菜名\t库存\n");
while (curr != NULL) {
printf("%s\t%d\n", curr->name, curr->quantity);
curr = curr->next;
}
}
void AddOrder(Order** order_head_ptr, Food* food_head) {
char name1[MAX_NAME_SZ];
char phone[MAX_NAME_SZ];
char collect_date[MAX_NAME_SZ];
int is_valid_date = 0;
int more = 1; // 是否继续下单的标志
while (more) {
printf("请输入顾客姓名:\n");
scanf("%s", name1);
printf("请输入顾客电话:\n");
scanf("%s", phone);
Order* new_order = (Order*)malloc(sizeof(Order));
if (new_order == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
Food* menu = NULL;
float total_price = 0;
int choice;
DisplayMenu(food_head);
do {
char food_name[MAX_NAME_SZ];
printf("请输入点餐菜品名称:\n");
scanf("%s", food_name);
Food* prev = NULL;
Food* curr = food_head;
while (curr != NULL && strcmp(curr->name, food_name) != 0) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("该菜品不存在!\n");
}
else {
int quantity;
printf("请输入点餐数量:\n");
scanf("%d", &quantity);
if (quantity > curr->quantity) {
printf("该菜品数量不足!\n");
}
else {
curr->quantity -= quantity;
total_price += (quantity * curr->price);
Food* new_food = (Food*)malloc(sizeof(Food));
if (new_food == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
strcpy(new_food->name, curr->name);
new_food->price = curr->price;
new_food->quantity = quantity;
new_food->next = NULL;
if (menu == NULL) {
menu = new_food;
}
else {
new_food->next = menu;
menu = new_food;
}
}
}
printf("是否继续点餐?(1:是,0:否)\n");
scanf("%d", &choice);
} while (choice != 0);
printf("请输入领取时间(yyyy-mm-dd):\n");
while (!is_valid_date) {
scanf("%s", collect_date);
if (strlen(collect_date) != 10 || collect_date[4] != '-' || collect_date[7] != '-') {
printf("时间格式不正确,请重新输入!\n");
continue;
}
is_valid_date = 1;
}
strcpy(new_order->name1, name1);
strcpy(new_order->phone, phone);
new_order->menu = menu;
new_order->total_price = total_price;
strcpy(new_order->collect_date, collect_date);
new_order->next = *order_head_ptr;
*order_head_ptr = new_order;
printf("下单成功!\n");
printf("总价为:%.2f\n", total_price);
printf("继续下单?(1:是,0:否)\n");
scanf("%d", &more);
is_valid_date = 0; // 重置 is_valid_date 的值
}
}
void DisplayOrder(Order* order_head) {
if (order_head == NULL) {
printf("订单为空!\n");
return;
}
printf("----------- 订单信息 -----------\n");
while (order_head != NULL) {
printf("姓名:\t%s\n", order_head->name1);
printf("电话:\t%s\n", order_head->phone);
printf("领取时间:%s\n", order_head->collect_date);
printf("已点餐品:\n");
printf("菜名\t价格\t数量\n");
Food* menu = order_head->menu;
while (menu != NULL) {
printf("%s\t%.2f\t%d\n", menu->name, menu->price, menu->quantity);
menu = menu->next;
}
printf("总价:\t%.2f\n", order_head->total_price);
printf("----------------------------\n");
order_head = order_head->next;
}
}
void DeleteOrder(Order** order_head_ptr) {
char phone[MAX_NAME_SZ];
printf("请输入需要删除的顾客电话:\n");
scanf("%s", phone);
Order* prev = NULL;
Order* curr = *order_head_ptr;
while (curr != NULL && strcmp(curr->phone, phone) != 0) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("该订单不存在!\n");
}
else if (prev == NULL) {
*order_head_ptr = curr->next;
free(curr);
printf("删除成功!\n");
}
else {
prev->next = curr->next;
free(curr);
printf("删除成功!\n");
}
}
void SearchOrderByPhone(Order* order_head) {
if (order_head == NULL) {
printf("订单为空!\n");
return;
}
char phone[MAX_NAME_SZ];
printf("请输入顾客电话:\n");
scanf("%s", phone);
while (order_head != NULL) {
if (strcmp(order_head->phone, phone) == 0) {
printf("姓名:%s\n", order_head->name1);
printf("电话:%s\n", order_head->phone);
printf("领取时间:%s\n", order_head->collect_date);
printf("已点餐品:\n");
printf("菜名\t价格\t数量\n");
Food* menu = order_head->menu;
while (menu != NULL) {
printf("%s\t%.2f\t%d\n", menu->name, menu->price, menu->quantity);
menu = menu->next;
}
printf("总价:%.2f\n", order_head->total_price);
printf("----------------------------\n");
}
order_head = order_head->next;
}
}
void CancelOrder(Order** order_head_ptr) {
char phone[MAX_NAME_SZ];
Order* prev_order = NULL;
Order* curr_order = *order_head_ptr;
int is_valid_date = 0;
while (1) { // 新增循环
printf("请输入需要取消的订单电话:\n");
scanf("%s", phone);
while (curr_order != NULL && strcmp(curr_order->phone, phone) != 0) {
prev_order = curr_order;
curr_order = curr_order->next;
}
if (curr_order == NULL) {
printf("该订单不存在!\n");
continue;
}
printf("请输入取消时间(yyyy-mm-dd):\n");
char date[MAX_NAME_SZ];
while (!is_valid_date) {
scanf("%s", date);
if (strlen(date) != 10 || date[4] != '-' || date[7] != '-') {
printf("时间格式不正确,请重新输入!\n");
continue;
}
is_valid_date = 1;
}
if (strcmp(curr_order->collect_date, date) > 0) {
printf("请输入要取消的菜品名称:\n");
char dish_name[MAX_NAME_SZ];
scanf("%s", dish_name);
Food* dish = curr_order->menu;
Food* prev_dish = NULL;
float total_price = 0;
int flag = 0;
while (dish != NULL) {
if (strcmp(dish->name, dish_name) == 0) {
--dish->quantity; // 仅退订一份
if (dish->quantity == 0) {
if (prev_dish == NULL) {
curr_order->menu = dish->next;
}
else {
prev_dish->next = dish->next;
}
free(dish);
}
printf("退订成功!\n");
flag = 1;
total_price = dish->price;
break;
}
prev_dish = dish;
dish = dish->next;
}
if (flag) {
printf("您剩下的点餐如下:\n");
DisplayMenu(curr_order->menu);
printf("您退订的菜品为:\n");
printf("菜名\t价格\t数量\n");
printf("%s\t%.2f\t%d\n", dish_name, total_price, 1);
printf("您需要退还的钱为:%.2f元\n", total_price);
curr_order->total_price -= total_price;
printf("您已支付的金额为:%.2f元\n", curr_order->total_price);
}else{
printf("取消失败,没有找到该菜品名称\n");
}
}
else {
printf("取消失败!只能在领取时间前一天内取消订单!\n");
}
break;
}
system("pause");
}