1. 宾馆客房管理系统
1.1 问题描述
题目描述:设计一个宾馆客房管理系统,以菜单方式工作。
功能需求:
(1) 设计一个房间类 Room,记录的客房信息包括客房号、客房类型、客
房价格、空闲情况、客人姓名、客人身份证号、入住时间、退房时间,预付费
用等信息。
(2) 客房信息的录入功能。
(3) 客人入住登记。
(4) 客房信息浏览功能,浏览全部客房的信息。支持按照空房、姓名、身
份证号、房间号查询。
(5) 客人退房结算。
(6) 使用外部文件存储相关数据。
进阶:考虑打折促销等活动。
1.2 解题思路
根据题目描述,设计一个宾馆客房管理系统可以遵循以下解题思路:
- 创建一个房间类 Room,包含以下属性:
- 客房号
- 客房类型
- 客房价格
- 空闲情况
- 客人姓名
- 客人身份证号
- 入住时间
- 退房时间
- 预付费用
- 实现客房信息录入功能:
- 从用户输入获取房间相关信息。
- 将录入的信息存储到外部文件中。
- 实现客人入住登记功能:
- 从用户输入获取客人相关信息。
- 根据用户选择的客房号,更新对应房间的空闲情况、客人信息和入住时间。
- 将更新后的信息存储到外部文件中。
- 实现客房信息浏览功能:
- 从外部文件中读取全部客房信息。
- 根据用户选择的查询方式(空房、姓名、身份证号、房间号),筛选并展示符合条件的客房信息。
- 实现客人退房结算功能:
- 从用户输入获取客房号。
- 根据客房号查询对应房间的信息。
- 计算客房费用,并展示给用户。
- 更新房间的空闲情况、客人信息和退房时间。
- 将更新后的信息存储到外部文件中。
- 对于进阶需求,可以考虑添加打折促销等活动:
- 设计活动类,包含活动名称、折扣比例等属性。
- 在客房结算时,根据活动情况计算折扣后的费用。
- 使用外部文件存储相关数据:
- 可以使用文本文件或二进制文件存储客房信息和客人信息。
- 提供读取和写入文件的功能,用于存取系统数据。
- 设计菜单方式工作:
- 创建一个菜单,展示系统功能选项。
- 根据用户选择的选项,调用相应的功能函数。
1.3 程序设计
(1) 定义了4个类,分别是:
class passager
{
public:
string name; //游客的姓名
int age; //游客的年龄
string nation; //游客的国籍
int sex; //游客的性别,表示男,表示女
string nationnality;//游客的身份证号码
int days; //游客所住的天数
string phonenumber; //游客的电话号码
int money; //游客所需的租金
int id; //游客所住房间的ID号
void setdata
(
string sname,
int sage,
string snation,
int Ssex,
string snationnality,
int sdays,
string sphonenumber,
int smoney,
int sid
)
{
name=sname;
age=sage;
nation=snation;
sex=Ssex;
nationnality=snationnality;
days=sdays;
phonenumber=sphonenumber;
money=smoney;
id=sid;
}
};
class Day
{
public:
int year;
int month;
int day;
};
class hotelroom
{
public:
int ID; //房间的ID
int money; //房间每天的租金
int days; //房间所租的天数,0表示未租用
Day begin; //房间开始出租的日期,未租用用年月日
Day end; //房间结束出租的日期
int state; //房间是否被出租,表示未出租,表示出租
string passagername;//居住旅客的姓名
void setdata
(
int sID,
int smoney,
int sdays,
int syear,
int smonth,
int sDay,
int Sstate,
string spassagername)
{
ID=sID;
money=smoney;
days=sdays;
begin.year=syear;
begin.month=smonth;
begin.day=sDay;
state=Sstate;
passagername=spassagername;
}
};
class worker
{
public:
string name; //员工的英文姓名
int age; //员工的年龄
string phonenumber; //员工的手机号码
int sex; //员工的性别,表示男,表示女
int salary; //员工的薪酬
string nationnality;//员工的身份证号码
Day begin;//员工开始工作的时间
void setdata
(
string sname,
int sage,
string sphonenumber,
int Ssex,
int Ssalary,
string snationnality,
int syear,
int smonth,
int sDay
)
{
name=sname;
age=sage;
phonenumber=sphonenumber;
sex=Ssex;
salary=Ssalary;
nationnality=snationnality;
begin.year=syear;
begin.month=smonth;
begin.day=sDay;
}
};
这4个类使得方便对酒店管理系统的功能进行使用。
(2)本程序含有12个CPP以及一个头文件,每个CPP基本都是一个功能,函数有如下:
void Initial(const char * ,const char *,const char *); //初始化函数
//Initial.cpp
//对于数据文件进行初始化,形成一个空文件
#include"hotel.h"
void Initial(const char* hotelfileDat, const char* passagerfileDat, const char* workerfileDat)
{
fstream Hfdat(hotelfileDat, ios::out | ios::binary);//以写方式打开,建立酒店房间资料管理新文件
fstream Pfdat(passagerfileDat, ios::out | ios::binary);//以写方式打开,建立酒店旅客资料管理新文件
fstream Wfdat(workerfileDat, ios::out | ios::binary);//以写方式打开,建立酒店员工资料管理新文件
passager pmark;
hotelroom hmark;
worker wmark;
pmark.setdata("noName\0", 0, "Nonation\0", 0, "Nonationality\0", 0, "Nopehonenumber\0", 0, 0); //空记录
hmark.setdata(0, 0, 0, 0, 0, 0, 0, "noName\0"); //空记录
wmark.setdata("noName\0", 0, "Nopehonenumber\0", 0, 0, "Nonationality\0", 0, 0, 0); //空记录
cout << "若房间资料和酒店旅客文件存在,将删除原有数据,要进行文件初始化吗?(Y/N)\n";
char answer;
cin >> answer;
if (answer == 'Y' || answer == 'y')
{
Hfdat.seekp(0, ios::beg);
Pfdat.seekp(0, ios::beg);
Wfdat.seekp(0, ios::beg);
Hfdat.write((char*)&hmark, sizeof(hotelroom));
Pfdat.write((char*)&pmark, sizeof(passager));
Wfdat.write((char*)&wmark, sizeof(worker)); //写入空标志
cout << "文件已经初始化.\n";
}
else
{
cout << "取消操作\n";
}
Hfdat.close();
Pfdat.close();
Wfdat.close(); //关闭文件
}
void Roommenege(const char * ); //酒店房间管理函数
//Roommenege.cpp
//酒店房间管理
#include"hotel.h"
int total = 0;
void Roommenege(const char* hotelfileDat)
{
hotelroom hmark;
hmark.setdata(0, 0, 0, 0, 0, 0, 0, "noName\0"); //空记录
hotelroom room1;
while (1)
{
cout << "****************宾馆房间管理****************\n"
<< "1、第一次录入房间\n"
<< "2、修改房间资料\n"
<< "3、录入新房间\n"
<< "Q、返回上一层\n"
<< "请选择您要进行的操作:\n";
char choice;
cin >> choice;
switch (choice)
{
case '1':
{
fstream Hfdat1(hotelfileDat, ios::out | ios::binary);//以写方式打开
if (!Hfdat1) //文件不存在
{
cout << "文件不存在,请执行初始化操作\n";
return;
}
Hfdat1.seekg(0, ios::beg);
Hfdat1.write((char*)&hmark, sizeof(hotelroom));
Hfdat1.close();
fstream Hfdat2(hotelfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
if (!Hfdat2) //文件不存在
{
cout << "文件不存在,请执行初始化操作\n";
return;
}
Hfdat2.seekg(0, ios::beg);
int Bool = 1;
do
{
Hfdat2.read((char*)&room1, sizeof(hotelroom)); //读一个记录
} while (!endmark1(room1)); //判断是否结束标志
Hfdat2.seekp(-long(sizeof(hotelroom)), ios::cur); //写指针位置
while (Bool == 1)
{
cout << "请输入房间的ID:\n";
cin >> room1.ID;
cout << "请输入房间租金:\n";
cin >> room1.money;
room1.days = 0;
room1.begin.year = 0;
room1.begin.month = 0;
room1.begin.day = 0;
room1.state = 0;
room1.passagername = "noname";
Hfdat2.seekp(0, ios::cur);
Hfdat2.write((char*)&room1, sizeof(hotelroom));
total++;
cout << "是否继续录入宾馆房间?(Y/N)\n";
char answer;
cin >> answer;
if (answer == 'Y' || answer == 'y')
{
Bool = 1;
}
else
{
Bool = 0;
Hfdat2.write((char*)&hmark, sizeof(hotelroom));
}
}
break;
}
case '2':
{
fstream Hfdat(hotelfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
if (!Hfdat) //文件不存在
{
cout << "文件不存在,请执行初始化操作\n";
return;
}
Hfdat.seekg(0, ios::beg); //文件读指针移到开始位置
int id;
cout << "请输入你需要更改房间资料的ID号:\n";
cin >> id;
do
{
Hfdat.read((char*)&room1, sizeof(hotelroom)); //读一个数据
} while (room1.ID != id && !endmark1(room1)); //判断是否找到记录
if (room1.ID == id)
{
while (1)
{
cout << "1、房间租金\n"
<< "2、房间所租天数\n"
<< "3、房间开始出租的年\n"
<< "4、房间开始出租的月\n"
<< "5、房间开始出租的日\n"
<< "6、房间状态\n"
<< "7、旅客姓名\n"
<< "q、返回上一层\n"
<< "请输入你想修改的项目:\n";
char choice;
cin >> choice;
switch (choice)
{
case '1':
{
cout << "租金修改为:\n";
cin >> room1.money;
break;
}
case '2':
{
cout << "所租天数修改为:\n";
cin >> room1.days;
break;
}
case '3':
{
cout << "开始出租的年修改为:\n";
cin >> room1.begin.year;
break;
}
case '4':
{
cout << "开始出租的月修改为:\n";
cin >> room1.begin.month;
break;
}
case '5':
{
cout << "开始出租的日修改为:\n";
cin >> room1.begin.day;
break;
}
case '6':
{
cout << "状态修改为:\n";
cin >> room1.state;
break;
}
case '7':
{
cout << "旅客姓名修改为:\n";
cin >> room1.passagername;
break;
}
case 'q':
case'Q':goto loop;
default:cout << "错误操作!"; break;
}
}
loop:
Hfdat.seekp(-long(sizeof(hotelroom)), ios::cur);
Hfdat.write((char*)&room1, sizeof(hotelroom));
Hfdat.close();
}
else //找不到记录
cout << "错误ID,请重试!\n";
break;
}
case '3':
{
fstream Hfdat(hotelfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
if (!Hfdat) //文件不存在
{
cout << "文件不存在,请执行初始化操作\n";
return;
}
int Bool = 1;
Hfdat.seekg(0, ios::beg);
do
{
Hfdat.read((char*)&room1, sizeof(hotelroom)); //读一个记录
} while (!endmark1(room1)); //判断是否结束标志
Hfdat.seekp(-long(sizeof(hotelroom)), ios::cur); //写指针位置
while (Bool == 1)
{
cout << "请输入房间的ID:\n";
cin >> room1.ID;
cout << "请输入房间租金:\n";
cin >> room1.money;
room1.days = 0;
room1.begin.year = 0;
room1.begin.month = 0;
room1.begin.day = 0;
room1.state = 0;
room1.passagername = "noname";
Hfdat.seekp(0, ios::cur);
Hfdat.write((char*)&room1, sizeof(hotelroom));
total++;
cout << "是否继续录入宾馆房间?(Y/N)\n";
char answer;
cin >> answer;
if (answer == 'Y' || answer == 'y')
{
Bool = 1;
}
else
{
Bool = 0;
Hfdat.write((char*)&hmark, sizeof(hotelroom));
}
}
Hfdat.close();
break;
}
case 'q':
break;
case 'Q':
return; //退出操作,返回上一层菜单
default:cout << "错误操作,请重新选择\n"; break; //错误操作提示
}
}
}
void changetxt(const char * ,const char *,const char *);//转换文本函数
//changetxt.cpp
//将数据转换成文本记录,并提供查看功能
#include"hotel.h"
const char* hotelfiletxt = "e:\\hotelFile.txt"; //酒店管理文本文件
const char* passagerfiletxt = "e:\\passagerFile.txt";//旅客管理文本数据文件
const char* workerfiletxt = "e:\\workerFile.txt";//员工管理文本数据文件
void changetxt(const char* hotelfileDat, const char* passagerfileDat, const char* workerfileDat)
{
hotelroom room1;
worker worker1;
passager passager1;
while (1)
{
cout << "***********文本文件管理***********\n"
<< "1、将宾馆房间数据转换成文本格式\n"
<< "2、将宾馆旅客数据转换成文本格式\n"
<< "3、将宾馆员工数据转换成文本格式\n"
<< "4、显示宾馆房间数据文本文件\n"
<< "5、显示宾馆旅客数据文本文件\n"
<< "6、显示宾馆员工数据文本文件\n"
<< "q、返回操作\n"
<< "请选择您要进行的操作:\n";
char choice;
cin >> choice;
switch (choice)
{
case '1':
{
fstream Hfdat(hotelfileDat, ios::in | ios::binary);//以读方式打开
fstream Hftxt(hotelfiletxt, ios::out);//以写方式打开
if (!Hfdat)
{
cout << "文件没有找到!请进行初始化功能!\n";
} //文本没有找到提示
Hfdat.seekp(0, ios::beg); //2进制数据文件读指针移到文件头
Hftxt << "****************This is a file of hotelroom****************\n"
<< "ID:\t"
<< "租金:\t"
<< "天数:\t"
<< "起始年:\t"
<< "月:\t"
<< "日:\t"
<< "状态:\t"
<< "旅客:\n";
do
{
Hfdat.read((char*)&room1, sizeof(hotelroom));//读一个记录
if (!endmark1(room1))
Hftxt << room1.ID << '\t'
<< room1.money << '\t'
<< room1.days << '\t'
<< room1.begin.year << '\t'
<< room1.begin.month << '\t'
<< room1.begin.day << '\t'
<< room1.state << '\t'
<< room1.passagername << '\n';
} while (!endmark1(room1)); //判断是否结束标志
Hfdat.close();
Hftxt.close(); //关闭文件
break;
}
case '2':
{
fstream Pfdat(passagerfileDat, ios::in | ios::binary);//以读方式打开
fstream Pftxt(passagerfiletxt, ios::out);//以写方式打开
if (!Pfdat)
{
cout << "文件没有找到!请进行初始化功能!\n";
} //文本没有找到提示
Pfdat.seekp(0, ios::beg); //2进制数据文件读指针移到文件头
Pftxt << "****************This is a file of passager****************\n"
<< "姓名:\t"
<< "年龄:\t"
<< "国籍:\t"
<< "性别:\t"
<< "身份证:\t"
<< "天数:\t"
<< "电话:\t"
<< "租金:\t"
<< "ID:\n";
do
{
Pfdat.read((char*)&passager1, sizeof(passager));//读一个记录
if (!endmark2(passager1))
Pftxt << passager1.name << '\t'
<< passager1.age << '\t'
<< passager1.nation << '\t'
<< passager1.sex << '\t'
<< passager1.nationnality << '\t'
<< passager1.days << '\t'
<< passager1.phonenumber << '\t'
<< passager1.money << '\t'
<< passager1.id << '\n';
} while (!endmark2(passager1)); //判断是否结束标志
Pfdat.close();
Pftxt.close(); //关闭文件
break;
}
case '3':
{
fstream Wfdat(workerfileDat, ios::in | ios::binary);//以读方式打开
fstream Wftxt(workerfiletxt, ios::out);//以写方式打开
if (!Wfdat)
{
cout << "文件没有找到!请进行初始化功能!\n";
} //文本没有找到提示
Wfdat.seekp(0, ios::beg); //2进制数据文件读指针移到文件头
Wftxt << "****************This is a file of worker****************\n"
<< "姓名:\t"
<< "年龄:\t"
<< "手机:\t"
<< "性别:\t"
<< "薪酬:\t"
<< "身份证:\t"
<< "年:\t"
<< "月:\t"
<< "日:\n";
do
{
Wfdat.read((char*)&worker1, sizeof(worker));//读一个记录
if (!endmark3(worker1))
Wftxt << worker1.name << '\t'
<< worker1.age << '\t'
<< worker1.phonenumber << '\t'
<< worker1.sex << '\t'
<< worker1.salary << '\t'
<< worker1.nationnality << '\t'
<< worker1.begin.year << '\t'
<< worker1.begin.month << '\t'
<< worker1.begin.day << '\n';
} while (!endmark3(worker1)); //判断是否结束标志
Wfdat.close();
Wftxt.close(); //关闭文件
break;
}
case '4':
{
fstream Hftxt(hotelfiletxt, ios::in);//以读方式打开
char a[80];
while (!Hftxt.eof())
{
Hftxt.getline(a, 80);
cout << a << endl;
}
break;
}
case '5':
{
fstream Pftxt(passagerfiletxt, ios::in);//以读方式打开
char c[80];
while (!Pftxt.eof())
{
Pftxt.getline(c, 80);
cout << c << endl;
}
break;
}
case '6':
{
fstream Wftxt(workerfiletxt, ios::in);//以读方式打开
char b[80];
while (!Wftxt.eof())
{
Wftxt.getline(b, 80);
cout << b << endl;
}
break;
}
case 'q':
break;
case 'Q':return; //退出操作,返回上一层菜单
default:cout << "错误操作,请重新选择\n"; break; //错误操作提示
}
}
}
void Workermanege(const char * ); //酒店员工管理函数
//workermanege.cpp
//员工管理
#include"hotel.h"
int total1 = 0;
void Workermanege(const char* workerfileDat)
{
worker wmark;
wmark.setdata("noName\0", 0, "Nopehonenumber\0", 0, 0, "Nonationality\0", 0, 0, 0); //空记录
worker worker1;
while (1)
{
cout << "****************宾馆员工管理****************\n"
<< "1、第一次录入员工\n"
<< "2、修改员工资料\n"
<< "3、录入新员工\n"
<< "4、员工查询\n"
<< "Q、返回上一层\n"
<< "请选择您要进行的操作:\n";
char choice;
cin >> choice;
switch (choice)
{
case '1':
{
fstream Wfdat1(workerfileDat, ios::out | ios::binary);//以写方式打开
if (!Wfdat1) //文件不存在
{
cout << "文件不存在,请执行初始化操作\n";
return;
}
Wfdat1.seekg(0, ios::beg);
Wfdat1.write((char*)&wmark, sizeof(worker));
Wfdat1.close();
fstream Wfdat2(workerfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
Wfdat2.seekg(0, ios::beg);
int Bool = 1;
do
{
Wfdat2.read((char*)&worker1, sizeof(worker)); //读一个记录
} while (!endmark3(worker1)); //判断是否结束标志
Wfdat2.seekp(-long(sizeof(worker)), ios::cur); //写指针位置
while (Bool == 1)
{
cout << "请输入员工英文名字:\n";
cin >> worker1.name;
cout << "请输入员工年龄:\n";
cin >> worker1.age;
cout << "请输入员工电话号码:\n";
cin >> worker1.phonenumber;
cout << "请输入员工性别(男为1,女为0):\n";
cin >> worker1.sex;
cout << "请输入员工薪水:\n";
cin >> worker1.salary;
cout << "请输入员工身份证号码:\n";
cin >> worker1.nationnality;
cout << "请输入员工开始工作的年(未租出用0年0月0日):\n";
cin >> worker1.begin.year;
cout << "月:\n";
cin >> worker1.begin.month;
cout << "日:\n";
cin >> worker1.begin.day;
Wfdat2.seekp(0, ios::cur);
Wfdat2.write((char*)&worker1, sizeof(worker));
total1++;
cout << "是否继续录入新的员工?(Y/N)\n";
char answer;
cin >> answer;
if (answer == 'Y' || answer == 'y')
{
Bool = 1;
}
else
{
Bool = 0;
Wfdat2.write((char*)&wmark, sizeof(worker));
}
}
break;
}
case '2':
{
fstream Wfdat(workerfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
if (!Wfdat) //文件不存在
{
cout << "文件不存在,请执行初始化操作\n";
return;
}
Wfdat.seekg(0, ios::beg); //文件读指针移到开始位置
string NAME;
cout << "请输入你需要更改员工的姓名:\n";
cin >> NAME;
do
{
Wfdat.read((char*)&worker1, sizeof(worker)); //读一个数据
} while (worker1.name != NAME && !endmark3(worker1)); //判断是否找到记录
if (worker1.name == NAME)
{
while (1)
{
cout << "1、员工年龄\n"
<< "2、员工手机号码\n"
<< "3、员工薪酬\n"
<< "4、员工身份证号码\n"
<< "5、员工开始工作的年\n"
<< "6、员工开始工作的月\n"
<< "7、员工开始工作的日\n"
<< "q、返回上一层\n"
<< "请输入你想修改的项目:\n";
char choice;
cin >> choice;
switch (choice)
{
case '1':
{
cout << "年龄修改为:\n";
cin >> worker1.age;
break;
}
case '2':
{
cout << "手机号码修改为:\n";
cin >> worker1.phonenumber;
break;
}
case '3':
{
cout << "薪酬修改为:\n";
cin >> worker1.salary;
break;
}
case '4':
{
cout << "身份证号码修改为:\n";
cin >> worker1.nationnality;
break;
}
case '5':
{
cout << "开始工作的年修改为:\n";
cin >> worker1.begin.year;
break;
}
case '6':
{
cout << "开始工作的月修改为:\n";
cin >> worker1.begin.month;
break;
}
case '7':
{
cout << "开始工作的日修改为:\n";
cin >> worker1.begin.day;
break;
}
case 'q':
case'Q':goto loop;
default:cout << "错误操作!"; break;
}
}
loop:
Wfdat.seekp(-long(sizeof(worker)), ios::cur);
Wfdat.write((char*)&worker1, sizeof(worker));
Wfdat.close();
}
else //找不到记录
cout << "错误ID,请重试!\n";
break;
}
case '3':
{
fstream Wfdat(workerfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
if (!Wfdat) //文件不存在
{
cout << "文件不存在,请执行初始化操作\n";
return;
}
int Bool = 1;
Wfdat.seekg(0, ios::beg);
do
{
Wfdat.read((char*)&worker1, sizeof(worker)); //读一个记录
} while (!endmark3(worker1)); //判断是否结束标志
Wfdat.seekp(-long(sizeof(worker)), ios::cur); //写指针位置
while (Bool == 1)
{
cout << "请输入员工英文名字:\n";
cin >> worker1.name;
cout << "请输入员工年龄:\n";
cin >> worker1.age;
cout << "请输入员工电话号码:\n";
cin >> worker1.phonenumber;
cout << "请输入员工性别(男为1,女为0):\n";
cin >> worker1.sex;
cout << "请输入员工薪水:\n";
cin >> worker1.salary;
cout << "请输入员工身份证号码:\n";
cin >> worker1.nationnality;
cout << "请输入员工开始工作的年(未租出用0年0月0日):\n";
cin >> worker1.begin.year;
cout << "月:\n";
cin >> worker1.begin.month;
cout << "日:\n";
cin >> worker1.begin.day;
Wfdat.seekp(0, ios::cur);
Wfdat.write((char*)&worker1, sizeof(worker));
total1++;
cout << "是否继续录入新的员工?(Y/N)\n";
char answer;
cin >> answer;
if (answer == 'Y' || answer == 'y')
{
Bool = 1;
}
else
{
Bool = 0;
Wfdat.write((char*)&wmark, sizeof(worker));
}
}
Wfdat.close();
break;
}
case '4':
{
fstream Wfdat(workerfileDat, ios::in | ios::binary);//以读方式打开
if (!Wfdat) //文件不存在
{
cout << "文件不存在,请执行初始化操作\n";
return;
}
Wfdat.seekp(0, ios::beg); //2进制数据文件读指针移到文件头
cout << "请输入你想查询的员工的姓名:\n";
string NAME;
cin >> NAME;
do
{
Wfdat.read((char*)&worker1, sizeof(worker)); //读一个数据
} while (worker1.name != NAME && !endmark3(worker1)); //判断是否找到记录
if (worker1.name == NAME)
{
cout << "****************This is the information of\t" << NAME << "****************\n"
<< "姓名:\t"
<< "年龄:\t"
<< "手机:\t"
<< "性别:\t"
<< "薪酬:\t"
<< "身份证:\t"
<< "年:\t"
<< "月:\t"
<< "日:\n"
<< worker1.name << '\t'
<< worker1.age << '\t'
<< worker1.phonenumber << '\t'
<< worker1.sex << '\t'
<< worker1.salary << '\t'
<< worker1.nationnality << '\t'
<< worker1.begin.year << '\t'
<< worker1.begin.month << '\t'
<< worker1.begin.day << '\n';
}
else //找不到记录
{
cout << "错误ID!\n";
}
Wfdat.close();
break;
}
case 'q':
break;
case 'Q':
return; //退出操作,返回上一层菜单
default:cout << "错误操作,请重新选择\n"; break; //错误操作提示
}
}
}
void Passagermanege(const char *,const char *);//酒店旅客管理函数
//passager.cpp
//房间登入操作
#include"hotel.h"
int total2 = 0;
void Passagermanege(const char* passagerfileDat, const char* hotelfileDat)
{
cout << "*************旅客住房登记*************\n";
fstream Pfdat(passagerfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
int Bool = 1;
total2++;
passager passager1;
passager pmark;
hotelroom room1;
pmark.setdata("noName\0", 0, "Nonation\0", 0, "Nonationality\0", 0, "Nopehonenumber\0", 0, 0); //空记录
Pfdat.seekg(0, ios::beg);
do
{
Pfdat.read((char*)&passager1, sizeof(passager)); //读一个记录
} while (!endmark2(passager1)); //判断是否结束标志
Pfdat.seekp(-long(sizeof(passager)), ios::cur); //写指针位置
cout << "请输入旅客的英文名字:\n";
cin >> passager1.name;
cout << "请输入旅客的年龄:\n";
cin >> passager1.age;
cout << "请输入旅客的国籍:\n";
cin >> passager1.nation;
cout << "请输入旅客的性别(1表示男,0表示女):\n";
cin >> passager1.sex;
cout << "请输入旅客的身份证号码:\n";
cin >> passager1.nationnality;
cout << "请输入旅客所住的天数:\n";
cin >> passager1.days;
cout << "请输入的电话号码:\n";
cin >> passager1.phonenumber;
cout << "请输入旅客所住房间的ID:\n";
cin >> passager1.id;
fstream Hfdat(hotelfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
loop:
Hfdat.seekg(0, ios::beg); //文件读指针移到开始位置
do
{
Hfdat.read((char*)&room1, sizeof(hotelroom)); //读一个数据
} while (room1.ID != passager1.id && !endmark1(room1)); //判断是否找到记录
if (room1.ID == passager1.id)
{
passager1.money = room1.money * passager1.days;
room1.days = passager1.days;
room1.passagername = passager1.name;
room1.state = 1;
cout << "请登记今天的时间:\n"
<< "年:\n";
cin >> room1.begin.year;
cout << "月:\n";
cin >> room1.begin.month;
cout << "日:\n";
cin >> room1.begin.day;
}
else //找不到ID提示
{
cout << "错误ID,请重新输入:\n";
cin >> passager1.id;
goto loop;
}
Pfdat.seekp(0, ios::cur);
Pfdat.write((char*)&passager1, sizeof(passager));
Pfdat.write((char*)&pmark, sizeof(passager));
Hfdat.seekp(-long(sizeof(hotelroom)), ios::cur);
Hfdat.write((char*)&room1, sizeof(hotelroom));
Hfdat.close();
Pfdat.close();
}
void search(const char *); //房间资料查询函数
//search.cpp
//房间资料查询
#include"hotel.h"
void search(const char* hotelfileDat)
{
hotelroom room1;
while (1)
{
cout << "**************宾馆房间查询**************\n"
<< "1、按ID查找\n"
<< "2、查询未住人的房间\n"
<< "Q、返回上一层\n"
<< "请选择操作:\n";
char choice;
cin >> choice;
switch (choice)
{
case '1':
{
fstream Hfdat(hotelfileDat, ios::in | ios::binary);//以读方式打开
Hfdat.seekp(0, ios::beg); //2进制数据文件读指针移到文件头
cout << "请输入你想查询的ID号:\n";
int id;
cin >> id;
do
{
Hfdat.read((char*)&room1, sizeof(hotelroom)); //读一个数据
} while (room1.ID != id && !endmark1(room1)); //判断是否找到记录
if (room1.ID == id)
{
cout << "****************This is the information of ID" << id << "****************\n"
<< "ID:\t"
<< "租金:\t"
<< "天数:\t"
<< "起始年:\t"
<< "月:\t"
<< "日:\t"
<< "状态:\t"
<< "旅客:\n"
<< room1.ID << '\t'
<< room1.money << '\t'
<< room1.days << '\t'
<< room1.begin.year << '\t'
<< room1.begin.month << '\t'
<< room1.begin.day << '\t'
<< room1.state << '\t'
<< room1.passagername << '\n';
}
else //找不到记录
cout << "错误ID,请重试!\n";
Hfdat.close();
break;
}
case '2':
{
int number = 0; //记录未出租房间的总数
cout << "These rooms are empty:\n";
fstream Hfdat(hotelfileDat, ios::in | ios::binary);//以读方式打开
Hfdat.seekp(0, ios::beg); //2进制数据文件读指针移到文件头
do
{
Hfdat.read((char*)&room1, sizeof(hotelroom)); //读一个数据
if (room1.state == 0 && !endmark1(room1))
{
number++;
cout << room1.ID << '\t';
}
} while (!endmark1(room1)); //判断是否到达文件尾
if (number == 0)
{
cout << "No room is empty!\n";
}
cout << '\n';
break;
}
case 'q':
break;
case 'Q':return; //退出操作,返回上一层菜单
default:cout << "错误操作,请重新选择\n"; break; //错误操作提示
}
}
}
void checkout(const char *,const char *);//退房函数
//checkout.cpp
//旅客退房操作
#include"hotel.h"
void checkout(const char* hotelfileDat, const char* passagerfileDat)
{
fstream Pfdat(passagerfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
fstream Hfdat(hotelfileDat, ios::in | ios::out | ios::binary);//以读、写方式打开
if (!Hfdat)
{
cout << "文件没有找到!请进行初始化功能!\n";
} //文本没有找到提示
if (!Pfdat)
{
cout << "文件没有找到!请进行初始化功能!\n";
} //文本没有找到提示
hotelroom room1;
passager passager1;
cout << "请输入房间的ID号:\n";
int iD;
loop:
cin >> iD;
Hfdat.seekg(0, ios::beg); //文件读指针移到开始位置
do
{
Hfdat.read((char*)&room1, sizeof(hotelroom)); //读一个数据
} while (room1.ID != iD && !endmark1(room1)); //判断是否找到记录
if (room1.ID == iD)
{
room1.days = 0;
room1.passagername = "noname";
room1.state = 0;
room1.begin.year = 0;
room1.begin.month = 0;
room1.begin.day = 0;
Hfdat.seekp(-long(sizeof(hotelroom)), ios::cur);
Hfdat.write((char*)&room1, sizeof(hotelroom));
}
else
{
cout << "错误ID,请重新输入:\n";
goto loop;
}
Hfdat.close();
const char* passagerfiletxt = "E:\\passagerFile.txt";//旅客管理文本数据文件
fstream Pftxt(passagerfiletxt, ios::out);//以写方式打开
Pfdat.seekp(0, ios::beg); //2进制数据文件读指针移到文件头
Pftxt << "****************This is a file of passager****************\n"
<< "姓名:\t"
<< "年龄:\t"
<< "国籍:\t"
<< "性别:\t"
<< "身份证:\t"
<< "天数:\t"
<< "电话:\t"
<< "租金:\t"
<< "ID:\n";
do
{
Pfdat.read((char*)&passager1, sizeof(passager)); //读一个记录
if (passager1.id != iD)
{
Pftxt << passager1.name << '\t'
<< passager1.age << '\t'
<< passager1.nation << '\t'
<< passager1.sex << '\t'
<< passager1.nationnality << '\t'
<< passager1.days << '\t'
<< passager1.phonenumber << '\t'
<< passager1.money << '\t'
<< passager1.id << '\n';
}
} while (!endmark2(passager1)); //判断是否结束标志
Pftxt.close();
fstream Pftxt2(passagerfiletxt, ios::in);//以读方式打开
Pfdat.seekg(0, ios::beg); //2进制数据文件写指针移到文件头
char a[80], b[80];
Pftxt2.getline(a, 80);
Pftxt2.getline(b, 80);
while (Pftxt2 >> passager1.name
>> passager1.age
>> passager1.nation
>> passager1.sex
>> passager1.nationnality
>> passager1.days
>> passager1.phonenumber
>> passager1.money
>> passager1.id
)
{
Pfdat.write((char*)&passager1, sizeof(passager)); //写一个记录
}
Pftxt2.close();
Pfdat.close();
}
void Psearch(const char *);//旅客信息查询
//Psearch.cpp
//旅客信息查询
#include"hotel.h"
void Psearch(const char* passagerfileDat)
{
fstream Pfdat(passagerfileDat, ios::in | ios::binary);//以读方式打开
Pfdat.seekp(0, ios::beg); //2进制数据文件读指针移到文件头
cout << "请输入你想查询的游客的姓名:\n";
string NAME;
passager passager1;
cin >> NAME;
do
{
Pfdat.read((char*)&passager1, sizeof(passager)); //读一个数据
} while (passager1.name != NAME && !endmark2(passager1)); //判断是否找到记录
if (passager1.name == NAME)
{
cout << "****************This is the information of\t" << NAME << "****************\n"
<< "姓名:\t"
<< "年龄:\t"
<< "国籍:\t"
<< "性别:\t"
<< "身份证:\t"
<< "天数:\t"
<< "电话:\t"
<< "租金:\t"
<< "ID:\n"
<< passager1.name << '\t'
<< passager1.age << '\t'
<< passager1.nation << '\t'
<< passager1.sex << '\t'
<< passager1.nationnality << '\t'
<< passager1.days << '\t'
<< passager1.phonenumber << '\t'
<< passager1.money << '\t'
<< passager1.id << '\n';
}
else //找不到记录
cout << "错误ID,请重试!\n";
Pfdat.close();
}
extern int total; //全局变量记录房间的总数
extern int total1; //全局变量记录员工的总数
extern int total2; //全局变量记录旅客的总数
int endmark2(passager); //判断是否到达文件尾
//endmark2.cpp
//判断是否录入空白纪录
#include"hotel.h"
int endmark2(passager people)
{
if (people.age == 0)
return 1;
return 0;
}
int endmark1(hotelroom); //判断是否到达文件尾
//endmark1.cpp
//判断是否录入空白纪录
#include"hotel.h"
int endmark1(hotelroom room)
{
if (room.ID == 0)
return 1;
return 0;
}
int endmark3(worker); //判断是否到达文件尾
//判断是否录入空白纪录
#include"hotel.h"
int endmark3(worker worker1)
{
if (worker1.age == 0)
return 1;
return 0;
}
1.4 测试结果
创建新房间
创建新员工
查询空房间
登记旅客信息
将二进制文件转化txt文件
查看txt文件
查询旅客信息
对应的外部文件查询
2.结论与心得
结论:
设计一个宾馆客房管理系统需要考虑多个功能需求,包括客房信息录入、客人入住登记、客房信息浏览、客人退房结算等。此外,进阶需求还包括打折促销等活动。为了存储相关数据,结论:
设计一个宾馆客房管理系统需要考虑多个功能需求,包括客房信息录入、客人入住登记、客房信息浏览、客人退房结算等。此外,进阶需求还包括打折促销等活动。为了存储相关数据,可以使用外部文件进行读取和写入操作。
在实现系统时,需要创建一个房间类来管理客房信息,并设计合适的属性和方法来记录和操作相关数据。使用外部文件进行数据存储可以确保数据的持久性,并方便系统的维护和扩展。
心得:
设计一个宾馆客房管理系统是一个综合性的任务,需要综合考虑多个功能和需求,并根据实际情况进行灵活的设计和实现。在开发过程中,合理的代码组织和模块化设计可以提高代码的可读性和可维护性。同时,良好的用户交互和错误处理机制能够提升系统的用户体验。
此外,进阶需求的添加可以为系统增添更多的特色和功能,例如打折促销等活动可以吸引更多客人入住。在实现这些功能时,需要考虑算法和业务逻辑的设计,以及与用户的有效沟通。
总之,设计和实现一个宾馆客房管理系统是一项有挑战性的任务,但通过合理的规划和设计,可以开发出高效、可靠且用户友好的系统,提升宾馆管理的效率和服务质量。