OO第一次博客作业
一、前言
目前我们的JAVA学习已经过去了一个月,完成了前三次的题目集作业。对于JAVA课程作业中所遇到的一些知识要点、有困难或者易犯错的地方以及自己的不足进行分析、记录与总结。
在前三次的题目集中我们从简单的选择语句、数学函数、字符串操作、循环语句慢慢进阶到类与方法的运用,学习JAVA语言中相对于C语言更加独特的编译方式与特殊语句。题量适中,循序渐进,能够在过程中查漏补缺,认识到自己的不足,同时做出相应的解决措施,虽仍有不少问题,但还是做到了进步。
二、设计与分析
本次博客重点选取几个有代表性的题目以及我个人有困难及不足的题目进行分析。
题目集1_7-8 、判断三角形类型
设计方案:最先判断输入是否合法,再判断输入是否满足构成三角形的条件,然后使用几个连续的if else语句进行三角形种类的细化。
分析调试:一开始没有注意到所给的输入与输出样例含有浮点型以及双精度浮点型数字,直接使用了int 进行输入操作,导致错误,而自己却没有任何的发现,对基础的标识符不敏感,以至于许久都没有找到错误在哪。然而在刚刚接触JAVA没多久的时候,我通过许多次的不解与尝试后终于发现了这个问题,也让我对基础的知识更加重视。虽然在连串的if else 语句下完成了对各类三角形的判断,但在测试时仍有一个测试点未通过,着实是我的基本功不到家。
题目集2_7-2 、合并两个有序数组为新的有序数组
设计方案:创建一个新的数组,将输入的两个数组全部录入新数组中,再用JAVA自带有的数组排序方法对这个新数组进行排序,就可以得到所要的升序排列。
分析调试:编译通过的条件下,所有的答案测试点都错误,使用测试样例时发现我的答案所排的序全是按照每个数字的最高位开始进行排序,令人费解。逻辑思维没有错,编译也没有错,唯一错的就是排序的方式。在对各方面进行排查之后发现,我使用的数组类型是Sting类型,当我使用Int [ ] array = Arrays. stream(s). mapToInt ( Integer :: parseInt ) . toArray () ; 语句将String类型数组转化为int类型数组时,所有测试点都通过,我才发现单纯对整形数字排序还是要使用正常的int类型,防止出现令人啼笑皆非的“事故”。
题目集2_7-4 、求下一天
设计方案:题中给出了所需要的方法名,在这些方法名的基础上进行填充内容。isLeapYear ( int year )就是对年份的是否为闰年进行判断并返回boolean类型值; checkInputValidity ( int year , int month , int day )判断输入日期是否合法,其中要特别注意平年的2月29日是非法日期; nextDate ( int year , int month , int day )是解题核心的求输入日期的下一天部分,要注意每个月的最后一天,尤其是二月和十二月的最后一天;最后在主方法中进行方法的调用和输入输出操作。方法图如下:

分析调试:一开始在思考如何用一个方法返回几个数值,在经过查询之后选择使用将几个数据存入一个数组中进行修改、返回与调用,于是我将方法名的类型改为int数组类型。在求下一天操作中,要细化很多东西,第一次完成时总是缺斤少两,导致答案不完全正确,例如12月最后一天没有修改月份为1,而是直接进行了自增。还有一点就是在编译通过并且各个方法在调试修改后都没有问题的情况下,在优先判断是否合法时没有输入System . exit ( 0 ) ;语句而导致的答案错误。
题目集2_7-5 、求前n天
设计方案:题目要求计算间隔[ -10 , 10 ]之间的日期,是上一题的升级版,对此需要更加复杂且精确的计算式。依照上提思路,依旧写isLeapYear ( int year )、checkInputValidity ( int year , int month , int day )、Date ( int year , int month , int day )三个方法以及主方法,因为前/后n天是个不确定数值,需要根据n的大小进行月份是否要改变的判断。
分析调试:因为要进行多方面的判断,所以用了if else 语句的嵌套,也增加了阅读理解代码的难度。依旧使用数组作为储存数据的工具,首先分后n天和前n天两个大块,再对特别的二月进行分析,对2月19到2月29/28日的运算为:如果n+日期大于29/28则月份自增,日期为n+日期-29/28,以此类推,前n天也是类似的操作,其他标准月份除一月、十二月需注意年份、月份的不同变化外,都基本类似。在实现过程中,由于代码的可阅读性较弱,修改调试起来时并不方便,逐一仔细检验后才最终将代码通过所有测试点。
题目集3_7-2 、定义日期类
设计方案:由题中所给类图进行代码的逐步编译。需要学习对象和类的知识,自己定义一个类Date,创建私有属性年、月、日,且为整型数,不使用Java中和日期相关的类和方法,依旧是上次题目集中求下一天的思路,不过可以拥有更加方便且容易理解、可读性强的代码。类图如下:

分析调试:由于PTA网页测试时的特殊要求,在使用eclipse时编译可通过但是在PTA上就经常会有编译错误,在仔细阅读PTA的JAVA作业书写规范之后,对原本代码修改格式,修改类名,规避一些踩雷事项,就可以在PTA上运行通过。由类图中所给的定义的数组,正确使用可以有效地使代码拥有更高可读性与效率,逻辑问题在上次作业中已经明确解决,根据所给类图一步一步执行就可以快速并有效地达到编译目的,也算是完成地较为满意地一次作业。
题目集3_7-3 、一元多项式求导(类设计)
设计方案:由于题目难度较大,首先进行表达的非法判断。学习正则表达式的形式与规范,使用正则表达式进行对表达式的输入是否符合题目要求进行判断。在能够有效判断是否符合要求之后,先将输入内容中可能出现的空格使用ApacheCommonse的StringUtils . deleteWhitespace (“”) ;删除所有空格。再提取不同位置的数子进行规范运算。
分析调试:这个题目的要求中,首要达到的正则表达式的使用我仅学了些皮毛,虽有努力但任然不够,无法达到基本要求,后续的操作更是没有仔细研究,对此我十分懊悔,学习仍旧不够努力与认真,钻研精神也不够充足,对困难没有迎难而上的勇气,但是经过教训之后,我会更加努力的学习,弥补这次作业所错过的学习机会。
三、踩坑心得
- printIn的输出会自动转行,疏忽这点经常会导致在PTA中答案格式错误。
- 注意JAVA中的基本数据类型,在编写代码时要时刻注意数据类型的要求与规范性,前后的一致性与是否符合答案所需的字节。例如题目集1_7-8中的双精度型输入:
double a = input.nextDouble ( ) ;
double b = input.nextDouble ( ) ;
double c = input.nextDouble ( ) ;

- 字符串类型在没有必要时越精准越好,全是由整型数构成的字符串就用int类型,需要更多类型的内容时再考虑使用其他类型,例如我在题目集2_7-2中开始定义就将所有字符串定义为String类型 :
int n = sc.nextInt( );
String s1 [] = new String [n] ;
for ( int i = 0 ; i < n ; i ++ ) {
s1[i] = sc.next( );
}
int m = sc.nextInt( );
String s2[] = new String [m] ;
for ( int i = 0 ; i < m ; i ++ ) {
s2[i] = sc.next( );
}
String s [] = new String [m+n] ;
for ( int i = 0 ; i < n ; i ++ ) {
s[i] = s1[i];
}
for ( int j = 0 ; j < m ; j ++ ) {
s[n+j] = s2[j];
}
导致答案错误,经过将String类型数组到int类型数组的强制转化
int[] array = Arrays.stream(s).mapToInt (Integer::parseInt). toArray ( ) ;
才得到正确的答案。
- boolean类型仅有true和false两个值。
- 在需要在中间结束的if else语句中,需要添加System. exit ( 0 ) ;语句进行中途停止,并且不再执行后面的语句。例如题目集2_7-4中:
if ( m == false) {
System.out.println("Wrong Format");
System.exit(0);
}
else {
int[] result = nextDate(array);
System.out. println ( "Next date is: " + result[0] + "-" + result[1] + "-" + result[2] ) ;
}
- 输出语句中,用“+”号连接两个不同类型的值。例如上。
四、改进建议
许多代码的书写并不规范,且逻辑思维也不够缜密,有些甚至过于复杂。JAVA中有自己的自带的许多方便的使用类方法,可以去学习使用。在现在所写代码中,可以借鉴他人所写的优秀的代码,对自己的不足进行改进与优化。
五、总结
一个月的JAVA学习,我学会了一些东西,甚至不能说是学了不少东西,总而言之对JAVA课程有了基本的了解,对面对对象的理解也有了一些,也能够写出简单的类与方法。但是若是想要学得更好,还要花费不少的时间、精力在基础的学习上。粗浅的学习已经无法跟上教学的进度,关于面对对象,我学习得不够,要抽空多看MOOC教程,查漏补缺,充实自己。

浙公网安备 33010602011771号