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