当前位置: 首页 > article >正文

C语言之饭店外卖信息管理系统


🌟 嗨,我是LucianaiB!

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。



C语言之饭店外卖信息管理系统

目录

  1. 设计题目
  2. 设计目的
  3. 设计任务描述
  4. 设计要求
  5. 输入和输出要求
  6. 验收要求
  7. 进度安排
  8. 系统分析
  9. 总体设计
  10. 详细设计
  11. 程序实现
  12. 测试数据和运行结果
  13. 日志
  14. 总结与思考
  15. 参考文献

设计题目

饭店外卖信息管理系统


设计目的

  1. 加深学生对课程基础知识和基本理论的理解,培养学生独立分析和解决问题的能力。
  2. 培养学生在计算机软硬件开发、理论计算、查阅资料等方面的能力,树立正确的设计思想。
  3. 加强理论联系实际,培养学生科学严谨、实事求是的工作作风和创新精神。

设计任务描述

某饭店为了扩大营业范围,增加了外卖送餐业务。同城顾客可以通过移动端订餐,饭店按照顾客的订单要求及时送餐上门。外卖点餐的主要信息包括:订单号、顾客电话、姓名、地址、订餐时间、所订菜单信息、订餐总金额等。设计一个饭店外卖信息管理系统,要求完成以下功能:

  1. 菜单信息管理:录入、修改饭店菜单的相关信息(编号、菜名、单价)。
  2. 订餐业务:顾客查看菜单信息,完成订餐并付费。
    • 订单号由系统自动生成。
    • 付费金额在100200元之间,餐费打9.5折;200300元,打9折;300元以上打8.5折。
  3. 取消订餐:若饭店在规定时间内(如2小时)未能及时送餐,顾客可取消订餐。
  4. 订单查询:饭店可按订单号、订餐时间、电话等多种形式查询订单信息。
  5. 统计查询:统计显示当日菜单上所有菜的订单数;统计并显示当日外卖的营业额。

设计要求

  1. 按照分析、设计、编码、调试和测试的软件开发过程独立完成系统。
  2. 应用模块化编程思想,各项功能分别用函数实现。
  3. 系统功能设计成菜单形式,用户通过菜单选择操作。

输入和输出要求

  1. 系统界面友好、直观、易操作。
  2. 用户根据提示输入数据。
  3. 输入数据时提供清晰的提示信息。
  4. 处理完成后,清楚地显示运行结果。

验收要求

  1. 运行所设计的系统。
  2. 回答有关问题。
  3. 提交课程设计报告。
  4. 提交源程序。

进度安排

  1. 系统分析、设计准备阶段:6学时
  2. 编程调试阶段:26学时
  3. 总结和书写报告阶段:6学时
  4. 考核阶段:2学时

系统分析

饭店外卖信息管理系统旨在简化外卖订单的处理流程,提高饭店的运营效率,同时为顾客提供便捷的订餐服务。系统需要实现以下功能:

  • 菜单信息管理
  • 订餐业务
  • 取消订餐
  • 订单查询
  • 统计查询

总体设计

系统采用模块化设计,主要模块包括:

  1. 菜单信息管理模块:添加、修改和删除菜单项。
  2. 顾客信息管理模块:管理顾客的基本信息。
  3. 订单处理模块:处理顾客的订餐请求。
  4. 订单取消模块:允许顾客在规定时间内取消订单。
  5. 订单查询模块:按订单号、订餐时间、电话等查询订单。
  6. 营业统计模块:统计当日订单数量和营业额。
  7. 折扣应用模块:根据订单金额自动应用折扣。
  8. 用户界面模块:提供友好的用户界面。
  9. 数据持久化模块:将数据存储到文件系统。
  10. 安全与权限模块:实现用户权限控制。

详细设计

3.1 数据结构设计

typedef struct {
    int id;           // 菜品ID
    char name[50];    // 菜品名称
    float price;      // 菜品价格
} MenuItem;

typedef struct {
    int order_id;                     // 订单ID
    char customer_phone[20];          // 顾客电话
    char customer_name[50];           // 顾客姓名
    char address[100];                // 顾客地址
    char order_time[20];              // 订单时间
    MenuItem items[MAX_MENU];         // 订单包含的菜品列表
    int items_count;                  // 订单中菜品的数量
    float total_amount;               // 订单总金额
} Order;

3.2 函数接口设计

void addMenuItem();                   // 添加菜单项
void modifyMenuItem(int id);          // 修改菜单项
void displayMenu();                   // 显示菜单
void placeOrder();                    // 下订单
void cancelOrder(int order_id);       // 取消订单
void searchOrderByID(int order_id);   // 通过订单ID搜索订单
void searchOrderByPhone(const char *phone); // 通过电话号码搜索订单
void statistics();                    // 统计信息
void applyDiscount(float *amount);    // 应用折扣
void printOrder(const Order *order);  // 打印订单详情
void clearOrder(Order *order);        // 清除订单数据

3.3 主要函数流程图

1
2
3
4
5
6
开始
显示主菜单
用户选择
添加/修改菜单项
下订单
取消订单
搜索订单
统计信息
退出系统
结束

在这里插入图片描述

程序实现

4.1 源代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_MENU 100
#define MAX_ORDER 100

typedef struct {
    int id;
    char name[50];
    float price;
} MenuItem;

typedef struct {
    int order_id;
    char customer_phone[20];
    char customer_name[50];
    char address[100];
    char order_time[20];
    MenuItem items[MAX_MENU];
    int items_count;
    float total_amount;
} Order;

MenuItem menu[MAX_MENU] = {0};
Order orders[MAX_ORDER] = {0};
int menu_count = 0;
int order_count = 0;

void addMenuItem() {
    if (menu_count >= MAX_MENU) {
        printf("菜单已满,无法添加更多菜品。\n");
        return;
    }
    printf("输入菜品ID,名称和价格: ");
    scanf("%d %49s %f", &menu[menu_count].id, menu[menu_count].name, &menu[menu_count].price);
    menu_count++;
}

void displayMenu() {
    printf("菜单:\n");
    for (int i = 0; i < menu_count; i++) {
        printf("%d. %s - $%.2f\n", menu[i].id, menu[i].name, menu[i].price);
    }
}

void placeOrder() {
    if (order_count >= MAX_ORDER) {
        printf("订单数量已达上限,无法下新订单。\n");
        return;
    }
    int item_id;
    float total = 0;
    orders[order_count].items_count = 0;
    displayMenu();
    printf("输入顾客的电话、姓名、地址和下单时间: ");
    scanf("%19s %49s %9
9s %19s", orders[order_count].customer_phone, orders[order_count].customer_name, orders[order_count].address, orders[order_count].order_time);
    while (1) {
        printf("输入菜品ID(0结束): ");
        scanf("%d", &item_id);
        if (item_id == 0) break;
        for (int i = 0; i < menu_count; i++) {
            if (menu[i].id == item_id) {
                if (orders[order_count].items_count < MAX_MENU) {
                    orders[order_count].items[orders[order_count].items_count++] = menu[i];
                    total += menu[i].price;
                } else {
                    printf("一个订单中不能添加超过 %d 个菜品。\n", MAX_MENU);
                    break;
                }
            }
        }
    }
    applyDiscount(&total);
    orders[order_count].total_amount = total;
    orders[order_count].order_id = order_count + 1;
    printf("订单成功创建。订单ID: %d\n", orders[order_count].order_id);
    order_count++;
}

void applyDiscount(float *amount) {
    if (*amount > 300) *amount *= 0.85f;
    else if (*amount > 200) *amount *= 0.9f;
    else if (*amount > 100) *amount *= 0.95f;
}

void printOrder(const Order *order) {
    if (order == NULL) {
        printf("订单为空。\n");
        return;
    }
    printf("订单ID: %d\n", order->order_id);
    printf("顾客电话: %s\n", order->customer_phone);
    printf("顾客姓名: %s\n", order->customer_name);
    printf("地址: %s\n", order->address);
    printf("下单时间: %s\n", order->order_time);
    if (order->items_count == 0) {
        printf("该订单没有包含任何菜品。\n");
    } else {
        printf("订单项:\n");
        for (int i = 0; i < order->items_count; i++) {
            printf(" - %s ($%.2f)\n", order->items[i].name, order->items[i].price);
        }
    }
    printf("总金额: $%.2f\n", order->total_amount);
}

int main() {
    int choice;
    do {
        printf("\n1. 添加/修改菜单项\n2. 下订单\n3. 取消订单\n4. 搜索订单\n5. 统计信息\n6. 退出\n");
        printf("输入你的选择: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                addMenuItem();
                break;
            case 2:
                placeOrder();
                break;
            case 3:
                printf("输入要取消的订单ID: ");
                scanf("%d", &choice);
                cancelOrder(choice);
                break;
            case 4:
                printf("通过 (1) 订单ID 或 (2) 电话号码搜索: ");
                scanf("%d", &choice);
                if (choice == 1) {
                    int order_id;
                    printf("输入订单ID: ");
                    scanf("%d", &order_id);
                    searchOrderByID(order_id);
                } else if (choice == 2) {
                    char phone[20];
                    printf("输入电话号码: ");
                    scanf("%s", phone);
                    searchOrderByPhone(phone);
                }
                break;
            case 5:
                statistics();
                break;
            case 6:
                printf("退出系统.\n");
                break;
            default:
                printf("无效选择,请重新输入.\n");
        }
    } while (choice != 6);
    return 0;
}

4.2 测试数据和运行结果

测试数据
  1. 添加菜单项:

    输入菜品ID,名称和价格: 1 Pizza 15.99
    输入菜品ID,名称和价格: 2 Burger 9.99
    
  2. 下订单:

    输入顾客的电话、姓名、地址和下单时间: 1234567890 John Doe 123 Main St 2024-06-01 12:00
    输入菜品ID(0结束): 1
    输入菜品ID(0结束): 2
    输入菜品ID(0结束): 0
    
  3. 查询订单:

    输入订单ID: 1
    
  4. 取消订单:

    输入要取消的订单ID: 1
    
  5. 统计信息:

    今日总收入: $25.98
    Pizza 被订购了 1 次。
    Burger 被订购了 1 次。
    

总结与思考

优点

  1. 功能完善:系统涵盖了菜单管理、订单处理、订单查询、统计信息等核心功能。
  2. 数据持久化:程序利用文件系统实现了数据的持久化存储。

改进方向

  1. 数据完整性:系统尚未实现将所有相关信息存储到文件中,导致后台查询时需要额外调用计费函数。
  2. 安全性问题:当前系统缺乏密码机制,存在安全隐患。
  3. 用户体验:系统界面需要进一步优化,提升用户体验。

参考文献

  1. C语言课程设计 第3版
  2. C程序设计实训教程 第2版
  3. C语言从入门到项目实战

附录代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define MAX_MENU 100  // 定义菜单项的最大数量

#define MAX_ORDER 100 // 定义订单的最大数量



// 定义菜单项结构体

typedef struct {

    int id;            // 菜品ID

    char name[50];     // 菜品名称

    float price;       // 菜品价格

} MenuItem;



// 定义订单结构体

typedef struct {

    int order_id;      // 订单ID

    char customer_phone[20];  // 顾客电话

    char customer_name[50];    // 顾客姓名

    char address[100];         // 顾客地址

    char order_time[20];       // 订单时间

    MenuItem items[MAX_MENU]; // 订单包含的菜品列表

    int items_count;           // 订单中菜品的数量

    float total_amount;        // 订单总金额

} Order;



// 定义全局变量

MenuItem menu[MAX_MENU] = {0};

Order orders[MAX_ORDER] = {0};

int menu_count = 0;

int order_count = 0;



// 函数声明

void addMenuItem();                // 添加菜单项

void modifyMenuItem(int id);       // 修改菜单项

void displayMenu();                // 显示菜单

void placeOrder();                  // 下订单

void cancelOrder(int order_id);     // 取消订单

void searchOrderByID(int order_id); // 通过订单ID搜索订单

void searchOrderByPhone(const char *phone); // 通过电话号码搜索订单

void statistics();                  // 统计信息

void applyDiscount(float *amount);  // 应用折扣

void printOrder(const Order *order); // 打印订单详情

void clearOrder(Order *order);      // 清除订单数据



// 主函数

int main() {

    int choice;

    do {

        printf("\n1. 添加/修改菜单项\n2. 下订单\n3. 取消订单\n4. 搜索订单\n5. 统计信息\n6. 退出\n");

        printf("输入你的选择: ");

        scanf("%d", &choice);



        switch (choice) {

            case 1:

                addMenuItem();

                break;

            case 2:

                placeOrder();

                break;

            case 3:

                printf("输入要取消的订单ID: ");

                scanf("%d", &choice);

                cancelOrder(choice);

                break;

            case 4:

                printf("通过 (1) 订单ID 或 (2) 电话号码搜索: ");

                scanf("%d", &choice);

                if (choice == 1) {

                    int order_id;

                    printf("输入订单ID: ");

                    scanf("%d", &order_id);

                    searchOrderByID(order_id);

                } else if (choice == 2) {

                    char phone[20];

                    printf("输入电话号码: ");

                    scanf("%s", phone);

                    searchOrderByPhone(phone);

                }

                break;

            case 5:

                statistics();

                break;

            case 6:

                printf("退出系统.\n");

                break;

            default:

                printf("无效选择,请重新输入.\n");

        }

    } while (choice != 6);



    return 0;

}



// 添加菜单项

void addMenuItem() {

    if (menu_count >= MAX_MENU) {

        printf("菜单已满,无法添加更多菜品。\n");

        return;

    }

    printf("输入菜品ID,名称和价格: ");

    scanf("%d %49s %f", &menu[menu_count].id, menu[menu_count].name, &menu[menu_count].price);

    menu_count++;

}



// 修改菜单项

void modifyMenuItem(int id) {

    for (int i = 0; i < menu_count; i++) {

        if (menu[i].id == id) {

            printf("输入新的名称和价格: ");

            scanf("%49s %f", menu[i].name, &menu[i].price);

            return;

        }

    }

    printf("未找到菜品。\n");

}



// 显示菜单

void displayMenu() {

    printf("菜单:\n");

    for (int i = 0; i < menu_count; i++) {

        printf("%d. %s - $%.2f\n", menu[i].id, menu[i].name, menu[i].price);

    }

}



// 下订单

void placeOrder() {

    if (order_count >= MAX_ORDER) {

        printf("订单数量已达上限,无法下新订单。\n");

        return;

    }



    int item_id;

    float total = 0;

    orders[order_count].items_count = 0;

    displayMenu();



    printf("输入顾客的电话、姓名、地址和下单时间: ");

    scanf("%19s %49s %99s %19s", orders[order_count].customer_phone, orders[order_count].customer_name, orders[order_count].address, orders[order_count].order_time);



    while (1) {

        printf("输入菜品ID(0结束): ");

        scanf("%d", &item_id);

        if (item_id == 0) break;



        for (int i = 0; i < menu_count; i++) {

            if (menu[i].id == item_id) {

                if (orders[order_count].items_count < MAX_MENU) {

                    orders[order_count].items[orders[order_count].items_count++] = menu[i];

                    total += menu[i].price;

                } else {

                    printf("一个订单中不能添加超过 %d 个菜品。\n", MAX_MENU);

                    break;

                }

            }

        }

    }



    applyDiscount(&total);

    orders[order_count].total_amount = total;

    orders[order_count].order_id = order_count + 1; // 简单的订单ID生成逻辑

    printf("订单成功创建。订单ID: %d\n", orders[order_count].order_id);

    order_count++;

}



// 取消订单

void cancelOrder(int order_id) {

    for (int i = 0; i < order_count; i++) {

        if (orders[i].order_id == order_id) {

            printf("订单 %d 已取消。\n", order_id);

            clearOrder(&orders[i]); // 清除订单数据

            for (int j = i; j < order_count - 1; j++) {

                memcpy(&orders[j], &orders[j + 1], sizeof(Order));

            }

            order_count--;

            return;

        }

    }

    printf("未找到订单。\n");

}



// 通过订单ID搜索订单

void searchOrderByID(int order_id) {

    int found = 0; // 用于标记是否找到订单

    for (int i = 0; i < order_count; i++) {

        if (orders[i].order_id == order_id) {

            printOrder(&orders[i]);

            found = 1; // 标记找到订单

            break;

        }

    }

    if (!found) {

        printf("没有找到订单。\n");

    }

}



// 通过电话号码搜索订单

void searchOrderByPhone(const char *phone) {

    int found = 0; // 用于标记是否找到订单

    for (int i = 0; i < order_count; i++) {

        if (strcmp(orders[i].customer_phone, phone) == 0) {

            printOrder(&orders[i]);

            found = 1; // 标记找到订单

        }

    }

    if (!found) {

        printf("没有找到该电话号码的订单。\n");

    }

}



// 统计信息

void statistics() {

    // 示例统计信息 - 可以根据实际需求扩展

    int order_count_per_item[MAX_MENU] = {0};

    float total_revenue = 0;



    for (int i = 0; i < order_count; i++) {

        total_revenue += orders[i].total_amount;

        for (int j = 0; j < orders[i].items_count; j++) {

            int item_id = orders[i].items[j].id;

            order_count_per_item[item_id]++;

        }

    }



    printf("今日总收入: %.2f\n", total_revenue);

    for (int i = 0; i < menu_count; i++) {

        if (order_count_per_item[menu[i].id] > 0) {

            printf("%s 被订购了 %d 次。\n", menu[i].name, order_count_per_item[menu[i].id]);

        }

    }

}



// 应用折扣

void applyDiscount(float *amount) {

    if (*amount > 300) *amount *= 0.85f;

    else if (*amount > 200) *amount *= 0.9f;

    else if (*amount > 100) *amount *= 0.95f;

}



// 打印订单详情

void printOrder(const Order *order) {

    if (order == NULL) {

        printf("订单为空。\n");

        return;

    }



    // 打印订单头部信息

    printf("订单ID: %d\n", order->order_id);

    printf("顾客电话: %s\n", order->customer_phone);

    printf("顾客姓名: %s\n", order->customer_name);

    printf("地址: %s\n", order->address);

    printf("下单时间: %s\n", order->order_time);

   

    // 检查是否有订单项

    if (order->items_count == 0) {

        printf("该订单没有包含任何菜品。\n");

    } else {

        printf("订单项:\n");

        for (int i = 0; i < order->items_count; i++) {

            // 打印每个订单项的名称和价格

            printf(" - %s ($%.2f)\n", order->items[i].name, order->items[i].price);

        }

    }



    // 打印订单总金额

    printf("总金额: $%.2f\n", order->total_amount);

}

// 清除订单数据

void clearOrder(Order *order) {

    memset(order, 0, sizeof(Order));

}

嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。


http://www.kler.cn/a/513112.html

相关文章:

  • 微软预测 AI 2025,AI Agents 重塑工作形式
  • .Net Core微服务入门全纪录(五)——Ocelot-API网关(下)
  • 前端面试题-问答篇-5万字!
  • 大模型GUI系列论文阅读 DAY2续:《一个具备规划、长上下文理解和程序合成能力的真实世界Web代理》
  • 网络安全:信息时代的守护者
  • 二十三种设计模式-装饰器模式
  • RabbitMQ1-消息队列
  • npm install卡住执行不下去的问题
  • GAN - 生成对抗网络:生成新的数据样本
  • 高等数学学习笔记 ☞ 定积分与积分公式
  • 使用repo下载android源码,Ubuntu安装repo
  • pdf与ofd的区别详细对比
  • vue+arcgis api for js实现地图测距的分段统计线段长度
  • SQLmap 自动注入 -02
  • 【服务器报错】libGL.so.1: cannot open shared object file:
  • 记录一次排查服务器硬盘资源不足的过程
  • OFD 套版生成原理与 C# 实现详解
  • PyQt 异步任务 多线程的几种方案
  • linux-NFS网络共享存储服务配置
  • 深度学习进展
  • 档案事业与数据要素之间有什么关系?
  • vue3组件传值具体使用
  • AI软件栈:中间表示
  • MySQL 8.4及以上版本压缩包安装 windows
  • Java中的几个元老 Object Class 和 @Retention
  • 使用 Helm 部署 RabbitMQ 高可用集群(HA)