軟體工程第三次作業

2022-07-27 07:42:15 字數 4133 閱讀 7109

部落格資訊

瀋陽航空航天大學計算機學院2020軟體工程作業

作業要求

課程目標

熟悉乙個「高質量」軟體的開發過程

作業目標

熟悉**規範及結對互審

通過四種演算法來實現動態圖的最短路徑,由傳統演算法到新穎演算法相比,進行演算法優化。
本文主要實現了四個演算法,stl使用熟練,**思路清晰,標有注釋,封裝度不夠好,可移植性太差,沒有體現c++的程式設計思想,繼承,多型,封裝,建議多使用c++的特徵,多使用智慧型指標防止資源洩漏,多利用繼承多型體現良好的封裝性.

相關的思路就是用stream 表示 temporal graph,就是根據時間發生的先後,最早到達時間演算法,這個演算法就是根據貪心來的,只需要把temporal graph用stream表示出來,這樣就限制了發生時間的順序,然後就是根據傳統演算法dij邊的鬆弛思想去做,複雜度o(n+m),這個演算法也是基於貪心,源點s到v都是最早到達時間。

另外三個演算法(1)latest-depature paths和(2)fastest paths 及其優化演算法,(1)根據演算法1,將所有的邊倒過來,反過來排序,然後就是和演算法1的過程一樣了,思想和證明都是類似,(2)演算法是根據 演算法一和(2)演算法的定義來的,就是給定初始的出發時間,那麼路上花的時間就是t[v]-t,注意這裡的出發時間是源點s與之相鄰邊的初始時間,不是演算法中的tmin,所以需要多加乙個for迴圈來限制這個初始時間,然後進行演算法1的過程,複雜度o(s(n+m)),那麼改進演算法就是引入了乙個l集合,裡面有s[v],a[v],s[v]是初始時間,a[v]是到達時間,那麼a[v]-s[v]就可以用來更新s[v]了,複雜度o(n+m*logc)。

總的來說,此**很好的體現了對演算法的理解,以及對於效率的追求。通過層層優化演算法,將問題的求解深入到演算法層面。

根據**評價標準,**條理性較好,演算法封裝度比較好,易於移植。

功能模組名稱

動態圖最短路徑演算法

審查人姜智文

審查日期

2020.04.13

**名稱

動態圖最短路徑演算法

**作者

潘室澤檔案結構

重要性審查項

結論標頭檔案和定義檔案的名稱是否合理?

是標頭檔案和定義檔案的目錄結構是否合理?

是版權和版本宣告是否完整?無重要

標頭檔案是否使用了 ifndef/define/endif 預處理塊?

是標頭檔案中是否只存放「宣告」而不存放「定義」

無程式的版式

重要性審查項

結論空行是否得體?

是**行內的空格是否得體?

是長行拆分是否得體?

是「」 是否各佔一行並且對齊於同一列?是重要

一行**是否只做一件事?如只定義乙個變數,只寫一條語句。是重要

if、for、while、do等語句自佔一行,不論執行語句多少都要加 「{}」。是重要

在定義變數(或引數)時,是否將修飾符 * 和 & 緊靠變數名?注釋是否清晰並且必要?是重要

注釋是否有錯誤或者可能導致誤解?否重要

類結構的public, protected, private順序是否在所有的程式中保持一致?

無命名規則

重要性審查項

結論重要

命名規則是否與所採用的作業系統或開發工具的風格保持一致?

是識別符號是否直觀且可以拼讀?

是識別符號的長度應當符合「min-length && max-information」原則?是重要

程式中是否出現相同的區域性變數和全部變數?

是類名、函式名、變數和引數、常量的書寫格式是否遵循一定的規則?

是靜態變數、全域性變數、類的成員變數是否加字首?

是表示式與基本語句

重要性審查項

結論重要

如果**行中的運算子比較多,是否已經用括號清楚地確定表示式的操作順序?

是是否編寫太複雜或者多用途的復合表示式?否重要

是否將復合表示式與「真正的數學表示式」混淆?否重要

是否用隱含錯誤的方式寫if語句? 例如

否(1)將布林變數直接與true、false或者1、0進行比較。

無(2)將浮點變數用「==」或「!=」與任何數字比較。

否(3)將指標變數用「==」或「!=」與null比較。

否如果迴圈體內存在邏輯判斷,並且迴圈次數很大,是否已經將邏輯判斷移到迴圈體的外面?否重要

case語句的結尾是否忘了加break?否重要

是否忘記寫switch的default分支?是重要

使用goto 語句時是否留下隱患? 例如跳過了某些物件的構造、變數的初始化、重要的計算等。無常量

重要性審查項

結論是否使用含義直觀的常量來表示那些將在程式中多次出現的數字或字串?

是在c++ 程式中,是否用const常量取代巨集常量?否重要

如果某一常量與其它常量密切相關,是否在定義中包含了這種關係?

是是否誤解了類中的const資料成員?因為const資料成員只在某個物件

無生存期內是常量,而對於整個類而言卻是可變的。

無函式設計

重要性審查項

結論引數的書寫是否完整?不要貪圖省事只寫引數的型別而省略引數名字。

是引數命名、順序是否合理?

是引數的個數是否太多?

否是否使用型別和數目不確定的引數?

否是否省略了函式返回值的型別?

否函式名字與返回值型別在語義上是否衝突?否重要

是否將正常值和錯誤標誌混在一起返回?正常值應當用輸出引數獲得,而錯誤標誌用return語句返回。否重要

在函式體的「入口處」,是否用assert對引數的有效性進行檢查?否重要

使用濫用了assert? 例如混淆非法情況與錯誤情況,後者是必然存在的並且是一定要作出處理的。否重要

return語句是否返回指向「棧記憶體」的「指標」或者「引用」?

無是否使用const提高函式的健壯性?const可以強制保護函式的引數、返回值,甚至函式的定義體。「use const whenever you need」

否記憶體管理

重要性審查項

結論重要

用malloc或new申請記憶體之後,是否立即檢查指標值是否為null?(防止使用指標值為null的記憶體)無重要

是否忘記為陣列和動態記憶體賦初值?(防止將未被初始化的記憶體作為右值使用)是重要

陣列或指標的下標是否越界?否重要

動態記憶體的申請與釋放是否配對?(防止記憶體洩漏)無重要

是否有效地處理了「記憶體耗盡」問題?否重要

是否修改「指向常量的指標」的內容?無重要

是否出現野指標?例如(1)指標變數沒有被初始化;(2)用free或delete釋放了記憶體之後,忘記將指標設定為null。否重要

是否將malloc/free 和 new/delete 混淆使用?否重要

malloc語句是否正確無誤?例如位元組數是否正確?型別轉換是否正 確?無重要

在建立與釋放動態物件陣列時,new/delete的語句是否正確無誤?

無其它常見問題

重要性審查項

結論重要

資料型別問題:

(1)變數的資料型別有錯誤嗎?

無(2)存在不同資料型別的賦值嗎?

否(3)存在不同資料型別的比較嗎?無重要

變數值問題:

(1)變數的初始化或預設值有錯誤嗎?

無(2)變數發生上溢或下溢嗎?

無(3)變數的精度夠嗎?是重要

邏輯判斷問題:

(1)由於精度原因導致比較無效嗎?

無(2)表示式中的優先順序有誤嗎?

無(3)邏輯判斷結果顛倒嗎?無重要

迴圈問題:

(1)迴圈終止條件不正確嗎?

無(2)無法正常終止(死迴圈)嗎?

無(3)錯誤地修改迴圈變數嗎?

無(4)存在誤差累積嗎?無重要

錯誤處理問題:

(1)忘記進行錯誤處理嗎?

否(2)錯誤處理程式塊一直沒有機會被執行?

無(3)錯誤處理程式塊本身就有毛病嗎?如報告的錯誤與實際錯誤不一致,處理方式不正確等等。

無(4)錯誤處理程式塊是「馬後炮」嗎?如在被它被呼叫之前軟體已經出錯。無重要

檔案i/o問題:

(1)對不存在的或者錯誤的檔案進行操作嗎?

否(2)檔案以不正確的方式開啟嗎?

否(3)檔案結束判斷不正確嗎?

否(4)沒有正確地關閉檔案嗎?

否動態圖最短路徑算

軟體工程第三次作業

影印機的工作過程大致如下 未接到影印命令時處於 閒置 狀態,一旦接到 影印命令 則進入 影印 狀態,完成乙個影印命令 規定的工作後又回到閒置狀態,等待下乙個影印命令 如果執行影印命令時 發現沒紙 則進入 缺紙 狀態,發出警告,等待裝紙,裝滿紙 後進入閒置狀態,準備接收影印命令 如果影印時發生 卡紙故...

軟體工程第三次作業

最大連續子陣列和 最大子段和 問題 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n 例如,當 a 1 a 2 a 3 a 4 a 5 a...

軟體工程第三次作業

這個作業屬於哪個課程 這個作業要求在 這個作業的目標 1 對比原型設計工具 2 需求分析 3 原型設計 因為之前對原型設計一點了解都沒有,所以我選擇通過對這三款軟體的第一印象以及後面的深入了解的方式來對比這三款原型設計工具的不同之處 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img...