C++课程设计:电梯控制系统程序设计

目录

电梯控制系统程序设计背景

类结构图

程序设计

程序释义

运行展示

总结与体会


电梯控制系统程序设计背景

电梯控制系统程序设计旨在通过C++编程实现电梯的模拟功能,使用户能够选择上行或下行,并输入要进入的楼层,程序将模拟电梯运行过程并显示经过的每一楼层层数。同时,要求电梯的输入和运行有一定的限制条件,并且在显示楼层时具有一定的延迟效果,以及能在开始运行时显示当前日期。

基本功能要求:

  1. 提供用户界面,让用户选择上行或下行操作,并输入要进入的楼层。
  2. 对用户输入的楼层号进行合法性检查,确保上行时输入的楼层号不小于当前楼层,下行时输入的楼层号不大于当前楼层。
  3. 模拟电梯的运行过程,显示经过的每一楼层层数,并在最终停靠的楼层的输出形式上加以突出显示。
  4. 在电梯开始运行时,显示当前日期。
  5. 程序运行直到用户关闭窗口,即电梯一旦开始运作就会持续运行。

类结构图

有专门的软件去制作UML图,这里我们就采用Vistual Studio来得到UML图。

 可通过搜索框搜索Vistual Studio Installer,另外一种通过VS里面的顶部导航栏:工具——>获取工具和能力打开。

勾选并下载,VS会重启,完成后再次打开。

在单个组件中搜索"类设计器"

再次修改即可,然后就能使用VS来得到UML图了。

右键点击解决方案资源管理器,点击查看,查看类图。

程序设计

#include <iostream>
#include <fstream>
#include <vector>
#include <chrono>
#include <thread>
#include <ctime>
using namespace std;

class ELEVATOR {
private:
    int now_floor_e;
    int now_floor_p;
    int want_floor;

    bool choice;             //上下行
    std::vector<int> floor_history; // 记录经过的楼层

public:
    int all_floor;
    ELEVATOR() {
        now_floor_e = 1;   //表示电梯当前所在的楼层
        now_floor_p = 1;   //表示乘客在电梯内的当前楼层
        want_floor = 1;    //表示乘客想要去的楼层
        all_floor = 10; 
        choice = true;     
    }

    int start() {
        displayDate();                                //首先显示当前日期和时间

        bool continueFlag = true;
        while (continueFlag) {
            ask();
            arriave_now_floor_p();
            get_choice();
            get_floor();
            arriave_want_floor();

            cout << "是否继续进行?(输入3退出,否则继续):";   //非3即为继续
            int choice;
            cin >> choice;
            if (choice == 3) {
                continueFlag = false;
            }
        }

        saveFloorHistory();

        return 0;
    }

    void ask() {
        cout << "目前最高层为" << all_floor << "层,欢迎使用!!" << endl;
        cout << "请输入您当前所在的楼层:";
        cin >> now_floor_p;
    }

    void arriave_now_floor_p() {
        cout << "电梯从 " << now_floor_e << " 层到达 " << now_floor_p << " 层" << endl;
        now_floor_e = now_floor_p;
    }

    bool get_choice() {
        cout << "请选择上行(1)或下行(0):";
        cin >> choice;
        return choice;
    }

    void get_floor() {
        cout << "请输入您要前往的楼层:";
        cin >> want_floor;

        while (judge() == -1) {
            cout << "输入不合法!请重新输入:" << endl;
            cin >> want_floor;
        }
    }

    int judge() {
        if (choice && want_floor < now_floor_e) {
            cout << "不合法!目标楼层不能比当前楼层小。" << endl;
            return -1;
        }
        else if (!choice && want_floor > now_floor_e) {
            cout << "不合法!目标楼层不能比当前楼层大。" << endl;
            return -1;
        }

        return 0;
    }

    void arriave_want_floor() {
        cout << "电梯开始运行..." << endl;

        if (choice) {
            for (int floor = now_floor_e; floor <= want_floor; floor++) {
                now_floor_e = floor;
                displayFloor();
                this_thread::sleep_for(chrono::milliseconds(500));
                floor_history.push_back(floor);
            }
        }
        else {
            for (int floor = now_floor_e; floor >= want_floor; floor--) {
                now_floor_e = floor;
                displayFloor();
                this_thread::sleep_for(chrono::milliseconds(500));
                floor_history.push_back(floor);
            }
        }

        cout << "电梯到达目标楼层:" << now_floor_e << " 层" << endl;
    }

    void displayFloor() {
        cout << "电梯经过 " << now_floor_e << " 层" << endl;
    }

    void displayDate() {
        time_t now = time(0);
        tm localTime;
        localtime_s(&localTime, &now);
        char buffer[80];
        strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &localTime);
        cout << "当前日期和时间:" << buffer << endl;
    }
        void saveFloorHistory() {
        std::ofstream file("floor_history.txt");
        if (file.is_open()) {
            time_t now = time(0);
            tm localTime;
            localtime_s(&localTime, &now);
            char buffer[80];
            strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &localTime);

            file << "[" << buffer << "] (起始时间)\n";

            for (int floor : floor_history) {
                file << floor << "\n";
            }

            file.close();
            cout << "楼层历史记录已保存到文件。" << endl;
        }
        else {
            cout << "无法打开文件来保存楼层历史记录。" << endl;
        }
    }
};


class ExpressElevator : public ELEVATOR {
public:
    ExpressElevator() {
        all_floor = 20; // 设置更高的最高层数
    }

};

int main() {
    ELEVATOR elevator;
    elevator.start();

    ExpressElevator expressElevator;
    expressElevator.start();

    return 0;
}

程序释义

程序设计实现了一个简单的电梯系统。代码包含了一个名为 ELEVATOR 的类和一个继承自 ELEVATOR 的类 ExpressElevator

ELEVATOR 类的私有成员变量包括:

  • now_floor_e:电梯当前所在的楼层。
  • now_floor_p:乘客在电梯内的当前楼层。
  • want_floor:乘客想要去的楼层。
  • choice:表示上行或下行的选择。
  • floor_history:记录经过的楼层的向量。

ELEVATOR 类的公有成员函数包括:

  • start():开始电梯系统的运行。
  • ask():询问乘客所在的楼层。
  • arriave_now_floor_p():模拟电梯从当前楼层到达乘客所在楼层。
  • get_choice():让乘客选择上行或下行。
  • get_floor():询问乘客要前往的楼层。
  • judge():判断输入的楼层是否合法。
  • arriave_want_floor():模拟电梯从当前楼层运行到目标楼层。
  • displayFloor():显示经过的楼层信息。
  • displayDate():显示当前日期和时间。
  • saveFloorHistory():将楼层历史记录保存到文件中。

ExpressElevator 类是 ELEVATOR 类的子类,它在构造函数中将 all_floor 变量设置为更高的楼层数,表示快速电梯可以到达更高的楼层。

main 函数中,创建了一个 ELEVATOR 对象 elevator 和一个 ExpressElevator 对象 expressElevator,并分别调用它们的 start() 方法开始运行电梯系统。

整个程序的执行流程是:首先显示当前日期和时间,然后进入一个循环,循环中询问乘客所在楼层,模拟电梯运行到乘客所在楼层,然后询问乘客要前往的楼层,并模拟电梯运行到目标楼层。循环结束后,将楼层历史记录保存到文件中。

运行展示

 图1 电梯控制系统效果图

图2 floor_history.txt页面 

总结与体会

本设计针对电梯系统的功能需求进行了实现,主要完成了以下工作:

(1)系统功能设计包括:

  • 输入当前楼层和目标楼层。
  • 根据输入判断电梯运行方向。
  • 电梯运行至目标楼层,并记录经过的楼层。
  • 可以选择继续进行或退出系统。
  • 保存楼层历史记录到文件。

(2)系统软件设计由以下组成:

  • ELEVATOR类:定义了电梯的属性和方法,包括当前楼层、目标楼层、最高楼层、运行方向、楼层历史记录等。
  • ExpressElevator类:继承自ELEVATOR类,可以设置更高的最高楼层数。
  • start()方法:控制整个电梯系统的流程,包括用户输入、电梯运行、保存楼层历史记录等。
  • 其他辅助方法:如输入验证、显示楼层、显示日期和时间等。
  • 本次设计利用了C++的面向对象编程思想和相关库函数,包括iostream、fstream、vector、chrono、thread、ctime等。

(3)完成系统调试:

在设计中,已经添加了基本的输入验证和错误提示机制,并进行了简单的调试和测试。然而,仍然有几处地方需要完善,具体包括:错误处理:对于非法输入或错误操作,需要给出更具体和友好的提示信息,并提供重新输入的机制。功能扩展:根据具体需求,可以添加更多的功能和特性,如静态数据、常数据、动态创建数组或vector模板的应用、继承与派生、多态和文件流等。

猜你喜欢

转载自blog.csdn.net/m0_62919535/article/details/131133348
今日推荐