第一次oop作业-blog
前言:
对于我们第一次的Java作业的题目集,其难度其实不大都是考验我们比较基础的编程知识。而对于刚接触Java这一语言的我们来说,其语法与我们之前学的C语言不同,编程思想也有些差异。题目集一的题量较大,但相对来说是一些最最基础的东西,因此我写起来比较顺利。题目集二虽然说相对于题目集一来说难度更深了一点点,也考验到了我们基本 的面向对象的编程思想。说到题目集三,我们对于其中的多项式求导这种一题花费了很多时间,我们看到题目的第一眼是毫无思绪的,但随着慢慢的学习于试错,也是最终有些收获的。
设计与分析:
题目集01 7-8 判断三角形类型
第一次作业中的判断三角形的类型,都是按照自己设想的逻辑来编写,也就是老师常常厌恶的if-else语句,因为会徒增程序的圈复杂程度,对于这个编写的程序自己还是不满意的。但是对于我来说这也是一种成长的步伐,在写这个判断三角形的类型的程序中我也就是没有思考到用面向对象的方法来实现,单纯的考逻辑判断的,从而会使得我的程序表达的不是那么明白,其次是对于if else语句是很容易出现错误的。比如说在我在判断玩一个等腰三角形后又要镶套一个判断是否为等腰直角三角形。相对来说不是很容易理清其中的逻辑关系,也对程序后续的可扩展性有相当大的限制。
以下是题目集一的全部题目:

-------------------------------------------------------------------------------
以下是附上题目集一7-8的SourceMonitor图:
Parameter Value
========= =====
Lines 36
Statements 20
Percent Branch Statements 5.0
Method Call Statements 13
Percent Lines with Comments 0.0
Classes and Interfaces 1
Methods per Class 4.00
Average Statements per Method 3.75
Line Number of Most Complex Method 17
Name of Most Complex Method if(().if()
Maximum Complexity 1
Line Number of Deepest Block 18
Maximum Block Depth 6
Average Block Depth 3.30
Average Complexity 1.00
-------------------------------------------------------------------------------
Most Complex Methods in 1 Class(es):
Complexity, Statements, Max Depth, Calls
1, 1, 6, 1
-------------------------------------------------------------------
(程序相对来说是不符合圈复杂程度低于10的,仍需进步)
题目集一7-8的类图如下:

这个程序由于是比较简单,所以都是写在了Main中。这种做法其实不妥。
附题目集二:

题目集二 7-4 求下一天:
此题目对于当时的我们来说要花些时间,主要是题目中有很多的坑,比如求跨年或者是跨月的下一天,对与我们的算法来说需要考虑的就更多了。因此这次我用到了在主类中使用判断方法public static void nextDate(int year,int month,int day) 来求出月份与日期会比较方便一些。在写这个题目的时候需要考虑到闰年的特殊性,28天与29天。其中我在方法中添加了一个闰年与非润年的数组,这样调用起来会方便上许多,再其次是跨年的计算,这个相对跨月份的计算会比较简单。主要是需要清楚每年的最后一天,这里的判断可以调用上文的月份数组,只要是超过了某个月份的那一天,直接年份加一。
以下是题目集 7-4 求下一天的SourceMonitor图:
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
File Name Main.java
Lines 75
Statements 50
Percent Branch Statements 28.0
Method Call Statements 9
Percent Lines with Comments 0.0
Classes and Interfaces 1
Methods per Class 6.00
Average Statements per Method 7.17
Line Number of Most Complex Method 25
Name of Most Complex Method Main.checkInputValidity()
Maximum Complexity 11
Line Number of Deepest Block 33
Maximum Block Depth 6
Average Block Depth 2.86
Average Complexity 5.75
--------------------------------------------------------------------------------------------
Most Complex Methods in 1 Class(es): Complexity, Statements, Max Depth, Calls
Main.checkInputValidity() 11, 12, 6, 1
Main.isLeapYear() 2, 1, 2, 0
Main.main() 3, 9, 3, 6
Main.nextDate() 7, 8, 5, 1
以下是题目集 7-4 求下一天的类图:

这个程序同样是写在了一个主函数中,但这个相对上一个来说调用了方法,条例会比较清晰。但后续可以使用类来表达。
题目集二 7-5 求前N天:
在写这个程序之前已经写过了求前一天了,在此的基础上我对那个程序进行了算法的修改,可以达到求前N天的效果。对于求前N天,主要是思想还是对于跨年与跨月的比较,只要解决了这个问题就可以完成这个程序。
以下是题目集二 7-5 求下N天的SourceMonitor图:
Metrics Details For File 'Main.java'
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
File Name Main.java
Lines 91
Statements 66
Percent Branch Statements 27.3
Method Call Statements 10
Percent Lines with Comments 0.0
Classes and Interfaces 1
Methods per Class 6.00
Average Statements per Method 9.83
Line Number of Most Complex Method 26
Name of Most Complex Method Main.checkInputValidity()
Maximum Complexity 13
Line Number of Deepest Block 34
Maximum Block Depth 6
Average Block Depth 3.14
Average Complexity 7.25
--------------------------------------------------------------------------------------------
Most Complex Methods in 1 Class(es): Complexity, Statements, Max Depth, Calls
Main.checkInputValidity() 13, 12, 6, 1
Main.isLeapYear() 2, 1, 2, 0
Main.main() 3, 10, 3, 7
Main.ndaysago() 11, 15, 5, 1
以下是题目集二 7-5 求前N天的类图:

这个程序可以理解成上一个程序的升级版。主要是对一天和N天的算法的不同其他我都照搬其模板,这样的效率会比较高一点。其实还是要注意对闰年的判断对整个程序的影响。
附题目集三题目:

题目集三 7-2 定义日期类:
我认为到了题目集三我们才正式进入了真正的面向对象思想,在写这个题目的时候我用到了很多的类,用到了封装,用到了private。对于我来说是新鲜的,也是困难的,但只要理解了其中的道理就会觉的不是那么的不能接受。在写这个程序之前我考虑到了这个可能和上一个题目集有些许相似之处,但后来老师说不能用原来的方法来写这个题目,我就知道了这其中的不同。我了解到类与类之间的关系,学会掉用类其中的方法。

这里是题目给出的类图。
以下是题目集三 7-2 定义日期类的SourceMonitor图:
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
File Name Main.java
Lines 115
Statements 69
Percent Branch Statements 20.3
Method Call Statements 9
Percent Lines with Comments 0.0
Classes and Interfaces 2
Methods per Class 7.00
Average Statements per Method 3.71
Line Number of Most Complex Method 64
Name of Most Complex Method Date.checklnputValidity()
Maximum Complexity 11
Line Number of Deepest Block 72
Maximum Block Depth 6
Average Block Depth 2.46
Average Complexity 2.58
--------------------------------------------------------------------------------------------
Most Complex Methods in 2 Class(es): Complexity, Statements, Max Depth, Calls
Date.checklnputValidity() 11, 12, 6, 1
Date.Date() 1, 3, 2, 0
Date.Date() 1, 0, 0, 0
Date.getDay() 1, 1, 2, 0
Date.getMonth() 1, 1, 2, 0
Date.getNextDate() 7, 8, 5, 1
Date.getYear() 1, 1, 2, 0
Date.isLeapYear() 2, 1, 2, 0
Date.setDay() 1, 1, 2, 0
Date.setMonth() 1, 1, 2, 0
Date.setYear() 1, 1, 2, 0
Main.main() 3, 9, 3, 6
以下是题目集 7-2 定义日期类的类图:

我用这个题目来相对与上一个题目的求下一天,才明白了何为面向对象。这个程序中运用到了类的封装性,相对于C语言中的程序有更好的私密性,因为类中有private量。
定义了这些量数据的调用需要新建一个类 再用其方法来导入与导出数据。
题目集三 7-3 一元多项式求导:
这个题目可谓是耗了我一周,面对不太明白又很陌生的正则表达式,因为这是我第一次接触正则表达式,因此我通过网站论坛来学习,但总是一知半解没学习到系统的知识,导致我写这个程序的时候拜拜浪费了许多时间。再其次是这个程序本来是思路是很简单的,就是先判断多项式的合法性,然后再利用正则表达式来控制多项式中的单项,最最最后,是一个巨大的坑也就是大数的计算,需要用到Bigteger 类型,这无疑是坑到了我。在第一次写完程序的时候我认为已经差不多了,但是又有许多未通过的测试点让我感到郁闷,之后在更深入的了解之后才知道了要进行大数的运算。然后这个题目没有得到满分的原因我认为是我的程序还是有些许问题的。
这个第一项系数为负数 我觉得是 未通过测试点 -00002*X^-2 类似的。其次的未通过的测试点我还没有找到原因。
以下是题目集三 7-3 一元多项式求导(类设计)的SourceMonitor图:
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
File Name Main.java
Lines 225
Statements 142
Percent Branch Statements 23.2
Method Call Statements 91
Percent Lines with Comments 0.4
Classes and Interfaces 3
Methods per Class 6.00
Average Statements per Method 6.06
Line Number of Most Complex Method 59
Name of Most Complex Method Main.output()
Maximum Complexity 19
Line Number of Deepest Block 50
Maximum Block Depth 5
Average Block Depth 2.33
Average Complexity 3.00
--------------------------------------------------------------------------------------------
Most Complex Methods in 3 Class(es): Complexity, Statements, Max Depth, Calls
Check.Chack1() 1, 2, 2, 1
Check.Chack2() 1, 2, 2, 1
Check.Check() 1, 1, 2, 0
Check.checkSting() 6, 26, 3, 25
Main.jsString() 5, 6, 5, 11
Main.main() 1, 8, 2, 5
Main.output() 19, 33, 5, 34
Main.passString() 5, 7, 4, 5
Mul.addDeg() 1, 1, 2, 1
Mul.addTerm() 1, 1, 2, 1
Mul.diff() 6, 12, 4, 5
Mul.getDeg() 1, 1, 2, 0
Mul.getTerm() 1, 1, 2, 0
Mul.isCons() 1, 1, 2, 0
Mul.isRepeat() 1, 1, 2, 0
Mul.Mul() 1, 4, 2, 0
Mul.setCons() 1, 1, 2, 0
Mul.setRepeat() 1, 1, 2, 0
以下是题目集 7-3 一元多项式求导(类设计)的类图:

改进建议:
在写完第三个题目集后,我才意识到前面的两个题目集也应该用面向对象的思想来写,比如题目集一的 7-8可以再写一个类来判断就可以减少if else 语句从而来减少圈复杂度,同时也可以提高程序的可以扩展性,例如还可以去判断是否为钝角三角形或者锐角三角形。
总结:
对于这次的三个题目集我感到我对于这门课程的学习任需要继续提高,对于自己的自学能力更加需要有所练习。我明白自己对于Java中的知识单单只是触摸到了冰山一角,而对于课本上的知识犹如一条奔腾的大河一样需要流进我这条干涸的沙漠。我对于Java这门课的学习需要无比的认真,对于自己的要求需要更加严格。在历经了这此的题目的摧残我不只一次怀疑过自己是不是对这门课的知识无法吸收,但到最后突然明白了某个知识点的时候我才知道是自己懂得太少。

浙公网安备 33010602011771号