OO第一单元总结
2019面向对象课程序设计第一单元总结
面向对象课程第一单元的作业在上周完成,然而这三次作业完成得并不是太简单。一方面既要学习java的语法;另一方面,又要思考怎样将面向对象的思想体现在自己的代码中。更别提还有不太熟悉的git的使用。但是作业的难度与收获是成正比的。虽不说这三次作业能让我的面向对象思想提高多少,但至少还是有收获。
一、历次作业分析
1、第一次作业
首先是第一次作业的类图和结构分析
(类图)
(结构分析)
第一次作业有三个类,Poly类读入字符串,判断合法性,并将合法的字符串转化为两个Arrylist。一个表示系数,一个表示指数。Derivative类是求导类,读入系数与指数数组。求导并输出。
第一次作业过程中的难点及解决方法:
(1)正则表达式的应用,由于是第一次接触正则表达式,所以如何用正则表达式去识别并分析字符串是我遇到的第一个问题。我的方法是,对于每一个无符号整数、每一个幂函数建立正则表达式。再在以上正则表达式的基础上建立每一个单项的正则表达式。将每一个单项的正则表达式通过运算符连接成整个多项式的正则表达式。相较直接完成整个正则表达式,这样处理正则表达式相对简单。
(2)合并同类项,解决这个问题并不算难,用Map就能很容易的解决。由于后两次作业仍有Map相关问题,故这里不多做赘述。
(3)最简输出,第一次作业要获得最简输出其实比较简单。需要保证 不要有多余的符号;不要有重复项;在有正系数情况下,首项为正;1不输出。
由于第一次作业在公测以及互测中自己并没有遇到bug(虽然不能保证没有bug),故略去第一次的bug分析
发现别人bug所采用的策略:
在第一次作业互测中,我并没有借助任何脚本工具,建了6个项目来进行互测,故效率比较低
(1)空白字符的判断,这是第一次作业中最容易发现的bug。
(2)采用大规模数据进行测试
(3)采用边缘数据进行测试
(4)尝试类似x*、*1等等WF数据
2、第二次作业
相比第一次作业,第二次作业新增了三角函数的求导需求,以及合并指数的需求。一下是类图和结构分析
(类图)
(结构分析)
在第二次作业中,我建了7个类。Poly类与Derivitive类与第一次相似。Getstring类从控制台读入数据,判断数据合法性。Key类包含x、sin(x)cos(x)的指数。Item类对单项进行合并。Shorter类用于最后的化简。
第二次作业过程中的难点及解决方法:
因为有第一次作业的经验,第二次作业在正则表达式方面并没有太大问题,所用的方法与第一次相同。但也出现了其它问题
(1)Object类方法重载的问题,因为以Key类作为hashMap的键,那么Key类中的equals方法和hashCode方法就需要重载,同时,考虑到Key类需要复制的问题,还需要重载clone方法
(2)结果化简,这是本次作业的得分点同时也是失分点。
类型 | 优化前 | 优化后 | ||||||
系数 | x指数 | sinx指数 | cosx指数 | 系数 | x指数 | sinx指数 | cosx指数 | |
1 | a | b | c+2 | d | a | b | c | d |
a | b | c | d+2 | |||||
2 | a | b | c | d | a | b | c+2 | d |
-a | b | c | d+2 |
表格中是我在本次作业中用到的两种优化方式,有很多没考虑到的情况。
第二次作业bug分析
第二次作业中我有一个bug在公测和互测中被hack,出现bug的原因是未对变量进行初始化。
发现别人bug所采用的策略:
通过参考讨论区里大佬的发言,我在这一次作业中采用了脚本的方式进行互测。用idea自带的功能将每一个项目生成.jar文件,将这些文件放在同一目录下。使用git-bash(win10下的ubuntu子系统的java环境好像要重装?)写好脚本之后,就能一次对7个人的代码进行互测。在参考大佬脚本之后完成的脚本。
#!/bin/bash
echo $1 | java -jar archer.jar | sed -n '1p' > output.md
echo $1 | java -jar assassin.jar | sed -n "1p" >> output.md
echo $1 | java -jar berserker.jar | sed -n "1p" >> output.md
echo $1 | java -jar caster.jar | sed -n "1p" >> output.md
echo $1 | java -jar lancer.jar | sed -n "1p" >> output.md
echo $1 | java -jar rider.jar | sed -n "1p" >> output.md
echo $1 | java -jar altergo.jar | sed -n "1p" >> output.md
关于寻找bug的策略与第一次类似。
3、第三次作业
第三次作业引入了嵌套。难度增加了很多。
(类图)
(结构分析)
我对这次作业的Poly类进行了更改,Poly类读入字符串,生成表达式树,表达式树中的没一个表达式与第二次作业中类似。这样就能较大程度上复用第二次的代码。同时由于这次作业的化简难度大,所以我并没有在化简上花太大功夫。
第三次作业过程中的难点及解决方法:
在第三次作业中,我将所有括号内的内容视为表达式,将其替换为另一个与x相关的变量y。替换后的表达式如图
通过对每一个表达式求导。再用求导后的结果替换表达式的变量得到最终结果。
第三次作业bug分析:
在本次作业中,我一共出现了一个bug,且因为这个bug被hack了6次。bug原因是将y = f(y)错误的写为了y+=f(y)。是真正的因为粗心导致的bug。
二、总结
这一个月面向对象的学习,还是有不少收获。从对java一窍不通到渐渐熟悉。从完全没有面向对象的思想,到尝试封装、继承。也再一次体会了bug虐我千百遍的感觉。虽然依然存在很多问题,但相信剩下的大半学期会有更多收获。