21201617-刘展睿blog3

1.前言:本次博客主要是对pta-6,pta-7,pta-8大作业的总结与收获。pta6-8考的是电信计费系列,第一次主要是做座机的收费较为局限性,只考虑座机的情况且只考虑打电话的情况。主要运用的ArrayList的使用,以及考察类的设计,但是给了类的设计图,把难度减少了许多。总的来说,难度并不是很大。第二次,在座机的基础上增加了手机,还有地区之分,比如市内打电话给省内,市内打电话给市内,市内打电话给省外等一系列的情况。好在没处理信息收费的情况,但是难度较于第一次还是有很大的提升。情况变得更复杂,就需要你的类的设计更加的合理,更有复用性。pta-8的话,难度减少了许多,可能老师也知道如果在第二问的基础上加上第三问,可能有更多人又过不了60分。第三次,只考虑信息收费的情况,只有一种计费类型,可以不使用计费规则也能完成该计费。

2.设计与分析

输入格式:

输入信息包括两种类型
1、逐行输入南昌市用户开户的信息,每行一个用户,
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
例如:u-079186300001 0
座机号码除区号外由是7-8位数字组成。
本题只考虑计费类型0-座机计费,电信系列2、3题会逐步增加计费类型。
2、逐行输入本月某些用户的通讯信息,通讯信息格式:
座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
以上四项内容之间以一个英文空格分隔,
时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。
以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。

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)
{
if(a.matches("[u]-0791[0-9]{7,8} 0"))
{
Users.add(new User());
int q=a.indexOf(' ');
Users.get(m).number=a.substring(2,q);
Users.get(m).chargeMode=new LandlinePhoneCharging();
}
m++;
a=sc.nextLine();
if(a.charAt(0)=='t')
break;
}
String c=a;
while(!c.equals("end"))
{
int n=0;
int l=Users.size();
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])"))
{
while(n<l)
{

try{
// 可能会导致错误的代码
int q=c.indexOf(' ');
if(Users.get(n).number.equals(c.substring(2,q)))
{

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

q=c.indexOf(' ',q+1);
int w=q;
q=c.indexOf(' ',q+1);
q=c.indexOf(' ',q+1);
if(check(c.substring(w+1, q))&&check(c.substring(q+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, q));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(q+1));
}
}
else if(User.numaeral(c.substring(q+2,q+5))==1)
{

q=c.indexOf(' ',q+1);
int w=q;
q=c.indexOf(' ',q+1);
q=c.indexOf(' ',q+1);
if(check(c.substring(w+1, q))&&check(c.substring(q+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, q));
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(q+1));
}
}
else
{

q=c.indexOf(' ',q+1);
int w=q;
q=c.indexOf(' ',q+1);
q=c.indexOf(' ',q+1);
if(check(c.substring(w+1, q))&&check(c.substring(q+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, q));
Users.get(n).userRecords.callingInLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(q+1));
}
}
}
}
catch(Exception e){
// 在错误发生时怎么处理
}
n++;
}
}
c=sc.nextLine();
}
int y;
int j;
User t=new User();
for(y=0;y<Users.size();y++)
{
for(j=y+1;j<Users.size();j++)
{
if(Users.get(y).number.equals(Users.get(j).number))
{
Users.remove(j);
}
else if(Users.get(y).number.charAt(11)>Users.get(j).number.charAt(11))
{
t=Users.get(y);
Users.set(y, Users.get(j));
Users.set(j,t);
}

}
}
y=0;
while(y<Users.size())
{
System.out.printf("%s %.1f %.1f",Users.get(y).number,Users.get(y).calCost(),(80-Users.get(y).calCost()));
System.out.printf("\n");
y++;
}
}
static boolean check (String str) {
SimpleDateFormat sd=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//括号内为日期格式,y代表年份,M代表年份中的月份(为避免与小时中的分钟数m冲突,此处用M),d代表月份中的天数
try {
sd.setLenient(false);//此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
sd.parse(str);//从给定字符串的开始解析文本,以生成一个日期
}
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 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() {
// TODO Auto-generated method stub
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++;
}
}
if(m>=0)
return m;
else
{
return 0;
}
}
}
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++;
}
}
if(m>=0)
return m;
else
{
return 0;
}
}
}

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++;
}
}
if(m>=0)
return m;
else
{
return 0;
}
}

}
class MessageRecord extends CommunicationRecord{
String message;

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}
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;
}
}
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>();
ArrayList<MessageRecord> sendMessageRecords=new ArrayList<MessageRecord>();
ArrayList<MessageRecord> receiveMessageRecords=new ArrayList<MessageRecord>();
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);
}
public ArrayList<MessageRecord> getSendMessageRecords() {
return sendMessageRecords;
}
public void addSendMessageRecords (MessageRecord sendMessageRecord)
{
sendMessageRecords.add(sendMessageRecord);
}
public ArrayList<MessageRecord> getReceiveMessageRecords() {
return receiveMessageRecords;
}
public void addReceiveMessageRecords (MessageRecord receiveMessageRecord)
{
receiveMessageRecords.add(receiveMessageRecord);
}
}

输入样例:

在这里给出一组输入。例如:

u-079186300001 0
t-079186300001 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:25
end
 

输出样例:

在这里给出相应的输出。例如:

079186300001 3.0 77.0

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

public class Main {

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
ArrayList<User> users1 = new ArrayList<User>();
ArrayList<User> users2 = new ArrayList<User>();
ChargeMode chargeMode;
ArrayList<CallRecord> callRecords = new ArrayList<CallRecord>();
SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

String[] tokens = null;
Date time1=null,time2=null;
while(true)
{
String number=in.nextLine();
if(number.equals("end"))
break;
int f=0;
f=JudgeFormat.judge(number);
if(f!=0)
{
for(int i=0;i<number.length();i++)
{
tokens=number.split("[- ]");
}

if(tokens[0].equals("u")){//开户
CallRecord callRecord = new CallRecord();
String areaCode;
LandlinePhoneCharging m = new LandlinePhoneCharging();//座机
MobilePhoneCharging n =new MobilePhoneCharging();//手机
chargeMode = m;
chargeMode = n;
if(f==1)
{
boolean judge=true;
areaCode = tokens[1].substring(0, 4);
callRecord.setCallingAddressAreaCode(areaCode);//区号
for(User user : users1)
{
if(user.getNumber().equals(tokens[1]))//判断是否已开户
judge=false;
}
if(judge) {//如果没有就开户
User u = new User(m,tokens[1]);
users1.add(u);//开户
}
}
else if(f==2)
{
boolean judge=true;
for(User user : users2)
{
if(user.getNumber().equals(tokens[1]))//判断是否已开户
judge=false;
}
if(judge) {//如果没有就开户
User u = new User(n,tokens[1]);
users2.add(u);//开户
}
}
}


if(tokens[0].equals("t")) {
CallRecord callRecord = new CallRecord();
String anwserareaCode,callareaCode;
if(f==3)
{
callareaCode = tokens[1].substring(0, 4);//拨打区号
callRecord.setCallingAddressAreaCode(callareaCode);//传入拨打区号
callRecord.setCallingNumber(tokens[1]);//传入拨打号码
anwserareaCode = tokens[2].substring(0, 4);//接通地址
callRecord.setAnswerAddressAreaCode(anwserareaCode);//传入接通区号
callRecord.setAnswerNumber(tokens[2]);//传入接通号码
try {
time1 = df.parse(tokens[3]+" "+tokens[4]);
} catch (ParseException e1) {
e1.printStackTrace();
}

try {
time2 = df.parse(tokens[5]+" "+tokens[6]);
} catch (ParseException e) {
e.printStackTrace();
}

callRecord.setStartTime(time1);//开始时间
callRecord.setEndTime(time2);//结束时间
callRecords.add(callRecord);//添加用户记录
}

if(f==4)
{
callareaCode = tokens[1].substring(0, 4);//拨打区号
callRecord.setCallingAddressAreaCode(callareaCode);//传入拨打区号
callRecord.setCallingNumber(tokens[1]);//传入拨打号码
anwserareaCode = tokens[3];//接通地址
callRecord.setAnswerAddressAreaCode(anwserareaCode);//传入接通区号
callRecord.setAnswerNumber(tokens[2]);//传入接通号码
try {
time1 = df.parse(tokens[4]+" "+tokens[5]);
} catch (ParseException e1) {
e1.printStackTrace();
}

try {
time2 = df.parse(tokens[6]+" "+tokens[7]);
} catch (ParseException e) {
e.printStackTrace();
}

callRecord.setStartTime(time1);//开始时间
callRecord.setEndTime(time2);//结束时间
callRecords.add(callRecord);//添加用户记录
}

if(f==5)
{
callareaCode = tokens[2];//拨打区号
callRecord.setCallingAddressAreaCode(callareaCode);//传入拨打区号
callRecord.setCallingNumber(tokens[1]);//传入拨打号码
anwserareaCode = tokens[4];//接通地址
callRecord.setAnswerAddressAreaCode(anwserareaCode);//传入接通区号
callRecord.setAnswerNumber(tokens[3]);//传入接通号码
try {
time1 = df.parse(tokens[5]+" "+tokens[6]);
} catch (ParseException e1) {
e1.printStackTrace();
}

try {
time2 = df.parse(tokens[7]+" "+tokens[8]);
} catch (ParseException e) {
e.printStackTrace();
}

callRecord.setStartTime(time1);//开始时间
callRecord.setEndTime(time2);//结束时间
callRecords.add(callRecord);//添加用户记录
}

if(f==6)
{
callareaCode = tokens[2];//拨打区号
callRecord.setCallingAddressAreaCode(callareaCode);//传入拨打区号
callRecord.setCallingNumber(tokens[1]);//传入拨打号码
anwserareaCode = tokens[3].substring(0,4);//接通地址
callRecord.setAnswerAddressAreaCode(anwserareaCode);//传入接通区号
callRecord.setAnswerNumber(tokens[3]);//传入接通号码
try {
time1 = df.parse(tokens[4]+" "+tokens[5]);
} catch (ParseException e1) {
e1.printStackTrace();
}

try {
time2 = df.parse(tokens[6]+" "+tokens[7]);
} catch (ParseException e) {
e.printStackTrace();
}

callRecord.setStartTime(time1);//开始时间
callRecord.setEndTime(time2);//结束时间
callRecords.add(callRecord);//添加用户记录
}

}
}
}
// for(int i=0;i<callRecords.size();i++) {
// System.out.println(callRecords.get(i).getAnswerNumber()+" "+callRecords.get(i).getCallingNumber()+" "+callRecords.get(i).getCallingAddressAreaCode()+" "+callRecords.get(i).getAnswerAddressAreaCode());
// }
//

Collections.sort(users1,new Comparator<User>() {
public int compare(User s1,User s2){
double n1 = Double.parseDouble(s1.getNumber());
double n2 = Double.parseDouble(s2.getNumber());
if(n1 > n2) {
return 1;
}
return -1;
}

});
Collections.sort(users2,new Comparator<User>() {
public int compare(User s1,User s2){
double n1 = Double.parseDouble(s1.getNumber());
double n2 = Double.parseDouble(s2.getNumber());
if(n1 > n2) {
return 1;
}
return -1;
}

});


for(int i=0; i<users1.size(); i++) {
UserRecords userRecords = new UserRecords();//用户记录
for(int j=0;j<callRecords.size();j++) {
if(users1.get(i).getNumber().equals(callRecords.get(j).getCallingNumber())) {
if(callRecords.get(j).getAnswerAddressAreaCode().matches("0791"))//市内打电话
userRecords.addCallingInCityRecords(callRecords.get(j));

else if(callRecords.get(j).getAnswerAddressAreaCode().matches("((079\\d)|0701)"))//省内打电话
userRecords.addCallingInProvinceRecords(callRecords.get(j));

else//国内打电话
userRecords.addCallingInLandRecords(callRecords.get(j));
}
if(users1.get(i).getNumber().equals(callRecords.get(j).getAnswerNumber())) {
if(callRecords.get(j).getCallingAddressAreaCode().matches("0791"))//市内接电话
userRecords.addAnswerInCityRecords(callRecords.get(j));
else if(callRecords.get(j).getCallingAddressAreaCode().matches("((079\\d)|0701)"))//省内接电话
userRecords.addAnswerInProvinceRecords(callRecords.get(j));
else //国内接电话
userRecords.addAnswerInLandRecords(callRecords.get(j));
}
}
// 将用户记录存入对应用户中
users1.get(i).setUserRecords(userRecords);
}

for(int i=0; i<users2.size(); i++) {
UserRecords userRecords = new UserRecords();//用户记录
for(int j=0; j<callRecords.size(); j++) {
if(users2.get(i).getNumber().equals(callRecords.get(j).getCallingNumber())) {
if(callRecords.get(j).getCallingAddressAreaCode().equals("0791")) {
if(callRecords.get(j).getAnswerAddressAreaCode().matches("0791")) {//市内打市内电话
userRecords.addCallingInCityRecords(callRecords.get(j));
}
else if(callRecords.get(j).getAnswerAddressAreaCode().matches("((079\\d)|0701)")) {//市内打省内电话
userRecords.addCallingInProvinceRecords(callRecords.get(j));
}
else {//市内打国内电话
userRecords.addCallingInLandRecords(callRecords.get(j));
}
}
else if(callRecords.get(j).getCallingAddressAreaCode().matches("((079\\d)|0701)")) {
userRecords.addPcallingRecords(callRecords.get(j));
}
else {
userRecords.addLcallingRecords(callRecords.get(j));
}
}
if(users2.get(i).getNumber().equals(callRecords.get(j).getAnswerNumber())) {
if(callRecords.get(j).getAnswerAddressAreaCode().matches("0791")) {//市内接电话
userRecords.addAnswerInCityRecords(callRecords.get(j));
}
else if(callRecords.get(j).getAnswerAddressAreaCode().matches("((079\\d)|0701)")) {//省内接电话
userRecords.addAnswerInProvinceRecords(callRecords.get(j));
}
else {//国内接电话
userRecords.addAnswerInLandRecords(callRecords.get(j));
}
}
}
users2.get(i).setUserRecords(userRecords);//将用户记录存入对应用户中
}

for(User u : users1) {
System.out.println(u.getNumber()+" "+String.format("%.1f", u.calCost())+" "+String.format("%.1f", u.getBalance()));
}
for(User u : users2) {
System.out.println(u.getNumber()+" "+String.format("%.1f", u.calCost())+" "+String.format("%.1f", u.getBalance()));
}

}

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

}
class CallRecord extends CommunicationRecord{
private Date startTime;//开始时间
private Date endTime;//结束时间
private String callingAddressAreaCode;//拨号地点的区号
private 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 {
private ArrayList<ChargeRule> chargeRules = new ArrayList<ChargeRule>();

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

}

public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
this.chargeRules=chargeRules;
}

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

}
abstract class CommunicationRecord {
private String callingNumber;//拨打电话
private 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 JudgeFormat {
public static int judge(String number) {
if( number.matches("u-0791\\d{7,9} 0") )
return 1;//座机开户
else if( number.matches("u-1\\d{10} 1") )
return 2;//手机开户
else if( number.matches("t-\\d{11,13} \\d{10,13} [1-9]\\d{3}\\.([1-9]|1[0-2])\\.([1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[0-1]\\d):[0-5]\\d:[0-5]\\d [1-9]\\d{3}\\.([1-9]|1[0-2])\\.([1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[0-1]\\d):[0-5]\\d:[0-5]\\d") )
return 3;//座机打座机
else if ( number.matches("t-\\d{10,13} 1\\d{10} 0\\d{2,4} [1-9]\\d{3}\\.([1-9]|1[0-2])\\.([1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[0-1]\\d):[0-5]\\d:[0-5]\\d [1-9]\\d{3}\\.([1-9]|1[0-2])\\.([1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[0-1]\\d):[0-5]\\d:[0-5]\\d") )
return 4;//座机打手机
else if ( number.matches("t-1\\d{10} 0\\d{3,5} 1\\d{10} 0\\d{2,4} [1-9]\\d{3}\\.([1-9]|1[0-2])\\.([1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[0-1]\\d):[0-5]\\d:[0-5]\\d [1-9]\\d{3}\\.([1-9]|1[0-2])\\.([1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[0-1]\\d):[0-5]\\d:[0-5]\\d") )
return 5;//手机互打
else if( number.matches("t-1\\d{10} 0\\d{3,5} 0791\\d{7,9} [1-9]\\d{3}\\.([1-9]|1[0-2])\\.([1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[0-1]\\d):[0-5]\\d:[0-5]\\d [1-9]\\d{3}\\.([1-9]|1[0-2])\\.([1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[0-1]\\d):[0-5]\\d:[0-5]\\d") )
return 6;//手机打座机
return 0;

}

}
class LandlinePhoneCharging extends ChargeMode{
private double monthlyRent=20;//月租

@Override
public double calCost(UserRecords userRecords) {//话费
double rent = 0;
ArrayList<CallRecord> callInCityRecords = userRecords.getCallingInCityRecords();//获取拨打市内电话记录
ArrayList<CallRecord> callInProvinceRecords = userRecords.getCallingInProvinceRecords();//获取拨打省内电话记录
ArrayList<CallRecord> callInLandRecords = userRecords.getCallingInLandRecords();//获取拨打国内电话记录
CallChargeRule landPhoneInCityRule = new LandPhoneInCityRule();//市内主叫市内
CallChargeRule landPhoneInProvinceRule = new LandPhoneInProvinceRule();//市内主叫省内
CallChargeRule landPhoneInLandRule = new LandPhoneInlandRule();//市内主叫国内
// CallChargeRule callChargeRule = new LandPhoneInCityRule();
rent+=landPhoneInCityRule.calCost(callInCityRecords);

// callChargeRule = new LandPhoneInProvinceRule();
rent+=landPhoneInProvinceRule.calCost(callInProvinceRecords);

// callChargeRule = new LandPhoneInlandRule();
rent+=landPhoneInLandRule.calCost(callInLandRecords);

return rent;
}

@Override
public double getMonthlyRent() {//月租
return monthlyRent;
}

}
class LandPhoneInCityRule extends CallChargeRule{

@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{
long min=((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000)/ 60;//转化时间
if((((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0)
min++;
sum+=0.1*min;
}
return sum;
}

}
class LandPhoneInlandRule extends CallChargeRule{

@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{

long min=( (callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime())/1000 )/60;//转化时间
if((((callRecords.get(i).getEndTime().getTime()
- callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0) {
min++;
}
sum+=0.6*min;
}
return sum;
}

}
class LandPhoneInProvinceRule extends CallChargeRule{

@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{
long min=((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) / 60;//转化时间
if((((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0)
min++;
sum+=0.3*min;
}
return sum;
}

}
class MobilePhoneCharging extends ChargeMode{
private double monthlyRent=15;//月租

@Override
public double calCost(UserRecords userRecords) {//话费
double rent = 0;
CallChargeRule callChargeRule = new MobilePhoneInCityRule();//市内打市内电话
rent+=callChargeRule.calCost(userRecords.getCallingInCityRecords());

callChargeRule = new MobilePhoneInProvinceRule();//市内打省内电话
rent+=callChargeRule.calCost(userRecords.getCallingInProvinceRecords());

callChargeRule = new MobilePhoneInlandRule();//市内打国内电话
rent+=callChargeRule.calCost(userRecords.getCallingInLandRecords());

callChargeRule = new MobilePhoneRoamingAnswerOutProvince();//省外接电话
rent+=callChargeRule.calCost(userRecords.getAnswerInLandRecords());

callChargeRule = new MobilePhoneRoamingCallOutProvince();//省外打电话
rent+=callChargeRule.calCost(userRecords.getLcallingRecords());

callChargeRule = new MobilePhoneRoamingCallsInProvince();//省内打电话
rent+=callChargeRule.calCost(userRecords.getPcallingRecords());

return rent;


}

@Override
public double getMonthlyRent() {//月租
return monthlyRent;
}

}
class MobilePhoneInCityRule extends CallChargeRule{

@Override
public double calCost(ArrayList<CallRecord> callRecords) {//市内打市内
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{
long min=((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000)/ 60;//转化时间
if((((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0)
min++;
sum+=0.1*min;
}
return sum;
}

}
class MobilePhoneInlandRule extends CallChargeRule{

@Override
public double calCost(ArrayList<CallRecord> callRecords) {//市内打省外
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{
long min=((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000)/ 60;//转化时间
if((((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0)
min++;
sum+=0.3*min;
}
return sum;
}

}
class MobilePhoneInProvinceRule extends CallChargeRule{//市内拨打省内

@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{
long min=((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000)/ 60;//转化时间
if((((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0)
min++;
sum+=0.2*min;
}
return sum;
}

}
class MobilePhoneRoamingAnswerOutProvince extends CallChargeRule{

@Override
public double calCost(ArrayList<CallRecord> callRecords) {//省外漫游接电话
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{
long min=((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000)/ 60;//转化时间
if((((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0)
min++;
sum+=0.3*min;
}
return sum;
}

}
class MobilePhoneRoamingCallOutProvince extends CallChargeRule{

@Override
public double calCost(ArrayList<CallRecord> callRecords) {//省外漫游打电话
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{
long min=((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000)/ 60;//转化时间
if((((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0)
min++;
sum+=0.6*min;
}
return sum;
}


}
class MobilePhoneRoamingCallsInProvince extends CallChargeRule{

@Override
public double calCost(ArrayList<CallRecord> callRecords) {//省内漫游打电话
double sum = 0;
for(int i=0;i<callRecords.size();i++)
{
long min=((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000)/ 60;//转化时间
if((((callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime()) / 1000) % 60)!=0)
min++;
sum+=0.3*min;
}
return sum;
}


}
class User {
private UserRecords userRecords;//用户记录
private double balance=100;//用户余额
private ChargeMode chargeMode;//计费方式
private String number;//号码

public double calCost() {
double sum=chargeMode.calCost(userRecords);
balance-=(sum+chargeMode.getMonthlyRent());
return sum;

}

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 User(ChargeMode chargeMode,String number) {
this.chargeMode=chargeMode;
this.number=number;
}

}
class UserRecords {
ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();//市内打电话
ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();//省内打电话
ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();//国内打电话
ArrayList<CallRecord> PcallingRecords = new ArrayList<CallRecord>();//省内打漫游
ArrayList<CallRecord> LcallingRecords = 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);
}
public void addPcallingRecords (CallRecord callRecord) {
PcallingRecords.add(callRecord);
}
public ArrayList<CallRecord> getPcallingRecords() {
return PcallingRecords;
}
public void addLcallingRecords (CallRecord callRecord) {
LcallingRecords.add(callRecord);
}
public ArrayList<CallRecord> getLcallingRecords() {
return LcallingRecords;
}

}

三.踩坑心得


对于这几次作业的一个坑点,我觉得就是一开始要好好的设计类图,然后通过类图去设计方法,这样比较方便也不会随意出错。要好好运用父类与子类的特点,这样可以减少重复的代码,提高写代码的效率,并且在后期维护或者说修改代码的时候可以方便很多。然后在类多了以后要清楚各个类的对象是否通用,很容易出错,或者是这个成员变量是否通用,要清楚父类与子类的关系。


四.改进建议


对于前这三次作业而言,我的代码一般都是大家的惯性思维,由于怕出错,所以都写得比较常规,有些题目确实有更简单的思路,但是我不知道怎么去运用哪些方法,可能是知识量储备的比较少吧。例如第六次作业的题目,可以用正则表达式去筛选出输入格式错误的情况,但是我是把输入错误的情况一一表达出来,然后通过判断语句去解决。首先是对正则表达式认知的不到位,不知道怎么去正确使用正则表达式去筛选出输入格式错误的地方,如果将这个点弄明白的话,代码的复杂程度就会降低很多。然后对于其中考试的题目,我认为还可以做到一部分代码简化,去优化一下代码,提高使用效率。

五.总结

通过这三次的习题练习,我学到了挺多的东西。
比如说继承与多态,继承(inheritance) 机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础.上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。体现了由简单到复杂的认识过程。
多态性(polymorphism) 多态性是考虑在不同层次的类中,以及在同一类中,同名的成员函数之间的关系问题。函数的重载,运算符的重载,属于编译时的多态性。以虚基类为基础的运行时的多态性是面向对象程序设计的标志题。函数的重载,运算符的重载,属于编译时的多态性。以虚基类为基础的运行时的多态性是面向对象程序设计的标志。

子类与父类
子类和父类的概念是在继承中才会有的,继承的前提是 is-a 原则,比如:Student is a Person,那么我们就可以表示为Student extends Person。

子类又叫派生类,子类一定具有父类的全部属性与行为,并且拥有的属性更多,具体的行为更加丰富,表示的范围更小;父类又名超类。

子类对象在进行实例化之前一定会首先实例化父类对象,先有父类对象才有子类对象,即先调用父类的构造方法之后再调用子类构造方法!
子类在继承父类时会继承父类的所有结构 (包括私有属性、构造方法、普通方法)
隐式继承:父类中所有的私有域(私有属性、方法 private),子类不能直接使用 – 属性可以setter/getter,然而方法则没辙。
显示继承:所有的非私有域属于显示继承,子类对象可以直接调用。·

posted @ 2022-06-12 10:01  21201617-刘展睿  阅读(56)  评论(0)    收藏  举报