餐馆点菜系统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;
 }
 }
}

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

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

(0)

相关推荐

  • C语言实现餐饮点餐管理系统

    本文实例为大家分享了C语言实现餐饮点餐管理系统的具体代码,供大家参考,具体内容如下 具体代码如下 /* 项目名称:南航餐饮管理系统 组员:梁文新,刘青林,刘艺,施瑞文(组长) */ //当注册用户名为:root,密码为:root的账号时,系统默认为初始管理员 //头文件 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> #include<windows.h&g

  • C语言实现点餐系统

    本文实例为大家分享了C语言点餐系统的具体代码,供大家参考,具体内容如下 #include<iostream> #include<fstream> #include<string> #include<conio.h> using namespace std; class shiwu { public: string mingzi; int price; shiwu(){} shiwu(string n,int p):mingzi(n),price(p){} }

  • 基于C语言实现点菜系统

    本文实例为大家分享了C语言点菜系统的具体代码,供大家参考,具体内容如下 用C语言编写的简单的餐厅点菜系统,操作简单,代码不多,菜单可以自己更改,价格也是 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include"windows.h" struct cai /*cai结构体 实现对菜品 已点份数.名称.原材料 的记录*/ { int fenshu; char name[50]; in

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

    餐馆点菜系统c语言的源代码,一些封装的函数,对链表的操作,还有文件的存取,供大家参考,具体内容如下 #include "public.h" struct NODE *myhead; struct NODE *orderhead; struct NODE *ashead; char waiter_ID[4+1]; /*******************************设置输入框颜色******************************************* 名称:设置

  • C语言实现点菜系统

    本文实例为大家分享了C语言实现点菜系统的具体代码,供大家参考,具体内容如下 一.main.c #include<stdio.h> #include<string.h> #include<stdlib.h> #include<windows.h>//Sleep #include"user.h" #include"loginWin.h"//登录界面使用 #include"Admin.h"//管理员界面使

  • java实现饭店点菜系统

    本文实例为大家分享了java实现饭店点菜系统的具体代码,供大家参考,具体内容如下 JAVA实现饭店点菜系统 在这个暑假,我会将一些网络上比较经典的java编程练习题. 做一做,发布到博客来.是对我自己学习的监督,也是为了方便大家借鉴学习交流.大家一起共同进步. 这个点菜系统,和我之前Java课程设计中的小学生数学练习有点像.不过少了文件操作,相对比较简单. 我实现的效果 如图 最重要的 还是面向对象的思想,我们要理解并使用. 1.在点菜系统中,我们为了方便 饭店添加菜谱 ,我们要使用一个list

  • C语言实现航班售票系统 C语言实现航班管理系统

    本文实例为大家分享了C语言航班售票系统的具体代码,供大家参考,具体内容如下 题目描述:实现一个航班售票系统,每个航班应包括以下信息:航班号.起飞地.目的地.总座位数.余票数.乘客名单等:每个乘客的信息有:乘客姓名.证件号码.座位号等. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxFlight 32 //最大的航班数 #define MaxPassenger 1000 //最大

  • Java基础巩固小项目点菜系统的实现

    目录 项目简绍 所需技术 思路讲解 完整代码演示 优化 结语 项目简绍 点菜小系统,可以实现点菜,查看已经点的菜,买单查看总金额 所需技术 面向对象,集合(ArrayList) 因为项目真的很小,所需要技术很有限,真的比较简单 思路讲解 创建菜品类.属性 创建菜品列表并进行初始化 主菜单循环 对选项补充,创建所需方法 完善代码并测试 优化代码 完整代码演示 import java.util.ArrayList; import java.util.List; import java.util.Sc

  • 如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )

    语言之争由来已久,下面做一些IO实验(遍历9G多的文件,批量删除),尽量用事实来比较谁优谁劣.操作系统:win7 64 位,文件包大小:9.68G. 一.语言:C# 开发环境:vs 2013 代码总行数:43行 耗时:7秒 代码: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; n

  • js通过googleAIP翻译PHP系统的语言配置的实现代码

    因为php的配置一般用数据,正好和js里的对象表示一般,所以可以这样: 复制代码 代码如下: <script type="text/javascript" src="http://www.google.com/jsapi"></script> 复制代码 代码如下: var $strings={}; $strings['hide']='hide'; $strings['show']='show'; google.load("langu

  • Android实现系统语言切换功能

    简单介绍下这个需求的缘由,这段时间因公司业务需要,其中有一项"设置系统语言"功能,就是在使用APP的过程中,动态的去切换整个Android机器的语言,具体参照手机设置页面有语言切换功能.起初想来是很简单的事情嘛,不就是个简单的资源国际化嘛,strings.xml资源文件一整还不给OK?真正动起手来就真不是这么一回事了,国际化是没问题,但是怎样能更改所有页面的文字资源呢,这是一个问题.下面介绍下网上找的几个方案. 一.API欺骗 烧制到手机中的android.jar包含了Android所

  • C语言实现通讯录系统

    C语言通讯录系统实现,供大家参考,具体内容如下 需求分析: 利用文件读,写的方法 实现增加通讯录联系人信息 实现删除通讯录联系人信息 实现查找通讯录联系人信息 实现修改通讯录联系人信息 实现查看现有通讯录联系人信息 代码实现: // main.c // C语言通讯录实现 // // Created by Brisinga on 15/10/14. // Copyright © 2015年 yan. All rights reserved. // #include <stdio.h> #incl

随机推荐