2 #2

Merged
hnu202326010305 merged 7 commits from develop into main 1 week ago

@ -1,59 +1,63 @@
import java.util.Scanner;
public class ExamSystem {
private final Scanner scanner = new Scanner(System.in);
public Users login() {
Users users = null;
while (users == null) {
System.out.print("请输入用户名和密码: ");
String input = scanner.nextLine();
String[] parts = input.split(" ");
if (parts.length == 2) {
users = Users.login(parts[0], parts[1]);
}
if (users == null) {
System.out.println("请输入正确的用户名、密码");
}
}
System.out.println("当前选择为" + users.getType() + "出题");
return users;
}
public void generateProblems(Users users) {
while (true) {
System.out.print("准备生成" + users.getType()
+ "数学题目,请输入生成题目数量(输入-1将退出当前用户重新登录");
String input = scanner.nextLine().trim();
if (input.equals("-1")) {
break;
}
ProblemsGenerator generator = switch (users.getType()) {
case "小学" -> new PrimaryProblem();
case "初中" -> new JuniorProblem();
case "高中" -> new SeniorProblem();
default -> null;
};
if (input.startsWith("切换为")) {
String target = input.replace("切换为", "");
if (target.equals("小学") || target.equals("初中") || target.equals("高中")) {
users = new Users(users.getName(), users.getPassword(), target);
System.out.println("系统提示:准备生成" + users.getType() + "数学题目");
} else {
System.out.println("请输入小学、初中和高中三个选项中的一个");
}
continue;
}
int num = Integer.parseInt(input);
if (num >= 10 && num <= 30 && generator != null) {
Generator.generate(users, num, generator);
} else {
System.out.println("请输入 10-30 之间的数字");
}
}
}
}
import java.util.Scanner;
public class ExamSystem {
private final Scanner scanner = new Scanner(System.in);
public Users login() {
Users users = null;
while (users == null) {
System.out.print("请输入用户名和密码: ");
String input = scanner.nextLine();
String[] parts = input.split(" ");
if (parts.length == 2) {
users = Users.login(parts[0], parts[1]);
}
if (users == null) {
System.out.println("请输入正确的用户名、密码");
}
}
System.out.println("当前选择为" + users.getType() + "出题");
return users;
}
public void generateProblems(Users users) {
while (true) {
String input = scanner.nextLine().trim();
if (input.equals("-1")) {
break;
}
ProblemsGenerator generator = switch (users.getType()) {
case "小学" -> new PrimaryProblem();
case "初中" -> new JuniorProblem();
case "高中" -> new SeniorProblem();
default -> null;
};
if (input.startsWith("切换为")) {
String target = input.replace("切换为", "");
if (target.equals("小学") || target.equals("初中") || target.equals("高中")) {
users = new Users(users.getName(), users.getPassword(), target);
System.out.print("系统提示:准备生成" + users.getType()
+ "数学题目,请输入生成题目数量(输入-1将退出当前用户重新登录");
} else {
System.out.println("请输入小学、初中和高中三个选项中的一个");
}
continue;
}
try {
int num = Integer.parseInt(input);
if (num >= 10 && num <= 30 && generator != null) {
Generator.generate(users, num, generator);
} else {
System.out.println("请输入 10-30 之间的数字");
}
} catch (NumberFormatException e) {
System.out.println("请输入小学、初中和高中三个选项中的一个");
}
System.out.print("准备生成" + users.getType()
+ "数学题目,请输入生成题目数量(输入-1将退出当前用户重新登录");
}
}
}

@ -1,34 +1,32 @@
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Generator {
public static void generate(Users users, int count, ProblemsGenerator problemsGenerator) {
StringBuilder builder = new StringBuilder();
for (int i = 1; i <= count; i++) {
builder.append(i).append(". ").append(problemsGenerator.generate()).append("\n\n");
}
save(users, builder.toString());
System.out.println("题目生成完成。");
}
private static void save(Users users, String content) {
try {
String folder = "doc/" + users.getType();
java.io.File dir = new java.io.File(folder);
if (!dir.exists()) {
dir.mkdirs();
}
String filename = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")) + ".txt";
FileWriter writer = new FileWriter(folder + "/" + filename);
writer.write(content);
writer.close();
} catch (IOException e) {
System.out.println("保存失败:" + e.getMessage());
}
}
}
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Generator {
public static void generate(Users users, int count, ProblemsGenerator problemsGenerator) {
StringBuilder builder = new StringBuilder();
for (int i = 1; i <= count; i++) {
builder.append(i).append(". ").append(problemsGenerator.generate()).append("\n\n");
}
save(users, builder.toString());
System.out.println("题目生成完成。");
}
private static void save(Users users, String content) {
try {
String folder = "doc/" + users.getName();
java.io.File dir = new java.io.File(folder);
if (!dir.exists()) {
dir.mkdirs();
}
String filename = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")) + ".txt";
FileWriter writer = new FileWriter(folder + "/" + filename);
writer.write(content);
writer.close();
} catch (IOException e) {
System.out.println("保存失败:" + e.getMessage());
}
}
}

@ -1,23 +1,51 @@
import java.util.Random;
public class JuniorProblem implements ProblemsGenerator{
private static final Random RANDOM = new Random();
@Override
public String generate() {
int count = RANDOM.nextInt(5) + 1; // 1~5个数
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
int num = RANDOM.nextInt(20) + 1;
if (RANDOM.nextBoolean()) {
sb.append(num).append("^2");
} else {
sb.append("√").append(num);
}
if (i < count - 1) {
sb.append(" + ");
}
}
return sb.toString();
}
import java.util.Random;
public class JuniorProblem implements ProblemsGenerator {
private static final Random RANDOM = new Random();
private static final String[] OPERATORS = {"+", "-", "*", "/"};
private static final String[] POW_OPERATORS = {"√", "^2"};
@Override
public String generate() {
String primaryExpr = generatePrimaryExpression();
return addPowerOperators(primaryExpr);
}
private String generatePrimaryExpression() {
int count = RANDOM.nextInt(4) + 2;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
sb.append(RANDOM.nextInt(100) + 1);
if (i < count - 1) {
sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" ");
}
}
return sb.toString();
}
private String addPowerOperators(String expr) {
String[] parts = expr.split(" ");
boolean hasPower = false;
for (int i = 0; i < parts.length; i++) {
if (parts[i].matches("\\d+") && (!hasPower || RANDOM.nextBoolean())) {
String op = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)];
parts[i] = op.equals("√") ? "√" + parts[i] : parts[i] + "^2";
hasPower = true;
}
}
if (!hasPower) {
for (int i = 0; i < parts.length; i++) {
if (parts[i].matches("\\d+")) {
String op = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)];
parts[i] = op.equals("√") ? "√" + parts[i] : parts[i] + "^2";
break;
}
}
}
return String.join(" ", parts);
}
}

@ -1,9 +1,11 @@
public class Main {
public static void main(String[] args) {
ExamSystem system = new ExamSystem();
while (true) {
Users users = system.login();
system.generateProblems(users);
}
}
public class Main {
public static void main(String[] args) {
ExamSystem system = new ExamSystem();
while (true) {
Users users = system.login();
System.out.print("准备生成" + users.getType()
+ "数学题目,请输入生成题目数量(输入-1将退出当前用户重新登录");
system.generateProblems(users);
}
}
}

@ -1,20 +1,44 @@
import java.util.Random;
public class PrimaryProblem implements ProblemsGenerator {
private static final Random RANDOM = new Random();
private static final char[] OPS = {'+', '-', '*', '/'};
@Override
public String generate() {
int count = RANDOM.nextInt(5) + 1; // 1~5个数
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
int num = RANDOM.nextInt(100) + 1;
sb.append(num);
if (i < count - 1) {
sb.append(" ").append(OPS[RANDOM.nextInt(OPS.length)]).append(" ");
}
}
return sb.toString();
}
import java.util.Random;
public class PrimaryProblem implements ProblemsGenerator {
private static final Random RANDOM = new Random();
private static final String[] OPERATORS = {"+", "-", "*", "/"};
@Override
public String generate() {
int count = RANDOM.nextInt(4) + 2;
StringBuilder sb = new StringBuilder();
boolean addParentheses = count >= 3 && RANDOM.nextDouble() < 0.5;
if (addParentheses) {
int parenCount = RANDOM.nextInt(count - 2) + 2;
int startPos = RANDOM.nextInt(count - parenCount + 1);
for (int i = 0; i < count; i++) {
if (i == startPos) {
sb.append("( ");
}
int num = RANDOM.nextInt(100) + 1;
sb.append(num);
if (i == startPos + parenCount - 1) {
sb.append(" )");
}
if (i < count - 1) {
sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" ");
}
}
} else {
for (int i = 0; i < count; i++) {
int num = RANDOM.nextInt(100) + 1;
sb.append(num);
if (i < count - 1) {
sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" ");
}
}
}
return sb.toString();
}
}

@ -1,21 +1,107 @@
import java.util.Random;
public class SeniorProblem implements ProblemsGenerator{
private static final Random RANDOM = new Random();
private static final String[] FUNCS = {"sin", "cos", "tan"};
@Override
public String generate() {
int count = RANDOM.nextInt(5) + 1; // 1~5个数
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
int angle = RANDOM.nextInt(90) + 1;
String func = FUNCS[RANDOM.nextInt(FUNCS.length)];
sb.append(func).append("(").append(angle).append("°)");
if (i < count - 1) {
sb.append(" + ");
}
}
return sb.toString();
}
import java.util.Random;
public class SeniorProblem implements ProblemsGenerator {
private static final Random RANDOM = new Random();
private static final String[] OPERATORS = {"+", "-", "*", "/"};
private static final String[] POW_OPERATORS = {"√", "^2"};
private static final String[] TRIG_OPERATORS = {"sin", "cos", "tan"};
@Override
public String generate() {
String primaryExpression = generatePrimaryExpression();
return addHighSchoolOperators(primaryExpression);
}
private String generatePrimaryExpression() {
int count = RANDOM.nextInt(4) + 2;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
int num = RANDOM.nextInt(100) + 1;
sb.append(num);
if (i < count - 1) {
sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" ");
}
}
return sb.toString();
}
private String addHighSchoolOperators(String primaryExpression) {
String[] parts = primaryExpression.split(" ");
StringBuilder result = new StringBuilder();
boolean hasTrigonometry = false;
boolean hasAlgebra = false;
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
if (isNumber(part)) {
if (!hasTrigonometry || RANDOM.nextDouble() < 0.6) {
part = applyTrigOperator(part);
hasTrigonometry = true;
}
else if (RANDOM.nextDouble() < 0.3) {
part = applyAlgebraOperator(part);
hasAlgebra = true;
}
}
result.append(part);
if (i < parts.length - 1) {
result.append(" ");
}
}
if (!hasTrigonometry) {
return addTrigonometryForced(result.toString());
}
return result.toString();
}
private boolean isNumber(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
private String applyTrigOperator(String number) {
String operator = TRIG_OPERATORS[RANDOM.nextInt(TRIG_OPERATORS.length)];
int num = Integer.parseInt(number);
int angle = generateValidAngle(operator);
return operator + angle + "°";
}
private String applyAlgebraOperator(String number) {
String operator = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)];
int num = Integer.parseInt(number);
return operator.equals("√") ? "√" + num : num + "^2";
}
private int generateValidAngle(String trigOp) {
int angle = RANDOM.nextInt(100) + 1;
if (trigOp.equals("tan")) {
while (angle == 90) {
angle = RANDOM.nextInt(100) + 1;
}
}
return angle;
}
private String addTrigonometryForced(String expression) {
String[] parts = expression.split(" ");
for (int i = 0; i < parts.length; i++) {
if (isNumber(parts[i])) {
parts[i] = applyTrigOperator(parts[i]);
break;
}
}
return String.join(" ", parts);
}
}
Loading…
Cancel
Save