一、前言
在大一下的下学期,我们开设了面向对象程序设计,主要学习的语言为Java,与大一上学期不同的是,本次作业是通过PTA平台提交的,查重与测试点的隐秘性
是其特点,而在这三周的学习经历当中,共计完成了三次作业,总体来说,前三次作业是偏容易的。
第一次的作业,题目量略大,但是整体来说容易,主要用到知识点为if else语句及Switchcase语句,其中7-4题写起来较为繁琐,检查起来麻烦,不确定哪部分错误,7-8 则需利用到Math类的方法,来验证三角形是否为直角三角形,略微比第一次题目集的其他题目难度更高。
第二次的作业,题目量一一般,前两题难度与第一次题 目集差不多,但是在后面三题当中则略微复杂-些,需要自己定义方法及写方法进行运算,本人运用到了较多的ifelse语句,不过好在后面三题的题目相似度较高,掌握--题便可推知后面的题目的解题方法。
而第三次作业,是前三周学习当中题目量最少的但是题目最难的一- 次作业,首次接触到定义类并且自己写类中的方法,这是在C语言当中并未学习到的知识,同时这也是Java的特点(面向对象),第三次作业的前两道题难度一般,只要掌握了关于类的用法就能快速解出题目,而在第三题则需要运用到正则表达式来匹配并用数组存取一元多项式的项并在后面的程序当中调用,这是在以往的学习当中从未接触到的内容,所以在做7-3时,一头雾水时对我状态最佳描述。
二、设计与分析
以下,我将分析一些题目集中的题目,从而进一-步的了解需掌握的知识点,以及更好的记住做过的题目。
首先分析的是第一次题目集中的7-8,在解题过程当中,由于我用if else .语句判断三角形的先后顺序有问题,导致我初次未能得到正确的结果,在仔细观察与思考之后,我修改了我的代码,但是在修改之后还是有几个测试点未能通过,由于PTA平台测试点的不确定性,我未能直接发现哪儿不对,在咨询班上有较强的编程能力的同学之后,我了解到了用double定义边长的话,就不能使用简单的两边的平方和等于第三边的方法去判断是否为直角三角形,以为其精度原因,需使用两边平方和减斜边平方和的差小于一的负六次方的方法进行判断,同时可调用Array类中的排序方法得出斜边,这样就不用分别假设a,b, c三条边都是斜边。极大简化了代码复杂度。同时这也是我第一次使用Java中的内置方法,体会到了Java的神奇之处。
在第二次题目集中,题目较难的为后面三道题目,我将在下面对第四题和第五题重点进行分析,在第四题的解题过程当中,运用了较多的if else 语句,输出Wrong Format的情况太多,太杂,未能统一的进行判断,这是我的代码中的缺点,说说我的解题思路,首先,我进行了对了输入的年份,月份,日的正确性的判断,但是在这个判断之中,我未能判断日是否超过了当月的最后一天,导致后续重新写了一个if else语句,增加了代码的复杂度,进行下一天判断时,我采用了数组的方法存取每月的最大天数,这样就能进行判断当天是不是当月的最后一天,避免了出现下一天是三月三二日的这一尴尬情况的出现,及在闰年2月29日和所有年份的十二月31日中进行了单独的判断,使得第四题输出正确,虽然正确,但是代码还是存在许许多多的问题,这点在Source Monitor生成的报表内容中也可以看出,算法还需要改进。
第二次题目中的7-5就是对前两题的拓展,难度系数更大,题目要求更高,但是,正所谓,换汤不换药,这题的核心算法与前两题相同。老实说,我第一次打开题目集二的时候,觉得这道题十分难处理,不知道如何下手,在仔细思考一番之后,觉得该题应考虑的地方太多,不好 写,但是在逐步解决了题目集二当中的题目后,再看看第三题,觉得十分容易,判断闰年的方法第三题就写好了,判断后面天数是哪一天的方法在第四题就写好了,我只需要做出一点点的改动,使得后面一天变成前或者后n天就好了,不过较为可惜的是,在第五题中,我又使用了较多的if else语句,使得代码复杂度进一步提高,极大的降低了代码的可读性,及计算机编译速度,而在SMONITOR的报表中内容与第四题类似。
接下来的就题目集三,三次中最难的一次题目集 。说实话,我觉得我有些不要脸,在题目集三中的第三题中,我完全是使用骗分的方法取得了20分 ,在最后的一天中使用正则表达式将多项式中的每一项分离了出来,但是到后续的使用中,不知道如何去求导,即使在数学中幂函数的的求导法则十分容易,但是转换为计算机语言就变得十分困难,需要再次使用正则表达式将数字提取出来并存入一个list结构当中,这再进行调用,这是比较难实现的一步,所以在最后的几个小时当中,我放弃了将这一步进行下去,转而开始测试题目要求中的测试点,恰好,大数测试中的测试点正好是pdf文件中给出的那个大数,使用了if else语句,将x^-5+6*x^7-1200*x^-1000+54468799958488*x^-925546作为单独的一种情况,使得在后续的测试中是自己的成绩多增加了5分。
说完了,在BLOG作业要求当中必须分析的几到题目,我想另外说说在这几次的作业当中让我头疼且收获了很多的题目,在第二次作业的实验题当中的第一题,题目要求将二进制转化成为十进制,老实说,我计算机导论学的并不是很好,进制转换的原理并没有弄明白,而为了这一题我开始时心想着需要自学将十进制转换二进制的原理整理明白,但在论坛上搜索资料的时候,发现java中就有方法能够将十进制转换为二进制输出,再一次体会到了java的绝妙之处,在后续的实践中,很快的完成了这一道题,虽说这一道题的难度很小,花在这一道题的时间不是很多,但这道题让我体会到了java和C语言的不同,在C语言中,往往需要自己写函数完成数据处理,而在java中这就显得十分简练,说一句妙不可言这不过分吧。
三、踩坑心得
在java的学习中我是真的踩了很多坑的,在第一次题目集中的第四题中,就算是某个if else 语句中某个数字不同都会造成后面的输出结果不同,而第四题的题目代码多且繁杂,这很不利于用肉眼寻找错误,非常难,以至于我修改了几天,不过在室友教了我eclipse当中的debug功能之后,很快的将错误寻找了出来,所以说,在java的开发中,一定要学会并掌握eclipse简单的debug功能,这可以让程序员少走很多的弯路。
以及还有,在使用if else 语句进行多个情况的判断时,应当多注意一些情况的判断情况的先后顺序,以及注意一下if else中的判断条件,这样可以减少在写代码的最终输出错误,以至于后续的调试过于难,难以找出错误。
四、改进建议
总的而言,在前三次的作业当中,我的代码风格较为复杂,而算法十分简单,使得我的代码的可读性一般,不算是什么好代码,在以后的编程中,我应更加注重对算法的使用,争取在以后的作业中写出高质量的代码,而不是像是这三次的实验中的简简单单的if else语句,并且在之后的学习过程中,能够多投入一些时间在算法的学习上,及多花费一些时间在代码的编写上,这样才能很好地达成OOP课程要求,学号OOP课程内容。
五、总结
说实话,在我看来前三次的作业其实就是开胃小菜,是让我们java小白很平滑的从C语言的学习过度到Java 当中,主要是学习到了类的应用,及对正则表达式开始了初步的学习,后续的学习难度我觉得一定会比这次的三次题目难,java还有很多的奥妙还没被我发掘出来,在之后的学习应多投入时间让自己的编程能力进一步的提高。同时,在我看来,我的代码算法十分简单,大部分都是if else语句,这导致判断的情况过多,而使得可读性较差,所以在后续的学习上,应该多注重算法的学习,让自己写出来的程序变得可读性强,优质。
对于教师等其他的方面,我没什么意见能说,因为在我看来,应该是学生主动去适应老师的教学风格,而不是老师改变自己的教学风格,来让学生更好的理解并掌握知识,而我正在适应的道路上,所以可能并不是很能跟上老师的节奏,但我确实在努力去适应。