首页 > 其他分享 >小电梯,学问大

小电梯,学问大

时间:2023-06-15 15:02:37浏览次数:34  
标签:target floor int add ele 电梯 printf 学问


为了帮助新人学习C++,为了保证既直观,又具有一定的灵活度,电梯算法是一个不错的切入点。写了个小电梯作为demo。


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <vector>
#include <curses.h>

class Elevator {
public:
    Elevator() : init_floor_(1), park_floor_(1)
    {
      // empty
    }

    // 按下某个楼层
    void add_target_floor(int floor)
    {
      if (floor > 0 && floor <= MAX_FLOOR) {
        seq_.push_back(floor);
      }
    }

    // 初始楼层
    void set_init_floor(int init_floor)
    {
      init_floor = init_floor_;
    }

    // 停机楼层
    void set_park_floor(int park_floor)
    {
      park_floor_ = park_floor;
    }

    void pause()
    {
      // TODO: xiaochu.yh
    }

    int run()
    {
      int ret = 0;
      if (init_floor_ <= 0 || park_floor_ <=0 || init_floor_ > MAX_FLOOR || park_floor_ > MAX_FLOOR) {
        ret = -1;
      } else {
        int last_floor = init_floor_;
        if (seq_.size() > 0) {
          for (int i = 0; i < seq_.size(); ++i) {
            runTo(last_floor, seq_[i]);
            last_floor = seq_[i];
          }
        }
        runTo(last_floor, park_floor_);
      }
      return ret;
    }

private:
    void clearLine()
    {
      printf("\r");
      for (int i = 0; i < MAX_FLOOR; ++i) {
        printf(" ");
      }
      printf("\r");
    }

    void printStatus(int floor, bool arrived = false)
    {
      clearLine();
      for (int i = 0; i < floor - 1; ++i) {
        printf(".");
      }
      printf(arrived ? "*" : "#");
      fflush(stdout);
      sleep();
    }


    void runTo(int from, int to)
    {
      // down stairs
      while (from > to) {
        printStatus(from);
        --from;
      }

      // up stairs
      while (from < to) {
        printStatus(from);
        ++from;
      }

      // 到达后停一下
      beep();
      printStatus(from, true);
      sleep();
    }

    void sleep()
    {
      usleep(100000);
    }
    void  beep()
    {
      printf("\a");
    }
private:
    static const int MAX_FLOOR = 80;
    int init_floor_;
    int park_floor_;
    std::vector<int> seq_;

};

int main()
{
  Elevator ele;
  ele.set_park_floor(80);
  ele.set_init_floor(1);
  ele.add_target_floor(3);
  ele.add_target_floor(9);
  ele.add_target_floor(1);
  ele.add_target_floor(12);
  ele.add_target_floor(23);
  ele.add_target_floor(54);
  ele.run();
  printf("\r\n");
}




代码编译运行方法:代码保存为main.cpp,然后调用:

g++ main.cpp
./a.out




如果你是一个C++老手,请指出上面代码中不合适的地方。有很多哦!他们非常严重地影响了Elevator类的可移植性,随着开发的深入,这个类一定会越来越多地被修改,不符合Close For Modification的原理。



上面是作业的第一步,这里采用了FIFO的算法,这个题目可以往下面几个方向扩展:

1. 功能扩展:调整电梯的一些功能,比如停顿时间,运行速度(变速),增加门铃功能,增加多人入梯模拟功能,程序是否能支持交互,运行过程中接受用户输入楼层?等等

2. 算法扩展:能否让电梯支持多种调度算法?FIFO,最省时算法,最节能算法,最满意算法,等等。如何保证增加算法时不需要修改过多源码。

3. 1和2的综合扩展:如果是多台电梯,代码该如何写?

4. 界面扩展:如果将来可能不采用命令行界面,而是采用图形界面,甚至直接用到实际的电梯芯片里面去,代码该如何设计才能保证修改量更小?

5. 代码规划:学习如何规划代码,学习写Makefile,不要把所有功能放到一个文件中,采取模块化的方式组织代码。


小小的电梯,还是很考验同学们设计程序的能力滴哦~

如果你深入动手实践本题,一定会对MVC有更深刻的理解。



标签:target,floor,int,add,ele,电梯,printf,学问
From: https://blog.51cto.com/u_16162111/6492547

相关文章

  • C++ Builder 初学问与答(二)
     2.文本输入组件11)问:如果要实现文本输入,在C++Builder中应该怎么办? 答:C++Builder常用文本输入组件来实现,常用的文本输入组件有Edit、MaskEdit、Memo和RichEdit。他们的主要不同在于Edit和MaskEdit用于输入单行文本,而Memo和RichEdit可以输入多行文本。此外Label组件也可用来进行......
  • C++ Builder 初学问与答(一)
    一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另一种方法来重新演译我的思维吧,最近有些忙,那几篇没有写完的文章,我也会尽快写完的,至......
  • 电梯的测试点__肖sir___整理测试点
    电梯的测试点===============================功能测试电梯内、外按键(包括上、下、楼层数、关闭按钮)正常响应且指示灯亮电梯正常上升、下降电梯门正常打开、关闭电梯所有按钮层数是否有效且可达电梯的承载量电梯空间大小电梯内的灯光电梯内的通风情况电梯的报警装置同一栋......
  • 电梯演讲2.0
    电梯演讲2.0:电梯演讲和原型展示说明【智能排班系统电梯演讲-哔哩哔哩】https://b23.tv/tEymGh6 原型展示说明:我们的团队在过去的几个月里,根据我们认为是目标客户,即需要排班的职业人员们的所需求,不断地研发和改进这个系统,希望能够解决他们的痛点和需求。在系统的主页面,你们可以看......
  • 1204. 最后一个能进入电梯的人
    【题目】表:Queue+-------------+---------+|ColumnName|Type   |+-------------+---------+|person_id  |int    ||person_name|varchar||weight     |int    ||turn       |int    |+-------------+---------+person_id是......
  • 打卡 c语言趣味编程 爱因斯坦的数学问题
    问题描述:爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最后剩一阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。只有每次跨7阶,最后才正好一阶不剩。请问在1~N内,有多少个数能满足?思路:使用一个for循环来遍历从1到N的所有数,对于每......
  • 6部10层电梯程序,采用以太网通信。 2019年西门子智能制造挑战赛,
    6部10层电梯程序,采用以太网通信。2019年西门子智能制造挑战赛,6部10层电梯程序,包含各个功能模块。采用博途软件V14sp1编程,采用以太网通信,控制器选用PLCS7-1200。主要涉及逻辑控制、梯形图语言、置位复位。ID:9519669366163695......
  • 6部10层电梯程序,采用以太网通信。 2020年西门子智
    6部10层电梯程序,采用以太网通信。2020年西门子智能制造挑战赛,6部10层电梯程序,包含各个功能模块。采用博途软件V14sp1编程,采用以太网通信,控制器选用PLCS7-1200。主要涉及逻辑控制、梯形图语言、置位复位。ID:4419662840760979......
  • 17.爱因斯坦的数学问题
       代码实现:#include<stdio.h>intmain(){inti;//阶梯数intcount=0;//记录满足条件的阶梯个数for(i=1;i<1000;i++){if(i%2==1&&i%3==2&&i%4==3&&i%5==4&&i%6==......
  • 马克思的数学问题
    一问题描述一共有三十个人其中有男人女人和小孩男人吃饭花3先令女人2先令小孩1先令一共花费50问男人女人小孩的人数。二设计思路多种情况运用穷举法通过循环嵌套将各个符合条件的结果输出。三程序流程图 四伪代码实现#include<iostream>usingnamespacestd;intmain(){ ......