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

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

结对伙伴

  • 学号 :20172324
  • 姓名 :曾程
  • 伙伴第一周博客地址:
  • 对结对伙伴的评价:一个很优秀的同学,在这次项目中,即使每天要跳啦啦操,也任劳任怨、一丝不苟、兢兢业业地努力完成了自己的任务。

小组结对编程的照片

项目中自己负责的部分

  • 其实大部分都是我们一起讨论研究,共同完成的,如果硬要分,按每个人出力多的算,我主要负责的是对产生题目的处理和计算以及判断正误。

个人贡献度划分

  • 大家都很努力了,五五开吧
    • 20172321 吴恒佚 50%
    • 20172324 曾程 50%

相关过程的截图

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

  • 正式产生题目并计算判断运行截图

关键代码解释

  • 我们生成题目的类有一些不足,应该用一个for循环会好一些,我们以后会改正的。
for (int i = 0; i < num; i++) {
                    int n = random.nextInt(1) + 1; //1个运算符
                    int[] number = new int[n + 1];
                    String ex = new String();

                    for (int j = 0; j <= n; j++) {
                        number[j] = random.nextInt(10) + 1; //2个数字
                    }
                    for (int j = 0; j < n; j++) {
                        int s = random.nextInt(4);//随机选择某个运算符

                        ex += String.valueOf(number[j]) + String.valueOf(operator[s]);
                        if (s == 3) {
                            number[j + 1] = decide(number[j], number[j + 1]);
                        }
                    }
                    ex += String.valueOf(number[n]);
                    expression.add(ex);
                }
  • 对正误的判断并且统计正确率
int wrong = 0;
        for(String st :expression)
        {
            System.out.println(st);
            String str;
            str = st;
            Zhan lt = new Zhan();
            List<String> list = lt.work(str);
            List<String> list2 = lt.InfixToPostfix(list);
            System.out.println("输入答案");
            int daan = scan.nextInt();

            System.out.print("后缀表达式为:");
            lt.printList(list2);
            System.out.println(" ");

            if(daan != lt.doCal(list2)){
            System.out.println("错误    正确答案为:"+lt.doCal(list2));
            System.out.println(" ");
            wrong = wrong+1;}
            else{
                System.out.println("正确");
                System.out.println(" ");}
        }
        int sum=100-(wrong*100/num);
        System.out.println("正确率:"+sum+"%");
  • 研究学习了一些创建栈的方法,在计算类生成了中缀转后缀并计算的代码
//-----------------------------------------
    // 中缀表达式转化为后缀表达式
    // 1.遇到数字输出
    // 2,遇到高优先级的全部出栈
    // 3,最后全部出栈
    //-------------------------------------
    public List<String> InfixToPostfix(List<String> list){
        List<String> Postfixlist = new ArrayList<String>();//存放后缀表达式
        Stack<String> stack = new Stack<String>();//暂存操作符
        for(int i=0;i<list.size();i++){

            String s = list.get(i);
            if(s.equals("(")){
                stack.push(s);
            }else if(s.equals("*")||s.equals("/")){
                stack.push(s);
            }else if(s.equals("+")||s.equals("-")){
                if(!stack.empty()){
                    while(!(stack.peek().equals("("))){
                        Postfixlist.add(stack.pop());
                        if(stack.empty()){
                            break;
                        }
                    }
                    stack.push(s);
                }else{
                    stack.push(s);
                }
            }else if(s.equals(")")){
                while(!(stack.peek().equals("("))){
                    Postfixlist.add(stack.pop());
                }
                stack.pop();
            }else{
                Postfixlist.add(s);
            }
            if(i==list.size()-1){
                while(!stack.empty()){
                    Postfixlist.add(stack.pop());
                }
            }
        }
        return Postfixlist;
    }
    //----------------------------------------------
    //     用于对后缀表达式的计算
    //-----------------------------------------------
    public int doCal(List<String> list){
        Stack<Integer> stack = new Stack<Integer>();
        for(int i=0;i<list.size();i++){
            String s = list.get(i);
            int t=0;
            if(!isOp(s)){
                t = Integer.parseInt(s);
                stack.push(t);
            }else{
                if(s.equals("+")){
                    int a1 = stack.pop();
                    int a2 = stack.pop();
                    int v = a2+a1;
                    stack.push(v);
                }else if(s.equals("-")){
                    int a1 = stack.pop();
                    int a2 = stack.pop();
                    int v = a2-a1;
                    stack.push(v);
                }else if(s.equals("*")){
                    int a1 = stack.pop();
                    int a2 = stack.pop();
                    int v = a2*a1;
                    stack.push(v);
                }else if(s.equals("/")){
                    int a1 = stack.pop();
                    int a2 = stack.pop();
                    int v = a2/a1;
                    stack.push(v);
                }
            }
        }
        return stack.pop();
    }

遇到的困难及解决办法

  • 这个错误其实上周发现了并尝试解决了,但是后来发现解决的方法其实错了,真正原因是switch里面没有使用break,所以导致错误。

  • 这个错误有点恶心,怎么说呢,说来话长,目前我认为是因为题目生成的类和问题计算的类是我们分别主要负责,貌似是计算类考虑的情况不充分。

项目的码云链接

原文地址:https://www.cnblogs.com/N-idhogg/p/9011315.html