第一次作业

(1) UML结构图

(2)结构分析

Polynomial 类是对输入的字符串进行预处理,其中包括判断格式是否合法,运算符简化,分割成项等方法。

Polynomial处理后得到的每一个项的字符串,传给Iterm类(这个类名是item和term的组合,互测中独一无二的类名,真是可怕!),iterm类通过构造函数获取各个信息。iterm类还有实现求导的方法,以及生成合并同类项的方法。

PolyDer类没有属性,只有enter(Arraylist 添加对象)方法,和print方法。

(3)耦合度分析

PolyDer中,print方法以及enter方法复杂度高,写的比较面向过程。尤其是print方法有待改进。改进方法可在iterm类中写一个成员方法print,按要求输出该项。然后只需在main函数中的for循环下,调用每个对象的print方法即可。

(4)难点分析

第一次作业的难点在于正则表达式解析字符串。一开始我是用大正则匹配整项的,后来发现存在爆栈的风险就做了改进。利用项的几个基本形式,对表达式挨个项匹配。

(5)BUG分析

自己:

第一次作业比较庆幸,强测互测都没有被找到bug,不过优化忘了将正项提前,所以也不是满分。

同屋:

感觉强测还是很弱的……

bug集中在两个地方:

(1)关于 结果为0的一些输入上(大概大家对这个0的输出优化条件并没有考虑周全)

比如 0 ,+x-x,……

(2)格式错误

在OO之前,我们很少考虑程序的鲁棒性。但是这种什么错误输入都有的情况才更贴切实际。这次作业很多人的bug出在\v,\f等上

第二次作业

(1)UML结构图

(2)结构分析

这次我的结构和第一次是差不多的,只是Iterm类增加了几个属性。每个项都可表示为 系数*幂函数*三角函数的形式。Iterm类中也增加了sin和cos的求导方法。除此之外,相比于第一次作业的print部分,这是有在Iterm类中写了一个toString方法。

PolyDer类是个比较杂糅的类,我把优化的各种方法(简单的合并同类项,sin(x)^2+cos(x)^2=1的化简,正项提前等)都写在了这里面。

(3)耦合度分析

不是很高明的结构,三次嵌套的循环等导致这次的我的优化部分尤其是simpeList方法的耦合度和复杂度都比较高。还有,Iterm的构造函数既提取信息又检验格式,耦合度和复杂度也很高。

(4)BUG分析

自己的BUG

+ - 号位置不同导致的数量多变的关系,其中还有很多与空格、*的组合关系。这让我从表达式中分割出项的时候忘考虑了*后面也可以有+-号,因此强测卡了三个点(心痛……)。

同屋的BUG

这次的BUG中 ,还是集中在WF和优化方面。

错误格式比如1*-sin(x),1*--1等

(5)Applying Creational Pattern

对于我的sin(x)^2+cos(x)^2=1的化简,应该是比较充分的,但是没有用什么高明的算法,实现方式比较蠢笨。

反复遍历ArrayList,直到上一次没有化简(sin(x)^2+cos(x)^2=1处理后的两项toString的长度和比之前小则算作一次化简)终止循环。

研讨课上大佬介绍了启发式化简,运用的结构是treeMap。感觉很高明,正在研究……

第三次作业

(1)UML结构图

(2)结构分析

这次作业第一次尝试使用接口。写了四个最小单元类(常数类,幂函数类,sin类,cos类),两个运算类(乘法类,加法类)

表达式字符串传给加法类的构造函数,然后加法类分解各个项,传至其他五个类。其中乘法类也对字符串进行分解,将各个因子传给四个最小单元类,表达式因子传给加法类。

至于提取各个部分,我并没有用正则的方法,而是用了匹配的括号进行分割,这个比较面向过程,有待改进……

(3)耦合度分析

就每个方法来说的话,其实耦合度和复杂度都还好。

但对每个类来说,复杂度比较高。我把格式判断与提取信息全放在构造函数里,实在是太菜了!我要学习!

(4)难点分析

a.表达式的提取。递归下降啊,其实我也不知道自己写的是不是递归下降……

b.优化。这很大程度上取决于工程采取的结构。这次我没有刻意的去优化,只去除了多余的外围括号……

(5)BUG分析

自己:

庆幸强测互测都没被hack,不过也多亏互测不给测试错误格式的数据。其实我的代码是有bug的(暗喜)

同屋的BUG:

这次我有尝试用脚本,可以同时输出同屋所有人的输出。当然一对比,有的人很强,做了很多优化,有的人却很长很长……可以看出,一个屋的实力差距还是蛮大的。也惊奇地发现,有的人的代码在处理加法的时候会更短,有的人是乘法,有的人是嵌套。这大概和每个人采取的结构有很大关系。

至于bug,我只找到了两个。一个是0*0*0*0*0*0*0*0……(没输出),还有一个是(((((……(x)……)))))的嵌套(爆栈了)。

(6)Applying Creational Pattern

我将字符串分解依次往下传到构造函数中,虽是递归,却很不“文明”。应该采取真正的递归下降的算法。

其实实现简单的优化还是可以的,比如同底数因子的合并,以及同类项的加减合并。只需我每个基类里写上同类、同底数的方法。然后在加法类加入项的时候有序,并且合并同类项;在乘法类加入因子的时候有序,然后同底的化简即可。

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

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

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

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

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

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

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

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

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

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

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

  6. OO第一单元总结——多项式求导

    第一次作业分析 1.程序结构分析 类图: 好吧,这一次基本上完全是在面向过程编程,没有看出来任何的面向对象的特性. 复杂度: 可以看到模块间的相互耦合度很高,PolyDerive方法的非结构化程度也不 ...

  7. 第一次oo博客作业--表达式求导

    (1)说实话我这部分真的不知道写些什么,因为我只有第三次作业写了两个类,前两次都是一个类,一个类的好处可能也就是写起来比较方便(不用抽象什么共性了,直接c语言莽过去),缺点很多,架构不清晰,可读性不高 ...

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

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

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

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

随机推荐

  1. Python基础之:Python中的异常和错误

    目录 简介 Python中的内置异常类 语法错误 异常 异常处理 抛出异常 异常链 自定义异常 finally 简介 和其他的语言一样,Python中也有异常和错误.在 Python 中,所有异常都是 ...

  2. Centos7安装Nacos单机模式以及集群模式(包含nignx安装以及实现集群)的相关配置

    Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos支持三种部署模式 单机模式 - 用于测试 ...

  3. K8S单集群桌面安装笔记【k8s-for-docker-desktop】

    一.K8S集群基本的拓扑结构 二.下载 k8s-for-docker-desktop k8s桌面单集群安装,基本上选择 k8s-for-docker-desktop或者minikube两类,本文采用前 ...

  4. DAOS 分布式异步对象存储|相关组件

    DAOS 的安装涉及多个组件,这些组件可以是集中式的,也可以是分布式的. DAOS 软件定义存储 (software-defined storage, SDS) 框架依赖于两种不同的通信通道: 用于带 ...

  5. 获取本机外网ip

    获取内网ip ifconfig eth0 | grep 'inet'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $2}' 获取公网ip ifc ...

  6. 给出N个字符串恰好由三位字母(大小写)组成,再给出M个查询字符串,问每个查询字符串在N个字符中出现的次数。

    1 #include<cstdio> 2 const int maxn = 100; 3 char S[maxn][5], temp[5]; 4 int hashTable[52 * 52 ...

  7. [Python]import使用的疑难杂症与包管理

    概念:模块与包 模块module:一般是以.py为后缀的文件,也包括.pyo..pyc..pyd..so和.dll后缀的文件,模块内定义了函数.类以及变量 包package:包是含有若干个模块的文件夹 ...

  8. 《深入理解计算机系统》学习笔记整理(CSAPP 学习笔记)

    简介 本笔记目前已包含 CSAPP 中除第四章(处理器部分)外的其他各章节,但部分章节的笔记尚未整理完全.未整理完成的部分包括:ch3.ch11.ch12 的后面几小节:ch5 的大部分. 我在整理笔 ...

  9. Day05_17_面向对象编程

    Java面向对象 面向对象编程 和 面向过程编程 举个例子: 用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭. 面向过程编程: 主要关注事物因果关系的实现,面向过程就是 ...

  10. Ansible(1)- 简单介绍

    什么是 Ansible 开源部署工具,也是一个自动化运维工具 开发语言:Python Ansible 的特性 模块化部署管理:调用特定的模块,完成特定任务 三个关键模块:Paramiko(python ...