oo第一次总结博客
一. 多项式求导问题描述
基本概念的声明:
带符号整数 支持前导 0 的带符号整数,符号可忽略,如:
+02
、-16
、19260817
等。因子
- 变量因子
- 幂函数
- 一般形式 由自变量x和指数组成,指数为一个带符号整数,如:
x ^ +2
。且,指数绝对值一律不得超过$ {10}^4 $。 - 省略形式 当指数为1的时候,可以采用省略形式,如:
x
。
- 一般形式 由自变量x和指数组成,指数为一个带符号整数,如:
- 三角函数
sin(x)
,cos(x)
,另外,本指导书范围内所有的词语“三角函数”,除非特殊说明,否则一律包含且仅包含上述两个函数)- 一般形式 类似于幂函数,由
sin(x)
,cos(x)
和指数组成,指数为一个带符号整数,如:sin(x) ^ +2
。同样的,指数绝对值一律不得超过${10}^{4}$。 - 省略形式 当指数为1的时候,可以采用省略形式,省略指数部分,如:
sin(x)
。
- 一般形式 类似于幂函数,由
- 幂函数
- 常数因子 包含一个带符号整数,如:
233
。 - 表达式因子 将在表达式的相关设定中进行详细介绍。不过,表达式因子不支持幂运算。
- 嵌套因子 本次作业将支持因子嵌套在三角函数因子里面,即一个因子作为另一个三角函数因子的自变量,例如
sin(x^2)
,cos(sin(x))
以及sin(sin(cos(cos(x^2))))^2
等。但是不允许出现指数为变量的情况,指数依然只能是带符号整数,例如sin(x) ^ sin(x)
是不合法的,因为指数不是自变量。也不允许幂函数的自变量为除了x
之外的因子,例如1926^0817
是不合法的,因为幂函数的自变量只能为x
。
- 变量因子
项表达式 由加法和减法运算符等若干项组成,如:
(-1 + x ^ 233)* sin(x^2) ^ 06 - cos(sin(x)) * 3 * sin((x))
。此外,在第一项之前,可以带一个正号或者负号,如:- -1 + x ^ 233、+ -2 + x ^ 1926
。此处有几点注意:空白字符 在本次作业中,空白字符包含且仅包含<space>
和\t
。其他的除了上述会用到的字符之外,均属于非法字符。- 一般形式由乘法运算符连接若干任意因子组成,如:
x * cos(x) * x
,sin(x ^ 2) * cos(sin(x)) ^ 2 * x ^ -2
等。- 项内因子不仅仅是同类因子
- 特殊形式
- 第一个因子为常数因子 1 且其后跟着乘号的时候,可以省略该常数因子或表示为正号开头的形式,如:
x ^ 2 * x ^ -1
、+ x ^ 2
、+ cos(x) * cos(x)
、sin(x) * cos(x)
。 - 第一个因子为常数因子 -1 且其后跟着乘号的时候,可以表示为负号开头的形式,如:
-x ^ 2、- cos(x) * sin(x)
。
- 第一个因子为常数因子 1 且其后跟着乘号的时候,可以省略该常数因子或表示为正号开头的形式,如:
- 一般形式由乘法运算符连接若干任意因子组成,如:
表达式因子,表达式可以作为因子,其定义为被一对小括号包裹起来的表达式,即我们允许诸如
(x * cos(x))
这种式子的出现空串不属于合法的表达式
二. 程序结构分析
1.类和方法设计综述
Polynomial: 控制输入输出,接受外部输入的字符串并将其传入Poly类中进行实际操作
public class Polynomial { public static void main(String[] args) {
Scanner input = new Scanner(System.in); if (input.hasNextLine()) {
String str = input.nextLine();
input.close();
if (str.trim().isEmpty()) {
System.out.println("WRONG FORMAT!");
System.exit(0);
} Poly p = new Poly(str); if (p.illegalString()) {
System.out.println("WRONG FORMAT!");
} else if (p.irregularString()) {
System.out.println("WRONG FORMAT!");
} else {
p.output();
}
} else {
System.out.println("WRONG FORMAT!");
}
}
}
Poly
首先判断输入的字符串是否存在非法输入:非法字符、不该出现空白符的地方出现空白符。若输入的字符串符合输入规则,则将空白符号去掉。
按照表达式的构成规则将字符串分割为项,同时初始化一个Experssion类存储当前的表达式
按照项的构成规则将字符串分割为因子,同时初始化一个Factor类存储当前的项
按照因子的不同种类分别求出该因子的底数与指数,同时初始化一个Item类存储当前因子
(若2,3,4步出现不该出现的情况则返回true,程序输入“WRONG FORMAT!”并推出)
public boolean illegalString() {
...
} public boolean findExpression(final int begin, final int end,
final Expression curExp) {
Factor fac = new Factor();
if (judgeFactor(i, j, fac)) {
return true;
}
....
} public boolean judgeFactor(int left, int right, Factor fac) {
Item ite = new Item();
if (judgeItem(i, j, ite, leftTmp + 1)) {
return true;
}
fac.getFactors().add(ite);
....
} public boolean judgeItem(final int left, final int right, final Item ite,
final int begin) {
....
}
Item
public class Item {
private BigInteger coe;
private BigInteger idx;
private BigInteger curCoe;
private BigInteger curSelfcoe;
private int type;
private int variableX = 0;
private ArrayList<Expression> chain = new ArrayList<Expression>(); public String getDerivation() {
....
} public String getSelf() {
....
}
Factor
public class Factor {
private int op;
private ArrayList<Item> factors = new ArrayList<Item>(); public String getDerivation() {
....
} public String getSelf() {
....
}
Expression
public class Expression extends Item {
private ArrayList<Factor> expression = new ArrayList<Factor>(); public ArrayList<Factor> getExp() {
return this.expression;
} public String getDerivation() {
....
} public String getSelf() {
....
}
Expression, Factor, Item中均有getSelf和getDerivation方法,以此实现链式求导。
2.UML图展示
3.优缺点分析
优点:
在最开始设计时按照多项式,项,因子层层递进的思想设计使得后续作业改动较小
按要求进行链式法则求导设计,减少了繁琐的求导过程
合理地将重复使用的函数封装为方法,减少了工作量。
缺点:
在最后一次作业中并没有进行大规模的优化,但其实可以做一下简单的同类项合并
在处理输入时应当适当运用正则表达式,这样可以减少一部分工作量,否则就会出现在对输入进行判断时出现大量布尔表达式的情况
代码风格仍然有待提高。
在阅读指导书时要认真仔细否则会导致细节失分严重。
三. 程序问题总结- -未通过的样例及其原因分析
未通过样例 |
原因分析 |
++641310706398282959093109711020261029178921763*x^-7100862071031683371053510210321531010574509245101-+29457694746621086265146643351091037558161089*x^+29457694746621086265146643351091037558161089。。。 |
在阅读指导书时要仔细,注意在指导书中已经暗示会出现大数,因此应该在所有指数和系数出现的地方均用BigInteger进行记录 |
(((((((((((((((((((-4*cos(x)^3+3*cos(x))))))))))))))))))))) |
没有考虑括号的嵌套(默认表达式由一对括号括起来) |
++(sin(x)) |
忘记考虑多项式因子前也可以将1省略为+ |
四. 对象创建模式分析
总的来讲,设计模式可分为三类
- 创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。
- 结构型模式:把类或对象结合在一起形成一个更大的结构。
- 行为型模式:类和对象如何交互,及划分责任和算法。
借鉴博客:https://www.cnblogs.com/pony1223/p/7608955.html 中的示意图可将23种设计模式表示如下:
目前已经在课上接触过得模式大体有五种:
- 单例模式:某个类只能有一个实例,提供一个全局的访问点。
- 简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类的实例。
- 工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。
- 抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。
- 建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。
以第三次作业为例,可以粗略将第三次作业归为工厂模式,但实际的程序设计仍与工厂模式有一定差异。在第三次作业种,Expression,Facotr以及Item均实现了getSelf以及getDeriviation方法,但每个类中的这两种方法又存在一定差异。希望在之后的程序设计种能够更好地遵循标准设计模式
五. 心得体会
1. 第一部分的作业相对难度不是很大,可能是因为还没有到多线程部分,但仍然提醒我要注意细节,否则因为细节失分不划算。
2. 由于之前利用java编程较少,因此前三次作业也是对java编程语言学习的很好机会。
3.逐渐体会到面向对象编程设计的思想和方法,希望之后在之后的作业中能继续努力。
oo第一次总结博客的更多相关文章
- OO第二次博客作业—17373247
OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...
- 第一次写博客Poj1044
Date bugs Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3005 Accepted: 889 Descript ...
- Beta版本——第一次冲刺博客
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- 第一次写博客,关于前端开发deMVC在js中的应用
对前端MVC MVC分别是model.view.controller的缩写,模型.视图.控制器.这些更加偏向于后台,在以前MVC是只属于后台的.当然随着技术的进步,前端的大牛们将后台的一些东西应用于前 ...
- HDU 2064 菜鸡第一次写博客
果然集训就是学长学姐天天传授水铜的动态规划和搜索,今天讲DP由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...
- OO第二次博客作业——电梯调度
OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...
- (转)第一次发博客-说说我的B/S开发框架(asp.net mvc + web api + easyui)
原文地址:http://www.cnblogs.com/xqin/archive/2013/05/29/3105291.html 前言 这些年一直在.net下做企业web系统开发,前前后后经历的不同的 ...
- 第一次的博客-简单的Markdown语法
第一次开通博客 从网上寻找了许多写博客的方法 我觉得对于我来说还是使用 Markdowm 比较容易一些 用我的第一篇博客来记一下一些比较简单常用的Markdown语法 本文参考来源Markdown语法 ...
- OO第二次博客作业(第二单元总结)
在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...
随机推荐
- for循环、while循环、break、continue、exit
1. for循环 语法:for 变量名 in 条件; do …; done案例1 #!/bin/bashsum=0for i in `seq 1 100`do# echo "$sum + $ ...
- windows下启动mysql服务
当你无法连接你的mysql数据库时,或者因为某些原因导致与mysql数据库的连接丢失时,可通过以下方式启动mysql服务 1.命令行下启动mysql服务 以管理员身份运行cmd,进入mysql安装目录 ...
- 使用CMake生成解决方案后构建INSTALL报错
错误 1 error MSB3073: 命令“setlocal"D:\Program Files\CMake\bin\cmake.exe" -DBUILD_TYPE=Debug - ...
- 第五章JavaScript
创建数组://1.字面量方式创建 (推荐大家使用这种方式创建数组 简单粗暴) var colors = ['red','color','yellow'];console.log(colors) //空 ...
- Mvc Session 设置以后再构造函数中取值时为null问题
在登录界面写了一个session在 别的页面的构造函数中获取始终未null 后来改成 System.Web.HttpContext.Current.Session["User"] ...
- Java高级特性 第7节 多线程
一.进程与线程的概念 1. 进程 进程是应用程序的执行实例,有独立的内存空间和系统资源. 如上图,标红色的是一个Office Word进程. 进程的特点: 动态性:进程是动态的创建和消亡: 并发性:操 ...
- Unity3D外包 团队更新一下UE4和Unity3D案例
欢迎联系我们索取,谢谢! 有项目外包请联系QQ:372900288 索取案例.
- promise 基础知识
promise 基础知识 proise:1.Promise是异步编程的一种解决方案,它有三种状态,分别是pending-进行中.resolved-已完成.rejected-已失败2.创建实例//met ...
- 【dbdiff】数据库比对工具安装
安装git 忽略 安装visual c++组件(和mysql workbench需要的一样) https://www.microsoft.com/en-us/download/details.aspx ...
- shell脚本命令远程连接ssh并执行命令
环境: redhat 6.5 根据网上提供方法,测试了很多写法都不成功,测试了很久才有了以下脚本. 命令远程连接ssh并执行命令,scp/ftp等远程连接操作同理: #!/usr/bin/expect ...