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

下載本文檔

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

文檔簡(jiǎn)介

機(jī)場(chǎng)航空管制模擬實(shí)驗(yàn)報(bào)告

目錄機(jī)場(chǎng)航空管制模擬實(shí)驗(yàn)報(bào)告 1實(shí)驗(yàn)題目 41. 實(shí)驗(yàn)內(nèi)容分析 41.1實(shí)驗(yàn)?zāi)康?41.2內(nèi)容分析 41.3程序基本流程 51.4基本數(shù)據(jù)結(jié)構(gòu),類設(shè)計(jì) 61.4.1類Simulation 61.4.2類Plane 71.4.3類Timer 71.4.4結(jié)構(gòu)TimeElement 81.5基本函數(shù)功能 81.5.1類Simulation 81.5.2類Plane 101.5.3類Timer 112. 實(shí)驗(yàn)驗(yàn)證分析 112.1輸入的形式和輸入值的范圍 112.2輸出的形式 122.3程序所能達(dá)到的功能 122.4測(cè)試數(shù)據(jù) 133. 調(diào)試分析 133.1遇到的問題及解決方法 133.1.1問題1 133.1.2問題2 143.1.3問題3 173.2技術(shù)難點(diǎn)分析 173.2.1難點(diǎn)一 173.2.2難點(diǎn)二 183.2.3難點(diǎn)三 183.2.4難點(diǎn)四 183.3印象最深刻的錯(cuò)誤及修正方法 184. 測(cè)試結(jié)果 214.1正常運(yùn)行 214.1.1不修改工作時(shí)間 214.1.2修改工作時(shí)間 224.2邊界數(shù)據(jù)測(cè)試 234.2.1輸入全部為0 234.2.2每小時(shí)著陸飛機(jī)為0 244.2.3每小時(shí)起飛飛機(jī)為0 254.2.4起飛時(shí)間,著陸時(shí)間為0 264.2.5每小時(shí)起飛/著陸飛機(jī)為10000 274.2.6飛機(jī)工作時(shí)間為0 285. 后期擴(kuò)展 286. 源代碼 286.1類設(shè)計(jì) 286.2方法實(shí)現(xiàn) 31

實(shí)驗(yàn)題目假設(shè)機(jī)場(chǎng)有一條跑道,每架飛機(jī)需花費(fèi)一定時(shí)間著陸,花費(fèi)一定時(shí)間起飛,飛機(jī)的起降滿足一定的概率。一般來講,機(jī)場(chǎng)存在兩個(gè)隊(duì)列,一個(gè)等待著陸的飛機(jī)隊(duì)列和一個(gè)等待起飛的飛機(jī)隊(duì)列,同樣等待時(shí)間下,等待著陸的飛機(jī)比準(zhǔn)備起飛的飛機(jī)具有更高的優(yōu)先級(jí)。試編寫程序模擬這個(gè)機(jī)場(chǎng)的運(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ī)場(chǎng)的航空管制,通過程序,來模擬管理飛機(jī)的起飛與著陸。它要求我們考慮起飛與著陸的優(yōu)先級(jí)不同,以及根據(jù)飛機(jī)起飛/著陸時(shí)間,起飛/著陸頻率模擬機(jī)場(chǎng)一天的運(yùn)營(yíng)情況。并計(jì)算出跑道的繁忙程度、著陸飛機(jī)的總的等待時(shí)間和平均等待時(shí)間、起飛飛機(jī)的總的等待時(shí)間和平均等待時(shí)間,計(jì)算每架飛機(jī)花費(fèi)在一個(gè)隊(duì)列中的平均時(shí)間。1.2內(nèi)容分析 系統(tǒng)主要模擬了機(jī)場(chǎng)一天的運(yùn)營(yíng)。所以,需要一個(gè)計(jì)時(shí)器來倒計(jì)時(shí)計(jì)算機(jī)場(chǎng)的運(yùn)營(yíng)時(shí)間。同時(shí),為了管理飛機(jī)的起飛與著陸,需要兩個(gè)隊(duì)列來存放著陸,起飛的飛機(jī)。整個(gè)系統(tǒng)采用分鐘來計(jì)時(shí)。 設(shè)計(jì)用戶輸入的數(shù)據(jù)為:每小時(shí)起飛/著陸的飛機(jī)數(shù),飛機(jī)起飛/著陸需要的時(shí)間。通過每小時(shí)起飛/著陸的飛機(jī)數(shù)我們可以得到飛機(jī)起飛/著陸的頻率??紤]到機(jī)場(chǎng)的高峰期,與空閑期,設(shè)計(jì)了方法setRate()改變飛機(jī)起飛/著陸的頻率,和高峰期時(shí)間與空閑期時(shí)間,。當(dāng)進(jìn)入高峰期/空閑期時(shí),調(diào)用setRate()方法。同時(shí),考慮到夏令時(shí),冬令時(shí),以及節(jié)假日客運(yùn)高峰,機(jī)場(chǎng)需要更改工作時(shí)間。我們?cè)O(shè)計(jì)了方法setTotalWorkTime(),它先輸出預(yù)設(shè)好的工作時(shí)間,再詢問用戶是否需要更改工作時(shí)間。另外,方法toMinute(),計(jì)算每日的工作時(shí)間,并轉(zhuǎn)成分鐘形式返回,以方便倒計(jì)時(shí)器來計(jì)算時(shí)間。同時(shí),為了使飛機(jī)的著陸與起飛更接近現(xiàn)實(shí),設(shè)計(jì)checkTakeOffPlane()和checkLandingPlane()方法,采用隨機(jī)數(shù)來得到飛機(jī)的請(qǐng)求。當(dāng)產(chǎn)生的著陸到達(dá)隨機(jī)數(shù)小于起飛/著陸的頻率時(shí),接受請(qǐng)求,并將該請(qǐng)求飛機(jī)放入起飛/著陸的隊(duì)列中。同時(shí),將飛機(jī)等待著陸/起飛的隊(duì)列長(zhǎng)度(waitLandingLength/waitFlyLength),著陸/起飛飛機(jī)數(shù)目(landingNum/takeOffNum),等待起飛/著陸隊(duì)列總長(zhǎng)度(waitFlySum/waitLandingSum)相應(yīng)的加1。設(shè)計(jì)Timer類,其主要方法是實(shí)現(xiàn)計(jì)時(shí)功能和返回剩余工作時(shí)間。Plane類主要功能是記錄飛機(jī)請(qǐng)求接受的時(shí)間,方便我們后期計(jì)算該飛機(jī)的等待服務(wù)時(shí)間。飛機(jī)起飛/著陸都需要花費(fèi)一定的時(shí)間,并不是馬上就完成的。所以在起飛/著陸服務(wù)函數(shù)中,不僅要調(diào)用倒計(jì)時(shí)方法tick(),還需要判斷serviceTime是否結(jié)束。當(dāng)serviceTime>0時(shí),說明飛機(jī)還在準(zhǔn)備著陸/起飛,占用了跑道。當(dāng)serviceTime=0時(shí),表示飛機(jī)著陸/起飛成功。調(diào)用pop方法,從隊(duì)列中刪除一架等待服務(wù)的飛機(jī),并獲取當(dāng)前時(shí)間,減去飛機(jī)接受服務(wù)的時(shí)間,得到該飛機(jī)的等待服務(wù)時(shí)間。我們就可以計(jì)算出所有飛機(jī)的等待服務(wù)時(shí)間。等待起飛/著陸隊(duì)列總長(zhǎng)度(waitFlySum/waitLandingSum),等待服務(wù)總時(shí)間,以及服務(wù)起飛/著陸的飛機(jī)總數(shù),我們就可以得出起飛/著陸飛機(jī)的平均等待時(shí)間,平均等待隊(duì)列長(zhǎng)度。同時(shí)根據(jù)當(dāng)天的的工作時(shí)間,飛機(jī)起飛/著陸的數(shù)目以及飛機(jī)起飛/著陸花費(fèi)是時(shí)間,可以計(jì)算得到跑道的繁忙程度。1.3程序基本流程圖1實(shí)驗(yàn)基本流程1.4基本數(shù)據(jù)結(jié)構(gòu),類設(shè)計(jì)1.4.1類Simulation輸入:變量名備注doublelandingRate飛機(jī)著陸速率doubletakeOffRate飛機(jī)起飛速率inttakeOffTime飛機(jī)起飛所需時(shí)間intlandingTime飛機(jī)著地所需時(shí)間inttotalWorkTime機(jī)場(chǎng)每天的工作時(shí)間structTimeElementstartTime每天工作的開始時(shí)間structTimeElementendTime每天工作的結(jié)束時(shí)間structTimeElementbusyStart每天高峰期的時(shí)段structTimeElementbusyEndstructTimeElementfreeStart每天空閑期的時(shí)段structTimeElementfreeEndintt1,t2用來保存飛機(jī)起飛需要的時(shí)間和著陸需要的時(shí)間輸出變量名備注inttakeOffNum 總的起飛飛機(jī)數(shù)量intlandingNum總的著陸飛機(jī)數(shù)量intwaitLandingLength等待著陸隊(duì)列長(zhǎng)度intwaitFlyLength等待起飛隊(duì)列長(zhǎng)度intwaitFlySum等待起飛隊(duì)列長(zhǎng)度之和intwaitLandingSum等待著陸隊(duì)列長(zhǎng)度之和doublewaitLandingTimeSum著陸飛機(jī)等待時(shí)間之和doublewaitTakeOffTimeSum起飛飛機(jī)等待時(shí)間之和doublebusyLevel跑道繁忙程度intextraTakeOffNum運(yùn)營(yíng)時(shí)間結(jié)束后,在等待隊(duì)列中需要起飛的飛機(jī)數(shù)量intextraLandingNum運(yùn)營(yíng)時(shí)間結(jié)束后,在等待隊(duì)列中需要著陸的飛機(jī)數(shù)量intnum1,num2用來記錄起飛的飛機(jī)數(shù)目與著陸的飛機(jī)數(shù)目TimerairTimer倒計(jì)時(shí)時(shí)鐘queue<Plane>takeOffQueue起飛隊(duì)列,元素類型為飛機(jī)類型queue<Plane>landingQueue著陸隊(duì)列,元素類型為飛機(jī)類型成員方法名備注Simulation()創(chuàng)建一個(gè)Simulation對(duì)象voidrun()運(yùn)行仿真voiddisplay(ostream&out)顯示仿真結(jié)果voidlandingService(int&serviceTime)為需要著陸的飛機(jī)提供服務(wù)voidtakeOffService(int&serviceTime)為需要起飛的飛機(jī)提供服務(wù)voidcheckLandingPlane()檢查是否有新的等待著陸的飛機(jī)進(jìn)入隊(duì)列voidcheckTakeOffPlane()檢查是否有新的等待起飛的飛機(jī)進(jìn)入隊(duì)列voidsetTotalWorkTime()設(shè)置機(jī)場(chǎng)每天的工作時(shí)間InttoMinute(TimeElementt1,TimeElementt2)獲得以分鐘表示的每天工作時(shí)間t1,t2表示高峰期/空閑期開始,結(jié)束時(shí)間,flag區(qū)分高峰期/空閑期voidsetRate(intflag)更改起飛或者著陸頻率(模擬高峰期與空閑期1.4.2類Plane成員:方法名備注intgetWaitStartTime()const得到飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間intwaitStartTime飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間(用于后期計(jì)算等待時(shí)間)1.4.3類Timer成員:方法名備注voidsetWorkTime(intmin)設(shè)置機(jī)場(chǎng)的工作時(shí)間voidtick();intRemianingTime()const獲得當(dāng)天機(jī)場(chǎng)剩余的工作時(shí)間(以分鐘表示)intminutes機(jī)場(chǎng)的工作時(shí)間(按分鐘表示)1.4.4結(jié)構(gòu)TimeElement成員:變量名備注inthour小時(shí)intmin分鐘1.5基本函數(shù)功能1.5.1類Simulationrun():run方法中調(diào)用了toMinute函數(shù)將時(shí)間轉(zhuǎn)化為分鐘數(shù),來表示高峰期和空閑期時(shí)段。定義了四個(gè)變量來表示高峰期和空閑期的開始時(shí)間和結(jié)束時(shí)間,默認(rèn)設(shè)置高分期的開始時(shí)間和結(jié)束時(shí)間為9:30和13:30,空閑期的開始時(shí)間和結(jié)束時(shí)間為21:30和24:00。當(dāng)處于高峰期時(shí)段和空閑期,就輸出此刻時(shí)間,并改變飛機(jī)著陸和起飛的速率。通過setRate()來改變飛機(jī)的速率,高峰期時(shí),飛機(jī)著陸和起飛的速率變?yōu)樵瓉淼?.5倍,而處于空閑期時(shí),速率變?yōu)樵瓉?.5倍。這樣就標(biāo)識(shí)了高峰期和空閑期。接著調(diào)用checkLandingPlane()和checkTakeOffPlane()來檢查是否有需要著陸或起飛的飛機(jī),只要著陸的隊(duì)列不為空,就為著陸的飛機(jī)提供服務(wù),然后再檢查起飛隊(duì)列,只要隊(duì)列不為空,就為需要起飛的飛機(jī)服務(wù)。體現(xiàn)了著陸的飛機(jī)優(yōu)先的原則。這里調(diào)用了landingService(int&serviceTime)和takeOffService(int&serviceTime)函數(shù),由于這兩個(gè)函數(shù)每次服務(wù)時(shí)都使用了倒計(jì)時(shí)時(shí)鐘進(jìn)行倒計(jì)時(shí),所以當(dāng)兩個(gè)隊(duì)列不為空時(shí),不需要倒計(jì)時(shí)。而當(dāng)兩個(gè)隊(duì)列都為空時(shí),但機(jī)場(chǎng)工作時(shí)間還沒到時(shí),使用倒計(jì)時(shí)時(shí)鐘繼續(xù)計(jì)時(shí)。當(dāng)機(jī)場(chǎng)運(yùn)營(yíng)時(shí)間結(jié)束時(shí),輸出此刻的時(shí)間,并不再接受飛機(jī)的請(qǐng)求。若著陸和起飛隊(duì)列中還有需要服務(wù)的飛機(jī),就繼續(xù)調(diào)用landingService(int&serviceTime)和takeOffService(int&serviceTime)函數(shù)來為飛機(jī)進(jìn)行服務(wù),直到兩個(gè)隊(duì)列都為空。同時(shí)計(jì)算出extraTakeOffNum和extraLandingNum的值,表示機(jī)場(chǎng)運(yùn)營(yíng)時(shí)間結(jié)束額外服務(wù)的飛機(jī)數(shù),分別等于總的飛機(jī)數(shù)減去在為額外的飛機(jī)服務(wù)之前的飛機(jī)數(shù)。使用num1和num2兩個(gè)變量來表示機(jī)場(chǎng)運(yùn)營(yíng)時(shí)間結(jié)束時(shí)的飛機(jī)數(shù),它們都會(huì)在service函數(shù)中做++操作。最后使用display()函數(shù)輸出仿真結(jié)果。display(ostream&out):該函數(shù)主要用于計(jì)算一些值,并輸出在屏幕上。起飛隊(duì)列的平均等待時(shí)間avgWaitFly=起飛飛機(jī)等待隊(duì)列長(zhǎng)度之和waitFlySum/機(jī)場(chǎng)總的工作時(shí)間totalWorkTime著陸隊(duì)列的平均等待時(shí)間avgWaitLanding=著陸飛機(jī)等待隊(duì)列長(zhǎng)度之和waitLandingSum/機(jī)場(chǎng)總的工作時(shí)間totalWorkTime平均等待起飛時(shí)間avgWaitTakeOffTime=起飛隊(duì)列等待時(shí)間之和waitTakeOffTimeSum/總的起飛飛機(jī)數(shù)量takeOffNum(當(dāng)總的起飛飛機(jī)的數(shù)量不為0時(shí))平均等待著陸時(shí)間avgWaitLandingTime=著陸隊(duì)列等待時(shí)間之和waitLandingTimeSum/總的著陸飛機(jī)數(shù)量landingNum(當(dāng)總的著陸飛機(jī)的數(shù)量不為0時(shí))跑道繁忙程度:busyLevel=(double)(takeOffNum*takeOffTime+landingNum*landingTime)/totalWorkTime即飛機(jī)總的使用跑道的時(shí)間除以總時(shí)間,這個(gè)總時(shí)間只是機(jī)場(chǎng)的運(yùn)營(yíng)時(shí)間,不包括運(yùn)營(yíng)時(shí)間結(jié)束后加班給飛機(jī)服務(wù)的時(shí)間,所以跑道繁忙程度很有可能大于1。再使用輸出語(yǔ)句輸出這些值。voidlandingService(int&serviceTime):這個(gè)函數(shù)的參數(shù)serviceTime就是飛機(jī)著陸所需的時(shí)間,飛機(jī)著陸所需的時(shí)間是自己再在控制臺(tái)輸入的。如果serviceTime>0,表明上一架著陸的飛機(jī)還沒有著陸,要將倒計(jì)時(shí)時(shí)鐘倒計(jì)時(shí)。否則服務(wù)下一架需要著陸飛機(jī),nextplane定義為位于著陸隊(duì)列頭的飛機(jī),調(diào)用隊(duì)列的front()函數(shù)表示。將這架飛機(jī)從隊(duì)列中刪掉。此時(shí)將serviceTime定義為下一架飛機(jī)的著陸時(shí)間,表明服務(wù)開始。waitLandingTimeSum+=(nextPlane.getWaitStartTime()-airTimer.RemianingTime())同時(shí)著陸飛機(jī)等待時(shí)間之和加上這一架飛機(jī)的等待時(shí)間。這一架飛機(jī)的等待時(shí)間為這架飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間—當(dāng)前時(shí)間。利用plane類的getWaitStartTime()函數(shù)來獲得飛機(jī)進(jìn)入著陸隊(duì)列的時(shí)間。倒計(jì)時(shí)時(shí)鐘倒計(jì)時(shí)一分鐘,著陸隊(duì)列減一,用來保存發(fā)到機(jī)場(chǎng)運(yùn)營(yíng)時(shí)間結(jié)束時(shí)著陸飛機(jī)總數(shù)的變量做加一操作。voidtakeOffService(int&serviceTime)與上一個(gè)函數(shù)原理完全相同,在這里不作具體描述。voidcheckLandingPlane()利用系統(tǒng)提供的隨機(jī)數(shù)生成器的rand()方法來產(chǎn)生隨機(jī)數(shù)x,當(dāng)x小于飛機(jī)著陸的頻率,就使一架飛機(jī)進(jìn)入等待著陸隊(duì)列,等待著陸隊(duì)列長(zhǎng)度waitLandingLength加一。調(diào)用Plane的帶參數(shù)的函數(shù),參數(shù)類型為Timer類型的,目的是將當(dāng)前時(shí)間RemianingTime()賦給飛機(jī)進(jìn)入隊(duì)列開始等待的時(shí)間waitStartTime。著陸飛機(jī)的數(shù)量加一,并將新的這架飛機(jī)push到隊(duì)列尾部,等待著陸隊(duì)列之和waitLandingSum加一。voidcheckTakeOffPlane()該方法與上一個(gè)方法原理完全相同,在這里不作詳細(xì)描述voidsetTotalWorkTime()該函數(shù)用于自己修改機(jī)場(chǎng)的工作時(shí)間。首先,輸出機(jī)場(chǎng)默認(rèn)的工作時(shí)間為9:00~22:00,詢問是否需要修改機(jī)場(chǎng)的工作時(shí)間,用flag變量標(biāo)記,若輸入1則表示要改變機(jī)場(chǎng)工作時(shí)間。輸入更改的機(jī)場(chǎng)工作時(shí)間的起始時(shí)間和結(jié)束時(shí)間。要分別輸入時(shí)鐘數(shù)hour和分鐘數(shù)min,是結(jié)構(gòu)TimeElement中的兩個(gè)成員,用來分類一個(gè)時(shí)間的時(shí)鐘數(shù)和分鐘數(shù),便于輸出表示和計(jì)算兩個(gè)時(shí)間之間的總分鐘數(shù)。一個(gè)巧妙的方法使輸出的時(shí)間的形式更加好看,當(dāng)分鐘數(shù)小于10時(shí),在輸出的分鐘數(shù)之前加個(gè)“0”,這樣使時(shí)間的輸出形式就變成例如9:00~20:08。toMinute(TimeElementt1,TimeElementt2)該函數(shù)用于將一個(gè)輸入的起始時(shí)間和結(jié)束時(shí)間轉(zhuǎn)化為分鐘數(shù)。t1,t2為兩個(gè)結(jié)構(gòu)類型的變量,分別調(diào)用成員hour和min,使后一個(gè)時(shí)間的hour減去前一個(gè)時(shí)間的hour,即t2.hour—t1.hour得到一個(gè)時(shí)鐘數(shù),然后使后一個(gè)時(shí)間的min減去前一個(gè)時(shí)間的min,即t2.min—t1.min得到一個(gè)分鐘數(shù),最后用時(shí)鐘數(shù)乘以60加上分鐘數(shù)即可得到兩個(gè)時(shí)間之間的總的分鐘數(shù)。voidsetRate(intflag)該函數(shù)改變飛機(jī)著陸和起飛的頻率。用一個(gè)整型參數(shù)來標(biāo)記,當(dāng)flag=1時(shí),飛機(jī)著陸頻率landingRate和飛機(jī)起飛頻率takeOffRate變成原來的1.5倍,表明是出于高峰期。當(dāng)flag=0時(shí),這兩個(gè)值又分別變成原來的0.5倍,表明是出于空閑期。1.5.2類PlanePlane()構(gòu)造函數(shù)用于初始化飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間waitStartTime,設(shè)為0。Plane(constTimer&t)該構(gòu)造函數(shù)帶有一個(gè)Timer類型的參數(shù),為了將飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間waitStartTime賦值為當(dāng)前時(shí)間,也就是剩余時(shí)間t.remainingtime()。為了計(jì)算出每一架飛機(jī)的等待時(shí)間。IntgetWaitStartTime()const該函數(shù)返回飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間waitStartTime。voiddisplay(ostream&out)const用于輸出waitStartTime。1.5.3類TimerTimer()構(gòu)造方法初始化成員變量minutes,設(shè)為0。Timer(intinitTime)該函數(shù)為minutes賦值,assert(initTime>0)判斷initTime是否大于0.若是則賦值給minutes,否則終止程序運(yùn)行。voidtick()該函數(shù)設(shè)置倒計(jì)時(shí)時(shí)鐘,將minutes作減一操作。在其他方法中會(huì)不斷調(diào)用該函數(shù)來倒計(jì)時(shí)。intRemianingTime()const獲得機(jī)場(chǎng)工作的剩余時(shí)間,也可以說是當(dāng)前時(shí)間,返回minutes。之后用于計(jì)算飛機(jī)的等待時(shí)間。實(shí)驗(yàn)驗(yàn)證分析2.1輸入的形式和輸入值的范圍變量名類型范圍輸入示例備注downPlanesPerHourInt0~6每小時(shí)飛機(jī)的著陸數(shù)量upPlanesPerHourInt0~23每小時(shí)飛機(jī)的著陸數(shù)量takeOffTimeInt0~3飛機(jī)起飛需要的時(shí)間landingTimeint0~4飛機(jī)著陸需要的時(shí)間flag(setTotalWorkTime())int0~1270區(qū)分是否更改工作時(shí)間的標(biāo)識(shí)startTime.hourInt0~249工作開始時(shí)間小時(shí)startTime.minInt0~6030工作開始時(shí)間的分鐘endTime.hourInt0~2422工作結(jié)束時(shí)間的小時(shí)endTime.minInt0~6015工作結(jié)束時(shí)間的分鐘2.2輸出的形式控制臺(tái)下運(yùn)行,結(jié)果輸出形式:本日機(jī)場(chǎng)運(yùn)營(yíng)情況如下: 本日機(jī)場(chǎng)運(yùn)行情況如下:\n"; 等待起飛飛機(jī)的平均隊(duì)列長(zhǎng)度為:XX 等待著陸飛機(jī)的平均隊(duì)列長(zhǎng)度為:XX 總共起飛了的飛機(jī)數(shù)量為: XX架 總共著陸了的飛機(jī)數(shù)量為: XX架 運(yùn)營(yíng)時(shí)間結(jié)束后起飛的飛機(jī)數(shù)量為:XX架 運(yùn)營(yíng)時(shí)間結(jié)束后著陸的飛機(jī)數(shù)量為:XX架 起飛隊(duì)列的總等待時(shí)間為: XX分鐘 降落飛機(jī)的總等待時(shí)間為: XX分鐘 每架起飛飛機(jī)在隊(duì)列的平均等待時(shí)間:XX分鐘 每架降落飛機(jī)在隊(duì)列的平均等待時(shí)間:XX分鐘 跑道繁忙程度為:XX2.3程序所能達(dá)到的功能程序?qū)崿F(xiàn)了如下的功能:設(shè)置機(jī)場(chǎng)的工作時(shí)間模擬機(jī)場(chǎng)的運(yùn)營(yíng)簡(jiǎn)單模擬機(jī)場(chǎng)的高峰期和空閑期計(jì)算出機(jī)場(chǎng)當(dāng)天起飛/著陸的飛機(jī)數(shù)目計(jì)算出等待隊(duì)列(起飛/著陸)的平均長(zhǎng)度計(jì)算隊(duì)列的平均等待時(shí)間簡(jiǎn)單表示跑道的繁忙程度計(jì)算機(jī)場(chǎng)運(yùn)營(yíng)結(jié)束后還需服務(wù)的飛機(jī)數(shù)(起飛/著陸)2.4測(cè)試數(shù)據(jù)輸入的值:每小時(shí)著陸的飛機(jī)數(shù)(架)每小時(shí)起飛的飛機(jī)數(shù)(架)飛機(jī)著陸所需要的時(shí)間(分)飛機(jī)起飛所需要的時(shí)間(分)1.45542.66453.36874.2330325.00006.20020011輸出的值:平均隊(duì)列長(zhǎng)度(起飛)平均隊(duì)列長(zhǎng)度(著陸)總的飛機(jī)數(shù)量(起飛)總的飛機(jī)數(shù)量(著陸)額外的飛機(jī)數(shù)量(起飛)額外的飛機(jī)數(shù)量(著陸)飛機(jī)的總等待時(shí)間(起飛)飛機(jī)的總等待時(shí)間(著陸)每架飛機(jī)的平均等待時(shí)間(起飛)每架飛機(jī)的平均等待時(shí)間(著陸)跑道的繁忙程度1.0.1153850.084615490架66架14架0架9267分406分102.967分6.15152分0.884662.0.1461540.155128114121949630203238552.80726.76031.360263.0.1538460.07692311206092172355979602.95816.31671.692314.0.7166670.5833335594555582601261702401952257.06527.9013.183335.000000000006.1178078078039015196303038101948.5389.52調(diào)試分析3.1遇到的問題及解決方法3.1.1問題1問題:程序里設(shè)置在到達(dá)高峰期/空閑期時(shí),調(diào)用setRate()函數(shù)更改飛機(jī)起飛/著陸頻率,但后來發(fā)現(xiàn)程序中在更改了頻率,過了高峰期/空閑期之后,并沒有將頻率改回平常的頻率。解決方法:設(shè)置兩個(gè)臨時(shí)變量rate1,rate2保存更改前的頻率。在結(jié)束高峰期/空閑期的時(shí)刻,將takeOffRate,landingRate改回原來的值。更改前運(yùn)行結(jié)果如下:更改后運(yùn)行結(jié)果:3.1.2問題2問題:輸出的跑道的繁忙程度為0,這是一個(gè)很奇怪的事情。只要有一架起飛或者著陸的飛機(jī),跑道的繁忙程度就不可能為0。我們進(jìn)行了對(duì)計(jì)算跑道繁忙程度的各個(gè)部分的測(cè)試。busyLevel=(double)(takeOffNum*takeOffTime+landingNum*landingTime)/totalWorkTime這個(gè)是跑道繁忙程度的計(jì)算公式。即起飛飛機(jī)的總數(shù)量乘以起飛所需要的時(shí)間加上著陸飛機(jī)的總數(shù)量乘以著陸所需要的時(shí)間得到的總時(shí)間(理解為跑道占用的時(shí)間),除以機(jī)場(chǎng)總的工作時(shí)間。出錯(cuò)結(jié)果如下:調(diào)試過程:經(jīng)過測(cè)試得知,是由于takeoffTime和landingTime為0造成的原因。由于在landingService(int&serviceTime)和takeOffService(int&serviceTime)函數(shù)中使用的參數(shù)serviceTime本質(zhì)上就是起飛或著陸所需要的時(shí)間,調(diào)用這兩個(gè)函數(shù)時(shí),其參數(shù)也使用takeoffTime和landingTime來傳遞。但是在這兩個(gè)函數(shù)的內(nèi)部,serviceTime是會(huì)改變的,會(huì)不斷減小到0,所以takeoffTime和landingTime這個(gè)本來輸入時(shí)固定的值就會(huì)變成0。再使用這兩個(gè)值計(jì)算跑道繁忙程度時(shí),結(jié)果始終為0。解決方法:使用兩個(gè)變量t1,t2來保存takeoffTime和landingTime的值,使這兩個(gè)值在輸入以后始終不變。在調(diào)用landingService(int&serviceTime)和takeOffService(int&serviceTime)方法時(shí)也直接使用t1,t2來作為參數(shù)。調(diào)試結(jié)果如下:跑道繁忙程度不再是0。3.1.3問題3在一開始調(diào)試程序時(shí),沒有其他的編碼錯(cuò)誤,一直報(bào)出上圖的連接錯(cuò)誤,沒有解決的終端標(biāo)志。后來經(jīng)過反復(fù)測(cè)試,這個(gè)問題時(shí)由于建的工程不對(duì)而產(chǎn)生的。我一開始建立的是Win32Application的工程。經(jīng)過百度搜索得到了錯(cuò)誤的原因。產(chǎn)生這個(gè)問題可能的原因:1.我們用vc建了一個(gè)控制臺(tái)程序,它的入口函數(shù)應(yīng)該是main,而你使用了WinMain.2.我們用vc打開了一個(gè).c/.cpp文件,然后直接編譯這個(gè)文件,這個(gè)文件中使用了WinMian而不是main作為入口函數(shù)。vc這時(shí)的默認(rèn)設(shè)置是針對(duì)控制臺(tái)程序的。解決方法:應(yīng)該建立Win32ConsoleApplication的工程,指的是控制臺(tái)的應(yīng)用程序,這樣才能在控制臺(tái)上正確地輸出。這個(gè)錯(cuò)誤時(shí)深刻的,會(huì)謹(jǐn)記在心。3.2技術(shù)難點(diǎn)分析3.2.1難點(diǎn)一一架飛機(jī)完成起飛/著陸花費(fèi)一般超過一分鐘,而我們?cè)O(shè)計(jì)服務(wù)方法landingService(int&serviceTime)/takeOffService(int&serviceTime)每調(diào)用一次只花費(fèi)一分鐘。那么如何來判斷對(duì)當(dāng)前飛機(jī)的服務(wù)結(jié)束了呢。解決辦法是設(shè)計(jì)一個(gè)引用參數(shù)serviceTime,記錄該飛機(jī)起飛/著陸需要的時(shí)間,每調(diào)用一次服務(wù)方法,都使serviceTime減一。同時(shí)在方法中進(jìn)行判斷,當(dāng)serviceTime>0時(shí),說明飛機(jī)還需要服務(wù),當(dāng)serviceTime=0時(shí),飛機(jī)起飛/著陸完成。3.2.2難點(diǎn)二飛機(jī)等待時(shí)間的計(jì)算。一架飛機(jī)的等待時(shí)間為從它服務(wù)被接受進(jìn)入等待隊(duì)列開始到完成服務(wù)為止。我們需要一個(gè)變量來記錄飛機(jī)開始等待的時(shí)間,與結(jié)束等待的時(shí)間。出于節(jié)約內(nèi)存的考慮,我們只在plane類中設(shè)計(jì)了一個(gè)變量來存放飛機(jī)開始等待的時(shí)間。在服務(wù)方法中,倒計(jì)時(shí)結(jié)束,飛機(jī)服務(wù)完成時(shí),我們使用Timer類中的RemianingTime()得到當(dāng)前時(shí)間,與飛機(jī)開始等待時(shí)間相減。得到該飛機(jī)的服務(wù)等待時(shí)間。3.2.3難點(diǎn)三確定在哪個(gè)位置對(duì)等待起飛/著陸隊(duì)列長(zhǎng)度和等待起飛/著陸隊(duì)列總長(zhǎng)度進(jìn)行增加操作。開始時(shí),我們?cè)O(shè)在服務(wù)函數(shù)(landingService(int&serviceTime)/takeOffService(int&serviceTime))中對(duì)他們進(jìn)行增加。但后來我們發(fā)現(xiàn),飛機(jī)起飛/著陸一般花費(fèi)超過一分鐘,那每架飛機(jī)起飛/著陸都會(huì)調(diào)用好幾次服務(wù)函數(shù)。而實(shí)際,每服務(wù)一架飛機(jī),長(zhǎng)度只需要加1,所以,等待隊(duì)列的長(zhǎng)度因?yàn)槲覀內(nèi)绱瞬僮?,比?shí)際長(zhǎng)了許多。解決方法是,我們把操作放在檢查服務(wù)方法checkLandingPlane()/checkLandingPlane()中,當(dāng)檢查到符合接受條件的服務(wù),把飛機(jī)放入等待隊(duì)列時(shí),同時(shí)增加等待隊(duì)列長(zhǎng)度和總長(zhǎng)度。并且,在服務(wù)函數(shù)中增加變量倒計(jì)時(shí)記錄給該飛機(jī)起飛/著陸花費(fèi)的時(shí)間,當(dāng)時(shí)間為0,即飛機(jī)完成起飛/著陸時(shí),減少等待隊(duì)列的長(zhǎng)度1.3.2.4難點(diǎn)四extraTakeOffNum和extraLandingNum的計(jì)算。這兩個(gè)參數(shù)指的是機(jī)場(chǎng)運(yùn)營(yíng)時(shí)間結(jié)束后起飛的飛機(jī)和著陸的飛機(jī)數(shù)量。計(jì)算方法為:extraTakeOffNum=takeOffNum-num1;extraLandingNum=landingNum-num2;用起飛和著陸的飛機(jī)總數(shù)量減去飛機(jī)運(yùn)營(yíng)時(shí)間結(jié)束時(shí)飛機(jī)起飛和著陸的飛機(jī)數(shù)量,這樣就得到了extraTakeOffNum和extraLandingNum。怎么來定義num1和num2呢?Num1和num2在每一次服務(wù)一架飛機(jī)時(shí)都會(huì)做加一操作,即這兩個(gè)值的加一操作在landingService(int&serviceTime)和takeOffService(int&serviceTime)方法中進(jìn)行的。而在run()方法中,還要調(diào)用這兩個(gè)方法為額外的飛機(jī)進(jìn)行服務(wù),這里面又要對(duì)num1和num2做加一操作,所以必須在為額外的飛機(jī)服務(wù)之前就計(jì)算extraTakeOffNum和extraLandingNum的值,這是一個(gè)巧妙的地方也是個(gè)難點(diǎn)。這樣num1和num2代表的就是機(jī)場(chǎng)運(yùn)營(yíng)時(shí)間結(jié)束前飛機(jī)起飛和著陸的數(shù)量。3.3印象最深刻的錯(cuò)誤及修正方法問題:輸出的跑道的繁忙程度為0,這是一個(gè)很奇怪的事情。只要有一架起飛或者著陸的飛機(jī),跑道的繁忙程度就不可能為0。我們進(jìn)行了對(duì)計(jì)算跑道繁忙程度的各個(gè)部分的測(cè)試。busyLevel=(double)(takeOffNum*takeOffTime+landingNum*landingTime)/totalWorkTime這個(gè)是跑道繁忙程度的計(jì)算公式。即起飛飛機(jī)的總數(shù)量乘以起飛所需要的時(shí)間加上著陸飛機(jī)的總數(shù)量乘以著陸所需要的時(shí)間得到的總時(shí)間(理解為跑道占用的時(shí)間),除以機(jī)場(chǎng)總的工作時(shí)間。出錯(cuò)結(jié)果如下:調(diào)試過程:經(jīng)過測(cè)試得知,是由于takeoffTime和landingTime為0造成的原因。由于在landingService(int&serviceTime)和takeOffService(int&serviceTime)函數(shù)中使用的參數(shù)serviceTime本質(zhì)上就是起飛或著陸所需要的時(shí)間,調(diào)用這兩個(gè)函數(shù)時(shí),其參數(shù)也使用takeoffTime和landingTime來傳遞。但是在這兩個(gè)函數(shù)的內(nèi)部,serviceTime是會(huì)改變的,會(huì)不斷減小到0,所以takeoffTime和landingTime這個(gè)本來輸入時(shí)固定的值就會(huì)變成0。再使用這兩個(gè)值計(jì)算跑道繁忙程度時(shí),結(jié)果始終為0。解決方法:使用兩個(gè)變量t1,t2來保存takeoffTime和landingTime的值,使這兩個(gè)值在輸入以后始終不變。在調(diào)用landingService(int&serviceTime)和takeOffService(int&serviceTime)方法時(shí)也直接使用t1,t2來作為參數(shù)。調(diào)試結(jié)果如下:跑道繁忙程度不再是0。測(cè)試結(jié)果4.1正常運(yùn)行4.1.1不修改工作時(shí)間4.1.2修改工作時(shí)間4.1.3輸入錯(cuò)誤的工作時(shí)間4.2邊界數(shù)據(jù)測(cè)試4.2.1輸入全部為04.2.2每小時(shí)著陸飛機(jī)為04.2.3每小時(shí)起飛飛機(jī)為04.2.4起飛時(shí)間,著陸時(shí)間為04.2.5每小時(shí)起飛/著陸飛機(jī)為100004.2.6飛機(jī)工作時(shí)間為0后期擴(kuò)展程序里我們將機(jī)場(chǎng)工作時(shí)間分成了:高峰期,空閑期,平常期。高峰期,空閑期飛機(jī)起飛和著陸的頻率,相對(duì)于平常期來說我們?cè)O(shè)為固定值,程序運(yùn)行時(shí),用戶不能修改。同時(shí),高峰期,空閑期的時(shí)間段也是我們預(yù)先設(shè)置好的,用戶在程序運(yùn)行時(shí)不能進(jìn)行修改。所以后期,我們可以增加兩個(gè)方法來實(shí)現(xiàn)修改高峰期/空閑期相對(duì)于平常期的頻率(畢竟,每天的比率不一定固定),和實(shí)現(xiàn)修改高峰期,空閑期的時(shí)間段。同時(shí),程序只模擬了一個(gè)跑道的情況,后期可以使用隊(duì)列管理跑道,實(shí)現(xiàn)多跑道的飛機(jī)場(chǎng)運(yùn)營(yíng)模擬。源代碼6.1類設(shè)計(jì)Timer.h#ifndefTIMER#defineTIMERclassTimer{public: Timer(); Timer(intinitTime); voidsetWorkTime(intmin);//設(shè)置機(jī)場(chǎng)的工作時(shí)間 voidtick(); intRemianingTime()const;//獲得當(dāng)天機(jī)場(chǎng)剩余的工作時(shí)間(以分鐘表示)private: intminutes;//機(jī)場(chǎng)的工作時(shí)間(按分鐘表示)};#endifPlane.h#include"Time.h"#ifndefPLANE#definePLANEclassPlane{ public: Plane(); Plane(constTimer&t); intgetWaitStartTime()const;//得到飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間 voiddisplay(ostream&out)const; private: intwaitStartTime;//飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間(用于后期計(jì)算等待時(shí)間)};#endifSimulation.h#include<iostream>#include<ctime>#include<cstdlib>#include<queue>usingnamespacestd;#ifndefSIMULATION#defineSIMULATION#include"Time.h"#include"Plane.h"structTimeElement{ inthour; intmin;};classSimulation{ private: //--輸入 doublelandingRate; //飛機(jī)著陸速率 doubletakeOffRate; //飛機(jī)起飛速率 inttakeOffTime; //飛機(jī)起飛所需時(shí)間 intlandingTime; //飛機(jī)著地所需時(shí)間 inttotalWorkTime;//機(jī)場(chǎng)每天的工作時(shí)間。設(shè)為變量是為了節(jié)假日,不同季節(jié),可以更改工作時(shí)間。 structTimeElementstartTime;//每天工作的開始時(shí)間 structTimeElementendTime; //每天工作的結(jié)束時(shí)間 structTimeElementbusyStart; structTimeElementbusyEnd;//每天高峰期的時(shí)段 structTimeElementfreeStart; structTimeElementfreeEnd;//每天空閑期的時(shí)段 //--輸出 inttakeOffNum; //總的起飛飛機(jī)數(shù)量 intlandingNum; //總的著陸飛機(jī)數(shù)量 intwaitFlyLength; //等待起飛隊(duì)列長(zhǎng)度 intwaitLandingLength; //等待著陸隊(duì)列長(zhǎng)度 intwaitFlySum; //等待起飛隊(duì)列長(zhǎng)度之和 intwaitLandingSum; //等待著陸隊(duì)列長(zhǎng)度之和 doublewaitLandingTimeSum; //著陸飛機(jī)等待時(shí)間之和 doublewaitTakeOffTimeSum; //起飛飛機(jī)等待時(shí)間之和 doublebusyLevel;//跑道繁忙程度 intextraTakeOffNum;//運(yùn)營(yíng)時(shí)間結(jié)束后,在等待隊(duì)列中需要起飛的飛機(jī)數(shù)量intextraLandingNum;//運(yùn)營(yíng)時(shí)間結(jié)束后,在等待隊(duì)列中需要著陸的飛機(jī)數(shù)量 intnum1,num2;//用來記錄起飛的飛機(jī)數(shù)目與著陸的飛機(jī)數(shù)目; //--倒計(jì)時(shí)時(shí)鐘 TimerairTimer; //--等待服務(wù)的飛機(jī)隊(duì)列 queue<Plane>takeOffQueue;//起飛隊(duì)列,元素類型為飛機(jī)類型 queue<Plane>landingQueue; //著陸隊(duì)列,元素類型為飛機(jī)類型 public: Simulation(); //創(chuàng)建一個(gè)Simulation對(duì)象 voidrun(); //運(yùn)行仿真 voiddisplay(ostream&out); //顯示仿真結(jié)果 voidlandingService(int&serviceTime);//為需要著陸的飛機(jī)提供服務(wù) voidtakeOffService(int&serviceTime); //為需要起飛的飛機(jī)提供服務(wù) voidcheckLandingPlane(); //檢查是否有新的等待著陸的飛機(jī)進(jìn)入隊(duì)列 voidcheckTakeOffPlane(); //檢查是否有新的等待起飛的飛機(jī)進(jìn)入隊(duì)列 voidsetTotalWorkTime();//設(shè)置機(jī)場(chǎng)每天的工作時(shí)間 inttoMinute(TimeElementt1,TimeElementt2);//獲得以分鐘表示的每天工作時(shí)間 voidsetRate(intflag);//更改起飛或者著陸頻率(模擬高峰期與空閑期) //t1,t2表示高峰期/空閑期開始,結(jié)束時(shí)間,flag區(qū)分高峰期/空閑期};#endif6.2方法實(shí)現(xiàn)Timer.cpp#include"Time.h"#include<iostream>#include<assert.h>usingnamespacestd;Timer::Timer(){ minutes=0;}Timer::Timer(intinitTime){ assert(initTime>=0);//設(shè)置機(jī)場(chǎng)的工作時(shí)間,當(dāng)輸入時(shí)間出錯(cuò),小于0時(shí),終止程序 minutes=initTime;}voidTimer::setWorkTime(intmin){ assert(min>=0); minutes=min;}voidTimer::tick()//注意要在此處來處理隊(duì)列長(zhǎng)度的有關(guān)信息{ minutes--;}intTimer::RemianingTime()const{ returnminutes;}Plane.cpp#include<iostream>#include"Time.h"usingnamespacestd;#include"Plane.h"Plane::Plane(){ waitStartTime=0;}Plane::Plane(constTimer&t){ waitStartTime=t.RemianingTime();}intPlane::getWaitStartTime()const//得到飛機(jī)進(jìn)入等待隊(duì)列的時(shí)間{ returnwaitStartTime;}voidPlane::display(ostream&out)const{ out<<"WaitingStartTimeis:"<<waitStartTime<<endl;}Simulation.cpp#include<iostream>#include<cstdlib>#include<ctime>usingnamespacestd;#include"Simulation.h"http://構(gòu)造函數(shù)的定義Simulation::Simulation(){ startTime.hour=9;//默認(rèn)設(shè)置機(jī)場(chǎng)運(yùn)行時(shí)間為9:00~22:00如要更改,可在后期調(diào)用setTotalWorkTime()函數(shù) startTime.min=0; endTime.hour=22; endTime.min=0; busyStart.hour=9; busyStart.min=30; busyEnd.hour=13; busyEnd.min=30; freeStart.hour=21; freeStart.min=30; freeEnd.hour=24; freeEnd.min=0; num1=0; num2=0; totalWorkTime=toMinute(startTime,endTime); cout<<"請(qǐng)輸入每小時(shí)著陸的飛機(jī)數(shù)量:(架/小時(shí))"; intdownPlanesPerHour; cin>>downPlanesPerHour; landingRate=downPlanesPerHour/60.0; //飛機(jī)著陸速率 cout<<"請(qǐng)輸入每小時(shí)起飛的飛機(jī)數(shù)量:(架/小時(shí))"; intupPlanesPerHour; cin>>upPlanesPerHour; takeOffRate=upPlanesPerHour/60.0;//飛機(jī)起飛速率 cout<<"請(qǐng)輸入一架飛機(jī)開始起飛到離開跑道所需時(shí)間:(分鐘)"; cin>>takeOffTime; //輸入飛機(jī)起飛所需時(shí)間 cout<<"請(qǐng)輸入一架飛機(jī)開始降落到安全著陸所需時(shí)間:(分鐘)"; cin>>landingTime; //輸入飛機(jī)著地所需時(shí)間 takeOffNum=0; //總的起飛飛機(jī)數(shù)量 landingNum=0; //總的著陸飛機(jī)數(shù)量 waitFlyLength=0; //起飛飛機(jī)等待隊(duì)列長(zhǎng)度 waitLandingLength=0; //著陸飛機(jī)等待隊(duì)列長(zhǎng)度 waitFlySum=0; //起飛飛機(jī)等待隊(duì)列長(zhǎng)度之和 waitLandingSum=0; //著陸飛機(jī)等待隊(duì)列長(zhǎng)度之和 waitLandingTimeSum=0; //起飛飛機(jī)等待時(shí)間之和 waitTakeOffTimeSum=0; //著陸飛機(jī)等待時(shí)間之和 extraTakeOffNum=0;//運(yùn)營(yíng)時(shí)間結(jié)束后,在等待隊(duì)列中需要起飛的飛機(jī)數(shù)量extraLandingNum=0;//運(yùn)營(yíng)時(shí)間結(jié)束后,在等待隊(duì)列中需要著陸的飛機(jī)數(shù)量 setTotalWorkTime();//設(shè)置機(jī)場(chǎng)總的工作時(shí)間,以表示不同時(shí)段是處于高峰期還是空閑期 airTimer.setWorkTime(totalWorkTime);//設(shè)置倒計(jì)時(shí)時(shí)鐘 longseed=long(time(0));//初始化隨機(jī)數(shù)生成器 srand(seed);}intSimulation::toMinute(TimeElementt1,TimeElementt2){ inthours,minutes; hours=t2.hour-t1.hour; minutes=t2.min-t1.min; returnhours*60+minutes;}voidSimulation::setRate(intflag){ if(flag==1) { landingRate*=1.5; takeOffRate*=1.5; } if(flag==0) { landingRate*=0.5; takeOffRate*=0.5; }}voidSimulation::setTotalWorkTime() { intflag; structTimeElementstart,end; cout<<"\n\n本日機(jī)場(chǎng)的工作時(shí)間為:"<<startTime.hour<<":"; if(startTime.min<10) cout<<"0"; cout<<startTime.min<<"~"<<endTime.hour<<":"; if(endTime.min<10) cout<<"0"; cout<<endTime.min<<endl<<endl; cout<<"請(qǐng)問您是否需要更改工作時(shí)間,更改請(qǐng)輸入1,否則輸入任意數(shù)\n"; cin>>flag; if(flag==1) { cout<<"請(qǐng)輸入本日的開始時(shí)間與結(jié)束時(shí)間(使用24小時(shí)制)\n\n"; cout<<"輸入工作時(shí)間開始的時(shí)鐘數(shù),分鐘數(shù)\n"; cin>>start.hour>>start.min; cout<<"\n輸入工作時(shí)間結(jié)束的時(shí)鐘數(shù),分鐘數(shù)\n"; cin>>end.hour>>end.min; cout<<"\n";//檢查輸入的時(shí)間是否正確,正確則修改工作時(shí)間,否則咀嚼修改 if((start.hour>=0&&start.hour<=24)&&(start.min>=0&&start.min<=60)&& (end.hour>=0&&end.hour<=24)&&(end.min>=0&&end.min<=60)){ startTime.hour=start.hour; startTime.min=start.min; endTime.hour=end.hour; endTime.min=end.min; totalWorkTime=toMinute(startTime,endTime); cout<<"您更改了機(jī)場(chǎng)每天的工作時(shí)間!\n"; } else cout<<"時(shí)間輸入錯(cuò)誤!保持工作時(shí)間不變\n"; cout<<"飛機(jī)場(chǎng)工作時(shí)間為:"<<startTime.hour<<":"; if(startTime.min<10) cout<<"0"; cout<<startTime.min<<"~"<<endTime.hour<<":"; if(endTime.min<10) cout<<"0"; cout<<endTime.min<<endl; cout<<"\n\n\n"; }}voidSimulation::run(){ inttime1,time2,time3,time4; intflag=1; intt1,t2;//用來保存飛機(jī)起飛需要的時(shí)間和著陸需要的時(shí)間 doublerate1,rate2;//暫存飛機(jī)起飛/著陸的頻率 t1=takeOffTime; t2=landingTime; rate1=takeOffRate; rate2=landingRate; time1=toMinute(busyStart,endTime);//機(jī)場(chǎng)高峰期開始到機(jī)場(chǎng)關(guān)閉的總時(shí)間的分鐘數(shù) time2=toMinute(busyEnd,endTime);//機(jī)場(chǎng)高峰期結(jié)束到機(jī)場(chǎng)關(guān)閉的總時(shí)間的分鐘數(shù) time3=toMinute(freeStart,endTime);//機(jī)場(chǎng)空閑期開始到機(jī)場(chǎng)關(guān)閉的總時(shí)間的分鐘數(shù) time4=toMinute(freeEnd,endTime);//機(jī)場(chǎng)空閑期開始到機(jī)場(chǎng)關(guān)閉的總時(shí)間的分鐘數(shù) while(airTimer.RemianingTime()>0) { if(airTimer.RemianingTime()<=time1&&airTimer.RemianingTime()>=time2) { if(flag==1) { cout<<"現(xiàn)在時(shí)刻為:"<<busyStart.hour<<":"<<busyStart.min<<"\n"; setRate(1);//將起飛/著陸頻率更改成高峰期頻率 cout<<"機(jī)場(chǎng)處于高峰期\n\n"; flag--; } } if(airTimer.RemianingTime()==time2) { cout<<"現(xiàn)在時(shí)刻為:"<<busyEnd.hour<<":"<<busyEnd.min<<"\n"; cout<<"高峰期結(jié)束\n\n"; flag=1; takeOffRate=rate1;//將起飛/著陸頻率改回正常頻率 landingRate=rate2; } if(airTimer.RemianingTime()<=time3&&airTimer.RemianingTime()>=time4) { if(flag==1) { cout<<"現(xiàn)在時(shí)刻為:"<<freeStart.hour<<":"<<freeStart.min<<"\n"; setRate(0);//將起飛/著陸頻率更改成空閑期頻率 cout<<"機(jī)場(chǎng)現(xiàn)在處于空閑期\n\n"; flag--; } } if(airTimer.RemianingTime()==time4) { cout<<"現(xiàn)在時(shí)刻為:"<<freeEnd.hour<<":"<<freeEnd.min<<"\n"; cout<<"空閑期結(jié)束\n\n"; flag=1; takeOffRate=rate1; landingRate=rate2; } checkLandingPlane(); checkTakeOffPlane(); if(!landingQueue.empty()) { landingService(t2); } elseif(!takeOffQueue.empty()) { takeOffService(t1); } else airTimer.tick(); } cout<<"現(xiàn)在時(shí)刻為:"<<endTime.hour<<":"; if(endTime.min<10) cout<<"0"; cout<<endTime.min<<"\n"; cout<<"本日工作時(shí)間到點(diǎn),機(jī)場(chǎng)即將停止運(yùn)營(yíng),不再接受飛機(jī)請(qǐng)求了。"<<endl; extraTakeOffNum=takeOffNum-num1; extraLandingNum=landingNum-num2; while(!landingQueue.empty())//運(yùn)營(yíng)結(jié)束后,為接受請(qǐng)求的等待的飛機(jī)提供服務(wù) { landingService(t2); } while(!takeOffQueue.empty()) { takeOffService(t1); } //輸出結(jié)果 display(cout);}//display()定義voidSimulation::display(ostream&out){ doubleavgWaitFly=(double)waitFlySum/totalWorkTime; //起飛飛機(jī)平均等待隊(duì)列的長(zhǎng)度 doubleavgWaitLandi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論