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。

推薦閱讀: