电梯模拟1文档格式.docx
- 文档编号:13020518
- 上传时间:2022-10-02
- 格式:DOCX
- 页数:22
- 大小:182.25KB
电梯模拟1文档格式.docx
《电梯模拟1文档格式.docx》由会员分享,可在线阅读,更多相关《电梯模拟1文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
intnow;
//乘客当前所在的位置
intdis;
//乘客的目地地
intwait;
//最长的等待的时间
intwaitnow;
//已经等待的时间
structpassage*next;
}Passage;
虽然电梯中的状态是由枚举类型来实现的,但是在整个程序的运行过程中,我还是为电梯设置了一个结构体类型,以便保存更多的信息:
typedefstructlift
intcount_C;
//计数电梯已到达的层数
intcount_A;
//系统的总时间计数器记得必须初始化为0
intflag_in[High];
//九个楼层有无请求的标志哪个楼层如果有请求该标志置1
intnum;
//等待队列中的人数记得要进行初始化为0
intpeople;
//电梯中人数
intflag_out[High];
}Lift;
(2)算法设计
顾名思义本程序在运行的过程中用到的算法便是—“电梯算法”,电梯算法借鉴了磁盘寻道C-LOOK算法,即电梯向一个方向运行,直到这个方向上没有服务为止。
2.2设计表示
(1)、函数调用关系图及其说明如下 :
(2)函数接口说明:
函数中的参数均是使用的全局变量的传递,因而在函数间进行传递的过程中比较简单,下面就将主要函数及他们之间的参数的关系列出如下:
intOutOrIn(Lift&
L,Passage*Queue,Passage*LiftQ);
//进和出电梯的总函数
intUpdate(Lift&
//刷新的函数
intRun(Lift&
//整个电梯各种状态转换的函数
intOpenTheDoor(Lift&
L);
//开门主要是用于解决其中的时间问题
intCloseTheDoor(Lift&
//关门
intIn(Lift&
//进入主要是解决每个人进入电梯的时间问题
intOut(Lift&
//出去
intTest(Lift&
//电梯测试关门还是开门的函数
intRequest(Lift&
L,Passage*Queue);
2.3详细设计
3、调试分析
该程序的调试过程较为轻松,基本在算法实现的基础上没有出现什么错误,因而在调试的过程中并无什么深刻印象。
4、用户手册
点击运行程序,在弹出的窗口中,会提示要输入的信息:
1、提示信息为:
“请输入图中的顶点数和弧数以及图的标志和弧的标志:
”按要求输入即可,本题即输入911va
2、提示信息为“请完成该邻接表的输入”:
由于邻接表的输入信息一般较多,而且均是采用的链表来存储,因而该部分的输入要特别的小心
3、在完成上面两步的输入后按enter键便能得到程序的运行结果,即输出完成整项工程至少需要多少时间和影响工程进度的关键活动
思路和原理:
1.确定电梯的类型。
其中包括:
电梯所在层,电梯内人数,电梯当前状态,电梯运行时期,电梯计时器,每层的Up按钮,每层的Down按钮,电梯内的目标层按钮,同时,还需要造一个乘客栈,将要去不同楼层的人放在不同的栈中。
2.确定乘客类型。
乘客编号,乘客将要去的楼层数,该乘客进入时间,所能容忍的等待时间以及该乘客进入的楼层。
3.通过进行乘客的进出电梯活动来将两者联系起来。
首先,每层都有两个等待队列:
上楼队列和下楼队列。
其次,此活动包括乘客时间与电梯事件,通过相同的参数将其相连接。
乘客事件包括:
新乘客进入事件,乘客放弃事件放弃,乘客进出事件。
电梯事件包括:
判断电梯的状态。
4.按时序显示系统状态的变化过程:
发生的全部人和电梯的动作序列。
根据实验要求,定义时间:
上升时间,下降时间,开门关门时间,进出电梯时间,最高层,最低层。
算法设计:
1.设定乘客栈的抽象数据类型定义
ADTStack{
数据对象:
数据关系:
基本操作:
InitStack(S);
操作结果:
构造一个空栈
DestroyStack(&
S);
初始条件:
栈S已存在
操作结果:
销毁栈S
ClearStack(&
栈s已存在
把S置为空
StackEmpty(S);
栈s已存在。
若栈S为空,则返回TRUE,否则返回FALSE
StackLength(S);
初始条件:
返回栈S的长度
GetTop(S,&
e);
初始条件:
返回栈顶元素
Push(&
S,e);
操作结果:
在栈S的栈顶插入新的栈顶元素e。
Pop(&
S,&
删除S的栈顶元素,并以e返回其值。
PrintStack(&
输出栈
乘客类型
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&
}
电梯类型
表示电梯的各个属性和所有动作。
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&
判断电梯是否要开门。
实现电梯和乘客之间的相互作用。
包括:
InOut(Elevator&
进行乘客的进出电梯活动。
NewClient(Elevator&
E,WQueuew[5][2])
进入新乘客。
PrintStatus(Elevator&
输出当前状态。
Print(Elevator&
E,Actiona)
输出电梯动作信息。
具体实现:
电梯类型基本操作:
voidInitEle(Elevator&
E){
inti;
E.floor=1;
//电梯初始停在第一层
E.status=Waiting;
E.Count=OverTime;
E.Stage=Down;
E.ClientNumber=0;
for(i=0;
i<
=Maxfloor;
i++){
E.CallUp[i]=0;
E.CallDown[i]=0;
E.CallCar[i]=0;
}
i++)InitStack(E.S[i]);
StatusCountOver(Elevator&
E){//判断电梯计时是否完成
if(E.Count){
E.Count--;
returnFALSE;
returnTRUE;
voidDestoryEle(Elevator&
E){//销毁电梯类型
i++)DestroyStack(E.S[i]);
intEleFloor(Elevatorconst&
E){//返回电梯所在的层
returnE.floor;
EleStatusEleStatus(Elevatorconst&
E){
returnE.status;
StatusRequireAbove(Elevatorconst&
E){//判断是否有高层请求
for(inti=E.floor+1;
i++)
if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i])returnTRUE;
returnFALSE;
StatusRequireBelow(Elevatorconst&
E){//判断是否
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电梯 模拟