blog2
前言:总结之前所涉及到的知识点、题量、难度等情况
显而易见,这两次的PTA作业所考察的知识点以及难度呈现不断变大的趋势。PTA4作业难度较难,在PTA3作业上加大了难度,且输入时加入了特色菜,还有异常情况。而PTA5在PTA上菜单计价程序-4同属菜单计价程序-3的两个不同迭代分支,菜单5菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+口味类型+英文空格+基础价格+"T",而且本题要考虑代点菜的情况,当前桌点的菜要加上被其他桌代点的菜综合计算口味度平均值,以及考虑客户订多桌菜的情况,输入时桌号时,增加用户的信息。两次PTA的作业着重练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构、控制结构;练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码。学习使用工具对代码进行跟踪调试。理解抽象类与子类的关系,实现继承操作,构造类族;正确使用抽象类和子类实现多态操作;理解接口的意义,并实现行为的多态;理解了解抽象类、类以及接口三者的异同以及使用场合。掌握UML基本用法和画法,并能根据题目描述画出类、接口、类。整体题量较难,大部分的题目的难度适难,而且每个题目都有着鲜明的特点、特征。
1.PTA4: 本体大部分内容与菜单计价程序-3相同,但是增加了输入时加入了特色菜,还有异常情况。增加的异常情况有17种,菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+基础价格+"T"。本题要用到的知识点主要是面向对象以及类的设计。
以下是我的实验思路:
1、首先创建Dish类,用于存储菜品信息。该类包括两个实例变量,分别是菜名和单价,以及一个getPrice方法,根据不同份额计算价格。
2、创建Menu类,用于存储菜谱信息。该类包含一个Dish数组,以及searthDish和addDish两个方法,用于根据菜名查找和添加菜品信息。
3、创建Record类,用于存储点菜记录。该类包括订单号、Dish对象、份额以及一个用于计算价格的getPrice方法。
4、创建Order类,用于存储订单信息。该类包括一个Record数组和一个int类型的折扣属性。此外,该类还包括一个addARecord方法,用于添加点菜记录;一个delARecordByOrderNum方法,用于删除指定序号的点菜记录;一个findRecordByNum方法,用于查找指定序号的点菜记录;以及一个getTotalPrice方法,用于计算订单总价。
5、最后,创建Main类,用于实现点菜计价程序的整个流程。应该注意以下几个问题:
①应该定义一个枚举类型来表示星期几和时间段:如SUN, MON, TUE, WED, THU, FRI, SAT和MORNING, AFTERNOON, EVENING以及一个checkTime方法来比较下单时间是否在营业时间段内。
②在处理输入时,应该分别处理菜单和订单,避免将两者混合在一起。
③在读入订单时,需要先读入桌号标识,然后再读入该桌的所有点菜记录,直到下一个桌号标识。
④在计算价格时,应该注意对重复的点菜记录进行合并,避免出现四舍五入误差。同时,应该考虑代点菜的情况,即将其他桌点的菜品价格计入当前桌的总价。
⑤最后输出总价时应该按桌号从小到大的顺序输出,并根据时间区间计算折扣。
下面是简单类图;

其中,各个类的简要说明如下:
Kitchen(厨房):负责烹饪菜品的类,可能包含多个烹饪员,需要知道菜品信息和需要烹饪的订单信息。
Dish(菜品):保存菜品的名称、单价、制作时间等信息的类,可以使用静态工厂方法创建对象。
Menu(菜单):包含所有可供选择的菜品列表,可以根据菜品名称获取菜品对象信息。
Record(订单记录):保存每道菜品的份额和价格计算方法的类,可能包含代点菜属性。
Order(订单):保存所有点菜记录的列表,包含对订单总价进行计算的方法,以及增加、删除点菜记录的方法。
Table(餐桌):保存桌号和订单信息的类,可以列出点餐列表并对订单进行增加、删除点餐的操作。
Cashier(收银员):对多个餐桌进行订单汇总,计算总价,并输出结果的类。
下面是部分Java代码实现:


2.PTA5:本题在菜单计价程序-3的基础上增加了部分内容,增加的内容用加粗字体标识。注意不是菜单计价程序-4,本题和菜单计价程序-4同属菜单计价程序-3的两个不同迭代分支。菜单5菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+口味类型+英文空格+基础价格+"T",而且本题要考虑代点菜的情况,当前桌点的菜要加上被其他桌代点的菜综合计算口味度平均值,以及考虑客户订多桌菜的情况,输入时桌号时,增加用户的信息。
以下是我的实验思路:
这个点菜计价程序涉及到多个类的设计和实现,可以分为以下几个步骤:
首先设计Dish(菜品)类,包含菜品名称、单价、价格计算方法等信息,可以考虑使用静态工厂方法创建菜品对象。
定义Menu(菜谱)类,包含一组菜品对象,可以通过菜品名称在菜谱中查找菜品信息。
设计Record(点菜记录)类,保存一道菜品的点菜信息,包括序号、菜品对象、份额、价格计算等信息。
定义Order(订单)类,保存点菜记录列表和计算订单总价等方法,可以使用ArrayList来保存点菜记录。
接下来定义Table(桌子)类,包含桌号和订单信息,以及添加、删除点菜记录等方法。注意,每条订单信息可能存在代点菜的情况,需要特殊处理。
最后,设计Cashier(收银员)类,根据输入的信息计算全部桌位的总价,并输出相应的结果。
总体思路如上,实现时还需要注意边角情况的处理,例如判断时间是否在营业时间内、输入格式是否正确等。同时要注意类之间的联系和数据传递,确保程序能够正确运行。
这是简单类图

Kitchen(厨房):负责烹饪菜品的类,可能包含多个烹饪员,需要知道菜品信息和需要烹饪的订单信息。
Dish(菜品):保存菜品的名称、单价、制作时间等信息的类,可以使用静态工厂方法创建对象。
Menu(菜单):包含所有可供选择的菜品列表,可以根据菜品名称获取菜品对象信息。
Record(订单记录):保存每道菜品的份额和价格计算方法的类,可能包含代点菜属性。
Order(订单):保存所有点菜记录的列表,包含对订单总价进行计算的方法,以及增加、删除点菜记录的方法。
Table(餐桌):保存桌号和订单信息的类,可以列出点餐列表并对订单进行增加、删除点餐的操作。
Cashier(收银员):对多个餐桌进行订单汇总,计算总价,并输出结果的类。
下面是部分Java代码实现:


- 期中考试:
期中考试较两次大作业难度更简单,其中包含4个题目,且每个题目难度迭代上升。
测验1-圆类设计
该题较为简单,只需要创建一个简单的类即可拿到满分。
以下是我的代码实现:

测验2-类结构设计
该题目也只设计一个矩形类,其属性由矩形左上角坐标点(x1,y1)及右下角坐标点(x2,y2)组成,其中,坐标点属性包括该坐标点的X轴及Y轴的坐标值(实型数),求得该矩形的面积。类设计如下图

该题目代码较简单,只有20多行,以下是我的代码实现:

测验3-继承与多态
该题目需要将测验1与测验2的类设计进行合并设计,抽象出Shape父类(抽象类),Circle及Rectangle作为子类,类图如下所示;

此题目也较为简单,但是有一个测试点较难,我试了好几次都无法通过

测验4-抽象类与接口:
该题目在测验3的题目基础上,重构类设计,实现列表内图形的排序功能(按照图形的面积进行排序)。
提示:题目中Shape类要实现Comparable接口。
而且此题目还有特殊的输入格式:
输入格式:
输入图形类型(1:圆形;2:矩形;0:结束输入)
输入图形所需参数
输出格式:
按升序排序输出列表中各图形的面积(保留两位小数),各图形面积之间用空格分隔。
输入样例:
在这里给出一组输入。例如:
1
2.3
2
3.2
3
6
5
1
2.3
0
输出样例:
在这里给出相应的输出。例如:
5.60 16.62 16.62
下面是我的部分代码:

主要困难以及改进建议:
菜单计价程序方面做的不好,类与对象的知识点没有掌握好,功能实现不完整。对多项式求导还有待改进,没能完全实现多项式求导功能,圈复杂度无法控制。在控制圈复杂度上还有待改进,三次题目集的圈复杂度都没在10以下,在降低圈复杂的方面还有待研究,了解圈复杂度过高的原因,如何在设计之初就降低圈复杂度,尽量不要在实现完功能后,在去修改圈复杂度思维僵化,死板。在写题目过程中,不能灵活的调用知识,即使掌握了新知识点,仍然沿用以前的思维考虑题目,查错能力低。不能系统的思考问题产生的原因,思考如何解决问题,而是不断地运行程序,不断地进行输入操作,阅读题目不仔细。在没能完全理解题目要求的情况下,就开始思考如何解决题目,一味的求快,在最后需要花费更多的时间来查错。
总结:
首先在这里我使用了新的知识java,同时也学到了如何使用字符串中的方法,同时还学到了创建一个新的类,对我在这几道题的帮助特别大,同时我还需要继续学习父类和子类之间如何使用的,同时老师在对我们学习这方面帮助很大,作业和实验每次也都刚刚好,希望老师在课上时能够多多与示例相结合来讲解书本内容。但是这几次作业总体来说自己做的不是很好,虽然if-else知识点掌握情况较好,对变量的定义输出也掌握较好,但是类与对象方面知识点掌握不够好,在以后的学习中,我一定会对自己不足的知识点进行补充。

浙公网安备 33010602011771号