第三次Blog作业 21201112 李夏楠
12-15周,三次PTA题目集中~移动业务资费问题的总结
题目集09
Task:
实现一个简单的电信计费程序:
    假设南昌市电信分公司针对市内座机用户采用的计费方式:
    月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
    南昌市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
设计思路:通过给定的类图设计程序。其中Main函数的编写思路是,先通过两个正则表达式,判断输入是否合法,然后将开户记录和通话记录分别放入两个容器中。遍历每一个开户记录中的账户,在每一个账户中,遍历每一个通话记录,将账户的市内拨打电话记录归为一个容器,账户的省内长途拨打电话记录归为一个容器,账户的的国内长途拨打电话记录归为一个容器。再分别遍历每一个账户中的这三个容器,得出每一个账户的余额。
将每一个用户的,市内拨打电话记录的容器,省内长途拨打电话记录的容器,国内长途拨打电话记录的容器,这三个容器放入符合的通话记录。
for (int i = 0; i < users.size(); i++) { for (int j = 0; j < records.size(); j++) { String answeraddress = records.get(j).getAnswerAddressAreaCode(); if (records.get(j).getCallingNubmer().equals(users.get(i).getNumber())) { if (records.get(j).getAnswerAddressAreaCode().equals("0791")) { users.get(i).getUserRecords().addcallingInCityRecords(records.get(j)); } else if (answeraddress.matches(inprovince)) { users.get(i).getUserRecords().addcallingInProvinceRecords(records.get(j)); } else { users.get(i).getUserRecords().addcallingInLandRecords(records.get(j)); } } } }
设计类图:

总结:本题的难点在于题目没有给出完整的类图,只给了部分类图,需要自己设计这些类图之间的调用关系,其次在于主函数的编写,需要知道如何将输入的数据存放、计算。
Task:
定义容器Container接口。模拟实现一个容器类层次结构,并进行接口的实现、抽象方法重写和多态机制测试。各容器类实现求表面积、体积的方法。
设计思路:让Cylinder和Cube继承Container类,在Main中创建两个Container数组分别存放cuylinder和cube,再分别对数组调用sumofArea和sumofVolume的方法输出即可。
设计类图:

总结:本题的难度不大。只要将输入的数据,根据cube和cylinder分组,分别计算每一组面积和体积的和即可。
题目集10
Task:
现在他要统计班里学生的名单,但是C~K在教务系统中导出班级名单时出了问题,发现会有同学的信息重复,现在他想把重复的同学信息删掉,只保留一个,
但是工作量太大了,所以找到了会编程的你,你能帮他解决这个问题吗?
设计思路:
这道题目的重点在于去掉重复的学生和利用学生的学号给输出的顺序排序,去掉重复容器中重复的方法其实在之前的四边形计算中用到过。下面贴上代码。
for (int i = 0; i < c.size(); i++) { for (int j = i+1; j < c.size(); j++) { if (c.get(i).getNumber().equals(c.get(j).getNumber())) { c.remove(j); j--; } } }
利用学号排序代码
@Override public int compareTo(Student o) { // TODO 自动生成的方法存根 return Integer.parseInt(this.getNumber()) - Integer.parseInt(o.getNumber()); }
设计类图:

Task:
功能需求:使用集合存储3个员工的信息(有序);通过迭代器依次找出所有的员工
设计思路:将已有代码放入eclip,通过报错,依次修改。
遍历器遍历核心代码
// 2、创建迭代器遍历集合 Iterator<Employee> it = c.iterator(); //3、遍历 while (it.hasNext()){ //4、集合中对象未知,向下转型 Employee e = it.next(); System.out.println(e.getName() + "---" + e.getAge()); }
设计类图:
 
总结:这个题目中,原代码中的许多错误都是因为声明的变量没有初始化,提示我们要在必要时候给变量初始化。其次是学到了java遍历器的使用方法。
遍历器的优势:迭代器提供一种对容器对象中的各个元素进行访问的方法,而又不需暴露该对象的内部细节。迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。
遍历器的使用:需要遍历的集合调用iterator()方法,返回一个迭代器对象,hashNext()方法判断这个集合里边是否还有未遍历完的元素,直到集合没有元素可遍历循环结束则结束。
Task:
实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
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元/分钟;
设计思路:
基本思路与第一次的电信计费程序差不多。区别在于对于座机账户,将账户的的市内拨打电话记录归为一个容器,账户的省内长途拨打电话记录归为一个容器,账户的国内长途拨打电话记录归为一个容器。对于手机账户,将账户的的市内拨打市内电话记录归为一个容器,账户的市内拨打省内电话记录归为一个容器,账户的的省内拨打任意地方电话记录归为一个容器,账户的的省外接听电话记录归为一个容器。
设计类图:

总结:这次的电信计费比上次的更加复杂,但是如果有了上次的基础,难度并不大,只是需要在原来的程序上增添一些代码,完成对手机用户的计算。
题目集11
Task:
设计一个动物发生模拟器,用于模拟不同动物的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。
定义抽象类Animal,包含两个抽象方法:获取动物类别getAnimalClass()、动物叫shout();
然后基于抽象类Animal定义狗类Dog、猫类Cat和山羊Goat,用getAnimalClass()方法返回不同的动物类别(比如猫,狗,山羊),用shout()方法分别输出不同的叫声(比如喵喵、汪汪、咩咩)。
最后编写AnimalShoutTest类测试,输出。
设计思路:根据题目要求,设计程序。
设计类图:

总结:这次题目的特点就是利用多态,在main()中调用speak()方法实现了不同的输出,这样的形式其实在期中考试中也出现过,很简单。
Task:
写一个类Shop(商店),该类中有一个成员内部类InnerCoupons(内部购物券),可以用于购买该商店的牛奶(假设每箱牛奶售价为50元)。
设计类图:

总结:这次的作业特点就是在类里面又写了一个类,可以称之为内部类。
内部类的共性
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。
Task:
 实现一个简单的电信计费程序,针对手机的短信采用如下计费方式:
1、接收短信免费,发送短信0.1元/条,超过3条0.2元/条,超过5条0.3元/条。
2、如果一次发送短信的字符数量超过10个,按每10个字符一条短信进行计算。
设计思路:
采用和之前两次差不多的设计思路,只是通话记录变成了短信记录,通话时长的计算变为了短信字符串长度的计算。
设计类图:

总结:这次的电信计费作业比较简单,就是对短信里字符串长度的计算需要注意,因为我们对于信息的读取时通过空格分开的。但如果短信有空格的话,会导致我们对短信字符串长度的读取内容错误,我通过了以下代码解决。
if (input.matches(patten1)) { String[] Split = input.split(" "); MessageRecord callrecord = new MessageRecord(); callrecord.setCallnumber(Split[0].substring(2, Split[0].length())); callrecord.setMessage(input.substring(26,input.length())); records.add(callrecord); }
总结:这三次的电信计费作业,难度不算大,但是我只有第三次次通过了所有测试点。第一次和第二次都有6-8分的测试点怎么都通过不了。怀疑了很多题,比如是不是输出有多的换行,再比如Scnner的位置不对,导致读数据的时候暂停了,等等,都不行。但其中也学到了一些,对类和类之间的调用更加熟悉,掌握了对容器中存放自己写的类的排序方法等等。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号