菜单系列及考试分析

一、前言

大一下学期开始,我们开始接触java这门语言,Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的形式和感觉,但它要比C++语言更易于使用,而且在编程时彻底采用了一种以对象为导向的方式。

  Pta作业已经写了五次,除了第一次题目难度比较平缓,后面的数次难度激增,我也只有第一次全部写完pta的所有题目,后面就没有拿到过满分。总体来说,最近两次pta的主要知识点还是在设计类和学习java语言,以及用面向对象的思维方式。Java面向对象比c++更模块化,思维方式也不一样。对只接触过一点java语言的我们还是很有挑战的。最近两次pta作业虽然题类似,但是难度很大,两次作业都有菜单的设计,有很多类的调用,十分复杂,还需要使用很多函数,要有继承和传参,对我们来说确实十分困难。

 

二、设计与分析

7-4.菜单4

分析:

在原菜单基础上加入了异常情况处理,包括时间是否合理、菜谱输入是否合理、订单信息是否合理等输入内容的判断。并根据不同的异常情况输出相应的错误提醒。同时增加特色菜属性,特色菜与普通菜的输入不同,折扣情况不同。订单总价要求四舍五入。需要在每次输入时判段每条输入信息属于哪一部分,订单或者菜品等,分类之后继续先判断每条信息的合理性,若合理则录入相应信息,若不合理则输出相应报错。本次没有添加新的类,但是在原先每个类以及主类里加入了很多判断语句和执行语句分支。使程序复杂度骤升,不便于维护。

 

首先在Main方法里先以空格为标识分割字符串,在永真循环里用if ——else if语句依次判断第一个字符串是否为“end”、“table”、数字或者汉字,分别对应结束,桌号识别,订单,菜谱功能,再依次判断输入内容是否正确。

Main类里加入了最基础的错误输入方法,主要运用到正则表达式依次考虑进所有的输入情况,同时写了一个判断是否为数字的方法如图:

 

在添加菜品的时候加入了特色菜的判断和错误输出

修改了计算总价的方法,加入了特色菜的折扣分支:

 

7-5.菜单5

分析:

与菜单4同属于菜单3的分支,较菜单3添加了口味度内容。口味度为特色菜特有,分三种菜系。在录入菜单的时候输入特色菜同时要输入菜系。在点菜时如果点到特色菜则需要输入口味度。输出时根据订单里特色菜的菜系算出各口味的平均值并分别输出,若没有相应菜系则不输出对应口味。table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格+"川菜"+数量+辣度+英文空格+"晋菜"+数量+酸度+英文空格+"浙菜"+数量+甜度。如果整桌菜没有特色菜,则只输出table的基本信息,格式如下:table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格。例如:table 1: 60 36 川菜 2 爆辣 浙菜 1 微甜。另外加入了用户信息包括:名字,电话号码,支付总价。

 

在此程序中需要计算特色菜的份数,我将此功能以及计算口味度总和一并写入了点菜的订单方法里,然后在用口味度总和除以特色菜份数,就能得到各菜系的平均口味度了。

 

输出信息时,不仅要输出各菜系的口味度平均值,还要根据平均值输出口味,以及用户信息

table 1: 113113川菜1稍辣晋菜4稍酸浙菜1table 2: 168 118川菜稍辣晋菜2微酸

table 3: 103 73川菜1爆辣晋菜1稍酸浙菜3微甜jerry 18100334566 191

tom 13605054400 113

我将输出信息,计算总价两个功能写在计算价格的方法里。在调用该方法的时候,即计算了价格,同时也输出了味道。虽然一个方法里写入两个功能容易混乱,但是可以一并实现

 

其中time是新添加的类,为获取时间并判断是否营业以及计算折扣。用到java自带的calender包(用于计算日期是星期几)。

 

 

 

 

踩坑心得:

    菜单系列的类结构很复杂,如类图所示,订单类包含每一道记录,是组合关系。菜单又包含菜品上每一道记录。录入菜单的时候要区分是否特色菜,用boolean T来判断。在点菜的时候也需要判断特色菜菜系,而且折扣也不同。调用方法的时候传参是一个难点,有时候如果需要传入的数据太多,可以不传属性,直接传入整个类,如menu

 

主要困难及改进建议:

    菜单系列的属性众多方法复杂,调用的时候容易出问题建议把各功能的方法名不要重复,属性也都区分开。

 

 

期中考试:

  • 圆类设计

判断输入半径数据合理,否则输出wrong format”。计算圆面积并输出。代码如下

  • 矩形设计

输入四个值分别为左上角和右下角坐标,并计算矩形面积。

定义了一个点类和一个矩形类,矩形类为点类集合。

 

 

  • 继承与多态

将测验1与测验2的类设计进行合并设计,抽象出Shape父类(抽象类),Circle及Rectangle作为子类,类图如下所示:

 

 

 

抽象类里面有方法但是没有方法体,计算面积方法需要更具不同情况覆写。

  • 抽象类与接口

在测验3的题目基础上,重构类设计,实现列表内图形的排序功能(按照图形的面积进行排序)。

 

 

除了将抽象类的abstract去掉以外,还导入import java.util.ArrayListimport java.util.Comparator包用于实现动态数组和排序,并用implements实现接口。此外getarea方法需要返回本方法,按面积排序的方法体需要具体。

 

踩坑心得:

new新对象的时候一定要用自己写的类名。在计算面积的时候注意+-号以及绝对值。可以用String.format(“%.2f”,输出数值)控制精度。在跑代码的过程中可以在不同位置插入表现语句比如System.out.println();来判断有没有进入某个方法或者循环体,或者输出变量监控变量值是否符合预期。

 

主要困难及改进:

对于父类实现接口的方法内方法体的编辑有不足。需要多多练习。对于各方法的返回值的逻辑不清晰,容易混乱。需要在开始着手写代码之前就将各方法的功能和属性的位置和定义弄清。

 

三、总结

 对于我而言,菜单系列题目还是比较费劲的,难度也在日益提升Java有之前c++没有的很多属性,包括包,类,属性,方法的概念,各个类直接的关系也复杂多样,组合聚集继承等关心的调用容易混乱。当初也糊了有段时间才区分清楚。从这三次题目可以深切体会到Java是面向对象的编程,需要创建对象和方法然后对对象的方法进行调用,对象的创建也需要一定的封装性,即模块化。要把一个对象所包含的所有属性都定义在里面,比如菜单类对象就要包含的属性有菜单名,菜单序号,菜单基础价格。这两次的菜单里还有特色菜,需要根据不同情况区分特色菜并实现计算价格等功能。同时要注意Java的方法的返回值类型

为了避免在编程过程中出现各种混乱,在程序设计之初就应搭建好大致框架,设计相应的类,方法和属性,并清晰各个类之间的连系。

相比于c++而言,Java里的类彼此间的配合比较麻烦,但是更直接更好用。

 

 

posted @ 2023-05-17 23:02  勿允  阅读(51)  评论(0编辑  收藏  举报