(1)前言:
对学习面向对象一个多月以来所做的三次题目集进行分析。
第一个题目集涉及的知识点较为基础,题量虽多但每道题的难度并不高,所花时间较少,主要涉及了基础类的运用例如Scnner和java中数组、排序函数的运用。
第二个题目集前两题较为基础后三题侧重于类的设计,难度适中,主要考察对年份基础知识的运用。
第三个题目集题量再次减少但难度再次增大(我是说第三题),主要考察类设计和正则表达式的运用。
(2)设计与分析:
第一次题目集7-8:主要运用了arrays类的方法,将三角的三条边转化为数组来进行运算和判定,具体涉及三角形边长的关系知识,两边长是否大于第三边,两边是否相等构成等腰三角形以及是否构成勾股定理等情况进行依次判定即可,由于使用大量if else语句,圈复杂度十分高
在往后的作业中应尽量减少使用改为其他办法。
第二次题目集7-4,7-5:都是属于求某一天的题目,因此方法基本一致,对所求那一天的情况进行判断即可,首先判断输入的天数的年份是否是闰年,再根据年份情况分析所求天所在的月份天数进行分析。这两题所需方法较多,可以看出JAVA面对对象的思维,要清楚每个类的职责,而不是面向过程。
由于在判断闰年和2月闰月平月的过程中使用了大量if else语句,所以这两题的圈复杂度也灰常高。
第三次题目集7-2:题目目标与题目集2中的7-4相同,本题主要是将日期类的方法写完整,增加代码的可读性,减少圈复杂度,因题目已给出方法名称及其作用,因此设计并不难。
第三次题目集7-3:是目前为止难度最大的一道题,首先要学习正则表达式的使用,首先对输入表达式的合法性通过正则表达式进行分析,然后对求导的系数和指数进行计算,并对各种特殊情况进行判定。并且要对求导过程中出现的诸多情况进行分析,并且该题有不合乎常理逻辑的天坑点,耗时很长,提交了近20次才满分通过。
(3)踩坑心得:
一定要注意题目要求例如相关变量的范围,代码中避免出现如
if(month!=1&&month!=3&&month!=5&&month!=7&&month!=8&&month!=10&&month!=12) {//为平月 if(month==2&&isLeapYear(year)==true) { if(day<29) {day=day+1;return;} else {month+=1;day=1;return ;} } if(month==2&&isLeapYear(year)==false) { if(day<28) {day=day+1; return;} else { month+=1;day=1;System.out.println("Next date is:"+year+"-"+month+"-"+day);return; } } if(day<30) day=day+1; else { month+=1; day=1; } } else {//为闰月 if(day<31) { day+=1; } else { if(month==12) { year+=1; month=1; day=1; } else { month+=1; day=1; } } }
这么多的if else以免出现逻辑混乱及圈复杂度极高的情况,增强可读性。
题目集3的7-2中,day的定义,必须将其定义成long类型,如果将其定义成int类型程序就会出现报错,由于此时的天数可能会超过int所能包含的范围。
题目中出现的最大天坑是题目集3的7-3题目总的最后一个测试点,即如果求导结果出现常数相加的情况,加号要被自动省略,如7*x+8*x求导结果应该是78(就离谱),希望出题老师注重题目测试点的创建。并且在上课过程中和编程过程中,逐渐理解了面向对象设计的编程思维和理念,要清楚题目设计中的每个对象与其职责及其需要建立的类及其方法,这样能够增强代码的可读性并且能够体现面向对象的思维。
(4)改进建议:
减少使用过多的if else语句,可以使用其他方法如嵌套函数代替之。要用面向对象的思维来理解题目并进行相关设计。要多学习java中基础类及其方法的使用,打牢基础。要通过以上方法减少圈复杂度,增加代码可读性。上课前应做好充足准备。
(5)总结:
①面向过程与面向对象的比较:
<1>.面对对象与面对过程的本质区别就是面对过程编程每一个函数就是一个过程执行完就啥也不剩下了,唯一可以输出的就是return但是本质上说也还是过程的一部分,因为一旦执行完return语句本身就不再起作用了,即仅仅走了一个流程而已。所以你会发现面向过程编程想要储存点东西就不得不定义一个全局变量,而函数不过是对全局变量按照流程步骤进行加工处理的过程而已。
<2>.面对对象编程不是这样。面对对象编程,万事万物皆对象,每当建立一个新的对象,就好像建立了一个实体,它有自己的属性和方法,如果不对其进行销毁那么,她将会一直存在,而不是仅仅走个过程。你可以随时查找它的属性,也可以随时交给她一些东西处理,即对象不仅仅是一个过程模块。
②面向对象设计的基本原则理解:
把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。
③OO编程思维的理解:
面向对象的思维更符合人认识和思考问题的方式,面向对象的概念和应用已经超越了软件开发和程序设计,扩展到多个的领域,其中一个应用的分支就是面向对象的知识表示法。这种表示法把组成客观世界的实体抽象为数据和对数据的操作,并使用类把数据和对数据的操作封装成为一个不可分割、互相依存的整体。
从最初的的面向过程到面向对象,从无知到懵懂再到现在的初步了解,一步一步的走到了现在,越是学习越是了解了JAVA的路还很长,看不到边际,需要学习的东西还很多,没有尽头。学习JAVA的路程中学会了自学,因为写PTA有很多的东西是要自己去深入了解去掌握相关的知识的,例如StringBuilder,或者是正则表达式,都是要自己去学习的,老师是不可能像高中老师一点一点都给自己讲解得清清楚楚明明白白的,相信到了之后的生涯中自学也是避免不了的。
JAVA有很多内容是可以在网上搜到的,许多的语法使用是可以不需要去背单词一样的背诵下来的,写多了就会了。所以要多写,不能长期不学不写,那样容易手生。
要养成面向对象的思维,就是一看到问题就要在自己的脑海中构思UML类图,需要有初步的大纲,知道大概需要分成哪些类,这些类又要执行什么样的功能,这些思想的培养依旧是需要多写,毕竟实践出真理。
经过这三次作业,主要学习了基础类的运用例如Scnner和java中数组、排序函数的运用,相关类设计,String,Arrays类及其方法的使用,正则表达式的使用,学习了复杂结果的情况分析,Account类和日期类的设计,理解了面向对象的思维和理念。
JAVA语言的基础知识还需继续学习以打牢基础,做题思维也应进一步改善,对每一个类的职责应清楚并进行相关设计,减少使用过多的if else语句,可以使用其他方法如嵌套函数代替之。要用面向对象的思维来理解题目并进行相关设计。要多学习java中基础类及其方法的使用,打牢基础。要通过以上方法减少圈复杂度,增加代码可读性。上课前应做好充足准备。
建议:老师上课的体验感其实是非常好的,节奏感很好并且讲课与学生实践相结合,学生有很强烈的参与感,并且老师上课的主要内容侧重与对面向对象思维的讲解而不是对具体代码知识的讲解,增加了趣味性,老师声音音量控制的很好,不像某些老师讲课语气像我欠了他几百万一样。
课程方面我认为学习所需平台有点多了,学一门课我们需要用到U+新工科智慧云、PTA程序设计类实验辅助教学平台、中国大学mooc、博客园四个平台,并且与其他所学学科使用的平台并无交叉,这倒的确是有些不妥。
作业方面这个互测嘛,,大家都是同学,懂得都懂。其他目前倒没有任何不适的说。
实验方面目前只进行了两次实验,目前看来难度适中,体验尚佳。