OO第一单元作业——魔幻求导
简介
本单元作业分为三次
第一次作业:需要完成的任务为简单多项式导函数的求解。
第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解。
第三次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数及其组合的求解。
第一次作业
实现方式
输入、解析:
1.
去掉所有空白符。
2.
经过一系列replaceAll使得项与项之间仅以+分隔。
3.
利用Split将所有项拆分开,对于每一个项新建一个对象。
求导:
1.
每个因子存储在Term中,调用求导方法进行求导并存入Hashmap。
输出:
1.
遍历Hashmap,正项先输出。
2.
指数为1和-1时采用省略模式输出。
3.
一开始不输出0项,如果到最后输出长度为0那么输出0。
类图

代码规模

复杂度分析


分析:Handler应当拆解为更小的模块,因为有太多的事情在Handler里面完成了,不符合高内聚低耦合原则。
第二次作业
实现方式
第二次作业在第一次作业的基础上进行迭代,更改了求导方法和输出方法,其余地方大都沿用第一次作业的代码。
类图

代码规模

复杂度分析


总结:可以看到checkFormat,express,merge三个方法复杂度比较高,它们共同的特点是if/else比较多,但是原因又各不相同:checkFormat是因为需要判别多种错误类型;express是因为输出的时候需要判别各种特殊情况;merge也是因为需要合并各种各样的同类项。
第三次作业
实现方式
格式判断:
1.
利用递归下降分析,在遍历字符串的同时截取各个表达式、项、因子。
2.
将各个简单因子(三角函数,幂函数)代入正则表达式看是否匹配,不匹配输出“WRONG FORMAT!”并退出程序。
预处理
1.
对于符合格式要求的输入,去除所有的空白字符。
2.
将不在括号内的部分用replace进行处理使得每一项由’+’分开。
3.
用split函数提取出项,对于每一项用’*’分开得到因子。
求导:
1.
利用递归的方式,先对于各简单因子求导,利用简单因子求导的结果得到各因子的导数,再对乘积项求导,再求出多项和的导数。
输出:
1.
利用类似递归下降分析的方式将各个项的系数和指数提取出来,将0项去除,将次幂为0、1以及系数为1、-1的项进行简化处理。
2.
将简化后的表达式输出。
类图

代码规模

复杂度分析


分析:本次没有红色警告,说明架构良好。
Bug分析
三次作业在中测、强测、互测中均没有发现Bug,但是我于第二次作业Hack他人3次,第三次作业Hack他人16次。发现他人Bug的主要途径有三类:
1.在自己做作业的时候曾经犯下的错误、自查到Bug的测试数据记录下来用于Hack他人。2.利用数据生成器生成一些暴力数据,对于功能进行全面检测,尝试找到他人程序中一些功能性漏洞。
3.自行编写边界数据(例如第一次作业中恰好1000个字符的边界数据,例如第二次作业中指数恰好为10000的边界数据)。
心得体会
通过这一单元的学习,我有了很大的收获。首先,我学会了利用xeger库来生产数据、用sympy来比对结果,同时还学会了使用命令行来进行输入和输出重定向;其次,我培养了自己全面思考问题的能力,正是有了在构思阶段对于可能出现情况全面的考虑,才有了这整一单元没有Bug的良好结局。
但同时,我也应当看到自己的不足。首先,我在第二次作业到第三次作业中经历了重构,但实际上第二次作业和第三次作业的要求是很相似的,只不过多了一些嵌套而已,这说明我第二次作业中采用的架构出现了问题,没有预留下可以继续迭代的空间。其次,我的程序更加面向过程而非面向对象,对于代码的封装性并不好,同时没有合理的创建对象导致在优化起来无法达到很好的效果,因为如果没有把不同的因子都存在某一个对象里而只是靠字符串的处理完成求导显然是无法化到最简的。最后,没有尝试去运用工厂模式、try/catch异常处理等方法,而只是运用了最基本的语法知识,从学习的角度上讲这是不够的。
OO第一单元作业——魔幻求导的更多相关文章
- OO第一单元总结-多项式求导
OO第一单元总结-多项式求导 一.第一.第二次作业总结 因为前两次作业设计复杂度差别不大,因而放在这里统一总结. 基于度量分析程序结构: 前两次作业确实存在缺乏可拓展设计的构想,基本还是面向过程的思维 ...
- 2020 OO 第一单元总结 表达式求导
title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...
- 2019年北航OO第一单元(表达式求导任务)总结
2019面向对象课设第一单元总结 一.三次作业总结 1. 第一次作业 1.1 需求分析 第一次作业的需求是完成简单多项式导函数的求解,表达式中每一项均为简单的常数乘以幂函数形式,优化目标为最短输出.为 ...
- OO第一单元总结——表达式求导
第一次作业 (1) UML结构图 (2)结构分析 Polynomial 类是对输入的字符串进行预处理,其中包括判断格式是否合法,运算符简化,分割成项等方法. Polynomial处理后得到的每一个项的 ...
- 2019 OO第一单元总结(表达式求导)
一. 基于度量的程序结构分析 1. 第一次作业 这次作业是我上手的第一个java程序,使用了4个类来实现功能.多项式采用两个arraylist来存,系数和幂指数一一对应. private ArrayL ...
- OO第一单元总结——多项式求导
第一次作业分析 1.程序结构分析 类图: 好吧,这一次基本上完全是在面向过程编程,没有看出来任何的面向对象的特性. 复杂度: 可以看到模块间的相互耦合度很高,PolyDerive方法的非结构化程度也不 ...
- OO第一单元作业总结——表达式求导
OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...
- 【OO学习】OO第一单元作业总结
OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...
- 【作业1.0】OO第一单元作业总结
OO第一单元作业已全部完成,为了使这一单元的作业能够收获更多一点,我回忆起我曾经在计算机组成课设中,经常我们会写一些实验报告,经常以此对实验内容反思总结.在我们开始下一单元的作业之前,我在此对OO第一 ...
随机推荐
- ip/udp/tcp包 学习
/** * 以太网 */ class Ethernet { static readonly size = 14; get Destination(): string { return [ this.v ...
- (转载)VoLTE简介
转载地址:http://www.360doc.cn/article/2909773_637471256.html,本文介绍了移动通信领域相关概念,如CS.PS.VoIP.VoLTE.IMS.CSFB. ...
- C++算法代码——笨小猴
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1163 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了 ...
- MYSQL 悲观锁和乐观锁简单介绍及实现
1:悲观锁 1.1 特点: 每次查询都会进行锁行,怕"其他人"进行数据的修改. 1.2 实现步骤: 步骤1:开启事务test1,并对id=2的记录进行查询,并加锁,如: 步骤2 ...
- Guava-RateLimiter实现令牌桶控制接口限流方案
一.前言 对于一个应用系统来说,我们有时会遇到极限并发的情况,即有一个TPS/QPS阀值,如果超了阀值可能会导致服务器崩溃宕机,因此我们最好进行过载保护,防止大量请求涌入击垮系统.对服务接口进行限流可 ...
- 用代码来实践Web缓存
Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有"已缓存的副本",就可以从本地存储设备而不是原始服务器中提取这个文档. 上面是<HTTP ...
- Python3.x 基础练习题100例(21-30)
练习21: 题目: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前 一天剩下的一半零一个.到第10天早上 ...
- 基于 react + electron 开发及结合爬虫的应用实践🎅
前言 Electron 是一个可以使用 Web 技术如 JavaScript.HTML 和 CSS 来创建跨平台原生桌面应用的框架.借助 Electron,我们可以使用纯 JavaScript 来调用 ...
- POJ-1015(背包变形+输出路径)
Jury Compromise POJ-1015 推荐几个较好的介绍和理解:https://blog.csdn.net/lyy289065406/article/details/6671105 htt ...
- 手工实现一个ThreadPoolExecutor
以下代码的实现逻辑出自于公众号 码农翻身 <你管这破玩意叫线程池?> - PS:刘欣老师在我心中是软件技术行业的大刘. 线程池接口 public interface Executor { ...