1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c语言-餐饮管理与点餐系统

c语言-餐饮管理与点餐系统

时间:2020-10-21 11:35:48

相关推荐

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所指向的文件中的内容赋给pif(n==1){head=p;p2=p;}else //创建链表 {pre=p2;p2->next=p;p2=p;}}p2->next=NULL;}if(n<=2)head->next=NULL;elsepre->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;elsep1->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;elseactualPayment=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(); //输入tswitch(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所指向的文件中的内容赋给pif(n==1){head=p;p2=p;}else //创建链表 {pre=p2;p2->next=p;p2=p;}}p2->next=NULL;}if(n<=2)head->next=NULL;elsepre->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所指向的文件中的内容赋给pif(n==1){head=p;p2=p;}else //创建链表 {pre=p2;p2->next=p;p2=p;}}p2->next=NULL;}if(n<=2)head->next=NULL;elsepre->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所指向的文件中的内容赋给pif(n==1){head=p;p2=p;}else //创建链表 {pre=p2;p2->next=p;p2=p;}}p2->next=NULL;}if(n<=2)head->next=NULL;elsepre->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所指向的文件中的内容赋给pif(n==1){head=p;p2=p;}else //创建链表 {pre=p2;p2->next=p;p2=p;}}p2->next=NULL;}if(n<=2)head->next=NULL;elsepre->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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。