数据结构a类电梯运行模拟正文终稿.docx
《数据结构a类电梯运行模拟正文终稿.docx》由会员分享,可在线阅读,更多相关《数据结构a类电梯运行模拟正文终稿.docx(33页珍藏版)》请在冰豆网上搜索。
数据结构a类电梯运行模拟正文终稿
#include
#include
#include
#include
#include
usingnamespacestd;
//初始定义
constintmaxfloor=14;//最高楼层
clock_ttick;//获取系统当前运行时间
//基本数据结构及其功能函数与类的声明模块
structCondition{//状态类
floattime;//该状态下持续的时间;
intsympol;//状态的开关标志符
};
structLiftCondition{//电梯状态类
Conditionrest;
Conditionup;
Conditiondown;
};
structLift{//电梯类
intpaNum;//乘客数
intpresentFloor;//当前楼层
LiftConditionliftCon;//电梯状态
intlight[maxfloor+1];//目标层数数组
intgoalNum[maxfloor+1];//要去每层的人数
floatworkTime;
floatworkTimePre;
};
structPassenger{//乘客类
intpresentFloor;//乘客当前楼层
intgoalFloor;//目标层
inttolerateTime;//容忍时间
floatinitTime;//建立时间
Passenger*next;
Passenger*pre;
};
structQue{
Passenger*front;//队列头指针
Passenger*rear;//队列尾指针;
Passenger*mid;
intlength;
};
voidinitQue(Que&q){//队列的建立函数
q.front=(Passenger*)malloc(100*sizeof(Passenger));
q.rear=q.front;
q.length=0;
}
voidaddQue(Que&q,Passenger&p){//队列成员增加函数
q.rear->next=&p;
p.pre=q.rear;
q.rear=q.rear->next;
q.length++;
}
intqueLength(Que&q){//队列的长度函数
returnq.length;
}
voidoutQue(Que&q){//队首出队函数
if(queLength(q)>1){
q.mid=q.front->next;
q.front->next=q.mid->next;
q.mid->next->pre=q.front;
q.mid->next=NULL;
q.mid->pre=NULL;
q.length--;
}
else{
q.rear->pre=NULL;
q.rear=q.front;
q.rear->next=NULL;
q.length=0;
}
}
structFloor{//楼层类
QuegoUp;
QuegoDown;
intcallUp;
intcallDown;
inttotalNum;
};
//全局变量
intpassNum=0;
Floorfl[15];
Passengerpa[100];
inti=0;//循环计数器;
//函数模块
externvoidaddPassenger(Passenger&p);
externvoidgetInUp(Lift&l);
externvoidgetInDown(Lift&l);
externvoidliftUp(Lift&l);
externvoidgetOut(Lift&l);
externintergodicFloorUp(Lift&l);
externintergodicFloorDown(Lift&l);
externvoidUserFace(Lift&l);
voidinitFloor(){//初始化每个楼层的函数
for(i=1;i<15;i++){
initQue(fl[i].goDown);
initQue(fl[i].goUp);
fl[i].totalNum=0;
fl[i].callDown=0;
fl[i].callUp=0;
}
}
voidinitLift(Lift&l){//初始化电梯
l.liftCon.rest.sympol=1;
l.liftCon.up.sympol=0;
l.liftCon.down.sympol=0;
l.liftCon.rest.time=0;
l.liftCon.up.time=0;
l.liftCon.down.time=0;
for(i=1;i<15;i++){
l.light[i]=0;
l.goalNum[i]=0;
}
l.paNum=0;
l.presentFloor=1;
tick=clock();
l.workTime=l.workTimePre=(float)tick/CLK_TCK;
}
voidaddPassenger(Passenger&p){//创建一名乘客
cout<<"该乘客所在楼层"<cin>>p.presentFloor;
if(p.presentFloor<1||p.presentFloor>14)
{
cout<<"楼层越界"<cout<<"重新输入"<cin>>p.presentFloor;
}
cout<<"该乘客要去的楼层"<cin>>p.goalFloor;
if(p.goalFloor<1||p.goalFloor>14)
{
cout<<"楼层越界"<cout<<"重新输入"<cin>>p.goalFloor;
}
cout<<"该乘客的容忍时间"<cin>>p.tolerateTime;
if(p.goalFloor>p.presentFloor){
fl[p.presentFloor].callUp=1;
addQue(fl[p.presentFloor].goUp,p);
}
else{
fl[p.presentFloor].callDown=1;
addQue(fl[p.presentFloor].goDown,p);
}
fl[p.presentFloor].totalNum++;
tick=clock();
p.initTime=(float)tick/CLK_TCK;
passNum++;
}
voidgetInUp(Lift&l){//进入电梯往上行驶函数
l.liftCon.rest.sympol=1;
l.liftCon.down.sympol=0;
l.liftCon.up.sympol=0;
fl[l.presentFloor].callUp=0;
Sleep(500);
cout<<"电梯门打开………………"<Sleep(500);
cout<<"乘客正在进入电梯…"<Sleep(500);
cout<<"乘客正在进入电梯……"<Sleep(500);
cout<<"乘客正在进入电梯………"<Sleep(500);
cout<<"乘客正在进入电梯…………"<Sleep(500);
cout<<"乘客正在进入电梯……………"<Sleep(500);
cout<<"乘客正在进入电梯………………"<tick=clock();
l.workTime=(float)tick/CLK_TCK;
while(l.paNum<2){
if((l.workTime-fl[l.presentFloor].goUp.front->next->initTime)<=fl[l.presentFloor].goUp.front->next->tolerateTime){
l.light[fl[l.presentFloor].goUp.front->next->goalFloor]=1;
l.goalNum[fl[l.presentFloor].goUp.front->next->goalFloor]++;
outQue(fl[l.presentFloor].goUp);
l.paNum++;
}
else{
cout<<"有一名乘客因等待时间过长已经离开"<outQue(fl[l.presentFloor].goUp);
}
if(queLength(fl[l.presentFloor].goUp)==0){
cout<<"乘客进入电梯完毕,电梯关门"<break;
}
}
if(l.paNum==2){
cout<<"电梯已满员,电梯关门"<}
}
voidgetInDown(Lift&l){//进入电梯往下行驶函数
l.liftCon.rest.sympol=1;
l.liftCon.down.sympol=0;
l.liftCon.up.sympol=0;
fl[l.presentFloor].callDown=0;
Sleep(500);
cout<<"电梯门打开………………"<Sleep(500);
cout<<"乘客正在进入电梯…"<Sleep(500);
cout<<"乘客正在进入电梯……"<Sleep(500);
cout<<"乘客正在进入电梯………"<Sleep(500);
cout<<"乘客正在进入电梯…………"<Sleep(500);
cout<<"乘客正在进入电梯……………"<Sleep(500);
cout<<"乘客正在进入电梯………………"<tick=clock();
l.workTime=(float)tick/CLK_TCK;
while(l.paNum<12){
if((l.workTime-fl[l.presentFloor].goDown.front->next->initTime)<=fl[l.presentFloor].goDown.front->next->tolerateTime){
l.light[fl[l.presentFloor].goDown.front->next->goalFloor]=1;
l.goalNum[fl[l.presentFloor].goDown.front->next->goalFloor]++;
outQue(fl[l.presentFloor].goDown);
l.paNum++;
}
else{
cout<<"有一名乘客因等待时间过长已经离开"<outQue(fl[l.presentFloor].goDown);
}
if(queLength(fl[l.presentFloor].goDown)==0){
cout<<"乘客进入电梯完毕,电梯关门"<break;
}
}
if(l.paNum==12){
cout<<"电梯已满员,电梯关门"<}
}
voidgetOut(Lift&l){
l.liftCon.rest.sympol=1;
l.liftCon.down.sympol=0;
l.liftCon.up.sympol=0;
Sleep(500);
cout<<"该楼层电梯内正有乘客出电梯…"<Sleep(500);
cout<<"该楼层电梯内正有乘客出电梯……"<Sleep(500);
cout<<"该楼层电梯内正有乘客出电梯………"<Sleep(500);
cout<<"该楼层电梯内正有乘客出电梯…………"<Sleep(500);
cout<<"该楼层电梯内正有乘客出电梯……………"<Sleep(500);
cout<<"该楼层电梯内正有乘客出电梯………………"<l.light[l.presentFloor]=0;
l.paNum-=l.goalNum[l.presentFloor];
l.goalNum[l.presentFloor]=0;
cout<<"电梯内现在有"<}
intergodicFloorUp(Lift&l){//电梯内人数为0时遍历函数
if((l.liftCon.rest.sympol)==1){
for(i=l.presentFloor;i<15;i++){
if(fl[i].callDown==1||fl[i].callUp==1){
return
(1);
}
}
return(0);
}
}
intergodicFloorDown(Lift&l){//电梯内人数为0时遍历函数
if((l.liftCon.rest.sympol)==1){
for(i=l.presentFloor;i>=1;i--){
if(fl[i].callDown==1||fl[i].callUp==1){
return
(1);
}
}
return(0);
}
}
voidliftDown(Lift&l){
l.liftCon.rest.sympol=0;
l.liftCon.down.sympol=1;
l.liftCon.up.sympol=0;
Sleep(500);
cout<<"电梯正在下降…"<cout<<"电梯在"<Sleep(500);
cout<<"电梯正在下降……"<cout<<"电梯在"<Sleep(500);
cout<<"电梯正在下降………"<cout<<"电梯在"<Sleep(500);
cout<<"电梯正在下降…………"<cout<<"电梯在"<Sleep(500);
cout<<"电梯正在下降………………"<cout<<"电梯在"<Sleep(500);
l.presentFloor--;
cout<<"电梯正在下降…………………"<cout<<"电梯在"<l.liftCon.down.time+=3;
cout<<"是否有新的乘客出现?
是1否0"<intj;
cin>>j;
if(j!
=0){
system("cls");
addPassenger(pa[passNum]);
}
if(l.light[l.presentFloor]!
=1&&fl[l.presentFloor].callDown!
=1&&fl[l.presentFloor].callUp!
=1){
cout<<"电梯内无乘客到该层,且该层没有呼叫电梯向下,电梯继续下降"<liftDown(l);
}
if(l.light[l.presentFloor]==1&&fl[l.presentFloor].callDown!
=1){
getOut(l);
if(l.paNum>0){
cout<<"电梯门已经关闭,电梯继续下降"<liftDown(l);
}
else{
if(ergodicFloorDown(l)==1){
liftDown(l);
}
else{
if(ergodicFloorUp(l)==1){
liftUp(l);
}
else{
while
(1){
cout<<"现在无人使用电梯,电梯静止在"<cout<<"是否返回主菜单?
是1否0"<intk;
cin>>k;
if(k!
=0){
UserFace(l);
}
cout<<"是否有新的乘客出现?
是1否0"<cin>>j;
if(j!
=0){
system("cls");
addPassenger(pa[passNum]);
if(pa[passNum-1].presentFloor>l.presentFloor){
liftUp(l);
}
elseif(pa[passNum-1].presentFloorliftDown(l);
}
elseif(pa[passNum-1].goalFloor>l.presentFloor){
getInUp(l);
liftUp(l);
}
else{
getInDown(l);
liftDown(l);
}
break;
}
else
continue;
}
}
}
}
}
if(l.light[l.presentFloor]!
=1&&fl[l.presentFloor].callDown==1&&l.paNum<12){
cout<<"该层有人呼叫向下"<getInDown(l);
//以防电梯里没人时,排队的人已经走了
if(l.paNum>0){
cout<<"电梯门已经关闭,电梯继续下降"<liftDown(l);
}
else{
if(ergodicFloorDown(l)==1){
liftDown(l);
}
else{
if(ergodicFloorUp(l)==1){
liftUp(l);
}
else{
while
(1){
cout<<"现在无人使用电梯,电梯静止在"<cout<<"是否返回主菜单?
是1否0"<intk;
cin>>k;
if(k!
=0){
UserFace(l);
}
cout<<"是否有新的乘客出现?
是1否0"<cin>>j;
if(j!
=0){
system("cls");
addPassenger(pa[passNum]);
if(pa[passNum-1].presentFloor>l.presentFloor){
liftUp(l);
}
elseif(pa[passNum-1].presentFloorliftDown(l);
}
elseif(pa[passNum-1].goalFloor>l.presentFloor){
getInUp(l);
liftUp(l);
}
else{
getInDown(l);
liftDown(l);
}
break;
}
else
continue;
}
}
}
}
}
if(l.light[l.presentFloor]==1&&fl[l.presentFloor].callDown==1){
cout<<"该层有人呼叫向下且有电梯出电梯"<getOut(l);
getInDown(l);
if(l.paNum>0){
cout<<"电梯门已经关闭,电梯继续下降"<liftDown(l);
}
else{
if(ergodicFloorDown(l)==1){
liftDown(l);
}
else{
if(ergodicFloorUp(l)==1){
l