PTA作业总结之第二阶段

小记

——这个学习阶段对于我来说,是一个关卡阶段,对于我自己而言,大脑中的很多东西都还是原本的C语言的思想,因此在Java的学习和编程过程中很多Java的编程原则都是没有体现的,编程也是只是换了一个形式而已,原本的面向过程思想仍旧还在,而且程序的复用性很差,很多方法都是模糊不清,就像老师所说的每一个方法体的代码长度不应该超过50,甚至是会小于30行,但是我的代码中的方法体甚至会超过100行,所以Java中的最基础的原则单一职责原则都没有实现,这是一件不可思议的事,不过也还是学到了很多,就如谢雨航说的很多原则只有在不断的学习中我们才会逐步的认识到它的重要性。

前言

第二阶段的大作业PTA上的作业有三次作业,知识的内容包括正则表达式、Math类的使用、封装、继承、多态和接口的运用等,第一次作业得分为92分,第二次作业得分为94分,第三次作业得分为100分,这些题目包括水文数据校验及处理、蒙特卡罗方法求圆周率、图形继承、图形继承与多态、 一元多项式求导、图形卡片排序游戏、 图形卡片分组游戏、求素数;其中正则表达式的使用我不是很熟练,所以失分都在那里。虽然题目量不是很多,但是注重理解,特别是正则表达式需要自己去网上查略相关资料,自学完成,而Math类的用法就相对简单一些了,继承、多态、接口、封装这些是Java的学习中很重要的一部分,我现在也只是初步了解了他们的具体使用方法,而具体应用仍然需要在日常的学习中进行。

1.作业总结过程

(1)这三次作业的知识迭代关系:

这三次作业的知识不似上一阶段的学习过程一样是递进的,这几次作业的知识内容是在即上一阶段的学习的基础上,在逐步深入,但是这次的作业的知识点正则表达式以及Math类的使用这两个知识点是在上一阶段学习的补充,而封装、继承、多态、接口这四个知识点则是Java内容学习的重中之重,因为他们是Java的最重要的几个技术特点,而且这些内容在今后的Java学习中更是不可或缺的。

(2)如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性

 面向对象的封装特性主要是通过类图来理解,就如下图所示:

Rectangle类里面包括了width、length两个成员变量,也就是他们的属性,而且Rectangle类里面包含了类的构造方法以及长方形的一些基础的计算比如说面积的计算、周长的计算以及长和宽的检验合法,这些方法其实都是长方形的常用的一些计算而已,而在Java中Rectangle类就是将长方形的一些基础的应用写成方法并将他们打包封装在一个类里面,也就是说封装就是将一个事物所有可能出现的特性通过方法和属性打包封装在一个类里面;而继承的基本思想就是基于某个父类进行拓展得到一个新的类,子类可以继承父类原有的方法和属性,也可以增加原本父类所不具有的属性和方法,而且子类可以重写父类中的方法,如下图所示:

Rectangle类继承Shape类,Rectangle类里面有继承自Shape类的getArea()方法和validate()方法,而Rectangle类有Shape类不具有的属性length和width,这就是继承基本内容,除此之外继承中的父类不可以变成子类,但是子类可以变成父类,所以通俗的讲,继承就是将一类事物相同的属性和方法封装到一个父类中,而后如果需要定义一个和这个类具有相同的属性和方法的类,就可以直接继承自这个父类,也可以对这个父类的方法进行重写;多态的运用就是指同一个实体同时具有多种形式,即就比如下图所示

假设Shape类不是抽象类而是一个父类,那么可以这样说Shape类的实体类具有三种形式Rectangle、Circle、Triangle这三种形式,这就是多态。

③作业过程中遇到的问题及解决方法

这次遇到问题大多都是正则表达式问题,以及来自于单一职责原则的问题,首先就是第一次作业的第一题而言就是说没有仔细看清楚题目导致忽略的数据中存在的空格问题,所以就产生了错误,解决方法就是在  getDealDataResult()里面的分割后进行去空格操作,具体调用了String类里面的trim()方法;第二题就是对问题理解不透彻,导致在随机生成的点坐标出了问题,考虑不周导致产生的随机数中没有负数,所以就将public double simulation(int n)方法中的随机生成点坐标改成如下形式:

ab=this.rectangle.getCoordinate().getAbscissa()+Math.random()*this.rectangle.getLength();
or=(this.rectangle.getCoordinate().getOrdinate()-this.rectangle.getWidth())+Math.random()*this.rectangle.getLength();

这样就避免了无法产生负数随机数的问题,但是由于自己未考虑清楚pai的计算,仍旧存在问题,于是将pai的计算进行强制类型转换,更改如下:pai=(double)4*j/n;

这样错误就改好了,第三题主要问题是格式问题,自己在看老师给出的样例输出是并未看仔细,所以解决方法就是重新更改输出的格式;

第二次作业问题就是主要还是在第二题正则表达式上数据间空格没有忽略;导致出问题,还有就是最大数据问题,也就是自己的输出格式存在问题导致的,数据空格问题就是在数据校验的时候调用了String类里面的trim()方法进行除空格操作,而最大数据问题则是将输出格式改成如下形式:

if(list.get(i).getDerivative().toString()=="")
j++;
if(list.get(i).getDerivative().toString().matches("[-].+")||list.get(i).getDerivative().toString()=="")
{
sb.append(list.get(i).getDerivative().toString());

}
else
{
h++;
sb.append("+");
sb.append(list.get(i).getDerivative().toString());
}

之后最大数据问题就解决了,第二题的问题就是排序问题排序的时候未仔细考虑清楚冒泡排序的具体操作形式是怎么样的,解决方法就是将排序算法重新编译如下:

for(int i=0;i<list.size();i++)
{
for(int k=i+1;k<list.size();k++)
{
if(list.get(i).getArea()>list.get(k).getArea())
{
Shape shape=list.get(i);
list.set(i,list.get(k));
list.set(k,shape);
}
}
}

第三次作业的问题就在于第二题的问题并没考虑到范围,以及直接输入零的输出形式,解决方法就是将重新考虑范围问题,将0这个情况考虑到,直接输出Wrong Format。

④每次作业花费的时间比例

这三次作业所花费的时间比例是:12:7:3

⑤对编程过程的严谨性的认识及教训

编程过程是不要直接考虑能把题目做出来就行,要多考虑程序的复用性和单一原则问题,教训就是每次看到问题要尽量多思考,不要就一股脑的开始编程,而且在编程过程中要严格注意单一职责原则,不要每次都将自己的方法体写的那么冗长,另外就是多去理解老师所讲的内容比如说继承、多态以及接口,多理解Java的编程原则,并且要做到今后在编程过程重要运用这些原则去实现功能的解决。

2.OO设计心得

①对面向对象三大技术特性之间关系的理解

封装:封装就是将一个事物所有可能出现的特性通过方法和属性打包封装在一个类里面;

继承:继承的基本思想就是基于某个父类进行拓展得到一个新的类,子类可以继承父类原有的方法和属性,也可以增加原本父类所不具有的属性和方法,而且子类可以重写父类中的方法,但是子类不能继承多个父类,只能继承一个父类,但是可以有多个接口;

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)

单一职责问题就是将每一个方法体的职责简化成简单的一个职责,即一个方法实现一个职责,解决一个问题。

开闭原则就是面向拓展开放,面向修改封闭,所以我们写的每一个程序都要很好的复用性,不能仅仅只考虑通过PTA上的题目就可以。在开-闭原则中,不允许修改的是抽象的类,或者接口。允许扩展的是具体的实现类,抽象类和接口在“开-闭”原则中扮演着极其重要的角色,在设计过程中既要预知可能变化的需求,又要预见所有可能已知的扩展。

③OO编程思维的理解

OO设计思维是面向对象的,所以他的一些设计原则绝对不可以忽略,或许现在我们对设计原则没有多大理解,但是当我们接到一些项目的时候我们就会越来越清楚这些的重要性,特别是对单一职责问题更要仔细思考,开闭原则也是如此,所以说在编程的时候一定要考虑程序的复用性,这样既省时又轻松,这也是面向对象区别于面向过程的重要一点。

 ④类设计心得

由于是老师直接给的类设计图所以没有类设计心得,但是有一些思考,在进行类设计的时候,主要需要考虑的是事物组成的最重要的特性作为属性,其次再去考虑其他的一些特殊的特性进行方法的编程思考。

3.测试的理解与实践

①测试对于编码质量的重要性

测试的理解,首先我们要实现的是题目所要求的功能,在此基础上在进行一些特殊功能的考虑,主要就是在考虑特殊功能是不能破坏了原来能实现的基础功能,而测试就是帮我们检查这些功能是否已经实现的最简单直接的操作,所以我们在测试时一定要测试多组数据,特别要对特殊数据要多加考虑。

②查阅资料,假设使用Junit进行程序的测试是否可行

查略资料后知道,使用Junit进行测试是可行的。

4.课程收获

这四周的确我们深入学习了Java三大技术技能(封装、继承、多态),也正是了解了面向对象于面向过程的区别具体在哪里。我觉得这四周最大的收获就是对Java的编程原则有了更深入的了解,比如说单一职责原则和开闭原则,说实话第一阶段四周的学习中,我对于Java的编程原则只是停留在记住这个层面上,但是上个四周的学习,我充分的认识到了编程原则的重要性,我在第一次作业中就出现了代码冗长的问题,就是说我的编程代码太长了,而且对于每一个方法并没有实现单一职责原则,更不要说复用性,每次都是对于功能的强硬实现,并没有考虑的复用性,但是我现在明白了单一职责和复用性的重要性,但今后的日常工作中,我们所面对的是一个项目,所以里面很多类都是要重复调用的,更是有一些类需要作为父类来供继承和拓展的,这就要求我们的程序具有很好的复用性,而复用性有依赖于单一职责原则,所以这两点无论是对于我,还是对于大家都是很重要的。

5.对课程的建议

①第三阶段作业难度、题量的建议

对于第三阶段的作业难度的大小和题量的多少,其实并不是很重要,但是我只希望老师能多组织同学们进行交流,我觉得这对于大家的学习都很有好处,取长补短很不错的。

②课程内容讲解方面的建议

对于课程内容讲解方面的建议,我觉得老师讲的很好,而且很详细,不过我希望老师还是能够录下屏,因为我老是网络不好,经常卡顿,经常卡出课堂,所以说很多内容会听不见,虽然有回放,但是我还是希望老师能够录屏这样我们就可以在下课之后及时回顾。

猜你喜欢

转载自www.cnblogs.com/ZWJ-CQJAVA/p/12802776.html