第十到第十六周—— BLOG_3
面对对象程序设计—第十到十六周作业总结
引言:java的课程进入尾声,但是编程的路才刚开始。
前言:这三周的大作业主要考察各个类之间的关系,数据的封装,类的继承,多态,接口,抽象类,集合框架等多个知识的综合运用。
自学正则表达式的使用,有些题目对于格式的判断非常的复杂,使用正则表达有效判断了输入的合法性,并且减少了大量的格式判断代码。
通过三次大作业写完电信计费问题,这样的方式相比之前的点线型友好了太多,这样就又充分的时间去书写代码,完成代码的内容。
三次大作业彼此关联难度又呈持平的状态,给我们编码时提供了莫大的信心。
PTA大作业6
各题目 设计与分析 踩坑心得 改进意见 核心代码分析:
(1)7-1 电信计费系列1-座机计费
设计与分析:
类图如下:
此题的难度在于不好下手,做此类图较为复杂的题,需要仔细观察类图,明确类图之间的联系
在此题中 User类中的userRecord是这道题目的突破口,在这个userRecord中可以把用户的通话记录数据放入,便于Chargemode在中间的调用。
然后再去理解类图中的chargeMode类,这是这个程序的核心代码,通过这一段计算出用户的花费,完成程序。
虽然类图看起来非常的复杂,但只要将代码分解,先从user入手,自然就写到了userRecord,接着就补充到chargemode,再然后就去构思main函数,获取输入数据即可
踩坑心得:
这应该是我最重要的一部分代码,看起来非常的简单,但得来是十分不容易的。
这道题目涉及到对arrayList排序的问题。我开始是先声明一个User user[]的对象数组,先历便arrayList,将数据赋值给user[],
再用compareTo方法对字符串进行冒泡排序,但是排序之后就出现了一个问题,我通过user数组赋值没有办法删除重复的元素,这就导致输出重复。
虽然最后解决了重复的问题,但是这种方法效率比较低,我又找到了以上方法。
在把数据比较入arrayList时进行,如果arratList的user.numble值比后一个要大,那么用j记录下arrayList中的位置,再用指定位置插入,将新进来的数字插入进来,这样插入完成后就已经是有序的了。
改进意见:
1.由上图可知,这个代码的圈复杂度达到了19,这说明代码的质量不高。因为我在写题目的过程中,只注意需要完成题目要求的功能,而没有对代码进行优化,导致写了过多的if/else语句,据查找资料,if/else 和循环的使用会使得圈复杂度提高,改进的方法是将if/else语句换成switch语句,可以有效减少圈复杂度。
2.可以将判断的逻辑颠倒过来,这样代码的思路就会更加的清晰,代码的可读性也会更高。
3.可以将arrayList换成hashset,用集合简化题目。
核心代码分析:
① 数据判断的正则表达式:
final String regex = "^u-[0-9]{11,12} 0$"; final String regex0 = "^t-[0]{1}[0-9]{9,11} [0]{1}[0-9]{9,11} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$"; final String regex00 = "^079[0-9]$";