欢迎来到入门教程网!

C语言

当前位置:主页 > 软件编程 > C语言 >

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

来源:本站原创|时间:2020-01-10|栏目: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] = '\0'; 
 }

 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] == '\0')
  {
  break;
  }
  j++;
 }
 if((j == iMaxLen))
 {
  flg = 1;
 }
 }
 else if(iTmp == 3) /*******无控制*******/
 {
 break;  
 }
 }
 else if(Tmp == 8)
 {
 if(i > 0)
 {
 printf("\b \b"); 
 acStr[--i] = '\0'; 
 }
 }
 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] = '\0';
 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("释放次数=%d\n", ++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("%d\n",(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("%d\n",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]=='\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;
 }
 }
}

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

上一篇:C++中this指针的理解与作用详解

栏    目:C语言

下一篇:KMP算法最浅显理解(小白教程)

本文标题:餐馆点菜系统C语言源代码

本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/119.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有