大家好,是公号3分钟学堂的郭立员,今天给大家带来的是《字符串中的多项加减法运算(运算类型验证码)》有网友问了一个关于验证码中需要计算的问题,如下图:
具体问题是这样:如何得到这个“14-45+60-28=”字符串的运算结果,问题难点在于字符串是不能直接进行计算加减法的,那么我们只能把字符串中的各个数字和符号逐一提取出来,然后按照符号的运算规则(相加或相减),把所有数字重新计算一遍得到最终的结果。
有了操作思路,那下面说说具体的操作过程:
第一步:获取所有数字,并存入数组当中。
使用方法是正则匹配,在之前文章《提取你想要的内容(正则匹配的简单介绍)》有详细介绍,这里直接上代码。
第二步:获取所有的运算符号,也存入数组。
这一步稍微难一些,我也是通过正则匹配得到的,使用了字符集[%+%-],这个字符集的意思是匹配结果只有两种(加号或者减号)
第三步:判断运算符号是什么(加号还是减号)
这里面a和b是数字,f是运算符号,通过if判断对ab进行计算。
第四步:多项加减法运算方法。
所谓多项就是不只有两个数字,就拿本次案例来说,有四个数字需要计算,因为只运算加减法,所以不需要考虑计算优先级的问题,从左往右逐个数字进行计算即可。
这里有一个思路难点,怎么把所有数字都运算一遍。初期我的想法是前一个数字和后一个数字进行运算,依次把所有数字执行一遍。
但是实际操作过程发现不是这样的,要前面运行结果和下一个数字进行运算。
比如:14-45+60-28=它的运行过程是
14-45=-31
-31+60=29
29-28=1
只有第一次计算是相邻两个数字,后面都是上一步运算结果和下一个数字计算。
那么我们操作的时候,加一个判断,当首次计算的时候,用相邻两数字计算,其余的用前面运行结果和下一个数字进行计算。
最终我们看看运行结果:
代码如下:
Import "shanhai.lua"
Dim m="14-45+60-28="
Dim arr=shanhai.RegexFind (m, "%d+")
Dim fuhao=shanhai.RegexFind (m, "([%+%-]+)")
Dim d=0
For i = 0 To UBOUND(fuhao)
If i = 0 Then
d = 计算(arr(i), arr(i + 1), fuhao(i))
Else
d=计算(d, arr(i + 1), fuhao(i))
End If
TracePrint d
Next
TracePrint d
Function 计算(a, b,f)
If f = "+" Then
计算 = a + b
ElseIf f = "-" Then
计算=a-b
End If
End Function
好了本期内容就这些