大皮

去见、去学、去写。

南昌航空大学 软件学院 pta java 第三阶段总结

    最后一次是电话费系列,总体难度比之前的图形要简单的多得多。就是巨恶心
    最难的就是第一次和第二次,第一次是总体的基础类的实现,第二次是判断种类更多,等到第三次其实难度就骤减了

drawing

    除此之外还新添了小题目,但主要的还是电话计费系列。
    上次已经分析过第六次了,第七次和第八次作业和博客的代码我贴在别的博客里了,链接我贴在下面了。我会把第七次作业和第八次作业的电费计费单独拎出来进行具体分析。

目录

完整作业代码

      第七次作业

      第八次作业

前言

题量

    两次作业题量分别是33,不算很高的题量。

难度和知识点

    第八次高于难度高于其他一次。但总体来说,考察的知识点是逐步增多的,新添了继承和多态还有容器的内容

设计与分析

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

错误处理:

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

这里贴上类图和复杂度

drawing
drawing

贴贴主函数

public class Main {
    static String []tel = {"0792","0793","0794","0795","0796","0797","0798","0799","0701"};
    public static void main(String[] args) throws ParseException {
        Scanner input = new Scanner(System.in);
        String ch = new String();
        ch = input.nextLine();
        ArrayList<User>users = new ArrayList<>();
        SimpleDateFormat date=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
            //   System.out.printf(ch);
            while (!ch.equals("end")) {
                //  System.out.printf(ch+"\n");
                try {
                    if ((ch.matches("^u-[0-9]{11,12} [0-1]$") || ch.matches("(^t-[0]{1}[0-9]{9,11} ((0[0-9]{9,11})|(1[0-9]{10} 0[0-9]{2,3})) [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])$)|(^t-1[0-9]{10} 0[0-9]{2,3} ((0[0-9]{9,11})|(1[0-9]{10} 0[0-9]{2,3})) [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])$)"))) {
                        String[] splitSet = ch.split("-");
                        //String[] splitset2 = splitSet[1].split(" ");
                        if (splitSet[0].equals("u")) {
                            String[] splitSet2 = splitSet[1].split(" ");
                            if(!numEqual(users,splitSet2[0])){
                                try {
                                    users.add(newUesr(splitSet2[0],splitSet2[1]));
                                } catch (Exception a){

                                }

                            }

                        } else {
                                users = newRecord(users, splitSet[1]);
                        }
                    }
                }catch (Exception e){

                }

                ch = input.nextLine();
            }
        Collections.sort(users, new Cmp());
        for(User U:users){
            try {
                System.out.println(U.getNumber()+" "+printDouble(U.calCost())+" "+printDouble(U.calBalance()));
            }
            catch (Exception ps){

            }
        }




    }
     static User newUesr(String ch,String ch2){
        User user = new User(ch);
        if(Objects.equals(ch2, "0"))
            user.chargeMode = new LandlinePhoneCharging();
        else if(Objects.equals(ch2, "1"))
             user.chargeMode = new MobilePhoneCharging();
        return user;
    }
    public static double printDouble(double num) {
        String str = String.format("%.3f",num);
        num = Double.parseDouble(str);
        return num;
    }
    static boolean numEqual(ArrayList<User> User,String num){
        for(User user:User){
            if(user.getNumber().equals(num))
                return true;
        }
        return false;

    }
    static  ArrayList<User> newRecord(ArrayList<User> user,String ch) throws ParseException {
        String[] splitSet = ch.split(" ");

        if(splitSet.length==6) {
            CallRecord callRecord = new CallRecord(splitSet[2], splitSet[3], splitSet[4], splitSet[5], splitSet[0].substring(0, 4), splitSet[1].substring(0, 4));
            for (User U : user) {
                if (U.number.equals(splitSet[0])) {
                    if (callRecord.callingAddressAreaCode.equals("0791")) {
                        U.getUserRecords().addCallingInCityRecords(callRecord);
                        return user;
                    }
                    for (String tel2 : tel) {
                        if (callRecord.answerAddressAreaCode.equals(tel2)) {
                            U.getUserRecords().addCallingInProvinceRecords(callRecord);
                            return user;
                        }
                    }
                    U.getUserRecords().addCallingInLandRecords(callRecord);
                    return user;
                }
            }
        }
        else if(splitSet.length==7){
            if(splitSet[1].length()>splitSet[2].length()){
                CallRecord callRecord = new CallRecord(splitSet[3], splitSet[4], splitSet[5], splitSet[6], splitSet[0].substring(0, 4), splitSet[2]);
                int cNum = judgePlace(splitSet[0].substring(0, 4)),aNum = judgePlace(splitSet[2]);
                for (User U : user) {
                    if (U.number.equals(splitSet[0])) {
                        if(aNum==1){
                              U.getUserRecords().addCallingInCityRecords(callRecord);
                        }
                        if(aNum==2){
                            U.getUserRecords().addCallingInProvinceRecords(callRecord);
                        }
                        if(aNum==0){
                            U.getUserRecords().addCallingInLandRecords(callRecord);
                            for (User U2 : user)
                                if (U2.number.equals(splitSet[1])){
                                    U2.getUserRecords().addAnswerRoamInLandRecords(callRecord);
                                    return user;
                                }
                        }
                        return user;

                    }
                }

            }
            else{
                CallRecord callRecord = new CallRecord(splitSet[3], splitSet[4], splitSet[5], splitSet[6], splitSet[1], splitSet[2].substring(0, 4));
                int cNum = judgePlace(splitSet[1]),aNum = judgePlace(splitSet[2].substring(0, 4));
                for (User U : user) {
                    if (U.number.equals(splitSet[0])) {
                        if(cNum == 0){
                            U.getUserRecords().addCallingRoamInLandRecords(callRecord);
                        }
                        if(cNum == 1){
                            if(aNum ==0){
                                U.getUserRecords().addCallingInLandRecords(callRecord);
                            }
                            else if(aNum ==1){
                                U.getUserRecords().addCallingInCityRecords(callRecord);
                            }
                            else {
                                U.getUserRecords().addCallingInProvinceRecords(callRecord);
                            }
                        }
                        if(cNum == 2){
                            U.getUserRecords().addCallingRoamInProvinceRecords(callRecord);
                        }
                    }
                }
            }
        }
        else if(splitSet.length==8){
            CallRecord callRecord = new CallRecord(splitSet[4], splitSet[5], splitSet[6], splitSet[7], splitSet[1], splitSet[3]);
            int cNum = judgePlace(splitSet[1]),aNum = judgePlace(splitSet[3]);
            for (User U : user) {
                if (U.number.equals(splitSet[0])) {
                    if(cNum == 0){
                        U.getUserRecords().addCallingRoamInLandRecords(callRecord);
                    }
                    if(cNum == 1){
                        if(aNum ==0){
                            U.getUserRecords().addCallingInLandRecords(callRecord);
                        }
                        else if(aNum ==1){
                            U.getUserRecords().addCallingInCityRecords(callRecord);
                        }
                        else {
                            U.getUserRecords().addCallingInProvinceRecords(callRecord);
                        }
                    }
                  //  System.out.printf(aNum+"\n");
                    if(cNum == 2){
                        U.getUserRecords().addCallingRoamInProvinceRecords(callRecord);
                    }
                    if(aNum == 0){
                        for (User U2 : user)
                            if (U2.number.equals(splitSet[2])){
                               // System.out.printf("111");
                                U2.getUserRecords().addAnswerRoamInLandRecords(callRecord);
                                return user;
                            }
                    }
                    return user;
                }
            }
        }
        return user;
}
    User judgeChargeforAnswering(User user,CallRecord callRecord){


        return user;
    }
   static int judgePlace(String ch){
        if (ch.equals("0791")) {
            return 1;
        }
        for (String tel2 : tel) {
            if (ch.equals(tel2)) {
                return 2;
            }
        }
        return 0;

    }

}

电信计费系列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。

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

这里贴上类图和复杂度

drawing
drawing

贴贴主函数

public class Main {
    static String []tel = {"0792","0793","0794","0795","0796","0797","0798","0799","0701"};
    public static void main(String[] args) throws ParseException {
        Scanner input = new Scanner(System.in);
        String ch = new String();
        ch = input.nextLine();
        ArrayList<User>users = new ArrayList<>();
        SimpleDateFormat date=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
            //   System.out.printf(ch);
           while (!ch.equals("end")) {

                try {
                    if ((ch.matches("[u]-1[0-9]{10}\\s[13]")|| ch.matches("[u]-0791[0-9]{7,8}\\s[0]")|| ch.matches("[m]-1[0-9]{10}\\s" + "1[0-9]{10}\\s" + "[0-9a-zA-Z\\s\\.,]+"))) {
                        String[] splitSet = ch.split("-");
                        if (splitSet[0].equals("u")) {
                            String[] splitSet2 = splitSet[1].split(" ");
                            //
                            if(!numEqual(users,splitSet2[0])){
                                try {
                                    users.add(newUesr(splitSet2[0]));
                                } catch (Exception a){

                                }

                            }

                        } else {

                                users = newRecord(users, ch);
                        }
                    }
                }catch (Exception e){

                }

                ch = input.nextLine();
            }
        Collections.sort(users, new Cmp());
        for(User U:users){
            try {
                System.out.println(U.getNumber()+" "+printDouble(U.calCost())+" "+printDouble(U.calBalance()));
            }
            catch (Exception ps){

            }
        }




    }
     static User newUesr(String ch){
        User user = new User(ch);
        // System.out.printf(ch+"\n");
        return user;
    }
    public static double printDouble(double num) {
        String str = String.format("%.3f",num);
        num = Double.parseDouble(str);
        return num;
    }
    static boolean numEqual(ArrayList<User> User,String num){
        for(User user:User){
            if(user.getNumber().equals(num))
                return true;
        }
        return false;

    }
 static  ArrayList<User> newRecord(ArrayList<User> user,String ch) throws ParseException {
        String[] splitSet = ch.split(" ");
        String[] splitSet2 = splitSet[0].split("-");

        //System.out.printf("1");

        for (User U : user) {
            if (U.number.equals(splitSet2[1])) {
                int len = ch.length()-splitSet[0].length()-splitSet[1].length()-2;
                if(len%10!=0)
                    len = (len/10)+1;
                else len=(len/10);
                U.masnum+=len;
                return user;
            }
        }
        return user;
    }
    User judgeChargeforAnswering(User user,CallRecord callRecord){


        return user;
    }
   static int judgePlace(String ch){
        if (ch.equals("0791")) {
            return 1;
        }
        for (String tel2 : tel) {
            if (ch.equals(tel2)) {
                return 2;
            }
        }
        return 0;

    }

}

采坑心得

    总的来说难度不是很高,只要细心就能过。
    就是很麻烦,不细心会很折磨。

改进建议

    题目承接很好,电信三次题目逐渐综合,第三次是缺失功能,不然还是能整很麻烦的,建议把第三题的功能补全。

总结

    时间管理错误,导致我有整整一题没写完,很糟糕的体验,但更糟糕的是疯狂改类改的我头昏脑涨。对于我个人知识点的掌握来说,是提升十分大的,使我掌握了多态和继承,也加深了对于封装的认知,提高了独立代码能力,以及个人综合能力。

    完结了捏,没有下次了。

drawing

posted on 2022-12-07 11:51  大皮QAQ  阅读(61)  评论(0)    收藏  举报

导航

回到顶部叭QAQ