這篇文章主要是第四部分具體實現、第五部分單元測試和第六部分程式效能及質量分析
check.h:負責對使用者輸入的命令進行處理,如果命令輸入錯誤,進行錯誤提示,下面是判斷輸入並執行的**部分:
int solveinput() //判斷並執行命令
if (strcmp(ar**[1], "-c") && strcmp(ar**[1], "-s")) //字母錯誤
if (!strcmp(ar**[1], "-c")) //創造數獨終盤
return 3;
}sum = 10 * sum + ar**[2][i] - '0';
}if (sum > max || sum < 1) //數字過大
/*----------------------------------*/
/*建立數獨終盤物件*/
/*...........*/
file* file;
file = freopen("sudoku.txt", "w", stdout); //沒有檔案時可以創造
base base(sum, file); //呼叫generator
base.generate();
/*----------------------------------*/
return 5;
} if (!strcmp(ar**[1], "-s")) //解題
/*----------------------------------*/
/*建立數獨求解物件*/
/*...........*/
ans = freopen("sudoku.txt", "w", stdout);
solver solver(question, ans); //呼叫solver
flag = solver.in();
/*----------------------------------*/
return 7;
} return 8; //正常執行,消除警告
}
base.h:生成數獨局的終盤,採用矩陣轉換法,先換行,再換列,最後換數字,換行的**如下:
void generate() //生成函式}}
answer.h:用來解決數獨問題,採用回溯演算法,dfs的具體**如下:
bool dfs(int tot) //dfs搜尋方法
int line = tot / 9;
int col = tot % 9;
if (sudoku[line][col] > 0)
for(int i = 1;i <= 9;i++)
}sudoku[line][col] = 0;
} return false;
}
question.cpp:用來生成數獨題目的,用到了rand函式,具體實現如下:
void change()
}} }
a = 0, b = 8;
for (int i = 0; i < 42; i++) }
}
對於每乙個模組,我都設計了單元測試,一共寫了十個用例。
首先是對於輸入的測試,一共有8種可能,對於輸入算式等也進行了測試,**如下:
unittest1()
test_method(testmethod1) //輸入格式不正確的時候
test_method(testmethod2) //輸入的不是-c或者-s的時候
test_method(testmethod3) //輸入不是數字的時候
test_method(testmethod4) //輸入的數字過大
test_method(testmethod5) //輸入生成數獨終盤命令正確
test_method(testmethod6) //解數獨題的路徑錯誤
test_method(testmethod7) //解數獨題的路徑正確
test_method(testmethod8) //輸入算式
對於generator.h的測試:
主要目的:檢查生成的矩陣是否有重複的情況
test_method(testmethod10) //證明沒有生成重複的矩陣
s1.push_back(temp + '0');
}if (end) break;
}if (end) break;
container.insert(s1);
s1.clear();
}fclose(stdin);
assert(container.size() != sudoku_number);
}
answer.h的測試:
主要目的:檢查生成的數獨矩陣是否正確
test_method(testmethod9) //解題是否成功
測試的結果如下:
使用visual studio檢查單元測試覆蓋率為71.04%,說明單元測試設計的還比較合理。上圖可以看出方法10的測試花了2分多種的事件,因為測試10的輸入是1000000個矩陣,將生成的最多數量的矩陣一一進行對比,證明在最多的輸入時,生成的矩陣也都是不重複的,這樣的測試更具有說服性。
起初,我選用回溯法生成數獨終盤,生成1000000個數獨終盤要花40s的時間。所以我換用矩陣轉換法,節省了大量的時間,效率非常高,效能上也提高了很多。**效能分析如下:
這裡可以看到,比較費時間的是base類中的out()函式,也就是輸出函式,通過對其的重構,減少對該函式的呼叫次數,並刪除了一些不必要的迴圈,重構後的效能分析如下:
接下來採用visual studio 2017 **質量分析工具找出警告。
這裡的前兩個警告是由於變數宣告後沒有初始化,第三個警告是因為size_t強制轉化為int有可能引起資料的丟失。因為在32位編譯器下,size_t可以看作unsigned int,而在64位 編譯器中,size_t可以看作unsigned long long,只需要將有問題的變數由int型改為unsigned long long型即可。
之後再執行就不出現warning了
軟體工程大作業 數獨遊戲
這篇文章主要是第一部分psp 第二部分問題分析和第三部分系統設計 psp2.1 personal software progress stages 預估耗時 分鐘 實際耗時 分鐘 planning 計畫estimate 估計這個任務需要多少時間 2030 development 開發analysis...
軟體工程大作業
一.uml圖 需求分析 設計原型 例會記錄1 例會記錄2 二.工具 python mysql 三.實現過程 首先確認基本需求,然後確定了使用python的flask框架,再逐步實現所有功能。我主要做了資料庫的一部分操作,新學生,新老師的增刪功能,因為我們的資料庫資訊是採用檔案匯入的方式,加快了效率的...
軟體工程大作業(一)
1.1 功能需求 1 類似 visio.能完成向量圖形的建立 儲存 讀取功能。2 除了圖形介面操作,還可以通過命令指令碼操作。例如下面的指令碼建立乙個園,然後對其進 行放大。createcircle a center 0,0 radius 10 zoom a 1.5 令指令碼的格式可以自己確定 3 ...