题目集6~8的总结性Blog

一:前言:

第六次作业

知识点:第一题考察电信计费系列中的座机计费,其中主要用到了正则表达式的使用,以及 SimpleDateFormat 类 以及 Data 类 的使用等知识;并根据老师所给的类图设计代码和各类之间的关系。第二题考察的是“继承与多态”的内容,主要是模拟实现一个容器类层次结构,并进行接口的实现、抽象方法重写和多态机制测试。

题量:较少。

难度:第一题有难度,第二题的难度较小。

第七次作业

知识点:第一题考察电信计费系列中的座机计费和手机计费结合,其中主要用到了正则表达式的使用,以及 SimpleDateFormat 类 以及 Data 类 的使用等知识;并根据老师所给的类图设计代码和各类之间的关系。第二题考察的是重复信息的判断与删除。第三题考察的是利用迭代器来实现遍历链表操作。

题量:较少。

难度:第一题有难度,第二、三题的难度较小。

第八次作业

知识点:第一题考察电信计费系列中的短信计费,其中主要用到了正则表达式的使用等知识;并根据老师所给的类图设计代码和各类之间的关系。第二题考察的是类与类之间的相互关系。第三题考察的是多态知识。

题量:较少。

难度:这次大作业的难度较小,第一题是前两次作业电信计费系列的简化版;第二、三题的难度也较小。

二.设计与分析

(1)第六次作业的7-1

第一步:对输入的字符串进行格式判断。

我的选择是分别设计格式判断类,如下:

class 输入格式 {
    
}

class 号码格式 {
    private static String a = "[0-9]*";
    
    public static boolean judge1(String s) {
        String str;
        if((s.length()==11||s.length()==12)&&s.matches(a)) {
            str=s.substring(0, 4);
            if(str.equals("0791"))
                return true;
        }
        return false;
    }
    
    public static boolean judge2(String s) {
        if((s.length()==11||s.length()==12)&&s.matches(a)) {
                return true;
        }
        return false;
    }
}

class 时间格式 {
    public static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    
    public static boolean judge(String s) {
    try {
        sdf1.parse(s);
        return true;
    }catch(Exception e){
        return false;
    }
    }
}

其中号码和时间均有相应的判断方法judge(String s)来对相应输入进行判断。

第二步:对输入的字符串进行处理,进行信息的提取。

我的选择是设计trans类,设计了多个函数进行字符串转化,如下:

class 输入处理 {
    static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    
    public static void trans(String s) {
        if(s.charAt(1)=='-') {
            if(s.charAt(0)=='u')
                trans1(s.substring(2));
            else if(s.charAt(0)=='t'){
                try {
                    trans2(s.substring(2));
                }catch (ParseException e) {
//                      System.out.println(e.getMessage());
                }
            }
        }
    }
    
    public static void trans1(String s) {
        boolean zj=true;
        String[] str =s.split(" ");
        规则1 g = new 规则1();
        if(str.length==2&&str[1].equals("0")&&号码格式.judge1(str[0])) {
            用户 a=new 用户(str[0],g);
            for(用户 p : 数据记录.All2) {
                if(p.number.equals(a.number))
                    zj=false;
            }
            if(zj)
                数据记录.All2.add(a);
        }
    }
    
    public static void trans2(String s) throws ParseException {
        String[] str =s.split(" ");
        if(str.length==6) {
            str[2]+=" "+str[3];
            str[4]+=" "+str[5];
            if(号码格式.judge1(str[0])&&号码格式.judge2(str[1])&&时间格式.judge(str[2])&&时间格式.judge(str[4])){
                通话记录 o=new 通话记录();
                o.呼叫区号=str[0].substring(0, 4);o.接听区号=str[1].substring(0, 4);
                o.呼叫号码=str[0];o.接听号码=str[1];
                o.开始时间=sdf1.parse(str[2]);o.结束时间=sdf1.parse(str[4]);
                数据记录.All1.add(o);
            }
        }
    }
}

第三步:对各个用户的数据进行计算,即用户的消费增加,并用余额减去消费。

我的选择是设计单独的一个类,因为只有座机和通话记录,故只写了通信记录的方法,如下:

class 计费方式 {
    public static SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    public static void jisuan() {
        通话记录 e1;
        短信记录 e2;
        for(通信记录 e:数据记录.All1) {
            if(!e.呼叫号码.equals(e.接听号码))
                if(e instanceof 通话记录) {
                    e1 = (通话记录)e;
                    chuli(e1);
                }
                else {
                    e2 = (短信记录)e;
                    chuli(e2);
                }
        }
    }
    
    public static void chuli(通话记录 e) {
        double rminutes = (e.结束时间.getTime() - e.开始时间.getTime()) / (1000*60*1.0);
        int minutes = (int) (rminutes);
        if(rminutes-minutes>0) minutes+=1;
        if(minutes>0)
            for(用户 f:数据记录.All2) {
                if(f.number.equals(e.呼叫号码)) {
                    if(e.接听区号.equals("0791"))
                        f.xiaofei+=output(minutes*f.chargeMode.shioutm);
                    else if(e.接听区号.substring(0,3).equals("079")||e.接听区号.equals("0701"))
                        f.xiaofei+=output(minutes*f.chargeMode.shenoutm);
                    else
                        f.xiaofei+=output(minutes*f.chargeMode.guooutm);
                }
            }
    }
    
    public static void chuli(短信记录 e) {
        
    }

第四步:对所有的用户根据号码大小进行排序,我的选择是重写了Sort_length类的compare方法如下:

class Sort_length implements Comparator<用户>{
        @Override
        public int compare(用户 用户1,用户 用户2) {
            return 用户1.number.compareTo(用户2.number);
        }
}

这样只需要使用

数据记录.All2.sort(new Sort_length());

即可对用户链表进行排序操作。

最后再输出所有用户的信息即可。

(2)第七次作业的7-1

第一步:对输入的字符串进行格式判断。

我的选择是分别设计格式判断类,如下:

class 输入格式 {
    
}

class 号码格式 {
    private static String a = "[0-9]*";
    
    public static boolean judge1(String s) {
        String str;
        if((s.length()==11||s.length()==12)&&s.matches(a)&&s.charAt(0)=='0') {
            str=s.substring(0, 4);
            if(str.equals("0791"))
                return true;
        }
        return false;
    }
//    (s.length()==11||s.length()==12)&&
    public static boolean judge2(String s) {
        if(s.matches(a)&&s.charAt(0)=='0') {
                return true;
        }
        return false;
    }
    
    public static boolean judge3(String s) {
        if((s.length()==11)&&s.matches(a)) {
            return true;
        }
        return false;
    }
}

class 时间格式 {
    public static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    
    public static boolean judge(String s) {
        if(!s.matches("\\d{4}.(([1-9])|(1[0-2])){1,2}.(([1-9])|([1-2][0-9])|(3[0-1])){1,2} (([0-1]?[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])"))
            return false;
        try {
            sdf1.parse(s);
            return true;
        }catch(Exception e){
            return false;
        }
    }
}

其中号码和时间均有相应的判断方法judge(String s)来对相应输入进行判断。

第二步:对输入的字符串进行处理,进行信息的提取。

我的选择是设计trans类,设计了多个函数进行字符串转化,如下:

class 输入处理 {
    static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    
    public static void trans(String s) {
        if(s.charAt(1)=='-') {
            if(s.charAt(0)=='u')
                try {
                    trans1(s.substring(2));
                }catch (ParseException e) {
//                     System.out.println(e.getMessage());
                }
            else if(s.charAt(0)=='t') {
                try {
                    trans2(s.substring(2));
                }catch (ParseException e) {
//                     System.out.println(e.getMessage());
                }
            }
            else if(s.charAt(0)=='m') {
                try {
                    trans3(s.substring(2));
                }catch (ParseException e) {
//                     System.out.println(e.getMessage());
                }
            }
        }
    }
    
    public static void trans1(String s) throws ParseException {
        boolean zj=true;
        String[] str =s.split(" ");
        规则1 g = new 规则1();
        规则2 v = new 规则2();
        if(str.length==2&&str[1].equals("0")&&号码格式.judge1(str[0])) {
            用户 a=new 用户(str[0],g);
            for(用户 p : 数据记录.All) {
                if(p.number.equals(a.number))
                    zj=false;
            }
            if(zj)
                数据记录.All.add(a);
        }
        else if(str.length==2&&str[1].equals("1")&&号码格式.judge3(str[0])) {
            用户 a=new 用户(str[0],v);
            for(用户 p : 数据记录.All) {
                if(p.number.equals(a.number))
                    zj=false;
            }
            if(zj)
                数据记录.All.add(a);
        }
    }
    
    public static void trans2(String s) throws ParseException {
        String[] str =s.split(" ");
        if(str.length>5&&str.length<9) {
            str[str.length-4]+=" "+str[str.length-3];
            str[str.length-2]+=" "+str[str.length-1];
            通话记录 o;
            if(时间格式.judge(str[str.length-4])&&时间格式.judge(str[str.length-2])) {
            if(号码格式.judge1(str[0])&&号码格式.judge2(str[1])){
                o=new 通话记录();
                o.呼叫区号=str[0].substring(0, 4);o.接听区号=str[1].substring(0, 4);
                o.呼叫号码=str[0];o.接听号码=str[1];
            }
            else if(号码格式.judge1(str[0])&&号码格式.judge3(str[1])) {
                o=new 通话记录();
                o.呼叫区号=str[0].substring(0, 4);o.接听区号=str[2];
                o.呼叫号码=str[0];o.接听号码=str[1];
            }
            else if(号码格式.judge3(str[0])&&号码格式.judge1(str[2])) {
                o=new 通话记录();
                o.呼叫区号=str[1];o.接听区号=str[1].substring(0, 4);
                o.呼叫号码=str[0];o.接听号码=str[2];
            }
            else if(号码格式.judge3(str[0])&&号码格式.judge3(str[2])){
                o=new 通话记录();
                o.呼叫区号=str[1];o.接听区号=str[3];
                o.呼叫号码=str[0];o.接听号码=str[2];
            }
            else
                return;
            o.开始时间=sdf1.parse(str[str.length-4]);o.结束时间=sdf1.parse(str[str.length-2]);
            for(用户 f:数据记录.All)
                if(f.number.equals(o.呼叫号码)||f.number.equals(o.接听号码)) {
                    f.All.add(o);
                }
            }
        }
    }
    
    public static void trans3(String s) throws ParseException {
        
    }
}

第三步:对各个用户的数据进行计算,即用户的消费增加,并用余额减去消费。

我的选择是设计单独的一个类,因为无短信记录,故只写了手机和座机的通信记录的方法,如下:

class 计费方式 {
    public static SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    public static void jisuan() {
        通话记录 e1;
        短信记录 e2;
        for(用户 f:数据记录.All)
            if(号码格式.judge1(f.number))
                for(通信记录 e:f.All) {
                    if(e instanceof 通话记录) {
                        e1 = (通话记录)e;
                        chuli1(f,e1);
                    }
                }
            else if(号码格式.judge3(f.number))
                for(通信记录 e:f.All) {
                    if(e instanceof 通话记录) {
                        e1 = (通话记录)e;
                        chuli2(f,e1);
                    }
                    else {
                        e2 = (短信记录)e;
                        chuli(f,e2);
                    }
                }
    }
    
    public static void chuli1(用户 f,通话记录 e) {
        double rminutes = (e.结束时间.getTime() - e.开始时间.getTime()) / (1000*60*1.0);
        int minutes = (int) (rminutes);
        if(rminutes-minutes>0) minutes+=1;
        if(minutes>0) {
            if(e.呼叫号码.equals(f.number))
                if(e.接听区号.equals("0791"))
                    f.xiaofei+=minutes*f.chargeMode.shioutm;
                else if(e.接听区号.substring(0,3).equals("079")||e.接听区号.equals("0701"))
                    f.xiaofei+=minutes*f.chargeMode.shenoutm;
                else
                    f.xiaofei+=minutes*f.chargeMode.guooutm;
        }
    }
    
    public static void chuli2(用户 f,通话记录 e) {
        double rminutes = (e.结束时间.getTime() - e.开始时间.getTime()) / (1000*60*1.0);
        int minutes = (int) (rminutes);
        if(rminutes-minutes>0) minutes+=1;
        if(minutes>0) {
            if(e.呼叫号码.equals(f.number))
                if(e.呼叫区号.equals("0791")) {
                    if(e.接听区号.equals("0791"))
                        f.xiaofei+=minutes*f.chargeMode.shioutm;
                    else if(e.接听区号.substring(0,3).equals("079")||e.接听区号.equals("0701"))
                        f.xiaofei+=minutes*f.chargeMode.shenoutm;
                    else
                        f.xiaofei+=minutes*f.chargeMode.guooutm;
                }
                else if(e.呼叫区号.substring(0,3).equals("079")||e.呼叫区号.equals("0701")) {
                    f.xiaofei+=minutes*f.chargeMode.outshi;
                }
                else
                    f.xiaofei+=minutes*f.chargeMode.outshen;
            else if(!(e.接听区号.substring(0,3).equals("079")||e.接听区号.equals("0701")))
                f.xiaofei+=minutes*f.chargeMode.guoinm;
        }
    }
    
    public static void chuli(用户 f,短信记录 e) {
        
    }
}

第四步:对所有的用户根据号码大小进行排序,我的选择是重写了Sort_length类的compare方法如下:

class Sort_length implements Comparator<用户>{
        @Override
        public int compare(用户 用户1,用户 用户2) {
            return 用户1.number.compareTo(用户2.number);
        }
}

这样只需要使用

数据记录.All2.sort(new Sort_length());

即可对用户链表进行排序操作。

最后再输出所有用户的信息即可。

(3)第七次作业的7-3

第一步:引入相关类包

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Iterator;
import java.util.Collection;

第二步:修改相应代码

//定义员工类
class Employee {

    private String name;
    private int age;

    public Employee() {
        super();
    }

    public Employee(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

//主函数
public class Main {

    public static void main(String[] args) {
                // 1、创建有序集合对象
                Collection<Employee> c = new ArrayList<Employee>();
                Scanner sc = new Scanner(System.in);
                String employeeName;
                int employeeAge;
                Employee employee;
      // 创建3个员工元素对象
        for (int i = 0; i < 3; i++) {
            
            employeeName = sc.next();
            employeeAge = sc.nextInt();
            
            employee = new Employee(employeeName, employeeAge);
            c.add(employee);
        }            
                
                sc.close();
                
                // 2、创建迭代器遍历集合
                Iterator<Employee> it=c.iterator();
                
                //3、遍历
                while (it.hasNext()) {
                    
                    //4、集合中对象未知,向下转型
                    Employee e =  (Employee) it.next();
                    
                    System.out.println(e.getName() + "---" + e.getAge());
                }
    }

}

(4)第八次作业的7-1

第一步:对输入的字符串进行格式判断。

我的选择是分别设计格式判断类,如下:

class numgs {
    static String quhao = "0[0-9]+";
    static String a = "0[0-9]+";
    static String b = "1[0-9]{10}";
}

class timegs {
    public static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    public static String S = "\\d{4}.\\d{1,2}.\\d{1,2} (([0-1]?[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])";
    
    public static boolean judge(String s) {
        if(!s.matches("\\d{4}.\\d{1,2}.\\d{1,2} (([0-1]?[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])"))
            return false;
        return true;
    }
}

第一步:对输入的字符串进行处理。

如下:

class shurucl {
    
    static void trans(String s) {
        if(s.charAt(0)=='u')
            trans1(s.substring(2));
        else if(s.charAt(0)=='t')
            try {
                trans2(s.substring(2));
            }catch(Exception e) {
            }
        else if(s.charAt(0)=='m')
            trans3(s.substring(2));
        else
            return;
    }
    
    static void trans1(String s) {
        boolean tu=true;
        String[] str =s.split(" ");
        User a = null;
        if(str[1].equals("0"))
            a = new User(str[0],new Usertc1());
        else if(str[1].equals("1"))
            a = new User(str[0],new Usertc2());
        else if(str[1].equals("3"))
            a = new User(str[0],new Usertc3());
        for(User e:jls.All)
            if(e.number.equals(str[0]))
                tu=false;
        if(tu)
            jls.All.add(a);
    }
    
    static void trans2(String s) throws ParseException {
        thjl jl=null;
        String[] str;
        if(s.matches(numgs.a+" "+numgs.a+" "+timegs.S+" "+timegs.S)) {
            str=s.split(" ");
            if(timegs.judge(str[2]+" "+str[3])&&timegs.judge(str[4]+" "+str[5])) {
            jl=new thjl();
            jl.呼叫号码=str[0];jl.接听号码=str[1];
            jl.呼叫区号=str[0].substring(0,4);jl.接听区号=str[1].substring(0,4);
            jl.开始时间=timegs.sdf1.parse(str[2]+" "+str[3]);jl.结束时间=timegs.sdf1.parse(str[4]+" "+str[5]);
        }}
        else if(s.matches(numgs.b+" "+numgs.quhao+" "+numgs.a+" "+timegs.S+" "+timegs.S)) {
            str=s.split(" ");
            if(timegs.judge(str[3]+" "+str[4])&&timegs.judge(str[5]+" "+str[6])) {
            jl=new thjl();
            jl.呼叫号码=str[0];jl.接听号码=str[2];
            jl.呼叫区号=str[1];jl.接听区号=str[2].substring(0,4);
            jl.开始时间=timegs.sdf1.parse(str[3]+" "+str[4]);jl.结束时间=timegs.sdf1.parse(str[5]+" "+str[6]);
        }}
        else if(s.matches(numgs.a+" "+numgs.b+" "+numgs.quhao+" "+timegs.S+" "+timegs.S)) {
            str=s.split(" ");
            if(timegs.judge(str[3]+" "+str[4])&&timegs.judge(str[5]+" "+str[6])) {
            jl=new thjl();
            jl.呼叫号码=str[0];jl.接听号码=str[1];
            jl.呼叫区号=str[0].substring(0,4);jl.接听区号=str[2];
            jl.开始时间=timegs.sdf1.parse(str[3]+" "+str[4]);jl.结束时间=timegs.sdf1.parse(str[5]+" "+str[6]);
        }}
        else if(s.matches(numgs.b+" "+numgs.quhao+" "+numgs.b+" "+numgs.quhao+" "+timegs.S+" "+timegs.S)) {
            str=s.split(" ");
            if(timegs.judge(str[4]+" "+str[5])&&timegs.judge(str[6]+" "+str[7])) {
            jl=new thjl();
            jl.呼叫号码=str[0];jl.接听号码=str[2];
            jl.呼叫区号=str[1];jl.接听区号=str[3];
            jl.开始时间=timegs.sdf1.parse(str[4]+" "+str[5]);jl.结束时间=timegs.sdf1.parse(str[6]+" "+str[7]);
        }}
        if(jl!=null)
        for(User f:jls.All) {
            if(f.number.equals(jl.呼叫号码)||f.number.equals(jl.接听号码)) {
                f.All.add(jl);
            }
        }
    }
    
    static void trans3(String s) {
        dxjl a=null;
        if(s.matches(numgs.b+" "+numgs.b+" "+"[A-Za-z0-9,. ]+")) {
            a=new dxjl();
            a.呼叫号码=s.substring(0,11);a.接听号码=s.substring(12,23);
            a.neirong=s.substring(24);
        }
        if(a!=null)
        for(User f:jls.All) {
            if(f.number.equals(a.呼叫号码)||f.number.equals(a.接听号码)) {
                f.All.add(a);
            }
        }
    }
}

之后步骤与电信计费系列前两题雷同,不一一赘述,下面附上本题所有代码:

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        while(!s.equals("end")) {
            try {
                shurucl.trans(s);
            }catch(Exception e){
            }
            s=in.nextLine();
        }
        jisuan();
        jls.All.sort(new Sort_length());
        for(User e:jls.All) {
            System.out.println(e.number+" "+output(e.xiaofei)+" "+output(e.balance));
        }
        in.close();
    }
    
    static void jisuan() {
        thjl th;dxjl dx;
        for(User e:jls.All) {
            if(e.chargeMode instanceof Usertc1)
            for(txjl a:e.All) {
                if(a instanceof thjl) {
                    th= (thjl)a;
                    jisuan1(e,th);
                }
            }
            else if(e.chargeMode instanceof Usertc2) {
                for(txjl a:e.All) {
                    if(a instanceof thjl) {
                        th= (thjl)a;
                        if(th.呼叫号码.equals(e.number))
                            if(th.呼叫区号.equals("0791"))
                                jisuan1(e,th);
                            else
                                jisuan2(e,th);
                        else if(!th.接听区号.matches("079[0-9]")&&!th.接听区号.equals("0701")) {
                            double rminutes = (th.结束时间.getTime() - th.开始时间.getTime()) / (1000*60*1.0);
                            int minutes = (int) (rminutes);
                            if(rminutes-minutes>0) minutes+=1;
                            e.xiaofei+=minutes*e.chargeMode.guoinm;
                        }
                    }
                    
                }
            }
            else {
                jisuan3(e);
            }
            e.balance-=e.xiaofei;
            e.balance-=e.chargeMode.yuezu;
        }
    }
    
    static void jisuan1(User e, thjl a){
        double rminutes = (a.结束时间.getTime() - a.开始时间.getTime()) / (1000*60*1.0);
        int minutes = (int) (rminutes);
        if(rminutes-minutes>0) minutes+=1;
        if(a.呼叫号码.equals(e.number))
            if(a.接听区号.equals("0791"))
                e.xiaofei+=minutes*e.chargeMode.shioutm;
            else if(a.接听区号.substring(0,3).equals("079")||a.接听区号.equals("0701"))
                e.xiaofei+=minutes*e.chargeMode.shenoutm;
            else
                e.xiaofei+=minutes*e.chargeMode.guooutm;
    }
    
    static void jisuan2(User e, thjl a){
        double rminutes = (a.结束时间.getTime() - a.开始时间.getTime()) / (1000*60*1.0);
        int minutes = (int) (rminutes);
        if(rminutes-minutes>0) minutes+=1;
        if(a.呼叫区号.substring(0,3).equals("079")||a.呼叫区号.equals("0701"))
            e.xiaofei+=minutes*e.chargeMode.outshi;
        else
            e.xiaofei+=minutes*e.chargeMode.outshen;
    }
    
    static void jisuan3(User e){
        dxjl a;int sum=0;
        for(txjl j: e.All) {
            if(j.呼叫号码.equals(e.number)) {
                a=(dxjl)j;
                double len = a.neirong.length()/10.0;
                int lens =  (int) (len);
                if(len-lens>0) lens+=1;
                sum+=lens;
            }
            }
            if(sum>5)
                e.xiaofei+=0.7+(sum-5)*e.chargeMode.duanxin3;
            else if(sum>3)
                e.xiaofei+=0.3+(sum-3)*e.chargeMode.duanxin2;
            else
                e.xiaofei+=sum*e.chargeMode.duanxin1;
    }
    
    static double output(double i) {
        DecimalFormat df = new DecimalFormat("#.00");
        return Double.valueOf(df.format(i));
    }
}

class Sort_length implements Comparator<User>{
        @Override
        public int compare(User 用户1,User 用户2) {
            return 用户1.number.compareTo(用户2.number);
        }
}

class shurucl {
    
    static void trans(String s) {
        if(s.charAt(0)=='u')
            trans1(s.substring(2));
        else if(s.charAt(0)=='t')
            try {
                trans2(s.substring(2));
            }catch(Exception e) {
            }
        else if(s.charAt(0)=='m')
            trans3(s.substring(2));
        else
            return;
    }
    
    static void trans1(String s) {
        boolean tu=true;
        String[] str =s.split(" ");
        User a = null;
        if(str[1].equals("0"))
            a = new User(str[0],new Usertc1());
        else if(str[1].equals("1"))
            a = new User(str[0],new Usertc2());
        else if(str[1].equals("3"))
            a = new User(str[0],new Usertc3());
        for(User e:jls.All)
            if(e.number.equals(str[0]))
                tu=false;
        if(tu)
            jls.All.add(a);
    }
    
    static void trans2(String s) throws ParseException {
        thjl jl=null;
        String[] str;
        if(s.matches(numgs.a+" "+numgs.a+" "+timegs.S+" "+timegs.S)) {
            str=s.split(" ");
            if(timegs.judge(str[2]+" "+str[3])&&timegs.judge(str[4]+" "+str[5])) {
            jl=new thjl();
            jl.呼叫号码=str[0];jl.接听号码=str[1];
            jl.呼叫区号=str[0].substring(0,4);jl.接听区号=str[1].substring(0,4);
            jl.开始时间=timegs.sdf1.parse(str[2]+" "+str[3]);jl.结束时间=timegs.sdf1.parse(str[4]+" "+str[5]);
        }}
        else if(s.matches(numgs.b+" "+numgs.quhao+" "+numgs.a+" "+timegs.S+" "+timegs.S)) {
            str=s.split(" ");
            if(timegs.judge(str[3]+" "+str[4])&&timegs.judge(str[5]+" "+str[6])) {
            jl=new thjl();
            jl.呼叫号码=str[0];jl.接听号码=str[2];
            jl.呼叫区号=str[1];jl.接听区号=str[2].substring(0,4);
            jl.开始时间=timegs.sdf1.parse(str[3]+" "+str[4]);jl.结束时间=timegs.sdf1.parse(str[5]+" "+str[6]);
        }}
        else if(s.matches(numgs.a+" "+numgs.b+" "+numgs.quhao+" "+timegs.S+" "+timegs.S)) {
            str=s.split(" ");
            if(timegs.judge(str[3]+" "+str[4])&&timegs.judge(str[5]+" "+str[6])) {
            jl=new thjl();
            jl.呼叫号码=str[0];jl.接听号码=str[1];
            jl.呼叫区号=str[0].substring(0,4);jl.接听区号=str[2];
            jl.开始时间=timegs.sdf1.parse(str[3]+" "+str[4]);jl.结束时间=timegs.sdf1.parse(str[5]+" "+str[6]);
        }}
        else if(s.matches(numgs.b+" "+numgs.quhao+" "+numgs.b+" "+numgs.quhao+" "+timegs.S+" "+timegs.S)) {
            str=s.split(" ");
            if(timegs.judge(str[4]+" "+str[5])&&timegs.judge(str[6]+" "+str[7])) {
            jl=new thjl();
            jl.呼叫号码=str[0];jl.接听号码=str[2];
            jl.呼叫区号=str[1];jl.接听区号=str[3];
            jl.开始时间=timegs.sdf1.parse(str[4]+" "+str[5]);jl.结束时间=timegs.sdf1.parse(str[6]+" "+str[7]);
        }}
        if(jl!=null)
        for(User f:jls.All) {
            if(f.number.equals(jl.呼叫号码)||f.number.equals(jl.接听号码)) {
                f.All.add(jl);
            }
        }
    }
    
    static void trans3(String s) {
        dxjl a=null;
        if(s.matches(numgs.b+" "+numgs.b+" "+"[A-Za-z0-9,. ]+")) {
            a=new dxjl();
            a.呼叫号码=s.substring(0,11);a.接听号码=s.substring(12,23);
            a.neirong=s.substring(24);
        }
        if(a!=null)
        for(User f:jls.All) {
            if(f.number.equals(a.呼叫号码)||f.number.equals(a.接听号码)) {
                f.All.add(a);
            }
        }
    }
}

class numgs {
    static String quhao = "0[0-9]+";
    static String a = "0[0-9]+";
    static String b = "1[0-9]{10}";
}

class timegs {
    public static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    public static String S = "\\d{4}.\\d{1,2}.\\d{1,2} (([0-1]?[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])";
    
    public static boolean judge(String s) {
        if(!s.matches("\\d{4}.\\d{1,2}.\\d{1,2} (([0-1]?[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])"))
            return false;
        return true;
    }
}

class User {
    String number;
    double balance;
    Usertc chargeMode;
    double xiaofei;
    ArrayList<txjl> All = new  ArrayList<txjl>();
    
    User(String number,Usertc chargeMode) {
        this.number=number;
        this.balance=100;
        this.chargeMode=chargeMode;
        this.xiaofei=0;
    }
    
    void jisuan() {
        balance-=chargeMode.yuezu;
        balance-=xiaofei;
    }
}

class jls {
    static ArrayList<User> All = new  ArrayList<User>();
}

abstract class Usertc {
    double yuezu=0;
    double shioutm=0;
    double shenoutm=0;
    double guooutm=0;
    double outshi=0;
    double outshen=0;
    double shiinm=0;
    double sheninm=0;
    double guoinm=0;
    double duanxin1=0;
    double duanxin2=0;
    double duanxin3=0;
}

class Usertc1 extends Usertc {
    Usertc1() {
        yuezu=20;
        shioutm=0.1;
        shenoutm=0.3;
        guooutm=0.6;
    }
}

class Usertc2 extends Usertc {
    Usertc2() {
        yuezu=15;
        shioutm=0.1;
        shenoutm=0.2;
        guooutm=0.3;
        outshi=0.3;
        outshen=0.6;
        guoinm=0.3;
        
    }
}

class Usertc3 extends Usertc {
    Usertc3() {
        duanxin1=0.1;
        duanxin2=0.2;
        duanxin3=0.3;
    }
}

class txjl {
    String 呼叫号码;
    String 接听号码;
}

class thjl extends txjl {
    Date 开始时间;
    Date 结束时间;
    String 呼叫区号;
    String 接听区号;
}

class dxjl extends txjl {
    String neirong;
}

 

三.踩坑心得

1、对于需要进行字符判断的题目,要使用正则表达式将全段输入来进行判断,而不是简单的判断长度、各段格式等等的片面内容,同时这也导致我在电信计费题目中对无效输入判断不完善,这一点应当改进。

四.改进建议

1、以后在编写代码之前我应当要思考清楚该怎么写,让真正编写代码时思路清晰,目标明确,同时也能够减少后续代码的修改。这一点是我当前急需改进的,我认为有明确的思路是编写一个好代码最基础的。

2、在编写代码是要考虑到安全问题,我写的代码和老师写的代码相比,类的各种属性都是公开的,这在安全性上是很差的,这点在实际编写程序时是很值得注意的。

五.总结

1、这几次代码的设计让我认识到面向对象与面向过程的区别,对于面向对象来说,类的设计至关重要,能否把类的基础设计好是对后续代码编写难易、好坏有极大的影响。

2、我开始意识到继承与多态在处理一些问题时的优点。正如这次电信计费系列题目来说,根据老师给的类图在编写代码时,尤其是后期增加功能时,使用了继承与多态之后,代码有了很大的简化,思路也变得清晰了很多。

3、在算法上,即处理问题上,我也需要加强练习,逐渐培养自己的模式,完善自己解决问题的方法,提升自己这方面的能力。

4、课外我要多多了解其他的知识,我意识到光靠老师上课时讲的东西时远远不够的,自己在课外也要不断学习,比如继承与多态的知识、图像等方面的知识、以及更底层的一些知识等等,不断增强自我学习能力,利用百度、csdn等网络资源帮助我们解决问题,提升自我。

posted @ 2022-06-09 21:52  xieweimeng  阅读(45)  评论(0)    收藏  举报