Java启程——面向对象第一单元作业总结

时间:2019-03-25
本文章向大家介绍Java启程——面向对象第一单元作业总结,主要包括Java启程——面向对象第一单元作业总结使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、作业总结

经过一个月左右的oo课程学习,我对于java面向对象有了初步的了解,对于java中类、继承等概念也有了一定的了解。但是在自己使用java编写程序时仍然不能很好地将类分析清楚,出现了类过长,分类不清楚等问题,总想着在一个类中实现不同的功能,类与类之间的交互几乎没有,写的每个类都像是一个独立的编程文件,代码也因此显得比较臃肿。所以我的类图也都是分散的,像下面这样:

 

在复杂度的图表中,我的大部分程序复杂度都已经被“标红预警”(捂脸),这也督促着我在接下来的oo学习之旅中重视代码的长度,努力写出符合规范风格的代码。

二、Bug检测总结

1、自己程序的bug:对于我的三次作业来说,找出的bug出现在我的第三次作业,我未能对于系数的长度有一个清晰的认识,仅用int类型来表示系数,导致当原式求导结果中系数超出int范围时出现报错。

2、别人程序的bug:在我自己编程和检查同学代码的过程中,对于符号的把握或许是作业中经常出现的难点。从cos函数求导出现的负号到不同多项式之间连接符号的判定也都是经常会犯的错误。当然这种bugcheck过程中很容易被识别出来。

三、Hack心得

在互测过程中发现别人首先是自己曾经错过或是卡过的数据吧。我将自己在这些数据整理在对拍器中,然后进行逐一check

还有就是根据同学代码(特别是我能看懂的)的编写方式进行针对性的hack吧,例如对于他的判断输入合法、合并同类型函数等不同部分进行逐一测试,但其实效果一般。

四、分析与总结

1、前两次作业

就作业内容来说,前两次作业主要是对于xsin(x)cos(x)等固定的变量形式进行求导操作。由于这些求导的形式比较单一,比如k*x^a*sin(x)^b*cos(x)^c,我们的求导操作只需要对于xsin(x)cos(x)这三个部分分别求导,所以我们只需要将这三次分别求导出来的结果进行归类储存,就可以完成初步的求导过程,作业到这时候也可以算是完成了。

在我看来,优化过程是前两次作业中的一大难点。我尝试这对于sin(x)^2  + cos(x)^2 1 - sin(x)^2等形式进行合并化简,但从实际结果来看我并不能得到一个比较满意的结果输出。首先是在sin(x)^2 + cos(x)^2的化简过程中,负优化的问题总是存在,例如在计算1 + 2*sin(x)^2*cos(x)^-2时我的编程会合并成为cos(x)^-2 + sin(x)^2*cos(x)^-2;同时在完全次方式的合并过程中不同项合并顺序的先后也是一大难点,在合并过程中无法合并到最简形式也是我所遇到的难题。

其次,1-sin(x)^2合并所需要的条件比较苛刻,需要这样的两项系数必须相同(否则极易出现负优化),适用范围也较窄。不精通于三角函数合并计算的我所能想到的最好方法就是建立一个判断合并后输出结果长度与之前结果的比较判断函数,杜绝负优化的出现。

而在代码拓展性方面,我的第二次作业能够沿用第一次作业的大部分架构思路。只不过在正则表达式匹配和对于输出数据处理时需要进行一定的改动。

2、第三次作业

而第三次作业的难度相较于前两次有了一个很大程度的提升,由于嵌套函数的出现,表达式正确与否的判断就是一个不小的难题。而我的第二次作业的拓展性并不好,对于第三次作业只能进行重构。

对于输入的判断,我是使用了嵌套函数的x替换方式,即首先找到最内层的嵌套函数,然后在判断后将整个表达式化简为x0再代入原表达式进行上一层函数的判断,直至判断结束。

对于计算输出方面,我也使用了ArrayList从表达式最内层的函数进行不断的替换。我的主要思想是将计算好的嵌套函数的原函数和其导数存储到ArrayList中,在上一层函数的求导过程中将所有的嵌套函数替换成统一的“y”,在对含有y的表达式求导时逐一取出ArrayList中的表达式和导数进行替换,最终实现输出。

自我分析,第三次作业我在架构的选择上存在着重大问题。首先是优化的难度非常大,由于我仅仅将嵌套函数及其导数存入了ArrayList,且为了在上一层函数的调用过程中不出现错位情况,同层函数的合并根本无法实现;同时由于对于每层函数求导的过程中并不能确定上一层函数的情况(比如是否为sincos内部的嵌套函数),所以括号的重复添加简直是灾难性的,这也是我对于本次作业最不满意的地方。

如果对于第三次作业进行优化,我希望能够在现有基础上考虑从嵌套函数、幂函数、常数等不同类型在输出时进行一个类的区分,致力于输出表达式中多余括号的清除与同类项的合并。

3、个人体会

总体来说,这三次作业也教会了我许多知识。从对java一窍不通到逐步能够自己编写程序,有进步更有不足。类数量过少、单个类实现功能过多导致的代码臃肿都是我现阶段所面临的问题。愿在将来的学习过程中能逐步改善自己的代码风格与编写水平,与诸君共勉。