Blog-3
(1)前言:总结之前所涉及到的知识点、题量、难度等情况
在前一阶段的学习过程中,我们在程序设计中结合前阶段学习的知识,引入了集合框架的使用,其中还有集合的遍历排序等的操作。实验初步接触到了图形界面的使用。我认为此阶段的题量和难度都是比较大的,第一次接触到电信计费的那个题目时,需求分析理解各个类之间的关系我在这上面花费了大量的时间,后续的两次功能补充都可以利用到代码复用,所以相对来说花费的时间并没有那么多。难度我感觉时非常大的,数据输入的处理是比较繁琐和麻烦的,格式检查分离有效数据,都具有较大的工作量,这部分的工作是在整个作业中占比最大的。实验五,我感觉我设计得并不是很好,选取得图片不够美观。但几次作业,感觉难度适中,能完成,但是要耗费较多的时间。
(2)设计与分析:重点对题目的提交源码进行分析,可参考SourceMonitor的生成报表内容以及PowerDesigner的相应类图,要有相应的解释和心得(做到有图有真相),本次Blog必须分析PTA中电信计费系列的题目
因为几次题目用到相同的类图,所以只做一次类图分析,不在此粘贴代码凑字数影响阅读。
实现一个简单的电信计费程序: 假设南昌市电信分公司针对市内座机用户采用的计费方式: 月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途 拨打0.6元/分钟。不足一分钟按一分钟计。 假设本市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。 输入: 输入信息包括两种类型 1、逐行输入南昌市用户开户的信息,每行一个用户,含手机和座机用户 格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐) 例如:u-079186300001 0 座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字。 本题只考虑计费类型0-座机计费,系列2、3会逐步增加计费类型。 2、逐行输入本月某些用户的通讯信息,通讯信息格式: 座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间 t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11 以上四项内容之间以一个英文空格分隔, 时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。 以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。 注意: 本题非法输入只做格式非法的判断,不做内容是否合理的判断(时间除外,否则无法计 算),比如: 1、输入的所有通讯信息均认为是同一个月的通讯信息,不做日期是否在同一个月还是多 个月的判定,直接将通讯费用累加,因此月租只计算一次。 2、记录中如果同一电话号码的多条通话记录时间出现重合,这种情况也不做判断,直接 计算每条记录的费用并累加。 3、用户区号不为南昌市的区号也作为正常用户处理。 输出: 根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位, 单位元)。假设每个用户初始余额是100元。 每条通讯信息单独计费后累加,不是将所有时间累计后统一计费。 格式:号码+英文空格符+总的话费+英文空格符+余额 每个用户一行,用户之间按号码字符从小到大排序。 错误处理: 输入数据中出现的不符合格式要求的行一律忽略。 建议类图: 参见图1、2、3,可根据理解自行调整:



个人见解:拿到题目的第一时间,我先是阅读题目需求,然后分析给定的类图,刚开始很久都没有理解,后来根据继承关系,每个类的不同属性,明白了各个类之间的关系。每个用户对应一种终端,本次作业为座机,可以实现通话,通话记录是每个用户的成员变量,输入信息分为开户和通话记录,所以用不同的方式去处理不同输入,题目不允许相同用户重复开户,所以在开户前要检查已有用户中是否已存在。之后就是通话记录,这个是比较麻烦的,要分离出主教被叫信息,通话时间,里面用到了日期,所以要先将文本时间转化为data对象,我选择的方式是用正则表达式去匹配,然后得到它转化为日期,将两个日期时间差值求出,则得到了通话时间。通话记录分为很多种,室内通话,省内通话,和国内长途,计价方式不同所以要分开统计。
其中最影响我们得到题目全部分数的很重要的一个点是检查输入格式,要过滤所有的非正常输入,其次通话主被叫的不同关系要分开住要分为三种情况,因为本次作业,开户只有南昌市内的用户。
1:市内电话打市内电话 2:市内打省内电话 3:市内打国内电话 分别对应三种不同的价格,故我们将三种不同情况加入到对象Usercode中不同的集合中,最后计算价格的时候统一计算即可。
第二次电信计费题目,在原有的基础上加入了手机用户,手机用户所对应的类图,在第一次中就已经给出,所以对程序框架不需要作大的改动,手机用户的加入多出了很多种不同的通话类型,首先,南昌市的用户可以在其它的地方进行呼叫,所以本次题目在处理通话记录是选择结构较多,最后还是直接调用user对象的计算费用就可得到结果。
第三次电信计费题目,加入了短信的计费功能,我在本次作业中没有得到满分,有两个长短信的测试点未通过,现在还不知道是什么原因,此次作业的难点在于,不同长度的短信计费价格有区别,所以每条短信我们都要去计算短信字符的长度,而后计算该用户一共发过多少条短信,因为短信数量的多少影响了计费区间,不同的档有不同的价格,我们得到总条数之后分开计算即可。
(3)采坑心得:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空
此次的作业倾向于对我们语法,和程序设计思想的考察,跟之前图形类题目的考察有很大的区别,并不侧重与对算法的要求,当我们面对比较复杂和比较长的输入是肯定会用到正则表达式,这是比较重要的一个知识点,并且要通过练习才能达到比较好的掌握效果,这几次题目对算法并没有考察,我认为最重要的地方在于对数据的处理,数据处理中我们无可避免的会使用到正则表达式,要站在用户的角度去思考,会有哪些不合理输入的情况出现,这要才能尽可能全面的考虑到各种情况。
(4)改进建议:对相应题目的编码改进给出自己的见解,做到可持续改进
在输入检测的时候,我认为可以尽可能的给出,出题的目的是为了考察什么,能让学生明白自己有哪些地方没有掌握好,做题的目的是为了巩固和学习知识,给出要考察的知识点能让我们更好的去学习更多的知识更好的完成作业。
(5)总结:对本阶段(10-16周)综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。
我在近几次的作业上花费了很多的时间,同时学习到了很多。提升了我对复杂数据的处理能力,对平常用得很少的正则表达式更加熟悉了,题目给出的类图设计非常严密合理,也让我知道了在以后自己设计的过程中如何去学区这种模式。以上

浙公网安备 33010602011771号