数据结构电梯模拟的报告Word文件下载.docx
- 文档编号:7854978
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:32
- 大小:114.70KB
数据结构电梯模拟的报告Word文件下载.docx
《数据结构电梯模拟的报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构电梯模拟的报告Word文件下载.docx(32页珍藏版)》请在冰点文库上搜索。
对于在楼层内等待电梯的乘客,将插入在等候队列里,每一层有两个等候队列,一队要求向上,一队要求向下,用链队列来实现。
对于在电梯内的乘客,用五个乘客栈来实现,该乘客要去哪一层,就把他放在相应编号的栈中,对应变量为EleStack[0…4]。
(4)、模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要耗费一定的时间单位(简记为t):
有人进出时,电梯每隔40t测试一次,若无人进出,则关门
关门和开门各需要20t
每个人进出电梯均需要25t
电梯加速需要15t
上升时,每一层需要51t,减速需要14t
下降时,每一层需要61t,减速需要23t
如果电梯在某层静止时间超过300t,则驶回1层候命。
(5)、按时序显示系统状态的变化过程:
发生的全部人和电梯的动作序列。
二概要设计
1、乘客类型
反映乘客的所有属性。
ADTClient
数据对象:
D={ai∈乘客信息,I=1,2,…,n,n≥0}
数据关系:
R={<
ai-1,ai>
|ai-1,ai∈D,i=2,…,n}
基本操作:
PrintClientInfo(Clientconst&
e,ClientStatuss)
操作结果:
输出乘客信息。
CreatClient(Client*&
p)
生成新的乘客。
DestoryClient(Client*&
该乘客离开系统。
GoAbove(Clientconst&
e)
判断该乘客是否去往高层。
CInfloor(Clientconst&
返回乘客进入的楼层。
CInTime(Clientconst&
返回乘客进入时间。
COutfloor(Clientconst&
}
2、乘客栈类型
电梯内的乘客用乘客栈表示,去不同楼层的乘客放在不同的栈中。
ADTEstack
略。
3、等候队列类型
在电梯外等待的乘客用等待队列表示。
每层各有两个等待队列,分别为上楼队列和下楼队列。
与一般队列不同的是在基本操作中加入了放弃操作CGiveUp(WQueue&
Q,intfloor)。
4、电梯类型
表示电梯的各个属性和所有动作。
ADTElevator
D={ai∈电梯信息,I=1,2,…,n,n≥0}
InitEle(Elevator&
E)
初始化电梯类型。
DestoryEle(Elevator&
销毁电梯类型。
EleDecide(Elevator&
E,WQueuew[Maxfloor+1][2])
电梯动作决策。
ElevatorRun(Elevator&
E,WQueuew[Maxfloor+1][2]){
电梯状态转换。
CountOver(Elevator&
判断电梯计时是否完成。
EleFloor(Elevatorconst&
返回电梯所在的层。
EleStatus(Elevatorconst&
返回电梯状态。
RequireAbove(Elevatorconst&
判断是否有高层请求。
RequireBelow(Elevatorconst&
判断是否有低层请求。
EleAchieved(Elevator&
判断电梯是否要停于当前层。
EleOpenDoor(Elevator&
判断电梯是否要开门。
5、高楼模块
实现电梯和乘客之间的互交功能。
包括:
InOut(Elevator&
进行乘客的进出电梯活动。
NewClient(Elevator&
E,WQueuew[5][2])
进入新乘客。
PrintStatus(Elevator&
输出当前状态。
Print(Elevator&
E,Actiona)
输出电梯动作信息。
6、主程序
主程序主要处理两类事件:
乘客事件和电梯事件。
除此之外,主程序还处理各个模块的初始化和销毁工作,以及电梯状态的输出。
乘客事件包括新乘客到达事件,乘客放弃等待事件,乘客进出电梯事件。
电梯事件包括电梯运行事件。
7、本程序包含6个模块:
(1)主程序模块
(2)乘客模块
(3)乘客栈模块
(4)电梯模块
(5)等待队列模块
(6)高楼模块:
实现电梯和乘客之间的互交。
各模块之间的调用关系如下:
三详细设计
//所有常量,全局变量和类型定义
#defineNULL0//空指针
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineINT_MAX32767
//Status是函数类型,其值是函数结果状态代码
typedefintStatus;
#defineEmpty0
//------------------------------------------------------
//电梯状态
enumEleStatus{Opening,Opened,Closing,Closed,Moving,Decelerate,Waiting};
enumAction{DoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None};
enumEleStage{Up,Down,OpenDoor,Stop};
enumClientStatus{New,GiveUp,In,Out,Finish};
#defineCloseTest40//电梯关门测试时间
#defineOverTime300//电梯停候超时时间
#defineAccelerate15//加速时间
#defineUpTime51//上升时间
#defineDownTime61//下降时间
#defineUpDecelerate14//上升减速
#defineDownDecelerate23//下降减速
#defineDoorTime20//开门关门时间
#defineInOutTime25//进出电梯时间
#defineMaxfloor4//最高层
#defineMinfloor0//最低层
longTime=0;
//时钟
longMaxTime;
//系统运行最长时间
intInOutCount=0;
//用于进出计时
intInterTime=0;
//下一乘客进入系统的时间
intID=0;
//乘客编号
intGiveUpNumber=0;
//乘客放弃的数目
intTotalTime=0;
//总共等待时间
部分重要操作的算法:
1、判断运动方向函数EleDecide的算法:
2、统计高层和低层的请求(不包括当前层)。
3、高层和低层均无请求:
发出Stop命令。
4、否则,
1)若电梯在上升期:
1.若有高层请求:
上升;
2.若无高层请求:
转下降期,下降。
2)若电梯在下降期:
1.若有低层请求:
下降;
2.若无有低层请求:
转上升期,上升。
判断电梯是否要停于当前层函数EleAchieved的算法:
1.该层的CallCar为1;
2.该层在上升(下降)期有上升(下降)请求(判断CallUp或CallDown);
3.上升(下降)期高(低)层没有请求而该层由下降(上升)请求,要转换运行时期。
判断电梯动作函数ElevatorRun的算法:
1.若电梯在Opening状态,则转至Opened状态。
2.若电梯在Opened状态,若无人进出,则转至Closing状态。
3.若电梯在Closed状态,则根据电梯请求情况转至相应状态。
4.若电梯在Closing状态,则转至Closed状态。
5.若电梯在Moving状态,若达到目标层,则转至Decelerate状态。
否则,继续移动。
6.若电梯在Decelerate状态,则设定电梯时期,并转至Opening状态。
7.若电梯在Waiting状态,在判断是否等待超时,若超时则向第一层移动。
否则,判断电梯请求情况并转至相应状态。
四设计与调试分析
在本程序中如何判断电梯的动作最为关键。
此外,合理划分各个模块和处理各个模块之间的联系也非常重要。
本设计中涉及时间函数的使用,由于刚开始接触,这方面的使用相当有难度。
使用不当就容易造成编译不通过或者运行时发送错误报告。
还有在电梯调度方面不能按照预定的想法实现,所以和现实中的电梯有出入。
没有显示电梯的运行到哪里,而是用有乘客进入电梯时显示乘客进入到哪层楼来告知电梯运行到几楼。
开门,关门时需要精心思考,此处记时及判断是否要开门也是难点,所以这些看似很平常的动作却是最难也是最容易错的地方。
此外在指针的使用方面也是难点,很多地方比如乘客进队出队以及放弃乘坐电梯时均涉及指针的使用,也经常在这些地方通不过编译。
为了便于控制循环,设计了电梯运行时间,则在时间到达时即可退出系统。
由于开始为了简化程序而定义了很多变量,结果发现并不实际,有的变量仅是在某些函数中赋予其值罢了,于是就将这些变量删除,比如开始按照提示设置了D1—表示人们正在进出电梯等等。
由于将程序分块,将不同部分写入不同源文件中,这样出错后便于查找及修改,这是分模块的优点之一也是编写和调试的一个小技巧。
五用户手册
程序运行后输入程序的运行时间,电梯开始运行。
在本设计中,用0—4分别表示地下一楼至四楼,用户只要按照提示依次输入正确的数值,每次按下回车键即认为已经输入信息。
此后只需等待系统自行进行处理,若未显示乘客放弃乘坐电梯即认为该乘客已达目的楼层。
此间程序会一直运行到开始时输入的运行时间,此时整个程序运行结束,按任意键退出。
此操作可参考测试成果中的效果图。
六测试成果
从测试结果看,乘客放弃数的大小和平均等待时间的长短还与乘客出现的密度和乘客的平均容忍时间有关系。
七附录(源程序清单)
#include<
stdlib.h>
iostream.h>
iomanip.h>
stdio.h>
windows.h>
conio.h>
time.h>
//乘客类型
typedefstruct{
intClinetID;
//乘客编号
intOutfloor;
//去哪层
intInTime;
//该乘客进入时间
intGivepuTime;
//所能容忍的等待时间
intInfloor;
//乘客进入的楼层
}Client;
//乘客类型基本操作
voidPrintClientInfo(Clientconst&
e,ClientStatuss){
//输出乘客信息
#if!
test
switch(s){
caseNew:
cout<
<
Time<
'
\t'
e.ClinetID<
"
号乘客进入第"
e.Infloor<
层"
endl;
break;
caseGiveUp:
\t"
号乘客放弃等待,等待了"
Time-e.InTime<
/0.1s"
caseOut:
号乘客走出电梯"
caseIn:
号乘客走进电梯,要去第"
e.Outfloor<
default:
};
//switch
#endif
StatusCreatClient(Client*&
p){
//生成新的乘客
intd;
p=newClient;
if(!
p)returnOVERFLOW;
p->
ClinetID=++ID;
//ut<
ID;
cout<
所在楼层:
;
\n'
所能容忍的等待时间:
cin>
>
d;
GivepuTime=d;
//产生所能容忍的等待时间
InTime=Time;
下一乘客要到达的时间:
InterTime=d;
//产生下一乘客要到达的时间
所要到达的楼层:
Outfloor=d;
//产生所要到达的楼层
//该乘客出现的楼层
while((p->
Infloor=rand()%(Maxfloor+1))==p->
Outfloor);
//cin>
p->
Infloor>
Outfloor>
InterTime;
PrintClientInfo(*p,New);
returnOK;
StatusDestoryClient(Client*&
//该乘客离开系统
deletep;
p=NULL;
StatusGoAbove(Clientconst&
e){
//判断该乘客是否去往高层
if(e.Outfloor>
e.Infloor)returnTRUE;
elsereturnFALSE;
intCInfloor(Clientconst&
//返回乘客进入的楼层
returne.Infloor;
intCInTime(Clientconst&
//返回乘客进入时间
returne.InTime;
intCOutfloor(Clientconst&
returne.Outfloor;
#defineSTACK_INIT_SIZE10//存储空间初始分配量
#defineSTACKINCREMENT5//存储空间分配增量
//乘客栈
typedefClient*SElemType;
SElemType*base;
//栈底指针,栈不存在时base的值为NULL
SElemType*top;
//栈顶指针
intstacksize;
//当前已分配存储空间,以元素为单位
}ClientStack;
//乘客栈的基本操作
StatusInitStack(ClientStack&
S);
//构造一个空栈
StatusDestroyStack(ClientStack&
//销毁栈S
StatusClearStack(ClientStack&
//把S置为空
StatusStackEmpty(ClientStackS);
//若栈S为空,则返回TRUE,否则返回FALSE
intStackLength(ClientStackS);
//返回栈S的长度
StatusGetTop(ClientStackS,SElemType&
e);
//返回栈顶元素
StatusPush(ClientStack&
S,SElemTypee);
//入栈
StatusPop(ClientStack&
S,SElemType&
//出栈
voidPrintStack(ClientStack&
//输出栈
S){
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S.base)returnOVERFLOW;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}//InitStack
SElemType*p;
if(S.base){
for(p=S.base;
p<
S.top;
p++)
DestoryClient(*p);
free(S.base);
}
S.base)returnERROR;
StatusStackEmpty(ClientStackS){
if(S.top==S.base)returnTRUE;
elsereturnFALSE;
intStackLength(ClientStackS){
returnS.top-S.base;
//返
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 电梯 模拟 报告