20165101刘天野 2017-2018-2 《Java程序设计》 结对编程练习_四则运算(第二周)

时间:2023-12-17 20:56:56

20165101刘天野 2017-2018-2 《Java程序设计》 结对编程练习_四则运算(第二周)

一、需求分析

  • 能随机生成n道四则运算题目,n由使用者输入
  • 支持分数运算
  • 支持多运算符
  • 能够判断正误,错误时能提醒并输出正确答案
  • 能计算出正确率

二、设计思路

本项目主要分为两大部分。第一部分是对复杂计算式的计算,第二部分是随机题目的生成。

对于复杂计算式的计算,我参考了娄老师的博客2016-2017-2 《Java 程序设计》课堂实践项目——数据结构应用中的逆波兰式的思想来解决,真分数的运算参考课本中第四章的例子22。

对于随机计算式的生成,我利用了Random类中的nextInt()方法,根据生成的随机数,生成对应的运算符和数字,从而形成计算式。

三、本周达成功能:

  • 能够随机生成n道题目,n由用户输入;
  • 支持真分数运算,支持多运算符;
  • 能够计算正确率。

三、关键代码及解释

复杂计算式的读取与计算:

Rational manage() {
int i=0;
Rational r = new Rational();
double d;
while(true) {
if(i>=a.length())
break;
char c = a.charAt(i);
if(c>='0' && c<='9') {//从字符串中检测数字
String temp = String.valueOf(c);
String s = new String();
s = s+temp;
i++;
if(i>=a.length()) {
d = Double.parseDouble(s);
r.setNumerator(d);
datastack.push(r);
break;
}
c = a.charAt(i);
while(c>='0' && c<='9') {
temp = String.valueOf(c);
s = s+temp;
i++;
if(i>=a.length())
break;
c = a.charAt(i);
}
d = Double.parseDouble(s);
r.setNumerator(d);
datastack.push(r);
continue;
}
else if(c=='*' || c=='/') {//从字符串中检测运算符
while(true) {
if(charstack.top==-1) {//如果符号栈顶无元素,入栈。
charstack.push(c);
break;
}
if(charstack.a[charstack.top]=='+' || charstack.a[charstack.top]=='-') {//如果符号栈顶是+或-,入栈。
charstack.push(c);
break;
}
else if((charstack.a[charstack.top]=='*' || charstack.a[charstack.top]=='/') && (datastack.top>=1)) {//如果符号栈顶是*或/,并且栈内元素大于等于1,计算。
calculate(charstack.a[charstack.top]);
continue;
}
else {
charstack.push(c);
break;
}
}
}
else if(c=='+' || c=='-') {
while(true) {
if(charstack.top==-1) {//如果符号栈顶无元素,入栈。
charstack.push(c);
break;
}
else if((charstack.a[charstack.top]=='+' || charstack.a[charstack.top]=='-' || charstack.a[charstack.top]=='*' || charstack.a[charstack.top]=='/') && (datastack.top>=1)) {
calculate(charstack.a[charstack.top]);//计算。
continue;
}
else {
charstack.push(c);
break;
}
} }
else if(c=='(') {//如果符号是(,入栈。
charstack.push(c);
}
else if(c==')') {//如果符号是),栈内符号依次计算。
while(true) {
if(charstack.a[charstack.top]=='(') {
charstack.pop();
break;
}
else {
calculate(charstack.a[charstack.top]);
}
}
}
i++;
}
while(true) {
if(datastack.top>=1)
calculate(charstack.a[charstack.top]);
else
break;
}
return datastack.pop();
}

四、UML图

20165101刘天野 2017-2018-2 《Java程序设计》 结对编程练习_四则运算(第二周)

五、测试方法

六、运行过程截图

20165101刘天野 2017-2018-2 《Java程序设计》 结对编程练习_四则运算(第二周)

七、代码托管

码云链接

八、遇到的困难

问题一:随机生成题目,如何随机生成括号,以及如何保证生成计算式的正确性。

PSP

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 0.5 0.5
Estimate 估计这个任务需要多少时间 0.5 1
Development 开发 2 2.5
Analysis 需求分析(包括学习新技术) 2 4
Design Spec 生成设计文档 1 1
Disign Review 设计复审(和同事审核设计文档) 0.5 1
Code Standard 代码规范 2 2
Design 具体设计 3 2
Coding 具体编码 5 6
Code Review 代码复审 1 1.5
Test 测试(自我测试,修改代码,提交修改) 2 3
Reporting 报告 2 2.5
Test Report 测试报告 1.5 2
Size Measurement 计算工作量 0.5 0.5
Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 1 1
total 合计 24.5 30.5

九、点评伙伴

随着合作的次数不断增加,我和队友的配合也愈发默契了,结队编程的效率有显著的提升。在关键问题的决策我们也能很快达成共识,这样很有利于我们项目的推进。希望我们以后还能一起合作,一起学习,一起做项目。