“最后,针对于本次任务,按照以下 Markdown 模板,发布一篇博客”
对于这个要求,不是很明白怎么做,就照葫芦画瓢吧。。。
博客会以md格式的文件上传到github一份。
# 模块代码地址
- [Core 模块代码地址](https://github.com/jinxiaohang/OperationUnitTest)
- [单元测试代码地址](https://github.com/jinxiaohang/OperationUnitTest)
两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了。
# 封装阶段
##
```public class Core {```
public static StringBuffer Suffix(StringBuffer infix){
Stack<Character> stack=new Stack <Character>(); StringBuffer suffix=new StringBuffer(); int i=0; char tempchar=infix.charAt(i++); char tempchar2=' '; try { while (tempchar!='='){ switch (tempchar){ case '(': stack.push(tempchar); tempchar=infix.charAt(i++); break; case ')': while (stack.peek()!='('){ tempchar2=stack.pop(); suffix.append(tempchar2); suffix.append(' '); if (stack.empty()) { break; } } if (!stack.empty()) { stack.pop(); } tempchar=infix.charAt(i++); break; case '+': case '-': while (!stack.empty()&&stack.peek()!='('){ tempchar2=stack.pop(); suffix.append(tempchar2); suffix.append(' '); } stack.push(tempchar); tempchar=infix.charAt(i++); break; case '×': case '*': case '/': case '÷': Character ch=new Character(' '); if (!stack.empty()) { while((ch=stack.peek()).equals('×')||(ch=stack.peek()).equals('÷')) { tempchar2=stack.pop(); suffix.append(tempchar2); suffix.append(' '); if (stack.empty()) { break; } } } stack.push(tempchar); tempchar=infix.charAt(i++); break; case ' ': tempchar=infix.charAt(i++); break; default: while(tempchar<='9'&&tempchar>='0') { suffix.append(tempchar); tempchar=infix.charAt(i++); } suffix.append(' '); break; } } while(!stack.empty()) { tempchar2=stack.pop(); suffix.append(tempchar2); suffix.append(' '); }suffix.append('\0');
} catch (Exception e) { e.printStackTrace(); } return suffix; }//根据后缀表达式计算结果(小数格式的String类型)
public static String Calculate(StringBuffer suffix){ int i=0; char tempchar=suffix.charAt(i++); double []answer=new double[20]; int top=0,d; String Answer= null; try { while (tempchar!='\0'){ switch (tempchar){ case '+': answer[top-1]=answer[top-1]+answer[top]; top--; tempchar=suffix.charAt(i++); break; case '-': answer[top-1]=answer[top-1]-answer[top]; top--; tempchar=suffix.charAt(i++); break; case '*': case '×': answer[top-1]=answer[top-1]*answer[top]; top--; tempchar=suffix.charAt(i++); break; case '/': case '÷': try { if(answer[top]!=0) answer[top-1]=answer[top-1]/answer[top]; else { System.out.println("\n\t除零错误!\n"); throw new InvalidExpression("无效的表达式"); } } catch (InvalidExpression invalidExpression) { invalidExpression.printStackTrace(); System.exit(0); } top--; tempchar=suffix.charAt(i++); break; case ' ': tempchar=suffix.charAt(i++); break; default: d=0; while(tempchar>='0'&&tempchar<='9') { d=10*d+tempchar-'0';//将数字字符转化为对应的数值 tempchar=suffix.charAt(i++); } top++; answer[top]=d; break; } } Answer = null; if (top!=1){ throw new InvalidExpression("无效的表达式"); } Double an=new Double(answer[top]); Answer = new String(an.toString());}catch (InvalidExpression invalidExpression) {
invalidExpression.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } return Answer; }```}```## 在封装的过程中遇到的困难,以及是如何解决的:
对于封装首先想到几天前学习的软件工程的知识,关于模块的分解、抽象,恰好与本次的任务吻合,可以理论用于实践。上图是我画的UML图,在尝试在学习中,算不上很规范,但能基本看懂大概的结构。
因为之前的代码基于结构化编程,运用函数思想,所以在本次封装过程中很好的将功能抽象出来,这次完成的虽然不是很完美,但后期可以通过老师的指导不断改进。# 单元测试阶段
## 单元测试代码 此处粘贴单元测试代码(用一对 ``` 把代码括起来)
public class CoreTest {@Before
public void before() throws Exception { }@After
public void after() throws Exception { }/**
* * Method: Suffix(StringBuffer infix) * */ @Test public void testSuffix() throws Exception { Core s=new Core(); s.Suffix(new StringBuffer("1+2+3=")); s.Suffix(new StringBuffer("1+2×3=")); s.Suffix(new StringBuffer("1+2÷3=")); s.Suffix(new StringBuffer("1÷2×3=")); s.Suffix(new StringBuffer("1÷+2×3=")); s.Suffix(new StringBuffer("1÷2*3=")); s.Suffix(new StringBuffer("1÷0×3=")); s.Suffix(new StringBuffer("1÷2×0="));}
/**
* * Method: Calculate(StringBuffer suffix) * */ @Test public void testCalculate() throws Exception { Core s=new Core(); s.Calculate(new StringBuffer("1 2 + 3 +")); s.Calculate(new StringBuffer("1 + 2 + 3 +")); s.Calculate(new StringBuffer("1 2 +")); s.Calculate(new StringBuffer("1 2 × 3 +")); s.Calculate(new StringBuffer("1+ + 2 × 3 +")); } } ## 单元测试运行结果(截图,含测试是否全部通过,代码覆盖率等)
## 在编写单元测试代码过程中遇到的困难,以及是如何解决的
按照老师提供的教程,一开始看不懂,需要自己慢慢琢磨,Junit包,不知道是哪个,IDEA上找到有好多个,后来自己在网上找一个发现可以用。 下面提供它的下载网址。 链接:http://pan.baidu.com/s/1o84pWQQ 密码:1mda 别的大问题没有,关于对Core的测试,计算表达式都是自己按照规则生成的,不会出现不规则的情况, 所以对于测试情况的全面性没有更深一步进行。# 感受(小结) Junit很方便,测试的时候,不能以编程时的思维方式去看待问题,否则有些问题永远测试不出来。 需要打破常规的思路,不能认为自己的代码运行结果都是对的。