機(jī)場航空管制模擬實(shí)驗(yàn)報(bào)告_第1頁
機(jī)場航空管制模擬實(shí)驗(yàn)報(bào)告_第2頁
機(jī)場航空管制模擬實(shí)驗(yàn)報(bào)告_第3頁
機(jī)場航空管制模擬實(shí)驗(yàn)報(bào)告_第4頁
機(jī)場航空管制模擬實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

機(jī)場航空管制模擬實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目假設(shè)機(jī)場有一條跑道,每架飛機(jī)需花費(fèi)一定時(shí)間著陸,花費(fèi)一定時(shí)間起飛,飛機(jī)的起降滿足一定的概率。一般來講,機(jī)場存在兩個(gè)隊(duì)列,一個(gè)等待著陸的飛機(jī)隊(duì)列和一個(gè)等待起飛的飛機(jī)隊(duì)列,同樣等待時(shí)間下,等待著陸的飛機(jī)比準(zhǔn)備起飛的飛機(jī)具有更高的優(yōu)先級。試編寫程序模擬這個(gè)機(jī)場的運(yùn)行。要求使用隊(duì)列或優(yōu)先隊(duì)列實(shí)現(xiàn);要求可以變換起飛和著陸頻率來模擬一天中的飛行頂峰期和空閑期;要求可以改變著陸和起飛時(shí)間以模擬不同的效果。實(shí)驗(yàn)內(nèi)容分析1.1實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)?zāi)M了機(jī)場的航空管制,通過程序,來模擬管理飛機(jī)的起飛與著陸。它要求我們考慮起飛與著陸的優(yōu)先級不同,以及根據(jù)飛機(jī)起飛/著陸時(shí)間,起飛/著陸頻率模擬機(jī)場一天的運(yùn)營情況。并計(jì)算出跑道的繁忙程度、著陸飛機(jī)的總的等待時(shí)間和平均等待時(shí)間、起飛飛機(jī)的總的等待時(shí)間和平均等待時(shí)間,計(jì)算每架飛機(jī)花費(fèi)在一個(gè)隊(duì)列中的平均時(shí)間。1.2內(nèi)容分析 系統(tǒng)主要模擬了機(jī)場一天的運(yùn)營。所以,需要一個(gè)計(jì)時(shí)器〔以分鐘計(jì)時(shí)〕來計(jì)算機(jī)場的運(yùn)營時(shí)間。同時(shí),為了管理飛機(jī)的起飛與著陸,需要兩個(gè)隊(duì)列來存放著陸和起飛的飛機(jī)。 設(shè)計(jì)用戶輸入的數(shù)據(jù)為:機(jī)場開始、結(jié)束運(yùn)營時(shí)間;頂峰期開始、結(jié)束時(shí)間;空閑期開始、結(jié)束時(shí)間;著陸飛機(jī)最長等待時(shí)間;頂峰期、空閑期以及一般時(shí)期每小時(shí)起飛、著陸的飛機(jī)數(shù),飛機(jī)起飛、著陸需要的時(shí)間??紤]到機(jī)場的頂峰期,與空閑期,設(shè)計(jì)了Workslot類,設(shè)定不同時(shí)期的飛機(jī)起飛、著陸率。設(shè)計(jì)Timer類,其主要方法是實(shí)現(xiàn)計(jì)時(shí)功能和返回當(dāng)前工作時(shí)間。Plane類主要功能是記錄飛機(jī)開始等待時(shí)間,開始工作時(shí)間以及起飛、著陸所需時(shí)間。飛機(jī)起飛/著陸都需要花費(fèi)一定的時(shí)間,并不是馬上就完成的。所以在起飛/著陸效勞函數(shù)中,不僅要調(diào)用spend〔〕,還需要判斷takeoff/landing是否結(jié)束。當(dāng)t.now-startworktime<workTime時(shí),說明飛機(jī)還在準(zhǔn)備著陸/起飛,占用了跑道。當(dāng)t.now-startworktime==workTime時(shí),表示飛機(jī)著陸/起飛成功。調(diào)用pop方法,從隊(duì)列中刪除一架等待效勞的飛機(jī),并獲取當(dāng)前時(shí)間,減去飛機(jī)接受效勞的時(shí)間,得到該飛機(jī)的等待效勞時(shí)間。我們就可以計(jì)算出所有飛機(jī)的等待效勞時(shí)間。等待起飛/著陸隊(duì)列總長度,等待效勞總時(shí)間,以及效勞起飛/著陸的飛機(jī)總數(shù),我們就可以得出起飛/著陸飛機(jī)的平均等待時(shí)間,平均等待隊(duì)列長度。同時(shí)根據(jù)當(dāng)天的的工作時(shí)間,跑道的忙碌時(shí)間,可以計(jì)算得到跑道的繁忙程度。1.3程序根本流程圖1實(shí)驗(yàn)根本流程1.4根本數(shù)據(jù)結(jié)構(gòu),類設(shè)計(jì)1.4.1類Airport輸入:變量名注釋Timert;計(jì)時(shí)器StructBusyb;跑道是否忙碌inttakeoffTime;飛機(jī)起飛所需時(shí)間intlandingTime;飛機(jī)著陸所需時(shí)間intstartworkTime;機(jī)場當(dāng)天開始運(yùn)營時(shí)間intendworkTime;機(jī)場當(dāng)天結(jié)束運(yùn)營時(shí)間ClassWorkslothighslot;頂峰時(shí)間段ClassWorkslotlowslot;空閑時(shí)間段ClassWorkslototherslot;一般時(shí)間段deque<Plane>takeoffq;等待起飛飛機(jī)隊(duì)列deque<Plane>landingq;等待著陸飛機(jī)隊(duì)列intworkTime;跑道忙碌時(shí)間intTwaitTime;總起飛等待時(shí)間intLwaitTime;總著陸等待時(shí)間inttakeoffwaitTime;所有起飛飛機(jī)總等待時(shí)間intlandingwaitTime;所有著陸飛機(jī)總等待時(shí)間intmaxlandingwaitTime;最大著陸等待時(shí)間intintakeoffNum;進(jìn)入起飛隊(duì)列飛機(jī)數(shù)intinlandingNum;進(jìn)入著陸隊(duì)列飛機(jī)數(shù)inttakeoffNum;已經(jīng)起飛飛機(jī)數(shù)intlandingNum;已經(jīng)著陸飛機(jī)數(shù)intt_rate;用來保存起飛速率intl_rate;用來保存著陸速率輸出變量名備注t.now當(dāng)前時(shí)間inttakeoffNum當(dāng)前已起飛飛機(jī)數(shù)量intlandingNum當(dāng)前已著陸飛機(jī)數(shù)量intintakeoffNum當(dāng)前已入起飛隊(duì)列飛機(jī)數(shù)intinlandingNum當(dāng)前已入著陸隊(duì)列飛機(jī)數(shù)deque<Plane>takeoffq起飛隊(duì)列,元素類型為飛機(jī)類型deque<Plane>landingq著陸隊(duì)列,元素類型為飛機(jī)類型double(workTime/(endworkTime-startworkTime))跑道的繁忙程度〔用機(jī)場總工作時(shí)間與跑道忙碌時(shí)間之比來衡量〕doublelandingwaitTime著陸飛機(jī)總的等待時(shí)間double(landingwaitTime/landingNum)著陸飛機(jī)平均等待時(shí)間double(LwaitTime/landingNum)著陸飛機(jī)在隊(duì)列中的平均等待時(shí)間doubletakeoffwaitTime起飛飛機(jī)總的等待時(shí)間double(takeoffwaitTime/takeoffNum)起飛飛機(jī)平均等待時(shí)間double(TwaitTime/takeoffNum)起飛飛機(jī)在隊(duì)列中的平均等待時(shí)間intIntakeoffNum–takeoffNum運(yùn)營結(jié)束時(shí),起飛隊(duì)列中剩余飛機(jī)數(shù)量成員方法名備注voidrun()運(yùn)行仿真voidsetTimer()設(shè)定計(jì)時(shí)器函數(shù)voidsetTakeoffTime(intt1)設(shè)定起飛所需時(shí)間函數(shù)voidsetLandingTime(intt2)設(shè)定著陸所需時(shí)間函數(shù)voidsetMaxlandingwaitTime(intmlwd)設(shè)定著陸飛機(jī)最大等待時(shí)間voidsetStartworkTime(strings)設(shè)定機(jī)場開始工作時(shí)間函數(shù)voidsetEndworkTime(strings)設(shè)定機(jī)場結(jié)束工作時(shí)間函數(shù)voidsetHighslot(Worksloth)設(shè)定頂峰期機(jī)場屬性voidsetLowslot(Workslotl)設(shè)定空閑期機(jī)場屬性voidsetOtherslot(Worksloto)設(shè)定一般時(shí)段機(jī)場屬性1.4.2類Plane成員:方法名備注intstartwaitTime開始等待時(shí)間intstartworkTime開始起飛/著陸時(shí)間intworkTime起飛/著陸時(shí)間1.4.3類Timer成員:方法名備注intnow計(jì)時(shí)器當(dāng)前時(shí)間voidspend()計(jì)時(shí)累加函數(shù)1.4.4類Workslot成員:變量名備注intstartTime該時(shí)間段開始時(shí)間intendTime該時(shí)間段結(jié)束時(shí)間inttakeoffRate起飛頻率〔每小時(shí)起飛數(shù)〕intlandingRate著陸頻率〔每小時(shí)著陸數(shù)〕1.4.5結(jié)構(gòu)Busy成員:變量名備注boolis_takeoff跑道中是否為起飛飛機(jī)boolbusy跑道是否忙碌1.5根本函數(shù)功能1.5.1類SimulationsetTimer():設(shè)定計(jì)時(shí)器函數(shù)setTakeoffTime(intt1):設(shè)定起飛所需時(shí)間函數(shù)setLandingTime(intt2):設(shè)定著陸所需時(shí)間函數(shù)setMaxlandingwaitTime(intmlwd):設(shè)定著陸飛機(jī)最大等待時(shí)間setStartworkTime(strings):設(shè)定機(jī)場開始工作時(shí)間函數(shù)setEndworkTime(strings):設(shè)定機(jī)場結(jié)束工作時(shí)間函數(shù)setHighslot(Worksloth):設(shè)定頂峰期機(jī)場屬性setLowslot(Workslotl):設(shè)定空閑期機(jī)場屬性setOtherslot(Worksloto):設(shè)定一般時(shí)段機(jī)場屬性run():模擬飛機(jī)場運(yùn)營。display():該函數(shù)主要用于計(jì)算一些值,并輸出在屏幕上。跑道的繁忙程度= workTime/(endworkTime-startworkTime) 著陸飛機(jī)平均等待時(shí)間=landingwaitTime/landingNum 著陸飛機(jī)在隊(duì)列中的平均等待時(shí)間=LwaitTime/landingNum起飛飛機(jī)總的等待時(shí)間=takeoffwaitTime起飛飛機(jī)平均等待時(shí)間=takeoffwaitTime/takeoffNum起飛飛機(jī)在隊(duì)列中的平均等待時(shí)間=TwaitTime/takeoffNum起飛隊(duì)列中剩余未起飛飛機(jī)數(shù)量=intakeoffNum-takeoffNum再使用輸出語句輸出這些值。1.5.2類PlanePlane()用于初始化飛機(jī)的startwaitTime,startworkTime,workTime。Plane(inta,intb,intc)同上。1.5.3類TimerTimer()初始化當(dāng)前時(shí)間。Timer(intn)同上。voidspend()計(jì)時(shí)累加函數(shù)。實(shí)驗(yàn)驗(yàn)證分析2.1輸入的形式和輸入值的范圍變量名類型范圍輸入例如機(jī)場開始工作時(shí)間string0:00~24:002:00機(jī)場結(jié)束工作時(shí)間string0:00~24:0012:00頂峰期開始時(shí)間string0:00~24:002:00頂峰期結(jié)束時(shí)間string0:00~24:005:00空閑期開始時(shí)間string0:00~24:006:00空閑期結(jié)束時(shí)間string0:00~24:0010:00著陸飛機(jī)最長等待時(shí)間Int0~20頂峰期飛機(jī)起飛率Int0~30頂峰期飛機(jī)著陸率Int0~29空閑期飛機(jī)起飛率Int0~頂峰期飛機(jī)起飛率12空閑期飛機(jī)著陸率Int0~頂峰期飛機(jī)著陸率13一般情況飛機(jī)起飛率Int空閑期飛機(jī)起飛率~頂峰期飛機(jī)起飛率20一般情況飛機(jī)著陸率Int空閑期飛機(jī)著陸率~頂峰期飛機(jī)著陸率23起飛所需時(shí)間Int1~103著陸所需時(shí)間Int1~1022.2輸出的形式控制臺(tái)下運(yùn)行,結(jié)果輸出形式:時(shí)間:XX:XXX號(hào)起飛飛機(jī)進(jìn)入起飛隊(duì)列時(shí)間:XX:XXX號(hào)起飛飛機(jī)開始起飛;等待時(shí)間:XXmin……本日機(jī)場運(yùn)營情況:跑道的繁忙程度:XX著陸飛機(jī)總的等待時(shí)間:XXh著陸飛機(jī)平均等待時(shí)間:XXmin著陸飛機(jī)在著陸隊(duì)列中的平均等待時(shí)間:XXmin起飛飛機(jī)總的等待時(shí)間: XXh起飛飛機(jī)平均等待時(shí)間:XXmin起飛飛機(jī)在起飛隊(duì)列中的平均等待時(shí)間:XXmin起飛隊(duì)列中剩余未起飛飛機(jī)數(shù)量:XX2.3程序所能到達(dá)的功能程序?qū)崿F(xiàn)了如下的功能:設(shè)置機(jī)場的工作時(shí)間模擬機(jī)場的運(yùn)營模擬機(jī)場的頂峰期和空閑期計(jì)算出機(jī)場當(dāng)天起飛/著陸的飛機(jī)數(shù)目計(jì)算出等待隊(duì)列〔起飛/著陸〕的平均長度計(jì)算隊(duì)列的平均等待時(shí)間簡單表示跑道的繁忙程度2.4測試數(shù)據(jù)第一組數(shù)據(jù)第二組數(shù)據(jù)第三組數(shù)據(jù)機(jī)場開始工作時(shí)間9:008:000:00機(jī)場結(jié)束工作時(shí)間12:0017:0024:00頂峰期開始時(shí)間9:0015:009:00頂峰期結(jié)束時(shí)間10:0017:0015:00空閑期開始時(shí)間11:308:003:00空閑期結(jié)束時(shí)間12:0011:008:00著陸飛機(jī)最長等待時(shí)間202015頂峰期飛機(jī)起飛率423636頂峰期飛機(jī)著陸率403335空閑期飛機(jī)起飛率121010空閑期飛機(jī)著陸率10912一般情況飛機(jī)起飛率202020一般情況飛機(jī)著陸率221722起飛所需時(shí)間333著陸所需時(shí)間333第一組數(shù)據(jù)第二組數(shù)據(jù)第三組數(shù)據(jù)跑道的繁忙程度0.7555560.750.750694著陸飛機(jī)總的等待時(shí)間12.3333h15.8167h66.0333h著陸飛機(jī)平均等待時(shí)間17min8min11min著陸飛機(jī)在隊(duì)列中的平均等待時(shí)間3min3min3min起飛飛機(jī)總的等待時(shí)間5.68333h18.4333h139.25h起飛飛機(jī)平均等待時(shí)間85min44min321min起飛飛機(jī)在隊(duì)列中的平均等待時(shí)間44min21min55min起飛隊(duì)列中剩余未起飛飛機(jī)數(shù)量61架148架531架調(diào)試分析3.1遇到的問題及解決方法3.1.1問題一問題:在模擬結(jié)果中只有起飛飛機(jī)或著陸飛機(jī)。解決方案:算法出現(xiàn)問題,重新寫主程序。3.1.1問題二問題:機(jī)場的忙碌情況大于1。解決方案:檢查后發(fā)現(xiàn),跑道功能工作時(shí)間的實(shí)現(xiàn)有問題,將代碼進(jìn)行改良。3.1.1問題三問題:產(chǎn)生隨機(jī)數(shù)太過規(guī)那么。解決方案:發(fā)現(xiàn)是產(chǎn)生隨機(jī)數(shù)的函數(shù)位置有問題,進(jìn)行調(diào)整。3.2技術(shù)難點(diǎn)分析3.2.1難點(diǎn)一一架飛機(jī)完成起飛/著陸花費(fèi)一般超過一分鐘,那么隨著時(shí)間的累積,該如何來判斷對當(dāng)前飛機(jī)的效勞結(jié)束了呢。解決方法是給Plane類添加開始工作時(shí)間的參數(shù),這樣是要判斷當(dāng)前時(shí)間與開始工作時(shí)間的差值是否已到達(dá)起飛/著陸所耗時(shí),即可判斷起飛/著陸是否完成。3.2.2難點(diǎn)二單單用boolbusy數(shù)據(jù)記錄跑道是否忙碌會(huì)出現(xiàn):當(dāng)跑道忙碌時(shí),不能判斷跑道上運(yùn)行的是起飛飛機(jī)還是著陸飛機(jī)這種情況。因此,我構(gòu)造了Busy結(jié)構(gòu),里面不僅包括對跑道是否忙碌的的記錄〔boolbusy〕還包括對跑道上運(yùn)行的是否為起飛飛機(jī)的記錄〔is_takeoff〕。這樣就可以判斷跑道上忙碌時(shí)運(yùn)行的是哪種飛機(jī)了。3.2.3難點(diǎn)三由于未采用優(yōu)先隊(duì)列,故起飛和著陸隊(duì)列是分別獨(dú)立的,那么如何聯(lián)系這兩個(gè)隊(duì)列是一大難點(diǎn)。由于此題我們采用著陸飛機(jī)優(yōu)先的思想。故在跑道空閑的時(shí)候,先判斷著陸隊(duì)列是否為空,不為空就進(jìn)行飛機(jī)著陸,為空那么查看起飛隊(duì)列是否為空,不為空那么進(jìn)行飛機(jī)起飛,為空那么該時(shí)段不進(jìn)行起飛。這樣就可以不在優(yōu)先隊(duì)列中實(shí)現(xiàn)著陸飛機(jī)優(yōu)先的思想。3.3印象最深刻的錯(cuò)誤及修正方法3.3.1問題1問題:著陸/起飛飛機(jī)的在隊(duì)列中的平均等待時(shí)間與實(shí)際不符存在矛盾。解決方法:查看原先對是否有等待飛機(jī)的判斷語句為:if(takeoffq.size()>2)TwaitTime++;if(landingq.size()>2) LwaitTime++;這時(shí)就遺漏了當(dāng)隊(duì)列只有一架飛機(jī)但由于跑道此時(shí)為忙碌,所以該飛機(jī)仍處于等待狀態(tài)這種情況,故敬愛那個(gè)代碼修改為:if(takeoffq.size()>1||(takeoffq.size()==1&&takeoffq.front().startworkTime==-1))TwaitTime++;if(landingq.size()>1||(landingq.size()==1&&landingq.front().startworkTime==-1)) LwaitTime++;更改前運(yùn)行結(jié)果:修正后運(yùn)行結(jié)果:3.3.2問題2問題:一開始的程序沒有參加deQueue.h文件,而是直接用了#include<deque>,后面參加程序后一直沒有調(diào)試成功。調(diào)試過程:有報(bào)錯(cuò)框可知,因?yàn)槌绦蜷_始設(shè)定的時(shí)候用了模版類,因此。隊(duì)列類里也需要參加模版函數(shù)。在隊(duì)列類的函數(shù)調(diào)用過程中修改了需要用到的函數(shù),確保其運(yùn)行成功。解決方法:完善了隊(duì)列類3.3.3問題3問題:要求機(jī)場24:00結(jié)束,但是程序只模擬到21:23分左右,之后再無飛機(jī)產(chǎn)生。而且之后的幾小時(shí)內(nèi)只有起飛飛機(jī),無著陸飛機(jī)。屢次模擬,均是類似結(jié)果。解決方法:首先分析該問題產(chǎn)生的可能原因,由于這種結(jié)果的太過規(guī)律性,疑心是產(chǎn)生的隨機(jī)數(shù)的問題,因此對產(chǎn)生隨機(jī)數(shù)的語句進(jìn)行分析,發(fā)現(xiàn)是將srand((int)time(0))語句放在for循環(huán)內(nèi)造成的,故將srand((int)time(0))語句放到for循環(huán)外面。測試結(jié)果4.1正常運(yùn)行輸入數(shù)據(jù)正確的情況:輸入數(shù)據(jù)錯(cuò)誤的情況:4.2邊界數(shù)據(jù)測試輸入全部為0后期擴(kuò)展目前程序只模擬了一個(gè)跑道的情況,后期可以使用優(yōu)先隊(duì)列管理跑道,實(shí)現(xiàn)多跑道的飛機(jī)場運(yùn)營模擬。由于實(shí)驗(yàn)要求先處理完著陸隊(duì)列再處理起飛隊(duì)列,可能會(huì)導(dǎo)致模擬出來的情況與實(shí)際不符,期中可能要考慮更多因素,目前的實(shí)現(xiàn)上來說還有待提高。源代碼6.1類設(shè)計(jì)deQueue.h#ifndefDEQUEUE#defineDEQUEUE#include<iostream>usingnamespacestd;template<typenameT>classnode{public:TnodeValue;node<T>*next;node():next(NULL){}node(constT&item,node<T>*nextNode=NULL):nodeValue(item),next(nextNode){}};template<typenameT>classQueue{public: Queue();voidpush_back(constT&item);voidpop_front(); T&front();constT&front()const;intsize()const;boolempty()const;private: node<T>*qfront,*qback;intcount;};template<typenameT>Queue<T>::Queue():qfront(NULL),qback(NULL),count(0){}template<typenameT>voidQueue<T>::push_back(constT&item){ node<T>*newNode=newnode<T>(item,NULL);if(qfront==NULL){ qfront=newNode; qback=newNode; }else{ qback->next=newNode; qback=newNode; } count++;}template<typenameT>voidQueue<T>::pop_front(){if(empty())//count==0 cout<<"Queuepop_front():emptyqueue"<<endl; node<T>*tmp=qfront; qfront=qfront->next;if(qfront==NULL) qback=NULL;deletetmp; count--;}template<typenameT>T&Queue<T>::front(){if(empty()) cout<<"Queuefront():emptyqueue"<<endl;returnqfront->nodeValue;}template<typenameT>intQueue<T>::size()const{returncount;}template<typenameT>boolQueue<T>::empty()const{returncount==0;}#endifTimer.h#ifndefTIMER#defineTIMERclassTimer{public:intnow;//計(jì)時(shí)器當(dāng)前時(shí)間 Timer(){} Timer(intn){ now=n; }voidspend(){//計(jì)時(shí)累加函數(shù) now++; }};#endifPlane.h#ifndefPLANE#definePLANEclassPlane{public:intstartwaitTime;//開始等待時(shí)間intstartworkTime; //開始起飛/著陸時(shí)間intworkTime;//起飛/著陸時(shí)間 Plane(){} Plane(inta,intb,intc){ startwaitTime=a; startworkTime=b; workTime=c; }};#endifWorkslot.h#include<iostream>#include<string>usingnamespacestd;#ifndefWORKSLOT#defineWORKSLOTclassWorkslot{public:intstartTime; //該時(shí)間段開始時(shí)間intendTime; //該時(shí)間段結(jié)束時(shí)間inttakeoffRate;//起飛頻率〔每小時(shí)起飛數(shù)〕intlandingRate;//著陸頻率〔每小時(shí)著陸數(shù)〕 Workslot(){} Workslot(stringsT,stringeT,inttR,intlR):takeoffRate(tR),landingRate(lR){intsmin=0;intn1=sT.find_first_of(':');if(n1==1)smin=(sT[0]-'0')*60;elseif(n1==2)smin=((sT[0]-'0')*10+(sT[1]-'0'))*60;elsecout<<"InputStartTimeerror!"<<endl; smin+=(sT[n1+1]-'0')*10+(sT[n1+2]-'0'); startTime=smin;intemin=0;intn2=eT.find_first_of(':');if(n2==1)emin=(eT[0]-'0')*60;elseif(n2==2)emin=((eT[0]-'0')*10+(eT[1]-'0'))*60;elsecout<<"InputEndTimeerror!"<<endl; emin+=(eT[n2+1]-'0')*10+(eT[n2+2]-'0'); endTime=emin; } Workslotoperator=(Workslota){ startTime=a.startTime; endTime=a.endTime; takeoffRate=a.takeoffRate; landingRate=a.landingRate;return*this; }};#endif6.2方法實(shí)現(xiàn)Airport.h#include<iostream>#include<ctime>#include<string>#include"deQueue.h"#include<iomanip>#include"Workslot.h"#include"Plane.h"#include"Timer.h"usingnamespacestd;#ifndefAIRPORT#defineAIRPORTvoidchtime(intn){if(n%60/10!=0) cout<<"時(shí)間:"<<setw(2)<<n/60<<":"<<setw(2)<<n%60;else cout<<"時(shí)間:"<<setw(2)<<n/60<<":0"<<n%60;}structBusy{boolis_takeoff;//跑道中是否為起飛飛機(jī)boolbusy; //跑道是否忙碌};classAirport{private: Timert;//計(jì)時(shí)器 Busyb; //跑道是否忙碌inttakeoffTime;//飛機(jī)起飛所需時(shí)間intlandingTime;//飛機(jī)著陸所需時(shí)間intstartworkTime;//機(jī)場當(dāng)天開始運(yùn)營時(shí)間intendworkTime; //機(jī)場當(dāng)天結(jié)束運(yùn)營時(shí)間 Workslothighslot;//頂峰時(shí)間段 Workslotlowslot;//空閑時(shí)間段 Workslototherslot;//一般時(shí)間段Queue<Plane>takeoffq;//等待起飛飛機(jī)隊(duì)列Queue<Plane>landingq;//等待著陸飛機(jī)隊(duì)列intworkTime;//跑道忙碌時(shí)間intTwaitTime;//總起飛等待時(shí)間intLwaitTime;//總著陸等待時(shí)間inttakeoffwaitTime;//所有起飛飛機(jī)總等待時(shí)間intlandingwaitTime;//所有著陸飛機(jī)總等待時(shí)間intmaxlandingwaitTime; //最大著陸等待時(shí)間intintakeoffNum;//進(jìn)入起飛隊(duì)列飛機(jī)數(shù)intinlandingNum;//進(jìn)入著陸隊(duì)列飛機(jī)數(shù)inttakeoffNum; //已經(jīng)起飛飛機(jī)數(shù)intlandingNum; //已經(jīng)著陸飛機(jī)數(shù)intt_rate;intl_rate;public:voidsetTimer(){//設(shè)定計(jì)時(shí)器函數(shù) t.now=startworkTime; }voidsetTakeoffTime(intt1){//設(shè)定起飛所需時(shí)間函數(shù) takeoffTime=t1; }voidsetLandingTime(intt2){ //設(shè)定著陸所需時(shí)間函數(shù) landingTime=t2; }voidsetMaxlandingwaitTime(intmlwd){//設(shè)定著陸飛機(jī)最大等待時(shí)間 maxlandingwaitTime=mlwd; }voidsetStartworkTime(strings){//設(shè)定機(jī)場開始工作時(shí)間函數(shù)intmin=0;intn=s.find_first_of(':');if(n==1)min=(s[0]-'0')*60;elseif(n==2)min=((s[0]-'0')*10+(s[1]-'0'))*60;else{ cout<<"InputStartWorkTimeerror!"<<endl;return; } min+=(s[n+1]-'0')*10+(s[n+2]-'0'); startworkTime=min; }voidsetEndworkTime(strings){//設(shè)定機(jī)場結(jié)束工作時(shí)間函數(shù)intmin=0;intn=s.find_first_of(':');if(n==1)min=(s[0]-'0')*60;elseif(n==2)min=((s[0]-'0')*10+(s[1]-'0'))*60;else{ cout<<"InputEndWorkTimeerror!"<<endl;return; } min+=(s[n+1]-'0')*10+(s[n+2]-'0'); endworkTime=min; }voidsetHighslot(Worksloth){//設(shè)定頂峰期機(jī)場屬性 highslot=h; }voidsetLowslot(Workslotl){//設(shè)定空閑期機(jī)場屬性 lowslot=l; }voidsetOtherslot(Worksloto){//設(shè)定一般時(shí)段機(jī)場屬性 otherslot=o; }voidrun(){//報(bào)表數(shù)據(jù)初始化 workTime=0;//跑道忙碌時(shí)間 takeoffwaitTime=0; landingwaitTime=0; TwaitTime=0;//起飛等待時(shí)間 LwaitTime=0;//著陸等待時(shí)間 takeoffNum=0;//已起飛飛機(jī)數(shù)量 landingNum=0;//已著陸飛機(jī)數(shù)量 intakeoffNum=0;//進(jìn)入起飛隊(duì)列飛機(jī)數(shù)量 inlandingNum=0;//進(jìn)入著陸隊(duì)列飛機(jī)數(shù)量 b.busy=0; srand((int)time(0));//隨機(jī)數(shù)初始化 while(t.now<=endworkTime){ //飛機(jī)場模擬開始if(highslot.startTime<=t.now&&highslot.endTime>t.now){//設(shè)置頂峰期起飛、著陸率 t_rate=highslot.takeoffRate; l_rate=highslot.landingRate; }elseif(lowslot.startTime<=t.now&&lowslot.endTime>t.now){ t_rate=lowslot.takeoffRate; l_rate=lowslot.landingRate; }else{ t_rate=otherslot.takeoffRate; l_rate=otherslot.landingRate; }if((rand()%100+1)*60.0/100<t_rate){ Planetp(t.now,-1,takeoffTime); takeoffq.push_back(tp); intakeoffNum++; chtime(t.now); cout<<""<<setw(3)<<intakeoffNum<<"號(hào)起飛飛機(jī)進(jìn)入起飛隊(duì)列"<<endl; }boollanding1=((!landingq.empty()&&(landingq.size()*landingTime-t.now+landingq.front().startworkTime)<maxlandingwaitTime)||landingq.empty());boollanding2=(((landingq.size()+1)*landingTime-t.now+(landingq.empty()?t.now:landingq.front().startworkTime))<=endworkTime-t.now);if((rand()%100+1)*60.0/100<l_rate&&landing1&&landing2){ Planelp(t.now,-1,landingTime); landingq.push_back(lp); inlandingNum++; chtime(t.now); cout<<""<<setw(3)<<inlandingNum<<"號(hào)著陸飛機(jī)進(jìn)入著陸隊(duì)列"<<endl; }if(b.busy){ if(b.is_takeoff&&(takeoffq.front().startworkTime!=-1 &&t.now-takeoffq.front().startworkTime==takeoffTime)){ takeoffwaitTime+=takeoffq.front().startworkTime-takeoffq.front().startwaitTime; takeoffq.pop_front(); b.busy=0; }elseif(!b.is_takeoff&&(landingq.front().startworkTime!=-1 &&t.now-landingq.front().startworkTime==landingTime)){ landingwaitTime+=landingq.front().startworkTime-landingq.front().startwaitTime; landingq.pop_front(); b.busy=0; } }else{ if(!landingq.empty()){ landingq.front().startworkTime=t.now; b.is_takeoff=0; chtime(t.now); landingNum++; cout<<""<<setw(3)<<landingNum<<"號(hào)著陸飛機(jī)開始著陸;等待時(shí)間:"<<t.now-landingq.front().startwaitTime<<"min"<<endl; b.busy=1; }elseif(landingq.empty()&&!takeoffq.empty()){ takeoffq.front().startworkTime=t.now; b.is_takeoff=1; chtime(t.now); takeoffNum++; cout<<""<<setw(3)<<takeoffNum<<"號(hào)起飛飛機(jī)開始起飛;等待時(shí)間:" <<t.now-takeoffq.front().startwaitTime<<"min"<<endl; b.busy=1; } }if(takeoffq.size()>1|| (takeoffq.size()==1&&takeoffq.front().startworkTime==-1)) TwaitTime++;if(landingq.size()>1|| (landingq.size()==1&&landingq.front().startworkTime==-1)) LwaitTime++;if(b.busy)workTime++; t.spend(); } }voiddisplay(){//輸出計(jì)算結(jié)果函數(shù) cout<<endl<<"本日機(jī)場運(yùn)營情況:"<<endl<<"跑道的繁忙程度:" <<(double)workTime/(double)(endworkTime-startworkTime)<<endl;if(landingNum!=0){ cout<<"著陸飛機(jī)總的等待時(shí)間:" <<(double)landingwaitTime/60<<"h"<<endl; cout<<"著陸飛機(jī)平均等待時(shí)間:" <<(double)(landingwaitTime/landingNum)<<"min"<<endl; cout<<"著陸飛機(jī)在隊(duì)列中的平均等待時(shí)間:" <<(double)(LwaitTime/landingNum)<<"min"<<endl<<endl; }elsecout<<"期間無飛機(jī)著陸"<<endl<<endl;if(takeoffNum!=0){ cout<<"起飛飛機(jī)總的等待時(shí)間:" <<(double)takeoffwaitTime/60<<"h"<<endl; cout<<"起飛飛機(jī)平均等待時(shí)間:" <<(double)(takeoffwaitTime/takeoffNum)<<"min"<<endl; cout<<"起飛飛機(jī)在隊(duì)列中的平均等待時(shí)間:" <<(double)(TwaitTime/takeoffNum)<<"min"<<endl; cout<<"起飛隊(duì)列中剩余未起飛飛機(jī)數(shù)量:" <<intakeoffNum-takeoffNum<<"架"<<endl; }elsecout<<"期間無飛機(jī)起飛"<<endl; } };#endifSimulation.cpp#include"Airport.h"#include"Plane.h"#include"Timer.h"#include<iostream>#include"deQueue.h"#include<string>usingnamespacestd;boolwrong(strings){if(s[0]-'2'>=0&&s[1]!=':'&&s[1]-'4'>0)return1;return0;}intmain(){ freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); cout<<"------------------機(jī)場航空管制模擬-------------------"<<endl; Airporta; stringbeginTime,endTime,hbeginTime,hendTime,lbeginTime,lendTime;inthtakeoffRate,hlandingRate,ltakeoffRate,llandingRate,otakeoffRate,olandingRate,TakeoffTime,LandingTime,MaxlandingwaitTime; cout<<"請輸入機(jī)場開始工作時(shí)間:"; cin>>beginTime;while(wrong(beginTime)){ cout<<"機(jī)場開始工作時(shí)間輸入有誤,請輸入小于等于24的數(shù)字:"; cin>>endTime; } cout<<endl; cout<<"請輸入機(jī)場結(jié)束工作時(shí)間:"; cin>>endTime;while(wrong(endTime)){ cout<<"機(jī)場結(jié)束工作時(shí)間輸入有誤,請輸入小于等于24的數(shù)字:"; cin>>endTime; } cout<<endl; cout<<"請輸入頂峰期開始時(shí)間:"; cin>>hbeginTime;while(wrong(hbeginTime)){ cout<<"頂峰期開始時(shí)間輸入有誤,請輸入小于等于24的數(shù)字:"; cin>>endTime; } cout<<endl; cout<<"請輸入頂峰期結(jié)束時(shí)間:"; cin>>hendTime;while(wrong(hendTime)){ cout<<"頂峰期結(jié)束時(shí)間輸入有誤,請輸入小于等于24的數(shù)字:"; cin>>endTime; } cout<<endl; cout<<"請輸入空閑期開始時(shí)間:"; cin>>lbeginTime;while(wrong(lbeginTime)){ cout<<"空閑期開始時(shí)間輸入有誤,請輸入小于等于24的數(shù)字:"; cin>>endTime; } cout<<endl; cout<<"請輸入空閑期結(jié)束時(shí)間:"; cin>>lendTime;while(wrong(lendTime)){ cout<<"空閑期結(jié)束時(shí)間輸入有誤,請輸入小于等于24的數(shù)字:"; cin>>endTime; } cout<<endl; cout<<"請輸入著陸飛機(jī)最長等待時(shí)間:

溫馨提示

  • 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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論