电梯模拟系统.docx

上传人:b****5 文档编号:14291710 上传时间:2023-06-22 格式:DOCX 页数:13 大小:36.27KB
下载 相关 举报
电梯模拟系统.docx_第1页
第1页 / 共13页
电梯模拟系统.docx_第2页
第2页 / 共13页
电梯模拟系统.docx_第3页
第3页 / 共13页
电梯模拟系统.docx_第4页
第4页 / 共13页
电梯模拟系统.docx_第5页
第5页 / 共13页
电梯模拟系统.docx_第6页
第6页 / 共13页
电梯模拟系统.docx_第7页
第7页 / 共13页
电梯模拟系统.docx_第8页
第8页 / 共13页
电梯模拟系统.docx_第9页
第9页 / 共13页
电梯模拟系统.docx_第10页
第10页 / 共13页
电梯模拟系统.docx_第11页
第11页 / 共13页
电梯模拟系统.docx_第12页
第12页 / 共13页
电梯模拟系统.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

电梯模拟系统.docx

《电梯模拟系统.docx》由会员分享,可在线阅读,更多相关《电梯模拟系统.docx(13页珍藏版)》请在冰点文库上搜索。

电梯模拟系统.docx

电梯模拟系统

CompanyDocumentnumber:

WUUT-WUUY-WBBGB-BWYTT-1982GT

 

电梯模拟系统

一:

问题描述—————————————————————————第2页

二:

问题分析—————————————————————————第2页

三:

数据结构—————————————————————————第2页

四:

算法设计—————————————————————————第4页

五设计与调试分析———————————————————————第6页

六:

体会及建议————————————————————————第7页

七:

参考文献—————————————————————————第7页

八:

原代码——————————————————————————第7页

一:

问题描述

设计一个电梯模拟系统。

这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本独立的。

在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。

二:

问题分析

(1)、模拟某校五层教学楼的电梯系统。

该楼有一个自动电梯,能在每层停留。

五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来该层候命。

五个楼层从下到上的编号为:

0、1、2、3、4。

除了地下层外,每一层都有一个要求向下的按钮除了第四层外,每一层都有一个要求向上的按钮。

对应的变量为:

CallUp[0..3]和CallDown[1..4]。

电梯内的五个目标层按钮对应的变量为:

CallCar[0..4]。

(2)、电梯一共有七个状态,即正在开门(Opening)、已开门(Opened)、正在关门(Closing)、已关门(Closed)、等待(Waiting)、移动(Moving)、减速(Decelerate)。

(3)、乘客可随机地进出于任何层。

对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。

对于在楼层内等待电梯的乘客,将插入在等候队列里,每一层有两个等候队列,一队要求向上,一队要求向下,用链队列来实现。

对于在电梯内的乘客,用五个乘客栈来实现,该乘客要去哪一层,就把他放在相应编号的栈中,对应变量为EleStack[0…4]。

(4)、模拟时钟从0开始,时间单位为秒。

人和电梯的各种动作均要耗费一定的时间单位(简记为t):

有人进出时,电梯每隔40t测试一次,若无人进出,则关门

关门和开门各需要20t

每个人进出电梯均需要25t

电梯加速需要15t

如果电梯在某层静止时间超过300t,则驶回1层候命。

(5)、按时序显示系统状态的变化过程:

发生的全部人和电梯的动作序列。

三:

数据结构

1、乘客类型

反映乘客的所有属性。

ADTClient

数据对象:

D={ai∈乘客信息,I=1,2,…,n,n≥0}

数据关系:

R={|ai-1,ai∈D,i=2,…,n}

基本操作:

PrintClientInfo(Clientconst&e,ClientStatus)

操作结果:

输出乘客信息。

CreatClient(Client*&p)

操作结果:

生成新的乘客。

DestoryClient(Client*&p)

操作结果:

该乘客离开系统。

GoAbove(Clientconst&e)

操作结果:

判断该乘客是否去往高层。

CInfloor(Clientconst&e)

操作结果:

返回乘客进入的楼层。

CInTime(Clientconst&e)

操作结果:

返回乘客进入时间。

COutfloor(Clientconst&e)

操作结果:

返回乘客进入时间。

}

2、乘客栈类型

电梯内的乘客用乘客栈表示,去不同楼层的乘客放在不同的栈中。

ADTEstack

数据对象:

D={ai∈乘客信息,I=1,2,…,n,n≥0}

数据关系:

R={|ai-1,ai∈D,i=2,…,n}

基本操作:

略。

}

3、等候队列类型

在电梯外等待的乘客用等待队列表示。

每层各有两个等待队列,分别为上楼队列和下楼队列。

与一般队列不同的是在基本操作中加入了放弃操作CGiveUp(WQueue&Q,intfloor)。

4、电梯类型

表示电梯的各个属性和所有动作。

ADTElevator

数据对象:

D={ai∈电梯信息,I=1,2,…,n,n≥0}

基本操作:

InitEle(Elevator&E)

操作结果:

初始化电梯类型。

DestoryEle(Elevator&E)

操作结果:

销毁电梯类型。

EleDecide(Elevator&E,WQueuew[Maxfloor+1][2])

操作结果:

电梯动作决策。

ElevatorRun(Elevator&E,WQueuew[Maxfloor+1][2]){

操作结果:

电梯状态转换。

CountOver(Elevator&E)

操作结果:

判断电梯计时是否完成。

EleFloor(Elevatorconst&E)

操作结果:

返回电梯所在的层。

EleStatus(Elevatorconst&E)

操作结果:

返回电梯状态。

RequireAbove(Elevatorconst&E)

操作结果:

判断是否有高层请求。

RequireBelow(Elevatorconst&E)

操作结果:

判断是否有低层请求。

EleAchieved(Elevator&E)

操作结果:

判断电梯是否要停于当前层。

EleOpenDoor(Elevator&E)

操作结果:

判断电梯是否要开门。

}

5、高楼模块

实现电梯和乘客之间的互交功能。

包括:

InOut(Elevator&E,WQueuew[Maxfloor+1][2])

操作结果:

进行乘客的进出电梯活动。

NewClient(Elevator&E,WQueuew[5][2])

操作结果:

进入新乘客。

PrintStatus(Elevator&E,WQueuew[5][2])

操作结果:

输出当前状态。

Print(Elevator&E,Actiona)

操作结果:

输出电梯动作信息。

四:

算法设计

1:

本程序包含6个模块:

(1)主程序模块

(2)乘客模块

(3)乘客栈模块

(4)电梯模块

(5)等待队列模块

(6)高楼模块:

实现电梯和乘客之间的互交。

各模块之间的调用关系如下:

2:

主程序

主程序主要处理两类事件:

乘客事件和电梯事件。

除此之外,主程序还处理各个模块的初始化和销毁工作,以及电梯状态的输出。

乘客事件包括新乘客到达事件,乘客放弃等待事件,乘客进出电梯事件。

电梯事件包括电梯运行事件。

3:

详细设计

#defineNULL0若有高层请求:

上升;

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—表示人们正在进出电梯等等。

六:

体会及建议

我们应重视编程思想的培养,语言很重要,但究竟只是工具,思想才是精髓。

通过阅读书中的各种数据结构及相应算法的代码来吸收书中的思想。

我们可以利用各种途径来学习认识一种功能的实现,但是最终的串联编写还是应该靠自己的思路去不断完善,在这段时间中我们有充分的时间去了解我们完成任务所需的知识内容,而我们也应该去认真完成。

在这阶段的设计过程中,编写时总是出现原来未曾遇到过的各种错误,很难解决,常常受到很长时间的困扰,虽然这属于纯粹的个人能力体现,属于自学运用,但老师并不能在有问题时及时给与有效建议。

而我们的所学有限,考虑问题不是很全面,解决问题也总是难以有高效的解决方案只能通过不断的实践去比较结果。

七:

参考文献

1:

严蔚敏等数据机构(C语言版)清华大学出版社

2:

谭浩强C语言程序设计清华大学出版社

八:

原代码

#include<>

#include<>

#include<>

#include<>

#include<>

#include<>

#include<>

n",,;break;

caseGiveUp:

printf("\t%d号乘客放弃等待.\n",;break;

caseOut:

printf("\t%d号乘客走出电梯.\n",;break;

caseIn:

printf("\t%d号乘客走进电梯,要去第%d层.\n",,;break;

default:

break;

};

}

StatusCreatClient(Client*&p)

{

intd;

p=newClient;

if(!

p)returnOVERFLOW;

p->ClinetID=++ID;

printf("%d所能容忍的等待时间:

",ID);

scanf("%d",&d);

p->GivepuTime=d;

p->InTime=Time;

printf("下一乘客要到达的时间:

");

scanf("%d",&d);

InterTime=d;

printf("所要到达的楼层:

");

scanf("%d",&d);

p->Outfloor=d;

while((p->Infloor=rand()%(Maxfloor+1))==p->Outfloor);

PrintClientInfo(*p,New);

returnOK;

}

StatusDestoryClient(Client*&p)

{

deletep;

p=NULL;

returnOK;

}

StatusGoAbove(Clientconst&e)

{

if>returnTRUE;

elsereturnFALSE;

}

StatusCInfloor(Clientconst&e)

{

return;

}

StatusCInTime(Clientconst&e)

{

return;

}

StatusCOutfloor(Clientconst&e)

{

return;

}

#defineSTACK_INIT_SIZE10n");break;

caseDoorClosed:

printf("%\t电梯门已关闭.\n");break;

caseAchieved:

printf("%\t电梯已到达第%d层。

\n",;break;

caseGoingUp:

printf("%\t电梯上升中...\n");break;

caseGoingDown:

printf("%\t电梯下降中...\n");break;

default:

break;

};

}

intmain()

{

ElevatorE;

printf("************************************************\n"

"^^欢迎使用电梯模拟系统^^\n"

"************************************************\n"

"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");

WQueuew[Maxfloor+1][2];

InitEle(E);

srand((unsigned)time(NULL));

for(inti=0;i<=Maxfloor;i++)

{

InitQueue(w[i][Up]);

InitQueue(w[i][Down]);

}

MaxTime=1000000;

printf("请输入电梯的运行时间:

");

scanf("%d",&MaxTime);

while(Time++

{

if(InterTime==0)NewClient(E,w);

elseInterTime--;

for(inti=0;i<=Maxfloor;i++)

for(intj=0;j<2;j++)

{

CGiveUp(w[i][j],EleFloor(E));

}

if(InOutCount==0)

{

if(EleStatus(E)==Opened)InOut(E,w);

}

elseInOutCount--;

if(CountOver(E)||EleStatus(E)==Closed||EleStatus(E)==Waiting)

{

Actiona;

a=ElevatorRun(E);

Print(E,a);

}

Sleep(100);

}

printf("%共%d人进入系统,",ID);

printf("%共%d人放弃。

",GiveUpNumber);

DestoryEle(E);

for(i=0;i<=Maxfloor;i++){

DestroyQueue(w[i][Up]);

DestroyQueue(w[i][Down]);

}

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2