首页 > 其他分享 >BLOG-3

BLOG-3

时间:2022-12-10 22:22:18浏览次数:27  
标签:return String double ArrayList BLOG new public

(一)前言

(1)知识点

1.ArrayList类的使用

2.输入字符串的处理

3.类设计的搭建与实现

4.SimpleDateFormat类实现输入时间格式化处理

 

(2)题量

三次以电信计费系列为主的pta,其他题目都比较基础。

 

(3)难度

相比之前的四边形所需的算法部分简单很多,主要是程序设计,但是代码量还是很大,还是要花时间,由于我水平有限,借鉴了很多网上代码。虽然课程结束了,之后假期还是要花时间。

(二)设计与分析

7-1 电信计费系列1-座机计费 分数 80 作者 蔡轲 单位 南昌航空大学

实现一个简单的电信计费程序:
假设南昌市电信分公司针对市内座机用户采用的计费方式:
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
南昌市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。

错误处理:
输入数据中出现的不符合格式要求的行一律忽略。

建议类图:
参见图1、2、3,可根据理解自行调整:

image.png

 

 

  1 import java.util.*;
  2 import java.text.*;
  3 public class Main {
  4     public static void main(String[] args) throws ParseException {
  5         Scanner input = new Scanner(System.in);
  6         ArrayList<String> informationString=new ArrayList<>();//字符串
  7         ArrayList<char[]> informationChar=new ArrayList<>();//字符串转为字符
  8         ArrayList<User> user=new ArrayList<>(); //用户列表
  9         String str="end";
 10         String regex1 = "^u-(1[0-9]{10} 1|0[0-9]{9,11} 0)$";
 11         String regex2 = "^t-1[0-9]{10} 0[0-9]{2,3} 1[0-9]{10} 0[0-9]{2,3} [0-9]{4}.[0-9]{1,2}.[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{4}.[0-9]{1,2}.[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}$";//手机打手机
 12         String regex3 = "^t-0[0-9]{9,11} 1[0-9]{10} 0[0-9]{2,3} [0-9]{4}.[0-9]{1,2}.[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{4}.[0-9]{1,2}.[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}$";//座机打手机
 13         String regex4 = "^t-1[0-9]{10} 0[0-9]{2,3} 0[0-9]{9,11} [0-9]{4}.[0-9]{1,2}.[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{4}.[0-9]{1,2}.[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}$";//手机打座机
 14         String regex5 = "^t-0[0-9]{9,11} 0[0-9]{9,11} [0-9]{4}.[0-9]{1,2}.[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{4}.[0-9]{1,2}.[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}$";//座机打座机
 15         String regex6 = "^[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$";
 16 
 17         while(true) { //输入信息并获取
 18             String cin=input.nextLine();
 19             if(cin.equals(str)) { //判断输入的是否为end结束符
 20                break;
 21             }
 22             informationString.add(cin);
 23         }
 24         int isSecondRow1 = 0; //在类型1下记录用户个数
 25         boolean isSame1 = false; //判断是否用户相同
 26         for(int j=0;j<informationString.size();j++) { //将信息进行分割
 27             if(informationString.get(j).toCharArray().length!=0) {
 28             informationChar.add(informationString.get(j).toCharArray());//将字符串变为字符数组
 29             boolean flag1 = informationString.get(j).matches(regex1);
 30             boolean flag2 = informationString.get(j).matches(regex2);//手机打手机
 31             boolean flag3 = informationString.get(j).matches(regex3);//座机打手机
 32             boolean flag4 = informationString.get(j).matches(regex4);//手机打座机
 33             boolean flag5 = informationString.get(j).matches(regex5);//座机打座机
 34             //输入类型1,以u开头进行用户开户
 35             //if(informationChar.get(j)[0]=='u') {
 36             if(flag1==true) {
 37                 int number=-1;
 38                 isSecondRow1++;
 39                 String []thirdString = informationString.get(j).split("[- ]");//将第一种信息分割成三个要第二个
 40                 if(isSecondRow1>=2) { //从第二个用户开始进行判断是否重复与比大小
 41                     isSame1 = false;
 42                     int recordPlace =0; //记录插入时列表的位置
 43                     for(int k=0;k<user.size();k++) {//在用户列表从开始到结束进行判断
 44                         if(thirdString[1].equals(user.get(k).getNumber())) {//判断第二个用户是否与用户列表中的用户相同
 45                             isSame1 = true; //相同直接跳出查询
 46                             break;
 47                         }
 48                         if(thirdString[1].charAt(0)==user.get(k).getNumber().charAt(0)) {
 49                             if(thirdString[1].compareTo(user.get(k).getNumber())<0 ) {
 50                                 //System.out.println("here");
 51                                 recordPlace=k;
 52                             }
 53                             else {
 54                                 recordPlace++; //使用这个目的为了不让程序继续无意义的比下去而浪费时间,在之后没有在用到
 55                             }
 56                         }
 57                         else {
 58                             if( thirdString[1].charAt(0)>user.get(k).getNumber().charAt(0) ) {
 59                                 recordPlace++;
 60                             }
 61                         }
 62                     }
 63                     if(!isSame1) { //用户不同,需要添加到用户列表里
 64                         user.add(recordPlace,new User());//给用户开户并按照大小顺序进行插入
 65                         user.get(recordPlace).setNumber(thirdString[1]);
 66                         if( thirdString[2].charAt(0)=='0' )    user.get(recordPlace).selectCharge='0';
 67                         if( thirdString[2].charAt(0)=='1' )    user.get(recordPlace).selectCharge='1';
 68                     }
 69                 }
 70                 else { //第一个用户,直接放到用户列表中;从第二个开始进行判断
 71                     user.add(new User());//给用户开户
 72                     user.get(++number).setNumber(thirdString[1]);
 73                     if( thirdString[2].charAt(0)=='0' )    user.get(number).selectCharge='0';
 74                     if( thirdString[2].charAt(0)=='1' )    user.get(number).selectCharge='1';
 75                 }
 76             }
 77 
 78             else {
 79                 String []fiveString = informationString.get(j).split("[- ]");//将第二种信息分割成七个
 80                 if(flag5) {    //座机打座机
 81                     for(int k=0;k<user.size();k++) { //在用户列表从开始到结束进行判断
 82                     if(fiveString[1].equals(user.get(k).getNumber())) { //用户的通讯信息与号码进行匹配
 83                         CallRecord callRecord1 = new CallRecord(); //通话记录
 84                         callRecord1.setCallingNumber(fiveString[1]);//拨打电话号
 85                         callRecord1.setAnswerNumber(fiveString[2]);//就听电话号
 86                         callRecord1.setCallingAddressAreaCode(fiveString[1].substring(0,4));//拨打电话的区号
 87                         callRecord1.setAnswerAddressAreaCode(fiveString[2].substring(0,4));//接收电话的区号
 88                         String startTime1 =fiveString[3]+" "+fiveString[4];    //传入开始时间
 89                         String endTime =fiveString[5]+" "+fiveString[6]; //传入结束时间
 90                         boolean flag6=startTime1.matches(regex6);
 91                         boolean flag7=endTime.matches(regex6);
 92                         if(flag6==true&&flag7==true) {
 93                         SimpleDateFormat totalUse1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//固定格式
 94                         Date ss1 = totalUse1.parse(startTime1);
 95                         callRecord1.setStartTime(ss1);
 96                         Date ss2 = totalUse1.parse(endTime);
 97                         callRecord1.setEndTime(ss2);
 98                         if( (judgeQuHao(fiveString[1],0)==judgeQuHao(fiveString[2],0)&&(judgeQuHao(fiveString[1],0)==1)||judgeQuHao(fiveString[1],0)==2) ) { //市内1、省内2、国内3
 99                             user.get(k).getUserRecords().addCallingInCityRecords(callRecord1);
100                         }
101                         else if( (judgeQuHao(fiveString[1],0)!=judgeQuHao(fiveString[2],0))&&( judgeQuHao(fiveString[1],0)==1||judgeQuHao(fiveString[1],0)==2 )&&( judgeQuHao(fiveString[2],0)==1||judgeQuHao(fiveString[2],0)==2 ) ) {
102                             user.get(k).getUserRecords().addCallingInProvinceRecords(callRecord1);
103                         }
104                         else {
105                             user.get(k).getUserRecords().addCallingInLandRecords(callRecord1);
106                         }
107                     }
108                     }
109                 }
110                 }
111             //    if(regex3==true) {//座机与手机互打
112                     if(flag3) {//座机在前面
113                         boolean judge1=true;
114                         for(int k=0;k<user.size();k++) { //在用户列表从开始到结束进行判断
115                             if(fiveString[1].equals(user.get(k).getNumber())) { //用户的通讯信息与号码进行匹配
116                                 judge1=false; //当打电话的人没开户时
117                                 CallRecord callRecord1 = new CallRecord(); //创建通话记录
118                                 callRecord1.setCallingNumber(fiveString[1]);//拨打电话号
119                                 callRecord1.setAnswerNumber(fiveString[2]);//接听电话号
120                                 callRecord1.setCallingAddressAreaCode(fiveString[1].substring(0,4));//拨打电话的区号
121                                 callRecord1.setAnswerAddressAreaCode(fiveString[3]);//接收电话的区号
122                                 String startTime1 =fiveString[4]+" "+fiveString[5];    //传入开始时间
123                                 String endTime =fiveString[6]+" "+fiveString[7]; //传入结束时间
124                                 boolean flag6=startTime1.matches(regex6);
125                                 boolean flag7=endTime.matches(regex6);
126                                 if(flag6==true&&flag7==true) {
127                                 SimpleDateFormat totalUse1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//固定格式
128                                 Date ss1 = totalUse1.parse(startTime1);
129                                 callRecord1.setStartTime(ss1);
130                                 Date ss2 = totalUse1.parse(endTime);
131                                 callRecord1.setEndTime(ss2);
132                                 //判断接听区号
133                                 if( judgeQuHao(fiveString[1],0)==1 ){
134                                     //判断接电话的人在哪里
135                                     //接电话的人也在市内,则将打电话人的用户记录添加到市内拨打记录列表里
136                                     if( judgeQuHao(fiveString[3],1)==1 ) {
137                                         user.get(k).getUserRecords().addCallingInCityRecords(callRecord1);
138                                     }
139                                     //接电话的人在省内,则将打电话人的用户记录添加到省内拨打记录列表里
140                                     else if( judgeQuHao(fiveString[3],1)==2 ) {
141                                         user.get(k).getUserRecords().addCallingInProvinceRecords(callRecord1);
142                                     }
143                                     //接电话的人在省外,则将打电话人的用户记录添加到省外拨打记录列表里,并将接电话的人记录添加到省外
144                                     else if( judgeQuHao(fiveString[3],1)==3 ) {
145                                         user.get(k).getUserRecords().addCallingInLandRecords(callRecord1);
146                                         int q;
147                                         for(q=0;q<user.size();q++) {
148                                             if( fiveString[2].equals(user.get(q).getNumber()) )    break;
149                                         }
150                                         if(q!=user.size()) {
151                                             user.get(q).getUserRecords().addAnswerLandRecords(callRecord1);
152                                         }
153                                     }
154                                 }
155                             }
156                             }
157                         }
158                         if(judge1==true) {
159                             CallRecord callRecord1 = new CallRecord(); //创建通话记录
160                             callRecord1.setCallingNumber(fiveString[1]);//拨打电话号
161                             callRecord1.setAnswerNumber(fiveString[2]);//接听电话号
162                             callRecord1.setCallingAddressAreaCode(fiveString[1].substring(0,4));//拨打电话的区号
163                             callRecord1.setAnswerAddressAreaCode(fiveString[3]);//接收电话的区号
164                             String startTime1 =fiveString[4]+" "+fiveString[5];    //传入开始时间
165                             String endTime =fiveString[6]+" "+fiveString[7]; //传入结束时间
166                             boolean flag6=startTime1.matches(regex6);
167                             boolean flag7=endTime.matches(regex6);
168                             if(flag6==true&&flag7==true) {
169                             SimpleDateFormat totalUse1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//固定格式
170                             Date ss1 = totalUse1.parse(startTime1);
171                             callRecord1.setStartTime(ss1);
172                             Date ss2 = totalUse1.parse(endTime);
173                             callRecord1.setEndTime(ss2);
174                             //打电话的人在省外,走省外漫游,
175                             if( judgeQuHao(fiveString[3],1)==3 ) {
176                                     int q;
177                                     for(q=0;q<user.size();q++) {
178                                         if( fiveString[2].equals(user.get(q).getNumber()) )    break;
179                                     }
180                                     if(q!=user.size())  user.get(q).getUserRecords().addAnswerLandRecords(callRecord1);
181                             }
182                         }
183                     }
184                     }
185                     //手机打座机
186                     if(flag4==true) {
187                         for(int k=0;k<user.size();k++) { //在用户列表从开始到结束进行判断
188                             if(fiveString[1].equals(user.get(k).getNumber())) { //用户的通讯信息与号码进行匹配
189                                 CallRecord callRecord1 = new CallRecord(); //创建通话记录
190                                 callRecord1.setCallingNumber(fiveString[1]);//拨打电话号
191                                 callRecord1.setAnswerNumber(fiveString[3]);//接听电话号
192                                 callRecord1.setCallingAddressAreaCode(fiveString[2]);//拨打电话的区号
193                                 callRecord1.setAnswerAddressAreaCode(fiveString[3].substring(0,4));//接收电话的区号
194                                 String startTime1 =fiveString[4]+" "+fiveString[5];    //传入开始时间
195                                 String endTime =fiveString[6]+" "+fiveString[7]; //传入结束时间
196                                 boolean flag6=startTime1.matches(regex6);
197                                 boolean flag7=endTime.matches(regex6);
198                                 if(flag6==true&&flag7==true) {
199                                 SimpleDateFormat totalUse1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//固定格式
200                                 Date ss1 = totalUse1.parse(startTime1);
201                                 callRecord1.setStartTime(ss1);
202                                 Date ss2 = totalUse1.parse(endTime);
203                                 callRecord1.setEndTime(ss2);
204                                 //判断接听区号
205                                 if( judgeQuHao(fiveString[2],1)==1 ){
206                                     user.get(k).getUserRecords().addNewCallingInCityRecords(callRecord1);    //改了
207                                 }
208                                 else if( judgeQuHao(fiveString[2],1)==2 ) {
209                                     user.get(k).getUserRecords().addCallingInProvinceRecords(callRecord1);
210                                 }
211                                 else if(judgeQuHao(fiveString[2],1)==3) {
212                                     user.get(k).getUserRecords().addCallingInLandRecords(callRecord1);
213                                 }
214                             }
215                         }
216                         }
217                     }
218             //    }
219                 if(flag2) {//手机打手机
220                     boolean judge1=true;
221                     for(int k=0;k<user.size();k++) { //在用户列表从开始到结束进行判断
222                         if(fiveString[1].equals(user.get(k).getNumber())) { //用户的通讯信息与号码进行匹配
223                             judge1=false; //当打电话的人没开户时
224                             CallRecord callRecord1 = new CallRecord(); //创建通话记录
225                             callRecord1.setCallingNumber(fiveString[1]);//拨打电话号
226                             callRecord1.setAnswerNumber(fiveString[3]);//接听电话号
227                             callRecord1.setCallingAddressAreaCode(fiveString[2]);//拨打电话的区号
228                             callRecord1.setAnswerAddressAreaCode(fiveString[4]);//接收电话的区号
229                             String startTime1 =fiveString[5]+" "+fiveString[6];    //传入开始时间
230                             String endTime =fiveString[7]+" "+fiveString[8]; //传入结束时间
231                             boolean flag6=startTime1.matches(regex6);
232                             boolean flag7=endTime.matches(regex6);
233                             if(flag6==true&&flag7==true) {
234                             SimpleDateFormat totalUse1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//固定格式
235                             Date ss1 = totalUse1.parse(startTime1);
236                             callRecord1.setStartTime(ss1);
237                             Date ss2 = totalUse1.parse(endTime);
238                             callRecord1.setEndTime(ss2);
239                             //分别判断两个号的区号,在长度为9中,都是手机号,没有座机号,
240                             //打电话的人在本市内打
241                             if( judgeQuHao(fiveString[2],1)==1 ){
242                                 //判断接电话的人在哪里
243                                 //接电话的人也在市内,则将打电话人的用户记录添加到市内拨打记录列表里
244                                 if( judgeQuHao(fiveString[4],1)==1 ) {
245                                     user.get(k).getUserRecords().addNewCallingInCityRecords(callRecord1);
246                                 }
247                                 //接电话的人在省内,则将打电话人的用户记录添加到省内拨打记录列表里
248                                 else if( judgeQuHao(fiveString[4],1)==2 ) {
249                                     user.get(k).getUserRecords().addNewCallingInProvinceRecords(callRecord1);
250                                 }
251                                 //接电话的人在省外,则将打电话人的用户记录添加到省外拨打记录列表里,并将接电话的人记录添加到省外
252                                 else if( judgeQuHao(fiveString[4],1)==3 ) {
253                                     user.get(k).getUserRecords().addNewCallingInLandRecords(callRecord1);
254                                     int q;
255                                     for(q=0;q<user.size();q++) {
256                                         if( fiveString[3].equals(user.get(q).getNumber()) )    break;
257                                     }
258                                     if(q!=user.size()) {
259                                         user.get(q).getUserRecords().addAnswerLandRecords(callRecord1);
260                                     }
261                                 }
262                             }
263                             //打电话的人在省内,走省内漫游,
264                         else if( judgeQuHao(fiveString[2],1)==2 ) {
265                                 //判断接电话人的位置
266                                 //先判断接电话的人在省外,
267                                 if( judgeQuHao(fiveString[4],1)==3 ) {
268                                     int q;
269                                     for(q=0;q<user.size();q++) {
270                                         if( fiveString[3].equals(user.get(q).getNumber()) )    break;
271                                     }
272                                     if(q!=user.size())  user.get(q).getUserRecords().addAnswerLandRecords(callRecord1);
273                                 }
274                                 user.get(k).getUserRecords().addCallingInProvinceRecords(callRecord1);
275                             }
276                             //打电话的人在省外,走省外漫游,
277                             else if( judgeQuHao(fiveString[2],1)==3 ) {
278                                 //判断接电话人的位置
279                                 //先判断接电话的人在省外,
280                                 if( judgeQuHao(fiveString[4],1)==3 ) {
281                                     int q;
282                                     for(q=0;q<user.size();q++) {
283                                         if( fiveString[3].equals(user.get(q).getNumber()) )    break;
284                                     }
285                                     if(q!=user.size())  user.get(q).getUserRecords().addAnswerLandRecords(callRecord1);
286                                 }
287                                 user.get(k).getUserRecords().addCallingInLandRecords(callRecord1);
288                             }
289                         }
290                     }
291                     }
292                     if(judge1==true) {
293                         CallRecord callRecord1 = new CallRecord(); //创建通话记录
294                         callRecord1.setCallingNumber(fiveString[1]);//拨打电话号
295                         callRecord1.setAnswerNumber(fiveString[3]);//接听电话号
296                         callRecord1.setCallingAddressAreaCode(fiveString[2]);//拨打电话的区号
297                         callRecord1.setAnswerAddressAreaCode(fiveString[4]);//接收电话的区号
298                         String startTime1 =fiveString[5]+" "+fiveString[6];    //传入开始时间
299                         String endTime =fiveString[7]+" "+fiveString[8]; //传入结束时间
300                         boolean flag6=startTime1.matches(regex6);
301                         boolean flag7=endTime.matches(regex6);
302                         if(flag6==true&&flag7==true) {
303                         SimpleDateFormat totalUse1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//固定格式
304                         Date ss1 = totalUse1.parse(startTime1);
305                         callRecord1.setStartTime(ss1);
306                         Date ss2 = totalUse1.parse(endTime);
307                         callRecord1.setEndTime(ss2);
308                             //接电话的人只判断是否在省外,
309                             if( judgeQuHao(fiveString[4],1)==3 ) {
310                                 int q;
311                                 for(q=0;q<user.size();q++) {
312                                     if( fiveString[3].equals(user.get(q).getNumber()) )    break;
313                                 }
314                                 if(q!=user.size())  user.get(q).getUserRecords().addAnswerLandRecords(callRecord1);
315                             }
316                     }
317                         }
318                     }
319                 }
320         }
321     }
322         for(int j=0;j<user.size();j++) {
323             LandlinePhoneCharging landlinePhoneCharging =new LandlinePhoneCharging();
324             user.get(j).setChargeMode(landlinePhoneCharging);
325             user.get(j).calBalance();
326             if(j==user.size()-1){
327                 System.out.print(user.get(j).getNumber()+" "+user.get(j).calCost()+" "+user.get(j).getBalance());
328             }
329             else
330                 System.out.println(user.get(j).getNumber()+" "+user.get(j).calCost()+" "+user.get(j).getBalance());
331         }
332     }
333     public static int judgeQuHao(String s,int select) { //判断是市内、省内、国内
334         String s1 = new String();
335         if(select==0)  s1 = s.substring(0,4); //将前四位截取出来
336         else if(select==1)     s1 = s;
337         int s2 = Integer.parseInt(s1); //将其转为数字
338         if(s2==791)   return 1; //判断市内
339         else {
340             if( (s2>=790&&s2<=799) || s2==701 )    return 2; //判断省内
341             return 3; //判断国内
342         }
343     }
344 
345 }
346 
347 class User{
348     public char selectCharge ='0';
349     private UserRecords userRecords = new UserRecords(); //用户记录
350     private double balance = 100; //余额
351     private ChargeMode chargeMode; //计费方式
352     private String number; //号码
353     public double calBalance()  //拨打余额
354     {
355         double bal=this.balance;
356         double a1=chargeMode.calCost(userRecords);
357         double b2=chargeMode.getMonthlyRent(selectCharge); //返回月租
358         this.balance=bal-a1-b2;
359         return Double.parseDouble(String.format("%.1f",balance));
360     }
361     public double calCost() //拨打费用
362     {
363         double a2=chargeMode.calCost(userRecords);
364         return Double.parseDouble(String.format("%.1f",a2));
365     }
366     public UserRecords getUserRecords()
367     {
368         return userRecords;
369     }
370     public void setUserRecords(UserRecords userRecords) //设置该用户记录
371     {
372         this.userRecords = userRecords;
373     }
374     public double getBalance() //返回余额
375     {
376         return balance;
377     }
378     public ChargeMode getChargeMode()
379     {
380         return chargeMode;
381     }
382     public void setChargeMode(ChargeMode chargeMode)
383     {
384         this.chargeMode = chargeMode;
385     }
386     public String getNumber() //返回此用户号码判断是否为同一用户
387     {
388         return number;
389     }
390     public void setNumber(String number) //创建用户时设置号码
391     {
392         this.number=number;
393     }
394 }
395 
396 abstract class ChargeMode{ //计费方式的抽象类
397     public abstract double calCost(UserRecords userRecords) ;
398     public abstract double getMonthlyRent(char selectCharge);//返回月租
399 }
400 
401 class LandlinePhoneCharging extends ChargeMode{//固定电话缴费
402     private double monthlyRent = 20; //以前月租
403     private double monthlyRent1 = 15;//新模式月租
404     @Override
405     public double calCost(UserRecords userRecords)
406     {
407         ArrayList<ChargeRule> chargeRules1=new ArrayList<ChargeRule>();
408         LandPhoneInCityRule landPhoneInCityRule=new LandPhoneInCityRule();
409         LandPhoneInProvinceRule landPhoneInProvinceRule=new LandPhoneInProvinceRule();
410         LandPhoneInLandRule landPhoneInLandRule=new LandPhoneInLandRule();
411         newLandPhoneInCityRule newlandPhoneInCityRule=new newLandPhoneInCityRule();
412         newLandPhoneInProvinceRule newlandPhoneInProvinceRule=new newLandPhoneInProvinceRule();
413         newLandPhoneInLandRule newlandPhoneInLandRule=new newLandPhoneInLandRule();
414         AnswerInLandRule answerInLandRecords = new AnswerInLandRule();
415         chargeRules1.add(landPhoneInCityRule);
416         chargeRules1.add(landPhoneInProvinceRule);
417         chargeRules1.add(landPhoneInLandRule);
418         chargeRules1.add(newlandPhoneInCityRule);
419         chargeRules1.add(newlandPhoneInProvinceRule);
420         chargeRules1.add(newlandPhoneInLandRule);
421         chargeRules1.add(answerInLandRecords);
422         double a=chargeRules1.get(0).calCost(userRecords.getCallingInCityRecords());
423         double b=chargeRules1.get(1).calCost(userRecords.getCallingInProvinceRecords());
424         double c=chargeRules1.get(2).calCost(userRecords.getCallingInLandRecords());
425         double d=chargeRules1.get(3).calCost(userRecords.getNewCallingInCityRecords());
426         double e=chargeRules1.get(4).calCost(userRecords.getNewCallingInProvinceRecords());
427         double f=chargeRules1.get(5).calCost(userRecords.getNewCallingInLandRecords());
428         double g=chargeRules1.get(6).calCost(userRecords.getAnswerInLandRecords());
429 //        System.out.println(a);
430 //        System.out.println(b);
431 //        System.out.println(c);
432 //        System.out.println(d);
433 //        System.out.println(e);
434 //        System.out.println(f);
435 //        System.out.println(g);
436         return a+b+c+d+e+f+g;
437     }
438     @Override
439     public double getMonthlyRent(char selectCharge){
440         if(selectCharge=='0')  return monthlyRent;
441         else  return monthlyRent1;
442     }
443 }
444 
445 class UserRecords { //用户记录类,保存用户各种通话、短信的记录
446     private ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>(); //市内拨打电话记录列表
447     private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>(); //省内拨打电话记录列表
448     private ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>(); //国内拨打电话记录列表
449 
450     private ArrayList<CallRecord> newCallingInCityRecords = new ArrayList<CallRecord>(); //新款市内拨打电话记录列表
451     private ArrayList<CallRecord> newCallingInProvinceRecords = new ArrayList<CallRecord>(); //新款省内拨打电话记录列表
452     private ArrayList<CallRecord> newCallingInLandRecords = new ArrayList<CallRecord>(); //新款国内拨打电话记录列表
453 
454     private ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>(); //市内接听电话记录列表
455     private ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();//省内接听电话记录列表
456     private ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>(); //国内接听电话记录列表
457     private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
458     private ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
459     public void addCallingInCityRecords(CallRecord callRecord) {
460         callingInCityRecords.add(callRecord);
461     }
462     public void addCallingInProvinceRecords(CallRecord callRecord) {
463         callingInProvinceRecords.add(callRecord);
464     }
465     public void addCallingInLandRecords(CallRecord callRecord) {
466         callingInLandRecords.add(callRecord);
467     }
468     public void addNewCallingInCityRecords(CallRecord callRecord) { //新的
469         newCallingInCityRecords.add(callRecord);
470     }
471     public void addNewCallingInProvinceRecords(CallRecord callRecord) {//新的
472         newCallingInProvinceRecords.add(callRecord);
473     }
474     public void addNewCallingInLandRecords(CallRecord callRecord) {//新的
475         newCallingInLandRecords.add(callRecord);
476     }
477     public void addAnswerlnCityRecords(CallRecord answerRecord) {
478         answerInCityRecords.add(answerRecord);
479     }
480     public void addAnswerlnProvinceRecords(CallRecord answerRecord) {
481         answerInProvinceRecords.add(answerRecord);
482     }
483     public void addAnswerLandRecords(CallRecord answerRecord) {
484         answerInLandRecords.add(answerRecord);
485     }
486     public void addSendMessageRecords(MessageRecord sendMessageRecord){
487         sendMessageRecords.add(sendMessageRecord);
488     }
489     public void addReceiveMessageRecords(MessageRecord receiveMessageRecord){
490         receiveMessageRecords.add(receiveMessageRecord);
491     }
492     public ArrayList<MessageRecord> getSendMessageRecords(){
493         return sendMessageRecords;
494     }
495     public ArrayList<MessageRecord> getReceiveMessageRecords(){
496         return receiveMessageRecords;
497     }
498     public ArrayList<CallRecord> getCallingInCityRecords(){ //返回市内拨打记录
499         return callingInCityRecords;
500     }
501     public ArrayList<CallRecord> getCallingInProvinceRecords(){
502         return callingInProvinceRecords;
503     }
504     public ArrayList<CallRecord> getCallingInLandRecords(){
505         return callingInLandRecords;
506     }
507     public ArrayList<CallRecord> getNewCallingInCityRecords(){ //返回新款市内拨打记录
508         return newCallingInCityRecords;
509     }
510     public ArrayList<CallRecord> getNewCallingInProvinceRecords(){
511         return newCallingInProvinceRecords;
512     }
513     public ArrayList<CallRecord> getNewCallingInLandRecords(){
514         return newCallingInLandRecords;
515     }
516     public ArrayList<CallRecord> getAnswerInCityRecords(){
517         return answerInCityRecords;
518     }
519     public ArrayList<CallRecord> getAnswerInProvinceRecords(){
520         return answerInProvinceRecords;
521     }
522     public ArrayList<CallRecord> getAnswerInLandRecords(){
523         return answerInLandRecords;
524     }
525 }
526 
527 abstract class CommunicationRecord { //抽象的通讯记录类
528     protected String callingNumber; //拨打号码
529     protected String answerNumber; //接听号码
530 
531     public String getCallingNumber() {
532         return callingNumber;
533     }
534     public void setCallingNumber(String callingNumber) {
535         this.callingNumber = callingNumber;
536     }
537 
538     public String getAnswerNumber() {
539         return answerNumber;
540     }
541     public void setAnswerNumber(String answerNumber) {
542         this.answerNumber = answerNumber;
543     }
544 }
545 
546 class CallRecord extends CommunicationRecord{ //通话记录
547     private Date startTime; //通话的起始时间
548     private Date endTime; //通话的结束时间
549     private String callingAddressAreaCode; //拨号地点的区号
550     private String answerAddressAreaCode; //接听地点的区号
551     public Date getStartTime() { //返回起始时间
552         return startTime;
553     }
554     public void setStartTime(Date startTime) { //设置起始时间
555         this.startTime = startTime;
556     }
557     public Date getEndTime() { //返回结束时间
558         return endTime;
559     }
560     public void setEndTime(Date endTime) { //设置结束时间
561         this.endTime = endTime;
562     }
563     public String getCallingAddressAreaCode() {
564         return callingAddressAreaCode;
565     }
566     public void setCallingAddressAreaCode(String callingAddressAreaCode) {
567         this.callingAddressAreaCode = callingAddressAreaCode;
568     }
569     public String getAnswerAddressAreaCode() {
570         return answerAddressAreaCode;
571     }
572     public void setAnswerAddressAreaCode(String answerAddressAreaCode) {
573         this.answerAddressAreaCode = answerAddressAreaCode;
574     }
575 
576 }
577 
578 class MessageRecord extends CommunicationRecord{ //短信记录
579     private String message;
580 
581     public String getMessage() {
582         return message;
583     }
584 
585     public void setMessage(String message) {
586         this.message = message;
587     }
588 
589 }
590 
591 abstract class ChargeRule {
592     public double calCost(ArrayList<CallRecord> callingInCityRecords){//计费规则
593         return 1;
594     }
595 }
596 abstract  class CallChargeRule extends ChargeRule{
597     public double calCost(ArrayList<CallRecord> callingInCityRecords){//计费规则
598         return 1;
599     }
600 }
601 class LandPhoneInCityRule extends CallChargeRule{ //座机拨打市内电话的计费规则类
602     public double calCost(ArrayList<CallRecord> callRecords) {
603         double cost = 0;
604         for(int i=0;i<callRecords.size();i++) {
605             long totoalTime = callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime();
606             if(totoalTime%60000>=1) {
607                 totoalTime = totoalTime/60000+1;
608             }
609             else totoalTime = totoalTime/60000;
610             cost+=totoalTime*0.1;
611         }
612         return cost;
613     }
614 }
615 class LandPhoneInProvinceRule extends CallChargeRule{//座机拨打省内电话的计费规则类
616     public double calCost(ArrayList<CallRecord> callRecords) {
617         double cost = 0;
618         for(int i=0;i<callRecords.size();i++) {
619             long totoalTime = callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime();
620             if(totoalTime%60000>=1) {
621                 totoalTime = totoalTime/60000+1;
622             }
623             else totoalTime = totoalTime/60000;
624             cost+=totoalTime*0.3;
625         }
626         return cost;
627     }
628 }
629 class LandPhoneInLandRule extends CallChargeRule{//座机拨打省外电话的计费规则类
630     public double calCost(ArrayList<CallRecord> callRecords) {
631         double cost = 0;
632         for(int i=0;i<callRecords.size();i++) {
633             long totoalTime = callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime();
634             if(totoalTime%60000>1) {
635                 totoalTime = totoalTime/60000+1;
636             }
637             else totoalTime = totoalTime/60000;
638             cost+=totoalTime*0.6;
639         }
640         return cost;
641     }
642 }
643 class newLandPhoneInCityRule extends CallChargeRule{ //新座机拨打市内电话的计费规则类
644     public double calCost(ArrayList<CallRecord> callRecords) {
645         double cost = 0;
646         for(int i=0;i<callRecords.size();i++) {
647             long totoalTime = callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime();
648             if(totoalTime%60000>1) {
649                 totoalTime = totoalTime/60000+1;
650             }
651             else totoalTime = totoalTime/60000;
652             cost+=totoalTime*0.1;
653         }
654         return cost;
655     }
656 }
657 class newLandPhoneInProvinceRule extends CallChargeRule{//新座机拨打省内电话的计费规则类
658     public double calCost(ArrayList<CallRecord> callRecords) {
659         double cost = 0;
660         for(int i=0;i<callRecords.size();i++) {
661             long totoalTime = callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime();
662             if(totoalTime%60000>=1) {
663                 totoalTime = totoalTime/60000+1;
664             }
665             else totoalTime = totoalTime/60000;
666             cost+=totoalTime*0.2;
667         }
668         return cost;
669     }
670 }
671 class newLandPhoneInLandRule extends CallChargeRule{//新座机拨打省外电话的计费规则类
672     public double calCost(ArrayList<CallRecord> callRecords) {
673         double cost = 0;
674         for(int i=0;i<callRecords.size();i++) {
675             long totoalTime = callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime();
676             if(totoalTime%60000>=1) {
677                 totoalTime = totoalTime/60000+1;
678             }
679             else totoalTime = totoalTime/60000;
680             cost+=totoalTime*0.3;
681         }
682         return cost;
683     }
684 }
685 class AnswerInLandRule extends CallChargeRule{//座机拨打省外电话的计费规则类
686         public double calCost(ArrayList<CallRecord> callRecords) {
687             double cost = 0;
688             for(int i=0;i<callRecords.size();i++) {
689                 long totoalTime = callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime();
690                 if(totoalTime%60000>=1) {
691                     totoalTime = totoalTime/60000+1;
692                 }
693                 else totoalTime = totoalTime/60000;
694                 cost+=totoalTime*0.3;
695             }
696             return cost;
697         }
698     }
699 abstract class MessageChargeRule{
700     public abstract double calCost(ArrayList<MessageRecord> messageRecords);
701 }
702 class SendMessageRule extends MessageChargeRule{
703     @Override
704     public double calCost(ArrayList<MessageRecord> messageRecords) {
705         return 1;
706     }
707 }
View Code

按类图编写代码,由于代码部分设计有缺陷,多个用户综合计算会运行超时。代码重复度高,还需改进。

7-2 多态测试 分数 20 作者 董卫萍 单位 绍兴文理学院元培学院

定义容器Container接口。模拟实现一个容器类层次结构,并进行接口的实现、抽象方法重写和多态机制测试。各容器类实现求表面积、体积的方法。

  1. 定义接口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[]);
    其中两个静态方法分别计算返回容器数组中所有对象的面积之和、周长之和;
  2. 定义Cube类、Cylinder类均实现自Container接口。
    Cube类(属性:边长double类型)、Cylinder类(属性:底圆半径、高,double类型)。

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        Shape3D[] list = new Shape3D[n];
        for (int i=0;i<n;i++) {
            String str = in.next();
            if (str.equals("cube")) {
                list[i] = new Cube(in.nextDouble());
            } else if (str.equals("cylinder")) {
                list[i] = new Cylinder(in.nextDouble(), in.nextDouble());
            }
        }
        double sumv = 0;
        double suma = 0;
        for (Shape3D i : list) {
            sumv += i.volume();
            suma += i.area();
        }
        System.out.printf("%.2f\n%.2f",suma,sumv);
    }
}
abstract class Shape3D implements Container {
}

class Cylinder extends Shape3D {
    private double r, h;
    public Cylinder(double r, double h) {
        super();
        this.r = r;
        this.h = h;
    }
    public double area() {
        return pi*r*r*2+2*pi*r*h;
    }
    public double volume() {
        return pi*r*r*h;
    }
 
}
 
class Cube extends Shape3D {
 
    private double a;
 
    public Cube(double a) {
        this.a = a;
    }
    public double area() {
 
        return 6*a*a;
    }
    public double volume() {
 
        return a*a*a;
    }
 
}
interface Container {
    public static final double pi=3.1415926;
    public abstract double area();
    public abstract double volume();
    static double sumofArea(Container c[]) {
        double sum = 0;
        for(Container i:c) {
            sum += i.area();
        }
        return sum;
    };
    static double sumofVolume(Container c[]) {
        double sum = 0;
        for(Container i:c) {
            sum += i.volume();
        }
        return sum;
    }
}
View Code 7-1 电信计费系列2-手机+座机计费 分数 80 作者 蔡轲 单位 南昌航空大学

实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
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、2、3:

image.png

 

import java.text.SimpleDateFormat;
import java.util.*;
public class Main {

        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            HashMap<String,User> map = new HashMap<String,User>();
            HashMap<String,User> map1 = new HashMap<String,User>();
            ArrayList<String> list = new ArrayList<>();
            ArrayList<String> list1 = new ArrayList<>();
            while (true) {
                String s = input.nextLine();
                if (s.equals("end")) {
                    break;
                } else {
                    if (s.matches("u-[0-9]{11}\\s(0|1)")) {
                        String[] s1 = s.split("\\s");
                        String s2[] = s1[0].split("-");
                        User user = new User(100, s2[1]);
                        ChargeMode chargeMode = new MobilePhoneCharging();
                        ArrayList<ChargeRule> chargeRules = new ArrayList<ChargeRule>();
                        chargeRules.add(new MobilePhonelnCityToCityRule());
                        chargeRules.add(new MobilePhonelnCityToProvinceRule());
                        chargeRules.add(new MobilePhonelnCityToLandRule());
                        chargeRules.add(new MobilePhonelnProvinceToCityRule());
                        chargeRules.add(new MobilePhonelnProvinceToProvinceRule());
                        chargeRules.add(new MobilePhonelnProvinceToLandRule());
                        chargeRules.add(new MobilePhonelnLandToCityRule());
                        chargeRules.add(new MobilePhonelnLandToProvinceRule());
                        chargeRules.add(new MobilePhonelnLandToLandRule());
                        chargeRules.add(new MobliePhonelnLandAnswerRule());
                        chargeMode.setChargeRules(chargeRules);
                        user.setChargeMode(chargeMode);
                        if(!map1.containsKey(s2[1])) {
                            map1.put(s2[1], user);
                            list1.add(s2[1]);
                        }
                    } else if (s.matches("u-[0-9]{11,12}\\s(0|1)")) {
                        String[] s1 = s.split("\\s");
                        String s2[] = s1[0].split("-");
                        User user = new User(100, s2[1]);
                        ChargeMode chargeMode = new LandlinePhoneCharging();
                        ArrayList<ChargeRule> chargeRules = new ArrayList<ChargeRule>();
                        chargeRules.add(new LandPhonelnCityRule());
                        chargeRules.add(new LandPhonelnProvinceRule());
                        chargeRules.add(new LandPhonelnLandRule());
                        chargeMode.setChargeRules(chargeRules);
                        user.setChargeMode(chargeMode);
                        if(!map.containsKey(s2[1])) {
                            map.put(s2[1], user);
                            list.add(s2[1]);
                        }
                    } else if (s.matches("t-[0-9]{11,12}\\s[0-9]{10,12}\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])")) {
                        String[] s1 = s.split("\\s");
                        String s2[] = s1[0].split("-");
                        if (map.containsKey(s2[1])) {
                            User user = map.get(s2[1]);
                            CallRecord callRecord = new CallRecord();
                            try {
                                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault());
                                Date time1 = simpleDateFormat.parse(s1[2] + " " + s1[3]);
                                Date time2 = simpleDateFormat.parse(s1[4] + " " + s1[5]);
                                callRecord.setStartTime(time1);
                                callRecord.setEndTime(time2);
                                callRecord.setCallingAddressAreaCode(s2[1].substring(0, 4));
                                callRecord.setAnswerAddressAreaCode(s1[1].substring(0, 4));
                                callRecord.setCallingNumber(s2[1]);
                                callRecord.setAnswerNumber(s1[1]);
                                if (s1[1].substring(0, 3).equals("079") || s1[1].substring(0, 4).equals("0701")) {
                                    if (s1[1].substring(0, 4).equals("0791")) {
                                        user.userRecords.addCallinglnCityRecords(callRecord);
                                    } else {
                                        user.userRecords.addCallinglnProvinceRecords(callRecord);
                                    }
                                } else {
                                    user.userRecords.addCallinglnLandRecords(callRecord);
                                }
                            } catch (Exception ji) {

                            }
                        }
                    } else if (s.matches("t-[0-9]{10,12}\\s[0-9]{10,12}\\s[0-9]{3,4}\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])")) {
                        String[] s1 = s.split("\\s");
                        String s2[] = s1[0].split("-");
                        if (map.containsKey(s2[1]) || map1.containsKey(s1[1])) {
                            User user = null;
                            if (map.containsKey(s2[1])) {
                                user = map.get(s2[1]);
                            }
                            User user1 = null;
                            if (map1.containsKey(s1[1])) {
                                user1 = map1.get(s1[1]);
                            }
                            CallRecord callRecord = new CallRecord();
                            try {
                                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault());
                                Date time1 = simpleDateFormat.parse(s1[3] + " " + s1[4]);
                                Date time2 = simpleDateFormat.parse(s1[5] + " " + s1[6]);
                                callRecord.setStartTime(time1);
                                callRecord.setEndTime(time2);
                                callRecord.setCallingAddressAreaCode(s2[1].substring(0, 4));
                                callRecord.setAnswerAddressAreaCode(s1[2]);
                                callRecord.setCallingNumber(s2[1]);
                                callRecord.setAnswerNumber(s1[1]);
                                if (s1[2].substring(0, 3).equals("079") || s1[2].substring(0, 4).equals("0701")) {
                                    if (s1[2].substring(0, 4).equals("0791")) {
                                        if (map.containsKey(s2[1])) user.userRecords.addCallinglnCityRecords(callRecord);
                                    } else {
                                        if (map.containsKey(s2[1])) user.userRecords.addCallinglnProvinceRecords(callRecord);
                                    }
                                } else {
                                    if (map.containsKey(s2[1])) user.userRecords.addCallinglnLandRecords(callRecord);
                                    if (map1.containsKey(s1[1])) user1.userRecords.addCallinglnLandAnswerRecords(callRecord);
                                }
                            } catch (Exception ji) {

                            }
                        }
                    } else if (s.matches("t-[0-9]{10,12}\\s[0-9]{3,4}\\s[0-9]{10,12}\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])")) {
                        String[] s1 = s.split("\\s");
                        String s2[] = s1[0].split("-");
                        if (map1.containsKey(s2[1]) || map.containsKey(s1[2])) {
                            User user = null;
                            if (map1.containsKey(s2[1])) {
                                user = map1.get(s2[1]);
                            }
                            User user1 = null;
                            if (map.containsKey(s1[2])) {
                                user1 = map.get(s1[2]);
                            }
                            CallRecord callRecord = new CallRecord();
                            try {
                                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault());
                                Date time1 = simpleDateFormat.parse(s1[3] + " " + s1[4]);
                                Date time2 = simpleDateFormat.parse(s1[5] + " " + s1[6]);
                                callRecord.setStartTime(time1);
                                callRecord.setEndTime(time2);
                                callRecord.setCallingAddressAreaCode(s1[1]);
                                callRecord.setAnswerAddressAreaCode(s1[2].substring(0, 4));
                                callRecord.setCallingNumber(s2[1]);
                                callRecord.setAnswerNumber(s1[2]);
                                if (s1[1].substring(0, 3).equals("079") || s1[1].equals("0701")) {
                                    if (s1[1].equals("0791")) {
                                        if (map1.containsKey(s2[1])) user.userRecords.addCallinglnCityToCityRecords(callRecord);
                                    } else {
                                        if (map1.containsKey(s2[1])) user.userRecords.addCallinglnProvinceToCityRecords(callRecord);
                                    }
                                } else {
                                    if (map1.containsKey(s2[1])) user.userRecords.addCallinglnLandToCityRecords(callRecord);
                                }
                            } catch (Exception ji) {

                            }
                        }
                    } else if (s.matches("t-[0-9]{10,12}\\s[0-9]{3,4}\\s[0-9]{10,12}\\s[0-9]{3,4}\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])")) {
                        String[] s1 = s.split("\\s");
                        String s2[] = s1[0].split("-");
                        if (map1.containsKey(s2[1]) || map.containsKey(s1[2])) {
                            User user = null;
                            if (map1.containsKey(s2[1])) {
                                user = map1.get(s2[1]);
                            }
                            User user1 = null;
                            if (map1.containsKey(s1[2])) {
                                user1 = map1.get(s1[2]);
                            }
                            CallRecord callRecord = new CallRecord();
                            try {
                                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault());
                                Date time1 = simpleDateFormat.parse(s1[4] + " " + s1[5]);
                                Date time2 = simpleDateFormat.parse(s1[6] + " " + s1[7]);
                                callRecord.setStartTime(time1);
                                callRecord.setEndTime(time2);
                                callRecord.setCallingAddressAreaCode(s1[1]);
                                callRecord.setAnswerAddressAreaCode(s1[3]);
                                callRecord.setCallingNumber(s2[1]);
                                callRecord.setAnswerNumber(s1[2]);
                                if (s1[1].substring(0, 3).equals("079") || s1[1].substring(0, 4).equals("0701")) {
                                    if (s1[1].substring(0, 4).equals("0791")) {
                                        if (s1[3].substring(0, 3).equals("079") || s1[3].substring(0, 4).equals("0701")) {
                                            if (s1[3].substring(0, 4).equals("0791")) {
                                                if (map1.containsKey(s2[1])) user.userRecords.addCallinglnCityToCityRecords(callRecord);
                                            } else {
                                                if (map1.containsKey(s2[1])) user.userRecords.addCallinglnCityToProvinceRecords(callRecord);
                                            }
                                        } else {
                                            if (map1.containsKey(s2[1])) user.userRecords.addCallinglnCityToLandRecords(callRecord);
                                            if (map1.containsKey(s1[2])) user1.userRecords.addCallinglnLandAnswerRecords(callRecord);
                                        }
                                    } else {
                                        if (map1.containsKey(s2[1])) user.userRecords.addCallinglnProvinceToCityRecords(callRecord);
                                        if (!s1[3].substring(0, 3).equals("079") && !s1[3].substring(0, 4).equals("0701")) {
                                            if (map1.containsKey(s1[2])) user1.userRecords.addCallinglnLandAnswerRecords(callRecord);
                                        }
                                    }
                                } else {
                                    if (map1.containsKey(s2[1])) user.userRecords.addCallinglnLandToCityRecords(callRecord);
                                    if (!s1[3].substring(0, 3).equals("079") && !s1[3].substring(0, 4).equals("0701")) {
                                        if (map1.containsKey(s1[2])) user1.userRecords.addCallinglnLandAnswerRecords(callRecord);
                                    }
                                }
                            } catch (Exception ji) {

                            }
                        }
                    }
                }
            }
            Collections.sort(list);
            Iterator<String> it = list.iterator();
            while (it.hasNext()) {
                String s = it.next();
                User value = map.get(s);
                System.out.printf("%s %.1f %.1f\n",value.getNumber(),value.calCost(),value.calBalance());
            }
            Collections.sort(list1);
            Iterator<String> it1 = list1.iterator();
            while (it1.hasNext()) {
                String s = it1.next();
                User value = map1.get(s);
                System.out.printf("%s %.1f %.1f\n",value.getNumber(),value.calCost(),value.calBalance());
            }
        }
    }
    class User{
        UserRecords userRecords = new UserRecords();
        double balance = 100;
        ChargeMode chargeMode;
        String number;
        public double calCost(){
            double sum=chargeMode.calCost(userRecords);
            return sum;
        }
        public double calBalance(){
            return balance-chargeMode.calCost(userRecords)-chargeMode.getMonthlyRent();
        }
        User(double balance, String number) {
            this.balance = balance;
            this.number = number;
        }

        public UserRecords getUserRecords() {
            return userRecords;
        }

        public void setUserRecords(UserRecords userRecords) {
            this.userRecords = userRecords;
        }

        public double getBalance() {
            return balance;
        }

        public void setBalance(double balance) {
            this.balance = 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;
        }
    }
    abstract class ChargeMode{
        ArrayList<ChargeRule> chargeRules = new  ArrayList<>();
        public ArrayList<ChargeRule> getChargeRules() {
            return chargeRules;
        }
        public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
            this.chargeRules = chargeRules;
        }
        abstract double calCost(UserRecords userRecords);
        abstract double getMonthlyRent();
    }
    class MobilePhoneCharging extends ChargeMode{
        double monthlyRent = 15;
        @Override
        double calCost(UserRecords userRecords) {
            double sum=0;
            sum+=getChargeRules().get(0).calCost(userRecords.getCallinglnCityToCityRecords());
            sum+=getChargeRules().get(1).calCost(userRecords.getCallinglnCityToProvinceRecords());
            sum+=getChargeRules().get(2).calCost(userRecords.getCallinglnCityToLandRecords());
            sum+=getChargeRules().get(3).calCost(userRecords.getCallinglnProvinceToCityRecords());
            sum+=getChargeRules().get(4).calCost(userRecords.getCallinglnProvinceToProvinceRecords());
            sum+=getChargeRules().get(5).calCost(userRecords.getCallinglnProvinceToLandRecords());
            sum+=getChargeRules().get(6).calCost(userRecords.getCallinglnLandToCityRecords());
            sum+=getChargeRules().get(7).calCost(userRecords.getCallinglnLandToProvinceRecords());
            sum+=getChargeRules().get(8).calCost(userRecords.getCallinglnLandToLandRecords());
            sum+=getChargeRules().get(9).calCost(userRecords.getCallinglnLandAnswerRecords());
            return sum;
        }

        @Override
        double getMonthlyRent() {
            return monthlyRent;
        }
    }
    class LandlinePhoneCharging extends ChargeMode{
        double monthlyRent = 20;
        @Override
        public double calCost(UserRecords userRecords){
            double sum=0;
            sum+=getChargeRules().get(0).calCost(userRecords.getCallinglnCityRecords());
            sum+=getChargeRules().get(1).calCost(userRecords.getCallinglnProvinceRecords());
            sum+=getChargeRules().get(2).calCost(userRecords.getCallinglnLandRecords());
            return sum;
        }

        @Override
        public double getMonthlyRent() {
            return monthlyRent;
        }
    }
    class UserRecords{
        ArrayList<CallRecord> callinglnCityToCityRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnCityToProvinceRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnCityToLandRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnProvinceToCityRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnProvinceToProvinceRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnProvinceToLandRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnLandToCityRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnLandToProvinceRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnLandToLandRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnLandAnswerRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnCityRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnProvinceRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> callinglnLandRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> answerlnCityRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> answerlnProvinceRecords = new  ArrayList<CallRecord>();
        ArrayList<CallRecord> answerlnLandRecords = new  ArrayList<CallRecord>();
        ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
        ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();

        void addCallinglnCityRecords(CallRecord callRecord) {
            callinglnCityRecords.add(callRecord);
        }
        void addCallinglnProvinceRecords(CallRecord callRecord) {
            callinglnProvinceRecords.add(callRecord);
        }
        void addCallinglnLandRecords(CallRecord callRecord) {
            callinglnLandRecords.add(callRecord);
        }
        void addAnswerlnCityRecords(CallRecord answerRecord) {
            answerlnCityRecords.add(answerRecord);
        }
        void addAnswerlnProvinceRecords(CallRecord answerRecord) {
            answerlnProvinceRecords.add(answerRecord);
        }
        void addAnswerlnLandRecords(CallRecord answerRecord) {
            answerlnLandRecords.add(answerRecord);
        }
        void addSendMessageRecords(MessageRecord sendMessageRecord) {
            sendMessageRecords.add(sendMessageRecord);
        }
        void addReceiveMessageRecords(MessageRecord receiveMessageRecord) {
            receiveMessageRecords.add(receiveMessageRecord);
        }
        public ArrayList<CallRecord> getCallinglnCityRecords() {
            return callinglnCityRecords;
        }

        public void setCallinglnCityRecords(ArrayList<CallRecord> callinglnCityRecords) {
            this.callinglnCityRecords = callinglnCityRecords;
        }

        public ArrayList<CallRecord> getCallinglnProvinceRecords() {
            return callinglnProvinceRecords;
        }

        public void setCallinglnProvinceRecords(ArrayList<CallRecord> callinglnProvinceRecords) {
            this.callinglnProvinceRecords = callinglnProvinceRecords;
        }

        public ArrayList<CallRecord> getCallinglnLandRecords() {
            return callinglnLandRecords;
        }

        public void setCallinglnLandRecords(ArrayList<CallRecord> callinglnLandRecords) {
            this.callinglnLandRecords = callinglnLandRecords;
        }

        public ArrayList<CallRecord> getAnswerlnCityRecords() {
            return answerlnCityRecords;
        }

        public void setAnswerlnCityRecords(ArrayList<CallRecord> answerlnCityRecords) {
            this.answerlnCityRecords = answerlnCityRecords;
        }

        public ArrayList<CallRecord> getAnswerlnProvinceRecords() {
            return answerlnProvinceRecords;
        }

        public void setAnswerlnProvinceRecords(ArrayList<CallRecord> answerlnProvinceRecords) {
            this.answerlnProvinceRecords = answerlnProvinceRecords;
        }

        public ArrayList<CallRecord> getAnswerlnLandRecords() {
            return answerlnLandRecords;
        }

        public void setAnswerlnLandRecords(ArrayList<CallRecord> answerlnLandRecords) {
            this.answerlnLandRecords = answerlnLandRecords;
        }

        public ArrayList<MessageRecord> getSendMessageRecords() {
            return sendMessageRecords;
        }

        public void setSendMessageRecords(ArrayList<MessageRecord> sendMessageRecords) {
            this.sendMessageRecords = sendMessageRecords;
        }

        public ArrayList<MessageRecord> getReceiveMessageRecords() {
            return receiveMessageRecords;
        }

        public void setReceiveMessageRecords(ArrayList<MessageRecord> receiveMessageRecords) {
            this.receiveMessageRecords = receiveMessageRecords;
        }

        public ArrayList<CallRecord> getCallinglnCityToCityRecords() {
            return callinglnCityToCityRecords;
        }

        public ArrayList<CallRecord> getCallinglnCityToProvinceRecords() {
            return callinglnCityToProvinceRecords;
        }

        public ArrayList<CallRecord> getCallinglnCityToLandRecords() {
            return callinglnCityToLandRecords;
        }

        public ArrayList<CallRecord> getCallinglnProvinceToCityRecords() {
            return callinglnProvinceToCityRecords;
        }

        public ArrayList<CallRecord> getCallinglnProvinceToProvinceRecords() {
            return callinglnProvinceToProvinceRecords;
        }

        public ArrayList<CallRecord> getCallinglnProvinceToLandRecords() {
            return callinglnProvinceToLandRecords;
        }

        public ArrayList<CallRecord> getCallinglnLandToCityRecords() {
            return callinglnLandToCityRecords;
        }

        public ArrayList<CallRecord> getCallinglnLandToProvinceRecords() {
            return callinglnLandToProvinceRecords;
        }

        public ArrayList<CallRecord> getCallinglnLandToLandRecords() {
            return callinglnLandToLandRecords;
        }

        public ArrayList<CallRecord> getCallinglnLandAnswerRecords() {
            return callinglnLandAnswerRecords;
        }
        public void addCallinglnLandAnswerRecords(CallRecord callRecord) {
            callinglnLandAnswerRecords.add(callRecord);
        }
        public void addCallinglnCityToCityRecords(CallRecord callRecord) {
            callinglnCityToCityRecords.add(callRecord);
        }

        public void addCallinglnCityToProvinceRecords(CallRecord callRecord) {
            callinglnCityToProvinceRecords.add(callRecord);
        }

        public void addCallinglnCityToLandRecords(CallRecord callRecord) {
            callinglnCityToLandRecords.add(callRecord);
        }

        public void addCallinglnProvinceToCityRecords(CallRecord callRecord) {
            callinglnProvinceToCityRecords.add(callRecord);
        }

        public void addCallinglnProvinceToProvinceRecords(CallRecord callRecord) {
            callinglnProvinceToProvinceRecords.add(callRecord);
        }

        public void addCallinglnProvinceToLandRecords(CallRecord callRecord) {
            callinglnProvinceToLandRecords.add(callRecord);
        }

        public void addCallinglnLandToCityRecords(CallRecord callRecord) {
            callinglnLandToCityRecords.add(callRecord);
        }

        public void addCallinglnLandToProvinceRecords(CallRecord callRecord) {
            callinglnLandToProvinceRecords.add(callRecord);
        }

        public void addCallinglnLandToLandRecords(CallRecord callRecord) {
          callinglnLandToLandRecords.add(callRecord);
        }
    }
    abstract class CommunicationRecord{
        String callingNumber;
        String answerNumber;
        abstract String getCallingNumber();
        abstract void setCallingNumber(String callingNumber);
        abstract String getAnswerNumber();
        abstract void setAnswerNumber(String 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;
        }

        @Override
        String getCallingNumber() {
            return null;
        }

        @Override
        void setCallingNumber(String callingNumber) {

        }

        @Override
        String getAnswerNumber() {
            return null;
        }

        @Override
        void setAnswerNumber(String answerNumber) {

        }
    }
    class MessageRecord extends CommunicationRecord{
        String message;
        String getMessage() {
            return null;
        }
        void setMessage(String message) {

        }

        @Override
        String getCallingNumber() {
            return null;
        }

        @Override
        void setCallingNumber(String callingNumber) {

        }

        @Override
        String getAnswerNumber() {
            return null;
        }

        @Override
        void setAnswerNumber(String answerNumber) {

        }
    }
    abstract class ChargeRule{

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

        @Override
        public double calCost(ArrayList<CallRecord> callRecords) {
            double sum=0;
            for (int i = 0; i < callRecords.size(); i++) {
                long time1 = callRecords.get(i).getStartTime().getTime();
                long time2 = callRecords.get(i).getEndTime().getTime();
                long second = (time2 - time1) / 1000;
                if (second % 60 != 0) {
                    sum += 0.1 * ((double)(second / 60)+1.0);
                }else{
                    sum += 0.1 * (double)(second / 60);
                }
            }
            return sum;
        }
    }
    class LandPhonelnProvinceRule extends CallChargeRule{

        @Override
        public double calCost(ArrayList<CallRecord> callRecords) {
            double sum=0;
            for (int i = 0; i < callRecords.size(); i++) {
                long time1 = callRecords.get(i).getStartTime().getTime();
                long time2 = callRecords.get(i).getEndTime().getTime();
                long second = (time2 - time1) / 1000;
                if (second % 60 != 0) {
                    sum += 0.3 * ((double)(second / 60)+1.0);
                }else{
                    sum += 0.3 * (double)(second / 60);
                }
            }
            return sum;
        }
    }
    class LandPhonelnLandRule extends CallChargeRule{

        @Override
        public double calCost(ArrayList<CallRecord> callRecords) {
            double sum=0;
            for (int i = 0; i < callRecords.size(); i++) {
                long time1 = callRecords.get(i).getStartTime().getTime();
                long time2 = callRecords.get(i).getEndTime().getTime();
                long second = (time2 - time1) / 1000;
                if (second % 60 != 0) {
                    sum += 0.6 * ((double)(second / 60)+1.0);
                }else{
                    sum += 0.6 * (double)(second / 60);
                }
            }
            return sum;
        }
    }
//    abstract class MessageChargeRule extends ChargeRule{
//        abstract public double calCost(ArrayList<MessageRecord> messageRecords);
//    }
//    class SendMessageRule extends MessageChargeRule{
//
//        @Override
//        public double calCost(ArrayList<MessageRecord> messageRecords) {
//            return 0;
//        }
//    }
class MobilePhonelnCityToCityRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.1 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.1 * (double)(second / 60);
            }
        }
        return sum;
    }
}
class MobilePhonelnCityToProvinceRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.2 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.2 * (double)(second / 60);
            }
        }
        return sum;
    }
}
class MobilePhonelnCityToLandRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.3 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.3 * (double)(second / 60);
            }
        }
        return sum;
    }
}class MobilePhonelnProvinceToCityRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.3 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.3 * (double)(second / 60);
            }
        }
        return sum;
    }
}
class MobilePhonelnProvinceToProvinceRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.3 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.3 * (double)(second / 60);
            }
        }
        return sum;
    }
}
class MobilePhonelnProvinceToLandRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.3 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.3 * (double)(second / 60);
            }
        }
        return sum;
    }
}
class MobilePhonelnLandToProvinceRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.6 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.6 * (double)(second / 60);
            }
        }
        return sum;
    }
}
class MobilePhonelnLandToLandRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.6 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.6 * (double)(second / 60);
            }
        }
        return sum;
    }
}
class MobilePhonelnLandToCityRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.6 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.6 * (double)(second / 60);
            }
        }
        return sum;
    }
}
class MobliePhonelnLandAnswerRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for (int i = 0; i < callRecords.size(); i++) {
            long time1 = callRecords.get(i).getStartTime().getTime();
            long time2 = callRecords.get(i).getEndTime().getTime();
            long second = (time2 - time1) / 1000;
            if (second % 60 != 0) {
                sum += 0.3 * ((double)(second / 60)+1.0);
            }else{
                sum += 0.3 * (double)(second / 60);
            }
        }
        return sum;
    }
}
View Code

这次的代码改进了大量重复的部分,提高了代码的质量,基本实现了功能,只有几个测试点没过。

 

7-2 sdut-Collection-sort--C~K的班级(II) 分数 10 作者 周雪芹 单位 山东理工大学

经过不懈的努力,C~K终于当上了班主任。

现在他要统计班里学生的名单,但是C~K在教务系统中导出班级名单时出了问题,发现会有同学的信息重复,现在他想把重复的同学信息删掉,只保留一个,
但是工作量太大了,所以找到了会编程的你,你能帮他解决这个问题吗?

import java.util.*;

public class Main{
    public static void main(String []args){
        Scanner in=new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        ArrayList<String> a = new ArrayList<String>();
        while(n!=0){
            String s = in.nextLine();
            if(!a.contains(s)){
                a.add(s);
            }
            n--;
        }
        a.sort(new Comparator<String>(){
            @Override
            public int compare(String s1,String s2) {
            return Integer.parseInt(s1.substring(0,4))-Integer.parseInt(s2.substring(0,4));
            }
        });
        
        System.out.println(a.size());
        for(String i:a){
            System.out.println(i);
        }
    }
}
View Code 7-3 阅读程序,按照题目需求修改程序 分数 10 作者 肖斌 单位 西南石油大学
功能需求:
      使用集合存储3个员工的信息(有序);
      通过迭代器依次找出所有的员工。
 

提示:学生复制以下代码到编程区,并按需求进行调试修改。


// 1、导入相关包

//定义员工类
class Employee {

	private String name;
	private int age;

	public Employee() {
		super();
	}

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

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

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

//主函数
public class Main {

	public static void main(String[] args) {
				// 1、创建有序集合对象
				Collection c ;

      // 创建3个员工元素对象
		for (int i = 0; i < 3; i++) {
			Scanner sc = new Scanner(System.in);
			String employeeName = sc.nextLine();
			int employeeAge = sc.nextInt();
			
			Employee employee = new Employee(employeeName, employeeAge);
			c.add(employee);
		}			
				
				
				
				// 2、创建迭代器遍历集合
				Iterator it;
				
				//3、遍历
				while (it.hasnext) {
					
					//4、集合中对象未知,向下转型
					Employee e =  it.next();
					
					System.out.println(e.getName() + "---" + e.getAge());
				}
	}

}

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Scanner;
//1、导入相关包

//定义员工类
class Employee {

    private String name;
    private int age;

    public Employee() {
        super();
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

//主函数
public class Main {
    public static void main(String[] args) {
                // 1、创建有序集合对象
        Collection c = new ArrayList<Employee>();

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

}
View Code

这题pta出了问题,改了半天还是答案错误,提交过不过得碰运气,什么()网站。

 

 

7-1 电信计费系列3-短信计费 分数 50 作者 蔡轲 单位 南昌航空大学

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


 

 

 

 

import java.util.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
 
public class Main {
 
    public static void main(String[] args) {
 
        Outputtool outputtool = new Outputtool();
 
        Inputdeal inputdeal = new Inputdeal();
 
        ArrayList<User> users = new ArrayList<>();
 
        Scanner in = new Scanner(System.in);
 
        String input = in.nextLine();
 
        while (!input.equals("end")) {
            if (1 == inputdeal.check(input)) {
                inputdeal.writeUser(users, input);
            } else if (2 == inputdeal.check(input)) {
                inputdeal.writeRecord(users, input);
            }
            input = in.nextLine();
        }
 
        users.sort(new Comparator<User>() {
 
            @Override
            public int compare(User u1, User u2) {
                if (u1.getNumber().charAt(0) == '0' && u2.getNumber().charAt(0) != '0') {
                    return -1;
                } else if (u1.getNumber().charAt(0) != '0' && u2.getNumber().charAt(0) == '0') {
                    return 1;
                }
                if (Double.parseDouble(u1.getNumber()) > Double.parseDouble(u2.getNumber())) {
                    return 1;
                } else {
                    return -1;
                }
            }
        });
 
        for (User u : users) {
            System.out.print(u.getNumber() + " ");
            outputtool.output(u.calCost());
            System.out.print(" ");
            outputtool.output(u.calBalance());
            System.out.println();
 
        }
 
    }
 
}
 
abstract class ChargeMode {
    protected 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;
    }
}
 
class UserRecords {
 
    private ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();
    private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
    private ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
 
    public void addCallingInCityRecords(CallRecord callRecord) {
        callingInCityRecords.add(callRecord);
    }
 
    public void addCallingInProvinceRecords(CallRecord callRecord) {
        callingInProvinceRecords.add(callRecord);
    }
 
    public void addCallingInLandRecords(CallRecord callRecord) {
        callingInLandRecords.add(callRecord);
    }
 
    public void addAnswerInCityRecords(CallRecord callRecord) {
        answerInCityRecords.add(callRecord);
    }
 
    public void aaddAnswerInProvinceRecords(CallRecord callRecord) {
        answerInProvinceRecords.add(callRecord);
    }
 
    public void addAnswerInLandRecords(CallRecord callRecord) {
        answerInLandRecords.add(callRecord);
    }
 
    public void addSendMessageRecords(MessageRecord callRecord) {
        sendMessageRecords.add(callRecord);
    }
 
    public void addReceiveMessageRecords(MessageRecord callRecord) {
        receiveMessageRecords.add(callRecord);
    }
 
    public ArrayList<CallRecord> getCallingInCityRecords() {
        return callingInCityRecords;
    }
 
    public void setCallingInCityRecords(ArrayList<CallRecord> callingInCityRecords) {
        this.callingInCityRecords = callingInCityRecords;
    }
 
    public ArrayList<CallRecord> getCallingInProvinceRecords() {
        return callingInProvinceRecords;
    }
 
    public void setCallingInProvinceRecords(ArrayList<CallRecord> callingInProvinceRecords) {
        this.callingInProvinceRecords = callingInProvinceRecords;
    }
 
    public ArrayList<CallRecord> getCallingInLandRecords() {
        return callingInLandRecords;
    }
 
    public void setCallingInLandRecords(ArrayList<CallRecord> callingInLandRecords) {
        this.callingInLandRecords = callingInLandRecords;
    }
 
    public ArrayList<CallRecord> getAnswerInCityRecords() {
        return answerInCityRecords;
    }
 
    public void setAnswerInCityRecords(ArrayList<CallRecord> answerInCityRecords) {
        this.answerInCityRecords = answerInCityRecords;
    }
 
    public ArrayList<CallRecord> getAnswerInProvinceRecords() {
        return answerInProvinceRecords;
    }
 
    public void setAnswerInProvinceRecords(ArrayList<CallRecord> answerInProvinceRecords) {
        this.answerInProvinceRecords = answerInProvinceRecords;
    }
 
    public ArrayList<CallRecord> getAnswerInLandRecords() {
        return answerInLandRecords;
    }
 
    public void setAnswerInLandRecords(ArrayList<CallRecord> answerInLandRecords) {
        this.answerInLandRecords = answerInLandRecords;
    }
 
    public ArrayList<MessageRecord> getSendMessageRecords() {
        return sendMessageRecords;
    }
 
    public void setSendMessageRecords(ArrayList<MessageRecord> sendMessageRecords) {
        this.sendMessageRecords = sendMessageRecords;
    }
 
    public ArrayList<MessageRecord> getReceiveMessageRecords() {
        return receiveMessageRecords;
    }
 
    public void setReceiveMessageRecords(ArrayList<MessageRecord> receiveMessageRecords) {
        this.receiveMessageRecords = receiveMessageRecords;
    }
 
}
 
class LandlinePhoneCharging extends ChargeMode {
 
    private double monthlyRent = 20;
 
    public LandlinePhoneCharging() {
        super();
        chargeRules.add(new LandPhoneInCityRule());
        chargeRules.add(new LandPhoneInProvinceRule());
        chargeRules.add(new LandPhoneInlandRule());
    }
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (ChargeRule rule : chargeRules) {
            sumCost += rule.calCost(userRecords);
        }
        return sumCost;
    }
 
    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
 
}
 
class MobilePhoneCharging extends ChargeMode {
 
    private double monthlyRent = 15;
 
    public MobilePhoneCharging() {
        super();
        chargeRules.add(new MobilePhoneInCityRule());
        chargeRules.add(new MobilePhoneInProvinceRule());
        chargeRules.add(new MobilePhoneInlandRule());
    }
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (ChargeRule rule : chargeRules) {
            sumCost += rule.calCost(userRecords);
        }
        return sumCost;
    }
 
    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
 
}
 
class MobilePhoneMassageCharging extends ChargeMode {
 
    private double monthlyRent = 0;
 
    public MobilePhoneMassageCharging() {
        super();
        chargeRules.add(new MobilePhoneMessageRule());
    }
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (ChargeRule rule : chargeRules) {
            sumCost += rule.calCost(userRecords);
        }
        return sumCost;
    }
 
    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
 
}
 
class Inputdeal {
 
    public int check(String input) {
        if (input.matches("[u]-0791[0-9]{7,8}\\s[0]") || input.matches("[u]-1[0-9]{10}\\s[13]")) {
            return 1;
        } else if (input.matches("[m]-1[0-9]{10}\\s" + "1[0-9]{10}\\s" + "[0-9a-zA-Z\\s\\.,]+")) {
            return 2;
        }
        return 0;
    }
 
    public void writeUser(ArrayList<User> users, String input) {
        User usernew = new User();
        String[] inputs = input.split(" ");
        String num = inputs[0].substring(2);
        for (User i : users) {
            if (i.getNumber().equals(num)) {
                return;
            }
        }
        usernew.setNumber(num);
        int mode = Integer.parseInt(inputs[1]);
        if (mode == 0) {
            usernew.setChargeMode(new LandlinePhoneCharging());
        } else if (mode == 1) {
            usernew.setChargeMode(new MobilePhoneCharging());
        } else if (mode == 3) {
            usernew.setChargeMode(new MobilePhoneMassageCharging());
        }
        users.add(usernew);
    }
 
    public void writeRecord(ArrayList<User> users, String input) {
        String[] inputs = input.split(" ");
        inputs[0] = inputs[0].substring(2);
 
        User callu = null, answeru = null;
 
        String out = inputs[0];
        String in = "";
        if (inputs.length == 6) {
            in = inputs[1];
        } else if (inputs.length == 7) {
            in = inputs[1];
        } else if (inputs.length == 8) {
            in = inputs[2];
        } else {
            in = inputs[1];
        }
 
        for (User i : users) {
            if (i.getNumber().equals(out)) {
                callu = i;
            }
            if (i.getNumber().equals(in)) {
                answeru = i;
            }
            if (callu != null && answeru != null) {
                break;
            }
        }
 
        if (input.charAt(0) == 'm') {
            MessageRecord messageRecord = new MessageRecord(input);
            if (callu != null) {
                callu.getUserRecords().addSendMessageRecords(messageRecord);
                ;
            }
            if (answeru != null) {
                callu.getUserRecords().addReceiveMessageRecords(messageRecord);
            }
        }
 
    }
 
}
 
abstract class CommunicationRecord {
    protected String callingNumber;
    protected String answerNumbe;
 
    public String getCallingNumber() {
        return callingNumber;
    }
 
    public void setCallingNumber(String callingNumber) {
        this.callingNumber = callingNumber;
    }
 
    public String getAnswerNumbe() {
        return answerNumbe;
    }
 
    public void setAnswerNumbe(String answerNumbe) {
        this.answerNumbe = answerNumbe;
    }
 
}
 
abstract class ChargeRule {
 
    abstract public double calCost(UserRecords userRecords);
 
}
 
class CallRecord extends CommunicationRecord {
    private Date startTime;
    private Date endTime;
    private String callingAddressAreaCode;
    private String answerAddressAreaCode;
 
    public String getCallType() {
        String type = "";
        if (callingAddressAreaCode.equals("0791")) {
            type = type.concat("1");
        } else if (callingAddressAreaCode.matches("^079[023456789]$") || callingAddressAreaCode.equals("0701")) {
            type = type.concat("2");
        } else {
            type = type.concat("3");
        }
 
        if (answerAddressAreaCode.equals("0791")) {
            type = type.concat("1");
        } else if (answerAddressAreaCode.matches("^079[023456789]$") || answerAddressAreaCode.equals("0701")) {
            type = type.concat("2");
        } else {
            type = type.concat("3");
        }
 
        return type;
    }
 
    public CallRecord(String[] inputs) {
        super();
 
        char type = inputs[0].charAt(0);
 
        String sd = null, st = null, ed = null, et = null;
 
        if (type == 't') {
            if (inputs.length == 6) {
                sd = inputs[2];
                st = inputs[3];
                ed = inputs[4];
                et = inputs[5];
                callingAddressAreaCode = inputs[0].substring(0, 4);
                answerAddressAreaCode = inputs[1].substring(0, 4);
            } else if (inputs.length == 7) {
                sd = inputs[3];
                st = inputs[4];
                ed = inputs[5];
                et = inputs[6];
                if (inputs[0].charAt(0) != '0') {
                    if (inputs[2].length() == 10) {
                        answerAddressAreaCode = inputs[2].substring(0, 3);
                    } else {
                        answerAddressAreaCode = inputs[2].substring(0, 4);
                    }
                    callingAddressAreaCode = inputs[1];
                } else {
                    if (inputs[0].length() == 10) {
                        callingAddressAreaCode = inputs[0].substring(0, 3);
                    } else {
                        callingAddressAreaCode = inputs[0].substring(0, 4);
                    }
                    answerAddressAreaCode = inputs[2];
                }
            } else if (inputs.length == 8) {
                sd = inputs[4];
                st = inputs[5];
                ed = inputs[6];
                et = inputs[7];
                callingAddressAreaCode = inputs[1];
                answerAddressAreaCode = inputs[3];
            }
        } else if (type == 'm') {
 
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault());
        try {
            startTime = simpleDateFormat.parse(sd + " " + st);
            endTime = simpleDateFormat.parse(ed + " " + et);
        } catch (ParseException e) {
        }
 
    }
 
    public CallRecord(Date startTime, Date endTime, String callingAddressAreaCode, String answerAddressAreaCode) {
        super();
        this.startTime = startTime;
        this.endTime = endTime;
        this.callingAddressAreaCode = callingAddressAreaCode;
        this.answerAddressAreaCode = 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 CallChargeRule extends ChargeRule {
 
}
 
class LandPhoneInCityRule extends CallChargeRule {
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (CallRecord call : userRecords.getCallingInCityRecords()) {
            double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;
            if (distanceS < 0) {
                continue;
            }
            double distanceM = (int) distanceS / 60;
            if (distanceS % 60 != 0) {
                distanceM += 1;
            }
            if (call.getCallType().equals("11")) {
                sumCost += distanceM * 0.1;
            } else if (call.getCallType().equals("12")) {
                sumCost += distanceM * 0.2;
            } else if (call.getCallType().equals("13")) {
                sumCost += distanceM * 0.6;
            }
        }
        return sumCost;
    }
 
}
 
class LandPhoneInlandRule extends CallChargeRule {
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (CallRecord call : userRecords.getCallingInLandRecords()) {
            double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;
            if (distanceS < 0) {
                continue;
            }
            double distanceM = (int) distanceS / 60;
            if (distanceS % 60 != 0) {
                distanceM += 1;
            }
            sumCost += distanceM * 0.6;
        }
        return sumCost;
    }
 
}
 
class LandPhoneInProvinceRule extends CallChargeRule {
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (CallRecord call : userRecords.getCallingInProvinceRecords()) {
            double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;
            if (distanceS < 0) {
                continue;
            }
            double distanceM = (int) distanceS / 60;
            if (distanceS % 60 != 0) {
                distanceM += 1;
            }
            sumCost += distanceM * 0.3;
        }
        return sumCost;
    }
 
}
 
class MobilePhoneInCityRule extends CallChargeRule {
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (CallRecord call : userRecords.getCallingInCityRecords()) {
            double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;
            if (distanceS < 0) {
                continue;
            }
            double distanceM = (int) distanceS / 60;
            if (distanceS % 60 != 0) {
                distanceM += 1;
            }
            if (call.getCallType().equals("11")) {
                sumCost += distanceM * 0.1;
            } else if (call.getCallType().equals("12")) {
                sumCost += distanceM * 0.2;
            } else if (call.getCallType().equals("13")) {
                sumCost += distanceM * 0.3;
            }
 
        }
        return sumCost;
    }
 
}
 
class MobilePhoneInlandRule extends CallChargeRule {
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (CallRecord call : userRecords.getCallingInLandRecords()) {
            double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;
            if (distanceS < 0) {
                continue;
            }
            double distanceM = (int) distanceS / 60;
            if (distanceS % 60 != 0) {
                distanceM += 1;
            }
            sumCost += distanceM * 0.6;
        }
        for (CallRecord call : userRecords.getAnswerInLandRecords()) {
            double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;
            if (distanceS < 0) {
                continue;
            }
            double distanceM = (int) distanceS / 60;
            if (distanceS % 60 != 0) {
                distanceM += 1;
            }
            sumCost += distanceM * 0.3;
        }
        return sumCost;
    }
 
}
 
class MobilePhoneInProvinceRule extends CallChargeRule {
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        for (CallRecord call : userRecords.getCallingInProvinceRecords()) {
            double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;
            if (distanceS < 0) {
                continue;
            }
            double distanceM = (int) distanceS / 60;
            if (distanceS % 60 != 0) {
                distanceM += 1;
            }
            if (call.getCallType().equals("21")) {
                sumCost += distanceM * 0.3;
            } else if (call.getCallType().equals("22")) {
                sumCost += distanceM * 0.3;
            } else if (call.getCallType().equals("23")) {
                sumCost += distanceM * 0.3;
            }
        }
        return sumCost;
    }
 
}
 
class MobilePhoneMessageRule extends CallChargeRule {
 
    @Override
    public double calCost(UserRecords userRecords) {
        double sumCost = 0;
        int number = 0;
        for (MessageRecord m : userRecords.getSendMessageRecords()) {
            int length = m.getMessage().length();
            if (length <= 10) {
                number++;
            } else {
                number += length / 10;
                if (length % 10 != 0) {
                    number++;
                }
            }
        }
        if (number <= 3) {
            sumCost = number * 0.1;
        } else if (number <= 5) {
            sumCost = 0.3 + 0.2 * (number - 3);
        } else {
            sumCost = 0.7 + 0.3 * (number - 5);
        }
        return sumCost;
    }
 
}
 
class MessageRecord extends CommunicationRecord {
 
    private String message;
 
    public MessageRecord(String input) {
        super();
        this.message = input.substring(26);
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
}
 
class User {
 
    private UserRecords userRecords = new UserRecords();
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;
 
    public double calCost() {
        return chargeMode.calCost(userRecords);
    }
 
    public double calBalance() {
        return balance - chargeMode.getMonthlyRent() - chargeMode.calCost(userRecords);
    }
 
    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 String getNumber() {
        return number;
    }
 
    public void setNumber(String number) {
        this.number = number;
    }
 
}
 
class Outputtool {
 
    @SuppressWarnings("deprecation")
    public void output(double out) {

        BigDecimal numb = new BigDecimal(out);
        out = numb.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.print(out);
    }
}
View Code

 

这题相比前两次难度更低,所有测试点都过了。

 

7-2 编写一个类Shop(商店)、内部类InnerCoupons(内部购物券) 分数 30 作者 吴光生 单位 新余学院

编写一个类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.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        Shop myshop=new Shop(sc.nextInt());
        Shop.InnerCoupons coupons50=myshop.new InnerCoupons(50);
        Shop.InnerCoupons coupons100=myshop.new InnerCoupons(100);
        coupons50.buy();
        coupons100.buy();
    }
}
class Shop{
    static int milkCount;
    InnerCoupons coupons50;
    InnerCoupons coupons100;
    public Shop(int milkCount) {
        this.milkCount=milkCount;
    }
    
    public void setMilkCount(int milkCount) {
        this.milkCount=milkCount;
    }
    public int getMilkCount() {
        return milkCount;
    }
    public class InnerCoupons{
        public int value;
        public InnerCoupons(int value){
            this.value=value;
        }
        
        public void buy(){
            Shop.this.milkCount=Shop.this.milkCount-value/50;
            System.out.println("使用了面值为"+value+"的购物券进行支付");
            System.out.println("牛奶还剩"+Shop.this.milkCount+"箱");
        }
    }
}
View Code 7-3 动物发声模拟器(多态) 分数 20 作者 刘凤良 单位 天津仁爱学院

设计一个动物发生模拟器,用于模拟不同动物的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。
定义抽象类Animal,包含两个抽象方法:获取动物类别getAnimalClass()、动物叫shout();
然后基于抽象类Animal定义狗类Dog、猫类Cat和山羊Goat,用getAnimalClass()方法返回不同的动物类别(比如猫,狗,山羊),用shout()方法分别输出不同的叫声(比如喵喵、汪汪、咩咩)。
最后编写AnimalShoutTest类测试,输出:
猫的叫声:喵喵
狗的叫声:汪汪
山羊的叫声:咩咩

其中,在AnimalShoutTestMain类中,用speak(Animal animal){}方法输出动物animal的叫声,在main()方法中调用speak()方法,分别输出猫、狗和山羊对象的叫声。

请在下面的【】处添加代码。

 
//动物发生模拟器.  请在下面的【】处添加代码。
public class AnimalShoutTest2 {
    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()
    【】

}

//定义抽象类Animal
【】class Animal{
    【】
}
//基于Animal类,定义猫类Cat,并重写两个抽象方法
class Cat 【】{
    【】    
    【】
}
//基于Animal类,定义狗类Dog,并重写两个抽象方法
class Dog 【】{
    【】
    【】
}
//基于Animal类,定义山羊类Goat,并重写两个抽象方法
class Goat 【】{
    【】
    【】
}
//动物发生模拟器.  请在下面的【】处添加代码。
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()
    private static void speak(Animal animal) {
        System.out.println(animal.getAnimalClass() + "的叫声:" + animal.shout());
    }
}
 
//定义抽象类Animal
abstract class Animal {
    abstract public String getAnimalClass();
 
    abstract public String shout();
}
 
//基于Animal类,定义猫类Cat,并重写两个抽象方法
class Cat extends Animal {
    @Override
    public String getAnimalClass() {
        return "猫";
    }
 
    public String shout() {
        return "喵喵";
 
    }
}
 
//基于Animal类,定义狗类Dog,并重写两个抽象方法
class Dog extends Animal {
 
    @Override
    public String getAnimalClass() {
        return "狗";
    }
 
    @Override
    public String shout() {
        return "汪汪";
 
    }
}
 
//基于Animal类,定义山羊类Goat,并重写两个抽象方法
class Goat extends Animal {
 
    @Override
    public String getAnimalClass() {
        return "山羊";
    }
 
    @Override
    public String shout() {
        return "咩咩";
 
    }
}
View Code

(三)总结

 

本次大作业综合性地复习了之前所学的知识,如.ArrayList类的使用和SimpleDateFormat类实现输入时间格式化处理等。编码量太少,花的时间也不够,参考网上代码也未能完成所有任务。学校的这门Java课程到这就结束了,但是我学的并不好,很多需要自己花时间自学的东西都没学。想要学好Java,之后必须要多看网课,多看多写代码。

 

 

标签:return,String,double,ArrayList,BLOG,new,public
From: https://www.cnblogs.com/cdpr/p/16972474.html

相关文章

  • Blog3:nchu-software-oop-2022-6~8
    Blog3:nchu-software-oop-2022-6~8一、前言不知不觉,已到了本学期末尾,面向对象程序设计这门课也已经结课。课程虽然结束了,但需要学习和巩固的知识点还有很多。同时,这也......
  • Remember的Java-blog3
    一、前言    此次blog为电信计费系列的座机,手机,短信大作业总结。相对于前几次的多边形,这次在算法上更简单,但是涉及到的内容很多,比如容器的使用、抛出异常、抽象类......
  • BLOG-3
    (一)、前言  题目集六:7-1:电信计费系列1-座机计费难度:8知识点:正则表达式,类的继承,抽象类的使用,抽象方法重写7-2: 多态测试难度:2知识点:接口的实现......
  • BLOG-3对之前发布的6-8次PTA题目集(电信计费)总结
     for(Useru:users)前言:总结之前所涉及到的知识点、题量、难度等情况_____________________________________________________________________________________......
  • 面向对象程序设计(BLOG-3)
    面向对象程序设计(BLOG-3) 前言:本次博客的题目大都以多态、容器和继承的方式进行相关内容的考察,难度比之前的点线系列题目相对增加。 设计与分析 7-1电信计费......
  • BLOG-3
    1.前言该bolg将对近三次的大作业进行总结与分析。近三次大作业主要写了电信计费系统的主要功能,第一次大作业是座机计费功能,第一次电信计费题量不多,只有两题,电信计费第一次......
  • The Last Blog
    前言本次Blog是对6-8次的PTA进行总结,电信计费系列,包含三个部分:系列1-座机计费,系列2-手机+座机计费,系列3-短信计费。难度相对于前几次pta多边形的作业小了一些,这三次大......
  • BLOG-3
    一:前言对于近期的学习:主要是进行了pta的作业的学习,第七次题目集是因为要用到之前的那些图形有关的代码,而之前的图形题目因为未完全做出,而导致了第七次pta作业的很多问题,三......
  • BLOG-3
    一、前言:这几个星期接触了电信计费的问题,这几次作业题量都相对来说不大,难度相对之前的点线形系列较低。通过这几次的题目集重新巩固了正则表达式,以及继承与多态的运用......
  • BLOG-3
    一、前言6-8的大作业主要是实现电信计费系统。二、设计与分析6-7-1电信计费系列1-座机计费实现一个简单的电信计费程序:假设南昌市电信分公司针对市内座机用户采用......