当前位置: 首页 > article >正文

【C++】C++ 旅馆管理系统(含 源码+报告)【独一无二】

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


系列文章目录


目录

  • 系列文章目录
  • 一、设计要求
  • 二、设计思路
    • 1. 日期类 Data
    • 2. 房间类 Room
    • 3. 客人类 Guest
    • 4. 管理类 Manage
      • (1) 数据读写操作
      • (2) 房间管理与客房入住/退房
      • (3) 信息显示与查询
      • (4) 文件写入辅助函数
    • 5. 主函数与菜单交互
    • 总结
  • 三、可视化分析


一、设计要求

某旅馆有n个等级的房间,第I等级有a个房间,每个等级的房间有b个床位(1<i<n)。试模拟旅馆管理系统中床位分配和回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。
旅客登记,即为旅客分配床位。输入旅客姓名、年龄、性别、到达日期和所需房间等级。分配成功时打印旅客姓名、年龄、到达日期、房间等级、房间号码和床位号码。分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床。位,则打印“是否愿意更换等级?”的询问信息。若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束;
旅客离开时,即进行床位回收。输入房间等级、房间号和床位号。

(1)使用面向对象编程思想编写开发过程中需要用到的类,比如:至少包含四个类:日
期类,客房类,主要包含客房信息(房号类型,是否有客人等)及相关操作;客人类,主要完 成客户信息(身份证,入住时间,姓名,性别等)的相关操作;管理类实现对客房的管理。
(2)输入和输出可以使用文本文件重定向输入(保存数据为磁盘文件);也可以使用标
准输入输出进行(提交时需要提交TXT格式输入数据)。比如:room.txt 的文件,文件中应包含 20 条以上记录(房间的初始状态),guest.txt 的文本文件,包含 10 条以上客人记录。 在运行程序时自动载入。
(3)基本功能要求具有增、删、改、查。
主要功能包括:房间信息的录入,客人入住房间等级、顾客退房结账,所有房间信息显示、顾客信息显示、查询所有空房间、查询指定的房间号,退出系统。

在这里插入图片描述


二、设计思路

在这里插入图片描述
下面给出本代码的设计思路说明,程序实现了一个简单的宾馆房间管理系统,主要模块包括:

  1. 日期类(Data)
  2. 房间类(Room)
  3. 客人类(Guest)
  4. 管理类(Manage)及其各种操作函数
  5. 主函数与菜单交互

1. 日期类 Data

设计思路:

  • 用于记录交易(入住、退房等)的时间信息(年、月、日)。
  • 提供设置日期和获取各个属性值的成员函数。

关键代码:

class Data  // 日期类,记录交易时间
{
public:
    Data() {}     // 缺省构造函数
    ~Data() {}    // 析构函数

    // 接收输入的日期
    // 此处略去至少20行代码
    
private:
    int year;
    int month;
    int day;
};

2. 房间类 Room

设计思路:

  • 用于表示宾馆中的房间信息。
  • 数据成员包括:房号(Number)、房间类型(Type)、房间状态(Whether,用于标记是否有客人入住,状态值为“有”或“无”)及价格(Price)。
  • 提供基本信息输入函数、状态设置、以及显示房间信息的show()函数。

关键代码:

class Room
{
public:
    Room* r[Max]; // 房间对象指针数组(在管理类中会用到)
    int Room_count;  // 记录房间数量

    // 构造函数
    Room(int Number, string Type, double Price, string Whether) {
        this->Number = Number;
        this->Type = Type;
        this->Whether = Whether;
        this->Price = Price;
    }

    // 获取房间各项属性
    int InputNumber() { return Number; }
    string InputType() { return Type; }
    string InputWhether() { return Whether; }
    // 此处略去至少20行代码
protected:
    int Number;      // 房号 
    string Type;     // 房间类型 
    string Whether;  // 是否有客人 
    double Price;    // 价格 
};

在这里插入图片描述

3. 客人类 Guest

设计思路:

  • 用于存储入住客户的详细信息。
  • 数据成员包括:
    • 房号(number,对应入住房间号)
    • 顾客姓名(Name)
    • 身份证号(Id)
    • 性别(sex)
    • 入住时间(Intime)
    • 入住天数(days)
  • 提供各属性的获取函数和显示函数show()用于输出客人信息。

关键代码:

class Guest
{
public:
    Guest* g[Max];  // 客人对象指针数组(由管理类使用)
    int Guest_count; // 记录客人数量

    // 构造函数
    Guest(int number, string Name, int Id, string sex, string Intime, int days) {
        this->number = number;
        this->Name = Name;
        this->Id = Id;
        this->sex = sex;
        this->Intime = Intime;
        this->days = days;
    }

    // 获取客人各项属性
    // 此处略去至少20行代码
protected:
    int number;    // 房号 
    string Name;   // 顾客姓名 
    int Id;        // 身份证号 
    string sex;    // 性别 
    string Intime; // 入住时间 
    int days;      // 入住天数
};

4. 管理类 Manage

设计思路:
管理类负责宾馆系统的所有操作,包括房间信息的录入、客人入住登记(Check_In)、退房结账(Check_Out)、信息显示、查询以及文件读写。
主要模块功能如下:

(1) 数据读写操作

  • ReadData(): 从文件(“room.txt”、“guest.txt”)读取房间及客人数据,并更新相应数组与数量计数器。
  • WriteData(int n): 根据参数n将房间信息(n1)或客人信息(n2)写入文件。
  • WriteRoom()和WriteGuest(): 分别实现单个房间和单个客人信息的写入(追加模式)。

关键代码摘录:

void Manage::ReadData()
{
    fstream Rin, Gin;
    Rin.open("room.txt", ios::in);
    if (!Rin) {
        cout << "未找到room文件,请先建立文件!" << endl;
        return;
    }
    // 此处略去至少20行代码Gin.open("guest.txt", ios::in);
    if (!Gin) {
        cout << "未找到guest文件,请先建立文件!" << endl;
        return;
    }
    Guest_count = 0;
    while (!Gin.eof()) {
        string name, intime, sex;
        int days, number;
        int id;
        Gin >> number >> name >> id >> sex >> intime >> days;
        g[Guest_count++] = new Guest(number, name, id, sex, intime, days);
    }
    Gin.close();
}

void Manage::WriteData(int n)
{
    switch (n) {
    case 1: {
        ofstream Rout("room.txt", ios::trunc);
        for (i = 0; i < Room_count - 1; i++) {
            if (r[i] != NULL) {
                WriteRoom(r[i]);
            }
        }
        Rout.close();
        break;
    }
   // 此处略去至少20行代码
        Gout.close();
        break;
    }
    }
}

在这里插入图片描述

(2) 房间管理与客房入住/退房

  • IncreaseRoom(): 添加房间信息,读取用户输入后调用WriteRoom()将新房间信息写入文件。
  • Check_In(): 进行客人入住登记,读取房间文件、显示空房信息(调用SearchType()),接收客人信息,更新房间状态为“有”,并将客人信息写入文件。
  • Check_Out(): 客人退房结账,调用Payment()获取客人在数组中的下标,查找对应房间,更改状态为“无”,计算消费金额(房价×入住天数),并更新数据。

关键代码摘录:

void Manage::IncreaseRoom()
{
    string type, Whether;
    double price;
    int number;
    cout << "请输入房号: ";    cin >> number;
    cout << "请输入房间类型: ";    cin >> type;
    cout << "请输入价格: ";    cin >> price;
    cout << "请输入房间状态: ";    cin >> Whether;
    WriteRoom(new Room(number, type, price, Whether));
}

void Manage::Check_In()
{
    ReadData();
    SearchType();  // 显示空房信息供用户选择
    string name, intime, sex;
    int days, number;
    int id;
    cout << "请输入房号: ";    cin >> number;
    cout << "请输入顾客的姓名: "; cin >> name;
    cout << "请输入顾客的身份证号: ";    cin >> id;
    cout << "请输入顾客的性别: "; cin >> sex;
    cout << "请输入入住日期: ";    cin >> intime;
    cout << "请输入入住天数: "; cin >> days;
    // 此处略去至少20行代码
    }
}

void Manage::Check_Out()
{
    int x = Payment();
    // 此处略去至少20行代码
    g[x] = NULL;
    WriteData(2);
}

(3) 信息显示与查询

  • Display(int n): 根据参数n显示所有房间(n1)或顾客信息(n2)。
  • SearchMenu()、SearchType()、SearchNumber():
    • SearchMenu()显示查询主菜单,选择查询方式。
    • SearchType()遍历所有房间,显示状态为“无”的空房间信息。
    • SearchNumber()根据输入的房间号查询房间和对应客户信息。

关键代码摘录:

void Manage::Display(int n)
{
    ReadData();
    switch (n) {
    case 1:
        for (i = 0; i < Room_count - 1; i++) {
            cout << "房号:" << r[i]->InputNumber() 
                 << "\t房间类型: " << r[i]->InputType() 
                 << "\t房间价格: " << r[i]->InputPrice() 
                 << "\t房间状态: " << r[i]->InputWhether() << endl << endl;
        }
        break;
    case 2:
        for (i = 0; i < Guest_count - 1; i++) {
            cout << "房间号: " << g[i]->InputNumber() 
                 << "\t顾客姓名: " << g[i]->InputName() 
                 << "\t身份证号: " << g[i]->InputId() 
                 << "\t顾客性别:" << g[i]->InputSex() 
                 << "\t入住时间: " << g[i]->InputIntime() 
                 << "\t入住天数: " << g[i]->InputDays() << endl << endl;
        }
        break;
    }
}

// 此处略去至少20行代码
    }
}

在这里插入图片描述

(4) 文件写入辅助函数

  • WriteRoom(Room r) 与 WriteGuest(Guest g):** 将单个房间或客人信息追加写入对应的文件(room.txt 或 guest.txt)。

关键代码:

void Manage::WriteRoom(Room* r)
{
    ofstream Rout("room.txt", ios::app);
    Rout << r->InputNumber() << "\t" 
         << r->InputType() << "\t" 
         << r->InputPrice() << "\t" 
         << r->InputWhether() << endl;
    Rout.close();
}

void Manage::WriteGuest(Guest* g)
{
    ofstream Gout("guest.txt", ios::app);
    Gout << g->InputNumber() << "\t" 
         << g->InputName() << "\t" 
         << g->InputId() << "\t" 
         << g->InputSex() << "\t" 
         << g->InputIntime() << "\t" 
         << g->InputDays() << endl;
    Gout.close();
}

5. 主函数与菜单交互

设计思路:

  • 在主函数中,通过循环显示菜单选项(清屏、菜单项选择),并根据用户输入调用管理类中的对应功能。
  • 各功能完成后调用 _getch() 暂停界面,等待用户按键后继续循环,直到选择退出。

关键代码:

int main()
{
    Manage M;
    int n;
    while (1)
    {
        system("cls");
        cout << endl << endl << endl 
             << "\t\t\t宾 馆 房 间 管 理 系 统     " << endl << endl;
        cout << "\t\t\t1、房 间 信 息 的 录 入" << endl << endl;
        cout << "\t\t\t2、顾 客 入 住 房 间 登 记" << endl << endl;
        cout << "\t\t\t3、顾 客 退 房 结 账" << endl << endl;
        cout << "\t\t\t4、所 有 房 间 信 息 显 示" << endl << endl;
        cout << "\t\t\t5、所 有 顾 客 的 显 示" << endl << endl;
        cout << "\t\t\t6、查 询 所 有 空 房 间" << endl << endl;
        cout << "\t\t\t7、查 询 指 定 的 房 间 号" << endl << endl;
        cout << "\t\t\t8、退 出 系 统" << endl << endl;
        cout << endl << "请选择:  ";
        cin >> n;
        cout << endl << endl;
        switch (n)
        {
        case 1: M.IncreaseRoom(); _getch(); break;
        case 2: M.Check_In(); _getch(); break;
        case 3: M.Check_Out(); _getch(); break;
        case 4: M.Display(1); _getch(); break;
        case 5: M.Display(2); _getch(); break;
        case 6: M.SearchType(); _getch(); break;
        case 7: M.SearchNumber(); _getch(); break;
        case 8: exit(0);
        }
    }
    return 0;
}

在这里插入图片描述

总结

整个系统采用面向对象设计,通过以下模块实现宾馆房间管理:

  • Data 类: 记录交易日期信息(虽未在主要流程中使用,可用于扩展记录交易时间)。
  • Room 类: 表示房间信息,包含房号、类型、状态、价格以及显示函数。
  • Guest 类: 存储客户入住信息,支持属性获取和显示。
  • Manage 类: 核心管理模块,负责房间信息录入、入住登记、退房结账、信息显示、数据文件的读写和查询功能。
  • 主函数: 提供菜单界面,通过循环与用户交互,实现各项管理功能。

三、可视化分析

1.打印功能信息
在这里插入图片描述

2.房间信息录入
在这里插入图片描述
3.顾客入住房间登记
在这里插入图片描述
4.顾客退房结账
在这里插入图片描述

5.所有房间信息显示
在这里插入图片描述
6.所有顾客信息显示
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述



http://www.kler.cn/a/547179.html

相关文章:

  • 统计安卓帧率和内存
  • (萌新入门)如何从起步阶段开始学习STM32 —— 1如何迁移一个开发版的工程
  • c#展示网页并获取网页上触发按钮的值进行系统业务逻辑处理
  • vue3 关于插槽的使用
  • 手写一个Java Android Binder服务及源码分析
  • 云创智城充电系统:基于 SpringCloud 的高可用、可扩展架构详解-多租户、多协议兼容、分账与互联互通功能实现
  • git bash在github的库中上传或更新本地文件
  • SOUI基于Zint生成Code 39码
  • 【面试】网络安全常问150道面试题
  • Vue 2 + Webpack 项目中集成 ESLint 和 Prettier
  • 前端包管理器的发展以及Npm、Yarn和Pnpm对比
  • Netty源码解析之异步处理(二):盛赞Promise中的集合设计
  • 三、k8s pod详解
  • SQLMesh系列教程-3:SQLMesh模型属性详解
  • 算法04-希尔排序
  • Windows搭建Docker+Ollama+Open-WebUI部署DeepSeek本地模型
  • GPT和BERT
  • /etc/profile vs ~/.bashrc:如何正确使用?
  • VoIP之Jitter Buffer(抖动缓冲器)
  • Oracle RHEL 7.8 安装