代码地址:
结对开发成员:陈建宇
git代码发布地址:
一、程序相关函数说明
首先我们现在程序头部设置了两个栈,分别放操作符和操作数值,如下:
private Stack<Character> priStack = new Stack<Character>();// 操作符栈
private Stack<Double> numStack = new Stack<Double>();;// 操作数栈
(一) public double caculate(String str)
这个函数是本程序中的主要计算函数,通过对输入的字符串进行解析然后判断操作符或是数值然后计算大致为:
1.判断string当中有没有非法字符 。
2.循环开始解析字符串,当字符串解析完,且符号栈为空时,则计算完成 。
3.用当前取得的运算符与栈顶运算符比较优先级:若高于,则因为会先运算,放入栈顶;若等于,因为出现在后面,所以会后计算,所以栈顶元素出栈,取出操作数运算; 若小于,则同理,取出栈顶元素运算,将结果入操作数栈。
4.判断当前运算符与栈顶元素优先级,取出元素,进行计算(因为优先级可能小于栈顶元素,还小于第二个元素等等,需要用循环判断。
(二)private boolean isNum(String temp)
这个函数主要的功能就是判断传入的字符是不是0-9的数字
(三) private boolean compare(char str)
这个函数是本程序中的比较操作符优先级的函数,大致思想如下:
1.比较当前操作符与栈顶元素操作符优先级,如果比栈顶元素优先级高,则返回true,否则返回false
2.str 需要进行比较的字符
3.比较结果 true代表比栈顶元素优先级高,false代表比栈顶元素优先级低
4. '('优先级最高, ')'优先级最低, '*/'优先级只比'+-'高
(四)public static void exception()
这个函数主要是为了处理异常输入时候不至于打断函数报错的异常处理函数,比如除数不能为0,当随机出题的时候遇到/0这种形式的时候就会调用exception函数并输出一个提示语句然后进行正常出题,这样可以保证在出现异常输入时候整个程序还可以继续回调执行。
(五)public static String doubletransint(double num)
这个函数主要是将double型输出结果(如12.0)输出时转换为int型数据(如12)。
二、对本次程序和函数方法进行测试
(一)测试目的:
1.对不带括号的加减乘除进行测试运算,检查正常的输入用例是否会输出正确的结果,从而判断函数方法是否会通过
2.对带括号的加减乘除进行测试运算,检查正常的输入用例是否会输出正确的结果,从而判断函数方法是否会通过
(二)预期测试用例:
输入测试用例 | 预期输出结果 | 预期是否通过 |
6+5-2*8 | 报错 | 否 |
6+5-2*8# | result=17 | 通过 |
20-5-4-3# | result=8 | 通过 |
2*3*4*5# | result=120 | 通过 |
100/2/2/5/5# | result=1 | 通过 |
(10-5)*2/(5-3)# | result1==5 | 通过 |
(三)测试过程:
按照我们设计的测试用例,在这里主要设置了6组测试输入用例,用以观察输出结果和是否通过。
(1)不带括号的四则运算
1.测试加法四则运算,输入测试用例“6+5-2*8”,输出结果截图所示:
错误原因分析:因为程序编译初期,在编写过程中设置了用‘#’来判断是否字符串输入完毕,如果遍历字符串遇到‘#’就截取‘#’前面的字符串,然后调用函数进行计算,在本次输入测试用例时候未输入‘#’致使在截取函数时候不知道该从什么地方停止,从而报错。
就错误原因分析后,我们进行复合编程规范的测试用例输入,输入:6+5-2*8#,输出结果截图所示:
2.测试减法法四则运算,输入测试用例“20-5-4-3#”,输出结果截图所示:
3.测试乘法法法四则运算,输入测试用例“2*3*4*5#”,输出结果截图所示:
4.测试除法法法四则运算,输入测试用例“100/2/2/5/5#”,输出结果截图所示:
(2)带括号的四则运算
带括号的四则运算其实就是相比(一)中加了括号进行运算,原理基本一致,这里我们就选一个多运算符混合测试用例进行测试,不在赘述。
输入测试用例:(10-5)*2/(5-3)# ,输出结果截图所示:
(3)实际测试用例图
输入测试用例 | 实际输出结果 | 是否通过 |
6+5-2*8 | java.lang.AssertionError | 否 |
6+5-2*8# | result=17 | 通过 |
20-5-4-3# | result=8 | 通过 |
2*3*4*5# | result=120 | 通过 |
100/2/2/5/5# | result=1 | 通过 |
(10-5)*2/(5-3)# | result1==5 | 通过 |
测试总结:
单元测试,这个在之前我的编程过程中,重来是都没有涉及到的东西,就和之前的profile一样,这两个东西让我在程序猿这个道路上,学会了这么利用我们的集成开发环境,来提高我们编程的准确性和相率,对我而言收益匪浅。