OO第一单元(求导)单元总结
OO第一单元(求导)单元总结
这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编程思想也逐步深入面向对象,如果说前两次作业还可以用C语言的面向过程的思想去对付,那么第三次作业可以说是为面向对象而设计的。
一、作业分析
1.第一次作业
第一次作业作业的目标是实现简单的加减多项式的求导,项的形式为带符号整数和幂函数的结合,带符号整数符号与数字间不允许有空格,如-3*x。
由于此次作业是我第一次接触面向对象(暴露我寒假没好好学Java),所以类的架构显得十分混乱,命名也乱七八糟。主类为PolyCal,它的功能是读入输入的数据并创建读入的多项式的Poly类对象,并且承担了一部分Poly类的toString功能(由于checkstyle对行数的规定导致写不下)。Poly类的功能是检查读入的字符串并进行处理,将其按项存入一个ArrayList中并排序以方便之后实现化简,以上功能全部由Poly的Construction方法完成,toString方法实现了求导后结果的输出。PolyList类其实应该命名为Item,它用来保存读入的项并完成求导。SortComparator类是用于ArrayList排序的类。
多项式求导的三次作业都可以划分为读入、求导、输出三大部分,每一部分都可以相互独立。第一次作业的读入是通过大正则实现的,先通过大正则判断输入多项式的格式是否正确,再通过小正则分离出项与每一项的系数和指数。求导部分由PolyList完成,由于题目要求简单,所以求导只是简单的公式求导。输出部分完成了对表达式的化简,通过排序后的ArrayList来合并同类项,并消除重复的符号,对空字符串特判等等已达到长度优化目的。
此次作业的优点就是不容易出错,其实这个说法有两面性,大正则写得好确实不容易出错,而是加上大部分人的Bug多是处在正则表达式上。而缺点就非常多,首先就是架构毫无延展性可言,其次类与类之间功能的分配也很混乱,可以说是一个长得像面向对象的面向过程工程。
程序出现的Bug:主要有两个,第一个是爆栈,这就是用大正则的副作用。第二个是空输入,由于我并没有再使用Scanner时用hasNextLine判断,所以读入空文件时会出错。
刀别人的策略:由于这次的作业简单,代码行数不是很多,所以读代码成为了一个可行的方法,可以将其他人的代码一行一行仔细研读,尤其是正则表达式要读的格外仔细。当然Wrong Format是这次作业互测必走的流程。
2.第二次作业
第二次作业相比第一次多了sin,cos两个三角函数和多项因子相乘,同时引入了因子和项的概念,表达式由任意数量项相加减组成,项由任意数量因子由乘法组成,三角函数保留字内不允许有空格。
从这次作业的题目要求中不难看出题目有意引导我们构建面向对象并且具有一定延展性的工程,而我也尽力尝试去做了,但由于我对继承的掌握并不够熟练,所以没敢在这次作业中使用继承,但也写出了具有层次性的架构。第一层是表达式(Poly),第二层是项(Item,ItemNum),第三层是因子(Power,Constant,Sin,Cos)。
读入的实现依旧有正则表达式实现,但是这次与上次有所不同,吸取了上次爆栈的教训,这次的正则表达式是建立在逐项分析的基础上。每一个类都带有自己对应的正则表达式,并且用于组成上一级的正则表达式。求导则通过将每一项合并为a*x^b*sin(x)^c*cos(x)^d在进行对项的公式求导实现,这部分的实现由ItemNum类完成。输出则有Poly类的toString方法单独处理,而化简则由Item类的simplify方法单独处理。
我这次作业的有点在于使用的方法比较简便,也有一定的延展性,相比上次作业也更像一个面向对象作业了。问题也很突出,事实(第三次作业)证明我所构建的框架还是太小,延展性还是不够,尤其是我所采用的求导方法可谓完全没有延展性,是只适用与这次作业的取巧的方法。
程序出现的Bug:这次Bug只有一个,比上次少,却导致我挂了更多的强测点。这次的Bug是我在优化时出现了问题,我用了String类的replaceAll方法将所有+1*换成了+,-1*换成了-,这就导致诸如x^-1*cos(x)会被有化成x^-cos(x)。
刀别人的策略:由于题目变难了,代码变长了,所以通读代码显得不那么现实,因此我采取了只看他们正则表达式的方法。而另一方面,我也用自己构建的样例来进行统一测试。
3.第三次作业
这次作业相比上次作业又多了表达式因子与嵌套求导,难度急剧提升。其中嵌套求导只会出现在三角函数中。
这次作业几乎是必须用面向对象的思想去完成了,和上次作业一样我采用三重式架构,第一层是多项式(Poly),第二层是项(Item),第三层是因子(父类Factor,子类Power,Constant,Sin,Cos,PolyFactor)。
读入我采用递归读入,并由Handler类单独处理。求导采用通过每个类之间与每个层级之间的调用来实现递归求导。同理输出也是递归输出,优化方面由于我所选用的球道和输出方法还有我比较菜所以就只优化了最基础的一些部分。
我这次作业的优点就是架构和方法比较清晰,每个类的职能明确。问题就是由于读入求导与输出都采用递归的方法所以对于多重嵌套的数据处理会非常慢从而导致超时。
程序出现的Bug:超时
刀别人的方法:这次是彻底不能靠读代码来刀人了,因此我学会了使用自动测试,并通过自动生成测试集来自动测试他人代码。
二、总结与感悟
面向对象的思想可以说是这个单元我最大的收获。从一开始的披着面向对象外皮的面向过程工程到最后的使用了继承的面向对象工程,我感受到我正一步步了解面向对象的思想内涵。面对一个新的工程,首先要思考的不是要完成事情的工序,而是这个工程所包含了那些对象,这些对象又各自拥有什么功能,哪些对象之间由is-a或has-a的关系。在完成这三次作业的过程中,我逐渐有以工序架构代码转变为由对象组成代码。当然作为一个面向对象的初心者,我的不足还是很明显,我的代码延展性非常的差,三次作业可以说是写了三次全新的代码,虽然我的架构能很好地完成当前的问题,但却对未来会出现的问题毫无准备,这也是我所欠缺的面向对象的素质。
OO第一单元(求导)单元总结的更多相关文章
- 2019年北航OO第一单元(表达式求导任务)总结
2019面向对象课设第一单元总结 一.三次作业总结 1. 第一次作业 1.1 需求分析 第一次作业的需求是完成简单多项式导函数的求解,表达式中每一项均为简单的常数乘以幂函数形式,优化目标为最短输出.为 ...
- 2020 OO 第一单元总结 表达式求导
title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...
- OO第一单元作业总结——表达式求导
OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...
- OO第一单元总结-多项式求导
OO第一单元总结-多项式求导 一.第一.第二次作业总结 因为前两次作业设计复杂度差别不大,因而放在这里统一总结. 基于度量分析程序结构: 前两次作业确实存在缺乏可拓展设计的构想,基本还是面向过程的思维 ...
- OO第一单元总结(表达式求导)
写在前边:第一次接触面向对象语言,编程思想仍然不可避免的有以前面向过程的影子.从第一次作业的完全面向过程,到第二次学会剥离各个类互不影响到第三次作业的先构思面向对象的基本程序架构再编程.虽然程序有些地 ...
- OO第一单元总结——表达式求导
第一次作业 (1) UML结构图 (2)结构分析 Polynomial 类是对输入的字符串进行预处理,其中包括判断格式是否合法,运算符简化,分割成项等方法. Polynomial处理后得到的每一个项的 ...
- 2019 OO第一单元总结(表达式求导)
一. 基于度量的程序结构分析 1. 第一次作业 这次作业是我上手的第一个java程序,使用了4个类来实现功能.多项式采用两个arraylist来存,系数和幂指数一一对应. private ArrayL ...
- OO第一单元总结__多项式求导问题
作业一.含幂函数的简单多项式的求导 (1)基于度量的程序结构分析 1. 统计信息图: 2. 结构信息图: 3. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设 ...
- OO第一单元作业——魔幻求导
简介 本单元作业分为三次 第一次作业:需要完成的任务为简单多项式导函数的求解. 第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解. 第三次作业:需要完成的任务为包含简单幂函数和 ...
随机推荐
- cordova闪屏插件插件使用:cordova-plugin-splashscreen
欢迎页本地插件,默认建议包含.启动本地应用时显示指定的图片(启动页) 1. 添加插件:cordova plugin add cordova-plugin-splashscreen 2. 调用方法:
- SignalR 行实时通信最大连接数
SignalR 搭建实时刷新应用虽然非常方便,但是有个问题你必须考虑到,就是一般的浏览器,对于SignalR的全双工通信方式,绝大多数浏览器都只支持6个新窗口,如果你打开第7个,那么新的框口页面是不会 ...
- Computer Graphics Principles And Practice (James Foley / Andries Van Dam / Morgan McGuire / David Sklar / James D. Foley 著)
1 Introduction 2 Introduction to 2D Graphics Using WPF 3 An Ancient Renderer Made Modern 4 A 2D Grap ...
- DOM 基础
文档对象模型(Document Object Model)是表示和处理一个HTML或XML文档的常用方法 查找 直接查找 var obj = document.getElementById('i1') ...
- 【转】linux scp远程拷贝文件及文件夹
转自:http://www.jb51.net/LINUXjishu/73131.html 1.拷贝本机/home/administrator/test整个目录至远程主机192.168.1.100的/r ...
- SQL :“传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确” 错误
其中在DAL层调用存储过程来插入数据的参数 SqlParameter[] parameters = { new S ...
- 环境搭建--使用pytharm远程调试树莓派
对于Linux和文本编辑器不那么熟悉的小伙伴来说,直接在树莓派中写程序可谓是痛苦万分.本文将介绍如何使用PyCharm远程调试树莓派,并同步当前python文件到树莓派中. 配置环境 首先要在个人电脑 ...
- Tornado异步非阻塞的使用以及原理
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...
- jdk1.8源码解析(1):HashMap源码解析
jdk1.8 HashMap数据结构 图1-HashMap类图 图2-TreeNode类图 由图1-HashMap类图可知HashMap底层数据结构是由一个Node<K,V>的数组构成.具 ...
- 移动端css水平垂直居中
水平垂直居中 1.margin 负值调整偏移实现 兼容性: 当前流行的使用方法. <div class="box"> <div class="conte ...