20172307 结对编程项目-四则运算 第二周 阶段总结
(结队项目码云地址)
相关过程截图(关键代码处加了注释)
- 编写出实现中缀转后缀的类Transform
/*
Transform.java 作者:赵晓海 黄宇瑭
用于将一个中缀表达式转换为对应的后缀表达式
*/
import java.util.Stack;
public class Transform {
String former;//中缀表达式
String last;//后缀表达式
//构造函数
public Transform(String former){
this.former=former;
last="";
}
//得到后缀表达式的方法
public String getLast() {
return last;
}
//将中缀表达式转为后缀表达式的方法
public void transform(){
// int length=(former.length()+1)/2;
//StringTokenizer toArraylist=new StringTokenizer(former);
String []str1=former.split("\s");
/*int num1=0;
while (toArraylist.hasMoreTokens()){
str1[num1]=toArraylist.nextToken();
num1++;
}*/
String [] str2=new String[str1.length-1];
for (int a=0;a<str1.length-1;a++)
str2[a]=str1[a];
Stack stack=new Stack();
int num2=0;
while (num2<str2.length){
if(str2[num2].equalsIgnoreCase("+")==false&&str2[num2].equalsIgnoreCase("-")==false&&str2[num2].equalsIgnoreCase("×")==false&&str2[num2].equalsIgnoreCase("÷")==false)
last+=str2[num2]+" ";
else
if (stack.empty()==true)
stack.push(str2[num2]);
else
if ((stack.peek().equals("+")==true||stack.peek().equals("-")==true)&&(str2[num2].equalsIgnoreCase("×")||str2[num2].equalsIgnoreCase("÷")))
stack.push(str2[num2]);
else {
last+=stack.peek()+" ";
stack.pop();
stack.push(str2[num2]);
}
num2++;
}
while (stack.empty()==false){
last+= stack.peek()+" ";
stack.pop();
}
}
}
- 测试Transform
/*
TransformTest.java 作者:赵晓海 黄宇瑭
Transform类的驱动类
*/
public class TransformTest {
public static void main(String[] args) {
Transform a =new Transform("22 + 10/3 ÷ 1/10 =");
a.transform();//使用将中缀表达式转为后缀表达式的方法
System.out.println(a.getLast());
}
}
- 编写出计算后缀表达式值的类Calculate
/*
Calculate.java 作者:赵晓海 黄宇瑭
用于计算一个后缀表达式
*/
import eg.RationalNumber;
import java.util.Stack;
public class Calculate {
String [] str1;
String result;//计算结果
//构造函数
public Calculate (String calculate){
str1=calculate.split("\s");
}
//将字符串形式的整数或者分数转换为RationalNumber类的对象的方法
public RationalNumber toRationalNumber(String num){
if (num.contains("/")==false){
int a =Integer.parseInt(num);
RationalNumber rationalNumber1 =new RationalNumber(a,1);
return rationalNumber1;
}
else {
/* StringTokenizer st = new StringTokenizer(num,"/");
int numerator =Integer.parseInt(st.nextToken("/"));
int denominator=Integer.parseInt(st.nextToken("/"));
*/
String[] Array =num.split("/");
int numerator = Integer.parseInt(Array[0]);
int denominator=Integer.parseInt(Array[1]);
RationalNumber rationalNumber2 =new RationalNumber(numerator,denominator);
return rationalNumber2;
}
}
//计算中缀表达式,并将结果保存在result中的方法
public void ToResult(){
Stack stack1=new Stack();
int start =0;
while (start<str1.length){
if (str1[start].equalsIgnoreCase("+")==false&&str1[start].equalsIgnoreCase("-")==false&&str1[start].equalsIgnoreCase("×")==false&&str1[start].equalsIgnoreCase("÷")==false){
stack1.push(str1[start]);
}
else
if (str1[start].equalsIgnoreCase("+")==true){
RationalNumber num1=this.toRationalNumber(String.valueOf(stack1.peek()));
stack1.pop();
RationalNumber num2=this.toRationalNumber(String.valueOf(stack1.peek()));
stack1.pop();
RationalNumber finish =num2.add(num1);
String str3=finish.toString();
stack1.push(str3);
}
else
if (str1[start].equalsIgnoreCase("-")==true){
RationalNumber num1=this.toRationalNumber(stack1.peek().toString());
stack1.pop();
RationalNumber num2=this.toRationalNumber(stack1.peek().toString());
stack1.pop();
RationalNumber finish =num2.subtract(num1);
String str3=finish.toString();
stack1.push(str3);
}
else
if (str1[start].equalsIgnoreCase("×")==true){
RationalNumber num1=this.toRationalNumber(stack1.peek().toString());
stack1.pop();
RationalNumber num2=this.toRationalNumber(stack1.peek().toString());
stack1.pop();
RationalNumber finish =num2.multiply(num1);
String str3=finish.toString();
stack1.push(str3);
}
else
{
RationalNumber num1=this.toRationalNumber(String.valueOf(stack1.peek()));
stack1.pop();
RationalNumber num2=this.toRationalNumber(String.valueOf(stack1.peek()));
stack1.pop();
RationalNumber finish =num2.divide(num1);
String str3=finish.toString();
stack1.push(str3);
}
start++;
}
String str4=stack1.peek().toString();
result=str4;
}
//得到计算结果的方法
public String getResult() {
return result;
}
}
- 测试Calculate
遇到的困难及解决方法
- 问题一:在对字符串进行比较时用了“=”,导致测试时没有产生预期的效果
- 问题一解决方式:只要用equals,进行比较就行。
- 问题二:在运行计算后缀表达式的驱动类时出现了越界错误。
- 运行错误截图:
- 问题二解决方式:解决这问题的是赵晓海同学,我没有起到什么作用。(在这里引用赵晓海博客的解决过程。)
通过单步调试,String型整数的长度不应定是1,要是整数,字符串中没有字符“/”即可,于是通过查API找到String类中的Contains方法适用. - 调试成功截图
- 代码错误之处
- 代码改正之处
项目划分及贡献值分配
-
我主要负责的是对代码实现的功能进行测试,并对产生的错误提出修改意见
-
贡献值划分
赵晓海:70%
黄宇瑭:30%
结队伙伴评价
赵晓海同学在这次项目的编写中付出的努力比我要多很多很多,而且还会帮我解释我不懂的地方,真的感谢他对我的帮助。
(结队伙伴博客)