课后作业二

本文详细介绍了基于逆波兰算法的计算器设计与实现过程,包括代码组织、关键算法实现、单元测试及异常处理等内容。重点阐述了逆波兰转换与计算、输入验证及异常处理策略。

1.码云项目地址:

https://gitee.com/wangbinAa/personal_project41656

2.估计将在程序的各个模块的开发上耗费的时间

1518458-20181108110125153-2006970952.png

3.程序对表达式类型的支持

支持整数的混合四则运算,不限制输入的计算数个数和操作符个数
如(1+3)/3等

4.程序设计与实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你实现算法的关键部分(不必列出源代码),以及实现过程中遇到的关键问题与困难。(10')

代码组织情况:代码主要分为三个类Main类,判断类,计算类;
通过Main类连接外部操作台,调用判断类,当判断类内涉及到的判断函数全部通过后调用计算类,通过其中函数执行计算,返回计算结果,然后输出。

说明实现算法的关键部分:主要使用逆波兰算法
调用zhuanhuan()方法,接收输入的去除空格的正确算式进行逆波兰算法转换,将操作符压入czfs栈中,将数字转换为后缀形式。调用jisuan()方法,接收转换后的后缀字符串,取出数字与czfs中的操作符调用js1函数进行计算,将每一步计算的结果压入nums栈中,在重复调用,最后算出一个最终结果,pop结果。
实现过程中遇到的问题与困难:对算法的理解不透彻,对java栈的使用不熟悉,导致将思路转换为代码的过程出现问题。

关键函数流程图:
1518458-20181109192139831-1417614283.png

5.程序单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。

部分单元测试代码:
//  2.进行是否输入非法字符判断
//错误
@Test
public void pd2_1(){
    String suanshi="abc";
    panduan pd = new panduan();
    boolean pd2_1 = pd.input(suanshi);;
    assertEquals(true,pd2_1);
}
@Test
public void pd2_2(){
    String suanshi="。,";
    panduan pd = new panduan();
    boolean pd2_2 = pd.input(suanshi);;
    assertEquals(true,pd2_2);
}
//正确
@Test
public void pd2_3(){
    String suanshi="(1+2)+8";
    panduan pd = new panduan();
    boolean pd2_3 = pd.input(suanshi);
    assertEquals(false,pd2_3);
}    
测试的函数:input()
构建测试数据的思路:根据函数的功能不同,分别输入可能出现的错误情况数据和正确情况数据。

单元测试覆盖率截图
1518458-20181109190743670-2098277672.png

6.程序中的异常处理说明。在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。(3')

异常处理说明:分为输入异常和输出异常,主要为输入异常处理。
6.1输入异常处理。
 * 1.进行输入不为空判断【zero】当出现输入为空情况,停止执行程序,输出提示语
    @Test
public void pd1_1(){
    String[] suanshi={};
    panduan pd = new panduan();
    boolean pd1_1 = pd.zero(suanshi);
    assertEquals(true,pd1_1);
}
 * 2.进行是否输入非法字符判断,如输入:abc 【input】当出现输入非法字符时,停止执行程序,输出提示语

    @Test
public void pd2_1(){
    String suanshi="abc";
    panduan pd = new panduan();
    boolean pd2_1 = pd.input(suanshi);;
    assertEquals(true,pd2_1);
}
 * 3.进行输入格式是否正确判断(主要针对+-*/),如输入:1+【geshi】当出现输入算式格式不正确时,停止执行程序,输出提示语

   @Test
public void pd3_1(){
    String suanshi="++(1+2)++8";
    panduan pd = new panduan();
    boolean pd3_1 = pd.geshi(suanshi);
    assertEquals(true,pd3_1);
}
 * 4.进行括号输入是否正确判断,如输入:(1+1 【kuohao1,kuohao2】当出现输入算式括号不正确时,停止执行程序,输出提示语

    @Test
public void pd4_2(){
    String suanshi="(1+1";
    panduan pd = new panduan();
    int pd4_2 = pd.kuohao(suanshi);
    assertEquals(1,pd4_2);
}
 * 5.对除数是否为零进行判断【chushu】当出现输入除数为零时,停止执行程序,输出提示语

    @Test
public void pd5_1(){
    String suanshi="1/0";
    panduan pd = new panduan();
    boolean pd5_1 = pd.chushu(suanshi);
    assertEquals(true,pd5_1);
}
6.2输出异常处理:
可能输入的算式未出现除数为零,单经过计算之后出现除数为零如:1/(1-1),又由于进行计算时采用的是浮点数形式,当除数为0.0时,不会出现除数为零报错,而是出现Infinity,所以添加捕获结果为Infinity形式,在输出时说明经初步计算后出现除数为零情况,并输出0.0。
    @Test
public void testVoidMethodd() throws Exception {
    String[] suanshi={"1/(1-1)"};
    panduan a = new panduan();
    Class<?> clazz = a.getClass();
    Field field = clazz.getDeclaredField("name");
    field.setAccessible(true);
    String string = (String) field.get(a);
    assertEquals("helloworld", string);
    a.zhuluoji(suanshi);
    String string1 = (String) field.get(a);
    assertEquals("经初步计算出现除数为现象,由于计算时为小数形式,返回Infinity",string1);
    }        

7.在你实现完程序之后,在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间。(1')

1518458-20181108110256539-272235308.png

8.改进程序性能改进的思路

1.从代码重复率上改进,找出重复执行的部分代码,考虑重复部分代码操作是否多余,是否可以删除重复部分代码。或者是否可以单独提取出来作为一个方法在根据不同需要进行调用等
2.从代码模块化上进行改进,找出代码中同一方法内,出现的关联性不强的代码,考虑此操作是否需要,或者是否应该独立成立函数模块,再或者是否应该放到另一个函数中执行等。
3.从代码逻辑上考虑,查看函数逻辑操作,看看不同函数的逻辑覆盖是否重复,是否可以删减部分逻辑判断操作或者通过添加某一函数内操作,使得可以减少某函数内的复杂操作或者删除某函数。

转载于:https://www.cnblogs.com/wangbinAa/p/9927471.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值