餐饮管理系统源代码


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Menu {//定义菜单
 int num;//菜品编号
 char name[20];//菜品名字
 float price;//彩品价格
 struct Menu* next;//指针域
}M;//命名为M
typedef struct node {//定义用户
 char user[20];//用户名
 char password[20];//密码
 int vip;//标记是否为vip,0表示不是,1表示是
 struct node* next;//指针域
}N;//命名为N
typedef struct table {//定义餐桌存储用户点菜
 int num;//菜品编号
 char name[20];//菜品名称
 float price;//菜品单价
 struct table* next;//指针域
}T;//定义为T
float money[51];//记录餐桌消费金额
int flag = 0;//标记是否为vip
//新用户注册模块
N* create()
{
 N *head, *p, *q;//定义指针 
 int i;//判断是否开通vip
 head = (N *)malloc(sizeof(N));//头节点开辟空间
 head->next = NULL;//置空头节点的指针域 
 q = head;//q指针记录头节点的地址 
 p = head->next;//p指针记录头节点的指针域的地址 
  p = (N *)malloc(sizeof(N));//p指针开辟空间
  printf("请输入用户名\n");
  scanf("%s", p->user);
  printf("请输入密码\n");
  scanf("%s", p->password);
  printf("是否开通会员1.是2.否\n");//选择是否开通会员
  scanf("%d", &i);
  if (i == 1)//开通会员
   p->vip = 1;
  else//不开通会员
   p->vip = 0;
  p->next = NULL;//置空p节点的指针域  
  q->next = p;//p,q节点连接 
 return head;//返回链表的起始地址 
}
//点餐模块
T* order(M *headm)
{
 int num;//定义num用于点餐
 T *p, *q;//定义指针便于对链表操作
 M *s;//定义指针便于对链表操作
 T *headt = (T*)malloc(sizeof(T));//对餐桌链表开辟头节点
 p = headt;//p指针记录头节点
 q = headt->next;//q指针记录头节点的指针域
 s = headm->next;//s指针记录菜单链表头节点的指针域
 printf("请输入菜品编号,编号为零时结束点菜\n");
 scanf("%d", &num);
 while (num != 0)//停止点菜判断当输入编号为零时停止点餐
 {
  s = headm->next;//每次点菜都将指针返回至菜单链表的头节点的指针域
  q = (T *)malloc(sizeof(T));//为q指针开辟空间
  q->next = NULL;//置空指针域
  while(s)//当s指针不为空时循环
  {
   //判断是否找到菜品编号
   if (s->num == num)//为真时
      {
    //将菜品信息储存在餐桌链表中
       q->num = s->num;
       strcpy(q->name, s->name);
       q->price = s->price;
    p->next = q;//连接节点
    p = q;//指针后移
    break;
      }
      else//为假时
      {
       s = s->next;//指针后移
      }
  }
  scanf("%d", &num);//输入点菜编号
 }
 return headt;//返回餐桌链表的头节点
}
//登陆模块
int reginster1(N *headn)
{
 char user[20];//定义用户名
 char password[20];//定义密码
 printf("请输入用户名\n");
 scanf("%s", user);
 printf("请输入密码\n");
 scanf("%s", password);
 N *p;//定义指针便于链表操作
 p = headn->next;//记录头节点的指针域
 while (p)//查找用户
 {
  //对比用户名和密码
  if ((strcmp(user, p->user) == 0) && (strcmp(password, p->password) == 0))//为真时
  {
   //判断是否为vip
   if (p->vip == 1)//为真时
    flag = 1;//更改全局变量
   return 1;//退出函数并返回1表示登陆成功
  }
  else//为假时
   p = p->next;//指针后移
  if (!p)//p为空时停止循环
   break;
 }
 return 0;//否则返回0
}
//计算模块 
void cal(T *headt,int no)
{
 T *p;//定义p指针 
 int i;
 p = headt->next;//p记录头节点的指针域地址 
 money[no] = 0;
 while (p)//p不为空时进行计算 
 {
  money[no]+= p->price;
  p = p->next;//p指针后移 
 }
}
//插入节点模块(可多个插入) 
void insert(M *headm)
{
 int num, flag = 1;//flag实现判断指针是否到达最后一个节点 
  M *p, *q, *r; //定义指针便于插入操作
  printf("请输入要增加菜品编号,编号为零时结束\n");
 scanf("%d", &num);
 while (num != 0)//输入编号不为零时循环,以零终止,可实现多个插入 
 {
  r = (M *)malloc(sizeof(M));//为r开辟空间 
  r->next = NULL;//置空r的指针域 
  r->num = num;
  printf("请输入菜品名称和单价");
  scanf("%s %f", r->name,&r->price);
  q = headm;//q指针记录头节点的地址 
  p = headm->next;//p指针记录头节点的指针域的地址 
  while (q->next != NULL && p->num<r->num)//循环条件:当q->next不为空,以及p->num<r->num实现插入后无需排序 
  {
   p = p->next;//p指针后移 
   q = q->next;//q指针后移
   if (q->next == NULL)//这个判断防止q->next为空时,在执行循环是出现野指针使程序出错 
   {
    p = NULL;//防止出现野指针p 
    q->next = r;//连接节点 
    r->next = NULL;//置空r指针域 
    flag = 0;//到达最后一个节点更改flag 
    break;
   }
  }
  if (flag)//判断是否到达最后一个节点,为真执行该操作 
  {
   r->next = p;
   q->next = r;
   //实现将r节点插入链表 
  }
  printf("请输入菜品编号,编号为零结束");
  scanf("%d", &num);
 }
}
//删除节点模块 
void del1(M *headm)
{
 M *p, *q;//定义指针 
 int b;//用于输入编号查找删除 
 p = headm;//p记录头节点的地址 
 q = headm->next;//q记录头节点的指针域的地址 
 //输入编号 
 printf("请输入要删除菜品编号:");
 scanf("%d", &b);
 while (q != NULL)//q不为空时执行循环 
 {
  if (q->num == b)//判断是否找到输入的编号 
      //为真时 
  {
   p->next = q->next;//断开q节点 
   free(q);//释放q节点内存
   q = NULL; //置空q指针防止出现野指针 
  }
  else
  {
   //判断为假时 
   p = p->next;//p指针后移 
   q = q->next;//q指针后移 
  }
 }
 if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERROR INPUT
  printf("ERROR INPUT\n");
}
//删除节点模块
void del2(N *headn)
{
 N *p, *q;//定义指针 
 char user[20];//用于输入编号查找删除 
 p = headn;//p记录头节点的地址 
 q = headn->next;//q记录头节点的指针域的地址 
 //输入编号 
 printf("请输入要删除的用户的用户名:");
 scanf("%s",user);
 while (q != NULL)//q不为空时执行循环 
 {
  if (strcmp(user,q->user)==0)//判断是否找到输入的编号 
    //为真时 
  {
   p->next = q->next;//断开q节点 
   free(q);//释放q节点neicun 
   q = NULL; //置空q指针防止出现野指针 
  }
  else
  {
   //判断为假时 
   p = p->next;//p指针后移 
   q = q->next;//q指针后移 
  }
 }
 if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERROR INPUT
  printf("ERROR INPUT\n");
}
//删除节点模块 
void del3(T *headt)
{
 T *p, *q;//定义指针 
 int b;//用于输入编号查找删除 
 p = headt;//p记录头节点的地址 
 q = headt->next;//q记录头节点的指针域的地址 
     //输入编号 
 printf("请输入要删除菜品编号:");
 scanf("%d", &b);
 while (q != NULL)//q不为空时执行循环 
 {
  if (q->num == b)//判断是否找到输入的编号 
      //为真时 
  {
   p->next = q->next;//断开q节点 
   free(q);//释放q节点内存
   q = NULL; //置空q指针防止出现野指针 
  }
  else
  {
   //判断为假时 
   p = p->next;//p指针后移 
   q = q->next;//q指针后移 
  }
 }
 if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERROR INPUT
  printf("ERROR INPUT\n");
}
void mod1(M *headm)
{
 M *p;//定义指针便于链表操作
 //定义变量用于修改信息
 int num1, num2;
 char name[20];
 float price1;
 printf("请输入要修改的菜品编号:");
 scanf("%d", &num1);
 p = headm->next;//p指针记录头节点的指针域
 while (p != NULL)//p不为空时循环
 {
  if (p->num == num1)//判断是否找到
  {
   //修改信息
   printf("请重输入该菜品的编号,菜名,单价\n");
   scanf("%d %s %f", &num2, name, &price1);
   p->num = num2;
   strcpy(p->name, name);
   p->price = price1;
   break;
  }
  else
   //为假时 
   p = p->next;//指针后移 
 }
 if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT
  printf("ERROR INPUT\n");
}
void mod2(N *headn)
{
 N *p;//定义指针 
   //定义变量用于修改信息
 char user[20],user1[20],password[20];
 int vip;
 printf("请输入要修改的用户的用户名:");
 scanf("%s",user);
 p = headn->next;//p指针记录头节点的指针域
 while (p != NULL)//p不为空时循环
 {
  if (strcmp(user,p->user)==0)//判断是否找到
  {
   //修改信息
   printf("请重输入用户名,密码,是否为vip(0不是,1是)\n");
   scanf("%s %s %d", user1, password, &vip);
   strcpy(p->user, user1);
   strcpy(p->password, password);
   p->vip = vip;
   break;
  }
  else
   //为假时 
   p = p->next;//指针后移 
 }
 if (p == NULL)//查找到最后一个节点还未查到时,输出ERROR INPUT
  printf("ERROR INPUT\n");
}
//文件保存模块 
void save1(M *headm)
{
 FILE *inFile;//定义文件操作指针
 M *p;//链表操作指针
 p = headm->next;//p指针记录头结点的指针域
 inFile = fopen("C:\\papapa\\menu.txt", "w");//打开文件使用文件操作的只写
 while (p != NULL)//p不为空时循环
 {
  //将链表信息写入文件
  fprintf(inFile, "%d ", p->num);
  fprintf(inFile, "%s ", p->name);
  fprintf(inFile, "%f", p->price);
  fprintf(inFile, "\n");
  p = p->next;//指针后移
 }
 fclose(inFile);//关闭文件
 printf("save successfully\n");//保存成功
 getchar();
}
//文件读取模块 
M *read1()
{
 FILE *inFile;//定义文件操作指针
 M *headm, *p, *q;//定义链表操作指针
 headm = (M *)malloc(sizeof(M));//开辟空间
 headm->next = NULL;//置空指针域
 q = headm;//记录头节点地址
 p = headm->next;//记录头节点指针域的地址
 if ((inFile = fopen("C:\\papapa\\menu.txt", "r")) == NULL)//当文件为空时打开失败退出程序,使用文件操作的只读
 {
  printf("failed");
  exit(1);
 }
 p = (M *)malloc(sizeof(M));//开辟空间
 while (fscanf(inFile, "%d %s %f", &p->num, p->name,  &p->price) != EOF)//当读取到信息时执行循环并将信息读取到链表中
 {
  p->next = NULL;//置空指针域
  q->next = p;//连接节点
  q = p;//指针后移
  p = (M *)malloc(sizeof(M));//开辟空间
 }
 fclose(inFile);//关闭文件
 return headm;//返回头节点地址
}
//文件保存模块 
void save2(N *headn)
{
 FILE *inFile;//定义文件操作指针
 N *p;//链表操作指针
 p = headn->next;//p指针记录头结点的指针域
 inFile = fopen("C:\\papapa\\use.txt", "w");//打开文件使用文件操作的只写
 while (p != NULL)//p不为空时循环
 {
  //将链表信息写入文件
  fprintf(inFile, "%s ", p->user);
  fprintf(inFile, "%s ", p->password);
  fprintf(inFile, "%d", p->vip);
  fprintf(inFile, "\n");
  p = p->next;//指针后移
 }
 fclose(inFile);//关闭文件
 printf("save successfully\n");//保存成功
 getchar();
}
//文件读取模块 
N *read2()
{
 FILE *inFile;//定义文件操作指针
 N *headn, *p, *q;//定义链表操作指针
 headn = (N *)malloc(sizeof(N));//开辟空间
 headn->next = NULL;//置空指针域
 q = headn;//记录头节点地址
 p = headn->next;//记录头节点指针域的地址
 if ((inFile = fopen("C:\\papapa\\use.txt", "r")) == NULL)//当文件为空时打开失败退出程序,使用文件操作的只读
 {
  printf("failed");
  exit(1);
 }
 p = (N *)malloc(sizeof(N));//开辟空间
 while (fscanf(inFile, "%s %s %d", p->user, p->password, &p->vip) != EOF)//当读取到信息时执行循环并将信息读取到链表中
 {
  p->next = NULL;//置空指针域
  q->next = p;//连接节点
  q = p;//指针后移
  p = (N *)malloc(sizeof(N));//开辟空间
 }
 fclose(inFile);//关闭文件
 return headn;//返回头节点的指针域
}
void save3(N *headn)
{
 FILE *inFile;//定义文件操作指针
 N *p;//链表操作指针
 p = headn->next;//p指针记录头结点的指针域
 inFile = fopen("C:\\papapa\\use.txt", "a+");//打开文件使用文件操作的追加
 while (p != NULL)//p不为空时循环
 {
  //将链表信息写入文件
  fprintf(inFile, "%s ", p->user);
  fprintf(inFile, "%s ", p->password);
  fprintf(inFile, "%d", p->vip);
  fprintf(inFile, "\n");
  p = p->next;//指针后移
 }
 fclose(inFile);//关闭文件
 printf("save successfully\n");//保存成功
 getchar();
}
//作者查找模块
void search1(M *headm)
{
 M *p;//定义指针 
 char name[20];//定义name2用于输入查找
 printf("请输入要查找的菜品名:");
 scanf("%s", name);
 p = headm->next;
 while (p != NULL)
 {
  if (strcmp(p->name, name) == 0)//判断是否找到
  {
   //为真时,输出信息 
   printf("%d\t%s\t%.2f\n", p->num, p->name,p->price);
   break;
  }
  else
   //为假时 
   p = p->next;//指针后移 
 }
 if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT
  printf("ERROR INPUT\n");
}
//编号查找
void search2(M *head)
{
 M *p;//定义指针 
 int num1;//定义num1用于输入查找
 printf("请输入要查找的菜品编号:");
 scanf("%d", &num1);
 p = head->next;
 while (p != NULL)
 {
  if (p->num == num1)//判断是否找到
  {
   //为真时,输出信息 
   printf("%d\t%s\t%.2f\n", p->num, p->name, p->price);
   break;
  }
  else
   //为假时 
   p = p->next;//指针后移 
 }
 if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT
  printf("ERROR INPUT\n");
}
//输出链表模块 
void print1(M *headm)
{
 M *p = headm->next;
 printf("菜品编号\t菜品名称\t菜品单价\n");
 while (p)//当p不为空的时候执行 
 {
  printf("%d\t%s\t%f\n", p->num, p->name, p->price);
  p = p->next;//指针后移 
 }
}
void print2(N *headn)
{
 N *p = headn->next;
 printf("用户名\t密码\t是否为会员(0:否,1:是)\n");
 while (p)//当p不为空的时候执行 
 {
  printf("%s\t%s\t%d\n", p->user, p->password,p->vip);
  p = p->next;//指针后移 
 }
}
void print3(T *headt)
{
 T *p = headt->next;
 printf("菜品编号\t菜品名称\t菜品单价\n");
 while (p)//当p不为空的时候执行 
 {
  printf("%d\t%s\t%.2f\n", p->num, p->name, p->price);
  p = p->next;//指针后移 
 }
}
int main()
{
 int a = 1,a1=1,a2=1;
 int n,n1,n2,n3;
 int judge=0;
 int no,sum;
 N *headn;
 M *headm;
 T *headt;
 headn = read2();
 headm = read1();
 char admisionuser[20];
 char admisionpassword[20];
 printf("请选择1.管理员2.用户3.退出\n");
 scanf("%d", &n2);
 if (n2 == 1)
 {
  printf("请输入管理账号\n");
  scanf("%s", admisionuser);
  printf("请输入密码\n");
  scanf("%s", admisionpassword);
  if ((strcmp(admisionuser, "papapacanguan") == 0) && (strcmp(admisionpassword, "iloveyou") == 0))
  {
   printf("1.删除菜品\n2.添加菜品\n3.修改菜品\n4.删除用户\n5.修改用户\n6.退出\n");
   while (a2)
   {
    scanf("%d", &n3);
    switch (n3) {
    case 1:
     print1(headm);
     del1(headm);
     save1(headm);
     print1(headm);
     break;
    case 2:
     print1(headm);
     insert(headm);
     save1(headm);
     print1(headm);
     break;
    case 3:
     print1(headm);
     mod1(headm);
     save1(headm);
     print1(headm);
     break;
    case 4:
     print2(headn);
     del2(headn);
     save2(headn);
     print2(headn);
     break;
    case 5:
     print2(headn);
     mod2(headn);
     save2(headn);
     print2(headn);
     break;
    case 6:
     a2 = 0;
     break;
    }
   }
  }
 }
 else if (n2 == 2)
 {
  printf("新用户请选择注册,老用户请选择登录\n1.注册\n2.登陆\n3.退出\n");
  while (a)
  {
   scanf("%d", &n);
   switch (n) {
   case 1:
    headn = create();
    save3(headn);
    printf("注册成功请选择登录\n");
    break;
   case 2:
    headn = read2();
    judge = reginster1(headn);
    if (judge) {
     printf("登陆成功\n");
     printf("请输入桌号和人数");
     scanf("%d %d", &no, &sum);
     printf("1.菜品名称查询\n2.菜品编号查询\n3.点菜\n4.删除已点菜品\n5.退出\n");
     while (a1)
     {
      scanf("%d", &n1);
      switch (n1) {
      case 1:
       search1(headm);
       break;
      case 2:
       search2(headm);
       break;
      case 3:
       print1(headm);
       headt=order(headm);
       cal(headt, no);
       printf("桌号:%d 人数:%d\n", no, sum);
       if (flag)
       {
        printf("实际消费总金额:%.2f\n", money[no]);
        printf("应付消费总金额:%.2f\n", money[no] * 0.88);
       }
       else
        printf("消费总金额:%.2f\n", money[no]);
       printf("点餐明细\n");
       print3(headt);
       break;
      case 4:
       print3(headt);
       del3(headt);
       cal(headt, no);
       printf("桌号:%d 人数:%d\n", no, sum);
       if (flag)
       {
        printf("实际消费总金额:%.2f\n", money[no]);
        printf("应付消费总金额:%.2f\n", money[no] * 0.88);
       }
        
       else
        printf("消费总金额:%.2f\n", money[no]);
       printf("点餐明细\n");
       print3(headt);
       break;
      case 5:
       a1 = 0;
       break;
      }
     }
    }
    else
    {
     printf("登陆失败\n");
    }
    break;
   case 3:
    a = 0;
    break;
   }
  }
 }
 else
  return 0;
 
}


  • 22
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
PHP餐饮管理系统源码是一种以PHP语言编写的用于餐饮行业的管理软件源代码。该系统可以帮助餐饮企业实现订单管理、菜单管理、员工管理、库存管理、财务管理等功能。 首先,订单管理是该系统的重要功能之一。用户可以通过系统进行在线订购,系统会自动接收并记录订单信息,同时可以查询历史订单,方便管理与盘点。 其次,菜单管理功能可以方便餐饮企业添加、修改和删除菜品。系统可以支持设置菜品图片、菜品价格、推荐菜品等,并提供搜索功能以方便用户查找所需菜品。 员工管理功能可以帮助餐饮企业对员工进行管理与分配。企业可以在系统中添加员工信息,包括姓名、工号、职位等,并可以对员工进行权限设置,保证数据安全性。 库存管理功能可以实时监控餐饮企业的库存情况,当库存低于设定的阈值时,系统会自动提醒补货。这样,可以避免因库存不足导致的服务中断或延误问题。 财务管理功能可以帮助企业进行财务数据的记录和统计。包括销售额、成本、利润等数据的录入和报表的生成。系统也可以支持多种支付方式,方便用户进行支付。 总之,PHP餐饮管理系统源码是一种功能完备的管理软件,可以帮助餐饮企业提高运营效率,减少人力成本,并提供了全面的数据支持,为企业决策提供了有效的参考依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值