您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關餐館點菜系統中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語言源代碼的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。