第一次博客作业
板板的第一次博客作业
目录
关于面向对象
对作业的前言
设计和分析
踩坑心得
改进建议
总结
关于java和面向对象
学习了c后,java的基础语法对于我来说上手很快,这在作业上的体现是我写起作业来还算有思路并且可以完成(当然质量堪忧)。而面向对象就是完全新的东西了,我最初理解这个只是以为就单单吧对象变成一个类,然后相关函数放进去就行了,后来才发现自己看的多肤浅。
关于类:
目前而言我对类的理解十分的不深刻,但是依然要写下此刻所知的东西。
1.类间关系:之前理所当然的将类与类之间的数据传输,发生了深刻的变化。类与类一定要低关联,最好一个类与另一个类没有关系。这就是功能类的重要意义。数据的交互中心,我这么理解的。
2. 类的方法:我对类的方法也有了更加先进的理解。类中的方法,每个方法只能完成一个功能,例如输出和储存就得是两个方法,即使它们的代码是几乎一模一样的。
3.类的创建:一个雨刷的速度调节装置居然写了四个:雨刷,控制杆,数据中心,主函数。震惊了我,也让我知道日后的类应该怎么分了。
对作业的前言
前三次题目集作业量不小,其中主要考察的是关于java语法的基础和逻辑的考验:
java语法考验包括:字符串的处理(增删改查,判断合法),数组,字符,排序,计算,类的创建,基本的面向对象思想等等。
而逻辑的测验包括:求导算法,日历的前n天或后n天,ip地址转换等等。尽管看起来难度一般(指的是可以用已学知识解决),但是其实有复杂度。(因为要考虑到所有情况,如进退年,输入字符的合法性判断什么的)
设计和分析
篇幅和题目原因,当然是挑出重点的几个题目进行分析
题目集一的7-8
题目:在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
题目分析:这道题考的是逻辑,而且十分考验。因为这道题有很多的分支,十分容易把人绕晕。这也是题目的难点,如何解决呢,其实只要一个简单的流程图什么都变得清楚了。

这题目有一个难点也是易错点:浮点数的相乘相减会出现一点点精度问题,会到小数点后6位吧,所以如果是需要高精度时或者要进行判断时可以像这样使用a*a+b*b-c*c<0.00001。
如下可以看到代码的各项数据

题目集2的7-4
题目内容:输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
本题,因为在题干里都明确要求要使用今天的到0001年1月1日的天数除余加一。所以本题的关键在判断是否合法和如何应对特殊时间:
首先要写出判断润年的函数

- 年若为润年则二月为29天,否则28天当然最首先的是要判断合法性:1.年在区间[]内,日在区间[]内
2.年若不是润年,二月29不合法
3.月为小月,日为31则不合法

4.列出所有进月和进年的特殊情况

如下可以看到代码的各项数据

题目集2的7-5
题目:输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。内容是当输入日期合法,输出下一天,格式如下:Next day is:年-月-日考察实物类和其方法的使用,然后就是一点点的算法考验。
以下是我的思路:先通过简单的函数,将用户输入存入到我的类里面去,既然要得到下一天的日期,不过是分两种大情况一个是不进位的,一个是要进月份的和年份的
第一种情况不讨论
第二种情况有1.润年二月29下一天进月;
2.平年二月28下一天进月。
3.小月30天进月。
4.大月31天进月。
5.12月31天进年。
知道这些后代码就很简单了,当然还是有那么一点不好,我没有用switch case语句。这导致我的复杂度较高。
如下可以看到代码的各项数据:

题目集3的7-2
原题是:
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:

分析:1.本题较为简单,主要是对实物类的考察,以及对封装性的理解。2.主要的部分,判断润年和求出下一天的日期上一次已经写了不再赘述。
我理解的封装性,就是一个实物类,只要吧必须的参数传入后,无需再次传入参数。且所有的处理,都最好没有输入值,类内部的值不会被轻易修改。封装封装就是什么都准备好了,所以封装性好的类,方法,应该是简洁的。老师的类图就很好的表现出封装性的特点。我只能说尽可能讲出我理解的封装性。
这是我关于类,方法的代码
类的初始,重载

几个方法:


如下可以看到代码的各项数值:

题目集三的7-2 一元多项式求导(类设计)
圈复杂度为上图
本题的难点是在各种各样的情况下得到每一个项的系数和指数。
题目思路分析:1.得到字符串,进行字符串的初始化调整,目的是使每一个系数都有对应的符号,排除”4*5”x” ”-x” ”+x” ”x^12” ”-x^-32” 等情况带来的格式不统一造成系数和指数提取困难。
①删除空格,删除乘号
②如果第一个字符为x,则在其前面插入”+1”
③如果有”+x”或”-x”,则在符号和x中间加上”1”
④如果”^”后面是数字就加上”+”
⑤如果”x”后面不是”^”插入”+1”


2. 将x替换为空格,删掉”^”
①利用空格定位,向前循环,找到项系数,向后循环,找到项的指数。
②通过系数,指数进行误差处理。
③格式化输出,并且由于系数为1是不需要1*等等情况,用了大量循环和if语句的嵌套。


这道题目的优化方向:
1.我应该在这题有三个类
2.我应该有正则表达式,正则表达式可以直接将项匹配出来,这是我的正则表达式[+-]?[0-9]*[*]?x(?:[\\^][+-]?[0-9]*)?,这个可以直接将每一项提出来。然后怎么搞?
3.或者我可以通过字符串处理,使每一项都固定携带符号,这是我可以用正则表达式([+|-]\d{0,})[*][x][\^]([+|-]\d{0,})之后再用group函数直接得到所有我想要的系数
如下可以看到代码的各项数值:

接下来是踩坑及心得:
因为我写代码很少写注释,所以我调bug的部分很少,只是全凭记忆,意思是只记得了印象深的,这本身也是一个很大的问题,下次代码一定要为每个方法注释,并且吧调试过程也注释下来。
- 我写代码是想到哪就写到哪,然后发现这个方法在某种情况下是有很高复杂度的,无奈只好全盘推翻然后全部重写,这让我在写代码的效率大大降低。从今往后写代码一定是要想画好流程图在动手,毕竟在错误的方向上努力就是在退步。
- 写代码只管写自己会的东西,而不尝试用新的方法,就像老师说的:我叫你去青藏,明明点出来,坐火车会很快,但是你说你只会骑自行车不会买火车票,所以你骑过去。这是不对的,在it行业中,新东西不会就会被淘汰。
- 对类的理解不够深刻,尤其是方法和类关系的写法。我的类属性什么神魔牛鬼都有,这不对,我的一个方法什么功能都塞进去,通常一个方法可以实现3,4个功能,这不对。
- 对eclipse使用不熟悉,自动生成代码一定要熟悉,毕竟磨刀不误砍柴工。
- 我的代码复杂度奇高,解决办法也有,首先,java如果有相关方法一定是java方法优先,我喜欢if语句,这个要改,改用switch case好好的多,再,我喜欢吧事情集中到一段代码内实现,这个要看,如果确实有提高效率且不使复杂度提高那么可以这么写,否则,宁可分开,圈复杂度一定要降下来。很多方法都有大佬写过并且分享出来过,我要做的就是使用并且学习他的思想
最后,我发现我对作业的态度是不对的,觉得98,99对于我来说已经够了,这种态度一定是有问题的,首先,软件工程师是要为软件担起责任的,bug对于用户,社会是不负责任的表现。其次,软件有一个bug就会有很多bug。
总结:
这几次作业仅仅是考察了java的基础语法,涉及的算法也不是十分难,已经让我有时感到很大的压力了,以后的题目不免让我有点害怕。老师多次提到,题目是会迭代升级的,我理解了可移植性的重要性了,日后的代码不但要规范,而且一定要遵循类和面向对象的基本原则,大大增加我代码的可移植性。不过呢,最难的事不是本身,而是还未开始,很多东西只是看起来很很遭罢了。
最后,感谢我最好的好兄弟时常探讨交流想法。

浙公网安备 33010602011771号