设计实现过程

代码的组织主要分为两个部分:

  1. 算法与结构体的实现。
  2. 大体结构,各算法的连接与调用。

Generate()类是程序的主题架构类,先通过get_info()函数获取传入参数,再通过NewExpressions()函数将generate()函数生的成算数表达式按算术式和答案分别写入到文件Exercises.txtAnswer.txt中。

在生成函数generate() 中,通过调用built_Tree() 函数生成以class Node() 为节点的二叉树,再通过class BiTree() 对二叉树进行括号和运算顺序规整、计算。再通过fitBiTre() 对二叉树进行纠错。在生成的过程中,采用了check_repeat() 来对生成的表达式进行查重。

代码说明

检查纠错函数

用于检测二叉树中的左右子树是否会出现不符合规格的情况,并进行纠正:

def fitBiTree(root):
    if root.symbol == "/":
        return root.number
    elif root.symbol == "+":
        return fitBiTree(root.ltree) + fitBiTree(root.rtree)
    elif root.symbol == "*":
        return fitBiTree(root.ltree) * fitBiTree(root.rtree)
    elif root.symbol == "-":
        a = fitBiTree(root.ltree) - fitBiTree(root.rtree)
        if a < 0:
            b = root.ltree
            root.ltree = root.rtree
            root.rtree = b
            a = fitBiTree(root.ltree) - fitBiTree(root.rtree)
        return a
    elif root.symbol == "&":
        if fitBiTree(root.ltree) >= fitBiTree(root.rtree):
            b = root.ltree
            root.ltree = root.rtree
            root.rtree = b

        a = fitBiTree(root.ltree) / fitBiTree(root.rtree)
        return a

输出函数

输出函数,用于将二叉树中的内容输出成公式和结果:

def show(self, root):
    if root.symbol == "/":
        return ShowFraction(root.number)
    elif root.symbol == "+" or root.symbol == "-":
        if root.rtree.symbol == "+" or root.rtree.symbol == "-":
            return self.show(root.ltree) + " " + root.symbol + " ( " + self.show(root.rtree) + " )"
        return self.show(root.ltree) + " " + root.symbol + " " + self.show(root.rtree)
    else:
        if root.ltree.symbol == "+" or root.ltree.symbol == "-":
            i = "( " + self.show(root.ltree) + " )"
        else:
            i = self.show(root.ltree)
        i += " " + root.symbol + " "
        if root.rtree.symbol != "/":
            i += "( " + self.show(root.rtree) + " )"
        else:
            i += self.show(root.rtree)
        return i

二叉树生成函数

用于生成随机的二叉树:

def generate(self):
    type_list = ['F', 'I']  # Fraction or Int
    sym_num = random.randint(1, 3)  # 符号数
    type = random.sample(type_list, 1)[0]   # 数类型
    root = self.built_Tree(sym_num, type)
    tree = BiTree(root)
    fitBiTree(root)
    tree_string = str(tree.show(tree.root))
    is_repeat = self.check_repeat(tree_string)
    if  is_repeat == True:
        print(tree.show(tree.root) + " = " + ShowFraction(tree.Count(tree.root)))
        return root
    else:
        while is_repeat == False:
            #print('error')
            root = self.built_Tree(sym_num, type)
            tree = BiTree(root)
            fitBiTree(root)
            tree_string = str(tree.show(tree.root))
            is_repeat = self.check_repeat(tree_string)
        print(tree.show(tree.root) + " = " + ShowFraction(tree.Count(tree.root)))
        #print('mark')
        return root

测试运行

题目生成:

python feature importance 使用的是 python feature selection_python

python feature importance 使用的是 python feature selection_Test_02

 将题目与答案分别存到不同的文件中

python feature importance 使用的是 python feature selection_二叉树_03

python feature importance 使用的是 python feature selection_数据结构与算法_04

 题目与答案的校对

python feature importance 使用的是 python feature selection_数据结构与算法_05

 

 

python feature importance 使用的是 python feature selection_python_06

 

PSP表格

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

2h

3h

· Estimate

· 估计这个任务需要多少时间

2h

2h

Development

开发

80h

80h

· Analysis

· 需求分析 (包括学习新技术)

10h

15h

· Design Spec

· 生成设计文档

2h

2h

· Design Review

· 设计复审 (和同事审核设计文档)

8h

3h

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

8h

4h

· Design

· 具体设计

10h

4h

· Coding

· 具体编码

20h

30h

· Code Review

· 代码复审

2h

2h

· Test

· 测试(自我测试,修改代码,提交修改)

12h

12h

Reporting

报告

4h

3h

· Test Report

· 测试报告

3h

3h

· Size Measurement

· 计算工作量

2h

1h

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

4h

3h

合计

 

169h

167h

项目小结

在项目开始的初期,是异常艰难的。结对编程的难点在于两人的进度和想法很难进行同步,导致编程的进程节奏难以把握。经常出现等待的情况。到后来加强了双方的交流以后,节奏有了明显的提升,配合也渐渐得熟悉了起来。