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

news2024/11/28 2:28:00

目录

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

类结构图

程序设计

程序释义

运行展示

总结与体会


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

电梯控制系统程序设计旨在通过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模板的应用、继承与派生、多态和文件流等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

死锁细究!

一、死锁的定义&危害 1、死锁是什么 发生在并发中互不想让&#xff1a;当两个&#xff08;或更多&#xff09;线程&#xff08;或进程&#xff09;相互持有对方所需要的资源&#xff0c;又不主动释放&#xff0c;导致所有人都无法继续前进&#xff0c;导致程序陷入无尽的…

学生成绩管理系统(C语言)

学生成绩管理系统 一、实现思路二、代码的实现&#xff08;1&#xff09;构造功能框架&#xff08;2&#xff09;实现各项功能 三、完整的代码四、总结 本篇博客介绍一个关于学生成绩管理系统的C语言代码&#xff0c;包含读取成绩、计算各门课程的总分和平均分、按分数排序、按…

快速实现一个分布式定时器

定时器&#xff08;Timer&#xff09;是一种在业务开发中常用的组件&#xff0c;主要用在执行延时通知任务上。本文以笔者在工作中的实践作为基础&#xff0c;介绍如何使用平时部门最常用的组件快速实现一个业务常用的分布式定时器服务。同时介绍了过程中遇到问题的一些解决方案…

手机越狱:探索自由与风险的边界

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

htmlCSS-----盒模型

目录 前言&#xff1a; 盒子 1.内容区域 2. 边框 3. 内边距区域 4. 外边距区域&#xff08;margin&#xff09; 怪异盒模型 前言&#xff1a; 前面我们学习了CSS中的选择器的使用方法&#xff0c;那这一节我们就学习CSS中的盒模型&#xff0c;通过盒模型我们可以去更好的…

uni-app引入html2canvas截图以及截长图

下载安装html2canvas 方式一&#xff0c;https://www.bootcdn.cn/ CDN网站下载html2canvas插件 这里下载后放在测项目目录common下面 页面中引入 方式二、npm方式安装html2canvas 1、npm方式下载 npm i html2canvas2、引入html2canvas import html2canvas from html2can…

数据结构——广义表

文章目录 前言二、特殊矩阵的压缩存储数组的存储结构和实现按行优先存储按列优先存储 矩阵的压缩存储稀疏矩阵 广义表 总结 前言 数组&#xff0c;数组的压缩存储&#xff0c;广义表 二、特殊矩阵的压缩存储 数组的存储结构和实现 对于多维数组&#xff0c;可以分为按行优先…

UnityVR--组件9--视频组件VideoPlayer

目录 前言 参数解释 RenderMode渲染方式 VideoPlayer类中的API 前言 在之前的VR场景中已经使用过VideoPlayer播放视频&#xff08;Unity.UI的交互&#xff08;6&#xff09;-播放视频&#xff09;&#xff0c;不过在VR中设置是有些不同的&#xff0c;这里更详细地说明一下V…

8.面向对象编程(高级部分)|Java学习笔记

文章目录 类变量和类方法类变量类变量使用注意事项和细节 类方法类方法使用注意事项和细节 理解 main 方法语法代码块代码块使用注意事项和细节讨论 单例设计模式单例模式应用实例饿汉式 VS 懒汉式 final 关键字final 使用注意事项和细节 抽象类抽象类的介绍抽象类使用的注意事…

软件测试|测试金字塔是什么,它的目的是什么,以及它包含哪些层次?

一、测试金字塔的概念&#xff1a; 测试金字塔是2009年Mike Cohn在他的著作《Succeeding with Agile》一书正式提出的。他是一个类比的概念&#xff0c;形容每一层&#xff0c;或者说不同集成阶段测试覆盖率和知行效率之间的一个相对关系。 测试金字塔最初的原型分三层&#…

chatgpt赋能python:Python循环间隔-了解如何在循环中增加延时

Python循环间隔 - 了解如何在循环中增加延时 在Python编程中&#xff0c;循环是非常常见且重要的控制语句。 它使我们可以多次执行代码块。 但是&#xff0c;在有些情况下&#xff0c;您可能需要在循环之间增加一定的延时时间。 这就是Python循环间隔的概念。 在本文中&#x…

初次使用PPYOLOE-R

目的&#xff1a;优化基于yolov5-obb旋转目标检测算法的证件区域检测&#xff0c;之前的方法是基于anchor&#xff0c;每次使用都要调试anchor&#xff1b;而ppyoloe-r是free anchor的算法&#xff1b; 源码位置&#xff1a;https://github.com/PaddlePaddle/PaddleDetection/…

学成在线----day2

1、mybatis-plus分页 pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…

【大数据之Hive】九、Hive之DDL(Data Definition Language)数据定义语言

1 数据库 [ ] 里的都是可选的操作。 1.1 创建数据库 语法&#xff1a; create database [if not exists] database_name [comment database_comment(注释)] [location hdfs_path] [with dbproperties (property_name-propertyproperty_value,...)]; 如&#xff1a; creat…

真实性能测试案例之性能分析与报告

今天主要跟大家分享一个曾经所做的真实性能测试的案例&#xff0c;主要为其中性能测试分析报告过程部分&#xff0c;希望能对你以后怎么做性能分析和报告有所帮助。这个案例的测试目的为&#xff1a;在线考试为“XX平台”中的一个重要模块&#xff0c;根据目前业务的需要&#…

ChatGPT实用使用指南 让它解你所问

Chatgpt无疑是这几年来影响力最大的AI技术之一&#xff0c;生成式的AI模型正在促进各个行业的效率和自动化发展&#xff0c;Chatgpt对于个人、企业和各个行业都有着一定的影响 在我刚接触的时候&#xff0c;发现对Chatgpt的认知太肤浅了&#xff0c;一个最强的ai聊天机器人摆在…

实时检测Aruco标签坐标及位姿opencv-python4.6和4.7版本

先说opencv-contrib-python4.7.0.72时&#xff0c;aruco下面带曲线&#xff0c;但是程序也能跑&#xff0c;可以跑检测的&#xff0c;对比4.6版本需要改三个函数 4.6装opencv-contrib-python 4.7装opencv-contrib-python 1 cv2.aruco.Dictionary_get() cv2.aruco.getPredef…

Smali的使用技巧:快速定位Android应用程序中的关键代码

简述 Smali是一种Android应用程序的Dalvik虚拟机指令集汇编语言&#xff0c;用于编写和修改应用程序的DEX文件。通过编写和修改Smali代码&#xff0c;可以实现对Android应用程序的定制化和逆向分析。Smali语言类似于汇编语言&#xff0c;直接操作Dalvik虚拟机指令集。 Smali代…

2023最火的软件测试面试宝典,你刷过没?

这是一份最近疯传的软件测试面试宝典&#xff0c;你有刷过吗&#xff1f; 面试宝典一共400页&#xff0c;包括了测试基础102页&#xff0c;Linux基础38页&#xff0c;MySQL63页&#xff0c;web测试21页&#xff0c;app测试38页&#xff0c;selenium相关50页&#xff0c;性能测试…