版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
數(shù)據(jù)結(jié)構(gòu)課程設計學生姓名:龐曉健學號:20121000399院(系):計算機學院專業(yè):信息安全2014年3月21日題目:電梯模擬1、問題描述:模擬某校九層教學樓的電梯系統(tǒng)。該樓有一個自動電梯,能在每層停留,其中第一層是大樓的進出層,即是電梯的“本壘層”,電梯“空閑”時,將來到該層候命。電梯一共有七個狀態(tài),即正在開門(Opening)、已開門(Opened)、正在關(guān)門(Closing)、已關(guān)門(Closed)、等待(Waiting)、移動(Moving)、減速(Decelerate)。乘客可隨機地進出于任何層。對每個人來說,他有一個能容忍的最長等待時間,一旦等候電梯時間過長,他將放棄。模擬時鐘從0開始,時間單位為0.1秒。人和電梯的各種動作均要消耗一定的時間單位(簡記為t),比如:有人進出時,電梯每隔40t測試一次,若無人進出,則關(guān)門;關(guān)門和開門各需要20t;每個人進出電梯均需要25t;電梯加速需要15t;上升時,每一層需要51t,減速需要14t;下降時,每一層需要61t,減速需要23t;如果電梯在某層靜止時間超過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;//乘客的最大容忍等待時間 intDirection;//方向 intInorOut;//乘客是否已出電梯 intLeave;//乘客是否離去 intWaitedTime;//乘客已經(jīng)等待的時間}Person;typedefstruct//******************************電梯結(jié)構(gòu)體{ intFloor;//所在樓層 StateofElevatorState;//運行方向狀態(tài) intNumberofPerson;//裝載乘客人數(shù)}Elevator;PersonPassenger[9][N];//全局結(jié)構(gòu)體二維數(shù)組保存整棟樓的乘客的相關(guān)信息PersonPassengerInElevator[MaxSize];//在電梯中的乘客的相關(guān)信息存儲在結(jié)構(gòu)體一維數(shù)組中intb[9];//每層樓的人數(shù)intInCount[9];//每層樓進入電梯的實際人數(shù)intOutCount[9];//每層樓走出電梯的實際人數(shù)inttclock=0;//電梯運行時的全局軟時鐘intInTime[9];//每層樓乘客進入電梯的時間intOutTime[9];//每層樓乘客出電梯的時間intIn(inty,intx,StateofElevatorState1)//乘客進入電梯,每次乘客進入電梯后將該層的乘客重新排序(y表示電梯當前人數(shù);x表示樓層){ intm=y;//保存電梯當前人數(shù) 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("電梯現(xiàn)在已經(jīng)超載,請您等待片刻!\n"); break;//該樓層的其他乘客等待一段時間 } m++;//電梯內(nèi)人數(shù)增加 for(q=0;q<MaxSize;q++) { if(PassengerInElevator[q].InorOut==0)//如果電梯內(nèi)乘客q已出電梯,則乘客p入電梯 { PassengerInElevator[q]=Passenger[x][p];//乘客正式進入電梯 PassengerInElevator[q].InorOut=1;//乘客已經(jīng)進入電梯 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;//進了電梯表明乘客即可到達目的地從而離開系統(tǒng) break; } } } }InCount[x]=m-y;//每層樓進入電梯的實際人數(shù)/*將本樓層的乘客信息重新排列,將該層剩余乘客信息放入全局結(jié)構(gòu)體二維數(shù)組*/Person*temp=(Person*)malloc((b[x]-InCount[x])*sizeof(Person));//臨時數(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時刻第%d樓層有%d個人進入電梯!\n",tclock,x,(m-y));//printf("目標樓層\n",)returnm;}intOut(intfloor,intnumber)//乘客出電梯,每次乘客出電梯將全局數(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時刻第%d樓層有%d個人已經(jīng)到達地!\n",tclock,floor,OutCount[floor]); returnk;}voidOpen()//電梯開門{ tclock+=20; printf("電梯的門正在打開,請您稍候!!!!!!!\n"); printf("在%dt時刻電梯的門已經(jīng)打開!\n",tclock);}voidClose()//電梯關(guān)門{ tclock+=20; printf("電梯的門正在關(guān)閉,請您稍候!!!!!!!\n"); printf("在%dt時刻電梯的門已經(jīng)關(guān)閉!\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()//系統(tǒng)最開始的初始化{ inti,j,k,m,n,s,c,u,v=0; srand(time(0));//獲取時間種子 for(i=0;i<=8;i++)//每層樓的人數(shù)隨機初始化 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++)//每層樓的乘客的相關(guān)信息隨機初始化 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;//保存電梯當前的所在樓層數(shù) intnumber=ts->NumberofPerson;//保存電梯當前的人數(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時刻電梯正在第%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);//電梯移動 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度幼兒園兒童床墊定制采購合同3篇
- 2025年度人工智能教育培訓合作合同7篇
- 2025年廠房鋼結(jié)構(gòu)工程環(huán)保驗收與監(jiān)測合同4篇
- 2024鐵路消防安全管理與應急預案合同3篇
- 2025年度健康生活APP定制化功能開發(fā)合同3篇
- 「可靠」2024年度廣告位租賃合同3篇
- 2025年度科技園區(qū)場地租賃與合作開發(fā)合同范本4篇
- 2024版建筑渣土清運協(xié)議樣本版
- 2025年度新能源車輛充電設施安裝與維護合同3篇
- 2025年度叉車司機安全操作與事故責任認定合同4篇
- 銀行信息安全保密培訓
- 市政道路工程交通疏解施工方案
- 2024年部編版初中七年級上冊歷史:部分練習題含答案
- 拆遷評估機構(gòu)選定方案
- 床旁超聲監(jiān)測胃殘余量
- 上海市松江區(qū)市級名校2025屆數(shù)學高一上期末達標檢測試題含解析
- 綜合實踐活動教案三上
- 《新能源汽車電氣設備構(gòu)造與維修》項目三 新能源汽車照明與信號系統(tǒng)檢修
- 2024年新課標《義務教育數(shù)學課程標準》測試題(附含答案)
- 醫(yī)院培訓課件:《靜脈中等長度導管臨床應用專家共識》
- 中國國際大學生創(chuàng)新大賽與“挑戰(zhàn)杯”大學生創(chuàng)業(yè)計劃競賽(第十一章)大學生創(chuàng)新創(chuàng)業(yè)教程
評論
0/150
提交評論