📄 hotelmuanul.cpp
字号:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctime>
#define N 500
#define TRUE 1
#define FALSE 0
/*定义顾客结构体*/
typedef struct Passenger
{
char name[10]; //姓名
int roomNO[20]; //房号
int price[5]; //各等级房间价格
int remain[5]; //各等级空房间数
void PassWord(); //系统密码
void order(); //预定
void del(); //取消预定
void addnum(Passenger*);
void pgsearch();
void query_remain();//按空余房间查询
void query_price(); //按各等级价格查询
void display(); //浏览预定储存信息
} PG;
/*结构体成员赋值*/
int price[5]={500,300,150,100,50}; //各等级价格
int remain[5]={100,100,100,100,100};//各级房间初始剩余数
int A=500,B=400,C=300,D=200,E=100; //计算门牌号
static int p=0;
static int TOTAL=0; //统计人数(全局变量)
char line[10];
PG gesters[N]; //结构体变量gesters数组
/*加密函数*/
void PassWord()
{
int i,m=0;
char x[1][6]={'t','a','n','g','s','h'};//密码
char w[1][7];
cout<<"\t>>>>>>>欢迎进入客房服务终端<<<<<<<<\n\n";
cout<<"请输入系统管理密码:(6位数,数字或大小写字母)"<<endl;
to1: for(i=0;i<7;i++) //输入密码
{
w[0][i]=getch();
if( ((w[0][i]>='0')&&(w[0][i]<='9')
||(w[0][i]>='a')&&(w[0][i]<='z')
||(w[0][i]>='A')&&(w[0][i]<='Z'))&&(i!=6))
printf("*"); //输出"*"覆盖密码原值
else if(i!=6)
goto to2;
}
if((x[0][0]!=w[0][0])||(x[0][1]!=w[0][1])//输入密码若不正确
||(x[0][2]!=w[0][2])||(x[0][3]!=w[0][3])
||(x[0][4]!=w[0][4])||(x[0][5]!=w[0][5]))
{
to2: m++;
if(m==3) //输入超过3次,自动关闭应用程序
{
printf("\n\t\t你输入密码已超过三次, 程序自动关闭!\n");
exit(0);
}
printf("\n\n\t密码错误,请重试.....\n");
goto to1; //密码错误未超过3次,重新输入
}
cout<<"\n通过密码验证,程序启动!\n\n";
system("cls"); //清屏
}
/*预定房间*/
void order()
{
loop1: FILE *fp;
PG g;//定义结构体Passengers变量
if(p==0)//判断是否为结构体数组的第一个变量信息
{
if((fp=fopen("roombook.txt","w"))==NULL)//写入方式打开文件
{
cout<<"\t创建存档文件失败!"<<endl;
return;
}
p++;
}
else //非结构体数组第一个变量信息
{
if((fp=fopen("roombook.txt","ab+"))==NULL)//追加方式打开文件
{
cout<<"\t不能够打开这个文件\n";
return;
}
}
system("cls");
cout<<"\n\n\n>>>>>>>>>>>>>欢迎顾客光临<<<<<<<<<<<<<<\n\n";//输入顾客信息
int region,count=0,total,j=0;
int q=1,w;
char k,u;
char c='y';
TOTAL++;
cout<<"请您输入性别:(m(男)/f(女))\n"; //判断性别
cin>>k;
loop2:{
if(k=='m'||k=='M')
w=1; //1为男性
else if(k=='f'||k=='F')
w=2; //2为女性
else
{
cout<<"性别输入出错,请重试 !\n\n";
cin>>k;
goto loop2; //出错处理
}
}
if(w==1)
cout<<"\n 先生,请输入您的姓名:\n";
else
cout<<"\n 女士,请输入您的姓名:\n";
cin>>g.name ; //输入姓名
for(;;)
{
int i=0, u ,back=0;
loop3: cout<<"请问您想购买哪总等级的房间";
cout<<"(1:A等 2:B等 3:C等 4:D等 5:E等)\n";
cin>>line[0]; //输入订房等级
region = line[0];
if(region>'5'||region<'1')//判断等级正确性
{
cout<<"\n输入出错,请重试 !\n\n";
continue;
}
region=region-48;
if(remain[region-1]<1) //判断空余房间数
{
cout<<"该等级客房已售完 !\n";
continue;
}
cout<<"\n您需要订几间房 ?\n";//询问开取房间数
cin>>line;
count=atoi(line);
if(count>remain[region-1]) //判断所需房间数是否充足
{
cout<<"房间数量不够 !\n";
continue;
}
if(count<1)
{
cout<<"\n输入数量出错 ! 请重试\n\n";//数值过大处理
continue;
}
remain[region-1]=remain[region-1]-count;//计数剩余房间数
total=count*price[region-1]; //计算金额
if(w==1)
printf("\n %s 先生,你已经预定了%c 等级的房间 ",&g.name,region+64);
else
printf("\n %s 女士,你已经预定了%c 等级的房间 ",&g.name,region+64);
cout<<count<<" 间,门牌号是:\n\n";
for(i=back,u=0;i<count+back;i++) //记录并输出顾客开取房间号码
{
if(region == 1) //若为A等房
{
A+=1;
cout<<'\t'<<A;
g.roomNO[i]=A;
}
else if(region == 2)//若为B等房
{
B+=1;
cout<<'\t'<<B;
g.roomNO[i]=B;
}
else if(region == 3)//若为C等房
{
C+=1;
cout<<'\t'<<C;
g.roomNO[i]=C;
}
else if(region == 4)//若为D等房
{
D+=1;
cout<<'\t'<<D;
g.roomNO[i]=D;
}
else //若为E等房
{
E+=1;
cout<<'\t'<<E;
g.roomNO[i]=E;
}
u++;
if(u%6==0) //每行输出6个号
cout<<'\n';
}back+=count; //判断重复预定时补录门牌号
cout<<"\n\n\t您本次应付的总金额为"<<total<<"元。"<<endl;//输出金额
cout<<"\n\t您的预订成功,欢迎光临本宾馆 !\n";
cout<<"\n\n请问是否继续预订?(y/n)\n";
cin>>c;
if(c=='y'||c=='Y')
{
goto loop3;//若重复预定房间
}
else
break; //不重复预定时跳出while()循环
}
if(p==1)//如输入的为第一个信息,把信息赋给gesters[0]
{
strcpy(gesters[0].name,g.name);
for(int j=0;j<20;j++)
{
gesters[0].roomNO[j]=g.roomNO[j];
}
fwrite(&gesters,sizeof(struct Passenger),1,fp);//读入磁盘
p++;//描述使第一个信息不被覆盖判断
fclose(fp);
}
else//如不是第一个输入信息
{
fwrite(&g,sizeof(struct Passenger),1,fp);//以添加形式读入磁盘
rewind(fp);
fclose(fp);
}
cout<<"还需添加新的客户信息吗?(y/n)\n";
cin>>u;
if(u=='y'||u=='Y')
goto loop1; //添加新的顾客信息
}
/*显示预定的客户信息*/
void display()
{
FILE *fp;
if((fp=fopen("roombook.txt","r"))==NULL)//读出形式打开文件
{
cout<<"文件打开失败,无法读取数据!"<<endl;
return;
}
if(TOTAL==0) //判断是否为空文件
{
p=0;
cout<<"\n很抱歉,列表中没有可遍历的顾客信息!\n";
return;
}
cout<<"客房预定情况如下:\n\t姓名\t房间号\n";//不为空时输出所有信息
for(int j=0;(fread(&gesters[j],sizeof(struct Passenger),1,fp))!=0,j<=TOTAL;j++)
{
cout<<'\n'<<'\t'<<gesters[j].name<<'\t';//姓名
for(int i=0,w=1;i<20&&gesters[j].roomNO[i]>100&&gesters[j].roomNO[i]<600;i++,w++)
{
cout<<gesters[j].roomNO[i]<<'\t';//房间号
if(w%6==0)
cout<<"\n\t\t";
}
}
fclose(fp);
}
/*工具函数*/
void addnum(PG ad) //返回因被删除顾客占用的房间号
{
for(int j=0;ad.roomNO[j]>=100&&ad.roomNO[j]<=600;j++)
{
if(ad.roomNO[j]>100&&ad.roomNO[j]<=200)//若为E等房
{
remain[4]=remain[4]+1; //空房间数加1
}
if(ad.roomNO[j]>200&&ad.roomNO[j]<=300)//若D为等房
{
remain[3]=remain[3]+1;
}
if(ad.roomNO[j]>300&&ad.roomNO[j]<=400)//若为C等房
{
remain[2]=remain[1]+1;
}
if(ad.roomNO[j]>400&&ad.roomNO[j]<=500)//若为B等房
{
remain[1]=remain[4]+1;
}
if(ad.roomNO[j]>500&&ad.roomNO[j]<=600)//若为A等房
{
remain[0]=remain[0]+1;
}
}
}
/*删除客户预定资料*/
void del()
{
FILE *fp;
int T;
char delname[10],c='y';
if((fp=fopen("roombook.txt","w"))==NULL)
{
cout<<"\n信息文件打开失败 !"<<endl;
return;
}
while(c=='y'||c=='Y')
{
cout<<endl;
display();//每次删除前遍历订房信息
if(TOTAL==0)
{
p=0;
system("cls");
cout<<"\n\t------->无效删除,系统自动返回上级:\n";
break;
}
cout<<"\n\n请输入要取消的订户姓名 :"<<endl;
cin>>delname;//输入目标删除姓名
for(int i=0;i<=TOTAL;i++)
{
T=TOTAL;
if(strcmp(gesters[i].name,delname)==0)
{
addnum(gesters[i]);//运行工具函数,释放被占房间
TOTAL--;
for(;(gesters[i].name)!=NULL;i++)
{
for(;i<=TOTAL;i++)
gesters[i]=gesters[i+1];//跳过被删除信息节点
}
cout<<"\n删除成功!\n";
}fwrite(&gesters,sizeof(struct Passenger),TOTAL,fp);
//刷新信息
}
if(TOTAL==T)//如若总数不变(即没被删除)时处理
cout<<"\n查无此顾客 !"<<endl;
cout<<"\n是否继续?(y/n)\n";
cin>>c;
}
fclose(fp);
}
/*客户查询函数(按姓名查询)*/
void pgsearch()
{
FILE *fp;
char searchname[10],c='y';
if((fp=fopen("roombook.txt","w"))==NULL)
{
cout<<"文件打开失败,无法读取数据!"<<endl;
return;
}
if(TOTAL==0)
{
p=0;//p为0,使得再次输入顾客信息时第一个赋给gesters[0]
cout<<"\n很抱歉,没有顾客可以查询!\n\n";
return; //"roombook.txt"文件中没有信息,跳出本函数
}
while(c=='y'||c=='Y') //顾客查询循环体
{
int y=FALSE;
for(int j=0;(fread(&gesters[j],sizeof(struct Passenger),1,fp))!=0,j<TOTAL;j++)
{
cout<<"\n\n请输入要查询的订户姓名 :"<<endl;
cin>>searchname; //输入目标查询姓名
for(int i=0;i<=TOTAL;i++)
{
if(strcmp(gesters[i].name,searchname)==0)//若是查到了顾客
{
y=TRUE;
cout<<"您所查询的顾客资料为:\n\t姓名\t房间号\n";
cout<<'\n'<<'\t'<<gesters[j].name<<'\t';//输出顾客姓名
for(int i=0,w=1;i<20&&gesters[j].roomNO[i]>100&&gesters[j].roomNO[i]<600;i++,w++)
{
cout<<gesters[j].roomNO[i]<<'\t';//输出该顾客所预定房间
if(w%6==0)
cout<<"\n\t\t"; //输出格式为每行6六个
}
}
}
if(y!=TRUE) //若是没有查到
{
cout<<"\n\t很抱歉,没有您要查询的顾客资料!\n\n";
break; //跳出while()循环
}
}
cout<<"\n是否继续?(y/n)\n";
cin>>c;
}
fclose(fp);
}
/*按剩余房间查询*/
void query_remain()
{
time_t tt; //读取系统当前时间
time(&tt);
cout<<"\n\t本地时间为: " << ctime(&tt) <<endl; // 显示时间
cout<<"\n\t目前宾馆各等级的待预定房间情况如下:\n\n"; //显示个等级房间空余数
cout<<'\t'<<'\t'<<"A等"<<'\t'<<"B等"<<'\t'<<"C等"<<'\t'<<"D等"<<'\t'<<"E等\n"<<endl;
cout<<'\t'<<'\t'<<remain[0]<<'\t'<<remain[1]<<'\t'<<remain[2]<<'\t'<<remain[3]<<'\t'<<remain[4]<<endl;
cout<<"\n\t-------------------显示完毕---------------------\n"<<endl;
system("pause");
system("cls"); //查询完毕后清屏
}
/*按套间价格查询*/
void query_price()
{
cout<<"\n\t本宾馆各等级的客房单天单间价格如下:(单位:元)\n\n";//输出个等级房间单价
cout<<'\t'<<'\t'<<"A等"<<'\t'<<"B等"<<'\t'<<"C等"<<'\t'<<"D等"<<'\t'<<"E等\n"<<endl;
cout<<'\t'<<'\t'<<"500"<<'\t'<<"400"<<'\t'<<"300"<<'\t'<<"200"<<'\t'<<"100\n"<<endl;
cout<<"\n\t------------------显示完毕----------------------\n"<<endl;
system("pause");
system("cls"); //查询完毕后清屏
}
/*客房查询系统*/
void query()
{
char i;
for(;;)
{
cout<<"\n\n\n\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
cout<<"\t\t\t1------查询顾客情况\n";
cout<<"\t\t\t2------查询各等级空房\n";
cout<<"\t\t\t3------查询各等级房价格\n";
cout<<"\t\t\t0------返回上级菜单\n";
cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
cout<<"\n请输入服务功能键: ";
cin>>i;
system("cls");
switch(i)
{
case '1':
pgsearch(); break;//按顾客姓名查询
case '2':
query_remain(); break;//按各等级空余房间查询
case '3':
query_price(); break;//按各等级单间价格查询
case '0':
system("cls"); break;//跳出查询
default:
{
cout<<"输入出错!请重试"<<endl;
system("pause"); //出错 按任意键重试
continue;//重新循环
}
}
if(i=='0')
{
system("cls");
break;
}
}
cout<<"\n\n系统安全返回上级菜单:\n"<<endl;//查询完毕,返回主菜单
}
/*主函数*/
main()
{
FILE *fp;
fp=fopen("roombook.txt","r"); //读取(/建立)信息文本文件
PassWord(); //执行密码程序
char select;
char c='y';
cout<<"欢迎使用客房客户端服务系统:\n"; //进入主菜单
while(c=='y'||c=='Y')
{
cout<<"\n\n\t\t\t -------主菜单--------\n\n";
cout<<"\t\t************************************************\n";
cout<<"\t\t\t1----------进入订房系统订房\n";
cout<<"\t\t\t2----------遍历预定信息\n";
cout<<"\t\t\t3----------取消房间订单\n";
cout<<"\t\t\t4----------查询系统\n";
cout<<"\t\t\t0----------退出本程序\n";
cout<<"\t\t************************************************\n";
cout<<"\n请选择服务项目: ";
cin>>select; //功能键选择
switch(select)
{
case '1':
order(); //(1)预定房间
break;
case '2':
{
display(); //(2)显示预定信息
cout<<endl<<"显示完毕!!!!!!"<<endl;
cout<<endl<<"按任意键返回...."<<endl;
getch();
system("cls");
break;
}
case '3':
del(); break; //(3)按姓名撤销预定
case '4': //(4)进入查询子菜单
{
system("cls");
cout<<"\n\n\n\t\t>>>>>>>>欢迎进入查询菜单<<<<<<<<<< \n\n";
query();
break;
}
case '0':
break; //(0)退出系统
default: //(其他键)异常处理
{
cout<<"输入出错!请重试"<<endl;
system("pause");
system("cls");
continue; //重新循环
}
}
if(select=='0')
{ //(0)退出系统
system("cls");
break;
}
}
cout<<"\n\n\n\n\n\n\n\n\t\t欢迎使用本系统,再见!\n\n\n"<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -