课后作业2

1、Fork到自己远程仓库的码云项目地址
https://gitee.com/wangjingxian/personal_project41656.git
2、在开始实现程序前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间。并说明估计根据。

3、程序对表达式类型的支持程度。描述你的程序对不同类型表达式求值的支持程度。
(1)能支持两个操作数,一种运算符。

(2)能支持两个操作数的简单四则运算(只有一个操作符)。

(3)能支持简单混合四则运算(最多有3个操作符,没有括号)。

(4)能支持稍微复杂的混合四则运算(最多3个操作符,有括号)。

4、程序设计与实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你实现算法的关键部分(不必列出源代码),以及实现过程中遇到的关键问题与困难。
(1)代码组织情况。
在本次作业中,一共有11个类,一个是可执行程序,其它均为测试类。在我的可以执行程序Calculator.py中,一共有5个函数,函数ride_except()计算一个不包含括号的最小乘除计算;在数学中,如果一个表达式中没有括号,有加减乘除四中符号,其运算规则为,先算乘除后算加减,从左向右计算,函数recursion()在不含括号时,乘除先递归运算完;函数add_sum()计算没有乘除的表达式(不能含有括号);函数basic_operation()按照空格、空字符拆分,若加减乘除并存的情况下,调用加减函数和递归函数,进行数学运算;函数calculate()为本功能的核心函数,可计算包含括号的表达式,使用的是re包中的search方法,进行括号匹配。
(2)关键函数流程图。
核心函数为calculate(),函数流程图如下:

(3)说明实现算法的关键部分。
输入一个表达式,可以有加、减、乘、除、括号,使用re.search方法,判断是否有括号,如果没有括号,调用basic_operation()进行运算,输出结果,结束;如果有括号,去掉最内层括号,返回新表达式,再次使用re.search方法判断是否含有括号,若没有调用basic_operation(),打印结果,结束,如果还有括号就继续去掉括号、判断,直到没有括号,打印输出结果结束为止。
(4)实现过程中遇到的问题与困难。
遇到的困难是,如果输入一个数字之后连续输入运算符号,再输入一个数字,这样正则表达式无法进行相应匹配,从导致运算不出结果。
还有就是输入非数学运算符例如”:,&,|”等,这个正则表达式可以解决,可以将这些非数学运算符跳过,只进行有效数学运算符的运算。
5、程序单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。
单元测试代码:展示all_test1.py内容

执行结果:

说明:
在Python中使用单元测试,需要导入被测类其中的某一个模块,还需要导入Python强大的unittest,单元测试类。创建一个类,将被测模块进行调用,self.assertEqusl(x,y)需要传入两个参数,第一个参数代表被测模块的返回值,第二个参数代表期望值,若返回值与期望值一致,则通过测试。
6、程序中的异常处理说明。在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。
在输入一个数字之后,输入连续运算符,再输入数字,例如:1 +*/ 4,
会有异常

正则无法匹配连续数学运算符
其它测试类说明:
ride_except_test.py 测试乘除
recursion.py 不含括号表达式的,没有乘除跳出递归,有乘除进行递归
add_sum.py 加减运算
basic_operation_test.py不含括号的运算
calculate_test.py 含括号的运算
all_test1.py 正常操作
all_test2.py 每输入一个元素添加一个空格
all_test3.py 连续输入操作符
all_test4.py 输入浮点型数
all_test5.py 输入非操作符,例如":","&",非操作符号将被忽略
all_test6.py 输入负数浮点数
7、在你实现完程序之后,在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间。

原文地址:https://www.cnblogs.com/Wangjingxian/p/9914630.html