♻️ 资源大小6.58MB➡️资源下载https://download.csdn.net/download/s1t16/87425305注更多内容可关注微信公众号【神仙别闹】如当前文章或代码侵犯了您的权益请私信作者删除1. 题目要求某酒店有客房若干间其中客房分为不同等级如豪华、标准、普通等客房床位数也不同。例如豪华套房有4个床位400元/晚标准客房2个床位200元/晚普通客房1个床位100元/晚。顾客分金卡会员、银卡会员、普通会员及非会员其享受的折扣不同。例如金卡会员可享受8折优惠银卡会员可享受9折优惠普通会员享受95折优惠非会员不享受优惠。当顾客连续入住多天时也可享受一定的折扣。例如当顾客连续入住24晚时可享受9折优惠连续入住58晚时可享受85折优惠连续入住9晚以上时可享受8折优惠。采用面向对象的思想建立系统中清晰的类分析和定义各个类每个类中要有各自的属性和方法并开发一套客房管理系统实现如下功能1 管理员以管理员身份登录系统查询当前客房入住及预订情况并设置客房价格、顾客优惠政策等2 酒店前台以前台身份登录系统查询当前客房入住及预订情况为顾客办理入住、退房、换房等服务顾客退房后为顾客计算消费金额并收费3 顾客可以注册和登录系统用户在查找到心仪的客房后登录酒店客房管理系统可提交订单实现客房预订未入住酒店前1天可取消客房预订顾客入住退房后可评论。2.题目分析分析题目之后我首先认为针对不同的登录对象至少要有三个类分别用于管理员酒店前台顾客的功能实现。还需要定义一个房间类房间类应该要有自己的属性表明他是什么样子的房间比如说是豪华的还是标准的还是普通的比如房间号房间是否住人了。然后分析题目得知管理员和酒店前台都应该有注册/登录的功能而顾客的注册时可以自己注册的酒店前台必须由管理员来注册。既然顾客和前台都有这样的功能那么不妨设置一个基类People让顾客和管理员都由此派生而来利用C继承的特性简化我们的代码。分析题目得知管理员和前台都能查询当前客房入住及预订情况所以我又定义了一个类Base_Admin用来实现这两个操作然后管理员和前台都继承自这个类这样就可以少些一点代码然后因为学习了数据库课程我知道还需要定义一个选择类其主码分别是客房号和顾客的名字这样可以用来存放顾客预定订单的信息。利用这个信息我们可以进行客房的管理系统的实现。同时因为有金卡会员/银卡会员有入住时间的优惠政策比如入住五天之后能打折还有客房的各种属性的设置比如各类型客房对应的床位所以我定义了三个Control类用于控制全局属性比如优惠政策而这三个类应该只有管理员类的方法能够访问。然后为了实现各项服务我最后定义了一个总类hotelsystem用于调用各个类的服务方法。然后我思考了我这个题目应该用几个文件还有哪些数据可以放在内存里哪些数据可以放在外村里。管理员只有一个那么他的账号和密码可以放在内存里。但是用户和前台有很多个如果放在内存里面的话每次程序结束之后这些数据就会消失了所以需要两个文件Custmor.txt和Reception.txt来存放这些数据。同时“选择”类用于存放顾客的选房间信息/订单信息必须放在外存里面这样才能永久保存这些选房信息我用了一个Select.txt来保存这些信息。但是房间本身是否被入住这些信息可以放在内存里面因为我们读入放在外存的Select.txt能够知道客房的信息。同时为了方便我定义了两个数组分别是room数组用于存放房间信息 还有vector类型的SC数组用于存放选房信息用于每次运行系统的时候把Select.txt 里的数据读进来到内存里面然后需要更新的时候我再把这些数据更新到Select.txt 这样可以提高我们处理信息的效率。我们还需要定义一个辅助类Date日期类因为选房的时候都要选择日期所以我索性定义这个辅助类然后把他的运算符都重载这样方便我们的写入日期。最后是全局变量/全局函数。我宏定义了每一个会员/房间类型所对应的模式代码比如豪华客房对应1普通客房对应2这种还有黄金会员对应3白银会员对应 2这种方便我们的书写。同时用于文件交互的函数我也定义了全局函数用于交互我们的Select.txt文件比如对选房信息更新删除查询这样方便我们的文件操作。最后我们还要有一个评论区所以要一个Remark.txt来记录我们的评论.3.类图设计以及类的说明各个类的类图表示如下我最后也画出了他们的关系图类名Date 辅助类用于表示日期intyear; //年intmonth; //月int _day;//日//这些函数用于构/析构还有查询年月日//这些函数用于运算符的重载房间类 Room 用于表示房间的各项属性Privatebool islived;//当前状态是否有人入住int roomtype;//房间的等级int roomnumber;//房间号与数组号码相一致int booked_sum;//已经预定该房间的人数string living_customer_name;//当前入住的房客的名字Room()//无参数构造函数用于初始化//以下是各类set/get方法void setroomnumber(int i)void setlived(bool islived)//用于设置房间是否已经入住void setroomtype(int roomtype)void setbooked_sum(int booked_sum)void setliving_customer_name(string name)int getroomtype()//得到房间的类型string getname()//以下是关键的方法bool check_room_state(Date start, Date end);//check_room_state用于检查目标房间的状态给定时间是否能被预定呢void display_to_admin() //向管理员展示void display_to_custmor()//向顾客展示People用于前台和顾客的注册String name//用户名String secret//密码People()//此构造函数用于注册virtual void display() 用于展示Custmor顾客类派生自peopleprotected: int VIP_MODE;//VIP情况默认为普通用户; int roomnumber;//用户预定的房间号 int is_ever_booked;//只有预定过的用户才能评论设置这个用户是否定过房间Custmor(string name, string secret, int Mode, int roomnumber)//构造函数1用于初始化Custmor():People() //构造函数2用于注册void setbooked(int i)//设置预定的情况void display();//用于展示void setVIP_MODE(int VIP)void remark()//用于记录评论//下面是选房用的函数void book_room(string name, int MODE, int roomnumber, Date start, Date end); //预定客房肯定要用到select类void custmor_book_room_io()//用于与用户交互会调用上面的book_room函数void canceled_io()//用于与用户交互退订void cancel_booked(int roomnumber);//具体的取消预订操作void write_custmor_to_file()//将用户信息写入文件将会调用全局函数void service()//对于用户的具体服务调用上面的某些方法Select(选房类用于记录选房信息)int roomnumber;//入住的房间号 string name;//预定的人的名字 int Mode;//会员记录 Date startdate;//预定起始时间 Date enddate;//预定结束时间 double money;//钱Select(string name,int MODE,int roomnumber,Date start,Date end)://构造函数double calculate_money();//算钱用的函数void display()//展示选房订单信息void addmoney(double money)//换房的时候用的加钱函数//一些get方法void write_to_file()//写入txt文件Base_admin用于扩展管理员和前台//无参数//查询客房的情况 void select_all_room_information()void select_all_booked_information()//查询预定情况void select_all_remark()//显示所有评论Reception(前台继承自People和Base_admin)NameSecret//都继承自peoplevoid write_to_file()//将账号密码写入文件Reception(string name, string secret) :People(name, secret)//此构造函数用于登录Reception() :People(),Base_admin()//此构造函数用于注册;void register_room(int roomnumber, string name)//登记入住void reject_room(int roomnumber)//退房退房前订单应该还在文件里面,只有退房的时候才把订单消掉void change_room(int oldnumber,int newnumber,Date endday)//换房的时候先退房然后重新注册void service()//具体服务用于调用上面的换房退房登记入住Admin继承自Base_Admin管理员类//无因为只有一个管理员而管理员默认密码已经指定void Denglu()//登录Admin():Base_admin() {};//构造函数void Register_Reception()//用于注册前台void set_VIP()//制定vip优惠政策void set_ROOM()//指定各个房间的类型void set_DAY()//指定入住多少天有多少优惠void setdate()//指定今天是几月几号void service()//面向管理员的服务调用上述函数HotelSystem_Service客房管理系统进入主函数之后调用此类用于实现各种管理操作//无内部属性但是类的成员函数内有局部变量写入外存之后能够永久保存,s使用一些局部变量聚合成此管理系统Custmor_Service()//顾客服务程序内有局部变量 顾客写入外存之后永久保存Admin_service() //管理员服务程序 Reception_service()//前台服务程序还有Room_control和VIP_control用于保存Room类型和VIP类型所对应的政策全局函数Day_control用于保存入住天数相关的优惠政策*全局变量如下*//宏定义VIP标识 \#define NONEVIP 0 \#define NORMAL 1 \#define SILVER 2 \#define GOLDEN 3 //宏定义客房型号标识 \#define LUXIOUSROOM 0 \#define STANDARDROOM 1 \#define NORMALROOM 2 using namespace std; int room_startnumber 0;//room数组的起始 int room_endnumber 100;//room数组的终结 int room_count;//room的数量 //VIP暗号用户答对暗号就是某个VIP用户 string gold_secret GOLD; string silver_secret SILVER; string normal_secret NORMAL; //类型声明 int todayyear2020; int todaymonth12; int todayday20;//默认今天的时间是2020年12月20日写代码的这一天 Room room[2000] // 内存中暂存的房间信息 VectorSelect Sc[2000] //内存中暂存的订单信息*全局函数如下*Select all_choose_Select_element(int roomnumber, string name)//select语句用于查询Select.txt中相关的roomnumber和name对应的相关信息 static void all_delete_room_from_file(int roomnumber, string name)//全局函数用于刷新Select.txt static bool all_check_room_state(Date start, Date end, int roomnumber)//全局函数用于检查是否该房间在该时间段内可以被预定本质是检查Select.txt 文件的相关信息 static void all_show_all_can_book_room(Date start, Date end)//全局函数用于显示Select.txt文件内的内容 Init默认初始化;*总体来说各个类之间的关系如下所示类图关系*最核心关系的类图是4.系统功能设计系统中最重要的是Custmor/Admin/Reception/Selects四个类的实现Custmor类中最关键的是预定订单与取消订单尤其是在前一天的时候就不能取消了而Admin类中最关键的是控制各项政策参数Reception中最重要的是登记入住退房结账还有换房而Select类中最关键的是与txt文件的交互实现内存与外存的交互其中最大的难点是计算结账价格结账价格我放在Select类中实现我们找到对应的用户的VIP模式和对应的各项房屋的价格然后将其相乘之后我们就能得到最后的价格还有一个很大的难点是换房换房的时候我们需要不断与txt文件交互并且加上之前用户的钱数因为换房的时候我们没有结账而最后的时候我们会结账所以换房的一大难点就是要保存之前的money然后加上新的money得到我们的钱数。5.流程设计与关键部分代码总体代码的流程图如下实验部分关键代码如下Custmor中的预定订单与取消订单void Custmor::book_room(string name, int MODE, int roomnumber, Date start, Date end) { int size SC[roomnumber].size(); Select temp Select(name, MODE, roomnumber,start,end); SC[roomnumber].push_back(temp); SC[roomnumber][size].write_to_file(); } void Custmor::cancel_booked(int roomnumber) { for (int i 0; i SC[roomnumber].size(); i) { if (SC[roomnumber][i].getname() name) { if (Today - SC[roomnumber][i].getstart() 1) { //前一天之前可以退房//注意当前时间需要全局变量 SC[roomnumber].erase(SC[roomnumber].begin() i); //SC[roomnumber].pop_back();//在内存中删除 all_delete_room_from_file(roomnumber, name);//在外存中删除 cout 删除预定订单成功 endl; break; } else { cout 这个房间现在不能退了太晚了 endl; } } } }Select类中计算钱如下double Select::calculate_money()//算预定之后要花的钱 { int roomtype room[roomnumber].getroomtype(); double room_money all_room-getMoney(roomtype); double Date_money_zhekou Day_control_get(enddate - startdate); double VIP_zhekou all_vip-VIP_zhekou(Mode); int days enddate - startdate; double money room_money * days * VIP_zhekou * Date_money_zhekou; return money; }Reception类中的换房退房登记入住void register_room(int roomnumber, string name) { room[roomnumber].setlived(true); room[roomnumber].setliving_customer_name(name); cout 前台手续已经办理成功 endl; } void reject_room(int roomnumber)//退房前订单应该还在文件里面,只有退房的时候才把订单消掉 { string name room[roomnumber].getname(); for (int i 0; i SC[roomnumber].size(); i) { if (SC[roomnumber][i].getname() name) { cout 应该付钱 SC[roomnumber][i].getmoney() endl; SC[roomnumber].erase(SC[roomnumber].begin() i); //在内存中删除 all_delete_room_from_file(roomnumber, name);//在外存中删除 cout 成功退房 endl; string real_name_in_file, real_secret_in_file; int real_mode_in_file; int real_room_in_file; //下面进行更改用户状态 } } } //换房的时候最麻烦要考虑多一点 void change_room(int oldnumber,int newnumber,Date endday)//换房的时候先退房然后重新注册 { int roomnumber oldnumber; int Mode 0; cout 您现在正在切换房间 endl; string name room[roomnumber].getname(); cout 您正在为 name 办理切换房间服务 endl; double money 0;//切换房间的时候要先记录原来的价格。 for (int i 0; i SC[roomnumber].size(); i) { if (SC[roomnumber][i].getname() name) { money SC[roomnumber][i].getmoney(); Mode SC[roomnumber][i].getmode(); SC[roomnumber].erase(SC[roomnumber].begin() i); //在内存中删除 all_delete_room_from_file(roomnumber, name);//在外存中删除 cout 成功退房 endl; break; } } register_room(newnumber, name); //下面要刷新内存和外存的订单状态. Select S(name,Mode,newnumber,Today,endday); S.addmoney(money);//把原来的钱要加上 cout 正在写入新的订单和新的房间状态 endl; SC[newnumber].push_back(S); SC[newnumber][SC[newnumber].size() - 1].write_to_file(); cout 换房成功 endl; }6.实验结果演示实验部分截图如下登录界面如下以顾客的身份注册了用户下面是预定客房的操作并且显示各可选的客房信息观察我们的外村我们看到了qwqw顾客的注册信息和选房信息显示顾客的订单情况下面是取消订单此时可以看到我们的外存里面已经没有了顾客qeqe的选房信息然后是对前台的操作我们首先打开Reception.txt我们看到里面已经有了两个前台用户和密码我选择WW用户开始登录登录成功进行查看订单的状态这与我们Select.txt文件中一致下面办理入住和退房的实验可以看到我们成功办理了入住手续然后查看房间状态显示房间1已经被入住了然后我们退房的时候看到了结算金额其中100元/天的普通客房金卡会员用了50块钱我们可以查看用户的评论然后我们可以进行换房实验,我们看到用户qwe预定了20号客房总共花钱490然后我们进行换房实验换到29号客房现在我们再次查询订单情况的时候已经显示了他的截止日期是12月30号然后换到了29号房间下面进入管理员实验管理员默认sa密码123456如下图所示我们可以设置政策我们也可以注册前台这时候进入Reception.txt我们可以看到有这个前台了可以登录看到登录成功综上所述我们的功能现在全部实现了7.问题以及解决在本次实验中我也遇到了不少问题首先是有一次txt文件里面明明已经写了但是里面什么都没有后来我知道了是没有把文件关掉导致了这个后果的发生这提醒我一定要及时关闭文件第二个问题是在切换房间的时候我一开始想当然地认为切换房间只要先退房再注册就好了但是后面发现退房之后money变成0 了而我们换房的时候money应该是保持原来的值然后加上来所以这里面出现了bug最后我也解决了这提醒我写代码要注意逻辑的仔细第三个问题是我一开始设置Select类的时候没有写money以为money可以算出来结果最后发现不行计算量太大了先算money比较好最后还有一个感受就是这一次我没有用数据库而学了数据库课程之后我深深地感受到了数据库的重要性如果我这次使用数据库的话应该能简化很多操作但是我这次使用的是文件输入输出数据库没有使用所以造成了不少冗余的代码。综上所述这一次oop大作业磨练了我的代码能力还有软件开发能力让我对软件的开发以及实践的重要性有了更加深刻的了解所以这是一次非常有意义的课课程实验做完之后我感受到了很大的成就感。