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

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

小组成员

  • 20172313 余坤澎
  • 20172332 于欣月
  • 20172326 康皓越

小组编程照片

1333460-20180509231140469-459330316.png

设计思路

  1. 通过一个Element和Num类来作为基本元素获得表达式
  2. 通过一个Expression来将各个元素组合起来
  3. 通过Cal将表达式计算出来
  4. 通过用户类将结果计算出来,并判断其正负

    重要代码

 public void getNum() {
        Random num = new Random();
        numerator = num.nextInt(9);//分子
        denominator = num.nextInt(9)+1;//分母
        if (denominator == 1 && numerator != 0)//分母为1,结果为分子。
            number = numerator + "";
        else if (numerator == 0)//分子为0,结果为分母。
            number = denominator + "";
        else if (denominator == numerator )
            number = 1 + "";
        else {
            reduce();//约分
            if (numerator < denominator)//约分后分子小于分母
                number = " ( "+ numerator + "/" + denominator+" ) ";
            else if (numerator > denominator)//约分后分子大于分母,交换分子分母
                number = " ( "+denominator + "/" + numerator+" ) ";
        }
    }
    //约分的方法
    private int gcd(int num1,int num2)
    {
        while (num1 !=num2) {
            if (num1 > num2)
                num1 = num1 - num2;
            else
                num2 = num2 - num1;
        }

        return num1;
    }
    private void reduce()
    {
        if (numerator !=0)
        {
            int common = gcd(Math.abs(numerator),denominator);

            numerator = numerator/common;
            denominator = denominator/common;
        }
    }

本段为生成分数以及通分,提取公约数

 Random a = new Random();
            //是否有括号
            int or = a.nextInt(2);
            //无括号
            if (or == 0) {

通过随机数来判断表达式中是否有括号0为没有,1为有。

 for (int index = 0; index <= times; index++) {
                    int c = time.nextInt(4);
                    Elements q = new Elements();
                    //开始生成表达式
                    if (c == 0) {
                        num.getNum();
                        q.add();
                        result += num.toString() + q;
                        count1++;
                    }
                    if (c == 1) {
                        num.getNum();
                        q.sub();
                        result += num.toString() + q;
                        count1++;
                    }
                    if (c == 2) {
                        num.getNum();
                        q.mul();
                        result += num.toString() + q;
                        count2++;
                    }
                    if (c == 3) {
                        num.getNum();
                        q.div();
                        result += num.toString() + q;
                        count2++;
                    }

通过0,1,2,3来选择加减乘除

public List<String> work(String str){
        List<String> list = new ArrayList<String>();
        char c;
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<str.length();i++){
            c = str.charAt(i);
            if(isDigit(c)){
                sb.append(c);

            }
            if(isOp(c)){
                if(sb.toString().length()>0){
                    list.add(sb.toString());
                    sb.delete(0, sb.toString().length());
                }
                list.add(c+"");
            }
        }
        if(sb.toString().length()>0){
            list.add(sb.toString());
            sb.delete(0, sb.toString().length());
        }
        return list;
    }
    public void printList(List<String> list){
        for(String o:list){
            System.out.print(o+" ");
        }
    }

将生成的表达式数字与符号分别存入数组与栈中

   if(s.equals("+")){
                    double a1 = (double) stack.pop();
                    double a2 = (double) stack.pop();
                    double v = a2+a1;
                    stack.push(v);
                }else if(s.equals("-")){
                    double  a1 = (double) stack.pop();
                    double  a2 = (double) stack.pop();
                    double v = a2-a1;
                    stack.push(v);
                }else if(s.equals("*")){
                    double a1 = (double) stack.pop();
                    double a2 = (double) stack.pop();
                    double v = a2*a1;
                    stack.push(v);
                }else if(s.equals("/")||s.equals("÷")){
                    double a1 = (double) stack.pop();
                    double a2 = (double) stack.pop();
                    double v = a2/a1;
                    stack.push(v);

表达式的计算,包含了优先级的选择,以及栈操作使得计算得以使用。

项目链接

小组结对博客

于欣月同学

余坤澎

代码贡献度

余坤澎 于欣月 康皓越
个人贡献度 30% 40% 30%

遇到的困难及解决方法

  1. 运算符的生成问题,一开始时打算使用随机数来表示输出,但是后续的括号无法进行合并,遂放弃。解决方法:将所有符号改为单个方法,例如,加方法只有加号。而值得说的是括号方法有两个,一个左一个右。
  2. 表达式类中的第三等级,因为同样是使用随机数来决定各个加减乘除运算的位置以及个数,但是会出现只有加减或者只有乘除的情况。解决方法:运用一个int型的count变量来监控加减或乘除,如果没有,自动生成相应的缺失运算。
  3. 优先级的问题,是继续在element方法中定义还是怎样?解决方法:直接在cal中计算前,也就是进栈时,规定谁优先。

文件扩展

  1. 判断正确率
  2. 将生成的题目用IO流输入一个文件,生成一个题库

转载于:https://www.cnblogs.com/326477465-a/p/9011498.html

原文地址:https://www.cnblogs.com/twodog/p/12136942.html