C++程序设计:酒店客房管理系统

一、功能描述

本项目为“酒店客房管理系统”,实现了对酒店的客房信息进行管理,主要功能包括:

  1. 酒店初始化

    (1) 初始化管理员账号密码

    (2) 初始化操作员账号密码

    (3) 初始化酒店客房信息

  2. 管理员管理

    (1) 管理员登录

    (2) 查看、增加、删除、修改操作员信息

    (3) 操作员信息写入文件

    (4) 查看、修改酒店客房信息

    (5) 酒店客房信息写入文件

  3. 操作员管理

    (1) 查看客房信息

    (2) 客房的预订

    (3) 客房的入住

    (4) 客房的退房

    (5) 预订查询(根据房号和姓名查询预订信息)

    (6) 客房查询(根据房号查询房间信息)

    (7) 住客查询(根据姓名查询住客信息)

    (8) 操作员工作日志写入文件

二、设计与实现

1. 模块结构图及各模块的功能

模块结构图如下:

模块图.png

本酒店客房管理系统有两个模块:管理员模块和操作员模块。

管理员模块的功能有:

  • 管理员登录:根据输入账号密码登录进入管理员权限
  • 操作员管理

    • 查看操作员信息
    • 增加操作员信息
    • 删除操作员信息
    • 修改操作员信息
  • 酒店客房管理

    • 查看酒店客房信息
    • 修改酒店客房信息

操作员模块的功能有:

  • 操作员登录:根据输入账号密码登录进入操作员权限
  • 查看客房信息
  • 客房的预订
  • 客房的入住
  • 客房的退房
  • 预订查询:根据房号和姓名查询预订信息
  • 客房查询:根据房号查询房间信息
  • 住客查询:根据姓名查询住客信息

2. 数据类型的设计和说明

函数调用关系

main.png

Room类

Room类的数据类型如下:

Room.png

​ 在本项目的设计中,Room是酒店客房的抽象,而Room数组是酒店的抽象。

​ 友元函数RoomInit:进行酒店房间初始化。本项目初始化了20间客房的类型和价格,并将酒店客房信息保存在“酒店房间信息.xls”文件中。

Operator类

Operator.png

​ 在本项目中,Operator是酒店操作员的抽象,并用一个Operator数组保存操作员信息。

​ 友元函数OperatorInit():进行操作员信息的初始化。本项目初始化了10位操作员的账号和密码,并将酒店客房信息保存在“操作员账户信息.txt”文件中。

​ 友元函数OperatorLogin():登录操作员账号。该函数传入Operator数组并返回登录操作员在数组的第几个元素。

​ 成员函数WriteRoomInformation(Room*):将Room数组中的信息写入到“酒店房间信息.xls”文件中。该函数是一个辅助函数,当Room数组的信息进行修改时,将调用该函数修改文件相应内容。

​ 实现操作员相应功能的成员函数如下:

  • ViewRoomInformation(Room*):查看酒店客房的基本信息。该信息不包括住客的基本信息。
  • ReserveRoom(Room*):预订客房。该函数打印空闲房间让用户选择、并输入用户的姓名、身份证号、联系方式等基本信息。
  • CheckIn(Room*):入住房间。该函数先询问客户是否预订房间,若预订需对比信息才能入住,若未预订则打印空闲房间并输入个人信息实现入住。
  • CheckOut(Room*):住客退房。该函数输入退房的房号并比对住客信息,如一致方可退房、将该房间的信息置空。
  • RoomQuery(Room*):客房查询。输入查询房号可打印房间信息。
  • BookQuery(Room*):预订查询。输入预订房号和姓名可查询预订信息。
  • GuestQuery(Room*):住客查询。输入客户姓名可查询客户信息。
  • OperatorQuit():操作员退出登录。返回主登录菜单或退出程序时将调用该函数。

​ 以上操作员的所有操作均会保存在“操作员工作日志.xls”文件中。工作日志的时间由当前系统时间获得。

Administrator类

Administrator.png

​ 在本项目中,Administrator是酒店管理员的抽象。

​ 构造函数Administrator():初始化管理员账号和密码。在本项目中,管理员账号和密码被初始化后不可在程序中进行修改。

​ 友元函数OperatorLogin():登录管理员账号。该函数比对输入账号密码与管理员账号密码是否一致。

​ 成员函数WriteOperatorInformation(Operator*):将Operator数组中的信息写入到“操作员账户信息.txt”文件中。该函数是一个辅助函数,当Operator数组的信息进行修改时,将调用该函数修改文件相应内容。

​ 实现管理员相应功能的成员函数如下:

  • ViewOperatorInformation(Operator*):查看所有操作员的账号、密码。
  • AddOperatorInformation(Operator*):增加操作员信息。
  • DeleteOperatorInformation(Operator*):删除操作员信息。
  • ModifyOperatorInformation(Operator*):修改操作员信息。
  • ViewRoomInformation(Room*):查看酒店所有客房的类型与价格。
  • ModifyRoomInformation(Room*):修改酒店客房数量、类型和价格。修改后将酒店客房信息写入“酒店房间信息.xls”文件中。

3. 关键功能的实现

主函数

​ main函数流程图如下:

流程图.png

​ 主函数中共有3个菜单界面:登录菜单界面、管理员菜单界面和操作员菜单界面。

​ 登录菜单界面如下:

登录界面.png

​ 管理员菜单界面如下:

管理员界面.png

​ 操作员菜单界面如下:

操作员界面.png

修改操作员信息

​ 修改操作员信息的功能通过Administrator::ModifyOperatorInformation函数实现。

​ 流程图如下:

修改操作员信息.png

​ 实现源代码如下:

void Administrator::ModifyOperatorInformation(Operator* operators)
{
    ViewOperatorInformation(operators);
    int choose;
    string UserName_,Password_;
    cout<<"\t\t#请选择要修改的操作员信息的序号: ";
    cin>>choose;
    int num = choose;
    for(int x=0;x<=choose;x++){
        if(operators[x].UserName==""){
            num++;
        }
    }
    if(operators[num-1].UserName==""){
        cout<<"\t\t#修改失败!该操作员不存在!"<>UserName_; operators[num-1].UserName=UserName_;
    cout<<"\t\t#请输入修改操作员密码: ";
    cin>>Password_; operators[num-1].Password=Password_;
    WriteOperatorInformation(operators);
}

​ 测试界面如下:

修改操作员信息测试1.png

修改操作员信息测试2.png

修改酒店客房信息

​ 修改酒店客房信息的功能通过Administrator::ModifyRoomInformation函数实现。

​ 流程图如下:

修改酒店客房信息.png

​ 实现源代码如下:

void Administrator::ModifyRoomInformation(Room* room)
{
    int StandardRoomNum, StandardRoomPrice;
    int DoubleRoomNum, DoubleRoomPrice;
    int SuiteRoomNum, SuiteRoomPrice;
    cout<<"\t\t#由于本酒店客房有限,请确保输入房间总数≤20。"<>StandardRoomNum;
    cout<<"\t\t#请输入标间价格: "; cin>>StandardRoomPrice;
    cout<>DoubleRoomNum;
    cout<<"\t\t#请输入双人间价格: "; cin>>DoubleRoomPrice;
    cout<>SuiteRoomNum;
    cout<<"\t\t#请输入套房价格: "; cin>>SuiteRoomPrice;
    cout<20){
        cout<<"\t\t#修改失败!您输入的房间个数超出本酒店的房间上限!请保证房间总数≤20!"<

​ 测试界面如下:

修改酒店客房信息测试1.png

修改酒店客房信息测试2.png

酒店客房预订

​ 酒店客房预订的功能通过Operator::ReserveRoom函数实现。

​ 流程图如下:

酒店客房预订.png

​ 实现源代码如下:

void Operator::ReserveRoom(Room* room)
{
    int RoomNum_, x;
    cout<<"\t\t可预订房间如下: "<>RoomNum_;
    for(x=0;x<20;x++){
        if(room[x].RoomNum==RoomNum_){
           if(room[x].IsBooked==false && room[x].IsChecked==false) break;
           else {
            cout<<"\t\t#预订失败!您选择的房间已被预订!"<>room[x].GuestName;
    cout<<"\t\t#身份证号: "; cin>>room[x].GuestID;
    cout<<"\t\t#联系方式: "; cin>>room[x].GuestTel;
    time_t BookTime_;
    time(&BookTime_);
    room[x].BookTime = ctime(&BookTime_);
    room[x].BookTime = room[x].BookTime.substr(0, room[x].BookTime.length() - 1);
    room[x].IsBooked = true;

    fstream  file("操作员工作日志.xls",ios::app);
    file<

​ 测试界面如下:

酒店客房预订测试1.png

酒店客房预订测试2.png

酒店客房入住

​ 酒店客房入住的功能通过Operator::CheckIn函数实现。

​ 流程图如下:

酒店客房入住.png

​ 实现源代码如下:

void Operator::CheckIn(Room* room)
{
    char choose;
    int RoomNum_, x;
    string GuestName_, GuestID_;
    cout<<"\t\t#您是否已预订了房间?(Y/N): ";
    cin>>choose;
    if(choose=='N'||choose=='n')
    {
        cout<<"\t\t#可入住房间如下: "<>RoomNum_;
        int x;
        for(x=0;x<20;x++){
            if(room[x].RoomNum==RoomNum_){
               if(room[x].IsBooked==false && room[x].IsChecked==false) break;
               else {
                cout<<"\t\t#入住失败!您选择的房间已被预订!"<>room[x].GuestName;
        cout<<"\t\t#身份证号: "; cin>>room[x].GuestID;
        cout<<"\t\t#联系方式: "; cin>>room[x].GuestTel;
        time_t CheckTime_;
        time(&CheckTime_);
        room[x].CheckInTime = ctime(&CheckTime_);
        room[x].CheckInTime = room[x].CheckInTime.substr(0, room[x].CheckInTime.length() - 1);
        room[x].IsChecked = true;

        fstream  file("操作员工作日志.xls",ios::app);
        file<>RoomNum_;
        for(x=0;x<20;x++){
            if(room[x].RoomNum==RoomNum_){
               if(room[x].IsBooked==false){
                cout<<"\t\t#入住失败!您选择的房间未被预订!"<>GuestName_;
        cout<<"\t\t#身份证号: "; cin>>GuestID_;
        if(room[x].GuestName!=GuestName_ || room[x].GuestID!=GuestID_){
            cout<<"\t\t#入住失败!您输入的信息不匹配!"<

​ 测试界面如下:

酒店客房入住测试1.png

酒店客房入住测试2.png

酒店客房入住测试3.png

酒店客房入住测试4.png

酒店客房退房

​ 酒店客房退房的功能通过Operator::CheckOut函数实现。

​ 流程图如下:

酒店客房退房.png

​ 实现源代码如下:

void Operator::CheckOut(Room* room)
{
    int RoomNum_, x;
    cout<<"\t\t#请输入您退房的房号: "; cin>>RoomNum_;
    for(x=0;x<20;x++){
        if(room[x].RoomNum==RoomNum_){
            if(room[x].IsChecked==false){
                cout<<"\t\t#退房失败!您选择的房间未入住!"<>GuestName_;
    cout<<"\t\t#身份证号: "; cin>>GuestID_;
    if(room[x].GuestName!=GuestName_ || room[x].GuestID!=GuestID_){
        cout<<"\t\t#退房失败!您输入的信息不匹配!"<

​ 测试界面如下:

酒店客房退房测试1.png

酒店客房退房测试2.png

三、课程设计总结

Pains

​ 在设计本系统的过程中,我花费了很多时间和心思让该程序对用户更友好,努力设计使得程序更方便使用。在调试过程中我也遇到不少异常,包括由于编译器编码语言导致的程序运行异常,我查询多篇文章后将所有异常解决,最终完成了本课程设计。

​ 在编写本设计报告的过程中,发现自己的程序中,结构化设计等方面仍有不足,对于实际问题的解决还可以进一步改进(如增加金额结算功能等)。在后续的程序设计中,我会对本项目进行完善,达到更优。

​ 本程序设计花费了我不少心思,但是苦中有乐,我在编写程序的过程中获得了乐趣与满足感,也进一步加深了自己对于程序设计的思考,有很大收获。

Gains

​ 通过本系统的设计,我提高了分析和解决实际问题的能力,巩固所学C++的知识,加强对结构化程序设计的思想。我全面系统地学习了面向对象程序设计的基本概念、基本语法和编程方法,独立完成了有一定工作量的程序设计任务,强调好的程序设计风格。

附录:设计代码

include

Room.h

#ifndef ROOM_H
#define ROOM_H
#include 
#include
#include 
#include
using namespace std;

class Room
{
    public:
        Room();
        Room(int RoomNum_,string RoomType_,int RoomPrice_,bool IsBooked_,bool IsChecked_);

        friend void RoomInit(Room* room);
        friend class Administrator;
        friend class Operator;

    private:
        int RoomNum;
        string RoomType;
        int RoomPrice;
        bool IsBooked;
        bool IsChecked;

        string GuestName;
        string GuestID;
        string GuestTel;
        string BookTime;
        string CheckInTime;
};

#endif // ROOM_H

Operator.h

#ifndef OPERATOR_H
#define OPERATOR_H
#include "Room.h"
#include
#include 
#include
#include 
#include 
using namespace std;

class Operator
{
    public:
        Operator();
        string getUserName(){ return UserName; }
        void ViewRoomInformation(Room*);
        void WriteRoomInformation(Room*);
        void ReserveRoom(Room*);
        void CheckIn(Room*);
        void CheckOut(Room*);
        void RoomQuery(Room*);
        void BookQuery(Room*);
        void GuestQuery(Room*);
        void OperatorQuit();

        friend void OperatorInit(Operator* operators);
        friend int OperatorLogin(Operator* operators);

        friend class Administrator;

    private:
        string UserName;
        string Password;
};

#endif // OPERATOR_H

Administrator.h

#ifndef ADMINISTRATOR_H
#define ADMINISTRATOR_H
#include "Room.h"
#include "Operator.h"
#include 

class Administrator
{
    public:
        Administrator();

        friend bool AdministratorLogin(Administrator);

        void ViewOperatorInformation(Operator*);
        void WriteOperatorInformation(Operator*);
        void AddOperatorInformation(Operator*);
        void DeleteOperatorInformation(Operator*);
        void ModifyOperatorInformation(Operator*);
        void ViewRoomInformation(Room*);
        void ModifyRoomInformation(Room*);

    private:
        string UserName;
        string Password;
};

#endif // ADMINISTRATOR_H

src

Room.cpp

#include "Room.h"

Room::Room()
{
    RoomNum = 0;
    RoomType = "NULL";
    RoomPrice = 0;
    IsBooked = false;
    IsChecked = false;

    GuestName = "NULL";
    GuestID = "NULL";
    GuestTel = "NULL";
    BookTime = "NULL";
    CheckInTime = "NULL";
}
Room::Room(int RoomNum_,string RoomType_,int RoomPrice_,bool IsBooked_,bool IsChecked_)
{
    RoomNum = RoomNum_;
    RoomType = RoomType_;
    RoomPrice = RoomPrice_;
    IsBooked = IsBooked_;
    IsChecked = IsChecked_;
}

void RoomInit(Room* room)
{
    int StandardRoomNum = 8;
    int DoubleRoomNum = 7;
    int SuiteRoomNum = 20 - StandardRoomNum - DoubleRoomNum;
    int i[3]={1,0,1},k;

    for(k=0; k<20; k++)
    {
        room[k].RoomNum=i[0]*100+i[1]*10+i[2];
        switch(i[0])
        {
        case 1:{room[k].RoomPrice=150; room[k].RoomType="标间";break;}
        case 2:{room[k].RoomPrice=250; room[k].RoomType="双人间";break;}
        case 3:{room[k].RoomPrice=500; room[k].RoomType="套房";break;}
        }
        if( k==(StandardRoomNum-1) )
            i[0]++,i[2]=0;
        if( k==(DoubleRoomNum+StandardRoomNum-1) )
            i[0]++,i[2]=0;
        i[2]++;
    }
    fstream  read("酒店房间信息.xls",ios::out);
    read<<"房间号\t类型\t价格\t是否预订\t是否入住\t姓名\t身份证号\t联系方式\t预订时间\t入住时间"<

Operator.cpp

#include "Operator.h"

Operator::Operator()
{
    UserName = "";
    Password = "";
}

void OperatorInit(Operator* operators)
{
    for(int k=0; k<10; k++)
    {
        operators[k].UserName = "zeng" + to_string(k);
        operators[k].Password = "000" + to_string(k);
    }
    fstream  read("操作员账户信息.txt",ios::out);
    read<<"账号\t密码"<>UserName_;
    cout<<"\t\t#请输入操作员密码: ";
    cin>>Password_;
    for(int i=0; i<20; i++)
    {
        if( UserName_==operators[i].UserName && Password_==operators[i].Password ){
            time_t Time_;
            string Time;
            time(&Time_);
            Time = ctime(&Time_);
            Time = Time.substr(0, Time.length() - 1);

            fstream  file("操作员工作日志.xls",ios::app);
            file<>RoomNum_;
    for(x=0;x<20;x++){
        if(room[x].RoomNum==RoomNum_){
           if(room[x].IsBooked==false && room[x].IsChecked==false) break;
           else {
            cout<<"\t\t#预订失败!您选择的房间已被预订!"<>room[x].GuestName;
    cout<<"\t\t#身份证号: "; cin>>room[x].GuestID;
    cout<<"\t\t#联系方式: "; cin>>room[x].GuestTel;
    time_t BookTime_;
    time(&BookTime_);
    room[x].BookTime = ctime(&BookTime_);
    room[x].BookTime = room[x].BookTime.substr(0, room[x].BookTime.length() - 1);
    room[x].IsBooked = true;

    fstream  file("操作员工作日志.xls",ios::app);
    file<>choose;
    if(choose=='N'||choose=='n')
    {
        cout<<"\t\t#可入住房间如下: "<>RoomNum_;
        int x;
        for(x=0;x<20;x++){
            if(room[x].RoomNum==RoomNum_){
               if(room[x].IsBooked==false && room[x].IsChecked==false) break;
               else {
                cout<<"\t\t#入住失败!您选择的房间已被预订!"<>room[x].GuestName;
        cout<<"\t\t#身份证号: "; cin>>room[x].GuestID;
        cout<<"\t\t#联系方式: "; cin>>room[x].GuestTel;
        time_t CheckTime_;
        time(&CheckTime_);
        room[x].CheckInTime = ctime(&CheckTime_);
        room[x].CheckInTime = room[x].CheckInTime.substr(0, room[x].CheckInTime.length() - 1);
        room[x].IsChecked = true;

        fstream  file("操作员工作日志.xls",ios::app);
        file<>RoomNum_;
        for(x=0;x<20;x++){
            if(room[x].RoomNum==RoomNum_){
               if(room[x].IsBooked==false){
                cout<<"\t\t#入住失败!您选择的房间未被预订!"<>GuestName_;
        cout<<"\t\t#身份证号: "; cin>>GuestID_;
        if(room[x].GuestName!=GuestName_ || room[x].GuestID!=GuestID_){
            cout<<"\t\t#入住失败!您输入的信息不匹配!"<>RoomNum_;
    for(x=0;x<20;x++){
        if(room[x].RoomNum==RoomNum_){
            if(room[x].IsChecked==false){
                cout<<"\t\t#退房失败!您选择的房间未入住!"<>GuestName_;
    cout<<"\t\t#身份证号: "; cin>>GuestID_;
    if(room[x].GuestName!=GuestName_ || room[x].GuestID!=GuestID_){
        cout<<"\t\t#退房失败!您输入的信息不匹配!"<>RoomNum_;
    cout<<"\t\t#请输入您预订的姓名: "; cin>>GuestName_;
    for(x=0;x<20;x++){
        if(room[x].RoomNum==RoomNum_){
            if(room[x].IsBooked==false){
                cout<<"\t\t#查询失败!您选择的房间未被预订!"<>RoomNum_;
    for(x=0;x<20;x++){
        if(room[x].RoomNum==RoomNum_){
            break;
        }
        if(x==19){
            cout<<"\t\t#查询失败!您选择的房间不存在!"<>GuestName_;
    for(x=0;x<20;x++){
        if(room[x].GuestName==GuestName_){
            break;
        }
        if(x==19){
            cout<<"\t\t#查询失败!您查询的客户不存在!"<

Administrator.cpp

#include "Administrator.h"

Administrator::Administrator()
{
    UserName = "zsq";
    Password = "000";
}

bool AdministratorLogin(Administrator a)
{
    string UserName_,Password_;
    cout<<"\t\t#请输入管理员账号: ";
    cin>>UserName_;
    cout<<"\t\t#请输入管理员密码: ";
    cin>>Password_;
    if( UserName_==a.UserName && Password_==a.Password )
        return true;
    else return false;
}

void Administrator::ViewOperatorInformation(Operator* operators)
{
    int num = 0;
    cout<<"\t\t序号\t账号\t密码"<>UserName_; operators[x].UserName=UserName_;
            cout<<"\t\t#请输入新增操作员密码: ";
            cin>>Password_; operators[x].Password=Password_;
            WriteOperatorInformation(operators);
            break;
        }
    }
}

void Administrator::DeleteOperatorInformation(Operator* operators)
{
    ViewOperatorInformation(operators);
    int choose;
    cout<<"\t\t#请选择要删除的操作员信息的序号: ";
    cin>>choose;
    int num = choose;
    for(int x=0;x>choose;
    int num = choose;
    for(int x=0;x<=choose;x++){
        if(operators[x].UserName==""){
            num++;
        }
    }
    if(operators[num-1].UserName==""){
        cout<<"\t\t#修改失败!该操作员不存在!"<>UserName_; operators[num-1].UserName=UserName_;
    cout<<"\t\t#请输入修改操作员密码: ";
    cin>>Password_; operators[num-1].Password=Password_;
    WriteOperatorInformation(operators);
}

void Administrator::ViewRoomInformation(Room* room)
{
    cout<<"\t\t房间号\t类型\t价格"<>StandardRoomNum;
    cout<<"\t\t#请输入标间价格: "; cin>>StandardRoomPrice;
    cout<>DoubleRoomNum;
    cout<<"\t\t#请输入双人间价格: "; cin>>DoubleRoomPrice;
    cout<>SuiteRoomNum;
    cout<<"\t\t#请输入套房价格: "; cin>>SuiteRoomPrice;
    cout<20){
        cout<<"\t\t#修改失败!您输入的房间个数超出本酒店的房间上限!请保证房间总数≤20!"<

main.cpp

#include "Room.h"
#include "Administrator.h"
#include "Operator.h"
#include 
#include 
using namespace std;

int main()
{
    int choose=0;
    int flag;
    int i;//操作员的序号

    //房间初始化
    Room room[20];
    RoomInit(room);

    //管理员初始化
    Administrator a = Administrator();

    //操作员初始化
    Operator operators[20];
    OperatorInit(operators);

    while(true)
    {
    flag = 1;
    system("cls");
    cout<<"\t\t###################################"<>choose;
    system("cls");
    switch(choose)
    {
        case 1:
            if( !AdministratorLogin(a) ){
                cout<<"\t\t#登录失败!若忘记密码可【查看帮助】!"<>choose;
            system("cls");
            switch(choose)
            {
                case 1:
                    a.ViewOperatorInformation(operators);
                    system("pause");
                    break;
                case 2:
                    a.AddOperatorInformation(operators);
                    break;
                case 3:
                    a.DeleteOperatorInformation(operators);
                    break;
                case 4:
                    a.ModifyOperatorInformation(operators);
                    break;
                case 5:
                    a.ViewRoomInformation(room);
                    system("pause");
                    break;
                case 6:
                    a.ModifyRoomInformation(room);
                    break;
                case 7:
                    flag = 0; break;
                default: break;
            }
            }
            break;

        case 2:
            i=OperatorLogin(operators);
            if( i<0 ){
                cout<<"\t\t#登录失败!若忘记密码可【查看帮助】!"<>choose;
            system("cls");
            switch(choose)
            {
                case 1:
                    operators[i].ViewRoomInformation(room);
                    system("pause");
                    break;
                case 2:
                    operators[i].ReserveRoom(room);
                    break;
                case 3:
                    operators[i].CheckIn(room);
                    break;
                case 4:
                    operators[i].CheckOut(room);
                    break;
                case 5:
                    operators[i].BookQuery(room);
                    break;
                case 6:
                    operators[i].RoomQuery(room);
                    break;
                case 7:
                    operators[i].GuestQuery(room);
                    break;
                case 8:
                    operators[i].OperatorQuit();
                    flag = 0; break;
                case 9:
                    operators[i].OperatorQuit();
                    return 0;
                default: break;
            }
            }
            break;

        case 3:
            cout<<"\t\t#####################################################"<

你可能感兴趣的:(c++,程序设计)