oop题目集4-6作业总结

zxst1005 / 2023-05-03 / 原文

一、前言

对本次三次题目集的知识点、题量、难度总结如下:

oop训练集04:

  此次题目集有七道题目,题量适中,给了五天时间完成;题目难度有难的也有容易的,最简单的是GPS测绘中度分秒转换这道题目,最难的是菜单第三代,放在第一题的位置,第一次打开题目集开始做时,着实有被吓到,明面上是第一题,实际上是最后一题。

  然后就是有关本次题目所涉及的知识点,有一维数组,数据类型转换,foreach循环遍历整个数组,Arrays类中的sort排序方法,String类中的split()根据正则表达式来拆分字符串方法,以及其中的toCharArray()将字符串转换为一个新的字符数组方法,HashSet集合及相关方法,例如add()、remove()等方法,在查阅学习HashSet集合时,还连带的学习了Set集合,Collections类,所以后面的题目中就使用了相关方法。这次题目集还涉及了面向对象三大特征之一的封装,Integer类中的parseInt()方法,LocalDate类中的of()、isAfter()、isBefore()等方法,ChronoUntil类中DAYS、WEEKS、MONTHS等单位的用法。总的来说,题目集4知识点考的很多,而且大多都是新知识,需要自己去学习,然后才能做题。

oop训练集05:

  这次题目集题量适中,题目难度也是有难有易,但这次知识点很少,主要考察正则表达式的一些知识,最后两道日期设计题考类与类之间的关系——聚合,是之前题目的升级版,还涉及了Arrays类的sort()排序方法,String类的equals()方法、substring()方法和switch语句,然后就是类中的构造方法,getter和setter方法,方法调用。

oop训练集06:

  本次题目集题目就一道,是菜单第四代,题目要求很多,难度较大,可谓以一抵十啊,做的过程中还是很痛苦的,给了我们一周时间,不过最后自己还是没有做出来。知识点的话,就我现在所写的代码来看,还是包含很多的,首先就是简单的一些if、if-else判断语句,switch语句,while、for循环语句,boolean判断,然后就是需要用数组储存菜单信息,订单信息,基础一维数组肯定对题目要求的处理不到位,用ArrayList更好,还有String类相关方法的应用,foreach遍历数组,方法的调用,以及java日期类的一些知识。

二、设计与分析

图1

图2

 题目集4的菜单设计,当时并没有做出来,代码存在很多问题,并且当时留给做这个题的时间没有多少,所以只是写了大概的框架(第一张类图)。后面在做题目集6时,才把这个菜单第三代的写出来(第二张类图),测试现有的输入样例,输出结果符合条件,但由于题目集4已到时间关闭,不能看到其他测试点是否存在问题。

题目集5的7-5,7-6之前已经写过了基本要求的版本,现在两个进阶版的主要考类之间的聚合关系,上次没有把题目集三的那道基础日期设计题写完,这次弥补这个遗憾,把功能完善完整了,然后就是根据类图修改代码,符合类图要求。7-5写的时候,脑子里乱得很,在调用类的方法时老是犯懵,不过确实是得小心点,一不小心就会调用方法不当。7-6相对7-5来说,又要稍稍容易点。下面是SourceMonitor生成的相关报表:

         7-5                                7-6

可以看到7-5的代码圈复杂度为12,代码写的相对有点复杂,不好维护。

题目集6的菜单第四代没能做出来,它也真的是让我很头疼啊,写了好久才把之前欠下的菜单第三代写出来,后面再根据第四代的要求去改,想改又无从下手,难受啊。

下面是大佬同学的类图供我作参考,看类图就知道是个大工程啊。

 

三、踩坑心得

题目集4:7-2有重复数据这题,第一次用了嵌套的for循环来编写代码,提交后两个测试点运行超时,应该是数据很大时,用for循环运行很慢导致超出题目规定时间。后面改用Arrays类的sort()方法来对数组排序,通过测试点。

有问题的代码:

import java.util.*;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] array = new int[n];
    for (int i = 0; i < n; i++) {
    array[i] = sc.nextInt();
    }
    boolean flag = false;
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++) {
        if (array[i] == array[j]) {
          flag = true;
        }
      }
      if (flag) {
        break;
      }
    }
    if (flag) {
      System.out.println("YES");
    } 

     else {
      System.out.println("NO");
    }
  }
}

修改后的代码:

import java.util.*;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] array = new int[n];
    for (int i = 0; i < n; i++) {
      array[i] = sc.nextInt();
    }
    java.util.Arrays.sort(array);
    boolean flag = false;//标志,用于后面做判断
    for(int i = 1; i < n; i++){
      if(array[i] == array[i-1]){
        flag = true;
        break;
      }
    }
    if (flag) {
      System.out.println("YES");
    }

    else {
      System.out.println("NO");
    }
  }
}

7-6 GPS测绘中度分秒转换这道题是题目集4中最简单的一题,但这题却让我花了好久时间才拿到满分,提交了十多次都不明白到底哪里有问题,在编译器里测试的时候并没有什么问题,后面实在没办法,问了同学,才知道是我的输出语句出了问题。说明自己对输出语句的一些细节掌握还存在问题,要赶紧去查漏补缺。

有问题的输出代码:System.out.printf("%d°%d′%.2f″",degree,minute,second);
System.out.printf(" = %.6f",result);

正确的输出代码:System.out.print(degree+"°"+minute+"′"+second+"″");
System.out.printf(" = %.6f",result);

题目集5:7-4 学号检验这题在写检验学号的正则表达式时,范围弄错了,导致学号的这个测试点过不了,当时初学正则表达式时,学得不是很精,就是简单粗糙的学习了一下,所以在写判断学号的正则表达式时有一点懵,不太清楚怎么去符合那个范围,然后就赶紧去看网课、资料仔细学习了知识点,经过修改后测试点通过。

 

 错误的部分代码:!id.matches("[0-3][0-9]|[4][0]")        正确的部分代码:!id.matches("0[1-9]|[1-3][0-9]|[4][0]")

然后对后面两日期设计题,之前已经写过要求差不多的一道题,我没有完全写完,求相差天数没写出来,7-5这次终于成功的写出来了,不过刚开始我没有比较两日期的先后,只是单纯的把求两日期差的算法写出来了,后面加上比较两个日期的先后再求相差天数时中间犯了一个低级错误,而且自己一直没看到,导致运行结果出错。

 

 将date1.day.getValue()写成了date2.day.getValue()

7-6最后还是有两个测试点没过,不清楚是什么原因,7-6和7-5 差不多,只是类图要求不同,而且相对来说7-6类之间的方法调用更简单一些。

题目集6:菜单程序题,这次题目集就只有这一道题,要求比题目集4的7-1增加了好多,看到题目的那一刻心理上就想退缩了,突然就好后悔之前没有把菜单第三代写出来,现在好了,雪上加霜,只能更着急了。所以说,不管题目相对现在水平的我再怎么难,都要努力去写,题目集的关闭并不代表我的任务已经结束了,后面在空余时间还是要去研究,只有真正自己能把东西写出来才算是有收获的,要是自己实在没辙,可以去向底子好的,能力强的同学请教,也可以找老师,反正就是要想方设法的把题做出来才行。现在看来,自己又欠了账了,趁着五一放假空档,必须得抓紧把这个问题弄出来,不然后面再来个升级版,只能干瞪眼了。

 

四、改进建议

  通过SourceMonitor生成的报表,自己写稍长点的代码时,代码就会显得有点复杂,而且自己对代码进行必要注释写的较少,没养成写注释的习惯,代码可读性不强,今后要注意这些问题。降低代码圈复杂度的方法:可以提炼函数,替换算法,简化条件表达式——逆向表达、条件分解、合并条件、移除控制标记(即用break、return取代)等,简化条件表达式这点我得学,自己代码存在条件表达式复杂的情况。

 

五、总结

  通过这三次题目集的训练,我学到了String类、Arrays类、ArrayList类、Set类、HashSet类、Collections等类中的一些相关方法,但目前只对在题目集中用到过的方法比较熟悉,对那些未使用的方法还是陌生的,这个情况,我需要自己花时间再去学习一下,把资料、网课中的例子自己实际写一遍,让自己真正掌握这些知识。还学到了面向对象的三大特征之一封装,知道封装的好处——提高代码的安全性和复用性,同时学会写标准的javaBean类。了解了类与类之间的聚合,关联,依赖,组合关系以及继承、实现关系,不过,我也发现自己在类较多时回理不清类之间的关系,特别是两种关系相似的时候,因此,后面还需要去仔细研究一下类与类之间的六大关系。另外,经过此次第二阶段的题目训练,我还学到了只要有时间就要抓紧思考难题,大胆编程测试,就拿第六次题目集来说吧,我去了解了一下第一个一百分的同学,他花了三十多个小时才把这道题拿下,而自己花在这道题目的时间不足二十个小时,没人家底子好,时间花的也不够,没写出来确实是自己的问题。现在知道老师说的话确实是真理,做不出来就是没花时间,后面的题目只会越来越难,希望自己克服危难心理,调整好自己的时间,多花功夫在编程上,总能写出来的。

  除此之外,自己还需要去更多的学习java的知识,自己目前的知识储备量太少,已经不足够来解决问题了,像菜单中涉及的时间日期问题,不去问同学,根本不知道要去引用一些日历类。虽然说java知识体系很大,但要尽可能的多掌握点。Java的API文档是个好东西,要抓紧学会使用。

  希望老师能抽点时间提一下大家完成情况不太好的题,讲一下存在的严重问题,再给个思路,点拨一下;另外希望可以把PTA做过的题目集打开,让我们自己抽空把没做出来的题再做一下。