我的第二次博客作业
AZ-1的第二次博客作业
前言
题量
- 题目集4题量较小。
- 题目集5题量较小。
- 期中考试题量中等。
难度
- 题目集4虽然只有一道题,但是题目很长,难度很大,让人在看到的时就心生畏惧。菜单4在菜单3的基础上增加了大量的错误输入,大大增加了程序的代码量,很考验编程过程中的细心程度,也很考验对正则表达式的掌握程度。
- 题目集5也只有一道题目,难度相对于菜单4来说低了一点。菜单5是菜单3的另一个分支,在特色菜的基础上增加了菜的口味度和种类,并且需要计算每张桌子的平均口味度。也为桌增加了电话号码和人名,总体来讲并不简单。
- 期中考试总共有四道题目,除第四题外题目难度都不高。第一题是创建圆类;第二题是创建点类和矩形类;第三题是从圆类和矩形类中提取出一个共同的父类,实现多态;第四题是实现给定的接口设计。
知识点
- 菜单4的知识点主要是正则表达式、对代码运行过程的优化以及内容的扩充。
- 菜单5的知识点主要是正则表达式、对代码运行过程的优化以及内容的扩充。
- 期中考试的主要知识点主要是程序设计中类的设计、程序设计中类结构设计、程序设计中的继承与多态和程序设计中的抽象类与接口。
题目集四 7-1 菜单计价程序-4
设计与分析
- SourceMonitor生成报表:
- idea生成类图:
这个程序由7个类组成,分别是Dish类、Menu类、Record类、Order类、Main类、Time类和Table类。
Dish类包含菜的名字、打折后价格、Boolean型数flag(这道菜是否是特色菜的标志)、Dish的构造方法和每道菜的价格计算方法。
Menu类包含一个Dish数组、整型数i(记录菜单中共有几道菜)、Menu的构造方法、向Menu中添加菜的方法和查找菜品的方法。
Record类中包含用户点的菜、每道菜的份量、每道菜的数量、点菜的序号、Boolean数flag(标志用户点的是不是特色菜)、这条记录的价格、Record的构造方法和计算这条记录的价格的方法。
Order类中包含Record数组、整形数num(记录订单中有几条点菜记录)、整型数lastOrderNum(记录该订单中的上一条点单记录的点菜序号)、计算总价格的方法、添加点菜记录的方法和删除点菜记录的方法。
Time类中包含Calendar类对象cal、整型数(year、month、day、hour、minute、second、week)、Time的构造函数、judge方法判断Table对象是否在营业时间。
Table类包含Time类对象time、Order类对象order、anotherOrder(帮别桌点菜的记录)、String对象num(桌号)、double对象discount(记录该桌的折扣)、totalPrice(该桌打折后的总价)、originalPrice(该桌的初始价格)、Boolean型对象flag(判断该桌是否第一次点菜)、flag1判断特色菜是否打折、judge方法判断该桌打几折、searchTable方法根据桌号找桌对象。
踩坑心得
- 我一开始没有使用正则表达式来规范输入,而是单纯地使用if语句判断输入是否合规。这导致我的程序不能准确地判断用户输入的情况,相应地输出各种错误输入的输出提示。
心得:熟练地使用正则表达式可以准确地筛选出正确的输入形式,剔除各种各样奇奇怪怪的错误输入。
- 不能乱加访问修饰词
给Dish中的dishName加private修饰词:
心得:现在我们的程序只要能够运行拿满分就够了,目前还不会涉及到数据的私密性,没有必要把数据的访问权限设置地太高。
- 方法中传入的参数名字尽量与该类中存在的变量名不同,如果相同,要用this.指代该类中的变量:
心得:虽然我们几乎可以给变量起无数种名字,但是果然还是同样的名字方便日后理解。
- 一个错误输入可能同时符合多种错误输出情况,但错误输出有优先级。
正确输出:
错误输出:
心得:在编写程序时要时刻记得题目要求,内心要有一个程序运行的大概的流程,按照要求一步一步地编写程序。
改进建议
- 建议1:Order类中的Record数组可以设计成动态数组,增加程序灵活性。
- 建议2:去除一些运行过程中没有必要出现的变量。
题目集五 7-1 菜单计价程序-5
设计与分析
- SourceMonitor生成报表:
- idea生成类图:
这个程序由8个类组成,分别是Dish类、Menu类、Record类、Order类、Main类、Time类、Table类和Customer类。
Dish类包含菜的名字、打折后单价、Boolean对象flag(这道菜是否是特色菜的标志,如果这道菜是特色菜,String对象记录该特色菜的种类(即川菜、浙菜等))、Dish的构造方法和每道菜的价格计算方法。
Menu类包含一个Dish数组、整型数i(记录菜单中共有几道菜)、Menu的构造方法、向Menu中添加菜的方法和查找菜品的方法。
Record类中包含用户点的菜、每道菜的份量、每道菜的数量、点菜的序号、Boolean对象flag(标志用户点的是不是特色菜,如果是特色菜,String对象记录该特色菜的种类(即川菜、浙菜等))、这条记录的价格、Record的构造方法和计算这条记录的价格的方法。
Order类中包含Record数组、整形数num(记录订单中有几条点菜记录)、计算订单总价格的方法、添加点菜记录的方法和删除点菜记录的方法。
Time类中包含Calendar类对象cal、整型数(year、month、day、hour、minute、second、week)、Time的构造函数、judge方法判断Table对象是否在营业时间。
Table类中包含String对象name和phoneNumber、Time类对象time、Order类对象order、anotherOrder(帮别桌点菜的记录)、String对象num(桌号)、double对象discount(记录该桌的折扣)、totalPrice(该桌打折后的总价)、originalPrice(该桌的初始价格)、Boolean对象flag1判断特色菜是否打折、double对象spicy(储存该桌辣菜的总辣度)、sweetNess(储存该桌甜菜的总辣度)、acidity(储存该桌酸菜的总辣度)、int对象spicyAmount(储存该桌辣菜的总数量)、sweetNessAmount(储存该桌甜菜的总数量)、acidityAmount(储存该桌酸菜的总数量)、boolean对象spicyFlag(该桌有没有点辣菜的标志)、sweetFlag(该桌有没有点甜菜的标志)、acidityFlag(该桌有没有点酸菜的标志)、void judge()方法判断该桌打几折、searchTable方法根据桌号找桌对象、String judge(String kind,int a)把平均口味度转化为字符标准、taste方法计算该桌的口味度的总和以及特色菜的总量、tasteCalculation方法计算该桌特色菜的平均口味度、showTaste方法输出该桌的平均口味度的字符形式以及每种口味的特色菜的总量。
Customer类中包含String对象name、phoneNumber、double对象totalPrice(这个顾客点菜的总价格)、record方法记录该顾客的名字,电话号码以及点菜的总价格。
踩坑心得
- 程序有两种输入错误提示,“** does not exist”和“delete error”,这时需要注意这两个提示的输出顺序,否则会提示格式错误
错误的输出顺序:
正确的输出顺序:
心得:答案对固然重要,但是也要格式对才能得分。
- 订单总价的计算过程是菜的原价在按份量计算一次后进行四舍五入,再在乘以数量以及折扣后进行一次四舍五入,最后再加在一起即为订单总价格。如果是加在一起后再进行打折会计算出不同的答案。
错位的价格计算顺序:
正确的价格计算顺序:
4
心得:在编写程序前应该认真地研读题目要求,思考清楚程序运行过程再进行编写,避免出现逻辑错误。
- 为别桌点特色菜时被点菜的桌的口味度及特色菜总数量不变(不小心遗漏了在为别桌点菜时给别桌增加口味度总量以及特色菜总数量的过程)
输入
东坡肉 浙菜 25 T
油淋生菜 9
蜜汁灌藕 浙菜 10 T
刀削面 晋菜 10 T
醋浇羊肉 晋菜 30 T
麻婆豆腐 川菜 12 T
麻辣鸡丝 川菜 15 T
table 1 : tom 13605054400 2023/5/6 12/30/00
1 油淋生菜 2 1
table 2 : jerry 18100334566 2023/5/1 12/30/00
1 1 醋浇羊肉 4 1 2
3 麻婆豆腐 2 2 1
4 麻辣鸡丝 2 3 3
end
错误输出:
正确输出:
心得:编写程序的过程中要专注,避免遗漏一些简单的部分。
- 如果某桌没有点特色菜则要在输出table *: *** ***后加一个空格
错误输出:
正确输出:
心得:虽然题目中没有给出相应的测试样例,但我们可以在不断的试错中把题目需要的格式测出来
- 如果点了特色菜,但是该桌的平均口味度为零的时候要输出不辣、不甜或者不酸。
错误输出:
正确输出:
心得:在编写程序前应该认真地研读题目要求,思考清楚程序运行过程再进行编写,避免输出的答案与题目要求不符合。
改进建议
- 建议1:Menu中的dishes数组和Order中的records数组都可以改为动态数组,增加程序的灵活性。
- 建议2:Table中的name对象和phoneNumber对象可以替换成一个Customer对象。
- 建议3:Table类中的与口味有关的参数可以整合为一个口味类。
- 建议4:创建一个特色菜类作为Dish类的子类。
期中考试 7-1 测验1-圆类设计
设计与分析
- idea生成类图:
这个程序由2个类组成,分别是Circle类和Main类。
Ciecle类中包含r(半径)、getS方法、setR方法和Circle的构造方法。
踩坑心得
- 题目要求当输入的半径范围超过(0,+∞)时输出Wrong Format不输出面积。
错误输出:
正确输出:
心得:编程时要注意题目的要求。
改进建议
- 建议1:可以在Circle类中增加getR的方法,在getS方法中用getR代替R。
期中考试 7-2 测验2-类结构设计
设计与分析
- idea生成类图:
这个程序由3个类组成,分别是Point类、Rectangle类和Main类。
Point类中包含x、y、getY方法、getX方法、setX方法、setY方法和Point的构造方法。
Rectangle类中包含Point类对象lowerRightPoint和toLeftPoint、setLowerRightPoint方法、getLength方法、getToLeftPoint方法、setToLeftPoint方法、getLowerRightPoint方法、getHeight方法、getArea方法和Rectangle的构造方法。
期中考试 7-3 测验3-继承与多态
设计与分析
- idea生成类图:
这个程序由5个类组成,分别是Shape类、Circle类、Point类、Rectangle类和Main类,Shape类是Rectangle类和Circle类的父类。
Point类中包含x、y、getY方法、getX方法、setX方法、setY方法和Point的构造方法。
Rectangle类中包含Point类对象lowerRightPoint和toLeftPoint、setLowerRightPoint方法、getLength方法、getToLeftPoint方法、setToLeftPoint方法、getLowerRightPoint方法、getHeight方法、getArea方法和Rectangle的构造方法。
Ciecle类中包含r(半径)、getS方法、setR方法和Circle的构造方法。
Shape类中包含getArea方法和Shape的构造方法。
踩坑心得
- 把我前两题的代码和第三题中提供的主方法不能顺利地实现题目要求的功能,所以我为Circle的半径赋初值为-1,若Circle的半径最终的值为-1则输出Wrong Format。
错误输出:
正确输出:
心得:为了实现功能可以使用一些不太合适的改动。
改进建议
- 建议1:可以把错误输出写在Shape的getArea方法中。
期中考试 7-4 测验4-抽象类与接口
设计与分析
- idea生成类图:
这个程序由5个类组成,分别是Shape类、Circle类、Point类、Rectangle类和Main类,Shape类是Rectangle类和Circle类的父类。
Point类中包含x、y、getY方法、getX方法、setX方法、setY方法和Point的构造方法。
Rectangle类中包含Point类对象lowerRightPoint和toLeftPoint、setLowerRightPoint方法、getLength方法、getToLeftPoint方法、setToLeftPoint方法、getLowerRightPoint方法、getHeight方法、getArea方法和Rectangle的构造方法。
Ciecle类中包含r(半径)、getS方法、setR方法和Circle的构造方法。
Shape类中包含getArea方法和Shape的构造方法,Shape类实现了Comparable接口,方法为compareTo(Shape)。
踩坑心得
- compareTo方法当传入的Shape对象的area更大时输出正值,更小时输出负值是逆向排序,不符合要求,应该反过来。
错误输出:
正确输出:
心得:可以通过试错来理解一些方法。
改进建议
- 建议1:把compareTo方法改为固定输出1或-1。
总结
- 在6-9周的学习中我加深了对继承关系的理解,掌握了部分正则表达式的用法,学会了接口的用法,学会了动态数组的用法。
- 正则表达式的用法、接口的用法以及类与类之间的关系的划分我还需要更进一步地学习。
- 课上讲的一些东西我们不能立刻在作业中得以实践,会导致我们在课上听懂了,但是由于没有课后习题的及时巩固,最终忘记我们上课所学到的一些知识。