题目集4~6的总结性Blog

2021/4/26 18:26:34

本文主要是介绍题目集4~6的总结性Blog,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

题目集4-6总结Blog

一、      前言:这三次的PTA作业大体上的题目难度在下降,但题目数目在上升。总体是对着重练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构、控制结构;练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码。其中也着重对我们正则表达式的使用和理解能力进行锻炼和考察。理解抽象类与子类的关系,实现继承操作,构造类族;正确使用抽象类和子类实现多态操作;理解接口的意义,并实现行为的多态;理解了解抽象类、类以及接口三者的异同以及使用场合。整体题量适中,大部分的题目的难度适中,有个别题目有着自己的鲜明的特点,也是为了我们能适应更多的情景去写程序。题目集主要是让我们熟悉对类的使用、能够创建相应的对象,同时能够使用正则表达式去判断输入的合法性,摒弃以前那种一个一个字符地去判断,减少代码的圈复杂度。

二、      设计与分析

1、 题目集4(7-2)、题目集5(7-5)两种日期类聚合设计。具体的题目要求如下:设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] 。要求的类图分别为:

 

 

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

 

 

 

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

我利用工具sourcemonitor做出图表如下:

 

 

我根据题目的要求做出大部分的大概程序的主体,剩下的一些方法的设计有网上资料的原理的参考,也有自己想出来的不一样的算法,虽然可能有点瑕疵,但我觉得这个中心思想还是可以的。以下是主要代码:public int numOfDays(int year,int month ,int day)

     {

            int[] list = {31,28,31,30,31,30,31,31,30,31,30,31};

            int n=0;

            for(int i=1;i<year;i++)

            {

                   if(isLeapYear(i))

                   {

                          n+=366;

                          list[1] = 29;

                   }

                   else

                   {

                          n+=365;

                   }

            }

         if(isLeapYear(year))

         {

             list[1] = 29;

             for(int i=1;i<month;i++)

                {

                       n+=list[i];

                }

         }else{

              for(int i=1;i<month;i++)

                {

                       n+=list[i];

                }

         }

           

            n+=day;

            return n;

     }

}

public void getDaysofDays(int x,int y, int year, int month, int day, int year1, int month1, int day1) {

            System.out.println("The days between "+ year +"-"+ month +"-"+ day +" and "+ year1 +"-"+ month1 +"-"+ day1+" are:"+Math.abs(y-x-1));

     }

    

     public void getDaysofDays1(int x,int y, int year, int month, int day, int year1, int month1, int day1) {

            System.out.println("The days between "+ year +"-"+ month +"-"+ day +" and "+ year1 +"-"+ month1 +"-"+ day1+" are:"+Math.abs(y-x));

     }

for(int i=0;i < n;i++)

            {

                   this.day++;

                   if(this.day > lastday(this.month))

                   {

                          this.month++;

                          this.day = 1;

                          if(this.month == 13)

                          {

                                 this.year++;

                                 this.month = 1;

                          }

                   }

            }

对于以上代码依然有瑕疵。再看sourcemonitor生成的图表,发现自己的代码效率不高,而且该题代码用了大量的if语句,所以导致导致代码的Maximum Complexity有了很高的值,运行时间较长。

 

 

问题发现处理心得:在写代码时,还是居于C语言那一套,+除了输入和输出变化了一点,其他基本和C语言一样,且代码过于太复杂,基本全是if….else语句,没能用到高效的算法。代码效率很低,而且中心方法的设计也有问题,缺少了两个日期大小的判断,导致后面有PTA测试点过不了,影响到了后面方法的运行。其中还有出现了负数,最后经过自己的调式,取绝对值便对了。

补充:对于这两道题的方法设计因为之前设计完后有错误,一直没找出来,后来去问了老师,老师帮我看了一下,发现我自己并没有很好的审题,将日期写错,导致运行结果出错,所以一定要认真审题,抓住题目的条件,要细节!

最后,对于老师让我们写的两种形式的日期计算类聚合,我觉得第一种聚合类分工较为明确,若是这样,可以分给不同的人去写,也可以修改的时候,不用大刀阔斧的改。但是功能上的利用就显得复杂一点。而第二种独特的功能就很有特点,对于方法的复用也很方便。内容上的相互依赖,和只是对象的关系的牵扯。总之,两者都有好处,但聚合度高,更利于整体代码的效率和方法复用。

2、 题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

 

 

 

 

 

 

第一题的图形继承主要由以下类图来解释,由一个父类Shape类,以及下面的子类。父类只有一个求面积的方法,而子类会对getArea方法进行重写。

 

 

这个题虽然是初学父类和子类的初始题目,但也充分考察了自己对于老师上课说过的子类方法重载和重写的理解与应用。接下来是自己该程序的sourcemonitor生成表的示意图:

 

 

 

显然,这题的Maximum Complexity就不会太高,但自己的代码的效率也不会太低。运用的语句if之类的冗余的太多了,对于一些方法的使用不太精炼,要多学习和研究好一点的方法。以下是自己代码的类图:

 

 

 

  • 总体上写出了老师的要求,就是方法的应用就不太一样了。题目所做的意义是要自己理解封装和继承。所谓封装,通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作。这样,就能
  • 隐藏一个类中不需要对外提供的实现细节;
  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
  • 便于修改,增强代码的可维护性。

而继承,则为多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。主要的作用为:

  • 继承的出现减少了代码冗余,提高了代码的复用性。
  • 继承的出现,更有利于功能的扩展。
  • 继承的出现让类与类之间产生了关系,提供了多态的前提。

对于写完这种继承类的题目后,再看看其他前辈的意见,我觉得,主要由以下几点需要注意:

  • 不要仅为了获取其他类中某个功能而去继承
  • 子类继承了父类,就继承了父类的方法和属性。
  • 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
  • 在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。

对于老师上课所讲的,再加上题目经验所得。还有,子类不能直接访问父类中私有的(private)的成员变量和方法,这同样也需要自己牢牢记住。

对于题目集6(7-5)的自己代码的类图为:

 

 

 

我是在老师给的规范下再到里面加东西,添加方法的设计。定义了抽象类的父类,把getArea方法定义为抽象方法,然后每一个抽象方法实际上可以理解为是一种虚方法,可以被重载,不同之处是抽象方法必须被子类重载,而虚方法可以被重载,也可以不被重载,意思就是说抽象方法是基类设计者认为该类必须实现的功能。每次再讲该方法重载,写出每一个类自己的getArea方法。这里再总结一下子类于父类的关系,子类是可以看做特殊的父类,理解为父类为基本方法,而子类有它自己的特殊方法。所以子类能做的事情,父类不一定能做。但是父类能做的事情,子类一定能做。

最后题目集6(7-6),主要考察的是基础的接口和多态的实现。以下是自己代码的sourcemonitor生成表:

 

 

 

  • 生成表上的复杂圈为4,这次的代码可能不太难,导致复杂度低了,也证明自己有所进步。这题也主要是加深上课所学的接口和多态的使用。多态于接口主要用作父类于子类的延伸。主要的作用是提高了代码的通用性,常称作接口重用。其实也是方法的重写,利用自己的方法来解决问题。对于多态的认识,我从网上找到了一段资料来解释:多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
  • 继承是通过重写父类的同一方法的几个不同子类来体现的,那么就可就是通过实现接口并覆盖接口中同一方法的几不同的类体现的。

3、 对三次题目集中用到的正则表达式技术的分析总结

三次题目集中的正则表达式的应用,主要是对数字和字母的匹配和确认。开始的水文数据校验及处理,那道题目对自己学习正则表达式一开始还是有难度的。所以没能做出来,确实是自己的能力不够,应该多加练习。对于后面出现的小题目,自己还是做出来了。主要是验证用户输入,比如验证输入是否为一个数字,是否是一个全部小写的字符串,或者社会安全号。对于处理字符串来说,正则表达式是一个强大的工具。还有,我很想分享一个网站,它里面归纳总结了大部分可能会用到的正则表达式语法,在这里分享:JAVA正则表达式语法大全 - 星之寒 - 博客园 (cnblogs.com)。

在正则表达式语法中,^    行的开头,请在正则表达式的开始处使用^。例如:^(abc)表示以abc开头的字符串。注意编译的时候要设置参数MULTILINE,如 Pattern p = Pattern.compile(regex,Pattern.MULTILINE);
$    行的结尾,请在正则表达式的结束处使用。例如:(^bca).*(abc$)表示以bca开头以abc结尾的行。对于这次的题目,总结的是:*,+,?,{n},{n,}以及{n,m}称为量词符,用于确定量词符前面的模式会重复多少次。

4、 题目集5(7-4)中Java集合框架应用的分析总结

Java对于三大特性以及正则表达式的应用。面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常有的一个方式。1.数组虽然可以存储对象,但是长度是固定的,集合长度是可变的。

数组中可以存储基本数据类型,集合只能存储对象。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。以下一张图是自己从网上学习收藏到的:

 

 

 

 

 

 

三、      采坑心得:

主要是一定要看对题目的要求,一定要认真审题,抓住题目的条件,要细节!

就比如说是那个算日期的题目,以下是修改后的代码

public void getDaysofDays(int x,int y, int year, int month, int day, int year1, int month1, int day1) {

        System.out.println("The days between "+ year +"-"+ month +"-"+ day +" and "+ year1 +"-"+ month1 +"-"+ day1+" are "+(y-x-1));

    }

   

    public void getDaysofDays1(int x,int y, int year, int month, int day, int year1, int month1, int day1) {

        System.out.println("The days between "+ year +"-"+ month +"-"+ day +" and "+ year1 +"-"+ month1 +"-"+ day1+" are "+(y-x)); }

一开始因为没有加绝对值,一直忽略了相差的天数一定要是正数的条件,而且之前的年份日期的规定也有搞错,所以一定要仔细!

还有就是正则表达式中,可以使用括号来将模式进行分组。重要的是,不要在重复量词符中使用空白。例如,A{3,6}不能在逗号后面有一个空白符A{3, 6}。

四、      改进建议

对于自己的代码,主要是多改进方法的设计,太容易冗余,不能做到利用该利用的方法,并且应该学会怎么去改进代码,使得到时候调试的时候不用修改那么多。

五、      总结

对于本次的题目集的做法,自己觉得自己还不够,还是有很多题目没能做出来,缺少了相应的语法应用的能力。但是,也有自己做的不错的地方,自己想出来了一个比较独特的方法来解决问题。其实题目集主要还是对理解抽象类与子类的关系,实现继承操作,构造类族;正确使用抽象类和子类实现多态操作;理解接口的意义,并实现行为的多态;理解了解抽象类、类以及接口三者的异同以及使用场合。整体题量适中,大部分的题目的难度适中,有个别题目有着自己的鲜明的特点,也是为了我们能适应更多的情景去写程序。

 

 

 

 



这篇关于题目集4~6的总结性Blog的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程