您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数据结构课程设计实习报告(模拟电梯)-附源代码
2015数据结构课程设计实习报告____________________________________________________________________________________________1数据结构课程设计报告学号:******班级:******姓名:******指导老师:******日期:20152015数据结构课程设计实习报告____________________________________________________________________________________________2题号题目:电梯模拟1.需求分析模拟某校九层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。九个楼层由下至上依次称为地下层、第一层、第二层、……第八层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。模拟时钟从0开始计时,时间单位t=0.1秒。人和电梯的各种动作均要消耗一定的时间单位,规定:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。电梯调度规则:就近原则:电梯的主要调度策略是首先响应沿当前行进方向上最近端的请求直到满足最远端请求。若该方向上无请求时,就改变移动方向。在就近原则无法满足的情况下,首先满足更高层的请求。电梯的最大承载人数为12人,电梯人数达到12人后,在有人出电梯之前,不接受进入电梯的请求。乘客上下电梯时先出后进。出电梯的时间固定是25t(与人数无关),进电梯时乘客是按队列的顺序依次进入,每次只能进入一人且每个人花费的时间都为25t。电梯在关门期间(电梯离开之前)所在层提出请求的乘客同样允许进入。电梯的运行速度为2t/层。【基本要求】根据提供的文本文档(包含随机的乘电梯人数),通过自己编的程序读取文件,获得乘电梯的需求,按时序输出系统状态的变化过程,即发生的全部人和电梯的动作序列。【选作内容】电梯模似器具有一个简单的图形用户界面。用动画显示电梯的升降,人进出电梯。设计有下列对象:电梯、人、电梯控制板及其上各种按钮、定时器等。【实现提示】每层设置一个队列,用来存储从文件中读取的当前层的乘客信息,并按时间的先后顺序进行排序。附:测试数据(以txt文档读取)乘客编号起点层数目标层数按电梯的时刻12632252731474436745531426672317743068285422015数据结构课程设计实习报告____________________________________________________________________________________________32.设计2.1设计思想(1)数据与操作的特性模拟电梯,以实际生活中的电梯为参考,应有两个对象:电梯、乘客。对于人这一对象,应包含乘客自身的信息;对于电梯这一对象,应具备添加乘客、删除乘客、访问乘客信息(获取乘客的去向等)、上升、下降、开关门等基本操作来实现相应的功能。此外,对于等候在电梯外面的乘客队列,应有添加乘客、删除乘客(进入电梯或等待超时离开)、获取乘客信息(如到达时间等)等基本操作以实现相应的功能。整个系统运行的时间是以电梯的运作为轴,往前推进,知道服务完成,返回本垒层候命,此时程序结束(当然,理论上程序是无期限地执行下去);系统的空间开发与电梯层数、乘客人数成正比,电梯层数确定后,空间开发便与请求服务的乘客数有关,并处于动态开发(“人来人去”,空间的开辟与释放是动态的)。可见,时空的要求不是特别紧迫,资源的开发不会很大,效率也会有所保证。(2)数据结构设计由(1)中的数据与操作的特性分析,应用类与对象、抽象数据类型(ADT)的设计思想,下面详细说明这两点。电梯与乘客都设计为类,其操作涉及到队列、链表的数据结构。对于乘客,每层设置一个队列,用来存储从文件中读取的当前层的乘客信息,并按先来后到的顺序进行排序。对于电梯里面的乘客,我是用一个链表来存储的。且这些数据结构均采用抽象数据类型,在使用的时候生成需要的实例。涉及的数据结构:单链表(存放电梯内的乘客)队列(存放每层楼等待的乘客)2015数据结构课程设计实习报告____________________________________________________________________________________________4这两种数据结构大体上是相同的,只是操作上有所!他们的逻辑结构与物理结构图示如下:电梯类以及相应的功能函数:逻辑结构(逻辑上连续)物理结构(物理上不要求连续)constintFLOORS=9;//总楼层数(一律从标号0开始,至FLOORS-1层)constintLOAD=12;//电梯载重(人数)enumstates{UP,DOWN,CLOSED,WAIT};//电梯运作的状态(上升、下降、关门、等待)enumdirect{U,D};//电梯运作的方向U(上),D(下)classList{private:intcurr_floor;//电梯当前所在楼层intcurr_man;//电梯内当前总人数statesstate;//电梯当前所处状态directdire;//电梯运作的方向boolrequest[FLOORS];//记录有请求的楼层public:List();intGetFloor();//得到电梯当前楼层intGetMan();//得到电梯当前人数statesGetState();//得到电梯当前状态directGetDire();//得到电梯运行方向bool*GetReque();//得到电梯请求数组voidSetState(statessta);//设置电梯状态voidSetDire(directdir);//设置电梯运行方向voidSetFloor(inti);//设置电梯当前的楼层voidSetMan(inti);//设置电梯当前人数voidSetReque(inti,boolb);//设置请求数组的request[i]值为b(bool类型)};2015数据结构课程设计实习报告____________________________________________________________________________________________5乘客类以及相应的功能函数:(3)算法设计系统的总体设计思路:首先,在电梯运作这一模块,“三个已知”才能保证电梯的正常运作,“三个已知”分别是:电梯当前楼层、电梯运作方向(U、D表示,分别为上、下)以及有请求的楼层。因为电梯调度是这样的(以例子来说明):假如当前电梯方向是向上,那么电梯就会在该方向上一直,碰到请求层则服务,服务完继续向上,直到某一层,当且仅当该层以上的楼层没有请求(请求包括上电梯请求和下电梯请求),电梯才会停止(当下面也没有请求时)或者换方向向下运行(下方有请求);向下的情形跟向上是一样的。所以,电梯调度算法的一个重要“已知”就是其运作方向,应一直有所记录。其次,电梯里面的乘客这一模块,我记录在一个单独的链表里,电梯类的数据成员里只记录该链表的大小(即为梯内人数),而没有乘客这一对象。此外,等候在每层的乘客,均存储在每层的等待队列之中。系统的信息交流:电梯与乘客链表(记录梯内乘客)之间发生的信息交流就是乘客数以及程序去向楼层这些数据;乘客链表与等待队列之间发生的信息交流是有人进电梯时,将该人添加到乘客链表中并从等待队列中删除;电梯与等待队列之间发生的信息交流是电梯当前楼层与相应楼层的等待队列之间的对应关系。它们之间相互联系,以保证系统的正常运转,均不可或缺!主要算法基本思想:整个系统以电梯的状态转换来达成目标,我把电梯分为四个状态,分别为:UP、DOWN、WAIT、CLOSED,即为上升、下降、等待、已关门,他们之间的状态变迁以及各自状态下调用相应的函数所做的工作如下图所示:constintMAX_WAIT_TIME=300;//最大等待时间,超时则离去classMan{private:intnumber;//编号intfrom_floor;//来自楼层intto_floor;//去向楼层intarrival_time;//到达时间public:Man(void);voidAssign(intnum,intfrom,intto,intarrival_t);//赋值函数intGetNum();得到编号intGetFrom();//得到来自楼层intGetTo();//得到去向楼层intGetArrival();//得到到达时间};2015数据结构课程设计实习报告____________________________________________________________________________________________6主程序流程图如下:主程序流程示意图(相应状态调用相应的函数)电梯状态变迁图2015数据结构课程设计实习报告____________________________________________________________________________________________72.2设计表示(1)函数调用关系图首先,我的工程的文件结构如下图所示。其中,LinList.h和LinQueue.h是单链表和链式队列的头文件(均是ADT设计),里面包含对链表和队列的相关操作函数;List.h和Man.h是电梯和乘客的头文件,里面有电梯、乘客相关的属性和相应的操作,在前面已经给出他们的类定义,可以清楚地看到这些。Init.h头文件则主要是些支撑电梯系统的正常运作的函数,比如open()、close()、up()、down()等等,Init.h中各自的函数调用关系:主要有五个骨架函数支撑电梯的运作,如下所示。(2)函数接口规格说明这上面的五个骨架函数之间联系密切,相互有调用的情形(比如刷新请求的函数,在时间流逝的过程中不断地有调用)。其余的属于类的函数,即链表类、队列类、电梯类、乘客类这些类内的公有成员函数是整个系统的接口函数,各自对相应的对象进行操作,来服务于主程序。其相应的定义及注释在本报告2.1(2)处有详细的说明,此处不再累述。2.3详细设计根据主程序流程示意图,这里我主要说明一下保证电梯正常运作的五个骨架函数。up()函数:电梯上行。函数内实现时间的流逝(伴随着刷新请求)、电梯层数加一,最后置电梯状态为WAIT,置方向状态为U。down()函数:电梯下行。函数内实现时间的流逝(伴随着刷新请求)、电梯层数加一,最后置电梯状态为WAIT,置方向状态为D。up()与down()函数是一样的(大同小异),下面是up()函数的实现:__________________________________________________________________________voidup(){//电梯上升一层楼(要用2t时间)intf=list.GetFloor();//获取电梯当前楼层cout在NowTimet时刻电梯上行(在Ff到Ff+1之间)endl;NowTime++;//时间一增加refreshReq();//就要刷新电梯的请求数组cout在NowTimet时刻电梯上行(在Ff到Ff+1之间)endl;工程的文件结构示意图①refreshReq():刷新电梯请求数组五个②up():电梯上行骨架③down():电梯下行函数open():电梯开门调度④wait()电梯close():电梯关门运作⑤closed():电梯已关门接下来的决策2015数据结构课程设计实习报告______________________________
本文标题:数据结构课程设计实习报告(模拟电梯)-附源代码
链接地址:https://www.777doc.com/doc-2344444 .html