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開發環境,如下圖所示。這裡通過對 求陣列的最值...