#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();//调用登陆函数 } 
这是以前写的餐饮管理系统,和大佬们没得比,可以参考一下,因为是以前写的所以文件找不到了,可以自己把文件部分修改一下重新创建即可