c語言-餐飲管理與點餐系統
阿新 • • 發佈:2019-02-04
/* 專案名稱:南航餐飲管理系統 組員:樑文新,劉青林,劉藝,施瑞文(組長) */ //當註冊使用者名稱為: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; }