数据结构课程设计报告--电梯模拟

上传人:daj****de2 文档编号:208987250 上传时间:2023-05-12 格式:DOCX 页数:30 大小:147.90KB
收藏 版权申诉 举报 下载
数据结构课程设计报告--电梯模拟_第1页
第1页 / 共30页
数据结构课程设计报告--电梯模拟_第2页
第2页 / 共30页
数据结构课程设计报告--电梯模拟_第3页
第3页 / 共30页
资源描述:

《数据结构课程设计报告--电梯模拟》由会员分享,可在线阅读,更多相关《数据结构课程设计报告--电梯模拟(30页珍藏版)》请在装配图网上搜索。

1、课程设计课程名称数据结构题目名称2.8电梯模拟(难度5)学生学院计算机学院专业班级XXXXXXXXXX学 号XXXXXXXX学生姓名XXX指导教师XX2013年7月4日电梯模拟系统一、 简单介绍1、问题描述 设计一个电梯模拟系统,这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体” 构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的,在离散的模拟中,以模 拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种 事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。2、基本要求(1)、模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五

2、个楼层由 下至上依次称为地下层、第一层、第二层、第三层,第四层,其中第一层是大楼的进出层, 即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。(2)、乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦 等候电梯时间过长,他将放弃。(3)、模拟时钟从0 开始,时间单位为0.1秒。人和电梯的各种动作均要消耗一定的时间单 位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和 开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1 层侯命。(4)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。

3、二、设计目的当初之所以选择做电梯模拟这个课题,主要是因为觉得当今时代需要,所以觉得想尝试 一下,因为为了方便,我们都会选择乘坐电梯,既省时间又省力,粗略看了书本里面的描述, 觉得应该不难,只是按照要求输出动作序列即可,后来经过老师的辅导,才发现,原来自己 选了个最难的课程设计,也问了同学,很多都是因为太难了才没有选这个题目,因为它远比 想象中的复杂的多很多,它实际上是模拟现实中的电梯的运行状况,因此要考虑很多现实中 遇到的实际情况,坐过电梯的人都会应该有点印象,现实中的电梯是按照每个人按下按钮的 时间顺序进行服务的,但是,并不是将一个人接进来后就直接开往其目的楼层就完事,其实, 当电梯将某个人

4、送往其目的楼层的过程中,经过某层时,如果此层的人也要用电梯,虽然其 按按钮的时间有可能比先前那个人晚,但是电梯依旧会开门将其接入,然后继续送前一个人 去目的地,之后再送这个人去他的目的楼层,如果有多人在电梯中时,也是按照申请时间的 先后决定先去哪层的,同理,若在某层,电梯中的某个人,或者某几个人要在该层下,电梯 也不能忽略这些,而是要先开门使要下的人出去,之后继续开往先前的楼层,所以设计时, 每当电梯上升或下降一层后,都应该检测现在电梯所处的这层有没有人有用电梯的请求,或 者电梯中的人有没有要在该层下的情况,若有则电梯要在该层停一下,否则继续上升或下 降.此外,当电梯停在某一层时不外乎三种情况

5、: 1.此层有个人或有几个人等候要用电梯 2. 电梯中的某个人或者某几个人要在该楼层下 3.则是前面两种情况的结合,此时情况相当复 杂,因为,题目要求电梯开门和关门都要消耗一定的时间(题目中没有提电梯上升或者下降 一层需要多少时间,所以不妨就假定为30t),而且人进电梯和人出电梯时也要消耗一定的时 间,这说明了当同一时刻有至少两个以上的人要进行同一种动作的时候(比方说都是要出电 梯,或都是在某一层等电梯,电梯来了后都要进去),但是因为每个人进出电梯都要消耗时 间,所以不能单纯的同时让这些人同进或同出电梯,而是要有先后顺序的进出,此为其其二,题目中还提到每个人等候电梯到来时,都有一个容忍时间(每

6、个人不一定相同),所 以,万一,在他按下按钮到电梯开到他所在的那层楼的间隔时间大于他的最大容忍时间,他 会先行离开,但这一切电梯并不知道啊,所以电梯依旧会按照每个申请使用电梯的时间进行 服务,正是因为这样,极有可能发生这样的情况:电梯开到某层后打开电梯门,但是既没有 人出去,也没有人进来其三,根据题目中的要求,当电梯停在某层时候,有人进出,电梯每隔40t测试一次,若无 人进出,则关门,关门完后,若300t时间内没有人使用,则自动开到第1层等候下次的使 用(第1层楼是电梯的本垒层, 电梯“空闲”时,将来到该层候命)等等等等以上各种情况(还有一些情况这里没列举)都是要在做这道题时需要考虑的,否则这

7、题的电梯根本模拟不起来三、设计概要本程序中所有的抽象数据类型的定义及其相应的操作函数的定义如下:电梯的结构体 dianti/*此电梯结构体中分别定义了电梯所在楼层,电梯的现有人数(现实中的电梯有个最大栽 客量,在此题中不妨规定为最大12人),以及电梯门的状态(0为关, 1为开),至于为什么 定义电梯门的状态,并不是多此一举,而是我在调试的过程中发现必须加上的,否则,在一 些情况下会出现电梯动作的局部重复,从而导致整个程序的失败*/人的结构体 man/*在人的结构体中,分别定义了人的名字(这个有利于区别各个人),最大容忍时间(题目 中的要求),所在的楼层,要去的目的楼层,两个标志位,其中一个标志

8、记录该人是否还在 电梯里面,另一个标志记录的是该人是否已经使用过电梯*/事件结构体结点 SLNode /*在事件的结构体中分别定义了,事件信息,事件发生的时刻,以及指向下一个事件结构结 点的指针*/void ListInitiate(SLNode*head)/*初始化链表*/void LinListSort(SLNode *head)/*用按发生时间的顺序给事件链表中的事件排序*/void Destroy(SLNode * *head)/*撤消链表*/void OPEN(SLNode *head,dianti dt,int now)/*电梯开门函数,将电梯开门的事件信息插入到事件链表中去*/v

9、oid CLOSE(SLNode *head,dianti dt,int now)/*电梯关门函数,将电梯关门的事件信息插入到事件链表中去*/void GET_IN(SLNode *head,dianti dt,int now)/*人进电梯的函数,将人进电梯时候的各种信息插入到事件链表中去*/void GET_OUT(SLNode *head,dianti dt,int now)/*人出电梯的函数,将人出电梯时候的各种信息插入到事件链表中去*/注释:以上四个函数基本是用来完成人和电梯的动作序列int gettime(SLNode *head)/*返回最新事件(即事件涟表最后一个结点)的发生时间

10、,此为该程序中最重要的一个函数 之一,并且为调用最频率最高的一个函数*/void print(SLNode *head)/*将事件链表中的事件显示出来,即为最后显示电梯和人动作序列的函数7void Go(SLNode *head,int n,dianti dt,clock_t s1000,man r1000)/*电梯运行函数,本程序中最最重要的函数,可以说这是这道程序中的灵魂函数,根据申请 使用电梯的所有人的信息,以及所有事件发生时的时刻,将所有情况的处理都放在在其中, 所以此函数的代码相当占了程序代码的百分之七十多了(程序总代码长度超过1200行)*/ 注释:以上各个函数以及抽象数据结构的定

11、义都放在头文件leva tor.中”void main()/*该程序的主函数*/程序流程图如下:四、详细设计 本程序的所有抽象数据类型的具体实现一机相应的操作函数的伪算法如下: typedef structint lc;电梯所在楼层int rs;电梯中的人数,规定最大乘坐人数为12int door;/门的状态0关1开dianti;typedef structchar name50; /这个人的名字或序号(以示区别)int rrsj;/个人的容忍时间int lc;所在楼层int md;目的楼层int biaozhi; /此标志位记录人使用电梯是否完成或者是否离去,为 1 表明使用过(离去),否则

12、为 0int in;/标志位,为1 时表明人在电梯中,否则为0man;typedef struct Nodechar a1000;事件信息int mytime;/事件所发生的时间struct Node *next;SLNode;/初始化链表void ListInitiate(SLNode* *head)if(*head = (SLNode *)malloc(sizeof(SLNode) = NULL) exit(1); (*head)-next = NULL;将事件结点插入到事件链表中的第i个位置中去int ListInsert(SLNode *head,int i,char a1000,in

13、t t)SLNode *p,*q;int j;p=head;j=-1;while(p-next!=NULL & jnext;j+;if(j!=i-1)printf(n插入位置参数错!n);return 0;if(q=(SLNode *)malloc(sizeof(SLNode) = NULL) exit(1); q-mytime = t;strcpy(q-a,a);q-next =p-next;p-next =q;return 1;/用按发生时间的顺序给事件排序void LinListSort(SLNode *head)SLNode *curr,*pre,*p,*q;p=head-next;h

14、ead-next=NULL;while(p!=NULL)curr=head-next;pre=head;while(curr!=NULL & curr-mytimemytime)pre=curr;curr=curr-next;q=p;p=p-next;q-next=pre-next;pre-next=q;/销毁链表void Destroy(SLNode * *head)SLNode *p,*p1;p=*head;while(p!=NULL)p1=p;p=p-next;free(p1);*head = NULL;/*电梯动作:1.开始开门,20t,开门结束;2. 开始关门,20t,关门结束;3.

15、 从n-1层开始移动,30t,到达第n层;4. 开始等待,有人来或者300t,等待结束;人的动作:1.开始等待,xv=最大容忍时间,等待结束;2. 开始进门,25t,进门结束;3. 开始出门,25t,出门结束;*/电梯开门void OPEN(SLNode *head,dianti dt,int now)char a1000=电梯开始开门”,b1000=开门完毕!; ListInsert(head,g,a,now);g+;ListInsert(head,g,b,now+20); g+;dt.door=1;/门的状态为开/电梯关门void CLOSE(SLNode *head,dianti dt,

16、int now)char a1000=电梯开始关门,b1000=关门完毕!; ListInsert(head,g,a,now);g+;ListInsert(head,g,b,now+20); g+;dt.door=0;/门的状态为关/人进电梯void GET_IN(SLNode *head,dianti dt,int now)char a1000=人开始进门.,b1000=已经进入!; ListInsert(head,g,a,now);g+;ListInsert(head,g,b,now+25); g+;dt.rs+;/电梯人数加一个/人出电梯void GET_OUT(SLNode *head

17、,dianti dt,int now)char a1000=人开始出门.”,b1000=已经出门!; ListInsert(head,g,a,now);g+; ListInsert(head,g,b,now+25);g+;dt.rs-;/电梯中的人数减一个/返回最新事件(即事件涟表最后一个结点)的发生时间int gettime(SLNode *head)SLNode *pre,*curr; curr=head-next;pre=head; while(curr!=NULL)pre=curr; curr=curr-next;return pre-mytime;/电梯运行函数void Go(SLN

18、ode *head,int n,dianti dt,clock_t s1000,man r1000)int k=0,i,time,m,flag=0,counter=0; /flag 记录是否有多个人在同一层或去同一层楼 for(i=0;in;i+)if(dt.door=0)/初始电梯门状态为关着if(dt.lc=ri.lc&dt.rs12&ri.biaozhi=0&ri.in=O)人在该楼层,要进 去电梯,且电梯人数不超过规定的12人if(i=0) time=si/100;/记录当时时间else time=gettime(head);if(flag=0&dt.door=0) OPEN(head

19、,dt,time);/开门dt.door=1; if(time-si/100)rm.rrsj)&rm.biaozhi=0) rm.biaozhi=1;printf(n此时有人离开,以下为离开的人的信息:n”); printf(”时间:%d(单位:t)发生的事件超过用户的容忍时间,第小层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);time=gettime(head); /获得事件链表最后一个结点的时间(即当前时刻)if(dt.lc=ri+1.lc) flag=1;counter+;continue; /该层的所有人都进入电梯 elseif(dt.door=1)time=gett

20、ime(head);ListInsert(head,g,该层已无人进出,关门,time+40);电梯经过40t时间后,若无人进出,则关门dt.door=0;/置电梯门状态为关g+;CLOSE(head,dt,time+40);/* 本层人已经全部进入电梯,接下来电梯启动按每个人事件发生的时间顺序将其送往目的楼层*/flag=0;if(dt.lc=ri-counter.md)time=gettime(head);while(dt.lc=ri-counter.md) /开往该层第一个人的目的楼层 flag=0;if(dt.lcri-counter.md)dt.lc+;time+=30; for(m

21、=0;mn;m+) if(dt.lc=rm.lc&rm.biaozhi=0&rm.in=0&dt.rs12)/ 若该楼层有人等候,使其进入if(flag=0&dt.door=0)OPEN(head,dt,time); dt.door=1;/电梯开门,并设置其门状态为开if(time-sm/100)rm.rrsj)&rm.biaozhi=0) rm.biaozhi=1;printf(n 此时有人离开,以下为离开的人 的信 息:n);printf(”时间:d (单位:t)发生的事件超过用户的容忍时间,第d层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要

22、出去,使其出电梯,置其状态为 1 表示该 人已经使用过电梯else if(dt.lc=rm.md&rm.biaozhi=0&rm.in=1)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1; time=gettime(head);GET_OUT(head,dt,time);rm.biaozhi=1;rm.in=0;flag=1;if(dt.lc=ri-counter.md) break;if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);电梯经过40t时间后,

23、若无人进出,则关门dt.door=0;/置电梯门状态为关g+;CLOSE(head,dt,time+40); time=gettime(head);if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);else if(dt.lc=ri-counter.md)time=gettime(head);while(dt.lc=ri-counter.md)flag=0;if(dt.lcri-counter.md)dt.lc-;30t,电梯下降一层t

24、ime+=30;for(m=0;mn;m+)if(dt.lc=rm.lc&rm.biaozhi=0&rm.in=0&dt.rs12) /若该楼层有人等候,使 其进入if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1; if(time-sm/100)rm.rrsj)&rm.biaozhi=0)rm.biaozhi=1;printf(n 此时有人离开,以下为离开的人的信 息:n);printf(”时间:d (单位:t)发生的事件超过用户的容忍时间,第d层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要出去,使

25、其出电梯,置其状态为1 表示该 人已经使用过电梯else if(dt.lc=rm.md&rm.biaozhi=0& rm.in=1)if(flag=0&dt.door=0) OPEN(head,dt,time); dt.door=1; time=gettime(head);GET_OUT(head,dt,time);rm.biaozhi=1;rm.in=0;flag=1;if(dt.lc=ri-counter.md) break;if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;

26、CLOSE(head,dt,time+40); time=gettime(head);if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);i=i-counter;else if(dt.lc=ri.md&ri.biaozhi=0&ri.in=1) /人在电梯中,在该楼层要 出去if(i=0)time=s0/100;else time=gettime(head);for(m=0;mn;m+)if(dt.lc=rm.lc&rm.biaozhi

27、=0&rm.in=0&dt.rs12) /若该 楼层有人等候,使其进入if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1;if(time-sm/100)rm.rrsj)&rm.biaozhi=0)rm.biaozhi=1;printf(n此时有人离开,以下为离开的人的信息:n); printf(时间:d(单位:t)发生的事件超过用户的容忍时间,第d层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要出去,使其出电梯,置其状态为1 表示该人已经使 用过电梯else if(dt.lc=rm.md&rm.biao

28、zhi=0&rm.in=1)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1;time=gettime(head);GET_OUT(head,dt,time);rm.biaozhi=1;rm.in=0;flag=1;if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);/1.if(dt.lc=ri.lc&dt.rs12&ri.biaozhi=0&ri.in=0) ,人在该楼层 , 要进去电梯

29、2.else if(dt.lc=ri.md&ri.biaozhi=0& ri.in=l)” 人在电梯中,在该 楼层要出去3.else if(dt.lc!=ri.lc&dt.rsv12& ri.biaozhi=0& ri.in=O),”,人不在 该楼层,要进去电梯4.else if(dt.lc!=ri.md& ri.biaozhi=0&ri.in=1),”人在电梯里,该楼 层不是其目的楼层else if(dt.lc!=ri.lc&dt.rs12&ri.biaozhi=0&ri.in=0)/3.人不在该楼层,要进去电梯flag=0;起始时间if(i=0)time=s0/100;/以该事件发生的时间

30、为else time=gettime(head);if(dt.lc=ri.lc)while(dt.lc=ri.lc) flag=0; if(dt.lcri.lc) dt.lc+;/取当前时间time+=30;30t,电梯上升一层for(m=0;mn;m+)/若该楼层有人等候,使其进入if(dt.lc=rm.lc&rm.biaozhi=0&rm.in=0&dt.rs12)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1; if(time-sm/100)rm.rrsj)&rm.biaozhi=0)rm.biaozhi=1;printf(n 此时有人离

31、开,以下为离开的人的信 息:n);printf(时间:d (单位:t)发生的事件超过用户的容忍时间,第小层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要出去,使其出电梯,置其状态为1 表示该人已经使用过电梯elseif(dt.lc=rm.md&rm.biaozhi=0&rm.in=1)if(flag=0&dt.door=0) OPEN(head,dt,time); dt.door=1;time=gettime(head);GET_OUT(head,dt,time);rm.biaozhi=1; rm.in=0;flag=1;if(dt.lc=ri.l

32、c) break;if(dt.door=1) time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40); time=gettime(head);if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40); time=gettime(head);else if(dt.lc=ri.lc)while(dt.lc=ri.lc)

33、flag=0;if(dt.lcri.lc)dt.lc-;time+=30;for(m=0;mn;m+)/若该楼层有人等候,使其进入if(dt.lc=rm.lc&rm.biaozhi=0&rm.in=0&dt.rs12)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1;if(time-sm/100)rm.rrsj)&rm.biaozhi=0)rm.biaozhi=1;printf(n 此时有人离开,以下为离开的人的信息:n);过用户的容忍时间,第d层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要出去,使

34、其出电梯,置其状态为 1 表示该人已经使用过电梯elseif(dt.lc=rm.md&rm.biaozhi=0&rm.in=1)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1;time=gettime(head);GET_OUT(head,dt,time);rm.biaozhi=1;rm.in=0;flag=1;if(dt.lc=ri.lc) break;if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt

35、,time+40); time=gettime(head);if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);/*接下来将电梯里的人按时间顺序送到各自的目的楼层*/time=gettime(head);if(dt.lc=ri.md&ri.in=1)while(dt.lc=ri.md)flag=0;if(dt.lcri.md)dt.lc+;time+=30;for(m=0;mn;m+) /若该楼层有人等候,使其进入if(dt.lc=rm

36、.lc&rm.biaozhi=0&rm.in=0&dt.rs12)if(flag=0&dt.door=0) OPEN(head,dt,time); dt.door=1; if(time-sm/100)rm.rrsj)&rm.biaozhi=0)rm.biaozhi=1;printf(n 此时有人离开,以下为离开的人的信 息:n);printf(时间:d (单位:t)发生的事件超过用户的容忍时间,第d层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要出去,使其出电梯,置其状态为 1 表示该人已经使用过电梯elseif(dt.lc=rm.md&rm.bi

37、aozhi=0&rm.in=1)if(flag=0&dt.door=0) OPEN(head,dt,time); dt.door=1;time=gettime(head);GET_OUT(head,dt,time);rm.biaozhi=1; rm.in=0;flag=1;if(dt.lc=ri.md) break;if(dt.door=1) time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40); time=gettime(head);if(dt.door=1)t

38、ime=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);else if(dt.lc=ri.md&ri.in=1)while(dt.lc=ri.md)flag=0;if(dt.lcri.md)dt.lc-;time+=30;for(m=0;mn;m+)/若该楼层有人等候,使其进入if(dt.lc=rm.lc&rm.biaozhi=0&rm.in=0&dt.rs12)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1;if(t

39、ime-sm/100)rm.rrsj)&rm.biaozhi=0)rm.biaozhi=1;printf(n 此时有人离开,以下为离开的人的信 息:n);printf(时间:d (单位:t)发生的事件超过用户的容忍时间,第d层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要出去,使其出电梯,置其状态为1表 示该人已经使用过电梯elseif(dt.lc=rm.md&rm.biaozhi=0&rm.in=1)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1;time=gettime(head);GET_OU

40、T(head,dt,time);rm.biaozhi=1;rm.in=0;flag=1;if(dt.lc=ri.md) break;if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40); time=gettime(head);if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);/1

41、.if(dt.lc=ri.lc&dt.rs12&ri.biaozhi=0&ri.in=0) ,人在该楼层 ,要进去电梯2.else if(dt.lc=ri.md&ri.biaozhi=0& ri.in=l)” 人在电梯中,在该楼层要出去3.else if(dt.lc!=ri.lc&dt.rsv12&ri.biaozhi=0&ri.in=O),”,人不在该楼层,要进去电梯else if(dt.lc!=ri.md&ri.biaozhi=0&ri.in=1)/4.人在电梯里 ,该楼层不是其目的楼层flag=0;if(i=0)time=s0/100;/以该事件发生的时间为起始时间else time=g

42、ettime(head);/取当前时间if(dt.lc=ri.md)while(dt.lc=ri.md)flag=0;if(dt.lcri.md)dt.lc+;time+=30;for(m=0;mn;m+)/若该楼层有人等候,使其进入if(dt.lc=rm.lc&rm.biaozhi=0&rm.in=0&dt.rs12)if(flag=0&dt.door=0) OPEN(head,dt,time); dt.door=1; if(time-sm/100)rm.rrsj)&rm.biaozhi=0) rm.biaozhi=1;printf(n 此时有人离开,以下为离开的人 的信 息:n);prin

43、tf(时间:d(单位:t)发生的事件超过用户的容忍时间,第d层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要出去,使其出电梯,置其状态为 1 表示该 人已经使用过电梯else if(dt.lc=rm.md&rm.biaozhi=0&rm.in=1) if(flag=0&dt.door=0)OPEN(head,dt,time); dt.door=1; time=gettime(head); time=gettime(head);GET_OUT(head,dt,time);rm.biaozhi=1;rm.in=0;flag=1;if(dt.lc=ri.

44、md) break;if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);time=gettime(head);if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);else if(dt.lc=ri.md)while(dt.lc=ri.md)flag=0;if(dt.lcri.md)

45、dt.lc-;time+=30;for(m=0;mn;m+) /若该楼层有人等候,使其进入if(dt.lc=rm.lc&rm.biaozhi=0&rm.in=0&dt.rs12)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1;if(time-sm/100)rm.rrsj)&rm.biaozhi=0) rm.biaozhi=1;printf(n 此时有人离开,以下为离开的人的信息:n);printf(时间:d(单位:t)发生的事件超过用户的容忍时间,第d层楼的人已经离去n,sm/100+rm.rrsj,dt.lc);flag=1;/若该楼层有人要

46、出去,使其出电梯,置其状态为 1 表示该 人已经使用过电梯else if(dt.lc=rm.md&rm.biaozhi=0&rm.in=1)if(flag=0&dt.door=0)OPEN(head,dt,time);dt.door=1; time=gettime(head);GET_OUT(head,dt,time);rm.biaozhi=1;rm.in=0;flag=1;if(dt.lc=ri.md) break;if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(

47、head,dt,time+40); time=gettime(head);if(dt.door=1)time=gettime(head);ListInsert(head,g,该层已无人进出,关门,time+40);dt.door=0;g+;CLOSE(head,dt,time+40);time=gettime(head);if(dt.lc!=1)ListInsert(head,g,在该层等候300t时间,无人进出,开始返回第一层,time+300);time=gettime(head);if(dt.lc1)ListInsert(head,g, 电 梯 已 经 回 到 第 一 层 , 等 候 使

48、 用,time+(dt.lc-1)*30);else ListInsert(head,g,电梯已经回到第一层,等候使用,time+30);dt.lc=1;elsetime=gettime(head);ListInsert(head,g,此时电梯已经在第一层,等候使用”,time);void print(SLNode *head)SLNode *p;p=head;if(p-next=NULL)printf(n 错误,链表为空! n);此语句为检验之用 while(p-next!=NULL)printf(n 时间:d(单位:t)动作:s,p-next-mytime,p-next-a);p-next

49、=p-next-next;/欢迎界面void Welcome()char c;printf(nnnTx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx n);printf( nnnnn)

50、;printf( 欢 迎 使 用 这 个 关 于 电 梯 模 拟 的 软 件 !n);printf( 制 作 者 : XXXn);printf(班 级 : XXX 学 号 : XXXXnn);printf(nnn(M oM)nn); printf( nnn);printf( Please input any key to continue);c=getche( );fflush(stdin);/不清除缓冲去会出错 system(cls);/主函数int main()int t,a,k=0,i,flag=0; SLNode *head;/数组,用来存输入数据时候所用时间clock_t start

51、,shijian1000,In_put10002;为了保证输入数据时计时暂停,定义一个 In_putdianti dt;Welcome(); printf(nn 时间单位 t:0.1(秒)”); printf(n 楼层范围:0-5(层)”); printf(n 最大载客量:12(人)n”); start=clock();dt.lc=1;/开始电梯停在第一层dt.rs=0;/电梯最大人数为 12,开始时候电梯内人数为空dt.door=0;t=(int)start/100;printf(n 当前时刻:%d(t)计时开始.n,t);ListInitiate(&head); while(1)print

52、f(n0.下班楼空1.有人要用电梯5); printf(请选择指令:”); scanf(%d,&a);if(a=0) printf(n);break; if(a=1)In_putk0=clock(); printf(n暂停计时,请输入此人的序号(可以为任意字符):); scanf(%s,renk.name);printf(”所在楼层:); scanf(%d,&renk.lc); printf(目的楼层:); scanf(%d,&renk.md); printf(最大容忍时间:”);scanf(%d,&renk.rrsj); In_putk1=clock(); k+;printf();printf(n 以下为要使用电梯的各个人的信息 :(根据其申请使用电梯的时间先后顺序排 列)n);for(i=0;ik;i+)int j;flag=0;for(j=0;ji;j+)if(reni.lc=renj.lc)flag=1;break;/判断这层是否有多个人一起等候电

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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