使用C语言怎么实现一个餐饮点餐管理系统?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储器。
具体代码如下
//当注册用户名为:root,密码为:root的账号时,系统默认为初始管理员 //头文件 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> #include<windows.h> #include<string.h> //宏定义区 #define M sizeof(struct User)//用户表的大小 #define N sizeof(struct stapleFood)//主食 表大小 #define P sizeof(struct non_stapleFood)//副食表大小 #define Q sizeof(struct Drink_beverage) //饮品表大小 #define X sizeof(struct Table)//餐桌表大小 #define Y sizeof(struct Form)//订单表大小 //结构体 struct User //用户表 { char userName[10];//用户名 char passWord[18];//密码 int isVIP;//会员标记 int isAdministrator;//管理员标记 float money;//余额 struct User *next;//指针域 }; typedef struct User user; typedef user* pUser; struct stapleFood //主食 { char name[20]; float price; struct stapleFood *next; }; typedef struct stapleFood staple_food; typedef staple_food *pStapleFood; struct non_stapleFood //副食 { char name[20]; float price; struct non_stapleFood *next; }; typedef struct non_stapleFood non_staple_food; typedef non_staple_food *pNon_stapleFood; struct Drink_beverage //饮品 { char name[20]; float price; struct Drink_beverage *next; }; typedef struct Drink_beverage drinkBeverage; typedef drinkBeverage *pDrinkBeverage; struct Table //餐桌 { int ID;//餐桌编号 int People;//已坐人数 int count;//可容纳人数 char Username[10];//订餐人 struct Table *next; }; typedef struct Table table; typedef table *pTable; struct Form //订单 { char name[20]; float price; struct Form *next; }; typedef struct Form orderForm; typedef orderForm *pOrder; //自定义函数区 //用户客户端 void Default();//欢迎界面 void User_Login();//用户登录界面 void Logon();//注册界面 pUser readUserFile();//从文件中读取用户信息,返回一个表头地址 void save_User(pUser p1);//将用户信息保存到文件中 void User_Menu();//用户菜单 void User_Order();//点餐 void Order_StapleFood();//主食 void Order_nonStapleFood();//副食 void Order_DrinkBeverage();//饮品 void Order_Form(int ID,int number);//订单 void User_List_Table();//餐桌列表 void Apply_VIP_Menu();//会员办理菜单 void Add_money(pUser head);//充值 void Updata_User(pUser head);//更新用户表 void Apply_VIP(pUser head);//办理会员 void User_Wallet();//我的钱包 //管理员客户端 void Administrator_Menu();//管理员菜单 void Administrator_Login();//管理员登录 void Check_User();//查看用户 void Find_User();//查找用户 void All_User();//查看所有用户 void All_VIP();//本店会员 void Setup_administrator();//设置管理员 void Food();//菜品信息 void Add_Food();//添加菜单 void save_stapleFood(pStapleFood p);//保存主食信息 void save_non_stapleFood(pNon_stapleFood p);//保存副食信息 void save_drinkBeverage(pDrinkBeverage p);//保存饮品信息 pStapleFood readStapleFoodFile();//从主食文件中读取用户信息,返回一个表头地址 pNon_stapleFood readNonStapleFoodFile();//从副食文件中读取用户信息,返回一个表头地址 pDrinkBeverage readDrinkBeverageFile();//从饮品文件中读取用户信息,返回一个表头地址 void Table();//餐桌管理 void Add_Table();//添加餐桌 void save_Table(pTable p);//保存餐桌信息 pTable readTableFile(); //从餐桌文件中读取用户信息,返回一个表头地址 void Clear_Table();//清理餐桌 void Clear_oneTable();//清理指定餐桌 void Clear_allTable();//清理所有餐桌 void Updata_Table(pTable head);//更新餐桌文件 void Administrator_List_Table();//餐桌列表 //公共函数 void toxy(int x,int y);//将光标移动到x,y坐标处 void HideCursor(int x);//隐藏光标 char *HidePassword();//隐藏密码 void Exit();//退出系统 void Change();//切换账号 void Amend_passWord();//修改密码 void List_Food();//菜单列表 //全局变量区 char _userName[10]; char _passWord[18];//记录当前用户 pOrder orderHead=NULL,p2=NULL;//记录当前用户的订单 int num=0; //函数实现区 void toxy(int x,int y)//将光标移动到x,y坐标处 { COORD pos={x,y}; HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out,pos); } void HideCursor(int x)//隐藏光标 ,当x为0时,隐藏,为1时,显示 { CONSOLE_CURSOR_INFO cursor_info ={1,x}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); } void Default()//欢迎界面 { char t;//用于选择 do { HideCursor(0); //隐藏光标 system("color 72"); toxy(28,8); printf(" 欢迎来到南航餐饮! "); toxy(26,9); printf("-----------------------------"); toxy(27,11); printf("1.登录 2.注册 3.管理员登录"); while(1) //死循环为防止其他按键干扰 { t=getch();//不回显函数 if(t=='1')//如果按1,则进入登录界面 User_Login(); else if(t=='2')//如果按2,则进入注册界面 Logon(); else if(t=='3') Administrator_Login(); }//如果既不是1也不是2和3,则循环输入 }while(1);//永远为真 } void User_Menu()//用户菜单 { char t;//用于选择菜单选项 do { system("cls"); HideCursor(0); //隐藏光标 system("color 74"); toxy(32,3); printf("南航餐饮点餐系统!"); toxy(32,4); printf("当前用户:%s",_userName); toxy(30,5); printf("*********************"); toxy(32,7); printf("| 1.菜单列表 |"); toxy(32,9); printf("| 2.餐桌列表 |"); toxy(32,11); printf("| 3.会员办理 |"); toxy(32,13); printf("| 4.修改密码 |"); toxy(32,15); printf("| 5.我的钱包 |"); toxy(32,17); printf("| 6.切换账号 |"); toxy(32,19); printf("| 7.退出系统 |"); t=getch();//不回显函数,输入一个值 switch(t) { case '1':User_Order();break; case '2':User_List_Table();break; case '3':Apply_VIP_Menu();break; case '4':Amend_passWord();break; case '5':User_Wallet();break; case '6':Change();break; case '7':Exit();break; default :break; } }while(1);//永远 为真 } char *HidePassword()//隐藏密码 { char password[18];//密码 char *p;//指向密码的指针 int i=0;//记录密码位数 char t;//输入密码 for(;;) //此处为输入密码不回显操作 { t=getch(); //输入k if(t=='\r') //如果输入k为回车,则跳出循环 { break; } else if(t=='\b') //如果输入k为删除键 { if(i>0) //如若密码还没完全删除 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果输入的k既不是删除键,也不是回车键 { password[i]=t; //把k的值赋给_password[i]; printf("*"); //输出*号,保护用户隐私 i++; //密码位数加1 } } password[i]='\0';//在数组末端加一个结束符 p=password;//让p指向该数组 return p; //返回一个指向密码的指针 } pUser readUserFile()//从文件中读取用户信息,返回一个表头地址 { FILE *fp; //文件指针 int n=0;//记录链表 的结点数 pUser head=NULL;//定义头指针 pUser p2,p,pre; fp=fopen("User.txt","a+"); //以只读的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } else { while(!feof(fp)) //判断文件位置标志是否移动到文件末尾 { n++; p=(pUser)malloc(M); //向内存申请一段空间 fread(p,M,1,fp); //将fp所指向的文件中的内容赋给p if(n==1) { head=p; p2=p; } else //创建链表 { pre=p2; p2->next=p; p2=p; } } p2->next=NULL; } if(n<=2) head->next=NULL; else pre->next=NULL; fclose(fp); //关闭文件 return head; //返回头指针 } void save_User(pUser p1) //将p1所指向的内容存储到文件中 { FILE *fp; //文件指针 fp=fopen("User.txt","a+"); //以追加的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(p1,M,1,fp)!=1) //将p1所指向的1个大小为N的数据结构写入fp所指向的文件中 { printf("file write error\n"); } fclose(fp); //关闭文件 } void User_Login()//登录页面 { char *q,t,c;//q指针用于接收 *HidePassword()函数返回的指向密码的指针,t和c均用于选择 pUser p=readUserFile();//从文件中读取用户信息,返回一个表头地址 do { HideCursor(1);//显示管光标 system("cls");//清屏 system("color 73");//设置颜色 toxy(28,8); printf("南航餐饮管理系统登录界面"); toxy(26,9); printf("-----------------------------"); toxy(32,11); printf("用户名:"); toxy(32,13); printf("密 码:"); toxy(40,11); scanf("%s",_userName); toxy(40,13); q=HidePassword();//输入密码 strcpy(_passWord,q);//将获得的密码复制给_passWord[]数组 while(p!=NULL&&strcmp(p->userName,_userName)!=0) //遍历链表,寻找当前输入的账户的账号 { p=p->next; } if(p!=NULL) //如果p不为空 { if(strcmp(p->passWord,_passWord)==0) //如果输入的密码正确 { toxy(32,16); printf("正在登陆...."); Sleep(500); //暂停0.5秒 system("cls"); toxy(32,10); printf("登陆成功!"); break; //跳出循环 } else //如果输入的密码错误 { toxy(32,16); printf("正在登陆...."); Sleep(500); system("cls"); toxy(30,8); printf("-------------------------"); toxy(30,9); printf("| |"); toxy(30,10); printf("| 密码错误!是否继续? |"); toxy(30,12); printf("| 1.是 2.否 |"); toxy(30,13); printf("| |"); toxy(30,14); printf("-------------------------"); while(1)//无限循环为防止其他按键干扰 { t=getch(); //输入t if(t=='1') { system("cls"); //清屏 break; } else if(t=='2') //如果输入t为n,进入开始界面 { system("cls"); //清屏 Default();break; } } } } else //如果p为空,即输入的账号不正确 { toxy(32,16); printf("正在登陆...."); Sleep(500); system("cls"); toxy(30,8); printf("-------------------------"); toxy(30,9); printf("| |"); toxy(30,10); printf("| 账号错误!是否继续? |"); toxy(30,11); printf("| |"); toxy(30,12); printf("| 1.是 2.否 |"); toxy(30,13); printf("| |"); toxy(30,14); printf("-------------------------"); while(1) //死循环防止其他按键干扰 { c=getch(); if(c=='1') { system("cls"); break; } else if(c=='2') { system("cls"); //清屏 Default(); } } } }while(1); Sleep(500); //暂停0.5秒 User_Menu(); //账号密码均正确,进入用户主菜单 } void Logon()//注册界面 { pUser p1; pUser p=readUserFile();//从文件中读取用户信息,返回一个表头地址 p1=(pUser)malloc(M); //向内存申请一段空间 char *q1,*q2;//q1,q2分别用于接收 *HidePassword()函数返回的值 char userName[10],passWord[18],againPassword[18],c,k,t;//c,k,t均用于选择 do{ system("cls"); system("color 73"); HideCursor(1);//显示光标 int flag=0;//标记信息库中是否存在要注册用户名 toxy(28,8); printf("南航餐饮管理系统注册界面"); toxy(26,9); printf("-----------------------------"); toxy(32,11); printf("用 户 名:"); toxy(32,13); printf("密 码:"); toxy(32,15); printf("确认密码:"); toxy(42,11); scanf("%s",userName);//输入用户名 toxy(42,13); q1=HidePassword();//输入密码 strcpy(passWord,q1); toxy(42,15); q2=HidePassword();//输入确认密码 strcpy(againPassword,q2); while(p!=NULL) //遍历链表,寻找当前输入的账户的账号 { if(strcmp(p->userName,userName)==0)//如果信息库中存在该用户名 { toxy(32,17); printf("用户名已存在,请重新注册!"); flag=1;//flag为1时表示用户名已存在 break;//跳出循环 } p=p->next; } if(flag)//如果用户名已存在 { HideCursor(0);//隐藏光标 toxy(32,19); printf("是否继续?");//询问是否继续 toxy(32,21); printf("1.是\t2.否"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='1')//如果继续,则重新注册 continue; else if(t=='2')//如果不继续,则回到首页 { system("cls");//清屏 Default();//回到首页 } } if(strcmp(passWord,againPassword)==0) //如果输入的两次密码均正确 { strcpy(p1->userName,userName); strcpy(p1->passWord,passWord); strcpy(_userName,userName); strcpy(_passWord,passWord); p1->isVIP=0; p1->money=0; if(strcmp(userName,"root")==0&&strcmp(passWord,"root")==0) p1->isAdministrator=1; else p1->isAdministrator=0; toxy(32,16); printf("正在注册...."); Sleep(500); break; //跳出循环 } else //如果输入的两次密码不同 { toxy(32,16); printf("正在注册...."); Sleep(500); system("cls"); toxy(30,8); printf("------------------------------"); toxy(30,9); printf("| |"); toxy(30,10); printf("|两次密码不一致!是否继续注册?|"); toxy(30,11); printf("| |"); toxy(30,12); printf("| 1.是 2.否 |"); toxy(30,13); printf("| |"); toxy(30,14); printf("------------------------------"); while(1) { c=getch(); if(c=='1') { system("cls"); break; } else if(c=='2') { system("cls"); Default(); break; } } } }while(1); save_User(p1); //调用函数,将p1所指向的内容存储到文件中 system("cls"); toxy(32,10); printf("注册成功!"); Sleep(500); //暂停0.5秒 toxy(32,12); printf("正在自动为您登陆...."); Sleep(500); User_Menu(); //注册成功后进入主菜单 } void User_Order()//点餐 { char ch='0'; char t='0'; int ID; int number; do { while(1) { system("cls"); HideCursor(1); int flag=0; pTable T,Thead; Thead=readTableFile(); T=Thead; int j=11; toxy(12,6); printf("餐桌列表(按任意键继续)"); toxy(2,8); printf("餐桌编号 | 可坐人数 | 已坐人数"); toxy(0,9); printf("--------------------------------------"); while(T!=NULL) { toxy(6,j); printf("%-10d%-10d%d",T->ID,T->count,T->People); j++; T=T->next; } toxy(38,12); printf("请选择餐桌号:"); scanf("%d",&ID); toxy(40,14); printf("请选择人数:"); scanf("%d",&number); T=Thead; while(T!=NULL) { if(T->ID==ID) { if((T->count)-(T->People)>=number) { toxy(38,16); printf("占座成功!按任意键继续点餐"); flag=1; break; } else { toxy(38,16); printf("占座失败!该餐桌座位不够"); flag=0; break; } } T=T->next; } if(T==NULL&&flag==0) { toxy(38,16); printf("该餐桌编号不存在,请重新输入"); Sleep(1000); continue; } else if(T!=NULL&&flag==0) { toxy(38,17); printf("是否继续 1.是 2.否"); while(1) { ch=getch(); if(ch=='1'||ch=='2') break; } if(ch=='1') continue; else if(ch=='2') break; } else if(flag) break; } if(ch=='2') break; getch(); do { system("cls"); toxy(32,6); printf("点餐"); toxy(24,8); printf("-----------------"); toxy(28,10); printf("1) 主 食"); toxy(28,12); printf("2) 副 食"); toxy(28,14); printf("3) 饮 品"); toxy(28,16); printf("4)订 单"); toxy(28,18); printf("5)返 回"); t=getch(); switch(t) { case '1':Order_StapleFood();break; case '2':Order_nonStapleFood();break; case '3':Order_DrinkBeverage();break; case '4':Order_Form(ID,number);break; case '5':break; default :break; } if(t=='5') break; }while(1); if(t=='5') break; }while(1); } void Order_StapleFood()//主食 { char t; do { system("cls"); pStapleFood p,head=readStapleFoodFile(); pOrder p1; p=head; char foodName[20]; int i=8; toxy(10,4); printf("主食菜单"); toxy(6,6); printf("菜名\t\t\t价格"); toxy(0,7); printf("-----------------------------------"); while(p!=NULL) { toxy(6,i); printf("%-22s%.2f",p->name,p->price); i++; p=p->next; } toxy(40,8); printf("请输入您要点的菜名:"); scanf("%s",foodName); p=head; while(p!=NULL&&strcmp(p->name,foodName)!=0) { p=p->next; } if(p) { p1=(pOrder)malloc(Y); strcpy(p1->name,foodName); p1->price=p->price; num++; if(num==1) { orderHead=p1; p2=p1; } else { p2->next=p1; p2=p1; } p2->next=NULL; toxy(40,10); printf("点餐成功!是否继续?1.是 2.否"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='2') break; } else { toxy(36,10); printf("没有找到这道菜,请检查您输入的菜名是否正确!"); Sleep(1500); } }while(1); } void Order_nonStapleFood()//副食 { char t; do { system("cls"); pNon_stapleFood p,head=readNonStapleFoodFile(); pOrder p1; p=head; char foodName[20]; int i=8; toxy(10,4); printf("副食菜单"); toxy(6,6); printf("菜名\t\t\t价格"); toxy(0,7); printf("-----------------------------------"); while(p!=NULL) { toxy(6,i); printf("%-22s%.2f",p->name,p->price); i++; p=p->next; } toxy(40,8); printf("请输入您要点的菜名:"); scanf("%s",foodName); p=head; while(p!=NULL&&strcmp(p->name,foodName)!=0) { p=p->next; } if(p) { p1=(pOrder)malloc(Y); strcpy(p1->name,foodName); p1->price=p->price; num++; if(num==1) { orderHead=p1; p2=p1; } else { p2->next=p1; p2=p1; } p2->next=NULL; toxy(36,10); printf("点餐成功!是否继续?1.是 2.否"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='2') break; } else { toxy(36,10); printf("没有找到这道菜,请检查您输入的菜名是否正确!"); Sleep(1500); } }while(1); } void Order_DrinkBeverage()//饮品 { char t; do { system("cls"); pDrinkBeverage p,head=readDrinkBeverageFile(); pOrder p1; p=head; char foodName[20]; int i=8; toxy(10,4); printf("饮品菜单"); toxy(6,6); printf("菜名\t\t\t价格"); toxy(0,7); printf("-----------------------------------"); while(p!=NULL) { toxy(6,i); printf("%-22s%.2f",p->name,p->price); i++; p=p->next; } toxy(40,8); printf("请输入您要点的菜名:"); scanf("%s",foodName); p=head; while(p!=NULL&&strcmp(p->name,foodName)!=0) { p=p->next; } if(p) { p1=(pOrder)malloc(Y); strcpy(p1->name,foodName); p1->price=p->price; num++; if(num==1) { orderHead=p1; p2=p1; } else { p2->next=p1; p2=p1; } p2->next=NULL; toxy(36,10); printf("点餐成功!是否继续?1.是 2.否"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='2') break; } else { toxy(36,10); printf("没有找到这道菜,请检查您输入的菜名是否正确!"); Sleep(1500); } }while(1); } void Order_Form(int ID,int number)//订单 { do { system("cls"); int i=10; char t; float totalPrice=0; float actualPayment=0; pOrder p=orderHead; pUser q,head; pTable T,Thead; q=head; if(orderHead==NULL) { toxy(26,8); printf("您还没有点任何东西,赶紧去点吧!(按任意键返回)"); getch(); break; } else { toxy(26,6); printf("我的订单"); toxy(22,8); printf("菜品名称\t\t价格"); toxy(20,9); printf("***************************"); while(p!=NULL) { toxy(22,i); printf("%-18s%.2f",p->name,p->price); i++; totalPrice+=p->price; p=p->next; } head=readUserFile(); q=head; toxy(20,i); printf("***************************"); while(q!=NULL&&strcmp(q->userName,_userName)!=0) { q=q->next; } if(q) { toxy(24,++i); printf("总价: %.2f",totalPrice); if(q->isVIP) actualPayment=totalPrice*0.85; else actualPayment=totalPrice; toxy(24,++i); printf("实付: %.2f",actualPayment); } toxy(22,++i); printf("1.确认支付 2.取消订单 3.返回"); while(1) { t=getch(); if(t=='1'||t=='2'||t=='3') break; } if(t=='1') { Thead=readTableFile(); T=Thead; while(T!=NULL&&T->ID!=ID) { T=T->next; } toxy(24,++i); printf("正在支付...."); if(q->money>=actualPayment) { q->money-=actualPayment; T->People+=number; Updata_User(head); Updata_Table(Thead); Sleep(1500); system("cls"); toxy(24,10); printf("支付成功!按任意键返回"); orderHead=NULL; getch(); break; } else { Sleep(1500); system("cls"); toxy(24,10); printf("余额不足!按任意键返回"); getch(); break; } } else if(t=='2') { orderHead=NULL; break; } else if(t=='3') break; } }while(1); } void User_List_Table()//餐桌列表 { system("cls"); pTable p,head; head=readTableFile(); p=head; int i=11; toxy(32,6); printf("餐桌列表(按任意键继续)"); toxy(22,8); printf("餐桌编号 | 可坐人数 | 已坐人数"); toxy(20,9); printf("--------------------------------------"); while(p!=NULL) { toxy(26,i); printf("%-10d%-10d%d",p->ID,p->count,p->People); i++; p=p->next; } getch(); } void Apply_VIP_Menu()//办理会员 { char t; //t用于选择 do { system("cls"); system("color 75"); HideCursor(0); pUser head=readUserFile();//从文件中读取用户信息,返回一个表头地址 toxy(32,6); printf("会员办理"); toxy(30,8); printf("1) 充值 "); toxy(30,10); printf("2) 办理会员"); toxy(30,12); printf("3) 返回"); t=getch(); switch(t) { case '1':Add_money(head);break; case '2':Apply_VIP(head);break; case '3':break; default :break; } if(t=='3')//如果输入3,则跳出循环,该函数生命周期结束,回到上一级菜单 break; }while(1); } void Add_money(pUser head)//充值 { float money;//输入要充值的钱 pUser p; p=head;//head为从 上一级菜单传过来的参数,为用户信息链表的头结点 while(p!=NULL&&strcmp(p->userName,_userName)!=0)//遍历链表,寻找当前登录账户的信息 { p=p->next; } while(1) { system("cls"); system("color 76"); toxy(32,6); printf("南航餐饮充值中心"); if(p!=NULL) { if(p->isVIP==0)//如果不是会员 { toxy(20,8); printf("对不起,您还不是会员,请先办理会员后再来充值!"); toxy(32,10); printf("请按任意键返回!"); break; } else if(p->isVIP==1)//如果是会员 { HideCursor(1); toxy(32,8); printf("请输入充值金额(一次不少于200):"); scanf("%f",&money); if(money>=200)//如果充值金额大于200 { p->money+=money; toxy(32,10); printf("正在充值...."); Updata_User(head);//更新用户表 toxy(32,10); printf("充值成功 "); toxy(32,12); printf("请按任意键返回!"); break; } else//如果充值金额小于200 { toxy(32,10); printf("一次至少充值200元!"); Sleep(1500); continue; } } } } getch(); } void Apply_VIP(pUser head)//办理会员 { system("cls"); system("color 76"); pUser p=head;//head为从 上一级菜单传过来的参数,为用户信息链表的头结点 char t; float money; toxy(32,6); printf("南航餐饮会员办理中心"); while(p!=NULL&&strcmp(p->userName,_userName)!=0)//遍历链表,寻找当前登录账户的信息 { p=p->next; } do { if(p!=NULL) { if(p->isVIP==1)//如果已经是会员 { toxy(20,8); printf("您已是本店尊贵会员,无需再次办理!"); toxy(32,10); printf("请按任意键返回!"); getch(); break; } else if(p->isVIP==0)//如果还没办理会员 { toxy(30,8); printf("提示:"); toxy(30,9); printf("1.办理会员至少充值500"); toxy(30,10); printf("2.冲500送200,冲1000送500"); toxy(32,12); printf("是否确认办理会员?"); toxy(32,13); printf("1.是\t2.否"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='1') { while(1) { system("cls"); HideCursor(1); toxy(32,10); printf("请输入充值金额:"); scanf("%f",&money); if(money>=500&&money<1000) { money+=200; p->money+=money; p->isVIP=1; Updata_User(head); toxy(32,12); printf("恭喜,您已成为本店尊贵会员!"); toxy(32,14); printf("请按任意键返回主菜单"); getch(); User_Menu(); } else if(money>=1000) { money+=500; p->money+=money; p->isVIP=1; Updata_User(head); toxy(32,12); printf("恭喜,您已成为本店尊贵会员!"); toxy(32,14); printf("请按任意键返回主菜单"); getch(); User_Menu(); } else { toxy(32,12); printf("办理会员至少充值500"); Sleep(2000); } } } else if(t=='2') break; } } }while(1); } void Updata_User(pUser head)//更新文件 { FILE *fp; pUser p=head->next; //使p指向第二个结点 fp=fopen("User.txt","w"); //先清空原文件内容再将修改后的信息写入文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(head,M,1,fp)!=1) //将head所指向的数据写入fp所指向的文件 { printf("file write error\n"); } fclose(fp); //关闭文件 fp=fopen("User.txt","a"); // 打开User.txt文件,方式为追加 while(p!=NULL) //p不为空就执行循环体 { if(fwrite(p,M,1,fp)!=1) //将p所指向的1个大小为N的数据结构写入fp所指向的文件 { printf("file write error\n"); } p=p->next; //使p指向下一个结点 } fclose(fp); //关闭文件 } void Amend_passWord()//修改密码 { system("cls"); //清屏 HideCursor(0); //隐藏光标,看着更舒服 pUser p,head; head=readUserFile(); do { p=head; char password[18],newpassword[18],t,k,*q1,*q2; int i=0; toxy(34,5); //将光标移动到坐标为(50,5)的位置 printf("南航餐饮点餐系统"); toxy(34,8); printf("修改密码"); toxy(32,10); printf("请输入旧密码:"); q1=HidePassword(); strcpy(password,q1); toxy(32,12); printf("请输入新密码:"); q2=HidePassword(); strcpy(newpassword,q2); while(p!=NULL&&strcmp(p->userName,_userName)!=0)//遍历链表,寻找当前登陆账户的账号 { p=p->next; } if(p!=NULL) //如果p不为空 { if(strcmp(p->passWord,password)==0) //如果旧密码输入正确 { strcpy(p->passWord,newpassword); //将旧密码改为新密码 break; //跳出循环 } else //如果旧密码输入错误 { system("cls"); toxy(30,8); printf("--------------------------"); toxy(30,9); printf("| |"); toxy(30,10); printf("| 密码错误!是否继续? |"); toxy(30,11); printf("| |"); toxy(30,12); printf("| 1.是 2.否 |"); toxy(30,13); printf("| |"); toxy(30,14); printf("--------------------------"); while(1) { t=getch(); //输入t if(t=='1') { system("cls"); break; } else if(t=='2') User_Menu(); } } } }while(1); //永远为真 Updata_User(head);//修改密码 toxy(32,14); printf("修改成功!正在跳转..."); Sleep(500); //暂停0.5秒 } void User_Wallet()//我的钱包 { system("cls"); system("color 78"); pUser p,head; head=readUserFile(); p=head; while(p!=NULL&&strcmp(p->userName,_userName)!=0) { p=p->next; } if(p!=NULL) { toxy(32,10); printf("账户余额为:%.2f",p->money); toxy(32,12); printf("请按任意键返回"); } getch(); } void Change()//切换账号 { system("cls"); Default(); } void Exit()//退出点餐系统 { char t; toxy(30,10); printf("-----------------------"); toxy(30,11); printf("| 您确定要退出吗? |"); toxy(30,13); printf("| 1.确定 2.取消 |"); toxy(30,14); printf("-----------------------"); while(1) { t=getch(); //输入t switch(t) { case '1': system("cls"); toxy(32,10); printf("正在安全退出...."); Sleep(1000); //暂停1秒 system("cls"); toxy(32,10); printf("已安全退出软件"); toxy(32,12); printf("谢谢使用!"); toxy(32,14); printf("by-by^_^"); exit(0); break; //终止程序 case '2': break; //调用函数,进入菜单 default :break; } if(t=='2') break; } } void Administrator_Menu()//管理员菜单 { char t;//用于选择菜单选项 do { system("cls"); HideCursor(0); //隐藏光标 system("color 74"); toxy(32,3); printf("南航餐饮管理系统!"); toxy(32,4); printf("当前管理员:%s",_userName); toxy(30,5); printf("*********************"); toxy(32,7); printf("| 1.菜品 信息 |"); toxy(32,9); printf("| 2.餐桌 管理 |"); toxy(32,11); printf("| 3.查看 用户 |"); toxy(32,13); printf("| 4.本店 会员 |"); toxy(32,15); printf("| 5.设置管理员 |"); toxy(32,17); printf("| 6.修改 密码 |"); toxy(32,19); printf("| 7.切换 账号 |"); toxy(32,21); printf("| 8.退出 系统 |"); t=getch();//不回显函数,输入一个值 switch(t) { case '1':Food();break; case '2':Table();break; case '3':Check_User();break; case '4':All_VIP();break; case '5':Setup_administrator();break; case '6':Amend_passWord();break; case '7':Change();break; case '8':Exit();break; default :break; } }while(1);//永远 为真 } void Administrator_Login()//管理员登录 { char *q,t,c;//q指针用于接收 *HidePassword()函数返回的指向密码的指针,t和c均用于选择 pUser p=readUserFile();//从文件中读取用户信息,返回一个表头地址 do { HideCursor(1);//显示管光标 system("cls");//清屏 system("color 73");//设置颜色 toxy(28,8); printf("南航餐饮管理员登录界面"); toxy(26,9); printf("-----------------------------"); toxy(32,11); printf("用户名:"); toxy(32,13); printf("密 码:"); toxy(40,11); scanf("%s",_userName); toxy(40,13); q=HidePassword();//输入密码 strcpy(_passWord,q);//将获得的密码复制给_passWord[]数组 while(p!=NULL&&strcmp(p->userName,_userName)!=0) //遍历链表,寻找当前输入的账户的账号 { p=p->next; } if(p!=NULL) //如果p不为空 { if(strcmp(p->passWord,_passWord)==0&&p->isAdministrator==1) //如果输入的密码正确 { toxy(32,16); printf("正在登陆...."); Sleep(500); //暂停0.5秒 system("cls"); toxy(32,10); printf("登陆成功!"); break; //跳出循环 } else //如果输入的密码错误 { toxy(32,16); printf("正在登陆...."); Sleep(500); system("cls"); toxy(30,8); printf("-------------------------"); toxy(30,9); printf("| |"); toxy(30,10); printf("| 密码错误!是否继续? |"); toxy(30,12); printf("| 1.是 2.否 |"); toxy(30,13); printf("| |"); toxy(30,14); printf("-------------------------"); while(1)//无限循环为防止其他按键干扰 { t=getch(); //输入t if(t=='1') { system("cls"); //清屏 break; } else if(t=='2') //如果输入t为n,进入开始界面 { system("cls"); //清屏 Default();break; } } } } else //如果p为空,即输入的账号不正确 { toxy(32,16); printf("正在登陆...."); Sleep(500); system("cls"); toxy(30,8); printf("-------------------------"); toxy(30,9); printf("| |"); toxy(30,10); printf("| 账号错误!是否继续? |"); toxy(30,11); printf("| |"); toxy(30,12); printf("| 1.是 2.否 |"); toxy(30,13); printf("| |"); toxy(30,14); printf("-------------------------"); while(1) //死循环防止其他按键干扰 { c=getch(); if(c=='1') { system("cls"); break; } else if(c=='2') { system("cls"); //清屏 Default(); } } } }while(1); Sleep(500); //暂停0.5秒 Administrator_Menu(); //账号密码均正确,进入管理员主菜单 } void Food()//菜品信息 { system("color 74"); char t; do { system("cls"); toxy(32,6); printf("菜品信息"); toxy(28,7); printf("-----------------"); toxy(30,9); printf(" 1) 添加菜单"); toxy(30,11); printf(" 2) 菜单列表"); toxy(30,13); printf(" 3) 返回上一级"); t=getch(); switch(t) { case '1':Add_Food();break; case '2':List_Food();break; case '3':break; default :break; } if(t=='3') break; }while(1); } void save_stapleFood(pStapleFood p)//保存主食信息 { FILE *fp; //文件指针 fp=fopen("StapleFood.txt","a+"); //以追加的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(p,N,1,fp)!=1) //将p1所指向的1个大小为N的数据结构写入fp所指向的文件中 { printf("file write error\n"); } fclose(fp); //关闭文件 } void save_non_stapleFood(pNon_stapleFood p)//保存副食信息 { FILE *fp; //文件指针 fp=fopen("non_StapleFood.txt","a+"); //以追加的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(p,P,1,fp)!=1) //将p1所指向的1个大小为N的数据结构写入fp所指向的文件中 { printf("file write error\n"); } fclose(fp); //关闭文件 } void save_drinkBeverage(pDrinkBeverage p)//保存饮品信息 { FILE *fp; //文件指针 fp=fopen("DrinkBeverage.txt","a+"); //以追加的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(p,Q,1,fp)!=1) //将p1所指向的1个大小为N的数据结构写入fp所指向的文件中 { printf("file write error\n"); } fclose(fp); //关闭文件 } pStapleFood readStapleFoodFile()//从主食文件中读取用户信息,返回一个表头地址 { FILE *fp; //文件指针 int n=0;//记录链表 的结点数 pStapleFood head=NULL;//定义头指针 pStapleFood p2,p,pre; fp=fopen("StapleFood.txt","a+"); //以只读的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } else { while(!feof(fp)) //判断文件位置标志是否移动到文件末尾 { n++; p=(pStapleFood)malloc(N); //向内存申请一段空间 fread(p,N,1,fp); //将fp所指向的文件中的内容赋给p if(n==1) { head=p; p2=p; } else //创建链表 { pre=p2; p2->next=p; p2=p; } } p2->next=NULL; } if(n<=2) head->next=NULL; else pre->next=NULL; fclose(fp); //关闭文件 return head; //返回头指针 } pNon_stapleFood readNonStapleFoodFile()//从副食文件中读取用户信息,返回一个表头地址 { FILE *fp; //文件指针 int n=0;//记录链表 的结点数 pNon_stapleFood head=NULL;//定义头指针 pNon_stapleFood p2,p,pre; fp=fopen("non_StapleFood.txt","a+"); //以只读的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } else { while(!feof(fp)) //判断文件位置标志是否移动到文件末尾 { n++; p=(pNon_stapleFood)malloc(P); //向内存申请一段空间 fread(p,P,1,fp); //将fp所指向的文件中的内容赋给p if(n==1) { head=p; p2=p; } else //创建链表 { pre=p2; p2->next=p; p2=p; } } p2->next=NULL; } if(n<=2) head->next=NULL; else pre->next=NULL; fclose(fp); //关闭文件 return head; //返回头指针 } pDrinkBeverage readDrinkBeverageFile()//从饮品文件中读取用户信息,返回一个表头地址 { FILE *fp; //文件指针 int n=0;//记录链表 的结点数 pDrinkBeverage head=NULL;//定义头指针 pDrinkBeverage p2,p,pre; fp=fopen("DrinkBeverage.txt","a+"); //以只读的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } else { while(!feof(fp)) //判断文件位置标志是否移动到文件末尾 { n++; p=(pDrinkBeverage)malloc(Q); //向内存申请一段空间 fread(p,Q,1,fp); //将fp所指向的文件中的内容赋给p if(n==1) { head=p; p2=p; } else //创建链表 { pre=p2; p2->next=p; p2=p; } } p2->next=NULL; } if(n<=2) head->next=NULL; else pre->next=NULL; fclose(fp); //关闭文件 return head; //返回头指针 } void Add_Food() //添加菜单 { HideCursor(1);//显示光标 pStapleFood p1;//主食 pNon_stapleFood p2;//副食 pDrinkBeverage p3;//饮品 char name[20]; float price=0; int type=1; char t; do { system("cls"); p1=(pStapleFood)malloc(N); p2=(pNon_stapleFood)malloc(P); p3=(pDrinkBeverage)malloc(Q); toxy(30,6); printf("请输入菜名:"); toxy(30,8); printf("请输入价格:"); toxy(30,10); printf("请输入类型:"); toxy(30,12); printf("(1:主食 2.副食 3.饮品)"); toxy(42,6); scanf("%s",name); toxy(42,8); scanf("%f",&price); toxy(42,10); scanf("%d",&type); if(type==1) { strcpy(p1->name,name); p1->price=price; save_stapleFood(p1); } else if(type==2) { strcpy(p2->name,name); p2->price=price; save_non_stapleFood(p2); } else if(type==3) { strcpy(p3->name,name); p3->price=price; save_drinkBeverage(p3); } toxy(28,14); printf("添加成功!是否继续?(1.是 2.否)"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='2') break; }while(1); } void List_Food() //菜单列表 { system("cls"); int i=8; toxy(30,4); printf("菜单列表(按任意键继续)"); pStapleFood p1;//主食 pNon_stapleFood p2;//副食 pDrinkBeverage p3;//饮品 p1=readStapleFoodFile();//从主食文件中读取用户信息,返回一个表头地址 p2=readNonStapleFoodFile();//从副食文件中读取用户信息,返回一个表头地址 p3=readDrinkBeverageFile();//从饮品文件中读取用户信息,返回一个表头地址 toxy(26,6); printf("菜名\t\t\t价格"); toxy(20,7); printf("-----------------------------------"); toxy(24,i); printf("主食:"); i++; while(p1!=NULL) { toxy(26,i); printf("%-22s%.2f",p1->name,p1->price); i++; p1=p1->next; } toxy(24,i); printf("副食:"); i++; while(p2!=NULL) { toxy(26,i); printf("%-22s%.2f",p2->name,p2->price); i++; p2=p2->next; } toxy(24,i); printf("饮品:"); i++; while(p3!=NULL) { toxy(26,i); printf("%-22s%.2f",p3->name,p3->price); i++; p3=p3->next; } getch(); } void Table()//餐桌管理 { char t; do { system("cls"); HideCursor(0); toxy(32,4); printf("餐桌管理"); toxy(26,5); printf("-------------------"); toxy(30,7); printf("1) 添加餐桌"); toxy(30,9); printf("2) 餐桌列表"); toxy(30,11); printf("3) 清理餐桌"); toxy(30,13); printf("4) 返回上一级"); t=getch(); switch(t) { case '1':Add_Table();break; case '2':Administrator_List_Table();break; case '3':Clear_Table();break; case '4':break; default :break; } if(t=='4') break; }while(1); } void save_Table(pTable p)//保存餐桌信息 { FILE *fp; //文件指针 fp=fopen("Table.txt","a+"); //以追加的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(p,X,1,fp)!=1) //将p1所指向的1个大小为N的数据结构写入fp所指向的文件中 { printf("file write error\n"); } fclose(fp); //关闭文件 } pTable readTableFile()//从餐桌文件中读取用户信息,返回一个表头地址 { FILE *fp; //文件指针 int n=0;//记录链表 的结点数 pTable head=NULL;//定义头指针 pTable p2,p,pre; fp=fopen("Table.txt","a+"); //以只读的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } else { while(!feof(fp)) //判断文件位置标志是否移动到文件末尾 { n++; p=(pTable)malloc(X); //向内存申请一段空间 fread(p,X,1,fp); //将fp所指向的文件中的内容赋给p if(n==1) { head=p; p2=p; } else //创建链表 { pre=p2; p2->next=p; p2=p; } } p2->next=NULL; } if(n<=2) head->next=NULL; else pre->next=NULL; fclose(fp); //关闭文件 return head; //返回头指针 } void Add_Table()//添加餐桌 { HideCursor(1);//显示光标 pTable p,p1; p1=readTableFile(); char t; int ID; int count; do { system("cls"); p=(pTable)malloc(X); toxy(26,6); printf("请输入餐桌编号:"); toxy(26,8); printf("请输入可坐人数:"); toxy(42,6); scanf("%d",&ID); toxy(42,8); scanf("%d",&count); while(p1!=NULL&&p1->ID!=ID) { p1=p1->next; } if(p1!=NULL) { toxy(30,10); printf("该餐桌编号已存在,请重新输入!"); Sleep(2000); continue; } p->ID=ID; p->People=0; p->count=count; strcpy(p->Username,"无"); save_Table(p); toxy(24,10); printf("添加成功!是否继续?(1.是 2.否)"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='2') break; }while(1); } void Administrator_List_Table()//餐桌列表 { system("cls"); pTable p,head; head=readTableFile(); p=head; int i=11; toxy(32,6); printf("餐桌列表(按任意键继续)"); toxy(22,8); printf("餐桌编号 | 可坐人数 | 已坐人数 | 订餐人"); toxy(20,9); printf("--------------------------------------------"); while(p!=NULL) { toxy(26,i); printf("%-10d%-10d%-10d%s",p->ID,p->count,p->People,p->Username); i++; p=p->next; } getch(); } void Clear_Table()//清理餐桌 { char t; do { system("cls"); toxy(32,4); printf("清理餐桌"); toxy(26,5); printf("-------------------"); toxy(30,7); printf("1) 清理指定餐桌"); toxy(30,9); printf("2) 清理所有餐桌"); toxy(30,11); printf("3) 返回上一级"); t=getch(); switch(t) { case '1':Clear_oneTable();break; case '2':Clear_allTable();break; case '3':break; default :break; } if(t=='3') break; }while(1); } void Updata_Table(pTable head)//更新餐桌文件 { FILE *fp; pTable p=head->next; //使p指向第二个结点 fp=fopen("Table.txt","w"); //先清空原文件内容再将修改后的信息写入文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(head,X,1,fp)!=1) //将head所指向的数据写入fp所指向的文件 { printf("file write error\n"); } fclose(fp); //关闭文件 fp=fopen("Table.txt","a"); // 打开User.txt文件,方式为追加 while(p!=NULL) //p不为空就执行循环体 { if(fwrite(p,X,1,fp)!=1) //将p所指向的1个大小为N的数据结构写入fp所指向的文件 { printf("file write error\n"); } p=p->next; //使p指向下一个结点 } fclose(fp); //关闭文件 } void Clear_oneTable()//清理指定餐桌 { int ID; pTable p,head; char t; do { system("cls"); head=readTableFile(); p=head; toxy(28,8); printf("请输入您要清理的餐桌编号:"); scanf("%d",&ID); while(p!=NULL&&p->ID!=ID) { p=p->next; } if(p) { toxy(32,10); printf("正在清理...."); p->People=0; strcpy(p->Username,"无"); Updata_Table(head); Sleep(2000); toxy(24,10); printf("清理成功!是否继续?1.是 2.否"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='2') break; } else { toxy(32,10); printf("该餐桌不存在!请重新输入"); Sleep(1500); } }while(1); } void Clear_allTable()//清理所有餐桌 { system("cls"); toxy(32,10); printf("正在清理...."); pTable p,head; head=readTableFile(); p=head; while(p!=NULL) { p->People=0; strcpy(p->Username,"无"); p=p->next; } Updata_Table(head); Sleep(2000); toxy(32,10); printf("清理成功!按任意键继续"); getch(); } void Check_User()//查看用户 { char t; do { system("cls"); system("color 79"); toxy(32,6); printf(" 查看用户 "); toxy(32,7); printf("----------------"); toxy(32,9); printf(" 1) 查找用户 "); toxy(32,11); printf(" 2) 所有用户 "); toxy(32,13); printf(" 3)返回上一级"); t=getch(); switch(t) { case '1':Find_User();break; case '2':All_User();break; case '3':break; default :break; } if(t=='3') break; }while(1); } void Find_User()//查找用户 { system("cls"); char username[10]; pUser p, head=readUserFile(); p=head; toxy(32,10); printf("请输入您要查找的用户名:"); scanf("%s",username); toxy(24,12); printf("用户名\t\t余额\t\t会员状态"); while(p!=NULL&&strcmp(p->userName,username)!=0) p=p->next; if(p!=NULL) { toxy(24,14); printf("%s\t\t%.2f\t\t%d",p->userName,p->money,p->isVIP); } else { toxy(28,14); printf("没有找到相关信息"); } toxy(30,16); printf("请按任意键返回"); getch(); } void All_User()//打印所有用户信息 { system("cls"); pUser p,head; head=readUserFile(); p=head; int i=9; toxy(32,4); printf("所有用户"); toxy(20,5); printf("--------------------------------------------------"); toxy(30,6); printf("按任意键返回"); toxy(24,7); printf("用户名\t\t余额\t\t会员状态"); while(p!=NULL) { toxy(24,i); printf("%s\t\t%.2f\t\t%d",p->userName,p->money,p->isVIP); p=p->next; i+=2; } getch(); } void All_VIP()//查看所有VIP { system("cls"); system("color 79"); pUser p,head; head=readUserFile(); p=head; int i=11; toxy(32,6); printf("本店会员"); toxy(26,8); printf("用户名\t\t余额"); toxy(24,9); printf("--------------------------------"); while(p!=NULL) { if(p->isVIP) { toxy(26,i); printf("%s\t\t\t%.2f",p->userName,p->money); i+=2; } p=p->next; } toxy(30,i); printf("按任意键返回"); getch(); } void Setup_administrator()//设置管理员 { system("color 80"); char t; char username[10]; pUser p,head; head=readUserFile(); do { system("cls"); p=head; toxy(26,8); printf("请输入您要设置为管理员的用户名:"); scanf("%s",username); while(p!=NULL&&strcmp(p->userName,username)!=0) { p=p->next; } if(p!=NULL) { p->isAdministrator=1; Updata_User(head); toxy(32,10); printf("设置成功!请按任意键返回"); getch(); break; } else { toxy(24,10); printf("您所输入的用户名不存在!是否继续?(1.是 2.否)"); while(1) { t=getch(); if(t=='1') break; else if(t=='2') break; } if(t=='2') break; } }while(1); } int main() { Default();//进入欢迎界面 return 0; }
关于使用C语言怎么实现一个餐饮点餐管理系统问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。