第三次博客作业

一、 前言

本次博客是对之前发布的6-8次PTA题目集(成绩计算系列)进行分析,这三次的题量都是比较少的,第一次迭代就一道题目,之后的都是一道迭代题另外加几道小题,总体来说题量还是不大的。其中相比于上次涉及到的知识点多了很多,首先对动态数组有了更熟悉的运行,成绩计算系统真的需要熟练的运用到HashMap,许多点都是课堂上学习不到的,需要课外的学习,难度上还是挺难的,但是和菜单相比还是较为好做一点的。所涉及到的知识点大多数都是和数组有关的,这个点虽然在菜单上也运用了,但是并不熟悉,在这里得到了加强,老师在上课的时候讲了类图,分析了整个代码结构,但是我在写的过程中并没有按老师的写,继承等一些知识点都没用,总体来说,知识点都还是学过的,但是都不熟悉,其中涉及到一个重要的知识点就是正则表达式了,使用java.util.regex.Pattern类和正则表达式对字符串进行匹配和验证这个很关键,正则表达式的匹配操作,可以将正则表达式应用于输入字符串并进行匹配、查找等操作,在匹配成绩信息中,这种方法最容易过测试点了。里面还运用了Lambda表达式和函数式接口,使用Lambda表达式和函数式接口对列表进行排序和过滤操作。用了Map和TreeMap,使用java.util.Map接口和java.util.TreeMap类存储和操作班级的成绩信息,知识点包括类型转换和数值计算:使用Integer.parseInt方法将字符串转换为整数,并进行加减乘除等数值计算操作。

二、 设计与分析

我先给出三次成绩计算系列SourceMonitor的生成报表内容以及PowerDesigner的相应类图并且进行分析,有图有真相。(部分主要源码以截图的方式放在本小结最后)

成绩计算一的生成报表:

由图可以看到该代码总共有514行代码,包括空行,函数调用语句有44行,平均每个类中有4个方法,平均每个方法中有16.75行语句,可以看出代码的方法都是比较复杂的,每个功能差不多就对应一个方法。Maximum Complexity表示该类中最复杂函数的复杂度,报表可以看出最大的圈复杂度有29,圈复杂度指示一个函数可执行路径的数目,说明我在代码设计上还是可以优化的,由于判断过多,使用了打量的if-else语句,造成了圈复杂度的升高。

 

成绩计算一的类图:

在成绩计算一中,我并没有按老师提示的类图的结构来写,我主要分为了三个类,主类主要负责读取输入并解析课程信息和成绩信息,然后解析课程信息和成绩信息,进行分析计算后输出,其余的两个类便是课程类和成绩类。

成绩计算二的生成报表:

该代码总共有410行代码,包括空行,函数调用语句有18行,平均每个类中有5个方法,平均每个方法中有16.6行语句,可以看出代码的方法都是比较复杂的,每个功能差不多就对应一个方法。报表可以看出最大的圈复杂度有8,圈复杂度指示一个函数可执行路径的数目,相比于上次菜单,圈复杂度减少了很多,大部分原因都是因为减少了错误判断等代码,使得整体更加整洁。

 

成绩计算二的类图:

实验二的迭代是添加了实验课的概念,与之前的考察还是有点去别的,但是区别并不大,但是我为了更好的迭代,我重新构造了代码结构,在第一次的基础上修改我只拿了8分,重构完很多测试点都没有卡,我将成绩类改为了学生类。这是一种新的计算方法,更为合理,适用于所有的样例,之前有点面向过程的写法。

 

 

成绩计算三的生成报表:

该代码总共有617行代码,平均每个类中有5个方法,平均每个方法中有15行语句,可以看出代码的方法都是比较复杂的,每个功能差不多就对应一个方法。报表可以看出最大的圈复杂度有6,圈复杂度指示一个函数可执行路径的数目,相比于上次题目,圈复杂度减少了很多.

 

成绩计算三的类图:

这次类图和上次没有区别,只是某些属性和方法做了修改,自从上次将代码结构优化后,其实很多迭代的问题都能很好解决,在面向对象的过程中,应该考虑全面一点,如果从一开始结构没弄好,后面面对新的要求,只会越来越困难,像打地基一样,地基没打好,后面总会有崩塌的时候,重构代码结构就是一个很好的解决办法。

 部分代码:

 

 

 

三、 踩坑心得

在成绩计算系统中,最多的问题就是没分析清楚题目答题,很多小细节没有给出,需要自己去寻找。

在判断输入时,需要考虑许多异常信息,在开始我选择直接判断长度,但是这样乱输入许多信息都不会报错,所以后面选择了用正则输入法。并不是运行结果对了就行,这个是我没想到的,老师没给出测试样例,压根不知道错误输入是啥,只能用正则表达式限制一下输入。

 还有就是在输入错误的情况下,比如输入课程信息时就错误了,后面他的信息储存不进去,后面所有的都得报错。当我的课程信息乱输入时,后面没判断一次错误就输出为wrong format,这个条件开始没理解清楚,卡了很久。

 还有一个就是成绩和学号的要求,这里面都有隐藏要求,成绩必须是大于0的,学号也必须是8位,这些都是需要去额外要求的。

四、 改进建议

我觉得首先,确保编码改进的目标有清晰的定义。确定你想要改进的方面,比如性能、可读性、可维护性或可扩展性等。这将帮助你更好地聚焦和评估改进的效果。大作业属于不断迭代的题目,每次改进时要清楚的认识到新增加的知识点,知道该从哪个点进行修改。将编码改进作为一个持续的过程来看待。避免试图在一次改进中解决所有问题,而是采取迭代的方式逐步改进,通过每个迭代周期集中解决一到两个问题。在代码中添加适当的错误处理机制,以应对可能出现的异常情况。这可以包括使用异常处理语句(try-except)来捕获并处理潜在的错误,以及提供有意义的错误提示信息。

在这次大作业里面,老师开始给了一个类图参考,可是我觉得按那种方法太复杂了,不如三个类方便,所以导致后面迭代的过程中必须重新构造代码结构,不然每次都需要修改大量的内容,我觉得在迭代的过程中,还应将每次的代码保存下,以应对不同的要求。添加文档和注释,编写清晰、准确的文档和注释是持续改进的关键,除了编写自解释的代码外,还应编写清晰的文档和注释来解释代码的意图、功能和用法。

五、 总结

在这门课程中,我学到了很多关于面向对象编程的知识。掌握了类、对象、继承、多态等概念,我能够更好地组织和设计我的代码,我也学会了如何使用Java的标准库和常用工具,例如集合框架、输入输出流、异常处理等。这些知识对我理解和解决实际编程问题非常有帮助。这门Java课程不仅教会了我编程技巧,还培养了我的逻辑思维、问题解决和创新能力,它为我未来在学习和职业发展奠定了坚实的基础。另外,通过课程中的编程练习和项目实践,我锻炼了自己的解决问题和调试代码的能力。遇到困难时,我学会了阅读文档和查找相关资料,以找到合适的解决方案。这种实践经验对于我未来的学习和职业发展将是宝贵的资产。

对于这三次大作业,学会了许多东西,相比于菜单还是学会了许多新的东西,这三次大作业让我意识到了集合的重要性,老师上课提到的东西,下课之后需要花大量的时间去学习,从开始的菜单到成绩系统,每一次大作业都是一次挑战,一步步的走过来,现在终于结束了,真的很累,但是也真的学到了许多,谢谢老师,也谢谢17班的同学,一起讨论大作业,互相学习指导。这门Java课程不仅仅是一门编程课程,更是一次对逻辑思维和问题解决能力的锻炼,我相信在以后,无论遇到啥问题,都能像面对大作业一样,一样坚持下去不放弃,任何成功的原因,都有可能只是一个勇敢的开始!

 

(本次博客所有题目图片均采用图片方式,文字均为手写,字数在3100左右)

posted on 2023-06-23 23:04  xxzzzxx  阅读(78)  评论(0)    收藏  举报