数据结构电梯模拟.docx

上传人:b****5 文档编号:8104516 上传时间:2023-01-28 格式:DOCX 页数:9 大小:69.05KB
下载 相关 举报
数据结构电梯模拟.docx_第1页
第1页 / 共9页
数据结构电梯模拟.docx_第2页
第2页 / 共9页
数据结构电梯模拟.docx_第3页
第3页 / 共9页
数据结构电梯模拟.docx_第4页
第4页 / 共9页
数据结构电梯模拟.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构电梯模拟.docx

《数据结构电梯模拟.docx》由会员分享,可在线阅读,更多相关《数据结构电梯模拟.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构电梯模拟.docx

数据结构电梯模拟

数据结构

 

姓名:

陈东

学号:

070612146

 

 

一、【实验目的】

帮助学生熟练掌握线性表的基本操作在链表结构中的实现,熟练进行各种链表的操作和应用。

二、【问题描述】

设计一个电梯模拟系统。

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

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

三、【基本要求】

(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)、按时序显示系统状态的变化过程:

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

四、【实验环境】

Windows7,VC++

五、【测试数据及其结果】

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)

操作结果:

输出电梯动作信息。

六、【实验源代码】

#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_SIZE100n");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;

cout<<"\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);

printf("\n");

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;

}

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

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1