当前位置:文档之家› 餐厅管理系统

餐厅管理系统

程序实践报告(C语言)东北大学软件学院一、程序实践概述1、题目名称:餐厅信息管理程序2、3、开发环境:Microsoft visual studio 20055二、问题分析1、功能说明:(1)实现客户的点菜过程,客户结帐,帐目的管理,餐厅系统的维护。

(2)能够生成文本文件来完成数据的存储与读取,完成帐单的管理。

2、解决方案:(1)使用三种不同的结构体来分别存储餐桌,菜单以及订单信息。

(2)使用链表来实现创建客户订单与客户结帐等操作。

三、方案设计1、数据结构:(1)订单结构体typedef struct Order{int Table_ID; //记录餐桌号int Dish_ID[N]; //记录菜的信息int Dish_State[N];struct Order *next;}ORDER;(2)餐桌结构体typedef struct Table{int Table_ID; //餐桌编号int Capacity; //餐桌最多能容纳的人数int Table_State; //1 有人在用,0 没人用}TABLE;(3)菜的结构体typedef struct Dish{int Dish_ID; //菜的编名char Dish_Name[10]; //菜名float Dish_Price; //价格}DISH;(4)2、总体流程:Menu_select()-Load_Dish()Dish_Order(ORDER*CreateOne)Payment(head)List_Management()ListMenu()ModifyPW()Observe()Menu_select()Get_Rank()⑴点菜功能的实现先调用search()函数,查找客户所需要的餐桌,找到后调用Dish_Menu()函数打印菜谱,接着调用Create(float)函数创建一个订单节点,最后调用Dish_Order()函数,将新创建的订单链到链表表尾;⑵结账功能的实现先让客户输入自己就餐的编号,根据编号查找客户消费的具体情况,并调用Display ()函数打印客户点的菜的信息,接着调用Save_Inform()函数将订单信息写入历史记录文本文件中进行保存,作为统计的基础,然后调用saveList()函数将客户消费总额和消费的具体时间存入名为“账本”的文件中,作为账目管理的基础;⑶账目管理调用void List_Management()函数并且通过密码验证,进入ListMenu()函数。

选1,调用ModifyPW()函数进行密码修改;选2,调用Observe()函数查看账单;选3,返回;⑷餐厅统计通过调用Get_Rank()函数,打印近期比较受欢迎的十道菜2、关键算法:结账ORDER *Payment(ORDER *head){int i=0;int count=0;float pay=0.0;float Pay;int ID;ORDER *p,*p1; //声明文件指针p=head;printf("请输入您的餐桌号\n");fflush(stdin);scanf("%d",&ID); //用户输入餐桌号while(p!=NULL) //运用指针打印出客户点的菜{if(p->Table_ID==ID){printf("您点菜的情况如下:\n");printf("编号\t菜名\t价格\n");while(p->Dish_ID[i]!=0) //用循环语句打印出{Display(p->Dish_ID[i]);pay+=dish[p->Dish_ID[i]-1].Dish_Price;i++;count++;} //跳出循环printf("您一共点了%d道菜\n",count);printf("您本次消费额为%f元\n",pay);printf("您实际的付款:\n");scanf("%f",&Pay);if(Pay>pay)printf("找您%f\n",Pay-pay);printf("谢谢您的惠顾,欢迎下次光临\n");if(count>0){saveInList(pay);Save_Inform(p,count);}tb[p->Table_ID].Table_State=0;break;}else{p1=p;p=p->next;}}if(p==head)head=head->next;elsep1->next=p->next;free(p);return head;}4、界面设计:五、创新说明通过对函数的多次修正,减少了程序使用过程中链表的遍历链表的次数,提高了效率,使用大量指针,简单明了,快速定位。

六、体会与建议做这个程序时遇到了非常多的困难,同学们的帮助和老师的指导给了我很大的信心,通过自己一点一点的努力,终于完成了。

我觉得这个程序太大了,一个人做不但很困难,而且在许多相似的地方,因为思维的有限,有时只能按一种模式处理,如果我们是分小组完成这样的程序,不但能培养我们的合作精神,也更有利于程序的完善。

代码#include <stdio.h>#include <conio.h>#include <string.h>#include <stdlib.h>#include <time.h>#define N 10#define D 10#define H 10#define ASK (ORDER*)malloc(sizeof(ORDER))#define MaxCapacity 4//定义订单结构体typedef struct Order{int Table_ID; //记录餐桌号int Dish_ID[N]; //记录菜的信息int Dish_State[N];struct Order *next;}ORDER;//定义餐桌结构体typedef struct Table{int Table_ID; //餐桌编号int Capacity; //餐桌最多能容纳的人数int Table_State; //1 有人在用,0 没人用}TABLE;//定义菜的结构体typedef struct Dish{int Dish_ID; //菜的编名char Dish_Name[10]; //菜名float Dish_Price; //价格}DISH;TABLE tb[H]; //餐桌结构体数组DISH dish[D]; //菜的结构体数组int PASSWORD=123; //密码设置//函数设置void Load_Dish(void); //从文件中读取菜谱ORDER*CreateOne(int); //创建一个订单节点void Dish_Menu(void); //显示菜谱void Table_Init(void); //餐桌信息初始化int search(void); //查找匹配的餐桌ORDER* Dish_Order(ORDER *,ORDER *); //将节点添加到主链void Dishplay(int); //显示菜的信息void saveInList(float); //将客户消费额写入账单void Save_Inform(ORDER *,int); //将已结账订单信息写入历史记录ORDER *Payment(ORDER *); //结账void ModifyPW(void); //密码修改int Pass_Word(void); //密码验证void Observe(void); //账目查询void ListMenu(void); //账单管理菜单void List_Management(void); //账单管理void Main_Menu(void); //主菜单void Get_Rank(void); //统计void Menu_select(void); //选择功能//主函数int main(){puts("1");Table_Init();puts("2");Menu_select();system("pause");}//系统主菜单void Main_Menu(){printf("\n*********************\n");printf("餐厅服务系统\n");printf("*********************\n");printf("1.点菜\n");printf("2.客户结账\n");printf("3.账目管理\n");printf("4.餐厅统计\n");printf("5.退出系统\n");}//选择功能void Menu_select(void){ORDER* head;int choose;int result;head=NULL;system("cls");do{Load_Dish();Main_Menu();printf("请选择:\n");fflush(stdin);scanf("%d",&choose);//system("cls");switch(choose){case 1:result=search();if(result==1)printf("您可以到%d号餐桌就餐\n",result);elseprintf("您和您的朋友可以到%d号餐桌就餐\n",result);Dish_Menu();head=Dish_Order(head,CreateOne(result));//system("cls");break;case 2:head=Payment(head);break;case 3:List_Management();break;case 4:Get_Rank();break;case 5:exit(1);break;}}while(1);}//从文件中读取菜谱void Load_Dish(void){FILE *fp;int i;fp=fopen("dish_name.txt","r");for(i=0;i<D;i++){fscanf(fp,"%d\t%s\t%f\n",&dish[i].Dish_ID,dish[i].Dish_Name,&dish[i].Dish_Pric e);}}//餐桌初始化void Table_Init(){tb[0].Capacity=1;tb[0].Table_ID=1;tb[1].Capacity=1;tb[1].Table_ID=2;tb[2].Capacity=2;tb[2].Table_ID=3;tb[3].Capacity=2;tb[3].Table_ID=4;tb[4].Capacity=2;tb[4].Table_ID=5;tb[5].Capacity=3;tb[5].Table_ID=6;tb[6].Capacity=4;tb[6].Table_ID=7;tb[7].Capacity=4;tb[7].Table_ID=8;tb[8].Capacity=4;tb[8].Table_ID=9;tb[9].Capacity=4;tb[9].Table_ID=10;}//显示菜谱void Dish_Menu(void){int i;printf("*********欢迎选购本店菜*********\n");printf("菜编号\t菜名\t菜单价\n");for(i=0;i<D;i++)printf("%d\t%s\t%f\n",dish[i].Dish_ID,dish[i].Dish_Name,dish[i].Dish_Price );}//查找有没有匹配的餐桌int search(void){int Cust_Num;int i;printf("请输入来客数量:\n");scanf("%d",&Cust_Num);if(MaxCapacity<Cust_Num){printf("抱歉,本店没有容纳%d的餐桌!",Cust_Num);return -1;}while(Cust_Num<=MaxCapacity){for(i=0;i<H;i++){if(tb[i].Table_State==0){if(tb[i].Capacity==Cust_Num)return (tb[i].Table_ID);}}printf("抱歉,现在没有%d人桌",Cust_Num);Cust_Num+=1;}printf("餐桌已满,请客人稍等一会儿。

相关主题