第一次博客作业

                         

板板的第一次博客作业

目录

关于面向对象

对作业的前言

设计和分析

踩坑心得

改进建议

总结

 

关于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中和日期相关的类和方法。

 

本题,因为在题干里都明确要求要使用今天的到000111日的天数除余加一。所以本题的关键在判断是否合法和如何应对特殊时间:

首先要写出判断润年的函数

  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.1231天进年。

           知道这些后代码就很简单了,当然还是有那么一点不好,我没有用switch case语句。这导致我的复杂度较高。

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

 

 

 

 

题目集3的7-2

原题是:

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

要求:Date类结构如下图所示:

类图.jpg

分析:1.本题较为简单,主要是对实物类的考察,以及对封装性的理解。2.主要的部分,判断润年和求出下一天的日期上一次已经写了不再赘述。

我理解的封装性,就是一个实物类,只要吧必须的参数传入后,无需再次传入参数。且所有的处理,都最好没有输入值,类内部的值不会被轻易修改。封装封装就是什么都准备好了,所以封装性好的类,方法,应该是简洁的。老师的类图就很好的表现出封装性的特点。我只能说尽可能讲出我理解的封装性。

 这是我关于类,方法的代码

类的初始,重载

几个方法:

 

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

 

 

 

 

 

题目集三的7-2 一元多项式求导(类设计)

圈复杂度为上图

本题的难点是在各种各样的情况下得到每一个项的系数和指数。

题目思路分析:1.得到字符串,进行字符串的初始化调整,目的是使每一个系数都有对应的符号,排除4*5x” ”-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的部分很少,只是全凭记忆,意思是只记得了印象深的,这本身也是一个很大的问题,下次代码一定要为每个方法注释,并且吧调试过程也注释下来。

 

  1. 我写代码是想到哪就写到哪,然后发现这个方法在某种情况下是有很高复杂度的,无奈只好全盘推翻然后全部重写,这让我在写代码的效率大大降低。从今往后写代码一定是要想画好流程图在动手,毕竟在错误的方向上努力就是在退步。
  2. 写代码只管写自己会的东西,而不尝试用新的方法,就像老师说的:我叫你去青藏,明明点出来,坐火车会很快,但是你说你只会骑自行车不会买火车票,所以你骑过去。这是不对的,在it行业中,新东西不会就会被淘汰。
  3. 对类的理解不够深刻,尤其是方法和类关系的写法。我的类属性什么神魔牛鬼都有,这不对,我的一个方法什么功能都塞进去,通常一个方法可以实现3,4个功能,这不对。
  4. eclipse使用不熟悉,自动生成代码一定要熟悉,毕竟磨刀不误砍柴工。
  5. 我的代码复杂度奇高,解决办法也有,首先,java如果有相关方法一定是java方法优先,我喜欢if语句,这个要改,改用switch case好好的多,再,我喜欢吧事情集中到一段代码内实现,这个要看,如果确实有提高效率且不使复杂度提高那么可以这么写,否则,宁可分开,圈复杂度一定要降下来。很多方法都有大佬写过并且分享出来过,我要做的就是使用并且学习他的思想

 

 

   最后,我发现我对作业的态度是不对的,觉得98,99对于我来说已经够了,这种态度一定是有问题的,首先,软件工程师是要为软件担起责任的,bug对于用户,社会是不负责任的表现。其次,软件有一个bug就会有很多bug

 

 

总结:

   这几次作业仅仅是考察了java的基础语法,涉及的算法也不是十分难,已经让我有时感到很大的压力了,以后的题目不免让我有点害怕。老师多次提到,题目是会迭代升级的,我理解了可移植性的重要性了,日后的代码不但要规范,而且一定要遵循类和面向对象的基本原则,大大增加我代码的可移植性。不过呢,最难的事不是本身,而是还未开始,很多东西只是看起来很很遭罢了。

 

最后,感谢我最好的好兄弟时常探讨交流想法。

posted @ 2021-04-04 20:16    阅读(79)  评论(0)    收藏  举报