我本着公平公开公正的态度作出以下评价:

1、面向对象真的很修身养性

2、有一个好的身体非常重要

3、互相hack可以暴露人的阴暗面

好了,步入正题。

一、作业分析

1、第一次作业分析

1.1类图

1.1.2基于度量的分析

由于只有两个类,而Deri()类几乎什么都没做的,导致Poly类的复杂度较高。一开始写OO当成面向过程来写,结果把大部分功能都放在构造函数里面一起实现了。

1.2心路历程思考过程

当时对于面向对象没什么概念,照着面向过程就去写代码了。第一次作业是简单的多项式,两个类解决问题,一个用来存储,一个用来求导。(事实上,在写代码的时候,求导过程和存储放在了一起,而Derivation类形同虚设,只是一个main()函数)。由于第一次的输入比较简单,和大部分人一样,我选择了大正则匹配,将匹配到的单项式存入Polynomial,并完成求导,再将求导结果返回给Derivativation。而格式判断的工作则是在正则匹配时不停地删去已匹配的项,若字符串最后为空,即格式正确。

1.3制造bug的原因

一个主要bug是空白符的问题,指导书中只要求space和\t,而我用\s实现的空格匹配。

2、第二次作业分析

2.1类图

2.1.2基于度量的分析

可以看出,实例化一个对象的复杂度较高,尤其是Poly类。这次作业和第一次作业一样,把大部分功能都放在了构造函数当中。

2.2思考过程

第二次作业引入了三角函数sin(x)和cos(x),相较于第一次的正则,这一次更加复杂,但是我们依然可以选择头铁的用大正则解决(会面临爆栈问题),这样就连格式判断的问题也一并解决了。在匹配到单项式之后,先进行通过replace操作将所有单项式符号归一化以方便后续处理(例如:删空格,删加号,减号合并),再对单项式进行逐个读入,存储系数和三个指数。并且增加了equal()方法和add()方法用来合并同类项。求导操作也是在Term类里完成的。最后的简化输出则由Poly类实现,但是在实现过程要不断向Term索要指数,系数,不得不增加geta(),getb(),getc(),getd()四个方法,这属于设计上的纰漏。

2.3制造bug的原因

在Term初步归一化时,前置负号没有处理(其实处理了,半夜误删了那一段代码)。

没有仔细看指导书,在Poly类里少了两种空格插入的情况。

3、第三次作业分析

3.1类图

3.1.2基于度量的分析

我对比了一下别人的代码复杂度,我第三次作业的复杂度算是炸了,可能是类太少,干得活太多.....除了Deri()类,其他类都挺辛苦的,我都不好意思分析了.....反正能者多劳吧,三个类都挺复杂的。好在这次不仅是构造函数比较辛苦,求导也复杂度比较高,一家人就应该整整齐齐。

2.2思考过程

第三次作业是最复杂的一次,也是我做得最简单的一次。大部分时间都花在了构思上,所以敲起代码反而得心应手。大正则的时代已经过去了,这次我选做了通过正负号来切分多项式,再通过乘号来切分因子。问题的难点在于括号的干扰,当然这对于大佬不是问题。我用了一个比较笨的办法,匹配到括号开始另一段正则匹配,数到相同数量的左右括号时再开始之前的加(乘)号匹配。对因子分情况求导,当因子是基础因子时(不含多项式)返回特定结果,因子不是特定因子时,对组成因子的多项式进行递归存储。这样存储以后,求导的时候就很简单,我们只需要把他的下一级看成一个整体,就可以很容易地表示出这一级的导函数,直到基础因子时,返回基础因子的导数。在返回导函数的同时,我还对系数,指数为0,和为1的情况在每一级进行化简,以减少递归时的计算压力。这样做的时候,输入格式判断也变简单了。只要上一级的输入,不满足这一层的接口,则抛出异常。可以看出,在整个计算过程中,我完全抛弃了int型(或BigInteger型)的变量,全部都是以String的形式进行传递,这样做简单粗暴,但是不利于最后的化简。不过对于我这样咸鱼玩家来说,也没有化简的必要了。

2.3制造bug的原因

对于输出结果,专门写了一个shortderi()方法,其中存在错误的化简。

没有仔细看指导书,无视了大整数,在factor类中错误地抛出异常。

4、总览

仔细看指导书会减少bug,减少因为“无知”产生的bug。

花时间放在构思上,比花时间放在修补上更值得。

二、分析bug的策略及问题

策略:

1、在自己写程序时,每注意到一个点,就写一个测试数据,到最后会有一个小规模的测试集,虽然这个测试集对于自己的程序没什么杀伤力,但对于别人的程序,可能是个不错的武器。

2、系统地构造wrong fromat的情况,尽可能排列出所有元素小于4个的组合

3、构造复杂的输入

4、脚本生成规范的输入,将输出结果与matlab自动比对

测bug的不足:

1、没有覆盖全面的format

2、没有覆盖全面的计算结果

PS:没有结合除自己以外被测者的代码设计结构构造样例。

北航OO第一单元总结的更多相关文章

  1. 北航OO第一单元作业总结(1.1~1.3)

    经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...

  2. 2019年北航OO第一单元(表达式求导任务)总结

    2019面向对象课设第一单元总结 一.三次作业总结 1. 第一次作业 1.1 需求分析 第一次作业的需求是完成简单多项式导函数的求解,表达式中每一项均为简单的常数乘以幂函数形式,优化目标为最短输出.为 ...

  3. 2019北航OO第一单元作业总结

    一.前三次作业内容分析总结 前言 前三次作业,我提交了三次,但是有效作业只有两次,最后一次作业没能实现多项式求导的基本功能因此无疾而终,反思留给后文再续,首先我介绍一下这三次作业,三次作业围绕着多项式 ...

  4. 2020北航OO第一单元总结

    前言 学习面向对象这门课程的后的第一单元作业,主线是多项式求导,三次作业层层推进,由单一的幂函数求导,到幂函数和三角函数的复合求导,最后再到两种函数的嵌套求导,由两个类到重构后的十几个类,我逐渐对面向 ...

  5. 北航OO第一单元作业总结(Retake)

    前言:当我写这篇博客的时候,我的心情是复杂的,因为这实际上是我第二次写这篇博客--我今年重修的这门课.我对去年的成绩心有不甘--在激烈的竞争下,我虽然尽可能完成了所有作业(仅一次作业未通过弱测),但爆 ...

  6. 2020北航OO第二单元总结

    2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...

  7. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

  8. OO第一单元总结

    OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...

  9. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

随机推荐

  1. BZOJ 3473 字符串

    思路 广义SAM的题目,先全部插入,然后每个字符串在SAM上匹配,如果发现当前sz小于k(就是前缀不满足条件),就跳fail(找前缀的后缀,就是找子串)到满足条件为止,然后一个满足条件的节点,它的所有 ...

  2. 殊途同归 - Church-Rosser and Consistency of Evaluation

        在"解释语言的语言"中提到,设计一个新的语言,仅仅是使用meta-language给出其描述是不够的,我们还需要去验证一些性质.     考虑一下我们在"解释语言 ...

  3. myeclipse中tomcat配置虚拟路径,用于存储及上传图片

    由于双击tomcat后只出现了overview窗口,没有出现Models窗口,如下图所示,故eclipse中的方法不能用. 采用另一种方法 在自己的tomcat的安装目录下 ( 我安装目录的是 D:\ ...

  4. CentOS7攻克日记(二) —— 配置初始化及网络配置

    reboot之后到达这个页面,点击第一个进去同意一下协议之后Done,然后点击右下角的FINISH

  5. 七牛云图片的存储与处理--基于node

    1. 手动上传 . 快速入门,这个简单,可以参考七牛官方文档: https://developer.qiniu.com/kodo/manual/1233/console-quickstart#step ...

  6. LeetCode03 最长无重复子串

    题目 给定一个字符串,找出不含有重复字符的最长子串的长度. 解答 刚开始以为只是一遍遍历后来的字符和前面一样便开始算新子串,给的案例都过了,但是卡在了"dvdf" 后来经过重重试验 ...

  7. react native 项目使用 expo 二维码扫描失败

    今天学习react native,需使用expo在移动端进行调试. npm start 运行项目后,使用expo扫描二维码,始终没有反应.于是决定采用这个方法: 连上手机打开usb调试后,按下‘a’, ...

  8. Git 安装和使用Tips

    1. git的安装 2. git的常见用法 3. git的常见问题 1. git的安装 1)首先去下载https://git-scm.com/downloads 在上述官网上下载符合自己操作系统的gi ...

  9. 在线批量将gps经纬度坐标转换为百度经纬度坐标

    1.首先打开百度api示例页面: 在浏览器地址栏中输入:http://developer.baidu.com/map/jsdemo.htm#a5_3 2.修改代码 如下图,将需要批量转换的坐标,按规则 ...

  10. hdoj3247

    注意fail时怎么走. #include <iostream> #include <cstdio> #include <cmath> #include <al ...