数据结构期末大作业——预置菜订购系统(C语言无可视化完整代码)

数据结构期末大作业—— 预置菜订购系统

问题描述

预制菜,又称为预制调理食品, 一般指以各类农、畜、禽、水产品为原辅料,配以调味料等辅料,经预选、调制等工艺加工而成的半成品或成品。通常预制菜需要在冷链条件下贮存或运输,供消费者或餐饮环节加工者简单加热或烹饪后食用。现如今社会生活节奏加快,许多年轻人都习惯于订购预制菜作为自己日常三餐,例如:外卖、泡面等速食产品。预制菜也成为了当代人们新的生活方式。本设计解决的问题:为制作预制菜的饭店对菜单和顾客预定的方便管理。

设计内容

(1)输入菜品数据(菜名、价格、数量)放到文件里,可新增菜品,删除菜品,查看菜品库存;在顾客点单时可输出菜单信息,便于顾客浏览。
(2)能记录来订餐顾客信息(姓名、电话、已订菜名、总价格、领取日期),可实现顾客退订功能。

部分界面展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序模块

  1. 系统总界面
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;
}
  1. 录入菜品
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;
    }
}
  1. 删除菜品
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");
    }
}
  1. 点单
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 的值 
    }
}
  1. 浏览订单
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;
    }
}
  1. 退订
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");
    }
}

  1. 退订部分菜品
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;
    }
}
  1. 查看库存
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");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值