1. 程式人生 > >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;
}