elevator.cpp
来自「数据结构是编程的基础」· C++ 代码 · 共 673 行 · 第 1/2 页
CPP
673 行
}
//////////////////////时间流逝////////////////////
//////////////////////开门////////////////////
void opendoor(int uord)
{
struct stack *outelevator=elevator;
struct queue *inelevator=que[floor];
dwait=1;
timeadd(20,2);
fprintf(outfile,"电梯门在%d楼打开!\n",floor);
while(outelevator!=NULL) //出门 begin
{
if(outelevator->people->outfloor==floor)
{
delelevator(outelevator);
timeadd(25,2);
fprintf(outfile,"第%d个人走出电梯,到达目标%d楼!\n",outelevator->people->number,floor);
delperson(outelevator->people);
outelevator=outelevator->next;
}
else
{
outelevator=outelevator->next;
}
} //出门 end
callcar[floor]=0;
if(uord)
{
while(inelevator!=NULL)
{
while(inelevator!=NULL)
{
if(inelevator->people->outfloor>floor)
{
insertelevator(inelevator->people);
delqueue(inelevator,floor);
timeadd(25,2);
}
inelevator=inelevator->next;
}
dopen=1;
if(timeadd(40,1))
{
inelevator=que[floor];
}
}
closedoor(1);
return;
}
else
{
while(inelevator!=NULL)
{
while(inelevator!=NULL)
{
if(inelevator->people->outfloor<floor)
{
insertelevator(inelevator->people);
delqueue(inelevator,floor);
timeadd(25,2);
}
inelevator=inelevator->next;
}
dopen=1;
if(timeadd(40,0))
{
inelevator=que[floor];
}
}
closedoor(0);
return;
}
if(state==goingup) closedoor(1);
else closedoor(0);
}
//////////////////////开门////////////////////
//////////////////////关门////////////////////
void closedoor(int downorup)
{
int i;
struct queue *inelevator=que[floor];
while(timeadd(20,downorup))
{
while(inelevator!=NULL)
{
if((downorup&&inelevator->people->outfloor>floor)||(!downorup&&inelevator->people->outfloor<floor))
{
delqueue(inelevator,floor);
insertelevator(inelevator->people);
timeadd(25,2);
}
inelevator=inelevator->next;
}
dopen=1;
if(timeadd(40,downorup))
{
inelevator=que[floor];
}
}
callcar[floor]=0;
dopen=0;
dwait=0;
fprintf(outfile,"电梯门在%d楼关闭!\n",floor);
if(state==idle)
{
callup[floor]=calldown[floor]=0;
selectnext();
return;
}
else
{
if(state==goingup)
{
for(i=floor+1;i<5;i++)
{
if(callup[i]||callcar[i]||calldown[i])
{
callup[floor]=0;
upele();
return;
}
}
for(i=floor-1;i>=0;i--)
{
if(callup[i]||calldown[i]||callcar[i])
{
callup[floor]=calldown[floor]=0;
state=goingdown;
downele();
return;
}
}
}
else
{
for(i=floor-1;i>=0;i--)
{
if(callup[i]||calldown[i]||callcar[i])
{
calldown[floor]=0;
downele();
return;
}
}
for(i=floor+1;i<5;i++)
{
if(callup[i]||calldown[i]||callcar[i])
{
callup[floor]=calldown[floor]=0;
state=goingup;
upele();
return;
}
}
}
state=idle;
selectnext();
return;
}
}
//////////////////////关门////////////////////
//////////////////////选择方向////////////////////
void selectnext()
{
int i,j;
if(callup[floor])
{
opendoor(1);
return;
}
if(calldown[floor])
{
opendoor(0);
return;
}
if(elevator!=NULL)
{
if(elevator->people->outfloor>floor)
{
state=goingup;
upele();
}
else
{
state=goingdown;
downele();
}
}
for(j=0;;j++)
{
for(i=0;i<5;i++)
{
if((callup[i]||calldown[i]||callcar[i])&&i!=floor)
{
if(i<floor)
{
state=goingdown;
downele();
return ;
}
else
{
state=goingup;
upele();
return ;
}
}
}
timeadd(1,2);
if(j==300&&floor!=1)
{
callcar[1]=1;
}
}
return ;
}
//////////////////////选择方向////////////////////
//////////////////////上一层////////////////////
void upele()
{
int i;
floor++;
timeadd(51,2);
fprintf(outfile,"电梯上一层,从%d楼到%d楼\n",floor-1,floor);
if(callcar[floor]||callup[floor])
{
timeadd(14,2);
opendoor(1);
return;
}
else
{
for(i=floor+1;i<5;i++)
{
if(callcar[i]||callup[i]||calldown[i])
{
upele();
return;
}
}
if(calldown[floor])
{
timeadd(14,2);
opendoor(0);
return;
}
for(i=floor-1;i>=0;i--)
{
if(callcar[i]||callup[i]||calldown[i])
{
timeadd(14,2);
state=idle;
selectnext();
return;
}
}
}
}
//////////////////////上一层////////////////////
//////////////////////下一层////////////////////
void downele()
{
int i;
floor--;
timeadd(61,2);
fprintf(outfile,"电梯下一层,从%d楼到%d楼\n",floor+1,floor);
if(callcar[floor]||calldown[floor])
{
timeadd(23,2);
opendoor(0);
return;
}
else
{
for(i=floor-1;i>=0;i--)
{
if(callcar[i]||calldown[i]||callup[i])
{
downele();
return;
}
}
if(callup[floor])
{
timeadd(23,2);
opendoor(1);
return;
}
for(i=floor+1;i<5;i++)
{
if(callcar[i]||calldown[i]||callup[i])
{
timeadd(23,2);
state=idle;
selectnext();
return;
}
}
}
}
//////////////////////下一层////////////////////
int main(int argc, char* argv[])
{
int i;
elevator=NULL; //系统初始电梯中没有人
for(i=0;i<5;i++) //系统初始各层都没有人等待 begin
{
que[i]=NULL;
callcar[i]=0;
callup[i]=0;
calldown[i]=0;
} //系统初始各层都没有人等待 end
getpeople(); //从文件中读取搭乘电梯的人们
floor=1;
dwait=dopen=0;
state=idle;
if(people==NULL) return 0;
time=people->reachtime; //第一个人进入系统
insertqueue(people);
lastman=people;
selectnext();
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?