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。注意,空串不属于合法的表达式。
空白字符:

  在本次作业中,空白字符包含且仅包含<space>和\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我算撩你吗?没有对象怎么面向对象编程)。

2019-BUAA-OO-第一次作业(简单函数求导)

   百度百科解释:它们的关系是,对象是类的实例,类是对象的模板。对象是通过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次方可省略等。

上一篇:[BUAA软工]第一次结对作业


下一篇:BUAA软工 —— 第一次阅读作业