目录
电梯控制系统程序设计背景
电梯控制系统程序设计旨在通过C++编程实现电梯的模拟功能,使用户能够选择上行或下行,并输入要进入的楼层,程序将模拟电梯运行过程并显示经过的每一楼层层数。同时,要求电梯的输入和运行有一定的限制条件,并且在显示楼层时具有一定的延迟效果,以及能在开始运行时显示当前日期。
基本功能要求:
- 提供用户界面,让用户选择上行或下行操作,并输入要进入的楼层。
- 对用户输入的楼层号进行合法性检查,确保上行时输入的楼层号不小于当前楼层,下行时输入的楼层号不大于当前楼层。
- 模拟电梯的运行过程,显示经过的每一楼层层数,并在最终停靠的楼层的输出形式上加以突出显示。
- 在电梯开始运行时,显示当前日期。
- 程序运行直到用户关闭窗口,即电梯一旦开始运作就会持续运行。
类结构图
有专门的软件去制作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模板的应用、继承与派生、多态和文件流等。