电梯仿真系统报告

上传人:daj****de 文档编号:173260794 上传时间:2022-12-09 格式:DOCX 页数:14 大小:38.12KB
返回 下载 相关 举报
电梯仿真系统报告_第1页
第1页 / 共14页
电梯仿真系统报告_第2页
第2页 / 共14页
电梯仿真系统报告_第3页
第3页 / 共14页
点击查看更多>>
资源描述
面向对象技术大作业-电梯方针系统设计79号王洪伟电梯仿真系统设计题目要求:公司要建立一幢两层的办公大楼并装上“最新”的电梯。公司要求开发一个面向对 象的软件模拟程序,仿真电梯的操作,确定这个电梯能否满足需要。这个电梯只限乘载一人,为了省电,只在需要时才使用,电梯每天在一楼关门等 待。模拟程序包括一个时钟,每天从时间0开始,每秒滴答一次。模拟程序的调度器 组件随机设置每一层第一个人到来的时间。当时钟的时间等于第一个人到来的时 间时,模拟程序对指定层生成一个新到的人并将人放在这一层。然后这个人按下 该层的按钮,请求电梯开门。这个人的目的地楼层不能与他上电梯时所在的楼层 相同。如果第1个人到达第1层,则他可以按下按钮和等待电梯开门之后立即进入电 梯。如果第1个人在第2层,则电梯要升至第2层去接这个人。电梯从1层移至 2层需要5秒钟。电梯到达一层时,打开该层的电梯门上的灯,并在电梯内发出铃声。该层的按钮 和电梯中中表示该层的按钮复位,电梯门打开,乘客(如果有人)走出电梯,另 一乘客(如果有人等待)进入电梯并按下目的地楼层的按钮,电梯门关上。如果 电梯要开始移动,则要确定移动的方向(对只有两层的电梯很简单)并移到下一 层,为了简单起见,假设电梯到达一层时发生所有事件,而且直到电梯门关上所 花费的时间是0秒。电梯总是知道在哪一层和要到哪一层的。任何时间每层最多只能有一个人等待,如果新到的人(不在电梯中)要到达一层 时该层已被占用,则一秒后才能安排新的到达者。第1页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟假设每隔5到20秒人们随 机到达每层。这个题目的目标是实现一个能够工作的软件模拟程序,并根据这些要求运行。该 程序应模拟几分钟的电梯操作,确定电梯能否满足这座大楼的交通需求。为了程序易于运行和操作,我在这个题目的基础上增加了一电梯的层数,和电梯 能装的人数。另外还做了一些限制:(1)电梯的运行规则是:可到达每层。(2)仿真开始时,电梯处于第一层,为空梯。(3)仿真开始后,有N人(12人)在该国际贸易中心的1层,开始乘梯活动。(4)每个人初次所要到达的楼层是随机的,开始在底层等待电梯到来。(5)每个人乘坐电梯到达指定楼层后,再随机地去往另一楼层,依此类推。(6) 电梯运行的方向由先发出请求者决定,不允许后发出请求者改变电梯的当 前运行方向,除非是未被请求的空梯。(7) 电梯仿真时间是T秒。T秒后电梯模拟结束。软件开发要求:设计一个易于理解的界面,动态显示各梯的载客与运行情况(上、下或停止),动 态显示各楼层的人员停留情况与要求乘梯情况;动态显示从仿真开始到目前的时 间。系统分析、设计与实现:1、系统分析采用OOP分析的关键就是要对问题的对象空间的分类(类的分析第2页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟与设计,这一点跟面向过 程的流程图设计不太一样),也就是在整个系统中包括那几个类,每个类包含那 些属性特征和行为特征。对于上面的电梯问题,很明显有两个类:即电梯类和乘 客类(从所设计到的对象描述可以观察到,但是有的问题即使这一步也要仔细分 析)。电梯类应该反映所有关于电梯状态和行为的信息,而乘客类也应该反映这 些信息。2、类的设计:乘客类:class Cpassengerpublic:Cpassenger(); 构造函数virtual Cpassenger();int number;/ 编号int counter,counter1; 计数器int iLifts;/乘坐过的次数int iToFloor;/ 目的楼层int iAtFloor;/ 所在楼层int iStartTime;/记录这个人第一次出现的时间int iRestTime;/坐电梯中间休息一段时间然后发信号的那段时间int iReachTime;/记录到达目的地的时间bool bSignal;/判断是否发出信号bool bInLift;/是否在电梯内部bool bUp;判断是否要向上;第3页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟电梯类:class Celevatorpublic:Celevator();virtual Celevator();bool bStop;/判断是否停在某层int iPassengers;/电梯内部的乘客数int iToFloor;/要去的楼层int iAtFloor;/ 所在楼层bool bStart;/ 开始仿真bool bUp;/判断是否向上运行;由于本程序应用的是基于对话框的MFC框架集,所以建立了基于CDialog类的 CSimulationDlg类。现在将类的头文件代码复制如下,中间做了说明。class CSimulationDlg : public CDialog/ Constructionpublic:void PaintLiftLine();int M;/楼层数CSimulationDlg(CWnd* pParent = NULL); / standard constructor/ Dialog DataAFX_DATA(CSimulationDlg)第4页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟enum IDD = IDD_SIMULATION_DIALOG ;/ NOTE: the ClassWizard will add data members hereAFX_DATA/ ClassWizard generated virtual function overridesAFX_VIRTUAL(CSimulationDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);AFX_VIRTUAL/ Implementationprotected:int i;记录电梯门开关的每一幅动画。int floor;/电梯应该到达的楼层CRect rect;/个矩形区域CBitmap *bitmapr,*bitmapperson,*bgbitmap,*bitmap30;电梯 CBitmap 类、人 CBitmap类、背景CBitmap类、电梯门开关动画CBitmap类CDC *md;int vy;楼梯的y方向速度int vx;/楼梯的x方向速度 int y;楼梯的y位置 int x;/楼梯的x位置 int xp;/人的横坐标 int yp30;/每个人的纵坐标HICON m_hlcon;/ Generated message map functionsAFX_MSG(CSimulationDlg) / DDX/DDV support 第5页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnCancelMode();afx_msg void OnReset();afx_msg void OnFloorEnter();/AFX_MSGDECLARE_MESSAGE_MAP()private:Cpassenger *m_passenger30;实例 passenger 类!Celevator m_elevator;/ 实例化电梯类int N;/ 人数int T;/总的模拟时间int FirstFloor;/第 一层楼的位置int FloorHight;/楼层之间的高度int ElapseTime,dwTime,dwTimes,tempTime;记录程序初始化时的时间、记录适时 的时间、转化为以秒为单位的时间、时间临时使用变量。bool beClosed;/电梯门是否关闭int toNearFloor,toNearFloorl,near_Temp,near_Templ; 判断最近楼层的一些变量 CString passengerat,passengerto,passengermessage;/ 显示一些信息的字符串变量; 还在形成对话框的时候进行了一系列的初始化,具体实现都放了 OnlnitDialog()函 数中进行。第6页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟BOOL CSimulationDlg:OnInitDialog()/初始化一系列变量M=10;楼层数,改变这个数值就可以改变整个楼层的数量。而且在界面上也可以 很明显的显示出来。效果很好。FloorHight=40;/设置楼层与楼层之间高度为40个像素 FirstFloor=M*FloorHight;/第一层就是最底层,在上面留出一个楼层的空间显示时 间计数器。所以第一层的位置是M*FloorHightox=252;电梯初始所在x方向的位置。xp=0;人的x方向的位置 y=FirstFloor;/电梯的y方向位置在第一层楼层所在的位置 beClosed=true;初始化电梯为关闭着的下面一个for循环初始化每个人所在y方向的位置for(int m=0;mv30;m+)vx=1;/在此没什么用,但是如果要楼层横向有移动的话就可以用此参数 vy=1;/电梯在竖直方向上的运行速度v表示速度的意思floor=1;i=0;T=200;/总共的模拟时间单位是sN=5+rand()%7+1;每天所要来的人随机设置为512个人 dwTime=0;dwTimes=0;ypm=FirstFloor;第7页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟初始化电梯类和乘客类初始化电梯类m_elevator.bStart=true;m_elevator.iAtFloor=l; m_elevator.iToFloor=l;m_elevator.iPassengers=0; m_elevator.bStop=true;/初始化乘客类for(intj=0;jv30;j+)ElapseTime=:GetTickCount(); 记录初始时间SetTimer(1,100,NULL);调用timer函数对程序进行计数显示SetTimer(3,100,NULL);/m_passengerj=new Cpassenger; m_passengerj-bInLift=false;m_passengerj-bSignal=false; m_passengerj-bStart=false; m_passengerj- iLifts=0; m_passengerj-iAtFloor=1; m_passengerj-iStartTime=rand()%(T/2); 随即设置人第一次出现的时间m_passengerj-iRestTime=10+rand()%8;中间休息 时间第8页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟对视图的显示主要在OnPaint()函数中实现:void CSimulationDlg:OnPaint()讦(Islconic()CClientDC cdc(this); 画出楼层线-CPaintDC dc(this); for(i=-1;ivM;i+) if(i-l) CString str; if(i=-l) str=负一层;else str.Format(”第%d层,i+l); cdc.TextOut(305,FirstFloor-i*FloorHight+20,str); cdc.MoveTo(300,FirstFloor- i*FloorHight+40); cdc.LineTo(345,FirstFloor-i*FloorHight+40);第9页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟/GetClientRect( &rect);md=new CDC;bitmapr=new CBitmap; bgbitmap=new CBitmap; bitmapperson=new CBitmap;md-CreateCompatibleDC(&dc);bitmapr- m_hObject=(HBITMAP):LoadImage(NULL,lift.bmp,IMAGE_BITMAP,43,43,LR _LOADFROMFILE);找到电梯的图片对其进行调用bgbitmap- m_hObject=(HBITMAP):LoadImage(NULL,bg.bmp,IMAGE_BITMAP,300,450,L R_LOADFROMFILE);找到背景图片然后对其调用bitmapperson- m_hObject=(HBITMAP):LoadImage(NULL,p.bmp,IMAGE_BITMAP,20,20,LR_ LOADFROMFILE);/找到人的图片然后对其调用char filename7;for(i=0;iv30;i+)sprintf(filename,%d.bmp,i); bitmapi=new CBitmap; bitmapi-m_hObject=(HBITMAP):LoadImage(NULL,filename,IMAGE_BITMAP,320,240,L R_LO ADFROMFILE);i=0;md-SelectObject(bitmap0);SetTimer(2,100,NULL);第10页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟每个图所用的图片如下所示:1、电梯图片2、人图片3、背景楼层图片4、开关电梯门动画中的一张图片这里大致把各个对象的成员 设定出来了。至此,类设计基本结束了,当然了,很多时候不是一开始就可以把 类设计得很好,往往都是要先设计一部分,然后在后面得问题得处理中,还要对 原来设计的类结构进行添加和删除工作的。这里要特别注意的是类设计的最终目 的是降低系统的耦合,达到程序逻辑与数据之间的分离,更有利于代码的编制和 维护。3、系统实现思路:当完成了类设计后,剩下来就应是系统逻辑部分的实现了。I第11页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟系统整体来说,应 该有一个事件侦测体系,用来对系统每个乘客和电梯的状态的侦测,以便发送或 者修改必要的信息,该侦测体系的周期定为1秒钟(可以用定时器实现),然后用 串行的方式来模拟系统的并行运行。如果把思路总结一下,应该是跟动画片的原 理是一样的:将多个固定和静止的画面定时、按顺序地放映出来,就变成了活动 的画面。所以,可以在程序中定义一个主循环,在该循环外进行必要的初始化, 进入后每秒钟执行一次,以遍历方式一一激励当前已经产生的对象,由它们根据 自己的当前状态和相关的状态变化规则,决定是否需要改变、改变成什么样的状 态,以及按照上述行为特征的设计展示必要的对象状态。根据上叙思想,下面主要列出事件侦测体系的代码:(应该在另外一个函数来 触发次函数,即调用SetTimer(l,1000,NULL)即可)void CSimulationDlg:OnTimer(UINT nIDEvent) CString showtime,sen,m,h;时间计时器1-用来显示程序的运行时间if(nIDEvent=1)dwTimes=:GetTickCount()-ElapseTime ; dwTime=dwTimes/1000;/ if(dwTimev=T)/ sen.Format(%d,dwTime%60); h.Format(%d,dwTime/3600);第12页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟m.Format(%d,(dwTime/60)%60); showtime模拟时间:+h+ : +m+ : +sen; SetDlgItemText(IDC_STATIC10,showtime);/ / else/ this-SetDlgItemText(IDC_STATIC10,本次模拟结束!);/ 时间计时器2-用来调用电梯的图片if(nIDEvent=2)CClientDC dc(this); GetClientRect (& rect); if(i=0) if(iSelectObject(bitmap0); dc.BitBlt(400,0,320,240,md,0,0,SRCCOPY);第13页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟 if(iv=29)beClosed=false; if(i29lli=0)beClosed=true; md-SelectObject(bgbitmap); dc.BitBlt(0,40,300,M*40+50,md,0,0,SRCCOPY); md- SelectObject(bitmapr); dc.BitBlt(x,y,43,43,md,0,0,SRCCOPY); for(int k=0;k=m_passengerk-iStartTime) md-SelectObject(bitmapperson); dc.BitBlt(20*k,ypk+10,20,20,md,0,0,SRCCOPY); if(m_passengerk-bStart=false) 保证乘客是第一次出现 m_passengerk-bStart=true; 到来后把 开始参与信号打开m_passengerk-bSignal=true;如果是刚到来则发出信号near_Temp=m_passengerk-iAtFloor; near_Templ=m_passengerk-iToFloor; 使电梯到达相应的楼层第14页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟if(yv(FirstFloor-(floor-1)*FloorHight )& beClosed) y+=vy;if(y%FloorHight=1&(m_elevator.iAtFloor=floor+1llm_elevator.iAtFloor=floor- 1llm_elevator.iAtFloor=floor)i=0;if(y(FirstFloor-(floor-1)*FloorHight )& beClosed)y-=vy;if(y%FloorHight=O) m_elevator.iAtFloor=M-y/FloorHight+1; m_elevator.bStop=true; 检测要接的乘客 的最近楼层 if(m_elevator.iPassengers=O&m _elevator.bStop) for(int k=0;kvN- 1;k+) if(m_passengerk-bSigna l&m_elevator.iPassengers=O&m_elevator.bStop) toNearFloor=m_passengerk-iAtFloor;if(abs(m_elevator.iAtFloor-near_Temp)=abs(m_elevator.iAtFloor-toNearFloor) near_Temp=toNearFloor; if(m_passengerk-bInLift&m _elevator.iPassengers!=0&m_elevator.bStop)第15页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟if(m_elevator.iAtFloor-m_passengerk-iAtFloor)v=(m_elevator.iAtFloor- m_passengerk+1-iAtFloor)toNearFloor1=m_passengerk-iToFloor; if(abs(m_elevator.iAtFloor- near_Temp)=abs(m_elevator.iAtFloor-toNearFloor) floor=toNearFloor; m_elevator.iToFloor=floor; m_elevator.bStop=false; if(near_Tempv=near_Temp1) toNearFloor=near_Temp; near_Temp1=toNearFloor1; if(near_Tempnear_Temp1) toNearFloor=near_Temp1; /-if(y%FloorHight=0) md-SelectObject(bitmapi);第16页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟主要代码部分-控制电梯的运行以及模拟if(nIDEvent=3)if(m_elevator.bStart=true)的乘客for(int j=O;jv=N;j+)对 N 位乘客轮流询问 if(m_passengerj-bInLift=false&m_passengerj-bStart=true &m_elevator.bStop=true&m_elevator.iPassengers=0) if(m_passengerj- bSignal=true) int b_temp=rand()%M+l;产生一个 0 到最大值 M 的一个楼层随 机数 m_passengerj-iToFloor=b_temp; if(b_temp=m_passengerj-iAtFloor) if(b_temp=M) m_passengerj-iToFloor=M-1; else m_passengerj- iToFloor=b_temp+1; if(m_elevator.iPassengers=0) 如果电梯内没有乘客就去接 发出信号第17页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟 m_elevator.iToFloor=m_passengerj-iAtFloor;if(m_elevator.iAtFloor=m_passengerj-iAtFloor) m_passengerj-bInLift=true; if(m_passengerj-iToFloor=m_elevator.iAtFloor&m_passengerj-bInLift=true) m_passengerj-bInLift=false;if(m_passengerj-iAtFloor=m_elevator.iAtFloorllm_passengerj- iToFloor=m_elevator. 判断向上还是向下if(m_passengerj-iAtFloorv=m_passengerj-iToFloor) if(m_passengerj- iAtFloorm_passengerj-iToFloor) if(m_elevator.iAtFloorv=m_elevator.iToFloor) m_elevator.bUp=true; m_passengerj-bUp=false; m_passengerj-bUp=true; iAtFloor) 第18页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟if(m_elevator.iAtFloorm_elevator.iToFloor) /m_elevator.bUp=false; if(m_passengerj-bStart&m_passengerj- bInLift=false&m_passengerj-iAtFloor=m_elevator.iAtFloor&m _passengerj-bSignal) if(m_passengerj-bInLift)&m_elevator.bStop) if(m_passengerj- bInLift&m _passengerj-bStart) ypj=y; floor=m_passengerj-iToFloor; m_elevator.bStop=false; m_elevator.iToFloor=floor; m_passengerj-bInLift=true; m_elevator.iPassengers+; m_passengerj-bSignal=false; m_passengerj-iLifts+; 第19页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟if(m_passengerj-iToFloor=m_elevator.iAtFloor&m_passengerj-bInLift&m_passengerj- bStart) if(m_passengerj-bInLift=false&m _passengerj-bStart) 休息一段时间 m_passengerj-iAtFloor=m_passengerj-iToFloor; m_passengerj- iToFloor=rand()%M; if(m_passengerj-iAtFloor=m_passengerj-iToFloor) m_passengerj-iToFloor+; m_passengerj-bInLift=false; m_elevator.bStop=true; m_elevator.iPassengers-; m_passengerj-iLifts+; m_passengerj-counter=0;之后 乘客再次发出信号/* m_passengerj-counter+; if(m_passengerj-counter=400) m_passengerj- bSignal=true; if(m_elevator.iAtFloor=m_elevator.iToFloor&m _passengerj- bUp=m_elevator.bUp&m_passengerj-bStart)乘客走进电梯 if(m_passengerj-bSignal&m_passengerj-bInLift=false)第20页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟 打印输出信息CString strrr,strsi,strsignal=;strrr.Format(”今天总共会有d个人要来。n电梯内部有d个人n电梯已到达第 %d 层 n floor=m_passengerj-iAtFloor; if(m_passengerj-bInLift) floor=m_passengerj-iToFloor; 电梯将要到达第4层%d,N,m_elevator.iPassengers,m_elevator.iAtFloor,m_elevator.iToFloor,m_elevator.b Stop);SetDlgItemText(IDC_STATICTELL,strrr); for(int j=0;jbSignal,m_passengerj-iToFloor); strsignal+=strsi; SetDlgItemText(IDC_STATICTELL2,strsignal); CDialog:OnTimer(nIDEvent);结论:运行界面如下所示:第21页共22页面向对象技术大作业-电梯方针系统设计79号王洪伟显示模拟时间电梯门开乘客关动画显示系统信息重新开 始按钮 至此,系统全部的分析、设计与实现过程完毕。上面的代码已经在 VC6.0+WindowsXP平台下调试成功。从上面的分析可以看出,在运用OOP的思 想进行系统设计时,关键是类的设计。类的设计一定要通过对系统对象域的划分 来进行,而关于类中的具体成员就必须由系统各个部分的功能来进行确定。这是我第一次真正的把书本上的东西应用的实际中来,虽然中间好多功能还不完 善,但基本已经成型。非常有成就感而且个人觉界面做得还挺不错。从这次编成 中学到很多东西,相信对以后的学习和工作能起到很大的作用。第22页共22页
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!