BBBBolag🐇
前言:家人们高抬贵手_(:з」∠)_,字数真的够啦,放了复杂度没用放类图因为题目已经给出来了,期中的同理
难度以一个客观但是有点主观的来说,四肯定是中等偏上的难度,五是中等难度,相比之下期中考试可以说了很简单了,两个小时就能完成的难度能难到哪里呢对吧。虽然只有四个题但是相比其他的那两次作业,每次只有一个题,一周一道题,可见那两个题是非常***钻了。
正经先让我说说知识点,就是抽象类的调用啦,类图的结构设计,继承和多态,接口设计,更多侧重于类图的设计上,题课上讲的什么关联啥的,一个美国上校什么斯基曾经说过,一个好的Java代码离不开一个好的类图设计。加上这两次是对点菜三的延申和拓展,这就不得不提代码的一个可修改性和延申性了,如果你的代码耦合性低,就会很容易改,你在代码修改上花的时间就会很少,但是,这就对点菜三写的代码有了很高的要求了,但是我的点菜3写的就很差劲啊,没用办法啊,好难受,我就不得不换方法写那点菜四,好***钻的角度去审视异常情况,虽然我最后也知道该咋写但是真的好累不想改了,既来之则安之的想法趴咱就是说,及格万岁(wuhu)我用了array list的相关知识,当然还有后话我会在下面说,比如用那个Collections类我就没用明白,因为代码不知道为什么一直报错在期中考试的最后一题里面,明明都编译成功了就是不行,最后还是向势力低头,用了tocpmpare,很难过。
这次总共的两次作业加期中考试题,能有啥特意的知识点啊,咱就是说出这个题,又不是为了练习哪个知识点特意写的对吧,更像是综合性的题,你要说像期中考试一样摆明了和你说,这题考察什么什么,他那两次又不是,而且用老师的方法,用列成那样的类图来来写代码,要花好久去写,反正我是那样的,用自己的方法简简单单明明白白,拿抽象类写出去一大堆,脱裤子放屁的东西。打起来谁会想啊这两个用的什么什么啊。我只会事后诸葛亮的时候,对着我的代码非常考究的研究起来,说,嗯,这两个其实是关联。当然我真没有水,我就是很诚恳的在和你唠唠这两周的心理路程,咱就是说会者不难,难者不会这东西本来就是。
踩坑心得:
菜单4
首先,如下是复杂度,如图可知我的复杂度呢,是这个25,老师曾经说过,20以下可以,10以下完美,当然我打了600行复杂度这么高我是一点也不出意外,太多重复的地方可以改进了
类图的地方没用修改的太大,因为全是在主函数里面进行的修改多所以就没用放w
我第三次点菜写的不好,所以一开始写的就很不好,像桌号也是拿循环一次次累加进去试的,输入录入的时候是拿nextint还有next要在里面插入一个数的这种改动,在代码上的改动就会更大,非常局限且困难,桌数再大一点根本用不了,一开始我还是很努力在改的,后来发现这就是填不满的海,果断用了arraylist的方法,每次录入都录入到arraylist的一个新list里面,然后调用时候直接get然后分割,取出想用的那一部分,然后存入string数组里面,然后根据题意,以数组为一个单位,每个单位每个单位的单拎出来进行错误分析,而输出的答案直接存入另一个list就好了,输出的时候也简单,特殊情况就用传统输出,这题只要你写对含有特色菜的时候怎么输出答案,一大半的分你就已经到手了,剩下的都是根据格式和输入异常的情况的处理,只用一条一条对着去加if语句,当然我最后的时候才发现有很多地方如时间还有输入格式的判断的地方拿正则表达式来判断会非常简单,减少代码量,当然五也是,我有些地方很呆的将数字全部转换成空格,然后再监视其长度以判断是字符串还是数字,而这些地方都是用正则表达式可以轻轻松松解决的事情,主要本人正则表达式不能说不会吧,就只能说是会用的程度,但是这都是老师上课讲过的,而我当时以为自己精通了,但是方到用时才发现还是自己学到的只是皮毛罢了。
这里时间不够只改了一个格式错误,就是加了一行正则表达式判断情况,剩下的因为时间原因就没用改,修改代码和结果如下
就是因为用了if导致我的代码看起来不太聪明,重复的地方很多,但是也能写出来,就是分别录两次
菜单5
复杂度,根据图看来可知,非常低,可以说写的很高级。
第一次提交写了个65,样例都过,但发现口味度这里挂了很多个,我就对代码的口味度部分进行了更加严谨的写法,判断两次,先判断输入的东西到底符不符合格式,再用match将酸辣口味度个性化定制(因为每个都不一样),将不同的口味度等级分别存入一个数组,然后使用时候调用评级的时候直接调用对应数组的序号就好了,具体代码和测试点情况如下:
输出的时候思维也没用卡死在数组里面有什么,而是用口味度去匹配已经存入的菜谱数据里面是否有带口味的特色菜,代码如下,
没有则普通输出,这里就不放图片了,和四一样不用改
五这里套路和四一样,用了arraylist分开,然后拿正则表达式来规范格式,然后一开始录入一个list然后下标开始一个list最后输出一个list总共三个list,一开始也不知道怎么区分口味度输出和不含口味度的输出,于是呢回来一开始决定根据不同的数组的长度来区分不同的菜谱,从而录入到dish里面,然后order里面就会存储着以用于后面查询菜谱是否存在,普通的菜传入的type值就是null从而区分开来解决了一开始一直没想明白的东西,然后和四一下,有些错误输入的地方使用了try和catch捕捉,我感觉,这真的是泰酷啦,只是可能还是学识问题,研究了好久该怎么用,但是用起来确实比if要严谨很多,可能也会降低一部分复杂度趴,需要补充什么直接在里面填充就好了,不像if一样要改很多地方,if一环套一环真的很容易漏括号,因为我就会漏。
期中
四个题循序渐进,一点点陷入Java的陷阱里面
第一题没什么好说的,本来还想拿try和catch但是没用成功,最后思考再三还是用了if这种传统方式写,可能这样写更简洁趴。
一开始没拿满分是因为Π是拿3.1415926算的,后来分析答案有问题就改成了专业的表达方式,就是下面这个
第二题直接满了,但是没用按老师那样设计因为很费时间,我一开始光是抄那几个类名和属性就花了十几分钟,最后还是换了给方法打,我愿称为简单暴力法。
第三题是忽略了输入的数超出范围的情况,加了个if判断一下输入的是不是0以上就对啦,第一题题面里面给的。
第四题也很简单,直接拿第三题代码加给排序就写出来了,当然排序用的cllections类没有用tocompare因为感觉list更好写,但是后来报错了就换了tocompare但是太麻烦了还要但拿出来一个方法来用于判断,所以我还是最后拿collection写出来了,实现了排序问题。
改进建议:
菜单4
当然我四写的时候就非常很冗长工行,有很多地方可以合在一起写我都没用,如果让我修改的话,我会把错误格式判断的地方都拎出去写个方法,而不会像这次一样全堆在主函数里面,导致我后来想改的时候找的都很困难,而且一点也不精简,不同情况但是下面的代码很大一部分都是相同的,我其实可以写的更简洁的但是我黔驴技穷。
可能换种表达方式?就是把判断字符长度的地方可以很简单的分为两种大致情况,而不是我这边写出的四种方式,应该多调用方法来解决而不是很简单暴力的堆叠在一起,别人写了400行而我吭哧吭哧写出去600行,不是没用原因的。当然我这么写也只是一时之计罢了,最后拿来84分,我除了有四分是我明确知道格式错误改用正则的地方,剩下的地方我是真的不知道错哪里了,也很难在600行的代码里面将错误揪出来。我菜单四要是按菜单五这个写法感觉会很好改的嘞。
菜单5
已经改到最简单了
这个我是真不会,也没用给用例,不知道错在哪里了,能改的地方都改了,代码本身没用什么可说的,低耦合,低复杂度,前前后后450行就结束战斗了。
期中的改进建议我已经是改过了,用了collections类输出会更方便一点。可能也应该试试按老师给的类图来做试试,当然耶做出来了但是写到了100行真的很冗长。因为我本身就是拿那个写的
总结:Java趴,这东西就和那啥一样,谈太久了就很难想起是哪里开始变心的,如果跟一个错误的人,那就是错误的余生,如果遇见对的人,就会很顺利很开心,如果不开心,那就结束趴,放过彼此。Java也是这样,Java代码写太长了,就和难找出来是哪里出现了纰漏导致答案错误的,一开始用错了方法或者类设计,后面再想查缺补漏添些什么,再发展下去,而且太长了自己有改的心也和难看穿这代码哪里出现了问题,所以只能重新开始,换了给类的设计和方法从头开始写,果然好的开头是成功的一半,写5的时候就轻松了很多,但是Java可以从头开始,而人生不行,当我的Java作业截止的时候,知道如何补救的时候但是时间已经不允许了,可能这就是人生的戏剧性趴,不珍惜时间做题的是我,现在知道怎么写但是已经错过了的也是我,当然写菜单5的时候没用这种遗憾感,因为那个测试点我是真不会。
菜单4写太长真的难改极了,再也不写那么长了。
如果有改进的地方的话,就是希望下次的测试点可以给全一点,光一个名字我真的不知道是为什么错的,毕竟给的案例都能过但是测试点就是挂的,江郎才尽了,希望下次再做案例的时候可以多给点一些,真的很难找。错误的结果里面没用谁对谁错,但是Java不一样,他有测试点和案例,也有最优解。
4,5用arraylist比较多,因为真的可以减少代码量,直接add,调取用的时候直接get,异常的时候用try和catch,避免使用了if,降低了复杂度,在做题过程中也更加熟练了string类等相关使用,int型和string型的相互转换,还有正则表达式的使用,都是老师上课讲过的,在作业中也是一点点巩固罢了。类图的设计老师直接给出来了,就是在这上面增删些什么,我感觉也锻炼了一点自己的设计能力。