第一部分:前言
在前3周的面向对象学习中,总共布置了3次作业,每次作业的前几道题都大致对应着新学的知识点,但大部分语法知识还是要自己找教程。
虽说这样能提高自学能力,为以后的学习工作打基础,但说实话,网上的教学质量参差不齐,自己也不知道该从何学起,找到的讲解和源码又很难看懂。
有时一个很简单知识点也要花大量时间去理解,一个题做几个小时甚至一个下午都是常有的。特别是最后一题,题目难理解不说,测试点更是诡异到离谱,写一天一分都拿不到。
但这几次作业也确实让我学到了很多,包括对题目的分析,与同伴的合作。
第一次PTA作业:
设计与分析:
前几道题没什么好说的,挺简单的,类的设计都给出了,注重代码的语法就行。
最后一题要求写一个答题判断程序,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
因为是第一次作业,类的设计也都给出了,按照要求完成即可,感觉最大的难点就是刚接触正则表达式,运用的还不熟悉。
类 图:
代 码 圈 复 杂 度 :
耦 合 度 :
心 得:
作业不算太难,但也花费了较长时间。老师给的类起到了很好的引导作用,明确了编程思路。同时学会了ArrayList类和LinkedList类的使用和区别,受益匪浅。
踩 坑:
编程时若用到数组需注意其下标,不然很容易造成非零返回,关键是查找错误时也不好查找。
该 进 建 议:
在使用数组时应当小心些,数组下标应当定义的更明显。
第二次PTA作业:
设计与分析:
第一道题要求我们编写一个手机类,同时实现Comparable接口,重写compareTo方法。
类 图:
代 码 圈 复 杂 度 :
耦 合 度 :
心 得:
这题有点难,接口是什么我也不知道,重写compareTo方法是什么我也不知道。百度,翻书,问同学总算是写出来了,但感觉没懂。
(现在感觉还是没懂,不知道能用在哪)
踩 坑:
重写方法时写错了,顺序弄反了,查了好久的资料才找到,其他的还不太懂。
该 进 建 议:
找时间认真学一下什么是接口。
第二三题就比较简单了,写几条代码匹配上去就行,没什么好说的。
设计与分析:
第四道题是第一道题的迭代,在第一道题的基础要求上又追加了一些要求,同时建议我们追加一个答题类。
(这次作业写的极烂,当时正值假期,心不在焉的,在家根本没多少心思写这个,写前根本没提前构思,只想着搞完后好好休息一会,都没看到要追加一个类。
最后搞了两天整都没搞完,类之间的关系一塌糊涂,等回学校后再想改已经无从下手了。玩也没玩到,写也没写好。)
没怎么设计,依旧采用的是第一次题目所给的类,只不过是在类中添加了新的属性和方法。
类 图:
代 码 圈 复 杂 度 :
耦 合 度 :
心 得:
1.难,题目读不懂,逻辑没理清楚。
2.正则表达式远没有所认为的那么简单,他还有许多深层的用法。
3.JAVA中提供的复制方法一定要慎用,浅拷贝会让你崩溃。
4.浅浅了解了一下浅拷贝和深拷贝,感觉受益匪浅。
踩 坑:
1.动手敲代码之前一定要先设计好类,类与类间的关系,数据处理的逻辑。
2.正则表达式的使用一定要仔细,逻辑没问题时问题绝对出现在这里。
3.JAVA中对函数的调用基本都是指针,在使用copy和clone时需要注意,有可能一不小心就改变了指针指向对象的数据。
4.不要全信CSDN上的东西,上面很多东西解释的有误,还晦涩难懂。
该 进 建 议:
1.建议重写。
2.认真设计类,设计类的处理方法。
3.注意单一职责原则,不要将各种方法塞进同一个类中。
4.正则表达式写的不完善,需要改。
第三次PTA作业
设计与分析:
第一题一般,对着填写代码就行。
第二题给定一个日期,判定是否为合法日期。如果合法,判断该年是否闰年,该日期是当年第几天、当月第几天、当周第几天、。
给定起始日期与结束日期,判定日期是否合法且结束日期是否早于起始日期。如果均合法,输出结束日期与起始日期之间的相差的天数、月数、念书。
要求实现对日期类的基本使用。
类 图:
(就一个类,也没啥参数,直接上源码)
import java.util.*; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.temporal.ChronoField; import java.time.temporal.ChronoUnit; import java.time.DayOfWeek; public class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); String str=input.next(); DateTimeFormatter f=DateTimeFormatter.ofPattern("yyyy-MM-dd"); try{ LocalDate.parse(str); LocalDate day=LocalDate.parse(str,f); if(day.isLeapYear()){ System.out.println(str+"是闰年."); } int allday=day.get(ChronoField.DAY_OF_YEAR); int mday=day.getDayOfMonth(); DayOfWeek wday=day.getDayOfWeek(); System.out.println(str+"是当年第"+allday+"天,当月第"+mday+"天,当周第"+wday.getValue()+"天."); }catch (DateTimeParseException e){ System.out.println(str+"无效!"); } String str1=input.next();String str2=input.next(); try{ LocalDate.parse(str1);LocalDate.parse(str2); LocalDate day1=LocalDate.parse(str1,f); LocalDate day2=LocalDate.parse(str2,f); if(day1.isAfter(day2)){ System.out.println(str2+"早于"+str1+",不合法!"); } else{ long days=ChronoUnit.DAYS.between(day1,day2); long month=day2.getMonthValue()-day1.getMonthValue(); long year =day2.getYear()-day1.getYear(); System.out.println(str2+"与"+str1+"之间相差"+days+"天,所在月份相差"+month+",所在年份相差"+year+"."); } }catch (DateTimeParseException e){ System.out.println(str1+"或"+str2+"中有不合法的日期."); } } }
代 码 圈 复 杂 度 :
耦 合 度 :
心 得:
1.题目难不难我不知道,但我写了挺久的,日期类确实是个好工具,但我似乎不太会使用。
2.感觉最大的收获就是知道了还有try{}catch的用法。
踩 坑:
1.引用时要注意引用的包和使用的方法是否对应
2.千万别将LocalDate,format.DateTimeFormatter,format.DateTimeParseException这三里的方法混用了。
3.try{}catch使用时要小心,catch()后可别跟错了。
该 进 建 议:
改进前我认为应该学学日期类的使用,再来想如何该进,先学懂方法后在想该如何改。
第三题是第二次PTA最后一题的迭代,在上一次的基础上新增了更多的功能。
设计和分析:
设 计:
根据题目的要求和前两次作业的经验,依旧保留刚开始给的三个类,在此基础上新添加学生类,答题类(数据处理功能:管理类),处理类(用于初步处理数据:handle),总分类(记录试卷总分,也是对数据的初步处理),
删除类(实时处理数据),主类。输入数据首先先全部通过正则表达式分类存储到对应类中,删除类则是同步处理数据。随后调用处理类和总分类,传入参数,初步处理数据,然后调用答题类,进行数据的最终处理。
类 图:
代 码 圈 复 杂 度 :
耦 合 度 :
优点:这次代码与前两次相比是有较大进步的,基本实现了单一变量原则和模块化,代码的可读性和可改性有明显提升。
缺点:代码编写依旧较复杂,还未实现最简化,类和期间关系与前两次相比更加清晰了,但还没实现完全的单一变量。可继承性似乎还是没能实现,答题类还能再简化,以及不应该在主类中使用正则表达式进行初步分类,可以将其改成一个处理类。
心 得:
1.体会到了设计好后再动手的顺畅感,以及相互讨论,请教的快乐。
2.认识到了许多正则表达式的新用法。
3.体会到了功能清晰的类对编程时的明显帮助。
踩 坑:
1.使用正则表达式时要多考虑,有时需要包含汉字和空格。
2.逻辑一定要考虑周全,注意考虑缺失信息的情况。
该 进 建 议:
1.下次尽量简化代码,将正则的使用写在其他类中,以降低主类的复杂度。
2.处理类再简化,拆分,实现每个功能相互独立。
总结:
1.经过3次的练习,我深刻的理解到我对OOP的学习还不到位,许多知识点我还是半桶水。第一次我还是信心满满,但现在我确实有点畏惧了,有点害怕写PTA了。
2.正则表达式的使用还需继续学习和研究,类的设计和类间关系还不太了解,需要继续学习。
3.学习过程中与同学相互讨论对学习确实有帮助。
4.动手写程序前一定要先提前设计好,这对接下来敲代码是有巨大帮助的。
5.学习不能停留于纸面,一定要动手去练,懂了和写不写得出还是有很很大区别的。
6.三次作业下来,基本把我的信心给挫没了,第一次还好,虽然花了许多时间,但终归是写出来了。
7.第二次的作业实在是难,要我实现一个接口,可我连接口是什么都不知道,就靠百度看源码,虽然最后写出来了,但我确定我还是没弄懂接口,尽管这几天学了继承,抽象类,多态,接口,但我多半是没有搞懂的,对于接下 来的学习我是否跟得上,我保持怀疑态度。JAVA十分抽象,我可能有点不太能理解这种抽象。
8.第二次的最后一题我写得实在是烂,写前完全没构思,刚开始想加一个管理类,但最后想不到该加在哪,有什么功能,就放弃了,如果当时坚持再想一会,应该就不至于写的那么乱的结构了。虽然最后只有部分答案错误,现 在我也知道了这些答案错误是正则表达式的问题,但还是改变不了我写的烂的事实。
9.第三次作业的日期类有点让我崩溃,在网上找到的教学教程使用的都是Data包,可找到的例子用的都是别的包,刚开始也不懂,就混用了,结果疯狂报错,又不知从何修改。不懂日期类的原理,使用try{}catch()时不知道 catch后该接什么,也一度被逼到崩溃。
10.最后一题我构思了进3天才开始写,唯一值得庆幸的是构思还算合理,没有逻辑错误,在接下来的修改中也让我有明确的修改方向,比如修改正则表达式,不至于像只无头苍蝇似的到处改。但我还是觉得这次写的代码可继承性低,下次作业估计又要大改,有点害怕。