首页 > 其他分享 >nchu-software-oop-2022-6~8

nchu-software-oop-2022-6~8

时间:2022-12-10 21:22:06浏览次数:86  
标签:短信 号码 nchu 用户 座机 oop 2022 计费 输入

  • 前言(作业分析)

  本次总结6-8次PTA题目集电信计费三次,三次电信计费题目,主要是考察正则表达式和ArrayList和集合,然后就是对类的封装、继承等知识,在写新的大作业需要认真构思,因为大作业的各个功能类是迭代的,前面如果没有做好后的话,做后面的工作量就是增加且复杂。

  • 设计与分析

  • 7-1 电信计费系列1-座机计费   作者 蔡轲 单位 南昌航空大学

    实现一个简单的电信计费程序:
    假设南昌市电信分公司针对市内座机用户采用的计费方式:
    月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
    南昌市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。

    输入格式:

    输入信息包括两种类型
    1、逐行输入南昌市用户开户的信息,每行一个用户,
    格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
    例如:u-079186300001 0
    座机号码除区号外由是7-8位数字组成。
    本题只考虑计费类型0-座机计费,电信系列2、3题会逐步增加计费类型。
    2、逐行输入本月某些用户的通讯信息,通讯信息格式:
    座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
    t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
    以上四项内容之间以一个英文空格分隔,
    时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。
    以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
    注意:
    本题非法输入只做格式非法的判断,不做内容是否合理的判断(时间除外,否则无法计算),比如:
    1、输入的所有通讯信息均认为是同一个月的通讯信息,不做日期是否在同一个月还是多个月的判定,直接将通讯费用累加,因此月租只计算一次。
    2、记录中如果同一电话号码的多条通话记录时间出现重合,这种情况也不做判断,直接 计算每条记录的费用并累加。
    3、用户区号不为南昌市的区号也作为正常用户处理。

    输出格式:

    根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,
    单位元)。假设每个用户初始余额是100元。
    每条通讯信息单独计费后累加,不是将所有时间累计后统一计费。
    格式:号码+英文空格符+总的话费+英文空格符+余额
    每个用户一行,用户之间按号码字符从小到大排序。

    错误处理:
    输入数据中出现的不符合格式要求的行一律忽略。

    建议类图:
    参见图1、2、3,可根据理解自行调整:

    image.png

                                        图1
    图1中User是用户类,包括属性:
    userRecords (用户记录)、balance(余额)、chargeMode(计费方式)、number(号码)。
    
    ChargeMode是计费方式的抽象类:
    chargeRules是计费方式所包含的各种计费规则的集合,ChargeRule类的定义见图3。
    getMonthlyRent()方法用于返回月租(monthlyRent)。
    
    UserRecords是用户记录类,保存用户各种通话、短信的记录,    
    各种计费规则将使用其中的部分或者全部记录。
    其属性从上到下依次是:
    市内拨打电话、省内(不含市内)拨打电话、省外拨打电话、
    市内接听电话、省内(不含市内)接听电话、省外接听电话的记录
    以及发送短信、接收短信的记录。
    
     

    image.png

                                         图2
    图2中CommunicationRecord是抽象的通讯记录类:
    包含callingNumber拨打号码、answerNumber接听号码两个属性。
    CallRecord(通话记录)、MessageRecord(短信记录)是它的子类。
    
    CallRecord(通话记录类)包含属性:
    通话的起始、结束时间以及
    拨号地点的区号(callingAddressAreaCode)、接听地点的区号(answerAddressAreaCode)。
    区号用于记录在哪个地点拨打和接听的电话。座机无法移动,就是本机区号,如果是手机号,则会有差异。
    
     

    image.png

                                            图3
    图3是计费规则的相关类,这些类的核心方法是:
    calCost(ArrayList<CallRecord> callRecords)。
    该方法针根据输入参数callRecords中的所有记录计算某用户的某一项费用;如市话费。
    输入参数callRecords的约束条件:必须是某一个用户的符合计费规则要求的所有记录。
    
    LandPhoneInCityRule、LandPhoneInProvinceRule、LandPhoneInLandRule三个类分别是
    座机拨打市内、省内、省外电话的计费规则类,用于实现这三种情况的费用计算。    
    (提示:可以从UserRecords类中获取各种类型的callRecords)。
    
     

    后续扩展说明:
    后续题目集将增加手机用户,手机用户的计费方式中除了与座机计费类似的主叫通话费之外,还包含市外接听电话的漫游费以及发短信的费用。在本题的设计时可统一考虑。
    通话记录中,手机需要额外记录拨打/接听的地点的区号,比如:
    座机打手机:t-主叫号码 接听号码 接听地点区号 起始时间 结束时间
    t-079186330022 13305862264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
    手机互打:t-主叫号码 拨号地点 接听号码 接听地点区号 起始时间 结束时间
    t-18907910010 0791 13305862264 0371 2022.1.3 10:00:25 2022.1.3 10:05:11
    短信的格式:m-主叫号码,接收号码,短信内容
    m-18907910010 13305862264 welcome to jiangxi
    m-13305862264 18907910010 thank you

    输入样例:

    在这里给出一组输入。例如:

    u-079186300001 0
    t-079186300001 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:25
    end
    
     

    输出样例:

    在这里给出相应的输出。例如:

    079186300001 3.0 77.0
    
     

    其余参考样例详见附件,未尽事宜以附件样例为准:

    电信计费简化版-座机计费说明.pdf

    主要类:

    CallRecord:

    View Code

    ChargeMode:

    View Code

    CommunicationRecord:

    View Code

    LandlinePhoneCharging:

    View Code

    分析:本题需要根据所给的类图进行类的构造,在实现类的构造时需要根据题目要求进行,不然会增加很多不必要的工作量,而且对整体的构造模糊,测试时找不到过不了的测试点。由于自己写的的时候没有仔细考虑,所以写的是非常吃力。

    类图:

    分析图:

     

     

     

     

     

     

     


  • 7-1 电信计费系列2-手机+座机计费 分数 80 作者 蔡轲 单位 南昌航空大学

    实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
    1、针对市内座机用户采用的计费方式(与电信计费系列1内容相同):
    月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
    假设本市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
    2、针对手机用户采用实时计费方式:
    月租15元,市内省内接电话均免费,市内拨打市内电话0.1元/分钟,市内拨打省内电话0.2元/分钟,市内拨打省外电话0.3元/分钟,省内漫游打电话0.3元/分钟,省外漫游接听0.3元/分钟,省外漫游拨打0.6元/分钟;
    注:被叫电话属于市内、省内还是国内由被叫电话的接听地点区号决定,比如以下案例中,南昌市手机用户13307912264在区号为020的广州接听了电话,主叫号码应被计算为拨打了一个省外长途,同时,手机用户13307912264也要被计算省外接听漫游费:
    u-13307912264 1
    t-079186330022 13307912264 020 2022.1.3 10:00:25 2022.1.3 10:05:11

    输入:
    输入信息包括两种类型
    1、逐行输入南昌市用户开户的信息,每行一个用户,含手机和座机用户
    格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
    例如:u-079186300001 0
    座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
    手机号码由11位数字构成,最高位是1。
    本题在电信计费系列1基础上增加类型1-手机实时计费。
    手机设置0或者座机设置成1,此种错误可不做判断。
    2、逐行输入本月某些用户的通讯信息,通讯信息格式:
    座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
    t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
    以上四项内容之间以一个英文空格分隔,
    时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。
    输入格式增加手机接打电话以及收发短信的格式,手机接打电话的信息除了号码之外需要额外记录拨打/接听的地点的区号,比如:
    座机打手机:
    t-主叫号码 接听号码 接听地点区号 起始时间 结束时间
    t-079186330022 13305862264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
    手机互打:
    t-主叫号码 拨号地点 接听号码 接听地点区号 起始时间 结束时间
    t-18907910010 0791 13305862264 0371 2022.1.3 10:00:25 2022.1.3 10:05:11

    注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。

    输出:
    根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
    每条通讯、短信信息均单独计费后累加,不是将所有信息累计后统一计费。
    格式:号码+英文空格符+总的话费+英文空格符+余额
    每个用户一行,用户之间按号码字符从小到大排序。
    错误处理:
    输入数据中出现的不符合格式要求的行一律忽略。

    本题只做格式的错误判断,无需做内容上不合理的判断,比如同一个电话两条通讯记录的时间有重合、开户号码非南昌市的号码等,此类情况都当成正确的输入计算。但时间的输入必须符合要求,比如不能输入2022.13.61 28:72:65。
    
     

    建议类图:
    参见图1、2、3:

    image.png
    图1

    图1中User是用户类,包括属性:
    userRecords (用户记录)、balance(余额)、chargeMode(计费方式)、number(号码)。
    ChargeMode是计费方式的抽象类:
    chargeRules是计费方式所包含的各种计费规则的集合,ChargeRule类的定义见图3。
    getMonthlyRent()方法用于返回月租(monthlyRent)。
    UserRecords是用户记录类,保存用户各种通话、短信的记录,    
    各种计费规则将使用其中的部分或者全部记录。
    其属性从上到下依次是:
    市内拨打电话、省内(不含市内)拨打电话、省外拨打电话、
    市内接听电话、省内(不含市内)接听电话、省外接听电话的记录
    以及发送短信、接收短信的记录。
    
     

    image.png

    图2

    图2中CommunicationRecord是抽象的通讯记录类:
    包含callingNumber拨打号码、answerNumber接听号码两个属性。
    CallRecord(通话记录)、MessageRecord(短信记录)是它的子类。CallRecord(通话记录类)包含属性:
    通话的起始、结束时间以及
    拨号地点的区号(callingAddressAreaCode)、接听地点的区号(answerAddressAreaCode)。
    区号用于记录在哪个地点拨打和接听的电话。座机无法移动,就是本机区号,如果是手机号,则会有差异。
    
     

    image.png
    图3

    图3是计费规则的相关类,这些类的核心方法是:
    calCost(ArrayList<CallRecord> callRecords)。
    该方法针根据输入参数callRecords中的所有记录计算某用户的某一项费用;如市话费。
    输入参数callRecords的约束条件:必须是某一个用户的符合计费规则要求的所有记录。
    SendMessageRule是发送短信的计费规则类,用于计算发送短信的费用。
    LandPhoneInCityRule、LandPhoneInProvinceRule、LandPhoneInLandRule三个类分别是座机拨打市内、省内、省外电话的计费规则类,用于实现这三种情况的费用计算。    
    
     

    (提示:可以从UserRecords类中获取各种类型的callRecords)。
    注意:以上图中所定义的类不是限定要求,根据实际需要自行补充或修改。

    输入样例:

    在这里给出一组输入。例如:

    u-13811111111 1
    t-13811111111 0791 13811111110 020 2022.1.3 08:00:00 2022.1.3 08:09:20
    end
    
     

    输出样例:

    在这里给出相应的输出。例如:

    13811111111 3.0 82.0
    
     

    更多内容详见附件:

    电信计费简化版-座机计费说明.pdf

    分析:本次作业大多数内容与第一次电信收费内容一致,书写方式基本都是一致的,所以没有特别新增或者更改函数与方法,只是在第一题的基础上新增了对手机用户的创建以及收费标准。新增的手机计费方式,要求了对通话记录的访问。同时本次计费的储存方式进行了更改,单独记录手机或座机的打出地与接听地,让后面手机漫游接听的判断简化,不容易混乱,同时也简化了ArrayList的储存与访问。

    类图:

     

     

     分析图:

     

     

     

     

     

     

     


  • 7-1 电信计费系列3-短信计费 分数 50 作者 蔡轲 单位 南昌航空大学

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

    输入:
    输入信息包括两种类型
    1、逐行输入南昌市手机用户开户的信息,每行一个用户。
    格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐 3-手机短信计费)
    例如:u-13305862264 3
    座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
    手机号码由11位数字构成,最高位是1。
    本题只针对类型3-手机短信计费。
    2、逐行输入本月某些用户的短信信息,短信的格式:
    m-主叫号码,接收号码,短信内容 (短信内容只能由数字、字母、空格、英文逗号、英文句号组成)
    m-18907910010 13305862264 welcome to jiangxi.
    m-13305862264 18907910010 thank you.

    注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
    输出:
    根据输入的详细短信信息,计算所有已开户的用户的当月短信费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
    每条短信信息均单独计费后累加,不是将所有信息累计后统一计费。
    格式:号码+英文空格符+总的话费+英文空格符+余额
    每个用户一行,用户之间按号码字符从小到大排序。
    错误处理:
    输入数据中出现的不符合格式要求的行一律忽略。
    本题只做格式的错误判断,无需做内容上不合理的判断,比如同一个电话两条通讯记录的时间有重合、开户号码非南昌市的号码、自己给自己打电话等,此类情况都当成正确的输入计算。但时间的输入必须符合要求,比如不能输入2022.13.61 28:72:65。

    本题只考虑短信计费,不考虑通信费用以及月租费。

    建议类图:
    参见图1、2、3:

    image.png

    图1

    图1中User是用户类,包括属性:
    userRecords (用户记录)、balance(余额)、chargeMode(计费方式)、number(号码)。
    ChargeMode是计费方式的抽象类:
    chargeRules是计费方式所包含的各种计费规则的集合,ChargeRule类的定义见图3。
    getMonthlyRent()方法用于返回月租(monthlyRent)。    
    UserRecords是用户记录类,保存用户各种通话、短信的记录,    
    各种计费规则将使用其中的部分或者全部记录。
    其属性从上到下依次是:
    市内拨打电话、省内(不含市内)拨打电话、省外拨打电话、
    市内接听电话、省内(不含市内)接听电话、省外接听电话的记录
    以及发送短信、接收短信的记录。
    
     

    image.png

    图2

        图2中CommunicationRecord是抽象的通讯记录类:
    包含callingNumber拨打号码、answerNumber接听号码两个属性。
    CallRecord(通话记录)、MessageRecord(短信记录)是它的子类。
    
     

    image.png

    图3
    图3是计费规则的相关类,这些类的核心方法是:
    calCost(ArrayList callRecords)。
    该方法针根据输入参数callRecords中的所有记录计算某用户的某一项费用;如市话费。
    输入参数callRecords的约束条件:必须是某一个用户的符合计费规则要求的所有记录。
    SendMessageRule是发送短信的计费规则类,用于计算发送短信的费用。
    LandPhoneInCityRule、LandPhoneInProvinceRule、LandPhoneInLandRule三个类分别是座机拨打市内、省内、省外电话的计费规则类,用于实现这三种情况的费用计算。

    (提示:可以从UserRecords类中获取各种类型的callRecords)。
    
     

    注意:以上图中所定义的类不是限定要求,根据实际需要自行补充或修改。

    输入样例:

    在这里给出一组输入。例如:

    u-18907910010 3
    m-18907910010 13305862264 aaaaaaaaaaaaaaaaaaaaaaa
    end
    
     

    输出样例:

    在这里给出相应的输出。例如:

    18907910010 0.3 99.7
    
     
    ### 输入样例1:
    
     

    在这里给出一组输入。例如:

    u-18907910010 3
    m-18907910010 13305862264 aaaaaaaaaaaa
    m-18907910010 13305862264 aaaaaaa.
    m-18907910010 13305862264 bb,bbbb
    end
    
     

    输出样例1:

    在这里给出相应的输出。例如:

    18907910010 0.5 99.5

  分析:本次为短信计费,只需要对字符串进行判断以及计数就行。

  类图:

 

 

 分析图:

 

 


 

  • 踩坑心得

  1. 通过本次大作业,发现自己对正则表达式的理解和应用还不是很熟练,做作业需要参考或者询问别的同学正则表达式的相关写法。
  2. 本次大作业学习了集合,学到了集合的使用的场景及其特点,
  • 改进建议

  1. 首先需要加强正则表达式的练习,多看别人如何书写正则表达式,学习别人书写正则表达式的思路和方法
  2. 多看多学,Java知识还有很多自己没有接触过的知识,还需更加努力的学习
  • 总结

  通过本阶段(10到16周)的Java学习,让我学到了许多Java语言中没有接触到知识,通过大作业的练习,加强了前些阶段的对类的封装、继承的学习,加强了Java语言面向对象的编程思想。当然,通过大作业也发现了自身还存在许多问题,在今后Java的学习中需更加努力。

   

 

 

 

 

 

 

 

                 

 

 

 

标签:短信,号码,nchu,用户,座机,oop,2022,计费,输入
From: https://www.cnblogs.com/chxlaity/p/16972051.html

相关文章