整个项目我并没有采取web的形式做,因为那样比较复杂,我选择了相对来说更为简单的ui,而且也改进了许多原来的四则运算项目所存在的不足的地方,原来的四则运算就做的很草率,这里我们采用中缀转后缀的方式。 这是我们ui界面
public UI_Cmd() {
this.setLayout((LayoutManager)null);
this.setSize(600, 500);
this.lable1.setBounds(30, 30, 90, 30);
this.numberOfProblems.setBounds(120, 35, 50, 20);
this.lable3.setBounds(30, 70, 90, 30);
this.numberOfOperators.setBounds(120, 75, 50, 20);
this.lable2.setBounds(30, 110, 90, 30);
this.lowerBound.setBounds(120, 115, 50, 20);
this.upperBound.setBounds(180, 115, 50, 20);
this.isEasyBox.setBounds(200, 30, 90, 30);
this.isBracketBox.setBounds(200, 70, 90, 30);
this.preToCore.setBounds(450, 30, 90, 40);
this.preToDo.setBounds(350, 30, 90, 40);
this.finish.setBounds(350, 30, 90, 40);
this.finish.setVisible(false);
this.finish.setEnabled(false);
this.nextOne.setBounds(350, 360, 90, 40);
this.nextOne.setEnabled(false);
this.nextOne.setVisible(false);
this.labelTime.setBounds(100, 370, 150, 40);
this.labelRight.setBounds(100, 400, 150, 40);
this.answer.setBounds(220, 300, 60, 20);
this.labelAnswer.setBounds(100, 300, 130, 30);
this.labelRight.setEnabled(false);
this.labelRight.setVisible(false);
this.labelTime.setEnabled(false);
this.labelTime.setVisible(false);
this.answer.setEnabled(false);
this.answer.setVisible(false);
this.labelAnswer.setEnabled(false);
this.labelAnswer.setVisible(false);
this.upLoadQuestion.setBounds(400, 90, 100, 40);
this.lableStr.setBounds(100, 250, 500, 60);
this.lableStr.setFont(new Font("楷体", 1, 15));
this.add(this.lable1);
this.add(this.numberOfProblems);
this.add(this.lable2);
this.add(this.lowerBound);
this.add(this.upperBound);
this.add(this.lable3);
this.add(this.numberOfOperators);
this.add(this.isBracketBox);
this.add(this.isEasyBox);
this.add(this.lableStr);
this.add(this.preToCore);
this.add(this.preToDo);
this.add(this.finish);
this.add(this.nextOne);
this.add(this.upLoadQuestion);
this.add(this.labelTime);
this.add(this.labelRight);
this.add(this.answer);
this.add(this.labelAnswer);
this.add(this.labelRight);
this.preToCore.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
UI_Cmd.this.labelTime.setEnabled(false);
UI_Cmd.this.labelTime.setVisible(false);
UI_Cmd.this.labelRight.setEnabled(false);
UI_Cmd.this.labelRight.setVisible(false);
UI_Cmd.this.answer.setEnabled(false);
UI_Cmd.this.answer.setVisible(false);
String[] args = new String[9];
try {
int count = 0;
int operator = 1;
int n = Integer.parseInt(UI_Cmd.this.numberOfProblems.getText());
if(!UI_Cmd.this.numberOfOperators.getText().equals("")) {
operator = Integer.parseInt(UI_Cmd.this.numberOfOperators.getText());
}int lowerBoundNumber = Integer.parseInt(UI_Cmd.this.lowerBound.getText());
int uppperBoundNumber = Integer.parseInt(UI_Cmd.this.upperBound.getText());
Boolean isBracket = Boolean.valueOf(UI_Cmd.this.isBracketBox.isSelected());
Boolean isEasy = Boolean.valueOf(UI_Cmd.this.isEasyBox.isSelected());
if(n < 1 || n > 10000 || operator < 1 || operator > 10 || lowerBoundNumber > uppperBoundNumber || lowerBoundNumber < 1 || lowerBoundNumber > 100 || uppperBoundNumber < 50 || uppperBoundNumber > 1000) {
throw new Exception();
}int var12 = count + 1;
args[count] = "-n";
args[var12++] = String.valueOf(n);
args[var12++] = "-m";
args[var12++] = String.valueOf(lowerBoundNumber);
args[var12++] = String.valueOf(uppperBoundNumber);
if(!UI_Cmd.this.numberOfOperators.getText().equals("")) {
args[var12++] = "-o";
args[var12++] = String.valueOf(operator);
}if(isBracket.booleanValue()) {
args[var12++] = "-b";
}if(isEasy.booleanValue()) {
args[var12++] = "-c";
}for(int i = 0;
i < 9;
++i) {
if(args[i] == null) {
args[i] = "NotExit";
}
}Command.main(args);
JOptionPane.showMessageDialog((Component)null, "成功生成文件", "亲爱的学生您好:", 0);
} catch (Exception var11) {
var11.printStackTrace();
JOptionPane.showMessageDialog((Component)null, "出错了", "请重新设置参数", 0);
}}
});
this.preToDo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
UI_Cmd.this.time = Calendar.getInstance().getTimeInMillis();
if(UI_Cmd.this.url.equals("")) {
UI_Cmd.this.url = "result.txt";
}File file = new File(UI_Cmd.this.url);
if(!file.exists()) {
JOptionPane.showMessageDialog((Component)null, "出错了", "您需要先上传题目", 0);
} else {
UI_Cmd.this.labelRight.setEnabled(false);
UI_Cmd.this.labelRight.setVisible(false);
UI_Cmd.this.answer.setEnabled(false);
UI_Cmd.this.answer.setVisible(false);
UI_Cmd.this.preToDo.setVisible(false);
UI_Cmd.this.preToDo.setEnabled(false);
UI_Cmd.this.finish.setVisible(true);
UI_Cmd.this.finish.setEnabled(true);
UI_Cmd.this.nextOne.setEnabled(true);
UI_Cmd.this.nextOne.setVisible(true);
UI_Cmd.this.upLoadQuestion.setVisible(false);
UI_Cmd.this.upLoadQuestion.setEnabled(false);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
UI_Cmd.this.arr[0] = "2016012040";
while((tempString = reader.readLine()) != null) {
if(!tempString.equals("2016012040")) {
UI_Cmd.this.arr[line] = "第" + line + "道题:" + tempString;
++line;
}
}reader.close();
} catch (IOException var14) {
var14.printStackTrace();
} finally {
if(reader != null) {
try {
reader.close();
} catch (IOException var13) {
;
}
}}}
}
});
this.finish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
UI_Cmd.this.finish.setVisible(false);
UI_Cmd.this.finish.setEnabled(false);
UI_Cmd.this.preToDo.setVisible(true);
UI_Cmd.this.preToDo.setEnabled(true);
UI_Cmd.this.nextOne.setVisible(false);
UI_Cmd.this.nextOne.setEnabled(false);
UI_Cmd.this.upLoadQuestion.setVisible(true);
UI_Cmd.this.upLoadQuestion.setEnabled(true);
UI_Cmd.this.preToCore.setVisible(true);
UI_Cmd.this.preToCore.setEnabled(true);
UI_Cmd.this.lableStr.setText("准备开始做题");
String str = "您做题一共花了" + (Calendar.getInstance().getTimeInMillis() - UI_Cmd.this.time) / 1000L + "秒";
UI_Cmd.this.labelTime.setText(str);
UI_Cmd.this.labelTime.setEnabled(true);
UI_Cmd.this.labelTime.setVisible(true);
UI_Cmd.this.labelAnswer.setEnabled(false);
UI_Cmd.this.labelAnswer.setVisible(false);
UI_Cmd.this.answer.setEnabled(false);
UI_Cmd.this.answer.setVisible(false);
UI_Cmd.this.labelRight.setText("您一共做对" + UI_Cmd.this.rightAnswer + "道题");
UI_Cmd.this.labelRight.setEnabled(true);
UI_Cmd.this.labelRight.setVisible(true);
UI_Cmd.this.count = 1;
UI_Cmd.this.rightAnswer = 0;
UI_Cmd.this.arr = new String[10010];
File file = new File(UI_Cmd.this.url);
if(file.exists()) {
file.delete();
}}
});
this.nextOne.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(UI_Cmd.this.count > Integer.parseInt(UI_Cmd.this.numberOfProblems.getText())) {
UI_Cmd.this.answer.setEnabled(false);
UI_Cmd.this.answer.setVisible(false);
UI_Cmd.this.labelAnswer.setVisible(true);
UI_Cmd.this.labelAnswer.setEnabled(true);
UI_Cmd.this.labelRight.setEnabled(true);
UI_Cmd.this.labelRight.setVisible(true);
String str = "您做题一共花了" + (Calendar.getInstance().getTimeInMillis() - UI_Cmd.this.time) / 1000L + "秒";
UI_Cmd.this.labelTime.setText(str);
UI_Cmd.this.labelTime.setEnabled(true);
UI_Cmd.this.labelTime.setVisible(true);
UI_Cmd.this.lableStr.setText("已经把题做完了");
UI_Cmd.this.labelRight.setText("您一共做对" + UI_Cmd.this.rightAnswer + "道题");
JOptionPane.showMessageDialog((Component)null, "出错了", "请重新生成题目", 0);
UI_Cmd.this.nextOne.setEnabled(false);
UI_Cmd.this.nextOne.setVisible(false);
} else {
UI_Cmd.this.labelAnswer.setEnabled(true);
UI_Cmd.this.labelAnswer.setVisible(true);
UI_Cmd.this.answer.setEnabled(true);
UI_Cmd.this.answer.setVisible(true);
UI_Cmd.this.labelTime.setVisible(true);
UI_Cmd.this.labelTime.setEnabled(true);
if(UI_Cmd.this.count != 1 && UI_Cmd.this.answer.getText().equals("")) {
JOptionPane.showMessageDialog((Component)null, "未回答问题", "出错了", 0);
return;
}UI_Cmd.this.lableStr.setText(UI_Cmd.this.arr[UI_Cmd.this.count].substring(0, UI_Cmd.this.arr[UI_Cmd.this.count].lastIndexOf(32)));
if(UI_Cmd.this.count != 1 && (UI_Cmd.this.arr[UI_Cmd.this.count - 1].substring(0, UI_Cmd.this.arr[UI_Cmd.this.count - 1].indexOf(61)) + "= " + UI_Cmd.this.answer.getText()).equals(UI_Cmd.this.arr[UI_Cmd.this.count - 1])) {
UI_Cmd.this.rightAnswer = UI_Cmd.this.rightAnswer + 1;
}
}UI_Cmd.this.count = UI_Cmd.this.count + 1;
UI_Cmd.this.answer.setText("");
}
});
this.upLoadQuestion.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(2);
jfc.showDialog(new JLabel(), "选择");
File file = jfc.getSelectedFile();
if(file.isDirectory()) {
JOptionPane.showMessageDialog((Component)null, "只能选择文件", "提示", 0);
} else if(file.isFile()) {
UI_Cmd.this.url = file.getAbsolutePath();
}if(file == null) {
JOptionPane.showMessageDialog((Component)null, "文件不能为空", "提示", 0);
}}
});
}protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0, 170, 600, 170);
String welcome = "欢迎您开始做题";
g.setFont(new Font("楷体", 1, 30));
g.drawString(welcome, 50, 230);
}
【四则运算器】这里用了之前项目没有用的中缀转后缀
public ToSuffix() {
}public String toSuffix(String infix) {
List queue = new ArrayList();
List stack = new ArrayList();
char[] charArr = infix.trim().toCharArray();
String standard = "*÷+-()";
boolean ch = true;
int len = 0;
for(int i = 0;
i < charArr.length;
++i) {
char chi = charArr[i];
int size;
if(Character.isDigit(chi)) {
++len;
} else if(Character.isLetter(chi)) {
++len;
} else if(chi == 46) {
++len;
} else {
if(Character.isSpaceChar(chi)) {
if(len > 0) {
queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i)));
len = 0;
}
continue;
}if(standard.indexOf(chi) != -1) {
if(len > 0) {
queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i)));
len = 0;
}if(chi == 40) {
stack.add(Character.valueOf(chi));
continue;
}if(!stack.isEmpty()) {
size = stack.size() - 1;
boolean flag;
for(flag = false;
size >= 0 && chi == 41 && ((Character)stack.get(size)).charValue() != 40;
flag = true) {
queue.add(String.valueOf(stack.remove(size)));
--size;
}while(size >= 0 && !flag && ((Integer)basic.get(stack.get(size))).intValue() >= ((Integer)basic.get(Character.valueOf(chi))).intValue()) {
queue.add(String.valueOf(stack.remove(size)));
--size;
}
}if(chi != 41) {
stack.add(Character.valueOf(chi));
} else {
stack.remove(stack.size() - 1);
}
}
}if(i == charArr.length - 1) {
if(len > 0) {
queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len + 1, i + 1)));
}for(size = stack.size() - 1;
size >= 0;
--size) {
queue.add(String.valueOf(stack.remove(size)));
}
}
}return (String)queue.stream().collect(Collectors.joining(","));
}public String suffixToArithmetic(String str, int lowerBound, int upperBound) {
String[] arr = str.split(",");
List list = new ArrayList();
for(int i = 0;
i < arr.length;
++i) {
int size = list.size();
String var8;
switch((var8 = arr[i]).hashCode()) {
case 42:
if(var8.equals("*")) {
double c = Double.parseDouble((String)list.remove(size - 2)) * Double.parseDouble((String)list.remove(size - 2));
if(c == (double)((int)c) && c <= (double)upperBound && c >= (double)lowerBound) {
list.add(String.valueOf(c));
continue;
}return "-1";
}
break;
case 43:
if(var8.equals("+")) {
double a = Double.parseDouble((String)list.remove(size - 2)) + Double.parseDouble((String)list.remove(size - 2));
if(a == (double)((int)a) && a <= (double)upperBound && a >= (double)lowerBound) {
list.add(String.valueOf(a));
continue;
}return "-1";
}
break;
case 45:
if(var8.equals("-")) {
double b = Double.parseDouble((String)list.remove(size - 2)) - Double.parseDouble((String)list.remove(size - 2));
if(b == (double)((int)b) && b <= (double)upperBound && b >= (double)lowerBound) {
list.add(String.valueOf(b));
continue;
}return "-1";
}
break;
case 247:
if(var8.equals("÷")) {
double d = Double.parseDouble((String)list.remove(size - 2)) / Double.parseDouble((String)list.remove(size - 2));
if(d == (double)((int)d) && d <= (double)upperBound && d >= (double)lowerBound) {
list.add(String.valueOf(d));
continue;
}return "-1";
}
}list.add(arr[i]);
}return list.size() == 1?(String)list.get(0):"运算失败";
}
这是项目的核心
public class Core {
private long time;
private static final char[] operator = new char[]{’+’, ‘-’, ‘*’, ‘÷’};
private String pattern;
private boolean brackets;
private int numberOfOperator;
private int lowerNumber;
private int upperNumber;
private int n;
public Core() {
this.setPattern("easy");
this.setBrackets(false);
this.setNumberOfOperator(1);
}public int getN() {
return this.n;
}public void setN(int n) {
try {
if(n <= 0 || n > 10000) {
throw new Exception();
}this.n = n;
} catch (Exception var3) {
System.out.println("Variable of seting the count of problems must be among 1 and 10000");
var3.printStackTrace();
this.setTime(0L);
}}public int getLowerNumber() {
return this.lowerNumber;
}public void setLowerNumber(int lowerNumber) {
try {
if(lowerNumber > 100 || lowerNumber < 1) {
throw new Exception();
}this.lowerNumber = lowerNumber;
} catch (Exception var3) {
System.out.println("The lower bound of the parameter is among 1 and 100");
var3.printStackTrace();
this.setTime(0L);
}}public int getUpperNumber() {
return this.upperNumber;
}public void setUpperNumber(int upperNumber) {
try {
if(upperNumber > 1000 || upperNumber < 50) {
throw new Exception();
}this.upperNumber = upperNumber;
} catch (Exception var3) {
System.out.println("The upper bound of the parameter is among 50 and 1000");
var3.printStackTrace();
this.setTime(0L);
}}public String getPattern() {
return this.pattern;
}public void setPattern(String pattern) {
try {
if(!pattern.equals("-c") && !pattern.equals("easy")) {
throw new Exception();
}this.pattern = pattern;
} catch (Exception var3) {
System.out.println("Wrong command!The legal directive of setting '*' or '÷' is \"-c\" ");
var3.printStackTrace();
this.setTime(0L);
}}public boolean isBrackets() {
return this.brackets;
}public void setBrackets(boolean brackets) {
this.brackets = brackets;
}public int getNumberOfOperator() {
return this.numberOfOperator;
}public void setNumberOfOperator(int numberOfOperator) {
try {
if(numberOfOperator < 1 || numberOfOperator > 10) {
throw new Exception();
}this.numberOfOperator = numberOfOperator;
} catch (Exception var3) {
System.out.println("Illegal the number of operator is among 1 and 10!Please input again");
var3.printStackTrace();
this.setTime(0L);
}}public long getTime() {
return this.time;
}public void setTime(long time) {
this.time = time;
}public String[] getCaculate(int n) {
this.setN(n);
String[] arr = new String[10011];
String str = null;
for(int i = 0;
i < this.n;
++i) {
int rOperator;
do {
do {
rOperator = (int)(Math.random() * (double)(this.getNumberOfOperator() * 2 + 1) + 1.0D);
} while(rOperator % 2 != 1);
} while(rOperator == 1);
double result;
do {
int rLowerBrackets = (int)(Math.random() * (double)(rOperator - 2) + 1.0D);
int rUpperBrackets = (int)(Math.random() * (double)(rOperator - 2) + 3.0D);
if(rLowerBrackets >= rUpperBrackets || rLowerBrackets % 2 == 0 || rUpperBrackets % 2 == 0) {
do {
do {
rLowerBrackets = (int)(Math.random() * (double)(rOperator - 2) + 1.0D);
rUpperBrackets = (int)(Math.random() * (double)(rOperator - 2) + 3.0D);
} while(rUpperBrackets <= rLowerBrackets);
} while(rLowerBrackets % 2 != 1 || rUpperBrackets % 2 != 1);
}str = "";
int temp = 0;
for(int j = 1;
j <= rOperator;
++j) {
int count = 0;
int[] rTemp = new int[100];
int random = (int)(Math.random() * (double)(this.getUpperNumber() - this.getLowerNumber() + 1) + (double)this.getLowerNumber());
if(j == rLowerBrackets && this.isBrackets()) {
str = str + '(';
}int r;
if(j % 2 == 1) {
boolean flag = true;
if(j != 1 && str.charAt(str.length() - 1) == 247) {
for(r = 2;
r < temp;
++r) {
if(temp % r == 0) {
rTemp[count++] = r;
}
}r = (int)(Math.random() * (double)count);
str = str + String.valueOf(rTemp[r]);
flag = false;
temp = rTemp[r];
}if(j != 1 && str.charAt(str.length() - 1) == 42) {
r = (int)(Math.random() * 10.0D + 3.0D);
str = str + String.valueOf(r);
flag = false;
temp = r;
}if(flag) {
str = str + String.valueOf(random);
temp = random;
}
}if(j == rUpperBrackets && this.isBrackets()) {
str = str + ')';
}if(j % 2 == 0) {
if(this.getPattern().equals("-c")) {
r = (int)(Math.random() * 4.0D);
str = str + operator[r];
} else {
r = (int)(Math.random() * 2.0D);
str = str + operator[r];
}
}
}ToSuffix tx = new ToSuffix();
result = Double.parseDouble(tx.suffixToArithmetic(tx.toSuffix(str), this.getLowerNumber(), this.getUpperNumber()));
} while(result < 0.0D || result > 10000.0D);
if(this.getPattern().equals("-c")) {
arr[i] = str + " = " + (int)result;
} else {
arr[i] = str + " = " + (int)result;
}
}return arr;
}