#define _CRT_SECURE_NO_WARNINGS #include#include #include #include //用户的相关操作 int Umanu();//用户操作列表 void Uoperate(int function);//用户的指令判定 struct Users* ReadFile(char* filename);//读取之前文件之中的用户数据 struct Users* login(struct Users* Uhead);//创建用户的操作 void reg(struct Users* Uhead);//登录操作 void writeFile(struct Users* head, char* filename);//将用户信息写入文件 void Uchange(struct Users* head);//修改用户密码 void operate();//操作列表 void SearchCook(struct cook* head);//寻找对应菜品,内部调用search和print struct cook* search(struct cook* head);//小的搜索函数,执行指定搜索 void Write(struct cook* head, char* filename);//写入菜品数据 void Comment(struct cook* head);//评价菜品 void Add(struct cook* head);//在链表末尾加入新的菜品 void Allprint(struct cook* head);//打印链表中的全部元素 void print(struct cook* temp);//打印单个节点,作为内部工具类函数存在 void Change(struct cook* head);//修改菜品内容 struct cook* Read(char* filename);//读出存入的菜品内容 struct Users { char ID[21];//用户的ID char passWord[21];//用户的密码 struct Users* next;//链表操作,指向下一个存储块 }; struct Users* login(struct Users* Uhead) { struct Users* newUser = (struct Users*)malloc(sizeof(struct Users)); struct Users* temp = Uhead; printf("创建您的ID(1-20位):n"); scanf("%s", newUser->ID); printf("请输入您设置的密码(1-20位) :n"); scanf("%s", newUser->passWord); if (temp != NULL) { while (temp->next != NULL) { temp = temp->next; } temp->next = newUser; temp = temp->next; } else { temp = newUser; Uhead = temp; } newUser->next = NULL; return Uhead; } void reg(struct Users* Uhead) { int a = 0; printf("请输入您的ID :n"); char UID[20]; scanf("%s", &UID); struct Users* temp = Uhead; while (temp != NULL) { if (strcmp(temp->ID, UID) == 0) { a = 1; break; } else { temp = temp->next; } } if (a != 1) { printf("该ID还未注册!请先注册!n"); Sleep(1500); int function = Umanu(); Uoperate(function); return; } char passWord[20]; int flag = 1; while (flag) { printf("请输入您的密码 :n"); scanf("%s", passWord); if (strcmp(passWord,temp->passWord)==0) { flag = 0; printf("密码正确 !欢迎使用 !n"); Sleep(1000); return; } else { printf("密码错误 !请30秒后重试 !n"); Sleep(30000); } } } struct Users* ReadFile(char* filename) { struct Users* temp = NULL; struct Users* Uhead = temp = (struct Users*)malloc(sizeof(struct Users));; struct Users* newUser = (struct Users*)malloc(sizeof(struct Users)); newUser->next = NULL; FILE* fp = fopen(filename, "r"); if (fp == NULL) { return 0; } fscanf(fp, "%st%sn", temp->ID, temp->passWord); Uhead = temp; temp->next = NULL; while(fscanf(fp,"%st%sn",newUser->ID,newUser->passWord)!=EOF) { temp->next = newUser; temp = temp->next; newUser = (struct Users*)malloc(sizeof(struct Users)); newUser->next = NULL; } fclose(fp); return Uhead; } void destory(struct Users*Uhead) { char UID[21]; printf("请输入您的ID :n"); char chioce[5]; scanf("%s", UID); char passWord[21]; struct Users* temp = Uhead; while (temp->ID == UID) { temp = temp->next; } printf("请输入密码 :n"); scanf("%s", passWord); while (passWord == temp->passWord) { printf("请输入您的密码 :n"); scanf("%d", &passWord); if (passWord == temp->passWord) { int flag = 1; printf("密码正确 !确定要销毁账号吗 ?(yes/no)n"); while (flag) { scanf("%s", chioce); if (chioce == "yes") { flag = 0; struct Users* n = NULL; struct Users* p = Uhead; n = temp->next; while (p->next == temp) { p = p->next; } p->next = n; free(temp); return; } else if (chioce == "no") { flag = 0; printf("已取消该操作 !n"); Sleep(5); system("cls"); int function = Umanu(); Uoperate(function); return; } else { printf("请输入正确操作 !n"); } return; } } else { printf("密码错误 !请30秒后重试 !n"); // Sleep(30); } } } void Uchange(struct Users* head) { struct Users* temp = head; printf("请输入您的ID :n"); char ID[20]; scanf("%s", ID); while (temp != NULL) { if (strcmp(ID, temp->ID) == 0) { char password[20]; while (1) { printf("请输入原本的密码 :n"); scanf("%s", password); if (strcmp(password, temp->passWord) == 0) { printf("请输入修改之后的密码 :n"); scanf("%s", temp->passWord); break; } else { printf("密码错误!!!输入正确后方可修改!!!n"); Sleep(3000); } } } else { temp = temp->next; } } } void writeFile(struct Users* head, char *filename) { FILE* fp = NULL; fp = fopen(filename, "w+"); struct Users* temp = head; while (temp != NULL) { fprintf(fp, "%st%sn", temp->ID, temp->passWord); temp = temp->next; } fclose(fp); } int Umanu() { printf("----------------------------------------------------------------------n"); printf("| 食堂用户菜品管理系统 |n"); printf("|--------------------------------------------------------------------|n"); printf("| 1.注册新用户 |n"); printf("| 2.登录用户 |n"); printf("| 3.修改账户密码 |n"); printf("----------------------------------------------------------------------n"); int function = 0; printf("请输入指令 :n"); scanf("%d", &function); return function; } void Uoperate(int function) { struct Users* Uhead = (struct Users*)malloc(sizeof(struct Users)); Uhead->next = NULL; char filename[100] = "D:\关于学习勇敢的尝试\食堂用户菜品管理系统\食堂用户菜品管理系统\用户资料"; Uhead = ReadFile(filename); if (function == 1) { Uhead = login(Uhead); printf("注册成功 !欢迎使用 !n"); writeFile(Uhead, filename); Sleep(5); system("cls"); return; } else if (function == 2) { reg(Uhead); writeFile(Uhead,filename); } else if (function == 3) { Uchange(Uhead); writeFile(Uhead, filename); int function = Umanu(); Uoperate(function); } else { printf("请输入正确的指令!!!n"); int function = Umanu(); Uoperate(function); } } void manu() { printf("----------------------------------------------------------------------n"); printf("| 食堂用户菜品管理系统 |n"); printf("|--------------------------------------------------------------------|n"); printf("| 1.导入菜品信息 |n"); printf("| 2.删除菜品信息 |n"); printf("| 3.修改菜品信息 |n"); printf("| 4.打印菜品信息 |n"); printf("| 5.增加菜品信息 |n"); printf("| 6.查找菜品信息 |n"); printf("| 7.评价菜品 |n"); printf("| 8.退出系统 |n"); printf("----------------------------------------------------------------------n"); } struct cook { char name[50];//菜名 float price;//价格 char met[150];//材料 int num = 0;//评价人数 float avecom = 0;//平均评价分数 struct cook* next;//链表操作 }; void Write(struct cook* head, char* filename) { FILE* fp = NULL; fp = fopen(filename, "w"); struct cook* newUser = (struct cook*)malloc(sizeof(struct cook)); struct cook* temp = head; while (temp != NULL) { fprintf(fp, "%st%ft%st%ft%dn", temp->name, temp->price, temp->met, temp->avecom, temp->num); temp = temp->next; } return; } void Comment(struct cook* head) { struct cook* temp = head; struct cook* flag = search(temp); if (flag != NULL) { printf("请输入您的评分 :n"); float comment = 0; scanf("%f", &comment); flag->avecom = ((flag->avecom * flag->num) + comment) / (flag->num + 1); flag->num++; printf("评价成功!n"); return; } else { printf("找不到对应菜品!n"); return; } } void SearchCook(struct cook* head) { struct cook* flag = search(head); if (flag != NULL) { printf("找到了!n"); print(flag); } else { printf("未能找到对应菜品!n"); } } struct cook* search(struct cook* head) { struct cook* temp = head; char name[50]; printf("请输入您要操作的菜名 :n"); scanf("%s", name); int flag = 0; while (temp != NULL) { if (strcmp(name, temp->name) == 0) { flag = 1; return temp; } else { temp = temp->next; } } if (flag == 0) { return NULL; } } void Add(struct cook* head) { struct cook* temp = head; while (temp->next != NULL) { temp = temp->next; } struct cook* newCook = (struct cook*)malloc(sizeof(struct cook)); printf("请输入您想添加的菜品的具体信息(菜名/价格/材料/综合评分/评价人数) :n"); scanf("%s", newCook->name); scanf("%f", &newCook->price); scanf("%s", newCook->met); scanf("%f", &newCook->avecom); scanf("%d", &newCook->num); temp->next = newCook; newCook->next = NULL; printf("添加成功!n"); } void Allprint(struct cook* head) { struct cook* temp = head; while (temp->next != NULL) { print(temp); temp = temp->next; } print(temp); return; } void print(struct cook* temp) { printf("菜名:%sn", temp->name); printf("价格:%0.2fn", temp->price); printf("材料:%sn", temp->met); printf("综合评分:%0.2fn", temp->avecom); printf("评价人数(%d)n", temp->num); } void Change(struct cook* head) { struct cook* temp = head; int flag = 0; int function; struct cook* fflag = search(head); if (fflag == NULL) { printf("没有对应菜品!!!n"); return; } else { while (1) { printf("请输入想修改的内容:(1.菜品名称/2.材料/3.价格)n"); scanf("%d", &function); if (function == 1) { printf("请输入新的菜名 :n"); scanf("%s", fflag->name); printf("修改成功!n"); break; } else if (function == 2) { printf("请输入新的材料列表 :n"); scanf("%s", fflag->met); printf("修改成功!n"); break; } else if (function == 3) { printf("请输入新的价格 :n"); scanf("%f", &fflag->price); printf("修改成功!n"); break; } else { printf("请输入正确的指令!!!n"); Sleep(10000); } } } } struct cook* Delete(struct cook* head) { struct cook* temp = head; struct cook* next = NULL; struct cook* flag = search(head); if (flag != NULL) { if (flag == head) { head = head->next; return head; } else { while (temp->next != flag) { temp = temp->next; } temp->next = flag->next; return head; } } else { printf("未能找到对应菜品!n"); } } struct cook* Create(struct cook* head) { struct cook* temp = head; if (head != NULL) { while (temp->next != NULL) { temp = temp->next; } } struct cook* Next = (struct cook*)malloc(sizeof(cook)); Next->next = NULL; printf("请输入你想要录入的数据(菜名/价格/材料/综合评分/评价人数) :n若想结束,请输入endn"); while (1) { scanf("%s", Next->name); if (strcmp(Next->name, "end") == 0) { break; } scanf("%f", &Next->price); scanf("%s", Next->met); scanf("%f", &Next->avecom); scanf("%d", &Next->num); if (temp == NULL) { temp = Next; head = temp; } else { Next->next = NULL; temp->next = Next; temp = temp->next; } Next= (struct cook*)malloc(sizeof(cook)); } return head; } struct cook* Read(char* filename) { struct cook* head = NULL; struct cook* temp = (struct cook*)malloc(sizeof(cook)); struct cook* newCook = (struct cook*)malloc(sizeof(struct cook)); newCook->next = NULL; FILE* fp = fopen(filename, "r"); if (fp == NULL) { return NULL; } fscanf(fp, "%s%f%s%f%d", temp->name, &temp->price, temp->met, &temp->avecom, &temp->num); head = temp; temp->next = NULL; while (fscanf(fp, "%s%f%s%f%d", newCook->name, &newCook->price, newCook->met, &newCook->avecom, &newCook->num) != EOF) { temp->next = newCook; temp = temp->next; newCook = (struct cook*)malloc(sizeof(struct cook)); newCook->next = NULL; } fclose(fp); return head; } void operate() { int fun = 0; printf("请输入指令 :n"); struct cook* Head = NULL; char filename[100]="D:\关于学习勇敢的尝试\食堂用户菜品管理系统\食堂用户菜品管理系统\菜品资料"; struct cook* head = Read(filename); while (scanf("%d", &fun) != EOF) { if (fun == 1) { head = Create(head); } else if (fun == 2) { head = Delete(head); } else if (fun == 3) { Change(head); } else if (fun == 4) { Allprint(head); } else if (fun == 5) { Add(head); } else if (fun == 6) { SearchCook(head); } else if (fun == 7) { Comment(head); } else if (fun == 8) { Write(head,filename); printf("感谢您的使用!n"); return; } else { printf("请输入正确的指令!!!n"); } manu(); printf("请输入指令 :n"); } } int main() { int function = Umanu(); Uoperate(function); system("cls"); manu(); operate(); }
该系统我主要划分为两个大模块,分别就是对于用户的操作和对于菜品的操作,对用户的操作,首先提供void Uoperate(),是用户的操作面板,之后选用if-else if-else对指令的解析和调用函数的选择都在这个操作面板,设计内容为
1、注册新用户
2、登录用户
3、修改账户密码
对于不同的指令执行不同的操作,菜品模块类似于用户模块,提供void operate()函数,是菜品的操作面板,也是对于指令的解析和选择调用函数
1、导入菜品信息
2、删除菜品信息
3、修改菜品信息
4、打印菜品信息
5、增加菜品信息
6、查找菜品信息
7、评价菜品
8、退出系统
主函数main中主要调用就是Uoperate和operate函数,对指令的读取判定和执行都在这两个函数中,这两个函数返回空类型,只负责执行函数。
此系统中还有两个结构体用来存储不同信息
struct Users
{
char ID[21];//用户的ID
char passWord[21];//用户的密码
struct Users* next;//链表操作,指向下一个存储块
};
struct cook
{
char name[50];//菜名
float price;//价格
char met[150];//材料
int num = 0;//评价人数
float avecom = 0;//平均评价分数
struct cook* next;//链表操作
};
该系统主要用于用户管理,此时在此段代码中一共有两个链表,一个链表用于存储用户信息,另一个链表用于存储菜品信息。此处特地减少了在主函数中的代码,主函数只负责调用四个主要函数,分别为用户操作菜单,用户操作面板,菜品操作菜单和菜品操作面板。
仍有许多方面可以改善,比如注册用户和登录用户时候密码的保密性欠缺,用户可以直接看到自己输入的密码,但是实际上应该隐藏数字,防止密码泄露。同时对于用户面板的操作比较单一,而且操作过少,应该增加部分功能,比如销毁账户和退出系统。面板颜色也可以更改,但是在如上代码中没有加入相应操作。这些都是可以在之后弥补的点。



