




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)學(xué)生姓名:龐曉健學(xué)號(hào):20121000399院(系):計(jì)算機(jī)學(xué)院專業(yè):信息安全2014年3月21日題目:電梯模擬1、問題描述:模擬某校九層教學(xué)樓的電梯系統(tǒng)。該樓有一個(gè)自動(dòng)電梯,能在每層停留,其中第一層是大樓的進(jìn)出層,即是電梯的“本壘層”,電梯“空閑”時(shí),將來到該層候命。電梯一共有七個(gè)狀態(tài),即正在開門(Opening)、已開門(Opened)、正在關(guān)門(Closing)、已關(guān)門(Closed)、等待(Waiting)、移動(dòng)(Moving)、減速(Decelerate)。乘客可隨機(jī)地進(jìn)出于任何層。對(duì)每個(gè)人來說,他有一個(gè)能容忍的最長等待時(shí)間,一旦等候電梯時(shí)間過長,他將放棄。模擬時(shí)鐘從0開始,時(shí)間單位為0.1秒。人和電梯的各種動(dòng)作均要消耗一定的時(shí)間單位(簡記為t),比如:有人進(jìn)出時(shí),電梯每隔40t測試一次,若無人進(jìn)出,則關(guān)門;關(guān)門和開門各需要20t;每個(gè)人進(jìn)出電梯均需要25t;電梯加速需要15t;上升時(shí),每一層需要51t,減速需要14t;下降時(shí),每一層需要61t,減速需要23t;如果電梯在某層靜止時(shí)間超過300t,則駛回1層候命。#include<stdio.h>#include<time.h>#include<stdlib.h>#include<malloc.h>#defineMaxSize5//電梯所能承載的最大人數(shù)#defineN5typedefenum{Up,Down,Free}StateofElevator;//電梯的狀態(tài)typedefstruct//**************************乘客結(jié)構(gòu)體{ intFloorofPerson;//乘客所在樓層 intGoFloor;//乘客要去樓層 intWaitingTime;//乘客的最大容忍等待時(shí)間 intDirection;//方向 intInorOut;//乘客是否已出電梯 intLeave;//乘客是否離去 intWaitedTime;//乘客已經(jīng)等待的時(shí)間}Person;typedefstruct//******************************電梯結(jié)構(gòu)體{ intFloor;//所在樓層 StateofElevatorState;//運(yùn)行方向狀態(tài) intNumberofPerson;//裝載乘客人數(shù)}Elevator;PersonPassenger[9][N];//全局結(jié)構(gòu)體二維數(shù)組保存整棟樓的乘客的相關(guān)信息PersonPassengerInElevator[MaxSize];//在電梯中的乘客的相關(guān)信息存儲(chǔ)在結(jié)構(gòu)體一維數(shù)組中intb[9];//每層樓的人數(shù)intInCount[9];//每層樓進(jìn)入電梯的實(shí)際人數(shù)intOutCount[9];//每層樓走出電梯的實(shí)際人數(shù)inttclock=0;//電梯運(yùn)行時(shí)的全局軟時(shí)鐘intInTime[9];//每層樓乘客進(jìn)入電梯的時(shí)間intOutTime[9];//每層樓乘客出電梯的時(shí)間intIn(inty,intx,StateofElevatorState1)//乘客進(jìn)入電梯,每次乘客進(jìn)入電梯后將該層的乘客重新排序(y表示電梯當(dāng)前人數(shù);x表示樓層){ intm=y;//保存電梯當(dāng)前人數(shù) intp,q,l,v=0,et; intd=1; if(State1==Up)//電梯當(dāng)前運(yùn)行方向 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的方向與電梯方向一致且未離開,若電梯未滿,則進(jìn)電梯 { if(m==MaxSize) { printf("電梯現(xiàn)在已經(jīng)超載,請您等待片刻!\n"); break;//該樓層的其他乘客等待一段時(shí)間 } m++;//電梯內(nèi)人數(shù)增加 for(q=0;q<MaxSize;q++) { if(PassengerInElevator[q].InorOut==0)//如果電梯內(nèi)乘客q已出電梯,則乘客p入電梯 { PassengerInElevator[q]=Passenger[x][p];//乘客正式進(jìn)入電梯 PassengerInElevator[q].InorOut=1;//乘客已經(jīng)進(jìn)入電梯 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("目標(biāo)樓層:", Passenger[x][p].GoFloor); Passenger[x][p].WaitedTime=0; Passenger[x][p].WaitingTime=0;//進(jìn)了電梯表明乘客即可到達(dá)目的地從而離開系統(tǒng) break; } } } }InCount[x]=m-y;//每層樓進(jìn)入電梯的實(shí)際人數(shù)/*將本樓層的乘客信息重新排列,將該層剩余乘客信息放入全局結(jié)構(gòu)體二維數(shù)組*/Person*temp=(Person*)malloc((b[x]-InCount[x])*sizeof(Person));//臨時(shí)數(shù)組 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時(shí)刻第%d樓層有%d個(gè)人進(jìn)入電梯!\n",tclock,x,(m-y));//printf("目標(biāo)樓層\n",)returnm;}intOut(intfloor,intnumber)//乘客出電梯,每次乘客出電梯將全局?jǐn)?shù)組中的乘客信息重新修改,floor表示樓層,number表示電梯內(nèi)人數(shù){ inti; intk=number;//電梯內(nèi)剩余的人 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時(shí)刻第%d樓層有%d個(gè)人已經(jīng)到達(dá)地!\n",tclock,floor,OutCount[floor]); returnk;}voidOpen()//電梯開門{ tclock+=20; printf("電梯的門正在打開,請您稍候!!!!!!!\n"); printf("在%dt時(shí)刻電梯的門已經(jīng)打開!\n",tclock);}voidClose()//電梯關(guān)門{ tclock+=20; printf("電梯的門正在關(guān)閉,請您稍候!!!!!!!\n"); printf("在%dt時(shí)刻電梯的門已經(jīng)關(guān)閉!\n",tclock);}intGo(Elevator*ele)//電梯正在運(yùn)行{ Elevator*e=ele; if(e->State==Up) { printf("電梯正在向上運(yùn)行!!!!!!!\n"); printf("\n"); e->Floor++; } if(e->State==Down) { e->Floor--; printf("電梯正在向下運(yùn)行!!!!!!!\n"); printf("\n"); } tclock+=10; return(e->Floor);}intInitialize()//系統(tǒng)最開始的初始化{ inti,j,k,m,n,s,c,u,v=0; srand(time(0));//獲取時(shí)間種子 for(i=0;i<=8;i++)//每層樓的人數(shù)隨機(jī)初始化 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++)//每層樓每個(gè)乘客方向初始化 for(s=0;s<b[n];s++) Passenger[n][s].Direction=rand()%2; for(j=0;j<=8;j++)//每層樓的乘客的相關(guān)信息隨機(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("電梯現(xiàn)在在第一樓!電梯正處于空閑狀態(tài)!!\n");}voidRun(Elevator*left){ Elevator*ts=left; intfloor=ts->Floor;//保存電梯當(dāng)前的所在樓層數(shù) intnumber=ts->NumberofPerson;//保存電梯當(dāng)前的人數(shù) intps,ms,ns,bs=0,ls=0,pt,yt; intloop=0; //循環(huán)次數(shù) while(loop!=15) { if(Test()==0)//考查整棟樓有無請求,無返回0,有返回1; { OnFree();//輸出電梯現(xiàn)在在第一樓!電梯正處于空閑狀態(tài)! } else { bs=0; printf("在%dt時(shí)刻電梯正在第%d層!\n",tclock,floor); for(ns=0;ns<number;ns++) if(PassengerInElevator[ns].GoFloor!=floor) bs++; if(b[floor]==0&&bs==number)//電梯外沒人,沒人下 { //電梯不開門,繼續(xù)上升或下降 if(number!=0)//電梯里有人 { if(PassengerInElevator[0].Direction==1&&floor<8)//往上 { ts->State=Up; floor=Go(ts);//電梯移動(dòng) if(floor==9) {printf("在%dt時(shí)刻電梯正在%d樓層!\n",tclock,floor); Open(); number=Out(floor,number);//乘客出電梯 OutTime[floor]=OutCount[floor]*25;//乘客出電梯的耗時(shí) ts->State=Down; number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客進(jìn)入電梯的耗時(shí) Close(); /*重新計(jì)算每層樓的正在等待的乘客的需等待時(shí)間*/ 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時(shí)刻電梯正在%d樓層!\n",tclock,floor); Open(); number=Out(floor,number);//乘客出電梯 OutTime[floor]=OutCount[floor]*25;//乘客出電梯的耗時(shí) ts->State=Up; number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客進(jìn)入電梯的耗時(shí) Close(); /*重新計(jì)算每層樓的正在等待的乘客的需等待時(shí)間*/ 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;//乘客出電梯的耗時(shí) number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客進(jìn)入電梯的耗時(shí) Close(); /*重新計(jì)算每層樓的正在等待的乘客的需等待時(shí)間*/ 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]); } /*服務(wù)完本層,電梯正式運(yùn)行*/ if(PassengerInElevator[0].Direction==1&&floor<9) { ts->State=Up; floor=Go(ts); if(floor==9) { printf("在%dt時(shí)刻電梯正在%d樓層!\n",tclock,floor); Open(); number=Out(floor,number);//乘客出電梯 OutTime[floor]=OutCount[floor]*25;//乘客出電梯的耗時(shí) ts->State=Down; number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客進(jìn)入電梯的耗時(shí) Close(); /*重新計(jì)算每層樓的正在等待的乘客的需等待時(shí)間*/ 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時(shí)刻電梯正在%d樓層!\n",tclock,floor); Open(); number=Out(floor,number);//乘客出電梯 OutTime[floor]=OutCount[floor]*25;//乘客出電梯的耗時(shí) ts->State=Up; number=In(number,floor,ts->State); InTime[floor]=InCount[floor]*25;//乘客進(jìn)入電梯的耗時(shí) Close(); /*重新計(jì)算每層樓的正在等待的乘客的需等待時(shí)間*/ 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新藥成本控制企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 林業(yè)工程設(shè)計(jì)在線平臺(tái)行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 新型DNA測序行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年噴漆啞鈴項(xiàng)目商業(yè)計(jì)劃書
- 2025-2030年售飯消費(fèi)機(jī)項(xiàng)目投資價(jià)值分析報(bào)告
- 2025-2030年臺(tái)式電動(dòng)牙鉆機(jī)項(xiàng)目商業(yè)計(jì)劃書
- 2025-2030年可充氣打火機(jī)項(xiàng)目商業(yè)計(jì)劃書
- 2024年廈門市屬事業(yè)單位考試試卷
- 2024年南通市海安市衛(wèi)生健康事業(yè)單位招聘考試真題
- 2024年福建三明學(xué)院招聘考試真題
- 《好朋友》繪本故事
- 《短視頻拍攝與制作》課件-2短視頻前期創(chuàng)意
- 出差期間緊急情況應(yīng)對(duì)策略參考
- 鞘內(nèi)藥物輸注治療慢性疼痛課件
- 中國古代四大發(fā)明(小學(xué)課件)
- 事故隱患報(bào)告舉報(bào)獎(jiǎng)勵(lì)制度培訓(xùn)
- 廣西壯族風(fēng)俗演示文稿課件
- 新生兒疼痛管理指南2028
- 三年級(jí)下冊口算天天100題(A4打印版)
- 醫(yī)院安全生產(chǎn)問題分析報(bào)告
- 物權(quán)法教案完整版本
評(píng)論
0/150
提交評(píng)論