10月15日

优化上次的四则运算代码;
增加要求:1.添加四年级能够进行五位操作数以内运算;

点击查看代码
import java.util.*;

abstract class MathProblem {
    protected int maxOperands; // 最大操作数
    protected boolean allowMultiplication; // 是否允许乘法
    protected boolean allowDivision; // 是否允许除法
    protected boolean allowParentheses; // 是否允许括号
    protected int maxRange; // 数值范围
    protected Random random = new Random();

    public MathProblem(int maxOperands, boolean allowMultiplication, boolean allowDivision, boolean allowParentheses, int maxRange) {
        this.maxOperands = maxOperands;
        this.allowMultiplication = allowMultiplication;
        this.allowDivision = allowDivision;
        this.allowParentheses = allowParentheses;
        this.maxRange = maxRange;
    }

    public abstract String generateProblem();
    public abstract double evaluate(String expression);
    public abstract boolean checkAnswer(String userAnswer, double correctAnswer);
}

class SecondGradeProblem extends MathProblem {
    public SecondGradeProblem() {
        super(2, true, true, false, 100);
    }

    @Override
    public String generateProblem() {
        int a = random.nextInt(maxRange + 1);
        int b = random.nextInt(maxRange + 1);
        String operator = getRandomOperator();

        // 确保除法整除
        if (operator.equals("/")) {
            if (b == 0) b = 1; // 防止除以0
            a -= a % b; // 确保整除
        }

        return a + " " + operator + " " + b;
    }

    @Override
    public double evaluate(String expression) {
        String[] tokens = expression.split(" ");
        int a = Integer.parseInt(tokens[0]);
        String operator = tokens[1];
        int b = Integer.parseInt(tokens[2]);
        switch (operator) {
            case "+":
                return a + b;
            case "-":
                return a - b;
            case "*":
                return a * b;
            case "/":
                return b != 0 ? a / b : 0;
            default:
                throw new UnsupportedOperationException("不支持的操作符: " + operator);
        }
    }

    @Override
    public boolean checkAnswer(String userAnswer, double correctAnswer) {
        return String.valueOf((int) correctAnswer).equals(userAnswer);
    }

    public String getRandomOperator() {
        List<String> operators = new ArrayList<>(Arrays.asList("+", "-", "*", "/"));
        return operators.get(random.nextInt(operators.size()));
    }
}

class ThirdGradeProblem extends SecondGradeProblem {
    public ThirdGradeProblem() {
        super();
        this.maxOperands = 4; // 操作数最多4个
    }

    @Override
    public String generateProblem() {
        StringBuilder problem = new StringBuilder();
        int operandCount = random.nextInt(maxOperands - 1) + 2; // 生成2到4个操作数
        for (int i = 0; i < operandCount; i++) {
            int num = random.nextInt(maxRange + 1);
            problem.append(num);
            if (i < operandCount - 1) {
                problem.append(" ").append(getRandomOperator()).append(" ");
            }
        }
        return problem.toString();
    }
}

class FourthGradeProblem extends ThirdGradeProblem {
    public FourthGradeProblem() {
        super();
        this.maxOperands = 5; // 操作数最多5个
    }

    @Override
    public String generateProblem() {
        StringBuilder problem = new StringBuilder();
        int operandCount = random.nextInt(maxOperands - 1) + 2; // 生成2到5个操作数

        boolean useParentheses = random.nextBoolean() && operandCount > 2 && allowParentheses;
        return problem.toString();
    }
}

// 错题管理类
class WrongProblemManager {
    private final Map<String, Integer> wrongProblems = new HashMap<>();

    public void addWrongProblem(String problem,double answer) {
        wrongProblems.put(problem, wrongProblems.getOrDefault(problem, 0) + 1);
        double correctanswer[]={0};
        correctanswer[0]=answer;
    }

    public void displayWrongProblems() {
        if (wrongProblems.isEmpty()) {
            System.out.println("没有错题记录。");
        } else {
            System.out.println("错题集:");
            wrongProblems.forEach((problem, count) -> System.out.println(problem + " - 错误次数:" + count));
        }
    }
    public void redoWrongProblems() {
        Scanner scanner = new Scanner(System.in);
        MathProblem problemmath = null;
        WrongProblemManager wrongProblemManager = new WrongProblemManager();
        wrongProblems.forEach((problem, count) -> System.out.println(problem));
        System.out.println("请输入答案:");
        String anwser = scanner.next();
        try {
            double correctAnswer = problemmath.evaluate(problemmath.generateProblem());
            if (!problemmath.checkAnswer(anwser, correctAnswer)) {
                System.out.println("回答错误!");
            } else {
                System.out.println("回答正确!");
            }
        } catch (Exception e) {
            System.out.println("计算过程中出错: " + e.getMessage());
        }
    }
}

public class MathQuiz {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        WrongProblemManager wrongProblemManager = new WrongProblemManager();

        while (true) {
            System.out.println("请选择年级(2、3、4 或 0退出):");
            int grade = scanner.nextInt();
            if (grade == 0) break;

            System.out.print("输入题目数量:");
            int numberOfProblems = scanner.nextInt();

            MathProblem problem = null;

            switch (grade) {
                case 2:
                    problem = new SecondGradeProblem();
                    break;
                case 3:
                    problem = new ThirdGradeProblem();
                    break;
                case 4:
                    problem = new FourthGradeProblem();
                    break;
                default:
                    System.out.println("无效年级,请重新选择!");
                    continue;
            }
            for (int i = 0; i < numberOfProblems; i++) {
                String question = problem.generateProblem();
                System.out.println("问题 " + (i + 1) + ": " + question);
                System.out.print("请输入答案: ");
                String userAnswer = scanner.next();

                try {
                    double correctAnswer = problem.evaluate(question);
                    if (!problem.checkAnswer(userAnswer, correctAnswer)) {
                        System.out.println("回答错误!");
                        wrongProblemManager.addWrongProblem(question, correctAnswer);
                    } else {
                        System.out.println("回答正确!");
                    }
                } catch (Exception e) {
                    System.out.println("计算过程中出错: " + e.getMessage());
                }

            }

            System.out.print("是否查看错题本?(Y/N): ");
            if (scanner.next().equalsIgnoreCase("Y")) {
                wrongProblemManager.displayWrongProblems();
            }
            System.out.println("是否进行错题练习?(Y/N):");
            if (scanner.next().equalsIgnoreCase("Y")) {

            }
            System.out.print("是否开始下一套题目?(Y/N): ");
            if (!scanner.next().equalsIgnoreCase("Y")) {
                break;
            }
        }
        scanner.close();
    }
    private static void domathnumber(int numberOfProblems, String problem,){

    }
}
上午完成了工程实训制作小铁盒; 下午学习了统一建模语言系统实例结构图;
posted @ 2024-10-15 20:39  一只虎鲸  阅读(9)  评论(0编辑  收藏  举报