由于第一次作业相对简单,所以即便是非常粗糙的代码结构也没有出现很多bug,其中一个bug是因为优化0不输出,所以会出现输出为空的情况,针对这种情况,我才用了输出时进行特判来避免。
从对输出的处理可以看到,整体代码分为了三个class,分别处理表达式,项,和主函数,整体结构还算清晰。
但是这种处理方法却对第二次作业带来了灾难。
由于这次没有把item划分为factor,所以导致判断item的正则很复杂,结构对item的判断出现了很多bug,例如sin(x)*,笔者在改bug的时候甚至看不懂原来写的正则。。。
2.求导
因为是采用了树状的结构,所以在求导时也同样在树上求导,使得整个过程变得简化。
3.优化
这次的优化就只做了减少括号,对于0,1的不输出。
这次的bug是对可能出现情况考虑的不周全,例如sin(-2)是一个合法的输入,而sin(- 2)就不是一个合法的输入,对于sin内部是否一个因子考虑的不够周全。
通过类图可以看到,在这次作业中,按照指导书的提示,把整个表达式分为加法,乘法,嵌套,各种基础函数,构成树的形式,其中,6种函数都是func的子类,通过转型的机制,可以在父类中共享字串分割,在子类中重写各自的求导方法,并且这个方法有一定的扩展性。
主要通过对作业要求的理解,通过脚本生成一些测试,但是当程序的大体逻辑没有问题时,这种方法往往覆盖不到一些特殊点,所以还会手写一些测试数据,但是这些根本上还是依赖于对作业要求理解的完整性。所以与同学交流测试数据也很重要。
主要的策略还是读别人的代码,这可能也是互测的根本意义所在,在读别人代码时,也会先用一些自认为特殊的数据先试一试,然后大体过一遍他的逻辑,因为这三次作业,其实大家的处理思路不是一模一样,但有很多的相似之处,所以对与自己处理有很大出入的地方会着重看。
虽然oo非常的紧张刺激,其中可能有很幸运没有被强测找到bug,也会有互测被刀了很多次,也可能有强测直接爆炸,但是最重要的是我们从中学到了东西,如果我们做的不够好,不管这是不是最有效的训练方法,只能说明我们的能力还有很大的不足,就学到东西就好了。
如对本文有疑问, 点击进行留言回复!!
SpringBoot引用阿里easyexcel,Excel导出返回浏览器下载
HashMap、Hashtable、ConcurrentHashMap三者间的异同
解决RecycleView 中Item包含Edittext时,滑动view复用导致数据错乱的问题
多线程、同步工作原理、死锁案例、Lock接口、线程的生命周期的讲解及实现
网友评论