java题目集总结

                  题目集一总结

前言:题目集一主要涉及了java程序的基本结构,编译器的基本使用方法,基本语法。题目7-8初次介绍了类。题目数量比较少,难度较低,主要是让咱们适应了Java的编码习惯。java

   题目集二更进一步设计了字符串,数组的操做,3,4,5题层层递进为咱们引入了方法。题目中设计的方法声明让我初次感觉到了面向对象编程。这个题目集题目数量依然比较少,难度略有提升,让我熟悉了方法有关的各类语法。正则表达式

   题目集三真正涉及到了类的设计,1,2题抛砖引玉让我体会到了类设计的思路,第三题则须要彻底本身设计类。这个题目集题目数量较少,可是工做量不小,难度比较大。这个题目集让我学会经过合理的设计类来简化逻辑,经过重构来适应新需求,最重要的———利用不熟悉的知识来解决必定规模的问题,而且合理渐进的使用他们来避免大量未知错误在一开始爆发致使延误开发。算法

设计与分析:

题目集1:7-8 判断三角形类型

 

 

程序须要判断三角形类型,要求可以识别非三角形,等腰三角形,等边三角形,等腰直角三角形,直角三角形,通常三角形的状况。难点在于要捋清各类三角形的逻辑包含关系,判断三角形种类要尽量具体,这对逻辑有必定要求,写出优雅健壮的代码是比较有挑战性的。编程

个人方法是,先利用java提供的排序方法将三边的长度排序,快速识别斜边(最长的边)。先判断是否为合法的三角形,再依次判断是否为等边三角形,等腰直角三角形,直角三角形,等腰三角形。即在判断出构成三角形后,从具体到普遍的判断三角形。数组

采坑心得

计算机处理浮点数会产生偏差,在计算勾股数时判断浮点数之间的等量关系不能直接用”==“,而应该设置偏差,将大小差异偏差范围内的视为等于。设置偏差的过程当中即要保证不会漏判,也要保证不能错判,偏差的大小要经过对具体的状况进行具体的分析来设定。此外大量的if语句让代码难以理解更难以修改,即便写了大量备注,可备注也要随着代码的更新而更新大大的增长了工做量。因此代码书写的过程当中规避的繁杂的实现是避免bug的关键。代码总体的复杂度仍是偏高的。函数

改进建议

为了加强代码的可读性能够经过实现多个判断三角形类型的方法,每种方法之对应惟一一种三角形,虽然效率上有牺牲可是却减小了if加强了可读性。还有一种方案是对三角形的各类性质(两边或三边相等,直角)设置对应的枚举,经过检查枚举来判断三角形类型,这样if语句的可读性会提升。或者生成一颗逻辑上的树,每一个节点都表明一种三角形,逻辑上是子概念的三角形是下相应三角形的子节点,经过由普遍到具体的检查,当一个节点的全部父节点被知足的时候该节点被知足。这样一样避免使用大量带&&复杂条件加强可读性,也具备良好的扩展性。编码

题目集2:7-4 求下一天

题目要求输出某一日期的下一天,并给出了须要实现的方法包括,判断闰年,判断日期合法性,求下一天。这题涉及不少特殊状况,关键是经过对这些特殊状况进行分析,厘定前后判断顺序,用最少的判断来解决问题。debug

个人方法是先判断日期是否合法(包括闰年和平年)再直接对日加一,再判断日期是否变得不合法,若是变得不合法表明日期因该变成下个月一号,再判断月是否合法,若是变得不合法则日期因该为下一年第一天。经过这样的判断日期是否由于加一天这个操做变得不合法,来一步一步改变日期最终获得下一天,规避了判断闰年平年和每月不一样天数的复杂判断,而是反复利用日期是否合法来一步一步获得结果大大减小了逻辑复杂度。设计

采坑心得

判断闰年的状况比较复杂,若是直接判断闰年,那么涉及的条件比较多,复杂的代码是bug的温床。在这里我选择不去判断是否为闰年,而是去判断是否不是平年,结果代码大大的变简洁了给我后来的debug工做带来了不少方便。不少正面判断比较难的条件,能够考虑经过判断反例来解决。合理的利用数组来代替switch是很是好的作法,让数组的下标带有意义(好比表明月份)也是很是优雅的。3d

 

改进建议

利用数组来储存每月最大天数从而规避switch来判断日期合法性,也能够准备两个数组分别表明闰年和平年的天数,用枚举来表明闰年和平年,能够大大加强代码的可读性,利用枚举来代替下标,让下标具备意义也是值得尝试的作法.

 

题目集2:7-5 求前n天

题目要求程序求出某一天的前n天,并本身设计类来处理。一样涉及日期处理关于每个月最大天数的数组,和判断日期合法性以及求闰年,这些部分大致上能够直接使用7-4的代码。

个人方法是将7-4求下一天的代码改写成求前一天,逻辑基本不变,日期先见一再判断日期是否合法,若是不合法,则日期变为月份减一的最后一天,再判断日期是否合法,如不合法则变为上一年最后一天。重复n次,若是n为负数则直接求下一天重复n'的绝对值次。

采坑心得

相对于下个月第一天,上个月最后一天更具备不肯定性,搞很差会致使储存月份最大日的数组越界,适当的为数组留白,是避免bug选择之一。虽然如今并不那么强调软件的效率,而是重视开发速度。可是这种会提高复杂度的算法应该在细致的研判数据再谨慎的使用,或者尽可能避免。

改进建议

实现求前n天改成求前一天n次虽然极大的利用了已有的代码,可是却将原来常数复杂度的算法变成了复杂度n的算法,这种操做是有风险的,在数据比较大的状况下可能会超时,致使软件质量不合格。经过把n超过一年的部分直接计算,再把超过一月的部分直接计算,甚至把超过400年的部分一次性计算来控制n的大小,管理复杂度.保证软件质量。

题目集3:7-2 定义日期类

题目要求实现一个日期类并给出了类图,根据类图按图索骥而且合理的利用以前题目的代码,很快便获得结果。

经过改变返回值和参数利用编译器功能自动生成属性,来简化编码过程。

采坑心得

经过体会和实现类图,我对类中各个方法的耦合和属性的设置有了粗略的体验,对于方法会用到的数据,而对类没有意义的能够选择将其做用域限制在方法内部以简化类的签名。方法只能严格实现方法名所表明的功能,类的属性的和方法的设置最好符合直觉。经过方法间的调用来简化逻辑。

改进建议

区分一个字段应该是类全部的仍是对象全部的,区分的结果因该符合直觉,好比储存每个月最大日期的数组因该属于类,设置成静态。这样既能够节约空间也更符合直觉。

题目集3:7-3 一元多项式求导(类设计)

题目要求对幂函数多项式进行求导,幂函数有多种省略写法,研判这写发而且进行求导是难点所在。

个人方法是利用正则表达式"[+-]?[0-9]*[*]?x(?:[\\^][+-]?[0-9]*)?"来提取全部带x的项,只有带x的项须要求导。对于每一项用Pattern来分别提取每一项开首的数字和结尾的数字,若是提取不到就表明是省略的写法,结果就是1或者-1.再对系数指数进行计算,经过对计算后的值进行研判来进行项的输出。最后去掉开首的+获得结果。

采坑心得

经过把一个大问题转化为小问题,来解决问题有时候会有奇效。关键是抓住问题不变的地方。对于每一个须要求导的项必然有x经过这一点就能够写出提取全部项的正则表达式。此外每一项分开求导再拼接,大大简化了问题,经过最后1步去除开头的+,避免了讨论首项也简化了解决方案。处理问题的时候相应的条件对应相应的部分也是否关键,对于系数的条件判断之影响系数部分,而指数部分则影响是否结果中含x以及是否有显式的指数。这样下降不一样代码块之间的耦合,给我debug和重构带来了不少方便。

 

改进建议

题目中的正则表达式之并不能彻底保证提取出正确的项,没有体现符号和系数之间的逻辑关系,这是很是大的隐患。每一次用循环中字符串的覆盖让声明和内容显得臃肿,利用list生成待处理的项串,再一次性处理拼接,把读取和处理分开来,避免一个代码块过于复杂影响程序的可读性和维护性。

相关文章
相关标签/搜索