题目集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等网络资源帮助我们解决问题,提升自我。

浙公网安备 33010602011771号