Blog-3
(1)前言:
第一次PTA作业一共两题,第一题电信计费系列1-座机计费,第二题是多态测试,相比第一题,第二题更加简单.
第二次PTA作业一共三题,第一题电信计费系列2-手机+座机计费,第二题sdut-Collection-sort--C~K的班级(II),第三题打印员工信息,第一题迭代了上一次的电信计费内容,后两题都相较简单。
第三次PTA作业一共三题,第一题电信计费系列3-短信计费,第二题编写一个类Shop(商店)、内部类InnerCoupons(内部购物券),第三题动物发声模拟器(多态),和第二次作业一样,第一题迭代了上次的内容,后两题更简单。
(2)设计与分析:
实现一个简单的电信计费程序:
假设南昌市电信分公司针对市内座机用户采用的计费方式:
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
南昌市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
输入格式:
输入信息包括两种类型
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”结束。
注意:
本题非法输入只做格式非法的判断,不做内容是否合理的判断(时间除外,否则无法计算),比如:
1、输入的所有通讯信息均认为是同一个月的通讯信息,不做日期是否在同一个月还是多个月的判定,直接将通讯费用累加,因此月租只计算一次。
2、记录中如果同一电话号码的多条通话记录时间出现重合,这种情况也不做判断,直接 计算每条记录的费用并累加。
3、用户区号不为南昌市的区号也作为正常用户处理。
输出格式:
根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,
单位元)。假设每个用户初始余额是100元。
每条通讯信息单独计费后累加,不是将所有时间累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。
源码如下:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class Main { public static void main(String[] args) throws ParseException { Scanner in = new Scanner(System.in); ArrayList<String> list = new ArrayList<String>(); ArrayList<String> list1 = new ArrayList<String>(); ArrayList<String> listNum = new ArrayList<String>(); boolean b = true; User[] user = new User[200]; CallRecord callRecord = new CallRecord(); String str1= "u-0791[0-9]{7,8}\\s[0-2]"; String str2= "t-0791[0-9]{7,8}\\s[0-9]{10,12}\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; while (b) { String str = in.nextLine(); if (str.equals("end")) { b = false; } if(str.length()<=12) continue; list1.add(str); } for(int i=0;i<list1.size();i++){ boolean judge1=list1.get(i).matches(str1); boolean judge2=list1.get(i).matches(str2); if(judge1||judge2){ list.add(list1.get(i)); } } for (int i = 0; i < list.size(); i++) { if (list.get(i).charAt(0) == 'u') { listNum.add(list.get(i).substring(2, 14)); } } for(int i=0;i<listNum.size();i++){ for (int j=i+1;j<listNum.size();j++) { if(listNum.get(i).equals(listNum.get(j))){ listNum.remove(j); } } } for(int i=0;i<listNum.size()-1;i++){ for(int j=0;j<listNum.size()-i-1;j++){ if(listNum.get(j).compareTo(listNum.get(j+1))>0){ Collections.swap(listNum,j,j+1); } } } for (int i = 0; i < listNum.size(); i++) { user[i] = new User(); user[i].setNumber(listNum.get(i)); } for (int i = 0; i < list.size(); i++) { if (list.get(i).charAt(0) == 't') { for(int j=0;j<listNum.size();j++){ if(list.get(i).substring(2,14).equals(user[j].getNumber())) { callRecord.setAnswerAddressAreaCode(list.get(i).substring(15,27)); Date startDate; Date endDate; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); startDate=simpleDateFormat.parse(list.get(i).substring(28,45)); endDate=simpleDateFormat.parse(list.get(i).substring(46)); callRecord.setStartTime(startDate); callRecord.setEndTime(endDate); boolean InCity=list.get(i).substring(15,27).matches("0791\\d{7,8}"); boolean InProvince=list.get(i).substring(15,27).matches("07(01|9[2-9])\\d{7,8}"); if(InCity) { user[j].userRecords.answerCallingInCityRecords(callRecord); } if(InProvince){ user[j].userRecords.answerCallingInProvinceRecords(callRecord); } if(!InCity&&!InProvince) { user[j].userRecords.answerCallingInLandRecords(callRecord); } } } } } LandLinePhoneCharging landLinePhoneCharging=new LandLinePhoneCharging(); for(int i=0;i<listNum.size();i++) { System.out.print(user[i].getNumber()+" "); System.out.print(landLinePhoneCharging.calCost(user[i].userRecords)+" "); System.out.print(user[i].getBalance()-landLinePhoneCharging.monthlyRent-landLinePhoneCharging.calCost(user[i].userRecords)); System.out.println(); } } } class User{ UserRecords userRecords=new UserRecords(); ChargeMode chargeMode; double balance=100; String number; public UserRecords getUserRecords() { return userRecords; } public void setUserRecords(UserRecords userRecords) { this.userRecords = userRecords; } public ChargeMode getChargeMode() { return chargeMode; } public void setChargeMode(ChargeMode chargeMode) { this.chargeMode = chargeMode; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } double calBalance(double balance){ return balance; } } class UserRecords{ ArrayList<CallRecord> callingInCityRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> callingInProvinceRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> callingInLandRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInCityRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInProvinceRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInLandRecord=new ArrayList<CallRecord>(); ArrayList<MessageRecord> sendMessageRecords=new ArrayList<MessageRecord>(); ArrayList<MessageRecord> receiveMessageRecords=new ArrayList<MessageRecord>(); public void addCallingInCityRecords(CallRecord callRecord){ callingInCityRecord.add(callRecord); } public void addCallingInProvinceRecords(CallRecord callRecord){ callingInProvinceRecord.add(callRecord); } public void addCallingInLandRecords(CallRecord callRecord){ callingInLandRecord.add(callRecord); } public void answerCallingInCityRecords(CallRecord callRecord){ answerInCityRecord.add(callRecord); } public void answerCallingInProvinceRecords(CallRecord callRecord){ answerInProvinceRecord.add(callRecord); } public void answerCallingInLandRecords(CallRecord callRecord){ answerInLandRecord.add(callRecord); } public void addSendMessageRecords(MessageRecord messageRecord){ sendMessageRecords.add(messageRecord); } public void addReceiveMessageRecords(MessageRecord messageRecord){ receiveMessageRecords.add(messageRecord); } public ArrayList<CallRecord> getCallingInCityRecord() { return callingInCityRecord; } public ArrayList<CallRecord> getCallingInProvinceRecord() { return callingInProvinceRecord; } public ArrayList<CallRecord> getCallingInLandRecord() { return callingInLandRecord; } public ArrayList<CallRecord> getAnswerInCityRecord() { return answerInCityRecord; } public ArrayList<CallRecord> getAnswerInProvinceRecord() { return answerInProvinceRecord; } public ArrayList<CallRecord> getAnswerInLandRecord() { return answerInLandRecord; } public ArrayList<MessageRecord> getSendMessageRecords() { return sendMessageRecords; } public ArrayList<MessageRecord> getReceiveMessageRecords() { return receiveMessageRecords; } } abstract class ChargeMode{ ArrayList<ChargeMode> changeRule =new ArrayList<ChargeMode>(); public ArrayList<ChargeMode> getChangeRule() { return changeRule; } public void setChangeRule(ArrayList<ChargeMode> changeRule) { this.changeRule = changeRule; } double calCost(UserRecords userRecords) { return 0; } double getMonthlyRent(){ return 0; } } class LandLinePhoneCharging extends ChangeRule{ double monthlyRent=20; double cost=0; double calCost(UserRecords userRecords){ cost = 0; for(int i=0;i<userRecords.answerInCityRecord.size();i++) { double x=userRecords.answerInCityRecord.get(i).endTime.getTime()-userRecords.answerInCityRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.1; } for(int i=0;i<userRecords.answerInProvinceRecord.size();i++) { double x=userRecords.answerInProvinceRecord.get(i).endTime.getTime()-userRecords.answerInProvinceRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.3; } for(int i=0;i<userRecords.answerInLandRecord.size();i++) { double x=userRecords.answerInLandRecord.get(i).endTime.getTime()-userRecords.answerInLandRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.6; } return cost; } double getMonthlyRent(){ return 0; } } 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 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; } } class MessageRecord extends CommunicationRecord{ String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } abstract class ChangeRule{ } abstract class CallChangeRule extends ChangeRule { public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInCityRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInProvinceRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInLandRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } }


分析:
首先我们需要把输入的内容进行判断,符合条件的内容存入,首先进行开户的判断,将座机的电话号码存进user的userecord里,然后对通话记录进行存进,利用正则表达判断打电话的座机,接电话的座机,打电话的地区,接电话的座机,以及开始时间和结束时间
设计:
因为题目提供了类图,我们直接利用设计,主要是对输入内容判断的设计和存信息的设计,存信息采用了user[i]来开户,再把判断不同地区的信息存进不同的calling...
定义容器Container接口。模拟实现一个容器类层次结构,并进行接口的实现、抽象方法重写和多态机制测试。各容器类实现求表面积、体积的方法。
- 定义接口Container:
属性:
public static final double pi=3.1415926;
抽象方法:
public abstract double area();
public abstract double volume();
static double sumofArea(Container c[]);
static double sumofVolume(Container c[]);
其中两个静态方法分别计算返回容器数组中所有对象的面积之和、周长之和; - 定义Cube类、Cylinder类均实现自Container接口。
Cube类(属性:边长double类型)、Cylinder类(属性:底圆半径、高,double类型)。
输入格式:
第一行n表示对象个数,对象类型用cube、cylinder区分,cube表示立方体对象,后面输入边长,输入cylinder表示圆柱体对象,后面是底圆半径、高。
输出格式:
分别输出所有容器对象的表面积之和、体积之和,结果保留小数点后2位。
这题比较简单,我们直接上代码
import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int num=in.nextInt(); double s1=0,s2=0,v1=0,v2=0,s3,v3; for(int i=1;i<=2*num;i++) { String s=in.nextLine(); if(s.length()==4) { double r=in.nextDouble(); Cube cube=new Cube(); s1=s1+cube.area(r, r); v1=v1+cube.volume(r, r); } else if(s.length()==8) { double r=in.nextDouble(); double h=in.nextDouble(); Cylinder cylinder=new Cylinder(); s2=s2+cylinder.area(r, h); v2=v2+cylinder.volume(r, h); } } s3=s1+s2; v3=v1+v2; System.out.format("%.2f",s3); System.out.println(); System.out.format("%.2f",v3); } } interface Container { public static final double pi=3.1415926; public abstract double area(double r,double h); public abstract double volume(double r,double h); } class Cylinder implements Container{ public double area(double r,double h) { double s=2*r*pi*r+2*pi*r*h; return s; } public double volume(double r,double h) { double v=pi*r*r*h; return v; } } class Cube implements Container{ public double area(double r,double h) { double s=r*r*6; return s; } public double volume(double r,double h) { double v=r*r*r; return v; } }
实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
1、针对市内座机用户采用的计费方式(与电信计费系列1内容相同):
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
假设本市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
2、针对手机用户采用实时计费方式:
月租15元,市内省内接电话均免费,市内拨打市内电话0.1元/分钟,市内拨打省内电话0.2元/分钟,市内拨打省外电话0.3元/分钟,省内漫游打电话0.3元/分钟,省外漫游接听0.3元/分钟,省外漫游拨打0.6元/分钟;
注:被叫电话属于市内、省内还是国内由被叫电话的接听地点区号决定,比如以下案例中,南昌市手机用户13307912264在区号为020的广州接听了电话,主叫号码应被计算为拨打了一个省外长途,同时,手机用户13307912264也要被计算省外接听漫游费:
u-13307912264 1
t-079186330022 13307912264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
输入:
输入信息包括两种类型
1、逐行输入南昌市用户开户的信息,每行一个用户,含手机和座机用户
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
例如:u-079186300001 0
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题在电信计费系列1基础上增加类型1-手机实时计费。
手机设置0或者座机设置成1,此种错误可不做判断。
2、逐行输入本月某些用户的通讯信息,通讯信息格式:
座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
以上四项内容之间以一个英文空格分隔,
时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。
输入格式增加手机接打电话以及收发短信的格式,手机接打电话的信息除了号码之外需要额外记录拨打/接听的地点的区号,比如:
座机打手机:
t-主叫号码 接听号码 接听地点区号 起始时间 结束时间
t-079186330022 13305862264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
手机互打:
t-主叫号码 拨号地点 接听号码 接听地点区号 起始时间 结束时间
t-18907910010 0791 13305862264 0371 2022.1.3 10:00:25 2022.1.3 10:05:11
注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
输出:
根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条通讯、短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。
源码如下:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class Main { public static void main(String[] args) throws ParseException { Scanner in = new Scanner(System.in); boolean b = true; User[] user = new User[200]; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); String str1= "u-0791\\d{7,8}"; String str2= "t-0791[0-9]{7,8}\\s[0-9]{10,12}\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; String str3= "u-1\\d{10}"; String str4= "t-1\\d{10}\\s(0\\d{2,3})\\s(1\\d{10})\\s(0\\d{2,3})\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; String str5= "t-1\\d{10}\\s(0\\d{2,3})\\s(\\d{10,12})\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; String str6="t-0791\\d{7,8}\\s(1\\d{10})\\s(0\\d{2,3})\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; int x=-1,y=0; while (b) { String str = in.nextLine(); String[] string =str.split(" "); if (str.equals("end")) { b = false; } if(string[0].matches(str1)||string[0].matches(str3)){ if(user[0]==null){ x++; String []s1=string[0].split("-"); user[x]=new User(); user[x].setNumber(s1[1]); } else { y=0; for (int i = 0; user[i] != null; i++) { String[] s1 = string[0].split("-"); if (user[i].number.equals(s1[1])) { y=1; } } if (y==0) { x++; String[] s1 = string[0].split("-"); user[x] = new User(); user[x].setNumber(s1[1]); } } } else{ for(int i=0;i<x+1;i++){ //座机打座机 if(str.matches(str2)){ CallRecord callRecord=new CallRecord(); callRecord.setCallingNumber(string[0].substring(2)); callRecord.setAnswerNumber(string[1]); String start=string[2].concat(" ").concat(string[3]); String end=string[4].concat(" ").concat(string[5]); Date date1=simpleDateFormat.parse(start); Date date2=simpleDateFormat.parse(end); callRecord.setStartTime(date1); callRecord.setEndTime(date2); if(user[i].number.equals(string[0].substring(2))&&string[1].matches("0791\\d{7,8}")){ user[i].userRecords.addCallingInCityRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[1].matches("07(01|9[2-9])\\d{7,8}")){ user[i].userRecords.addCallingInProvinceRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[1].matches("0(([0-6]\\d{1,2})|(7[0-8]\\d)|([8-9](\\d)?))\\d{7,8}")){ user[i].userRecords.addCallingInLandRecords(callRecord); } } } for(int i=0;i<x+1;i++){ //座机打电话 if(str.matches(str6)){ CallRecord callRecord=new CallRecord(); callRecord.setCallingNumber(string[0].substring(2)); callRecord.setAnswerNumber(string[1]); String start=string[3].concat(" ").concat(string[4]); String end=string[5].concat(" ").concat(string[6]); Date date1=simpleDateFormat.parse(start); Date date2=simpleDateFormat.parse(end); callRecord.setStartTime(date1); callRecord.setEndTime(date2); if(user[i].number.equals(string[0].substring(2))&&string[2].matches("0791")){ user[i].userRecords.addCallingInCityRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[2].matches("07(01|9[2-9])")){ user[i].userRecords.addCallingInProvinceRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[2].matches("0\\d{2,3}")){ user[i].userRecords.addCallingInLandRecords(callRecord); } if(user[i].number.equals(string[1])&&string[2].matches("0791")){ user[i].userRecords.answerCallingInCityRecords(callRecord); } if(user[i].number.equals(string[1])&&string[2].matches("07(01|9[2-9])")){ user[i].userRecords.answerCallingInProvinceRecords(callRecord); } if(user[i].number.equals(string[1])&&string[2].matches("0(([0-6]\\d{1,2})|(7[0-8]\\d)|([8-9](\\d)?))")){ user[i].userRecords.answerCallingInLandRecords(callRecord); } } } for(int i=0;i<x+1;i++){ //电话打座机 if(str.matches(str5)){ CallRecord callRecord=new CallRecord(); callRecord.setCallingNumber(string[0].substring(2)); callRecord.setAnswerNumber(string[2]); String start=string[3].concat(" ").concat(string[4]); String end=string[5].concat(" ").concat(string[6]); Date date1=simpleDateFormat.parse(start); Date date2=simpleDateFormat.parse(end); callRecord.setStartTime(date1); callRecord.setEndTime(date2); if(user[i].number.equals(string[0].substring(2))&&string[1].matches("0791")){ user[i].userRecords.addCallingInCityRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[1].matches("07(01|9[2-9])")){ user[i].userRecords.addCallingInLandRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[1].matches("0(([0-6]\\d{1,2})|(7[0-8]\\d)|([8-9](\\d)?))")){ user[i].userRecords.addCallingInLandRecords1(callRecord); } } } for(int i=0;i<x+1;i++){ //电话打电话 if(str.matches(str4)){ CallRecord callRecord=new CallRecord(); callRecord.setCallingNumber(string[0].substring(2)); callRecord.setAnswerNumber(string[2]); callRecord.setCallingAddressAreaCode(string[1]); callRecord.setAnswerAddressAreaCode(string[3]); String start=string[4].concat(" ").concat(string[5]); String end=string[6].concat(" ").concat(string[7]); Date date1=simpleDateFormat.parse(start); Date date2=simpleDateFormat.parse(end); callRecord.setStartTime(date1); callRecord.setEndTime(date2); if(user[i].number.equals(string[0].substring(2))&&string[1].matches("0791")&&string[3].matches("0791")){ user[i].userRecords.addCallingInCityRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[1].matches("0791")&&string[3].matches("07(01|9[2-9])")){ user[i].userRecords.addCallingInProvinceRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[1].matches("0791")&&string[3].matches("0(([0-6]\\d{1,2})|(7[0-8]\\d)|([8-9](\\d)?))")){ user[i].userRecords.addCallingInLandRecords(callRecord); } if(user[i].number.equals(string[0].substring(2))&&string[1].matches("0(([0-6]\\d{1,2})|(7[0-8]\\d)|([8-9](\\d)?))")&&string[3].matches("0\\d{2,3}")){ user[i].userRecords.addCallingInLandRecords1(callRecord); } if(user[i].number.equals(string[2])&&string[3].matches("0791")){ user[i].userRecords.answerCallingInCityRecords(callRecord); } if(user[i].number.equals(string[2])&&string[3].matches("07(01|9[2-9])")){ user[i].userRecords.answerCallingInProvinceRecords(callRecord); } if(user[i].number.equals(string[2])&&string[3].matches("0(([0-6]\\d{1,2})|(7[0-8]\\d)|([8-9](\\d)?))")){ user[i].userRecords.answerCallingInLandRecords(callRecord); } } } } } String[] arr=new String[x+1]; for(int i=0;i<=x;i++){ arr[i]=user[i].number; } Arrays.sort(arr,String::compareToIgnoreCase); for(int i=0;i<=x;i++){ for(int j=0;j<=x;j++){ if(user[j].number.equals(arr[i])){ User u; u=user[i]; user[i]=user[j]; user[j]=u; } } } LandLinePhoneCharging landLinePhoneCharging=new LandLinePhoneCharging(); for(int i=0;i<x+1;i++) { System.out.print(user[i].getNumber()+" "); if(user[i].number.matches("0\\d{2,3}\\d{7,8}")) { System.out.print(landLinePhoneCharging.calCost(user[i].userRecords)+" "); System.out.print(user[i].getBalance() - landLinePhoneCharging.monthlyRent - landLinePhoneCharging.calCost(user[i].userRecords)); } else { System.out.print(landLinePhoneCharging.calCost1(user[i].userRecords) + " "); System.out.print(user[i].getBalance() - landLinePhoneCharging.monthlyRent - landLinePhoneCharging.calCost1(user[i].userRecords) + 5); } System.out.println(); } } } class User{ UserRecords userRecords=new UserRecords(); ChargeMode chargeMode; double balance=100; String number; public UserRecords getUserRecords() { return userRecords; } public void setUserRecords(UserRecords userRecords) { this.userRecords = userRecords; } public ChargeMode getChargeMode() { return chargeMode; } public void setChargeMode(ChargeMode chargeMode) { this.chargeMode = chargeMode; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } double calBalance(double balance){ return balance; } } class UserRecords{ ArrayList<CallRecord> callingInCityRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> callingInProvinceRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> callingInLandRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> callingInLandRecord1=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInCityRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInProvinceRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInLandRecord=new ArrayList<CallRecord>(); ArrayList<MessageRecord> sendMessageRecords=new ArrayList<MessageRecord>(); ArrayList<MessageRecord> receiveMessageRecords=new ArrayList<MessageRecord>(); public void addCallingInCityRecords(CallRecord callRecord){ callingInCityRecord.add(callRecord); } public void addCallingInProvinceRecords(CallRecord callRecord){ callingInProvinceRecord.add(callRecord); } public void addCallingInLandRecords(CallRecord callRecord){ callingInLandRecord.add(callRecord); } public void addCallingInLandRecords1(CallRecord callRecord){ callingInLandRecord1.add(callRecord); } public void answerCallingInCityRecords(CallRecord callRecord){ answerInCityRecord.add(callRecord); } public void answerCallingInProvinceRecords(CallRecord callRecord){ answerInProvinceRecord.add(callRecord); } public void answerCallingInLandRecords(CallRecord callRecord){ answerInLandRecord.add(callRecord); } public void addSendMessageRecords(MessageRecord messageRecord){ sendMessageRecords.add(messageRecord); } public void addReceiveMessageRecords(MessageRecord messageRecord){ receiveMessageRecords.add(messageRecord); } public ArrayList<CallRecord> getCallingInCityRecord() { return callingInCityRecord; } public ArrayList<CallRecord> getCallingInProvinceRecord() { return callingInProvinceRecord; } public ArrayList<CallRecord> getCallingInLandRecord() { return callingInLandRecord; } public ArrayList<CallRecord> getAnswerInCityRecord() { return answerInCityRecord; } public ArrayList<CallRecord> getAnswerInProvinceRecord() { return answerInProvinceRecord; } public ArrayList<CallRecord> getAnswerInLandRecord() { return answerInLandRecord; } public ArrayList<MessageRecord> getSendMessageRecords() { return sendMessageRecords; } public ArrayList<MessageRecord> getReceiveMessageRecords() { return receiveMessageRecords; } } abstract class ChargeMode{ ArrayList<ChargeMode> changeRule =new ArrayList<ChargeMode>(); public ArrayList<ChargeMode> getChangeRule() { return changeRule; } public void setChangeRule(ArrayList<ChargeMode> changeRule) { this.changeRule = changeRule; } double calCost(UserRecords userRecords) { return 0; } double getMonthlyRent(){ return 0; } } class LandLinePhoneCharging extends ChangeRule{ double monthlyRent=20; double cost=0; double calCost(UserRecords userRecords){ cost = 0; for(int i=0;i<userRecords.callingInCityRecord.size();i++) { double x=userRecords.callingInCityRecord.get(i).endTime.getTime()-userRecords.callingInCityRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.1; } for(int i=0;i<userRecords.callingInProvinceRecord.size();i++) { double x=userRecords.callingInProvinceRecord.get(i).endTime.getTime()-userRecords.callingInProvinceRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.3; } for(int i=0;i<userRecords.callingInLandRecord.size();i++) { double x=userRecords.callingInLandRecord.get(i).endTime.getTime()-userRecords.callingInLandRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.6; } return cost; } double calCost1(UserRecords userRecords){ cost = 0; for(int i=0;i<userRecords.callingInCityRecord.size();i++) { double x=userRecords.callingInCityRecord.get(i).endTime.getTime()-userRecords.callingInCityRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.1; } for(int i=0;i<userRecords.callingInProvinceRecord.size();i++) { double x=userRecords.callingInProvinceRecord.get(i).endTime.getTime()-userRecords.callingInProvinceRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.2; } for(int i=0;i<userRecords.callingInLandRecord.size();i++) { double x=userRecords.callingInLandRecord.get(i).endTime.getTime()-userRecords.callingInLandRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.3; } for(int i=0;i<userRecords.callingInLandRecord1.size();i++) { double x=userRecords.callingInLandRecord1.get(i).endTime.getTime()-userRecords.callingInLandRecord1.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.6; } for(int i=0;i<userRecords.answerInCityRecord.size();i++) { double x=userRecords.answerInCityRecord.get(i).endTime.getTime()-userRecords.answerInCityRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=0; } for(int i=0;i<userRecords.answerInProvinceRecord.size();i++) { double x=userRecords.answerInProvinceRecord.get(i).endTime.getTime()-userRecords.answerInProvinceRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=0; } for(int i=0;i<userRecords.answerInLandRecord.size();i++) { double x=userRecords.answerInLandRecord.get(i).endTime.getTime()-userRecords.answerInLandRecord.get(i).startTime.getTime(); int min = (int)Math.ceil(x/1000.0/60.0); cost+=min*0.3; } return cost; } double getMonthlyRent(){ return 0; } } 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 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; } } class MessageRecord extends CommunicationRecord{ String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } abstract class ChangeRule{ } abstract class CallChangeRule extends ChangeRule { public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInCityRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInProvinceRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInLandRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } }

类图和上题差不多
分析:
这次加入了手机的计费方式,需要考虑输入格式变化的问题,要考虑手机打手机的情况,手机打座机的情况,座机打手机的情况,三种输入的格式,可以利用正则判定,还有就是考虑手机新的计费模式,设计新的费用计算方法
设计:
首先要重新设计输入的格式,然后和上次一样,对符合条件的信息进行判断,存入不同的calling...和answecalling...
经过不懈的努力,C~K终于当上了班主任。
现在他要统计班里学生的名单,但是C~K在教务系统中导出班级名单时出了问题,发现会有同学的信息重复,现在他想把重复的同学信息删掉,只保留一个,
但是工作量太大了,所以找到了会编程的你,你能帮他解决这个问题吗?
输入格式:
第一行输入一个N,代表C~K导出的名单共有N行(N<100000).
接下来的N行,每一行包括一个同学的信息,学号 姓名 年龄 性别。
输出格式:
第一行输出一个n,代表删除重复名字后C~K的班级共有几人。
接下来的n行,输出每一个同学的信息,输出按照学号从小到大的顺序。
源码如下:
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; class Main { public static void main(String[] args) { ArrayList<String> list=new ArrayList<>(); Scanner sc = new Scanner(System.in); int num=sc.nextInt(); for(int i=0;i<num+1;i++) { String s = sc.nextLine(); if(list.contains(s)) continue; else list.add(s); } System.out.print(list.size()-1); Collections.sort(list); for(String A:list){ System.out.println(A); } } }
第三题源码如下:
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Scanner; //定义员工类 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; } } //主函数 class Main { public static void main(String[] args) { // 1、创建有序集合对象 ArrayList c = new ArrayList<>(); // 创建3个员工元素对象 for (int i = 0; i < 3; i++) { Scanner sc = new Scanner(System.in); String employeeName = sc.nextLine(); String employeeAge = sc.nextLine(); //Employee employee = new Employee(employeeName, employeeAge); c.add(employeeName); c.add(employeeAge); } // 2、创建迭代器遍历集合 Iterator it = c.iterator(); //3、遍历 while (it.hasNext()) { //4、集合中对象未知,向下转型 Employee e = new Employee(); e.setName((String) it.next()); e.setAge(Integer.parseInt((String) it.next())); System.out.println(e.getName() + "---" + e.getAge()); } } }
实现一个简单的电信计费程序,针对手机的短信采用如下计费方式:
1、接收短信免费,发送短信0.1元/条,超过3条0.2元/条,超过5条0.3元/条。
2、如果一次发送短信的字符数量超过10个,按每10个字符一条短信进行计算。
输入:
输入信息包括两种类型
1、逐行输入南昌市手机用户开户的信息,每行一个用户。
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐 3-手机短信计费)
例如:u-13305862264 3
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题只针对类型3-手机短信计费。
2、逐行输入本月某些用户的短信信息,短信的格式:
m-主叫号码,接收号码,短信内容 (短信内容只能由数字、字母、空格、英文逗号、英文句号组成)
m-18907910010 13305862264 welcome to jiangxi.
m-13305862264 18907910010 thank you.
注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
输出:
根据输入的详细短信信息,计算所有已开户的用户的当月短信费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。
本题只做格式的错误判断,无需做内容上不合理的判断,比如同一个电话两条通讯记录的时间有重合、开户号码非南昌市的号码、自己给自己打电话等,此类情况都当成正确的输入计算。但时间的输入必须符合要求,比如不能输入2022.13.61 28:72:65。
本题只考虑短信计费,不考虑通信费用以及月租费。
源码如下:
import java.text.SimpleDateFormat; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); boolean b = true; User[] user = new User[200]; ArrayList<String> list = new ArrayList(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); String str1 = "u-0791\\d{7,8}"; String str2 = "t-0791[0-9]{7,8}\\s[0-9]{10,12}\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; String str3 = "u-1\\d{10}"; String str4 = "t-1\\d{10}\\s(0\\d{2,3})\\s(1\\d{10})\\s(0\\d{2,3})\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; String str5 = "t-1\\d{10}\\s(0\\d{2,3})\\s(\\d{10,12})\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; String str6 = "t-0791\\d{7,8}\\s(1\\d{10})\\s(0\\d{2,3})\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s[1-9]\\d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])\\s(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; String str7 = "m-1\\d{10}\\s(1\\d{10})\\s(.*?)"; String str8 = "m-1\\d{10}\\s[A-Za-z0-9 ,.]+"; String[] m = new String[200]; int x = -1, y = 0; while (b) { String str = in.nextLine(); String[] string = str.split(" "); if (str.equals("end")) { b = false; } if (string[0].matches(str1) || string[0].matches(str3)) { if (user[0] == null) { x++; String[] s1 = string[0].split("-"); user[x] = new User(); user[x].setNumber(s1[1]); } else { y = 0; for (int i = 0; user[i] != null; i++) { String[] s1 = string[0].split("-"); if (user[i].number.equals(s1[1])) { y = 1; } } if (y == 0) { x++; String[] s1 = string[0].split("-"); user[x] = new User(); user[x].setNumber(s1[1]); } } } else { for (int i = 0; i < x + 1; i++) { //发信息 if (str.matches(str8)) { MessageRecord messageRecord = new MessageRecord(); messageRecord.setCallingNumber(string[0].substring(2)); messageRecord.setMessage(string[2]); if (user[i].number.equals(string[0].substring(2))) { user[i].userRecords.addSendMessageRecords(messageRecord); } } } } } String[] arr = new String[x + 1]; for (int i = 0; i <= x; i++) { arr[i] = user[i].number; } Arrays.sort(arr, String::compareToIgnoreCase); for (int i = 0; i <= x; i++) { for (int j = 0; j <= x; j++) { if (user[j].number.equals(arr[i])) { User u; u = user[i]; user[i] = user[j]; user[j] = u; } } } LandLinePhoneCharging landLinePhoneCharging=new LandLinePhoneCharging(); for (int i = 0; i < x + 1; i++) { System.out.print(user[i].getNumber()+" "); System.out.print((String.format("%.1f", landLinePhoneCharging.calCost(user[i].userRecords)))+" "); System.out.print(user[i].getBalance() - landLinePhoneCharging.calCost(user[i].userRecords)); System.out.println(); } } } class User{ UserRecords userRecords=new UserRecords(); ChargeMode chargeMode; double balance=100; String number; public UserRecords getUserRecords() { return userRecords; } public void setUserRecords(UserRecords userRecords) { this.userRecords = userRecords; } public ChargeMode getChargeMode() { return chargeMode; } public void setChargeMode(ChargeMode chargeMode) { this.chargeMode = chargeMode; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } } class UserRecords{ ArrayList<CallRecord> callingInCityRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> callingInProvinceRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> callingInLandRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> callingInLandRecord1=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInCityRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInProvinceRecord=new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInLandRecord=new ArrayList<CallRecord>(); ArrayList<MessageRecord> sendMessageRecords=new ArrayList<MessageRecord>(); ArrayList<MessageRecord> receiveMessageRecords=new ArrayList<MessageRecord>(); ArrayList<MessageRecord> messageRecords=new ArrayList<MessageRecord>(); public void addMessage(MessageRecord messageRecord){ } public void addCallingInCityRecords(CallRecord callRecord){ callingInCityRecord.add(callRecord); } public void addCallingInProvinceRecords(CallRecord callRecord){ callingInProvinceRecord.add(callRecord); } public void addCallingInLandRecords(CallRecord callRecord){ callingInLandRecord.add(callRecord); } public void addCallingInLandRecords1(CallRecord callRecord){ callingInLandRecord1.add(callRecord); } public void answerCallingInCityRecords(CallRecord callRecord){ answerInCityRecord.add(callRecord); } public void answerCallingInProvinceRecords(CallRecord callRecord){ answerInProvinceRecord.add(callRecord); } public void answerCallingInLandRecords(CallRecord callRecord){ answerInLandRecord.add(callRecord); } public void addSendMessageRecords(MessageRecord messageRecord){ sendMessageRecords.add(messageRecord); } public void addReceiveMessageRecords(MessageRecord messageRecord){ receiveMessageRecords.add(messageRecord); } public ArrayList<CallRecord> getCallingInCityRecord() { return callingInCityRecord; } public ArrayList<CallRecord> getCallingInProvinceRecord() { return callingInProvinceRecord; } public ArrayList<CallRecord> getCallingInLandRecord() { return callingInLandRecord; } public ArrayList<CallRecord> getAnswerInCityRecord() { return answerInCityRecord; } public ArrayList<CallRecord> getAnswerInProvinceRecord() { return answerInProvinceRecord; } public ArrayList<CallRecord> getAnswerInLandRecord() { return answerInLandRecord; } public ArrayList<MessageRecord> getSendMessageRecords() { return sendMessageRecords; } public ArrayList<MessageRecord> getReceiveMessageRecords() { return receiveMessageRecords; } } abstract class ChargeMode{ ArrayList<ChargeMode> changeRule =new ArrayList<ChargeMode>(); public ArrayList<ChargeMode> getChangeRule() { return changeRule; } public void setChangeRule(ArrayList<ChargeMode> changeRule) { this.changeRule = changeRule; } double calCost(UserRecords userRecords) { return 0; } } class LandLinePhoneCharging extends ChangeRule{ double monthlyRent=20; double cost=0; double calCost(UserRecords userRecords){ cost = 0; int x=0; for(int i=0;i<userRecords.sendMessageRecords.size();i++) { if(userRecords.sendMessageRecords.get(i).getMessage().length()<=10) { x += 1; } if(userRecords.sendMessageRecords.get(i).getMessage().length()>10&&userRecords.sendMessageRecords.get(i).getMessage().length()<=20) { x += 2; } if(userRecords.sendMessageRecords.get(i).getMessage().length()>20&&userRecords.sendMessageRecords.get(i).getMessage().length()<=30) { x += 3; } if(userRecords.sendMessageRecords.get(i).getMessage().length()>30&&userRecords.sendMessageRecords.get(i).getMessage().length()<=40) { x += 4; } if(userRecords.sendMessageRecords.get(i).getMessage().length()>40&&userRecords.sendMessageRecords.get(i).getMessage().length()<=50) { x += 5; } if(userRecords.sendMessageRecords.get(i).getMessage().length()>50&&userRecords.sendMessageRecords.get(i).getMessage().length()<=60) { x += 6; } if(userRecords.sendMessageRecords.get(i).getMessage().length()>60&&userRecords.sendMessageRecords.get(i).getMessage().length()<=70) { x += 7; } if(userRecords.sendMessageRecords.get(i).getMessage().length()>70&&userRecords.sendMessageRecords.get(i).getMessage().length()<=80) { x += 8; } if(userRecords.sendMessageRecords.get(i).getMessage().length()>80&&userRecords.sendMessageRecords.get(i).getMessage().length()<=90) { x += 9; } if(x<=3){ cost=x*0.1; } if(x>3&&x<=5){ cost=0.3+(x-3)*0.2; } if(x>5){ cost=0.7+(x-5)*0.3; } } return cost; } } abstract class CommunicationRecord{ String callingNumber; String answerNumber; public void setCallingNumber(String callingNumber) { this.callingNumber = callingNumber; } public void setAnswerNumber(String answerNumber) { this.answerNumber = answerNumber; } } 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; } } class MessageRecord extends CommunicationRecord{ String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } abstract class ChangeRule{ } abstract class CallChangeRule extends ChangeRule { public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInCityRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInProvinceRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } } class LandPhoneInLandRule extends CallChangeRule{ public double calCost(ArrayList<CallRecord> callRecords){ return 0; } }

分析:
这次短信计费的模式,根据用户发送短信的数量以及长度进行话费的计算
设计:
我们首先要对输入的内容进行判断,和上面一样,进行开户,然后对用户发送的信息进行统计计算
编写一个类Shop(商店),该类中有一个成员内部类InnerCoupons(内部购物券),可以用于购买该商店的牛奶(假设每箱牛奶售价为50元)。要求如下:
(1)Shop类中有私有属性milkCount(牛奶的箱数,int类型)、公有的成员方法setMilkCount( )和getMilkCount( )分别用于设置和获取牛奶的箱数。
(2)成员内部类InnerCoupons,有公有属性value(面值,int类型),一个带参数的构造方法可以设定购物券的面值value,一个公有的成员方法buy( )要求输出使用了面值为多少的购物券进行支付,同时使商店牛奶的箱数减少value/50。
(3)Shop类中还有成员变量coupons50(面值为50元的内部购物券,类型为InnerCoupons)、coupons100(面值为100元的内部购物券,类型为InnerCoupons)。
(4)在Shop类的构造方法中,调用内部类InnerCoupons的带参数的构造方法分别创建上面的购物券coupons50、coupons100。
在测试类Main中,创建一个Shop类的对象myshop,从键盘输入一个整数(大于或等于3),将其设置为牛奶的箱数。假定有顾客分别使用了该商店面值为50的购物券、面值为100的购物券各消费一次,分别输出消费后商店剩下的牛奶箱数。
源码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num=sc.nextInt(); Shop myShop=new Shop(); myShop.setMilkCount(num); myShop.coupons50.buy(); myShop.coupons100.buy(); } } class Shop{ int milkCount; public int getMilkCount() { return milkCount; } InnerCoupons coupons50; InnerCoupons coupons100; Shop() { coupons50=new InnerCoupons(50); coupons100=new InnerCoupons(100); } public void setMilkCount(int milkCount) { this.milkCount = milkCount; } class InnerCoupons { int Value; InnerCoupons(int m) { Value = m; } void buy(){ if(Value==50){ milkCount-=Value/50; System.out.println("使用了面值为50的购物券进行支付"); System.out.println("牛奶还剩"+milkCount+"箱"); } else if(Value==100){ milkCount-=Value/50; System.out.println("使用了面值为100的购物券进行支付"); System.out.println("牛奶还剩"+milkCount+"箱"); } } } }
设计一个动物发生模拟器,用于模拟不同动物的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。
定义抽象类Animal,包含两个抽象方法:获取动物类别getAnimalClass()、动物叫shout();
然后基于抽象类Animal定义狗类Dog、猫类Cat和山羊Goat,用getAnimalClass()方法返回不同的动物类别(比如猫,狗,山羊),用shout()方法分别输出不同的叫声(比如喵喵、汪汪、咩咩)。
最后编写AnimalShoutTest类测试,输出:
猫的叫声:喵喵
狗的叫声:汪汪
山羊的叫声:咩咩
其中,在AnimalShoutTestMain类中,用speak(Animal animal){}方法输出动物animal的叫声,在main()方法中调用speak()方法,分别输出猫、狗和山羊对象的叫声。
源码如下:
public class Main { public static void main(String[] args) { Cat cat = new Cat(); Dog dog = new Dog(); Goat goat = new Goat(); speak(cat); speak(dog); speak(goat); } //定义静态方法speak() static void speak(Animal animal){ animal.getAnimalClass(); animal.shout(); System.out.println(""); } } //定义抽象类Animal abstract class Animal{ abstract void shout(); abstract void getAnimalClass(); } //基于Animal类,定义猫类Cat,并重写两个抽象方法 class Cat extends Animal{ @Override void shout() { System.out.print("喵喵"); } @Override void getAnimalClass() { System.out.print("猫的叫声:"); } } //基于Animal类,定义狗类Dog,并重写两个抽象方法 class Dog extends Animal{ @Override void shout() { System.out.print("汪汪"); } @Override void getAnimalClass() { System.out.print("狗的叫声:"); } } //基于Animal类,定义山羊类Goat,并重写两个抽象方法 class Goat extends Animal{ @Override void shout() { System.out.print("咩咩"); } @Override void getAnimalClass() { System.out.print("山羊的叫声:"); } }
(3)采坑心得:
设计电信计费一开始的存户我是想先对输入的信息进行筛选,然后把信息逐个存进list,再从list中的信息存入user,但是这样就无法对通话信息进行读取,所以后面采取了开户和通话记录存取同时进行,就解决了这个问题,还有就是计算两个日期之间的天数,需要用到日期类,还有就是电信计费的短信计费,只提供两个测试点,所以不知道自己的错误在哪,只能部分正确
(4)改进建议:
缩短主方法的内容,把判断输入信息以及存户,存记录,输出,分别用方法来写,提高代码的辨识度
(5)总结:
1.对于复杂的功能有了一定的规划能力以及对于程序的整体构思会比刚学进步很多;
2.对于编程应该有默认遵守的规则,在自己的编程过程中也犯过很多也花费了大量时间去修改自己代码的错误;
3.功能实现要慢慢来 不能急还有有些功能不要一想不出来就去查阅 不然很容易被思维局限住,先入为主的代入进去 后面完成一些别的功能就会更加复杂花费时间 。还是要因题而异,对功能进行规划;
4.对于编程整体的思想还有待学习以及非常需要细心;
5.在一个问题上不能一味的死磕,导致时间的大量浪费
6.自己的能力还有很大的提升空间

浙公网安备 33010602011771号