餐厅点餐与管理系统

1、题目意义

餐厅点餐管理系统是一个信息化、智能化的系统,它可以帮助餐厅实现高效、便捷的点餐、结账和管理。这个系统的意义在于提高餐厅的工作效率,减少人力成本,提升顾客的就餐体验,以及帮助餐厅更好地管理。

(1)提升客户体验:通过提供在线点餐功能,客户可以方便地浏览菜单、选择菜品并下单。系统通过直观易用的界面设计,让点餐过程变得简单快捷,减少了等待时间,提升了用餐的满意度和整体体验。同时,即时结算功能让支付过程更加透明、安全,进一步增强了顾客的信任感。

(2)简化餐厅管理流程:管理员可以通过系统轻松修改菜品价格、添加新菜品或删除不再提供的菜品,还可以查看指定日期的当天所有点餐记录,方便统计收入。管理员可以灵活调整菜单,紧跟市场变化,满足顾客多样化的需求。这不仅有助于提升餐厅的竞争力,还能有效控制成本,提高盈利能力。此外,系统化管理还简化了繁琐的日常工作流程,使得管理员能够更专注于提升餐厅的整体运营质量和顾客服务水平,这有助于餐厅快速响应市场需求和调整经营策略,减少人工操作的错误和时间成本。

(3)通过细分客户与管理员两个界面,系统不仅为顾客提供了便捷、高效的点餐与结算体验,还极大地增强了餐厅内部的管理灵活性与效率。

(4)收集用户意见、提高服务质量:通过用户反馈界面,餐厅可以主动收集到顾客对餐厅服务、菜品质量、环境等方面的意见和建议。这些反馈可以帮助餐厅了解顾客的需求和期望,从而改进服务质量和提升用户体验。用户反馈可以帮助餐厅发现存在的问题和不足之处,及时进行改进。例如,如果顾客反映菜品口味不佳,餐厅可以根据反馈调整厨师的烹饪方法或更换食材;如果顾客反映服务员态度不好,餐厅可以加强员工培训,提高服务水平。

(5)用户可查看特色菜品图片:图片能够直观地展示菜品的外观,帮助顾客更快速地理解菜品的特点和风味,从而做出更加满意的点餐选择。这种视觉上的呈现方式比文字描述更能吸引顾客的兴趣。

综上所述,该餐厅点餐与管理系统的设计与实施,对于提升顾客用餐体验、优化餐厅运营流程、增强市场竞争力以及提高盈利能力等方面都具有深远的意义。

2、设计思想

一、系统设计概述

本系统旨在通过信息化手段优化餐厅的点餐流程与后台管理,提升顾客体验与餐厅运营效率。系统分为两大主要部分:客户点餐子系统和后台管理子系统。客户点餐子系统面向顾客,提供便捷的点餐与反馈功能;后台管理子系统则面向餐厅管理人员,提供菜单管理与意见反馈和查看指定日期记录功能。

二、客户点餐子系统设计思想

  1. 用户体验优先:

界面友好:设计直观易用的用户界面,确保顾客能迅速上手。

流程简化:点餐流程应简洁明了,减少顾客操作步骤,提高点餐效率。

实时反馈:顾客在点餐过程中可随时查看订单详情,并可随时修改。

音乐播放和图片查看:音乐可以营造轻松愉快的氛围,使顾客在点餐过程中感到愉悦。通过菜品图片查看,顾客可以更快地找到自己喜欢的菜品,从而减少点餐时间,提高点餐效率。

  1. 灵活性与可扩展性:

菜品选择多样化:支持主食、素菜、荤菜、饮品等多种分类,方便顾客根据个人口味选择。

自定义修改:允许顾客修改菜品数量、删除菜品等,增强点餐的灵活性。

反馈机制:提供意见反馈功能,收集顾客建议,促进餐厅服务的持续改进。

  1. 交互逻辑清晰:

菜单导航:通过序号选择菜品,减少文字输入,提高点餐速度。

修改与确认:明确显示“是否修改菜单”的提示,确保顾客操作无误。

退出与结算:设置明确的退出与结算按钮,方便顾客完成点餐流程,并可以在客户付款后及时找钱。

三、后台管理子系统设计思想

  1. 高效管理:

集中管理:将菜单修改与意见反馈处理功能集中于一个平台,提高管理效率。

快速响应:支持快速添加、删除菜品及更改价格,及时响应市场需求变化,可以查看当日所有客户点餐信息,方便及时上菜和计算当日收入。

  1. 数据准确性:

数据校验:在修改菜单或处理反馈时,进行必要的数据校验,确保数据准确性。

记录完整:详细记录用户的反馈内容、昵称及反馈时间,为后续改进提供依据。

  1. 安全性与稳定性:

权限控制:严格控制访问权限,确保只有授权人员才能进行系统操作。

数据备份:定期备份系统数据,防止数据丢失,保障系统稳定运行。

  1. 持续改进:

数据分析:商家对顾客反馈数据进行分析,找出服务中的不足与改进点。

功能迭代:根据数据分析结果及市场需求变化,不断优化系统功能,提升餐厅运营水平。

系统主要结构

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值