9.25随笔

发布时间 2023-09-25 20:52:12作者: y龙
在今天的课堂上,我们编写了一道程序,要求如下:

 

1、可定制(数量):输入大的出题数量值,测试一下系统是否崩溃,反向查找系统是否优化的余地;

2、定制操作数的个数、定制是否有乘除法、定制是否有括号(随机加入)、定制数值范围(确定操作数的取值范围);

3、定义方法实现错题集、错题重练并记录错题的次数功能。

4、能处理大数和浮点数计算。

5、要求可以同时定义小学二年级口算题、小学三年级口算题、小学四年级口算题。

(1)小学二年级口算题操作数为两个、可进行加减乘除运算(除法必须可以整除),操作数范围不超过100

(2)小学三年级口算题操作数不超过4个,可以进行加减乘除,操作数范围不超过1000.(要求采用继承小学二年级出题类的方式,实现小学三年级的出题类)。

(3)小学四年级口算题操作数不超过5个,可以进行加减乘除,还可以加入括号运算。 (要求采用继承小学三年级出题类的方式,实现小学四年级的出题类)。

6、学生实时答题结束后,可以选择是否进行下一套题目答题,如果选择是,则抽取下一套题进行答题,答题结束可以通过查看错题本,查询今日做题正确率阶段;也可以针对错题进行二次答题。

7、要求将题目输出到文本文件中,三题一行,用户做完后,将文本导入,判读正误,显示统计结果。

 

代码:

 

import java.io.FileWriter;

 

import java.io.IOException;

 

import java.util.ArrayList;

 

import java.util.List;

 

import java.util.Random;

 

 

 

// 口算题抽象类

 

abstract class ArithmeticQuiz {

 

    protected int numOperands; // 操作数个数

 

    protected boolean allowMultiplication; // 是否允许乘法

 

    protected boolean allowDivision; // 是否允许除法

 

    protected boolean allowParentheses; // 是否允许括号

 

    protected int operandRange; // 操作数范围

 

 

 

    public ArithmeticQuiz(int numOperands, boolean allowMultiplication, boolean allowDivision,

 

                          boolean allowParentheses, int operandRange) {

 

        this.numOperands = numOperands;

 

        this.allowMultiplication = allowMultiplication;

 

        this.allowDivision = allowDivision;

 

        this.allowParentheses = allowParentheses;

 

        this.operandRange = operandRange;

 

    }

 

 

 

    public abstract String generateQuiz(); // 生成口算题

 

 

 

    public abstract boolean checkAnswer(String quiz, String answer); // 检查答案

 

}

 

 

 

// 小学二年级口算题类

 

class PrimaryTwoArithmeticQuiz extends ArithmeticQuiz {

 

    public PrimaryTwoArithmeticQuiz() {

 

        super(2, true, false, false, 100);

 

    }

 

 

 

    @Override

 

    public String generateQuiz() {

 

        Random random = new Random();

 

        int operand1 = random.nextInt(operandRange) + 1;

 

        int operand2 = random.nextInt(operandRange) + 1;

 

        char operator = allowMultiplication ? (random.nextInt(2) == 0 ? '+' : '*') : '+';

 

        return operand1 + " " + operator + " " + operand2 + " = ";

 

    }

 

 

 

    @Override

 

    public boolean checkAnswer(String quiz, String answer) {

 

        int expectedAnswer = Integer.parseInt(quiz.substring(0, quiz.length() - 3));

 

        int userAnswer = Integer.parseInt(answer.trim());

 

        return expectedAnswer == userAnswer;

 

    }

 

}

 

 

 

// 小学三年级口算题类

 

class PrimaryThreeArithmeticQuiz extends PrimaryTwoArithmeticQuiz {

 

    public PrimaryThreeArithmeticQuiz() {

 

        super();

 

        this.numOperands = 4;

 

        this.operandRange = 1000;

 

    }

 

}

 

 

 

// 小学四年级口算题类

 

class PrimaryFourArithmeticQuiz extends PrimaryThreeArithmeticQuiz {

 

    public PrimaryFourArithmeticQuiz() {

 

        super();

 

        this.numOperands = 5;

 

        this.allowParentheses = true;

 

    }

 

}

 

 

 

// 学生类

 

class Student {

 

    private List<ArithmeticQuiz> quizzes; // 题目集合

 

    private List<String> wrongAnswers; // 错误答案集合

 

 

 

    public Student() {

 

        quizzes = new ArrayList<>();

 

        wrongAnswers = new ArrayList<>();

 

    }

 

 

 

    public void addQuiz(ArithmeticQuiz quiz) {

 

        quizzes.add(quiz);

 

    }

 

 

 

    public void generateQuizzes(int numQuizzes) {

 

        for (int i = 0; i < numQuizzes; i++) {

 

            int randomIndex = new Random().nextInt(quizzes.size());

 

            ArithmeticQuiz quiz = quizzes.get(randomIndex);

 

            System.out.println(quiz.generateQuiz());

 

        }

 

    }

 

 

 

    public void checkAnswer(String quiz, String answer) {

 

        ArithmeticQuiz arithmeticQuiz = findQuiz(quiz);

 

        if (arithmeticQuiz != null) {

 

            boolean isCorrect = arithmeticQuiz.checkAnswer(quiz, answer);

 

            if (!isCorrect) {

 

                wrongAnswers.add(quiz);

 

            }

 

        } else {

 

            System.out.println("Invalid quiz!");

 

        }

 

    }

 

 

 

    public void exportToFile(String filename) {

 

        try (FileWriter writer = new FileWriter(filename)) {

 

            for (int i = 0; i < wrongAnswers.size(); i += 3) {

 

                writer.write(wrongAnswers.get(i));

 

                writer.write("\t");

 

                if (i + 1 < wrongAnswers.size()) {

 

                    writer.write(wrongAnswers.get(i + 1));

 

                    writer.write("\t");

 

                }

 

                if (i + 2 < wrongAnswers.size()) {

 

                    writer.write(wrongAnswers.get(i + 2));

 

                }

 

                writer.write(System.lineSeparator());

 

            }

 

            writer.flush();

 

        } catch (IOException e) {

 

            e.printStackTrace();

 

        }

 

    }

 

 

 

    private ArithmeticQuiz findQuiz(String quiz) {

 

        for (ArithmeticQuiz arithmeticQuiz : quizzes) {

 

            if (arithmeticQuiz.generateQuiz().equals(quiz)) {

 

                return arithmeticQuiz;

 

            }

 

        }

 

        return null;

 

    }

 

}

 

 

 

public class Main {

 

    public static void main(String[] args) {

 

        Student student = new Student();

 

        student.addQuiz(new PrimaryTwoArithmeticQuiz());

 

        student.addQuiz(new PrimaryThreeArithmeticQuiz());

 

        student.addQuiz(new PrimaryFourArithmeticQuiz());

 

 

 

        int numQuizzes = 10; // 出题数量

 

        student.generateQuizzes(numQuizzes);

 

 

 

        // 模拟学生答题

 

        // 假设学生回答了所有题目,并将答案存储在answers列表中

 

        List<String> answers = new ArrayList<>();

 

        answers.add("3");

 

        answers.add("15");

 

        answers.add("8");

 

        answers.add("1");

 

        answers.add("7");

 

        answers.add("12");

 

        answers.add("10");

 

        answers.add("5");

 

        answers.add("9");

 

        answers.add("4");

 

 

 

        for (int i = 0; i < numQuizzes; i++) {

 

            student.checkAnswer(student.generateQuizzes(i), answers.get(i));

 

        }

 

 

 

        String filename = "wrong_answers.txt";

 

        student.exportToFile(filename);

 

        System.out.println("Wrong answers have been exported to " + filename);

 

    }

 

}