第一次博客作业
第一次博客作业
一.前言
1.发博感想
万万没想到,刚学完C语言不到半年就开始找对象了。没错,我们开始接触和学习Java。在CSDN和同学朋友们的帮助下,我顺利完成了老师布置的前三次作业(虽然成绩不是很理想)。一波未平一波又起,老师快马加鞭开始督促我们完成第一次博客作业。一阵莫名的感动涌上心头,便开始投入到疯狂的打字中……
2.对前三次题目集的总结
ps:万万没想到,学习C语言的一些入门知识我花了一个学期,而Java不到一个月的时间,而且感觉学会方法比C语言还更多。毕竟在题目需求的催促下,每天不是在找对象就是在找对象的路上。
(1)概括:
第一次题目集:
第一次题目集一共八道,题目是这三次里最多的,但都是偏向于基础的考核。记得当初刚看到题目的数量的时候人都被吓了一跳,颤抖的小手点开了题目才稍微有些安慰。虽然当时的我不会Java的语法,不过丢到C语言里都是一些基础的知识:关于标准的输入、输出的考核;简单的加减法计算;if-else(switch)和for(while)循环的考核;循环、判断的嵌套。除了刚开始入门的时候有些不适应,之后感觉根本停不下来(要是有那么容易停下来,后面的题目就不会做的那么糟糕了),每天忙碌于看书、查资料中。
第二次题目集:
第二次题目集的题目略有减少(五题),但考核的难度有一个很大幅度的提升。需要用到字符串的存储、字符串的转换、数组的运用,并开始了初步寻找“对象”(即用方法去初步封装函数)。
第三次题目集:
第三次题目集的题目数量特别少,和第一次的反应相反,看到只有三个题目并且有近一个半星期的时间完成,我的嘴角疯狂上扬。短短三题,却没想到相比之前的题目又有了一个质的飞跃。在这三个题目里,我们开始正式的寻找对象。第一个题目是关于账户的简单管理问题;第二题则是计算年份;第三题求简单多项式的导数。看到题目的第一个反应就是立马退出,连要求都不用去细看,反正自己肯定不会。我在为期十天的时间里,花了一半的时间在看那本厚厚的叫你找对象的书。自信的点开题目发现还是不会。硬着头皮一边动手开始写一边查阅资料,花了一个晚上做完了前两题,函数的题目光了剩下的五天,每天都在查找关于正则表达式的方法,构思怎么去求多项式的导数。
(2)自言自语:
记得之前老师在上课的时候提到过:他说,他看到有一个学生在写代码的时间段一直在看书,老师就很疑惑,问他:你为什么不动手写?学生也很不解,答道:我一点都不会怎么写?老师的脾气就来了:你不写怎么会?学生:我不会怎么写?……死循环的问答模式,从自己的角度、立场出发。老师就此事淳淳教导我们:要多写代码。回想起前两次代码的练习,我做到了老师的要求,确实没看书,凭借强大的度娘和C语言的基础完成了代码的练习,并且都写到了满分。但是到第三次题目集的时候,我发现我无从下手,对象、类、方法、函数、public、private、默认的、getter和setter一窍不通,我隐隐约约感觉到就这样直接写有些不对劲,在大致看完题目的内容后便着手开始看书,一连看了五天,我不得不承认,尽管看了这么久,我还是没有这些概念的一个清晰的认识。但是基础的内容我也看完了,找不到合适的理由不去面对这看不懂的代码,只能硬着头皮上了。令我感到惊喜的是在实战之前,难懂的概念在代码间活灵活现地跳出。回顾之前学习的基础内容,终于对这些概念有了一个初步的认识。而且这三次题目集加深了我和度娘之间的的感情。
二.设计与分析
ps:之前老师没有要求,自己也没有这个习惯,我写的每个代码都没有加注释……
第一次题目集
第八题
该题是对输入的三角形的三条边,判断该三角形为什么类型的三角形。
总共54行代码,完成了对三角形的判断。因为用了很多个if-else判断三角形是否合法和其类型,使得圈复杂度高达18,初学Java,对Java有诸多不了解的地方。和以前写C语言代码一样,把所有的语句都丢在主方法下面,未对语句经行封装,如下图:
只有一个main方法。这是一个十分不合格的代码写法,这种代码也是我们俗称的“垃圾”代码。
踩坑心得:这个题目发布不久我就完成了一个基本框架的构造,并且通过了大部分的测试点,有一个判断直角三角形的点一直每过,直到提交的前一天,在室友的提示下我才发现,我判断是否为直角三角形用的勾股定理,c^2 == a^2+b^2 这里,因为计算机用的是用16进制存储浮点数,在16进制转化为十进制的时候有可能会出现精度丢失,导致一些误差的出现。就比如2.7*2.7,大家都知道是7.29,但是在eclipse里却出现以下结果:
导致判断是否满足勾股定理的时候出了问题。解决方法有很多,其中一种就是判断相减是否小于某精度。
改进建议:对放在main方法里的语句进行封装,将多次出现的if-else换成switch。
第二次题目集
第四题
该题目是求给定日期的下一天。我对年份、月份、具体某月的那一天进行了许多判断,也用了很多的if-else,圈复杂度也很高,相比上一次题目集,难度高了不少,但还是在我学习的C语言基础范围内,还是比较轻松的就完成了。
圈复杂度也是大于了10。深度也达到了一个惊人的地步。但是相比上一个代码,此代码虽然也是“垃圾”代码,却有初步对语句进行封装(好吧其实是题目要求的,不然我也还是丢在一个main下面),一共写了五个方法:一个是判断是否为闰年,一个是判断输入是否合法、规范;一个是判断月份的天数,一个是输出下一天的日期,剩下一个主方法。
代码思路很简单,对于我这个新手来说,也还是有一些挑战,还是写的不规范。
踩坑心得:之前判断二月份天数的时候忘记分润平年,导致一直和标准答案有相差。
改进建议:分类:将日期分为一个类。isLeapYear()、numOfDays()、checkInputValidity()、nextDate()作为该类的方法进行封装。
第五题
该题是求前n天的,题目和上一题相似,圈复杂度也是惊人的相似的高,其实大部分代码和上面那题的一样,只是改了一些数据。
这个题目的封装性远远不如上面那个题目,只用了三个方法,有大部分的语句丢在了main下面。
踩坑心得:有了前面那个题目的经验,几乎一次性就通过了。
改进建议:还是设计上的问题。未经封装的代码不好进行维护、修改、更新。
第三次题目集
第二题
还是求给定日期的下一天,和之前题目有所不同的是这次给了类图,我们只要根据类图写代码就行。类图如下:
这个是我的代码写完后生成的类图。
该题目一共有两个类,一个主类一个负类(sameFile),主类只有调用负类的代码,负类有三个私有变量,分别是year,month和day,还有一个普通变量mon_maxnum(用来存储每个月的天数的数组)。
因为是根据老师给出的类图写代码,圈复杂度降到了一个未成达到的程度。但距离合格代码的要求还是有很大的差距。不过大体上达到了一定的要求。
踩坑心得:之前对每个月的天数用了if-else进行判断,没用上类图的mon_maxnum数组,导致代码生成的类图、圈复杂度超出了要求。
改进建议:多加注释。
第三题
这题是对简单幂函数多项式进行求导
因为用了正则表达式,少了很多的if-else,圈复杂度小于10,达到了基本的要求。但是因为设计的问题,depth也异常的高。题目一共有十个测试点,我一共过了八个
大数测试要用到big integer,我在网上搜了好久都没看到此方法;另一个是老师代码的问题,隔壁班的有同学测出问题所在,关于加号存在与否的判断老师提供的测试点有些许问题。
解题思路:利用正则表达式对该输入的多项式进行拆分,并用list存储。之后对每一项分别求导。
踩坑心得:之前我已经会用正则表达式提取每一项,但是我不知道怎么去存储匹配到的单项,后面在网上查了一个晚上(真的找了一个晚上)的资料,在近11点的时候实在找不到,问一个学长,他帮我找到了正则表达式里的一个方法group可以解决。
改进建议:对于单项的求导,我并未实现比较方便的方法,而是用了多个switch进行判断。对函数的求导也仅限于给的多项式是合法的,并未对不合法的函数进行排查,对于其他的函数也并未实现求导。
三.总结:
通过这次博客作业,我对这三次实验有了一个更为清晰的了解、认识。此次作业集难度循序渐进,由浅入深,给的时间也很充分。我初步了解了关于标准输入输出、字符串、数组的使用,初步了解了类、方法、对象、函数、private、public、默认限定词的概念和使用。对正则表达式有了初步的认识,对Java里的Pattern 类和Matcher 类有了一个初步的认识。