#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Menu {//定义菜单 int num;//菜品编号 char name[20];//菜品名字 float price;//彩品价格 struct Menu* next;//指针域 }M;//命名为M typedef struct node {//定义用户 char user[20];//用户名 char password[20];//密码 int vip;//标记是否为vip,0表示不是,1表示是 struct node* next;//指针域 }N;//命名为N typedef struct table {//定义餐桌存储用户点菜 int num;//菜品编号 char name[20];//菜品名称 float price;//菜品单价 struct table* next;//指针域 }T;//定义为T float money[51];//记录餐桌消费金额 int flag = 0;//标记是否为vip //新用户注册模块 N* create() { N *head, *p, *q;//定义指针 int i;//判断是否开通vip head = (N *)malloc(sizeof(N));//头节点开辟空间 head->next = NULL;//置空头节点的指针域 q = head;//q指针记录头节点的地址 p = head->next;//p指针记录头节点的指针域的地址 p = (N *)malloc(sizeof(N));//p指针开辟空间 printf("请输入用户名\n"); scanf("%s", p->user); printf("请输入密码\n"); scanf("%s", p->password); printf("是否开通会员1.是2.否\n");//选择是否开通会员 scanf("%d", &i); if (i == 1)//开通会员 p->vip = 1; else//不开通会员 p->vip = 0; p->next = NULL;//置空p节点的指针域 q->next = p;//p,q节点连接 return head;//返回链表的起始地址 } //点餐模块 T* order(M *headm) { int num;//定义num用于点餐 T *p, *q;//定义指针便于对链表操作 M *s;//定义指针便于对链表操作 T *headt = (T*)malloc(sizeof(T));//对餐桌链表开辟头节点 p = headt;//p指针记录头节点 q = headt->next;//q指针记录头节点的指针域 s = headm->next;//s指针记录菜单链表头节点的指针域 printf("请输入菜品编号,编号为零时结束点菜\n"); scanf("%d", &num); while (num != 0)//停止点菜判断当输入编号为零时停止点餐 { s = headm->next;//每次点菜都将指针返回至菜单链表的头节点的指针域 q = (T *)malloc(sizeof(T));//为q指针开辟空间 q->next = NULL;//置空指针域 while(s)//当s指针不为空时循环 { //判断是否找到菜品编号 if (s->num == num)//为真时 { //将菜品信息储存在餐桌链表中 q->num = s->num; strcpy(q->name, s->name); q->price = s->price; p->next = q;//连接节点 p = q;//指针后移 break; } else//为假时 { s = s->next;//指针后移 } } scanf("%d", &num);//输入点菜编号 } return headt;//返回餐桌链表的头节点 } //登陆模块 int reginster1(N *headn) { char user[20];//定义用户名 char password[20];//定义密码 printf("请输入用户名\n"); scanf("%s", user); printf("请输入密码\n"); scanf("%s", password); N *p;//定义指针便于链表操作 p = headn->next;//记录头节点的指针域 while (p)//查找用户 { //对比用户名和密码 if ((strcmp(user, p->user) == 0) && (strcmp(password, p->password) == 0))//为真时 { //判断是否为vip if (p->vip == 1)//为真时 flag = 1;//更改全局变量 return 1;//退出函数并返回1表示登陆成功 } else//为假时 p = p->next;//指针后移 if (!p)//p为空时停止循环 break; } return 0;//否则返回0 } //计算模块 void cal(T *headt,int no) { T *p;//定义p指针 int i; p = headt->next;//p记录头节点的指针域地址 money[no] = 0; while (p)//p不为空时进行计算 { money[no]+= p->price; p = p->next;//p指针后移 } } //插入节点模块(可多个插入) void insert(M *headm) { int num, flag = 1;//flag实现判断指针是否到达最后一个节点 M *p, *q, *r; //定义指针便于插入操作 printf("请输入要增加菜品编号,编号为零时结束\n"); scanf("%d", &num); while (num != 0)//输入编号不为零时循环,以零终止,可实现多个插入 { r = (M *)malloc(sizeof(M));//为r开辟空间 r->next = NULL;//置空r的指针域 r->num = num; printf("请输入菜品名称和单价"); scanf("%s %f", r->name,&r->price); q = headm;//q指针记录头节点的地址 p = headm->next;//p指针记录头节点的指针域的地址 while (q->next != NULL && p->num<r->num)//循环条件:当q->next不为空,以及p->num<r->num实现插入后无需排序 { p = p->next;//p指针后移 q = q->next;//q指针后移 if (q->next == NULL)//这个判断防止q->next为空时,在执行循环是出现野指针使程序出错 { p = NULL;//防止出现野指针p q->next = r;//连接节点 r->next = NULL;//置空r指针域 flag = 0;//到达最后一个节点更改flag break; } } if (flag)//判断是否到达最后一个节点,为真执行该操作 { r->next = p; q->next = r; //实现将r节点插入链表 } printf("请输入菜品编号,编号为零结束"); scanf("%d", &num); } } //删除节点模块 void del1(M *headm) { M *p, *q;//定义指针 int b;//用于输入编号查找删除 p = headm;//p记录头节点的地址 q = headm->next;//q记录头节点的指针域的地址 //输入编号 printf("请输入要删除菜品编号:"); scanf("%d", &b); while (q != NULL)//q不为空时执行循环 { if (q->num == b)//判断是否找到输入的编号 //为真时 { p->next = q->next;//断开q节点 free(q);//释放q节点内存 q = NULL; //置空q指针防止出现野指针 } else { //判断为假时 p = p->next;//p指针后移 q = q->next;//q指针后移 } } if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERROR INPUT printf("ERROR INPUT\n"); } //删除节点模块 void del2(N *headn) { N *p, *q;//定义指针 char user[20];//用于输入编号查找删除 p = headn;//p记录头节点的地址 q = headn->next;//q记录头节点的指针域的地址 //输入编号 printf("请输入要删除的用户的用户名:"); scanf("%s",user); while (q != NULL)//q不为空时执行循环 { if (strcmp(user,q->user)==0)//判断是否找到输入的编号 //为真时 { p->next = q->next;//断开q节点 free(q);//释放q节点neicun q = NULL; //置空q指针防止出现野指针 } else { //判断为假时 p = p->next;//p指针后移 q = q->next;//q指针后移 } } if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERROR INPUT printf("ERROR INPUT\n"); } //删除节点模块 void del3(T *headt) { T *p, *q;//定义指针 int b;//用于输入编号查找删除 p = headt;//p记录头节点的地址 q = headt->next;//q记录头节点的指针域的地址 //输入编号 printf("请输入要删除菜品编号:"); scanf("%d", &b); while (q != NULL)//q不为空时执行循环 { if (q->num == b)//判断是否找到输入的编号 //为真时 { p->next = q->next;//断开q节点 free(q);//释放q节点内存 q = NULL; //置空q指针防止出现野指针 } else { //判断为假时 p = p->next;//p指针后移 q = q->next;//q指针后移 } } if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERROR INPUT printf("ERROR INPUT\n"); } void mod1(M *headm) { M *p;//定义指针便于链表操作 //定义变量用于修改信息 int num1, num2; char name[20]; float price1; printf("请输入要修改的菜品编号:"); scanf("%d", &num1); p = headm->next;//p指针记录头节点的指针域 while (p != NULL)//p不为空时循环 { if (p->num == num1)//判断是否找到 { //修改信息 printf("请重输入该菜品的编号,菜名,单价\n"); scanf("%d %s %f", &num2, name, &price1); p->num = num2; strcpy(p->name, name); p->price = price1; break; } else //为假时 p = p->next;//指针后移 } if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT printf("ERROR INPUT\n"); } void mod2(N *headn) { N *p;//定义指针 //定义变量用于修改信息 char user[20],user1[20],password[20]; int vip; printf("请输入要修改的用户的用户名:"); scanf("%s",user); p = headn->next;//p指针记录头节点的指针域 while (p != NULL)//p不为空时循环 { if (strcmp(user,p->user)==0)//判断是否找到 { //修改信息 printf("请重输入用户名,密码,是否为vip(0不是,1是)\n"); scanf("%s %s %d", user1, password, &vip); strcpy(p->user, user1); strcpy(p->password, password); p->vip = vip; break; } else //为假时 p = p->next;//指针后移 } if (p == NULL)//查找到最后一个节点还未查到时,输出ERROR INPUT printf("ERROR INPUT\n"); } //文件保存模块 void save1(M *headm) { FILE *inFile;//定义文件操作指针 M *p;//链表操作指针 p = headm->next;//p指针记录头结点的指针域 inFile = fopen("C:\\papapa\\menu.txt", "w");//打开文件使用文件操作的只写 while (p != NULL)//p不为空时循环 { //将链表信息写入文件 fprintf(inFile, "%d ", p->num); fprintf(inFile, "%s ", p->name); fprintf(inFile, "%f", p->price); fprintf(inFile, "\n"); p = p->next;//指针后移 } fclose(inFile);//关闭文件 printf("save successfully\n");//保存成功 getchar(); } //文件读取模块 M *read1() { FILE *inFile;//定义文件操作指针 M *headm, *p, *q;//定义链表操作指针 headm = (M *)malloc(sizeof(M));//开辟空间 headm->next = NULL;//置空指针域 q = headm;//记录头节点地址 p = headm->next;//记录头节点指针域的地址 if ((inFile = fopen("C:\\papapa\\menu.txt", "r")) == NULL)//当文件为空时打开失败退出程序,使用文件操作的只读 { printf("failed"); exit(1); } p = (M *)malloc(sizeof(M));//开辟空间 while (fscanf(inFile, "%d %s %f", &p->num, p->name, &p->price) != EOF)//当读取到信息时执行循环并将信息读取到链表中 { p->next = NULL;//置空指针域 q->next = p;//连接节点 q = p;//指针后移 p = (M *)malloc(sizeof(M));//开辟空间 } fclose(inFile);//关闭文件 return headm;//返回头节点地址 } //文件保存模块 void save2(N *headn) { FILE *inFile;//定义文件操作指针 N *p;//链表操作指针 p = headn->next;//p指针记录头结点的指针域 inFile = fopen("C:\\papapa\\use.txt", "w");//打开文件使用文件操作的只写 while (p != NULL)//p不为空时循环 { //将链表信息写入文件 fprintf(inFile, "%s ", p->user); fprintf(inFile, "%s ", p->password); fprintf(inFile, "%d", p->vip); fprintf(inFile, "\n"); p = p->next;//指针后移 } fclose(inFile);//关闭文件 printf("save successfully\n");//保存成功 getchar(); } //文件读取模块 N *read2() { FILE *inFile;//定义文件操作指针 N *headn, *p, *q;//定义链表操作指针 headn = (N *)malloc(sizeof(N));//开辟空间 headn->next = NULL;//置空指针域 q = headn;//记录头节点地址 p = headn->next;//记录头节点指针域的地址 if ((inFile = fopen("C:\\papapa\\use.txt", "r")) == NULL)//当文件为空时打开失败退出程序,使用文件操作的只读 { printf("failed"); exit(1); } p = (N *)malloc(sizeof(N));//开辟空间 while (fscanf(inFile, "%s %s %d", p->user, p->password, &p->vip) != EOF)//当读取到信息时执行循环并将信息读取到链表中 { p->next = NULL;//置空指针域 q->next = p;//连接节点 q = p;//指针后移 p = (N *)malloc(sizeof(N));//开辟空间 } fclose(inFile);//关闭文件 return headn;//返回头节点的指针域 } void save3(N *headn) { FILE *inFile;//定义文件操作指针 N *p;//链表操作指针 p = headn->next;//p指针记录头结点的指针域 inFile = fopen("C:\\papapa\\use.txt", "a+");//打开文件使用文件操作的追加 while (p != NULL)//p不为空时循环 { //将链表信息写入文件 fprintf(inFile, "%s ", p->user); fprintf(inFile, "%s ", p->password); fprintf(inFile, "%d", p->vip); fprintf(inFile, "\n"); p = p->next;//指针后移 } fclose(inFile);//关闭文件 printf("save successfully\n");//保存成功 getchar(); } //作者查找模块 void search1(M *headm) { M *p;//定义指针 char name[20];//定义name2用于输入查找 printf("请输入要查找的菜品名:"); scanf("%s", name); p = headm->next; while (p != NULL) { if (strcmp(p->name, name) == 0)//判断是否找到 { //为真时,输出信息 printf("%d\t%s\t%.2f\n", p->num, p->name,p->price); break; } else //为假时 p = p->next;//指针后移 } if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT printf("ERROR INPUT\n"); } //编号查找 void search2(M *head) { M *p;//定义指针 int num1;//定义num1用于输入查找 printf("请输入要查找的菜品编号:"); scanf("%d", &num1); p = head->next; while (p != NULL) { if (p->num == num1)//判断是否找到 { //为真时,输出信息 printf("%d\t%s\t%.2f\n", p->num, p->name, p->price); break; } else //为假时 p = p->next;//指针后移 } if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT printf("ERROR INPUT\n"); } //输出链表模块 void print1(M *headm) { M *p = headm->next; printf("菜品编号\t菜品名称\t菜品单价\n"); while (p)//当p不为空的时候执行 { printf("%d\t%s\t%f\n", p->num, p->name, p->price); p = p->next;//指针后移 } } void print2(N *headn) { N *p = headn->next; printf("用户名\t密码\t是否为会员(0:否,1:是)\n"); while (p)//当p不为空的时候执行 { printf("%s\t%s\t%d\n", p->user, p->password,p->vip); p = p->next;//指针后移 } } void print3(T *headt) { T *p = headt->next; printf("菜品编号\t菜品名称\t菜品单价\n"); while (p)//当p不为空的时候执行 { printf("%d\t%s\t%.2f\n", p->num, p->name, p->price); p = p->next;//指针后移 } } int main() { int a = 1,a1=1,a2=1; int n,n1,n2,n3; int judge=0; int no,sum; N *headn; M *headm; T *headt; headn = read2(); headm = read1(); char admisionuser[20]; char admisionpassword[20]; printf("请选择1.管理员2.用户3.退出\n"); scanf("%d", &n2); if (n2 == 1) { printf("请输入管理账号\n"); scanf("%s", admisionuser); printf("请输入密码\n"); scanf("%s", admisionpassword); if ((strcmp(admisionuser, "papapacanguan") == 0) && (strcmp(admisionpassword, "iloveyou") == 0)) { printf("1.删除菜品\n2.添加菜品\n3.修改菜品\n4.删除用户\n5.修改用户\n6.退出\n"); while (a2) { scanf("%d", &n3); switch (n3) { case 1: print1(headm); del1(headm); save1(headm); print1(headm); break; case 2: print1(headm); insert(headm); save1(headm); print1(headm); break; case 3: print1(headm); mod1(headm); save1(headm); print1(headm); break; case 4: print2(headn); del2(headn); save2(headn); print2(headn); break; case 5: print2(headn); mod2(headn); save2(headn); print2(headn); break; case 6: a2 = 0; break; } } } } else if (n2 == 2) { printf("新用户请选择注册,老用户请选择登录\n1.注册\n2.登陆\n3.退出\n"); while (a) { scanf("%d", &n); switch (n) { case 1: headn = create(); save3(headn); printf("注册成功请选择登录\n"); break; case 2: headn = read2(); judge = reginster1(headn); if (judge) { printf("登陆成功\n"); printf("请输入桌号和人数"); scanf("%d %d", &no, &sum); printf("1.菜品名称查询\n2.菜品编号查询\n3.点菜\n4.删除已点菜品\n5.退出\n"); while (a1) { scanf("%d", &n1); switch (n1) { case 1: search1(headm); break; case 2: search2(headm); break; case 3: print1(headm); headt=order(headm); cal(headt, no); printf("桌号:%d 人数:%d\n", no, sum); if (flag) { printf("实际消费总金额:%.2f\n", money[no]); printf("应付消费总金额:%.2f\n", money[no] * 0.88); } else printf("消费总金额:%.2f\n", money[no]); printf("点餐明细\n"); print3(headt); break; case 4: print3(headt); del3(headt); cal(headt, no); printf("桌号:%d 人数:%d\n", no, sum); if (flag) { printf("实际消费总金额:%.2f\n", money[no]); printf("应付消费总金额:%.2f\n", money[no] * 0.88); } else printf("消费总金额:%.2f\n", money[no]); printf("点餐明细\n"); print3(headt); break; case 5: a1 = 0; break; } } } else { printf("登陆失败\n"); } break; case 3: a = 0; break; } } } else return 0; }
餐饮管理系统源代码
最新推荐文章于 2024-05-23 15:05:27 发布