餐馆点菜系统C语言源代码分享!

餐馆点菜系统c语言的源代码,一些封装的函数,对链表的操作,还有文件的存取,供大家参考,具体内容如下

  #include "public.h"  struct NODE *myhead;  struct NODE *orderhead;  struct NODE *ashead;  char waiter_ID[4+1];    /*******************************设置输入框颜色*******************************************   名称:设置输入框颜色   参数:   iNum 表示: 编辑框的长度      功能:   *************************************************************************************/    void SetColorEdit(int iNum)  {   SetColor(4,14);   while (iNum--)   {   putchar(' ');   }  }    void SetColor(unsigned short ForeColor,unsigned short BackGroundColor)   {   HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);   SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));  }    /*******************************编辑框aUI函数*******************************************   名称:编辑框aUI函数   参数:   iLong 表示: 编辑框的长度   iWide 表示: 编辑框的宽度   x 表示: 编辑框起始行位置   y 表示: 编辑框起始列位置   acBuffer   表示: 编辑框显示的内容   功能:   在x行y列制作一个长为iLong宽为iWide的编辑框,框中文本显示acBuffer字符串的内容   *************************************************************************************/  void UI_EditBox(int iLong,int iWide,int x,int y,char acBuffer[30])  {   int i; /*宽*/   int j; /*长*/      Gotoxy(x,y);      for(i = 0; i <= iWide; i++)   {   Gotoxy(x+i,y);   if(i == 0 || i == iWide)   {   for(j = 0; j <= iLong; j++)   {   if(i == 0 && j == 0)   {    printf("┏");   }   else if(i == 0 && j == iLong)   {    printf("┓");   }   else if(i == iWide && j == 0)   {    printf("┗");   }   else if(i == iWide && j == iLong)   {    printf("┛");   }   else   {    printf("┅");   }    }    }   else   {   Gotoxy(x+i,y);    printf ("┇");   Gotoxy(x+i,y+2*iLong);   printf ("┇");   }   putchar ('n');   }      Gotoxy(x + 1,y + 2);   printf ("%s",acBuffer);  }    /*******************************文本框UI函数*******************************************   名称:编辑框UI函数   参数:   x 表示: 文本框起始行位置   y 表示: 文本框起始列位置   acBuffer   表示: 文本框显示的内容   功能:   在x行y列显示acBuffer字符串的内容   *************************************************************************************/    void UI_TestBox(int x,int y,char acBuffer[30])  {   Gotoxy(x,y);   printf ("%s",acBuffer);  }    /*******************************光标移动函数********************************   名称:光标移动函数   参数:   x 表示:行   y 表示:列   功能:   将光标移动至x行y列位置   **************************************************************************/  void Gotoxy(int x,int y)  {   CONSOLE_SCREEN_BUFFER_INFO   csbiInfo;           HANDLE  hConsoleOut;   hConsoleOut = GetStdHandle (STD_OUTPUT_HANDLE);   GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);    csbiInfo.dwCursorPosition.X = y;            csbiInfo.dwCursorPosition.Y = x;            SetConsoleCursorPosition (hConsoleOut,csbiInfo.dwCursorPosition);   }    /*******************************控制输入函数封装************************************     名称:允许输入字母和数字的函数   参数:   acStr 表示: 保存的数组   iMaxLen表示: 最大输入字符数   iPutType表示:    0 (无控制) 1(只能输入数字) 2(只能输入字母)    3 (只能输入数字和字母)   isPlaintext表示是否显示明文 1表示明文   iTmp 表示:为1(第一位不为空就能按回车键)    为2(达到最大位数才能回车)    为3(无控制)     **********************************************************************************/    int Glb_putString(char acStr[], int iMaxLen, int iPutType, int isPlaintext,int iTmp)   {   char Tmp;   int i = 0;   int j;   int flg;      for(j = 0;j < iMaxLen; j++)   {   acStr[j] = '';    }     while(1)   {   Tmp=getch();   //printf("%d",Tmp);   if(Tmp==27)   {   //printf("%d",Tmp);   return 1;   }   flg = 0;     if(Tmp == 13)   {   if(iTmp == 1) /*****第一位不为空就能按回车键*****/   {   if(acStr[0] != 0)   {    break;   }   }   else if(iTmp == 2) /******达到最大位数才能回车*****/   {   j = 0;   while(j < iMaxLen)   {    if(acStr[j] == '')    {    break;    }    j++;   }   if((j == iMaxLen))   {    flg = 1;   }   }   else if(iTmp == 3) /*******无控制*******/   {   break;     }   }   else if(Tmp == 8)   {   if(i > 0)   {   printf("b b");    acStr[--i] = '';    }   }   else    {   if(i < iMaxLen)   {   switch(iPutType)/****0(无控制) 1(只能输入数字) 2(只能输入字母) 3(只能输入数字和字母)*****/   {   case Not:    {     if(isPlaintext == NotPwd)    {    putchar(Tmp);    }    else    {    putchar('*');    }    acStr[i++] = Tmp;    }break;   case Int:    {    if(Tmp >= '0' && Tmp <= '9')    {    if(isPlaintext == NotPwd)    {    putchar(Tmp);    }    else    {    putchar('*');    }    acStr[i++] = Tmp;    }    }break;   case Char:    {    if((Tmp >= 'A' && Tmp <= 'Z') || (Tmp >='a' && Tmp <='z'))    {    if(isPlaintext == NotPwd)    {    putchar(Tmp);    }    else    {    putchar('*');    }    acStr[i++] = Tmp;    }    }break;   case IntOrChar:    {    if((Tmp >= 'A' && Tmp <= 'Z') || (Tmp >='a' && Tmp <='z') || (Tmp >= '0' && Tmp <= '9'))    {    if(isPlaintext == NotPwd)    {    putchar(Tmp);    }    else    {    putchar('*');    }    acStr[i++] = Tmp;    }    }break;   }    }   }   if(flg == 1) break;   }   acStr[i] = '';   return 0;  }    /*******************************链表初始化函数********************************   名称:链表初始化函数   参数:   data:数据   head:链表头指针   功能:   链表初始化   **************************************************************************/  void* LinkInit(void *data)  {   struct NODE *head;   head = (struct NODE*)malloc(sizeof(struct NODE));   if(head == NULL)   {   perror("linkinit error");   return NULL;   }   head->data = data;   head->NEXT = NULL;     return head;  }    /*******************************增加链表节点函数********************************   名称:增加链表节点函数   参数:   phead:链表头节点   data:数据   len:要操作的链表节点数据结构的大小   功能:   增加链表节点   **************************************************************************/  void LinkAddNode(struct NODE *phead, void *data, int len)  {   struct NODE *pNew;   struct NODE *pTemp;   pTemp = phead;   while(pTemp->NEXT != NULL)   {   pTemp = pTemp->NEXT;   }   pNew = (struct NODE *)malloc(sizeof(struct NODE));   if(pNew == NULL)   {   perror("LindAddNode error");   return;   }   else   {   pNew->data = malloc(len);   if(pNew->data == NULL)   {   perror("LindAddNode error");   return;   }   }   memcpy(pNew->data, data, len);   pNew->NEXT = NULL;   pTemp->NEXT = pNew;   return;  }    /*int DataInit()  {   int i;   struct MAN m[] =    {   {"1001", "admin", "123456", 0, 1},    {"1002", "manager", "123456", 1, 1},   {"1003", "waiter", "123456", 2, 1}   };   i = 0;   myhead = (struct NODE*)LinkInit(NULL);      for(i = 0; i < 3; i++)   {   LinkAddNode(myhead, &m[i], sizeof(m[i]));   }   return 0;  }*/    /*******************************释放链表函数********************************   名称:释放链表函数   参数:   phead:链表头节点   功能:   释放链表   **************************************************************************/  void LinkFreeNode(struct NODE *phead)  {   struct NODE *pTemp = phead;   //static int aaa = 0;   while(pTemp != NULL)   {   phead = phead->NEXT;   free(pTemp->data);   free(pTemp);   pTemp = phead;   //printf("释放次数=%dn", ++aaa);   }   return;  }    /*******************************打印链表函数********************************   名称:打印链表函数   参数:   phead:链表头节点   myprint:函数指针   data:要打印的数据   f:要打印的位置的行数   功能:   打印链表   **************************************************************************/  void LinkPrint(struct NODE *phead, void(*myprint)(void* data,int f))  {   int i=5;   struct NODE *pTemp = phead->NEXT;   while(pTemp != NULL)   {   Gotoxy(i++, 3);   myprint(pTemp->data,i);  //在第i行打印数据   pTemp = pTemp->NEXT;   }  }  /*******************************只打印在职人员信息节点函数********************************   名称:只打印在职人员信息节点函数   参数:   phead:链表头节点   myprint:函数指针   data:要打印的数据   f:要打印的位置的行数   功能:   只打印在职人员信息节点   **************************************************************************/  void Man_Half_Print(struct NODE *phead, void(*myprint)(void* data,int f))  {   int i=5;   struct NODE *pTemp = phead->NEXT;   while(pTemp != NULL)   {   if(((struct MAN*)(pTemp->data))->flag==49) //判断flag是否为1,若为1则为在职,将其打印   {   Gotoxy(i++, 3);   myprint(pTemp->data,i);   }   pTemp = pTemp->NEXT;   }  }  /*******************************只打印在用会员信息节点函数********************************   名称:只打印在用会员信息节点函数   参数:   phead:链表头节点   myprint:函数指针   data:要打印的数据   f:要打印的位置的行数   功能:   只打印在用会员信息节点   **************************************************************************/    void As_Half_Print(struct NODE *phead, void(*myprint)(void* data,int f))  {   int i=5;   struct NODE *pTemp = phead->NEXT;   while(pTemp != NULL)   {   if(((struct ASSOCIATOR*)(pTemp->data))->flag==49)   {   Gotoxy(i++, 3);   myprint(pTemp->data,i);   }   pTemp = pTemp->NEXT;   }  }    /*******************************只打印在用台桌信息节点函数********************************   名称:只打印在用台桌信息节点函数   参数:   phead:链表头节点   myprint:函数指针   data:要打印的数据   f:要打印的位置的行数   功能:   只打印在用台桌信息节点   **************************************************************************/    void Table_Half_Print(struct NODE *phead, void(*myprint)(void* data,int f))  {   int i=5;   struct NODE *pTemp = phead->NEXT;   while(pTemp != NULL)   {   if(((struct TABLE*)(pTemp->data))->role==49)   {   Gotoxy(i++, 3);   myprint(pTemp->data,i);   }   pTemp = pTemp->NEXT;   }  }  /*******************************只打印在用菜谱信息节点函数********************************   名称:只打印在用菜谱信息节点函数   参数:   phead:链表头节点   myprint:函数指针   data:要打印的数据   f:要打印的位置的行数   功能:   只打印在用菜谱信息节点   **************************************************************************/  void Dish_Half_Print(struct NODE *phead, void(*myprint)(void* data,int f))  {   int i=4;   struct NODE *pTemp = phead->NEXT;   while(pTemp != NULL)   {   if(((struct DISH*)(pTemp->data))->flag==49)   {   Gotoxy(i++, 3);   myprint(pTemp->data,i);   }   pTemp = pTemp->NEXT;   }  }  /*******************************打印每个员工信息节点函数********************************   名称:打印每个员工信息节点函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印每个员工信息节点   **************************************************************************/    void ManPrint(void *data,int i)  {   Gotoxy(i, 3);   printf("%s",((struct MAN*)data)->id);   Gotoxy(i, 19);   printf("%s",((struct MAN*)data)->name);   Gotoxy(i, 35);   printf("*******");   Gotoxy(i, 51);   if(((struct MAN*)data)->role==48)   printf("管理员");   if(((struct MAN*)data)->role==49)   printf("经理");   if(((struct MAN*)data)->role==50)   printf("服务员");     Gotoxy(i, 67);   if(((struct MAN*)data)->flag==48)   printf("离职");   if(((struct MAN*)data)->flag==49)   printf("在职");  }  /*******************************打印每会员信息节点函数********************************   名称:打印每个会员信息节点函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印每个会员信息节点   **************************************************************************/    void AsPrint(void *data,int i)  {   Gotoxy(i, 3);   printf("%s",((struct ASSOCIATOR*)data)->no);   Gotoxy(i, 19);   printf("%s",((struct ASSOCIATOR*)data)->name);   Gotoxy(i, 35);   printf("%s",((struct ASSOCIATOR*)data)->score);   Gotoxy(i, 51);   printf("%c",((struct ASSOCIATOR*)data)->flag);  }    /*******************************打印每个台桌信息节点函数********************************   名称:打印每个台桌信息节点函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印每个台桌信息节点   **************************************************************************/  void TablePrint(void *data,int i)  {   Gotoxy(i, 3);   printf("%s",((struct TABLE*)data)->no);   Gotoxy(i, 24);   printf("%s",((struct TABLE*)data)->flag);   Gotoxy(i, 45);   printf("%s",((struct TABLE*)data)->des);    }    /*******************************打印每个菜品信息节点函数********************************   名称:打印每个菜品信息节点函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印每个菜品信息节点   **************************************************************************/  void DishPrint(void *data,int i)  {   Gotoxy(i, 3);   printf("%s",((struct DISH*)data)->no);   Gotoxy(i, 24);   printf("%s",((struct DISH*)data)->name);   Gotoxy(i, 45);   printf("¥%s",((struct DISH*)data)->price);  }  /*******************************点菜并显示函数********************************   名称:点菜并显示函数   参数:   phead:链表头结点   data:订单中点的菜的节点数据   pTmp:指向菜谱节点的指针   money:点的菜的单价的合计   f:标志位   n:份数   功能:   点菜并显示   **************************************************************************/  void Link_Dish_Print(struct NODE *phead,void *data)  {   int i=5,j,n=0,money=0,f;   struct NODE *pTemp = phead->NEXT;   while(pTemp != NULL)   {   f=0;   Gotoxy(i, 3);   for(j=0;j<11;j++)   {   if(strcmp((((struct ORDER*)data)->x[j]).no,((struct DISH*)(pTemp->data))->no)==0) //找到订单对应的 点的菜 的节点,并从菜谱中获取该菜的单价   {   n=number_change((((struct ORDER*)data)->x[j]).num)+n;   money=number_change(((struct DISH*)(pTemp->data))->price)*number_change((((struct ORDER*)data)->x[j]).num)+money;   order_dish_difprint(pTemp->data,i++,number_change((((struct ORDER*)data)->x[j]).num)); //有“*”号的打印函数   f=1;   }   }   if(f==0 && ((struct DISH*)(pTemp->data))->flag==49)   order_dish_print(pTemp->data,i++);    //无“*”号的打印函数   pTemp = pTemp->NEXT;   //i++;   }   char_change(money,((struct ORDER*)data)->money);   //将char类型转换为int类型的函数   Gotoxy(18, 44);   printf("%d",money);   Gotoxy(18, 66);   printf("%d",n);  }  /*******************************打印点菜界面中每个菜品信息节点函数********************************   名称:打印点菜界面中每个菜品信息节点函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印点菜界面中每个菜品信息节点   **************************************************************************/  void order_dish_print(void *data,int i)  {   Gotoxy(i, 4);   printf("%s",((struct DISH*)data)->no);   Gotoxy(i, 24);   printf("%s",((struct DISH*)data)->name);   Gotoxy(i, 45);   printf("¥%s",((struct DISH*)data)->price);   Gotoxy(i, 66);   printf("%s",((struct DISH*)data)->num);  }  /*******************************打印点菜界面中带“*”的每个菜品信息节点函数********************************   名称:打印点菜界面中带“*”的每个菜品信息节点函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印点菜界面中带“*”的每个菜品信息节点   **************************************************************************/  void order_dish_difprint(void *data,int i,int num)  {   Gotoxy(i, 3);   putchar('*');   Gotoxy(i, 4);   printf("%s",((struct DISH*)data)->no);   Gotoxy(i, 24);   printf("%s",((struct DISH*)data)->name);   Gotoxy(i, 45);   printf("¥%s",((struct DISH*)data)->price);   Gotoxy(i, 66);   printf("%d",num);  }  /*******************************打印买单界面中每个订单节点信息函数********************************   名称:打印买单界面中每个订单节点信息函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印买单界面中每个订单节点信息   **************************************************************************/  void Order_Checkout_Print(void *data,int i)  {   Gotoxy(i, 3);   printf("%s",((struct ORDER*)data)->order_no);   Gotoxy(i, 24);   printf("¥%s",((struct ORDER*)data)->money);   Gotoxy(i, 45);   printf("%s",((struct ORDER*)data)->order_flag);  }  /*******************************打印营业额查询界面中每个已买单订单节点信息函数********************************   名称:打印营业额查询界面中每个已买单订单节点信息函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印营业额查询界面中每个已买单订单节点信息   **************************************************************************/  void Order_Checkouted_Print(void *data,int i)  {   Gotoxy(i, 3);   printf("%s",((struct ORDER*)data)->order_no);   Gotoxy(i, 24);   printf("%s",((struct ORDER*)data)->time);   Gotoxy(i, 45);   printf("¥%s",((struct ORDER*)data)->money);  }  /*******************************打印订单查询界面中每个订单节点信息函数********************************   名称:打印订单查询界面中每个订单节点信息函数   参数:   data:要打印的数据   i:在第i行打印   功能:   打印订单查询界面中每个订单节点信息   **************************************************************************/  void Check_Order_id(void *data,int i)  {   Gotoxy(i, 3);   printf("%s",((struct ORDER*)data)->order_no);   Gotoxy(i, 18);   printf("%s",((struct ORDER*)data)->time);   Gotoxy(i, 33);   printf("¥%s",((struct ORDER*)data)->money);   Gotoxy(i, 48);   printf("%s",((struct ORDER*)data)->order_flag);    }  /*******************************从链表写入数据到文件函数********************************   名称:从链表写入数据到文件函数   参数:   phead:链表头指针   datalen:单个节点的大小   f:标志位,判断要写入哪个的文件   功能:   从链表写入数据到文件   **************************************************************************/  int linktofile(struct NODE *phead, int datalen,int f)  {   FILE *fp;   struct NODE *pTemp = phead->NEXT;   if(f==1)   fp = fopen("./maninfo.txt", "wb+");  //写入人员文件   else if(f==2)   fp = fopen("./tableinfo.txt", "wb+");  //写入台桌文件   else if(f==3)   fp = fopen("./dishinfo.txt", "wb+");  //写入菜谱文件   else if(f==4)   fp = fopen("./orderinfo.txt", "wb+");  //写入订单文件   else if(f==5)   fp = fopen("./associatorinfo.txt", "wb+");   //写入会员文件   if(fp == NULL)   {   perror("open file(man)");   return -1;   }   while(pTemp != NULL)   {      fwrite(pTemp->data, 1, datalen, fp);   pTemp = pTemp->NEXT;   }   LinkFreeNode(phead);   if(f==4)           //释放内存中的链表   orderhead = (struct NODE*)LinkInit(NULL);   if(f==5)   ashead = (struct NODE*)LinkInit(NULL);   if(f!=4 && f!=5)    myhead = (struct NODE*)LinkInit(NULL);   fclose(fp);   return 0;  }  /*******************************从文件中读出数据到链表函数********************************   名称:从文件中读出数据到链表函数   参数:   phead:链表头指针   datalen:单个节点的大小   f:标志位,判断要写入哪个的文件   功能:   从文件中读出数据到链表   **************************************************************************/  void linkfromfile(struct NODE *phead,int datalen,int f)  {   int x,i;   FILE *fp;   void *q;   q=(void *)malloc(datalen);   //struct MAN *q;   //q=new MAN;   memset(q, 0, sizeof(datalen));   if(f==1)   fp = fopen("./maninfo.txt", "rb+");   else if(f==2)   fp = fopen("./tableinfo.txt", "rb+");   else if(f==3)   fp = fopen("./dishinfo.txt", "rb+");   else if(f==4)   fp = fopen("./orderinfo.txt", "rb+");   else if(f==5)   fp = fopen("./associatorinfo.txt", "rb+");   if(fp == NULL)   {   return ;   }   fseek(fp,0,SEEK_END);   x=ftell(fp);   rewind(fp);   //printf("%dn",(x/datalen));   for(i=0;i<(x/datalen);i++)   {   fread(q,1,datalen,fp);   if(q==NULL)   {   printf("无数据记录n");   }   LinkAddNode(phead,q,datalen);   }   free(q);   q=NULL;   fclose(fp);  }  /*******************************从链表中获取指定节点函数********************************   名称:从链表中获取指定节点函数   参数:   iIndex:指定位置的参数   phead:链表头指针   f:标志位,判断是对哪种链表的操作   功能:   从链表中获取指定节点   **************************************************************************/  NODE* LIST_GetNode(int iIndex,struct NODE *phead,int f)  {   int n;   struct NODE *tmp=NULL;   tmp=phead->NEXT;   while(tmp!=NULL)   {   if(f==1)   n=number_change(((struct MAN *)(tmp->data))->id);   else if(f==2)   n=number_change(((struct TABLE *)(tmp->data))->no);   else if(f==3)   n=number_change(((struct DISH *)(tmp->data))->no);   else if(f==4)   n=number_change(((struct ASSOCIATOR *)(tmp->data))->no);   if(n==iIndex)   break;   tmp=tmp->NEXT;   }   if(tmp== NULL)   {   perror("未找到指定的结点索引");   return 0;   }   return tmp;  }  /*******************************从链表中删除指定节点函数(真删除)********************************   名称:从链表中删除指定节点函数   参数:   iIndex:指定位置的参数   phead:链表头指针   f:标志位,判断是对哪种链表的操作   功能:   从链表中删除指定节点   **************************************************************************/  void LIST_Del(int iIndex,struct NODE *phead,int f)  {   int n;   struct NODE *tmp=NULL,*pre=NULL;   tmp=phead->NEXT;   pre=phead;   while(tmp!=NULL)   {   if(f==1)   n=number_change(((struct MAN *)(tmp->data))->id);   else if(f==2)   n=number_change(((struct TABLE *)(tmp->data))->no);   else if(f==3)   n=number_change(((struct DISH *)(tmp->data))->no);   else if(f==4)   n=number_change(((struct ASSOCIATOR *)(tmp->data))->no);   if(n==iIndex)   break;   pre=tmp;   tmp=tmp->NEXT;   //tmp=tmp->NEXT;   }   //printf("%dn",n);   if(tmp== NULL)   {   perror("未找到指定的结点索引");   return ;   }   pre->NEXT=tmp->NEXT;   free(tmp);   return;  }  /*******************************从链表中删除指定节点函数(假删除)********************************   名称:从链表中删除指定节点函数   参数:   iIndex:指定位置的参数   phead:链表头指针   f:标志位,判断是对哪种链表的操作   功能:   从链表中删除指定节点   **************************************************************************/  void LIST_Del_FS(int iIndex,struct NODE *phead,int f)  {   int n;   struct NODE *tmp;   tmp=phead->NEXT;   while(tmp!=NULL)   {   if(f==1)   n=number_change(((struct MAN *)(tmp->data))->id);   else if(f==2)   n=number_change(((struct TABLE *)(tmp->data))->no);   else if(f==3)   n=number_change(((struct DISH *)(tmp->data))->no);   else if(f==4)   n=number_change(((struct ASSOCIATOR *)(tmp->data))->no);   if(n==iIndex)   break;   tmp=tmp->NEXT;   }   if(tmp== NULL)     //改变节点的状态   {   perror("未找到指定的结点索引");   return ;   }   if(f==1)   ((struct MAN *)(tmp->data))->flag=48;   if(f==2)   ((struct TABLE *)(tmp->data))->role=48;   if(f==3)   ((struct DISH *)(tmp->data))->flag=48;   if(f==4)   ((struct ASSOCIATOR *)(tmp->data))->flag=48;   return;  }  /*******************************将char类型转换为int类型的函数********************************   名称:将char类型转换为int类型的函数   参数:   id:char类型数组指针   功能:   将char类型转换为int类型的   **************************************************************************/  int number_change(char *id)  {   int num=0,i,n=1;   for(i=0;i<strlen(id);i++)   {   num=(id[strlen(id)-i-1]-48)*n+num;   n=n*10;   }   return num;  }  /*******************************将int类型转换为char类型的函数********************************   名称:将int类型转换为char类型的函数   参数:   n: int类型数据   p:char类型数组指针   功能:   将int类型转换为char类型的   **************************************************************************/  void char_change(int n,char *p)  {   int num[10+1];   int i=0,j=0;   memset(p,0,sizeof(p));   while(n)   {   num[i]=n%10;   n=n/10;   i++;   }   while(i)   {   p[j++]=num[--i]+48;   }  }  /*******************************登录时的人员识别函数********************************   名称:登录时的人员识别函数   参数:   acStr1[]: 输入的用户名   acStr2[]:输入的密码   datalen:单个节点的大小   功能:   登录时的人员识别   **************************************************************************/  char real_identifine(char acStr1[],char acStr2[],int datalen)  {   int f;   struct NODE *tmp=NULL;   if(!strcmp(acStr1,"admin"))    //超级用户   {   if(!strcmp(acStr2,"123456"))   {   return '3';   }   else   printf("密码错误!");   }   linkfromfile(myhead,datalen,1);   tmp=myhead->NEXT;   while(tmp)    //遍历人员链表查找是否存在,如果存在返回其对应角色   {   if(!strcmp(acStr1,((struct MAN *)(tmp->data))->id))   {   if(!strcmp(acStr2,((struct MAN *)(tmp->data))->pwd))   {   return ((struct MAN *)(tmp->data))->role;   }   else   printf("密码错误!");   }   tmp=tmp->NEXT;   }   printf("用户不存在!");   /*if(tmp== NULL)   {   perror("未找到指定的结点索引");   return 0;   }*/  }  /*******************************初始化订单节点函数********************************   名称:初始化订单节点函数   参数:   no:订单对应的台桌编号   n:记录订单个数的缓冲数据   m:创建的订单节点   功能:   初始化订单节点   **************************************************************************/  void OrderData(char *no)  {   time_t t=time(0);   char time[11];   int n;   struct ORDER m;   memset(&m,0,sizeof(struct ORDER));   n=1000+link_sum(orderhead,sizeof(struct ORDER),4);   char_change(n,m.order_no);     //memcpy(m.man_id,id,5);   strcpy(m.man_id,waiter_ID);   //strcpy(m.man_id,"1001");     memcpy(m.table_no,no,11);     strftime(time, sizeof(time), "%Y%m%d",localtime(&t));   memset(m.time,0,sizeof(m.time));   strcpy(m.time,time);     strcpy(m.order_flag,"未付款");     strcpy(m.money,"0");     memset(m.x,0,sizeof(m.x));     linkfromfile(orderhead,sizeof(m),4);    //从文件中读出订单链表   LinkAddNode(orderhead, &m, sizeof(m));   //在链表中加入新创建的订单节点    linktofile(orderhead, sizeof(m),4);    //将链表写入文件  }    /*******************************计算文件中节点个数函数********************************   名称:计算文件中节点个数函数   参数:   phead:链表头指针   datalen:单个节点的大小   f:标志位,判断是哪个文件   功能:   计算文件中节点个数   **************************************************************************/  int link_sum(struct NODE *phead,int datalen,int f)  {   int x,i;   FILE *fp;     if(f==1)   fp = fopen("./maninfo.txt", "rb+");   else if(f==2)   fp = fopen("./tableinfo.txt", "rb+");   else if(f==3)   fp = fopen("./dishinfo.txt", "rb+");   else if(f==4)   fp = fopen("./orderinfo.txt", "rb+");   else if(f==5)   fp = fopen("./associatorinfo.txt", "rb+");   if(fp == NULL)   {   return 0;   }   fseek(fp,0,SEEK_END);   x=ftell(fp);   rewind(fp);   return (x/datalen);      fclose(fp);  }  /*******************************在点菜界面中显示被占用的台桌的函数********************************   名称:在点菜界面中显示被占用的台桌的函数   参数:   i:行数   pTemp:链表中节点的指针   功能:   在点菜界面中显示被占用的台桌的   **************************************************************************/  void busy_table()  {   int i=5;   struct NODE *pTemp;   ui_function_table();     linkfromfile(myhead,sizeof(struct TABLE),2);  //从文件中读出台桌链表   pTemp = myhead->NEXT;   while(pTemp != NULL)   {   if(strcmp(((struct TABLE*)(pTemp->data))->flag,"占用")==0 && ((struct TABLE*)(pTemp->data))->role==49)//选取被占用且在用的台桌将其打印   {   Gotoxy(i++, 3);   TablePrint(pTemp->data,i);   }   pTemp = pTemp->NEXT;   }   LinkFreeNode(myhead);   myhead = (struct NODE*)LinkInit(NULL);  }  /*******************************在订单查询界面中显示未买单的订单信息函数********************************   名称:在订单查询界面中显示未买单的订单信息函数   参数:   i:行数   pTemp:链表中节点的指针   功能:   在订单查询界面中显示未买单的订单信息   **************************************************************************/  void un_checkout()  {   int i=5;   struct NODE *pTemp;   ui_function_checkout();     linkfromfile(orderhead,sizeof(struct ORDER),4);   pTemp = orderhead->NEXT;   while(pTemp != NULL)   {   if(strcmp(((struct ORDER*)(pTemp->data))->order_flag,"未付款")==0) //选取未付款的订单将其打印   {   Gotoxy(i++, 3);   Order_Checkout_Print(pTemp->data,i);   }   pTemp = pTemp->NEXT;   }   LinkFreeNode(orderhead);   orderhead = (struct NODE*)LinkInit(NULL);  }  /*******************************在营业额查询界面中显示已买单的订单信息函数********************************   名称:在营业额查询界面中显示已买单的订单信息函数   参数:   begin:开始时间   end: 结束时间   sum:总计金额   功能:   在营业额查询界面中显示已买单的订单信息   **************************************************************************/  void checkout_ed(char *begin,char *end)  {   int i=5,f=0,sum=0;   struct NODE *pTemp;   ui_function_checkmoney();      linkfromfile(orderhead,sizeof(struct ORDER),4);   pTemp = orderhead->NEXT;   while(pTemp != NULL)   {   if(number_change(((struct ORDER*)(pTemp->data))->time)>=number_change(begin) && number_change(((struct ORDER*)(pTemp->data))->time)<=number_change(end) && strcmp(((struct ORDER*)(pTemp->data))->order_flag,"已付款")==0)   {   Gotoxy(i++, 3);   Order_Checkouted_Print(pTemp->data,i);   f=1;   sum=number_change(((struct ORDER*)(pTemp->data))->money)+sum;   }   pTemp = pTemp->NEXT;   }   Gotoxy(15, 60);   printf("¥%d",sum);   if(f==0)   {   Gotoxy(6, 20);   printf("暂无数据!");   }   LinkFreeNode(orderhead);   orderhead = (struct NODE*)LinkInit(NULL);  }  /*******************************在订单查询界面中显示已买单和未买单的订单信息函数********************************   名称:在订单查询界面中显示已买单和未买单的订单信息   参数:   begin:开始时间   end: 结束时间   g: 指定是要查询已买单,还是未买单   功能:   在订单查询界面中显示已买单和未买单的订单信息   **************************************************************************/  void check_order_id(char *begin,char *end,int g)  {   int i=5,f=0,j=5;   struct NODE *pTemp,*p;   ui_function_checkorderid();      linkfromfile(orderhead,sizeof(struct ORDER),4);   linkfromfile(myhead,sizeof(struct MAN),1);     pTemp = orderhead->NEXT;   p=myhead->NEXT;   while(pTemp != NULL && g==50) //打印已付款   {   if(number_change(((struct ORDER*)(pTemp->data))->time)>=number_change(begin) && number_change(((struct ORDER*)(pTemp->data))->time)<=number_change(end) && strcmp(((struct ORDER*)(pTemp->data))->order_flag,"已付款")==0)   {   while(p != NULL)   {   if(strcmp(((struct MAN*)(p->data))->id,((struct ORDER*)(pTemp->data))->man_id)==0)   {    Gotoxy(j++, 63);    printf("%s",((struct MAN*)(p->data))->name);   }   p=p->NEXT;   }   p=myhead->NEXT;   Gotoxy(i, 3);   Check_Order_id(pTemp->data,i++);   f=1;      }   pTemp = pTemp->NEXT;   }   pTemp = orderhead->NEXT;   p=myhead->NEXT;   while(pTemp != NULL && g==49)  //打印未付款   {   if(number_change(((struct ORDER*)(pTemp->data))->time)>=number_change(begin) && number_change(((struct ORDER*)(pTemp->data))->time)<=number_change(end) && strcmp(((struct ORDER*)(pTemp->data))->order_flag,"未付款")==0)   {   while(p != NULL)   {   if(strcmp(((struct MAN*)(p->data))->id,((struct ORDER*)(pTemp->data))->man_id)==0)   {    Gotoxy(j++, 63);    printf("%s",((struct MAN*)(p->data))->name);   }   p=p->NEXT;   }   p=myhead->NEXT;   Gotoxy(i, 3);   Check_Order_id(pTemp->data,i++);   f=1;   }   pTemp = pTemp->NEXT;   }   if(f==0)   {   Gotoxy(6, 20);   printf("暂无数据!");   }   LinkFreeNode(orderhead);   orderhead = (struct NODE*)LinkInit(NULL);   LinkFreeNode(myhead);   myhead = (struct NODE*)LinkInit(NULL);  }  /*******************************在营收查询界面中显示已买单和未买单的订单信息函数********************************   名称:在营收查询界面中显示已买单的订单信息函数   参数:   begin:开始时间   end: 结束时间   sum:某服务员的总营业额   count:全体服务员的营收总额   功能:   在营收查询界面中显示已买单的订单信息   **************************************************************************/  void check_waiter_money(char *begin,char *end)  {   int i=5,sum,count=0;   struct NODE *pTemp;   struct NODE *p;   ui_count_director();      linkfromfile(orderhead,sizeof(struct ORDER),4);   linkfromfile(myhead,sizeof(struct MAN),1);   pTemp = orderhead->NEXT;   p=myhead->NEXT;     while(p != NULL)   {   sum=0;   if(((struct MAN*)(p->data))->role==50)   {   while(pTemp != NULL)   //选取订单中时间符合要求的,已付款的,对应员工的订单,并合计   {   if(number_change(((struct ORDER*)(pTemp->data))->time)>=number_change(begin) && number_change(((struct ORDER*)(pTemp->data))->time)<=number_change(end))    if(strcmp(((struct ORDER*)(pTemp->data))->order_flag,"已付款")==0)    if(strcmp(((struct MAN*)(p->data))->id,((struct ORDER*)(pTemp->data))->man_id)==0)    {    sum=number_change(((struct ORDER*)(pTemp->data))->money)+sum;    }    pTemp = pTemp->NEXT;   }   pTemp = orderhead->NEXT;   Gotoxy(i, 3);   printf("%s",((struct MAN*)(p->data))->name);   Gotoxy(i, 48);   printf("¥%d",sum);   i++;   }   count=count+sum;   Gotoxy(16, 60);   printf("¥%d",count);   p=p->NEXT;   }   /*if(f==0)   {   Gotoxy(24, 10);   printf("暂无数据!");   }*/   LinkFreeNode(orderhead);   orderhead = (struct NODE*)LinkInit(NULL);   LinkFreeNode(myhead);   myhead = (struct NODE*)LinkInit(NULL);  }      /*******************************加菜函数********************************   名称:加菜函数   参数:   data:订单节点数据部分   no:要指定的菜品编号   num:点菜的份数   功能:   加菜   **************************************************************************/  void add_dish(void *data,char *no,char *num)  {   int i,n;   for(i=0;i<11;i++)   {   if(strcmp((((struct ORDER*)data)->x[i]).no,no)==0)  //找到菜品的单价   {   n=number_change((((struct ORDER*)data)->x[i]).num)+number_change(num);   char_change(n,(((struct ORDER*)data)->x[i]).num);   //puts((((struct ORDER*)data)->x[i]).num);   return;   }   }   for(i=0;i<11;i++)   {   if((((struct ORDER*)data)->x[i]).no[0]=='')  //找到指定订单节点,加入点的菜的编号和份数   {   strcpy((((struct ORDER*)data)->x[i]).no,no);   n=number_change((((struct ORDER*)data)->x[i]).num)+number_change(num);   char_change(n,(((struct ORDER*)data)->x[i]).num);   return;   }   }  }  /*******************************退菜函数********************************   名称:退菜函数   参数:   data:订单节点数据部分   no:要指定的菜品编号   num:点菜的份数   功能:   退菜   **************************************************************************/  void sub_dish(void *data,char *no,char *num)  {   int i,n;   for(i=0;i<11;i++)   {   if(strcmp((((struct ORDER*)data)->x[i]).no,no)==0)   {   n=number_change((((struct ORDER*)data)->x[i]).num)-number_change(num);   char_change(n,((((struct ORDER*)data)->x[i]).num));   puts((((struct ORDER*)data)->x[i]).num);   if(n==0)   {   char_change(n,(((struct ORDER*)data)->x[i]).num);   memset((((struct ORDER*)data)->x[i]).no,0,sizeof((((struct ORDER*)data)->x[i]).no));   }     return;   }   }  }

更多学习资料请关注专题《管理系统开发》。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

—-想了解餐馆点菜系统C语言源代码分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/483295.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐