C#控制台模拟电梯工作原理

每天上下楼都是乘坐电梯的,就想电梯的工作原理是什么呢?于是自己写了个控制台程序来模拟一下电梯的工作原理!
采用面向对象的编程思想!将电梯拆解为两部分;
第一部分就是每个楼层的控制器(每个楼层都有叫梯按钮的哈,一个向上一个向下)
第二部分就电梯间了。电梯间里有楼层按钮,你想上那个楼层就可以按哪个按钮了!
技术难点:状态刷新、命令顺序、电梯运行

核心代码一:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Elevator
{
  /// <summary>
  /// 楼层类,每个楼层有向上叫梯命令和向下叫梯命令
  /// </summary>
  public class Floor
  {
    Elevator elevator;
    /// <summary>
    /// 楼层号
    /// </summary>
    private int _iFloorNo;

    public int IFloorNo
    {
      get { return _iFloorNo; }
      set { _iFloorNo = value; }
    }
    /// <summary>
    /// 上行需求
    /// </summary>
    private bool _boolUp = false;
    /// <summary>
    /// 下行需求
    /// </summary>
    private bool _boolDown = false;

    private bool _boolStop = false;

    public bool BoolStop
    {
      get { return _boolStop; }
      set { _boolStop = value; }
    }

    #region 构造函数

    public Floor(int f,Elevator e)
    {
      _iFloorNo = f;
      elevator = e;
    }

    public Floor(int f)
    {
      _iFloorNo = f;
    }

    public Floor()
    {
    }
    #endregion

    /// <summary>
    /// 获取本层是否停靠,是否为命令层
    /// </summary>
    /// <returns>停靠true;过false;</returns>
    public bool GetStatus()
    {
      return _boolDown || _boolUp;
    }

    /// <summary>
    /// 上行返回1;下行返回-1;本层为目的地返回0;
    /// </summary>
    /// <returns></returns>
    public int GetStatusFlag()
    {
      if (_boolDown)
      {
        return -1;
      }
      else if(_boolUp)
      {
        return 1;
      }
      else if(_boolStop)
      {
        return 0;
      }
      else
      {
        return -999;
      }

    }

    /// <summary>
    /// 上楼命令
    /// </summary>
    public void CommandUp()
    {
      _boolUp = true;
      elevator.GoToCommandFloor();
    }

    /// <summary>
    /// 下楼命令
    /// </summary>
    public void CommandDown()
    {
      _boolDown = true;
      elevator.GoToCommandFloor();
    }

    /// <summary>
    /// 楼层到达状态刷新
    /// </summary>
    public void Refresh()
    {
      _boolUp = false;
      _boolDown = false;
      _boolStop = false;
    }

    /// <summary>
    /// 楼层比较看楼层号
    /// </summary>
    /// <param name="floor"></param>
    /// <returns></returns>
    public int Compare(Floor floor)
    {
      int result = 1;
      if (this._iFloorNo > floor._iFloorNo)
      {
        result = 1;
      }
      else if (this._iFloorNo < floor._iFloorNo)
      {
        result = -1;
      }
      else
      {
        result = 0;
      }
      return result;
    }
  }
}

核心代码二:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Elevator
{
  /// <summary>
  /// 电梯类,有楼层选择方法
  /// </summary>
  public class Elevator
  {
    #region 属性

    /// <summary>
    /// 当前楼层
    /// </summary>
    public Floor _floorCurrent ;
    /// <summary>
    /// 全部楼层
    /// </summary>
    public List<Floor> _floorAll = new List<Floor>();

    #endregion

    /// <summary>
    /// 我想在所输入参数楼层停止
    /// </summary>
    /// <param name="floor">想要停止的楼层</param>
    public void CommandStop(Floor floor)
    {
      floor.BoolStop = true;
      GoToTargetFloor();
    }

    /// <summary>
    /// 电梯向上运行,运行到floor层
    /// </summary>
    /// <param name="floor"></param>
    public void GoUp(Floor floor)
    {
      if (_floorCurrent.Compare(floor) < 0)
      {
      Thread.Sleep(300);
      Console.WriteLine("上行:" + _floorCurrent.IFloorNo);
      int index = _floorAll.IndexOf(_floorCurrent);
      _floorCurrent = _floorAll[index + 1];
      GoUp(floor);
      }
      else {
        Thread.Sleep(500);
        Reach(floor);
      }
    }

    /// <summary>
    /// 电梯向下运行
    /// </summary>
    public void GoDown(Floor floor)
    {
      if (_floorCurrent.Compare(floor) > 0)
      {
        Thread.Sleep(300);
        Console.WriteLine("下行:" + _floorCurrent.IFloorNo);
        int index = _floorAll.IndexOf(_floorCurrent);
        _floorCurrent = _floorAll[index - 1];
        GoDown(floor);
      }
      else {
        Thread.Sleep(500);
        Reach(floor);
      }
    }

    /// <summary>
    /// 前往命令层,循环列表是否有命令层
    /// </summary>
    public void GoToCommandFloor()
    {
      foreach (var item in _floorAll)
      {
        if (item.GetStatus())
        {
          if (_floorCurrent.Compare(item) < 0)
          {
            GoUp(item);
          }
          else if (_floorCurrent.Compare(item) > 0)
          {
            GoDown(item);
          }
        }
      }
    }

    /// <summary>
    /// 前往目标楼层
    /// </summary>
    public void GoToTargetFloor() {

      foreach (var item in _floorAll)
      {
        if (item.GetStatusFlag()==0)
        {
          if (_floorCurrent.Compare(item) < 0)
          {
            GoUp(item);
          }
          else if (_floorCurrent.Compare(item) > 0)
          {
            GoDown(item);
          }
        }
      }
    }

    /// <summary>
    /// 到达楼层命令
    /// </summary>
    public void Reach(Floor f)
    {
      Console.WriteLine("电梯门打开,停靠层:"+f.IFloorNo);
      f.Refresh();
    }

  }
}

核心代码三:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Elevator
{
  class Program
  {
    static void Main(string[] args)
    {
       Elevator elevator = new Elevator();
      List<Floor> lfloor = new List<Floor>();
      Floor f1 = new Floor(1, elevator);
      Floor f2 = new Floor(2, elevator);
      Floor f3 = new Floor(3, elevator);
      Floor f4 = new Floor(4, elevator);
      Floor f5 = new Floor(5, elevator);
      Floor f6 = new Floor(6, elevator);
      Floor f7 = new Floor(7, elevator);
      Floor f8 = new Floor(8, elevator);
      Floor f9 = new Floor(9, elevator);
      Floor f10 = new Floor(10, elevator);
      lfloor.Add(f1);
      lfloor.Add(f2);
      lfloor.Add(f3);
      lfloor.Add(f4);
      lfloor.Add(f5);
      lfloor.Add(f6);
      lfloor.Add(f7);
      lfloor.Add(f8);
      lfloor.Add(f9);
      lfloor.Add(f10);

      elevator._floorAll = lfloor;
      //设置当前楼层
      elevator._floorCurrent = f1;
      //2楼叫梯 想下楼
      f2.CommandDown();
      //目标楼层为1楼
      elevator.CommandStop(f1);
      //4楼叫梯
      f4.CommandUp();
      //目标楼层为8楼
      elevator.CommandStop(f8);

      Console.ReadLine();
    }
  }
}

以上所述就是本文的全部内容了,希望对大家熟练掌握C#能够有所帮助。

(0)

相关推荐

  • C#控制台输出进度和百分比的实例代码

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 {     class Program     {         static void Main(string[] args)         {             bool isBreak = false;             C

  • c#实现简单控制台udp异步通信程序示例

    实现客户端发送请求,服务器端响应机制 UDP客户端代码 复制代码 代码如下: using System;using System.Text;using System.Net;using System.Net.Sockets; namespace Client{    class Program    {        //客户端 Socket对象        private static Socket clientSocket;        //服务器端 终点        private

  • C#控制台程序中处理2个关闭事件的代码实例

    应用场景 我们开发的控制台应用,在运行阶段很有可能被用户Ctrl+C终止或是被用户直接关闭.如果我们不希望用户通过Ctrl+C终止我们的程序,就需要对Ctrl+C或关闭事件作处理. 处理方法 在.net平台下Console类有个CancelKeyPress事件可以处理Ctrl+C,不过对于直接关闭控制台应用,这种处理就无能为力了. 不过Windows API中有个SetConsoleCtrlHandler函数可以处理这两种关闭事件. C#处理代码如下: 复制代码 代码如下: static cla

  • c#在控制台输出彩色文字的方法

    "Hello World!"的程序写过不少,不过都是在黑色背景的控制台上显示白色的文字.这次决定写点特别的,让"Hello World!"变成彩色的文字. 示例代码如下: 复制代码 代码如下: using System;using System.Runtime.InteropServices; [assembly:CLSCompliant(true)]namespace ColorConsole{    public sealed class HelloWorld 

  • c#取得控制台应用程序根目录

    1.取得控制台应用程序的根目录方法 方法1.Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径方法2.AppDomain.CurrentDomain.BaseDirectory 获取基目录,它由程序集冲突解决程序用来探测程序集 2.取得Web应用程序的根目录方法 方法1.HttpRuntime.AppDomainAppPath.ToString();//获取承载在当前应用程序域中的应用程序的应用程序目录的物理驱动器路径.用于App_Data中获取方法2

  • C#控制台带参数程序源码编写实例讲解

    像ipconfig /all 这样的CMD命令想必大家都知道,但是很多童鞋可能不知道怎么写这样的控制台带参数的程序,其实很简单,我们先看建立项目的默认代码: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _1 { class Program { static void Main(string[] args) { } } } 好了.

  • C#控制台模拟电梯工作原理

    每天上下楼都是乘坐电梯的,就想电梯的工作原理是什么呢?于是自己写了个控制台程序来模拟一下电梯的工作原理! 采用面向对象的编程思想!将电梯拆解为两部分: 第一部分就是每个楼层的控制器(每个楼层都有叫梯按钮的哈,一个向上一个向下) 第二部分就电梯间了.电梯间里有楼层按钮,你想上那个楼层就可以按哪个按钮了! 技术难点:状态刷新.命令顺序.电梯运行 核心代码一: using System; using System.Collections.Generic; using System.Linq; usin

  • Python代码模拟CPU工作原理

    目录 一.引言 二.CPU工作原理 1 各部件工作原理 2 协同工作原理 三. Python 实现 CPU 各组成部分 1 RAM 存储器 2 Adder 加法器 3 Register 寄存器 4 8bit 21选择器 四.集成 CPU 理解 CPU 工作原理,重要的是理解 pc 不停地自增地址,顺序执行程序指令.当遇到跳转指令时,会将 pc 重置为新地址.在顺序执行程序指令的过程中,每一步都是解析程序指令.产生控制信号,进而控制所有 CPU 相关器件的工作状态,产生程序计算结果,保存进各寄存器

  • 详解spring security filter的工作原理

    这篇文章介绍filter的工作原理.配置方式为xml. Filter如何进入执行逻辑的 初始配置: <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapp

  • vue-router相关基础知识及工作原理

     前言 今天面试被问到 vue的动态路由,我竟然没有回答上来,感觉不是什么难得问题.好久没有看vue-router的文档,很多用的东西和概念没有对上.回来一看什么是动态路由就傻眼了.看来有必要把vue -router相关知识总结一下,好丢人的感觉. 单页面应用的工作原理 我理解的单页面工作原理是通过浏览器URL的#后面的hash变化就会引起页面变化的特性来把页面分成不同的小模块,然后通过修改hash来让页面展示我们想让看到的内容. 那么为什么hash的不同,为什么会影响页面的展示呢?浏览器在这里

  • JVM工作原理和工作流程简述

    JAVA之所以跨平台,是因为有JVM这么一个编译和运行机器,它令对于系统的操作对于用户而言是黑盒的,使得开发人员更快速和更注重软件功能的实现.然而,也因为jvm是黑盒,所以内部和底层具有不确定性,如果用状态机来表示jvm,那么jvm就是一种现役复制不确定的状态机,因为它的状态和表现跟系统.底层.硬件等等都有关系,从而状态是不确定,如果在分布式应用中,jvm一直以来兼容性都不是很好,这就是主要原因.尽管如此,就单一的系统而言,弄清楚jvm运行的来龙去脉,对于系统的运行至关重要. 理解jvm的运行原

  • Jmeter工作原理及常见错误解析

    工作原理 错误解析汇总 JMeter结果树响应数据中文乱码解决办法 打开jmeter配置文件搜索encoding修改编码格式改为utf-8 Jmeter服务器反馈登陆不成功问题 导入到JMeter后,执行场景,发现登录校验成功,但后续的动作都未成功: 问题原因:在登录校验成功后,进行重定向时,Cookie被重置的: 解决办法:校验页面的HTTP请求中,有看到一个:自动重定向.跟随重定向的设置: 修改默认的"自动重定向"为"跟随重定向"重新执行场景.(改为追随重定向)

  • AQS(AbstractQueuedSynchronizer)抽象队列同步器及工作原理解析

    目录 前言 AQS是什么? 用银行办理业务的案例模拟AQS如何进行线程管理和通知机制 结语 前言 AQS 绝对是JUC的重要基石,也是面试中经常被问到的,所以我们要搞清楚这个AQS到底是什么?骑工作原理是什么? AQS是什么? AQS,AbstractQueuedSynchronizer,即队列同步器.它是构建锁或者其他同步组件的基础框架(如ReentrantLock.ReentrantReadWriteLock.Semaphore等),JUC并发包的作者(Doug Lea)期望它能够成为实现大

  • Vue 前端路由工作原理hash与history的区别

    目录 什么是路由? vue-router的工作原理 1.mode:'hash',在URL中会多'#' 2.mode:'history' 什么是路由? 路由分两种: 前端路由:Hash 地址与组件之间的对应关系 后端路由:浏览器 请求地址+请求方式 与 后端 业务逻辑 之间的一个映射关系 SPA与前端路由: SPA (单页面应用,全称为:Single-page Web applications) 指的是一个 web 网站只有唯一的一个 HTML 页面,所有组件的展示与切换都在这唯一的一个页面内完成

  • react  Suspense工作原理解析

    目录 Suspense 基本应用 Suspense 原理 基本流程 源码解读 - primary 组件 源码解读 - 异常捕获 源码解读 - 添加 promise 回调 源码解读-Suspense 首次渲染 primary 组件加载完成前的渲染 primary 组件加载完成时的渲染 利用 Suspense 自己实现数据加载 Suspense 基本应用 Suspense 目前在 react 中一般配合 lazy 使用,当有一些组件需要动态加载(例如各种插件)时可以利用 lazy 方法来完成.其中

  • 详解JSP 中Spring工作原理及其作用

    详解JSP 中Spring工作原理及其作用 1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3.DispatcherServlet请请求提交到目标Controller 4.Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Dispathcher查询一个或多个

随机推荐