前三次作业总结
一、作业总结
前三次作业围绕制作菜单计价程序,附加一些其他知识点,让我初步认识到java与上学期学的c语言的区别与相似之处,以及让我认识到如何使用java来完成对一些问题的解决。相较于C语言的面向过程编译,Java更倾向于面向对象的编译。这次作业也让我对Java中的“类”这一强大的工具有了初步的认知。对于一个较为复杂的程序,用一个Main函数编程,其庞大的代码量往往会让人晕头转向,无从入手常常顾此失彼,而且一旦出错往往无法找出问题的根源,即使编译出了程序,代码也是极其复杂的,很难再对其进行改进升级,即便有大量重复的语句或者有更高效的算法,也无从改起,这对于一个程序来说是极其致命和失败的。我们如果对程序的运行进行分工处理,将大大简化编写程序的困难,也能针对各个分工部分进行查错,精确找到问题所在,同时若发现更好的算法,也能很清晰的对程序进行更改。为实现对程序的分工处理,我们引入“类”这一工具。通过“类”,将程序划分成多个部分,再逐一进行编译,既可以大大简化我们的工作量,所编译出的代码也清晰明了,有很大的可读性和改进空间。接下来是我对这三次作业的简要分析。
1 菜单计价程序-1
这道题是我第一次运用“类”来完成程序的编写。由于了解到类中的属性可以是新定义的其他变量,也可以是调用的其他类,我将菜单计价分为五个"类",分别是main类、Dish类、Menu类、Record类、Order类。基本思路是main类完成程序的运行,Menu类完成菜单的制作,

Dish类即为菜单中的菜品,也是Menu类的属性,


Order类实现订单的制作,Record类即为订单中记录,也是Order类的属性。

通过上课的学习我了解到类也能充当数组,进行定义对象数组。起初我以为类中的数组与C语言中的数组一样,只要声明了就行,但在制作菜单时发现菜单里的菜品无法被储存在菜单类中,后来才发现Java里的数组不仅要声明,每个元素都要用new语句来开辟一个新的空间来储存,否则数据就无法储存导致数据丢失。也许这么说不准确,但我感觉和C语言的结构体很相似。对于调用Menu类里的菜品,一开始是在main类里利用“.”来完成的,但我发现这样对于分工来说不太完善,调用菜品的数据信息应该是Menu类的职责,后来知道了类里面的数据可以通过调用函数来进行操作,准确来说是调用类里的方法。通过方法可以调用读取类里的数据,也可以对类里的数据进行更改,比如想对Order类里的Record对象进行更改,以达到添加一道已点菜品的效果,可以通过方法进行更改。方法也分为无参和有参,和C语言的函数调用一样,有参时可以将参数运用于方法中,可以利用这个特点将数据储存在类里面,比如通过含参方法将记录的菜品数据储存在Order类里。而无参方法也能通过调用类里的数据对其进行更改或者读取等,比如Order类里的getTotalPrice()方法可以将每条记录的菜品中的价钱加起来。方法也分有返回值和没有返回值,void类型没有返回值,一般通过这个完成对类内部数据的调用或更改,而Order类里的getTotalPrice()方法就需要返回价格,完成对价格的获取。
对于完成该题也有一些要注意的小细节,判断字符串是否相等不能用双等号来表示,在Java中想判断字符串是否相等要调用equals方法才能完成。
对于输入的数据,我的处理方法是将其视为一行输入,然后通过split方法将字符串分割,分割的结果如果是数字,就用Integer方法将其从字符串转化为数字。对于结果的四舍五入可以通过round方法来简化代码

2 菜单计价程序-2
对于菜单计价程序2,该题在上一道题的基础上增加了点菜记录和删除信息。每一类信息都可包含一条或多条记录,每条记录一行。每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“** does not exist”,**是不能识别的菜名。如果删除记录的序号不存在,则输出“delete error”。菜单也不再是提前弄好的,也是要先输入才行。
相较于之前的代码,我一开始以为只要用增加方法addDish(),在方法中用for循环通过含参方法把所输入的数据传入Menu对象中即可,但问题是经过调试发现每次传的数据只存在于dish[0]中,其余的dish属性中并未储存数据,后来发现用于标注角标的“i”在每次调用方法时都是0,因为每个dish属性中的i都是独立的,它们之间毫无关联,于是我将角标i移至menu类中,并标记为静态变量,确保i是递增的。但在main类中调用该方法时依旧出现dish[i]=null的情况,经过排查发现该方法中for语句的结束条件为j<20,但实际输入数据的dish并没有20个,对于没输入数据的dish,在被调用时就会出现dish[i]=null的情况从而报错,
所以对于没有用到的数据也不能图方便而随便调用,将j<20改为j<i即可

由于该题会出现输入的菜品不在菜单上的情况,所以我在menu类中加了searchdish方法,来判断输入的菜品是否在菜单上,若在菜单上那么该菜品的价格就是所需要的数据,如果再次调用方法就显得繁杂了,所以我将该方法设为有返回值,且返回值就是该菜品,而如果不在菜单上那么返回null就能分辨出来
而为了解决会有删除菜品记录的问题,我在record类中加入了k属性,在一般情况下k是等于1的,作为因数加入到getprice方法中,而一旦该记录被删除,k的值变为0,达到删除后有记录但不计价格的效果,同时加入num属性,进行菜品订单的编号

在运行时发现order类中调用了menu类,但menu类中的dish属性的数据却都是null,经过不断排查,确认了menu类中的dish属性仍是没有存入了数据的,而出现该情况就是所调用的menu类之间的属性是独立的,要用static属性将其变为静态变量即可
![]()
其余代码与上题代码相差无几
3 菜单计价程序-3
该题又是在前面两题的基础上进行改进升级的,该题增加了点单时间及对应时间打折或判断是否是营业时间,增加了桌号,以及代点代付功能。
对于代点代付功能其本质还是点的那一桌付钱记录的,所以只需要在record类中添加table属性来判断点餐桌号就行,到时候通过这个桌号知道是代点的还是为自己点的![]()

对于增加的点单时间及对应时间打折或判断是否是营业时间和桌号,我为此增加了Time类来处理时间,Table类来处理桌号问题,Table类中添加Time类属性来记录点菜时间及相关处理,增加Order类属性来记录该桌的点菜记录
其中用了of方法记录时间getime方法存入数据


目前来看功能好像是完成了,但main类也要做出相应的改变,然后发现此时再将menu类中的i设为静态变量会出问题了,于是我将menu类代码做了如下调整
将i的下标调到table类中的ordernum

相应的main类代码更改如下


至此该三次作业完毕

浙公网安备 33010602011771号