第二次PTA大作业-博客作业
第二次博客作业
一、 前言
(1) 对之前发布的PTA题目集4、5以及期中考试,其中相比于上次涉及到的知识点多了很多,首先对动态数组有了比较熟悉的运动,由于各种条件的要求,使用普通数组太过麻烦,便修改了部分数组为动态数组,同时对动态数组增删改查有一定的学习。在菜单四中还对特色菜运用了继承的方法,专门创建了一个特色菜类。同时在菜单四,五当中都运用到了异常处理的知识,当一个方法可能抛出一个特定类型的异常时,可以使用"throws"关键字在方法声明中指定可能抛出的异常类型,当代码中的解析操作出现错误时,可以抛出该异常,并由调用该方法的代码进行捕获和处理。同时相比于之前的菜单,对于日期进行处理,其实涉及到了Calendar,Date和SimpleDateFormat,用于获取、设置和操作日期和时间的不同方面,如年、月、日、小时、分钟、秒等。可以进行日期和时间的计算、比较和格式化等操作,还可将日期对象格式化为特定的字符串表示形式,或者将字符串解析为对应的日期对象。在期中考试的题中,同时涉及到了抽象类,继承,接口等多个知识点。
(2)这三次作业的题量不大,PTA题目集4、5就两道菜单题,但是难度是非常大的,菜单4和菜单5都是在3的基础上进行修改进行迭代,我觉得菜单4的难度更大一些,异常处理太多了,对于代码的修改量巨大,而菜单5是在3的基础对特色菜进行修改,加上了各种地方菜和口味度以及添加点菜人的信息,难度相比于4小一些。期中考试有4道题,题量看起来大,但是难度并不是很大,两节课的时间有余,但是第四题接口学的不是特别明白,倒是丢分了。
二、 设计与分析
我先给出两次菜单题SourceMonitor的生成报表内容以及PowerDesigner的相应类图并且进行分析,有图有真相,之后再对期中考试的题进行分析。(部分主要源码以截图的方式放在本小结最后)
菜单四的生成报表:
由图可以看到该代码总共有514行代码,包括空行,函数调用语句有44行,平均每个类中有4个方法,平均每个方法中有16.75行语句,可以看出代码的方法都是比较复杂的,每个功能差不多就对应一个方法。Maximum Complexity表示该类中最复杂函数的复杂度,报表可以看出最大的圈复杂度有29,圈复杂度指示一个函数可执行路径的数目,说明我在代码设计上还是可以优化的,由于判断过多,使用了打量的if-else语句,造成了圈复杂度的升高。

菜单四的类图
由类图可以明显的看出代码由7个类组成,除了老师提供的4个类和主类,还有一个工具类util类和特色菜类DishT,其中特色菜类用到了继承的关系,让DishT继承Dish。然后一些用于判断的方法和日期相关的方法统统放在工具类Util中,便于调用。

菜单五的生成报表
该代码总共有410行代码,包括空行,函数调用语句有18行,平均每个类中有5个方法,平均每个方法中有16.6行语句,可以看出代码的方法都是比较复杂的,每个功能差不多就对应一个方法。报表可以看出最大的圈复杂度有8,圈复杂度指示一个函数可执行路径的数目,相比于上次菜单,圈复杂度减少了很多,大部分原因都是因为减少了错误判断等代码,使得整体更加整洁。

菜单五的类图
菜单5我的代码主要分5个类组成,取消了两个类,将所有功能都放在主类完成,我感觉在这特色菜用继承有点太麻烦了,所以选择将继承取消了,改动了大部分代码。
首先声明了一些变量和数据结构,包括Scanner对象用于接收用户输入,Menu对象用于管理菜单,Record对象数组用于存储点菜记录,orderList列表用于存储订单recordIndex和orderNum等辅助变量。进入一个无限循环,直到用户输入"end"时退出循环。循环体内部根据用户输入的不同进行相应的处理,包括添加菜品到菜单,创建订单,添加点菜记录和删除点菜记录。循环结束后,根据点菜记录生成订单信息并打印输出定义了一些辅助方法,包括判断时间是否在指定范围内的timeIsInRound方法,计算商品时间段对应折扣后总价的getDiscountTotalPrice方法,以及获取口味值和口味平均值的getTaste和getTasteAverage方法。

期中考试设计与分析:
这个题目最终是一个图形计算程序,它使用了一个ArrayList来存储用户输入的图形对象,并对其进行排序和打印。
在程序开始时,它会创建一个空的ArrayList对象来存储图形。然后,通过一个循环读取用户的选择,根据选择的不同执行相应的操作。
如果选择是1,表示用户希望计算圆的面积。程序会读取一个浮点数作为圆的半径,并创建一个Circle对象来表示圆。然后,将该对象添加到list中。
如果选择是2,表示用户希望计算矩形的面积。程序会读取四个浮点数分别表示矩形的左上角点和右下角点的坐标。然后,程序会创建一个Rectangle对象来表示矩形,其中使用了两个Point对象来表示左上角和右下角点。最后,将该对象添加到list中。循环会一直执行,直到用户输入选择为0,退出循环。
接下来,程序对list进行排序,使用了Comparator.naturalOrder()来进行正向排序,这要求图形对象的类实现了Comparable接口并重写了compareTo方法。最后,程序通过循环遍历list,并调用getArea方法获取每个图形对象的面积,并使用String.format方法将面积格式化为保留两位小数的字符串进行打印。
部分源码:






三、 踩坑心得
(1)期中考试踩坑心得:在考试的前两道题中,并没有遇到什么困难,在第三道题里,第一个测试点卡了一下,在第三题中,我看给出的主类里面并没有输出对圆错误半径的判断,我以后主类是不可以修改的,在circle中传radius是,加了一个判断条件,但仍然显示答案错误。后面还是对主类做修改,当传半径进去时,加了一个判断条件才过的测试点。

(2)菜单四踩坑心得:做菜单四时设计就出了问题,开始搭了个输入输出框架,最后一块输出,慢慢加条件,最后发现这样太不好搞了,就改成了边输入边输出。

在这个测试点卡了特别久,要求说的是特色菜的份额必须是1和3,但是他这里2没算错,然后说输出的时候按桌号从小到大输出,但是他没按从小到大,我认为是老师给的测试点错了,后来问老师才知道特色菜没有份额的区别了,只有打折的不同。

还有这个测试点就是当时有10多个格式错误,人直接麻了,这个冒号后面少的空格一直补不上,后来还是上网搜了下才解决了。这个输入好恶心,输入不合法一般是重输,结果这直接跳过,还跳过下面的部分输出。
(3)菜单五踩坑心得:

这个测试点,在IDEA上测和在pta上代码相同,结果测出的结果不同。

后来发现我判断的是前面这种星期几,但是这个系统上返回的是后面这种英文。

在输出样例5中,这个73一直计算不出来,我算的是72.后来理解了一下,发现不能从总价上打折,这样是72.1,要把每个菜先打折四舍五入,再加起来就是73

这个格式错误的点,后面居然需要考虑一个特色菜都没有的情况,要在最后加一个空格,这个pta也不会显示,真的麻了。
四、 改进建议
我觉得首先,确保你对编码改进的目标有清晰的定义。确定你想要改进的方面,比如性能、可读性、可维护性或可扩展性等。这将帮助你更好地聚焦和评估改进的效果。菜单题属于不断迭代的题目,每次改进时要清楚的认识到新增加的知识点,知道该从哪个点进行修改。将编码改进作为一个持续的过程来看待。避免试图在一次改进中解决所有问题,而是采取迭代的方式逐步改进,通过每个迭代周期集中解决一到两个问题。
菜单五不是从菜单四迭代的,在菜单五中没有处理用户输入错误格式的情况,直接输出错误信息并返回。在改进过程中删了大量的代码,我觉得在迭代的过程中,还应将每次的代码保存下,以应对不同的要求。添加文档和注释,编写清晰、准确的文档和注释是持续改进的关键,除了编写自解释的代码外,还应编写清晰的文档和注释来解释代码的意图、功能和用法。
五、 总结
对这两次大作业和期中考试,我觉得学会了很多,通过实践,我更深入地理解了Java的核心概念是"一切皆类,面向对象",意识到合理利用网络资源进行自学的重要性。通过大作业,能学到许多课本上和课堂上没有的知识点,例如日期输入,判断字符串是否为数字以及对字符串进行排序等,这些老师课堂上都没细讲过,需要自己去网络上学习。我觉得我在集合和接口方面还需要进行更加深入的了解,我对于他们大部分还停留在会看不会用的地步下。
对于课程,我认为可以提供更多实际案例和实际应用的示例,以帮助学生更好地理解Java的概念和技术,强调面向对象编程的核心概念和原则,并通过具体的例子和练习加深理解。对于作业,应当提供充足的时间和资源,以便学生能够完成大作业和实验,课堂上应创造积极活跃的课堂氛围,鼓励学生提问、讨论和分享自己的观点和经验。
(本次博客所有题目图片均采用图片方式,文字均为手写,字数在3300左右)
浙公网安备 33010602011771号