BLOG-3

一、前言

                     电信计费系列考察了类图的设计与关联,如继承,同时考察了抽象类的创建与使用及正则表达式的使用。题量适中,难度适中。

                    1. 电信计费系列   1-座机计费

                        作为第一次作业,本次座机计费为接下来的两次作业搭好框架,大多数类的设计都在此次作用中,如包括属性: userRecords (用户记录)、balance(余额)、chargeMode(计费方式)、number(号码)的User类,计费方式的抽象类ChargeMode,保存用户各种通话的记录的用户记录类UserRecords。抽象的通讯记录类CommunicationRecord,通话记录类CallRecord、短信记录类MessageRecord是它的子类。计费方式所包含的各种计费规则的集合的抽象类为chargeRules,计费方式所包含的各种计费规则类为callRecords,     座机拨打市内、省内、省外电话的计费规则类LandPhoneInCityRule、LandPhoneInProvinceRule、LandPhoneInLandRule三个类分别是其子类,用于实现这三种情况的费用计算。

                    2.电信计费系列   2-手机+座机计费

                        第二次作业建立在第一次基础上,新加入手机拨号。

                        月租15元,市内省内接电话均免费,市内拨打市内电话0.1元/分钟,市内拨打省内电话0.2元/分钟,市内拨打省外电话0.3元/分钟,省内漫游打电话0.3元/分钟,省外漫游接听0.3元/分钟,省外漫游拨打0.6元/分钟。注:被叫电话属于市内、省内还是国内由被叫电话的接听地点区号决定,如,南昌市手机用户13307912264在区号为020的广州接听了电话,主叫号码应被计算为拨打了一个省外长途,同时,手机用户13307912264也要被计算省外接听漫游费。

                   3.电信计费系列    3-短信计费

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

【参考类图】

          

 

 

 

 

 

 

 

二、设计与分析

                1.电信计费系列   1-座机计费                  

     

复制代码

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException{
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
ArrayList<User> Users=new ArrayList<User>();
Scanner sc=new Scanner(System.in);
String a=sc.nextLine();
int m = 0;
while(true)
{
Users.add(new User());
int tem=a.indexOf(' ');
Users.get(m).number=a.substring(2,tem);
Users.get(m).chargeMode=new LandlinePhoneCharging();
m++;
a=sc.nextLine();
if(a.charAt(0)!='u')
break;
}
String c=a;

while(c.charAt(0)=='t')
{
if(c.matches("t-[\\d]{11,12}\\s[\\d]{11,12}\\s[\\d]{4}.[\\d]{1,2}.[\\d]{1,2}\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s[\\d]{4}.[\\d]{1,2}.[\\d]{1,2}\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))
{
int n=0;
int size=Users.size();
while(n<size)
{
try
{

int tem=c.indexOf(' ');
if(Users.get(n).number.equals(c.substring(2,tem)))
{

if(User.numaeral(c.substring(tem+2,tem+5))==0)
{

tem=c.indexOf(' ',tem+1);
int t=tem;
tem=c.indexOf(' ',tem+1);
tem=c.indexOf(' ',tem+1);
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int size2=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(size2-1).startTime=SimpleDateFormat.parse(c.substring(t+1, tem));
Users.get(n).userRecords.callingInCityRecords.get(size2-1).endTime=SimpleDateFormat.parse(c.substring(tem+1));
}
else if(User.numaeral(c.substring(tem+2,tem+5))==1)
{

tem=c.indexOf(' ',tem+1);
int t=tem;
tem=c.indexOf(' ',tem+1);
tem=c.indexOf(' ',tem+1);
Users.get(n).userRecords.callingInProvinceRecords.add(new CallRecord());
int size2=Users.get(n).userRecords.callingInProvinceRecords.size();
Users.get(n).userRecords.callingInProvinceRecords.get(size2-1).startTime=SimpleDateFormat.parse(c.substring(t+1, tem));
Users.get(n).userRecords.callingInProvinceRecords.get(size2-1).endTime=SimpleDateFormat.parse(c.substring(tem+1));

}
else
{

tem=c.indexOf(' ',tem+1);
int t=tem;
tem=c.indexOf(' ',tem+1);
tem=c.indexOf(' ',tem+1);
Users.get(n).userRecords.callingInLandRecords.add(new CallRecord());
int size2=Users.get(n).userRecords.callingInLandRecords.size();
Users.get(n).userRecords.callingInLandRecords.get(size2-1).startTime=SimpleDateFormat.parse(c.substring(t+1, tem));
Users.get(n).userRecords.callingInLandRecords.get(size2-1).endTime=SimpleDateFormat.parse(c.substring(tem+1));
}
}
}
catch(Exception e)
{

}
n++;
}
}
c=sc.nextLine();
}


int i;
int j;
User t=new User();
int size3= Users.size();
for(i=0;i<size3;i++)
{
for(j=i+1;j<size3;j++)
{
if(Users.get(i).number.charAt(11)>Users.get(j).number.charAt(11))
{
t=Users.get(i);
Users.set(i, Users.get(j));
Users.set(j,t);
}

}
}
i=0;
while(i<size3)
{
System.out.printf("%s %.1f %.1f",Users.get(i).number,Users.get(i).calCost(),(80-Users.get(i).calCost()));
System.out.printf("\n");
i++;
}
}


}

 

class User {
UserRecords userRecords =new UserRecords();
double balance=100;
chargeMode chargeMode;
String number;
public UserRecords getUserRecords() {
return userRecords;
}
public void setUserRecords(UserRecords userRecords) {
this.userRecords = userRecords;
}
public double getBalance() {
return 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;
}
public double calBalance () {
return balance;
}
public double calCost () {
return chargeMode.calCost(userRecords);
}
public static int numaeral(String number)
{
int num=Integer.parseInt(number);
if(num==791)
return 0;
else if(num>=790&&num<799||num==701)
return 1;
else
return 2;
}
}

class UserRecords
{
ArrayList<CallRecord> callingInCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInProvinceRecords =new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInLandRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInProvinceRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInLandRecords=new ArrayList<CallRecord>();

public ArrayList<CallRecord> getCallingInCityRecords()
{
return callingInCityRecords;
}
public void addCallingInCityRecords (CallRecord callRecord)
{
callingInCityRecords.add(callRecord);
}
public ArrayList<CallRecord> getCallingInProvinceRecords()
{
return callingInProvinceRecords;
}
public void addCallingInProvinceRecords (CallRecord callRecord)
{
callingInProvinceRecords .add(callRecord);
}

public ArrayList<CallRecord> getCallingInLandRecords() {
return callingInLandRecords;
}
public void addCallingInLandRecords (CallRecord callRecord)
{
callingInLandRecords.add(callRecord);
}
public ArrayList<CallRecord> getAnswerInCityRecords() {
return answerInCityRecords;
}
public void addAnswerInCityRecords (CallRecord answerRecord)
{
answerInCityRecords.add(answerRecord);
}
public ArrayList<CallRecord> getAnswerInProvinceRecords()
{
return answerInProvinceRecords;
}
public void addAnswerInProvinceRecords (CallRecord answerRecord)
{
answerInProvinceRecords.add(answerRecord);
}
public ArrayList<CallRecord> getAnswerInLandRecords()
{
return answerInLandRecords;
}
public void addAnswerInLandRecords (CallRecord answerRecord)
{
answerInLandRecords.add(answerRecord);
}
}
abstract class CallChargeRule extends ChargeRule

{
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

public abstract double calCost (UserRecords userRecords);
}

class CallRecord extends CommunicationRecord{
Date startTime;
Date endTime;
String callingAddressAreaCode;
String answerAddressAreaCode;
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;
}

}

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

abstract class ChargeRule {
public abstract double calCost (UserRecords userRecords);
}


abstract class CommunicationRecord {
String callingNumber;
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 {

@Override
public double calCost(UserRecords userRecords) {
chargeRules.add(new LandPhoneInCityRule());
chargeRules.add(new LandPhoneInProvinceRule());
chargeRules.add(new LandPhoneInlandRule());
return chargeRules.get(0).calCost(userRecords)+chargeRules.get(1).calCost(userRecords)+chargeRules.get(2).calCost(userRecords);
}

@Override
public double getMonthlyRent()
{

return 20;
}

}

class LandPhoneInCityRule extends CallChargeRule {
@Override
public double calCost(UserRecords userRecords) {
int i=0;
double sum=0;
double m=0;
while(i<userRecords.callingInCityRecords.size())
{
try {
double time1=userRecords.callingInCityRecords.get(i).startTime.getTime();
double time2=userRecords.callingInCityRecords.get(i).endTime.getTime();
double time=(time2-time1);
i++;
sum=(double)time;
m=Math.ceil(sum/1000/60)*0.1+m;
}
catch(Exception e)
{
i++;
}
}
return m;
}
}

class LandPhoneInlandRule extends CallChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double sum=0;
double m=0;
while(i<userRecords.callingInLandRecords.size())
{
try {
double time1=userRecords.callingInLandRecords.get(i).startTime.getTime();
double time2=userRecords.callingInLandRecords.get(i).endTime.getTime();
double time=(time2-time1);
i++;
sum=(double)time;
m=m+Math.ceil(sum/1000/60)*0.6;
}
catch(Exception e)
{
i++;
}
}
return m;
}
}


class LandPhoneInProvinceRule extends CallChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double sum=0;
double m=0;
while(i<userRecords.callingInProvinceRecords.size())
{
try
{
double time1=userRecords.callingInProvinceRecords.get(i).startTime.getTime();
double time2=userRecords.callingInProvinceRecords.get(i).endTime.getTime();
double time=(time2-time1);
i++;
sum=(double)time;
m=Math.ceil(sum/1000/60)*0.3+m;
}
catch(Exception e)
{
i++;
}
}
return m ;
}

}

复制代码

 

 

                 2.电信计费系列   2-手机+座机计费

          

复制代码

import java.math.BigInteger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Date;
public class Main
{
public static void main(String[] args) throws ParseException
{
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
ArrayList<User> Users=new ArrayList<User>();
Scanner input=new Scanner(System.in);
String str=input.nextLine();
int m=0;
while(true)
{
if(str.matches("u-0791[0-9]{7,8} 0"))
{
Users.add(new User());
int t=str.indexOf(' ');
Users.get(m).number=str.substring(2,t);
Users.get(m).chargeMode=new LandlinePhoneCharging();
m++;
}
if(str.matches("u-1[0-9]{10} 1"))
{
Users.add(new User());
int t=str.indexOf(' ');
Users.get(m).number=str.substring(2,t);
Users.get(m).chargeMode=new iPhoneCharging();
m++;
}
str=input.nextLine();

if(str.charAt(0)=='t'||str.equals("end"))
break;


}
int i;
int j;
User temp=new User();
for(i=0;i<Users.size();i++)
{
for(j=i+1;j<Users.size();j++)
{
BigInteger b1 = new BigInteger(Users.get(i).number);
BigInteger b2 = new BigInteger(Users.get(j).number);
if(Users.get(i).number.equals(Users.get(j).number))
{
Users.remove(j);
}
else if(Users.get(i).number.charAt(0)>Users.get(j).number.charAt(0))
{
temp=Users.get(i);
Users.set(i, Users.get(j));
Users.set(j,temp);
}
else if (b1.intValue()- b2.intValue() > 0)
{

temp=Users.get(i);
Users.set(i, Users.get(j));
Users.set(j,temp);
}

}
}
String c=str;
while(!c.equals("end"))
{
int n=0;
int l=Users.size();
if(c.matches("t-0[\\d]{10,11} 0[\\d]{9,11} [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))

{
n=0;
while(n<l)
{



int t=c.indexOf(' ');
if(Users.get(n).number.equals(c.substring(2,t)))
{

if(User.numaeral(c.substring(t+2,t+5))==0)
{
t=c.indexOf(' ',t+1);
int w=t;
t=c.indexOf(' ',t+1);
t=c.indexOf(' ',t+1);
if(check(c.substring(w+1, t))&&check(c.substring(t+1)))
{
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(w+1, t));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(t+1));
}
}
else if(User.numaeral(c.substring(t+2,t+5))==1)
{

t = c.indexOf(' ',t+1);
int w= t;
t=c.indexOf(' ',t+1);
t=c.indexOf(' ',t+1);
if(check(c.substring(w+1, t))&&check(c.substring(t+1)))
{
Users.get(n).userRecords.callingInProvinceRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInProvinceRecords.size();
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(w+1, t));
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(t+1));
}
}
else
{

t=c.indexOf(' ',t+1);
int w=t;
t=c.indexOf(' ',t+1);
t=c.indexOf(' ',t+1);
if(check(c.substring(w+1, t))&&check(c.substring(t+1)))
{
Users.get(n).userRecords.callingInLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInLandRecords.size();
Users.get(n).userRecords.callingInLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(w+1, t));
Users.get(n).userRecords.callingInLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(t+1));
}
}
}



n++;
}
}
if(c.matches("t-1[\\d]{10} 0[\\d]{2,3} 1[\\d]{10} 0[\\d]{2,3} [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))

{

int q=c.indexOf(' ');
int r=c.indexOf(' ',q+1);
int s=c.indexOf(' ',r+1);
int t=c.indexOf(' ',s+1);
int u=c.indexOf(' ',t+1);
int v=c.indexOf(' ',u+1);
int p=User.numaeral(c.substring(s+2,t));
int jud=judgeinclude(c.substring(r+1,s),Users);
n=judgeinclude(c.substring(2,q),Users);
if(n!=-1&&check(c.substring(t+1,v))&&check(c.substring(v+1)))
{

if(User.numaeral(c.substring(q+2,r))==0)//不漫游
{

if(p==0)
{
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));
}
else if(p==1)
{
Users.get(n).userRecords.callingInProvinceRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInProvinceRecords.size();
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));
}
else
{
Users.get(n).userRecords.callingInLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInLandRecords.size();
Users.get(n).userRecords.callingInLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingInLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));

}
}
else if(User.numaeral(c.substring(q+2,r))==1)
{
Users.get(n).userRecords.callingoutCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingoutCityRecords.size();
Users.get(n).userRecords.callingoutCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingoutCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));

}
else
{
Users.get(n).userRecords.callingoutLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingoutLandRecords.size();
Users.get(n).userRecords.callingoutLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingoutLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));
}
}
if(p==2&&jud!=-1&&check(c.substring(t+1,v))&&check(c.substring(v+1)))
{
Users.get(jud).userRecords.answerRecords.add(new CallRecord());
int le=Users.get(jud).userRecords.answerRecords.size();
Users.get(jud).userRecords.answerRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(jud).userRecords.answerRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));
}
}
if(c.matches("t-0791[\\d]{7,8} 1[\\d]{10} 0[\\d]{2,3} [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])||t-0[\\\\d]{10,11} 1[\\\\d]{10} 0[\\\\d]{2,3} [\\\\d]{4}.[\\\\d]{1,2}.[\\\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\\\d]{4}.[\\\\d]{1,2}.[\\\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))
//座机打手机
{
int q=c.indexOf(' ');
int r=c.indexOf(' ',q+1);
int s=c.indexOf(' ',r+1);
int t=c.indexOf(' ',s+1);
int u=c.indexOf(' ',t+1);
int p=User.numaeral(c.substring(r+2,s));
n=judgeinclude(c.substring(2,q),Users);
int jud=judgeinclude(c.substring(q+1,r),Users);
if(n!=-1&&check(c.substring(s+1,u))&&check(c.substring(u+1)))
{

if(p==0)
{
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
else if(p==1)
{
Users.get(n).userRecords.callingInProvinceRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInProvinceRecords.size();
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
else
{
Users.get(n).userRecords.callingInLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInLandRecords.size();
Users.get(n).userRecords.callingInLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingInLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
}
if(p==2&&jud!=-1&&check(c.substring(s+1,u))&&check(c.substring(u+1)))
{
Users.get(jud).userRecords.answerRecords.add(new CallRecord());
int le=Users.get(jud).userRecords.answerRecords.size();
Users.get(jud).userRecords.answerRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(jud).userRecords.answerRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
}

if(c.matches("t-1[\\d]{10} 0[\\d]{2,3} 0[\\d]{9,11} [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))

{

int q=c.indexOf(' ');
int r=c.indexOf(' ',q+1);
int s=c.indexOf(' ',r+1);
int t=c.indexOf(' ',s+1);
int u=c.indexOf(' ',t+1);
int p=User.numaeral(c.substring(q+2,r));
n=judgeinclude(c.substring(2,q),Users);
if(n!=-1&&check(c.substring(s+1,u))&&check(c.substring(u+1)))
{
if(p==0)
{
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
else if(p==1)
{
Users.get(n).userRecords.callingoutCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingoutCityRecords.size();
Users.get(n).userRecords.callingoutCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingoutCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
else
{
Users.get(n).userRecords.callingoutLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingoutLandRecords.size();
Users.get(n).userRecords.callingoutLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingoutLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));

}
}
}
c=input.nextLine();
}

i=0;
while(i<Users.size())
{
System.out.printf("%s %.1f %.1f",Users.get(i).number,Users.get(i).calCost(),(100-Users.get(i).chargeMode.getMonthlyRent()-Users.get(i).calCost()));
System.out.printf("\n");
i++;
}
}
private static int judgeinclude(String s,ArrayList<User> Users) {
for(int i=0;i<Users.size();i++)
{
if(s.equals(Users.get(i).number))
return i;
}
return -1;
}
static boolean check (String str)
{
SimpleDateFormat sd=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
try {
sd.setLenient(false);

}
catch (Exception e)
{
return false;
}
return true;
}

}
abstract class CallChargeRule extends ChargeRule
{
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
public abstract double calCost (UserRecords userRecords);
}
class CallRecord extends CommunicationRecord{
Date startTime;
Date endTime;
String callingAddressAreaCode;
String answerAddressAreaCode;
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 getAnswerAddressAreaCode() {
return answerAddressAreaCode;
}
public void setAnswerAddressAreaCode(String answerAddressAreaCode) {
this.answerAddressAreaCode = answerAddressAreaCode;
}
}
abstract class chargeMode {
ArrayList<ChargeRule> chargeRules = new ArrayList<>();
public abstract double calCost (UserRecords userRecords);
public abstract double getMonthlyRent ();
public ArrayList<ChargeRule> getChargeRules() {
return chargeRules;
}
public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
this.chargeRules = chargeRules;
}
}
abstract class ChargeRule {
public abstract double calCost (UserRecords userRecords);
}
abstract class CommunicationRecord {
String callingNumber;
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 iPhoneCharging extends chargeMode {

@Override
public double calCost(UserRecords userRecords) {
chargeRules.add(new iPhoneRule());
return chargeRules.get(0).calCost(userRecords);
}

@Override
public double getMonthlyRent() {
// TODO Auto-generated method stub
return 15;
}

}
class iPhoneRule extends ChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0;
double m=0;
while(i<userRecords.callingInCityRecords.size())
{
try {
long time1=userRecords.callingInCityRecords.get(i).startTime.getTime();
long time2=userRecords.callingInCityRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.1+m;
}
catch(Exception e){
i++;
}
}
i=0;
while(i<userRecords.callingInProvinceRecords.size())
{
try {
long time1=userRecords.callingInProvinceRecords.get(i).startTime.getTime();
long time2=userRecords.callingInProvinceRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.2+m;
}
catch(Exception e){
i++;
}
}
i=0;
while(i<userRecords.callingInLandRecords.size())
{
try {
long time1=userRecords.callingInLandRecords.get(i).startTime.getTime();
long time2=userRecords.callingInLandRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.3+m;
}
catch(Exception e){
i++;
}
}
i=0;
while(i<userRecords.answerRecords.size())
{
try {
long time1=userRecords.answerRecords.get(i).startTime.getTime();
long time2=userRecords.answerRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.3+m;
}
catch(Exception e){
i++;
}
}
i=0;
while(i<userRecords.callingoutCityRecords.size())
{
try {
long time1=userRecords.callingoutCityRecords.get(i).startTime.getTime();
long time2=userRecords.callingoutCityRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.3+m;
}
catch(Exception e){
i++;
}
}
i=0;
while(i<userRecords.callingoutLandRecords.size())
{
try {
long time1=userRecords.callingoutLandRecords.get(i).startTime.getTime();
long time2=userRecords.callingoutLandRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.6+m;
}
catch(Exception e){
i++;
}
}
return m;
}

}
class LandlinePhoneCharging extends chargeMode {

@Override
public double calCost(UserRecords userRecords) {
chargeRules.add(new LandPhoneInCityRule());
chargeRules.add(new LandPhoneInProvinceRule());
chargeRules.add(new LandPhoneInlandRule());
return chargeRules.get(0).calCost(userRecords)+chargeRules.get(1).calCost(userRecords)+chargeRules.get(2).calCost(userRecords);
}

@Override
public double getMonthlyRent() {

return 20;
}

}
class LandPhoneInCityRule extends CallChargeRule {


@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0;
double m=0;
while(i<userRecords.callingInCityRecords.size())
{
try {
long time1=userRecords.callingInCityRecords.get(i).startTime.getTime();
long time2=userRecords.callingInCityRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.1+m;
}
catch(Exception e){
i++;
}
}
return m;
}
}
class LandPhoneInlandRule extends CallChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0;
double m=0;
while(i<userRecords.callingInLandRecords.size())
{
try {
long time1=userRecords.callingInLandRecords.get(i).startTime.getTime();
long time2=userRecords.callingInLandRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=m+Math.ceil(s/1000/60)*0.6;
}
catch(Exception e)
{
i++;
}
}
return m;
}
}

class LandPhoneInProvinceRule extends CallChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0;
double m=0;
while(i<userRecords.callingInProvinceRecords.size())
{
try {
long time1=userRecords.callingInProvinceRecords.get(i).startTime.getTime();
long time2=userRecords.callingInProvinceRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.3+m;
}
catch(Exception e)
{
i++;
}
}
return m ;
}

}
class User {
UserRecords userRecords =new UserRecords();
double balance=100;
chargeMode chargeMode;
String number;
public UserRecords getUserRecords() {
return userRecords;
}
public void setUserRecords(UserRecords userRecords) {
this.userRecords = userRecords;
}
public double getBalance() {
return 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;
}
public double calBalance () {
return balance;
}
public double calCost () {
return chargeMode.calCost(userRecords);
}
public static int numaeral(String number) {
if(Integer.parseInt(number)==791)
return 0;
else if(Integer.parseInt(number)>=790&&Integer.parseInt(number)<=799||Integer.parseInt(number)==701)
return 1;
else
return 2;
}
public static int numaeral(String number,String number1) {
if(Integer.parseInt(number)==791)
return 0;
else if(Integer.parseInt(number)>=790&&Integer.parseInt(number)<=799||Integer.parseInt(number)==701)
return 1;
else
return 2;
}
}
class UserRecords
{
ArrayList<CallRecord> callingInCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInProvinceRecords =new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInLandRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> callingoutCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> callingoutLandRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInProvinceRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInLandRecords=new ArrayList<CallRecord>();

public ArrayList<CallRecord> getCallingInCityRecords()
{
return callingInCityRecords;
}
public void addCallingInCityRecords (CallRecord callRecord)
{
callingInCityRecords.add(callRecord);
}
public ArrayList<CallRecord> getCallingInProvinceRecords()
{
return callingInProvinceRecords;
}
public void addCallingInProvinceRecords (CallRecord callRecord)
{
callingInProvinceRecords .add(callRecord);
}

public ArrayList<CallRecord> getCallingInLandRecords()
{
return callingInLandRecords;
}
public void addCallingInLandRecords (CallRecord callRecord)
{
callingInLandRecords.add(callRecord);
}
public ArrayList<CallRecord> getAnswerInCityRecords()
{
return answerInCityRecords;
}
public void addAnswerInCityRecords (CallRecord answerRecord)
{
answerInCityRecords.add(answerRecord);
}
public ArrayList<CallRecord> getAnswerInProvinceRecords()
{
return answerInProvinceRecords;
}
public void addAnswerInProvinceRecords (CallRecord answerRecord)
{
answerInProvinceRecords.add(answerRecord);
}
public ArrayList<CallRecord> getAnswerInLandRecords()
{
return answerInLandRecords;
}
public void addAnswerInLandRecords (CallRecord answerRecord)
{
answerInLandRecords.add(answerRecord);
}

}

复制代码

                     

 

 

 

                   3.电信计费系列    3-短信计费

       

复制代码

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Scanner;

public class Main
{
static ArrayList<User> users = new ArrayList<User>();
static Scanner input = new Scanner(System.in);
public static void main(String[] args)
{
DecimalFormat df = new DecimalFormat("0.0");
User user;
String str1 = "[\\\\u]-[0-9]{11}";
String str2 = "[\\\\m]-[0-9]{11}";
String str3 = "[0-9]{11}";
String str4 = "([\\w]|[,]|[ ]|[.])+";

String str = input.next();

while(!str.equals("end"))
{
if(str.matches(str1))
{
String s2 = input.next();
if(s2.matches("3"))
{
user = new User();
int t = str.length();
user.number = str.substring(2,t);
users.add(user);
}
}


if(str.matches(str2))
{
String s2 = input.next();

if(s2.matches(str3))
{
String s3 = input.nextLine();
int t = s3.length();
String s4 = s3.substring(1,t);

if(s4.matches(str4))
{
user = new User();
int size = users.size();
for(int i = 0;i < size;i++)
{
int t2 = str.length();
if(users.get(i).number.equals(str.substring(2,t2)))
{
user = users.get(i);
}
}
Message mes = new Message();
mes.message = s3;
int t3 = str.length();
mes.callingNumber = str.substring(2,t3);
mes.answerNumber= s2;
user.messageRecords.add(mes);
}
}

}
str = input.next();
}
int size = users.size();
for(int i = 0;i < size;i++)
{
System.out.println(users.get(i).number + " " + df.format(users.get(i).calmoney(users.get(i).messageRecords)) +" " + df.format(users.get(i).money()));
}
}

}
class User implements Comparable<User>
{
String number;
double money = 100;
double cost = 0;
ArrayList<Message> messageRecords = new ArrayList<Message>();
double money()
{
return money-cost;
}
double calmoney(ArrayList<Message> m)
{
double messagecount = 0;
for(int i = 0 ; i < m.size() ; i++)
{
int sum = m.get(i).message.length()/10;
int remaining = m.get(i).message.length()%10;
if(remaining!=0)
sum += 1;
messagecount += sum;
}
if(messagecount <= 3)
cost = 0.1 * messagecount;
else if(messagecount <= 5)
cost = 0.3 + 0.2*(messagecount - 3);
else
cost = 0.7 + 0.3 *(messagecount - 5);
return cost;
}
@Override
public int compareTo(User u) {
// TODO Auto-generated method stub

return this.number.compareTo(u.number);
}

}
abstract class CommunicationRecord {
String callingNumber;
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 Message extends CommunicationRecord
{
String message;

public void setMessage(String message) {
this.message = message;
}

public String getMessage() {
return message;
}
}

复制代码

 

 

三、采坑心得

          1.第一次作业对类的设计起初有些找不到头绪,好在题目所给出类图有参考价值,进而完成类图的设计与关联关系。

   2.第二次作业新加了手机通话功能,对于数据的处理要求增加,是对于逻辑的缜密与清晰的一次考察。

           3.第三次作业对于数据的顺序处理存在不熟练之处。

四、改进建议

          1.作业一关于正则表达式半段年月日中的日期还存在漏洞,不能很好地区分错误测试样例,导致程序不完善进而丢分。

          2.作业二存在的问题与第一次大同小异,对与数据的处理还有提高改进的空间。

    3.作业三对数据的排序功能有待提高改进,对于

                             public int compareTo(User u) {
                            return this.number.compareTo(u.number);
                            }

    的使用需要再加强

 

五、总结

         有痛失分数的懊悔,也有巨大的收获。这三次作业让我对Java的继承关系  、实现关系、依赖关系 、关联关系、聚合关系、组合关系有了更进一步的认识。所以,通过这几次pta作业,所反映的问题首先就是需要熟悉类与类间的关系从而设计和使用,同时熟练的在各种情况下正确运用正则表达式,然后最最重要的不断学习,不断补充自己的过程,知识的更新日新月异,我们不仅要掌握一门知识,同时要掌握学习一门知识过程中所学到的方法,这样对于新知识的迁移与精进是很有帮助的。

 

 

posted @ 2022-06-12 02:08  夜阑沃汀风吹雨  阅读(54)  评论(0)    收藏  举报