#include<stdio.h>//高朋辉
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include <iostream>
#include <string> //请加入这个头文件
using namespace std;
#include<cstring>
#define N 10
#define D 10
#define H 10
#define ASK (ORDER*)malloc(sizeof(ORDER))
#define MaxCapacity 4
//定义订单结构体
typedef struct Order{
    int
Table_ID;
 int Dish_ID[N];
 struct Order *next;
}ORDER;
//定义餐桌信息
typedef struct Table{
 int Table_ID;
 int Capacity;
 int Table_State;
}TABLE;
//定义菜的结构体
typedef struct dish{
    int
Dish_ID;
 int Dish_Name[10];
 float Dish_Price;
}DISH;
TABLE tb[H];
DISH  dish[D];
int PASSWORD=123;
void LOAD_Dish(void);//从文件中读取菜谱;
ORDER*CreateOne(int);//创建一个订单节点;
void Dish_Menu(void);//显示菜谱
void Table_Init(void);//餐桌信息初始化
int search(void);//查找匹配的餐桌
ORDER* Dish_Order(ORDER *,ORDER *);//将节点插入到主链
void Display(int);//显示菜的信息;
void saveInList(float);//将客户消费额写入账单
void Save_Inform(ORDER *,int);//将已结账订单信息写入历史记录
ORDER *Payment(ORDER *);//结账
void ModifyPW(int);//密码修改
int Pass_Word(void);//密码验证
void Observe(void);//账目查询
void ListMenu(void);//账单管理菜单
void List_Management(void);//账单管理
void Main_Menu(void);//主菜单
void Get_Rank(void);//统计
void Menu_select(void);//选择功能
//主函数
void main(){
 Table_Init();
   
Menu_select();
}
//系统主菜单
void Main_Menu(){
   
printf("\n*********************************\n");
 printf("餐厅服务系统\n");
 printf("\n*********************************\n");
 printf("1.点菜\n");
 printf("2.客户结账\n");
 printf("3.账目管理\n");
   
printf("4.餐厅统计\n");
 printf("5.退出系统\n");
}
//选择功能
void Menu_select(void){
    ORDER*
head;
 int choose;
 int result;
 head=NULL;
 system("cls");
 do{
   
LOAD_Dish();
   
Main_Menu();
   
printf("请选择:\n");
   
fflush(stdin);
   
scanf("%d",&choose);
   
switch(choose){
       
case 1:  result=search();
          
if(result==1)
          
printf("您可以在%d号餐桌就餐\n",result);
          
else
          
printf("您和您的朋友可以在%d号餐桌就餐\n",result);
          
Dish_Menu();
          
head=Dish_Order(head,CreateOne(result));
          
break;
    
case 2:  head=Payment(head);
          
break;
    
case 3:  List_Management();
          
break;
    
case 4:  Get_Rank();
          
break;
    
case 5:  exit(1);
          
break;
    }
 }while(1);
}
//从文件中读取菜谱
void LOAD_Dish(void){
    FILE
*fp;
 int i;
 fp=fopen("dish_name.txt","r");
 for(i=0;i<D;i++)
 {
  
fscanf(fp,"%d\t%s\t%f\n",&dish[i].Dish_ID,dish[i].Dish_Name,&dish[i].Dish_Price);
 }
}
//餐桌初始化
void Table_Init(){
   
tb[0].Capacity=1;tb[0].Table_ID=1;
 tb[1].Capacity=1;tb[1].Table_ID=2;
 tb[2].Capacity=2;tb[2].Table_ID=3;
 tb[3].Capacity=2;tb[3].Table_ID=4;
 tb[4].Capacity=2;tb[4].Table_ID=5;
 tb[5].Capacity=3;tb[5].Table_ID=6;
 tb[6].Capacity=4;tb[6].Table_ID=7;
 tb[7].Capacity=4;tb[7].Table_ID=8;
 tb[8].Capacity=4;tb[8].Table_ID=9;
 tb[9].Capacity=4;tb[9].Table_ID=10;
}
//显示菜谱
void Dish_Menu(void){
    int i;
 printf("**********欢迎选购本店菜***********\n");
 printf("菜编号\t菜名\t菜单价\n");
 for(i=0;i<D;i++)
  printf("%d\t%s\t%f\n",dish[i].Dish_ID,dish[i].Dish_Name,dish[i].Dish_Price);      
}
//查找有没有匹配的餐桌
int search(void){
    int
Cust_Num;
 int i;
 printf("请输入来客量\n");
 scanf("%d",&Cust_Num);
 if(MaxCapacity<Cust_Num){
    
printf("抱歉,本店没有容纳%d的餐桌\n",Cust_Num);
  return -1;
 }
 while(Cust_Num<=MaxCapacity){
    
for(i=0;i<H;i++){
   if(tb[i].Table_State==0){
    if(tb[i].Capacity==Cust_Num)
     return
(tb[i].Table_ID);
   }
  }
  printf("抱歉,现在没有%d人桌\n",Cust_Num);
  Cust_Num+=1;
 }
 printf("餐桌已满,请客人稍等。");
 return -1;
}
//创建一份订单
ORDER*CreateOne(int result){
   
ORDER*p;
 int i;
 p=ASK;
 if(result!=-1){
   
p->Table_ID=result;
   
for(i=0;i<D;i++){
       
printf("请输入菜的编号,按0结束输入:");
    
scanf("%d",&p->Dish_ID[i]);
    
if((p->Dish_ID[i]<0)||(p->Dish_ID[i]>10)){
         
printf("超出菜谱范围,请重新输入\n");
    i--;
    
}
    
else if(p->Dish_ID[i]==0)
         
break;
    
else
     
p->Dish_ID[i]=0;
    }
   
tb[result-1].Table_State=1;
 }
 p->next=NULL;
 return p;
}
//添加到主链
ORDER* Dish_Order(ORDER *head,ORDER *p){
    ORDER
*p1;
 p1=head;
 if(p1!=NULL){
  if(p!=NULL){
   while(p1->next!=NULL){
      
p1=p1->next;   
   }
   p1->next=p;
   printf("创建订单成功\n");
  }
  else
   printf("创建订单失败\n");
 }
 else{
    
if(head==NULL&&p!=NULL)
   head=p;
 }
 return head;
}
//根据菜单的编号打印一道菜的信息
void Display(int ID){
    int
i=0;
 for(i=0;i<D;i++){
  if(dish[i].Dish_ID==ID){
     
printf("%d\t%s\t%f\n",dish[i].Dish_ID,dish[i].Dish_Name,&dish[i].Dish_Price);
   break;
  } 
 }
}
//将消费额写入菜单
void saveInList(float pay){
   
FILE*fp;
 time_t timer;
 timer=time(NULL);
 if((fp=fopen("账本.txt","a"))==NULL){
    
printf("操作失败\n");
  exit(1); 
 }
 fprintf(fp,"%f\t%s\n",pay,ctime(&timer));
 printf("账本保存成功\n");
 fclose(fp);
}
//将以结账的客户写入历史记录
void Save_Inform(ORDER *p,int m){
 FILE*fp;
 time_t timer;
 int i=0;
 timer=time(NULL);
 if((fp=fopen("历史记录.txt","a"))==NULL){
    
printf("操作失败\n");
  exit(1);