(1)基于度量来分析自己的程序结构

第一次:
Poly:
属性 AL<Term>
方法 check(格式检查) Poly(构造) merge(合并) compute(求导)

Term:
属性 coeff exp
方法 Term(构造) get/set

Poly格式检查,Poly用正则分割出Term,Term解析出coeff和exp。在Poly中根据Term的属性进行合并,并计算,最终在PolyCompute中输出。
1.感觉把输出部分写到Poly的tostring里面更好一些。
2.这次用了一个超大正则一次进行格式判断和解析,不是很好而且有爆栈风险。
3.没有预处理造成后面的解析会复杂一些

第二次:
Poly:
属性 AL<Term>
方法 check Poly merge firstop(符号预处理) derivation

Term:
属性 key(四元组)
方法 replacefirstop(符号预处理) Term derivation print printfactor get/set

Factor:
属性 key
方法 Factor get

Key:
属性 coeff expofx expofcos expofsin
方法 Key(构造) equals_exp mul/add_coeff add_exp derivation

Poly格式检查、预处理(符号变换和添加、空格等),用正则分割为Term,Term用*分割出Factor,Factor解析出四元组Key,Key为一种数据类型(四元组),将factor在Term中合并,在poly中对exp三元组一样的进行合并。
求导时,Poly的AL对每个Term求导,每个Term的求导(运算及返回值皆有Key完成),之后在Poly求和。
create:Poly->Term->Factor
derivate:Poly->Term
print:Poly->Term->Factor

1.Key被我搞成了结合了coeff的四元组使用起来反而不便
2.因为Term最后可以归为一个三元组+coeff,所以我的求导
3.因为print和create还是要下到Factor层面,所以提前把集中Factor的子类创建起来之后继承Factor(或者接口,可以具体情况再分析)更好一些。

第三次:
Poly:
属性 AL<Term>
方法:新增tostring的重写

Term:
属性 AL<Element>自身
方法 新增merge create_element tostring

interface Element:
方法 derivation tostring

interface Triangle:
方法 getExp create_element

其余的大多都是一些数据特征上的问题,就没什么好列举的了

poly用正则分出Term,Term再用正则分出Element,在Term中构造element,其中cos/sin需要保存其exp的基础上对其内部嵌套的!!因子!!再次构造,递归终点为Cons和Xpower。
求导:P对T的导求和,T对E的导进行while运算,E的导在三角函数的情况下为三角的导和嵌套因子的导的乘积,在poly(表达式/表达式因子)的情况下递归,最终得到一个表达式作为表达式因子返回。
输出类似,也是从P到T到E的结构

1.数据结构不太好,构造向下传的时候是P/T/E,求导回传的时候就是AL嵌套AL了。应该构造(简单传值)和parser分开,数据结构就对齐了。我在hw3中用的数据结构效率相当低下。(AL<AL<Ele...>>Term的导数,而不是Poly,对于Ele同理)
2.一开始看错题了以为三角函数里面嵌套的是表达式,但实际上是表达式因子,补救的时候不想大动代码结构,因此在处理create_element的时候出现了相同代码重复出现的情况
3.脑抽没想起来怎么判断运算符是不是分割T/E的,也不想改成嵌套状态机或者状态机配合正则,就写了个超长正则用来处理括号匹配,于是造成了TLE
4.triangle其实不应该是接口,而应该是抽象类,因为还是有很多的共性的东西的,用抽象类更方便。
5.sin/cos的优化忘了搞了,导致嵌套0和表达式因子的时候输出非常糟糕的长

总结:
1.构造应该简化,解析放在parser里
2.不应该用大正则

(2)分析自己程序的bug

第一次:
互测被抓到一个bug:
正则的一个地方少加了一个[ \\t]*

第三次:
强测TLE:
用正则匹配括号造成的

都发生在正则上,第一次没有预处理,预处理之后问题将简化很多就不会出现这个问题。第三次不适合用正则,但我不想改造成的强行用正则而TLE。

(3)发现别人bug
1.构造边界条件,对于潜在bug进行点分类,每类分情况,之后全排列。
2.按照标准随机生成表达式,用大量测试点,覆盖大部分格式。
3.对于表达式基本结构如符号、空格、数字、字母进行随机全排列(不过效率极低)

OO第一次blog的更多相关文章

  1. OO第一次作业总结

    OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...

  2. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  3. oo 第一次博客作业

    oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...

  4. JAVA第一次blog总结

    JAVA第一次blog总结 0.前言 大一下学期我们开展了OPP这门课程,这也是我们第一次接触到JAVA.与上学期我们在学校里学C语言不同的是,这学期由于疫情原因我们是以网课的方式在学习.在学习中我发 ...

  5. OO第一次阶段性总结

    经过三次作业的历练之后终于来到了写博客这一周.回顾开学来的这一个月,令我印象最深刻也是最累的一门课就是OO了.虽然上学期学过一部分Java,但这学期开学就来的OO作业还是让我在第二周就开始熬夜了.不过 ...

  6. OO第一次单元总结

    第一次总结性博客 16071070 陈泽寅 2019.3.23 一.第一单元所学总结 首先先来总结一下第一单元我所学到的知识以及所感所悟.第一个单元,是我第一次接触JAVA语言,并且再使用了几次之后, ...

  7. OO第一次博客作业--第一单元总结

    OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...

  8. OO第一次博客

    过去的三周里我们完成了表达式求导的程序设计与构造.表达式求导程序,大致思路是实现一个表达式类,支持表达式的输入.求导运算和输出功能.可能的话,还可以增加表达式的化简方法,从而得到更高质量的输出结果.总 ...

  9. oo第一次作业

    前言: 这是一篇面向对象作业总结,作业内容是对多项式进行求导,一共有三个阶段,具体要求不详述,第一阶段只要求’+’连接coeff*x^pow的形式,第二次支持*连接的幂函数及三角函数,第三次则需要支持 ...

随机推荐

  1. 64 位 Windows 平台开发注意要点之文件系统重定向

    Program Files 的重定向 很多开发人员都知道,在 64 位 Windows 系统上,32 位程序是无法获取得到 C:\Program Files 的完整路径的,只能获取到 C:\Progr ...

  2. 通过setup.py安装项目dependencies

    一.使用方法 安装命令   $ pip install  -e  <option> setup.py 二.具体介绍 pip intall -e 举例一个setup.py $ pip int ...

  3. Hexo:创建属于你自己的博客

    step: 1.install node.js,git,github 2.npm install -g hexo-cli 3.mkdir hexo 4.cd hexo mkdir blog 5.cd ...

  4. redis 安装和配置

    准备条件:1>确保所安装的环境能够访问网络,2>环境中拥有gcc\g++.make.tar等工具3>以root身份登录安装过程:1>输入命令:wget http://downl ...

  5. 重写 final关键字 多态调用子类特有的属性及行为(向上向下转型)

    1.override 重写:在继承中,子类与父类方法名相同,参数列表相同,的方法叫重写,与返回值有关;  主要应用于系统升级. 2.final 关键字: 可修饰:1.类-->被修饰后该类不能被继 ...

  6. ----Androd 系统开机显示白条提示 “there is internal problem with your device, Contact your manufacture ... ”

    ref: https://www.theandroidsoul.com/how-to-fix-theres-an-internal-problem-with-your-device-error-on- ...

  7. git commit命令

    git commit 主要是将暂存区里的改动提交到本地的版本库.每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id. commit-id在版 ...

  8. sha256_transform

    DECLSPEC void sha256_transform (const u32 *w0, const u32 *w1, const u32 *w2, const u32 *w3, u32 *dig ...

  9. keil的自动补全功能

    设置完之后,在.c文件上试一下,发现还是不能自动补全. 后来去各种贴吧里找到了答案,是我的.c文件还没有保存到工程文件中去,所以不能实现这个功能.

  10. P61 实践作业

    网络攻防实验环境搭建 根据链接下载的实验工具包,将其解压 打开VM虚拟机,点击图中红色框,扫描虚拟机 选择文件所在位置 点击下一步,完成.即可 在VM虚拟机设置中把网络适配器修改为桥接模式.如下图 在 ...