(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. petapoco模板修改

    [Reference(ReferenceType.Many, ColumnName = "OneId", ReferenceMemberName = "OneId&quo ...

  2. python版本的简单贪吃蛇

    先看看效果,白色的条是蛇(简单勿怪,有研究的同学请告知做的美观点),做了一个笑脸是糖果,背景弄了一个图, 代码也是从其他人那边弄来的,改了一部分直接可以在window上直接运行 代码如下: #codi ...

  3. vue $refs 无法动态拼接,获取不到对象(转)

    原文地址: http://www.php.cn/js-tutorial-410304.html 本篇文章给大家带来的内容是关于vue $refs中不使用拼接的原因以及解决方法,有一定的参考价值,有需要 ...

  4. Anatomy of a Database System学习笔记 - 概论、并发控制

    <Anatomy of a Database System>这篇发表于87年.一共48页的论文据说是DBA入门必看,但是找了全网没有找到中文翻译.这篇文章对关系型数据库确实有提纲挈领的作用 ...

  5. LeetCode 92. Reverse Linked List II倒置链表2 C++

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  6. python 列表生成式,生成器&迭代器

    列表生成式: 需求:要对列表 [0,1,2,3,4,5,6,7,8,9]的每个元素加1 用列表生成式一步搞定: li = [i+1 for i in range(10)] # 这种写法就叫列表生成式 ...

  7. Delphi Exif

    这久要用到读取JPG 的 Exif 信息,先是在盒子里下了个Demo,但是那个太老了,是2003年的,后来下载了个CCR 1.5.1是可以使用了,但是我个人用的是Delphi 2007,似乎CCR 1 ...

  8. pyinstall install

    安装 pyinstall 下载地址 http://www.pyinstaller.org/downloads.html 找到支持本机python版本的pyinstall下载解压即可 pyinstall ...

  9. Exp2 后门原理与实践 - 20164304 姜奥

    实验内容  (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterpreter(或其他软件)生成可执行文件 ...

  10. python xlrd xlwt

    1.什么是xlrd模块? 2.为什么使用xlrd模块? 3.怎样使用xlrd模块? 1.什么是xlrd模块? ♦python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel, ...