电梯控制模拟代码简析(MFC)

刚上传了一个完全模拟我们学校图书管电梯的程序,有需要者可以下载下来看下(http://download.csdn.net/user/xiadasong007)。

(由于百度一个帖子的原因,今天被迫一下午都在忙这个程序,幸好还算是比较简单的东西,呵呵)

今天先休息一下,看下《英雄-第一季》明天再来说说代码实现的过程,来看看有什么难的?

                                                                                                                   2009.3.12

 

电梯控制模拟代码思路简单解析:

要模拟电梯的运行情况,自然是要画图的,基本画线画方形应该都没有问题,这样先把电梯的基本结构画出来,接着便是添加按钮,并为每个按钮添加单击消息。

 

电梯模拟有两点地方比较重要,第一是如何让电梯运行到我们需要的地方,第二是如何在我们随意按下多个按钮后电梯该如何运行。

注意电梯有一个特点是:一次上,一次下,中间过程中不会改变方向。

 

设楼层高度H

定时器每发送一次消息,电梯走一步。

 

第一个要点:让电梯运行到我们需要的楼层

1:在起始时刻,电梯在1楼,比如说我们现在想去5楼,那么就需要将电梯向上移动4*H高度,但是有可能电梯在2.5楼(楼梯不是正好在2楼,比二楼高0.5*H)时有人想去4楼,这时电梯必须能改变它的目标。

2:对于电梯运行状态的变量的选取是很重要的地方,选择不好可能会引起电梯达不到我们的要求。我在这个程序中选择了2个变量,一个是电梯的步数m_iCount,一个是电梯当前所在楼层m_iCurrentFloorm_iCount用来计数,电梯60步走一个H高度,m_iCount初始化为0,电梯走一步,m_iCount+=1,这样一旦m_iCount==60,则m_iCurrentFloor+=1(上去)或m_iCurrentFloor - =1(下来),并将m_iCount重置为0,继续计数。

这样不管电梯运行到何处,我们都能知道它的具体位置。而且只有m_iCount==60时,电梯才有机会停下了,这样便控制了电梯不会停在一些莫名其妙的地方。

3:电梯停下来时,它所在楼层的对应的按钮应该无效

4:电梯到了所需要的楼层时,可以停止定时器,过了一会后再启用它。(可以用一个新的定时器来做到,但2个定时器不能共存)

 

第二个要点:如何保存按钮:

1:对于电梯使用者来说,电梯要满足所有人的需求,因此电梯必须能保存每个客户点击的按钮。

2:既然要保存,用列表是不错的选择,可是那种最合适呢?想想STL中的几个容器,不必多想,首选当然是set容器,该容器能自动排序,这个功能实在是再好不过了。

3:但是,现在电梯向上运行到5楼,还有人要去12479楼,前面说过,电梯一次一个方向,没有远近关系的影响,因此电梯会先去79楼,回来时经过421楼。

鉴于此,我们需要用两个set对象来保存需求信息。一个保存上楼的,一个保存下楼的。

4:这样,按钮发出的消息很简单,就是将它的名字保存到set对象中。

5:定时器每次响应,都会去检查set,上楼时检查set::begin(),下楼是检查set::end()-1,以此来获取最新信息,及时调整目标。

6:若电梯到达要求的楼层,则在set集中删掉该层层号即可。若删空了,则说明要转向或停止运行了,程序中m_bDown控制电梯(一次一个)方向。


其他细节问题略。

注:本程序只是为了将核心部分的内容写出来,其他附加功能一切从删

如果还有什么问题,请再说明。

                                                                                        2009.3.13

C++源代码 注重类的交互 片段 #include using namespace std; #include "elevator.h" //Elevator class definition #include "person.h" //Person class definition #include "floor.h" //Floor class definition //constants that represent time required to travel //between floors and direction of the elevator const int Elevator::ELEVATOR_TRAVEL_TIME = 5; const int Elevator::UP = 0; const int Elevator::DOWN = 1; //constructor Elevator::Elevator( Floor &firstFloor, Floor &secondFloor) : elevatorButton( * this ), currentBuildingClockTime( 0 ), moving( false ), direction( UP ), currentFloor( Floor::FLOOR1 ), arrivalTime( 0 ), floor1NeedsService( false ), floor2NeedsService( false ), floor1Ref( firstFloor ), floor2Ref( secondFloor ), passengerPtr( 0 ) { cout << "elevator constrcuted" <<endl; }// end Elevator constructor //destructor Elevator::~Elevator() { delete passengerPtr; cout << "elevator destructed" << endl; }//end Elevator destructor //give time to elevator void Elevator::processTime( int time ) { currentBuildingClockTime = time; if ( moving ) //elevator is moving processPossibleArrival(); else processPossibleDeparture(); if ( !moving ) cout << "elevator at rest on floor " << currentFloor << endl; }// end function processTime // when elevator is moving, determine if it should stop void Elevator::processPossibleArrival() { //if elevator arrives at destination floor if ( currentBuildingClockTime == arrivalTime ) { currentFloor = ( currentFloor == Floor::FLOOR1 ? Floor::FLOOR2 : Floor::FLOOR1); //update current floor direction = ( currentFloor == Floor::FLOOR1 ? UP : DOWN ); //update direction cout << "elevator arrives on floor " << currentFloor <<endl; // process arrival at currentFloor arriveAtFloor( currentFloor == Floor::FLOOR1 ? floor1Ref : floor2Ref); return; }//end if //elevator still moving cout << "elevator moving " << ( direction == UP ? "UP" : "DOWN"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值