• 2017-2018-2 20172314 『Java程序设计』课程 结对编程练习_四则运算


    相关过程截图

    • 截图为我负责的部分关于计算的测试

    关键代码解释

    • 根据代码中的部分解释,这部分代码实现了结果的整数和分数的输出,如果算出的结果为一个真分数,就输出真分数的形式,如果结果为整数,就输出整数形式。

      private RationalNumber becom(String str) {  
      StringTokenizer tokenizer = new StringTokenizer(str, "/");  //以/为分隔符把每个分式拆开
      int zi = Integer.parseInt(tokenizer.nextToken());  
      int mu;  
      if (tokenizer.hasMoreTokens())  //如果存在分式就输出
          mu = Integer.parseInt(tokenizer.nextToken());  
      else  
        mu = 1;  //如果没有分式就把分母变为1
      
      return new RationalNumber(zi, mu);  
      }
      
      
    • 这部分判断正误,并统计正确错误的题目数。

      for (int y = 0; y < number.length; y++) {
                  if (number[y].equals(rightanswer[y])) { // 比较正确答案与用户的答案
                      System.out.println("正确!");
                      right++; // 正确题数加一
                  } else {
                      System.out.println("错误!");
                      wrong++; // 错误题数加一
                      System.out.println("正确答案是" + rightanswer[y]);
                  }
              }
      

    遇到的困难及解决方法

    • 问题一:将后缀表达式用空格作为分隔符分开存入栈中后,定义为String型还是char型都是错误的

    • 问题一解决:由于之后要调用RationalNumber方法,其参数为int型,这样就产生了矛盾,之后把a1,a2都定义为Object型的就可以避免这一矛盾。

    Object意思就是参数是可变的,意思就是说,你在调用这个方法的时候你可以给他传一个String类型的参数,也可以给他传一个Int类型的参数,或者多个不同类型的参数,很灵活的。

    • 问题二:不知道如何使用StringTokenizer方法
    • 问题二解决:在查看了API文档之后,尝试着使用了一下,但错误很多,StringTokenizer处显示红色,然后我便声明了一个构造方法,并实例化,结果仍是错误的,最后发现可能是没有导入包的原因,便把构造方法删除,直接加包名java.util.StringTokenizer。import导入包StringTokenizer就是可以直接使用里面的方法,所以,就已经有了构造方法,可以直接实例化创建对象。参考java导入包

    在Java代码中导入包,与其说为了使用里面的方法,不如按照面向对象语言的特点,说成为了使用里面的类,因为Java作为典型的面向对象语言,他的程序是以数据作为基础,以类的形式组织的,类主要包括:你自己的写的类和你的类中需要用到的现有的类,这些现有的类基本上都是以package包的形式存在的,你只有导入了这个类所在的包,才能使用这个类。

    ![](https://images2018.cnblogs.com/blog/1333122/201805/1333122-20180508205959986-1134941156.jpg)
    
    • 问题三:在计算时,最开始想要通过判断一个字符是否是数字来决定什么时候进行计算。

    • 问题三解决:在网上查找之后找到了Character.isDigit(char)方法,Java中怎样判断一个字符串是否是数字,但最后选择直接用equals方法把四个运算符找出来,没有用这个方法。

    • 问题四:运行时显示18行有错误。

    • 问题四解决:在单步调试之后,是这里的循环出了问题,第二遍循环就结束了,感觉是push进character栈中的nextToken是在if判断中的nextToken的下一个,并不是同一个运算符,所以定义一个xx来代替就避免了,再次运行之后这里没有错误。

    项目中自己负责的部分

    我负责后缀表达式的计算并判断用户计算的正误,得到正确率。并且打算做文件的部分。代码如下:

    • 计算后缀表达式

      package test;
      
      import test.RationalNumber;
      import java.util.Stack ;
      import java.util.StringTokenizer;
      
      public class Judge {
      
          Stack<String> calculate;
      
          public Judge() {
              calculate = new Stack<>();
      }
      
      public String answer(String Stringwyh) {
          //以空格为分隔符分开每个分数和运算符
          StringTokenizer NUM = new StringTokenizer(Stringwyh, " ");
      
          while (NUM.hasMoreTokens()) {
              String xx = NUM.nextToken();//xx表示一个分数或字符
      
              if (xx.equals("+")) {
                  String a = calculate.pop();
                  String b = calculate.pop();
      
                  String re = becom(a).add(becom(b)).toString();
      
                  calculate.push(re);
              }//如果是运算符则进行计算
              else if (xx.equals("-")) {
                  String a = calculate.pop();
                  String b = calculate.pop();
      
                  String re = becom(a).subtract(becom(b)).toString();
      
                  calculate.push(re);
              }//如果是运算符则进行计算
              else if (xx.equals("*")) {
                  String a = calculate.pop();
                  String b = calculate.pop();
      
                  String re = becom(a).multiply(becom(b)).toString();
      
                  calculate.push(re);
              }//如果是运算符则进行计算
              else if (xx.equals("÷")) {
                  String a = calculate.pop();
                  String b = calculate.pop();
      
                  String re = becom(a).divide(becom(b)).toString();
      
                  calculate.push(re);
              }//如果是运算符则进行计算
              else
                  calculate.push(xx);//如果是将分数则存入calculate栈中
          }
          return calculate.pop();
      }
      
      private RationalNumber becom(String str) {
          StringTokenizer tokenizer = new StringTokenizer(str, "/");
          int zi = Integer.parseInt(tokenizer.nextToken());
          int mu;
          if (tokenizer.hasMoreTokens())
              mu = Integer.parseInt(tokenizer.nextToken());
          else
              mu = 1;
      
          return new RationalNumber(zi, mu);
         }
      
      }
      
      
    • 判断正误

      package test;
      
      import test.Judge;
      import test.NifixExpression;
      
      import java.util.Scanner;
      
      public class Test1  {
      public static void main(String[] args) {
      
          int right = 0;
          int wrong = 0;
          double rate;
          Scanner scan = new Scanner(System.in);
          //生成题目
          System.out.print("整数运算为1,分式运算为2: ");
          int a = scan.nextInt();
          System.out.print("请输入您要做的题目等级: ");
          int b = scan.nextInt();
          System.out.print("请输出该等级的题目量: ");
          int c = scan.nextInt();
      
          String[] number = new String[c];//数组number用来存放用户输入的答案
          String rightanswer[] = new String[c];//数组rightanswer用来存放正确答案
          for (int d = 1; d <= c; d++) {
              NifixExpression num = new NifixExpression();
              SuffixExpression num1 = new SuffixExpression();
              Judge num2 = new Judge();
              System.out.print("问题" + d + ": " + num.Level(b, a) + " " );
              int e = scan.nextInt();
              number[d - 1] = Integer.toString(e);
              rightanswer[d - 1] = num2.answer(num1.SuffixExpression(num.Level(b,a)));
              System.out.println();
              System.out.println();
      
              //rightanswer[d - 1] = num1.answer();
      
              for (int y = 0; y < number.length; y++) {
                  if (number[y].equals(rightanswer[y])) {
                      System.out.println("正确!");
                      right++;
                  } else {
                      System.out.println("错误!");
                      wrong++;
                      System.out.println("正确答案是" + rightanswer[y]);
                  }
      
              }
      
              rate = (double) right / c;
      
              System.out.println("正确率为" + rate);
      
          }
      }
      }
      
      

    个人贡献度划分

    我们组每个人的任务都差不多,少了那部分都不行,都很重要就每人33.3%吧。

    对结对的小伙伴做出评价给出小伙伴博客链接(重点指出需要改进的地方)

    • 谭鑫谭鑫很有想法,并且乐于攻坚,尝试用不同的方法,非常卖力。
    • 王禹涵王禹涵很有耐心,并且很沉稳,熬夜编写,很认真。

    码云链接

    小组结对编程照片

    参考

  • 相关阅读:
    数组名作为左值和右值的区别
    指针与数组区别
    linux服务器开启免密登录
    mssql清空数据和添加主键约束语法
    链接服务器方式查视图导致索引失效的解决方法
    sqlserver2008r2 版本数据库迁移到2019版本导致查询效率慢的解决方法
    lnmp一键安装访问default目录可行,访问其它站点报404错误
    lPeer reports incompatible or unsupported protocol version.
    yum安装时出现:Cannot retrieve metalink for repository: epel. Please verify its path and try again
    Linux Centos7.4 下安装 LAMP环境及配置(php5.6,mysql5.7)
  • 原文地址:https://www.cnblogs.com/YiYiYi/p/9010939.html
Copyright © 2020-2023  润新知