电梯模拟C语言数据结构中国地质大学改进版_第1页
电梯模拟C语言数据结构中国地质大学改进版_第2页
电梯模拟C语言数据结构中国地质大学改进版_第3页
电梯模拟C语言数据结构中国地质大学改进版_第4页
电梯模拟C语言数据结构中国地质大学改进版_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

数据结构课程设计学生姓名:庞晓健学号:20121000399院(系):计算机学院专业:信息安全2014年3月21日题目:电梯模拟1、问题描述:模拟某校九层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。电梯一共有七个状态,即正在开门(Opening)、已开门(Opened)、正在关门(Closing)、已关门(Closed)、等待(Waiting)、移动(Moving)、减速(Decelerate)。乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;电梯加速需要15t;上升时,每一层需要51t,减速需要14t;下降时,每一层需要61t,减速需要23t;如果电梯在某层静止时间超过300t,则驶回1层候命。#include<stdio.h>#include<time.h>#include<stdlib.h>#include<malloc.h>#defineMaxSize5//电梯所能承载的最大人数#defineN5typedefenum{Up,Down,Free}StateofElevator;//电梯的状态typedefstruct//**************************乘客结构体{ intFloorofPerson;//乘客所在楼层 intGoFloor;//乘客要去楼层 intWaitingTime;//乘客的最大容忍等待时间 intDirection;//方向 intInorOut;//乘客是否已出电梯 intLeave;//乘客是否离去 intWaitedTime;//乘客已经等待的时间}Person;typedefstruct//******************************电梯结构体{ intFloor;//所在楼层 StateofElevatorState;//运行方向状态 intNumberofPerson;//装载乘客人数}Elevator;PersonPassenger[9][N];//全局结构体二维数组保存整栋楼的乘客的相关信息PersonPassengerInElevator[MaxSize];//在电梯中的乘客的相关信息存储在结构体一维数组中intb[9];//每层楼的人数intInCount[9];//每层楼进入电梯的实际人数intOutCount[9];//每层楼走出电梯的实际人数inttclock=0;//电梯运行时的全局软时钟intInTime[9];//每层楼乘客进入电梯的时间intOutTime[9];//每层楼乘客出电梯的时间intIn(inty,intx,StateofElevatorState1)//乘客进入电梯,每次乘客进入电梯后将该层的乘客重新排序(y表示电梯当前人数;x表示楼层){ intm=y;//保存电梯当前人数 intp,q,l,v=0,et; intd=1; if(State1==Up)//电梯当前运行方向 d=1; if(State1==Down) d=0; for(p=0;p<b[x];p++) { if(Passenger[x][p].Direction==d&&Passenger[x][p].Leave==0)//该x层乘客p的方向与电梯方向一致且未离开,若电梯未满,则进电梯 { if(m==MaxSize) { printf("电梯现在已经超载,请您等待片刻!\n"); break;//该楼层的其他乘客等待一段时间 } m++;//电梯内人数增加 for(q=0;q<MaxSize;q++) { if(PassengerInElevator[q].InorOut==0)//如果电梯内乘客q已出电梯,则乘客p入电梯 { PassengerInElevator[q]=Passenger[x][p];//乘客正式进入电梯 PassengerInElevator[q].InorOut=1;//乘客已经进入电梯 PassengerInElevator[q].Leave=1; PassengerInElevator[q].WaitedTime=0; PassengerInElevator[q].WaitingTime=0; Passenger[x][p].Direction=-2; Passenger[x][p].FloorofPerson=-2; Passenger[x][p].InorOut=-2; Passenger[x][p].Leave=-2; //printf("目标楼层:", Passenger[x][p].GoFloor); Passenger[x][p].WaitedTime=0; Passenger[x][p].WaitingTime=0;//进了电梯表明乘客即可到达目的地从而离开系统 break; } } } }InCount[x]=m-y;//每层楼进入电梯的实际人数/*将本楼层的乘客信息重新排列,将该层剩余乘客信息放入全局结构体二维数组*/Person*temp=(Person*)malloc((b[x]-InCount[x])*sizeof(Person));//临时数组 for(et=0;et<(b[x]-InCount[x]);et++)//电梯外剩余乘客 { Passenger[x][et]=temp[et]; } b[x]=b[x]-InCount[x]; InTime[x]=InCount[x]*25; tclock+=InTime[x];printf("在%dt时刻第%d楼层有%d个人进入电梯!\n",tclock,x,(m-y));//printf("目标楼层\n",)returnm;}intOut(intfloor,intnumber)//乘客出电梯,每次乘客出电梯将全局数组中的乘客信息重新修改,floor表示楼层,number表示电梯内人数{ inti; intk=number;//电梯内剩余的人 for(i=0;i<MaxSize;i++) { if(PassengerInElevator[i].GoFloor==floor&&PassengerInElevator[i].InorOut==1&&PassengerInElevator[i].Leave==1) { k--; PassengerInElevator[i].InorOut=0;//到站的乘客出电梯 } }OutCount[floor]=number-k;OutTime[floor]=OutCount[floor]*25;tclock+=OutTime[floor];printf("在%dt时刻第%d楼层有%d个人已经到达地!\n",tclock,floor,OutCount[floor]); returnk;}voidOpen()//电梯开门{ tclock+=20; printf("电梯的门正在打开,请您稍候!!!!!!!\n"); printf("在%dt时刻电梯的门已经打开!\n",tclock);}voidClose()//电梯关门{ tclock+=20; printf("电梯的门正在关闭,请您稍候!!!!!!!\n"); printf("在%dt时刻电梯的门已经关闭!\n",tclock);}intGo(Elevator*ele)//电梯正在运行{ Elevator*e=ele; if(e->State==Up) { printf("电梯正在向上运行!!!!!!!\n"); printf("\n"); e->Floor++; } if(e->State==Down) { e->Floor--; printf("电梯正在向下运行!!!!!!!\n"); printf("\n"); } tclock+=10; return(e->Floor);}intInitialize()//系统最开始的初始化{ inti,j,k,m,n,s,c,u,v=0; srand(time(0));//获取时间种子 for(i=0;i<=8;i++)//每层楼的人数随机初始化 b[i]=rand()%N; for(m=0;m<b[0];m++)//最底层楼的乘客信息初始化 Passenger[0][m].Direction=1;Passenger[8][m].GoFloor=1+rand()%7; for(c=0;c<b[8];c++)//最高层的乘客信息初始化 Passenger[8][c].Direction=0; Passenger[8][c].GoFloor=-1+rand()%8; for(n=1;n<=7;n++)//每层楼每个乘客方向初始化 for(s=0;s<b[n];s++) Passenger[n][s].Direction=rand()%2; for(j=0;j<=8;j++)//每层楼的乘客的相关信息随机初始化 for(k=0;k<b[j];k++) { Passenger[j][k].FloorofPerson=j; Passenger[j][k].WaitingTime=100+rand()%100; Passenger[j][k].InorOut=0;//电梯外 Passenger[j][k].Leave=0;//未离开 Passenger[j][k].WaitedTime=0; if(Passenger[j][k].Direction==1) Passenger[j][k].GoFloor=(j+1)+rand()%(8-j); if(Passenger[j][k].Direction==0&&j!=1) Passenger[j][k].GoFloor=rand()%(j-1); if(Passenger[j][k].Direction==0&&j==1) Passenger[j][k].GoFloor=0; } for(u=0;u<=8;u++)//遍历整栋楼,有人则返回1,没人返回0; if(b[u]==0) v++; if(v==9) return0; else return1;}intTest()//考查整栋楼有无请求,无返回0,有返回1;{ intcs,cf=0; for(cs=0;cs<9;cs++) if(b[cs]==0) cf++; if(cf==9) return0; else return1;}voidOnFree(){ printf("电梯现在在第一楼!电梯正处于空闲状态!!\n");}voidRun(Elevator*left){ Elevator*ts=left; intfloor=ts->Floor;//保存电梯当前的所在楼层数 intnumber=ts->NumberofPerson;//保存电梯当前的人数 intps,ms,ns,bs=0,ls=0,pt,yt; intloop=0; //循环次数 while(loop!=15) { if(Test()==0)//考查整栋楼有无请求,无返回0,有返回1; { OnFree();//输出电梯现在在第一楼!电梯正处于空闲状态! } else { bs=0; printf("在%dt时刻电梯正在第%d层!\n",tclock,floor); for(ns=0;ns<number;ns++) if(PassengerInElevator[ns].GoFloor!=floor) bs++; if(b[floor]==0&&bs==number)//电梯外没人,没人下 { //电梯不开门,继续上升或下降 if(number!=0)//电梯里有人 { if(PassengerInElevator[0].Direction==1&&floor<8)//往上 { ts->State=Up; floor=Go(ts);//电梯移动 if(floor==9) {printf("在%dt时刻电梯正在%d楼层!\n",tclock,floor); Open(); number=Out(floor,number);//乘客出电梯 OutTime[floor]=OutCount[floor]*25;//乘客出电梯的耗时 ts->State=Down; number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客进入电梯的耗时 Close(); /*重新计算每层楼的正在等待的乘客的需等待时间*/ for(ps=0;ps<=9;ps++) for(ms=0;ms<b[ps];ms++) { if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0) Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]); } if(number==0) floor=Go(ts); } } if(PassengerInElevator[0].Direction==0&&floor>0)//往下{ ts->State=Down; floor=Go(ts); if(floor==0) {printf("在%dt时刻电梯正在%d楼层!\n",tclock,floor); Open(); number=Out(floor,number);//乘客出电梯 OutTime[floor]=OutCount[floor]*25;//乘客出电梯的耗时 ts->State=Up; number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客进入电梯的耗时 Close(); /*重新计算每层楼的正在等待的乘客的需等待时间*/ for(ps=0;ps<=9;ps++) for(ms=0;ms<b[ps];ms++) { if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0) Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]); } floor=Go(ts);}}} else//电梯里没有人 { if(ts->State==Up) { if(floor==8) ts->State=Down;else floor=Go(ts); } if(ts->State==Down) { if(floor==0) ts->State=Up; else floor=Go(ts); } } for(pt=0;pt<=9;pt++) for(yt=0;yt<b[pt];yt++) { if(Passenger[pt][yt].InorOut==0&&Passenger[pt][yt].Leave==0) Passenger[pt][yt].WaitedTime+=10; }} else { Open(); number=Out(floor,number);//乘客出电梯 OutTime[floor]=OutCount[floor]*25;//乘客出电梯的耗时 number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客进入电梯的耗时 Close(); /*重新计算每层楼的正在等待的乘客的需等待时间*/ for(ps=0;ps<=9;ps++) for(ms=0;ms<b[ps];ms++) { if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0) Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]); } /*服务完本层,电梯正式运行*/ if(PassengerInElevator[0].Direction==1&&floor<9) { ts->State=Up; floor=Go(ts); if(floor==9) { printf("在%dt时刻电梯正在%d楼层!\n",tclock,floor); Open(); number=Out(floor,number);//乘客出电梯 OutTime[floor]=OutCount[floor]*25;//乘客出电梯的耗时 ts->State=Down; number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客进入电梯的耗时 Close(); /*重新计算每层楼的正在等待的乘客的需等待时间*/ for(ps=0;ps<=9;ps++) for(ms=0;ms<b[ps];ms++) { if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0)Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]); }if(number==0) floor=Go(ts); }} if(PassengerInElevator[0].Direction==0&&floor>0) { ts->State=Down; floor=Go(ts); if(floor==0) {printf("在%dt时刻电梯正在%d楼层!\n",tclock,floor); Open(); number=Out(floor,number);//乘客出电梯 OutTime[floor]=OutCount[floor]*25;//乘客出电梯的耗时 ts->State=Up; number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客进入电梯的耗时 Close(); /*重新计算每层楼的正在等待的乘客的需等待时间*/ for(ps=0;ps<=9;ps++) for(ms=0;ms<b[ps];ms++) { if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0) Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]); }

温馨提示

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

评论

0/150

提交评论