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

本文介绍了一个用于学习和练习四则运算的系统,包括整数和真分数的运算。系统能够自动生成题目,并具备判断对错及计算正确率的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

代码托管

需求分析

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

    深层次需求分析

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

    相比上周本周的进步

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

    设计思路

1047583-20180422224200557-198136329.png

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

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

  • 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

1047583-20180422224218194-762489230.jpg

  • FractionTest.java

1047583-20180422224236684-258205621.jpg

运行过程截图

1047583-20180422224246858-618223481.jpg

对结对的小伙伴进行评价

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

PSP

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划60120
Estimate估计这个任务需要多少时间360600
Development开发200400
Analysis需求分析 (包括学习新技术)60120
Design Spec生成设计文档3045
Design Review设计复审 (和同事审核设计文档)30120
Coding Standard代码规范 (为目前的开发制定合适的规范)40150
Design具体设计5040
Coding具体编码180260
Code Review代码复审3050
Test测试(自我测试,修改代码,提交修改)6090
Reporting报告3030
Test Report测试报告3030
Size Measurement计算工作量3020
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划60120
合计12502195

转载于:https://www.cnblogs.com/cxgg/p/8910277.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值