OOP前三次作业总结

发布时间 2023-03-25 13:37:20作者: 小啊凡

前言:

这是开始学习java的第一次作业,总结前次pta。

第一次作业:

主要目的是为了掌握一些基本的语法,了解其与c程序设计的不同,难度较低,但是题量较大,再写题目的过程中,通过自学了解的Scanner输入以及System等一些语法,掌握了以下技能:

  1. if语句,for语句的运用,以及if else语句,主要体会分支结构,锻炼思维能力;
  2. 数据类型的转换;
  3. 字符串的拼接,让我初步了解到了字符串一系列的运用,例如判断字符串中是否有重复字符,是否字符串能进行比较,比较两个字符串是否有一样的数据;
  4. 进制的转化;

第二次作业:

题目数量较上一次变少,但是难度上升,让我强化了float这一数据类型,记忆犹新(每次用double都会答案错误)强化了if语句的使用。

  1. 了解了equals, substring的使用,对字符串内部的比较大概清晰。
  2. Math方法在函数的调用,和c不同。
  3. 在最后两道题让我深刻意识到逻辑思维的重要,判断不同种类三角形,尤其是等腰直角和等边以及等腰三角的比较,让我知道了他们三个的大小先后顺序,利用if else把他们中唯一的特征点进行区分。
  4. 日期类的题目是一个系列题,其目的也是让我们找出一年当中的特殊节点。

第三次作业:

题目数量下降,质量上升:

  1. 第一次引入了类的概念,前两题最简单的让我们了解类的基本用法,通过简单的调用进行运行,就像C语言的函数一样。
  2. 后两道题目直接开始多次调用,第四道更是第三道的迭代,首先从功能条件上就增加了,不再是简单的单次计算,对我们的思维能力和数理逻辑很是提高。

 设计与分析:

重点分析一下题目集3里面的第三题以及第四题:

7-3:类似于下图所示,本人在一开始设计代码的时候,把2月和其他每个月的月末都一样,判断其是最后一天,在进行求下一天,就有如下if语句,后来被老师点评为垃圾代码,因为在测试该代码的时候,会产生2的6次方的测试样例,有些测试样例还是重复的,而且还使得速率变慢。

 

       经过修改之后,决定采用数组形式,把每个月的最大一天最为该数组元素索引的值,第一个元素为0,是因为Java数组的索引是从0开始的,为了与现实生活的月份匹配,所以采用0位置索引用0代替,因此在判断过程中仅需判断是不是该月的最大天数,如果是,则月份加一天,如果是12月份的最大一天,则加一年。(这是修改之后的结果)

 

 

 

 

 

       以上是对该题的代码分析,注释比例(Percent Lines with Comments)这个结果是0.0,我在整个题目的编写当中,没有写一句注释,这在软件开发里是一个比较严重的问题,自己写得代码必须得让别人看懂,这是必须的,否则你写的代码就是垃圾代码。第二点是Maximum Complexity(最大圈复杂度),通过圈复杂度可以看出说明程序代码的判断逻辑复杂,可能质量低,且难于测试和维护,圈复杂度为7,说明在整个代码中,可能因为分支结构过多,在一个方法中同时实现多个功能,导致代码不安全。

 

这是该题的类图(题目中获取):

 

 

 以下是第四题:

(类图,代码测试图)

 

 

 

    此题和第三题一样,代码注释为0,根据Kiviat Graph图例,Max Complexity显示超出合理包围的很多,说明代码的可修改程度很大,Name of Most Complexity Method(最复杂的方法名),说明方法还可以在细化分成多个小方法,在整个方法中先判断是不是闰年,再进行判断两个年份哪个在前,那个在后,当两个日期不相等的时候,将前一个日期进行加一天或者建议减一天操作, 直到两个日期的天数完全一致的时候,利用flag标记点,进行记录,然后输出flag的值。我计算两个日期先后用的是一天一天的累计,使得复杂度变高,                                                                                                                                                                                                                                                                   

 

 对比第三题,和第四题可知,在前一题的基础上要增加更多的功能,第三题仅仅是简单的求下一天,第四题还要判断是否是闰年,下n天,前n天是多少,这无疑增加了代码的复杂程度,在编写这个题的过程中,我观察到给定的运行时间足够的长,于是我想的是运用暴力拆解的方法,利用n次循环。这个方法首先效率不高,其次是代码逻辑比较复杂。没有很好的执行单一原则,这是不成熟的,又不是很符合我们软件行业的代码规范,在这的问题上我仍然学要改进,需要学习,在一次次的错误中成长起来。万事开头难,我认为这个过程只要经历了,就会让自己的编码能力变得更好,提升编码的质量,效率,内容。

踩坑心得:

在第三题中:

我判断日期先后的函数是这个(如下):

public boolean compareDates(DateUtil date){
if(date.getYear()-year>=0){
if (date.getMonth()-month>=0){
if (date.getDay()-day>0) {
return false;
}
return true;
}
return true;
}
return true;
}

编写这段代码以后,在关于最大相差天数的测试点上一直过不去,改了很久还是运行超时,然后把输出语句放进到该方法中,发现他一直按着相差的反方向运行,后来发现这个方法只有年,月,日,同时小于或者大于第二个日
期时,才会判断为假,反之都为真,而实际情况是只要年在第一个日期之后,月份不管在哪,都会是大于那个年份,相同的是,如果年份一致,当月份在他之后,以及月份,年份都一致时,仅有日期前后才会判断出那个日期在前。 

这是修改之后的代码,按照顺序依次进行年份,月份,日期的判断。

public boolean compareDates(DateUtil date){

            if(date.getYear()-year>0)

                return false;

 

            else if(date.getYear()-year<0)

                return true;

            else{

                if (date.getMonth()-month>0)

                    return false;

                   else if (date.getMonth() - month < 0)

                        return true;

                    else {

                        if (date.getDay() - day > 0)

                            return false;

                        else if (date.getDay() - day < 0)

                            return true;

在此方法中,实现了对年先后的判断,再经过测试之后,使得如下最后的测试点正确。

 

 这是没思考就动手的原因导致的,这也是我的一大弊端,在还没有构成很完备的知识体系中,急于去忙着盯着代码看,从而忽视了设计的重要性,导致思路不连续,没有一个很完整的概念,这也是不符合做题的逻辑。

改进建议:

        在第二次作业集中,判断三角形问题里,我判断三角形的条件卡的太死了,应该是根据三角形的特殊性由里到外依次进行判断。在整个日期类设计规划里,我应该在判断n天以及两天相差天数代码中,把求下一天单独设计成一个类,从而利用for循环n次调用它的方法,这让解决了代码的复杂性,同时还能把圈复杂度降下来。在有关有字符串的题目中,我还要进一步学习关于字符串的各种语法,在对比字符串的过程中,不要再去用char.At去做比较,而是使用substring .equals。并且在以后的练习中,我会先设计好具体的流程,再动手去编写。也会提高自己的代码的注释率,让自己的代码能够被别人认可。

 总结:

        根据这三次的pta题目的练习,我深刻的体会到的java语言的便利性,以及深度,相较于上学期的c语言来说,Java确实是一种很方便的语言。我学习到了Java中各种数据类型,不同数组的定义,if else语句的使用,以及类的定义,并且能够正确运用类的属性和行为,对于类中多个方法并不能很好的明确每个方法特定特有的功能,类中的方法在主方法的调用还存在运用不熟练的问题,在编写第一次的题目中,我第一次了解到了快速排序的用法,因为时间的问题,必须使得它是有序数列之后在判断,在课上,老师也给罗列了关于Arraylist的用法,以及大的框架collection,而且多次提到Hashset,Treeset的用法,在我观看了关于无序排列的视频后,使得我深刻的认识到了代码效率的重要性。

        在这一段时间的学习中,我认为老师的教学方法很有效,通过让我们对不同知识点的自我学习,提高了我们对遇到问题以后,自己解决问题的能力。同时,在编码的过程中,我们要有一定的团队意识,一个人是很难写出代码的,当在某一个部分困惑很久的时候,一定要和同学交流,获得一个合适的思路,不要钻牛角尖,一定要先做分析,确定好功能,在做设计,切记眼高手低。

        时间不够效率凑,效率不够时间凑,在我们近期的学习过程中,类似于像多线程一样,多种任务同时进行,我们既要合理安排各项任务的优先顺序,又要保证高质量完成。这对于我们以后参加工作是有好处的,提前适应压力的到来,感受工作的强度。课堂上的思考也十分有意思,通过符合日常生活中的电梯问题,让我们开始步入面对对象的大门,十分生活,也非常有意思。通过线上的网课和线下的课程相结合,互相补充,构成更完善的知识点网络。希望可以在老师的引导下奠定java基础。