第一次作业分析

1.程序结构分析

  类图:

  好吧,这一次基本上完全是在面向过程编程,没有看出来任何的面向对象的特性。

  复杂度:

  可以看到模块间的相互耦合度很高,PolyDerive方法的非结构化程度也不够理想,是非常不合格的面向对象程序。

2.正则表达式

  从带符号整数到项到多项式一步步地写出对应的正则表达式:

    符号    String signStrPat = "(?:\\+|-)";
    带符号整数   String intStrPat = "(?:\\+|-)?\\d+";
    项       String termStrPat = "(?:(?:(?:(?:(?:\\+|-)?\\d+\\s*\\*)|\\+|-)?"
            + "\\s*x\\s*(?:\\^\\s*(?:\\+|-)?\\d+)?)|(?:(?:\\+|-)?\\d+))";
    多项式     String polyStrPat = "^\\s*" + signStrPat + "?\\s*" + termStrPat 
            + "(?:\\s*" + signStrPat + "\\s*" + termStrPat + "\\s*)*+$";

3.总结

  虽然程序没有bug,但是第一次作业只能说是java编程,不能叫面向对象程序设计,写的很烂,不过熟悉了java基本语法和java正则表达式。

  第二次作业分析

1.程序结构分析

  类图:

  这一次采用了面向对象的思想,定义了因子、项和多项式类,但是不够熟练,在架构上存在不小的问题:

  BigInt类其实完全没有必要,Index类和Term类功能严重重叠,求导操作全部集中在PolyDerive等等等等。

  这些都是在架构上很丑陋的一些设计,也导致了无法进行三角函数的化简,以及下一次作业需要再次重构。

  复杂度:

  部分模块的耦合度还是比较高,勉强合格吧。

2.正则表达式

  同样采用层次化的写法,而且将每一个类对应的正则表达式用public static final修饰写在了每个类的内部:

    带符号整数  public static final String INTPAT = "(?:\\+|-)?\\d+";

    因子       public static final String FACPAT = "(?:(?:(?:x|(?:(?:sin|cos)\\s*\\(\\s*x\\s*\\)))"

            + "(?:\\s*\\^\\s*" + BigInt.INTPAT + ")?)|" + BigInt.INTPAT + ")";

    项        public static final String TERMPAT = "(?:(?:\\+|-)?\\s*" + Factor.FACPAT

            + "(?:\\s*\\*\\s*" + Factor.FACPAT + ")*+)";

    多项式      public static final String POLYPAT = "(?:\\+|-)?\\s*" + Term.TERMPAT

            + "(\\s*[\\+-]\\s*" + Term.TERMPAT + ")*+";

3.总结

  没有bug,但是依旧丑陋。

  第三次作业分析

1.程序结构分析

  类图:

  这次作业的因子有常数、幂函数、三角函数、表达式因子,我的思路就是构造这些因子的类继承总的因子类,并且构造项和表达式类,然后用递归下降分析法处理输入,构造相应的对象。  

  化简(simplify方法)时调用类内similar方法和equals方法进行判断。

  复杂度:

  由于sin和cos三角函数因子内部有因子,所以耦合度过高。另外,similar方法和重写的equals方法因为要遍历比较所以复杂度过高。这也导致了公测时三个样例运行时间过长。

2.输入处理

  由于引入了表达式因子,所以没有想出来怎么用java正则表达式来对整体表达式进行识别。

  但是联系到编译原理课上学过的词法分析和语法分析,可以很自然地用自动机和递归下降分析法来处理输入。

  但是这种写法最终导致程序的复杂度很高,而且遇到深层次的括号嵌套时会构造很多冗余的、没有必要的对象(例如"((((x))))",会调用五次表达式分析,构造五个表达式、项、因子)。

3.总结

  这次作业公测出现了三个测试样例运行时间过长而判错,由于自己测试时未进行多重括号嵌套的测试,事先没有发现这个问题。

  收获与反思

  经过这三次作业已经基本理解了面向对象的思想,但是在一些细节上还不够熟练,需要多加雕琢。

  在架构上一定要多花心思,在测试上一定要下功夫。

OO第一单元总结——多项式求导的更多相关文章

  1. OO第一单元总结-多项式求导

    OO第一单元总结-多项式求导 一.第一.第二次作业总结 因为前两次作业设计复杂度差别不大,因而放在这里统一总结. 基于度量分析程序结构: 前两次作业确实存在缺乏可拓展设计的构想,基本还是面向过程的思维 ...

  2. 2020 OO 第一单元总结 表达式求导

    title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...

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

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

  4. 2019 OO第一单元总结(表达式求导)

    一. 基于度量的程序结构分析 1. 第一次作业 这次作业是我上手的第一个java程序,使用了4个类来实现功能.多项式采用两个arraylist来存,系数和幂指数一一对应. private ArrayL ...

  5. OO第一单元作业——魔幻求导

    简介 本单元作业分为三次 第一次作业:需要完成的任务为简单多项式导函数的求解. 第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解. 第三次作业:需要完成的任务为包含简单幂函数和 ...

  6. OO第一单元总结——表达式求导

    第一次作业 (1) UML结构图 (2)结构分析 Polynomial 类是对输入的字符串进行预处理,其中包括判断格式是否合法,运算符简化,分割成项等方法. Polynomial处理后得到的每一个项的 ...

  7. OO第一单元(求导)单元总结

    OO第一单元(求导)单元总结 这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...

  8. OO第一单元作业总结——表达式求导

    OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...

  9. OO_多项式求导_单元总结

    概述: 面向对象第一单元的作业是三次难度依次递增的多项式求导.第一次作业是仅包含带符号整数和幂函数的多项式求导,例如:-1+xˆ233-xˆ06:第二次是在前面的基础上增加了三角函数的求导,例如:-1 ...

随机推荐

  1. springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

    新年第一篇博文,接着和大家分享springcloud相关内容:本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的 ...

  2. Jenkins|简单Job配置|启动脚本|测试报告

    目录 1.Jenkins安装 2.Jenkins启动脚本 3.节点配置 4.任务配置 5.集成HTML测试报告 1.Jenkins安装 操作环境:Ubuntu jenkins针对windows,ubu ...

  3. Java进阶篇设计模式之一 ----- 单例模式

    前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...

  4. Ocelot-基于.NET Core的开源网关实现

    写在前面 API网关是系统内部服务暴露在外部的一个访问入口,类似于代理服务器,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导等工作,我们可以形象的用下图来表示: 外部设备需要访问内部系统服 ...

  5. .net core中使用autofac进行IOC

    .net Core中自带DI是非常简单轻量化的,但是如果批量注册就得扩展,下面使用反射进行批量注册的 public void AddAssembly(IServiceCollection servic ...

  6. 基于vue-cli快速构建

    基于vue-cli快速构建 https://www.jianshu.com/p/2769efeaa10a   Vue是近两年来比较火的一个前端框架(渐进式框架吧),与reactjs和angularjs ...

  7. EasyUI List<T>转tree数据格式

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  8. 第三章 CLR如何解析引用类型

    C#编译器将代码打包成托管模块后,接着会将这些模块合并成程序集,然后统一加载到一个具体的目录,CLR在这个目录查找并且加载所需要的DLL或者exe. 程序集分类:弱命名程序集和强命名程序集,强命名程序 ...

  9. 杭电ACM2019--数列有序!

    数列有序! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. thymeleaf th:href url传递多参数

    <a th:href="@{/teacherShowMember(class_id=${class.classId},class_name=${class.className})}&q ...