1、题目意义 餐厅点餐管理系统是一个信息化、智能化的系统,它可以帮助餐厅实现高效、便捷的点餐、结账和管理。这个系统的意义在于提高餐厅的工作效率,减少人力成本,提升顾客的就餐体验,以及帮助餐厅更好地管理。 (1)提升客户体验:通过提供在线点餐功能,客户可以方便地浏览菜单、选择菜品并下单。系统通过直观易用的界面设计,让点餐过程变得简单快捷,减少了等待时间,提升了用餐的满意度和整体体验。同时,即时结算功能让支付过程更加透明、安全,进一步增强了顾客的信任感。 (2)简化餐厅管理流程:管理员可以通过系统轻松修改菜品价格、添加新菜品或删除不再提供的菜品,还可以查看指定日期的当天所有点餐记录,方便统计收入。管理员可以灵活调整菜单,紧跟市场变化,满足顾客多样化的需求。这不仅有助于提升餐厅的竞争力,还能有效控制成本,提高盈利能力。此外,系统化管理还简化了繁琐的日常工作流程,使得管理员能够更专注于提升餐厅的整体运营质量和顾客服务水平,这有助于餐厅快速响应市场需求和调整经营策略,减少人工操作的错误和时间成本。 (3)通过细分客户与管理员两个界面,系统不仅为顾客提供了便捷、高效的点餐与结算体验,还极大地增强了餐厅内部的管理灵活性与效率。 (4)收集用户意见、提高服务质量:通过用户反馈界面,餐厅可以主动收集到顾客对餐厅服务、菜品质量、环境等方面的意见和建议。这些反馈可以帮助餐厅了解顾客的需求和期望,从而改进服务质量和提升用户体验。用户反馈可以帮助餐厅发现存在的问题和不足之处,及时进行改进。例如,如果顾客反映菜品口味不佳,餐厅可以根据反馈调整厨师的烹饪方法或更换食材;如果顾客反映服务员态度不好,餐厅可以加强员工培训,提高服务水平。 (5)用户可查看特色菜品图片:图片能够直观地展示菜品的外观,帮助顾客更快速地理解菜品的特点和风味,从而做出更加满意的点餐选择。这种视觉上的呈现方式比文字描述更能吸引顾客的兴趣。 综上所述,该餐厅点餐与管理系统的设计与实施,对于提升顾客用餐体验、优化餐厅运营流程、增强市场竞争力以及提高盈利能力等方面都具有深远的意义。 2、设计思想 一、系统设计概述 本系统旨在通过信息化手段优化餐厅的点餐流程与后台管理,提升顾客体验与餐厅运营效率。系统分为两大主要部分:客户点餐子系统和后台管理子系统。客户点餐子系统面向顾客,提供便捷的点餐与反馈功能;后台管理子系统则面向餐厅管理人员,提供菜单管理与意见反馈和查看指定日期记录功能。 二、客户点餐子系统设计思想
- 用户体验优先:
界面友好:设计直观易用的用户界面,确保顾客能迅速上手。 流程简化:点餐流程应简洁明了,减少顾客操作步骤,提高点餐效率。 实时反馈:顾客在点餐过程中可随时查看订单详情,并可随时修改。 音乐播放和图片查看:音乐可以营造轻松愉快的氛围,使顾客在点餐过程中感到愉悦。通过菜品图片查看,顾客可以更快地找到自己喜欢的菜品,从而减少点餐时间,提高点餐效率。
- 灵活性与可扩展性:
菜品选择多样化:支持主食、素菜、荤菜、饮品等多种分类,方便顾客根据个人口味选择。 自定义修改:允许顾客修改菜品数量、删除菜品等,增强点餐的灵活性。 反馈机制:提供意见反馈功能,收集顾客建议,促进餐厅服务的持续改进。
- 交互逻辑清晰:
菜单导航:通过序号选择菜品,减少文字输入,提高点餐速度。 修改与确认:明确显示“是否修改菜单”的提示,确保顾客操作无误。 退出与结算:设置明确的退出与结算按钮,方便顾客完成点餐流程,并可以在客户付款后及时找钱。 三、后台管理子系统设计思想
- 高效管理:
集中管理:将菜单修改与意见反馈处理功能集中于一个平台,提高管理效率。 快速响应:支持快速添加、删除菜品及更改价格,及时响应市场需求变化,可以查看当日所有客户点餐信息,方便及时上菜和计算当日收入。
- 数据准确性:
数据校验:在修改菜单或处理反馈时,进行必要的数据校验,确保数据准确性。 记录完整:详细记录用户的反馈内容、昵称及反馈时间,为后续改进提供依据。
- 安全性与稳定性:
权限控制:严格控制访问权限,确保只有授权人员才能进行系统操作。 数据备份:定期备份系统数据,防止数据丢失,保障系统稳定运行。
- 持续改进:
数据分析:商家对顾客反馈数据进行分析,找出服务中的不足与改进点。 功能迭代:根据数据分析结果及市场需求变化,不断优化系统功能,提升餐厅运营水平。 系统主要结构 (1)该系统分为客户点菜界面和后台管理两部分  (2)客户点餐功能  (3)后台管理功能  #define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <string.h>
# include <conio.h>//在控制台窗口进行输入和输出 getch函数
# include <graphics.h>
# include <mmsystem.h>//系统多媒体头文件
# pragma comment(lib,"winmm.lib")
struct Dishes //用于存储菜品信息,包括名称、价格和指向下一个菜品的指针
{
char name[30];
float price;
struct Dishes* next;
};
struct Bill//用于存储账单信息,包括名称、价格、数量、序号和指向下一个账单项的指针
{
char name[30];
float price;
int num;
int sign;
struct Bill* next;
};
char today[100]; // 当天日期
char str1[80];
FILE* fp3;//账单文件指针
FILE* daily;
float SUM = 0; //消费总计
char time1[100]; //存储时间字符串,用于文件命名
void Menu();//顾客菜单界面
void menu2();//管理员界面菜单
void menu3();//管理员修改菜类界面
void menu5();//管理员修改具体菜品界面
void greet(struct tm* p);//获取早中晚时间并问好
void printDishes(FILE* fp);//打印菜单文件数据
void printnew(Dishes* head);//打印管理员修改价格后的菜单
void printBill(Bill* head1, char* dname);//打印菜单
void deletedish(Bill** head1, int n);//顾客删除菜单
Dishes* read_dishes(FILE* fp); //从文件中读取信息并创建链表
void change(char* dishname);//管理员修改菜单
void change2(Bill** head1);//顾客点单后修改菜单
char* hide();//隐藏输入密码
int guanli();//管理员输入密码
void menu4();//管理员修改菜类
void total();//结账
void checkDishes(FILE* fp, char* name1);//顾客点单操作
void suggestion(char* name, char* feedback);//顾客反馈
void Menu() {//顾客菜单界面
printf(" ----------------------- \n");
printf(" | 菜单 | \n");
printf(" ----------------------- \n");
printf(" | 1.主食 | \n");
printf(" ----------------------- \n");
printf(" | 2.素菜 | \n");
printf(" ----------------------- \n");
printf(" | 3.荤菜 | \n");
printf(" ----------------------- \n");
printf(" | 4.饮品 | \n");
printf(" ----------------------- \n");
printf(" | 5.意见反馈 | \n");
printf(" ----------------------- \n");
printf(" | 6.特色菜图片 | \n");
printf(" ----------------------- \n");
printf(" | 0.退出并结算 | \n");
printf(" ----------------------- \n");
printf("\n");
}
void menu2()//管理员界面菜单
{
printf(" ----------------------- \n");
printf(" | 1.修改菜类 | \n");
printf(" ----------------------- \n");
printf(" | 2.退出页面 | \n");
printf(" ----------------------- \n");
printf(" | 3.查看反馈意见 | \n");
printf(" ----------------------- \n");
printf(" | 4.查看指定日期记录| \n");
printf(" ----------------------- \n");
}
void menu3()//管理员修改菜类界面
{
printf(" ----------------------- \n");
printf(" | 菜单 | \n");
printf(" ----------------------- \n");
printf(" | 1.主食 | \n");
printf(" ----------------------- \n");
printf(" | 2.素菜 | \n");
printf(" ----------------------- \n");
printf(" | 3.荤菜 | \n");
printf(" ----------------------- \n");
printf(" | 4.饮品 | \n");
printf(" ----------------------- \n");
}
void menu5()//管理员修改具体菜品界面
{
printf(" ----------------------- \n");
printf(" | 请选择 | \n");
printf(" ----------------------- \n");
printf(" | 1.添加菜品 | \n");
printf(" ----------------------- \n");
printf(" | 2.删除菜品 | \n");
printf(" ----------------------- \n");
printf(" | 3.修改价格 | \n");
printf(" ----------------------- \n");
printf(" | 0.退出 | \n");
printf(" ----------------------- \n");
printf("输入序号:");
}
void printDishes(FILE* fp)//打印菜单文件数据
{
char name[40];
float price;
int count = 1;
while (fscanf(fp, "%s%f", name, &price) != EOF) {
getc(fp);//读取换行符
printf("%2d.%-15s%.1f\n", count++, name, price);
}
rewind(fp);
}
void printnew(Dishes* head)//打印管理员修改价格后的菜单
{
Dishes* t2 = head;
int count = 1;
while (t2 != NULL)
{
printf("%2d.%-15s%.1f\n", count++, t2->name, t2->price);
t2 = t2->next;
}
}
void printBill(Bill* head1, char* dname)//打印菜单
{
Bill* temp = head1;
printf("———————————————————————%s———————————————————————————\n", dname);
float sum = 0;
int count = 1;
while (temp != NULL) {
printf("|No.%d.%-15s%d(份) * %.1f(元) 小计: %.1f(元)|\n", count++, temp->name, temp->num, temp->price, temp->num * temp->price);
printf("——————————————————————————————————————————————————————\n");
sum += temp->price * temp->num;
temp = temp->next;
}
printf(" 共计: %.1f(元)\n", sum);
}
void deletedish(Bill** head1, int n) //将`Bill**head`作为函数参数允许你在函数内部修改外部的链表结构,比如调整头节点。
// - 将`Bill*head`作为函数参数通常是为了传递链表的引用,进行读操作或遍历,而不影响外部链表的结构。
{
if (n <= 0 || head1 == NULL || *head1 == NULL) {//判断传入的链表头指针的指针是否为空,判断通过 head1 指向的链表头指针是否为空
return;
}
Bill* current = *head1;
Bill* prev = NULL;
// 如果要删除的是头节点
if (n == 1)
{
*head1 = current->next;
free(current);
return;
}
// 找到要删除的节点的前一个节点
for (int i = 1; current != NULL && i < n; i++)
{
prev = current;
current = current->next;
} // 如果当前节点为空,说明链表长度小于n
if (current == NULL)
{ // 处理链表长度小于n的情况
return;
} // 删除节点
prev->next = current->next;
free(current);
}
void greet(struct tm* p)//获取早中晚时间
{
int time = p->tm_hour;
if (time >= 7 && time < 12)
{
printf("上午好!\n");
}
else if (time >= 12 && time <13)
{
printf("中午好!\n");
}
else if (time >= 13 && time < 18)
{
printf("下午好!\n");
}
else if (time >= 18 && time <=21)
{
printf("晚上好!\n");
}
}
Dishes* read_dishes(FILE* fp) //从文件中读取信息并创建链表 返回一个指向 Dishes结构体的指针
{
Dishes* head = NULL, * temp=NULL, * r;
char name2[40];
float price;
int sales;
while (fscanf(fp, "%s %f", name2, &price) != EOF)//从文件中读取信息,并将其存储到结构体数组中
{
r = (Dishes*)malloc(sizeof(Dishes));
strcpy(r->name, name2);
r->price = price;
if (head == NULL) {
head = r;
temp = r;
r->next = NULL;
}
else {
temp->next = r;
temp = temp->next;
r->next = NULL;
}
}
rewind(fp);
return head;
}
void change(char* dishname)//管理员修改菜单
{
FILE* fp;
if ((fp = fopen(dishname, "r+")) == NULL)
{
printf("Error!\n");
exit(1);
}
while (1)
{
menu5();
int b = 0;
scanf("%d", &b);
switch (b)
{
case 1://添加菜品
{
fp = fopen(dishname, "a+");//光标默认在末尾
while (1)
{
printf("请依次输入菜名 价格,(中间以空格分开)\n");
char name2[20];
float price;
char d;
scanf("%s %f", name2, &price);
getchar();//消除换行符
fprintf(fp, "%-15s %4.1f\n", name2, price);
printf("是否继续录入? 1.是 2.否\n");
scanf("%c", &d);
if (d == '2')
{
break;
}
}
fclose(fp);
break;
}
case 2://删除菜品
{
fp = fopen(dishname, "r+");//光标默认在开头,以读写方式打开
Dishes* head = read_dishes(fp);
printf("请选择需要删除的菜品 (输入0退出)\n");
printDishes(fp);
int choose3;
while (1)
{
Dishes* p, * q = NULL, * t = NULL;
p = head;
scanf("%d", &choose3);
if (choose3 == 0)
{
break;
}
for (int i = 1; i < choose3; i++)
{
q = p;
p = p->next;
}
if (q == NULL)//要删除的是头节点
{
head = head->next;//将头节点指向下一个节点,并释放原头结点的内存
free(q);
}
else
{
t = p;
q->next = p->next;
free(t);
}
printf("修改后的菜单如下\n");
printnew(head);//打印删除后新菜单
}
//将更新后的信息写回文件
if ((fp = fopen(dishname, "w+")) == NULL)//w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
{
printf("Error!\n");
exit(1);
}
Dishes* th = head;
while (th != NULL)
{
fprintf(fp, "%-15s %4.1f\n", th->name, th->price);
th = th->next;
}
printf("删除成功\n");
fclose(fp);
break;
}
case 3://修改菜品价格
{
fp = fopen(dishname, "r+");//光标默认在开头
Dishes* head = read_dishes(fp);
printf("请选择需要修改价格的菜品 (输入0退出)\n");
printDishes(fp);
int choose4;
float new_price;
while (1)
{
Dishes* p, * q = NULL, * t = NULL;
p = head;
scanf("%d", &choose4);
if (choose4 == 0)
{
break;
}
printf("请输入价格\n");
scanf("%f", &new_price);
for (int i = 1; i < choose4; i++)
{
q = p;
p = p->next;
}
if (q == NULL)//要修改的是头节点
{
head->price = new_price;
}
else
{
p->price = new_price;
}
printnew(head);//打印修改后新菜单
}
if ((fp = fopen(dishname, "w+")) == NULL)
{
printf("Error!");
exit(1);
}
Dishes* th = head;
while (th != NULL)//向文件中写入新菜单
{
fprintf(fp, "%-15s %4.1f\n", th->name, th->price);
th = th->next;
}
printf("修改成功\n");
fclose(fp);
break;
}
case 0:
{
break;
}
default: {
printf("输入有误,请重新输入\n");
}
}
if (b == 0)
{
break;
}
}
}
void change2(Bill** head1)//点单后修改菜单
//head1是指向Bill结构体指针的变量,head1指向结构体的地址,*head1指向该结构体的内容
{
int choose5;
while (1)
{
Bill* t = *head1, * r = NULL;
printf("请选择修改的菜品(序号) 输入0退出:\n");
scanf("%d", &choose5);
if (choose5 == 0)
{
break;
}
else
{
int i = 1;
while (i < choose5)
{
t = t->next;
i++;
}
printf("1.修改数量 2.删除该菜品 0.返回\n");
int choose6;
scanf("%d", &choose6);
if (choose6 == 0)
{
break;
}
if (choose6 == 1)
{
printf("请输入要修改的数量:\n");
int choose7;
scanf("%d", &choose7);
if (choose7 != 0)
{
t->num = choose7;
}
else if (choose7 == 0)
{
deletedish(head1, choose5);
}
}
else if (choose6 == 2)
{
deletedish(head1, choose5);
}
}
}
}
char* hide()//隐藏输入密码
{
char password[20];
int i = 0;//密码位数
char* p;
char t;
while (1)
{
t = _getch();
if (t == '\r')//回车则跳出循环
{
break;
}
else if (t == '\b')//输入的是退格键
{
if (i > 0)
{
printf("\b");//输出一个退格符,将光标移到前一个字符位置
printf(" ");//输出空格覆盖光标所在位置
printf("\b");//将光标移到原来位置
i--;
}
}
else
{
password[i] = t;
printf("*");
i++;
}
}
password[i] = '\0';
p = password;
return p;
}
int guanli()//管理员输入密码
{
printf("请输入密码:\n");
char passport1[20];
char* p;
p = hide();
if (strcmp("666666", p) == 0)
{
system("cls");
printf("\n管理员登录成功。\n");
return 1; // 返回1表示管理员登录成功
}
else
{
printf("\n登录失败\n");
return 0;
}
}
void menu4()//管理员修改菜类
{
menu3();
int choose3;
while (1)
{
printf("请选择修改的菜类:(0退出当前页面)\n");
scanf("%d", &choose3);
switch (choose3) {
case 1:
{
char a[] = "主食.txt";
change(a);
break;
}
case 2:
{
char a[] = "素菜.txt";
change(a);
break;
}
case 3:
{
char a[] = "荤菜.txt";
change(a);
break;
}
case 4:
{
char a[] = "饮品.txt";
change(a);
break;
}
case 0:
{
break;
}
case 5:
{
break;
}
default:
{
printf("请重新输入!\n");
break;
}
}
if (choose3 == 0)
{
break;
}
}
}
void total()//结账
{
fprintf(fp3, "\t\t\t消费合计: %.1f(元)", SUM);
if ((daily = fopen(today, "a+")) == NULL) {
printf("Error opening daily order file!\n");
exit(1);
}
fprintf(daily, "消费合计: %.1f(元)", SUM);
}
void suggestion(char* name, char* feedback)//顾客反馈
{
FILE* fp;
time_t now;
time(&now);
char buffer[80];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S %a", localtime(&now));
fp = fopen("顾客意见反馈.txt", "a");
if (fp == NULL)
{
printf("error\n");
exit(1);
}
fprintf(fp, "时间: %s\n", buffer);
fprintf(fp, "顾客: %s\n", name);
fprintf(fp, "意见: %s\n", feedback);
fprintf(fp, "————————————————————\n");
fclose(fp);
printf("感谢您的反馈!\n");
}
char* getValidDate() {
char date[11]; // "YYYY-MM-DD" 需要 10 个字符 + 1 个终止符
while (1) {
printf("请输入您想查看的日期 (格式: YYYY-MM-DD): ");
scanf("%10s", date); // 限制输入长度为 10 个字符
// 检查日期格式是否正确
if (strlen(date) == 10 && date[4] == '-' && date[7] == '-') {
int year, month, day;
if (sscanf(date, "%d-%d-%d", &year, &month, &day) == 3) {
// 日期有效性检查
if (year >= 2000 && year <= 2100 && month >= 1 && month <= 12 && day >= 1 && day <= 31) {
return date; // 返回复制的字符串,保证返回给调用者的日期字符串是一个独立的、不受函数内部其他操作影响的副本
}
}
}
printf("输入的日期格式不正确,请重新输入。\n");
}
}
void showOrdersForDate(const char* date) {
// 构造文件名
char filename[100];
sprintf(filename, "%s.xls", date);
// 打开文件
FILE* fp = fopen(filename, "r");
if (fp == NULL) {
printf("无法找到 %s 的账单记录。\n", filename);
return;
}
// 读取文件内容并输出
char line[256];
printf("账单记录 (%s):\n", filename);
while (fgets(line, sizeof(line), fp) != NULL) {
printf("%s", line);
}
fclose(fp);
}
void checkDishes(FILE* fp, char* name1)//顾客点单操作
{
int s, num1; //分别代表菜品序号、点餐数量
Bill* head1 = NULL, * temp=NULL, * r;
char target[10];
int i = 0;
while (name1[i] != '.')
{
target[i] = name1[i];
i++;
}
target[i] = '\0';
if ((fp = fopen(name1, "r+")) == NULL) {
printf("系统错误,请联系工作人员");
exit(1);
}
printf("请选择菜品和数量(用空格分开):(输入0返回)\n");
printDishes(fp);//打印菜单列表
char name[30];
float price;
while (1) {
rewind(fp);
scanf("%d", &s);
if (s == 0) {
break;
}
scanf("%d", &num1);
if (s > 0) {
char line[200];
int j = 0;
while (fgets(line, sizeof(line), fp))
{
j++;
if (j == s)
{
rewind(fp);//将文件指针移回首行
for (int k = 0; k < j - 1; k++)
{
fgets(line, sizeof(line), fp);
}
fscanf(fp, "%s%f", name, &price);
break;
}
}
r = (Bill*)malloc(sizeof(Bill));
strcpy(r->name, name);
r->price = price;
r->num = num1;
r->sign = s;
if (head1 == NULL) {
head1 = r;
temp = r;
}
else {
temp->next = r;
temp = temp->next;
}
r->next = NULL;
printf("名称:%s 价格:%.1f 数量:%d\n", name, price, num1);
}
else {
printf("请重新选择.\n");
continue;
}
rewind(fp);
}
rewind(fp);
printBill(head1, target);
char e;
while (1)
{
printf("是否对已选菜品进行修改? 1.是 2.否\n");
scanf(" %c", &e);
if (e == '1')
{
change2(&head1);
printBill(head1, target);
}
else
{
break;
}
}
int n1 = 0, count = 1;//n1为点餐的数量
Bill* temp1 = head1, * temp2 = head1;
while (temp1 != NULL) {
n1++;
temp1 = temp1->next;
}
float sum = 0;//价钱
fprintf(fp3, "\t\t%s类\n", target);
fprintf(fp3, "序号\t 品名 \t单价(元/份)\t数量\t小计\n");// \n为换行符\r为回车符
for (int i = 0; i < n1; i++) {
fprintf(fp3, " %d \t%s\t %.1f \t %d \t%.1f(元)\n", count++, temp2->name, temp2->price, temp2->num, temp2->num * temp2->price);
sum += temp2->num * temp2->price;
temp2 = temp2->next;
}
SUM += sum;
fprintf(fp3, "\t\t\t共计:\t%.1f(元)\n", sum);
// 打开当日点餐文件
if ((daily = fopen(today, "a+")) == NULL) {
printf("Error opening daily order file!\n");
exit(1);
}
// 将点餐信息写入当日点餐文件
count = 1;
fprintf(daily, "\t\t%s类\n", target);
fprintf(daily, "序号\t 品名 \t单价(元/份)\t数量\t小计\n");
temp2 = head1;
for (int i = 0; i < n1; i++) {
fprintf(daily, " %d \t%s\t %.1f \t %d \t%.1f(元)\n", count++, temp2->name, temp2->price, temp2->num, temp2->num * temp2->price);
temp2 = temp2->next;
}
fprintf(daily, "\t\t\t共计:\t%.1f(元)\n", sum);
}
void showTodayIncome() // 查看当天收入
{
// 重新打开当天日期的文件,读取并显示内容
char daily_filename[100];
//sprintf(daily_filename, "%s.txt", today);
if ((daily = fopen(today, "r+")) == NULL) {
printf("Error!\n");
return;
}
char stre[100];
while (fgets(stre, 100, daily) != NULL) {
printf("%s", stre);
}
fclose(daily);
}
struct button
{
int x;
int y;
int width;
int height;
COLORREF color;
char* text;//文字
};
//初始化按钮的属性
struct button* createButton(int x, int y, int width, int height, COLORREF color, const char* text)
{
struct button* pb = (struct button*)malloc(sizeof(struct button));
pb->x = x;
pb->y = y;
pb->width = width;
pb->height = height;
pb->color = color;
pb->text = (char*)malloc(strlen(text + 1));///0
strcpy(pb->text, text);
return pb;
}
//画按钮
void drawButton(struct button* pb)
{
setfillcolor(pb->color);//填充颜色
settextstyle(35, 0, "楷体");//宽度,高度,字体
setlinecolor(RGB(255, 165, 0));//线为黑色
settextcolor(BLACK);//文字颜色设置为黑色
setbkmode(TRANSPARENT);//背景透明
fillrectangle(pb->x, pb->y, pb->x + pb->width, pb->y + pb->height);
outtextxy(pb->x + 12, pb->y + 11, pb->text);//绘制文字
}
//判断鼠标是否在按钮中
int mouseInButton(struct button* pb, MOUSEMSG m)
{
if (pb->x <= m.x && m.x <= pb->x + pb->width && pb->y <= m.y && m.y <= pb->y + pb->height)
{
pb->color = RED;
return 1;
}
pb->color = YELLOW;
return 0;
}
int clickButton(struct button* pb, MOUSEMSG m)
{
if (mouseInButton(pb, m) && m.uMsg == WM_LBUTTONDOWN)//在按钮里并且点击了
{
return 1;
}
return 0;
}
int main()
{
system("color F9");//调整控制台颜色 F=亮白色,9=淡蓝色 头文件#include<stdlib.h>
mciSendString("open 人气门店.mp3", 0, 0, 0);//模板 mciSendString(操作指令, 获取返回的信息(字符串), 返回信息的长度, 窗口句柄(一般为NULL));
mciSendString("play 人气门店.mp3 repeat", 0, 0, 0);
//mciSendString("close 人气门店.mp3", 0, 0, 0);
//获取时间并将其格式化为字符串形式
time_t timer;//time_t是一个表示时间的数据类型
time(&timer);//取得从1970年到当前时刻的秒数
char str[80];
strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S %a", localtime(&timer));
//将 timer 中的时间值转换为本地时间,并返回一个指向 struct tm 结构体的指针
//使用 strftime 函数将 struct tm 结构体中的时间信息格式化为字符串,并存储在 str 中
struct tm* local_time = localtime(&timer);
greet(local_time);
strcpy(str1, str);
strcat(str, ".xls");
strcpy(time1, str);
if ((fp3 = fopen(time1, "a+")) == NULL) {
printf("Error!\n");
exit(1);
}
fprintf(fp3, "\t\t%s 消费记录\n", str1);//向文本中写入日期
// 格式化当天日期
strftime(today, sizeof(today), "%Y-%m-%d", local_time);
strcat(today, ".xls");
if ((daily = fopen(today, "a+")) == NULL) {
printf("Error opening daily order file!\n");
exit(1);
}
fprintf(daily, "\t\t%s 消费记录\n", str1);
while (1)
{
printf("—————欢迎光临 艺味深尝餐厅—————\n\n");
Menu();
printf("请选择菜品,以0为结束\n");
int choose;//选择菜品
int choose2;
scanf("%d", &choose);
switch (choose)
{
case 1:
{
char name1[] = "主食.txt";
checkDishes(fp3, name1);
break;
}
case 2:
{
char name1[] = "素菜.txt";
checkDishes(fp3, name1);
break;
}
case 3:
{
char name1[] = "荤菜.txt";
checkDishes(fp3, name1);
break;
}
case 4:
{
char name1[] = "饮品.txt";
checkDishes(fp3, name1);
break;
}
case 5:
{
char name[100];
char feedback[1000];
printf("请输入您的昵称:\n");
int c; while ((c = getchar()) != '\n' && c != EOF) {}// 忽略字符直到遇到换行符或文件结束
fgets(name, sizeof(name), stdin);//读取姓名,fgets会读取换行符 这个循环的作用是清空输入缓冲区中之前可能遗留的字符,确保 fgets 能够正确读取用户输入。
name[strcspn(name, "\n")] = 0;//移除fgets读取的换行符
printf("请输入您的反馈:\n");
fgets(feedback, sizeof(feedback), stdin);
feedback[strcspn(feedback, "\n")] = 0;
suggestion(name, feedback);
break;
}
case 6:
{
// 初始化图形模式
initgraph(800, 600);
IMAGE mm, m1, m2, m3, m4;
loadimage(&mm, "background.jpg", 800, 600);
putimage(0, 0, &mm);
struct button* pb = createButton(66, 100, 100, 50, YELLOW, "主食");
struct button* pb1 = createButton(66, 190, 100, 50, YELLOW, "素菜");
struct button* pb2 = createButton(66, 280, 100, 50, YELLOW, "荤菜");
struct button* pb3 = createButton(66, 370, 100, 50, YELLOW, "饮品");
struct button* pb4 = createButton(66, 460, 100, 50, YELLOW, "退出");
while (1)
{
BeginBatchDraw();//双缓冲防闪屏
// putimage(0, 0, &mm);//刷新
drawButton(pb);
drawButton(pb1);
drawButton(pb2);
drawButton(pb3);
drawButton(pb4);
MOUSEMSG m = GetMouseMsg();
if (clickButton(pb, m))
{
loadimage(&m1, "zhu1.jpg", 450, 450);
putimage(255, 90, &m1);
}
if (clickButton(pb1, m))
{
loadimage(&m2, "su1.jpg", 450, 450);
putimage(255, 90, &m2);
}
if (clickButton(pb2, m))
{
loadimage(&m3, "hun1.jpg", 450, 450);
putimage(255, 90, &m3);
}
if (clickButton(pb3, m))
{
loadimage(&m4, "yin2.jpg", 450, 450);
putimage(255, 90, &m4);
}
if (clickButton(pb4, m))
{
//closegraph();
break;
}
EndBatchDraw();
}
//closegraph();
break;
}
case 0: {
system("cls");
total();
break;
}
case -1: {//管理员系统
int c = 0;
c = guanli();//输入密码
if (c == 1)
{
while (1)
{
menu2();
scanf("%d", &choose2);
switch (choose2)
{
case 1://修改菜单
menu4();
break;
case 2:
system("cls");
break;
case 3:
FILE * fp4;
if ((fp4 = fopen("顾客意见反馈.txt", "r+")) == NULL) {
printf("Error!");
exit(1);
}
char str2[100];
while (fgets(str2, 100, fp4) != NULL) {
printf("%s", str2);
}
fclose(fp4);
break;
case 4:
char* date = getValidDate();
if (date != NULL) {
showOrdersForDate(date);
free(date); // 释放动态分配的内存
}
// showTodayIncome();
break;
}
if (choose2 == 2)
{
break;
}
}
}
break;
}
default: {
printf("格式错误,请重新输入.");
}
}
if (choose == 0)
{
break;
}
}
system("cls");
fclose(fp3);
fclose(daily);
if (SUM == 0)
{
printf("亲爱的顾客,您并未点菜\n");
return 0;
}
FILE* fp2;
if ((fp2 = fopen(time1, "r+")) == NULL) {
printf("Error!");
exit(1);
}
char stre[100];
while (fgets(stre, 100, fp2) != NULL) {
printf("%s", stre);
}
printf("\n\t请支付\n");
double aa = 0;
scanf("%lf", &aa);
while (1)
{
if (aa == SUM)
{
printf("支付成功\n");
break;
}
else if (aa < SUM)
{
printf("顾客您的钱不够,请重新支付\n");
scanf("%lf", &aa);
}
else if (aa > SUM)
{
printf("支付成功,找您%.1lf元", aa - SUM);
break;
}
}
printf("\n感谢光临本餐厅\n");
fclose(fp2);
return 0;
} background.jpg  hun1.jpg  su1.jpg  yin1.jpg  zhu1.jpg  |