面向对象程序设计实验报告 by coolwx

 

西安电子科技大学

面向对象程序设计

(2020年度)

 

 

实验名称: 酒店客房管理系统

班 级: 1803012

姓 名: 曹王欣

学 号: 18030100167

 

 

      写在前面的话,本报告已经开源:

     https://github.com/coolwx/oop_xdu

 

  1. 题目要求

    某酒店有客房若干间,其中客房分为不同等级,如豪华、标准、普通等,客房床位数也不同。例如,豪华套房有4个床位,400元/晚;标准客房2个床位,200元/晚;普通客房1个床位,100元/晚。

    顾客分金卡会员、银卡会员、普通会员及非会员,其享受的折扣不同。例如,金卡会员可享受8折优惠,银卡会员可享受9折优惠,普通会员享受95折优惠,非会员不享受优惠。

    当顾客连续入住多天时,也可享受一定的折扣。例如,当顾客连续入住2~4晚时,可享受9折优惠;连续入住5~8晚时,可享受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 (辅助类,用于表示日期)

    int _year; //年

    int _month; //月

    int _day;//日

    //这些函数用于构/析构,还有查询年月日

    //这些函数用于运算符的重载

     

     

     

    房间类 Room (用于表示房间的各项属性)

    Private:

    bool 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(顾客类,派生自people)

    protected:

        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)

    Name

    Secret//都继承自people

    void 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 todayyear=2020;

    int todaymonth=12;

    int todayday=20;//默认今天的时间是2020年12月20日(写代码的这一天)

    Room room[2000] // 内存中暂存的房间信息

    Vector<Select> 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. 流程设计与关键部分代码

    总体代码的流程图如下:

     

     

    实验部分关键代码如下:
    1. 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大作业磨练了我的代码能力还有软件开发能力,让我对软件的开发以及实践的重要性有了更加深刻的了解,所以这是一次非常有意义的课课程实验,做完之后我感受到了很大的成就感。

  8. (附录)实验完整代码如下

    #include <cstdio>

    #include <iostream>

    #include <fstream>

    #include <string>

    #include <algorithm>

    #include <cstring>

    #include <utility>

    #include <vector>

    //宏定义,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 todayyear=2020;

    int todaymonth=12;

    int todayday=20;

    class Select_control;

    class Date;

    class Custmor;

    class Room;

    class People;

    //全局函数

    static void all_show_all_can_book_room(Date start, Date end);

    static bool all_check_room_state(Date start, Date end, int roomnumber);

    static void all_delete_room_from_file(int roomnumber, string name);

    void query_VIP(int mode)//查询VIP对应的状态

    {

        if (mode == GOLDEN)

            cout << "金卡" << endl;

        if (mode == SILVER)

            cout << "银卡" << endl;

        if (mode == NORMAL)

            cout << "普通用户" << endl;

        if (mode == NONEVIP)

            cout << "不是VIP" << endl;

    }

    void query_ROOMMODE(int mode)

    {

        if (mode == LUXIOUSROOM)

            cout << "豪华套房" << endl;

        if (mode == STANDARDROOM)

            cout << "标准客房" << endl;

        if (mode == NORMALROOM)

            cout << "普通客房" << endl;

    }

    class VIP_control

    {

    protected:

        double noneVIP;//无会员折扣

        double normalVIP;//普通会员折扣

        double silverVIP;//银卡会员折扣

        double goldenVIP;//金卡会员折扣

    public:

        VIP_control()//管理员用于初始化,正好构造函数里面

        {

            cout << "管理员,您正在设置VIP折扣状态" << endl;

            cout << "请输入金卡的折扣(以大于0小于1的折扣表示)"<< endl;

            while (1)

            {

                cin >> goldenVIP;

                if (goldenVIP > 0 && goldenVIP < 1)

                    break;

                else

                    cout << "折扣不对,请重新输入" << endl;

            }

            cout << "请输入银卡的折扣(以大于0小于1的折扣表示)" << endl;

            while (1)

            {

                cin >> silverVIP;

                if (silverVIP > 0 && silverVIP < 1)

                    break;

                else

                    cout << "折扣不对,请重新输入" << endl;

            }

            cout << "请输入普通会员的折扣(以大于0小于1的折扣表示)" << endl;

            while (1)

            {

                cin >> normalVIP;

                if (normalVIP > 0 && normalVIP < 1)

                    break;

                else

                    cout << "折扣不对,请重新输入" << endl;

            }

            noneVIP = 1;

        }

        VIP_control(double a)//用于初始化的构造函数,用于默认初始化

        {

            goldenVIP = 0.5;

            silverVIP = 0.7;

            normalVIP = 0.9;

            noneVIP = 1;

        }

        double VIP_zhekou(int MODE)//返回折扣

        {

            if (MODE == NONEVIP)

                return noneVIP;

            else if (MODE == NORMAL)

                return normalVIP;

            else if (MODE == SILVER)

                return silverVIP;

            else if (MODE == GOLDEN)

                return goldenVIP;

        }

    };

    class ROOM_control

    {

    protected:

        int normalroom_bed;//普通客房床位

        double normalroom_money;//普通客房money

        int standardroom_bed;//标准客房床位

        double standardroom_money;//标准客房money

        int luxiousroom_bed;//豪华客房床位

        double luxiousroom_money;//豪华客房money

    public:

        ROOM_control()//无参的构造函数用于管理员控制

        {

            cout << "管理员,您正在设置房间的各项参数" << endl;

            cout << "请输入普通客房床位" << endl;

            cin >> normalroom_bed;

            cout << "请输入普通客房价格" << endl;

            cin >> normalroom_money;

            cout << "请输入标准客房床位" << endl;

            cin >> standardroom_bed;

            cout << "请输入标准客房价格" << endl;

            cin >> standardroom_money;

            cout << "请输入豪华客房床位" << endl;

            cin >> luxiousroom_bed;

            cout << "请输入豪华客房价格" << endl;

            cin >> luxiousroom_money;

            cout << "谢谢您,现在已经设置完毕了" << endl;

        }

        ROOM_control(int i)//用于默认初始化

        {

            normalroom_bed=4;//普通客房床位

            normalroom_money=100;//普通客房money

            standardroom_bed=2;//标准客房床位

            standardroom_money=200;//标准客房money

            luxiousroom_bed=1;//豪华客房床位

            luxiousroom_money=100;//豪华客房money

        }

        double getMoney(int MODE)

        {

            if (MODE == NORMALROOM)

                return normalroom_money;

            else if (MODE == STANDARDROOM)

                return standardroom_money;

            else if (MODE == LUXIOUSROOM)

                return luxiousroom_money;

        }

        int getBed(int MODE)

        {

            if (MODE == NORMALROOM)

                return normalroom_bed;

            else if (MODE == STANDARDROOM)

                return standardroom_bed;

            else if (MODE == LUXIOUSROOM)

                return luxiousroom_bed;

        }

    };

    //这里使用过程化的设计,全局函数,用于设置天数的折扣

    double Day_control[10] = { 1,1,1,1,1,1,1,1,1,1 };

    void Day_control_set()

    {

        cout << "管理员,您正在设置用户入住天数相关的折扣" << endl;

        for (int i = 1; i <= 8; i++)

        {

            cout << "请输入,用户入住" << i << "天后,享受折扣" << endl;

            cin >> Day_control[i];

     

        }

        cout << "请输入入住9天及之后,用户的享受折扣" << endl;

        cin >> Day_control[9];

    }

    double Day_control_get(int day)

    {

        if (day <= 9)

            return Day_control[day];

        else

            return Day_control[9];

    }

    class Date

    {

    public:

        Date()//默认日期为今天(今天默认为(2020年12月20号(写代码的这一天))

        {

            _year = todayyear;

            _month =todaymonth;

            _day = todayday;

        }

        Date(int year, int month, int day)//构造函数

        {

            if (year > 0 && month > 0 && month < 13 && day>0 && day <= GetMonthDay(year, month))

            {

                _year = year;

                _month = month;

                _day = day;

            }

            else

            {

                cout << "error!" << endl;

            }

        }

        int getyear()

        {

            return _year;

        }

        int getmonth()

        {

            return _month;

        }

        int getday()

        {

            return _day;

        }

        ~Date()//析构函数

        {}

        Date(const Date& d)//拷贝构造函数

        {

            _year = d._year;

            _month = d._month;

            _day = d._day;

        }

        Date& operator=(const Date& d)//赋值运算符重载

        {

            if (this != &d)

            {

                _year = d._year;

                _month = d._month;

                _day = d._day;

            }

            return *this;

        }

        //运算符重载== != > >= < <=

        bool operator==(const Date& d) const

        {

            return _year == d._year &&

                _month == d._month &&

                _day == d._day;

        }

        bool operator!=(const Date& d) const

        {

            return !(*this == d);

        }

        bool operator>(const Date& d)

        {

            return ((_year > d._year) || \

                (_year == d._year && _month > d._month) || \

                (_year == d._year && _month == d._month && _day > d._day));

        }

        bool operator>=(const Date& d)

        {

            return (*this > d) || (*this == d);

        }

        bool operator<(const Date& d)

        {

            return !(*this >= d);

        }

        bool operator<=(const Date& d)

        {

            return !(*this > d);

        }

        //前置++、--后置++、--

        Date& operator++()

        {

            *this += 1;

            return *this;

        }

        Date operator++(int)

        {

            Date temp = (*this);

            *this += 1;

            return temp;

        }

        Date& operator--()

        {

            *this -= 1;

            return *this;

        }

        Date operator--(int)

        {

            Date temp = (*this);

            *this -= 1;

            return temp;

        }

     

        //计算一年的天数

        int GetMonthDay(int year, int month)

        {

            static int GetMonthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

            //如果是平年,2月是29天

            if ((month == 2) && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))

            {

                return 29;

            }

            return GetMonthDay[month];

        }

        //日期和天数的加减

        Date operator+(int day)

        {

            Date temp(*this);

            temp += day;

            return temp;

        }

        Date operator-(int day)

        {

            Date temp(*this);

            temp -= day;

            return temp;

        }

        Date& operator+=(int day)

        {

            if (day < 0)

            {

                return *this -= -day;

            }

            _day += day;

            while (_day > GetMonthDay(_year, _month))

            {

                _day -= GetMonthDay(_year, _month);

                _month++;

                if (_month > 12)

                {

                    _year++;

                    _month = 1;

                }

            }

            return *this;

        }

        Date& operator -= (int day)

        {

            if (day < 0)

            {

                return *this += (-day);

            }

            _day -= day;

            while (_day <= 0)

            {

                _month--;

                if (_month == 0)

                {

                    _year--;

                    _month = 12;

                }

                _day += GetMonthDay(_year, _month);

            }

            return *this;

        }

        //日期-日期

        int operator-(const Date& d)

        {

            int flag = 1;

            int day = 0;

            Date max = *this;

            Date min = d;

            if (*this < d)

            {

                max = d;

                min = *this;

                flag = -1;

            }

            //小的日期一直++,加到和大的日期一样时,加了多少天就差多少次

            while (min != max)

            {

                min++;

                day++;

            }

            return day * flag;

        }

     

        void display()

        {

            cout << _year << "--" << _month << "--" << _day << endl;

        }

    private:

        int _year;

        int _month;

        int _day;

    };

    class Room {

    private:

        bool islived;//当前状态是否有人入住

        int roomtype;//房间的等级

        int roomnumber;//房间号,与数组号码相一致

        int booked_sum;//已经预定该房间的人数

        string living_customer_name;//当前入住的房客的名字

    public:

        Room()//无参数构造函数,用于初始化

        {

            islived = false;

            roomtype = 2;

            roomnumber = 0;

            booked_sum = 0;

            living_customer_name = "";

        }

        void setroomnumber(int i)

        {

            roomnumber = i;

        }

        void setlived(bool islived)//用于设置房间是否已经入住

        {

            this->islived = islived;

        }

        void setroomtype(int roomtype)

        {

            this->roomtype = roomtype;

        }

        void setbooked_sum(int booked_sum)

        {

            this->booked_sum = booked_sum;

        }

        void setliving_customer_name(string name)

        {

            living_customer_name = name;

        }

        int getroomtype()//得到房间的类型

        {

            return roomtype;

        }

        string getname()

        {

            return living_customer_name;

        }

        bool check_room_state(Date start, Date end);//check_room_state用于检查目标房间的状态(给定时间,是否能被预定呢)

        void display_to_custmor()

        {

            cout << "具体信息如下:" << endl;

            cout << "房间号" << roomnumber << endl;

            query_ROOMMODE(roomtype);

            

        }

        void display_to_admin()

        {

            cout << "具体信息如下:" << endl;

            cout << "房间号" << roomnumber << endl;

            query_ROOMMODE(roomtype);

            if (islived)

            {

                cout << "已经入住,房客的名字是" << endl;

                cout << living_customer_name << endl;

            }

            else {

                cout << "没有人入住" << endl;

            }

        }

    };

    VIP_control* all_vip;

    ROOM_control* all_room;

    Date Today;

    Room room[2000];

    //基类,用于注册(既然每次注册都要输入用户名和密码,那就索性构造基类的时候就输好了)

    class People {

    protected:

        string name;

        string secret;

    public:

        People(string _name,string _secret):name(_name),secret(_secret)

        {

            cout << "登录成功" << endl;

        }//构造函数2,用于登录

        People()//此构造函数用于注册

        {

            string tmpname;

            string tmpsecret;

            string tmpcorrect;//第二次输入

            cout << "您正在注册,请输入用户名:" << endl;

            cin >> tmpname;

            while (1)

            {

            cout << "请输入您要设置的密码" << endl;

            cin >> tmpsecret;

            cout << "请您确认密码" << endl;

            cin >> tmpcorrect;

            if (tmpcorrect != tmpsecret)

            {

                cout << "前后密码不一致,重新输入" << endl;

            }

            else

                break;

            }

            this->name = tmpname;

            this->secret = tmpsecret;

        }

        virtual void display()

        {

            cout << "用户名:" << name << endl;

            cout << "密码:" << secret << endl;

        }

        string getname()

        {

            return name;

        }

    };

    class Custmor :public People {

    public:

        Custmor(string name, string secret, int Mode, int roomnumber):People(name,secret)

        {

            this->roomnumber = roomnumber;

            this->VIP_MODE = Mode;

            is_ever_booked = 0;

        }

        

        Custmor():People() //继承自people,注册

        {

            is_ever_booked = 0;

            roomnumber = 0;//默认不会预定房间(0是无效的房间号)

            cout << "请输入VIP暗号,答对暗号你就是VIP用户" << endl;

            string x;

            cin >> x;

            if (x == gold_secret)

            {

                cout << "金卡用户" << endl;

                VIP_MODE = GOLDEN;

            }

            else if (x == silver_secret)

            {

                cout << "银卡用户" << endl;

                VIP_MODE = SILVER;

            }

            else if (x == normal_secret)

            {

                cout << "普通vip" << endl;

                VIP_MODE = NORMAL;

            }

            else

            {

                cout << "不是VIP" << endl;

                VIP_MODE = 0;

            }

     

        }

        void setbooked(int i)

        {

            is_ever_booked = i;

        }

        void display();

        void setVIP_MODE(int VIP)

        {

            VIP_MODE = VIP;

        }

        void remark()

        {

            if (is_ever_booked)

            {

                cout << "输入评论:" << endl;

                string temp;

                cin >> temp;

                ofstream putfile("remark.txt", ios::app);

                if (!putfile)

                    cout << "文件损坏" << endl;

                else

                {

                    putfile << temp << endl;

                }

            }

            else

            {

                cout << "您还未入住,不能评论" << endl;

            }

            

        }

        void book_room(string name, int MODE, int roomnumber, Date start, Date end);

        //预定客房,肯定要用到select类

        void custmor_book_room_io()//用于与用户交互,会调用上面的book_room函数

        {

            while (1)

            {

                  

                int _year, _month, _day;

                cout << "请输入您预定客房的起始住宿年月日" << endl;

                cout << "输入年" << endl;

                cin >> _year;

                cout << "输入月" << endl;

                cin >> _month;

                cout << "输入日" << endl;

                cin >> _day;

                Date start(_year, _month, _day);

                cout << "请输入您预定客房的结束住宿年月日" << endl;

                cout << "输入年" << endl;

                cin >> _year;

                cout << "输入月" << endl;

                cin >> _month;

                cout << "输入日" << endl;

                cin >> _day;

                Date end(_year, _month, _day);

                all_show_all_can_book_room(start, end);

                int _room;

                cout << "输入房间号" << endl;

                cin >> _room;

                bool istrue = room[_room].check_room_state(start, end);

                //需要检查状态

                if (end > start && (istrue))

                {

                    book_room(name, VIP_MODE, _room, start, end);

                    roomnumber = _room;//订好的房间号

                    is_ever_booked = 1;

                    cout << "预定成功" << endl;

                    break;

                }

                else

                {

                    cout << "您输入的日期有错,或者该房间在此时间段内已经被预定" << endl;

                    cout << "重新输入" << endl;

                }

            }

     

        }

        void canceled_io()//用于与用户交互,取消订单

        {

            if (roomnumber == 0)

            {

                cout << "你还没预定房间" << endl;

            }

            else

            {

                cout << "正在取消您的预定" << endl;

                cancel_booked(roomnumber);

                cout << "操作结束" << endl;

            }

        }

        void cancel_booked(int roomnumber);

        void write_custmor_to_file()

        {

            cout << "现在将顾客数据写入文件" << endl;

            ofstream outfile("custmor.txt", ios::app);

            if (!outfile)

            {

                cout << "打开文件失败" << endl;

            }

            else

            {

                outfile << name << " " << secret << " " << VIP_MODE << " " << roomnumber <<" "<<is_ever_booked<<endl;

                cout << "已经成功写入文件" << endl;

            }

            outfile.close();

        }

        void service()

        {

            cout << "\n你已经登录成功,下面选择您所需要的服务" << endl;

            cout << "如果你想要预定房间,请按1" << endl;

            cout << "如果你要取消预定的房间,请输入2" << endl;

            cout << "如果你想要显示当前用户信息,请输入3" << endl;

            cout << "如果您想要评论那么请按4" << endl;

            cout << "如果你想要退出,请按5" << endl;

            while (1)

            {

                int x;

                cin >> x;

                if (x == 1)

                {

                    custmor_book_room_io();

                }

                if (x == 2)

                {

                    canceled_io();

                }

                if (x == 3)

                {

                    display();

                }

                if (x == 4)

                {

                    remark();

                }

                if (x == 5)

                {

                    break;

                }

            }

        }

     

    protected:

        int VIP_MODE;//VIP情况,默认为普通用户;

        int roomnumber;

        int is_ever_booked;//退房时设置此参数为1

    };

     

    class Select//用于记录预定记录

    {

    protected:

        int roomnumber;//入住的房间号

        string name;//预定的人的名字

        int Mode;//会员记录

        Date startdate;//预定起始时间

        Date enddate;//预定结束时间

        double money;//钱

    public:

        //构造函数

        double calculate_money();//算钱用的

        Select(string name,int MODE,int roomnumber,Date start,Date end):

            startdate(start),enddate(end)

        {

            this->roomnumber = roomnumber;

            this->Mode = MODE;

            this->name = name;

            money = calculate_money();

        }

        void setmoney(double money)

        {

            this->money = money;

        }

        double getmoney()

        {

            return money;

        }

        void display()

        {

            cout << "用户名:" << name << endl;

            cout << "VIP模式标识:" << Mode << endl;

            cout << "预定的房间号:" << roomnumber << endl;

            cout << "起始入住时间" << endl;

            startdate.display();

            cout << "结束入住时间" << endl;

            enddate.display();

        }

        void addmoney(double money)

        {

            this->money += money;

        }

        void write_to_file()

        {

            ofstream outfile("Select.txt", ios::app);

            if (!outfile)

            {

                cout << "文件损毁,此系统需要维修" << endl;

     

            }

            else

            {

                outfile << roomnumber << " " << name << " " << Mode<< " " << startdate.getyear() << " " <<

                    startdate.getmonth() << " " << startdate.getday() << " " << enddate.getyear() << " " <<

                    enddate.getmonth() << " " << enddate.getday() <<" "<<money<< endl;

            }

            outfile.close();

        }

        Date getstart()

        {

            return startdate;

        }

        Date getend()

        {

            return enddate;

        }

        int getmode()

        {

            return Mode;

        }

        string getname()

        {

            return name;

        }

        int getroomnumber()

        {

            return roomnumber;

        }

    };

    //用于记录所有用户的入住的vector

    vector<Select> SC[2000];// SC的vector将记录所有的选择房间状态;

     

     

    //下面实现用到select数组的方法

    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();

    }

     

    static void all_show_all_can_book_room(Date start, Date end)

        {

            for (int i = room_startnumber; i <= room_endnumber; i++)

            {

                if (room[i].check_room_state(start, end))

                {

                    cout << "房间号是" << i << "在这个时间段可以被预定" << endl;

                    room[i].display_to_custmor();

                }

            }

        }

    static bool all_check_room_state(Date start, Date end, int roomnumber)

        {

            int temp_room_number = roomnumber;

            for (int i = 0; i < SC[roomnumber].size(); i++)

            {

                if ((SC[roomnumber][i].getstart() > end || SC[roomnumber][i].getend() < start))

                {

                    continue;

                }

                else

                {

                    return false;

                }

            }

            return true;

        }

    static void all_delete_room_from_file(int roomnumber, string name)

        {

        ofstream outfile("Select.txt", ios::out);//清空文件

        outfile.close();

            

        for (int i = room_startnumber; i <= room_endnumber; i++)

                 {

                    for (int j = 0; j < SC[i].size(); i++)

                    {

                        SC[i][j].write_to_file();

                    }

                }

            

        }

    bool Room::check_room_state(Date start, Date end)

    {    

        return all_check_room_state(start,end,this->roomnumber);

    }

    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;

    }

    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 all_choose_Select_element(int roomnumber, string name)//select语句

    {

        for (int i = 0; i < SC[roomnumber].size(); i++)

        {

            if (roomnumber == SC[roomnumber][i].getroomnumber() && name == SC[roomnumber][i].getname())

            {

                return SC[roomnumber][i];

            }

        }

    }

     

    void init()//默认初始化

    {

        for (int i = room_startnumber; i <= room_endnumber; i++)

        {

            room[i].setroomnumber(i);//把房间号给初始化了

     

        }

        ifstream infile("Select.txt", ios::in);

        if (!infile)

            cout << "文件系统损坏" << endl;

        int roomnumber, Mode, startyear, startmonth, startday, endyear, endmonth, endday;

        double money;

        string name;

        while (infile >> roomnumber >> name >> Mode >> startyear >> startmonth >> startday >> endyear >> endmonth >> endday>>money)

        {

            Select S(name, Mode,roomnumber, Date(startyear, startmonth, startday), Date(endyear, endmonth, endday));

            S.setmoney(money);

            SC[roomnumber].push_back(S);

        }

        infile.close();

        cout << "在默认初始化之中,豪华房间400元/天,标准套房200元/天,普通套房100元/天" << endl;

        cout << "在默认初始化之中,没有设置天数折扣" << endl;

        cout << "在默认初始化中,我们认为金卡5折,银卡7折,普通会员9折,不是会员不打折" << endl;

    }

    void Custmor::display()

    {

        cout << "用户名:\n" << name << endl;

        cout << "密码:\n" << secret << endl;

        cout << "VIP用户情况:" << endl;

        query_VIP(VIP_MODE);

        cout << "您的订单情况如下所示:\n" << endl;

        if (roomnumber == 0)

        {

            cout << "没预定客房" << endl;

        }

        else

        {

            cout << "预定的客房是" << roomnumber << endl;

            Select SC_element = all_choose_Select_element(roomnumber, name);//在内存里面选出来

            double all_money = SC_element.calculate_money();

            cout << "你定的客房预期花钱是" << all_money << endl;

        }

        

    }

    //基类(用于扩展管理员和前台)

    class Base_admin {

    public:

        //查询客房的情况

        void select_all_room_information()

        {

            for (int i = room_startnumber; i <= room_endnumber; ++i)

            {

                room[i].display_to_admin();

            }

        }

        void select_all_booked_information()//查询预定情况

        {

            cout << "所有预定订单如下" << endl;

            for (int i = room_startnumber; i <= room_endnumber; i++)

            {

                for (int j = 0; j < SC[i].size(); i++)

                {

                    cout << "----------------------------分割线—————————————————————" << endl;

                    SC[i][j].display();

                }

            }

        }

        void select_all_remark()//显示所有评论

        {

            cout << "所有评论如下" << endl;

            string temp;

            ifstream inputfile("remark.txt", ios::in);

            while (inputfile >> temp)

                cout << temp<<endl;

            inputfile.close();

        }

    };

    class Reception :public People,public Base_admin

    {

    public:

        //注册

        //登记

        //退房+结账

        //换房

        void write_to_file()//将账号密码写入文件

        {

            ofstream outputfile("reception.txt", ios::app);

            if (!outputfile)

                cout << "文件系统损毁" << endl;

            else

            {

                outputfile << name << " " << secret << endl;

            }

            outputfile.close();

        }

        Reception(string name, string secret) :People(name, secret)//此构造函数用于登录

        {

            

        }

        Reception() :People(),Base_admin()

        {

            write_to_file();

            cout << "注册成功" << endl;

            //此构造函数用于注册;

        }

        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;

        }

        void service()

        {

            while (1)

            {

                cout << "前台,前选择您的服务" << endl;

                cout << "想要查询所有房间的状态,请按1" << endl;

                cout << "想要查询所有订单的状态,请按2" << endl;

                cout << "想要办理入住登记,请按3" << endl;

                cout << "想要办理退房结账,请按4" << endl;

                cout << "想要换房服务,请按5" << endl;

                cout << "输出所有评论,那就按6" << endl;

                cout << "按7键退出" << endl;

                int x;

                cin >> x;

                if (x == 1)

                {

                    select_all_room_information();

                }

                if (x == 2)

                {

                    select_all_booked_information();

                }

                if (x == 3)

                {

                    cout << "正在办理入住" << endl;

                    cout << "输入房间号" << endl;

                    int roomnumber;

                    string name;

                    cin >> roomnumber ;

                    cout << "输入客人的名字" << endl;

                    cin >> name;

                    register_room(roomnumber, name);

     

                }

                if (x == 4)

                {

                    cout << "退房服务,输入要退房的房号" << endl;

                    int roomnumber;

                    cin >> roomnumber;

                    reject_room(roomnumber);

                }

                if (x == 5)

                {

                    cout << "正在换房" << endl;

                    cout << "请注意,换房时,您将不能享受之前的优惠政策,将重新计算您的最终结账" << endl;

                    cout << "输入原来的房间号" << endl;

                    int oldnumber, newnumber;

                    cin >> oldnumber;

                    cout << "输入后来的房间号" << endl;

                    cin >> newnumber;

                    cout << "从今天起,请输入这位客人想要换房的结束日期" << endl;

                    int year, month, day;

                    cout << "输入年" << endl;

                    cin >> year;

                    cout << "输入月" << endl;

                    cin >> month;

                    cout << "输入日" << endl;

                    cin >> day;

                    Date D(year, month, day);

                    change_room(oldnumber, newnumber, D);

     

                }

                if (x == 6)

                {

                    select_all_remark();

                }

                if (x == 7)

                    break;

            }

        }

        

    };

    string admin_name = "sa";

    string admin_secret = "123456";

    class Admin :public Base_admin

    {

    public:

        Admin():Base_admin() {};

        void Denglu()//登录

        {

            while (1)

            {

     

                string name;

                string secret;

                cout << "正在登录管理员账号" << endl;

                cout << "输入用户名" << endl;

                cin >> name;

                cout << "输入密码" << endl;

                cin >> secret;

                if (name == admin_name && secret == admin_secret)

                {

                    cout << "登录成功" << endl;

                    break;

                }

                else

                {

                    cout << "登陆失败" << endl;

                }

            }

        }

        void Register_Reception()

        {

            cout << "管理员,您现在进入的是前台注册环节" << endl;

            Reception R;//构造函数,用于注册新前台

        }

        void set_VIP()

        {

            cout << "现在进入VIP折扣管理程序" << endl;

            all_vip = new VIP_control();

        }

        void set_ROOM()

        {

            cout << "现在进入房间管理程序" << endl;

            all_room = new ROOM_control();

        }

        void set_DAY()

        {

            cout << "现在进入入住天数优惠的管理程序" << endl;

            Day_control_set();

        }

        void set_Room_all()

        {

            cout << "请输入房间号" << endl;

            int number;

            cin >> number;

            cout << "请输入房间类型,豪华套房输入0,标准套房输入1,普通房间输入2" << endl;

            int tmp;

            cin >> tmp;

            room[number].setroomtype(tmp);

        }

        void setdate()

        {

            cout << "输入今天的年月日" << endl;

            cout << "输入年" << endl;

            cin >> todayyear;

            cout << "输入月" << endl;

            cin >> todaymonth;

            cout << "输入日" << endl;

            cin >> todayday;

            cout << "success" << endl;

        }

        void service()

        {

              

            while (1)

            {

                cout << "如果想要查询所有房间情况,请按1" << endl;

                cout << "如果想要查询所有订单情况,请按2" << endl;

                cout << "如果想要注册前台,请按3" << endl;

                cout << "如果想要设置VIP会员政策,请按4" << endl;

                cout << "如果想要设置房间的价格,请按5" << endl;

                cout << "如果想要设置具体房间的类型,请按6" << endl;

                cout << "按7输出所有评论" << endl;

                cout << "按8设置今天的日期" << endl;

                cout << "按9退出" << endl;

                int tmp;

                cin >> tmp;

                if (tmp == 1)

                    select_all_room_information();

                if (tmp == 2)

                    select_all_booked_information();

                if (tmp == 3)

                    Register_Reception();

                if (tmp == 4)

                    set_VIP();

                if (tmp == 5)

                    set_ROOM();

                if (tmp == 6)

                    set_Room_all();

                if (tmp == 7)

                    select_all_remark();

                if (tmp == 8)

                    setdate();

                if (tmp == 9)

                    break;

            }

        }

    };

    class HotelSystem_Service

    {

    public:

        void Custmor_Service()

        {

            cout << "您现在的身份是:顾客" << endl;

            cout << "如果想要注册并且登录酒店管理系统,请输入1" << endl;

            cout << "如果想要直接登录酒店管理系统,请输入2" << endl;

            int tmp;

            cin >> tmp;

            if (tmp == 1)

            {

                Custmor newcustmor;

                cout << "注册成功" << endl;

                newcustmor.write_custmor_to_file();

                newcustmor.service();

            }

            else if (tmp == 2)

            {

                string real_name_in_file;

                string real_secret_in_file;

                int real_mode_in_file;

                int real_room_in_file;

                int is_everbooked=0;

                cout << "请输入用户名" << endl;

                string username;

                cin >> username;

                cout << "请输入密码" << endl;

                string secret;

                cin >> secret;

                ifstream infile("custmor.txt", ios::in);

                if (!infile)

                {

                    cout << "文件管理系统有误,现在系统不能使用" << endl;

                }

                else

                {

                    int flag = 0;

                    while (infile >> real_name_in_file >> real_secret_in_file >> real_mode_in_file >> real_room_in_file >> is_everbooked)

                    {

                        if (real_name_in_file == username && real_secret_in_file == secret)

                        {

                            flag = 1;

                            Custmor newcustmor(real_name_in_file, real_secret_in_file, real_mode_in_file, real_room_in_file);

                            newcustmor.setbooked(is_everbooked);

                            newcustmor.service();

                            break;

                        }

                    }

                    if (!flag)

                    {

                        cout << "用户名和密码错误" << endl;

                    }

                }

                infile.close();

            }

              

        

        }

        void Admin_service()

        {

            cout << "您现在的身份是管理员" << endl;

            Admin A;

            A.Denglu();

            A.service();

        }

        void Reception_service()

        {

            cout << "您现在的身份是前台" << endl;

            cout << "请先登录" << endl;

              

            string name;

            string secret;

            int flag = 0;

                ifstream inputfile("Reception.txt", ios::in);

                cout << "请输入前台用户名" << endl;

                cin >> name;

                cout << "请输入密码" << endl;

                cin >> secret;

                string realname, realsecret;

                while (inputfile >> realname >> realsecret)

                {

                    if (name == realname && secret == realsecret)

                    {

                        cout << "登录成功" << endl;

                        flag = 1;

                        break;

                    }

                  

                }

                if (flag)

                {

                    Reception R(name, secret);

                    cout << "开始前台服务" << endl;

                    R.service();

     

                }

                else

                {

                    cout << "登录失败" << endl;

                }

        }

    };

    //管理员需要设置政策

    int main()

    {

        //下面用于默认初始化

        VIP_control vv(1);

        all_vip = &vv;

        ROOM_control rr(1);

        all_room = &rr;

     

        cout << "欢迎来到酒店信息管理系统,这是曹王欣,学号18030100167开发的" << endl;

        init();

        cout << "------------默认初始化已经完成------------" << endl;

        

        HotelSystem_Service H;

        while (1)

        {

            cout << "如果是管理员,请输入1" << endl;

            cout << "如果是前台,输入2" << endl;

            cout << "如果是顾客请输入3" << endl;

            cout << "按4退出" << endl;

            int x;

            cin >> x;

            if (x == 1)

            {

                H.Admin_service();

            }

            if (x == 2)

            {

                H.Reception_service();

            }

            if (x == 3)

            {

                H.Custmor_Service();

            }

        }

    }

posted @ 2021-01-23 00:04  coolwx  阅读(553)  评论(0编辑  收藏  举报