PTA上关于菜单的三次作业
前言:
(1)题目集2的7-1的菜单较为简单就是计算订单中所点菜的单价,并且菜具有不同的规格,计算结果四舍五入。
(2)题目集2的7-2的菜单是7-1的进阶版,题目要求新增了删除菜单中点菜记录的功能,其他的与题目集2的7-1相差不多。
(3)题目集3的7-1的菜单又在题目集2的7-2菜单功能上新增了桌号与时间两个概念,桌号这个概念会与别人点菜到其他人桌上的功能相对应,新增的时间会对点菜的价格进行影响,复杂程度又变得高了。
设计与分析:
题目集2的7-1
题目:某饭店提供4种菜,每种菜品的基础价格如下:
西红柿炒蛋 15
清炒土豆丝 12
麻婆豆腐 12
油淋生菜 9
设计点菜计价程序,根据输入的订单,计算并输出总价格。
订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束
每条点菜记录包含:菜名、份额两个信息。
份额可选项包括:1、2、3,分别代表小、中、大份)
不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格2。
如果计算出现小数,按四舍五入的规则进行处理。
参考以下类的模板进行设计:
题目中提示了4个类分别是菜品类(Dish),菜谱类(Menu),点菜纪录类(Record)以及订单类(Order)。Dish,Menu,Record,Order代码如下:
Menu:

Dish:

Record:

Order:

菜谱中包含有该饭店的所有菜品,并且在菜谱中还包含着查询菜品的功能,该功能会将输入的菜名与菜谱中的菜品一一比对,并最后返回不同的值,以便对菜品单价的计算和筛选非法菜名。菜品中含有菜品的单价与份额,份额会与后面的计价功能相对应。订单类包含着点菜记录对象,用户点的菜品会保存在订单中,并根据用户点菜的份额计算总价。题目集2的7-1点菜的时候默认用户点的是一道菜,这不太符合实际情况,后续应该会加上点菜数量。
设计点菜计价程序,根据输入的信息,计算并输出总价格。
题目集2的7-2
题目:
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:点菜记录和删除信息。每一类信息都可包含一条或多条记录,每条记录一行。
点菜记录包含:序号、菜名、份额、份数。
份额可选项包括:1、2、3,分别代表小、中、大份。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格2。
如果计算出现小数,按四舍五入的规则进行处理。
题目集2的7-2:根据题目提示可知在点菜记录类中新加了点菜序号的功能,这个功能为删除订单中菜品的功能做了铺垫。在订单中增加了查找序号功能为寻找需要删除的菜品提供了便利。Dish,Menu,Record,Order代码如下:
Dish:

Menu:
可见题目集2的7-2的Dish,Mean和题目集2的7-1的Dish,Mean差别不大。
Record:

Order:

类图:

题目集2的7-2的Record中含有序号,可以将Record中的菜品Dish与序号orderNum进行绑定,便于删除功能的进行。
(1)题目集3的7-1:
题目:设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 份额 分数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
新增了桌号与时间,桌号是为了满足别人代点餐功能,时间是在点菜的时候影响菜品价格的因素。需要将字符串时间转化为日期形式,以知道该日期是星期几进而更改菜品单价,如果不在营业时间则按要求输入。
Dish,Mean,Record,Order,table。
Dish:

Mean:

Record:

Order:

Tables:

时间:

类图:

新建桌子类,可以与别人点菜功能相照应,不同桌号不同人点不同菜的效果。
踩坑心得:主要体现在Java的基础不扎实导致在写Java时遇到常见的语法错误。
例如:
(1)方法后面的括号容易忘了带上,尤其是在使用Scanner的时候,还不容易察觉。
(2)大小写的问题,有些单词的首字母需要用大写Scanner,String,Main而且根据作用不同,是否大小写情况也并不相同。
(3)方法的返回值类型与返回值并不一致,常见错误,只要注意一下还是能够避免的。
(4)类的调用出现错误(错误情况较多也比较复杂):
1.静态方法调用静态非静态方法:

2.静态方法调用静态方法:

3.非静态方法调用其他方法:

(5)类的方法中再次定义了一个方法。
(6)有种情况代码运行没出错,运行结果也正确,但就是时间超过了规定的时间,这就需要我们进行速读与速写或者是改变计算方式来减少运行时间。
- 通过速读来减少运行时间
- 通过改变计算方法来减少运行时间
主要困难以及改进建议:
主要困难:
1.作为一个Java新人虽然有C的基础,但面向对象与面向过程这个思维的转变还是不太容易实现的。在设计程序类的时候,类的功能往往无法做到简单化,一个类的方法就想把其他类的工作给完成。例如:
2.各种类之间的调用混乱,无法灵活调用各种类。在写方法的功能的时候能明显感受到自己已经将类的方法给写完整了,但自己没有办法将各种功能给联系起来,也就是返回值运用的并不熟练。
改进建议:
- 在写Java工程的时候可以先在脑海中捋顺各种类之间的关系,有条件的话还能画一下类图,正所谓“磨刀不误砍柴工”,现有思路再写就能非常的顺畅。
- 类的调用混乱就需要对类关系的透彻了解,返回值是各个类之间连接的关键,可以通过视频具体的学习一下。
- 总结:题目集一的作业就如同初中一年级水平,但题目集二的难度飙升就如同高一水平,作业难度成几何倍上升,单单靠老师上课讲的内容与学习通上的课根本就没法完成作业,更别说拿满分的,况且才接触Java,一上来就来各种类之间的的调用,但我连Java的语法还没掌握。真的是边学边做,要真的是边学边做也还好,做那题就是懵逼状态。写个代码语法错了,辛辛苦苦将语法改正确了发现没有构造类,于是就重新写,而这种类的语法也要重新学,类的对象与方法写好了发现各个类之间是独立的,还要将类之间进行调用,而这些东西课上老师是没讲到的,就算讲了也只是浅浅的点一下,的确语法这东西本来就是自学的,但一下子出这种题根本就是难为人,对于那些对类熟悉的人来说写起来是很快,但要是真的入门的话,连类之间的调用的都是问题,更不用说这种一下子就调用了四五个类的题,报错比写的代码都多。各个类之间的调用到现在依旧是迷,不知道怎么将各个类连接在一起。这三次作业让我学到了自己居然这么菜,也让我知道了单单靠上课讲的东西根本就用不到做题中去,还要自己找时间自学,做题遇到不会的再进行查资料,依靠老师的高中生活没了,现在只有全靠自己的大学生活。作业布置的挺好,就是难度梯度没设计好,题目集一的难度与题目集二的难度跨越性太大了。可以先调用两三个类,在调用四五个类,循序渐进,还有把题讲一下,不临摹代码哪里来的自创,对菜鸟来说是真的难。

浙公网安备 33010602011771号