面向对象课程第一单元的做业在上周完成,然而这三次做业完成得并非太简单。一方面既要学习java的语法;另外一方面,又要思考怎样将面向对象的思想体如今本身的代码中。更别提还有不太熟悉的git的使用。可是做业的难度与收获是成正比的。虽不说这三次做业能让个人面向对象思想提升多少,但至少仍是有收获。
java
首先是第一次做业的类图和结构分析git
(类图)正则表达式
(结构分析)ubuntu
第一次做业有三个类,Poly类读入字符串,判断合法性,并将合法的字符串转化为两个Arrylist。一个表示系数,一个表示指数。Derivative类是求导类,读入系数与指数数组。求导并输出。数组
第一次做业过程当中的难点及解决方法:
(1)正则表达式的应用,因为是第一次接触正则表达式,因此如何用正则表达式去识别并分析字符串是我遇到的第一个问题。个人方法是,对于每个无符号整数、每个幂函数创建正则表达式。再在以上正则表达式的基础上创建每个单项的正则表达式。将每个单项的正则表达式经过运算符链接成整个多项式的正则表达式。相较直接完成整个正则表达式,这样处理正则表达式相对简单。sass
(2)合并同类项,解决这个问题并不算难,用Map就能很容易的解决。因为后两次做业仍有Map相关问题,故这里很少作赘述。bash
(3)最简输出,第一次做业要得到最简输出其实比较简单。须要保证 不要有多余的符号;不要有重复项;在有正系数状况下,首项为正;1不输出。ide
因为第一次做业在公测以及互测中本身并无遇到bug(虽然不能保证没有bug),故略去第一次的bug分析函数
发现别人bug所采用的策略:学习
在第一次做业互测中,我并没有借助任何脚本工具,建了6个项目来进行互测,故效率比较低
(1)空白字符的判断,这是第一次做业中最容易发现的bug。
(2)采用大规模数据进行测试
(3)采用边缘数据进行测试
(4)尝试相似x*、*1等等WF数据
相比第一次做业,第二次做业新增了三角函数的求导需求,以及合并指数的需求。一下是类图和结构分析
(类图)
(结构分析)
在第二次做业中,我建了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的策略与第一次相似。
第三次做业引入了嵌套。难度增长了不少。
(类图)
(结构分析)
我对此次做业的Poly类进行了更改,Poly类读入字符串,生成表达式树,表达式树中的没一个表达式与第二次做业中相似。这样就能较大程度上复用第二次的代码。同时因为此次做业的化简难度大,因此我并无在化简上花太大功夫。
第三次做业过程当中的难点及解决方法:
在第三次做业中,我将全部括号内的内容视为表达式,将其替换为另外一个与x相关的变量y。替换后的表达式如图
经过对每个表达式求导。再用求导后的结果替换表达式的变量获得最终结果。
第三次做业bug分析:
在本次做业中,我一共出现了一个bug,且由于这个bug被hack了6次。bug缘由是将y = f(y)错误的写为了y+=f(y)。是真正的由于粗心致使的bug。
这一个月面向对象的学习,仍是有很多收获。从对java一窍不通到渐渐熟悉。从彻底没有面向对象的思想,到尝试封装、继承。也再一次体会了bug虐我千百遍的感受。虽然依然存在不少问题,但相信剩下的大半学期会有更多收获。