将相关的函数及变量封装成了两个类存放在头文件main.h中。两个类分别为生成数独的类generator和解决数独的类solver。
两个类的设计如下:
class generator {
private:
int point = 0;//output位置
int now[10][10];
//转换模板
int trans[10][10] = {
{
5,1,2,3,4,6,7,8,9},
{
3,4,6,7,8,9,5,1,2},
{
7,8,9,5,1,2,3,4,6},
{
1,2,3,4,6,7,8,9,5},
{
4,6,7,8,9,5,1,2,3},
{
8,9,5,1,2,3,4,6,7},
{
2,3,4,6,7,8,9,5,1},
{
6,7,8,9,5,1,2,3,4},
{
9,5,1,2,3,4,6,7,8},
};
public:
char *out;
void initialize(int first[]);
void generate_sudoku(int num);
void Write();
};
class solver {
private:
int need_solve[100];//需要填入的格子id记录
int a[10][10] = {
0 };
int row_mark[10][10] = {
0 };//row_mark[i][j]第i行数字j已经填入
int col_mark[10][10] = {
0 };//col_mark[i][j]第i列数字j已经填入
int block_mark[10][10] = {
0 };//block_mark[i][j]第i个九宫格数字j已经填入
int s_point = 0;
public:
char *out;
void setnum(int row, int col, int num, int flag);
bool judge(int row, int col, int num);
bool dfs(int s, int count);
void print_output();
void solve_sudoku(string path);
void Write();
};
单元测试主要针对三个部分进行测试:
(1)输入参数是否合法
(2)生成数独结果是否正确
(3)求解数独结果是否正确
接下来针对上述三个方面依次设计测试用例:
(1)输入参数应测试程序对不合法的参数的处理情况,测试的不合法的参数应包括:第一个参数输入除“-c”、“-s”外的其他字符;若输入“-c”,第二个参数输入非数字字符,第二个参数不在1~1000000区间内;若输入“-s”,第二个参数为不合法路径。
(2)对于生成数独,针对其边界值进行测试,分别测试生成1个、500000个、1000000个数独终局的情况,主要判断程序生成的结果中的所有数独是否符合数独要求并且生成数目正确。
(3)对于求解数独,应测试程序生成的结果中的所有求解出的数独是否符合数独要求并且生成数目正确。
在测试的过程中确实发现了程序中存在的问题,最常出现的问题就是定义的数组没有及时的清空,会导致一些不易发现的小问题出现。