20172307 结对编程项目-四则运算 第二周 阶段总结

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%

结队伙伴评价

赵晓海同学在这次项目的编写中付出的努力比我要多很多很多,而且还会帮我解释我不懂的地方,真的感谢他对我的帮助。
(结队伙伴博客)

结队照片

posted @ 2018-05-08 21:38  做作业  阅读(216)  评论(2编辑  收藏  举报