本周我们迎来第一项任务,java面向对象之实现对一串字符的匹配以及构造出计算的多项式,最终得出计算的结果。简而言之,可以用以下的要求来看题目:
- 输入的多项式字符串中不得出现非法字符
- 多项式的输入型式,{多项式 1}+{多项 式 2}-…… +{多项式 n},多项式内部格式为{(c1,n1),(c2,n2),…,(cm,nm)}
- 其中多项式的输入个数不得超过20个,同时多项式的内部数据的对数不会超过50对
- 输入中的所有空格应该被过滤掉
- 在本次编程过中, 对 于数(c,n),c为系数, 有-10^6<c<10^6(即 c前面可以 有‘ -’) , n为幂, 有 0<=n<10^6,即 c最大为 6位十进制整数, 位十进制整数, n最大为 6位十进 制整数。所有均可能出现前导 制整数。所有均可能出现前导 0,但 c和 n除去符号位之外的长度分别不超过 6和 6。
- 对于所有的不合法的输入,程序要给出响应,即输出为“ERROR”
那我们社会人应该怎么解决这道题目呢?
如果按照面向流程的思路设计,我们以c语言为例,首先是判断输入是否合法,采用的方法是对输入进行输入流判断,然后就是一路遍历,取出合法的多项式,然后构成多项式,最后进行计算,而作为初入面向对象的小白来说,第一次作业就用面向对象来写,着实有些困难,所以在下还是用一个C语言的形式来实现这个作业了,那么我是具体如何实现的呢?
首先是正则表达式:对于转换可以大家可以自行搜索,主要讲一下正则表达式的匹配的吧,对于该问题,我是这样考虑的,从整体的多项式的结构来看,我们分析其中的字符特点,有以下几个特点:
- 对于输入字符串的第一个和最后一个字符,只能是‘{’和‘}‘,当然这里是过滤了开头的字符,因为那本身并没有太大意义
- 统计输入字符串,对于合法的输入,‘{’的个数一定等于‘}’的个数,一定等于“\{(\([+-]?[0-9]{1,6},(([+]?[0-9]{1,6})|([-]?[0]{1,6}))\),){0,49}\([+-]?[0-9]{1,6},(([+]?[0-9]{1,6})|([-]?[0]{1,6}))\)\}”的个数,且一定比”\}[+-]\{“多一个,所以我们采用统计这几类正则表达式的个数来判断输入字符串是否合法
- 在统计的过程中对输入的个数进行判断,
- 最后我们提取出每一个多项式,并在多项式中提取出数字
- 根据之前我们在分段时候采用的”\}[+-]\{”,将计算符号记录下来,最后进行计算,
关于正则匹配的代码
public static void find(String All_2, String str_num) {
Pattern p_2 = Pattern.compile(str_num);
Matcher m_2 = p_2.matcher(All_2);
while(m_2.find() && result4==1) {
formula(big, m_2.group(), no_5);
big++;
}
}
这里ALL_2,表示输入的字符串,str_num表示多项式的正则表达式,find()函数就是找出符合条件的多项式,在find()内部调用formula的作用是分析多项式,取出数字,为了计算多项式的个数我们采用了m.find()方法,而不是matches(),是正则表达式的完全匹配,而find()是包含匹配,所以能过找到多个不同的符合条件的式子,其实对于这一过程使用split也可以达到同样的效果。之后的计算以及输出过程就不做过多的叙述了。