20175310结对编程项目-四则运算 阶段总结博客
结对小组组员:20175310 20175317
一、题目要求
实现一个命令行程序,要求:
- 自动生成小学四则运算题目(加、减、乘、除)
·支持整数
·支持多运算符(比如生成包含100个运算符的题目)
·支持真分数 - 统计正确率
- 第一周要求输出整数/多运算符(题目生成/题目运算判题)
二、需求分析
根据题目要求,这个项目需要达到的内容主要为以下几个方面:
1、自动生成表达式(包含多运算符,随机数为整数)
2、计算自动生成的表达式的结果
3、判断用户输入的答案是否和正确答案相符
4、计算正确率
三、设计思路
1、自动生成表达式(包含多运算符,随机数为整数)
①表达式的产生:
用random
产生随机数,这次实验一共要生成两个随机数,一个是随机数a
,表示运算符个数,那么表达式中数字有a+1
个;另一个是在类fuhao
中的随机数m
(取值范围1~4),表示+-*÷
四则运算。下面是生成随机数a
的程序:
Random random=new Random(); //生成随机数
int a = random.nextInt(5)+1; //生成1到5之间的随机数a,表示运算符个数
②表达式的输出:
在j循环中,用System.out.print(b);
将生成的随机数b
输出,由于运算符比运算数少一个,所以输出运算符时要加一个判断:
if (j <= a) {
fuhao k = new fuhao(); //声明类fuhao的对象k
char q = k.yunsuanfu(); //产生一个运算符q
System.out.print(q); //将生成的随机符号输出
Question = Question + b +q; //将生成的随机数和随机符号存入Question中
}
else{
Question = Question + b; //将生成的随机数存入Question中
}
③表达式的读取:
由于上面的表达式是一个数字一个运算符独立输出的,因此在系统看来表达式并不是一个整体。通过字符串拼接的方式将生成的随机数和运算符读取到字符串Question
中:
String Question = new String(""); //系统随机生成的表达式
for (int j=1;j<=a+1;j++) {
int b = random.nextInt(10) ; //生成0到9之间的随机数b,表示表达式中出现的随机数,共a+1个
System.out.print(b); //将生成的随机数输出
if (j <= a) {
fuhao k = new fuhao(); //声明类fuhao的对象k
char q = k.yunsuanfu(); //产生一个运算符q
System.out.print(q); //将生成的随机符号输出
Question = Question + b +q; //将生成的随机数和随机符号存入Question中
}
else{
Question = Question + b; //将生成的随机数存入Question中
}
}
2、计算自动生成的表达式的结果
第一步已经将系统生成的表达式存入Question
中,因此问题转换为已知表达式求值。这个问题和我上周做的实验一实现四则运算十分类似,我就讲上周的代码进行了一些修改,并在程序中重新声明了一个名为sizeyunsuan
的类,代码如下:
class sizeyunsuan{
static Stack<Character> op = new Stack<>();
//计算后缀式的值
public static float calrp(String rp){//参数rp:后缀式
Stack<Float> v = new Stack<>();
char[] arr = rp.toCharArray();
int len = arr.length;
for(int i = 0; i < len; i++){
Character ch = arr[i];
// 如果是操作数,则推到堆栈
if(ch >= '0' && ch <= '9') v.push(Float.valueOf(ch - '0'));
// 如果是运算符,则计算结果
// 在堆栈中有前2个操作数的情况下,将结果推送到堆栈中
else v.push(getv(ch, v.pop(), v.pop()));
}
return v.pop();//返回值return:表达式结果
}
//将中缀式转换为后缀式
public static String getrp(String s){//参数s:中缀形式的字符串
char[] arr = s.toCharArray();
int len = arr.length;
String out = "";
for(int i = 0; i < len; i++){ //从左到右扫描中缀式
char ch = arr[i];
if(ch == ' ') continue;
if(ch >= '0' && ch <= '9') {// 如果是操作数,则直接输出
out+=ch;
continue;
}
if(ch == '+' || ch == '-'){//如果遇到“+”或“-”,则从堆栈中弹出运算符,直到遇到“(”,然后输出,并进栈。
while(!op.empty() && (op.peek() != '('))
out+=op.pop();
op.push(ch);
continue;
}
if(ch == '*' || ch == '÷'){//如果是“*”或“÷”,则退栈并输出,直到优先级较低或“(”将运算符进栈
while(!op.empty() && (op.peek() == '*' || op.peek() == '÷'))
out+=op.pop();
op.push(ch);
continue;
}
if(ch == '(') op.push(ch);//如果遇到“(”,则直接进栈
if(ch == ')'){ //如果遇到“)”一直退栈输出,直到退到“(”,弹出“(”
while(!op.empty() && op.peek() != '(')
out += op.pop();
op.pop();
continue;
}
}
while(!op.empty()) out += op.pop();
return out;//返回值return:后缀形式的字符串
}
public static Float getv(char op, Float f1, Float f2){
if(op == '+') return f2 + f1;
else if(op == '-') return f2 - f1;
else if(op == '*') return f2 * f1;
else if(op == '÷') return f2 / f1;
else return Float.valueOf(-0);
}
}
这一部分的设计思路和问题及解决方案在2018-2019-2 20175310实验一《Java开发环境的熟悉》实验报告中有详细的描述。
3、判断用户输入的答案是否和正确答案相符
在第二步中我们已经得到了表达式的正确结果right
,所以这一步只需要比较用户输入的答案answer
和正确答案right
是否一致。
Scanner reader2=new Scanner(System.in);
double answer = reader2.nextDouble(); //读取用户输入的答案
if (answer==right){
System.out.println("回答正确!");
count++;
}
else{
System.out.println("回答错误!正确答案是:"+right);
}
4、计算正确率
在第三步比较answer
和right
答案是否一致的同时,如果相等,count++
(count
初值为0)。当循环结束之后,正确题数count/总题数x
就是正确率lv
。
float lv=count*100/x; //正确率
System.out.println("测试结束!正确率为:"+lv+"%");
四、UML类图
五、运行过程截图
六、代码托管地址
https://gitee.com/xicyannn/20175310xcy/blob/master/src/结对/四则运算/yunsuan.java
本次任务的完整代码在码云结对/四则运算
文件夹中。
七、遇到的困难及解决方法
本次实验遇到的问题和解决方案都在 三、设计思路
中有详细的说明。
八、对结对的小伙伴做出评价
我结对的小伙伴是钟睿文,这次的任务主要是由我来写,他来提供思路和指出问题。这次配合还是很顺利的,我在编写代码的过程中出现了很多问题,也有许多没有达到题目要求的地方,钟睿文同学都及时提醒我,并提供了合适的思路。
九、PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 30 | 45 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 40 |
· Design | · 具体设计 | 60 | 90 |
· Coding | · 具体编码 | 120 | 150 |
· Code Review | · 代码复审 | 30 | 45 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 50 |
Reporting | 报告 | ||
· Size Measurement | · 计算工作量 | 10 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | 20 |
合计 | 395 | 550 |