OO第一单元总结——多项式求导
第一次作业分析
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第一单元总结——多项式求导的更多相关文章
- OO第一单元总结-多项式求导
OO第一单元总结-多项式求导 一.第一.第二次作业总结 因为前两次作业设计复杂度差别不大,因而放在这里统一总结. 基于度量分析程序结构: 前两次作业确实存在缺乏可拓展设计的构想,基本还是面向过程的思维 ...
- 2020 OO 第一单元总结 表达式求导
title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...
- 2019年北航OO第一单元(表达式求导任务)总结
2019面向对象课设第一单元总结 一.三次作业总结 1. 第一次作业 1.1 需求分析 第一次作业的需求是完成简单多项式导函数的求解,表达式中每一项均为简单的常数乘以幂函数形式,优化目标为最短输出.为 ...
- 2019 OO第一单元总结(表达式求导)
一. 基于度量的程序结构分析 1. 第一次作业 这次作业是我上手的第一个java程序,使用了4个类来实现功能.多项式采用两个arraylist来存,系数和幂指数一一对应. private ArrayL ...
- OO第一单元作业——魔幻求导
简介 本单元作业分为三次 第一次作业:需要完成的任务为简单多项式导函数的求解. 第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解. 第三次作业:需要完成的任务为包含简单幂函数和 ...
- OO第一单元总结——表达式求导
第一次作业 (1) UML结构图 (2)结构分析 Polynomial 类是对输入的字符串进行预处理,其中包括判断格式是否合法,运算符简化,分割成项等方法. Polynomial处理后得到的每一个项的 ...
- OO第一单元(求导)单元总结
OO第一单元(求导)单元总结 这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...
- OO第一单元作业总结——表达式求导
OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...
- OO_多项式求导_单元总结
概述: 面向对象第一单元的作业是三次难度依次递增的多项式求导.第一次作业是仅包含带符号整数和幂函数的多项式求导,例如:-1+xˆ233-xˆ06:第二次是在前面的基础上增加了三角函数的求导,例如:-1 ...
随机推荐
- .NET Core微服务之基于Ocelot+Butterfly实现分布式追踪
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.什么是Tracing? 微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错 ...
- ToastMiui【仿MIUI的带有动画的Toast】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 仿MIUI的带有动画的Toast 效果图 代码分析 ToastMiui类基于WindowManager 为了和Toast用法保持一致 ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- [深度应用]·DC竞赛轴承故障检测开源Baseline(基于Keras 1D卷积 val_acc:0.99780)
[深度应用]·DC竞赛轴承故障检测开源Baseline(基于Keras1D卷积 val_acc:0.99780) 个人网站--> http://www.yansongsong.cn/ Githu ...
- cocos creator主程入门教程(五)—— 日志系统
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍日志系统的设计.一般我们开发一个demo,只会简单的用cocos提供的cc.log打印下日志, ...
- SQL Server 一列或多列重复数据的查询,删除(转载)
转载来源:https://www.cnblogs.com/sunxi/p/4572332.html 业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入 ...
- 解析高德地图api获取省市区,生成最新三级联动sql表
前言: 最近项目中用到了全国省市区三级信息,但是网上找到的信息都是比较旧的信息.与现在最新的地区信息匹配不上.后来想到高德地图上可能有这些信息.所以解析了一下api接口,生成了相关省市区的sql信息. ...
- 一起学Android之GridView
本文以一个简单的小例子,简述Android开发中GridView的常见应用,仅供学习分享使用. 概述 GiridView是一个表格显示资源的控件,可以在两个可滚动的方向上显示.列表项的资源会通过Lis ...
- Python安装第三方包(模块/工具)出现链接超时,网速慢,安装不上的问题如何解决
之前我的电脑重新装了系统以后,发现安装完Python后, 使用pip linstall 安装第三方包的时候,网速慢的一匹 有时候只有几百b/s ,而且还动不动就会出现无法安装,链接超时等问题. 今天我 ...
- <自动化测试方案_9>第九章、持续集成平台搭建
第九章.持续集成平台搭建 (一)什么是持续集成 参考文章地址:https://blog.csdn.net/qq_32261399/article/details/76651376 敏捷软件开发(英语: ...