简体中文
,繁體中文
,English
ProduceProblem
其中包括能够进行随机数的生成,随机符号的生成且将生成的数字串起来,并打印输出。Translate
将上一个类中生成的中缀表达式转换为后缀表达式且保存,需要定义一个栈再按照栈的操作,对式子进行遍历重排Count
对上述的后缀表达式进行遍历,然后运算结果Judge
进行作业批改,且将对错与否传递给主类进行统计,并输出概率我们还会在之后时间在代码需要调整的时候对类图进行修改
int m = 2 + (int) (Math.random() * 6); //每个运算式数目的个数
符号的个数就是m-1,再将生成的数字与符号交叉排序生成一个字符串。
import java.util.Random;
public class ProduceProblem {
public int ProduceProblem () {
String s = "";
Random shu = new Random();//每个运算式的随机数
int count = 1; //记录符号;
char[] operator = new char[]{'+', '-', '*', '/'};
int m = 2 + (int) (Math.random() * 6); //每个运算式数目的个数
for (int j = 0; j < m; j++) {
int num = shu.nextInt(10);
s = s +" "+ num;
if (count < m) {
int c = shu.nextInt(4);
s = s +" "+ operator[c];
count++;
}
}
String [] str = s.split(" ");
System.out.println(s + "=");
Translate t = new Translate(str);
return t.flag;
}
}
if (z.empty() != true) {
t = z.pop();
if (t.equals("(")) {
z.push(t);
z.push(args[i]);
break;
} else {
z.push(args[i]);
jieguo = jieguo + t + " ";
break;
}
} else {
z.push(args[i]);
break;
}
break;
本来觉得没有问题,但在后来的运行过程中我们发现当有两个没有括号的减法式子相连的时候如3-2*5-6
就会发生转换错误,两个减号的顺序会发生变化导致结果错误。经过讨论后我们发现我们上述的代码有一个问题就是,我们在减号碰到减号时弹出来的减号并没有接上去,且在真正算式中应该是要直到碰到“(”才会结束,所以我们将这一式子改成了while
的循环,才得以解决。
import java.util.Stack;
public class Translate extends Judge{
int flag;
public Translate (String[] args) {
Stack<String> z = new Stack<String>();
String jieguo = "";
String t = "";
for (int i = 0; i < args.length; i++) {
switch (args[i]) {
case "(":
z.push(args[i]);
break;
case "+":
case "-":
while(z.empty() != true) {
t = z.pop();
if (t.equals("(")) {
z.push(t);
break;
}
jieguo = jieguo + t + " ";
}
z.push(args[i]);
break;
case "*":
case "/":
while(z.empty() != true) {
t = z.pop();
if (t.equals("+") || t.equals("-") || t.equals("(")) {
z.push(t);
break;
}
jieguo = jieguo + t + " ";
}
z.push(args[i]);
break;
case ")":
while (z.empty()== false) {
t = z.pop();
if (t.equals("(")) {
break;
} else {
jieguo = jieguo + t + " ";
}
}
break;
case" ":
break;
default:
jieguo = jieguo + args[i] + " ";
break;
}
}
while (z.empty() == false) {
jieguo = jieguo + z.pop() + " ";
}
String [] str = jieguo.split(" ");
Count py = new Count(str);
int answer = py.answer;
flag = A(answer);
}
public Translate() {
}
}
Translate
引用Count
类时传入的字符数组中出现了空,所以我们只能加一句case "":
来排除错误import java.util.Stack;
public class Count{
int answer;
public Count (String[] args) {
Stack<String> z = new Stack<String>();
int num1,num2,d;
for(int i=0;i<args.length;i++) {
switch (args[i]){
case"+":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1+num2;
z.push(String.valueOf(d));
break;
case"-":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1-num2;
z.push(String.valueOf(d));
break;
case"*":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1*num2;
z.push(String.valueOf(d));
break;
case"/":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1/num2;
z.push(String.valueOf(d));
break;
case"":
case" ":
break;
default:
z.push(args[i]);
break;
}
}
while (z.empty() == false) {
answer = Integer.valueOf(z.pop());
}
}
}
Translate
定为Judge
的父类借此来继承它计算出的answer
以此来比较正误,不过发现行不通(目前未找到原因,找到后会写入下一篇博客)。后来我两商议,反着来将Judge
作为父类,让转换类来继承判断正误这项方法。import java.util.Scanner;
public class Judge {
public int A(int answer) {
Scanner scanner = new Scanner(System.in );
System.out.println("请输入你的答案:");
int flag=0;
int n = scanner.nextInt();
if( n == answer) {
System.out.println("正确!");
flag = 1;
}
else {
System.out.println("错误,正确答案是:"+answer);
}
return flag;
}
public Judge() {
}
}
flag
的反复继承应用直到传递到主类中,为1即count
加一进行统计import java.util.Scanner;
public class WpyZry {
public static void main(String[] args) {
System.out.println("请输入要生成的题目数:");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int count=0;
for (int i = 1; i <= n; i++) {
System.out.println("题目"+i+":");
ProduceProblem problem = new ProduceProblem();
if(problem.ProduceProblem() == 1){
count++;
}
}
double zql = (double)count/n;
System.out.println("完成"+n+"道题目,正确率为"+zql*100+"%");
}
}
托管链接:https://gitee.com/wpyzka/20175226/tree/master/src/%E5%9B%9B%E5%88%99%E8%BF%90%E7%AE%97
挺开心我的同伴能接受与我组队的请求,在这个阶段的研讨中他就像比喻中的副驾驶的位置,为我观察这我发现不了的坑,也在必要的分叉口给了我很多有用的建议,比如在生成随机式子的时候我在弄出简单的随机生成之后,生成较长式子的算法就是由他提醒编写的,当然这样的情况会有很多,我负责大体,而他就负责细节,检查。他很好的在结对下扮演了一个领航员的位置。
计划 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
估计这个任务需要多少时间 | 30 | 30 |
开发 | ||
需求分析 (包括学习新技术) | 120 | 150 |
生成设计文档 | 30 | 30 |
设计复审 (和同事审核设计文档) | 60 | 75 |
代码规范 (为目前的开发制定合适的规范) | 90 | 105 |
具体设计 | 30 | 60 |
具体编码 | 720 | 810 |
代码复审 | 60 | 60 |
测试(自我测试,修改代码,提交修改) | 90 | 90 |
报告 | ||
测试报告 | 20 | 20 |
计算工作量 | 10 | 10 |
事后总结, 并提出过程改进计划 | 240 | 270 |
合计 | 1500 | 1710 |
20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)
原文:https://www.cnblogs.com/20175226wpy/p/10656070.html