此作业要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11243
代码地址:https://e.coding.net/xucancan1/sizeyunsuan/sizeyunsuan.git
说明:测试代码在test单元测试文件夹中test.py
结伴小伙伴:史志腾
使用语言:python
测试框架:UnitTest
测试内容:四则运算试题生成
要求1 对每个功能,先给出测试用例,然后再编码功能。请注意把测试用例视为功能需求完成的检验指标。 (40分)
编号 | 测试用例 | 预期结果 |
1 |
执行功能1随机产生表达式 |
Creat_exp1函数随机产生一个式子: |
2 |
输入一个四则运算:1+2+4*4 输入一个后缀表达式:12+44*+
|
Reverse1函数单元测试结束。 |
3 | 执行功能2随机产生表达式 |
Creat_exp函数随机产生一个式子: |
4 |
输入一个四则运算:1+(1*3)/6 |
Countvalue函数单元测试结束。 |
5 |
输入一个四则运算:1+(1/3-1)-1 |
count函数单元测试结束。 |
要求2 在博客报告测试用例全部fail 到 全部pass 的过程,报告事实 (fail到修改代码或者测试用例,到pass) 以及收获。 除了最初的框架,测试用例中存在一次性pass没有经过fail的,也报告一次性通过,给出如此优秀地实现了这部分功能的代码。由2位同学中的一位发布博客提交到作业,指明自己的结对伙伴;另一位在作业中引用这一博客,指明自己的结对伙伴。(40分)
错误一:使用测试用例2
功能1在使用中缀表达式转化为后缀表达式错误
错误的源码:
1 #将中缀表达式转化成后缀表达式 2 def Reverse1(s): 3 ophead=[] #类似于操作符栈 4 result="" #以字符串的形式保存后缀表达式 5 rank={"+":1,"-":1,"*":2,"/":2} #定义字符串的优先级 6 for x in s: 7 if x in ["+","-","*","/"]: #判断当前元素是否是操作符 8 if(len(ophead)==0): #如果栈为空,操作符进栈 9 ophead.append(x) 10 elif(rank[ophead[-1]]>=rank[x]): #如果当前操作符的优先级小于ophead栈顶的元素优先级,则出栈 11 while(len(ophead)>0 and rank[ophead[-1]]>=rank[x]): #出栈,直到栈为空或者当前元素优先级大于栈顶元素 12 op=ophead.pop() 13 result=result+op 14 ophead.append(x) #当前元素的优先级大于栈顶元素的优先级,当前元素进栈 15 else: #如果当前元素的优先级大于ophead栈顶的元素优先级,则操作符进栈 16 ophead.append(x) 17 else: #如果当前元素是操作数 18 result=result+x
原因:我们发现最后的操作符栈没有空,没有全部输出,所以造成错误
修改后的源码:
1 #将中缀表达式转化成后缀表达式 2 def Reverse1(s): 3 ophead=[] #类似于操作符栈 4 result="" #以字符串的形式保存后缀表达式 5 rank={"+":1,"-":1,"*":2,"/":2} #定义字符串的优先级 6 for x in s: 7 if x in ["+","-","*","/"]: #判断当前元素是否是操作符 8 if(len(ophead)==0): #如果栈为空,操作符进栈 9 ophead.append(x) 10 elif(rank[ophead[-1]]>=rank[x]): #如果当前操作符的优先级小于ophead栈顶的元素优先级,则出栈 11 while(len(ophead)>0 and rank[ophead[-1]]>=rank[x]): #出栈,直到栈为空或者当前元素优先级大于栈顶元素 12 op=ophead.pop() 13 result=result+op 14 ophead.append(x) #当前元素的优先级大于栈顶元素的优先级,当前元素进栈 15 else: #如果当前元素的优先级大于ophead栈顶的元素优先级,则操作符进栈 16 ophead.append(x) 17 else: #如果当前元素是操作数 18 result=result+x 19 while(len(ophead)>0):#当ophead栈不为空时,输出栈,直到为空 20 op=ophead.pop() 21 result=result+op 22 return result 23
修改后的运行截图:
错误二:使用测试用例4
功能3中计算后缀表达式中出错
错误源码:
1 #计算后缀表达式 2 def Countvalue(s): 3 headlists=[] 4 for i in s: 5 if i in ['+','-','*','/']: 6 b=float(headlists.pop())#栈顶元素出栈 7 a=float(headlists.pop()) #继续栈顶元素出栈 8 c=0 9 if i=='+':#两个操作数做四则运算 10 c=a+b 11 elif i=='-': 12 c=a-b 13 elif i=='*': 14 c=a*b 15 else: 16 c=a//b 17 headlists.append(c)#得到的结果压入栈中 18 else: 19 headlists.append(i) 20 return headlists[0]
原因:我们发现四则运算中我们错误的把//当成了/处理,造成了错误,给我们浪费了很多时间。
修改后的源码:
1 #计算后缀表达式 2 def Countvalue(s): 3 headlists=[] 4 for i in s: 5 if i in ['+','-','*','/']: 6 b=float(headlists.pop())#栈顶元素出栈 7 a=float(headlists.pop()) #继续栈顶元素出栈 8 c=0 9 if i=='+':#两个操作数做四则运算 10 c=a+b 11 elif i=='-': 12 c=a-b 13 elif i=='*': 14 c=a*b 15 else: 16 c=a/b 17 headlists.append(c)#得到的结果压入栈中 18 else: 19 headlists.append(i) 20 return headlists[0]
修改后的运行截图: