开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 168|回复: 3
收起左侧

[技术专题] 超厉害纯算法的字符串文本计算!!!

[复制链接]
结帖率:100% (1/1)
发表于 5 天前 | 显示全部楼层 |阅读模式   江西省抚州市
易语言中,若想计算字符串文本内容,例如“((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);


在易语言里,也可以使用精易模块的脚本组件
  
变量名类 型静态数组备 注
类_脚本组件类_脚本组件 
调试输出 (类_脚本组件.计算表达式 (“(2+5)*5+6/2*10086”))


i支持库列表   支持库注释   
spec特殊功能支持库

一天突发奇想想做一个纯算法的的计算表达式源码,才发现超级复杂!!!
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
' 调试输出 (基础算式0 (“1+1.5+5/51*0”))
' 结束 ()
' “(4*3)+(3*4)”
' text = “1/((4*3+4*3)+2)”
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 = 文本_子文本替换_批量_多换一_自动分割 (子_text, “1234567890”, “”)
' 寻找文本 (, , , )
文本_取中间_批量 (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]

计次循环尾 ()
结果 = 基础算式 (总项式)
返回 (结果)


i支持库列表   支持库注释   
spec特殊功能支持库
(“(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 = 分割文本 (替换符号文本, “#”, )
' 通常符号比数字少1个
如果真 (取数组成员数 (数组_符号)取数组成员数 (分割文本_A) ≠ -1)
调试输出 (“错误啦!”)
' * 数组:2{“+”,“/”}
' * 数组:3{“1”,“2”,“2”}
' 调试输出 (数组_符号)
' 合并数组:
计次循环首 (取数组成员数 (分割文本_A)取数组成员数 (数组_符号), i)
如果 (文本_判断奇偶数 (i) = 0)
' 偶数
W = W + 1
加入成员 (算术_数组, 数组_符号 [W])
' 奇数
D = D + 1
加入成员 (算术_数组, 分割文本_A [D])

计次循环尾 ()
' 算术_数组
' * 数组:5{“1”,“+”,“2”,“/”,“2”}
' 这里先算除法
判断循环首 (数组_寻找数组_一次 (算术_数组, “/”) ≠ 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])


i支持库列表   支持库注释   
spec特殊功能支持库



3.更具上面,现在需要计算(a+b)这样的简单式子,及两个数的加减乘除,这里不包含三个数,这是最简单的,取符号左右两边,再进行算术,得出答案
  
子程序名返回值类型公开备 注
基础单项式算法小数型 
参数名类 型参考可空数组备 注
text文本型
变量名类 型静态数组备 注
算数组文本型0
' 调试输出 (text, , )
如果真 (文本_是否存在_逻辑 (text, “*”))
' 乘法 = 真
算数组 = 分割文本 (text, “*”, 2)
返回 (到小数 (算数组 [1]) × 到小数 (算数组 [2]))
如果真 (文本_是否存在_逻辑 (text, “/”))
' 除法 = 真
算数组 = 分割文本 (text, “/”, 2)
返回 (到小数 (算数组 [1]) ÷ 到小数 (算数组 [2]))
如果真 (文本_是否存在_逻辑 (text, “-”))
' 减法 = 真
如果 (取文本左边 (text, 1)“-”)
' 调试输出 (text)
如果 (文本_取出现次数 (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)

签到天数: 5 天

发表于 昨天 22:33 | 显示全部楼层   湖南省郴州市
学习学习
回复 支持 反对

使用道具 举报

结帖率:100% (14/14)

签到天数: 21 天

发表于 3 天前 | 显示全部楼层   广东省江门市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:98% (49/50)

签到天数: 5 天

发表于 4 天前 | 显示全部楼层   河南省信阳市
不错 玩的可以
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表