北航OO第一单元总结
我本着公平公开公正的态度作出以下评价:
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第一单元总结的更多相关文章
- 北航OO第一单元作业总结(1.1~1.3)
经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...
- 2019年北航OO第一单元(表达式求导任务)总结
2019面向对象课设第一单元总结 一.三次作业总结 1. 第一次作业 1.1 需求分析 第一次作业的需求是完成简单多项式导函数的求解,表达式中每一项均为简单的常数乘以幂函数形式,优化目标为最短输出.为 ...
- 2019北航OO第一单元作业总结
一.前三次作业内容分析总结 前言 前三次作业,我提交了三次,但是有效作业只有两次,最后一次作业没能实现多项式求导的基本功能因此无疾而终,反思留给后文再续,首先我介绍一下这三次作业,三次作业围绕着多项式 ...
- 2020北航OO第一单元总结
前言 学习面向对象这门课程的后的第一单元作业,主线是多项式求导,三次作业层层推进,由单一的幂函数求导,到幂函数和三角函数的复合求导,最后再到两种函数的嵌套求导,由两个类到重构后的十几个类,我逐渐对面向 ...
- 北航OO第一单元作业总结(Retake)
前言:当我写这篇博客的时候,我的心情是复杂的,因为这实际上是我第二次写这篇博客--我今年重修的这门课.我对去年的成绩心有不甘--在激烈的竞争下,我虽然尽可能完成了所有作业(仅一次作业未通过弱测),但爆 ...
- 2020北航OO第二单元总结
2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...
- OO第一单元作业总结
oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...
- OO第一单元总结
OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...
- OO第一单元优化博客
OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)\)和\(cos(x)\)的指数作为坐标,在图上画出来就可 ...
随机推荐
- MATLAB 均方根误差MSE、两图像的信噪比SNR、峰值信噪比PSNR、结构相似性SSIM
今天的作业是求两幅图像的MSE.SNR.PSNR.SSIM.代码如下: clc; close all; X = imread('q1.tif');% 读取图像 Y=imread('q2.tif'); ...
- MySql 查询表结构信息
select Column_name as 列名,is_nullable as 是否可为空,data_type as 数据类型,column_default as 默认值,case when colu ...
- eclipse改jsp文件编码格式 统一设置
- HTTP之gRPC
gRPC 官方文档 gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计. gRPC 基于 HTTP/2 标准设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多 ...
- bug日记之-------java.io.IOException: Server returned HTTP response code: 400 for URL
报的错误 出事代码 出事原因 解决方案 总结 多看源码, 我上面的实现方式并不好, 如果返回的响应编码为400以下却又不是200的情况下getErrorStream会返回null, 所以具体完美的解决 ...
- MapReduce实现PageRank算法(邻接矩阵法)
前言 之前写过稀疏图的实现方法,这次写用矩阵存储数据的算法实现,只要会矩阵相乘的话,实现这个就很简单了.如果有不懂的可以先看一下下面两篇随笔. MapReduce实现PageRank算法(稀疏图法) ...
- android 百度地图 定位获取位置失败 62错误
一切正常步骤进行但是还是没有获得定位,得到的坐标总是49E.xxxx,错误代码总是62 总是以为代码.或jar包.或还有什么权限没给.搞了好久,十分郁闷.在控制台上又没有什么具体的错误提示 经过无数次 ...
- HTTP 方法:Get与Post分析
GET - 从指定的资源请求数据 POST - 向指定的资源提交要被处理的数据 GET 方法 GET 请求可被缓存 GET 请求保留在浏览器历史记录中 GET 请求可被收藏为书签 GET 请求不应在处 ...
- Codeforces 803 G. Periodic RMQ Problem
题目链接:http://codeforces.com/problemset/problem/803/G 大致就是线段树动态开节点. 然后考虑到如果一个点还没有出现过,那么这个点显然未被修改,就将这个点 ...
- Kotlin 扩展
Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式. 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响. 扩展函数 扩展函数可以在已有类中添加新的方法 ...