个人作业Week2-代码复审

Posted 王辰昱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人作业Week2-代码复审相关的知识,希望对你有一定的参考价值。

一、代码复审Check List

1.概要部分

  • 代码能符合需求和规格说明么?

 1)规格部分

  输出规格:

  用一个文本文件(假设名字叫 sudoku.txt)的形式保存起来,每次生成的txt文件需要覆盖上次生成的txt文件,文件内的格式如下,数与数之间由空格分开,终局与终局之间空一行,行末无空格

  -s 实际输出:

4 7 8 9 1 6 2 5 3
1 5 9 8 2 3 7 6 4
2 6 3 5 4 7 8 9 1
7 4 6 1 3 5 9 8 2
8 9 1 4 6 2 5 3 7
5 3 2 7 8 9 1 4 6
3 8 7 6 5 1 4 2 9
6 1 5 2 9 4 3 7 8
9 2 4 3 7 8 6 1 5

4 7 8 9 1 6 2 5 3
1 5 9 8 2 3 7 6 4
2 6 3 5 4 7 8 9 1
7 4 6 1 3 5 9 8 2
8 9 1 4 6 2 5 3 7
5 3 2 7 8 9 1 4 6
3 8 7 6 5 1 4 2 9
6 1 5 2 9 4 3 7 8
9 2 4 3 7 8 6 1 5

4 7 8 9 1 6 2 5 3
1 5 9 8 2 3 7 6 4
2 6 3 5 4 7 8 9 1
7 4 6 1 3 5 9 8 2
8 9 1 4 6 2 5 3 7
5 3 2 7 8 9 1 4 6
3 8 7 6 5 1 4 2 9
6 1 5 2 9 4 3 7 8
9 2 4 3 7 8 6 1 5
...

-c 实际输出:

3 1 2 7 8 9 4 5 6
4 5 6 3 1 2 7 8 9
7 8 9 4 5 6 3 1 2
2 3 1 9 7 8 6 4 5
6 4 5 2 3 1 9 7 8
9 7 8 6 4 5 2 3 1
1 2 3 8 9 7 5 6 4
5 6 4 1 2 3 8 9 7
8 9 7 5 6 4 1 2 3

3 1 2 7 9 8 4 5 6
4 5 6 3 1 2 7 9 8
7 9 8 4 5 6 3 1 2
2 3 1 8 7 9 6 4 5
6 4 5 2 3 1 8 7 9
8 7 9 6 4 5 2 3 1
1 2 3 9 8 7 5 6 4
5 6 4 1 2 3 9 8 7
9 8 7 5 6 4 1 2 3

3 1 2 8 7 9 4 5 6
4 5 6 3 1 2 8 7 9
8 7 9 4 5 6 3 1 2
2 3 1 9 8 7 6 4 5
6 4 5 2 3 1 9 8 7
9 8 7 6 4 5 2 3 1
1 2 3 7 9 8 5 6 4
5 6 4 1 2 3 7 9 8
7 9 8 5 6 4 1 2 3
...

2) 输入规格:

对于命令:

a. -c 100,结果如上

b. -c 0, 

number should be positive

c. -c abc

invalid number

d. -c

invalid parameter number

e. -s XXXX\liuchang_review\Sudoku\subject.txt

输入内容:

4 7 0 9 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 8 0 1
0 0 6 0 0 0 0 0 0
8 0 1 0 0 2 5 0 0
0 0 0 7 0 0 0 4 0
0 0 0 0 5 1 0 0 0
6 0 0 0 0 0 0 7 0
0 0 0 0 0 8 0 0 0


4 7 0 9 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 8 0 1
0 0 6 0 0 0 0 0 0
8 0 1 0 0 2 5 0 0
0 0 0 7 0 0 0 4 0
0 0 0 0 5 1 0 0 0
6 0 0 0 0 0 0 7 0
0 0 0 0 0 8 0 0 0
...

输出如上提到。

f. -s 0

number should be positive

  e. -s abc

invalid number

  f. -s

invalid parameter number

g. 无参数

invalid parameter number

  h. -abc

unknown function

  总体评价:

  作为一个程序,能在不崩溃的前提下,处理正确的输入并输出符合规范的结果,处理异常的输入并返回报错信息,规格实现非常完善。

  2) 需求部分:

  1. 生成数独:

 

  1. 生成不重复的数独终局至文件
  2. 读取文件内的数独问题,求解并将结果输出到文件
  3. 在生成数独矩阵时,左上角的第一个数为:(学号后两位相加)% 9 + 1。例如学生A学号后2位是80,则该数字为(8+0)% 9 + 1 = 9,那么生成的数独棋盘应如下(x表示满足数独规则的任意数字)

  1. 格式和不重复性:

  运行 -c 100000,使用字典树存储和查重:

COUNT = 100000


class TrieNode:
  """A Trie tree specialized to store strings of sudoku solutions.""" desc
= {} char = "" def __init__(self): self.desc = {} self.char = "" def insert(self, string):
"""
Each time we come to or create a lower node, directed by the first character of ‘string‘. If len(string) is 1, we assert the node does not exist.
     """
if len(string) == 0: return elif len(string) == 1: if len(self.desc) > 0 and string[0] in self.desc: print("Same sudokus.") input() if string[0] not in self.desc: new_node = TrieNode() #print(new_node) self.desc[string[0]] = new_node new_node.char = string[0] self.desc[string[0]].insert(string[1:]) def display(self): for key, node in self.desc.items(): node.display() class Reader: pos = 0 f = None line = 1 def __init__(self, f): self.f = f def match(self, expect="\n"): c = self.f.read(1) if c == "\n": self.line += 1 if c == expect: return c, True else: return c, False if __name__ == "__main__": f_in = open(r"XXXX\liuchang_review\Sudoku\Sudoku\sudoku.txt", "r") reader = Reader(f_in) root = TrieNode() for sudoku_count in range(COUNT): if sudoku_count%10000 == 0: print(sudoku_count) sudoku_str = "" for j in range(9): #line for k in range(9): char, v = reader.match() sudoku_str += char if k != 8: char, v = reader.match(" ") else: char, v = reader.match("\n") if not v: print("PE in line "+str(reader.line)) if sudoku_count != COUNT-1: char, v = reader.match("\n") if not v: print("PE in line " + str(reader.line)) root.insert(sudoku_str)

结果:未报重复错误和格式错误。

  2. 正确性:

  调用check_validity()函数在输出前检查每一行每一列每一宫是否填满1-9。

bool check_validity(int s[9][9]) const{
    int record = 0;
    const int mask = 0x1ff; // 9 ones
    for (int group_x = 0; group_x < 3; group_x++) {
        for (int group_y = 0; group_y < 3; group_y++) {
            record = 0;
            for (int x = 3 * group_x; x < 3 * group_x + 3; x++) {
                for (int y = 3 * group_y; y < 3 * group_y + 3; y++) {
                    int v = s[x][y];
                    record |= 1 << (v-1);
                }
            }
            if (record != mask) {
                return false;
            }
        }
    }
    for (int line = 1; line <= 9; line++) {
        record = 0;
        for (int row = 1; row <= 9; row++) {
            int v = s[line][row];
            record |= 1 << (v - 1);
        }
        if (record != mask) {
            return false;
        }
    }
    for (int row = 1; row <= 9; row++) {
        record = 0;
        for (int line = 1; line <= 9; line++) {
            int v = s[line][row];
            record |= 1 << (v - 1);
        }
        if (record != mask) {
            return false;
        }
    }
    return true;
}

  结果:

  全部正确。

 

以上是关于个人作业Week2-代码复审的主要内容,如果未能解决你的问题,请参考以下文章

个人作业Week2-代码复审

BUAA软工个人作业Week2-代码复审

个人作业-week2

个人作业-Week 2 代码复审

结对作业_代码复审= =

个人作业-Week3:代码复审