一、功能描述
本项目为“酒店客房管理系统”,实现了对酒店的客房信息进行管理,主要功能包括:
- 酒店初始化
(1) 初始化管理员账号密码
(2) 初始化操作员账号密码
(3) 初始化酒店客房信息
- 管理员管理
(1) 管理员登录
(2) 查看、增加、删除、修改操作员信息
(3) 操作员信息写入文件
(4) 查看、修改酒店客房信息
(5) 酒店客房信息写入文件
- 操作员管理
(1) 查看客房信息
(2) 客房的预订
(3) 客房的入住
(4) 客房的退房
(5) 预订查询(根据房号和姓名查询预订信息)
(6) 客房查询(根据房号查询房间信息)
(7) 住客查询(根据姓名查询住客信息)
(8) 操作员工作日志写入文件
二、设计与实现
1. 模块结构图及各模块的功能
模块结构图如下:
本酒店客房管理系统有两个模块:管理员模块和操作员模块。
管理员模块的功能有:
- 管理员登录:根据输入账号密码登录进入管理员权限
操作员管理
- 查看操作员信息
- 增加操作员信息
- 删除操作员信息
- 修改操作员信息
酒店客房管理
- 查看酒店客房信息
- 修改酒店客房信息
操作员模块的功能有:
- 操作员登录:根据输入账号密码登录进入操作员权限
- 查看客房信息
- 客房的预订
- 客房的入住
- 客房的退房
- 预订查询:根据房号和姓名查询预订信息
- 客房查询:根据房号查询房间信息
- 住客查询:根据姓名查询住客信息
2. 数据类型的设计和说明
函数调用关系
Room类
Room类的数据类型如下:
在本项目的设计中,Room是酒店客房的抽象,而Room数组是酒店的抽象。
友元函数RoomInit:进行酒店房间初始化。本项目初始化了20间客房的类型和价格,并将酒店客房信息保存在“酒店房间信息.xls”文件中。
Operator类
在本项目中,Operator是酒店操作员的抽象,并用一个Operator数组保存操作员信息。
友元函数OperatorInit():进行操作员信息的初始化。本项目初始化了10位操作员的账号和密码,并将酒店客房信息保存在“操作员账户信息.txt”文件中。
友元函数OperatorLogin():登录操作员账号。该函数传入Operator数组并返回登录操作员在数组的第几个元素。
成员函数WriteRoomInformation(Room*):将Room数组中的信息写入到“酒店房间信息.xls”文件中。该函数是一个辅助函数,当Room数组的信息进行修改时,将调用该函数修改文件相应内容。
实现操作员相应功能的成员函数如下:
- ViewRoomInformation(Room*):查看酒店客房的基本信息。该信息不包括住客的基本信息。
- ReserveRoom(Room*):预订客房。该函数打印空闲房间让用户选择、并输入用户的姓名、身份证号、联系方式等基本信息。
- CheckIn(Room*):入住房间。该函数先询问客户是否预订房间,若预订需对比信息才能入住,若未预订则打印空闲房间并输入个人信息实现入住。
- CheckOut(Room*):住客退房。该函数输入退房的房号并比对住客信息,如一致方可退房、将该房间的信息置空。
- RoomQuery(Room*):客房查询。输入查询房号可打印房间信息。
- BookQuery(Room*):预订查询。输入预订房号和姓名可查询预订信息。
- GuestQuery(Room*):住客查询。输入客户姓名可查询客户信息。
- OperatorQuit():操作员退出登录。返回主登录菜单或退出程序时将调用该函数。
以上操作员的所有操作均会保存在“操作员工作日志.xls”文件中。工作日志的时间由当前系统时间获得。
Administrator类
在本项目中,Administrator是酒店管理员的抽象。
构造函数Administrator():初始化管理员账号和密码。在本项目中,管理员账号和密码被初始化后不可在程序中进行修改。
友元函数OperatorLogin():登录管理员账号。该函数比对输入账号密码与管理员账号密码是否一致。
成员函数WriteOperatorInformation(Operator*):将Operator数组中的信息写入到“操作员账户信息.txt”文件中。该函数是一个辅助函数,当Operator数组的信息进行修改时,将调用该函数修改文件相应内容。
实现管理员相应功能的成员函数如下:
- ViewOperatorInformation(Operator*):查看所有操作员的账号、密码。
- AddOperatorInformation(Operator*):增加操作员信息。
- DeleteOperatorInformation(Operator*):删除操作员信息。
- ModifyOperatorInformation(Operator*):修改操作员信息。
- ViewRoomInformation(Room*):查看酒店所有客房的类型与价格。
- ModifyRoomInformation(Room*):修改酒店客房数量、类型和价格。修改后将酒店客房信息写入“酒店房间信息.xls”文件中。
3. 关键功能的实现
主函数
main函数流程图如下:
主函数中共有3个菜单界面:登录菜单界面、管理员菜单界面和操作员菜单界面。
登录菜单界面如下:
管理员菜单界面如下:
操作员菜单界面如下:
修改操作员信息
修改操作员信息的功能通过Administrator::ModifyOperatorInformation函数实现。
流程图如下:
实现源代码如下:
void Administrator::ModifyOperatorInformation(Operator* operators)
{
ViewOperatorInformation(operators);
int choose;
string UserName_,Password_;
cout<<"\t\t#请选择要修改的操作员信息的序号: ";
cin>>choose;
int num = choose;
for(int x=0;x<=choose;x++){
if(operators[x].UserName==""){
num++;
}
}
if(operators[num-1].UserName==""){
cout<<"\t\t#修改失败!该操作员不存在!"<>UserName_; operators[num-1].UserName=UserName_;
cout<<"\t\t#请输入修改操作员密码: ";
cin>>Password_; operators[num-1].Password=Password_;
WriteOperatorInformation(operators);
}
测试界面如下:
修改酒店客房信息
修改酒店客房信息的功能通过Administrator::ModifyRoomInformation函数实现。
流程图如下:
实现源代码如下:
void Administrator::ModifyRoomInformation(Room* room)
{
int StandardRoomNum, StandardRoomPrice;
int DoubleRoomNum, DoubleRoomPrice;
int SuiteRoomNum, SuiteRoomPrice;
cout<<"\t\t#由于本酒店客房有限,请确保输入房间总数≤20。"<>StandardRoomNum;
cout<<"\t\t#请输入标间价格: "; cin>>StandardRoomPrice;
cout<>DoubleRoomNum;
cout<<"\t\t#请输入双人间价格: "; cin>>DoubleRoomPrice;
cout<>SuiteRoomNum;
cout<<"\t\t#请输入套房价格: "; cin>>SuiteRoomPrice;
cout<20){
cout<<"\t\t#修改失败!您输入的房间个数超出本酒店的房间上限!请保证房间总数≤20!"<
测试界面如下:
酒店客房预订
酒店客房预订的功能通过Operator::ReserveRoom函数实现。
流程图如下:
实现源代码如下:
void Operator::ReserveRoom(Room* room)
{
int RoomNum_, x;
cout<<"\t\t可预订房间如下: "<>RoomNum_;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsBooked==false && room[x].IsChecked==false) break;
else {
cout<<"\t\t#预订失败!您选择的房间已被预订!"<>room[x].GuestName;
cout<<"\t\t#身份证号: "; cin>>room[x].GuestID;
cout<<"\t\t#联系方式: "; cin>>room[x].GuestTel;
time_t BookTime_;
time(&BookTime_);
room[x].BookTime = ctime(&BookTime_);
room[x].BookTime = room[x].BookTime.substr(0, room[x].BookTime.length() - 1);
room[x].IsBooked = true;
fstream file("操作员工作日志.xls",ios::app);
file<
测试界面如下:
酒店客房入住
酒店客房入住的功能通过Operator::CheckIn函数实现。
流程图如下:
实现源代码如下:
void Operator::CheckIn(Room* room)
{
char choose;
int RoomNum_, x;
string GuestName_, GuestID_;
cout<<"\t\t#您是否已预订了房间?(Y/N): ";
cin>>choose;
if(choose=='N'||choose=='n')
{
cout<<"\t\t#可入住房间如下: "<>RoomNum_;
int x;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsBooked==false && room[x].IsChecked==false) break;
else {
cout<<"\t\t#入住失败!您选择的房间已被预订!"<>room[x].GuestName;
cout<<"\t\t#身份证号: "; cin>>room[x].GuestID;
cout<<"\t\t#联系方式: "; cin>>room[x].GuestTel;
time_t CheckTime_;
time(&CheckTime_);
room[x].CheckInTime = ctime(&CheckTime_);
room[x].CheckInTime = room[x].CheckInTime.substr(0, room[x].CheckInTime.length() - 1);
room[x].IsChecked = true;
fstream file("操作员工作日志.xls",ios::app);
file<>RoomNum_;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsBooked==false){
cout<<"\t\t#入住失败!您选择的房间未被预订!"<>GuestName_;
cout<<"\t\t#身份证号: "; cin>>GuestID_;
if(room[x].GuestName!=GuestName_ || room[x].GuestID!=GuestID_){
cout<<"\t\t#入住失败!您输入的信息不匹配!"<
测试界面如下:
酒店客房退房
酒店客房退房的功能通过Operator::CheckOut函数实现。
流程图如下:
实现源代码如下:
void Operator::CheckOut(Room* room)
{
int RoomNum_, x;
cout<<"\t\t#请输入您退房的房号: "; cin>>RoomNum_;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsChecked==false){
cout<<"\t\t#退房失败!您选择的房间未入住!"<>GuestName_;
cout<<"\t\t#身份证号: "; cin>>GuestID_;
if(room[x].GuestName!=GuestName_ || room[x].GuestID!=GuestID_){
cout<<"\t\t#退房失败!您输入的信息不匹配!"<
测试界面如下:
三、课程设计总结
Pains
在设计本系统的过程中,我花费了很多时间和心思让该程序对用户更友好,努力设计使得程序更方便使用。在调试过程中我也遇到不少异常,包括由于编译器编码语言导致的程序运行异常,我查询多篇文章后将所有异常解决,最终完成了本课程设计。
在编写本设计报告的过程中,发现自己的程序中,结构化设计等方面仍有不足,对于实际问题的解决还可以进一步改进(如增加金额结算功能等)。在后续的程序设计中,我会对本项目进行完善,达到更优。
本程序设计花费了我不少心思,但是苦中有乐,我在编写程序的过程中获得了乐趣与满足感,也进一步加深了自己对于程序设计的思考,有很大收获。
Gains
通过本系统的设计,我提高了分析和解决实际问题的能力,巩固所学C++的知识,加强对结构化程序设计的思想。我全面系统地学习了面向对象程序设计的基本概念、基本语法和编程方法,独立完成了有一定工作量的程序设计任务,强调好的程序设计风格。
附录:设计代码
include
Room.h
#ifndef ROOM_H
#define ROOM_H
#include
#include
#include
#include
using namespace std;
class Room
{
public:
Room();
Room(int RoomNum_,string RoomType_,int RoomPrice_,bool IsBooked_,bool IsChecked_);
friend void RoomInit(Room* room);
friend class Administrator;
friend class Operator;
private:
int RoomNum;
string RoomType;
int RoomPrice;
bool IsBooked;
bool IsChecked;
string GuestName;
string GuestID;
string GuestTel;
string BookTime;
string CheckInTime;
};
#endif // ROOM_H
Operator.h
#ifndef OPERATOR_H
#define OPERATOR_H
#include "Room.h"
#include
#include
#include
#include
#include
using namespace std;
class Operator
{
public:
Operator();
string getUserName(){ return UserName; }
void ViewRoomInformation(Room*);
void WriteRoomInformation(Room*);
void ReserveRoom(Room*);
void CheckIn(Room*);
void CheckOut(Room*);
void RoomQuery(Room*);
void BookQuery(Room*);
void GuestQuery(Room*);
void OperatorQuit();
friend void OperatorInit(Operator* operators);
friend int OperatorLogin(Operator* operators);
friend class Administrator;
private:
string UserName;
string Password;
};
#endif // OPERATOR_H
Administrator.h
#ifndef ADMINISTRATOR_H
#define ADMINISTRATOR_H
#include "Room.h"
#include "Operator.h"
#include
class Administrator
{
public:
Administrator();
friend bool AdministratorLogin(Administrator);
void ViewOperatorInformation(Operator*);
void WriteOperatorInformation(Operator*);
void AddOperatorInformation(Operator*);
void DeleteOperatorInformation(Operator*);
void ModifyOperatorInformation(Operator*);
void ViewRoomInformation(Room*);
void ModifyRoomInformation(Room*);
private:
string UserName;
string Password;
};
#endif // ADMINISTRATOR_H
src
Room.cpp
#include "Room.h"
Room::Room()
{
RoomNum = 0;
RoomType = "NULL";
RoomPrice = 0;
IsBooked = false;
IsChecked = false;
GuestName = "NULL";
GuestID = "NULL";
GuestTel = "NULL";
BookTime = "NULL";
CheckInTime = "NULL";
}
Room::Room(int RoomNum_,string RoomType_,int RoomPrice_,bool IsBooked_,bool IsChecked_)
{
RoomNum = RoomNum_;
RoomType = RoomType_;
RoomPrice = RoomPrice_;
IsBooked = IsBooked_;
IsChecked = IsChecked_;
}
void RoomInit(Room* room)
{
int StandardRoomNum = 8;
int DoubleRoomNum = 7;
int SuiteRoomNum = 20 - StandardRoomNum - DoubleRoomNum;
int i[3]={1,0,1},k;
for(k=0; k<20; k++)
{
room[k].RoomNum=i[0]*100+i[1]*10+i[2];
switch(i[0])
{
case 1:{room[k].RoomPrice=150; room[k].RoomType="标间";break;}
case 2:{room[k].RoomPrice=250; room[k].RoomType="双人间";break;}
case 3:{room[k].RoomPrice=500; room[k].RoomType="套房";break;}
}
if( k==(StandardRoomNum-1) )
i[0]++,i[2]=0;
if( k==(DoubleRoomNum+StandardRoomNum-1) )
i[0]++,i[2]=0;
i[2]++;
}
fstream read("酒店房间信息.xls",ios::out);
read<<"房间号\t类型\t价格\t是否预订\t是否入住\t姓名\t身份证号\t联系方式\t预订时间\t入住时间"<
Operator.cpp
#include "Operator.h"
Operator::Operator()
{
UserName = "";
Password = "";
}
void OperatorInit(Operator* operators)
{
for(int k=0; k<10; k++)
{
operators[k].UserName = "zeng" + to_string(k);
operators[k].Password = "000" + to_string(k);
}
fstream read("操作员账户信息.txt",ios::out);
read<<"账号\t密码"<>UserName_;
cout<<"\t\t#请输入操作员密码: ";
cin>>Password_;
for(int i=0; i<20; i++)
{
if( UserName_==operators[i].UserName && Password_==operators[i].Password ){
time_t Time_;
string Time;
time(&Time_);
Time = ctime(&Time_);
Time = Time.substr(0, Time.length() - 1);
fstream file("操作员工作日志.xls",ios::app);
file<>RoomNum_;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsBooked==false && room[x].IsChecked==false) break;
else {
cout<<"\t\t#预订失败!您选择的房间已被预订!"<>room[x].GuestName;
cout<<"\t\t#身份证号: "; cin>>room[x].GuestID;
cout<<"\t\t#联系方式: "; cin>>room[x].GuestTel;
time_t BookTime_;
time(&BookTime_);
room[x].BookTime = ctime(&BookTime_);
room[x].BookTime = room[x].BookTime.substr(0, room[x].BookTime.length() - 1);
room[x].IsBooked = true;
fstream file("操作员工作日志.xls",ios::app);
file<>choose;
if(choose=='N'||choose=='n')
{
cout<<"\t\t#可入住房间如下: "<>RoomNum_;
int x;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsBooked==false && room[x].IsChecked==false) break;
else {
cout<<"\t\t#入住失败!您选择的房间已被预订!"<>room[x].GuestName;
cout<<"\t\t#身份证号: "; cin>>room[x].GuestID;
cout<<"\t\t#联系方式: "; cin>>room[x].GuestTel;
time_t CheckTime_;
time(&CheckTime_);
room[x].CheckInTime = ctime(&CheckTime_);
room[x].CheckInTime = room[x].CheckInTime.substr(0, room[x].CheckInTime.length() - 1);
room[x].IsChecked = true;
fstream file("操作员工作日志.xls",ios::app);
file<>RoomNum_;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsBooked==false){
cout<<"\t\t#入住失败!您选择的房间未被预订!"<>GuestName_;
cout<<"\t\t#身份证号: "; cin>>GuestID_;
if(room[x].GuestName!=GuestName_ || room[x].GuestID!=GuestID_){
cout<<"\t\t#入住失败!您输入的信息不匹配!"<>RoomNum_;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsChecked==false){
cout<<"\t\t#退房失败!您选择的房间未入住!"<>GuestName_;
cout<<"\t\t#身份证号: "; cin>>GuestID_;
if(room[x].GuestName!=GuestName_ || room[x].GuestID!=GuestID_){
cout<<"\t\t#退房失败!您输入的信息不匹配!"<>RoomNum_;
cout<<"\t\t#请输入您预订的姓名: "; cin>>GuestName_;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
if(room[x].IsBooked==false){
cout<<"\t\t#查询失败!您选择的房间未被预订!"<>RoomNum_;
for(x=0;x<20;x++){
if(room[x].RoomNum==RoomNum_){
break;
}
if(x==19){
cout<<"\t\t#查询失败!您选择的房间不存在!"<>GuestName_;
for(x=0;x<20;x++){
if(room[x].GuestName==GuestName_){
break;
}
if(x==19){
cout<<"\t\t#查询失败!您查询的客户不存在!"<
Administrator.cpp
#include "Administrator.h"
Administrator::Administrator()
{
UserName = "zsq";
Password = "000";
}
bool AdministratorLogin(Administrator a)
{
string UserName_,Password_;
cout<<"\t\t#请输入管理员账号: ";
cin>>UserName_;
cout<<"\t\t#请输入管理员密码: ";
cin>>Password_;
if( UserName_==a.UserName && Password_==a.Password )
return true;
else return false;
}
void Administrator::ViewOperatorInformation(Operator* operators)
{
int num = 0;
cout<<"\t\t序号\t账号\t密码"<>UserName_; operators[x].UserName=UserName_;
cout<<"\t\t#请输入新增操作员密码: ";
cin>>Password_; operators[x].Password=Password_;
WriteOperatorInformation(operators);
break;
}
}
}
void Administrator::DeleteOperatorInformation(Operator* operators)
{
ViewOperatorInformation(operators);
int choose;
cout<<"\t\t#请选择要删除的操作员信息的序号: ";
cin>>choose;
int num = choose;
for(int x=0;x>choose;
int num = choose;
for(int x=0;x<=choose;x++){
if(operators[x].UserName==""){
num++;
}
}
if(operators[num-1].UserName==""){
cout<<"\t\t#修改失败!该操作员不存在!"<>UserName_; operators[num-1].UserName=UserName_;
cout<<"\t\t#请输入修改操作员密码: ";
cin>>Password_; operators[num-1].Password=Password_;
WriteOperatorInformation(operators);
}
void Administrator::ViewRoomInformation(Room* room)
{
cout<<"\t\t房间号\t类型\t价格"<>StandardRoomNum;
cout<<"\t\t#请输入标间价格: "; cin>>StandardRoomPrice;
cout<>DoubleRoomNum;
cout<<"\t\t#请输入双人间价格: "; cin>>DoubleRoomPrice;
cout<>SuiteRoomNum;
cout<<"\t\t#请输入套房价格: "; cin>>SuiteRoomPrice;
cout<20){
cout<<"\t\t#修改失败!您输入的房间个数超出本酒店的房间上限!请保证房间总数≤20!"<
main.cpp
#include "Room.h"
#include "Administrator.h"
#include "Operator.h"
#include
#include
using namespace std;
int main()
{
int choose=0;
int flag;
int i;//操作员的序号
//房间初始化
Room room[20];
RoomInit(room);
//管理员初始化
Administrator a = Administrator();
//操作员初始化
Operator operators[20];
OperatorInit(operators);
while(true)
{
flag = 1;
system("cls");
cout<<"\t\t###################################"<>choose;
system("cls");
switch(choose)
{
case 1:
if( !AdministratorLogin(a) ){
cout<<"\t\t#登录失败!若忘记密码可【查看帮助】!"<>choose;
system("cls");
switch(choose)
{
case 1:
a.ViewOperatorInformation(operators);
system("pause");
break;
case 2:
a.AddOperatorInformation(operators);
break;
case 3:
a.DeleteOperatorInformation(operators);
break;
case 4:
a.ModifyOperatorInformation(operators);
break;
case 5:
a.ViewRoomInformation(room);
system("pause");
break;
case 6:
a.ModifyRoomInformation(room);
break;
case 7:
flag = 0; break;
default: break;
}
}
break;
case 2:
i=OperatorLogin(operators);
if( i<0 ){
cout<<"\t\t#登录失败!若忘记密码可【查看帮助】!"<>choose;
system("cls");
switch(choose)
{
case 1:
operators[i].ViewRoomInformation(room);
system("pause");
break;
case 2:
operators[i].ReserveRoom(room);
break;
case 3:
operators[i].CheckIn(room);
break;
case 4:
operators[i].CheckOut(room);
break;
case 5:
operators[i].BookQuery(room);
break;
case 6:
operators[i].RoomQuery(room);
break;
case 7:
operators[i].GuestQuery(room);
break;
case 8:
operators[i].OperatorQuit();
flag = 0; break;
case 9:
operators[i].OperatorQuit();
return 0;
default: break;
}
}
break;
case 3:
cout<<"\t\t#####################################################"<