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