軟體工程實踐2017第二次作業

2022-05-01 23:03:17 字數 3545 閱讀 7052

由於書本買到得比較遲,看的內容不太多,其中印象比較深刻的是第二章中提到的單元測試和效能分析。作為乙個好**,是要經過大量效能分析後的改進,提煉而成的,不能盲目地去改**,要通過效能分析工具測試後,得出**的各部分函式耗時資料,找出相對耗時較長的部分,進行優化演算法等,才是正確的**改進方法。單元測試部分,我目前在自己的ide中還無法實現...因此還不能說這部分功能有什麼用途,暫且記此作筆記,以後再好好琢磨

單元測試好壞的標準如下:

1.單元測試應該在最低功能/引數上驗證程式的正確性。

2.單元測試必須由最熟悉**的人(程式的作者)來寫

3.單元測試後,機器狀態保持不變

4.單元測試要快(乙個測試的執行時間是幾秒鐘,而不是幾分鐘)

5.單元測試應該產生可重複、一致的結果

6.獨立性——單元測試的執行/通過/失敗不依賴於別的測試,可以人為構造資料,以保持單元測試的獨立性

7.單元測試應該覆蓋所有**路徑(注意點:100%的**覆蓋率並不等同於100%的正確性!)

8.單元測試應該整合到自動測試的框架中

9.單元測試必須和產品**一起儲存和維護

psp2.1

personal software process stages

預估耗時(分鐘)

實際耗時(分鐘)

planning

計畫20

30· estimate

· 估計這個任務需要多少時間

2030

development

開發720

855· analysis

· 需求分析 (包括學習新技術)

120200

· design spec

· 生成設計文件

4020

· design review

· 設計複審 (和同事審核設計文件)500

· coding standard

· **規範 (為目前的開發制定合適的規範)

2020

· design

· 具體設計

3035

· coding

· 具體編碼

240360

· code review

· **複審

100100

· test

· 測試(自我測試,修改**,提交修改)

120120

reporting

報告180

190· test report

· 測試報告

5040

· size measurement

· 計算工作量

3030

· postmortem & process improvement plan

· 事後總結, 並提出過程改進計畫

100120

· all

· 合計

9201075

由於之前安裝過vs2015,使用過git,這兩個步驟可以跳過,然而vs2015的具體使用方法還不是很熟悉,在網上找了一篇比較適合新手的使用筆記。數獨問題,小時候有一段時間感興趣過,知道可以通過寫出9行1~9的數字,然後通過一定的行列變換來生成。於是我的演算法1.0就誕生了,通過隨機次數的行列變換來生成數獨,行列變換的原則是:交換只發生在前三行,中間三行,最後三行,前三列,中間三列以及最後三列之間,不能越界交換。興高采烈地完成了第一次嘗試之後,我測試了幾個資料。然而執行結果出現了兩個問題:1、數獨終盤重複率高,並且生成效率十分低...這一點是我還沒用效能分析工具就得出來的結論。。因為跑了半天才跳出來幾十個數獨終盤,用肉眼都感覺的出來這方法明顯不適合題目要求的大量資料...於是我也不打算push到github上了,直接刪了**重新寫(肉痛),看來只能用演算法來解決此問題了。演算法一直是我不擅長的部分,我思考了一陣,自己學過的遍歷方法只有可憐的bfs和dfs.....再結合題目,要生成乙個數獨終盤,應該要用一些數字去嘗試填進去,填到不符合的就要回到乙個特定點,重新嘗試填數字,結合演算法特點,認為dfs比較可能實現。然而,不符合的條件是什麼?返回到哪個結點?怎麼返回?我上網搜了相關資料,發現大部分的文章都提到了回溯法,大致思想跟我之前思考的方法是一樣的,但是展現了具體的回溯方法,回溯到的結點確認。即乙個點乙個點逐級向上回溯,例8行8列無法填入任何滿足的數字,就回溯到8行7列,重填,再無法滿足則返回8行6列,以此類推。而判斷方法就簡單了,避免行衝突,列衝突,格衝突。目前放在github**的就是演算法2.0 。

參考文章(

由於作業的要求不是很複雜,我分了兩個類

class todosudoku

畫了乙個很奇怪的流程圖...實在不太會畫,抱歉

再補個**大致思路。首先通過formatjudge()判斷命令列輸入引數格式是否正確,進入output(),output()中,若formatjudge()返回值為false則報錯,若返回true則繼續進行,通過shuf生成隨機測試陣列,通過shuf_first()生成包含題目要求的數獨首列,即首行首列為固定數值,進入fill(),fill()採用回溯法,通過numjudge()來判斷填入測試陣列是否正確,最後生成數獨終盤。

效能分析圖(1w的資料)

有圖得知,我的一大部分時間竟然是在toprint,輸出數獨函式上,目前想的方法就是用printf來替換cout會快一些。上網搜尋了資料,發現,最快的竟然是putchar()函式,原因是輸出字元是最高效的。第二耗時的部分就是fill(),也就是填充數字的部分。由於我演算法能力比較差...本身就是參考網上的方法,只能推測,在numjudge()中,可以省略一些步驟。在塊判斷中,我的原方法是,從當前塊中開始,逆順序乙個乙個塊往上判斷,這樣就會導致重複冗餘。例如在第一次時從第8塊開始往回判斷,第7塊和第6塊都是正確的,用標記標註,那麼第二次從第9塊開始往回判斷時,第7和第6塊就不用重複判斷了。這是目前的思路,但是**實現還沒完成。希望在接下來的努力中可以實現。

軟體工程實踐2017第二次作業

github鏈結 1 拿到題目後,覺得這題目和八皇后的題挺像的,都是行列衝突問題,因此覺得可以通過將乙個99的數獨圖變成9個33的圖,對每張33的圖進行數字的填充,例如先將1填入9張小圖中。按以上思路寫完程式後,在行數下移的同時還需要在對應的圖中找到下乙個數填入的位址,產生了可能會跳過某一行填入數值...

軟體工程實踐2017第二次作業

github連線 利用程式隨機構造出n個已解答的數獨棋盤 輸入 數獨棋盤題目個數n 0 n 1000000 輸出 隨機生成n個不重複的已解答完畢的數獨棋盤,並輸出到sudoku.txt中。參考 其實看了這個 以後,我深受影響,把自己的設想都推翻了,總覺得自己的方法不太好,想學習這個方法。我認真理解了...

軟體工程實踐2017第二次作業

預估耗時 分鐘 實際耗時 分鐘 planning 計畫20 10 estimate 估計這個任務需要多少時間 2010 development 開發375 465 analysis 需求分析 包括學習新技術 3030 design spec 生成設計文件 1010 design review 設計複...