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; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。