题目: 电梯仿真程序设计
一.引言
1.编写目的:根据实际电梯的运行状况进行需求分析,运用面向对象的思想,结合MFC设计一个仿真电梯。电梯能完成正常的运作,多楼层请求。面对一个现实世界的电梯,将其抽象成一个或多个类,每个类编写相应的接口,体会面向对象的封装性、继承性、多态性。
2.定义:View(前台视图层)、Bean(后台业务逻辑层)、PlanQueue(调度队列) 、 Timer(计时器)
3.参考资料:1、《C++语言程序设计》(清华大学出版社)郑莉(著)
2、《深入浅出MFC》(华中科技大学出版社)侯俊杰(著)
3、《C++ primer中文版》(人民邮电出版社)李师贤(译)
4、《UML面向对象建模与设计》pdf版
二.任务的描述
1.目标:1)、根据实际电梯的运行状况进行需求分析;
2)、抽象电梯运行算法;
3)、设计电梯运行程序及人机交互界面;
4)、模块功能满足要求、界面友好、具有一定的健壮性;
2.功能描述:电梯可以接受各个楼层的向上、向下请求。人在电梯内,可以通过电梯内的按钮到达想要去的层数。当电梯向上运行时,接受当前电梯所在楼层之上的向上请求,在相应的楼层处停下。当电梯向下运行时,接受当前楼层之下的向下请求。电梯门开,然后 进出人,电梯最大承载人数为15,不能超载。分别用了两个Timer 来控制电梯的运行和电梯门的开关。
3.性能描述
(1)数据精确度:不存在复杂数据之间的转换,精确度100%
(2)时间特性:更新处理时间:电梯上下40ms,开关门30ms
4.运行环境:硬件:装有Windows XP的计算机。
软件:Visual C++ 6.0
5.条件与限制:同时具备硬件和软件条件
三.任务设计
1.类的划分:本系统一共有四个类:电梯类(MyElevator)、按钮类(CMyButton)、调度队列类(PlanQuene)、显示对话框类(CElevatorDlg)。
系统分为两层结构:View层、Bean层。大致框架如图:
(1) 类1:调度队列类(PlanQuene),运用循环队列存储各楼层的请求。数据成员:int * quene;int front;int rear;front、rear分别为头指针和尾指针,队列用数组实现。
成员函数:void InQuene(int n):将第n层的请求加入队列中,尾指针后移一位,rear=(rear+1)%FLOORS;实现循环。
void OutQuene(int n):请求响应完成后将该请求出队,从队头开始查,查到n将从n之后的请求向前覆盖。
BOOL SearchQuene(int n):查找队列里是否已经存储了第n层的请求。如果有返回TRUE,否则返回FALSE。
(2) 类2:电梯类(MyElevator),用于更改电梯运行状态及响应处理各层请求。
数据成员:int CurrentF; //当前电梯所在层
int CurrentP; //当前电梯内的人数
int status; //电梯状态:STOP,UP,DOWN
int * board; //电梯内键盘数组
PlanQuene * queue1; //电梯内的请求队列
BOOL start; //控制开关变量
CElevatorDlg * dlg; //电梯所在对话框
int floors; //楼层数
int maxPeopleNum; //最大人数类
成员函数:void Start(BOOL really=TRUE); //启动、停止控制
void SetStatus(); //设置更改电梯运行状态
SetStatus根据扫描goUp、goDown及队列quene1,如果电梯现在停止,若队列不为空,就取队列第一个请求与当前楼层比较,大于当前楼层就调整电梯向上,小于向下,等于时恢复相应的按钮并把该请求出队。
如果电梯正在向下,从当前楼层向下扫描各楼层,看是否有请求的楼层(goDown[i]==1表示i层有向下请求),若有跳出;没有就扫描当前楼层之上的,看是否有楼层请求(goUp[i]==1表示i层有向上请求),若有请求,调整电梯向上运行;上下都没请求时,电梯停止在当前楼层。
如果电梯正在向上,先从当前楼层向上扫描各楼层,看是否有请求的楼层,若有跳出;没有就扫描当前楼层之下的,看是否有楼层请求,若有请求,调整电梯向下;上下都没请求时,就停止在该楼层。
更改电梯运行状态算法流程图: