📄 electorc++.txt
字号:
void Building::SysRun()//Run Run Run Run Run Run Run Run
{
char key;
do{
cout<<"\nchoose->";
key=getch();
switch(key){
case ENTER://Create people
cout<<"Create people..."<<endl;
SysCreatePeople();
break;
case SPACE://The elevator run to next floor
cout<<"Elevator run to next..."<<endl;
SysElevatorRunNext();
break;
case 'H':
case 'h': SysChooseHelp();break;
case ESC: //stop
cout<<"stop!!!"<<endl;
SysStop();
break;
}
}while(key!=ESC);
}
SysCreatePeople 命令生成人,
void Building::SysCreatePeople()
{
//随机产生
int rfnum=rand() % RANDOM_FLOORS_MAX +1;
int u,d;
for(int i=0; i<rfnum; i++)
{
int r=rand() % bfloors;
u=SysSearchElevatorLeastestUp(r);
d=SysSearchElevatorLeastestDown(r);
fVector[r]->CreatePeople(eVector[u],eVector[d]);
}
}
SysElevatorRunNext 命令电梯运行到下一层楼,
void Building::SysElevatorRunNext()
{
int floorAt;
for(int i=0; i<elevatorCount;i++){ //多个电梯都要运行到下一楼层
Elevator* &ep=eVector[i];
floorAt=ep->GetFloorAt()+ep->GetStatus();
Floor* &thisfloor=fVector[floorAt];
ep->floorAt=floorAt;//!!!!!!!!!!!!!!!!!改名电梯所到楼层
//the information//输出提示信息
cout<<" #Elevator No."<<ep->number<<" at floor —("<<ep->floorAt<<")—"<<endl;
/********************************************/
bool stop=false; //先设置为不停。为了之后看是否开门,
int c=0;
int r=ep->runline[floorAt];//stor
if(r>0){ //当需要停就执行以下
switch(ep->status){
case -1: //down当电梯是向下运动时
if(r & OUT){ //有人要出
// #define OPENDOOR if(!stop){ ep->BellRing(); ep->OpenDoor();stop=true; }
OPENDOOR
ep->PeopleOut();}
if(r & DOWN){ //有人要进且下
OPENDOOR
ep->PeopleEnter(thisfloor->pList[0],0); }//down
break;
case 0: //stop电梯是停止的
if(r==UP){ //有人要进且上
OPENDOOR
ep->PeopleEnter(thisfloor->pList[1],1); }//up
if(r==DOWN){ //有人要进且下
OPENDOOR
ep->PeopleEnter(thisfloor->pList[0],0); }//down
if(r==UP_DOWN){ //上下都有人根据人数确定是该上还是下
OPENDOOR
if(fVector[floorAt]->pList[0].size() < fVector[floorAt]->pList[1].size())
ep->PeopleEnter(thisfloor->pList[1],1); //up
else
ep->PeopleEnter(thisfloor->pList[0],0); //down
}
break;
case 1: //up 电梯向上运行
if(r & OUT) { //有人要出
OPENDOOR
ep->PeopleOut(); }
if(r & UP){ //有人要进且上
OPENDOOR
ep->PeopleEnter(thisfloor->pList[1],1); }//up
break;
}//END_switch
}//end_if
//deel the status of 0
if(ep->status==0){//电梯是停止的时候
if(r==TT){ //电梯在此楼层没有人进和,此时要考虑其他楼层
Time tm,tt;
int tem=-1;
tm.CurTime();
for(int j=0;j<bfloors;j++){
tt=fVector[j]->GetFistTime();//get the
if((ep->runline[j] > 0) && (tm > tt)){
tm=tt;
tem=j; }
}//end_for
if(tem!=-1){
if(tem < floorAt)
ep->status=-1;
if(tem > floorAt)
ep->status=1;
}//if
}
else{//这是在有人出电梯之后电梯电梯里没有人了,而此楼还有人要进,这才能实现同一时段有人出且有人进。
switch(ep->runline[floorAt]){
case UP :
OPENDOOR
ep->PeopleEnter(thisfloor->pList[1],1);
break;
case DOWN :
OPENDOOR
ep->PeopleEnter(thisfloor->pList[0],0);
break;
case UP_DOWN :
OPENDOOR
if(fVector[floorAt]->pList[0].size() < fVector[floorAt]->pList[0].size())
ep->PeopleEnter(thisfloor->pList[1],1); //up
else
ep->PeopleEnter(thisfloor->pList[0],0); //down
break;
}//end_switch
}//end_if_else
}//end_if
if(stop)//开门之后,这里关门
ep->CloseDoor();//Close Door
if(floorAt>=(bfloors-1) && ep->status==1)//控制电梯的最高楼层和最低楼层
ep->status=0;
else if(floorAt<=0 && ep->status==-1)
ep->status=0;
}//end_for
}//end_SysElevatorRunNext
SysSearchElevatorLeastestUp 搜索能到达floornum楼层且向上最快到达的电梯,返回电梯号数。
int Building::SysSearchElevatorLeastestUp(int floornum)
{
float *c=new float[elevatorCount];
for(int i=0; i<elevatorCount; i++)
c[i]=2*elevatorCount;
for(i=0; i<elevatorCount; i++){
if(eVector[i]->status==1){//elevator up...
if(eVector[i]->floorAt>=floornum)
c[i]=2*(bfloors-1-floornum);
else
c[i]=floornum-eVector[i]->floorAt;
}//if
else if(eVector[i]->status==-1)//elevator down
c[i]=floornum + eVector[i]->floorAt;
else //elevator is stop
c[i]=abs(eVector[i]->floorAt-floornum);
}//end_for
int j=0;
for(i=1; i<elevatorCount; i++)
if(c[i] < c[j])
j=i;
delete []c;
return j;
}//end_SysSearchElevatorLeastestUP
http://hi.baidu.com/neuwjyou/blog/item/ee8ea0775f34b51ab051b94f.html
文件中包含了电梯程序的C语言源代码,以及可执行文件。本电梯程序比较好的模拟了电梯的运行过程!-
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -