版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
機場航空管制模擬實驗報告
目錄機場航空管制模擬實驗報告 1實驗題目 41. 實驗內(nèi)容分析 41.1實驗?zāi)康?41.2內(nèi)容分析 41.3程序基本流程 51.4基本數(shù)據(jù)結(jié)構(gòu),類設(shè)計 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. 實驗驗證分析 112.1輸入的形式和輸入值的范圍 112.2輸出的形式 122.3程序所能達到的功能 122.4測試數(shù)據(jù) 133. 調(diào)試分析 133.1遇到的問題及解決方法 133.1.1問題1 133.1.2問題2 143.1.3問題3 173.2技術(shù)難點分析 173.2.1難點一 173.2.2難點二 183.2.3難點三 183.2.4難點四 183.3印象最深刻的錯誤及修正方法 184. 測試結(jié)果 214.1正常運行 214.1.1不修改工作時間 214.1.2修改工作時間 224.2邊界數(shù)據(jù)測試 234.2.1輸入全部為0 234.2.2每小時著陸飛機為0 244.2.3每小時起飛飛機為0 254.2.4起飛時間,著陸時間為0 264.2.5每小時起飛/著陸飛機為10000 274.2.6飛機工作時間為0 285. 后期擴展 286. 源代碼 286.1類設(shè)計 286.2方法實現(xiàn) 31
實驗題目假設(shè)機場有一條跑道,每架飛機需花費一定時間著陸,花費一定時間起飛,飛機的起降滿足一定的概率。一般來講,機場存在兩個隊列,一個等待著陸的飛機隊列和一個等待起飛的飛機隊列,同樣等待時間下,等待著陸的飛機比準備起飛的飛機具有更高的優(yōu)先級。試編寫程序模擬這個機場的運行。要求使用隊列或優(yōu)先隊列實現(xiàn);要求可以變換起飛和著陸頻率來模擬一天中的飛行高峰期和空閑期;要求可以改變著陸和起飛時間以模擬不同的效果。實驗內(nèi)容分析1.1實驗?zāi)康膶嶒災(zāi)M了機場的航空管制,通過程序,來模擬管理飛機的起飛與著陸。它要求我們考慮起飛與著陸的優(yōu)先級不同,以及根據(jù)飛機起飛/著陸時間,起飛/著陸頻率模擬機場一天的運營情況。并計算出跑道的繁忙程度、著陸飛機的總的等待時間和平均等待時間、起飛飛機的總的等待時間和平均等待時間,計算每架飛機花費在一個隊列中的平均時間。1.2內(nèi)容分析 系統(tǒng)主要模擬了機場一天的運營。所以,需要一個計時器來倒計時計算機場的運營時間。同時,為了管理飛機的起飛與著陸,需要兩個隊列來存放著陸,起飛的飛機。整個系統(tǒng)采用分鐘來計時。 設(shè)計用戶輸入的數(shù)據(jù)為:每小時起飛/著陸的飛機數(shù),飛機起飛/著陸需要的時間。通過每小時起飛/著陸的飛機數(shù)我們可以得到飛機起飛/著陸的頻率??紤]到機場的高峰期,與空閑期,設(shè)計了方法setRate()改變飛機起飛/著陸的頻率,和高峰期時間與空閑期時間,。當進入高峰期/空閑期時,調(diào)用setRate()方法。同時,考慮到夏令時,冬令時,以及節(jié)假日客運高峰,機場需要更改工作時間。我們設(shè)計了方法setTotalWorkTime(),它先輸出預設(shè)好的工作時間,再詢問用戶是否需要更改工作時間。另外,方法toMinute(),計算每日的工作時間,并轉(zhuǎn)成分鐘形式返回,以方便倒計時器來計算時間。同時,為了使飛機的著陸與起飛更接近現(xiàn)實,設(shè)計checkTakeOffPlane()和checkLandingPlane()方法,采用隨機數(shù)來得到飛機的請求。當產(chǎn)生的著陸到達隨機數(shù)小于起飛/著陸的頻率時,接受請求,并將該請求飛機放入起飛/著陸的隊列中。同時,將飛機等待著陸/起飛的隊列長度(waitLandingLength/waitFlyLength),著陸/起飛飛機數(shù)目(landingNum/takeOffNum),等待起飛/著陸隊列總長度(waitFlySum/waitLandingSum)相應(yīng)的加1。設(shè)計Timer類,其主要方法是實現(xiàn)計時功能和返回剩余工作時間。Plane類主要功能是記錄飛機請求接受的時間,方便我們后期計算該飛機的等待服務(wù)時間。飛機起飛/著陸都需要花費一定的時間,并不是馬上就完成的。所以在起飛/著陸服務(wù)函數(shù)中,不僅要調(diào)用倒計時方法tick(),還需要判斷serviceTime是否結(jié)束。當serviceTime>0時,說明飛機還在準備著陸/起飛,占用了跑道。當serviceTime=0時,表示飛機著陸/起飛成功。調(diào)用pop方法,從隊列中刪除一架等待服務(wù)的飛機,并獲取當前時間,減去飛機接受服務(wù)的時間,得到該飛機的等待服務(wù)時間。我們就可以計算出所有飛機的等待服務(wù)時間。等待起飛/著陸隊列總長度(waitFlySum/waitLandingSum),等待服務(wù)總時間,以及服務(wù)起飛/著陸的飛機總數(shù),我們就可以得出起飛/著陸飛機的平均等待時間,平均等待隊列長度。同時根據(jù)當天的的工作時間,飛機起飛/著陸的數(shù)目以及飛機起飛/著陸花費是時間,可以計算得到跑道的繁忙程度。1.3程序基本流程圖1實驗基本流程1.4基本數(shù)據(jù)結(jié)構(gòu),類設(shè)計1.4.1類Simulation輸入:變量名備注doublelandingRate飛機著陸速率doubletakeOffRate飛機起飛速率inttakeOffTime飛機起飛所需時間intlandingTime飛機著地所需時間inttotalWorkTime機場每天的工作時間structTimeElementstartTime每天工作的開始時間structTimeElementendTime每天工作的結(jié)束時間structTimeElementbusyStart每天高峰期的時段structTimeElementbusyEndstructTimeElementfreeStart每天空閑期的時段structTimeElementfreeEndintt1,t2用來保存飛機起飛需要的時間和著陸需要的時間輸出變量名備注inttakeOffNum 總的起飛飛機數(shù)量intlandingNum總的著陸飛機數(shù)量intwaitLandingLength等待著陸隊列長度intwaitFlyLength等待起飛隊列長度intwaitFlySum等待起飛隊列長度之和intwaitLandingSum等待著陸隊列長度之和doublewaitLandingTimeSum著陸飛機等待時間之和doublewaitTakeOffTimeSum起飛飛機等待時間之和doublebusyLevel跑道繁忙程度intextraTakeOffNum運營時間結(jié)束后,在等待隊列中需要起飛的飛機數(shù)量intextraLandingNum運營時間結(jié)束后,在等待隊列中需要著陸的飛機數(shù)量intnum1,num2用來記錄起飛的飛機數(shù)目與著陸的飛機數(shù)目TimerairTimer倒計時時鐘queue<Plane>takeOffQueue起飛隊列,元素類型為飛機類型queue<Plane>landingQueue著陸隊列,元素類型為飛機類型成員方法名備注Simulation()創(chuàng)建一個Simulation對象voidrun()運行仿真voiddisplay(ostream&out)顯示仿真結(jié)果voidlandingService(int&serviceTime)為需要著陸的飛機提供服務(wù)voidtakeOffService(int&serviceTime)為需要起飛的飛機提供服務(wù)voidcheckLandingPlane()檢查是否有新的等待著陸的飛機進入隊列voidcheckTakeOffPlane()檢查是否有新的等待起飛的飛機進入隊列voidsetTotalWorkTime()設(shè)置機場每天的工作時間InttoMinute(TimeElementt1,TimeElementt2)獲得以分鐘表示的每天工作時間t1,t2表示高峰期/空閑期開始,結(jié)束時間,flag區(qū)分高峰期/空閑期voidsetRate(intflag)更改起飛或者著陸頻率(模擬高峰期與空閑期1.4.2類Plane成員:方法名備注intgetWaitStartTime()const得到飛機進入等待隊列的時間intwaitStartTime飛機進入等待隊列的時間(用于后期計算等待時間)1.4.3類Timer成員:方法名備注voidsetWorkTime(intmin)設(shè)置機場的工作時間voidtick();intRemianingTime()const獲得當天機場剩余的工作時間(以分鐘表示)intminutes機場的工作時間(按分鐘表示)1.4.4結(jié)構(gòu)TimeElement成員:變量名備注inthour小時intmin分鐘1.5基本函數(shù)功能1.5.1類Simulationrun():run方法中調(diào)用了toMinute函數(shù)將時間轉(zhuǎn)化為分鐘數(shù),來表示高峰期和空閑期時段。定義了四個變量來表示高峰期和空閑期的開始時間和結(jié)束時間,默認設(shè)置高分期的開始時間和結(jié)束時間為9:30和13:30,空閑期的開始時間和結(jié)束時間為21:30和24:00。當處于高峰期時段和空閑期,就輸出此刻時間,并改變飛機著陸和起飛的速率。通過setRate()來改變飛機的速率,高峰期時,飛機著陸和起飛的速率變?yōu)樵瓉淼?.5倍,而處于空閑期時,速率變?yōu)樵瓉?.5倍。這樣就標識了高峰期和空閑期。接著調(diào)用checkLandingPlane()和checkTakeOffPlane()來檢查是否有需要著陸或起飛的飛機,只要著陸的隊列不為空,就為著陸的飛機提供服務(wù),然后再檢查起飛隊列,只要隊列不為空,就為需要起飛的飛機服務(wù)。體現(xiàn)了著陸的飛機優(yōu)先的原則。這里調(diào)用了landingService(int&serviceTime)和takeOffService(int&serviceTime)函數(shù),由于這兩個函數(shù)每次服務(wù)時都使用了倒計時時鐘進行倒計時,所以當兩個隊列不為空時,不需要倒計時。而當兩個隊列都為空時,但機場工作時間還沒到時,使用倒計時時鐘繼續(xù)計時。當機場運營時間結(jié)束時,輸出此刻的時間,并不再接受飛機的請求。若著陸和起飛隊列中還有需要服務(wù)的飛機,就繼續(xù)調(diào)用landingService(int&serviceTime)和takeOffService(int&serviceTime)函數(shù)來為飛機進行服務(wù),直到兩個隊列都為空。同時計算出extraTakeOffNum和extraLandingNum的值,表示機場運營時間結(jié)束額外服務(wù)的飛機數(shù),分別等于總的飛機數(shù)減去在為額外的飛機服務(wù)之前的飛機數(shù)。使用num1和num2兩個變量來表示機場運營時間結(jié)束時的飛機數(shù),它們都會在service函數(shù)中做++操作。最后使用display()函數(shù)輸出仿真結(jié)果。display(ostream&out):該函數(shù)主要用于計算一些值,并輸出在屏幕上。起飛隊列的平均等待時間avgWaitFly=起飛飛機等待隊列長度之和waitFlySum/機場總的工作時間totalWorkTime著陸隊列的平均等待時間avgWaitLanding=著陸飛機等待隊列長度之和waitLandingSum/機場總的工作時間totalWorkTime平均等待起飛時間avgWaitTakeOffTime=起飛隊列等待時間之和waitTakeOffTimeSum/總的起飛飛機數(shù)量takeOffNum(當總的起飛飛機的數(shù)量不為0時)平均等待著陸時間avgWaitLandingTime=著陸隊列等待時間之和waitLandingTimeSum/總的著陸飛機數(shù)量landingNum(當總的著陸飛機的數(shù)量不為0時)跑道繁忙程度:busyLevel=(double)(takeOffNum*takeOffTime+landingNum*landingTime)/totalWorkTime即飛機總的使用跑道的時間除以總時間,這個總時間只是機場的運營時間,不包括運營時間結(jié)束后加班給飛機服務(wù)的時間,所以跑道繁忙程度很有可能大于1。再使用輸出語句輸出這些值。voidlandingService(int&serviceTime):這個函數(shù)的參數(shù)serviceTime就是飛機著陸所需的時間,飛機著陸所需的時間是自己再在控制臺輸入的。如果serviceTime>0,表明上一架著陸的飛機還沒有著陸,要將倒計時時鐘倒計時。否則服務(wù)下一架需要著陸飛機,nextplane定義為位于著陸隊列頭的飛機,調(diào)用隊列的front()函數(shù)表示。將這架飛機從隊列中刪掉。此時將serviceTime定義為下一架飛機的著陸時間,表明服務(wù)開始。waitLandingTimeSum+=(nextPlane.getWaitStartTime()-airTimer.RemianingTime())同時著陸飛機等待時間之和加上這一架飛機的等待時間。這一架飛機的等待時間為這架飛機進入等待隊列的時間—當前時間。利用plane類的getWaitStartTime()函數(shù)來獲得飛機進入著陸隊列的時間。倒計時時鐘倒計時一分鐘,著陸隊列減一,用來保存發(fā)到機場運營時間結(jié)束時著陸飛機總數(shù)的變量做加一操作。voidtakeOffService(int&serviceTime)與上一個函數(shù)原理完全相同,在這里不作具體描述。voidcheckLandingPlane()利用系統(tǒng)提供的隨機數(shù)生成器的rand()方法來產(chǎn)生隨機數(shù)x,當x小于飛機著陸的頻率,就使一架飛機進入等待著陸隊列,等待著陸隊列長度waitLandingLength加一。調(diào)用Plane的帶參數(shù)的函數(shù),參數(shù)類型為Timer類型的,目的是將當前時間RemianingTime()賦給飛機進入隊列開始等待的時間waitStartTime。著陸飛機的數(shù)量加一,并將新的這架飛機push到隊列尾部,等待著陸隊列之和waitLandingSum加一。voidcheckTakeOffPlane()該方法與上一個方法原理完全相同,在這里不作詳細描述voidsetTotalWorkTime()該函數(shù)用于自己修改機場的工作時間。首先,輸出機場默認的工作時間為9:00~22:00,詢問是否需要修改機場的工作時間,用flag變量標記,若輸入1則表示要改變機場工作時間。輸入更改的機場工作時間的起始時間和結(jié)束時間。要分別輸入時鐘數(shù)hour和分鐘數(shù)min,是結(jié)構(gòu)TimeElement中的兩個成員,用來分類一個時間的時鐘數(shù)和分鐘數(shù),便于輸出表示和計算兩個時間之間的總分鐘數(shù)。一個巧妙的方法使輸出的時間的形式更加好看,當分鐘數(shù)小于10時,在輸出的分鐘數(shù)之前加個“0”,這樣使時間的輸出形式就變成例如9:00~20:08。toMinute(TimeElementt1,TimeElementt2)該函數(shù)用于將一個輸入的起始時間和結(jié)束時間轉(zhuǎn)化為分鐘數(shù)。t1,t2為兩個結(jié)構(gòu)類型的變量,分別調(diào)用成員hour和min,使后一個時間的hour減去前一個時間的hour,即t2.hour—t1.hour得到一個時鐘數(shù),然后使后一個時間的min減去前一個時間的min,即t2.min—t1.min得到一個分鐘數(shù),最后用時鐘數(shù)乘以60加上分鐘數(shù)即可得到兩個時間之間的總的分鐘數(shù)。voidsetRate(intflag)該函數(shù)改變飛機著陸和起飛的頻率。用一個整型參數(shù)來標記,當flag=1時,飛機著陸頻率landingRate和飛機起飛頻率takeOffRate變成原來的1.5倍,表明是出于高峰期。當flag=0時,這兩個值又分別變成原來的0.5倍,表明是出于空閑期。1.5.2類PlanePlane()構(gòu)造函數(shù)用于初始化飛機進入等待隊列的時間waitStartTime,設(shè)為0。Plane(constTimer&t)該構(gòu)造函數(shù)帶有一個Timer類型的參數(shù),為了將飛機進入等待隊列的時間waitStartTime賦值為當前時間,也就是剩余時間t.remainingtime()。為了計算出每一架飛機的等待時間。IntgetWaitStartTime()const該函數(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,否則終止程序運行。voidtick()該函數(shù)設(shè)置倒計時時鐘,將minutes作減一操作。在其他方法中會不斷調(diào)用該函數(shù)來倒計時。intRemianingTime()const獲得機場工作的剩余時間,也可以說是當前時間,返回minutes。之后用于計算飛機的等待時間。實驗驗證分析2.1輸入的形式和輸入值的范圍變量名類型范圍輸入示例備注downPlanesPerHourInt0~6每小時飛機的著陸數(shù)量upPlanesPerHourInt0~23每小時飛機的著陸數(shù)量takeOffTimeInt0~3飛機起飛需要的時間landingTimeint0~4飛機著陸需要的時間flag(setTotalWorkTime())int0~1270區(qū)分是否更改工作時間的標識startTime.hourInt0~249工作開始時間小時startTime.minInt0~6030工作開始時間的分鐘endTime.hourInt0~2422工作結(jié)束時間的小時endTime.minInt0~6015工作結(jié)束時間的分鐘2.2輸出的形式控制臺下運行,結(jié)果輸出形式:本日機場運營情況如下: 本日機場運行情況如下:\n"; 等待起飛飛機的平均隊列長度為:XX 等待著陸飛機的平均隊列長度為:XX 總共起飛了的飛機數(shù)量為: XX架 總共著陸了的飛機數(shù)量為: XX架 運營時間結(jié)束后起飛的飛機數(shù)量為:XX架 運營時間結(jié)束后著陸的飛機數(shù)量為:XX架 起飛隊列的總等待時間為: XX分鐘 降落飛機的總等待時間為: XX分鐘 每架起飛飛機在隊列的平均等待時間:XX分鐘 每架降落飛機在隊列的平均等待時間:XX分鐘 跑道繁忙程度為:XX2.3程序所能達到的功能程序?qū)崿F(xiàn)了如下的功能:設(shè)置機場的工作時間模擬機場的運營簡單模擬機場的高峰期和空閑期計算出機場當天起飛/著陸的飛機數(shù)目計算出等待隊列(起飛/著陸)的平均長度計算隊列的平均等待時間簡單表示跑道的繁忙程度計算機場運營結(jié)束后還需服務(wù)的飛機數(shù)(起飛/著陸)2.4測試數(shù)據(jù)輸入的值:每小時著陸的飛機數(shù)(架)每小時起飛的飛機數(shù)(架)飛機著陸所需要的時間(分)飛機起飛所需要的時間(分)1.45542.66453.36874.2330325.00006.20020011輸出的值:平均隊列長度(起飛)平均隊列長度(著陸)總的飛機數(shù)量(起飛)總的飛機數(shù)量(著陸)額外的飛機數(shù)量(起飛)額外的飛機數(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è)置在到達高峰期/空閑期時,調(diào)用setRate()函數(shù)更改飛機起飛/著陸頻率,但后來發(fā)現(xiàn)程序中在更改了頻率,過了高峰期/空閑期之后,并沒有將頻率改回平常的頻率。解決方法:設(shè)置兩個臨時變量rate1,rate2保存更改前的頻率。在結(jié)束高峰期/空閑期的時刻,將takeOffRate,landingRate改回原來的值。更改前運行結(jié)果如下:更改后運行結(jié)果:3.1.2問題2問題:輸出的跑道的繁忙程度為0,這是一個很奇怪的事情。只要有一架起飛或者著陸的飛機,跑道的繁忙程度就不可能為0。我們進行了對計算跑道繁忙程度的各個部分的測試。busyLevel=(double)(takeOffNum*takeOffTime+landingNum*landingTime)/totalWorkTime這個是跑道繁忙程度的計算公式。即起飛飛機的總數(shù)量乘以起飛所需要的時間加上著陸飛機的總數(shù)量乘以著陸所需要的時間得到的總時間(理解為跑道占用的時間),除以機場總的工作時間。出錯結(jié)果如下:調(diào)試過程:經(jīng)過測試得知,是由于takeoffTime和landingTime為0造成的原因。由于在landingService(int&serviceTime)和takeOffService(int&serviceTime)函數(shù)中使用的參數(shù)serviceTime本質(zhì)上就是起飛或著陸所需要的時間,調(diào)用這兩個函數(shù)時,其參數(shù)也使用takeoffTime和landingTime來傳遞。但是在這兩個函數(shù)的內(nèi)部,serviceTime是會改變的,會不斷減小到0,所以takeoffTime和landingTime這個本來輸入時固定的值就會變成0。再使用這兩個值計算跑道繁忙程度時,結(jié)果始終為0。解決方法:使用兩個變量t1,t2來保存takeoffTime和landingTime的值,使這兩個值在輸入以后始終不變。在調(diào)用landingService(int&serviceTime)和takeOffService(int&serviceTime)方法時也直接使用t1,t2來作為參數(shù)。調(diào)試結(jié)果如下:跑道繁忙程度不再是0。3.1.3問題3在一開始調(diào)試程序時,沒有其他的編碼錯誤,一直報出上圖的連接錯誤,沒有解決的終端標志。后來經(jīng)過反復測試,這個問題時由于建的工程不對而產(chǎn)生的。我一開始建立的是Win32Application的工程。經(jīng)過百度搜索得到了錯誤的原因。產(chǎn)生這個問題可能的原因:1.我們用vc建了一個控制臺程序,它的入口函數(shù)應(yīng)該是main,而你使用了WinMain.2.我們用vc打開了一個.c/.cpp文件,然后直接編譯這個文件,這個文件中使用了WinMian而不是main作為入口函數(shù)。vc這時的默認設(shè)置是針對控制臺程序的。解決方法:應(yīng)該建立Win32ConsoleApplication的工程,指的是控制臺的應(yīng)用程序,這樣才能在控制臺上正確地輸出。這個錯誤時深刻的,會謹記在心。3.2技術(shù)難點分析3.2.1難點一一架飛機完成起飛/著陸花費一般超過一分鐘,而我們設(shè)計服務(wù)方法landingService(int&serviceTime)/takeOffService(int&serviceTime)每調(diào)用一次只花費一分鐘。那么如何來判斷對當前飛機的服務(wù)結(jié)束了呢。解決辦法是設(shè)計一個引用參數(shù)serviceTime,記錄該飛機起飛/著陸需要的時間,每調(diào)用一次服務(wù)方法,都使serviceTime減一。同時在方法中進行判斷,當serviceTime>0時,說明飛機還需要服務(wù),當serviceTime=0時,飛機起飛/著陸完成。3.2.2難點二飛機等待時間的計算。一架飛機的等待時間為從它服務(wù)被接受進入等待隊列開始到完成服務(wù)為止。我們需要一個變量來記錄飛機開始等待的時間,與結(jié)束等待的時間。出于節(jié)約內(nèi)存的考慮,我們只在plane類中設(shè)計了一個變量來存放飛機開始等待的時間。在服務(wù)方法中,倒計時結(jié)束,飛機服務(wù)完成時,我們使用Timer類中的RemianingTime()得到當前時間,與飛機開始等待時間相減。得到該飛機的服務(wù)等待時間。3.2.3難點三確定在哪個位置對等待起飛/著陸隊列長度和等待起飛/著陸隊列總長度進行增加操作。開始時,我們設(shè)在服務(wù)函數(shù)(landingService(int&serviceTime)/takeOffService(int&serviceTime))中對他們進行增加。但后來我們發(fā)現(xiàn),飛機起飛/著陸一般花費超過一分鐘,那每架飛機起飛/著陸都會調(diào)用好幾次服務(wù)函數(shù)。而實際,每服務(wù)一架飛機,長度只需要加1,所以,等待隊列的長度因為我們?nèi)绱瞬僮?,比實際長了許多。解決方法是,我們把操作放在檢查服務(wù)方法checkLandingPlane()/checkLandingPlane()中,當檢查到符合接受條件的服務(wù),把飛機放入等待隊列時,同時增加等待隊列長度和總長度。并且,在服務(wù)函數(shù)中增加變量倒計時記錄給該飛機起飛/著陸花費的時間,當時間為0,即飛機完成起飛/著陸時,減少等待隊列的長度1.3.2.4難點四extraTakeOffNum和extraLandingNum的計算。這兩個參數(shù)指的是機場運營時間結(jié)束后起飛的飛機和著陸的飛機數(shù)量。計算方法為:extraTakeOffNum=takeOffNum-num1;extraLandingNum=landingNum-num2;用起飛和著陸的飛機總數(shù)量減去飛機運營時間結(jié)束時飛機起飛和著陸的飛機數(shù)量,這樣就得到了extraTakeOffNum和extraLandingNum。怎么來定義num1和num2呢?Num1和num2在每一次服務(wù)一架飛機時都會做加一操作,即這兩個值的加一操作在landingService(int&serviceTime)和takeOffService(int&serviceTime)方法中進行的。而在run()方法中,還要調(diào)用這兩個方法為額外的飛機進行服務(wù),這里面又要對num1和num2做加一操作,所以必須在為額外的飛機服務(wù)之前就計算extraTakeOffNum和extraLandingNum的值,這是一個巧妙的地方也是個難點。這樣num1和num2代表的就是機場運營時間結(jié)束前飛機起飛和著陸的數(shù)量。3.3印象最深刻的錯誤及修正方法問題:輸出的跑道的繁忙程度為0,這是一個很奇怪的事情。只要有一架起飛或者著陸的飛機,跑道的繁忙程度就不可能為0。我們進行了對計算跑道繁忙程度的各個部分的測試。busyLevel=(double)(takeOffNum*takeOffTime+landingNum*landingTime)/totalWorkTime這個是跑道繁忙程度的計算公式。即起飛飛機的總數(shù)量乘以起飛所需要的時間加上著陸飛機的總數(shù)量乘以著陸所需要的時間得到的總時間(理解為跑道占用的時間),除以機場總的工作時間。出錯結(jié)果如下:調(diào)試過程:經(jīng)過測試得知,是由于takeoffTime和landingTime為0造成的原因。由于在landingService(int&serviceTime)和takeOffService(int&serviceTime)函數(shù)中使用的參數(shù)serviceTime本質(zhì)上就是起飛或著陸所需要的時間,調(diào)用這兩個函數(shù)時,其參數(shù)也使用takeoffTime和landingTime來傳遞。但是在這兩個函數(shù)的內(nèi)部,serviceTime是會改變的,會不斷減小到0,所以takeoffTime和landingTime這個本來輸入時固定的值就會變成0。再使用這兩個值計算跑道繁忙程度時,結(jié)果始終為0。解決方法:使用兩個變量t1,t2來保存takeoffTime和landingTime的值,使這兩個值在輸入以后始終不變。在調(diào)用landingService(int&serviceTime)和takeOffService(int&serviceTime)方法時也直接使用t1,t2來作為參數(shù)。調(diào)試結(jié)果如下:跑道繁忙程度不再是0。測試結(jié)果4.1正常運行4.1.1不修改工作時間4.1.2修改工作時間4.1.3輸入錯誤的工作時間4.2邊界數(shù)據(jù)測試4.2.1輸入全部為04.2.2每小時著陸飛機為04.2.3每小時起飛飛機為04.2.4起飛時間,著陸時間為04.2.5每小時起飛/著陸飛機為100004.2.6飛機工作時間為0后期擴展程序里我們將機場工作時間分成了:高峰期,空閑期,平常期。高峰期,空閑期飛機起飛和著陸的頻率,相對于平常期來說我們設(shè)為固定值,程序運行時,用戶不能修改。同時,高峰期,空閑期的時間段也是我們預先設(shè)置好的,用戶在程序運行時不能進行修改。所以后期,我們可以增加兩個方法來實現(xiàn)修改高峰期/空閑期相對于平常期的頻率(畢竟,每天的比率不一定固定),和實現(xiàn)修改高峰期,空閑期的時間段。同時,程序只模擬了一個跑道的情況,后期可以使用隊列管理跑道,實現(xiàn)多跑道的飛機場運營模擬。源代碼6.1類設(shè)計Timer.h#ifndefTIMER#defineTIMERclassTimer{public: Timer(); Timer(intinitTime); voidsetWorkTime(intmin);//設(shè)置機場的工作時間 voidtick(); intRemianingTime()const;//獲得當天機場剩余的工作時間(以分鐘表示)private: intminutes;//機場的工作時間(按分鐘表示)};#endifPlane.h#include"Time.h"#ifndefPLANE#definePLANEclassPlane{ public: Plane(); Plane(constTimer&t); intgetWaitStartTime()const;//得到飛機進入等待隊列的時間 voiddisplay(ostream&out)const; private: intwaitStartTime;//飛機進入等待隊列的時間(用于后期計算等待時間)};#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; //飛機著陸速率 doubletakeOffRate; //飛機起飛速率 inttakeOffTime; //飛機起飛所需時間 intlandingTime; //飛機著地所需時間 inttotalWorkTime;//機場每天的工作時間。設(shè)為變量是為了節(jié)假日,不同季節(jié),可以更改工作時間。 structTimeElementstartTime;//每天工作的開始時間 structTimeElementendTime; //每天工作的結(jié)束時間 structTimeElementbusyStart; structTimeElementbusyEnd;//每天高峰期的時段 structTimeElementfreeStart; structTimeElementfreeEnd;//每天空閑期的時段 //--輸出 inttakeOffNum; //總的起飛飛機數(shù)量 intlandingNum; //總的著陸飛機數(shù)量 intwaitFlyLength; //等待起飛隊列長度 intwaitLandingLength; //等待著陸隊列長度 intwaitFlySum; //等待起飛隊列長度之和 intwaitLandingSum; //等待著陸隊列長度之和 doublewaitLandingTimeSum; //著陸飛機等待時間之和 doublewaitTakeOffTimeSum; //起飛飛機等待時間之和 doublebusyLevel;//跑道繁忙程度 intextraTakeOffNum;//運營時間結(jié)束后,在等待隊列中需要起飛的飛機數(shù)量intextraLandingNum;//運營時間結(jié)束后,在等待隊列中需要著陸的飛機數(shù)量 intnum1,num2;//用來記錄起飛的飛機數(shù)目與著陸的飛機數(shù)目; //--倒計時時鐘 TimerairTimer; //--等待服務(wù)的飛機隊列 queue<Plane>takeOffQueue;//起飛隊列,元素類型為飛機類型 queue<Plane>landingQueue; //著陸隊列,元素類型為飛機類型 public: Simulation(); //創(chuàng)建一個Simulation對象 voidrun(); //運行仿真 voiddisplay(ostream&out); //顯示仿真結(jié)果 voidlandingService(int&serviceTime);//為需要著陸的飛機提供服務(wù) voidtakeOffService(int&serviceTime); //為需要起飛的飛機提供服務(wù) voidcheckLandingPlane(); //檢查是否有新的等待著陸的飛機進入隊列 voidcheckTakeOffPlane(); //檢查是否有新的等待起飛的飛機進入隊列 voidsetTotalWorkTime();//設(shè)置機場每天的工作時間 inttoMinute(TimeElementt1,TimeElementt2);//獲得以分鐘表示的每天工作時間 voidsetRate(intflag);//更改起飛或者著陸頻率(模擬高峰期與空閑期) //t1,t2表示高峰期/空閑期開始,結(jié)束時間,flag區(qū)分高峰期/空閑期};#endif6.2方法實現(xiàn)Timer.cpp#include"Time.h"#include<iostream>#include<assert.h>usingnamespacestd;Timer::Timer(){ minutes=0;}Timer::Timer(intinitTime){ assert(initTime>=0);//設(shè)置機場的工作時間,當輸入時間出錯,小于0時,終止程序 minutes=initTime;}voidTimer::setWorkTime(intmin){ assert(min>=0); minutes=min;}voidTimer::tick()//注意要在此處來處理隊列長度的有關(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//得到飛機進入等待隊列的時間{ 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;//默認設(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<<"請輸入每小時著陸的飛機數(shù)量:(架/小時)"; intdownPlanesPerHour; cin>>downPlanesPerHour; landingRate=downPlanesPerHour/60.0; //飛機著陸速率 cout<<"請輸入每小時起飛的飛機數(shù)量:(架/小時)"; intupPlanesPerHour; cin>>upPlanesPerHour; takeOffRate=upPlanesPerHour/60.0;//飛機起飛速率 cout<<"請輸入一架飛機開始起飛到離開跑道所需時間:(分鐘)"; cin>>takeOffTime; //輸入飛機起飛所需時間 cout<<"請輸入一架飛機開始降落到安全著陸所需時間:(分鐘)"; cin>>landingTime; //輸入飛機著地所需時間 takeOffNum=0; //總的起飛飛機數(shù)量 landingNum=0; //總的著陸飛機數(shù)量 waitFlyLength=0; //起飛飛機等待隊列長度 waitLandingLength=0; //著陸飛機等待隊列長度 waitFlySum=0; //起飛飛機等待隊列長度之和 waitLandingSum=0; //著陸飛機等待隊列長度之和 waitLandingTimeSum=0; //起飛飛機等待時間之和 waitTakeOffTimeSum=0; //著陸飛機等待時間之和 extraTakeOffNum=0;//運營時間結(jié)束后,在等待隊列中需要起飛的飛機數(shù)量extraLandingNum=0;//運營時間結(jié)束后,在等待隊列中需要著陸的飛機數(shù)量 setTotalWorkTime();//設(shè)置機場總的工作時間,以表示不同時段是處于高峰期還是空閑期 airTimer.setWorkTime(totalWorkTime);//設(shè)置倒計時時鐘 longseed=long(time(0));//初始化隨機數(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本日機場的工作時間為:"<<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<<"請問您是否需要更改工作時間,更改請輸入1,否則輸入任意數(shù)\n"; cin>>flag; if(flag==1) { cout<<"請輸入本日的開始時間與結(jié)束時間(使用24小時制)\n\n"; cout<<"輸入工作時間開始的時鐘數(shù),分鐘數(shù)\n"; cin>>start.hour>>start.min; cout<<"\n輸入工作時間結(jié)束的時鐘數(shù),分鐘數(shù)\n"; cin>>end.hour>>end.min; cout<<"\n";//檢查輸入的時間是否正確,正確則修改工作時間,否則咀嚼修改 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<<"您更改了機場每天的工作時間!\n"; } else cout<<"時間輸入錯誤!保持工作時間不變\n"; cout<<"飛機場工作時間為:"<<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;//用來保存飛機起飛需要的時間和著陸需要的時間 doublerate1,rate2;//暫存飛機起飛/著陸的頻率 t1=takeOffTime; t2=landingTime; rate1=takeOffRate; rate2=landingRate; time1=toMinute(busyStart,endTime);//機場高峰期開始到機場關(guān)閉的總時間的分鐘數(shù) time2=toMinute(busyEnd,endTime);//機場高峰期結(jié)束到機場關(guān)閉的總時間的分鐘數(shù) time3=toMinute(freeStart,endTime);//機場空閑期開始到機場關(guān)閉的總時間的分鐘數(shù) time4=toMinute(freeEnd,endTime);//機場空閑期開始到機場關(guān)閉的總時間的分鐘數(shù) while(airTimer.RemianingTime()>0) { if(airTimer.RemianingTime()<=time1&&airTimer.RemianingTime()>=time2) { if(flag==1) { cout<<"現(xiàn)在時刻為:"<<busyStart.hour<<":"<<busyStart.min<<"\n"; setRate(1);//將起飛/著陸頻率更改成高峰期頻率 cout<<"機場處于高峰期\n\n"; flag--; } } if(airTimer.RemianingTime()==time2) { cout<<"現(xiàn)在時刻為:"<<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)在時刻為:"<<freeStart.hour<<":"<<freeStart.min<<"\n"; setRate(0);//將起飛/著陸頻率更改成空閑期頻率 cout<<"機場現(xiàn)在處于空閑期\n\n"; flag--; } } if(airTimer.RemianingTime()==time4) { cout<<"現(xiàn)在時刻為:"<<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)在時刻為:"<<endTime.hour<<":"; if(endTime.min<10) cout<<"0"; cout<<endTime.min<<"\n"; cout<<"本日工作時間到點,機場即將停止運營,不再接受飛機請求了。"<<endl; extraTakeOffNum=takeOffNum-num1; extraLandingNum=landingNum-num2; while(!landingQueue.empty())//運營結(jié)束后,為接受請求的等待的飛機提供服務(wù) { landingService(t2); } while(!takeOffQueue.empty()) { takeOffService(t1); } //輸出結(jié)果 display(cout);}//display()定義voidSimulation::display(ostream&out){ doubleavgWaitFly=(double)waitFlySum/totalWorkTime; //起飛飛機平均等待隊列的長度 doubleavgWaitLandi
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度民宿場地租賃及鄉(xiāng)村旅游服務(wù)合同3篇
- 2025年度大型活動場館租賃服務(wù)合同規(guī)范3篇
- 二零二五年度版權(quán)歸屬與版權(quán)交易合同3篇
- 2025年度車間承包人力資源配置與管理協(xié)議4篇
- 個人簡易工程承包協(xié)議(2024年修訂)
- 二零二五年度冷鏈物流車輛運輸及倉儲合同4篇
- 二零二四年度虛擬現(xiàn)實內(nèi)容制作設(shè)計合同3篇
- 2025年電商公司員工培訓與保密責任協(xié)議4篇
- 二零二五年度車輛抵押擔保車輛回購合同模板4篇
- 專業(yè)化妝師合作協(xié)議(2024年修訂)
- 《社區(qū)康復》課件-第五章 脊髓損傷患者的社區(qū)康復實踐
- 繪本《圖書館獅子》原文
- 安全使用公共WiFi網(wǎng)絡(luò)的方法
- 2023年管理學原理考試題庫附答案
- 【可行性報告】2023年電動自行車相關(guān)項目可行性研究報告
- 歐洲食品與飲料行業(yè)數(shù)據(jù)與趨勢
- 放療科室規(guī)章制度(二篇)
- 中高職貫通培養(yǎng)三二分段(中職階段)新能源汽車檢測與維修專業(yè)課程體系
- 浙江省安全員C證考試題庫及答案(推薦)
- 目視講義.的知識
- 房地產(chǎn)公司流動資產(chǎn)管理制度
評論
0/150
提交評論