数据结构电梯模拟讲解_第1页
数据结构电梯模拟讲解_第2页
数据结构电梯模拟讲解_第3页
数据结构电梯模拟讲解_第4页
数据结构电梯模拟讲解_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 栈和队列及其应用电梯模拟 实验三 数据结 课 程 实 验 报 告 构 姓名:陈东 学号:070612146 安庆师范学院2012计算机卓越班 1/20 栈和队列及其应用电梯模拟 实验三 目录 一、【实验目的】3 二、【问题描述】3 三、【基本要求】3 四、【实验环境】3 五、【测试数据及其结果】 4 六、【实验源代码】8 安庆师范学院2012计算机卓越班 2/20 栈和队列及其应用电梯模拟 实验三 一、【实验目的】 帮助学生熟练掌握线性表的基本操作在链衣结构中的实现,熟练进行各种链 表的操作和应用。 二、【问题描述】 设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和 电梯等

2、“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本 独立的。在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序, 系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作 预定要发生的下一个时刻。 三、【基本要求】 (1) 、模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五 个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层 是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来该层候命。五个 楼层从下到上的编号为:0、1、2、3、4。除了地下层外,每一层都有一个要求向下 的按钮除了第四层外,每一层都有一个要求

3、向上的按钮。对应的变量为:CallUp0.3 和CallDowntl. .4o电梯内的五个目标层按钮对应的变量为:CallCar 0. 4 (2) 、电梯一共有七个状态,即正在开门(Opening)、已开门(Opened)、正在 关门(Closing)、已关门(Closed)、等待(Waiting)、移动(Moving)、减速 (Decelerate)。 (3) 、 乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待 安庆师范学院2012计算机卓越班 3/20 栈和队列及其应用电梯模拟 实验三 时间,一旦等候电梯时间过长,他将放弃。对于在楼层内等待电梯的乘客,将插入 在等候队列里

4、,每一层有两个等候队列,一队要求向上,一队要求向下,用链队列 来实现。对于在电梯内的乘客,用五个乘客栈来实现,该乘客要去哪一层,就把他 放在相应编号的栈屮,对应变量为EleStack0-4o (4)、模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要耗费一定 的时间单位(简记为t): 有人进出时,电梯每隔40t测试一次,若无人进出,则关门 关门和开门各需要20t 每个人进出电梯均需要25t 电梯加速需要15t 如果电梯在某层静止时间超过300t,则驶回1层候命。 (5)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。 Windows 7, VC+6.0 五、【测试数据及

5、其结果】 1、乘客类型 反映乘客的所有属性。 ADT Client 数据对象:D二ai e乘客信息,I二1,2,n, nO 数据关系:R=|ail, aiD, i-2,n 基本操作: 安庆师范学院2012计算机卓越班 4/20 栈和队列及其应用电梯模拟 实验三 PrintClientlnfo(Client const enuB ActionfDoorOpened. DoorClosed, GoingUp, GoingDown, Achieved None; enui El eSt age Up, Down. OpenDoor, Stop; enim Client Status NeyGiveU

6、p, In, Out, Finish; define Cl os eTest 40 电梯关门测试时间 #define OverTiie 300 电梯停候超时时间 ffdefine DoorTiie 20 开门关门时间 ffdefine InOutTime 25 define Maxfloor 4 define Minfloor 0 long Tie=0; long MaxTime; int In0utCount=0; int InterTime=O; int ID=0; int GiveUpNuber=0: int TotalTime=0; 进出电梯时间 最高层 最低层 时钟 系统运行最K时间

7、 用于进出计时 下一乘客进入系统的时间 乘客编号 乘客放弃的数目 /总共等待时间 乘客类型 typedef struct int ClinetID; /乘客编号 int Out floor; / / k 哪层 int InTiae; 该乘客进入时间 int GivepuTiae; 所能容忍的等待时间 int Infloor;/乘客进入的楼层 JClient; 乘客类型基本操作 void Pr intC 1 i ent Info (Cl i ent const 4e, Clientstatus s) switch(s) case New:printf (*t%d号乘客进入第d层.n. e. Cl

8、inetID, e. Infloor);break; case GiveUp: printf客放弁等待.nt e. ClinetID) ;breeik; case Out:printfCt%d号乘客走出电梯.n, e. ClinetID);break; case In:printf (Mt%d 号乘客走进电梯.要去第 d 层.rT, e. ClinetID, e. Out floor); break; 安庆师范学院2012计算机卓越班 9/20 栈和队列及其应用电梯模拟 实验三 default: break; ; Status CreatClient(Client * p=nev Client

9、; if(!p) return OVERFLOW.: p-ClinetID=+ID; printf (%d所能容忍的等待时间:,ID); scanf p-XJivepuTiae=d; p-InTime=TiMe; printfC F-乘客要到达的时间:); scant InterTime=d; printf(所要到达的楼层:); scant p-Outfloor=d; hi le(p-Infl oor=r and () % (Maxfloor+1) )=p-X)ut floor); PrintClientInfo(*p. New); return OK; Status DestoryClien

10、t(Client *4p) delete p; p=NULL; return OK; Status GoAbove(Client const else return FALSE, Status CInfloor(Client const Status ClnTiae(Client const 安庆师范学院2012计算机卓越班 10/20 栈和队列及其应用电梯模拟 实验三 Status COutfloor (Client const define STACK.INIT.SIZE100 存储空间初始分配屋 define STACKINCREMENT50 存储空间分配增呈: 乘客栈 typedef

11、Client*SElemType; typedef struct SEleaType*base; SElemType*top; intstacksize; ClientStack. Status Ini t St ack (Client St ack if(lS.base) return OVERFLOW; S top=S. base; S. stacksize=STACK.INIT.SIZE; return OK; Status Des troySt ack(Cli ent St ack p=S. stacksize) S.base=(SElemType *)realloc(S. base,

12、 (S. stacksize+STACKINCREMENT)*sizeof(SElemType); if(IS. base) return OVERFLOW; S top=S base+S stacksize; S. stacksize+=STACKINCR 31 3 NT; *S top+=e; return OK; Status Pop(ClientStack e=*(S top); return OK; void Print St ack (Cl i ent St ack i=S base; while (iS. top) cout(*i+)-X?linetID,; 电梯类型 typed

13、ef struct int floor;/电梯所在层 int ClientNumber; /电梯内人数 EleStatus status; /电梯为前状态 EleStage Stage; 电梯运行时期 安庆师范学院2012计算机卓越班 12/20 栈和队列及其应用电梯模拟 实验三 int Count;用于电梯计时 int CallUpMaxfloor+1 ;/每层的Up按钮 int CallDovnMaxf 1 oor+1 ; 毎层的Down按钮 int CallCarMaxfloorH; 电梯内的U标层按钮 Cl ient St ack S Maxfl oor+1 ;/乘客栈,要去不同楼层的

14、人放在不同的栈中 jElevator; 电梯类型基本慄作 void InitEle(Elevator E floor=l; E status二Vai ting; E Count =OverTijne; E Stage=Dc-vn; E. Cl i entNimber=O; for(i=0;i=Maxfloor;i+) E. CallUpi=O;E. CallDoni=0;E. CallCari=0; for(i=0;i=Maxfloor;i+) InitStack(E Si); Status CountOver(Elevator return FALSE; return TRUE; ) voi

15、d DestoryEle(Elevator for(i=0;i=Maxfloor;i+) DestroyStack(E. Si); Status El eFloor (Elevator const EleStatus EleStatus(Elevator const Status RequireAbove(Elevator const i=Minfloor; i) if (E.CallCar i 11E. CallDovnti 11E. CallUpi) return TRUE, return FALSE; Status EleAchieved(Elevator if (E. Stage=Up

16、lAE. CallDownE. floorreturn TRUE; if (E. Stage=Dovnreturn TRUE; return FALSE; Status EleOpenDoor(Elevator if (E status=Waiting) if (E.CallDowntE. floor) E. Stage=Don;return TRUE; if (E. CallUpE. floor) E. Stage=Up.retum TRUET return FALSE; EleStage EleDecide(Elevator Above=RequireAbove (E); Below=Re

17、quireBelo(E); if (Above=0McBelo=0) return Stop; else if (E Stage=Up) if (Above 1=0) return Up; else 栈和队列及其应用电梯模拟 实验三 E Stage=Down; return Down; else if (Belowl=0) return Down; else E Stage=Up;return Up; Action ElevatorRun(Elevator E Count =C1 os eTest; return DoorOpened; case Opened: if(E. Stage=Dor

18、A41E. CallCarE. floorJE. Count=DoorTime; break; case Closing: E status=Closed; return DoorClosed; case Taiting: if (E. Count=0) ii(E. iloorl=l) E. CallCar1=1; else ECount; if(EleOpenDoor(E) E status=Opening;E Count=DoorTime;break: case Closed: break; case Moving: 完成移动 if (E. Stage=Up) E. floor+; els

19、eE floor一; return Achieved; E. status=Opening;E. Count=DoorTie; break; ; return None; 安庆师范学院2012计算机卓越班 15/20 栈和队列及其应用电梯模拟 实验三 单链队列一队列的链式存储结构 typedef Client *QEleType; 等候队列 typedef struct QNode QEleaTypedata; struct QNode *next; QNode, *QueuePtr; typedef struct QueuePtr front; QueuePtr rear; Queue; 等

20、待队列的基本操作 Status Init Queue (VQueue if (IQ. 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. front=Q. rear; return OK; Status EnQueue(WQueue p=new QNode; if(!p) return OVERFLOW; p-d

21、ata=e;p next=NULL; Q. rear-next=p; Q rear=p; 栈和队列及其应用电梯模拟 实验三 return OK; Status DeQueue(fQueue 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(IQueue Q) if (Q front=Q.rear) return TRUE; else return

22、 FALSE; Status QDelNode(IQueue if (p=NULL11p-next=NULL) return ERROR; q=p-next; p-next=crnext; if (p-next=NULL) Q. rear=p, DestoryClient(q-data); free(p); return OK; Status CGiveUpdQueue p=Q. front; if(p-nextl=NULL) if (p-next-data-XivepuTiBe=01 TotalTijne+=TiMe-InTijne(*(p-next-data); QDelNode (Q,

23、p); GiveUpNuBber+; 安庆师范学院2012计算机卓越班 17/20 栈和队列及其应用电梯模拟 实验三 elsep-next-data-GivepuTime; return OK; void PrintQueus(fQueue Q) QueuePtr q; int count=0; if (Q. front-next=NULL) goto end; q=Q front-next; hile(q!二NULL) coutsetdata-X?linetID Fcrnext; count*; end: hi 1 e (count+pty(E.SE. floor) E.CallCarE.

24、floor=0; else Pop(E. SE. floor, p) ;E. ClientNuber; InOutCount=InOutTime; PrintClient Inf o (*p, Out); TotalTime+=TiMe-CInTijie(*p); DestoryClient (p); if(E. CallCarE. floor=0) if (!QueueEmpty(wE. floor E. Stage) DeQueue(E floorE Stage, p); Push(E. SCOutfloor(*p), p); if (E. CallCar COut fl oor (*p)

25、 1=1) E. CallCeir COutfloor (*p) =1; E. ClientNuber+; 安庆师范学院2012计算机卓越班 18/20 栈和队列及其应用电梯模拟 实验三 InOutCount=InOut Tine; Pr intCl ient Inf o (*p. In); else if (E. Stage=Down) E. CallDownE. floor=0; else E. CallUptE. floor=0; void NewClient (Elevator if(GoAbove (*p) EnQueue(wCInfloor (*p) Up,p) ;E. CallUpCInfloor (*p)=l; else EnQueue(CInf 1 oor (*p) Down. p) ;E. CallDonCInfloor(*p)=l; void Print(Elevator break; case DoorClosed:printf (A%t电

温馨提示

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

评论

0/150

提交评论