You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.7 KiB
62 lines
1.7 KiB
package model;
|
|
|
|
import java.util.Random;
|
|
|
|
public abstract class Student {
|
|
protected String name;
|
|
protected String password;
|
|
protected String path;
|
|
protected Random random;
|
|
|
|
public Student(String name, String password, String path) {
|
|
this.name = name;
|
|
this.password = password;
|
|
this.path = path;
|
|
this.random = new Random();
|
|
}
|
|
|
|
/**
|
|
* 生成有效的括号位置
|
|
* 确保括号不会包围整个表达式
|
|
*
|
|
* @param operands 操作数数量
|
|
* @return 包含起始和结束位置的数组 [parenStart, parenEnd]
|
|
*/
|
|
protected int[] bracketMaker(int operands) {
|
|
boolean useParen = operands > 2 && random.nextBoolean();
|
|
int parenStart = 0;
|
|
int parenEnd = operands - 1;
|
|
|
|
while (parenStart == 0 && parenEnd == operands - 1) {
|
|
parenStart = useParen ? random.nextInt(operands - 1) : -2;
|
|
parenEnd = useParen ? random.nextInt(operands - 1 - parenStart) + parenStart + 1 : -2;
|
|
}
|
|
|
|
return new int[]{parenStart, parenEnd};
|
|
}
|
|
|
|
/**
|
|
* 随机选择特殊操作符的位置
|
|
*
|
|
* @param operands 操作数数量
|
|
* @return 标记特殊操作符位置的布尔数组
|
|
*/
|
|
protected boolean[] randomMaker(int operands) {
|
|
int specialNumber = Math.min(operands, random.nextInt(operands) + 1);
|
|
boolean[] specialOpFlags = new boolean[operands];
|
|
|
|
for (int i = 0; i < specialNumber; i++) {
|
|
int pos;
|
|
do {
|
|
pos = random.nextInt(operands);
|
|
} while (specialOpFlags[pos]);
|
|
specialOpFlags[pos] = true;
|
|
}
|
|
|
|
return specialOpFlags;
|
|
}
|
|
|
|
protected abstract String makeOneQuestion();
|
|
|
|
}
|