zoukankan      html  css  js  c++  java
  • 四则运算去重 20162315-20162317 结对编程

    四则运算去重 20162315-20162317 结对编程

    需求分析

    • 在前次作业上进行修改,使程序输出时自动将题目去重。
    • 使用命令行参数输入需要的题目,并将题目输出到expression.txt这个文件夹里。
    • 只涉及1到9的个位数计算,运算符只涉及+ - x /以及()。

    设计思路

    • 我和20162317袁逸灏同学最开始没有思路,在网上查找也找不到相似的方法。我们只能采取直接对比结果,去掉结果相同的题目的方式来完成出题。毕竟,题目不同答案不一定相同,但答案不同题目一定不同。
    • 首先我们调用了上一次四则运算中的计算方法,将它写进了新的文件MathProCal中。
    • MathPro中,我们写入了随机生成表达式和进行去重的方法。在这个类中袁逸灏同学添加了括号类的中缀转后缀表达式的方法。我们将有无括号分为两类进行计算。
    • 在驱动类ExpressionGenerator中,我们调用了之前写过的两个方法,使得命令行参数第一位输入生成题目数,第二位输入生成运算符数。

    实现过程中的关键代码解释

       while(i <= getQuesNum()) {
                String[] middle;
                int choose=r.nextInt(2);
                fw2 = new FileWriter("back.txt");
                if(choose==1) {
                 middle = new String[(getSymbNum() + 1) * 2];
                    for (int n = 0; n < middle.length; n += 2) {
                        int Num = r.nextInt(9) + 1;
                        middle[n] = String.valueOf(Num);
                    }
                    for (int n = 1; n < middle.length; n += 2) {
                        String symbol = Symbol[r.nextInt(4)];
                        middle[n] = symbol;
                        if (n == middle.length - 1) {
                            middle[n] = "=";
                        }
                    }
    

    这是这次的不含括号类的中缀表达式的生成方法,仍旧是偶数位(0开始)输入随机数1到9,偶数位输入运算符,将输出的结果加入等号输出成中缀表达式。

     sta = new Stack<String>();
    
                    for (int n = 0; n < middle.length - 1; n++) {
                        //符号优先级高的
                        if (isOperatorFirst(middle[n])) {
                            sta.push(middle[n]);
                        }
                        //符号优先级低的
                        else if (isOperatorLatter(middle[n])) {
                            //若栈空则入栈
                            if (sta.empty()) {
                                sta.push(middle[n]);
                            }
                            //若栈不空栈中符号全部弹出
                            else {
                                while (!sta.empty()){
                                    fw2.append(sta.pop() + " ");
                                }
                                sta.push(middle[n]);
                            }
                        }
                        //数字直接输出
                        else {
                            fw2.append(middle[n]+" ");
                        }
                    }
                    while (!sta.empty()){
                        fw2.append(sta.pop()+ " ");
                    }
                    fw2.append("
    ");
                    fw2.flush();
    

    中缀表达式转后缀表达式依然是与上次相同的方法,计算时操作数入栈,操作符出栈。

     resSave[i-1]=mpc.result;
                    if(mpc.result.getBottom()!=1&&mpc.result.getTop()!=0) {
                        System.out.println(mpc.result.getTop() + "/" + mpc.result.getBottom());
                    }else {
                        System.out.println(mpc.result.getTop());
                    }
                    if(i!=1){
                        for(int n=0;n<i-1;n++){
                            if(mpc.isLike(resSave[i-1],resSave[n])){
                                i--;
                                break;
                            }else if(n==i-2){
                                for(int k=0;k<middle.length;k++){
                                    fw.append(middle[k]+" ");
                                }
                                fw.append("
    ");
                                fw.flush();
                            }
                        }
                    }else {
                        for(int k=0;k<middle.length;k++){
                            fw.append(middle[k]+" ");
                        }
                        fw.append("
    ");
                        fw.flush();
                    }
    
                }
    

    这是最终比较的方法。reSave是表达式的运算结果,i是总共的表达式数,n是变化的,每当isLike成立一次,即出现结果相同的表达式,相同的表达式便会被去掉,这个时候i会减1,这个循环语句一直判断到n++的值达到i-2,也就是说在原有的表达式中去掉了相同表达式时,这个时候会输出中缀表达式。如果不出现相同的表达式,就进入else直接输出所有表达式了。

    测试截图

    对不同题目,运算符生成数的测试
    image

    运行过程截图

    运行十个计算式,4个运算符的例题
    image

    代码托管地址

    MathProCal

    MathPro

    ExpressionGenerator

    遇到的困难以及解决方法

    问题1:如何去重?
    解决方案:我们实在是想不出比较好的去重方法,只能用下册,只能比较表达式的运行结果了。调用上次的计算方法,对自动生成的表达式进行计算,去掉结果相同的式子。虽然这样做很有弊端,但至少保证绝对不会出现结果相同的表达式。
    问题2:如何在将去重表现在循环语句中?
    解决方案:我跟袁逸灏进行了讨论,在上面展示的代码中,我们将运算结果列为数组元素,通过对这些数组元素的比较去掉相同的表达式。

    对结对的小伙伴做出评价

    袁逸灏同学的自学能力非常强,在很短的时间内就自学了括号在表达式转换时的入出栈代码,并且完成了跟括号有关的计算内容。他也协助我完成了MathPro内不带括号的表达式的输入,结果的比较,去重,输出。没有袁逸灏同学的帮助,这两次四则运算的代码编写我恐怕寸步难行。如果给我们100分,我给袁逸灏同学评分65,给我自己评分35。这次大部分代码仍旧在袁逸灏的电脑上编写提交。最后有一些修改与替换是在我电脑上提交的。
    git-log(bash中文显示乱码)
    image

  • 相关阅读:
    git创建、删除分支
    Git 基础
    python pillow
    phantomjs 下载
    python3安装PIL
    selenium打开chrome时,出现 "您使用的是不受支持的命令行标记:--ignore-certificate-errors""
    chrome driver 下载
    go 单进程并发
    go 内嵌对象类型
    go 多态
  • 原文地址:https://www.cnblogs.com/cs162315/p/6942168.html
Copyright © 2011-2022 走看看