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]+"\n";
        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方法适用

  • 调试成功的截图如下:

  • 代码的错误之处:

  • 代码的改正之处:


项目的码云链接

posted on 2018-05-08 18:04  socialsea  阅读(238)  评论(2编辑  收藏  举报