軟體工程第二次作業

2022-05-04 10:45:10 字數 3510 閱讀 1107

github **位址

我剛開始打**的時候覺得打完就好,能過樣例就ok。經歷過一段時間後會發現有可能樣例過了其他測試點全錯,所以就會開始多測試幾組資料,希望自己的**能夠盡量準確。當準確性開始有保障後,我就會去思考程式本身是不是可以進一步改進,使**執行速度變的更快。在我看來自己出資料測試就相當於書中說的單元測試,回歸測試。不過這種測試變得更加的規範化。而自己對**的不斷改進的過程則相當於書中的效能分析,不過通過效能分析工具使我們對**有更細緻的了解,從而是我們能快速的發現**中的瓶頸從而改進。

關於個人軟體開發流程(psp)這個東西我是第一次了解到。通過書中的大學生和工程師的psp的對比。我發現工作越久,需求分析以及測試花費的時間會越來越多。所以我想我們應該更注重這些方面。而不只是專注於具體的編碼。

看到這個題目,第一反應就是搜尋。接著我就去網上搜尋了一些有關數獨的資料,發現構造數獨基本上就是兩種方法,乙個就是深度優先搜尋,另乙個則是先填中間的宮然後通過置換行列得出所有得宮的數字。我個人覺得深度優先搜尋的寫法更簡潔明瞭,所以我就用了搜尋去寫。

整個**寫下來基本上沒有什麼問題。但是執行後就發現跑的特別慢,用了一分鐘左右才跑完。通過效能測試分析,輸出函式占用了大部分時間。根據以前的經驗知道puts,gets,putchar,getchar這些方法的輸入輸出會比scanf,printf快很多,所以我就修改了輸出函式,使用puts把一整個數獨當作乙個字串來進行輸出。

**如下

void generator::print()

ch[cnt++] = '\n';

} puts(ch);

}

經過修改後的**需要大概6秒鐘的時間可以輸出1000000組答案。下圖是最終**的效能測試分析的一張截圖,輸出函式print只占用了很小的一部分了。

修改後**的效能分析圖,耗時最大的部分就是後面展示的關鍵**。

執行成功的截圖,生成了170m大小的sudoku.txt檔案

關鍵**

for (int i = 1; i <= 9; i++)

}

這是深度搜尋中的關鍵**,這個搜尋函式只有兩個引數表示當前在數獨的哪個位置。c,r,b三個陣列則分別表示的是行,列,宮裡面的數字存在情況,例如c[1][1] = true 就表示第一行的數字1已經存在。

對這個**我進行了單元測試,測試成功了,但是不知什麼原因一直**覆蓋率一直為0,顯示生成的二進位制檔案為空,到現在暫時還沒有解決...

下面給出單元測試的**

#include "stdafx.h"

#include "cppunittest.h"

#include "e:/軟體工程/sudokuproject/sudokuproject/sudokuproject/generator.h"

#include #include #include using namespace std;

using namespace microsoft::visualstudio::cppunittestframework;

int res[10][10];

int c[10][10], r[10][10], b[10][10];

namespace unittest1

bool check()

for (int i = 1; i <= 9; i++)

for (int j = 1; j <= 9; j++)

return true;

} test_method(testmethod1)

}if (!check()) pd = false;

} assert::istrue(pd);

} test_method(testmethod2)

}if (!check()) pd = false;

} assert::istrue(pd);

}};

測試成功的截圖

預估耗時(分鐘)

實際耗時(分鐘)

planning

計畫· estimate

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

1010

development

開發· analysis

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

3060

· design spec

· 生成設計文件00

· design review

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

· coding standard

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

· design

· 具體設計

2030

· coding

· 具體編碼

6040

· code review

· **複審

4020

· test

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

50330

reporting

報告· test report

· 測試報告

5060

· size measurement

· 計算工作量

2020

· postmortem & process improvement plan

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

3040

合計310

610學習進度條

附加題我只做了第二個部分,除了本來的要有30個空,以及唯一解的需求外,我還滿足了第一部分的每個宮至少有兩個空格的要求。

**的命令列執行方式同基礎作業

解題思路:

第一種:通過構造數獨的程式生成一部分數獨當作該程式的輸入,先分別對9個宮,每個宮隨機挖3個空。再對整體的數獨矩陣挖3個空,達到30個。然後用搜尋判斷這個數獨的唯一性。從30個開始可以每多挖乙個空判斷一次唯一性,從而乙個數獨就可以生成多個挖空後的數獨。這種方法需要大概17秒左右。

第二種:第二種方法是和同學討論過後才知道的。當乙個數獨已經具備唯一解,則這個數獨少挖乙個空也依然是唯一解,所以我們只需要準備乙個數獨,隨機挖出有40個或者更多的空的數獨,並且保證具有唯一解。然後我們從這些空中選出一些空去掉,就可得到不同的數獨。因為c(40,9)= 273438880 遠遠超過了1000000。所以很容易就可以得出所有結果。因為滿足了每個宮最少有兩個空格的需求,所以我需要7秒,如果不需要滿足則2秒多就可以了。

下圖為**執行成功的截圖

軟體工程第二次作業

題目鏈結位址 github鏈結位址 難度瓶頸 最終選擇 改進版本 只是生成數獨終盤,不考慮附加作業,就沒有考慮類,只是函式。array 0 0 7 basic.erase 7 basic為集合名稱 if basic.size 0 for int k 0 k row k else 版本二 void c...

軟體工程第二次作業

1.簡述軟體過程 軟體生存週期 軟體過程模型 軟體生存週期模型 三者之間的概念區別。軟體過程 軟體生存週期中的一系列相關過程所涉及的活動 軟體生存週期 軟體生命週期 同任何事物類似,軟體也有乙個從生到死的過程,這個過程一般稱為軟體生存週期或生命週期 軟體過程模型 軟體生存週期模型 為了能高效地開發乙...

軟體工程第二次作業

vs是乙個基本完整的開發工具集,它包括了整個軟體生命週期中所需要的大部分工具,本學期軟體工程我選擇virtual studio 2015作為開發工具。由於以前安裝過virtual studio 2015,這裡直接放上virtual studio 2015開發環境,如下圖所示。這裡通過對 求陣列的最值...