作业要求:简单幂函数和简单正余弦函数的导函数的求解。
与第一次作业的差别:增加了sin(x)、cos(x)以及所对应的指数形式,如sin(x)^+2
易错点:sin与cos中不能出现空格,即s i n不符合情况,与先前的常数项中不能有空格相同
个人思路:
(Ⅰ)wronginput部分
1.匹配是否出现了其他非法字符,利用将合法字符全部删除来检测是否有其他字符方法来实现。
主要调用函数:string.replaceAll();
2.以+号为分割,将各个部分分开,称之为项1.
/*这一部分有可能出现++|+-|-|--的形式,利用++为+,+-不变,-+为+-,--为+的方式进行屏蔽化简
与此同时,对于指数上出现正号的情况,利用正则表达式将其屏蔽化简,如x^+6,对应正则表达式为x\\s*\\^\\s*\\+\\s*\\d去进行化简*/
3.对于各个风格的部分,利用正则表达式去进行匹配,不合法的部分wrong输出
/*以一个包含了各个方面的正确例子为制造正则表达式
2*sin(x)^+2 * 7x+7*x*8*x+3*sin(x)*cos(x)*x*sinx^+3*/
4.由于在上一步进行分析的时候发现,可能会出现(中强测一定会出现)多元因子连乘的情况,所以我准备再用*号对项1进行分割,从而得到项二,对于项二利用正则表达式进行匹配,对于不合法的项wrong输出。
/*先利用trim将项2的前后空格去掉,这样在匹配过程中就会减少对于\\s的匹配,从而提升利用率
项2的合法正则表达式:
[+-]?[(sin)(cos)]?\\s*\\(x\\)(\\s*\\^\\s*\\d*)? || [+-]?\\s*\\d*\\s*
*/
(Ⅱ)rightinput部分
1.经过wronginput检测后,可以确定所有空格对本表达式均无害,所以将全部空格去掉化简
/*主要调用函数:string.replaceAll("\\s","');
*/
2.将整个表达式进行符号的化简,依旧采用+号进行分割的方式,我们将分出的项称为项1,同wrongingput中的第二步相同
/*这一部分有可能出现++|+-|-|--的形式,利用++为+,+-不变,-+为+-,--为+的方式进行屏蔽化简
与此同时,对于指数上出现正号的情况,利用正则表达式将其屏蔽化简,如x^+6,对应正则表达式为x\\s*\\^\\s*\\+\\s*\\d去进行化简*/
3.将项1中的式子进行乘法化简
/*具体化简有:以*号去划分项1中的每一项得到项2,继而将项2中相同性质的项进行乘法运算,如
这里有个小坑就是-sin(x)应该先做一个分解,将其变为-1*sin(x),+同上
\\d*\\d得到常数1
x^\\d * x^\\d 得到x项
sin(x)\\^\\d * sin(x)\\^\\d 得到sin项
cos(x)\\^\\d * cos(x)\\^\\d 得到cos项
化简到最后的情况会变为(\\d*\\*)?(x\\^(-)?\\d*\\*)?(sin\\(x\\)\\^(-)?\\d*\\*)?(cos\\(x\\)\\^(-)?\\d*\\*)
即:num1*x^num2*sin(x)^num3*cos(x)^num4
*/
4.将化简之后的式子进行求导
/*我们将所有整合后的式子全部变为num1*x^num2*sin(x)^num3*cos(x)^num4这样的标准形式
这样再求导的过程中,可以直接利用通式
num1*num2*x^(num2-1)*sin(x)^num3*cos(x)^num4+num1*num3*x^(num2)*sin(x)^(num3-1)*cos(x)^(num4+1)-num1*num4*x^(num2)*sin(x)^(num3+1)*cos(x)^(num4-1)
从而可以得到求导的结果*/
5.将求导后的式子进行化简
通过寻找求导后的式子是否有相同的x、sinx、cosx的指数从而去进行一个同类项的合并
为了使得化简更加的精炼,我们对上一步求导后返回各项的系数,指数,即新的num11,num12,num13,num14,+num12,num22,num32,num42,+num13,num23,num33,num43
共12组数字,并采用空格与+号进行分割
如果num11、num12、num13为0,那么第一组|第二组|第三组不做处理
接着将非零的项用ArrayList存起来
如果num12,num13,num14与后置相同
那么合并同类项进行num11的计算,将原项删除,并且将合并的项动态数组ArrayList存起来
6.输出化简得项
结束程序
wa点:sin(x)^ sin (x) 23+sin(x)*+3+x^8 +++x \f1 \v1 +++ +
1*+1 x*+-1 x*++1
以上纯属个人观点,作者是个小白,编程这一块比较弱,欢迎各位大神指正。