【JAVA】四则运算计算题生成及完成情况分析程序

发布时间 2023-04-12 13:48:21作者: b0bXu

第七周结对编程任务为给出一个300道四则运算计算题并能够完成和检查答案是否正确,我(2152113)邀请到了我计科专业的舍友(2152123)与我一同组队,编程语言选择了我们都较为熟悉的JAVA。

代码初现

先由我来进行了计算题生产器的代码编写

代码如下

import java.util.Random;

public class MathExerciseGenerator {
    private static final int MAX_NUM = 100;
    private static final int NUM_EXERCISES_PER_WEEK = 300;

    public static void main(String[] args) {
        MathExerciseGenerator generator = new MathExerciseGenerator();
        String[] exercises = generator.generateExercises(NUM_EXERCISES_PER_WEEK);
        for (String exercise : exercises) {
            System.out.println(exercise);
        }
    }

    public String[] generateExercises(int numExercises) {
        Random random = new Random();
        String[] exercises = new String[numExercises];
        for (int i = 0; i < numExercises; i++) {
            int numOperands = random.nextInt(2) + 1; // 1 or 2 operands
            String operator = "+";
            if (numOperands == 2) {
                operator = "-";
            }
            int operand1 = random.nextInt(MAX_NUM) + 1;
            int operand2 = random.nextInt(MAX_NUM) + 1;
            if (operator.equals("-")) {
                // ensure that the difference is positive
                while (operand2 > operand1) {
                    operand2 = random.nextInt(MAX_NUM) + 1;
                }
            }
            int result = 0;
            if (operator.equals("+")) {
                result = operand1 + operand2;
            } else if (operator.equals("-")) {
                result = operand1 - operand2;
            }
            exercises[i] = operand1 + " " + operator + " " + operand2 + " = ";
        }
        return exercises;
    }

    public boolean checkAnswer(String exercise, int answer) {
        String[] parts = exercise.split(" ");
        int operand1 = Integer.parseInt(parts[0]);
        String operator = parts[1];
        int operand2 = Integer.parseInt(parts[2]);
        int result = 0;
        if (operator.equals("+")) {
            result = operand1 + operand2;
        } else if (operator.equals("-")) {
            result = operand1 - operand2;
        }
        return answer == result && answer >= 0 && answer <= 100;
    }
}

然后由他来编写了答题器部分

代码如下

import java.util.Scanner;

public class MathExercisesApp {
    public static void main(String[] args) {
        MathExerciseGenerator generator = new MathExerciseGenerator();
        String[] exercises = generator.generateExercises(300);
        Scanner scanner = new Scanner(System.in);
        int numCorrect = 0;
        for (String exercise : exercises) {
            System.out.print(exercise);
            int answer = scanner.nextInt();
if (answer > 100)
               continue;
          else if (generator.checkAnswer(exercise, answer)) {
                System.out.println("Correct");
                numCorrect++;
            } else {
                System.out.println("Incorrect");
            }
        }
        System.out.println("Score: " + numCorrect + " out of 300");
    }
}

此时我们已经得到了一个可以成功运行的题目自动生成,并可以完成和检测的程序,但在测试中发现,在对于答案超过100的计算题中,依然保留了算式,我认为这非常不合理,应当直接不显示该算式,跳过去显示下一题,于是我们着手修改这一非常不科学的问题。

 

 

 

 代码改进

研究过后,我们认为计算题生成器方面无需改动,而需要在答题器模块修改一下结构,首先在循环外部计算每个练习题的答案。然后,在循环内部,我们添加了一个新的条件来检查答案是否大于 100。如果是,则不显示该计算题,并继续进行下一个练习题。否则,显示该计算题并要求用户输入答案。

改进后的答题器代码

import java.util.Scanner;

public class MathExercisesApp {
    public static void main(String[] args) {
        MathExerciseGenerator generator = new MathExerciseGenerator();
        String[] exercises = generator.generateExercises(300);
        Scanner scanner = new Scanner(System.in);
        int numCorrect = 0;
        for (String exercise : exercises) {
            String[] parts = exercise.split(" ");
            int operand1 = Integer.parseInt(parts[0]);
            String operator = parts[1];
            int operand2 = Integer.parseInt(parts[2]);
            int result = 0;
            if (operator.equals("+")) {
                result = operand1 + operand2;
            } else if (operator.equals("-")) {
                result = operand1 - operand2;
            }
            if (result > 100) {
                continue; // skip the current exercise
            }
            System.out.print(exercise);
            int answer = scanner.nextInt();
            if (generator.checkAnswer(exercise, answer)) {
                System.out.println("Correct");
                numCorrect++;
            } else {
                System.out.println("Incorrect");
            }
        }
        System.out.println("Score: " + numCorrect + " out of 300");
    }
}

 进行了50道测试后,并没有再出现答案超过100的情况 ,问题得到解决。

 

代码完善

最后在队友的建议下,又决定添加做题速率和正确率模块,更直观地展现完成情况。

完善后的答题器代码最终版本

import java.util.Scanner;

public class MathExercisesApp {
    public static void main(String[] args) {
        MathExerciseGenerator generator = new MathExerciseGenerator();
        String[] exercises = generator.generateExercises(300);
        Scanner scanner = new Scanner(System.in);
        int numCorrect = 0;
        for (int i = 0; i < exercises.length; i++) {
            long timeStart = System.currentTimeMillis(); // start timing
            String exercise = exercises[i];
            String[] parts = exercise.split(" ");
            int operand1 = Integer.parseInt(parts[0]);
            String operator = parts[1];
            int operand2 = Integer.parseInt(parts[2]);
            int result = 0;
            if (operator.equals("+")) {
                result = operand1 + operand2;
            } else if (operator.equals("-")) {
                result = operand1 - operand2;
            }
            if (result > 100) {
                continue; // skip the current exercise
            }
            System.out.print(exercise);
            int answer = scanner.nextInt();
            if (generator.checkAnswer(exercise, answer)) {
                System.out.println("Correct");
                numCorrect++;
            } else {
                System.out.println("Incorrect");
            }
            double successRate = ((double)numCorrect / (i+1)) * 100;
            System.out.printf("Success rate: %.2f%%   ", successRate);
            long timeEnd = System.currentTimeMillis(); // end timing
            double timeElapsed = (timeEnd - timeStart) / 1000.0; // convert time to seconds
            System.out.printf("Time elapsed: %.2fs\n", timeElapsed);
        }
        double finalScore = ((double)numCorrect / exercises.length) * 100;
        System.out.printf("Final score: %.2f%% (%d out of %d)\n", finalScore, numCorrect, exercises.length);
    }
}

运行截图展示

 

 

 项目完成心得

第一次体验结对编程任务就充分感受到了其与自己编程的巨大差别,两个人合作能够互相弥补对方的弱势,例如我的代码调整能力较弱,队友较强,他可以很好地将代码调整到我们想要的效果,我的想法比较多,可以提出很多改进意见,这一方面他就不如我。结对编程时,代码会经过更多的检查和审查,从而提高了代码的质量和可读性,并且两个人一起编写代码,可以相互纠正错误并及时发现难以察觉的错误,从而减少错误率。过程中也促进了知识分享和交流,使得团队成员可以在更短的时间内学习和掌握新技术,这也有助于增强团队合作精神,改善氛围。虽然结对编程需要两个人一起工作,但是它可以节省开发时间,并且生成更稳定、更高效的代码,从而提高生产力。