第十到第十六周—— BLOG_3

第十到第十六周—— 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]$";            
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 第十到第十六周—— BLOG_3