收藏 分享(赏)

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

上传人:精品资料 文档编号:10742921 上传时间:2020-01-04 格式:DOC 页数:22 大小:790KB
下载 相关 举报
数据结构-电梯模拟的报告.doc_第1页
第1页 / 共22页
数据结构-电梯模拟的报告.doc_第2页
第2页 / 共22页
数据结构-电梯模拟的报告.doc_第3页
第3页 / 共22页
数据结构-电梯模拟的报告.doc_第4页
第4页 / 共22页
数据结构-电梯模拟的报告.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、数据结构课程设计报告 第 1 页,共 页1课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。2课程设计任务与要求:任务根据教材数据结构题集(C 语言版) (严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选

2、择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。设计题目从数据结构题集 “第二篇 实习篇”中选取,每班每题不得超过 2 人。另选题:学生自选课题学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。学生自选课题需在 17 周前报课程设计指导教师批准方可生效。要求:1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的

3、标准函数,加大代码的重用率。 2、.设计的题目要求达到一定工作量(300 行以上代码) ,并具有一定的深度和难度。3、程序设计语言推荐使用 C/C+,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5 、每位同学需独立提交设计报告书(每人一份) ,要求编排格式统一、规范、内容充实,不少于 10 页(代码不算) ;6、课程设计实践作为培养学生动手能力的一种手段,单独考核。数据结构课程设计报告 第 2 页,共 页3课程设计说明书一 需求分析(1) 、模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层

4、,其中第一层是大楼的进出层,即是电梯的“本垒层” ,电梯“空闲”时,将来该层候命。五个楼层从下到上的编号为:0、1、2、3、4。除了地下层外,每一层都有一个要求向下的按钮除了第四层外,每一层都有一个要求向上的按钮。对应的变量为:CallUp03和 CallDown14。电梯内的五个目标层按钮对应的变量为:CallCar04。(2) 、电梯一共有七个状态,即正在开门(Opening) 、已开门(Opened) 、正在关门(Closing) 、已关门(Closed) 、等待(Waiting) 、移动(Moving) 、减速(Decelerate) 。(3) 、 乘客可随机地进出于任何层。对每个人来

5、说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。对于在楼层内等待电梯的乘客,将插入在等候队列里,每一层有两个等候队列,一队要求向上,一队要求向下,用链队列来实现。对于在电梯内的乘客,用五个乘客栈来实现,该乘客要去哪一层,就把他放在相应编号的栈中,对应变量为 EleStack04。(4) 、模拟时钟从 0 开始,时间单位为 0.1 秒。人和电梯的各种动作均要耗费一定的时间单位(简记为 t):有人进出时,电梯每隔 40t 测试一次,若无人进出,则关门关门和开门各需要 20t每个人进出电梯均需要 25t电梯加速需要 15t上升时,每一层需要 51t,减速需要 14t下降时,每一层需

6、要 61t,减速需要 23t如果电梯在某层静止时间超过 300t,则驶回 1 层候命。(5) 、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。二 概要设计1、乘客类型反映乘客的所有属性。ADT Client数据对象:D=a i乘客信息,I=1,2,n,n0数据关系:R=|ai-1,aiD,i=2,n基本操作:PrintClientInfo(Client const #define Empty 0/-/电梯状态enum EleStatusOpening,Opened,Closing,Closed,Moving,Decelerate,Waiting;enum ActionDoorOp

7、ened,DoorClosed,GoingUp,GoingDown,Achieved,None;数据结构课程设计报告 第 5 页,共 页enum EleStageUp,Down,OpenDoor,Stop;enum ClientStatusNew,GiveUp,In,Out,Finish;#define CloseTest 40/电梯关门测试时间#define OverTime 300 /电梯停候超时时间#define Accelerate 15 /加速时间#define UpTime 51 /上升时间#define DownTime 61 /下降时间#define UpDecelerate

8、14 /上升减速#define DownDecelerate 23 /下降减速#define DoorTime 20 /开门关门时间#define InOutTime 25 /进出电梯时间#define Maxfloor 4 /最高层#define Minfloor 0 /最低层long Time=0; /时钟long MaxTime;/系统运行最长时间int InOutCount=0;/用于进出计时int InterTime=0;/下一乘客进入系统的时间int ID=0; /乘客编号int GiveUpNumber=0;/乘客放弃的数目int TotalTime=0;/总共等待时间部分重要操

9、作的算法:1、判断运动方向函数 EleDecide 的算法:2、统计高层和低层的请求(不包括当前层) 。3、高层和低层均无请求:发出 Stop 命令。4、否则,1)若电梯在上升期:1. 若有高层请求:上升;2.若无高层请求:转下降期,下降。2)若电梯在下降期:1. 若有低层请求:下降;2. 若无有低层请求:转上升期,上升。判断电梯是否要停于当前层函数 EleAchieved 的算法:1. 该层的 CallCar 为 1;2. 该层在上升(下降)期有上升(下降)请求(判断 CallUp 或 CallDown) ;3. 上升(下降)期高(低)层没有请求而该层由下降(上升)请求,要转换运行时期。判断

10、电梯动作函数 ElevatorRun 的算法:1. 若电梯在 Opening 状态,则转至 Opened 状态。2. 若电梯在 Opened 状态,若无人进出,则转至 Closing 状态。3. 若电梯在 Closed 状态,则根据电梯请求情况转至相应状态。4. 若电梯在 Closing 状态,则转至 Closed 状态。5. 若电梯在 Moving 状态,若达到目标层,则转至 Decelerate 状态。否则,继续移动。6. 若电梯在 Decelerate 状态,则设定电梯时期,并转至 Opening 状态。7. 若电梯在 Waiting 状态,在判断是否等待超时,若超时则向第一层移动。数据

11、结构课程设计报告 第 6 页,共 页否则,判断电梯请求情况并转至相应状态。四 设计与调试分析在本程序中如何判断电梯的动作最为关键。此外,合理划分各个模块和处理各个模块之间的联系也非常重要。本设计中涉及时间函数的使用,由于刚开始接触,这方面的使用相当有难度。使用不当就容易造成编译不通过或者运行时发送错误报告。还有在电梯调度方面不能按照预定的想法实现,所以和现实中的电梯有出入。没有显示电梯的运行到哪里,而是用有乘客进入电梯时显示乘客进入到哪层楼来告知电梯运行到几楼。开门,关门时需要精心思考,此处记时及判断是否要开门也是难点,所以这些看似很平常的动作却是最难也是最容易错的地方。此外在指针的使用方面也

12、是难点,很多地方比如乘客进队出队以及放弃乘坐电梯时均涉及指针的使用,也经常在这些地方通不过编译。为了便于控制循环,设计了电梯运行时间,则在时间到达时即可退出系统。由于开始为了简化程序而定义了很多变量,结果发现并不实际,有的变量仅是在某些函数中赋予其值罢了,于是就将这些变量删除,比如开始按照提示设置了 D1表示人们正在进出电梯等等。由于将程序分块,将不同部分写入不同源文件中,这样出错后便于查找及修改,这是分模块的优点之一也是编写和调试的一个小技巧。五 用户手册程序运行后输入程序的运行时间,电梯开始运行。在本设计中,用 04 分别表示地下一楼至四楼,用户只要按照提示依次输入正确的数值,每次按下回车

13、键即认为已经输入信息。此后只需等待系统自行进行处理,若未显示乘客放弃乘坐电梯即认为该乘客已达目的楼层。此间程序会一直运行到开始时输入的运行时间,此时整个程序运行结束,按任意键退出。此操作可参考测试成果中的效果图。六 测试成果从测试结果看,乘客放弃数的大小和平均等待时间的长短还与乘客出现的密度和乘客的平均容忍时间有关系。数据结构课程设计报告 第 7 页,共 页七 附录(源程序清单)#include #include #include #include #include #include #include /所有常量,全局变量和类型定义数据结构课程设计报告 第 8 页,共 页#define NUL

14、L 0 /空指针#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define INT_MAX 32767/Status 是函数类型,其值是函数结果状态代码typedef int Status;#define Empty 0/-/电梯状态enum EleStatusOpening,Opened,Closing,Closed,Moving,Decelerate,Waiting;enum ActionDoorOpened,DoorClosed,GoingU

15、p,GoingDown,Achieved,None;enum EleStageUp,Down,OpenDoor,Stop;enum ClientStatusNew,GiveUp,In,Out,Finish;#define CloseTest 40/电梯关门测试时间#define OverTime 300 /电梯停候超时时间#define Accelerate 15 /加速时间#define UpTime 51 /上升时间#define DownTime 61 /下降时间#define UpDecelerate 14 /上升减速#define DownDecelerate 23 /下降减速#de

16、fine DoorTime 20 /开门关门时间#define InOutTime 25 /进出电梯时间#define Maxfloor 4 /最高层#define Minfloor 0 /最低层long Time=0; /时钟long MaxTime;/系统运行最长时间int InOutCount=0;/用于进出计时int InterTime=0;/下一乘客进入系统的时间int ID=0; /乘客编号int GiveUpNumber=0;/乘客放弃的数目int TotalTime=0;/总共等待时间/乘客类型typedef struct int ClinetID; /乘客编号int Outf

17、loor; /去哪层int InTime; /该乘客进入时间int GivepuTime; /所能容忍的等待时间int Infloor;/乘客进入的楼层Client;数据结构课程设计报告 第 9 页,共 页/乘客类型基本操作void PrintClientInfo(Client const /utd;p-GivepuTime=d;/产生所能容忍的等待时间p-InTime=Time;coutd;InterTime=d;/产生下一乘客要到达的时间coutd;p-Outfloor=d; /产生所要到达的楼层/该乘客出现的楼层while(p-Infloor=rand()%(Maxfloor+1)=p-

18、Outfloor);/ cinp-Infloorp-OutfloorInterTime;PrintClientInfo(*p,New);return OK;Status DestoryClient(Client *p=NULL;return OK;Status GoAbove(Client const else return FALSE;数据结构课程设计报告 第 10 页,共 页int CInfloor(Client const int CInTime(Client const int COutfloor(Client const #define STACK_INIT_SIZE 10 /存储空

19、间初始分配量#define STACKINCREMENT 5 /存储空间分配增量/乘客栈typedef Client *SElemType;typedef struct SElemType *base; /栈底指针,栈不存在时 base 的值为 NULLSElemType *top; /栈顶指针int stacksize; /当前已分配存储空间,以元素为单位ClientStack;/乘客栈的基本操作Status InitStack(ClientStack /构造一个空栈Status DestroyStack(ClientStack /销毁栈 SStatus ClearStack(ClientS

20、tack /把 S 置为空Status StackEmpty(ClientStack S);/若栈 S 为空,则返回 TRUE,否则返回 FALSEint StackLength(ClientStack S);/返回栈 S 的长度Status GetTop(ClientStack S,SElemType /返回栈顶元素Status Push(ClientStack /入栈Status Pop(ClientStack /出栈void PrintStack(ClientStack /输出栈Status InitStack(ClientStack if(!S.base) return OVERFLO

21、W;数据结构课程设计报告 第 11 页,共 页S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;/InitStackStatus DestroyStack(ClientStack if(S.base) for(p=S.base;p=S.stacksize) S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType);if(!S.base) return OVERFLOW;S.top=S.base+S.stacksize;S.stacksiz

22、e+=STACKINCREMENT;*S.top+=e;数据结构课程设计报告 第 12 页,共 页return OK;/PushStatus Pop(ClientStack e=*(-S.top);return OK;/Popvoid PrintStack(ClientStack i=S.base;while(iClinetID=Minfloor;i-)if(E.CallCari|E.CallDowni|E.CallUpi) return TRUE;return FALSE;Status EleAchieved(Elevator if(E.Stage=Upif(E.Stage=Upreturn

23、 TRUE;if(E.Stage=Downreturn TRUE;return FALSE;Status EleOpenDoor(Elevator 数据结构课程设计报告 第 14 页,共 页if(E.status=Waiting) if(E.CallDownE.floor) E.Stage=Down;return TRUE;if(E.CallUpE.floor) E.Stage=Up;return TRUE;return FALSE;EleStage EleDecide(Elevator Above=RequireAbove(E);Below=RequireBelow(E);/无请求则停止if

24、(Above=0/有请求则按请求移动else if(E.Stage=Up) if(Above!=0) return Up;else E.Stage=Down;return Down;/ifelse if(Below!=0) return Down;else E.Stage=Up;return Up;/ifAction ElevatorRun(Elevator E.Count=CloseTest;return DoorOpened;case Opened:/进行关门测试if(E.Stage=DownE.Count=DoorTime;/ifbreak;case Closing:/完成关门则转入 C

25、losed 状态E.status=Closed;数据结构课程设计报告 第 15 页,共 页return DoorClosed;case Waiting:/不在第一层且超出所规定的停候时间,电梯向第一层移动if(E.Count=0) if(E.floor!=1) E.CallCar1=1;else E.Count-;/如果有人可以进入,则开门if(EleOpenDoor(E) E.status=Opening;E.Count=DoorTime;break;case Closed:/根据 EleDecide 的返回值设定电梯状态switch(EleDecide(E) case Up: E.stat

26、us=Moving;E.Count=UpTime+Accelerate;return GoingUp;case Down: E.status=Moving;E.Count=DownTime+Accelerate;return GoingDown;case Stop:if(E.status!=Waiting) E.status=Waiting;E.Count=OverTime;/switchbreak;case Moving:/完成移动if(E.Stage=Up) E.floor+;else E.floor-;if(EleAchieved(E) /到达目标层,转入减速状态E.status=Dec

27、elerate;E.Count=DownDecelerate;else E.Count+=DownTime;/未到达目标层,继续下降return Achieved;case Decelerate:/完成减速/确定正确的电梯时期if(E.Stage=Upelse if(E.Stage=Down/转到开门状态E.status=Opening;E.Count=DoorTime;break;/switchreturn None;/ElevatorRun/单链队列队列的链式存储结构typedef Client *QElemType;/等候队列typedef struct QNode QElemType

28、data;struct QNode *next;数据结构课程设计报告 第 16 页,共 页QNode,*QueuePtr;typedef struct QueuePtr front; /队头指针QueuePtr rear; /队尾指针WQueue;/等待队列的基本操作Status InitQueue(WQueue if(!Q.front) return OVERFLOW;/分配存储失败Q.front-next=NULL;Q.front-data=NULL;return OK;Status DestroyQueue(WQueue if(Q.front-data) DestoryClient(Q.

29、front-data);delete Q.front;Q.front=Q.rear;return OK;Status EnQueue(WQueue p=new QNode;if(!p) return OVERFLOW;p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;return OK;Status DeQueue(WQueue /否则返回 ERRORQueuePtr p;if(Q.front=Q.rear) return ERROR;p=Q.front-next;e=p-data;Q.front-next=p-next;if(Q.rear=p) Q.re

30、ar=Q.front;delete p;数据结构课程设计报告 第 17 页,共 页return OK;Status QueueEmpty(WQueue Q) /判断队列是否为空if(Q.front=Q.rear) return TRUE;else return FALSE;Status QDelNode(WQueue if(p=NULL|p-next=NULL) return ERROR;q=p-next;p-next=q-next;if(p-next=NULL) Q.rear=p;DestoryClient(q-data);delete q;return OK;Status CGiveUp(

31、WQueue p=Q.front;if(p-next!=NULL) if(p-next-data-GivepuTime=0TotalTime+=Time-CInTime(*(p-next-data);QDelNode(Q,p);/将放弃等待的人删除GiveUpNumber+;else p-next-data-GivepuTime-;return OK;void PrintQueue(WQueue Q) /输出队列QueuePtr q;int count=0;if(Q.front-next=NULL) goto end;q=Q.front-next;while(q!=NULL) coutdata

32、-ClinetIDnext;数据结构课程设计报告 第 18 页,共 页count+;end:while(count+MaxTime;#endifwhile(Time+MaxTime) /-乘客事件 -数据结构课程设计报告 第 20 页,共 页/新乘客进入事件if(InterTime=0) NewClient(E,w);else InterTime-;/乘客放弃事件放弃for(int i=0;i=Maxfloor;i+)for(int j=0;j2;j+) CGiveUp(wij,EleFloor(E);/乘客进出事件if(InOutCount=0) if(EleStatus(E)=Opened

33、) InOut(E,w);else InOutCount-;/-电梯事件 -if(CountOver(E)|EleStatus(E)=Closed|EleStatus(E)=Waiting) Action a;a=ElevatorRun(E);#if !testPrint(E,a);if(EleStatus(E)=Decelerate) PrintStatus(E,w);#endif#if !testSleep(100);/延迟 0.1s#endifcout“共“ID“人进入系统,“;cout“共“GiveUpNumber“人放弃。“endl;cout“平均等待时间为:“TotalTime/(

34、ID)endl;DestoryEle(E);for(i=0;i=Maxfloor;i+) DestroyQueue(wiUp);DestroyQueue(wiDown);return 0;4.课程设计心得本设计对于现在的学习程度来说十二分的难,当初因为考虑不够成熟,以为有提示会简单一点,可这大大超出目前编程能力,思考不严谨,以至于程序层次十分混乱。当参考有关资料后发现思路相当重要,将程序分块,划分基本类型,分析各模块的基本操作,这些均可独立开来做。在编译时发现了错误也可以方便修改。这些基本功其实在实用时才会发现自己掌握得并不牢靠,许多依然会犯低级错误,输入时若不根据设计的程序所规定的方式就容易

35、发生错误。由于开始按照实现提示来做就定义了很多后来都没有用到的变量,结果既浪费了时间又打乱了设计思绪。原来简单的现实事件当做成程序想实现它时还是很难的,这就不能凭空想象来对待数据结构课程设计报告 第 21 页,共 页编程了。编程很需要将实际与程序用变通的思想联系起来。平时还经常抱怨所学的知识与实际应用脱节,现在才觉得基本功的重要性,准备工作很有必要。期间几经波折,由于用栈和队列做基本操作基础时,程序一再陷入僵局,编译无错但不能实现功能,仅能做简单的输入、输出,对其他操作函数无一反应;于是崩溃,转为链表来做,结果仍然不出结果,连基本的时间函数都不能运行。所以完成这份报告要感谢那些默默无闻的给予帮助的同学和老师。数据结构课程设计报告 第 22 页,共 页

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报