用c语言编写一个程序模拟餐馆点餐系统。 1)用户分为管理员和用餐者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择。 2)用餐者菜单包括菜品分类(大类)、菜品列表(含每道菜品的构成信息)、点餐、付费、查询等功能。 3)管理员菜单包括菜品信息和用餐者信息录入、修改和删除。菜品信息至少应包括:编号、菜名、类别、价格等;用餐者信息至少应包括:编号、姓名、点餐信息、付费金额、用餐状态(就餐或打包)等。可根据菜品名称或编号进行菜品构成查询;可查询用餐者点餐情况、费用情况;可统计菜品的日点餐量、日营业额等(选做)。 命令行参数如下: Restb –a (-u) xxxx 第一个参数为可执行程序名称;第二个参数为用户身份,-a表示管理员,-u表示用餐者;第三个参数为用餐者名称,请写出详细框架

时间: 2023-06-10 21:07:25 浏览: 113
以下是一个简单的餐馆点餐系统的C语言实现,包含管理员和用餐者两类用户,并提供了菜品信息和用餐者信息的录入、修改和删除功能,以及查询和统计功能。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_MENU_ITEMS 100 // 菜单项最大数量 #define MAX_ORDERS 100 // 订单最大数量 #define MAX_NAME_LEN 20 // 名称最大长度 #define MAX_ITEM_NAME_LEN 30 // 菜品名称最大长度 #define MAX_ITEM_DESC_LEN 50 // 菜品描述最大长度 #define MAX_ORDER_ITEMS 10 // 订单中最大菜品数量 // 菜品信息结构体 typedef struct { int id; // 菜品编号 char name[MAX_ITEM_NAME_LEN]; // 菜品名称 char desc[MAX_ITEM_DESC_LEN]; // 菜品描述 char category[MAX_NAME_LEN]; // 菜品类别 float price; // 菜品价格 } MenuItem; // 订单菜品信息结构体 typedef struct { int id; // 菜品编号 int quantity; // 菜品数量 } OrderItem; // 订单信息结构体 typedef struct { int id; // 订单编号 char name[MAX_NAME_LEN];// 用餐者姓名 OrderItem items[MAX_ORDER_ITEMS]; // 订单菜品信息 int num_items; // 订单中菜品数量 float total_price; // 订单总金额 int dine_in; // 是否堂食(1表示堂食,0表示打包) } Order; // 菜单项结构体 typedef struct { char text[MAX_ITEM_NAME_LEN]; // 菜单项文本 int number; // 菜单项对应数字 } Menu; // 菜单项数组 Menu main_menu[] = { {"点餐", 1}, {"付款", 2}, {"查询订单", 3}, {"退出", 0} }; Menu admin_menu[] = { {"添加菜品", 1}, {"修改菜品", 2}, {"删除菜品", 3}, {"查询菜品", 4}, {"查询订单", 5}, {"统计信息", 6}, {"退出", 0} }; // 菜品数组 MenuItem menu_items[MAX_MENU_ITEMS]; int num_menu_items = 0; // 订单数组 Order orders[MAX_ORDERS]; int num_orders = 0; // 显示菜单项 void display_menu(Menu menu[], int num_items) { printf("--------------------------------\n"); for (int i = 0; i < num_items; i++) { printf("%d. %s\n", menu[i].number, menu[i].text); } printf("--------------------------------\n"); } // 显示菜品列表 void display_menu_items() { printf("--------------------------------\n"); printf("%-6s%-20s%-20s%-10s\n", "编号", "菜名", "类别", "价格"); printf("--------------------------------\n"); for (int i = 0; i < num_menu_items; i++) { printf("%-6d%-20s%-20s%-10.2f\n", menu_items[i].id, menu_items[i].name, menu_items[i].category, menu_items[i].price); } printf("--------------------------------\n"); } // 显示订单信息 void display_order(Order *order) { printf("--------------------------------\n"); printf("订单编号:%d\n", order->id); printf("用餐者姓名:%s\n", order->name); printf("菜品列表:\n"); printf("%-6s%-20s%-10s%-10s\n", "编号", "菜名", "数量", "价格"); for (int i = 0; i < order->num_items; i++) { printf("%-6d%-20s%-10d%-10.2f\n", order->items[i].id, menu_items[order->items[i].id - 1].name, order->items[i].quantity, menu_items[order->items[i].id - 1].price * order->items[i].quantity); } printf("总金额:%.2f\n", order->total_price); printf("堂食/打包:%s\n", order->dine_in ? "堂食" : "打包"); printf("--------------------------------\n"); } // 添加菜品 void add_menu_item() { if (num_menu_items >= MAX_MENU_ITEMS) { printf("菜单已满,无法添加菜品。\n"); return; } printf("请输入菜品信息:\n"); printf("菜品编号:"); scanf("%d", &menu_items[num_menu_items].id); printf("菜品名称:"); scanf("%s", menu_items[num_menu_items].name); printf("菜品描述:"); scanf("%s", menu_items[num_menu_items].desc); printf("菜品类别:"); scanf("%s", menu_items[num_menu_items].category); printf("菜品价格:"); scanf("%f", &menu_items[num_menu_items].price); num_menu_items++; printf("菜品添加成功!\n"); } // 修改菜品 void modify_menu_item() { int id; printf("请输入要修改的菜品编号:"); scanf("%d", &id); int found = 0; for (int i = 0; i < num_menu_items; i++) { if (menu_items[i].id == id) { printf("当前菜品信息为:\n"); printf("菜品编号:%d\n", menu_items[i].id); printf("菜品名称:%s\n", menu_items[i].name); printf("菜品描述:%s\n", menu_items[i].desc); printf("菜品类别:%s\n", menu_items[i].category); printf("菜品价格:%.2f\n", menu_items[i].price); printf("请输入新的菜品信息:\n"); printf("菜品名称:"); scanf("%s", menu_items[i].name); printf("菜品描述:"); scanf("%s", menu_items[i].desc); printf("菜品类别:"); scanf("%s", menu_items[i].category); printf("菜品价格:"); scanf("%f", &menu_items[i].price); printf("菜品修改成功!\n"); found = 1; break; } } if (!found) { printf("找不到指定的菜品。\n"); } } // 删除菜品 void delete_menu_item() { int id; printf("请输入要删除的菜品编号:"); scanf("%d", &id); int found = 0; for (int i = 0; i < num_menu_items; i++) { if (menu_items[i].id == id) { for (int j = i; j < num_menu_items - 1; j++) { menu_items[j] = menu_items[j + 1]; } num_menu_items--; printf("菜品删除成功!\n"); found = 1; break; } } if (!found) { printf("找不到指定的菜品。\n"); } } // 查询菜品 void search_menu_item() { char keyword[MAX_NAME_LEN]; printf("请输入要查询的菜品名称或编号:"); scanf("%s", keyword); int found = 0; printf("--------------------------------\n"); printf("%-6s%-20s%-20s%-10s\n", "编号", "菜名", "类别", "价格"); printf("--------------------------------\n"); for (int i = 0; i < num_menu_items; i++) { if (menu_items[i].id == atoi(keyword) || strstr(menu_items[i].name, keyword)) { printf("%-6d%-20s%-20s%-10.2f\n", menu_items[i].id, menu_items[i].name, menu_items[i].category, menu_items[i].price); found = 1; } } printf("--------------------------------\n"); if (!found) { printf("找不到指定的菜品。\n"); } } // 查询订单 void search_order() { char keyword[MAX_NAME_LEN]; printf("请输入要查询的用餐者姓名:"); scanf("%s", keyword); int found = 0; for (int i = 0; i < num_orders; i++) { if (strcmp(orders[i].name, keyword) == 0) { display_order(&orders[i]); found = 1; } } if (!found) { printf("找不到指定的订单。\n"); } } // 统计信息 void show_statistics() { int num_orders_today = 0; float total_sales_today = 0.0; int num_orders_dine_in = 0; float total_sales_dine_in = 0.0; int num_orders_take_out = 0; float total_sales_take_out = 0.0; for (int i = 0; i < num_orders; i++) { if (orders[i].dine_in) { num_orders_dine_in++; total_sales_dine_in += orders[i].total_price; } else { num_orders_take_out++; total_sales_take_out += orders[i].total_price; } if (orders[i].id / 10000 == 20220101) { num_orders_today++; total_sales_today += orders[i].total_price; } } printf("--------------------------------\n"); printf("当日点餐量:%d\n", num_orders_today); printf("当日营业额:%.2f\n", total_sales_today); printf("堂食订单量:%d\n", num_orders_dine_in); printf("堂食营业额:%.2f\n", total_sales_dine_in); printf("打包订单量:%d\n", num_orders_take_out); printf("打包营业额:%.2f\n", total_sales_take_out); printf("--------------------------------\n"); } // 点餐 void place_order(char *name) { Order order; order.id = num_orders + 1; strcpy(order.name, name); order.num_items = 0; order.total_price = 0.0; order.dine_in = 1; printf("请点餐,输入菜品编号和数量,以0结束:\n"); while (1) { int id, quantity; scanf("%d", &id); if (id == 0) { break; } if (order.num_items >= MAX_ORDER_ITEMS) { printf("订单中菜品数量已达上限,无法添加菜品。\n"); continue; } printf("请输入数量:"); scanf("%d", &quantity); order.items[order.num_items].id = id; order.items[order.num_items].quantity = quantity; order.num_items++; order.total_price += menu_items[id - 1].price * quantity; } printf("请选择用餐方式(1. 堂食,2. 打包):"); int option; scanf("%d", &option); if (option == 2) { order.dine_in = 0; } orders[num_orders] = order; num_orders++; printf("点餐成功,订单编号为%d。\n", order.id); } // 付款 void make_payment(char *name) { printf("请输入要付款的订单编号:"); int id; scanf("%d", &id); int found = 0; for (int i = 0; i < num_orders; i++) { if (orders[i].id == id && strcmp(orders[i].name, name) == 0) { display_order(&orders[i]); printf("请支付:%.2f元\n", orders[i].total_price); printf("付款成功!\n"); found = 1; break; } } if (!found) { printf("找不到指定的订单。\n"); } } int main(int argc, char *argv[]) { if (argc != 3) { printf("用法:%s -a/-u name\n", argv[0]); printf("选项:\n"); printf(" -a 以管理员身份登录\n"); printf(" -u 以用餐者身份登录\n"); return 1; } int is_admin = strcmp(argv[1], "-a") == 0; char *name = argv[2]; if (is_admin) { while (1) { display_menu(admin_menu, sizeof(admin_menu) / sizeof(Menu)); printf("请选择操作:"); int option; scanf("%d", &option); switch (option) { case 1: add_menu_item(); break; case 2: modify_menu_item(); break; case 3: delete_menu_item(); break; case 4: search_menu_item(); break; case 5: search_order(); break; case 6: show_statistics(); break; case 0: printf("谢谢使用!\n"); return 0; default: printf("无效的选项,请重新选择。\n"); break; } } } else { while (1) { display_menu(main_menu, sizeof(main_menu) / sizeof(Menu)); printf("请选择操作:"); int option; scanf("%d", &option); switch (option) { case 1: place_order(name); break; case 2: make_payment(name); break; case 3: search_order(); break; case 0: printf("谢谢光临!\n"); return 0; default: printf("无效的选项,请重新选择。\n"); break; } } } return 0; } ```

相关推荐

最新推荐

recommend-type

基于C语言实现点餐系统

主要为大家详细介绍了基于C语言实现点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

使用C语言编写圣诞表白程序

圣诞节快到了,让我们用C语言制作一个圣诞表白程序吧,下面通过本文学习下实现代码
recommend-type

C语言实现银行管理系统

主要为大家详细介绍了C语言实现银行管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C语言编写教务管理系统

C语言编写教务管理系统是使用C语言编写的一个教务管理系统,旨在帮助学校管理学生的基本信息和课程成绩。该系统具有录入、修改、删除、查询和统计等功能,可以满足学校的日常教学管理需求。 系统功能 1. 录入基本...
recommend-type

餐馆点菜系统C语言源代码

主要为大家详细介绍了餐馆点菜系统C语言源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

电容式触摸按键设计参考

"电容式触摸按键设计参考 - 触摸感应按键设计指南" 本文档是Infineon Technologies的Application Note AN64846,主要针对电容式触摸感应(CAPSENSE™)技术,旨在为初次接触CAPSENSE™解决方案的硬件设计师提供指导。文档覆盖了从基础技术理解到实际设计考虑的多个方面,包括电路图设计、布局以及电磁干扰(EMI)的管理。此外,它还帮助用户选择适合自己应用的合适设备,并提供了CAPSENSE™设计的相关资源。 文档的目标受众是使用或对使用CAPSENSE™设备感兴趣的用户。CAPSENSE™技术是一种基于电容原理的触控技术,通过检测人体与传感器间的电容变化来识别触摸事件,常用于无物理按键的现代电子设备中,如智能手机、家电和工业控制面板。 在文档中,读者将了解到CAPSENSE™技术的基本工作原理,以及在设计过程中需要注意的关键因素。例如,设计时要考虑传感器的灵敏度、噪声抑制、抗干扰能力,以及如何优化电路布局以减少EMI的影响。同时,文档还涵盖了器件选择的指导,帮助用户根据应用需求挑选合适的CAPSENSE™芯片。 此外,为了辅助设计,Infineon提供了专门针对CAPSENSE™设备家族的设计指南,这些指南通常包含更详细的技术规格、设计实例和实用工具。对于寻求代码示例的开发者,可以通过Infineon的在线代码示例网页获取不断更新的PSoC™代码库,也可以通过视频培训库深入学习。 文档的目录通常会包含各个主题的章节,如理论介绍、设计流程、器件选型、硬件实施、软件配置以及故障排查等,这些章节将逐步引导读者完成一个完整的CAPSENSE™触摸按键设计项目。 通过这份指南,工程师不仅可以掌握CAPSENSE™技术的基础,还能获得实践经验,从而有效地开发出稳定、可靠的触摸感应按键系统。对于那些希望提升产品用户体验,采用先进触控技术的设计师来说,这是一份非常有价值的参考资料。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB函数调用中的调试技巧大揭秘,快速定位并解决函数调用问题

![MATLAB函数调用中的调试技巧大揭秘,快速定位并解决函数调用问题](https://ucc.alicdn.com/pic/developer-ecology/ovk2h427k2sfg_f0d4104ac212436a93f2cc1524c4512e.png?x-oss-process=image/resize,s_500,m_lfit) # 1. MATLAB函数调用的基本原理** MATLAB函数调用是通过`function`关键字定义的,其语法为: ```matlab function [output1, output2, ..., outputN] = function_na
recommend-type

LDMIA r0!,{r4 - r11}

LDMIA是ARM汇编语言中的一条指令,用于从内存中加载多个寄存器的值。具体来说,LDMIA r0!,{r4 r11}的意思是从内存地址r0开始,连续加载r4到r11这8个寄存器的值[^1]。 下面是一个示例代码,演示了如何使用LDMIA指令加载寄器的值: ```assembly LDMIA r0!, {r4-r11} ;从内存地址r0开始,连续加载r4到r11这8个寄存器的值 ``` 在这个示例中,LDMIA指令将会从内存地址r0开始,依次将内存中的值加载到r4、r5、r6、r7、r8、r9、r10和r11这8个寄存器中。
recommend-type

西门子MES-系统规划建议书(共83页).docx

"西门子MES系统规划建议书是一份详细的文档,涵盖了西门子在MES(制造执行系统)领域的专业见解和规划建议。文档由西门子工业自动化业务部旗下的SISW(西门子工业软件)提供,该部门是全球PLM(产品生命周期管理)软件和SIMATIC IT软件的主要供应商。文档可能包含了 MES系统如何连接企业级管理系统与生产过程,以及如何优化生产过程中的各项活动。此外,文档还提及了西门子工业业务领域的概况,强调其在环保技术和工业解决方案方面的领导地位。" 西门子MES系统是工业自动化的重要组成部分,它扮演着生产过程管理和优化的角色。通过集成的解决方案,MES能够提供实时的生产信息,确保制造流程的高效性和透明度。MES系统规划建议书可能会涉及以下几个关键知识点: 1. **MES系统概述**:MES系统连接ERP(企业资源计划)和底层控制系统,提供生产订单管理、设备监控、质量控制、物料跟踪等功能,以确保制造过程的精益化。 2. **西门子SIMATIC IT**:作为西门子的MES平台,SIMATIC IT提供了广泛的模块化功能,适应不同行业的生产需求,支持离散制造业、流程工业以及混合型生产环境。 3. **产品生命周期管理(PLM)**:PLM软件用于管理产品的全生命周期,从概念设计到报废,强调协作和创新。SISW提供的PLM解决方案可能包括CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAE(计算机辅助工程)等工具。 4. **工业自动化**:西门子工业自动化业务部提供自动化系统、控制器和软件,提升制造业的效率和灵活性,包括生产线自动化、过程自动化和系统整体解决方案。 5. **全球市场表现**:SISW在全球范围内拥有大量客户,包括许多世界500强企业,表明其解决方案在业界的广泛应用和认可。 6. **中国及亚洲市场**:SISW在中国和亚洲其他新兴市场具有领先地位,特别是在CAD领域,反映了其在这些地区的重要影响力。 7. **案例研究**:文档可能包含实际案例,如通用汽车的全球产品开发项目,展示SISW技术在大型复杂项目中的应用能力。 这份建议书不仅对理解西门子MES系统有重要作用,也为企业在选择和实施MES系统时提供了策略性指导,有助于企业规划和优化其生产流程,实现更高效的制造业运营。