季&末 2023-04-04 19:26 采纳率: 80%
浏览 234
已结题

C语言实现餐厅点单系统

要求设计实现一个餐厅点餐系统,实现电子点餐。要求实现二级菜单:。
一级菜单: 请选择:
1.点餐
2.查看已点菜品
3.添菜
4.减菜
5.结算
0.退出
选择1.点餐后进入二级菜单:
1.宫保鸡丁10
2.酱爆鸭片 18
3.木须肉15
4.沸腾鱼88
5.手撕圆白菜12
6.麻婆豆腐8
7.小鸡炖蘑菇48
8.水晶肘子58
9.米饭3
0.香酥带鱼 25
a.返回
该系统完成以下功能:
1.点餐,进入点餐界面,选择菜品。
2.查看已点菜品,查看刚才点餐的结果。
3.添菜,在已点菜品的基础上增加菜品。
4.减菜,在已点菜品基础上减少菜品。
5.结算,根据已点菜品计算价格。
0.退出。

  • 写回答

12条回答 默认 最新

  • 秦_天明 2023-04-05 01:10
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 菜品结构体
    struct Dish {
        int id;             // 菜品编号
        char name[20];      // 菜品名称
        int price;          // 菜品价格
    };
    
    // 已点菜品结构体
    struct OrderedDish {
        int id;             // 菜品编号
        char name[20];      // 菜品名称
        int price;          // 菜品价格
        int quantity;       // 菜品数量
        struct OrderedDish* next;   // 指向下一个已点菜品的指针
    };
    
    // 菜品列表
    struct Dish dishList[] = {
        {1, "宫保鸡丁", 10},
        {2, "酱爆鸭片", 18},
        {3, "木须肉", 15},
        {4, "沸腾鱼", 88},
        {5, "手撕圆白菜", 12},
        {6, "麻婆豆腐", 8},
        {7, "小鸡炖蘑菇", 48},
        {8, "水晶肘子", 58},
        {9, "米饭", 3},
        {0, "香酥带鱼", 25}
    };
    int numDishes = sizeof(dishList) / sizeof(struct Dish);
    
    // 菜品数量
    int dishCount[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
    // 已点菜品列表头指针
    struct OrderedDish* orderedDishes = NULL;
    
    // 显示一级菜单
    void showMainMenu() {
        printf("\n请选择:\n");
        printf("1.点餐\n");
        printf("2.查看已点菜品\n");
        printf("3.添菜\n");
        printf("4.减菜\n");
        printf("5.结算\n");
        printf("0.退出\n");
    }
    
    // 显示二级菜单
    void showSubMenu() {
        printf("\n请选择菜品:\n");
        for (int i = 0; i < numDishes; i++) {
            printf("%d.%s%d元\n", i+1, dishList[i].name, dishList[i].price);
        }
        printf("a.返回\n");
    }
    
    // 选择菜品并加入已点菜品列表
    void orderDish(int dishIndex) {
        struct Dish dish = dishList[dishIndex];
        // 创建新的已点菜品节点
        struct OrderedDish* newDish = (struct OrderedDish*)malloc(sizeof(struct OrderedDish));
        newDish->id = dish.id;
       strcpy(newDish->name, dish.name);
    newDish->price = dish.price;
    newDish->quantity = 1;
    newDish->next = NULL;
    
    // 加入已点菜品列表
    if (orderedDishes == NULL) {
        orderedDishes = newDish;
    } else {
        struct OrderedDish* lastDish = orderedDishes;
        while (lastDish->next != NULL) {
            lastDish = lastDish->next;
        }
        lastDish->next = newDish;
    }
    
    printf("\n您点了一份%s\n", dish.name);
    
    }
    
    // 显示已点菜品列表
    void showOrderedDishes() {
    printf("\n已点菜品列表:\n");
    struct OrderedDish* dish = orderedDishes;
    while (dish != NULL) {
    printf("%d份%s%d元\n", dish->quantity, dish->name, dish->price);
    dish = dish->next;
    }
    }
    
    // 添菜
    void addDish(int dishIndex) {
    int id = dishList[dishIndex].id;
    for (int i = 0; i < numDishes; i++) {
    if (dishList[i].id == id) {
    dishCount[i]++;
    printf("\n成功添菜一份%s\n", dishList[i].name);
    return;
    }
    }
    }
    
    // 减菜
    void removeDish(int dishIndex) {
    int id = dishList[dishIndex].id;
    for (int i = 0; i < numDishes; i++) {
    if (dishList[i].id == id && dishCount[i] > 0) {
    dishCount[i]--;
    printf("\n成功减菜一份%s\n", dishList[i].name);
    return;
    }
    }
    }
    
    // 计算已点菜品的总价
    int calculateTotalPrice() {
    int totalPrice = 0;
    struct OrderedDish* dish = orderedDishes;
    while (dish != NULL) {
    totalPrice += dish->price * dish->quantity;
    dish = dish->next;
    }
    return totalPrice;
    }
    
    int main() {
    int choice, subChoice;
    while (1) {
    showMainMenu();
    printf("请选择操作:");
    scanf("%d", &choice);
    switch (choice) {
    case 0:
    printf("\n欢迎下次光临!\n");
    return 0;
    case 1:
    while (1) {
    showSubMenu();
    printf("请选择菜品:");
    char subChoiceStr[10];
    scanf("%s", subChoiceStr);
    subChoice = atoi(subChoiceStr);
    if (subChoice >= 1 && subChoice <= numDishes) {
    orderDish(subChoice - 1);
    } else if (subChoice == 0) {
    break;
    } else {
    printf("\n无效选择,请重新选择。\n");
    }
    }
    break;
    case 2:
    showOrderedDishes();
    break;
    case 3:
    while (1) {
    showSubMenu();
    printf("请选择菜品:");
    char subChoiceStr[10];
    scanf("%s", subChoiceStr);
    subChoice = atoi(subChoiceStr);
    if (subChoice >= 1 && subChoice <= numDishes) {
    addDish(subChoice - 1);
    } else if (subChoice == 0                ) {
                        break;
                    } else {
                        printf("\n无效选择,请重新选择。\n");
                    }
                }
                break;
            case 4:
                while (1) {
                    showSubMenu();
                    printf("请选择菜品:");
                    char subChoiceStr[10];
                    scanf("%s", subChoiceStr);
                    subChoice = atoi(subChoiceStr);
                    if (subChoice >= 1 && subChoice <= numDishes) {
                        removeDish(subChoice - 1);
                    } else if (subChoice == 0) {
                        break;
                    } else {
                        printf("\n无效选择,请重新选择。\n");
                    }
                }
                break;
            case 5:
                if (orderedDishes == NULL) {
                    printf("\n您还没有点餐,请先点餐。\n");
                    break;
                }
                int totalPrice = calculateTotalPrice();
                printf("\n已点菜品总价为%d元。\n", totalPrice);
                orderedDishes = NULL;
                memset(dishCount, 0, sizeof(dishCount));
                break;
            default:
                printf("\n无效选择,请重新选择。\n");
        }
    }
    return 0;
    
    
    

    这份代码实现了餐厅点餐系统的要求,其中主要包括以下几个功能:

    1. 显示一级菜单,提供点餐、查看已点菜品、添菜、减菜、结算和退出功能;
    2. 显示二级菜单,提供所有可供选择的菜品;
    3. 实现点餐功能,将已选择的菜品加入已点菜品列表;
    4. 实现查看已点菜品功能,显示已点菜品的列表;
    5. 实现添菜和减菜功能,增加或减少已点菜品列表中的菜品数量;
    6. 实现结算功能,根据已点菜品列表计算总价,清空已点菜品列表和菜品数量数组;
    7. 实现退出功能,结束程序的运行。

    希望这份代码能够对您有所帮助。如果您有任何问题或需要进一步的帮助,请随时告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月7日
  • 已采纳回答 4月6日
  • 创建了问题 4月4日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看