第三次博客作业
(1)前言
习题集六:本次题目集一共包含两道题目,第一题的难度相对而言比第二题难度更高,总体而言难度并不算太大。第一题的考点主要为对用户信息的存储以及对其的格式规范。考察了继承与多态的知识点,难点有对座机号码,呼叫号码,时间等的正则表达式,以及对输出时要求对用户号码的排序。第二题的难度更为简单一点,主要考察了对多态的测试,以及对接口的相关内容,主要难点为了接口的实现、抽象方法重写和多态机制测试。
习题集七:本次题目集一共包含了三道题目,第一题的难度在本次习题中难度最高,二,三题的难度相对而言难度一般。第二题主要考察了对多个类的储存,再将其中的类进行数据对比,将重复的数据删除,考点为创建有序集合对象以及创建迭代器遍历集合。考点比较单一。第三题与第二题比较相似,考点也为考点为创建有序集合对象以及创建迭代器遍历集合。但第三题采用了Collection,第二题为HashSet。难度最大的为第一题,第一题为习题集六的后续内容,考点也与其类似,考察了继承与多态的知识点,难点有对座机号码,呼叫号码,时间等的正则表达式,以及对输出时要求对用户号码的排序。但相对而言难度上升了许多,增加了手机收费的内容。
习题集 八:本次习题集一共有三道大题,难度比较简单。第一题依然为电信收费的后续,相对前两次而言难度比较一般,也考考察了继承与多态的知识点以及对输出时要求对用户号码的排序。第二题主要考察了一个内部类,逻辑难度一般,第三题难度也比较一般,考察了多态的内容,但考察的内容比较单一。
这三道习题集总体而言难度适中,通过此次习题集,可以让我们更全面的了解java的知识点。虽然前面两次的习题集的题量并没有很多,但是考察的知识点比较全面,可以让我们运用自己所学的新知识点,让我们可以巩固知识点,对知识点的掌握程度大大提高。通过本次的题目集练习,我所掌握的知识点并不全面,更应该花时间在java这门专业课上。
(2)设计与分析
题目集六的7-1
题目:实现一个简单的电信计费程序:
假设南昌市电信分公司针对市内座机用户采用的计费方式:
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
南昌市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
设计思路,建立一个用户的list,在对用户进行开户操作,在采用正则表达式,判断信息输入的是否正确,如果正确,再将所以的信息进行分割,将信息储存进每一个类中,然后就可以对类中信息根据题目所给要求进行处理,得到我们想要的数据,最后输出时将用户号码进行排序。
while(!data.equals("end")){ String regex1 = "^u-\\d{4}\\d{7,9} [0]"; if (data.matches(regex1)) { data = data.replace("-", " "); String[] tokens = data.split(" "); User user=new User(); user.setNumber(tokens[1]); userlist.add(user); } else if (data.matches("^t-\\d{4}\\d{7,9} \\d{4}\\d{7,9}(.)+")) { data = data.replace("-", " "); String[] split = data.split(" ", 4); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); Date starttime = sdf.parse(split[3].substring(0,17)); Date endtime = sdf.parse(split[3].substring(18,35)); CallRecord callRecord=new CallRecord(); // 进行呼叫电话和接收电话 //------------------------------------------------------------------------ callRecord.setcallingNumber(split[1]); callRecord.setcanswerNumber(split[2]); // System.out.println(callRecord.getcallingNumber()); // System.out.println(callRecord.getanswerNumber()); //--------------------------------------------------------------------------- //通话时间 //------------------------------------------------------------------- callRecord.setStartTime(starttime); callRecord.setEndTime(endtime); // System.out.println(callRecord.getStartTime()); // System.out.println(callRecord.getEndTime()); long time; if((((callRecord.getEndTime().getTime() - callRecord.getStartTime().getTime()) / 1000) % 60)!=0){ time=(((callRecord.getEndTime().getTime() - callRecord.getStartTime().getTime()) / (60*1000)) % 60)+1; } else{ time=(((callRecord.getEndTime().getTime() - callRecord.getStartTime().getTime()) / (60*1000)) % 60); } // System.out.println(time); //-----------------------------------------------------------------------------------------------------
类图如下:
习题集七的7-1:
实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
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
设计思路:建立一个用户的list,在对用户进行开户操作,在采用正则表达式,判断开户的是手机还是座机,判断信息输入的是否正确,如果正确,再将所以的信息进行分割,将信息储存进每一个类中,然后就可以对类中信息根据题目所给要求进行处理,在根据是座机还是手机进行收费功能的编写,最后输出时将用户号码进行排序。
下面代码为手机呼叫手机的代码
//手机呼叫手机 else if (data.matches("t-\\d{11} \\d{3,5} \\d{11} \\d{3,5}(.)+")) { data = data.replace("-", " "); String[] split = data.split(" ", 6); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); CallRecord callRecord = new CallRecord(); // callRecord.setcallingNumber(split[1]); callRecord.setcanswerNumber(split[3]); callRecord.setAnswerAddressAreaCode(split[4]); callRecord.setCallingAddressAreaCode(split[2]); Date starttime ; Date endtime ; if(split[5].matches("\\d{4}.\\d{2}.\\d{2}(.)+")){ starttime = sdf.parse(split[5].substring(0, 19)); endtime = sdf.parse(split[5].substring(20, 37)); } else { starttime = sdf.parse(split[5].substring(0, 17)); endtime = sdf.parse(split[5].substring(18, 35)); } //通话时间 //------------------------------------------------------------------- callRecord.setStartTime(starttime); callRecord.setEndTime(endtime); // System.out.println(callRecord.getStartTime()); // System.out.println(callRecord.getEndTime()); long time = callRecord.getTime(); // System.out.println(time); // System.out.println(callRecord.getcallingNumber()); // System.out.println(callRecord.getanswerNumber()); //------------------------------------------------------------------------------------ //收费 for (int i = 0; i < userlist.size(); i++) { //CallRecord callRecord=new CallRecord(); if (userlist.get(i).getNumber().equals(callRecord.callingNumber)) { if (callRecord.getCallingAddressAreaCode().equals("0791")) { if (callRecord.getAnswerAddressAreaCode().equals("0791")) { userRecords.addCallingInCityRecords(callRecord); // System.out.println("市内"); userlist.get(i).cost += time * 0.1; } else if (callRecord.getanswerNumber().equals("0701") || (callRecord.getanswerNumber().substring(0, 3).equals("079") && callRecord.getAnswerAddressAreaCode().charAt(3) <= '9' && callRecord.getAnswerAddressAreaCode().charAt(3) >= '0')) { userRecords.addCallingInProvinceRecords(callRecord); // System.out.println("省内"); userlist.get(i).cost += time * 0.2; } else { userRecords.addCallingInLandRecords(callRecord); // System.out.println("国内"); userlist.get(i).cost += time * 0.3; } } else if (callRecord.getCallingAddressAreaCode().equals("0701") || (callRecord.getCallingAddressAreaCode().substring(0, 3).equals("079") && callRecord.getCallingAddressAreaCode().charAt(3) <= '9' && callRecord.getCallingAddressAreaCode().charAt(3) >= '0')) { userlist.get(i).cost += time * 0.3; } else { userlist.get(i).cost += time * 0.6; } } if (userlist.get(i).getNumber().equals(callRecord.answerNumber)) { if (callRecord.getAnswerAddressAreaCode().equals("0791")) { userRecords.addCallingInCityRecords(callRecord); // System.out.println("市内"); userlist.get(i).cost += 0; } else if (callRecord.getanswerNumber().equals("0701") || (callRecord.getanswerNumber().substring(0, 3).equals("079") && callRecord.getAnswerAddressAreaCode().charAt(3) <= '9' && callRecord.getAnswerAddressAreaCode().charAt(3) >= '0')) { userRecords.addCallingInProvinceRecords(callRecord); // System.out.println("省内"); userlist.get(i).cost += 0; } else { userRecords.addCallingInLandRecords(callRecord); // System.out.println("国内"); userlist.get(i).cost += time * 0.3; } } } //________________________________________________________________________________________________________ }
类图如下:
习题集八7-1
题目:
实现一个简单的电信计费程序,针对手机的短信采用如下计费方式:
1、接收短信免费,发送短信0.1元/条,超过3条0.2元/条,超过5条0.3元/条。
2、如果一次发送短信的字符数量超过10个,按每10个字符一条短信进行计算。
设计思路:设计思路:建立一个用户的list,在对用户进行开户操作,在采用正则表达式,判断开户的是否是手机,如果正确,再将所以的信息进行分割,将信息储存进每一个类中,然后就可以对类中信息根据题目所给要求进行处理,在根据是座机还是手机进行收费功能的编写,将用户短信内容进行处理,最后输出时将用户号码进行排序。
核心代码:
while(!data.equals("end")) { String regex1 = "^u-\\d{4}\\d{7,9} [0,1,2,3]"; if (data.matches(regex1)) { data = data.replace("-", " "); String[] tokens = data.split(" "); User user = new User(); user.setNumber(tokens[1]); userlist.add(user); } else if(data.matches("^m-1[0-9]{10} 1[0-9]{10} [A-Za-z0-9, .]+$")){ data = data.replace("-", " "); String[] split = data.split(" ", 4); MessageRecord messageRecord=new MessageRecord(); messageRecord.callingNumber=split[1]; messageRecord.answerNumber=split[2]; messageRecord.setMessage(split[3]); userRecords.addSendMessageRecords(messageRecord); for (int i = 0; i < userlist.size(); i++) { //CallRecord callRecord=new CallRecord(); if (userlist.get(i).getNumber().equals(messageRecord.callingNumber)) { int length= messageRecord.getMessage().length(); if(length%10==0){ userlist.get(i).count+=length/10; } else { userlist.get(i).count+=length/10+1; } } } } data = input.nextLine(); }
类如如下:
(3)踩坑心得:
题目集七踩坑心得:
for (int i = 0; i < userlist.size(); i++) { for (int j = i + 1; j < userlist.size(); j++) { long number1,number2; if(userlist.get(i).getNumber().charAt(0)=='1'){ number1=Long.parseLong(userlist.get(i).getNumber())*10; } else { number1=Long.parseLong(userlist.get(i).getNumber()); } if(userlist.get(j).getNumber().charAt(0)=='1'){ number2=Long.parseLong(userlist.get(j).getNumber())*10; } else { number2=Long.parseLong(userlist.get(j).getNumber()); } if (userlist.get(i).getNumber().equals(userlist.get(j).getNumber())) { userlist.remove(j); } else if (number1> number2) { User temp = userlist.get(i); userlist.set(i, userlist.get(j)); userlist.set(j, temp); } } }
将用户的号码进行排序处理。先将string类型的number 转换为double类型,再将其排序。
题目集八踩坑心得:
if (userlist.get(i).getNumber().equals(messageRecord.callingNumber)) { int length= messageRecord.getMessage().length(); if(length%10==0){ userlist.get(i).count+=length/10; } else { userlist.get(i).count+=length/10+1; } } }
1.将短信的内容转换为收费的条数。采用了length%10的方法。
4)改进建议:
1.在编写代码时应该注意代码的格式,待到代码出现逻辑问题时可以更加有效的检查出自己的问题出现在哪里,可以大大的加大自己的效率。
2.在编写代码时应该采用多种函数的方法,可以更加有效的运行代码,能够把复杂的任务划分成更小、更简单的任务,从而大大减少我们程序的整体复杂性。
3.还有就是要善于用Java中一些功能方便的类,这样可以大大的提高我们的解题效率。
4.设计思维的改进,在每次写代码解题之前就想清楚,各个类之间的关系,以及这个类有怎样的功能,该承担怎样的职责,把这些全部想清楚这样就在写代码时大大的提高了我们的效率。
5.在进行代码的编写时应该尽量避免代码的重复编写,使我的代码更加的简洁.
6,应该加强对正则表达式的掌握,以免错误的处理相关数据。
(5) 总结:
1.通过三次的题目集,我了解了如何快速的、有效的、正确的编写程序,尤其是习题六的(7-1)和习题七的(7-1),因为这两道题是所以题目集中难度最高的,所以做作业时花费了大量的时间在这两题上,所以通过这两道题使得我的编程能力大大的加强了。
2.在写题目集的过程中,我了解了在编程的时候使用注释的好处,当自己在测试程序的功能的时候出现bug时,可以快速的寻找注释,更加快速的寻找到测试该功能的代码,方便我的修改和优良。
3.在本次的题目集中,我只使用了一个主函数类,并没有加入多余的类,使得我的代码更加的单调,在后面的题目集中,我应该尝试更多的类,从而使我们的代码更加的简洁,且实现功能。
4.通过此次题目集练习,我的编程能力有了很大的提升,自己的逻辑能力也有了较大的提高。
5.通过此次题目集练习,我了解了一些正则表达式的运用,以及其发挥了很大的作用,