博客总结作业三

前言:

本次总结是针对最近一段时间的三次pta题目集中移动业务资费的问题。

pta题目集8是关于移动业务资费的第一次题目集。其中涉及到了继承、多态、抽象类、集合框架等知识点。本次题目集只有两道题,题目量较少,第一题关于移动业务资费难度较大,因为题目给出的类图是分开的,我们需要先根据给出的类图理解、并且掌握类与类之间的所有关系。其中还包括许多的抽象类,因此第一次写代码所需要的时间较长。

pta题目集9是关于移动业务资费的第二次题目集。其中涉及到了继承、多态、抽象类、集合框架等知识点。本次题目集有三道题,题目量较少,第一题关于移动业务资费难度较大,由于第一次只有座机与座机的通话,所以不用考虑打电话的座机是否在哪里。但本次包括了手机的套餐,还需要考虑手机的所在地,并且手机接听电话也有收费的情况,在计费规则上需要添加许多东西,相应的正则表达式也需要改变,因此本次写代码所需要的时间较长。

pta题目集10是关于移动业务资费的第三次题目集。其中涉及到了继承、多态、抽象类、集合框架等知识点。本次题目集有三道题,题目量较少,第一题关于移动业务资费难度比前两次小了许多,因为本题只需考虑短信的计费,前两次的复杂的计费规则全都不需要,因此写起来比较简单,就是在判断输入合不合法的正则表达式上废了一些时间。

设计与分析:

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元。
每条通讯信息单独计费后累加,不是将所有时间累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。

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

代码:

import java.util.Scanner;
import java.util.TreeMap;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in = new Scanner(System.in);
        TreeMap<String,User> userrecords = new TreeMap<String, User>();
        String check1 = "^u-\\d{11,12}\\s(0|1|2)$";
        String check2 = "t-(\\d){11,12}\\s(\\d){10,12}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d";
        String a = in.nextLine();
        
        while(!a.equals("end")) {
            if(a.matches(check1)) {
                String[] s1 = a.split("-");
                String[] s2 = s1[1].split(" ");
                String s3 = s2[0].substring(4);
                ChargeMode chargeMode = new LandlinePhoneCharging();
                User user = new User(s3,chargeMode); 
                userrecords.put(s3, user);
                
            }
            
            if(a.matches(check2)) {
                String[] a1 = a.split("-");
                String[] a2 = a1[1].split(" ");
                String callingarea = a2[0].substring(0, 4);
                String callingnumber = a2[0].substring(4);
                String listeningnumber = a2[1].substring(4);
                String listeningarea = a2[1].substring(0, 4);
                String startTime = a2[2]+" "+a2[3];
                String endTime = a2[4]+" "+a2[5];        
                Date startDate = new Date();
                Date endDate = new Date();
                
                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                try {
                 startDate = format.parse(startTime);
                 endDate = format.parse(endTime);
                } 
                catch (ParseException e) {
                 e.printStackTrace();
                }
                
                CallRecord callRecord = new CallRecord(callingnumber,listeningnumber,callingarea,listeningarea,startDate,endDate);
                if(userrecords.get(callingnumber)!=null){
                    
                
                if(callingarea.equals("0791")&&listeningarea.equals("0791")) {
                    userrecords.get(callingnumber).getUserRecords().addCallingInCityRecords(callRecord);
                }
                else if(callingarea.equals("0791")&&(listeningarea.equals("0790")||listeningarea.equals("0792")||listeningarea.equals("0793")||listeningarea.equals("0794")||listeningarea.equals("0795")||listeningarea.equals("0796")||listeningarea.equals("0797")||listeningarea.equals("0798")||listeningarea.equals("0799")||listeningarea.equals("0701"))) {
                    userrecords.get(callingnumber).getUserRecords().addCallingInProvinceRecords(callRecord);
                }
                else {
                    userrecords.get(callingnumber).getUserRecords().addCallingInLandRecords(callRecord);
                }
            }
            }
            a = in.nextLine();
        }
        
        for(User user : userrecords.values()) {
            System.out.println("0791"+user.getNumber()+" "+Math.round(user.calCost()*100.0)/100.0+" "+Math.round(user.calBalance()*100.0)/100.0);
        }

    }

}

class CallChargeRule extends ChargeRule{
    
    public double calCost(ArrayList<CallRecord> callRecords) {        
        return 0;
    }

}
class CallRecord extends CommunicationRecord{
    
    private Date startTime;
    private Date endTime;
    private String callingAddressAreaCode;
    private String answeringAddressAreaCode;
    private String callingNumber;
    private String answeringNumber;
    
    public CallRecord(String callingNumber,String answeringNumber,String callingAddressAreaCode,String answeringAddressAreaCode,Date startTime,Date endTime) {
        this.answeringAddressAreaCode = answeringAddressAreaCode;
        this.callingAddressAreaCode = callingAddressAreaCode;
        this.answeringNumber = answeringNumber;
        this.callingNumber = callingNumber;
        this.endTime = endTime;
        this.startTime = startTime;
    }
    
    public Date getStartTime() {
        return startTime;
    }
    
    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }
    
    public Date getEndTime() {
        return endTime;
    }
    
    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }
    
    public String getCallingAddressAreaCode() {
        return callingAddressAreaCode;
    }
    
    public void setCallingAddressAreaCode(String callingAddressAreaCode) {
        this.callingAddressAreaCode = callingAddressAreaCode;
    }

    public String getAnsweringAddressAreaCode() {
        return answeringAddressAreaCode;
    }

    public void setAnsweringAddressAreaCode(String answeringAddressAreaCode) {
        this.answeringAddressAreaCode = answeringAddressAreaCode;
    }

    public String getCallingNumber() {
        return callingNumber;
    }

    public void setCallingNumber(String callingNumber) {
        this.callingNumber = callingNumber;
    }

    public String getAnsweringNumber() {
        return answeringNumber;
    }

    public void setAnsweringNumber(String answeringNumber) {
        this.answeringNumber = answeringNumber;
    }
    
    
    
}
abstract class ChargeMode {

    private ArrayList<ChargeRule> chargeRules = new ArrayList<>();
    

    public ArrayList<ChargeRule> getChargeRules() {
        return chargeRules;
    }

    public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
        this.chargeRules = chargeRules;
    }
    
    public double calCost(UserRecords userRecords) {
        return 0;
    }
    
    public double getMonthlyRent() {
        return 0;
    }
    
}
abstract class ChargeRule {

    public double calCost(ArrayList<CallRecord> callingInCityRecords) {
        // TODO 自动生成的方法存根
        return 0;
    }
    
    
}
abstract class CommunicationRecord {
    
    protected String callingnumber;

    public String getCallingnumber() {
        return callingnumber;
    }

    public void setCallingnumber(String callingnumber) {
        this.callingnumber = callingnumber;
    }
    
}
class LandlinePhoneCharging extends ChargeMode{
    
    private double monthlyRent = 20;

    @Override
    public double calCost(UserRecords userRecords) {
        // TODO 自动生成的方法存根
        double sum = 0,a,b,c;
        
        getChargeRules().add(new LandPhoneInCityRule());
        getChargeRules().add(new LandPhoneInProvinceRule());
        getChargeRules().add(new LandPhoneInLandRule());
        
        a = super.getChargeRules().get(0).calCost(userRecords.getCallingInCityRecords());
        b = super.getChargeRules().get(1).calCost(userRecords.getCallingInProvinceRecords());
        c = super.getChargeRules().get(2).calCost(userRecords.getCallingInLandRecords());
        sum = a+b+c;
        
        return sum;
    }

    @Override
    public double getMonthlyRent() {
        // TODO 自动生成的方法存根
        return monthlyRent;
    }

}
class LandPhoneInCityRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum3 = 0;
        for(CallRecord a:callRecords) {
            sum3 = sum3 + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.1;
        }
        return sum3;
    }
    
    

}
class LandPhoneInLandRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum1 = 0;
        for(CallRecord a:callRecords) {
            sum1=sum1+Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.6;
        }
        return sum1;
    }
    
    

}
class LandPhoneInProvinceRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum2 = 0;
        for(CallRecord a:callRecords) {
            sum2 = sum2 + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.3;
        }
        return sum2;
    }
    
    

}
class User {
    
    private UserRecords userRecords = new UserRecords(); 
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;
    
    public User(String number, ChargeMode chargeMode) {
        this.number = number;
        this.chargeMode = chargeMode;

        // TODO 自动生成的构造函数存根
    }

    public double calBalance() {
        return (balance-calCost()-chargeMode.getMonthlyRent());
    }
    
    public double calCost() {
        return chargeMode.calCost(userRecords);
        
    }

    public UserRecords getUserRecords() {
        return userRecords;
    }

    public void setUserRecords(UserRecords userRecords) {
        this.userRecords = userRecords;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public ChargeMode getChargeMode() {
        return chargeMode;
    }

    public void setChargeMode(ChargeMode chargeMode) {
        this.chargeMode = chargeMode;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
    
    
}
class UserRecords {
    
    private ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
    
    public void addCallingInCityRecords(CallRecord callRecord) {
        callingInCityRecords.add(callRecord);
    }
    
    public void addCallingInProvinceRecords(CallRecord callRecord) {
        callingInProvinceRecords.add(callRecord);
    }

    public void addCallingInLandRecords(CallRecord callRecord) {
         callingInLandRecords.add(callRecord);
    }

    public UserRecords() {
        super();
        // TODO 自动生成的构造函数存根
    }

    public ArrayList<CallRecord> getCallingInCityRecords() {
        return callingInCityRecords;
    }

    public ArrayList<CallRecord> getCallingInProvinceRecords() {
        return callingInProvinceRecords;
    }

    public ArrayList<CallRecord> getCallingInLandRecords() {
        return callingInLandRecords;
    }
    
    

}
View Code

类图:

 

 

心得这道题真的让我痛不欲生。这道题真的让我体验到了搞清类与类之间的关系有多么重要因为题目给出的类图是分开的,我们需要先根据给出的类图理解、并且掌握类与类之间的所有关系。其中还包括许多的抽象类,因此第一次写代码所需要的时间较长。并且本题的测试点很多,我第一次提交只有一半多一点的分,猜测试点的过程很痛苦,但是看着分数增加也值得了。

 

7-1 电信计费系列2-手机+座机计费:

实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
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元。
每条通讯、短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。

代码:

import java.util.Scanner;
import java.util.TreeMap;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in = new Scanner(System.in);
        TreeMap<String,User> userrecords = new TreeMap<String, User>();
        String check1 = "^u-0\\d{10,11}\\s0$";
        String check3 = "^u-1\\d{10}\\s1$";
        String check2 = "t-0(\\d){9,11}\\s0(\\d){9,11}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d";
        String check4 = "t-0(\\d){9,11}\\s1(\\d){10}\\s0(\\d){2,3}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}";
        String check5 = "t-1(\\d){10}\\s0(\\d){2,3}\\s0(\\d){9,11}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}";
        String check6 = "t-1(\\d){10}\\s0(\\d){2,3}\\s1(\\d){10}\\s0(\\d){2,3}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d";

        String a = in.nextLine();
        
        while(!a.equals("end")) {
            if(a.matches(check1)) {
                String[] s1 = a.split("-");
                String[] s2 = s1[1].split(" ");
                String s3 = s2[0];
                ChargeMode chargeMode = new LandlinePhoneCharging();
                User user = new User(s3,chargeMode); 
                userrecords.put(s3, user);
                
            }
            
            if(a.matches(check3)) {
                String[] s1 = a.split("-");
                String[] s2 = s1[1].split(" ");
                String s3 = s2[0];
                ChargeMode chargeMode = new PhoneCharging();
                User user = new User(s3,chargeMode); 
                userrecords.put(s3, user);
                
            }
            
            if(a.matches(check2)) {
                String[] a1 = a.split("-");
                String[] a2 = a1[1].split(" ");
                String callingarea = a2[0].substring(0, 4);
                String callingnumber = a2[0];
                String listeningnumber = a2[1];
                String listeningarea = a2[1].substring(0, 4);
                String startTime = a2[2]+" "+a2[3];
                String endTime = a2[4]+" "+a2[5];        
                Date startDate = new Date();
                Date endDate = new Date();
                
                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                try {
                 startDate = format.parse(startTime);
                 endDate = format.parse(endTime);
                } 
                catch (ParseException e) {
                 e.printStackTrace();
                }
                
                CallRecord callRecord = new CallRecord(callingnumber,listeningnumber,callingarea,listeningarea,startDate,endDate);
                
                if(listeningarea.equals("0791")) {
                    userrecords.get(callingnumber).getUserRecords().addCallingInCityRecords(callRecord);
                }
                else if((listeningarea.equals("0790")||listeningarea.equals("0792")||listeningarea.equals("0793")||listeningarea.equals("0794")||listeningarea.equals("0795")||listeningarea.equals("0796")||listeningarea.equals("0797")||listeningarea.equals("0798")||listeningarea.equals("0799")||listeningarea.equals("0701"))) {
                    userrecords.get(callingnumber).getUserRecords().addCallingInProvinceRecords(callRecord);
                }
                else {
                    userrecords.get(callingnumber).getUserRecords().addCallingInLandRecords(callRecord);
                }
            }
            
            if(a.matches(check4)) {
                String[] a1 = a.split("-");
                String[] a2 = a1[1].split(" ");
                String callingarea = a2[0].substring(0, 4);
                String callingnumber = a2[0];
                String listeningnumber = a2[1];
                String listeningarea = a2[2];
                String startTime = a2[3]+" "+a2[4];
                String endTime = a2[5]+" "+a2[6];        
                Date startDate = new Date();
                Date endDate = new Date();
                
                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                try {
                 startDate = format.parse(startTime);
                 endDate = format.parse(endTime);
                } 
                catch (ParseException e) {
                 e.printStackTrace();
                }
                
                CallRecord callRecord = new CallRecord(callingnumber,listeningnumber,callingarea,listeningarea,startDate,endDate);
                if(listeningarea.equals("0791")) {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInCityRecords(callRecord);
                    }
                }
                else if((listeningarea.equals("0790")||listeningarea.equals("0792")||listeningarea.equals("0793")||listeningarea.equals("0794")||listeningarea.equals("0795")||listeningarea.equals("0796")||listeningarea.equals("0797")||listeningarea.equals("0798")||listeningarea.equals("0799")||listeningarea.equals("0701"))) {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInProvinceRecords(callRecord);
                    }
                    if(userrecords.get(listeningnumber)!=null) {
                        userrecords.get(listeningnumber).getUserRecords().addanswerInProvinceRecords(callRecord);
                    }
                }
                else {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInLandRecords(callRecord);
                    }
                    if(userrecords.get(listeningnumber)!=null) {
                        userrecords.get(listeningnumber).getUserRecords().addanswerInLandRecords(callRecord);
                    }
                }
            }
            
            if(a.matches(check5)) {
                String[] a1 = a.split("-");
                String[] a2 = a1[1].split(" ");
                String callingarea = a2[1];
                String callingnumber = a2[0];
                String listeningnumber = a2[2];
                String listeningarea = a2[2].substring(0,4);
                String startTime = a2[3]+" "+a2[4];
                String endTime = a2[5]+" "+a2[6];        
                Date startDate = new Date();
                Date endDate = new Date();
                

                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                try {
                 startDate = format.parse(startTime);
                 endDate = format.parse(endTime);
                } 
                catch (ParseException e) {
                 e.printStackTrace();
                }
                
                CallRecord callRecord = new CallRecord(callingnumber,listeningnumber,callingarea,listeningarea,startDate,endDate);
            
                if(listeningarea.equals("0791")) {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInCityRecords(callRecord);
                    }
                }
                else if((listeningarea.equals("0790")||listeningarea.equals("0792")||listeningarea.equals("0793")||listeningarea.equals("0794")||listeningarea.equals("0795")||listeningarea.equals("0796")||listeningarea.equals("0797")||listeningarea.equals("0798")||listeningarea.equals("0799")||listeningarea.equals("0701"))) {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInProvinceRecords(callRecord);
                    }
                }
                else {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInLandRecords(callRecord);
                    }
                }
            }
            
            if(a.matches(check6)) {
                String[] a1 = a.split("-");
                String[] a2 = a1[1].split(" ");
                String callingarea = a2[1];
                String callingnumber = a2[0];
                String listeningnumber = a2[2];
                String listeningarea = a2[3];
                String startTime = a2[4]+" "+a2[5];
                String endTime = a2[6]+" "+a2[7];        
                Date startDate = new Date();
                Date endDate = new Date();
                
                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                try {
                 startDate = format.parse(startTime);
                 endDate = format.parse(endTime);
                } 
                catch (ParseException e) {
                 e.printStackTrace();
                }
                
                CallRecord callRecord = new CallRecord(callingnumber,listeningnumber,callingarea,listeningarea,startDate,endDate);
                if(listeningarea.equals("0791")) {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInCityRecords(callRecord);
                    }
                    if(userrecords.get(listeningnumber)!=null) {
                        userrecords.get(listeningnumber).getUserRecords().addanswerInCityRecords(callRecord);
                    }
                }
                else if((listeningarea.equals("0790")||listeningarea.equals("0792")||listeningarea.equals("0793")||listeningarea.equals("0794")||listeningarea.equals("0795")||listeningarea.equals("0796")||listeningarea.equals("0797")||listeningarea.equals("0798")||listeningarea.equals("0799")||listeningarea.equals("0701"))) {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInProvinceRecords(callRecord);
                    }
                    if(userrecords.get(listeningnumber)!=null) {
                        userrecords.get(listeningnumber).getUserRecords().addanswerInProvinceRecords(callRecord);
                    }
                }
                else {
                    if(userrecords.get(callingnumber)!=null) {
                        userrecords.get(callingnumber).getUserRecords().addCallingInLandRecords(callRecord);
                    }
                    if(userrecords.get(listeningnumber)!=null) {
                        userrecords.get(listeningnumber).getUserRecords().addanswerInLandRecords(callRecord);
                    }
                }
            }
            
            a = in.nextLine();
        }
        
        
        
        for(User user : userrecords.values()) {
            System.out.println(user.getNumber()+" "+user.calCost()+" "+user.calBalance());
        }

    }

}





class answerInLandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum = 0;
        for(CallRecord a:callRecords) {
            sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.3;
        }
        return sum;
    }

}
class CallChargeRule extends ChargeRule{
    
    public double calCost(ArrayList<CallRecord> callRecords) {        
        return 0;
    }

}
class CallRecord extends CommunicationRecord{
    
    private Date startTime;
    private Date endTime;
    private String callingAddressAreaCode;
    private String answeringAddressAreaCode;
    private String callingNumber;
    private String answeringNumber;
    
    public CallRecord(String callingNumber,String answeringNumber,String callingAddressAreaCode,String answeringAddressAreaCode,Date startTime,Date endTime) {
        this.answeringAddressAreaCode = answeringAddressAreaCode;
        this.callingAddressAreaCode = callingAddressAreaCode;
        this.answeringNumber = answeringNumber;
        this.callingNumber = callingNumber;
        this.endTime = endTime;
        this.startTime = startTime;
    }
    
    public Date getStartTime() {
        return startTime;
    }
    
    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }
    
    public Date getEndTime() {
        return endTime;
    }
    
    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }
    
    public String getCallingAddressAreaCode() {
        return callingAddressAreaCode;
    }
    
    public void setCallingAddressAreaCode(String callingAddressAreaCode) {
        this.callingAddressAreaCode = callingAddressAreaCode;
    }

    public String getAnsweringAddressAreaCode() {
        return answeringAddressAreaCode;
    }

    public void setAnsweringAddressAreaCode(String answeringAddressAreaCode) {
        this.answeringAddressAreaCode = answeringAddressAreaCode;
    }

    public String getCallingNumber() {
        return callingNumber;
    }

    public void setCallingNumber(String callingNumber) {
        this.callingNumber = callingNumber;
    }

    public String getAnsweringNumber() {
        return answeringNumber;
    }

    public void setAnsweringNumber(String answeringNumber) {
        this.answeringNumber = answeringNumber;
    }
    
    
    
}
class ChargeMode {

    private ArrayList<ChargeRule> chargeRules = new ArrayList<>();
    

    public ArrayList<ChargeRule> getChargeRules() {
        return chargeRules;
    }

    public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
        this.chargeRules = chargeRules;
    }
    
    public double calCost(UserRecords userRecords) {
        return 0;
    }
    
    public double getMonthlyRent() {
        return 0;
    }
    
}
abstract class ChargeRule {

    public double calCost(ArrayList<CallRecord> callingInCityRecords) {
        // TODO 自动生成的方法存根
        return 0;
    }
    
    
}
abstract class CommunicationRecord {
    
    protected String callingNumber;
    protected String answerNumber;


    public String getCallingNumber() {
        return callingNumber;
    }

    public void setCallingNumber(String callingNumber) {
        this.callingNumber = callingNumber;
    }

    public String getAnswerNumber() {
        return answerNumber;
    }

    public void setAnswerNumber(String answerNumber) {
        this.answerNumber = answerNumber;
    }
    
}
class LandlinePhoneCharging extends ChargeMode{
    
    private double monthlyRent = 20;

    @Override
    public double calCost(UserRecords userRecords) {
        // TODO 自动生成的方法存根
        double sum = 0,a,b,c;
        
        getChargeRules().add(new LandPhoneInCityRule());
        getChargeRules().add(new LandPhoneInProvinceRule());
        getChargeRules().add(new LandPhoneInLandRule());
        
        a = super.getChargeRules().get(0).calCost(userRecords.getCallingInCityRecords());
        b = super.getChargeRules().get(1).calCost(userRecords.getCallingInProvinceRecords());
        c = super.getChargeRules().get(2).calCost(userRecords.getCallingInLandRecords());
        sum = a+b+c;
        
        return sum;
    }

    @Override
    public double getMonthlyRent() {
        // TODO 自动生成的方法存根
        return monthlyRent;
    }

}
class LandPhoneInCityRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum3 = 0;
        for(CallRecord a:callRecords) {
            sum3 = sum3 + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.1;
        }
        return sum3;
    }
    
    

}
class LandPhoneInLandRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum1 = 0;
        for(CallRecord a:callRecords) {
            sum1=sum1+Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.6;
        }
        return sum1;
    }
    
    

}
class LandPhoneInProvinceRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum2 = 0;
        for(CallRecord a:callRecords) {
            sum2 = sum2 + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.3;
        }
        return sum2;
    }
    
    

}
class PhoneCharging extends ChargeMode{
    private double monthlyRent = 15;
    
    @Override
    public double calCost(UserRecords userRecords) {
        // TODO 自动生成的方法存根
        double sum = 0,a,b,c,d;
        
        getChargeRules().add(new PhoneInCityRule());
        getChargeRules().add(new PhoneInProvinceRule());
        getChargeRules().add(new PhoneInLandRule());
        getChargeRules().add(new answerInLandRule());
        
        a = super.getChargeRules().get(0).calCost(userRecords.getCallingInCityRecords());
        b = super.getChargeRules().get(1).calCost(userRecords.getCallingInProvinceRecords());
        c = super.getChargeRules().get(2).calCost(userRecords.getCallingInLandRecords());
        d = super.getChargeRules().get(3).calCost(userRecords.getAnswerInLandRecords());
        sum = a+b+c+d;
        
        return sum;
    }

    @Override
    public double getMonthlyRent() {
        // TODO 自动生成的方法存根
        return monthlyRent;
    }

}
class PhoneInCityRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum = 0;
        
        for(CallRecord a:callRecords) {
            if(a.getCallingAddressAreaCode().equals("0791")) {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.1;
            }
            else if(a.getCallingAddressAreaCode().equals("0790")||a.getCallingAddressAreaCode().equals("0792")||a.getCallingAddressAreaCode().equals("0793")||a.getCallingAddressAreaCode().equals("0794")||a.getCallingAddressAreaCode().equals("0795")||a.getCallingAddressAreaCode().equals("0796")||a.getCallingAddressAreaCode().equals("0797")||a.getCallingAddressAreaCode().equals("0798")||a.getCallingAddressAreaCode().equals("0799")||a.getCallingAddressAreaCode().equals("0701")) {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.3;
            }
            else {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.6;
            }
            
        }
        return sum;
    }

}
class PhoneInLandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum = 0;
        for(CallRecord a:callRecords) {
            if(a.getCallingAddressAreaCode().equals("0791")) {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.3;
            }
            else if(a.getCallingAddressAreaCode().equals("0790")||a.getCallingAddressAreaCode().equals("0792")||a.getCallingAddressAreaCode().equals("0793")||a.getCallingAddressAreaCode().equals("0794")||a.getCallingAddressAreaCode().equals("0795")||a.getCallingAddressAreaCode().equals("0796")||a.getCallingAddressAreaCode().equals("0797")||a.getCallingAddressAreaCode().equals("0798")||a.getCallingAddressAreaCode().equals("0799")||a.getCallingAddressAreaCode().equals("0701")) {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.3;
            }
            else {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.6;
            }
            
        }
        return sum;
    }

}
class PhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        // TODO 自动生成的方法存根
        double sum = 0;
        for(CallRecord a:callRecords) {
            if(a.getCallingAddressAreaCode().equals("0791")) {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.2;
            }
            else if(a.getCallingAddressAreaCode().equals("0790")||a.getCallingAddressAreaCode().equals("0792")||a.getCallingAddressAreaCode().equals("0793")||a.getCallingAddressAreaCode().equals("0794")||a.getCallingAddressAreaCode().equals("0795")||a.getCallingAddressAreaCode().equals("0796")||a.getCallingAddressAreaCode().equals("0797")||a.getCallingAddressAreaCode().equals("0798")||a.getCallingAddressAreaCode().equals("0799")||a.getCallingAddressAreaCode().equals("0701")) {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.3;
            }
            else {
                sum = sum + Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/60000.0)*0.6;
            }
            
        }
        return sum;
    }

}
class User {
    
    private UserRecords userRecords = new UserRecords(); 
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;
    
    public User(String number, ChargeMode chargeMode) {
        this.number = number;
        this.chargeMode = chargeMode;

        // TODO 自动生成的构造函数存根
    }

    public double calBalance() {
        return (balance-calCost()-chargeMode.getMonthlyRent());
    }
    
    public double calCost() {
        return chargeMode.calCost(userRecords);
        
    }

    public UserRecords getUserRecords() {
        return userRecords;
    }

    public void setUserRecords(UserRecords userRecords) {
        this.userRecords = userRecords;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public ChargeMode getChargeMode() {
        return chargeMode;
    }

    public void setChargeMode(ChargeMode chargeMode) {
        this.chargeMode = chargeMode;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
    
    
}
class UserRecords {
    
    private ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();
    
    
    
    public void addCallingInCityRecords(CallRecord callRecord) {
        callingInCityRecords.add(callRecord);
    }
    
    public void addCallingInProvinceRecords(CallRecord callRecord) {
        callingInProvinceRecords.add(callRecord);
    }

    public void addCallingInLandRecords(CallRecord callRecord) {
         callingInLandRecords.add(callRecord);
    }
    
    public void addanswerInCityRecords(CallRecord callRecord) {
            answerInCityRecords.add(callRecord);
   }
    
    public void addanswerInProvinceRecords(CallRecord callRecord) {
           answerInProvinceRecords.add(callRecord);
      }
    
    public void addanswerInLandRecords(CallRecord callRecord) {
          answerInLandRecords.add(callRecord);
     }
   

    public UserRecords() {
        super();
        // TODO 自动生成的构造函数存根
    }

    public ArrayList<CallRecord> getCallingInCityRecords() {
        return callingInCityRecords;
    }

    public ArrayList<CallRecord> getCallingInProvinceRecords() {
        return callingInProvinceRecords;
    }

    public ArrayList<CallRecord> getCallingInLandRecords() {
        return callingInLandRecords;
    }

    public ArrayList<CallRecord> getAnswerInCityRecords() {
        return answerInCityRecords;
    }

    public ArrayList<CallRecord> getAnswerInProvinceRecords() {
        return answerInProvinceRecords;
    }

    public ArrayList<CallRecord> getAnswerInLandRecords() {
        return answerInLandRecords;
    }
    
    

}
View Code

类图:

 

 

心得:由于第一次只有座机与座机的通话,所以不用考虑打电话的座机是否在哪里。但本次包括了手机的套餐,还需要考虑手机的所在地,并且手机接听电话也有收费的情况,在计费规则上需要添加许多东西,相应的正则表达式也需要改变,因此本次写代码所需要的时间较长。并且测试点又一次折磨了我很久,我第一天写完就一直卡在70分,剩下的10分真的一点都想不出来,后来过了一天冷静思考了很久才发现了问题所在。

 

7-1 电信计费系列3-短信计费:

 

实现一个简单的电信计费程序,针对手机的短信采用如下计费方式:
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。

 

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

 

代码:

 

import java.util.Scanner;
import java.util.TreeMap;
import java.util.ArrayList;


public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in = new Scanner(System.in);
        TreeMap<String,User> userrecords = new TreeMap<String, User>();
        String check1 = "^u-1\\d{10}\\s3$";
        String check2 = "m-1(\\d){10}\\s1(\\d){10}\\s[A-Za-z0-9,. ]{1,}";
        String a = in.nextLine();
        while(!a.equals("end")) {
            if(a.matches(check1)) {
                String[] s1 = a.split("-");
                String[] s2 = s1[1].split(" ");
                String s3 = s2[0];
                ChargeMode chargeMode = new MessageCharging();
                User user = new User(s3,chargeMode); 
                userrecords.put(s3, user);    
            }
            
            if(a.matches(check2)) {
                String[] a1 = a.split("-");
                String[] a2 = a1[1].split(" ");
                String callingnumber = a2[0];
                String message = a1[1].substring(24);
                
                
               MessageRecord messageRecord = new MessageRecord(message);
                
               if(userrecords.get(callingnumber)!=null) {
                   userrecords.get(callingnumber).getUserRecords().addSendMessageRecords(messageRecord);;
               }
            }
            
            a = in.nextLine();
        }
        
        
        
        for(User user : userrecords.values()) {
            System.out.println(String.format("%s",user.getNumber())+" "+String.format("%.1f",user.calCost())+" "+user.calBalance());
        }

    }

}
class UserRecords {
    
    private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
    private ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
    
    
    public void addSendMessageRecords(MessageRecord sendMessageRecord) {
        sendMessageRecords.add(sendMessageRecord);
    }
    
    public void addReceiveMessageRecords(MessageRecord receiveMessageRecord) {
        receiveMessageRecords.add(receiveMessageRecord);
    }

    public ArrayList<MessageRecord> getSendMessageRecords() {
        return sendMessageRecords;
    }

    public void setSendMessageRecords(ArrayList<MessageRecord> sendMessageRecords) {
        this.sendMessageRecords = sendMessageRecords;
    }

    public ArrayList<MessageRecord> getReceiveMessageRecords() {
        return receiveMessageRecords;
    }

    public void setReceiveMessageRecords(ArrayList<MessageRecord> receiveMessageRecords) {
        this.receiveMessageRecords = receiveMessageRecords;
    }

    public UserRecords() {
        super();
        // TODO 自动生成的构造函数存根
    }

    
    
    

}
class User {
    
    private UserRecords userRecords = new UserRecords(); 
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;
    
    public User(String number, ChargeMode chargeMode) {
        this.number = number;
        this.chargeMode = chargeMode;

        // TODO 自动生成的构造函数存根
    }

    public double calBalance() {
        return (balance-calCost());
    }
    
    public double calCost() {
        return chargeMode.calCost(userRecords);
        
    }

    public UserRecords getUserRecords() {
        return userRecords;
    }

    public void setUserRecords(UserRecords userRecords) {
        this.userRecords = userRecords;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public ChargeMode getChargeMode() {
        return chargeMode;
    }

    public void setChargeMode(ChargeMode chargeMode) {
        this.chargeMode = chargeMode;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
    
    
}
abstract class ChargeMode {

    private ArrayList<ChargeRule> chargeRules = new ArrayList<>();
    

    public ArrayList<ChargeRule> getChargeRules() {
        return chargeRules;
    }

    public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
        this.chargeRules = chargeRules;
    }
    
    public double calCost(UserRecords userRecords) {
        return 0;
    }
    
    public double getMonthlyRent() {
        return 0;
    }
    
}
abstract class ChargeRule {

    protected abstract double calCost(ArrayList<MessageRecord> sendMessageRecords);
    
    
    
}
abstract class CommunicationRecord {
    
    protected String callingNumber;
    protected String answerNumber;


    public String getCallingNumber() {
        return callingNumber;
    }

    public void setCallingNumber(String callingNumber) {
        this.callingNumber = callingNumber;
    }

    public String getAnswerNumber() {
        return answerNumber;
    }

    public void setAnswerNumber(String answerNumber) {
        this.answerNumber = answerNumber;
    }
    
}
abstract class MessageChargeRule extends ChargeRule {

    
    public double calCost(ArrayList<MessageRecord> sendmessageRecords) {
        // TODO 自动生成的方法存根
        return 0;
    }


}
class MessageCharging extends ChargeMode{
    
    @Override
    public double calCost(UserRecords userRecords) {
        double sum = 0;
        
        getChargeRules().add(new SendMessageRule());
        
        sum = super.getChargeRules().get(0).calCost(userRecords.getSendMessageRecords());
        
        return sum;
    }

}
class MessageRecord extends CommunicationRecord{
    
    private String message;
    
    public MessageRecord(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
    
}
class SendMessageRule extends MessageChargeRule{
    
    @Override
    public double calCost(ArrayList<MessageRecord> messageRecords) {
        // TODO 自动生成的方法存根
        double sum = 0,b ,n=0;
        for(MessageRecord a:messageRecords) {
            b=Math.ceil(a.getMessage().length()/10.0);
            n=n+b;
        }
        if(n<=3) {
            sum = n*0.1;
        }
        if(n>3&&n<=5) {
            sum = 0.3+(n-3)*0.2;
        }
        if(n>5) {
            sum = 0.7+(n-5)*0.3;
        }
        
        return sum;
    }

}
View Code

 

类图:

 

 

 

心得:难度比前两次小了许多,因为本题只需考虑短信的计费,前两次的复杂的计费规则全都不需要,因此写起来比较简单,就是在判断输入合不合法的正则表达式上废了一些时间。

 

 

 

踩坑心得:

 

题目集8:

 

心得:第一次提交后得了47分,但是有很多东西未考虑。

1.输入无效数据时判断不出来,当作正确数据来处理,比如一月应该就是一个1,而01就是无效输入;

2.如果打电话的用户根本就没开户,那样的话就不应该去计算;

3.计费的方法有缺陷,部分答案算出来是不正确的;

4.当含有无效输入时,应该还要输出余额而不是不输出。

 

题目集9:

 

 

心得:

本次题目的计费规则复杂了很多,由于第一次只有座机与座机的通话,所以不用考虑打电话的座机是否在哪里。但本次包括了手机的套餐,还需要考虑手机的所在地,并且手机接听电话也有收费的情况,在计费规则上需要添加许多东西,相应的正则表达式也需要改变,因此本次写代码所需要的时间较长。并且测试点又一次折磨了我很久,我第一天写完就一直卡在70分。下面是我踩得坑:

1.判断无效输入的正则不适合所有的测试点,当把正则改成最简单的后就多了两分。

2.手机打手机这个计费规则有错误,写的时候没考虑清楚计费规则,因此有部分测试点计算结果出错;

3.接听收费只有省外的电话会接听收费,并且还要考虑接听的电话是否开户了,如果没开户就不需要计算;

4.打电话的号码区号要分清,通过区号来判断是否有漫游。

 

题目集10:

 

 

心得:

本题并没有踩坑,第一次提交有错误是因为从eclipse复制过来没有删掉包,然后删掉包后提交就直接满分了。本题相对于前两次简单很多,除了计费规则在写的时候要考虑一下,剩下的都是跟前面一样。

 

改进建议:

近几次的pta题目集时关于移动业务资费的。其中涉及到了继承、多态、抽象类、集合框架等知识点。本次题目集只有两道题,题目量较少,第一题关于移动业务资费难度较大,因为题目给出的类图是分开的,我们需要先根据给出的类图理解、并且掌握类与类之间的所有关系。其中还包括许多的抽象类,因此第一次写代码所需要的时间较长。第二次的第一题关于移动业务资费难度较大,由于第一次只有座机与座机的通话,所以不用考虑打电话的座机是否在哪里。但本次包括了手机的套餐,还需要考虑手机的所在地,并且手机接听电话也有收费的情况,在计费规则上需要添加许多东西,相应的正则表达式也需要改变,因此本次写代码所需要的时间较长。关于代码我觉得写的还不错,都是按照老师给的类图来写的,这几次关于移动业务资费的题目还是很有很多东西需要提高的,比如对于程序的设计还是漫漫长路,需要我们慢慢去提高,我认为写程序最难的就是设计类与类之间的关系,如果不设计清楚的话,我们很难写出来的,就算写出来也没法看。还有就是我要学会写代码时沉下心来写,不能浮躁,不能畏难,第一看到难度大就退缩,就不敢去写,这样的话是不会有进步的。经过一个学期的Java学习,我感觉学会了很多东西,Java的教课方式与上学期的C语言是完全不一样的,更加注重培养我们自学能力,对于我来说,是一个很大的锻炼。

 

总结:

 

这是这学期最后一次总结,还是有挺多感触的,由于疫情,线下课只上了几次,大部分是在寝室上的。对于Java这门课程说实话这个学期给我带来挺大挑战的,因为我之前从来没有体验过自学这么多东西,也没写过难度那么高的pta,但是经过一学期的锻炼,我感觉还是学到了很多东西的。对于我们老师的教学方式,虽然我不习惯,但是对于培养我们编程能力还是有很大好处的。教学方式不习惯只能自己去适应,不可能因为我们不适应就去改变,这显然不现实。但是我有个小小的建议就是希望老师可以根据我们的学习量酌情减小作业难度,因为这个学期学了三门数学,还有两门英语,有时候pta一道题就得写一整天,那样的话就没啥时间去学别的科目,当然这只是我学期下来的一点建议而已。这次blog写完,这个学期的Java也就差不多结束了,挺感慨的,这个学期被疫情耽误了挺多东西的,但这就是天注定。我的总结就这么多了,希望周五晚上的Java考试可以顺利通过。

 

posted @ 2022-06-16 17:18  HanHan-30  阅读(56)  评论(0)    收藏  举报