OO第一次博客作业总结

一、分析与总结

1.第一次作业

(1)作业总体总结:

       这一次的作业总体难度不大,题量适中,许多的算法与c语言都有类似之处,考点基本是非常基础的点,加深了对格式化输入输出的熟练度以及我觉得这算是一个从c到Java过渡的作业。在这次的作业中仍是使用了很多if-else的选择判断语句,但是据老师所说,我们不应该使用太多的if语句,不然会导致圈复杂度过高,可是因为刚接触oop,这一次的题目集我仍然使用了很多if语句,下次要记得尽量不再使用if语句,降低代码的圈复杂度。题目集中还考验了我们的排序算法,这一点我觉得和c还是很像的,用for循环和冒泡排序就可以解决。最后一题是判断三角形的类型,这个难度稍稍有一些提升,刚开始的时候写起来还挺有自信的,但是一提交就发现漏了很多点,考虑的很不周全。并且在判断上又是使用了大量的if-else语句,而且还有大量的嵌套语句,在后面测试时发现代码的圈复杂度真的太高了,所以在后期要落实降低圈复杂度。

(2)圈复杂度

7-8

(3)踩坑心得:

坑1:在7-8中调试过程中,一直有一个点无法通过测试,后来发现是等腰直角三角形的点,因为等腰直角三角形的测试用例中无法避免根号2的问题,又因为根号2是无限不循环小数,在输入时无法去输入根号2。

1         else if (((c == b) && (a % 1.414 == 0))||(((b == c) && (c % 1.414 == 0))||((a == c )&& (((int)(c * 1000)/(1000)) % 1.41 == 0)))){
2             System.out.println("Isosceles right-angled triangle");
3         }
1        else if ((a == b && a != c) || (b == c && b != a)) {
2             System.out.println("Isosceles triangle");
3         }

以上是错误的代码。

在发现错误之后,对代码进行了改进,并不应该将值直接与1.414对比,而是对输入的值取精度为小数点后三位,然后与1.414的倍数进行对比,比较差值,若插值小于0.0000001则成立以此来解决该问题。

(4)改进建议

减少if-else以及嵌套语句的使用,还有对代码书写的规范,譬如符号前后空格和换行的{}。

2.第二次作业

(1)作业总体总结

这一次的作业主要是考察类与对象,完成上一次作业时还并没有接触类的概念,因此只有一个主类,从这一次作业之后开始接触了类与对象的概念,慢慢熟悉类与对象的使用。在本次作业中还考察了对字符串及数组的使用,尤其是最后三题,考察了我们对类的使用,但是难度不是特别大,因为主要的类设计是老师提供的,但是对我们类的使用和声明理解以及一些性质的了解有很大的帮助。

(2)圈复杂度

7-4

 

7-5

 

 

 

 

 

 (圈复杂度真的是太高了,一定要重视将圈复杂度给降下去!!!!)

(3)踩坑心得

坑1:平年2月29日的测试点不过

 

 

 错误代码如下:

 1            else if(month == 2) {
 2                 if(flag == true) {
 3                     if(day<29) {
 4                         day++;
 5                     }
 6                     else if(day == 29) {
 7                         day = 1;
 8                         month = 3;
 9                     }
10                 }
11                 else {
12                     if(day<28) {
13                         day++;
14                     }
15                     else if(day == 28) {
16                         day = 1;
17                         month = 3;
18                     }
19                 }
20             }

改正后的代码如下:

 1            else if(month == 2) {
 2                 if(flag == true) {
 3                     if(day<29) {
 4                         day++;
 5                     }
 6                     else if(day == 29) {
 7                         day = 1;
 8                         month = 3;
 9                     }
10                 }
11                 else {
12                     if(day<28) {
13                         day++;
14                     }
15                     else if(day == 28) {
16                         day = 1;
17                         month = 3;
18                     }
19                     else {
20                         System.out.println("Wrong Format");
21                         temp = 0;
22                     }
23                         
24                 }

增加flag值去标记是否为闰年,如果是闰年就检验天数是否为29号,当flag == 1时,则year是闰年,否则就是平年,是平年29号就不进行后续操作,且输出WrongFormat.

其次,在后续检测中发现其实可以拥有一个更好的方法去处理day的问题。那就是可以将天数存入一个数组,若是闰年就把2月份所代表的数组天数从28改为29,这样可以使得代码更简洁。

7-5

坑2:

求下n天的天数的三个测试点不过

 

 

 

 

 

以下是错误代码:

1             if(month == 12) {
2                 if(day+n<=31) {
3                     d = day + n;
4                 }
5                 else {
6                     year++;
7                     month = 1;
8                     d = n - (31 - day + 1) + 1;
9                 }

 

 1            else if(month == 2) {
 2                 if(isLeapYear(year) == true) {
 3                     if(day + n <= 29) {
 4                         d = day + n;
 5                     }
 6                     else {
 7                         month = 3;
 8                         d = n - (29 - day + 1) + 1;
 9                     }
10                 }
11                 else {
12                     if(day + n <= 28) {
13                         d = day + n;
14                     }
15                     else {
16                         month = 3;
17                         d = n - (28 - day + 1) + 1;
18                     }
19                 }
20                 
21             }

以下是正确代码:

 1             if(month == 12) {
 2                 if(day+(-n)<=31) {
 3                     d = day + (-n);
 4                 }
 5                 else {
 6                     year++;
 7                     month = 1;
 8                     d = (-n) - (31 - day + 1) + 1;
 9                 }
10             }

 

 1            else if(month == 2) {
 2                 if(isLeapYear(year) == true) {
 3                     if(day - n <= 29) {
 4                         d = day - n;
 5                     }
 6                     else {
 7                         month = 3;
 8                         d = (-n) - (29 - day + 1) + 1;
 9                     }
10                 }
11                 else {
12                     if(day - n <= 28) {
13                         d = day - n;
14                     }
15                     else {
16                         month = 3;
17                         d = (-n) - (28 - day + 1) + 1;
18                     }
19                 }
20                 
21             }

在错误代码中,忽略了n的值是负数,导致结果出现偏差,因此在更改代码时,将n更改成(-n),解决了该问题。(写代码一定要认真啊且仔细!!!)

坑3:

疏忽了前0天的计算,因此在代码中增加前0天的选择判断

(4)改进建议:减少if-else语句的使用,圈复杂度真的太高了,对一些常用的常数可以声明为常量,还有对类似像月份天数的处理,可以用数组去设置天数,在必要时刻还可以用循环减少代码的重复,使代码更加简洁易于理解。

3.第三次作业

(1)作业总体总结

这一次的作业体量不多,前两题主要是考察了我们对类的理解,以及性质(类似区分public 和 private,有参与无参的构造方法等等),考点与老师上课所讲的内容紧密结合,所以解决起来还是不算太费力,但是第三题对函数求导,真的花了很多时间。在阅读题目要求之后,先是自学了正则表达式,从刚开始的一点也不了解到后来慢慢的自己查资料开始可以理解正则表达式,但是这一部分的内容掌握的还不是很熟练,还有对从多项式里面提取多项式也不是很理解,所以这一题难度不小,对于我来说还是一个不小的挑战。

(2)圈复杂度

7-2

 

 

 

 

 

 7-3

 

 

 

 

 

 

(3)类图

7-2

 

 

(3)踩坑心得

7-2

坑1:对月份天数的处理未使用数组,如果将每个月的天数存入数组中,这样可以使得后面的算法更简洁,阅读性更高。(在处理闰年和平年2月份的天数时直接将数组中2月对应的数组更改就可以了)

坑2:例如对闰年和是否输入合法的判断在这次的代码中使用的是布尔值判断,后期再用if语句判断,导致了if语句出现的更加频繁,圈复杂度也因此增加。

解决方法:可以设置一个int类型的flag值去标记是否正确的值,后期再使用switch可以在一定程度上降低代码的圈复杂度。(其实布尔值也可以,但是尽量不要出现if-else语句即可)

坑3:将参数从主函数传入到类方法中

解决方法:在类与类的关系中,应该遵循类设计的两大原则(单一职责原则,迪米特法则),所以在代码中应该尽量不出现这样的代码,降低类与类之间的耦合度,所以,在设计类的时候都尽量将参数设计在类中,再使用getter 和 setter 方法去获取和设置。

坑4:平年和闰年30,31日不报错,并且进行后续的操作算法

解决方法:在编写代码的过程中只注意了2月需要区分平年闰年的天数区别,疏忽了2月并没有30和31天,所以在2月判断这里需要更加的谨慎一些,要加上判断相应的更具体的条件。

7-3

坑5:类的设计

在这题中我原本设计了4个类,分别是主类,Function类(判断函数是否合法以及提取子字符串,对函数的字符串进行操作),Quotient类(对系数进行操作),Index类(对指数进行操作),但是后面发现这个的类设计的耦合性会很高,因为这几者之间的关系还是很密切的。如果是在c语言中,或许是问题不大的,但是在Java语言中,这却是一个挺大的问题,在上述总结也说过类设计的两个原则,所以第一次的类设计是不合理的。在此之后,我重新设计了5个类,分别是主类,Function类,common类(当单项式为常数时),QuotientOne类(当单项式为幂函数),IndexOne类(当单项式的指数为1时),other类(除去单项式为常数和单项式指数为1的情况),这一次类的设计,我觉得较第一次的类设计更加合理,类与类之间的耦合度也并不是很高。在对字符串合理性检测之后可以使用group将单项式提取出来进行单项式的求导操作,在求导之后再对求导所得值进行判断整理,最后输出求导结果。

坑6:从多项式里将单项式提取出来

在这个环节我苦恼了很久,因为实在想不到如何将单项式提取出来,我想过使用截取字符串的方法,以“+”,“-”截取,但是很快这个方法就被Pass掉了,因为考虑到如果使用这个方法就需要遍历字符串,而遍历的效率往往是不高的,所以我只能往别的方向思考。后来经老师提醒可以使用arrayList,但是考虑到这样还是需要遍历数组,而我暂时还不知道如何解决这个问题,所以还在学习中。

(4)改进建议:

7-2:对类的操作,不要再把参数传进去,要好好理解类的含义和类与类设计的两个基本原则,降低类与类之间的耦合度。减少if-else的使用和使用switch去降低代码的圈复杂度。

7-3:往往一个问题的解决方法不止一个,所以要多多思考各种方法之间的困难和优势,还有类与类的设计也是一个问题,要充分思考自己设计的类之间的联系和合理性。

二、总结

这三次的作业,难度是由简单到复杂,从一点也不了解Java到慢慢对Java有了一个初步的认识。在三次作业中我还是收获了很多东西的,第一个就是反复强调的圈复杂度,一定要尽量降低代码这样的复杂度。第二个就是类与类的设计,毕竟我们现在还没有达到看完题目就知道该如何设计类的水平,所以在现阶段,在设计类的时候要时刻把类与类设计的两个原则记在心里,当类的设计完成后,一定要再次思考所设计的类之间的紧密程度,要考虑类之间的耦合度是否过高,是否合理。第三个就是正则表达式,这是一个很好用的判断输入是不是合法的方法,而且这也是我们学习的一个重点,对于这个知识点不能够一知半解,所以还要继续努力,好好的把这一块学习明白。最后,要规范书写的代码格式,养成一个良好的面向对象思维。

 

posted @ 2021-04-04 21:27  可乐不加冰xch  阅读(77)  评论(0)    收藏  举报