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);
}
}