第一次博客作业

发布时间 2023-04-01 11:28:20作者: corcinle

一、前言

前三次作业主要内容为菜单计价程序的代码实现,代码难度由简到难。第一次作业主要目的是熟悉java的代码书写以及功能,面向过程并未体现。第二次作业则开始设计一个简单的菜单计价小程序,并实现一部分功能的完善。第三次作业是在第二次作业的基础上进行代码功能的优化,难度逐渐叠加。

 


 

二、设计与分析

1.第二次作业

7-1.菜单计价程序-1

要求设计点菜计价程序,根据输入的订单,计算并输出总价格。

  1. 饭店提供四种菜。
  2. 订单由一条或多条点菜记录组成,每条记录一行,最后以“end”结束。
  3. 每条点菜记录包含:菜名、份额两个信息,份额可选:1,2,3,代表小,中,大份。
  4. 不同份额菜价的计算方式:

        小份菜=菜品基础价格

        中份菜=菜品基础价格*1.5

        大份菜=菜品基础价格*2

          (计算出现小数,按四舍五入方式处理)

代码实现:

设计了三个类,分别为主类,菜品类,订单类(此次代码我没有设计菜品类,原因是题目所给的菜品并不用输入,所以我把它存在了一个Dish数组里),其中主类用于读取订单的输入并输出总价格,订单类则是对输入的订单的菜名和份额进行判断,并实现订单价格的计算。

圈复杂度:

 

 

7-2.菜单计价程序-2

代码实现:

此次作业新增了菜单的输入,由一条或多条菜品记录组成,每条菜品记录包含:菜名,基础价格。另外,这次作业的订单输入还增加了份数和删除订单功能。由于此次作业要求输入菜单,所以上次作业的代码基本不适用,我含泪重新敲了一百多行的代码,想起来都是满满的心酸。这次作业的类设计和题目所给的参考设计基本一致,分别为主类,菜品类,菜谱类,点菜记录类,订单类。其中主类仍是读取输入并输出结果,菜谱类用于保存输入的菜单,点菜记录类用于保存订单上的一道菜品记录,并计算该条记录的价格,订单类用于保存用户所有的点菜信息,计算订单的总价格,根据序号查找、删除订单。

圈复杂度:

 

Emmm,复杂度有点高

 

7-3.jmu-java-日期类的基本使用

1.给定一个日期,判断是否为合法日期。如果合法,判断该年是否闰年,该日期是当年第几天,当月第几天,当周第几天。

2.给定起始日期与结束日期,判定日期是否为合法日期。如果合法,输出结束日期与起始日期之间的相差天数,月数,年数。

代码实现:

设计一个主类,在主类中定义两个方法:判断日期是否合法,判断日期是当周的第几天。输入日期信息,用split分割成年,月,日,进行日期合法判断,合法返回true,不合法返回false

圈复杂度:

 

 

2.第三次作业

7-1.菜单计价程序-3

本次作业新增了桌号标识以及代点菜信息,其余功能不变。

  1. 桌号标识独占一行,包含两个信息:桌号,时间。桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
  2. 代点菜信息包含:桌号,序号,菜品名称,份额,份数。
  3. 代点菜是当前一桌为另外一桌点菜,信息中的桌号是另一桌的桌号,代点菜的价格计算在当前这一桌号。
  4. 折扣的计算方式:

周一至周五营业时间与折扣:晚上(1700-20308折,中午(1030-14306折,其余时间不营业。

周末全价,营业时间:930-2130

代码实现:

在第二次作业的基础上增加了桌类以及判断时间的方法,本次作业的代码在跳出循环的判断方式上做了改变。输入的时间格式为YYYY/MM/DD+英文空格+HH/MM/SS,因此将点菜时间分为两部分:日期和时间,再对两部分的字符串分别进行判断是否在对应的时间内,并返回对应的折扣。

圈复杂度:

 

什么也不想说了

 

7-4.单词统计与排序

要求:从键盘录入一段英文文本(句子之间的标点符号只包括,”或“.”,单词之间,单词与标点之间都以“ ”分割。

按照每个单词的长度由高到低输出各个单词(重复单词只输出一次),如果单词长度相同,则按照单词的首字母顺序(不区分大小写,首字母相同的比较第二个字母,以此类推)升序输出。

代码实现:

TreeMap进行排序,具体内容并不难,不做过多讨论。

圈复杂度:

 

 


 

三、踩坑心得

  1. 在程序未完成之前想要结束进程,切记一定一定要设置一个出口让程序停止运行,否则就会出现万恶的非零返回,让你百思不得其解。
  2. 有相应需求的函数方法一定不要自己设计,否则就是平增代码的复杂度。
  3. 在要改变数据类型时,一定要判断数据是不是可以转换成你想要的类型,比如sgysuio是不可以转换成int 类型的。

 

四、主要困难以及改进意见

1.第二次作业

7-1.菜单计价程序-1

代码分析:

这次代码困扰我许久的测试点是价格的四舍五入,我测试了好多组用例,答案均正确但是测试点始终过不去,后来才发现是万恶的四舍五入。

 

7-2.菜单计价程序-2

代码分析:

和第一次作业不同的是,我的输入并不是采取第一次作业所用的nextLine()实现一行字符串的输入,然后用split进行分割,而是用next()读取空格前的字符串,不用再进行分割操作,对于这次作业,就我个人而言好像这种方式输入订单的判断比用split分割再判断更简单,比如next()读取到“1”“delete”“end”就跳出菜单的输入,进入订单的输入,不用通过判断分割后字符数组的长度跳出循环,好像看上去更简洁一点。最后就是测试点的问题,第一个问题是提交代码后我在提交页面上看到了非零返回,是在第一个测试点(只包含菜单)上,经过咨询才发现我在输出0后没有设置exit出口,导致程序进入下一个循环以后出不来了(因为“end”被上一个循环读取,后面没有输入了,程序就死循环了,悲伤),第二个仍旧是“永远都过不去的测试点”,经过多方求助,我才知道题目的要求是每输入一行订单就输出结果(感觉这不是我的问题),而我是最后统一输出,所以我怎么改代码依旧是答案错误,最后把输出改成要求的就full marks了。

 

7-3.jmu-java-日期类的基本使用

代码分析:

这道题的问题主要是当周第几天的判断,我一开始以为就用day%7就可以了,发现第一个测试用例过了就认为代码没有问题了,结果后面提交的时候发现一分都没有,然后我又测了几个用例,发现当周第几天和答案不一样,才反应过来不是这样算的,后来去网上找的判断方法才过了测试点。

 

2.第三次作业

7-1.菜单计价程序-3

代码分析:

对于此次的输入我仍用的是next()输入,对于菜单输入的部分用这个方式输入并没有什么问题,但是碰到输入代点菜就遇到了问题,我在判断是不是代点菜的时候碰壁了好久,最常见的错误是java.util.InputMismatchException,意思大概就是输入格式异常,最后发现是我的判断方式有问题,一开始的代码是将next()转换成int类型进行判断,但是我发现如果输入的是菜品名称遇到这个就会报错,报错是类型转换错误,后来我把int类的订单序号转换成字符型就不会报错了,但是这个判断方式有点麻烦,不如直接用nextLine()输入一整行字符串,再用split分割,判断分割后获得的数组长度。代码没有问题后我就提交了答案,发现测试点有几个运行超时,我一开始以为是订单输入数据的判断方式太麻烦了才会运行超时,但是后来换了个判断时间的方式后,就不再报运行超时错误了,一开始的判断时间的方式是自定义一个函数进行判断该日期是星期几,再用另一个函数判断时间是否在营业时间内,用这个方式是受了第二次作业的7-3时间类的启发,后来才发现并不用这么复杂的判断,有直接的函数可以用,不用自己创建方法(用LocalDategetDayWeek()方式判断星期几的后的代码原来的代码快了好多)。提交代码后确实没有了运行超时,但是测试用例好像又变了,然后我就回去删代码,删完之后之前一直过不去的测试点竟然过去了(震惊),但是,测试点34又错了,我真的是百思不得其解,明明两个测试用例的输出都是对的,但就是测试点过不去,因为这两个测试点我没能拿到full marks

 

7-4.单词统计与排序

代码分析:

将这道题拿出来说就是因为用到了一个新的知识点:TreeMapTreeMap是一个基于key有序的key value散列表,根据其键的自然顺序排序,或者根据创建时提供的Comparator排序,它最大的特点是遍历时是有顺序的,不过对于TreeMap我还是没有太明白,方法尚未掌握,同志仍需努力。

 


 

五、总结

对于这三次作业,总的来说,是对一个小程序进行一步步的完善,但是对于这几次的代码,总感觉我是面向对象和面向过程一起用的,主类的代码好像有点复杂,而且更要命的是我的循环嵌套似乎有点多,导致我的代码行数比full marks的同学们多,还是那句,“革命”尚未成功,代码仍需优化。虽然有一些不足的地方,但通过这三次的作业,我还是学到了一些东西的,比如快速输入数据、TreeMap的使用等,也算是不枉三个星期的找测试点之旅。