首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求大神指点迷津,一个电梯模拟的程序,如何实现乘客等待超过三十秒就自动离开。

2012-07-31 
求大神指点迷津,一个电梯模拟的程序,怎么实现乘客等待超过三十秒就自动离开。。我的源程序是这样的//Button.

求大神指点迷津,一个电梯模拟的程序,怎么实现乘客等待超过三十秒就自动离开。。
我的源程序是这样的
//Button.h
#ifndef BUTTON_H_
#define BUTTON_H_

#include"define.h"

class Button {
friend class Elevator;
private:
int light[L];//每个元素存储那个目的地的人数
int people;
public:
Button()
{
for(int i=0;i<L;i++)
light[i]=0;
people=0;
}
~Button()
{

}
int press_button();//返回int为目的地,即为乘客所按;
  void clear_button(int); 
};

#endif
#define L 14 // 总楼层;

#define stop 0 
#define up 1 
#define down 2 //电梯状态;
#define MAX 4 //限载12人;
#define V 5 //电梯运行速度,乘客进出电梯速度;每隔 V*3 秒有一位新乘客;
//Elevator.h 

#ifndef ELEVATOR_H_
#define ELEVATOR_H_

#include"define.h"
#include"FFloor.h"
#include"Button.h"

class Elevator
{
friend class FFloor;
private:
int floor;//电梯所在楼层
//enum door{ open,closed};//电梯门 
//enum status{ stop, up, down};//电梯状态
int status;//电梯运行状态
public:
Elevator()
{
floor=0;
status=stop;
}

Elevator(int floor_,int status_)
{
floor=floor_;
if(status_<3 && status_>=0)
status=status_;
else status=stop;

}

~Elevator()
{
}

  void new_status(Button &,FFloor*);
void move(Button &,FFloor*); //上或者下 
void rise(Button &,FFloor*);//向上一层
void low(Button &,FFloor*); //向下一层
void display(Button&);
};


#endif  
#ifndef FFLOOR_H_
#define FFLOOR_H_

//FFloor.h
class FFloor
{
friend class Elevator;
private:
int ups;//等待上楼的人数
  int downs;//等待下楼的人数
public:
FFloor()
{
ups=0;
downs=0;
}
FFloor(int ups_, int downs_)
{
ups=ups;
downs=downs_;
}
~FFloor()
{
}
void come(int);//有人来乘梯
void into_up(void);//进入电梯一个向上去的人
void into_down(void);//进入电梯一个向下去的人
void display(int);
};

#endif
//Button.cpp
#include"Button.h"
#include<stdlib.h>

int Button::press_button()
{
int randfloor=rand()%L;
light[randfloor]++;//随机指定要去的楼层;可以是本楼层;
people++;
return randfloor;
}
void Button::clear_button(int floor)
{
light[floor]--;
people--;
}

#include<iostream>
#include"Elevator.h"
//#include<Button.h>
//#include<FFloor.h>
using namespace std;
void Elevator::new_status(Button & button,FFloor* Floor )
{
int k;
  switch(status)
{
case stop: //若此时空梯静止;
for( k=floor;k<L;k++) //循环检查上面楼层是否有乘客等待;
{
if(Floor[k].ups!=0||Floor[k].downs!=0) //上面有乘客上或者下;
{status=up;return;}
}
for( k=floor-1;k>=0;k--) //循环检查下面楼层是否有乘客等待;
{
if(Floor[k].ups!=0||Floor[k].downs!=0) //下面有乘客上或者下;
{status=down;return;}
}
status=stop;return ;
case up: //若此时电梯向上
for( k=floor+1;k<L;k++)
if(button.light[k]!=0||Floor[k].ups!=0||Floor[k].downs!=0)
//电梯里有人去上面;上面有人上或下
return;//维持向上状态;
if(Floor[floor].ups!=0)//本层单独考虑;
return;//维持向上状态;

for( k=floor-1;k>=0;k--)
if(button.light[k]!=0||Floor[k].downs!=0||Floor[k].ups!=0)
//电梯里有人下;下面有人下或上
{status=down;return;}
if(Floor[floor].downs!=0)//本层有人下;
{status=down;return;}//维持向上状态;

status=stop; return ;//仅有乘客在本层出电梯时采取默认的 停 状态;
case down: //若此时电梯向下
for( k=floor-1;k>=0;k--)
if(button.light[k]!=0||Floor[k].downs!=0||Floor[k].ups!=0) 
//电梯里有人下;下面有人下或上
return;
if(Floor[floor].downs!=0)//本层单独考虑;


return;//维持向下状态;

  for( k=floor;k<L;k++)
if(button.light[k]!=0||Floor[k].ups!=0||Floor[k].downs!=0)  
//电梯里有人上;上面有人上或下
{status=up; return;}

if(Floor[floor].ups!=0)//本层有人上楼;
{status=up; return;}//维持向上状态;

status=stop;break;//仅有乘客在本层出电梯时采取默认的 停 状态;
default: cout<<"电梯运行状态出现错误!" ; return ;
}
}

void Elevator::move(Button & button,FFloor* Floor) //上或者下
{
if(status==up)
rise( button, Floor);
  else if(status==down)  
low( button, Floor);
else return;
}

void Elevator::rise(Button & button,FFloor* Floor)
{
if(button.light[floor]) //有乘客在此层下;
{
button.clear_button(floor);//电梯内减少一个乘客;
return;
}
if(Floor[floor].ups>0 && button.people<MAX) //有乘客搭电梯上且没超重;
{
Floor[floor].into_up(); //楼内上的人减少一个;
button.press_button();//电梯内增加一个人;
return;
}
if(button.people>=MAX)
cout<<"超重!";
  floor++;//没人下没人下的话就不停了;
}

void Elevator::low(Button & button,FFloor* Floor)
{
if(button.light[floor]>0)
{
button.clear_button( floor);//乘客出电梯;
return;
}

if(Floor[floor].downs>0 && button.people<MAX) //有乘客要搭电梯下;
{
Floor[floor].into_down(); //楼内减少一个乘客;
  button.press_button(); //电梯内增加一个乘客;
return;
}
if(button.people>=MAX)
cout<<"超重!";
floor--;//没人下没人下的话就不停了;
}

void Elevator::display(Button& button )
{
cout<<" 在第 "<<floor+1<<" 层";
if(status==stop) cout<<" --停.";
else if(status==up) cout<<" --上.";
else cout<<" --下.";
cout<<" 内有 "<<button.people<<" 位乘客.";
for(int destination=0;destination<L;destination++)
if(button.light[destination])
cout<<" 去第"<<destination+1<<"层";

cout<<endl;
}
#include"FFloor.h"
#include<iostream>
using namespace std;

void FFloor::come(int toward)
{
if(toward) ups++;//toward若非零理解为上
else downs++;//toward若为零理解为下
}

void FFloor::into_down()
{
downs--;
}

void FFloor::into_up()
{
ups--;
}


void FFloor::display(int i)
{
if(ups!=0 || downs!=0) //有人的话打印出来;
cout<<"第 "<<i+1<<" 层:有 "<<ups<<" 位上楼,"<<downs<<" 位下楼."<<endl;

}
#include<iostream>
#include<windows.h>
#include<stdlib.h>
#include<Time.h>
#include"Elevator.h"
using namespace std;

int main()
{
Button button[4];//each button fits for an elevator;
Elevator elevator[4];
elevator[0]=Elevator(0,0);
  elevator[1]=Elevator(L/2,0);
  elevator[2]=Elevator(L-1,0);
elevator[3]=Elevator(0,0);//when beginning, defaut the position and condition of each elevator
FFloor Floor[L] ;
srand( time(0) );
int floor_num;//store the floor which a new passenger arrives at;
int toward; //store to direction of a new passenger ;
int i=0,nowtime=0,totaltime=0;
int renshu[14]={0};

  cout<<"电梯模拟运行中..."<<endl<<"请输入模拟时间(秒数):";
cin>>totaltime;
cout<<"起始时刻:"<<endl<<"各楼层等客为0。"<<endl;
for(i=0;i<4;i++)
{
cout<<i+1<<" 号电梯:";
elevator[i].display(button[i]);
}
while(nowtime<=totaltime)
{
cout<<endl<<endl<<"时间:"<<nowtime<<endl;


  if (nowtime%(2*V)==0) //每10秒来一个乘客;
for(int r=rand()%2+1,i=0; i<r; i++)//r为出现乘客的个数;
{
floor_num=rand() % L;//随机决定那层来人;
  renshu[floor_num]++;
if(floor_num==L-1)
toward=0;//下;
 
else if(floor_num==0)
toward=1;//上;
 
else
toward=rand()%2;//随机决定乘客是上还是下
Floor[ floor_num ].come(toward);// carry out the function;
cout<<"新乘客出现在第 "<<floor_num+1<<" 层."<<" 要 ";
(toward==1)? cout<<"上楼."<<endl:cout<<"下楼."<<endl;
 
}

for(i=0;i<4;i++)
elevator[i].new_status( button[i], Floor);//更新电梯运行方向;
 
for(i=0;i<L;i++)
Floor[i].display(i);
for(i=0;i<4;i++)
{
cout<<i+1<<" 号电梯:";
elevator[i].display(button[i]);
}
for(i=0;i<4;i++)
  elevator[i].move(button[i], Floor);//运行;

  Sleep(V*1000);
nowtime+=V;

}
{
for(i=0;i<14;i++)
{
cout<<"第"<<i+1<<"层有"<<renshu[i]<<"人次使用"<<endl;
}
}
cout<<"------------GAME OVER!------------"<<endl;
return 1;
}





[解决办法]
每层电梯门口设置一个队列,队列中的数据结构是 电梯乘客 + 进队列时间
每循环一次就判断每个队列头的乘客是否等了30秒,是的话出队列
这个电梯的等待队列和那些ATM等待队列的实现很类似

热点排行
Bad Request.