前言:
本次总结针对于pta上第一阶段的三次作业,第一次作业主要训练Java的基础语法,如if...else语句、for、while循环语句;第二次作业主要对于方法的使用,比如有参数有返回值方法;第三次作业主要对于类、构造方法等的使用。
一、作业过程总结
- 1、作业之间知识的迭代关系:第一次作业针对题目需要实现的要求,主要是使用一些基础语法,如选择判断语句及循环语句;第二次作业则是对方法的使用,在方法中,实现部分所需的要求;第三次作业则是对于类的使用,不同的类中又使用了所需的不同方法,如构造方法等。
- 2、由面向过程过渡至面对对象的过程:第一次的作业是为了实现题目需要的要求,为了解决问题,就像写C语言一样,一个方法里解决所有问题,代码的复用性不高。(如下为第一次作业的源代码,主要是对基础语法的使用)
import java.util.Scanner; public class Main{ static double a,b,c; public static void main(String[] args) { // TODO Auto-generated method stub Scanner y=new Scanner(System.in); a=y.nextDouble(); b=y.nextDouble(); c=y.nextDouble(); if(a<=0||b<=0||c<=0||a>200||b>200||c>200) { System.out.print("Wrong Format"); } else if(a+b<=c||a+c<=b||c+b<=a) { System.out.print("Not a triangle"); } else if(a==b&&a==c) { System.out.print("Equilateral triangle"); } else if((a==b&&a!=c)||(a==c&&a!=b)||(b==c&&b!=a)) { if(a*a+b*b-c*c<=0.000001||a*a+c*c-b*b<=0.000001||b*b+c*c-a*a<=0.000001) { System.out.print("Isosceles right-angled triangle"); } else System.out.print("Isosceles triangle"); } else if(a*a+b*b-c*c<=0.000001||a*a+c*c-b*b<=0.000001||b*b+c*c-a*a<=0.000001) { System.out.print("Right-angled triangle"); } else System.out.print("General triangle"); y.close(); }
在后面俩次的作业中,逐渐对类、对象、属性、方法有了一定的了解认识。写作业的时候,从起初的对需求实现的思考过程逐步至关于题目需要什么样的类,有什么属性和方法,还需要创建什么对象,再在每一块中实现它所需要的功能,以及方法的调用,使得代码的复用性相较之前更高。(以下是类名作为返回值的方法,返回该类的对象)
public DateUtil getNextNDays(int n) { int sum; int data[]= {31,28,31,30,31,30,31,31,30,31,30,31}; if(n<data[month-1]-day) { day=n+day; } else { sum=n-(data[month-1]-day); month++; do { if(isLeapYear(year)==true) { data[1]=29; } else data[1]=28; if(sum>data[month-1]) { sum-=data[month-1]; month++; if(month==13) { year++; month=1; } } }while(sum>data[month-1]); day= sum; if(day==0) { day=1; } } return this; }
-
3、作业过程中遇到的问题及解决方法
①if...else语句使用时,由于嵌套多个判断条件时未考虑清楚或者选择判断时少加了else造成部分答案错误,通过单步调试看其运行步骤后解决问题。
②判断三角形的形状时,判断条件中平方的关系(可含无理数)由于精度的问题造成答案错误,解决方法上网查阅以及向同学请教。
③对于边界的判断造成运行时可能多运行或者少运行一次,对特殊样例未进行考虑造成部分答案错误,通过多个测试样例调试解决问题。
④运算表达式中,由于运算顺序的问题,如应当先运算的加法未加括号造成答案错误,通过样例测试比对后检查算法解决问题。
⑤switch语句使用时,忘记在该终止的语句后加break,造成答案错误。在main方法里未调用输出方法造成运行异常无输出。
⑥类名作为返回值的方法,返回类型错误。上网查阅资料,当类名作为返回值类型时,返回值时类的对象。
⑦运行异常NullPointerException,空指针,没有创建所需要的对象。
⑧运行异常ArrayOutOfBounds,数组越界。
- 4、作业花费时间的比例:1:2:2
- 5、对编程过程的严谨性的认识及教训:在解决一个问题的时候,起初是大致的一个思路,再慢慢的细化的过程,在过程中可能因为某些细节的问题,如边界问题for循环的终止条件是否可以取等号、在for语句后加上if语句,若if后还有for循环,则会执行if之后直接跳过后面的for循环、数据类型的转换、在输入时用nextLine()会读取换行符并消除,equals与“==”的区别、创建新的构造方法会覆盖默认的无参构造方法等,在完善代码的过程中,会因为需求的实现去增进代码的功能,以及对空间、时间的效率的完善。
二、oo设计心得
- 1、面向过程与面向对象的比较:面向过程主要是针对一个问题或者功能的实现去解决问题的过程,在编写程序的时候会注重具体的算法、解决方案,由于是一步一步的对问题的解决,所以代码的复用性、扩展性不高,针对一个比较单一的功能实现来说会更简单,但是对于较复杂、大块的问题的解决就比较困难;而面向对象不在于解决问题的过程,是解决问题的时候需要什么样的实体来参与,分析需要什么样的类以及每一个的类的特点,每个类所需要具备的属性、方法。所以面向对象代码的复用性、扩展性会更高。
- 2、面向对象设计的基本原则理解:面向对象设计时需要分析需要的实体,将其分为不同的类,而类应该需要具备单一职责的原则,每一个类有其自己的属性和方法来实现需要完成的需求,如果将不同的功能需求写在一个类中,在需要对功能进行变动时就会比较复杂,而实现了单一原则只需要在相应变动的类中进行修改,因此提高了代码的复用性。
- 3、OO编程思维的理解:面向对象对于问题的解决和实现在于考虑需要什么样的实体不在于问题实现步骤的具体化,于是抽象出需要的类,而类有其自己的属性和方法,具体的一个实体则称为对象,通过类和对象的继承、多态、封装来解决问题(后俩者还未讲到)。继承主要可以提高代码的复用性,比如子类可以继承父类的方法,还可以扩展其他的方法。
三、测试的理解与实践
- 1、测试对于编码质量的重要性:测试可以检测所需功能是否实现,比如给出输入值,是否能输出对应的输出值;测试可以完善自己的程序,起初对编码的设计可能不完整,通过测试可以对一些边界的设定或一些特殊样例进行进一步的完善;
- 2、测试用例会考虑一些特殊的情况,如边界值的考虑。比如当计算年月日问题时,会针对于闰年、平年、特殊月份的天数作为测试样例;对于非法样例的输入判断;对于最大值、最小值的测试等。
四、课程收获
- 上课四周以来,对类这一抽象的概念以及其具有的属性、方法,实体化的对象逐渐有了一定的了解。属性有其权限,如public、private。方法中有构造方法、方法重载,参数返回值等。一开始对于类、对象、属性的概念混淆不清,经常出现NullPointerException运行异常,没有新创建一个对象来执行所需的方法。对于this关键字的用法,this当前对象的引用,可在构造方法中调用另一个构造方法,但是只能位于首句;Math类的使用,如sqrt();正则表达式的使用,判断字符串格式是否符合要求;数据类型之间的转换;
五、对课程的建议
- 作业的完成时间可适当长一些,可以有更多的时间去思考。
- 上课前可以回顾下上一堂课留下的课堂作业,可以解决同学的问题并提供新思路。
六、未来的学习计划
- 跟着老师的进度学习,认真完成所布置的作业,遇到不懂的问题及时解决。
来源:oschina
链接:https://my.oschina.net/u/4315935/blog/4187735