C语言实现餐饮管理系统
作者:在zai
这篇文章主要为大家详细介绍了C语言实现餐饮管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C语言实现餐饮管理系统的具体代码,供大家参考,具体内容如下
#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 ); //}
这是以前写的餐饮管理系统,和大佬们没得比,可以参考一下,因为是以前写的所以文件找不到了,可以自己把文件部分修改一下重新创建即可
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。