溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

餐館點菜系統(tǒng)中C語言源代碼的示例分析

發(fā)布時間:2021-09-02 10:14:58 來源:億速云 閱讀:150 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關餐館點菜系統(tǒng)中C語言源代碼的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

餐館點菜系統(tǒng)c語言的源代碼,一些封裝的函數(shù),對鏈表的操作,還有文件的存取,供大家參考,具體內(nèi)容如下

#include "public.h"
struct NODE *myhead;
struct NODE *orderhead;
struct NODE *ashead;
char waiter_ID[4+1];

/*******************************設置輸入框顏色*******************************************
 名稱:設置輸入框顏色
 參數(shù):
 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函數(shù)*******************************************
 名稱:編輯框aUI函數(shù)
 參數(shù):
 iLong 表示: 編輯框的長度
 iWide 表示: 編輯框的寬度
 x 表示: 編輯框起始行位置
 y 表示: 編輯框起始列位置
 acBuffer
 表示: 編輯框顯示的內(nèi)容
 功能:
 在x行y列制作一個長為iLong寬為iWide的編輯框,框中文本顯示acBuffer字符串的內(nèi)容
 *************************************************************************************/
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函數(shù)*******************************************
 名稱:編輯框UI函數(shù)
 參數(shù):
 x 表示: 文本框起始行位置
 y 表示: 文本框起始列位置
 acBuffer
 表示: 文本框顯示的內(nèi)容
 功能:
 在x行y列顯示acBuffer字符串的內(nèi)容
 *************************************************************************************/

void UI_TestBox(int x,int y,char acBuffer[30])
{
 Gotoxy(x,y);
 printf ("%s",acBuffer);
}

/*******************************光標移動函數(shù)********************************
 名稱:光標移動函數(shù)
 參數(shù):
 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); 
}

/*******************************控制輸入函數(shù)封裝************************************

 名稱:允許輸入字母和數(shù)字的函數(shù)
 參數(shù):
 acStr 表示: 保存的數(shù)組
 iMaxLen表示: 最大輸入字符數(shù)
 iPutType表示: 
 0 (無控制) 1(只能輸入數(shù)字) 2(只能輸入字母)
  3 (只能輸入數(shù)字和字母)
 isPlaintext表示是否顯示明文 1表示明文
 iTmp 表示:為1(第一位不為空就能按回車鍵)
  為2(達到最大位數(shù)才能回車)
  為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) /******達到最大位數(shù)才能回車*****/
 {
 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(只能輸入數(shù)字) 2(只能輸入字母) 3(只能輸入數(shù)字和字母)*****/
 {
 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;
}

/*******************************鏈表初始化函數(shù)********************************
 名稱:鏈表初始化函數(shù)
 參數(shù):
 data:數(shù)據(jù)
 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;
}

/*******************************增加鏈表節(jié)點函數(shù)********************************
 名稱:增加鏈表節(jié)點函數(shù)
 參數(shù):
 phead:鏈表頭節(jié)點
 data:數(shù)據(jù)
 len:要操作的鏈表節(jié)點數(shù)據(jù)結構的大小
 功能:
 增加鏈表節(jié)點
 **************************************************************************/
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;
}*/

/*******************************釋放鏈表函數(shù)********************************
 名稱:釋放鏈表函數(shù)
 參數(shù):
 phead:鏈表頭節(jié)點
 功能:
 釋放鏈表
 **************************************************************************/
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("釋放次數(shù)=%d\n", ++aaa);
 }
 return;
}

/*******************************打印鏈表函數(shù)********************************
 名稱:打印鏈表函數(shù)
 參數(shù):
 phead:鏈表頭節(jié)點
 myprint:函數(shù)指針
 data:要打印的數(shù)據(jù)
 f:要打印的位置的行數(shù)
 功能:
 打印鏈表
 **************************************************************************/
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行打印數(shù)據(jù)
 pTemp = pTemp->NEXT;
 }
}
/*******************************只打印在職人員信息節(jié)點函數(shù)********************************
 名稱:只打印在職人員信息節(jié)點函數(shù)
 參數(shù):
 phead:鏈表頭節(jié)點
 myprint:函數(shù)指針
 data:要打印的數(shù)據(jù)
 f:要打印的位置的行數(shù)
 功能:
 只打印在職人員信息節(jié)點
 **************************************************************************/
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;
 }
}
/*******************************只打印在用會員信息節(jié)點函數(shù)********************************
 名稱:只打印在用會員信息節(jié)點函數(shù)
 參數(shù):
 phead:鏈表頭節(jié)點
 myprint:函數(shù)指針
 data:要打印的數(shù)據(jù)
 f:要打印的位置的行數(shù)
 功能:
 只打印在用會員信息節(jié)點
 **************************************************************************/

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;
 }
}

/*******************************只打印在用臺桌信息節(jié)點函數(shù)********************************
 名稱:只打印在用臺桌信息節(jié)點函數(shù)
 參數(shù):
 phead:鏈表頭節(jié)點
 myprint:函數(shù)指針
 data:要打印的數(shù)據(jù)
 f:要打印的位置的行數(shù)
 功能:
 只打印在用臺桌信息節(jié)點
 **************************************************************************/

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;
 }
}
/*******************************只打印在用菜譜信息節(jié)點函數(shù)********************************
 名稱:只打印在用菜譜信息節(jié)點函數(shù)
 參數(shù):
 phead:鏈表頭節(jié)點
 myprint:函數(shù)指針
 data:要打印的數(shù)據(jù)
 f:要打印的位置的行數(shù)
 功能:
 只打印在用菜譜信息節(jié)點
 **************************************************************************/
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;
 }
}
/*******************************打印每個員工信息節(jié)點函數(shù)********************************
 名稱:打印每個員工信息節(jié)點函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印每個員工信息節(jié)點
 **************************************************************************/

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("經(jīng)理");
 if(((struct MAN*)data)->role==50)
 printf("服務員");

 Gotoxy(i, 67);
 if(((struct MAN*)data)->flag==48)
 printf("離職");
 if(((struct MAN*)data)->flag==49)
 printf("在職");
}
/*******************************打印每會員信息節(jié)點函數(shù)********************************
 名稱:打印每個會員信息節(jié)點函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印每個會員信息節(jié)點
 **************************************************************************/

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);
}

/*******************************打印每個臺桌信息節(jié)點函數(shù)********************************
 名稱:打印每個臺桌信息節(jié)點函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印每個臺桌信息節(jié)點
 **************************************************************************/
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);

}

/*******************************打印每個菜品信息節(jié)點函數(shù)********************************
 名稱:打印每個菜品信息節(jié)點函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印每個菜品信息節(jié)點
 **************************************************************************/
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);
}
/*******************************點菜并顯示函數(shù)********************************
 名稱:點菜并顯示函數(shù)
 參數(shù):
 phead:鏈表頭結點
 data:訂單中點的菜的節(jié)點數(shù)據(jù)
 pTmp:指向菜譜節(jié)點的指針
 money:點的菜的單價的合計
 f:標志位
 n:份數(shù)
 功能:
 點菜并顯示
 **************************************************************************/
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) //找到訂單對應的 點的菜 的節(jié)點,并從菜譜中獲取該菜的單價
 {
 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)); //有“*”號的打印函數(shù)
 f=1;
 }
 }
 if(f==0 && ((struct DISH*)(pTemp->data))->flag==49)
 order_dish_print(pTemp->data,i++);    //無“*”號的打印函數(shù)
 pTemp = pTemp->NEXT;
 //i++;
 }
 char_change(money,((struct ORDER*)data)->money);   //將char類型轉(zhuǎn)換為int類型的函數(shù)
 Gotoxy(18, 44);
 printf("%d",money);
 Gotoxy(18, 66);
 printf("%d",n);
}
/*******************************打印點菜界面中每個菜品信息節(jié)點函數(shù)********************************
 名稱:打印點菜界面中每個菜品信息節(jié)點函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印點菜界面中每個菜品信息節(jié)點
 **************************************************************************/
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);
}
/*******************************打印點菜界面中帶“*”的每個菜品信息節(jié)點函數(shù)********************************
 名稱:打印點菜界面中帶“*”的每個菜品信息節(jié)點函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印點菜界面中帶“*”的每個菜品信息節(jié)點
 **************************************************************************/
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);
}
/*******************************打印買單界面中每個訂單節(jié)點信息函數(shù)********************************
 名稱:打印買單界面中每個訂單節(jié)點信息函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印買單界面中每個訂單節(jié)點信息
 **************************************************************************/
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);
}
/*******************************打印營業(yè)額查詢界面中每個已買單訂單節(jié)點信息函數(shù)********************************
 名稱:打印營業(yè)額查詢界面中每個已買單訂單節(jié)點信息函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印營業(yè)額查詢界面中每個已買單訂單節(jié)點信息
 **************************************************************************/
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);
}
/*******************************打印訂單查詢界面中每個訂單節(jié)點信息函數(shù)********************************
 名稱:打印訂單查詢界面中每個訂單節(jié)點信息函數(shù)
 參數(shù):
 data:要打印的數(shù)據(jù)
 i:在第i行打印
 功能:
 打印訂單查詢界面中每個訂單節(jié)點信息
 **************************************************************************/
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);

}
/*******************************從鏈表寫入數(shù)據(jù)到文件函數(shù)********************************
 名稱:從鏈表寫入數(shù)據(jù)到文件函數(shù)
 參數(shù):
 phead:鏈表頭指針
 datalen:單個節(jié)點的大小
 f:標志位,判斷要寫入哪個的文件
 功能:
 從鏈表寫入數(shù)據(jù)到文件
 **************************************************************************/
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)           //釋放內(nèi)存中的鏈表
 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;
}
/*******************************從文件中讀出數(shù)據(jù)到鏈表函數(shù)********************************
 名稱:從文件中讀出數(shù)據(jù)到鏈表函數(shù)
 參數(shù):
 phead:鏈表頭指針
 datalen:單個節(jié)點的大小
 f:標志位,判斷要寫入哪個的文件
 功能:
 從文件中讀出數(shù)據(jù)到鏈表
 **************************************************************************/
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("無數(shù)據(jù)記錄\n");
 }
 LinkAddNode(phead,q,datalen);
 }
 free(q);
 q=NULL;
 fclose(fp);
}
/*******************************從鏈表中獲取指定節(jié)點函數(shù)********************************
 名稱:從鏈表中獲取指定節(jié)點函數(shù)
 參數(shù):
 iIndex:指定位置的參數(shù)
 phead:鏈表頭指針
 f:標志位,判斷是對哪種鏈表的操作
 功能:
 從鏈表中獲取指定節(jié)點
 **************************************************************************/
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;
}
/*******************************從鏈表中刪除指定節(jié)點函數(shù)(真刪除)********************************
 名稱:從鏈表中刪除指定節(jié)點函數(shù)
 參數(shù):
 iIndex:指定位置的參數(shù)
 phead:鏈表頭指針
 f:標志位,判斷是對哪種鏈表的操作
 功能:
 從鏈表中刪除指定節(jié)點
 **************************************************************************/
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;
}
/*******************************從鏈表中刪除指定節(jié)點函數(shù)(假刪除)********************************
 名稱:從鏈表中刪除指定節(jié)點函數(shù)
 參數(shù):
 iIndex:指定位置的參數(shù)
 phead:鏈表頭指針
 f:標志位,判斷是對哪種鏈表的操作
 功能:
 從鏈表中刪除指定節(jié)點
 **************************************************************************/
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)     //改變節(jié)點的狀態(tài)
 {
 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類型轉(zhuǎn)換為int類型的函數(shù)********************************
 名稱:將char類型轉(zhuǎn)換為int類型的函數(shù)
 參數(shù):
 id:char類型數(shù)組指針
 功能:
 將char類型轉(zhuǎn)換為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類型轉(zhuǎn)換為char類型的函數(shù)********************************
 名稱:將int類型轉(zhuǎn)換為char類型的函數(shù)
 參數(shù):
 n: int類型數(shù)據(jù)
 p:char類型數(shù)組指針
 功能:
 將int類型轉(zhuǎn)換為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;
 }
}
/*******************************登錄時的人員識別函數(shù)********************************
 名稱:登錄時的人員識別函數(shù)
 參數(shù):
 acStr1[]: 輸入的用戶名
 acStr2[]:輸入的密碼
 datalen:單個節(jié)點的大小
 功能:
 登錄時的人員識別
 **************************************************************************/
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;
 }*/
}
/*******************************初始化訂單節(jié)點函數(shù)********************************
 名稱:初始化訂單節(jié)點函數(shù)
 參數(shù):
 no:訂單對應的臺桌編號
 n:記錄訂單個數(shù)的緩沖數(shù)據(jù)
 m:創(chuàng)建的訂單節(jié)點
 功能:
 初始化訂單節(jié)點
 **************************************************************************/
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));   //在鏈表中加入新創(chuàng)建的訂單節(jié)點 
 linktofile(orderhead, sizeof(m),4);    //將鏈表寫入文件
}

/*******************************計算文件中節(jié)點個數(shù)函數(shù)********************************
 名稱:計算文件中節(jié)點個數(shù)函數(shù)
 參數(shù):
 phead:鏈表頭指針
 datalen:單個節(jié)點的大小
 f:標志位,判斷是哪個文件
 功能:
 計算文件中節(jié)點個數(shù)
 **************************************************************************/
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);
}
/*******************************在點菜界面中顯示被占用的臺桌的函數(shù)********************************
 名稱:在點菜界面中顯示被占用的臺桌的函數(shù)
 參數(shù):
 i:行數(shù)
 pTemp:鏈表中節(jié)點的指針
 功能:
 在點菜界面中顯示被占用的臺桌的
 **************************************************************************/
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);
}
/*******************************在訂單查詢界面中顯示未買單的訂單信息函數(shù)********************************
 名稱:在訂單查詢界面中顯示未買單的訂單信息函數(shù)
 參數(shù):
 i:行數(shù)
 pTemp:鏈表中節(jié)點的指針
 功能:
 在訂單查詢界面中顯示未買單的訂單信息
 **************************************************************************/
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);
}
/*******************************在營業(yè)額查詢界面中顯示已買單的訂單信息函數(shù)********************************
 名稱:在營業(yè)額查詢界面中顯示已買單的訂單信息函數(shù)
 參數(shù):
 begin:開始時間
 end: 結束時間
 sum:總計金額
 功能:
 在營業(yè)額查詢界面中顯示已買單的訂單信息
 **************************************************************************/
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("暫無數(shù)據(jù)!");
 }
 LinkFreeNode(orderhead);
 orderhead = (struct NODE*)LinkInit(NULL);
}
/*******************************在訂單查詢界面中顯示已買單和未買單的訂單信息函數(shù)********************************
 名稱:在訂單查詢界面中顯示已買單和未買單的訂單信息
 參數(shù):
 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("暫無數(shù)據(jù)!");
 }
 LinkFreeNode(orderhead);
 orderhead = (struct NODE*)LinkInit(NULL);
 LinkFreeNode(myhead);
 myhead = (struct NODE*)LinkInit(NULL);
}
/*******************************在營收查詢界面中顯示已買單和未買單的訂單信息函數(shù)********************************
 名稱:在營收查詢界面中顯示已買單的訂單信息函數(shù)
 參數(shù):
 begin:開始時間
 end: 結束時間
 sum:某服務員的總營業(yè)額
 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("暫無數(shù)據(jù)!");
 }*/
 LinkFreeNode(orderhead);
 orderhead = (struct NODE*)LinkInit(NULL);
 LinkFreeNode(myhead);
 myhead = (struct NODE*)LinkInit(NULL);
}


/*******************************加菜函數(shù)********************************
 名稱:加菜函數(shù)
 參數(shù):
 data:訂單節(jié)點數(shù)據(jù)部分
 no:要指定的菜品編號
 num:點菜的份數(shù)
 功能:
 加菜
 **************************************************************************/
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')  //找到指定訂單節(jié)點,加入點的菜的編號和份數(shù)
 {
 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;
 }
 }
}
/*******************************退菜函數(shù)********************************
 名稱:退菜函數(shù)
 參數(shù):
 data:訂單節(jié)點數(shù)據(jù)部分
 no:要指定的菜品編號
 num:點菜的份數(shù)
 功能:
 退菜
 **************************************************************************/
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;
 }
 }
}

感謝各位的閱讀!關于“餐館點菜系統(tǒng)中C語言源代碼的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI