数据结构电梯模拟的报告.docx

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

数据结构电梯模拟的报告.docx

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

数据结构电梯模拟的报告.docx

数据结构电梯模拟的报告

1.课程设计目的

1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题.

2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

4。

训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。

 

2.课程设计任务与要求:

任务

根据教材《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。

设计题目从《数据结构题集》“第二篇实习篇”中选取,每班每题不得超过2人。

另选题:

学生自选课题

学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识.学生自选课题需在17周前报课程设计指导教师批准方可生效。

要求:

1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。

前期准备工作完备与否直接影响到后序上机调试工作的效率.在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。

2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。

3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;

4、每位同学需提交可独立运行的程序;

5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);

6、课程设计实践作为培养学生动手能力的一种手段,单独考核。

 

3.课程设计说明书

一需求分析

(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开始,时间单位为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*&p)

操作结果:

该乘客离开系统。

GoAbove(Clientconst&e)

操作结果:

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

CInfloor(Clientconst&e)

操作结果:

返回乘客进入的楼层。

CInTime(Clientconst&e)

操作结果:

返回乘客进入时间。

COutfloor(Clientconst&e)

操作结果:

返回乘客进入时间。

2、乘客栈类型

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

ADTEstack

数据对象:

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

数据关系:

R={

基本操作:

略。

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)

操作结果:

输出电梯动作信息。

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

h〉

#include〈iostream.h〉

#include〈iomanip.h>

#include〈stdio.h>

#include〈windows.h>

#include〈conio。

h〉

#include〈time.h>

//所有常量,全局变量和类型定义

#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;//总共等待时间

//乘客类型

typedefstruct{

intClinetID;//乘客编号

intOutfloor;//去哪层

intInTime;//该乘客进入时间

intGivepuTime;//所能容忍的等待时间

intInfloor;//乘客进入的楼层

}Client;

//乘客类型基本操作

voidPrintClientInfo(Clientconst&e,ClientStatuss){

//输出乘客信息

#if!

test

switch(s){

caseNew:

cout〈

ClinetID〈〈”号乘客进入第"〈

Infloor<〈”层"<

caseGiveUp:

cout<

caseOut:

cout<〈Time<〈'\t'<〈e。

ClinetID<〈”号乘客走出电梯"〈〈endl;break;

caseIn:

cout〈

ClinetID<<”号乘客走进电梯,要去第”〈

Outfloor<〈"层"<〈endl;break;

default:

break;

};//switch

#endif

StatusCreatClient(Client*&p){

//生成新的乘客

intd;

p=newClient;

if(!

p)returnOVERFLOW;

p—>ClinetID=++ID;

//ut<

";

//ut<〈e.Infloor<<'\n’;

cout〈〈ID;cout〈<"所能容忍的等待时间:

”;cin>〉d;

p->GivepuTime=d;//产生所能容忍的等待时间

p—〉InTime=Time;

cout〈〈”下一乘客要到达的时间:

";cin〉〉d;

InterTime=d;//产生下一乘客要到达的时间

cout〈〈"所要到达的楼层:

”;cin〉>d;

p-〉Outfloor=d;//产生所要到达的楼层

//该乘客出现的楼层

while((p—〉Infloor=rand()%(Maxfloor+1))==p—〉Outfloor);

//cin>〉p-〉Infloor〉>p->Outfloor〉〉InterTime;

PrintClientInfo(*p,New);

returnOK;

StatusDestoryClient(Client*&p){

//该乘客离开系统

deletep;

p=NULL;

returnOK;

}

StatusGoAbove(Clientconst&e){

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

if(e.Outfloor〉e。

Infloor)returnTRUE;

elsereturnFALSE;

}

intCInfloor(Clientconst&e){

//返回乘客进入的楼层

returne。

Infloor;

intCInTime(Clientconst&e){

//返回乘客进入时间

returne。

InTime;

intCOutfloor(Clientconst&e){

//返回乘客进入时间

returne.Outfloor;

}

#defineSTACK_INIT_SIZE10//存储空间初始分配量

#defineSTACKINCREMENT5//存储空间分配增量

//乘客栈

typedefClient*SElemType;

typedefstruct{

SElemType*base;//栈底指针,栈不存在时base的值为NULL

SElemType*top;//栈顶指针

intstacksize;//当前已分配存储空间,以元素为单位

}ClientStack;

//乘客栈的基本操作

StatusInitStack(ClientStack&S);

//构造一个空栈

StatusDestroyStack(ClientStack&S);

//销毁栈S

StatusClearStack(ClientStack&S);

//把S置为空

StatusStackEmpty(ClientStackS);

//若栈S为空,则返回TRUE,否则返回FALSE

intStackLength(ClientStackS);

//返回栈S的长度

StatusGetTop(ClientStackS,SElemType&e);

//返回栈顶元素

StatusPush(ClientStack&S,SElemTypee);

//入栈

StatusPop(ClientStack&S,SElemType&e);

//出栈

voidPrintStack(ClientStack&S);

//输出栈

StatusInitStack(ClientStack&S){

//构造一个空栈

S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!

S。

base)returnOVERFLOW;

S.top=S。

base;

S.stacksize=STACK_INIT_SIZE;

returnOK;

}//InitStack

StatusDestroyStack(ClientStack&S){

//销毁栈S

SElemType*p;

if(S.base){

for(p=S.base;p

DestoryClient(*p);

free(S.base);

}

returnOK;

}

StatusClearStack(ClientStack&S){

//把S置为空

if(!

S。

base)returnERROR;

S.top=S.base;

returnOK;

}

StatusStackEmpty(ClientStackS){

//若栈S为空,则返回TRUE,否则返回FALSE

if(S.top==S。

base)returnTRUE;

elsereturnFALSE;

intStackLength(ClientStackS){

//返回栈S的长度

returnS.top-S。

base;

StatusGetTop(ClientStackS,SElemType&e){

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

当前位置:首页 > 教学研究 > 教学计划

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

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