C语言 出指数正号省略,2019-BUAA-OO-第一次作业(简单函数求导)

设定

首先是一些基本概念的声明:

带符号整数 :支持前导0的带符号整数,符号可省略,如: +02、-16、19260817等。

幂函数:

一般形式 由自变量x和指数组成,指数为一个带符号整数,如:x ^ +2。

省略形式 当指数为1的时候,可以采用省略形式,如:x。

项:

变量项

带有系数的幂函数,如:2 * x ^ 2、-1 * x。

系数为1的时候,可以省略系数或表示为正号开头的形式,如:x ^ 2、+ x ^ 2。

系数为-1的时候,可以表示为负号开头的形式,如:-x ^ 2。

常数项 包含一个带符号整数,如:+233。

表达式:

由加法和减法运算符连接若干项组成,如: -1 + x ^ 233 - x ^ 06。此外,在第一项之前,可以带一个正号或者负号,如:- -1 + x ^ 233、+ -2 + x ^ 19260817。注意,空串不属于合法的表达式。

空白字符:

在本次作业中,空白字符包含且仅包含和\t。

此外,值得注意的几点是:

带符号整数内不允许包含空白字符。

幂函数、项、表达式,在不与上一条矛盾的前提下,可以在任意位置包含任意数量的空白字符。

如果某表达式存在不同的解释方式,则只要有任意一条解释中是合法的,该表达式即为合法。

描述:

求导是数学计算中的一个计算方法,它的定义就是,当自变量的增量趋于零时,因变量的增量与自变量的增量之商的极限。

在本次作业中,我们要对输入的多项式进行求导计算,并输出它的导函数。

*本次作业可能用到的求导公式是 *

$$

Ⅰ. 当f\left(x\right) = a(a为常数)时,f'\left(x\right) = 0

$$

$$

Ⅱ. 当f(x) = ax{b}时,f'(x) = abx{b-1}

$$

例如:

$$

当f(x) = 2x6+6x4时,f'(x) = 12x5+24x3

$$

输入为2*x^6+6*x^4,输出为12*x^5+24*x^3。

判定

输入模式:

输入中,包含且仅包含一行,表示一个表达式。

输出模式:

关于输出,首先程序需要对输入数据的合法性进行判定

如果是一组合法的输入数据(即符合上述的表达式基本规则),则应当输出一行,表示求出的导函数。格式同样需要满足上述的表达式基本格式规则。

如果是一组不合法的输入数据,则应当输出一行WRONG FORMAT!

解题思路:

1.从C语言到Java语言的思想转化

学习面向对象思想,面向对象的三个基本特征:继承、封装、多态。

用C语言写程序的时候,我们常常把程序写成流程化形式,分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了(即面向过程编程);而面向对象编程是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

举个例子:(中国象棋游戏)

(1)面向过程步骤就是:1、开始游戏,2、红方先下,3、判断是否吃棋并绘制画面,4、判断输赢,5、换黑方下棋,6、与步骤3、4一样,8、返回步骤2,9、输出最后获胜结果。把上面每个步骤按照顺序依次用不同的函数来实现。

(2)面向对象则是:1、棋子对象(红黑两方),这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,判断是否吃棋以及输赢。面向对象是以功能来划分问题,而不是步骤。

2.对象与类的定义

对象:是对客观事物的抽象。

类:对对象的抽象。

或许对这两个概念还是很迷糊,(其实还会把自己给说绕了哈哈哈)。不过说个例子就能明白了。

例如:“女生”是一个类(class),“男生”也是一个类,但“你”和“我”是一个对象(emm我算撩你吗?没有对象怎么面向对象编程)。

12c6ef32f0927861654dd6b845d4f330.png

百度百科解释:它们的关系是,对象是类的实例,类是对象的模板。对象是通过new className产生的,用来调用类的方法;类的构造方法 。

对象还具有属性、方法(C语言的函数)之类的……

类类型的声明:

1 class 类名

2 {

3 public:

4 //公用的属性和成员方法

5 protected:

6 //保护的属性和成员方法

7 private:

8 //私有的属性和成员方法

9 }

3.Main方法的定义

public static void main(String[] args){

……

}

public:代表该函数的访问是最大的。

static:代表着主函数随着类的加载就已经存在了。

void:主函数没有具体的返回值。

main:不是关键字,是一个特殊的单从,可以被jvm识别。

(String[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组。

4.正则表达式的匹配

此题的关键就是利用正则表达式对输入格式进行匹配,只有输入的多项式符合格式,才能进行计算。

具体的正则表达式大家可以百度或者博客搜索,有很多详细的描述和讲解。

正则表达式的匹配需要用到Java里的 1 import java.util.regex.Matcher; 2 import java.util.regex.Pattern; 这两个包。具体用法不多说啦。

"([ \t]*[-+]?[ \t]*[-+]?((\\d+([ \t]*\\*[ \t]*x([ \t]*\\^" +

"[ \t]*[-+]?\\d+)?)?)|([ \t]*x([ \t]*\\^[ \t]*[-+]?\\d+)?))" +

"[ \t]*)([ \t]*[-+][ \t]*[-+]?((\\d+([ \t]*\\*[ \t]*x([ \t]*" +

"\\^[ \t]*[-+]?\\d+)?)?)|([ \t]*x([ \t]*\\^[ \t]*[-+]?\\d+)?" +

"))[ \t]*)*+";

5.排序与合并同类项

由于考虑到性能问题(就是求导结果的字符串长短问题),我们需要对求导结果的字符串进行合并同类项,需要用到动态数组之类的方法,例如Arraylist与sort连用。

6.遇到的问题及bug

注意:

1.空白字符比较坑,有可能你的程序运行报错,可能是匹配出现了问题;

2.由于Matcher包的方法所限制,当“+”或“*”过多时,自测500个“+x”字符串就会导致栈溢出,此时可采用单步匹配,可以解决问题,更建议使用独占模式(可以搜索贪婪、懒惰、独占模式);

3.注意正则表达式的正确性,即合法格式;

4.输出结果可以为最简式,0次方不出现,1次方可省略等。

标签:OO,函数,对象,步骤,BUAA,2019,输入,求导,表达式

来源: https://www.cnblogs.com/ye-buaasece/p/10497047.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值