宾馆客房管理系统(C++)

1. 宾馆客房管理系统

1.1 问题描述

题目描述:设计一个宾馆客房管理系统,以菜单方式工作。

功能需求:

(1) 设计一个房间类 Room,记录的客房信息包括客房号、客房类型、客

房价格、空闲情况、客人姓名、客人身份证号、入住时间、退房时间,预付费

用等信息。

(2) 客房信息的录入功能。

(3) 客人入住登记。

(4) 客房信息浏览功能,浏览全部客房的信息。支持按照空房、姓名、身

份证号、房间号查询。

(5) 客人退房结算。

(6) 使用外部文件存储相关数据。

进阶:考虑打折促销等活动。

1.2 解题思路

根据题目描述,设计一个宾馆客房管理系统可以遵循以下解题思路:

  1. 创建一个房间类 Room,包含以下属性:
    • 客房号
    • 客房类型
    • 客房价格
    • 空闲情况
    • 客人姓名
    • 客人身份证号
    • 入住时间
    • 退房时间
    • 预付费用
  2. 实现客房信息录入功能:
    • 从用户输入获取房间相关信息。
    • 将录入的信息存储到外部文件中。
  3. 实现客人入住登记功能:
    • 从用户输入获取客人相关信息。
    • 根据用户选择的客房号,更新对应房间的空闲情况、客人信息和入住时间。
    • 将更新后的信息存储到外部文件中。
  4. 实现客房信息浏览功能:
    • 从外部文件中读取全部客房信息。
    • 根据用户选择的查询方式(空房、姓名、身份证号、房间号),筛选并展示符合条件的客房信息。
  5. 实现客人退房结算功能:
    • 从用户输入获取客房号。
    • 根据客房号查询对应房间的信息。
    • 计算客房费用,并展示给用户。
    • 更新房间的空闲情况、客人信息和退房时间。
    • 将更新后的信息存储到外部文件中。
  6. 对于进阶需求,可以考虑添加打折促销等活动:
    • 设计活动类,包含活动名称、折扣比例等属性。
    • 在客房结算时,根据活动情况计算折扣后的费用。
  7. 使用外部文件存储相关数据:
    • 可以使用文本文件或二进制文件存储客房信息和客人信息。
    • 提供读取和写入文件的功能,用于存取系统数据。
  8. 设计菜单方式工作:
    • 创建一个菜单,展示系统功能选项。
    • 根据用户选择的选项,调用相应的功能函数。

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); //判断是否到达文件尾

//endmark3.cpp

//判断是否录入空白纪录

#include"hotel.h"

int endmark3(worker worker1)

{

    if (worker1.age == 0)

        return 1;

    return 0;

}

1.4 测试结果

创建新房间

创建新员工

查询空房间

登记旅客信息

将二进制文件转化txt文件

查看txt文件

查询旅客信息

对应的外部文件查询

2.结论与心得

结论:

        设计一个宾馆客房管理系统需要考虑多个功能需求,包括客房信息录入、客人入住登记、客房信息浏览、客人退房结算等。此外,进阶需求还包括打折促销等活动。为了存储相关数据,结论:

设计一个宾馆客房管理系统需要考虑多个功能需求,包括客房信息录入、客人入住登记、客房信息浏览、客人退房结算等。此外,进阶需求还包括打折促销等活动。为了存储相关数据,可以使用外部文件进行读取和写入操作。

在实现系统时,需要创建一个房间类来管理客房信息,并设计合适的属性和方法来记录和操作相关数据。使用外部文件进行数据存储可以确保数据的持久性,并方便系统的维护和扩展。

心得:

        设计一个宾馆客房管理系统是一个综合性的任务,需要综合考虑多个功能和需求,并根据实际情况进行灵活的设计和实现。在开发过程中,合理的代码组织和模块化设计可以提高代码的可读性和可维护性。同时,良好的用户交互和错误处理机制能够提升系统的用户体验。

此外,进阶需求的添加可以为系统增添更多的特色和功能,例如打折促销等活动可以吸引更多客人入住。在实现这些功能时,需要考虑算法和业务逻辑的设计,以及与用户的有效沟通。

总之,设计和实现一个宾馆客房管理系统是一项有挑战性的任务,但通过合理的规划和设计,可以开发出高效、可靠且用户友好的系统,提升宾馆管理的效率和服务质量。

数据结构实验》实验题目 实验一 客房管理(链表实验) 实现功能:采用结构化程序设计思想,编程实现客房管理程序的各个功能函数,从而熟练掌握单链表的创建、输出、查找、修改、插入、删除、排序和复杂综合应用等操作的算法实现。以带表头结点的单链表为存储结构,实现如下客房管理的设计要求。 实验机时:8 设计要求: #include #include #include //定义客房链表结点结构 typedef struct HNode { char roomN[7]; //客房名称 float Price; //标准价格 float PriceL; //入住价格(默认值=标准价格*80%) int Beds; //床位数Beds char State[5]; //入住状态(值域:"空闲"、"入住"、"预订",默认值为"空闲") struct HNode *next; //指针域 }Hotel, *HLink; (1)实现创建客房信息链表函数void Build(HLink &H),输入(客房名称、标准价格、床位数),同时修改入住价格、入住状态为默认值,即入住价格=标准价格*80%,入住状态为”空闲”(提示:用strcpy()字符串拷贝函数)。为了提高程序调试效率,要求:用文件操作来输入客房信息客房名称、标准价格、床位数); (2)实现输出客房信息函数void Exp(HLink H),输出所有客房客房名称、标准价格、入住价格、床位数、入住状态; (3)函数int Find(HLink &H, char *roomN),查找房间名称为roomN的客房。如果找到,则返回该客房在链表中的位置序(>=1),否则返回0。提示:用strcmp()字符串比较函数; (4)实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state。提示:用strcpy()字符串拷贝函数; (5)函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%; (6)求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除; (7)函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法; (8)函数void ReverseN2(HLink &H),将单链表的正中间位置结点之后的全部结点倒置的功能,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法; (9)函数void SortPriceL(HLink &H),按照客房(入住价格,客房名称)升序排序; (10)函数void upBed(HLink &H,int beds),创建一个【床位数为beds的新结点】(还需输入:客房名称、标准价格等信息),使链表的形态为:【头结点】->【床位数>beds的结点】->【床位数为beds的新结点】->【床位数=1则输出该客房在链表中的位置序,否则输出该客房不存在;输出(4)~(10)处理后的链表内容,其中(6)还要输出入住价格最高的客房信息。 可能用到的函数: 从文件中读取客房数据:fscanf(文件指针,"%s %f,%d",p->roomN,&p->Price,&p->Beds); 输出客房数据:printf("%s%8.1f%8.1f%6d%8s\n",p->roomN,p->Price,p->PriceL,p->Beds,p->State); 字符串赋值函数:char* strcpy(char *, const char *); 字符串比较函数:int strcmp(const char *, const char *) 实验二 串模式匹配算法(串实验) 实现功能:从主串中第K个字符起,求出子串在主串中首次出现的位置,即模式匹配或串匹配。要求用三种模式匹配算法分别实现: 朴素的模式匹配算法(BF算法) KMP改进算法(Next[ ]) KMP改进算法(NextVal[ ]) 实验机时:8 设计要求: 首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。 程序运行后,给出5个菜单项的内容和输入提示: 1.输入主串、子串和匹配起始位置 2.朴素的模式匹配算法 3.KMP改进算法(Next[ ]) 4.KMP改进算法(NextVal[ ]) 0.退出管理系统 请选择0—4: 菜单设计要求:使用数字0—4来选择菜单项,其它输入则不起作用。 输出结果要求:输出各趟匹配详细过程(其中3、4,首先输出Next[ ]或者NextVal[ ]的各元素的数值),然后输出匹配总趟数、单个字符比较次数、匹配成功时的位置序或者匹配失败提示信息。 实验三 二叉树遍历与路径查找(二叉树实验) 实现功能:建立二叉树存储结构、求二叉树的先序遍历、求二叉树的中序遍历、求二叉树的后序遍历、求二叉树的层次遍历、求根到给定结点的路径。 实验机时:8 设计要求: 数据结构: typedef struct node{ char data; //数据域 struct node *lchild , *rchild; //左右孩子指针 }BinTNode, *BinTree; //树中结点类型 首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。 程序运行后,给出如下菜单项的内容和输入提示,使用数字0—6来选择菜单项,其它输入则不起作用: 1.建立二叉树存储结构 2.求二叉树的先序遍历 3.求二叉树的中序遍历 4.求二叉树的后序遍历 5.求二叉树的层次遍历 6.求给定结点的路径 0.退出系统 请选择0—6:
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柒_02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值