收藏 分享(赏)

电梯模拟系统.doc

上传人:cjc2202537 文档编号:6584621 上传时间:2019-04-18 格式:DOC 页数:20 大小:161.50KB
下载 相关 举报
电梯模拟系统.doc_第1页
第1页 / 共20页
电梯模拟系统.doc_第2页
第2页 / 共20页
电梯模拟系统.doc_第3页
第3页 / 共20页
电梯模拟系统.doc_第4页
第4页 / 共20页
电梯模拟系统.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、目录一:问题描述第 2 页二:问题分析第 2 页三:数据结构第 2 页四:算法设计第 4 页五设计与调试分析第 6 页六:体会及建议第 7 页七:参考文献第 7 页八:原代码第 7 页一:问题描述设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本独立的。在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。二:问题分析(1) 、模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上

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

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

4、静止时间超过 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 Empty0/-/电梯状态enum EleStatusOpening,Opened,Closing,Closed,Moving,Decelerate,Waiting;enum ActionDoorOpened,DoorClosed,Going

5、Up,GoingDown,Achieved,None;enum EleStageUp,Down,OpenDoor,Stop;enum ClientStatusNew,GiveUp,In,Out,Finish;#define CloseTest 40 /电梯关门测试时间#define OverTime 300 /电梯停候超时时间#define DoorTime 20 /开门关门时间#define InOutTime 25 /进出电梯时间#define Maxfloor 4 /最高层#define Minfloor 0 /最低层long Time=0; /时钟long MaxTime;/系统运行最

6、长时间int InOutCount=0;/用于进出计时int InterTime=0;/下一乘客进入系统的时间int ID=0; /乘客编号int GiveUpNumber=0;/乘客放弃的数目int TotalTime=0;/总共等待时间部分重要操作的算法:1、判断运动方向函数 EleDecide 的算法:2、统计高层和低层的请求(不包括当前层) 。3、高层和低层均无请求:发出 Stop 命令。4、否则,1)若电梯在上升期:1. 若有高层请求:上升;2.若无高层请求:转下降期,下降。2)若电梯在下降期:1. 若有低层请求:下降;2. 若无有低层请求:转上升期,上升。判断电梯是否要停于当前层函

7、数 EleAchieved 的算法:1. 该层的 CallCar 为 1;2. 该层在上升(下降)期有上升(下降)请求(判断 CallUp 或 CallDown) ;3. 上升(下降)期高(低)层没有请求而该层由下降(上升)请求,要转换运行时期。判断电梯动作函数 ElevatorRun 的算法:1. 若电梯在 Opening 状态,则转至 Opened 状态。2. 若电梯在 Opened 状态,若无人进出,则转至 Closing 状态。3. 若电梯在 Closed 状态,则根据电梯请求情况转至相应状态。4. 若电梯在 Closing 状态,则转至 Closed 状态。5. 若电梯在 Movin

8、g 状态,若达到目标层,则转至 Decelerate 状态。否则,继续移动。6. 若电梯在 Decelerate 状态,则设定电梯时期,并转至 Opening 状态。7. 若电梯在 Waiting 状态,在判断是否等待超时,若超时则向第一层移动。否则,判断电梯请求情况并转至相应状态。五: 设计与调试分析在本程序中如何判断电梯的动作最为关键。此外,合理划分各个模块和处理各个模块之间的联系也非常重要。在电梯调度方面不能按照预定的想法实现,所以和现实中的电梯有出入。没有显示电梯的运行到哪里,而是用有乘客进入电梯时显示乘客进入到哪层楼来告知电梯运行到几楼。开门,关门时需要精心思考,此处记时及判断是否要

9、开门也是难点,所以这些看似很平常的动作却是最难也是最容易错的地方。此外在指针的使用方面也是难点,很多地方比如乘客进队出队以及放弃乘坐电梯时均涉及指针的使用,也经常在这些地方通不过编译。为了便于控制循环,设计了电梯运行时间,则在时间到达时即可退出系统。由于开始为了简化程序而定义了很多变量,结果发现并不实际,有的变量仅是在某些函数中赋予其值罢了,于是就将这些变量删除,比如开始按照提示设置了 D1表示人们正在进出电梯等等。六:体会及建议我们应重视编程思想的培养,语言很重要,但究竟只是工具,思想才是精髓。通过阅读书中的各种数据结构及相应算法的代码来吸收书中的思想。我们可以利用各种途径来学习认识一种功能

10、的实现,但是最终的串联编写还是应该靠自己的思路去不断完善,在这段时间中我们有充分的时间去了解我们完成任务所需的知识内容,而我们也应该去认真完成。在这阶段的设计过程中,编写时总是出现原来未曾遇到过的各种错误,很难解决,常常受到很长时间的困扰,虽然这属于纯粹的个人能力体现,属于自学运用,但老师并不能在有问题时及时给与有效建议。而我们的所学有限,考虑问题不是很全面,解决问题也总是难以有高效的解决方案只能通过不断的实践去比较结果。七:参考文献1:严蔚敏等 数据机构(C 语言版) 清华大学出版社 2:谭浩强 C语言程序设计 清华大学出版社八:原代码#include #include #include #

11、include #include #include #include /所有常量,全局变量和类型定义#define NULL 0#define TRUE 1#defineFALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW-2#define INT_MAX 32767/Status 是函数类型,其值是函数结果状态代码typedef int Status;#define Empty 0/电梯状态enumEleStatusOpening,Opened,Closing,Closed,Moving,Deceler

12、ate,Waiting;enum ActionDoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None;enum EleStageUp,Down,OpenDoor,Stop;enum ClientStatusNew,GiveUp,In,Out,Finish;#defineCloseTest 40 /电梯关门测试时间#define OverTime 300 /电梯停候超时时间#define DoorTime 20 /开门关门时间#define InOutTime 25 /进出电梯时间#define Maxfloor 4 /最高层#define M

13、infloor 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 Outfloor; /去哪层int InTime; /该乘客进入时间int GivepuTime; /所能容忍的等待时间int Infloor;/乘客进入的楼层Client;/

14、乘客类型基本操作void PrintClientInfo(Client const break;case GiveUp: printf(“t%d 号乘客放弃等待.n“,e.ClinetID);break;case Out: printf(“t%d 号乘客走出电梯.n“,e.ClinetID);break;case In:printf(“t%d 号乘客走进电梯,要去第%d 层.n“,e.ClinetID,e.Outfloor);break;default:break;Status CreatClient(Client *p=new Client;if(!p) return OVERFLOW;p-

15、ClinetID=+ID;printf(“%d 所能容忍的等待时间:“,ID);scanf(“%d“,p-GivepuTime=d;p-InTime=Time;printf(“下一乘客要到达的时间:“);scanf(“%d“,InterTime=d;printf(“所要到达的楼层:“);scanf(“%d“,p-Outfloor=d;while(p-Infloor=rand()%(Maxfloor+1)=p-Outfloor);PrintClientInfo(*p,New);return OK;Status DestoryClient(Client *p=NULL;return OK;Stat

16、us GoAbove(Client const else return FALSE;Status CInfloor(Client const Status CInTime(Client const Status COutfloor(Client const #defineSTACK_INIT_SIZE 10 /存储空间初始分配量#defineSTACKINCREMENT 5 /存储空间分配增量/乘客栈typedef Client *SElemType;typedef struct SElemType *base;SElemType *top;int stacksize;ClientStack;

17、Status InitStack(ClientStack if(!S.base) return OVERFLOW;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;Status 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.bas

18、e+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;Status Pop(ClientStack e=*(-S.top);return OK;void 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 TRUE;

19、if(E.Stage=Downreturn TRUE;return FALSE;Status EleOpenDoor(Elevator 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(Above=0else if(E.Stage=Up) if(Abo

20、ve!=0) return Up;else E.Stage=Down;return Down;else if(Below!=0) return Down;else E.Stage=Up;return Up;Action ElevatorRun(Elevator E.Count=CloseTest;return DoorOpened;case Opened:if(E.Stage=DownE.Count=DoorTime; break;case Closing:E.status=Closed;return DoorClosed;case Waiting:if(E.Count=0) if(E.flo

21、or!=1) E.CallCar1=1;else E.Count-;if(EleOpenDoor(E) E.status=Opening;E.Count=DoorTime;break;case Closed:break;case Moving:/完成移动if(E.Stage=Up) E.floor+;else E.floor-;return Achieved;E.status=Opening;E.Count=DoorTime;break;return None;/单链队列 队列的链式存储结构typedef Client *QElemType;/等候队列typedef struct QNode

22、QElemType data;struct QNode *next;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.front-data);else Q.front;Q.fro

23、nt=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 if(Q.front=Q.rear) return ERROR;p=Q.front-next;e=p-data;Q.front-next=p-next;if(Q.rear=p) Q.rear=Q.front;free(p);return OK;Status QueueEmpty(WQueue

24、Q)if(Q.front=Q.rear) return TRUE;elsereturn 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);free(p);return OK;Status CGiveUp(WQueue p=Q.front;if(p-next!=NULL) if(p-next-data-GivepuTime=0TotalTime+=Time-CInTime(*(p

25、-next-data);QDelNode(Q,p);GiveUpNumber+;elsep-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-ClinetIDnext;count+;end:while(count+=4) cout“ “;void InOut(Elevator if(E.CallCarE.floor) if(StackEmpty(

26、E.SE.floor) E.CallCarE.floor=0;else Pop(E.SE.floor,p);E.ClientNumber-;InOutCount=InOutTime;PrintClientInfo(*p,Out);TotalTime+=Time-CInTime(*p);DestoryClient(p);if(E.CallCarE.floor=0) if(!QueueEmpty(wE.floorE.Stage) DeQueue(wE.floorE.Stage,p);Push(E.SCOutfloor(*p),p);if(E.CallCarCOutfloor(*p)!=1)E.Ca

27、llCarCOutfloor(*p)=1;E.ClientNumber+;InOutCount=InOutTime;PrintClientInfo(*p,In);elseif(E.Stage=Down) E.CallDownE.floor=0;else E.CallUpE.floor=0;void NewClient(Elevator CreatClient(p);if(GoAbove(*p) EnQueue(wCInfloor(*p)Up,p);E.CallUpCInfloor(*p)=1;else EnQueue(wCInfloor(*p)Down,p);E.CallDownCInfloo

28、r(*p)=1;void Print(Elevator break;case DoorClosed:printf(“%t 电梯门已关闭.n“);break;case Achieved:printf(“%t 电梯已到达第%d 层。n“,E.floor);break;case GoingUp:printf(“%t 电梯上升中.n“);break;case GoingDown:printf(“%t 电梯下降中.n“);break;default:break;int main()Elevator E;printf(“*n“ 欢迎使用电梯模拟系统 n“*n“n“);WQueue wMaxfloor+12

29、;InitEle(E);srand( (unsigned)time( NULL );for(int i=0;i=Maxfloor;i+)InitQueue(wiUp);InitQueue(wiDown);MaxTime=1000000;printf(“请输入电梯的运行时间:“);scanf(“%d“,while(Time+MaxTime)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=

30、0) if(EleStatus(E)=Opened) InOut(E,w);else InOutCount-;if(CountOver(E)|EleStatus(E)=Closed|EleStatus(E)=Waiting) Action a;a=ElevatorRun(E);Print(E,a);Sleep(100);printf(“%共%d 人进入系统,“,ID);printf(“%共%d 人放弃。“,GiveUpNumber);DestoryEle(E);for(i=0;i=Maxfloor;i+) DestroyQueue(wiUp);DestroyQueue(wiDown);return 0;

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

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

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


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

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

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