(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. react基础学习 一

    1. 搭建环境 安装react脚手架  >npm install create-react-app -g 创建文件            >create-react-app 项目名称 启动 ...

  2. (Python基础)集合操作

    集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 以下代码演示了去重,增删改查,以及关系测试供参考学习 ...

  3. Docker笔记——jenkins镜像制作

    jenkins官方路径:https://hub.docker.com/_/jenkins/ 最新Dockerfile路径:https://github.com/jenkinsci/docker/blo ...

  4. B树与B+ 树

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...

  5. Linux 工作目录切换命令

    1.pwd 显示当前用户所处的目录 2.cd 切换工作路径 cd [目录名称],cd - 返回上次所处的目录 cd ~ 返回当前用户的根目录 cd.. 返回上级目录 3.ls 显示目录中的文件信息,l ...

  6. Linux下的常见压缩解压缩命令

    Linux常见压缩解压缩命令 常见压缩文件扩展名 .Z compress 程序压缩的文件: .zip zip 程序压缩的文件: .gz gzip 程序压缩的文件: .bz2 bzip2 程序压缩的文件 ...

  7. H5使用codovar插件实现微信支付(微信APP支付模式,前端)

    H5打包的app实现微信支付及支付宝支付,本章主要详解微信支付,支付宝支付请查看另一篇“H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)” ps:本文只试用H5开发的,微信 AP ...

  8. 图片转化成base64编码

    var img = "imgurl";//imgurl 就是你的图片路径 function getBase64Image(img) { var canvas = document. ...

  9. c#关于var的介绍和用法

    var关键字---根据初始化语句推断变量类型 功能: var关键字指示编译器根据初始化语句右侧的表达式推断变量的类型,推断类型可以是内置类型,匿名类型,用户定义类型,.NET Framework类库中 ...

  10. 一条SQL语句执行得很慢的原因有哪些?

    说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了. 之前腾讯面试的实话,也问到这 ...