ccczd666 发表于 2020-12-22 18:44:39

急求作业题酒店点菜系统

本帖最后由 ccczd666 于 2020-12-22 19:07 编辑

感谢大佬帮助,最好不用指针

782353676 发表于 2020-12-22 18:44:40

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int num,m,n;
    printf("欢迎光临\n");
    printf("请选择餐桌号: ");
    scanf("%d",&m);
    printf("成功占座%d号!",m);
    printf("1.酸菜鱼2.宫保鸡丁 3.可口可乐\n");
    printf("你好,请点餐:");
    while(1)
    {
      scanf("%d",&n);
    printf("1.确认 2.返回");
    scanf("%d",&num);
    if(num==1)
      break;
    else
    {
      return 0;
      break;
    }

    }

    switch(n)
    {
      case 1:printf("成功点餐酸菜鱼");break;
      case 2:printf("成功点餐宫保鸡丁");break;
      case 3:printf("成功点餐可口可乐");break;
      default :printf("你走吧,小店没有你要的");
    }

}

782353676 发表于 2020-12-22 20:16:16


//当注册用户名为:root,密码为:root的账号时,系统默认为初始管理员

//头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
#include<string.h>


//宏定义区
#define Msizeof(struct User)//用户表的大小
#define Nsizeof(struct stapleFood)//主食 表大小
#define Psizeof(struct non_stapleFood)//副食表大小
#define Qsizeof(struct Drink_beverage) //饮品表大小
#define Xsizeof(struct Table)//餐桌表大小
#define Ysizeof(struct Form)//订单表大小

//结构体

struct User    //用户表
{
        char userName;//用户名
        char passWord;//密码
        int isVIP;//会员标记
        int isAdministrator;//管理员标记
        float money;//余额
        struct User *next;//指针域
};
typedef struct User user;
typedef user* pUser;

struct stapleFood   //主食
{
        char name;
        float price;
        struct stapleFood *next;
};
typedef struct stapleFood staple_food;
typedef staple_food *pStapleFood;

struct non_stapleFood   //副食
{
        char name;
        float price;
        struct non_stapleFood *next;
};
typedef struct non_stapleFood non_staple_food;
typedef non_staple_food *pNon_stapleFood;

struct Drink_beverage//饮品
{
        char name;
        float price;
        struct Drink_beverage *next;
};
typedef struct Drink_beverage drinkBeverage;
typedef drinkBeverage *pDrinkBeverage;

struct Table   //餐桌
{
        int ID;//餐桌编号
        int People;//已坐人数
        int count;//可容纳人数
        char Username;//订餐人
        struct Table *next;
};
typedef struct Table table;
typedef table *pTable;


struct Form    //订单
{
        char name;
        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;
char _passWord;//记录当前用户
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;//密码
        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=t;   //把k的值赋给_password;
                                printf("*");      //输出*号,保护用户隐私
                                i++;            //密码位数加1
                        }
                }
                password='\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,passWord,againPassword,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;
                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;
                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;
                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,newpassword,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;
        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;
        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;
        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;
}

ccczd666 发表于 2020-12-22 20:28:09

782353676 发表于 2020-12-22 20:16


大佬,您这代码太复杂了这就是个小问题ヽ(_;)ノ

hhp_3533 发表于 2020-12-22 20:51:52

#include <stdio.h>

void main()
{
        int m,n;//m为餐桌号,n为菜编号
        printf("请输入你所在的餐桌号:");
        scanf("%d",&m);
        printf("\n请点菜:\n");
        printf("宫保鸡丁--1\n");
        printf("清炒油菜--2\n");
        printf("可口可乐--3\n");
        printf("请输入你要点菜的编号:");
        scanf("%d",&n);
        switch(n)
        {
        case 1:
                printf("餐桌号:%d,已点菜:宫保鸡丁\n",m);
                break;
        case 2:
                printf("餐桌号:%d,已点菜:清炒油菜\n",m);
                break;
        case 3:
                printf("餐桌号:%d,已点菜:可口可乐\n",m);
                break;
        default:
                printf("你输入的菜编号错误\n");
        }

}

lzq9825 发表于 2020-12-25 21:42:44

782353676 发表于 2020-12-22 20:16


牛逼啊

Yvonne! 发表于 2020-12-26 11:16:26

ccczd666 发表于 2020-12-22 20:28
大佬,您这代码太复杂了这就是个小问题ヽ(_;)ノ

大佬这是帮你把整个系统给搞出来了,你自己挖一下需要的内容就好了嘛O(∩_∩)O哈哈~

Yvonne! 发表于 2020-12-26 11:18:15

782353676 发表于 2020-12-22 20:16


我想知道你这段码是即兴还是认真的{:5_109:}

782353676 发表于 2020-12-30 22:26:22

Yvonne! 发表于 2020-12-26 11:18
我想知道你这段码是即兴还是认真的

我们期末作业....

流光千仞 发表于 2020-12-30 23:07:18

782353676 发表于 2020-12-22 20:16


膜拜大佬
这太牛批了!!!
页: [1]
查看完整版本: 急求作业题酒店点菜系统