第三次博客作业(2022/6/15)

在第十一周到第十五周的学习中,我们进一步深刻了应用类的设计。

实践出真知,实践是成功唯一的途径。

 

  • (一)前言

(1)知识点

1.ArrayList类的使用

2.输入字符串的处理

3.类设计的搭建与实现

4.SimpleDateFormat类实现输入时间格式化处理

 

(2)题量

三次以电信计费系列1-3为主的pta

 

(3)难度

 中等,其中主要是电信计费系列的考查,其他的题主要考的是基础逻辑、细心与知识点广度。

 

  • (二)设计与分析

(1)电信计费系列1-座机计费

本题主要搭建起了该系列的类结构,实现了座机开户以及计费座机拨打市内省内国内座机的功能。

  按照指导书中的类设计框架建议:

 

 

 

 //用户类、用户记录类与计费模式类

 

 

 

 //联系记录类(通话与信息)

 

 

 

 //计费规则类

 

我按照类图中类之间的关系创建了所有推荐类,框架已好然后着手于功能的实现。

 

主要模块可以分为

开户与存储即

根据输入字符串为相应用户开户与存储通话记录,

通话时间计算即

根据记录使用SimpleDateFormat类转化格式然后通过getxx计算用户通话时间,

计费即

根据通话时间与接通地区计算话费。

 

之后使用正则表达式进行字符串匹配,

用if将开户数据与通话记录数据分流处理,

用户类创建ArrayList类型来add通话记录,

通话记录类使用SimpleDateFormat类计算通话时间,迭类进行进一步的话费计算。

 

座机打座机的正则表达为:

t-0791\\d{7,8}\\s0\\d{9,11}\\s\\d{4}\\.\\d{1,2}\\.\\d{1,2}\\s\\d{2}:\\d{1,2}:\\d{2}\\s\\d{4}\\.\\d{1,2}\\.\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}

 

CallRecord callingInCityRecords=new CallRecord(s.split("-")[1].split(" ")[0],s.split("-")[1].split(" ")[1],sdf.parse(s.split("-")[1].split(" ")[2]+" "+s.split("-")[1].split(" ")[3]),sdf.parse(s.split("-")[1].split(" ")[4]+" "+s.split("-")[1].split(" ")[5]),s.split("-")[1].split(" ")[0].substring(0,4),s.split("-")[1].split(" ")[1].substring(0,4));
//UserRecords userRecords = new UserRecords();
//userRecords.addCallingInCityRecords(callingInCityRecords);;
//users.get(i).setUserRecords(userRecords);
users.get(i).getUserRecords().addCallingInCityRecords(callingInCityRecords);

 //我发现在存储通话记录时,循环添加时循环里的set会更替掉之前添加的记录,

可以通过add来正确实现。

 

(2)电信计费系列2-手机+座机计费

本题主要根据系列1建起的类结构,新增了手机通讯,

实现了座机手机开户以及计费座机手机间三种拨打方式于市内省内国内的功能。

 

输入字符串的判定因为新增手机通讯而需要改变,

通话时间的计算不用变,

话费计算新增加了别的计费方式,需要改变。

 

其中,因为上一题的话费计算没有分类,是直接在通话时间后乘以每分钟多少钱的,

所以这一题我在市内通话记录类、省内通话记录类、国内通话记录类中

都增加了相应的判断并计算话费的方式。

 

并且,新增了手机通讯的通话记录类。

 

(3)电信计费系列3-短信计费

本题主要进行前题中类设计的重构(因为不再需要通话记录啦),

实现了手机短信记录及其计费的功能。

 

在第一题的推荐类设计里早早添加的message相关类终于派上用场啦。

此时我进行了一个增删改的大动作,实现了与系列一中通话计费差不多的更简洁的框架。

 

针对手机的短信采用如下计费方式:
1、接收短信免费,发送短信0.1元/条,超过3条0.2元/条,超过5条0.3元/条。
2、如果一次发送短信的字符数量超过10个,按每10个字符一条短信进行计算。

 

短信的计费方式很独特,

计费函数第一次过的时候出现了部分正确的问题。

最终函数代码:

public double calCost(UserRecords userRecords) {
        int number = 0;
        double cost = 0;
        for (MessageRecord r : userRecords.getSendMessageRecords()) {
            if (r.getMessage().length() > 10) {
                number += Math.ceil(r.getMessage().length() / 10.0);
            } else if(r.getMessage().length() <= 10&&r.getMessage().length() > 0){
                number++;
            }
        }
        if (number <= 3)
            cost = number * 0.1;
        else if (number > 3 && number <= 5) {
            cost = 0.3 + (number - 3) * 0.2;
        } else {
            cost = 0.3 + 0.4 + (number - 5) * 0.3;
        }
        return cost;
    }

 

  • (三)总结

(1)指导书提供的类设计真的给了题目很大的帮助,

这让我深刻意识到顶层设计的重要性与优越性。

 

 (2)预计进一步学习及研究内容

 

1.了解工具、集合框架类的方法

2.阅读阿里巴巴Java开发手册

3.继续读厚厚的《Java语言程序设计》

4.针对学习B站里的系列Java教学课程

 

(3)对课程组织等方面的建议及意见

posted @ 2022-06-15 23:49  未皖  阅读(93)  评论(2)    收藏  举报