20165232 结对编程第二周总结

20165232 2017-2018-2《Java程序设计》结对编程一 第二周总结

结对对象

20165219王彦博

20165232何彦达

需求分析

实现一个程序,要求:

1 支持整数运算

2 支持多运算符运算

3 支持分数运算,支持真分数运算

扩展需求:

1 处理生成题目并输出到文件

2 完成题目后从文件读入并判题

3 多语言支持:简体中文, 繁體中文, English

4 生成题目去重

设计思路

这是一个需要支持复杂运算的程序,不同于简单的单运算符的四则运算,需要设计多个类来实现运算,比如加减乘除以及平方的运算。

nml图(部分)

第一周

image

第二周
image

代码进度

整数计算类

public class IntNumber {
    private int A;

    public int getA(){
        return A;
    }

    public IntNumber(int A){
        this.A = A;
    }

    public int add(IntNumber op1){
        int sum = A + op1.A;
        System.out.print(A + " + " + op1.A + "=");
        return sum;
    }

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

    public int multiply(IntNumber op1){
        int num = A * op1.A;
        System.out.print(A + " * " + op1.A + "=");
        return num;
    }

    public static IntNumber obj(){
        Random ran = new Random();
        return new IntNumber(ran.nextInt(20)-10);
    }

    public String divide(Score op1){
        System.out.print(op1.getNumerator() + " / " + op1.getDenominator() + "=");
        return op1.toString();
    }
}

分数类运算

import java.util.Random;

public class Score {
    private int numerator, denominator;


    public  Score (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 Score reciprocal()
    {
        return new Score (denominator, numerator);
    }

    public Score add(Score 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 Score (sum, commonDenominator);
    }

    public Score subtract(Score 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 Score(difference,commonDenominator);
    }

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

    public Score divide (Score op2)
    {
        Score op1 = op2.reciprocal();
        int numer = numerator * op1.getNumerator();
        int denom = denominator * op1.getDenominator();
        System.out.print("("+this.toString()+")" + " / " + "("+op2.toString()+")" + "=");
        return new Score (numer, denom);
    }

    public boolean isLike (Score op2)
    {
        return (numerator == op2.getNumerator() &&
                denominator == op2.getDenominator());
    }

    public String toString()
    {
        String result;

        if (numerator == 0)
            result = "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)
    {
        while (num1 != num2)
            if (num1 > num2)
                num1 = num1 - num2;
            else
                num2 = num2 - num1;

        return num1;
    }

    public static Score obj(){
        Random ran = new Random();
        return new Score(ran.nextInt(20)-10,ran.nextInt(20)-10);
    }
}

正误判断类

public class CorrectJudgment {
    private static int trues = 0;

    public static void judgment(boolean same, String num1) {
        if (same) {
            trues++;
            System.out.println("正确!"+"\n");
        } else {
            System.out.println("错误!");
            System.out.println("正确结果为:" + num1+"\n");
        }
    }

    public static int getTrues() {
        return trues;
    }
}

主类

import java.text.FieldPosition;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.*;

public class NumberCount {
    public static void main(String[] args) {
        NumberFormat nf = NumberFormat.getPercentInstance();
        IntNumber in1, in2;
        Score score1, score2,num2;
        int num,N;
        String Q,num1;

        Random ran = new Random();
        Scanner scan = new Scanner(System.in);

        System.out.print("请输入您所需要的题目数量:");
        int A = scan.nextInt();

        for (int i = 0; i < A; i++) {
                        int B = ran.nextInt(2);
                        int C = ran.nextInt(4);

                        in1 = IntNumber.obj();
                        in2 = IntNumber.obj();
                        score1 = Score.obj();
                        score2 = Score.obj();
                        if (B == 0) {
                            switch (C) {
                                case 0:
                                    num = in1.add(in2);
                                    num1 = "" + num;
                                    N = scan.nextInt();
                                    CorrectJudgment.judgment(N == num,num1);
                                    break;
                                case 1:
                                    num = in1.subtract(in2);
                                    num1 = "" + num;
                                    N = scan.nextInt();
                                    CorrectJudgment.judgment(N == num,num1);
                                    break;
                                case 2:
                                    num = in1.multiply(in2);
                                    num1 = "" + num;
                                    N = scan.nextInt();
                                    CorrectJudgment.judgment(N == num,num1);
                                    break;
                                case 3:
                                    num1 = in1.divide(score1);
                                    Q = scan.next();
                                    CorrectJudgment.judgment(Q.equals(num1),num1);
                                    break;
                            }
                        } else {
                            switch (C) {
                                case 0:
                                    num2 = score1.add(score2);
                                    num1 = num2.toString();
                                    Q = scan.next();
                                    CorrectJudgment.judgment(Q.equals(num1),num1);
                                    break;
                                case 1:
                                    num2 = score1.subtract(score2);
                        num1 = num2.toString();
                        Q = scan.next();
                        CorrectJudgment.judgment(Q.equals(num1),num1);
                        break;
                    case 2:
                        num2 = score1.multiply(score2);
                        num1 = num2.toString();
                        Q = scan.next();
                        CorrectJudgment.judgment(Q.equals(num1),num1);
                        break;
                    case 3:
                        num2 = score1.divide(score2);
                        num1 = num2.toString();
                        Q = scan.next();
                        CorrectJudgment.judgment(Q.equals(num1),num1);
                        break;
                }
            }
        }
        System.out.println("你答对的题目总数:" + CorrectJudgment.getTrues());
        double T = (double) CorrectJudgment.getTrues()/A;
        System.out.println("您的正确率为:" + nf.format(T));
    }

功能截图

正常情况测试
image

边界情况测试
image

异常情况测试
image

结对感受

经过两个周的结对编程,我认为四则运算在思路上看似简单,但是具体操作起来有许多的不足,首先分数类计算的代码是请教同学后完成,其次单元测试类的代码没有完成,并且不能支持多级运算。相信之后的结对学习中可以慢慢完善。

结对互评

王彦博同学在结对编程中给了我很大的帮助,有一些代码的问题我不是很清楚,王彦博同学都耐心为我解答。

结对照片

猜你喜欢

转载自www.cnblogs.com/heyanda/p/8910500.html