实现一个命令行程序,要求:
自动生成小学四则运算题目(加、减、乘、除)
- 支持整数
- 支持多运算符(比如生成包含100个运算符的题目)
- 支持真分数
- 统计正确率
import java.util.Random;
int num = randnum.nextInt(100) + 2;
str = s.split(" ");
for (int i = 0; i < str.length; i = i + 2) {
choicechar = randnum.nextBoolean();
if (choicechar && i != str.length - 1) { //产生左括号
str[i] = "( " + str[i];
countLBracket++;
}
choicechar = randnum.nextBoolean();
if (choicechar && !str[i].startsWith("(") && countLBracket != 0) {
str[i] = str[i] + " )";
countLBracket--;
}
}
for (int i = countLBracket; i > 0; i--)
str[str.length - 1] = str[str.length - 1] + " )";
for (String i : str)
s2 = s2 + i + " ";
return s2;
}
str[str.length - 1] = str[str.length - 1] + " )"
当生成的左括号后面没有与之匹配的右括号时就在最后一个操作数后面把所有的右括号补全。 while (tokenizer.hasMoreTokens()){
token=tokenizer.nextToken();
if (isOperator(token)){
if (!OpStack.empty()){
if(judgeValue(token)>judgeValue(OpStack.peek()) && !token.equals(")") || token.equals("("))
OpStack.push(token);
else if (token.equals(")")){
//如果遇到一个右括号则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止
while (!OpStack.peek().equals("("))
output=output.concat(OpStack.pop()+" ");//弹出左括号上面的所有东西
OpStack.pop();//弹出左括号
}
else {
while (!OpStack.empty() && judgeValue(token)<=judgeValue(OpStack.peek())){
////如果遇到其他任何操作符,从栈中弹出这些元素直到遇到发现更低优先级的元素或栈空为止
output=output.concat(OpStack.pop()+" ");
}
OpStack.push(token);
}
}
else
OpStack.push(token);//如果栈空则直接将遇到的操作符送入栈中,第一个不可能为右括号
}
else {
output=output.concat(token+" ");//如果遇到操作数就直接输出
}
}
while (!OpStack.empty()){
//如果读到了输入分末尾,则将占中所有元素依次弹出
output=output.concat(OpStack.pop()+" ");
}
while (tokenizer.hasMoreTokens()){
token=tokenizer.nextToken();
if(isOperator(token)){
op2=stack.pop();
op1=stack.pop();
result=calcSingle(op1,op2,token);
stack.push(new Integer(result));
}
else {
stack.push(new Integer(token));
}
try {
……
}catch (ArithmeticException e){
……
}
码云链接: https://gitee.com/imjoking/PairWork
解决方法:将‘(’和‘)’也放入操作符数组中,进行随机生成操作符。
先生成不带括号的算式,然后随机在数字左边插入‘(‘,接着随机插入‘)‘,个数和‘(‘一样且不会出现在同一个数字两侧。
private int calcSingle(int op1,int op2,String operation){
int result=0;
switch (operation){
case "+":
result=op1+op2;
break;
case "-":
result=op1-op2;
break;
case "*":
result=op1*op2;
break;
case "÷":
result=op1/op2;
break;
}
return result;
}
我认为需要改进的地方就是还是应该多交流,尽量凑在一起写代码,这样才是真正的结对编程。
PSP2.1 | Personal Software Process Stages | 预估耗时(小时/分钟) | 实际耗时(小时/分钟) |
---|---|---|---|
Planning | 计划 | 2小时 | 4小时 |
· Estimate | · 估计这个任务需要多少时间 | 20小时 | 28小时半 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 4小时 | 2小时半 |
· Design Spec | · 生成设计文档 | ||
· Design Review | ·设计复审(和同事审核设计文档) | 2小时 | 1小时 |
·Code Standard | ·代码规范 | 半小时 | 50分钟 |
·Design | ·具体设计 | 1小时 | 半小时 |
·Coding | ·具体编码 | 5小时 | 8小时 |
·Code Review | ·代码复审 | 2小时 | 5小时 |
·Test | ·测试(自我测试,修改代码,提交修改) | 1小时 | 2小时半 |
Reporting | 报告 | 1小时 | 3小时 |
·Test Report | ·测试报告 | ||
·Size Measurement | ·计算工作量 | 半小时 | 半小时 |
·Postmortem&Process Improvement Plan | ·事后总结,并提出过程改进计划 | 半小时 | 40分钟 |
合计 | 19小时半 | 28小时半 |
原文:https://www.cnblogs.com/20175211lyz/p/10657447.html