zoukankan      html  css  js  c++  java
  • 20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    结对伙伴

    • 学号 :20172307

    • 姓名 :黄宇瑭

    • 伙伴第一周博客地址

    • 对结对伙伴的评价:黄宇瑭同学的优势在于能够想出一些优化的方案,发现代码的不足之处,但是编写代码的能力有待提高,继续加油吧!!


    小组结对编程的photo

    HERE!


    项目中自己负责的部分

    具体的编码

    个人贡献度划分

    在我看来,虽然主要是我进行了具体的编码工作,但是代码的最终实现离不开黄宇瑭同学对代码的测试以及指正不足,正是这样我才能投入到编码中去,所以贡献度的划分我觉得应该是55开

    相关过程的截图

    • 生成题目类驱动类的运行截图


    • 中缀表达式转为后缀表达式类的驱动类运行截图


    • 后缀表达式计算的驱动类运行截图


    关键代码解释

    1.在生成表达式的类Create中使用了自己编写的生成随机分数的类Fraction
    • Create类代码如下:
    /*
    Create.java         作者:赵晓海 黄宇瑭
    用于生成用户指定个数指定等级的题目,且题目中含有分数
     */
    public class Create {
        String[]Arraylist;//保存题目的数组
        int num,rate;//题目的个数和等级
    
        //构造函数
        public Create(int num ,int rate)
        {
            this.num=num;
            this.rate=rate;
            Arraylist=new String[num];
        }
    
        //生成相应等级的一个题目的方法
        public String questionRate(int a)
        {
            String express="";
            String[]OC={"+","-","×","÷"};
    
            for (int c=0;c<a;c++) {
                Fraction b = new Fraction();
                String d=b.getFraction();
                String e=OC[(int) (Math.random() * 4)];
                while (d=="0"&&e=="÷") {
                    Fraction f=new Fraction();
                    d = f.getFraction();
    
                }
                express +=d+" "+e+ " ";
            }
    
            Fraction c=new Fraction();
            String e=c.getFraction();
            while (express.charAt(4*rate-1)=='÷'&&e=="0")
            {
                Fraction d=new Fraction();
                e=d.getFraction();
            }
    
            express+=e+" "+"=";
            return express;
        }
        //生成相应个数,相应等级题目,且将其放入ArrayList数组中保存的方法
        public  void QuestionNum(){
            Create F=new Create(num,rate);
            for(int a=0;a<num;a++)
                Arraylist[a]=F.questionRate(rate);
        }
    
        //返回ArrayList数组的方法
        public String[] getArraylist() {
            return Arraylist;
        }
    
        //返回数组中指定索引处表达式的方法
        public String getArraylist2(int a)
        {
            String b;
            b=Arraylist[a];
            return b;
        }
        //输出的得到的表达式的方法
        public String toString() {
            String a="";
            for (int b=0;b<num;b++)
                a+=Arraylist[b]+"
    ";
            return a;
        }
    }
    
    
    • Fraction类代码如下:
    /*
     Fraction.java           作者:赵晓海  黄宇瑭
     用于生成随机最简分数或者整数且不大于50
     */
    public class Fraction {
        int numerator, denominator;
    
        //构造函数
        public Fraction() {
           numerator= (int) (Math.random()*51);
           denominator= (int) (Math.random()*51);
           if(denominator==0)
               denominator=1;
           reduce();
     }
        //保证遵循分数的规则
        public void reduce() {
            if (numerator != 0) {
                int common = gcd(Math.abs(numerator), denominator);
    
                numerator = numerator / common;
                denominator = denominator / common;
            }
        }
        //保证遵循分数的规则
        private int gcd(int num1, int num2) {
            while (num1 != num2)
                if (num1 > num2)
                    num1 = num1 - num2;
                else
                    num2 = num2 - num1;
    
            return num1;
        }
    
        //得到最简分数或者整数的方法
        public String getFraction()
        {
            String result;
            if(numerator==0)
                result="0";
            else
                if(denominator==1)
                    result=numerator+"";
            else
                result=numerator+"/"+denominator;
            return result;
        }
    }
    
    
    2.在计算后缀表达式的类Calculate中直接使用了第七章的RationalNumber类
    • Calculate类代码如下:
    /*
    Calculate.java         作者:赵晓海  黄宇瑭
    用于计算一个后缀表达式
     */
    import chap7.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;
        }
    
    }
    
    

    遇到的困难及解决办法

    • 问题一:在编写代码时判断两字符串是否相等使用`==``导致出错。

    • 问题一解决方法:

    通过组内商讨发现问题所在 ,并改用.equals()方法


    • 问题二:在运行计算后缀表达式的驱动类时出现越界错误

    • 运行错误截图如下:

    • 问题二解决方案:

    通过单步调试恍然大悟,String型整数的长度不应定是1,要是整数,字符串中没有字符/即可,于是通过查API找到String类中的Contains方法适用

    • 调试成功的截图如下:

    • 代码的错误之处:

    • 代码的改正之处:


    项目的码云链接

  • 相关阅读:
    【hihocoder】1237 : Farthest Point 微软2016校招在线笔试题
    POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。
    Gym 100633G Nano alarm-clocks
    shell script 的追踪与 debug
    vim使用心得
    Linux修改vimrc配置文件,让vi更贴心
    shell script中的case……esac判断
    stl容器区别: vector list deque set map-底层实现
    const对象为什么可以在头文件中定义
    shell script中的syntax error near unexpected token `then' 问题
  • 原文地址:https://www.cnblogs.com/zhaoxiaohai/p/9009857.html
Copyright © 2011-2022 走看看