20165330 结对编程项目-四则运算 第二周

需求分析

  • 实现一个命令行程序,要求:自动生成小学四则运算题目(加、减、乘、除)
  • 可实现多个运算符一起运算
  • 可以真分数形式输出结果
  • 测试结果的正确性
  • 统计题目完成数并计算正确率

设计思路

  • 实验首先是完成一个计算器的功能,可以实现简单的+、-、*、/运算,在这里设计一个主类生成随机数,生成题目,并判断正确率
  • 实现多运算符,编入四个类分别实现整数运算、真分数运算、判断结果正确并计算正确率
  • 利用JUnit检测非法输入
  • 设计测试类,利用JUnit测试整数类与分数类的四则运算

UML类图

image

功能截图

image

Junit测试

image
image

代码托管地址

实验过程中遇到的困难及解决方法

在上周我们对真分数部分的代码存在疑惑,这周我们将这部分作为了重点研究。
  • 首先是用java语言描述真分数里的加减乘除运算,然后将运算结果化简。
  • 化简过程需要用到求最大公因子,这时候我们需要分子分母均为正值,于是就有了public Fraction (int numer, int denom)方法,以及Math.abs(numerator)来保证算法不出现漏洞。
  • 除此之外还要注意分子分母计算的一些限定特性。我们同样加进代码里。

源代码及分析注释:

import java.util.Random;
public class Fraction {
    private int numerator, denominator;  //定义分母、分子

    public  Fraction (int numer, int denom)
    {

        if(denom == 0 )        //分子为0
            denom = 1;
        if (denom < 0)           //若分母小于0,则取分母为正值,分子为负值
        {
            numer = numer * -1;
            denom = denom * -1;
        }
        numerator = numer;
        denominator = denom;

        reduce();
    }

    public int getNumerator()
    {
        return numerator;
    }

    public int getDenominator()
    {
        return denominator;
    }


    public Fraction add(Fraction op2)          //实现真分数加法运算
    {
        int commonDenominator = denominator * op2.getDenominator();   //两随机数a1、a2的分母相乘,进行通分
        int numerator1 = numerator * op2.getDenominator();            //a1的分子=a1的分子与a2的分母相乘
        int numerator2 = op2.getNumerator() * denominator;           //a2的分子=a2的分子与a1的分母相乘
        int sum = numerator1 + numerator2;                            //将通分过后的两个随机数相加
        System.out.print("("+this.toString()+")" + " + " + "("+op2.toString()+")" + "=");
        return new Fraction (sum, commonDenominator);
    }

    public Fraction subtract(Fraction op2)           //实现真分数减法运算
    {
        int commonDenominator = denominator * op2.getDenominator();
        int numerator1 = numerator * op2.getDenominator();
        int numerator2 = op2.getNumerator() * denominator;
        int difference = numerator1 - numerator2;
        System.out.print("("+this.toString()+")" + " - " + "("+op2.toString()+")" + "=");
        return new Fraction(difference,commonDenominator);
    }

    public Fraction multiply (Fraction op2)              //实现真分数乘法运算
    {
        int numer = numerator * op2.getNumerator();
        int denom = denominator * op2.getDenominator();
        System.out.print("("+this.toString()+")" + " * " + "("+op2.toString()+")" + "=");
        return new Fraction (numer, denom);
    }

    public Fraction divide (Fraction op2)              //实现真分数除法运算
    {

        int numer = numerator * op2.getDenominator();
        int denom = denominator * op2.getNumerator();
        System.out.print("("+this.toString()+")" + " / " + "("+op2.toString()+")" + "=");
        return new Fraction (numer, denom);
    }

    public String toString()      //输出格式及限定
    {
        String result;

        if (numerator == 0)               //分子为0,结果为0
            result = "0";
        else
        if(denominator == 0)              //分母不能为0
            return "错误!分母不能为0";
        else
        if (denominator == 1)             //分母为1,结果取分子值
            result = numerator + "";

        else
            result = numerator + "/" + denominator;  //按分数形式输出结果

        return result;
    }

    private void reduce()
    {
        if (numerator != 0)
        {
            int common = gcd (Math.abs(numerator), denominator);    //取分子分母最大公因子

            numerator = numerator / common;                        //约分
            denominator = denominator / common;
        }
    }


    private int gcd (int num1, int num2)                      //计算最大公因子
    {
        if(num2==0)
            return num1;
        else
            return gcd(num2,num1%num2);

    }
    public static Fraction obj(){                               //生成随机数
        Random ran = new Random();
        return new Fraction(ran.nextInt(100),ran.nextInt(100));
    }
}
  • 代码里的去重功能没写出来,但是经过讨论有了思路:
    • 记录之前生成的题目
    • 用遍历比较新生成题目与旧生成题目。如果重复,则删除此新生成题,并再生成一个题目,重新遍历检查。如果不重复,则进入下一环节

结对总结及评价

  • 在之后的本周的学习中,我们的结对学习比上周更有动力,整体思路更清晰,对彼此的督促作用也得到加强,对代码得到了更深层次的理解,学习效率大大提高。希望在日后的学习中我们可以做到更好,得到更大的进步!
  • 在本周学习中,在小伙伴的帮助下,我对代码有了更深的解读,她的认真及更高效的学习方法让我受益,在这周的磨合中我们的默契度也有了更大的提高,思考问题的时候,会有更多相同的思考,结对学习的过程也是我们相互促进的过程。

参考或引用的设计、实现

步骤 耗时 百分比
需求分析 20min 16%
设计 30min 24%
代码实现 40min 32%
测试 20min 16%
分析总结 15min 12%
posted @ 2018-04-22 22:41  20165330张羽昕  阅读(156)  评论(1编辑  收藏  举报