C语言餐饮预约订位管理信息系统
第一个完全自己做的实验:内容功能问题:布局未调整好,未进行完整测试可能存在bug,未加入输入判别机制。如果有bug,请留言反馈,谢谢!代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include<conio.h>#define Max
·
第一个完全自己做的实验:
内容功能
问题:
布局未调整好,未进行完整测试可能存在bug,未加入输入判别机制,未优化代码,复制粘贴冗余多。如果有bug,请留言反馈,谢谢!
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include<conio.h>
#define MaxAssistantNumber 10
#define MaxOrderNumber 20
// Size: UserID:20 password:12 UserFlag:4 total:36 数组应该除以36得到数组元素个数
typedef struct User
{
char UserID[20]; //用户ID
char password[12]; //密码
int UserFlag; //使用者标签 判别使用者 管理员:-1、店长:0、前台:1
}User;
typedef struct Order_Info
{
//记录客户基本信息(姓名、电话、日期、就餐时间、人数、编号、分配的餐位等)
char OIname[10]; //姓名
char OItell[11]; //电话
char OIdate[20]; //日期 year-mon-dd hh:mm
char OItime[20]; //就餐时间 year-mon-dd hh:mm
int OImember; //人数
long int OIid; //编号 就餐时间数值 可用于判断
char OIplaceNo[2]; //餐位
}OI;
//预设一个 管理员 账户 管理员可以更改店长信息 操作店员信息
User UserAdministrator = {"Administrator","root",-1};
//预设一个 店长 账户 店长可以操作店员信息也可以执行店员的功能
User UserOwner = {"Owner","123456",0};
//店员账户数组 最大店员数量:N 现有店员数量:Number_Of_Assistant
User UserAssistant[MaxAssistantNumber];
int Number_Of_Assistant = 0;
//订餐人员信息数组
OI Order_Info[MaxOrderNumber];
int Number_Of_Order = 0;
//登录状态 -1:错误次数上限、0:未登录、1:已登录管理员账户、2:已登录店长账户、3:已登录店员账户
int LoginStatus = 0;
//格式化 登录 登出 还原
void init_sys();
int Login();
void Logout();
void Restore();
//首页 管理者菜单 店主菜单 前台菜单
int Menu();
void AdministratorMenu();
void OwnerMenu();
void AssistantMenu();
//修改店主信息
void Modify_Owner();
//添加前台 删除前台 修改前台 查看所有前台信息
void Add_Assistant();
void Delete_Assistant();
void Modify_Assistant();
void Find_Assistant();
//添加订单 取消订单 修改订单 查询订单 修改订单预订时间 修改订单餐位 修改订单就餐人数
void Add_Order();
void Delete_Order();
void Modify_Order();
void Find_AllOrder();
void Find_Order();
void Modify_OrderTime(int index);
void Modify_OrderPlaceNo(int index);
void Modify_OrderMember(int index);
//YYYY-MM-DD hh:mm 提取成 YYYYMMDDhhmm的长整型
long int TimeStrToInt(char *str);
int main()
{
int i = 1;
while(i){
init_sys();
i = Menu();
}
return 0;
}
//初始化系统
void init_sys(){
FILE *fp;
//打开店主信息文件,若存在则读取内容修改 UserOwner变量
if((fp=fopen("Owner.txt","r+"))==NULL) // w: 文件不存在则创建文件 r:文件不存在则返回NULL不创建文件
{
//不存在
printf("店主信息为默认信息...\n");
}else{
//修改店主信息
fscanf(fp,"%s %s", UserOwner.UserID, UserOwner.password);
fclose(fp);
}
//打开店员数量信息文件,若存在则读取内容修改 Number_Of_Assistant变量
if((fp=fopen("AssistantNumber.txt","r+"))==NULL)
{
//不存在
printf("店员数量为0...\n");
}else{
//修改店员数量信息 读取成功了说明存在店员信息文件 数量也不为0
fscanf(fp,"%d", &Number_Of_Assistant);//后面应该传地址
fclose(fp);
if((fp=fopen("Assistant.txt","r+"))==NULL)
{
//不存在
printf("店员信息文件读取失败或不存在,店员数量归零...\n");
remove("AssistantNumber.txt");
}else{
//修改店员信息
for(int i = 0; i < Number_Of_Assistant; i++){
//读取店员信息
fscanf(fp,"%s %s\n", UserAssistant[i].UserID, UserAssistant[i].password);
}
fclose(fp);
}
}
//打开预订数量信息文件,若存在则读取内容修改 Number_Of_Order变量
if((fp=fopen("OrderNumber.txt","r+"))==NULL)
{
//不存在
printf("预订数量为0...\n");
}else{
//修改预订数量信息 读取成功了说明存在预订信息文件 数量也不为0
fscanf(fp,"%d", &Number_Of_Order);
fclose(fp);
if((fp=fopen("OrderInfo.txt","r+"))==NULL)
{
//不存在
printf("预订信息文件读取失败或不存在,预订数量归零...\n");
remove("OrderNumber.txt");
}else{
//修改预订信息变量
for(int i = 0; i < Number_Of_Order; i++){
//读取预订信息
fscanf(fp,"%s %s %s %s %d %d %s\n",
Order_Info[i].OIname, Order_Info[i].OItell, Order_Info[i].OIdate,
Order_Info[i].OItime, &Order_Info[i].OImember, &Order_Info[i].OIid, Order_Info[i].OIplaceNo);
}
fclose(fp);
}
}
}
int Menu(){
while(1){
system("cls");
printf("\t********************************\n");
printf("\t* *\n");
printf("\t* 1. 用户登录 *\n");
printf("\t* *\n");
printf("\t* ESC. 退出系统 *\n");
printf("\t* *\n");
printf("\t********************************\n");
switch(getch()){
case 49: LoginStatus = Login();break;
case 27: printf(" 系统退出成功.\n");return 0;
}
if(LoginStatus == 1){
AdministratorMenu();
}else if(LoginStatus == 2){
OwnerMenu();
}else if(LoginStatus == 3){
AssistantMenu();
}else if(LoginStatus == -1){
printf(" 系统退出成功.\n");
return 0;
}
}
}
void AdministratorMenu(){
while(1){
system("cls");
printf("\t********************************\n");
printf("\t* *\n");
printf("\t* 1. 修改店主信息 *\n");
printf("\t* *\n");
printf("\t* 2. 修改店员信息 *\n");
printf("\t* *\n");
printf("\t* 3. 还原系统信息 *\n");
printf("\t* *\n");
printf("\t* ESC. 退出登录 *\n");
printf("\t* *\n");
printf("\t********************************\n");
switch(getch()){
case 49: Modify_Owner();break;
case 50: Modify_Assistant();break;
case 51: Restore();return;
case 27: Logout();return;
}
}
}
void OwnerMenu(){
while(1){
system("cls");
printf("\t********************************\n");
printf("\t* *\n");
printf("\t* 1. 添加前台用户 *\n");
printf("\t* *\n");
printf("\t* 2. 删除前台用户 *\n");
printf("\t* *\n");
printf("\t* 3. 修改前台用户信息 *\n");
printf("\t* *\n");
printf("\t* 4. 查看所有前台信息 *\n");
printf("\t* *\n");
printf("\t* 5. 查询所有预订信息 *\n");
printf("\t* *\n");
printf("\t* ESC. 退出登录 *\n");
printf("\t* *\n");
printf("\t********************************\n");
switch(getch()){
case 49: Add_Assistant();break;
case 50: Delete_Assistant();break;
case 51: Modify_Assistant();break;
case 52: Find_Assistant();break;
case 53: Find_AllOrder();break;
case 27: Logout();return;
}
}
}
void AssistantMenu(){
while(1){
system("cls");
printf("\t********************************\n");
printf("\t* *\n");
printf("\t* 1. 添加新预订 *\n");
printf("\t* *\n");
printf("\t* 2. 取消预订 *\n");
printf("\t* *\n");
printf("\t* 3. 修改预订信息 *\n");
printf("\t* *\n");
printf("\t* 4. 查询预订信息 *\n");
printf("\t* *\n");
printf("\t* ESC. 退出登录 *\n");
printf("\t* *\n");
printf("\t********************************\n");
switch(getch()){
case 49: Add_Order();break;
case 50: Delete_Order();break;
case 51: Modify_Order();break;
case 52: Find_Order();break;
case 27: Logout();return;
}
}
}
//登录
int Login(){
char _UserID[20];
char _password[12];
int count = 6; //限制5次登录尝试
system("cls");
printf("\t********************************\n");
printf("\t* 用户登录 *\n");
printf("\t********************************\n");
while(1){
//首次登录
if(count == 6){
printf(" 用户ID :");
scanf("%s",_UserID);
printf(" 密码 :");
scanf("%s",_password);
count--;
}else if(count == 0){
printf(" 错误次数已达上限,系统关闭");
return -1;
}else{
printf(" 用户ID或密码错误,您还有 %d 次机会\n",count);
printf(" 用户ID :");
scanf("%s",_UserID);
printf(" 密码 :");
scanf("%s",_password);
count--;
}
//strcmp(str1,str2) 返回值:
//如果返回值 < 0,则表示 str1 小于 str2。
//如果返回值 > 0,则表示 str2 小于 str1。
//如果返回值 = 0,则表示 str1 等于 str2。
if((strcmp(_UserID,UserAdministrator.UserID) == 0) && (strcmp(_password,UserAdministrator.password) == 0)){
//登录的是管理员账户
return 1;
}else if((strcmp(_UserID,UserOwner.UserID) == 0) && (strcmp(_password,UserOwner.password) == 0)){
//登录的是店主账户
return 2;
}
for(int i = 0; i < Number_Of_Assistant;i++){
//登录的是店员账户
if((strcmp(_UserID,UserAssistant[i].UserID) == 0) && (strcmp(_password,UserAssistant[i].password) == 0)){
return 3;
}
}
}
}
//登出
void Logout(){
LoginStatus = 0;
}
//修改店主信息
void Modify_Owner(){
FILE *fp;
char NewID[20];
char Newpassword[12];
system("cls");
printf("\t********************************\n");
printf("\t* 修改店主信息 *\n");
printf("\t********************************\n");
printf(" 请输入新的用户ID :");
scanf("%s",NewID);
printf(" 请输入新的密码 :");
scanf("%s",Newpassword);
strncpy(UserOwner.UserID, NewID,strlen(NewID));
strncpy(UserOwner.password, Newpassword,strlen(Newpassword));
if((fp=fopen("Owner.txt","w+"))==NULL){
printf(" 修改失败!\n 按任意键以继续。");
}else{
if(fprintf(fp,"%s %s", UserOwner.UserID, UserOwner.password)<0){
fclose(fp);
remove("Owner.txt");
printf(" 修改失败!\n 按任意键以继续。");
}
else{
fclose(fp);
printf(" 修改成功!\n 按任意键以继续。");
}
}
getch();
}
//操作店员信息
void Add_Assistant(){
int i = 0, num = 0;
FILE *fp;
char UserID[20];
char password[12];
system("cls");
printf("\t********************************\n");
printf("\t* 添加前台用户 *\n");
printf("\t********************************\n");
printf(" 请输入用户ID :");
scanf("%s",UserID);
printf(" 请输入密码 :");
scanf("%s",password);
strncpy(UserAssistant[Number_Of_Assistant].UserID, UserID,strlen(UserID));
strncpy(UserAssistant[Number_Of_Assistant].password, password,strlen(password));
UserAssistant[Number_Of_Assistant].UserFlag = 1;
Number_Of_Assistant++;
if((fp=fopen("Assistant.txt","w+"))==NULL){
printf(" 添加失败!\n 按任意键以继续。");
}else{
for(i = 0; i < Number_Of_Assistant; i++){
if(fprintf(fp,"%s %s\n", UserAssistant[i].UserID, UserAssistant[i].password)<0){
fclose(fp);
remove("Assistant.txt");
printf(" 添加失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
break;
}
}
if(i == Number_Of_Assistant){
fclose(fp);
if((fp=fopen("AssistantNumber.txt","r+"))!=NULL){
//暂存数据
fscanf(fp,"%d",&num);
fclose(fp);
}
if((fp=fopen("AssistantNumber.txt","w+"))==NULL){
printf(" 添加失败!\n 按任意键以继续。");
}else{
if(fprintf(fp,"%d", Number_Of_Assistant)<0){
fclose(fp);
//写入客服数量数据失败,还原数据
if( num == 0){
remove("AssistantNumber.txt");
}else{
if((fp=fopen("AssistantNumber.txt","w+"))!=NULL){
fprintf(fp,"%d", num);
fclose(fp);
}
}
printf(" 添加失败!\n 按任意键以继续。");
}else{
fclose(fp);
printf(" 添加成功!\n 按任意键以继续。");
}
}
}
}
getch();
}
void Delete_Assistant(){
int i = 0, num = 0;
FILE *fp;
char UserID[20];
char password[12];
system("cls");
printf("\t********************************\n");
printf("\t* 删除前台用户 *\n");
printf("\t********************************\n");
if(Number_Of_Assistant == 0){
printf(" 目前还没有前台用户。\n 按任意键返回。");
getch();
return;
}
printf(" 请输入前台用户的ID :");
scanf("%s",UserID);
for(i = 0; i < Number_Of_Assistant; i++){
if(strcmp(UserAssistant[i].UserID,UserID) == 0)
break;
}
if(i == Number_Of_Assistant){
printf("未找到该前台用户信息!\n 按任意键返回。\n");
getch();
return;
}
printf(" 请确认前台用户密码:");
scanf("%s",password);
if(strcmp(UserAssistant[i].password,password) == 0){
for(;i < (Number_Of_Assistant-1);i++){
UserAssistant[i] = UserAssistant[i+1];
}
Number_Of_Assistant--;
if((fp=fopen("Assistant.txt","w+"))==NULL){
printf(" 删除失败!\n 按任意键以继续。");
}else{
for(i = 0; i < Number_Of_Assistant; i++){
//如果小于0,说明写入数据失败,跳出循环后要将原有的数据文件删除。之后通过操作重新写入
if(fprintf(fp,"%s %s\n", UserAssistant[i].UserID, UserAssistant[i].password)<0){
fclose(fp);
remove("Assistant.txt");
printf(" 删除失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
break;
}
}
//满足该条件说明写入成功
if(i == Number_Of_Assistant){
fclose(fp);
if((fp=fopen("AssistantNumber.txt","r+"))!=NULL ){
//暂存数据
fscanf(fp,"%d",&num);
fclose(fp);
}
if((fp=fopen("AssistantNumber.txt","w+"))==NULL){
remove("AssistantNumber.txt");
remove("Assistant.txt");
printf(" 删除失败!前台用户数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
}else{
if(fprintf(fp,"%d", Number_Of_Assistant)<0){
fclose(fp);
if(num == 1){
remove("AssistantNumber.txt");
}else{
if((fp=fopen("AssistantNumber.txt","w+"))!=NULL){
fprintf(fp,"%d", num);
fclose(fp);
}
}
printf(" 删除失败!\n 按任意键以继续。");
}else{
fclose(fp);
printf(" 删除成功!\n 按任意键以继续。");
}
}
}
}
}else{
printf("密码错误, 未能找到改前台信息!\n 按任意键返回。\n");
getch();
return;
}
getch();
}
void Modify_Assistant(){
int i = 0;
FILE *fp;
char UserID[20];
char password[12];
char NewID[20];
char Newpassword[12];
system("cls");
printf("\t********************************\n");
printf("\t* 修改前台信息 *\n");
printf("\t********************************\n");
if(Number_Of_Assistant == 0){
printf(" 目前还没有前台用户。\n 按任意键返回。");
getch();
return;
}
printf(" 请输入前台的用户ID :");
scanf("%s",UserID);
for(i = 0; i < Number_Of_Assistant; i++){
if(strcmp(UserAssistant[i].UserID,UserID) == 0)
break;
}
if(i == Number_Of_Assistant){
printf("未找到该前台信息!\n 按任意键返回。\n");
getch();
return;
}
printf(" 请确认前台用户密码:");
scanf("%s",password);
if(strcmp(UserAssistant[i].password,password) == 0){
printf(" 已找到该前台信息\n");
printf("当前其用户ID为: %s 密码为: %s\n", UserAssistant[i].UserID,UserAssistant[i].password);
printf(" 请输入新的用户ID :");
scanf("%s",NewID);
printf(" 请输入新的密码 :");
scanf("%s",Newpassword);
strncpy(UserAssistant[i].UserID, NewID,strlen(NewID));
strncpy(UserAssistant[i].password, Newpassword,strlen(Newpassword));
if((fp=fopen("Assistant.txt","w+"))==NULL){
printf(" 修改失败!\n 按任意键以继续。");
}else{
for(i = 0; i < Number_Of_Assistant; i++){
//如果小于0,说明写入数据失败,跳出循环后要将原有的数据文件删除。之后通过操作重新写入
if(fprintf(fp,"%s %s\n", UserAssistant[i].UserID, UserAssistant[i].password)<0){
fclose(fp);
remove("Assistant.txt");
printf(" 修改失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
break;
}
}
if(i == Number_Of_Assistant){
fclose(fp);
printf(" 修改成功!\n 按任意键以继续。");
}
}
getch();
}
}
void Find_Assistant(){
system("cls");
printf("\t********************************\n");
printf("\t* 查询所有前台信息 *\n");
printf("\t********************************\n");
if(Number_Of_Assistant == 0){
printf("目前没有前台人员. 按任意键返回...");
getch();
return;
}
printf("\t* No 用户名 ***** 密码 *\n");
for(int i = 0; i < Number_Of_Assistant; i++){
printf("\t* %d %s\t * %s\t*\n",i + 1 , UserAssistant[i].UserID, UserAssistant[i].password);
}
printf("\t********************************\n");
printf("查询结束,按任意键返回...");
getch();
}
//操作预订信息
void Add_Order(){
int i = 0, num = 0;
FILE *fp;
char OIname[10]; //姓名
char OItell[11]; //电话
char OIdate[20]; //日期 year-mon-dd hh:mm
char OItime[20]; //就餐时间 year-mon-dd hh:mm
char Year[5]; //年
char Mon[2] ; //月
char Day[2] ; //日
char Hour[2]; //时
char Min[2] ; //分
int OImember; //人数
long int OIid; //编号
char OIplaceNo[2]; //餐位
/*
获取时间
struct tm{
int tm_sec; //代表目前秒数, 正常范围为0-59, 但允许至61 秒
int tm_min; //代表目前分数, 范围0-59
int tm_hour; //从午夜算起的时数, 范围为0-23
int tm_mday; //目前月份的日数, 范围01-31
int tm_mon; //代表目前月份, 从一月算起, 范围从0-11
int tm_year; //从1900 年算起至今的年数
int tm_wday; //一星期的日数, 从星期一算起, 范围为0-6
int tm_yday; //从今年1 月1 日算起至今的天数, 范围为0-365
int tm_isdst; //日光节约时间的旗标
};
*/
time_t now;//时间
struct tm *p;
time(&now);
p = localtime(&now);
system("cls");
printf("\t********************************\n");
printf("\t* 添加新预订 *\n");
printf("\t********************************\n");
printf(" 请输入预订人姓名 :");
scanf("%s",OIname);
strncpy(Order_Info[Number_Of_Order].OIname, OIname,strlen(OIname));
printf(" 请输入 11位电话 :");
scanf("%s",OItell);
strncpy(Order_Info[Number_Of_Order].OItell, OItell,strlen(OItell));
strftime(OIdate, sizeof(OIdate), "%Y-%m-%d>%H:%M", p);//自动获取日期
strncpy(Order_Info[Number_Of_Order].OIdate, OIdate,strlen(OIdate));
//就餐时间 YY-MON-DD HH:MM
printf(" 请输入 年份(20xx) :");
scanf("%s",Year);
strncat(OItime, Year, strlen(Year));
strncat(OItime, "-", 1 );
printf(" 请输入 月份(01~12):");
scanf("%s",Mon);
strncat(OItime, Mon, strlen(Mon) );
strncat(OItime, "-", 1 );
printf(" 请输入 日期(01~31):");
scanf("%s",Day);
strncat(OItime, Day, strlen(Day) );
strncat(OItime, ">", 1 );
printf(" 请输入 时 (00~23):");
scanf("%s",Hour);
strncat(OItime, Hour, strlen(Hour));
strncat(OItime, ":", 1 );
printf(" 请输入 分 (00~59):");
scanf("%s",Min);
strncat(OItime, Min, strlen(Min) );
strncpy(Order_Info[Number_Of_Order].OItime, OItime,strlen(OItime));
//订单编号
OIid = TimeStrToInt(OItime);
Order_Info[Number_Of_Order].OIid = OIid;
printf(" 请输入(A-D 1-5)餐位 :");
scanf("%s",OIplaceNo);
strncpy(Order_Info[Number_Of_Order].OIplaceNo, OIplaceNo,strlen(OIplaceNo));
//若存在预订信息,需要遍历预订信息中的就餐时间和餐桌是否有冲突,若冲突则要重新输入
//就餐时间中时间相差3则需要重新填写
if(Number_Of_Order != 0){
for(i = 0; i < Number_Of_Order; i++){
//同日 前三小时 后三小时
if((OIid / 100 == Order_Info[i].OIid / 100) &&
((OIid % 100 - 3) < (Order_Info[i].OIid % 100)) &&
((OIid % 100 + 3) > (Order_Info[i].OIid % 100)) &&
(strcmp(OIplaceNo, Order_Info[i].OIplaceNo)==0)){
printf("非常抱歉,该餐位在此时段已被预订\n");
printf("输入 1 修改时间;2 修改餐桌: \n");
switch(getch()){
case 49:
//就餐时间 YY-MON-DD HH:MM
printf(" 请输入 年份(20xx) :");
scanf("%s",Year);
strncat(OItime, Year, strlen(Year));
strncat(OItime, "-", 1 );
printf(" 请输入 月份(01~12):");
scanf("%s",Mon);
strncat(OItime, Mon, strlen(Mon) );
strncat(OItime, "-", 1 );
printf(" 请输入 日期(01~31):");
scanf("%s",Day);
strncat(OItime, Day, strlen(Day) );
strncat(OItime, ">", 1 );
printf(" 请输入 时 (00~23):");
scanf("%s",Hour);
strncat(OItime, Hour, strlen(Hour));
strncat(OItime, ":", 1 );
printf(" 请输入 分 (00~59):");
scanf("%s",Min);
strncat(OItime, Min, strlen(Min) );
strncpy(Order_Info[Number_Of_Order].OItime, OItime,strlen(OItime));
//订单编号
OIid = TimeStrToInt(OItime);
Order_Info[Number_Of_Order].OIid = OIid;
break;
case 50:
printf(" 请输入(A-D 1-5)餐位 :");
scanf("%s",OIplaceNo);
strncpy(Order_Info[Number_Of_Order].OIplaceNo, OIplaceNo,strlen(OIplaceNo));
break;
}
//重置i
i = 0;
}
}
}
printf(" 请输入 就餐人数(不超过15人) :");
scanf("%d",&OImember);
Order_Info[Number_Of_Order].OImember = OImember;
while(OImember>15){
printf(" 输入超过15人!\n");
printf(" 请重新输入 :");
scanf("%d",&OImember);
}
Number_Of_Order++;
if((fp=fopen("OrderInfo.txt","w+"))==NULL){
printf(" 添加失败!\n 按任意键以继续。");
}else{
for(i = 0; i < Number_Of_Order; i++){
if(fprintf(fp,"%s %s %s %s %d %d %s\n",
Order_Info[i].OIname, Order_Info[i].OItell, Order_Info[i].OIdate,
Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid, Order_Info[i].OIplaceNo)<0){
fclose(fp);
remove("OrderInfo.txt");
printf(" 添加失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
break;
}
}
if(i == Number_Of_Order){
fclose(fp);
if((fp=fopen("OrderNumber.txt","r+"))!=NULL){
//暂存数据
fscanf(fp,"%d",&num);
fclose(fp);
}
if((fp=fopen("OrderNumber.txt","w+"))==NULL){
printf(" 添加失败!\n 按任意键以继续。");
}else{
if(fprintf(fp,"%d", Number_Of_Order)<0){
fclose(fp);
//写入预订数量数据失败,还原数据
if( num == 0){
remove("OrderNumber.txt");
}else{
if((fp=fopen("OrderNumber.txt","w+"))!=NULL){
fprintf(fp,"%d", num);
fclose(fp);
}
}
printf(" 添加失败!\n 按任意键以继续。");
}else{
fclose(fp);
printf(" 添加成功!\n 按任意键以继续。");
}
}
}
}
getch();
}
void Delete_Order(){
int i = 0, num = 0;
FILE *fp;
//根据姓名+编号+餐位定位
char OIname[10]; //姓名
long int OIid; //编号
char OIplaceNo[2]; //餐位
system("cls");
printf("\t********************************\n");
printf("\t* 删除预订信息 *\n");
printf("\t********************************\n");
if(Number_Of_Order == 0){
printf(" 目前还没有预订订单。\n 按任意键返回。");
getch();
return;
}
printf(" 请输入预订人姓名 :");
scanf("%s",OIname);
for(i = 0; i < Number_Of_Order; i++){
if(strcmp(Order_Info[i].OIname,OIname) == 0)
break;
}
if(i == Number_Of_Assistant){
printf("未找到该客户的预订信息!\n 按任意键返回。\n");
getch();
return;
}
printf("\t********************************\n");
printf("\t* 查询结果 *\n");
printf("\t* 订单编号 预订时间 餐位 *\n");
for(i = 0; i < Number_Of_Order; i++){
if(strcmp(Order_Info[i].OIname,OIname) == 0){
printf("\t* %d %s %s *\n",
Order_Info[i].OIid,Order_Info[i].OItime,Order_Info[i].OIplaceNo);
}
}
printf("\t********************************\n");
printf(" 请输入要删除的订单编号:");
scanf("%d",&OIid);
printf(" 请输入 餐位编号:");
scanf("%s",OIplaceNo);
for(i = 0; i < Number_Of_Order; i++){
if((strcmp(Order_Info[i].OIname,OIname) == 0)
&& (Order_Info[i].OIid == OIid)
&& (strcmp(Order_Info[i].OIplaceNo,OIplaceNo) == 0))
break;
}
if(i == Number_Of_Order){
printf("未找到该订单信息!\n 按任意键返回。\n");
getch();
return;
}
for(;i < (Number_Of_Order-1);i++){
Order_Info[i] = Order_Info[i+1];
}
Number_Of_Order--;
if((fp=fopen("OrderInfo.txt","w+"))==NULL){
printf(" 删除失败!\n 按任意键以继续。");
}else{
for(i = 0; i < Number_Of_Order; i++){
//如果小于0,说明写入数据失败,跳出循环后要将原有的数据文件删除。之后通过操作重新写入
if(fprintf(fp,"%s %s %s %s %d %d %s\n",
Order_Info[i].OIname, Order_Info[i].OItell, Order_Info[i].OIdate,
Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid, Order_Info[i].OIplaceNo)<0){
fclose(fp);
remove("OrderInfo.txt");
printf(" 删除失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
break;
}
}
//满足该条件说明写入成功
if(i == Number_Of_Order){
fclose(fp);
if((fp=fopen("OrderNumber.txt","r+"))!=NULL ){
//暂存数据
fscanf(fp,"%d",&num);
fclose(fp);
}
if((fp=fopen("OrderNumber.txt","w+"))==NULL){
remove("OrderNumber.txt");
remove("OrderInfo.txt");
printf(" 删除失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
}else{
//预订信息数据已写入 写入数量信息
if(fprintf(fp,"%d", Number_Of_Order)<0){
fclose(fp);
if(num == 1){
remove("OrderNumber.txt");
}else{
if((fp=fopen("OrderNumber.txt","w+"))!=NULL){
fprintf(fp,"%d", num);
fclose(fp);
}
}
printf(" 删除失败!\n 按任意键以继续。");
}else{
fclose(fp);
printf(" 删除成功!\n 按任意键以继续。");
}
}
}
}
getch();
}
void Modify_Order(){
int i = 0;
FILE *fp;
//根据姓名+编号+餐位定位
char OIname[10]; //姓名
long int OIid; //编号
long int TempOIid; //暂存
char OIplaceNo[2]; //餐位
system("cls");
printf("\t********************************\n");
printf("\t* 修改订单信息 *\n");
printf("\t********************************\n");
if(Number_Of_Order == 0){
printf(" 目前还没有预订订单。\n 按任意键返回。");
getch();
return;
}
printf(" 请输入预订人姓名 :");
scanf("%s",OIname);
for(i = 0; i < Number_Of_Order; i++){
if(strcmp(Order_Info[i].OIname,OIname) == 0)
break;
}
if(i == Number_Of_Assistant){
printf("未找到该客户的预订信息!\n 按任意键返回。\n");
getch();
return;
}
printf("************************************************************\n");
printf("* 查询结果 *\n");
printf("* 预订人 预订时间 餐位 人数 订单编号 *\n");
for(i = 0; i < Number_Of_Order; i++){
if(strcmp(Order_Info[i].OIname,OIname) == 0){
printf("* %s %s %s %d %d *\n",
Order_Info[i].OIname,Order_Info[i].OItime, Order_Info[i].OIplaceNo,
Order_Info[i].OImember,Order_Info[i].OIid);
}
}
printf("*************************************************************\n");
printf(" 请输入要修改的订单编号:");
scanf("%d",&TempOIid);
OIid = TempOIid;
printf(" 请输入 餐位编号:");
scanf("%s",OIplaceNo);
for(i = 0; i < Number_Of_Order; i++){
if((strcmp(Order_Info[i].OIname,OIname) == 0)
&& (Order_Info[i].OIid == OIid)
&& (strcmp(Order_Info[i].OIplaceNo,OIplaceNo) == 0))
break;
}
if(i == Number_Of_Order){
printf("未找到该订单信息!\n 按任意键返回。\n");
getch();
return;
}
printf(" 已找到该订单信息\n");
printf(" 输入 1 :修改订单预订时间");
printf(" 输入 2 :修改订单餐位");
printf(" 输入 3 :修改订单预订人数\n");
switch(getch()){
case 49:
Modify_OrderTime(i);
break;
case 50:
Modify_OrderPlaceNo(i);
break;
case 51:
Modify_OrderMember(i);
break;
}
}
void Find_AllOrder(){
int i = 0;
system("cls");
printf("**************************************************************\n");
printf("* 查询所有订单 *\n");
printf("**************************************************************\n");
if(Number_Of_Order == 0){
printf(" 目前还没有预订订单。\n 按任意键返回。");
getch();
return;
}
printf("*************************************************************\n");
printf("* 查询结果 *\n");
printf("* 预订人 电话 预订时间 餐位 人数 订单编号 *\n");
for(i = 0; i < Number_Of_Order; i++){
printf("* %s %s %s %s %d %d *\n",
Order_Info[i].OIname,Order_Info[i].OItell,Order_Info[i].OItime,
Order_Info[i].OIplaceNo, Order_Info[i].OImember,Order_Info[i].OIid);
}
printf("*************************************************************\n");
printf("按任意键返回\n");
getch();
}
void Find_Order(){
int i = 0;
char OIname[10]; //姓名
system("cls");
printf("**************************************************************\n");
printf("* 查询订单 *\n");
printf("**************************************************************\n");
if(Number_Of_Order == 0){
printf(" 目前还没有预订订单。\n 按任意键返回。");
getch();
return;
}
printf(" 请输入需要查询客户的姓名 :");
scanf("%s",OIname);
for(i = 0; i < Number_Of_Order; i++){
if(strcmp(Order_Info[i].OIname,OIname) == 0)
break;
}
if(i == Number_Of_Order){
printf("未找到该客户的预订信息!\n 按任意键返回。\n");
getch();
return;
}
printf("**************************************************************\n");
printf("* 查询结果 *\n");
printf("* 预订人 电话 预订时间 餐位 人数 订单编号 *\n");
for(i = 0; i < Number_Of_Order; i++){
if(strcmp(Order_Info[i].OIname,OIname) == 0){
printf("* %s %s %s %s %d %d *\n",
Order_Info[i].OIname,Order_Info[i].OItell,Order_Info[i].OItime,
Order_Info[i].OIplaceNo, Order_Info[i].OImember,Order_Info[i].OIid);
}
}
printf("**************************************************************\n");
printf("按任意键返回\n");
getch();
}
void Modify_OrderTime(int index){
int i = 0;
FILE *fp;
char OItime[20]; //就餐时间 year-mon-dd hh:mm
char Year[4]; //年
char Mon[2]; //月
char Day[2]; //日
char Hour[2]; //时
char Min[2]; //分
long int OIid; //编号
//就餐时间 YY-MON-DD HH:MM
printf(" 请输入 年份(20xx) :");
scanf("%s",Year);
strncat(OItime, Year, strlen(Year));
strncat(OItime, "-", 1 );
printf(" 请输入 月份(01~12):");
scanf("%s",Mon);
strncat(OItime, Mon, strlen(Mon) );
strncat(OItime, "-", 1 );
printf(" 请输入 日期(01~31):");
scanf("%s",Day);
strncat(OItime, Day, strlen(Day) );
strncat(OItime, ">", 1 );
printf(" 请输入 时 (00~23):");
scanf("%s",Hour);
strncat(OItime, Hour, strlen(Hour));
strncat(OItime, ":", 1 );
printf(" 请输入 分 (00~59):");
scanf("%s",Min);
strncat(OItime, Min, strlen(Min) );
strncpy(Order_Info[index].OItime, OItime,strlen(OItime));
printf("%s",Order_Info[index].OItime);
//订单编号
OIid = TimeStrToInt(OItime);
Order_Info[index].OIid = OIid;
printf("%d",Order_Info[index].OIid);
//若存在预订信息,需要遍历预订信息中的就餐时间和餐桌是否有冲突,若冲突则要重新输入
//就餐时间中时间相差3则需要重新填写
if(Number_Of_Order != 0){
for(i = 0; i < Number_Of_Order; i++){
//同日 前三小时 后三小时
if((OIid / 100 == Order_Info[i].OIid / 100) &&
((OIid % 100 - 3) < (Order_Info[i].OIid % 100)) &&
((OIid % 100 + 3) > (Order_Info[i].OIid % 100)) &&
(strcmp(Order_Info[index].OIplaceNo, Order_Info[i].OIplaceNo)==0) &&
(i != index)){
printf("非常抱歉,该餐位在此时段已被预订,请重新输入预定时间\n");
//就餐时间 YY-MON-DD HH:MM
printf(" 请输入 年份(20xx) :");
scanf("%s",Year);
strncat(OItime, Year, strlen(Year));
strncat(OItime, "-", 1 );
printf(" 请输入 月份(01~12):");
scanf("%s",Mon);
strncat(OItime, Mon, strlen(Mon) );
strncat(OItime, "-", 1 );
printf(" 请输入 日期(01~31):");
scanf("%s",Day);
strncat(OItime, Day, strlen(Day) );
strncat(OItime, ">", 1 );
printf(" 请输入 时 (00~23):");
scanf("%s",Hour);
strncat(OItime, Hour, strlen(Hour));
strncat(OItime, ":", 1 );
printf(" 请输入 分 (00~59):");
scanf("%s",Min);
strncat(OItime, Min, strlen(Min) );
strncpy(Order_Info[index].OItime, OItime,strlen(OItime));
//订单编号
OIid = TimeStrToInt(OItime);
Order_Info[index].OIid = OIid;
//重置i
i = 0;
}
}
}
if((fp=fopen("OrderInfo.txt","w+"))==NULL){
printf(" 修改失败!\n 按任意键以继续。");
}else{
for(i = 0; i < Number_Of_Order; i++){
if(fprintf(fp,"%s %s %s %s %d %d %s\n",
Order_Info[i].OIname, Order_Info[i].OItell, Order_Info[i].OIdate,
Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid, Order_Info[i].OIplaceNo)<0){
fclose(fp);
remove("OrderInfo.txt");
printf(" 修改失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
break;
}
}
if(i == Number_Of_Order){
fclose(fp);
printf("订单预订时间修改成功!订单编号发生改变. 按任意键返回...");
}
}
getch();
}
void Modify_OrderPlaceNo(int index){
int i = 0;
FILE *fp;
char OIplaceNo[2]; //餐位
printf(" 请输入(A-D 1-5)餐位 :");
scanf("%s",OIplaceNo);
strncpy(Order_Info[Number_Of_Order].OIplaceNo, OIplaceNo,strlen(OIplaceNo));
if(Number_Of_Order != 0){
for(i = 0; i < Number_Of_Order; i++){
//同日 前三小时 后三小时
if((Order_Info[index].OIid / 100 == Order_Info[i].OIid / 100) &&
((Order_Info[index].OIid % 100 - 3) < (Order_Info[i].OIid % 100)) &&
((Order_Info[index].OIid % 100 + 3) > (Order_Info[i].OIid % 100)) &&
(strcmp(OIplaceNo, Order_Info[i].OIplaceNo)==0)){
printf("非常抱歉,该餐位在此时段已被预订,请重新输入餐位\n");
printf(" 请输入(A-D 1-5)餐位 :");
scanf("%s",OIplaceNo);
strncpy(Order_Info[Number_Of_Order].OIplaceNo, OIplaceNo,strlen(OIplaceNo));
//重置i
i = 0;
}
}
}
if((fp=fopen("OrderInfo.txt","w+"))==NULL){
printf(" 修改失败!\n 按任意键以继续。");
}else{
for(i = 0; i < Number_Of_Order; i++){
if(fprintf(fp,"%s %s %s %s %d %d %s\n",
Order_Info[i].OIname, Order_Info[i].OItell, Order_Info[i].OIdate,
Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid, Order_Info[i].OIplaceNo)<0){
fclose(fp);
remove("OrderInfo.txt");
printf(" 修改失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
break;
}
}
if(i == Number_Of_Order){
fclose(fp);
printf("订单预订餐位修改成功!按任意键返回...");
}
}
getch();
}
void Modify_OrderMember(int index){
int i = 0, OImember = 0;
FILE *fp;
printf(" 请输入 就餐人数(不超过15人) :");
scanf("%d",&OImember);
while(OImember>15){
printf(" 输入超过15人!\n");
printf(" 请重新输入 :");
scanf("%d",&OImember);
}
Order_Info[index].OImember = OImember;
if((fp=fopen("OrderInfo.txt","w+"))==NULL){
printf(" 修改失败!\n 按任意键以继续。");
}else{
for(i = 0; i < Number_Of_Order; i++){
if(fprintf(fp,"%s %s %s %s %d %d %s\n",
Order_Info[i].OIname, Order_Info[i].OItell, Order_Info[i].OIdate,
Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid, Order_Info[i].OIplaceNo)<0){
fclose(fp);
remove("OrderInfo.txt");
printf(" 修改失败!数据已丢失!请重新执行写入操作.\n 按任意键以继续。");
break;
}
}
if(i == Number_Of_Order){
fclose(fp);
printf("订单预订就餐人数修改成功!按任意键返回...");
}
}
getch();
}
//还原
void Restore(){
FILE *fp;
if((fp=fopen("Owner.txt","r+"))==NULL){
printf("店主信息还原成功...\n");
}else{
fclose(fp);
if(remove("Owner.txt") == 0){
printf("店主信息还原成功...\n");
}else{
printf("店主信息还原失败\n");
}
}
if((fp=fopen("AssistantNumber.txt","r+"))==NULL){
printf("店员数量信息已归零...\n");
printf("店员信息还原成功...\n");
}else{
fclose(fp);
if(remove("AssistantNumber.txt") == 0){
if((fp=fopen("Assistant.txt","r+"))==NULL){
printf("店员数量信息已归零...\n");
printf("店员信息还原成功...\n");
}else{
fclose(fp);
if(remove("Assistant.txt") == 0){
printf("店员数量信息已归零...\n");
printf("店员信息还原成功...\n");
}else{
printf("店员信息还原失败\n");
}
}
}else{
printf("店员信息还原失败\n");
}
}
if((fp=fopen("OrderNumber.txt","r+"))==NULL){
printf("预订数量信息已归零...\n");
printf("预订信息还原成功...\n");
}else{
fclose(fp);
if(remove("OrderNumber.txt") == 0){
if((fp=fopen("OrderInfo.txt","r+"))==NULL){
printf("预订数量信息已归零...\n");
printf("预订信息还原成功...\n");
}else{
fclose(fp);
if(remove("OrderInfo.txt") == 0){
printf("预订数量信息已归零...\n");
printf("预订信息还原成功...\n");
}else{
printf("预订信息还原失败\n");
}
}
}else{
printf("预订信息还原失败\n");
}
}
LoginStatus = 0;
init_sys();
printf("系统信息还原完成,请重新打开程序。\n");
getch();
exit(0);
}
//YYYY-MM-DD hh:mm 提取成 YYYYMMDDhhmm的长整型
long int TimeStrToInt(char *str){
long int ID;
for (int i = 0,j = 0; i < strlen(str); i++){
if(str[i]>47 && str[i]<58){
j++;
switch(j){
case 1: ID += ((int)str[i]-48)*1000000000;break;
case 2: ID += ((int)str[i]-48)*100000000;break;
case 3: ID += ((int)str[i]-48)*10000000;break;
case 4: ID += ((int)str[i]-48)*1000000;break;
case 5: ID += ((int)str[i]-48)*100000;break;
case 6: ID += ((int)str[i]-48)*10000;break;
case 7: ID += ((int)str[i]-48)*1000;break;
case 8: ID += ((int)str[i]-48)*100;break;
case 9: ID += ((int)str[i]-48)*10;break;
case 10:ID += ((int)str[i]-48)*1;break;
}
}
}
return ID;
}
更多推荐
已为社区贡献1条内容
所有评论(0)