20165312 结对学习 四则运算(第二周)

20165312 结对学习 四则运算(第二周)

代码托管

需求分析

  • 手动输入进行计算的题目数量n
  • 自动生成n道四则运算题目
    • 整数
    • 真分数
  • 进行判断对错,并计算正确率
  • 能多次进行计算,知道用户不想练习

深层次需求分析

  • 进行多运算符计算
  • 随机生成的题目以及正确答案保存至一个文件
  • 完成题目后从文件读入并判题
  • 多语言支持:简体中文, 繁體中文, English
  • 生成题目去重
  • 将前缀表达式转化为后缀表达式

相比上周本周的进步

  • 实现真分数的加减乘除运算
  • 分类实现程序,使不同的要求分类实现,使得变动代码时更容易
  • 完善代码UML图

设计思路

实践过程中关键代码的解释

本程序除了测试类,共有四个类。

  • Calculate(主类)
  • Fraction(真分数的加减乘除运算)
  • IntNumber(整数的加减乘除运算)
  • Judgement(判断结果是否正确并且计算正确率)

我认为关键代码就是Fraction.java和IntNumber.java这两个类,对此我在代码中有相应的注释

Fraction.java

import java.util.Random;
public class Fraction { //除法加减乘除
    private int numerator, denominator; //分别是分子、分母
    public  Fraction (int numer, int denom) { //写成一个分数形式
        if(denom == 0 )   //分母为零
            denom = 1;
        if (denom < 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();
        int numerator1 = numerator * op2.getDenominator();
        int numerator2 = op2.getNumerator() * denominator;
        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)
            result = "0";
        else if(denominator == 0)
            return "错误!分母不能为0";
        else if (denominator == 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));
    }
}

IntNumber.java

import java.util.Random;
public class IntNumber { //整数加减乘除
    private int A;
    public IntNumber(int A){
        this.A = A;
    }
    public int add(IntNumber op1){ //加法
        int result = A + op1.A;
        System.out.print(A + " + " + op1.A + "=");
        return result;
    }

    public int subtract(IntNumber op1){  //减法
        int result = A - op1.A;
        System.out.print(A + " - " + op1.A + "=");
        return result;
    }

    public int multiply(IntNumber op1){ //乘法
        int result = A * op1.A;
        System.out.print(A + " * " + op1.A + "=");
        return result;
    }
    public String divide(Fraction op1){ //除法
        System.out.print(op1.getNumerator() + " / " + op1.getDenominator() + "=");
        return op1.toString();
    }
    public static IntNumber obj(){  //随机生成一个整数
        Random ran = new Random();
        return new IntNumber(ran.nextInt(100));
    }
}

这两个类有相应的测试类IntNumberTest.java和FractionTest.java,进行测试

测试方法

  • IntNumberTest.java

  • FractionTest.java

运行过程截图

对结对的小伙伴进行评价

我的小伙伴给了我想法,并且从一个旁观者的角度,测试代码,用边界情况测试,使得学习更加高效。不断磨合,默契度还是增加的,因为也是室友,所以学习的时间也比较好约定。

PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 120
Estimate 估计这个任务需要多少时间 360 600
Development 开发 200 400
Analysis 需求分析 (包括学习新技术) 60 120
Design Spec 生成设计文档 30 45
Design Review 设计复审 (和同事审核设计文档) 30 120
Coding Standard 代码规范 (为目前的开发制定合适的规范) 40 150
Design 具体设计 50 40
Coding 具体编码 180 260
Code Review 代码复审 30 50
Test 测试(自我测试,修改代码,提交修改) 60 90
Reporting 报告 30 30
Test Report 测试报告 30 30
Size Measurement 计算工作量 30 20
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 60 120
合计 1250 2195
posted on 2018-04-22 22:43  歌儿  阅读(209)  评论(0编辑  收藏  举报