#include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h>
#include <windows.h> #define N sizeof(user) #define M sizeof(table) #define T
sizeof(order) #define S sizeof(menu) typedef struct User{ char
username[12];//账号 char password[18];//密码 int vip;//1为会员 0不是 int
adm;//administrator同上 //或将以上的采用数据域的方式存储 struct User* next; }user; //注意初始化
,可以写一个初始化函数 借鉴7月9号的笔记中的“初始化” typedef struct Menu{ int num;//1~10为热菜 11~20为冷菜
21~25为饮料 char name[20]; int price; struct Menu* next; }menu; typedef struct
Table{ int number; int is_blank; int peoplenum; struct Order*
ordert;//接该桌的订单的头结点 int price;//该桌的总价 struct Table* next; }table; typedef
struct Order{ int number;//菜的编号 char name[20]; int copies;//菜的份数 int price; int
xiaoji; struct Order* next; }order; //以下为自定义函数 void welcome(); int ORDER(order*
head);//点菜函数 //void reg();//注册函数 void login(); void logon(); void
show();//显示菜单函数 void client();//客户函数 void look_amend();//查看修改函数 void
add();//加菜函数 void cancel();//取消菜函数 int priceall();//计算总价函数 void
getpassword(char password[18],char againpassword[18]); int
is_password_same(char password[18],char againpassword[18]); void
save_user(user* p); menu* ffmenuhot(); menu* ffmenucold(); menu* ffmenudrink();
table* fftable(); void resave_table(table* head); table* fftable() { FILE *fp1;
//文件指针 int n = 0; table* head = NULL; table* q; table* p; //system("md
E:\\canyin\\table"); fp1 = fopen("E:\\canyin\\table\\table.txt","a+");
//以只读的方式打开文件 if(fp1 == NULL) { printf("文件打开失败\n"); //getchar(); //exit(0); }
else { while(!feof(fp1)) //判断文件位置标志是否移动到文件末尾 { n ++; p =
(table*)malloc(sizeof(table)); //向内存申请一段空间 //fread(p, N, 1, fp1);
//将fp所指向的文件中的内容赋给p fscanf(fp1,"%d %d %d %d %d", &p->number , &p->is_blank ,
&p->peoplenum , &p->price , &p->ordert ); if(n == 1) { head = p; q = p; } else
//创建链表 { q->next = p; q = p; } } q->next = NULL; } fclose(fp1); //关闭文件 return
head; //返回头指针 } void resave_table(table* head) { table* p; p = head;
//system("md E:\\canyin\\table"); FILE *file; //文件指针 file =
fopen("E:\\canyin\\table\\table.txt","wb+"); //以追加的方式打开文件 if(file == NULL) {
printf("文件打开失败\n"); } ///if(fwrite(p, N, 1, fp)!=1)
//将p所指向的1个大小为N的数据结构写入fp所指向的文件中 //{ //printf("文件写入失败\n"); while(p->next != NULL)
{ fprintf( file ,"%d %d %d %d %d \n", p->number, p->is_blank , p->peoplenum ,
p->price , p->ordert); p=p->next; } //} fclose(file); //关闭文件 } void client() {
order* orderh; orderh=(order*)malloc(sizeof(order)); int tablenum;
printf("当前可选择的桌位有:\n"); table* head; table* p; head =
(table*)malloc(sizeof(table)); p = (table*)malloc(sizeof(table)); head =
fftable(); p = head; while(p->next != NULL) { if(p->is_blank==0)
printf("%d号\t",p->number); } printf("请选择你的桌位号:"); scanf("%d",&tablenum); p =
head; while(p->number == tablenum) { p->is_blank = 1; p->ordert = orderh;
break; } //确定座位号 //char a; /* printf("1.点菜"); printf("2.查看已点的菜");
scanf("%s",&a); switch(a) { case'1':order();break;//调用点菜函数
case'2':look_amend();break;//调用查看函数 default:printf("请输入正确的选项!");break; } */
printf("请点菜:\n"); p->price = ORDER(orderh); resave_table(head); } int
ORDER(order* head) { menu* hot; menu* cold; menu* drink; int copies; int i=1;
int priceall = 0; hot = ffmenuhot(); cold = ffmenucold(); drink =
ffmenudrink(); menu *h , *c , *d; show();//显示菜单函数 int numo;
printf("\n请输入你要点的菜的序号:(以#结束)"); //将要点的菜加入订单链表中 //order* head; order* p; order*
q; head = (order*)malloc(sizeof(order)); p = head; while(getch()!='#') {
printf("%d:",i); scanf("%d",&numo); printf("份数:"); scanf("%d",&copies); h =
hot; c = cold; d = drink; while(h->next != NULL) { if(h->num==numo) { //p =
(order*)malloc(sizeof(order)); q = (order*)malloc(sizeof(order)); q->next =
NULL; p->number = h->num; strcmp(p->name , h->name ); p->price = h->price;
p->copies = copies; p->next = q; q = p; priceall = priceall +
copies*(h->price); break; } } while(c->next != NULL) { if(c->num==numo) { //p =
(order*)malloc(sizeof(order)); q = (order*)malloc(sizeof(order)); q->next =
NULL; p->number = c->num; strcmp(p->name , c->name ); p->price = c->price;
p->copies = copies; p->next = q; q = p; priceall = priceall +
copies*(h->price); break; } } while(d->next != NULL) { if(d->num==numo) { //p =
(order*)malloc(sizeof(order)); q = (order*)malloc(sizeof(order)); q->next =
NULL; p->number = d->num; strcmp(p->name , d->name ); p->price = d->price;
p->copies = copies; p->next = q; q = p; priceall = priceall +
copies*(h->price); break; } } i++; } printf("\n点菜成功!");
printf("您的订单总价是:%d",priceall); Sleep(10000); system("cls"); return priceall;
//look_amend(); } void look_amend() { char a; printf("你点的菜是:\n");
//将订单链表中的菜逐个输出 printf("1.添加菜品\n"); printf("2.删除菜品\n"); printf("3.确定\n");
scanf("%s",&a); switch(a) { case'1':add();break;//调用加菜函数
case'2':cancel();break;//调用减菜函数 case'3':priceall();break;
default:printf("请输入正确的选项!");break; } } void add() { show();
printf("请输入你要加入的菜的序号:"); //将菜加入订单链表 printf("\n加菜成功!"); Sleep(2000);
system("cls"); look_amend(); } void cancel() { printf("你点的菜是:");
printf("\n请输入你要删除的菜的序号:"); //将菜从订单链表中删除 printf("\n取消成功!"); Sleep(2000);
system("cls"); look_amend(); } /* void enter()//登录 { printf("账号:\n");
printf("密码:"); //调用判断登录函数; printf("\n登录成功!"); Sleep(2000);
printf("\n欢迎您!");//判断普通客户 会员 管理员 client(); }*/ /* void login() {
printf("账号:\n"); printf("密码:"); //调用判断登录函数; printf("\n登录成功!"); Sleep(2000);
printf("\n欢迎您!");//判断普通客户 会员 管理员 client(); }*/ /* void reg()//注册函数 { //注册账户
printf("注册成功!"); Sleep(2000); system("cls"); order();//调用点菜函数 } */ void
show()//显示 { menu* p1; menu* p2; menu* p3; menu* headhot; menu* headcold; menu*
headdrink; headhot = ffmenuhot(); headcold = ffmenucold(); headdrink =
ffmenudrink(); p1 = headhot; p2 = headcold; p3 = headdrink; printf("热菜:\n");
printf("序号 菜名 价格\n"); printf("%d %s %d \n", p1->num, p1->name , p1->price);
while(p1->next != NULL) { printf("%d %s %d \n", p1->num, p1->name , p1->price);
p1=p1->next; } printf("冷菜:\n"); printf("序号 菜名 价格\n"); while(p2->next!=NULL) {
printf("%d %s %d \n", p2->num, p2->name , p2->price); p2=p2->next; }
printf("饮料:\n"); printf("序号 菜名 价格\n"); while(p3->next!=NULL) { printf("%d %s %d
\n", p3->num, p3->name , p3->price); p3=p3->next; } } int priceall()//合计价格 {
//计算总价并输出 printf("您订单的总价是:"); printf("\n请等待服务员为你上菜(如需修改请和服务员联系)"); } void
welcome() { system("cls"); system("color 3E");
printf("===============欢迎来到赣味客家餐馆管理系统===============\n\n\n\n"); printf("\t
1.登录\n"); printf("\t 2.注册\n"); printf("请选择[1 2] : [ ]\b\b\b"); int n; while(1)
{ scanf("%d",&n); switch(n) { case 1: login();//登录 break; case 2: logon();//注册
break; default: break; } } } user* ff1() //将存账号的文件里的内容输出到链表中 { FILE *fp1;
//文件指针 int n = 0; user* head = NULL; user* q; user* p; system("md
E:\\canyin\\zhanghu"); fp1 = fopen("E:\\canyin\\zhanghu\\zhanghu.txt","a+");
//以只读的方式打开文件 if(fp1 == NULL) { printf("文件打开失败\n"); //getchar(); //exit(0); }
else { while(!feof(fp1)) //判断文件位置标志是否移动到文件末尾 { n ++; p = (user*)malloc(N);
//向内存申请一段空间 //fread(p, N, 1, fp1); //将fp所指向的文件中的内容赋给p fscanf(fp1,"%s %s %d
%d",p->username ,p->password ,&p->vip ,&p->adm); if(n == 1) { head = p; q = p;
} else //创建链表 { q->next = p; q = p; } } q->next = NULL; } fclose(fp1); //关闭文件
return head; //返回头指针 } //从菜单文件中读取菜单 menu* ffmenuhot() { FILE *fp1; //文件指针 int n
= 0; menu* head = NULL; menu* q; menu* p; system("md E:\\canyin\\menu"); fp1 =
fopen("E:\\canyin\\menu\\hotcai.txt","a+"); //以只读的方式打开文件 if(fp1 == NULL) {
printf("文件打开失败\n"); //getchar(); //exit(0); } else { while(!feof(fp1))
//判断文件位置标志是否移动到文件末尾 { n ++; p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间
//fread(p, N, 1, fp1); //将fp所指向的文件中的内容赋给p fscanf(fp1,"%d %s %d",&p->num
,p->name ,&p->price); if(n == 1) { head = p; q = p; } else //创建链表 { q->next =
p; q = p; } } q->next = NULL; } fclose(fp1); //关闭文件 return head; //返回头指针 }
menu* ffmenucold() { FILE *fp1; //文件指针 int n = 0; menu* head = NULL; menu* q;
menu* p; system("md E:\\canyin\\menu"); fp1 =
fopen("E:\\canyin\\menu\\coldcai.txt","a+"); //以只读的方式打开文件 if(fp1 == NULL) {
printf("文件打开失败\n"); //getchar(); //exit(0); } else { while(!feof(fp1))
//判断文件位置标志是否移动到文件末尾 { n ++; p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间
//fread(p, N, 1, fp1); //将fp所指向的文件中的内容赋给p fscanf(fp1,"%d %s %d",&p->num
,p->name ,&p->price); if(n == 1) { head = p; q = p; } else //创建链表 { q->next =
p; q = p; } } q->next = NULL; } fclose(fp1); //关闭文件 return head; //返回头指针 }
menu* ffmenudrink() { FILE *fp1; //文件指针 int n = 0; menu* head = NULL; menu* q;
menu* p; system("md E:\\canyin\\menu"); fp1 =
fopen("E:\\canyin\\menu\\drink.txt","a+"); //以只读的方式打开文件 if(fp1 == NULL) {
printf("文件打开失败\n"); //getchar(); //exit(0); } else { while(!feof(fp1))
//判断文件位置标志是否移动到文件末尾 { n ++; p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间
//fread(p, N, 1, fp1); //将fp所指向的文件中的内容赋给p fscanf(fp1,"%d %s %d",&p->num
,p->name ,&p->price); if(n == 1) { head = p; q = p; } else //创建链表 { q->next =
p; q = p; } } q->next = NULL; } fclose(fp1); //关闭文件 return head; //返回头指针 } void
login() // 账号登陆 { system("cls"); //清屏 user* p; user* head; head = ff1(); p =
head; //调用函数 ,返回值为头结点的指针 /* p = head; while(p->next!=NULL) { printf("%s %s %d
%d\n", p->username ,p->password , p->vip, p->adm); p=p->next; }*/ do{ char t,
c, k, name1[12], password1[18]; int i = 0;
printf("***************************\n\n\n\n"); printf("\t\t 登陆状态 ");
printf("请输入您的账号:"); scanf("%s", name1); printf("请输入您的密码:"); for(;;)
//此处为输入密码不回显操作 { k = getch(); //输入k if(k == '\r') //如果输入k为回车,则跳出循环 { break; }
else if(k == '\b') //如果输入k为删除键 { if(i > 0) //如若密码还没完全删除 { printf("\b");
printf(" "); printf("\b"); i--; } } else //如果输入的k既不是删除键,也不是回车键 { password1[i] =
k; //把k的值赋给_password[i]; printf("*"); //输出*号,保护用户隐私 i ++; //密码位数加1 } }
password1[i] = '\0'; while( (p != NULL) && (strcmp(p->username, name1) != 0) )
//遍历链表,寻找当前输入的账户的账号 { p = p->next; } if(p != NULL) //如果p不为空 {
if(strcmp(p->password, password1) == 0) //如果输入的密码正确 { printf("正在登陆....\n");
Sleep(500); //暂停0.5秒 system("cls"); printf("登陆成功!\n"); break; //跳出循环 } else
//如果输入的密码错误 { printf("正在登陆....\n"); Sleep(500); system("cls");
printf("-------------------------\n"); printf("| |\n"); printf("| 密码错误!是否继续?
|\n"); printf("| 1.是 2.否 |\n"); printf("| |\n");
printf("-------------------------\n"); while(1) { t = getch(); //输入t if(t ==
'1') { system("cls"); //清屏 break; } else if(t == '2') //如果输入t为n,进入开始界面 {
welcome(); break; } } } } else //如果p为空,即输入的账号不正确 { printf("正在登陆....\n");
Sleep(500); system("cls"); printf("-------------------------\n"); printf("|
|\n"); printf("| 账号错误!是否继续? |\n"); printf("| |\n"); printf("| 1.是 2.否 |\n");
printf("| |\n"); printf("-------------------------\n"); while(1) //死循环防止其他按键干扰
{ c = getch(); if(c == '1') { system("cls"); break; } else if(c == '2') {
welcome(); break; } } } }while(1); //永远为真 Sleep(500); //暂停0.5秒 client();
//menu(); //账号密码均正确,进入主菜单 } void logon() //注册账号 { //system("md
E:\\canyin\\zhanghu"); system("cls"); user* p; p = (user*)malloc(N);
//向内存申请一段空间 p->next==NULL; //do //{ char
name[12],password[18],againpassword[18],c,k; int i = 0; printf("赣味客家餐饮管理系统\n");
printf("**************************\n"); printf("请输入账号(手机号):\n");
scanf("%s",name); //printf("请输入密码:\n"); for(;;) //此处为输入密码不回显操作 {
getpassword(password,againpassword);
if(is_password_same(password,againpassword)==1); //if(strcmp(password,
againpassword) == 0) //如果输入的两次密码均正确 { strcpy(p->username, name);
strcpy(p->password, password); printf("\n是否注册为会员(0.否,1.是)"); scanf("%d",
&p->vip); printf("\n是否注册为管理员(0.否,1.是)"); scanf("%d", &p->adm);
printf("正在注册....\n"); save_user(p); Sleep(500); system("cls");
printf("注册成功!\n"); Sleep(500); //暂停0.5秒 break; //跳出循环 } /* else //如果输入的两次密码不同 {
printf("正在注册....\n"); Sleep(500); system("cls");
printf("-----------------------------"); printf("| |"); printf("|
注册失败!两次密码不统一,是否继续注册? |"); printf("| |"); printf("| 1.是 2.否 |"); printf("| |");
printf("-----------------------------"); while(1) { c = getch(); if(c == '1') {
system("cls"); //logon(); break; } else if(c == '2') { welcome(); break; } }
}*/ } //}while(1); //永远为真 printf("正在自动为您登陆....\n"); Sleep(500);
printf("\n登录成功!"); Sleep(2000); printf("\n欢迎您!");//判断普通客户 会员 管理员 client();
//login(); } void getpassword(char password[18],char againpassword[18]) { char
k; int i=0; printf("请输入密码:\n"); for(;;) //此处为输入密码不回显操作 { k = getch(); //输入k
if(k == '\r') //如果输入k为回车,则跳出循环 { break; } else if(k == '\b') //如果输入k为删除键 { if(i
> 0) //如若密码还没完全删除 { printf("\b"); printf(" "); printf("\b"); i --; } } else
//如果输入的k既不是删除键,也不是回车键 { password[i] = k; //把k的值赋给_password[i]; printf("*");
//输出*号,保护用户隐私 i ++; //密码位数加1 } } password[i] = '\0'; i = 0;
printf("\n请确认您的密码:\n"); for(;;) //此处为输入密码不回显操作 { k = getch(); //输入k if(k ==
'\r') //如果输入k为回车,则跳出循环 { break; } else if(k == '\b') //如果输入k为删除键 { if(i > 0)
//如若密码还没完全删除 { printf("\b"); printf(" "); printf("\b"); i --; } } else
//如果输入的k既不是删除键,也不是回车键 { againpassword[i] = k; //把k的值赋给_password[i];
printf("*"); //输出*号,保护用户隐私 i++; //密码位数加1 } } againpassword[i] = '\0'; } int
is_password_same(char password[18],char againpassword[18]) { char c;
if(strcmp(password, againpassword) != 0) { { printf("正在注册....\n"); Sleep(500);
system("cls"); printf("-----------------------------"); printf("| |");
printf("| 注册失败!两次密码不统一,是否继续注册? |"); printf("| |"); printf("| 1.是 2.否 |");
printf("| |"); printf("-----------------------------"); while(1) { c = getch();
if(c == '1') { system("cls"); //logon(); getpassword(password,againpassword);
break; } else if(c == '2') { return 0; welcome(); //break; } } } } else return
1; } void save_user(user* p) { system("md E:\\canyin\\zhanghu"); FILE *file;
//文件指针 file = fopen("E:\\canyin\\zhanghu\\zhanghu.txt","a"); //以追加的方式打开文件
if(file == NULL) { printf("文件打开失败\n"); } ///if(fwrite(p, N, 1, fp)!=1)
//将p所指向的1个大小为N的数据结构写入fp所指向的文件中 //{ //printf("文件写入失败\n"); fprintf( file ,"%s %s
%d %d\n", p->username , p->password , p->vip , p->adm ); //} fclose(file);
//关闭文件 } int main() { /* char a; printf("欢迎进入餐饮管理系统!"); Sleep(2000);//暂停1s
system("cls"); printf("1.登录"); printf("2.注册"); scanf("%s",&a); switch(a) {
case'1':enter();break;//调用登录函数 case'2':reg();break;//调用注册函数
default:printf("请输入正确的选项!");break; } */ welcome();//调用登陆函数 }
这是以前写的餐饮管理系统,和大佬们没得比,可以参考一下,因为是以前写的所以文件找不到了,可以自己把文件部分修改一下重新创建即可 

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信