餐馆点菜系统C语言源代码
餐馆点菜系统c语言的源代码,一些封装的函数,对链表的操作,还有文件的存取,供大家参考,具体内容如下
#include"public.h"
structNODE*myhead;
structNODE*orderhead;
structNODE*ashead;
charwaiter_ID[4+1];
/*******************************设置输入框颜色*******************************************
名称:设置输入框颜色
参数:
iNum表示:编辑框的长度
功能:
*************************************************************************************/
voidSetColorEdit(intiNum)
{
SetColor(4,14);
while(iNum--)
{
putchar('');
}
}
voidSetColor(unsignedshortForeColor,unsignedshortBackGroundColor)
{
HANDLEhCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));
}
/*******************************编辑框aUI函数*******************************************
名称:编辑框aUI函数
参数:
iLong表示:编辑框的长度
iWide表示:编辑框的宽度
x表示:编辑框起始行位置
y表示:编辑框起始列位置
acBuffer
表示:编辑框显示的内容
功能:
在x行y列制作一个长为iLong宽为iWide的编辑框,框中文本显示acBuffer字符串的内容
*************************************************************************************/
voidUI_EditBox(intiLong,intiWide,intx,inty,characBuffer[30])
{
inti;/*宽*/
intj;/*长*/
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("┏");
}
elseif(i==0&&j==iLong)
{
printf("┓");
}
elseif(i==iWide&&j==0)
{
printf("┗");
}
elseif(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字符串的内容
*************************************************************************************/
voidUI_TestBox(intx,inty,characBuffer[30])
{
Gotoxy(x,y);
printf("%s",acBuffer);
}
/*******************************光标移动函数********************************
名称:光标移动函数
参数:
x表示:行
y表示:列
功能:
将光标移动至x行y列位置
**************************************************************************/
voidGotoxy(intx,inty)
{
CONSOLE_SCREEN_BUFFER_INFOcsbiInfo;
HANDLEhConsoleOut;
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(无控制)
**********************************************************************************/
intGlb_putString(characStr[],intiMaxLen,intiPutType,intisPlaintext,intiTmp)
{
charTmp;
inti=0;
intj;
intflg;
for(j=0;j0)
{
printf("\b\b");
acStr[--i]='\0';
}
}
else
{
if(i='0'&&Tmp<='9')
{
if(isPlaintext==NotPwd)
{
putchar(Tmp);
}
else
{
putchar('*');
}
acStr[i++]=Tmp;
}
}break;
caseChar:
{
if((Tmp>='A'&&Tmp<='Z')||(Tmp>='a'&&Tmp<='z'))
{
if(isPlaintext==NotPwd)
{
putchar(Tmp);
}
else
{
putchar('*');
}
acStr[i++]=Tmp;
}
}break;
caseIntOrChar:
{
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';
return0;
}
/*******************************链表初始化函数********************************
名称:链表初始化函数
参数:
data:数据
head:链表头指针
功能:
链表初始化
**************************************************************************/
void*LinkInit(void*data)
{
structNODE*head;
head=(structNODE*)malloc(sizeof(structNODE));
if(head==NULL)
{
perror("linkiniterror");
returnNULL;
}
head->data=data;
head->NEXT=NULL;
returnhead;
}
/*******************************增加链表节点函数********************************
名称:增加链表节点函数
参数:
phead:链表头节点
data:数据
len:要操作的链表节点数据结构的大小
功能:
增加链表节点
**************************************************************************/
voidLinkAddNode(structNODE*phead,void*data,intlen)
{
structNODE*pNew;
structNODE*pTemp;
pTemp=phead;
while(pTemp->NEXT!=NULL)
{
pTemp=pTemp->NEXT;
}
pNew=(structNODE*)malloc(sizeof(structNODE));
if(pNew==NULL)
{
perror("LindAddNodeerror");
return;
}
else
{
pNew->data=malloc(len);
if(pNew->data==NULL)
{
perror("LindAddNodeerror");
return;
}
}
memcpy(pNew->data,data,len);
pNew->NEXT=NULL;
pTemp->NEXT=pNew;
return;
}
/*intDataInit()
{
inti;
structMANm[]=
{
{"1001","admin","123456",0,1},
{"1002","manager","123456",1,1},
{"1003","waiter","123456",2,1}
};
i=0;
myhead=(structNODE*)LinkInit(NULL);
for(i=0;i<3;i++)
{
LinkAddNode(myhead,&m[i],sizeof(m[i]));
}
return0;
}*/
/*******************************释放链表函数********************************
名称:释放链表函数
参数:
phead:链表头节点
功能:
释放链表
**************************************************************************/
voidLinkFreeNode(structNODE*phead)
{
structNODE*pTemp=phead;
//staticintaaa=0;
while(pTemp!=NULL)
{
phead=phead->NEXT;
free(pTemp->data);
free(pTemp);
pTemp=phead;
//printf("释放次数=%d\n",++aaa);
}
return;
}
/*******************************打印链表函数********************************
名称:打印链表函数
参数:
phead:链表头节点
myprint:函数指针
data:要打印的数据
f:要打印的位置的行数
功能:
打印链表
**************************************************************************/
voidLinkPrint(structNODE*phead,void(*myprint)(void*data,intf))
{
inti=5;
structNODE*pTemp=phead->NEXT;
while(pTemp!=NULL)
{
Gotoxy(i++,3);
myprint(pTemp->data,i);//在第i行打印数据
pTemp=pTemp->NEXT;
}
}
/*******************************只打印在职人员信息节点函数********************************
名称:只打印在职人员信息节点函数
参数:
phead:链表头节点
myprint:函数指针
data:要打印的数据
f:要打印的位置的行数
功能:
只打印在职人员信息节点
**************************************************************************/
voidMan_Half_Print(structNODE*phead,void(*myprint)(void*data,intf))
{
inti=5;
structNODE*pTemp=phead->NEXT;
while(pTemp!=NULL)
{
if(((structMAN*)(pTemp->data))->flag==49)//判断flag是否为1,若为1则为在职,将其打印
{
Gotoxy(i++,3);
myprint(pTemp->data,i);
}
pTemp=pTemp->NEXT;
}
}
/*******************************只打印在用会员信息节点函数********************************
名称:只打印在用会员信息节点函数
参数:
phead:链表头节点
myprint:函数指针
data:要打印的数据
f:要打印的位置的行数
功能:
只打印在用会员信息节点
**************************************************************************/
voidAs_Half_Print(structNODE*phead,void(*myprint)(void*data,intf))
{
inti=5;
structNODE*pTemp=phead->NEXT;
while(pTemp!=NULL)
{
if(((structASSOCIATOR*)(pTemp->data))->flag==49)
{
Gotoxy(i++,3);
myprint(pTemp->data,i);
}
pTemp=pTemp->NEXT;
}
}
/*******************************只打印在用台桌信息节点函数********************************
名称:只打印在用台桌信息节点函数
参数:
phead:链表头节点
myprint:函数指针
data:要打印的数据
f:要打印的位置的行数
功能:
只打印在用台桌信息节点
**************************************************************************/
voidTable_Half_Print(structNODE*phead,void(*myprint)(void*data,intf))
{
inti=5;
structNODE*pTemp=phead->NEXT;
while(pTemp!=NULL)
{
if(((structTABLE*)(pTemp->data))->role==49)
{
Gotoxy(i++,3);
myprint(pTemp->data,i);
}
pTemp=pTemp->NEXT;
}
}
/*******************************只打印在用菜谱信息节点函数********************************
名称:只打印在用菜谱信息节点函数
参数:
phead:链表头节点
myprint:函数指针
data:要打印的数据
f:要打印的位置的行数
功能:
只打印在用菜谱信息节点
**************************************************************************/
voidDish_Half_Print(structNODE*phead,void(*myprint)(void*data,intf))
{
inti=4;
structNODE*pTemp=phead->NEXT;
while(pTemp!=NULL)
{
if(((structDISH*)(pTemp->data))->flag==49)
{
Gotoxy(i++,3);
myprint(pTemp->data,i);
}
pTemp=pTemp->NEXT;
}
}
/*******************************打印每个员工信息节点函数********************************
名称:打印每个员工信息节点函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印每个员工信息节点
**************************************************************************/
voidManPrint(void*data,inti)
{
Gotoxy(i,3);
printf("%s",((structMAN*)data)->id);
Gotoxy(i,19);
printf("%s",((structMAN*)data)->name);
Gotoxy(i,35);
printf("*******");
Gotoxy(i,51);
if(((structMAN*)data)->role==48)
printf("管理员");
if(((structMAN*)data)->role==49)
printf("经理");
if(((structMAN*)data)->role==50)
printf("服务员");
Gotoxy(i,67);
if(((structMAN*)data)->flag==48)
printf("离职");
if(((structMAN*)data)->flag==49)
printf("在职");
}
/*******************************打印每会员信息节点函数********************************
名称:打印每个会员信息节点函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印每个会员信息节点
**************************************************************************/
voidAsPrint(void*data,inti)
{
Gotoxy(i,3);
printf("%s",((structASSOCIATOR*)data)->no);
Gotoxy(i,19);
printf("%s",((structASSOCIATOR*)data)->name);
Gotoxy(i,35);
printf("%s",((structASSOCIATOR*)data)->score);
Gotoxy(i,51);
printf("%c",((structASSOCIATOR*)data)->flag);
}
/*******************************打印每个台桌信息节点函数********************************
名称:打印每个台桌信息节点函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印每个台桌信息节点
**************************************************************************/
voidTablePrint(void*data,inti)
{
Gotoxy(i,3);
printf("%s",((structTABLE*)data)->no);
Gotoxy(i,24);
printf("%s",((structTABLE*)data)->flag);
Gotoxy(i,45);
printf("%s",((structTABLE*)data)->des);
}
/*******************************打印每个菜品信息节点函数********************************
名称:打印每个菜品信息节点函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印每个菜品信息节点
**************************************************************************/
voidDishPrint(void*data,inti)
{
Gotoxy(i,3);
printf("%s",((structDISH*)data)->no);
Gotoxy(i,24);
printf("%s",((structDISH*)data)->name);
Gotoxy(i,45);
printf("¥%s",((structDISH*)data)->price);
}
/*******************************点菜并显示函数********************************
名称:点菜并显示函数
参数:
phead:链表头结点
data:订单中点的菜的节点数据
pTmp:指向菜谱节点的指针
money:点的菜的单价的合计
f:标志位
n:份数
功能:
点菜并显示
**************************************************************************/
voidLink_Dish_Print(structNODE*phead,void*data)
{
inti=5,j,n=0,money=0,f;
structNODE*pTemp=phead->NEXT;
while(pTemp!=NULL)
{
f=0;
Gotoxy(i,3);
for(j=0;j<11;j++)
{
if(strcmp((((structORDER*)data)->x[j]).no,((structDISH*)(pTemp->data))->no)==0)//找到订单对应的点的菜的节点,并从菜谱中获取该菜的单价
{
n=number_change((((structORDER*)data)->x[j]).num)+n;
money=number_change(((structDISH*)(pTemp->data))->price)*number_change((((structORDER*)data)->x[j]).num)+money;
order_dish_difprint(pTemp->data,i++,number_change((((structORDER*)data)->x[j]).num));//有“*”号的打印函数
f=1;
}
}
if(f==0&&((structDISH*)(pTemp->data))->flag==49)
order_dish_print(pTemp->data,i++);//无“*”号的打印函数
pTemp=pTemp->NEXT;
//i++;
}
char_change(money,((structORDER*)data)->money);//将char类型转换为int类型的函数
Gotoxy(18,44);
printf("%d",money);
Gotoxy(18,66);
printf("%d",n);
}
/*******************************打印点菜界面中每个菜品信息节点函数********************************
名称:打印点菜界面中每个菜品信息节点函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印点菜界面中每个菜品信息节点
**************************************************************************/
voidorder_dish_print(void*data,inti)
{
Gotoxy(i,4);
printf("%s",((structDISH*)data)->no);
Gotoxy(i,24);
printf("%s",((structDISH*)data)->name);
Gotoxy(i,45);
printf("¥%s",((structDISH*)data)->price);
Gotoxy(i,66);
printf("%s",((structDISH*)data)->num);
}
/*******************************打印点菜界面中带“*”的每个菜品信息节点函数********************************
名称:打印点菜界面中带“*”的每个菜品信息节点函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印点菜界面中带“*”的每个菜品信息节点
**************************************************************************/
voidorder_dish_difprint(void*data,inti,intnum)
{
Gotoxy(i,3);
putchar('*');
Gotoxy(i,4);
printf("%s",((structDISH*)data)->no);
Gotoxy(i,24);
printf("%s",((structDISH*)data)->name);
Gotoxy(i,45);
printf("¥%s",((structDISH*)data)->price);
Gotoxy(i,66);
printf("%d",num);
}
/*******************************打印买单界面中每个订单节点信息函数********************************
名称:打印买单界面中每个订单节点信息函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印买单界面中每个订单节点信息
**************************************************************************/
voidOrder_Checkout_Print(void*data,inti)
{
Gotoxy(i,3);
printf("%s",((structORDER*)data)->order_no);
Gotoxy(i,24);
printf("¥%s",((structORDER*)data)->money);
Gotoxy(i,45);
printf("%s",((structORDER*)data)->order_flag);
}
/*******************************打印营业额查询界面中每个已买单订单节点信息函数********************************
名称:打印营业额查询界面中每个已买单订单节点信息函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印营业额查询界面中每个已买单订单节点信息
**************************************************************************/
voidOrder_Checkouted_Print(void*data,inti)
{
Gotoxy(i,3);
printf("%s",((structORDER*)data)->order_no);
Gotoxy(i,24);
printf("%s",((structORDER*)data)->time);
Gotoxy(i,45);
printf("¥%s",((structORDER*)data)->money);
}
/*******************************打印订单查询界面中每个订单节点信息函数********************************
名称:打印订单查询界面中每个订单节点信息函数
参数:
data:要打印的数据
i:在第i行打印
功能:
打印订单查询界面中每个订单节点信息
**************************************************************************/
voidCheck_Order_id(void*data,inti)
{
Gotoxy(i,3);
printf("%s",((structORDER*)data)->order_no);
Gotoxy(i,18);
printf("%s",((structORDER*)data)->time);
Gotoxy(i,33);
printf("¥%s",((structORDER*)data)->money);
Gotoxy(i,48);
printf("%s",((structORDER*)data)->order_flag);
}
/*******************************从链表写入数据到文件函数********************************
名称:从链表写入数据到文件函数
参数:
phead:链表头指针
datalen:单个节点的大小
f:标志位,判断要写入哪个的文件
功能:
从链表写入数据到文件
**************************************************************************/
intlinktofile(structNODE*phead,intdatalen,intf)
{
FILE*fp;
structNODE*pTemp=phead->NEXT;
if(f==1)
fp=fopen("./maninfo.txt","wb+");//写入人员文件
elseif(f==2)
fp=fopen("./tableinfo.txt","wb+");//写入台桌文件
elseif(f==3)
fp=fopen("./dishinfo.txt","wb+");//写入菜谱文件
elseif(f==4)
fp=fopen("./orderinfo.txt","wb+");//写入订单文件
elseif(f==5)
fp=fopen("./associatorinfo.txt","wb+");//写入会员文件
if(fp==NULL)
{
perror("openfile(man)");
return-1;
}
while(pTemp!=NULL)
{
fwrite(pTemp->data,1,datalen,fp);
pTemp=pTemp->NEXT;
}
LinkFreeNode(phead);
if(f==4)//释放内存中的链表
orderhead=(structNODE*)LinkInit(NULL);
if(f==5)
ashead=(structNODE*)LinkInit(NULL);
if(f!=4&&f!=5)
myhead=(structNODE*)LinkInit(NULL);
fclose(fp);
return0;
}
/*******************************从文件中读出数据到链表函数********************************
名称:从文件中读出数据到链表函数
参数:
phead:链表头指针
datalen:单个节点的大小
f:标志位,判断要写入哪个的文件
功能:
从文件中读出数据到链表
**************************************************************************/
voidlinkfromfile(structNODE*phead,intdatalen,intf)
{
intx,i;
FILE*fp;
void*q;
q=(void*)malloc(datalen);
//structMAN*q;
//q=newMAN;
memset(q,0,sizeof(datalen));
if(f==1)
fp=fopen("./maninfo.txt","rb+");
elseif(f==2)
fp=fopen("./tableinfo.txt","rb+");
elseif(f==3)
fp=fopen("./dishinfo.txt","rb+");
elseif(f==4)
fp=fopen("./orderinfo.txt","rb+");
elseif(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(intiIndex,structNODE*phead,intf)
{
intn;
structNODE*tmp=NULL;
tmp=phead->NEXT;
while(tmp!=NULL)
{
if(f==1)
n=number_change(((structMAN*)(tmp->data))->id);
elseif(f==2)
n=number_change(((structTABLE*)(tmp->data))->no);
elseif(f==3)
n=number_change(((structDISH*)(tmp->data))->no);
elseif(f==4)
n=number_change(((structASSOCIATOR*)(tmp->data))->no);
if(n==iIndex)
break;
tmp=tmp->NEXT;
}
if(tmp==NULL)
{
perror("未找到指定的结点索引");
return0;
}
returntmp;
}
/*******************************从链表中删除指定节点函数(真删除)********************************
名称:从链表中删除指定节点函数
参数:
iIndex:指定位置的参数
phead:链表头指针
f:标志位,判断是对哪种链表的操作
功能:
从链表中删除指定节点
**************************************************************************/
voidLIST_Del(intiIndex,structNODE*phead,intf)
{
intn;
structNODE*tmp=NULL,*pre=NULL;
tmp=phead->NEXT;
pre=phead;
while(tmp!=NULL)
{
if(f==1)
n=number_change(((structMAN*)(tmp->data))->id);
elseif(f==2)
n=number_change(((structTABLE*)(tmp->data))->no);
elseif(f==3)
n=number_change(((structDISH*)(tmp->data))->no);
elseif(f==4)
n=number_change(((structASSOCIATOR*)(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:标志位,判断是对哪种链表的操作
功能:
从链表中删除指定节点
**************************************************************************/
voidLIST_Del_FS(intiIndex,structNODE*phead,intf)
{
intn;
structNODE*tmp;
tmp=phead->NEXT;
while(tmp!=NULL)
{
if(f==1)
n=number_change(((structMAN*)(tmp->data))->id);
elseif(f==2)
n=number_change(((structTABLE*)(tmp->data))->no);
elseif(f==3)
n=number_change(((structDISH*)(tmp->data))->no);
elseif(f==4)
n=number_change(((structASSOCIATOR*)(tmp->data))->no);
if(n==iIndex)
break;
tmp=tmp->NEXT;
}
if(tmp==NULL)//改变节点的状态
{
perror("未找到指定的结点索引");
return;
}
if(f==1)
((structMAN*)(tmp->data))->flag=48;
if(f==2)
((structTABLE*)(tmp->data))->role=48;
if(f==3)
((structDISH*)(tmp->data))->flag=48;
if(f==4)
((structASSOCIATOR*)(tmp->data))->flag=48;
return;
}
/*******************************将char类型转换为int类型的函数********************************
名称:将char类型转换为int类型的函数
参数:
id:char类型数组指针
功能:
将char类型转换为int类型的
**************************************************************************/
intnumber_change(char*id)
{
intnum=0,i,n=1;
for(i=0;iNEXT;
while(tmp)//遍历人员链表查找是否存在,如果存在返回其对应角色
{
if(!strcmp(acStr1,((structMAN*)(tmp->data))->id))
{
if(!strcmp(acStr2,((structMAN*)(tmp->data))->pwd))
{
return((structMAN*)(tmp->data))->role;
}
else
printf("密码错误!");
}
tmp=tmp->NEXT;
}
printf("用户不存在!");
/*if(tmp==NULL)
{
perror("未找到指定的结点索引");
return0;
}*/
}
/*******************************初始化订单节点函数********************************
名称:初始化订单节点函数
参数:
no:订单对应的台桌编号
n:记录订单个数的缓冲数据
m:创建的订单节点
功能:
初始化订单节点
**************************************************************************/
voidOrderData(char*no)
{
time_tt=time(0);
chartime[11];
intn;
structORDERm;
memset(&m,0,sizeof(structORDER));
n=1000+link_sum(orderhead,sizeof(structORDER),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:标志位,判断是哪个文件
功能:
计算文件中节点个数
**************************************************************************/
intlink_sum(structNODE*phead,intdatalen,intf)
{
intx,i;
FILE*fp;
if(f==1)
fp=fopen("./maninfo.txt","rb+");
elseif(f==2)
fp=fopen("./tableinfo.txt","rb+");
elseif(f==3)
fp=fopen("./dishinfo.txt","rb+");
elseif(f==4)
fp=fopen("./orderinfo.txt","rb+");
elseif(f==5)
fp=fopen("./associatorinfo.txt","rb+");
if(fp==NULL)
{
return0;
}
fseek(fp,0,SEEK_END);
x=ftell(fp);
rewind(fp);
return(x/datalen);
fclose(fp);
}
/*******************************在点菜界面中显示被占用的台桌的函数********************************
名称:在点菜界面中显示被占用的台桌的函数
参数:
i:行数
pTemp:链表中节点的指针
功能:
在点菜界面中显示被占用的台桌的
**************************************************************************/
voidbusy_table()
{
inti=5;
structNODE*pTemp;
ui_function_table();
linkfromfile(myhead,sizeof(structTABLE),2);//从文件中读出台桌链表
pTemp=myhead->NEXT;
while(pTemp!=NULL)
{
if(strcmp(((structTABLE*)(pTemp->data))->flag,"占用")==0&&((structTABLE*)(pTemp->data))->role==49)//选取被占用且在用的台桌将其打印
{
Gotoxy(i++,3);
TablePrint(pTemp->data,i);
}
pTemp=pTemp->NEXT;
}
LinkFreeNode(myhead);
myhead=(structNODE*)LinkInit(NULL);
}
/*******************************在订单查询界面中显示未买单的订单信息函数********************************
名称:在订单查询界面中显示未买单的订单信息函数
参数:
i:行数
pTemp:链表中节点的指针
功能:
在订单查询界面中显示未买单的订单信息
**************************************************************************/
voidun_checkout()
{
inti=5;
structNODE*pTemp;
ui_function_checkout();
linkfromfile(orderhead,sizeof(structORDER),4);
pTemp=orderhead->NEXT;
while(pTemp!=NULL)
{
if(strcmp(((structORDER*)(pTemp->data))->order_flag,"未付款")==0)//选取未付款的订单将其打印
{
Gotoxy(i++,3);
Order_Checkout_Print(pTemp->data,i);
}
pTemp=pTemp->NEXT;
}
LinkFreeNode(orderhead);
orderhead=(structNODE*)LinkInit(NULL);
}
/*******************************在营业额查询界面中显示已买单的订单信息函数********************************
名称:在营业额查询界面中显示已买单的订单信息函数
参数:
begin:开始时间
end:结束时间
sum:总计金额
功能:
在营业额查询界面中显示已买单的订单信息
**************************************************************************/
voidcheckout_ed(char*begin,char*end)
{
inti=5,f=0,sum=0;
structNODE*pTemp;
ui_function_checkmoney();
linkfromfile(orderhead,sizeof(structORDER),4);
pTemp=orderhead->NEXT;
while(pTemp!=NULL)
{
if(number_change(((structORDER*)(pTemp->data))->time)>=number_change(begin)&&number_change(((structORDER*)(pTemp->data))->time)<=number_change(end)&&strcmp(((structORDER*)(pTemp->data))->order_flag,"已付款")==0)
{
Gotoxy(i++,3);
Order_Checkouted_Print(pTemp->data,i);
f=1;
sum=number_change(((structORDER*)(pTemp->data))->money)+sum;
}
pTemp=pTemp->NEXT;
}
Gotoxy(15,60);
printf("¥%d",sum);
if(f==0)
{
Gotoxy(6,20);
printf("暂无数据!");
}
LinkFreeNode(orderhead);
orderhead=(structNODE*)LinkInit(NULL);
}
/*******************************在订单查询界面中显示已买单和未买单的订单信息函数********************************
名称:在订单查询界面中显示已买单和未买单的订单信息
参数:
begin:开始时间
end:结束时间
g:指定是要查询已买单,还是未买单
功能:
在订单查询界面中显示已买单和未买单的订单信息
**************************************************************************/
voidcheck_order_id(char*begin,char*end,intg)
{
inti=5,f=0,j=5;
structNODE*pTemp,*p;
ui_function_checkorderid();
linkfromfile(orderhead,sizeof(structORDER),4);
linkfromfile(myhead,sizeof(structMAN),1);
pTemp=orderhead->NEXT;
p=myhead->NEXT;
while(pTemp!=NULL&&g==50)//打印已付款
{
if(number_change(((structORDER*)(pTemp->data))->time)>=number_change(begin)&&number_change(((structORDER*)(pTemp->data))->time)<=number_change(end)&&strcmp(((structORDER*)(pTemp->data))->order_flag,"已付款")==0)
{
while(p!=NULL)
{
if(strcmp(((structMAN*)(p->data))->id,((structORDER*)(pTemp->data))->man_id)==0)
{
Gotoxy(j++,63);
printf("%s",((structMAN*)(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(((structORDER*)(pTemp->data))->time)>=number_change(begin)&&number_change(((structORDER*)(pTemp->data))->time)<=number_change(end)&&strcmp(((structORDER*)(pTemp->data))->order_flag,"未付款")==0)
{
while(p!=NULL)
{
if(strcmp(((structMAN*)(p->data))->id,((structORDER*)(pTemp->data))->man_id)==0)
{
Gotoxy(j++,63);
printf("%s",((structMAN*)(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=(structNODE*)LinkInit(NULL);
LinkFreeNode(myhead);
myhead=(structNODE*)LinkInit(NULL);
}
/*******************************在营收查询界面中显示已买单和未买单的订单信息函数********************************
名称:在营收查询界面中显示已买单的订单信息函数
参数:
begin:开始时间
end:结束时间
sum:某服务员的总营业额
count:全体服务员的营收总额
功能:
在营收查询界面中显示已买单的订单信息
**************************************************************************/
voidcheck_waiter_money(char*begin,char*end)
{
inti=5,sum,count=0;
structNODE*pTemp;
structNODE*p;
ui_count_director();
linkfromfile(orderhead,sizeof(structORDER),4);
linkfromfile(myhead,sizeof(structMAN),1);
pTemp=orderhead->NEXT;
p=myhead->NEXT;
while(p!=NULL)
{
sum=0;
if(((structMAN*)(p->data))->role==50)
{
while(pTemp!=NULL)//选取订单中时间符合要求的,已付款的,对应员工的订单,并合计
{
if(number_change(((structORDER*)(pTemp->data))->time)>=number_change(begin)&&number_change(((structORDER*)(pTemp->data))->time)<=number_change(end))
if(strcmp(((structORDER*)(pTemp->data))->order_flag,"已付款")==0)
if(strcmp(((structMAN*)(p->data))->id,((structORDER*)(pTemp->data))->man_id)==0)
{
sum=number_change(((structORDER*)(pTemp->data))->money)+sum;
}
pTemp=pTemp->NEXT;
}
pTemp=orderhead->NEXT;
Gotoxy(i,3);
printf("%s",((structMAN*)(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=(structNODE*)LinkInit(NULL);
LinkFreeNode(myhead);
myhead=(structNODE*)LinkInit(NULL);
}
/*******************************加菜函数********************************
名称:加菜函数
参数:
data:订单节点数据部分
no:要指定的菜品编号
num:点菜的份数
功能:
加菜
**************************************************************************/
voidadd_dish(void*data,char*no,char*num)
{
inti,n;
for(i=0;i<11;i++)
{
if(strcmp((((structORDER*)data)->x[i]).no,no)==0)//找到菜品的单价
{
n=number_change((((structORDER*)data)->x[i]).num)+number_change(num);
char_change(n,(((structORDER*)data)->x[i]).num);
//puts((((structORDER*)data)->x[i]).num);
return;
}
}
for(i=0;i<11;i++)
{
if((((structORDER*)data)->x[i]).no[0]=='\0')//找到指定订单节点,加入点的菜的编号和份数
{
strcpy((((structORDER*)data)->x[i]).no,no);
n=number_change((((structORDER*)data)->x[i]).num)+number_change(num);
char_change(n,(((structORDER*)data)->x[i]).num);
return;
}
}
}
/*******************************退菜函数********************************
名称:退菜函数
参数:
data:订单节点数据部分
no:要指定的菜品编号
num:点菜的份数
功能:
退菜
**************************************************************************/
voidsub_dish(void*data,char*no,char*num)
{
inti,n;
for(i=0;i<11;i++)
{
if(strcmp((((structORDER*)data)->x[i]).no,no)==0)
{
n=number_change((((structORDER*)data)->x[i]).num)-number_change(num);
char_change(n,((((structORDER*)data)->x[i]).num));
puts((((structORDER*)data)->x[i]).num);
if(n==0)
{
char_change(n,(((structORDER*)data)->x[i]).num);
memset((((structORDER*)data)->x[i]).no,0,sizeof((((structORDER*)data)->x[i]).no));
}
return;
}
}
}
更多学习资料请关注专题《管理系统开发》。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。