|
在易语言中,若想计算字符串文本内容,例如“((1+32)*12+6/3*)123456-1234”这样复杂的内容
在 JavaScript 中,可以通过 eval() 函数来计算表达式的值。eval() 会解析并执行一个字符串作为 JavaScript 代码。
[JavaScript] 纯文本查看 复制代码 let expression = "(1+32)*12+6/3*123456-1234";
let result = eval(expression);
console.log(result);
在易语言里,也可以使用精易模块的脚本组件
一天突发奇想想做一个纯算法的的计算表达式源码,才发现超级复杂!!!
1.首先我们先对“((1+32)*12+6/3)*123456-1234”进行分析,计算顺序是 括号 →乘除 →加减 ,看起来很简单是吧,可是如何计算(1+32)的答案,再替换到((1+32)*12+6/3),再计算之后的值,需要层层解剖,下面是参考代码
[e=1 ].版本 2 变量名 | 类 型 | 静态 | 数组 | 备 注 | 类_脚本组件 | 类_脚本组件 | | | 调试输出 (类_脚本组件. [e=0 ].版本 2 变量名 | 类 型 | 静态 | 数组 | 备 注 | text | 文本型 | | | 子_text | 文本型 | | | A | 整数型 | | | B | 整数型 | | | I | 整数型 | | | 元素 | 文本型 | | 0 | 子项式 | 文本型 | | | 数组C | 文本型 | | 0 | 项式发布数量 | 整数型 | | | 项式发布符号 | 文本型 | | 0 | R | 整数型 | | | 总项式数组 | 文本型 | | 0 | 总项式 | 文本型 | | | D | 整数型 | | | W | 整数型 | | | 结果 | 文本型 | | | 数组_随机数 | 文本型 | | 0 | V | 整数型 | | | 是否加括号 | 逻辑型 | | | text_F | 文本型 | | 0 | F | 整数型 | | | text_F_数组 | 文本型 | | 0 |
text = “2+5*5+6/2*10086” text = 文本_子文本替换_批量单个对应替换 (text, { “(”, “)”, “×”, “x”, “X”, “÷”, “+”, “-”, “ ” }, { “(”, “)”, “*”, “*”, “*”, “/”, “+”, “-”, “” })是否加括号 = 真 如果真 (取文本左边 (text, 1 ) = “-”)text = “0” + text 如果真 (文本_寻找文本_分割 (text, “()”, , ) = -1 )text = “(” + text + “)”文本_逐字分割_汇编 (text, text_F)计次循环首 (取数组成员数 (text_F ), F )如果真 (text_F [F ] = “(”)是否加括号 = 假 如果真 (text_F [F ] = “)”)是否加括号 = 真 到循环尾 ()如果 (是否加括号 = 真)如果 (内部_是否为符号 (text_F [F ]) = 假)加入成员 (text_F_数组, “(”)加入成员 (text_F_数组, text_F [F ])加入成员 (text_F_数组, “)”)加入成员 (text_F_数组, text_F [F ])加入成员 (text_F_数组, text_F [F ])计次循环尾 ()加入成员 (text_F_数组, “)”)text = “”计次循环首 (取数组成员数 (text_F_数组 ), R )text = text + text_F_数组 [R ]计次循环尾 ()项式发布数量 = 文本_取中间_批量 (text, “(”, “)”, 数组C, , , , , ) 文本_取中间_批量 (text, “)”, “(”, 项式发布符号, , , , , )如果真 (项式发布数量 - 取数组成员数 (项式发布符号 ) ≠ 1 ) 计次循环首 (项式发布数量, R )如果真 (取数组成员数 (项式发布符号 ) ≠ 0 )text = 数组C [R ]文本_取枚举内层元素 (text, “(”, “)”, 元素)判断循环首 (真)I = I + 1 子项式 = 元素 [取数组成员数 (元素 )]text = 子文本替换 (text, “(” + 子项式 + “)”, 基础算式 (子项式 ), , , 真)清除数组 (元素 )文本_取枚举内层元素 (text, “(”, “)”, 元素 )如果真 (取数组成员数 (元素 ) = 1 )子项式 = 元素 [取数组成员数 (元素 )]text = 子文本替换 (text, 子项式, 基础算式 (子项式 ), , , 真)跳出循环 ()判断循环尾 ()加入成员 (总项式数组, text )计次循环尾 () 如果 (取数组成员数 (项式发布符号 ) = 0 )结果 = text 计次循环首 (取数组成员数 (总项式数组 ) + 取数组成员数 (项式发布符号 ), I )如果 (文本_判断奇偶数 (I ) = 0 )D = D + 1 总项式 = 总项式 + 项式发布符号 [D ]W = W + 1 总项式 = 总项式 + 总项式数组 [W ]计次循环尾 ()结果 = 基础算式 (总项式 )返回 (结果) (“(2+5)*5+6/2*10086”))
[/e]
[/e]
2.很好,现在解决了这个问题,那再看看如何算(a+b-c)类型的值,因为符号都是乱序,所以第一步风格全部符号和文本,再按原先位置排序,得到数组{a,“+”,b,“-”,“c”},再分成两部分,运算D={a,"+",b},再运算 结果={D,“-”,c},实际情况还会有很多分层,例如(a+b-c+d+y+u-t),又要分很多很多次计算
变量名 | 类 型 | 静态 | 数组 | 备 注 | text | 文本型 | | | TEXT_E | 文本型 | | | 数组_符号 | 文本型 | | 0 | 替换符号文本 | 文本型 | | | 数组_A | 文本型 | | 0 | 分割文本_A | 文本型 | | 0 | i | 整数型 | | | W | 整数型 | | | D | 整数型 | | | 算术_数组 | 文本型 | | 0 | 算术_子I | 整数型 | | | 算术_子数 | 文本型 | | | Y | 小数型 | | |
text = 参数 TEXT_E = 文本_子文本替换_批量_多换一_自动分割 (text, “1234567890.”, “ ”)TEXT_E = 子文本替换 (TEXT_E, “ ”, , , , 真)文本_逐字分割_汇编 (TEXT_E, 数组_符号 )替换符号文本 = 文本_子文本替换_批量单个对应替换 (参数, { “*”, “/”, “+”, “-” }, { “#”, “#”, “#”, “#” })分割文本_A = 分割文本 (替换符号文本, “#”, ) 如果真 (取数组成员数 (数组_符号 ) - 取数组成员数 (分割文本_A ) ≠ -1 )调试输出 (“错误啦!”) 计次循环首 (取数组成员数 (分割文本_A ) + 取数组成员数 (数组_符号 ), i )如果 (文本_判断奇偶数 (i ) = 0 ) W = W + 1 加入成员 (算术_数组, 数组_符号 [W ]) D = D + 1 加入成员 (算术_数组, 分割文本_A [D ])计次循环尾 () 判断循环首 (数组_寻找数组_一次 (算术_数组, “/”) ≠ 0 )算术_子I = 数组_寻找数组_一次 (算术_数组, “/”)算术_子数 = 算术_数组 [算术_子I - 1 ] + 算术_数组 [算术_子I ] + 算术_数组 [算术_子I + 1 ]删除成员 (算术_数组, 算术_子I - 1, 3 )插入成员 (算术_数组, 算术_子I - 1, 到文本 (基础单项式算法 (算术_子数 )) )判断循环尾 () 判断循环首 (数组_寻找数组_一次 (算术_数组, “*”) ≠ 0 )算术_子I = 数组_寻找数组_一次 (算术_数组, “*”)算术_子数 = 算术_数组 [算术_子I - 1 ] + 算术_数组 [算术_子I ] + 算术_数组 [算术_子I + 1 ]删除成员 (算术_数组, 算术_子I - 1, 3 )插入成员 (算术_数组, 算术_子I - 1, 到文本 (基础单项式算法 (算术_子数 )) )判断循环尾 () 判断循环首 (数组_寻找数组_一次 (算术_数组, “-”) ≠ 0 )算术_子I = 数组_寻找数组_一次 (算术_数组, “-”)算术_子数 = 算术_数组 [算术_子I - 1 ] + 算术_数组 [算术_子I ] + 算术_数组 [算术_子I + 1 ]删除成员 (算术_数组, 算术_子I - 1, 3 ) Y = 基础单项式算法 (算术_子数 )如果 (Y < 0 )加入成员 (算术_数组, “-”)加入成员 (算术_数组, 到文本 (-Y )) 删除成员 (算术_数组, 1, 1 )插入成员 (算术_数组, 算术_子I - 1, 到文本 (Y )) 判断循环尾 () 判断循环首 (数组_寻找数组_一次 (算术_数组, “+”) ≠ 0 )算术_子I = 数组_寻找数组_一次 (算术_数组, “+”)算术_子数 = 算术_数组 [算术_子I - 1 ] + 算术_数组 [算术_子I ] + 算术_数组 [算术_子I + 1 ]删除成员 (算术_数组, 算术_子I - 1, 3 )插入成员 (算术_数组, 算术_子I - 1, 到文本 (基础单项式算法 (算术_子数 )) )判断循环尾 ()返回 (算术_数组 [1 ])
3.更具上面,现在需要计算(a+b)这样的简单式子,及两个数的加减乘除,这里不包含三个数,这是最简单的,取符号左右两边,再进行算术,得出答案
如果真 (文本_是否存在_逻辑 (text, “*”)) 算数组 = 分割文本 (text, “*”, 2 )返回 (到小数 (算数组 [1 ]) × 到小数 (算数组 [2 ])) 如果真 (文本_是否存在_逻辑 (text, “/”)) 算数组 = 分割文本 (text, “/”, 2 )返回 (到小数 (算数组 [1 ]) ÷ 到小数 (算数组 [2 ])) 如果真 (文本_是否存在_逻辑 (text, “-”)) 如果 (取文本左边 (text, 1 ) = “-”) 如果 (文本_取出现次数 (text, “-”, 假) = 2 )text = 取文本右边 (text, 取文本长度 (text ) - 1 )算数组 = 分割文本 (text, “-”, 2 )如果真 (取数组成员数 (算数组 ) = 1 )插入成员 (算数组, 1, “0”)返回 (到小数 (算数组 [1]) - 到小数 (算数组 [2]))算数组 = 分割文本 (text, “-”, 2 ) 返回 (到小数 (算数组 [2 ]) - 到小数 (算数组 [1 ])) 算数组 = 分割文本 (text, “-”, 2 )返回 (到小数 (算数组 [1 ]) - 到小数 (算数组 [2 ])) 如果真 (文本_是否存在_逻辑 (text, “+”)) 算数组 = 分割文本 (text, “+”, 2 )返回 (到小数 (算数组 [1 ]) + 到小数 (算数组 [2 ])) 返回 (0)
以下附上成品代码
文本.e
(25.39 KB, 下载次数: 5)
|
|