题目集1-3 BLOG总结

题目集1-3 BLOG总结

 

一、 前言:

自开学以来,我已完成三次PTA实验,先将从知识点、题量、难度等方面对三次实验进行总结。

1、 知识点

题目集1考察了Java基本语法内容,如if语句的使用、for循环的基本用法,除此之外,还考察了基础的数组定义与使用方法,以及提取特定字符。

题目集2考察了不同数据类型之间的转换、数字与字母之间的转换,主要考察了字符串的定义储存分析以及使用方法。

题目集3考察了字符串数组的定义与使用,同时开始使用不同类与方法解决问题。

2、题量

题目集1题量较大,有利于我们对基础知识进一步加深印象,有助于让我们后期的学习更加扎实。题目集2与题目集3题量较小,但题目集更具针对性,有利于我们对一个知识点可以有更加深入的了解。

3、 难度

题目集1难度较低,但测试点较为细致,有助于让我们更能全面、更加仔细地思考问题。题目集2难度较题目集1相比有所提升,题目集2中的7-2难度较大,测试点较多,需考虑多种情况,且字符串中不同位置的字符相互影响,需理解清楚每个位置字符的具体含义。题目集3的难度骤然上升,不仅加大了对字符串使用的考察,增加了测试点的种类和个数,同时增加了对于类的定义以及不同类之间的引用的内容考察,且题目集3的题目不仅考验我们对于Java知识的掌握,更考验我们的数学功底,需有一定的逻辑思维能力。

 

总体来说,随着学习越发深入,题目集对知识点的考察越发深入。题目逐步从单一浅显的知识点向深入的知识迈进,从一开始广泛考察各基本知识的掌握情况,到后来的对于同一知识点更加深入的考察。题量在逐步减少,所涉及的知识点的深度逐步加深,对类的使用越发频繁。

 

二、 设计与分析

1、 题目集2  7-2  串口字符解析 

类图:

分析报告:

 

解释:

本题所需结构较为单一,故如图所见,本题仅使用了一个类,一个方法体,但注释过少,此函数包含的语句数目过多,最大圈复杂度过大,最大函数深度略大,平均函数深度过大,平均圈复杂度过大。

 

心得:

因本题较为简单,故未定义过多类与方法体,但未添加注释并非好习惯。该代码使用的for、if等语句过多,导致圈复杂度过大,函数深度略大,又因所用函数过少,导致平均圈复杂度与平均函数深度过大。

 

2、 题目集3  7-1  点线形系列1-计算两点之间的距离 

类图:

 

分析报告:

 

解释:

由图可见,本题仅使用了一个类,一个方法体,注释过少,且此函数包含的语句数目过多,最大圈复杂度过大,最大函数深度略大,平均函数深度过大,平均圈复杂度过大。

 

心得:

因本题较为简单,故未定义过多类与方法体,一份合格的代码应当含有适当的注释。该代码使用的for、if等语句过多,导致圈复杂度过大,函数深度略大,又因所用函数过少,导致平均圈复杂度与平均函数深度过大。总体而言,与题目集2 7-2相比并无很大改进。

 

3、 题目集3  7-2  点线形系列2-线的计算 

类图:

 

分析报告:

 

 

解释:

由图可见,本题使用了两个类,共有个方法体,但两个类中注释均过少。在Main类中包含的语句数目过多,最大圈复杂度过大,最大函数深度过大,平均函数深度过大,平均圈复杂度过大。因本题所要实现的功能较多,故将主体代码放入Main类中,所需多次调用的方法放入了Gra类中。在Gra类中包含的语句数目略多,最大圈复杂度较为合适,最大函数深度略小,平均函数深度略大,平均圈复杂度较为合适,总体而言结构较为合理。

 

心得:

Main类中并无注释,Gra类中也只有很少一部分,仍应在合适位置适当增加注释,以此增加代码的可读性。Main类结构较为不合理,分工并不明确,但Gra类中的代码结构较为清晰,其中含有多个方法体,可将不同功能的代码分割开来,以此实现代码的专一性。

 

4、 题目集3  7-3  点线形系列3-三角形的计算 

类图:

 

分析报告:

 

 

解释:

本题所需实现功能较多,故将主体代码放入Main类中,调用次数较多的方法放入了Func类中,共使用了两个类以及八个方法。由此导致了在Main类中包含的语句数目过多,最大圈复杂度过大,最大函数深度过大,平均函数深度过大,平均圈复杂度过大。而在Func类中方法体较多,最大圈复杂度较为合适,最大函数深度较浅,平均函数深度较为合适,平均圈复杂度较小。

 

心得:

将主体函数与其他方法分开写有助于让代码更加干净整洁,更有结构性,不同方法体之间分工明确,又相互嵌套,有助于让整体代码更加紧凑。与此同时,适度的注释使代码具有可读性,虽较之前题目相比,注释有所增加,但仍较少。

三、 踩坑心得

1、 题目集2  7-2  串口字符解析 

当遇到可能会存在错误输入的时候,可以先判断输入数据格式是否正确,而后进行运算,由此可避免后期在进行运算时判断输入字符串是否符合。在判断循环是否继续、对字符串数组依次赋值时要计算好所需字符串应有长度,避免对某个字符数组赋空值,导致后期无法正常运算。奇偶排序开始始终不能理解,按照自己的想法设计,导致做了很多无用功,而后认真分析了老师给出的测试样例,查阅了资料,并询问了同学后才知晓其中含义。

 

2、 题目集3  7-1  点线形系列1-计算两点之间的距离 

输入格式非法的情况较多,时常考虑不周全,只得凭感觉随意猜测,缺少逻辑性。本题在书写时为看到哪些要求就写哪些,这就造成了后期需要对代码进行反复修改,下次在写代码时应当事先构思好大致框架,而后再根据程序需求完善其细节。

 

3、 题目集3  7-2  点线形系列2-线的计算 

在比较double类型的数的大小时,刚开始只是普通地使用“==”进行比较,而忽略了double类型的数据会有误差,导致无法进行精准比较,而后使用了Double.doubleToLongBits()函数进行比较,解决了该问题。最初计算斜率时忽略了斜率不存在的情况,导致程序报错,后利用Double.NEGATIVE_INFINITY以及Double.POSITIVE_INFINITY表示斜率无穷大和无穷小的情况。本题我未使用正则表达式,造成代码过于冗长,进行了多次格式判断还未将所有情况考虑周全,我应当利用课余时间自主学习正则表达式,以便增加后期代码的简洁性。

 

4、 题目集3  7-3  点线形系列3-三角形的计算 

本题在7-2的基础上进行了升级,同时我也将7-2所含有的缺漏带到了本题。除此之外,我深感数学知识的匮乏也限制了我的代码。在本题中,我发现Double.doubleToLongBits()函数并不能适用,故我改变策略,使用绝对值进行计算(Math.abs() < 1e-5),由此增加了对比数据的简便性。在判断点是否在线段上时,我使用的是比较点的坐标是否在端点坐标之间,由此将会增加代码的复杂程度,可利用点坐标与端点之间的距离与线段长度进行比较得出该点是否在线段内。

 

四、 改进建议

1、 题目集2  7-2  串口字符解析 

从SourceMonitor以及PowerDesigner软件测评结果可以看到,函数复杂度较大,代码使用了较多的if语句判断字符串不同位置所应具有的字符为哪些,但本题所模拟的为计算机信息传输,其为二进制传输,故可使用swich语句进行改善,以降低代码的复杂度。本题多次使用substring函数分割整个字符串,此做法较为复杂,大大增加了代码的复杂度,可通过其他语句避免不必要的字符串分割以降低复杂度。在所有问题中,最易改善的问题为注释过少,应当在合适的位置适当标注些许注释,有利于自己对自身代码的理解与反思,在后期修改代码时也较为便捷,除此之外,也可降低他人阅读代码的难度。

 

2、 题目集3  7-1  点线形系列1-计算两点之间的距离 

 

 

由上述代码可发现,本题代码中较多重复部分,此部分可以单独写出一个方法,让主函数调用这些方法,如此可减少代码的重复度,让代码更简洁,不同函数具有不同的功能。除此之外,从SourceMonitor以及PowerDesigner软件测评结果可以看到该函数较为复杂,使用了较多的for和if语句判断输入语句是否正确,可使用正则表达式进行判断,来降低函数复杂度以及代码的重复率。

 

3、 题目集3  7-2  点线形系列2-线的计算 

 

 

如上图所示,该代码重复率较高,可以单独写一个方法用来获取点的坐标,而后只需调用该方法即可,可以降低该段代码的复杂程度。与上题相同,本题Main类中使用了多个if和for语句判断输入字符串是否合格,亦可使用正则表达式代替那些语句来进行判断。

 

4、 题目集3  7-3  点线形系列3-三角形的计算 

 该题未完全按照题目所需进行书写,最后两部分功能未能实现。选项四中可通过前两个点形成的直线与三角形相交,算出交点坐标,而后利用大三角形面积减去小三角形面积可得,若小三角形面积为零,被分割形成的另一图形面积大于零,则该直线与三角形一条边重合。

 

 

该段代码用于判断三角形是否成立,但仍有部分情况未考虑周全,导致有的测试点无法通过,不过目前我尚未找到合适的解决方法。

 

 五、 总结

这三次的题目集难度由浅入深,我逐步学习了普通输入输出、普通数组的使用、普通字符串使用、字符串特定位置用法、字符串数组基本用法、字符串数组特定位置用法、方法的定义与使用、类的定义与使用等知识点,由此我也看到了自己学习的东西尚浅,对于许多知识点掌握得仍旧不熟练,我应当在后期的学习中巩固基础,同时拓宽知识面,如自学正则表达式等有助于让代码更加简洁的方法。

 

posted @ 2022-04-10 23:31  仲夏10  阅读(96)  评论(0)    收藏  举报