求易语言高手帮我编写一个函数, 函数功能:根据一个变量公式,求这

2025-01-01 09:32:45
推荐回答(1个)
回答1:

.版本 2
.程序集 窗口程序集1
.子程序 分析公式, , , 处理公式
.参数 公式, 文本型
.参数 加工后公式, 文本型
.参数 最终公式, 文本型, 数组
.参数 变量名, 文本型, 数组
.参数 常数文本集, 文本型, 数组
.参数 加, 整数型, 数组
.参数 减, 整数型, 数组
.参数 乘, 整数型, 数组
.参数 除, 整数型, 数组
.参数 乘方, 整数型, 数组
.局部变量 计数, 整数型
.局部变量 计次, 整数型
.局部变量 a, 整数型
.局部变量 b, 整数型
.局部变量 运算符位置, 整数型
.局部变量 起始位置, 整数型
.局部变量 目前位置, 整数型
.局部变量 替换长度, 整数型
.局部变量 试文本, 文本型
清除数组 (加)
清除数组 (减)
清除数组 (乘)
清除数组 (除)
清除数组 (乘方)
加工后公式 = 公式
起始位置 = 1
.循环判断首 () ' 这个把所有运算符和变量替换成“a”
试文本 = 取文本中间 (加工后公式, 起始位置, 1)
.判断开始 (试文本 = “+”)
加工后公式 = 文本替换 (加工后公式, 起始位置, 1, “a”)
.判断 (试文本 = “-”)
加工后公式 = 文本替换 (加工后公式, 起始位置, 1, “a”)
.判断 (试文本 = “*”)
加工后公式 = 文本替换 (加工后公式, 起始位置, 1, “a”)
.判断 (试文本 = “/”)
加工后公式 = 文本替换 (加工后公式, 起始位置, 1, “a”)
.判断 (试文本 = “^”)
加工后公式 = 文本替换 (加工后公式, 起始位置, 1, “a”)
.默认
.计次循环首 (取数组成员数 (变量名), 计数)
.判断开始 (试文本 = 变量名 [计数])
加工后公式 = 文本替换 (加工后公式, 起始位置, 1, “a”)
.默认
.判断结束
.计次循环尾 ()
.判断结束
起始位置 = 起始位置 + 1
.循环判断尾 (起始位置 ≤ 取文本长度 (加工后公式))
常数文本集 = 分割文本 (加工后公式, “a”, ) ' 这里用a分割文本
a = 0
.计次循环首 (取数组成员数 (常数文本集), 计数) ' 这里删除空文本,提取出常数文本
.判断开始 (常数文本集 [计数 - a] = “”)
删除成员 (常数文本集, 计数 - a, )
a = a + 1
.默认
.判断结束
.计次循环尾 ()
加工后公式 = 公式
起始位置 = 1
目前位置 = 1
.循环判断首 () ' 这里把公式里所有常数都换成“b”并记录在加工后公式
替换长度 = 0
试文本 = 取文本中间 (加工后公式, 目前位置, 1)
.判断循环首 (试文本 = “0” 或 试文本 = “1” 或 试文本 = “2” 或 试文本 = “3” 或 试文本 = “4” 或 试文本 = “5” 或 试文本 = “6” 或 试文本 = “7” 或 试文本 = “8” 或 试文本 = “9” 或 试文本 = “.”)
替换长度 = 替换长度 + 1
目前位置 = 目前位置 + 1
试文本 = 取文本中间 (加工后公式, 目前位置, 1)
.判断循环尾 ()
.判断开始 (替换长度 ≠ 0)
加工后公式 = 文本替换 (加工后公式, 起始位置, 替换长度, “b”)
.默认
.判断结束
目前位置 = 目前位置 + 1
起始位置 = 目前位置
.循环判断尾 (起始位置 ≤ 取文本长度 (加工后公式))
重定义数组 (最终公式, 假, 取文本长度 (加工后公式)) ' 定义最终公式的成员数并清除其数据
起始位置 = 1
.循环判断首 () ' 计算乘方个数并记录位置
运算符位置 = 寻找文本 (加工后公式, “^”, 起始位置, 假)
.判断开始 (运算符位置 ≠ -1)
加入成员 (乘方, 运算符位置)
起始位置 = 运算符位置 + 1
.默认
.判断结束
.循环判断尾 (运算符位置 ≠ -1)
起始位置 = 1
.循环判断首 () ' 计算乘个数并记录位置
运算符位置 = 寻找文本 (加工后公式, “*”, 起始位置, 假)
.判断开始 (运算符位置 ≠ -1)
加入成员 (乘, 运算符位置)
起始位置 = 运算符位置 + 1
.默认
.判断结束
.循环判断尾 (运算符位置 ≠ -1)
起始位置 = 1
.循环判断首 () ' 计算除个数并记录位置
运算符位置 = 寻找文本 (加工后公式, “/”, 起始位置, 假)
.判断开始 (运算符位置 ≠ -1)
加入成员 (除, 运算符位置)
起始位置 = 运算符位置 + 1
.默认
.判断结束
.循环判断尾 (运算符位置 ≠ -1)
起始位置 = 1
.循环判断首 () ' 计算加个数并记录位置
运算符位置 = 寻找文本 (加工后公式, “+”, 起始位置, 假)
.判断开始 (运算符位置 ≠ -1)
加入成员 (加, 运算符位置)
起始位置 = 运算符位置 + 1
.默认
.判断结束
.循环判断尾 (运算符位置 ≠ -1)
起始位置 = 1
.循环判断首 () ' 计算减个数并记录位置
运算符位置 = 寻找文本 (加工后公式, “-”, 起始位置, 假)
.判断开始 (运算符位置 ≠ -1)
加入成员 (减, 运算符位置)
起始位置 = 运算符位置 + 1
.默认
.判断结束
.循环判断尾 (运算符位置 ≠ -1)
起始位置 = 1
b = 0
.计次循环首 (取文本长度 (加工后公式), 计数) ' 这里把分好的变量、运算符、常数都按公式顺序排序入最终公式
试文本 = 取文本中间 (加工后公式, 计数, 1)
.判断开始 (试文本 = “+”)
最终公式 [计数] = 试文本
.判断 (试文本 = “-”)
最终公式 [计数] = 试文本
.判断 (试文本 = “*”)
最终公式 [计数] = 试文本
.判断 (试文本 = “/”)
最终公式 [计数] = 试文本
.判断 (试文本 = “^”)
最终公式 [计数] = 试文本
.判断 (试文本 = “b”)
b = b + 1
最终公式 [计数] = 常数文本集 [b]
.默认
.计次循环首 (取数组成员数 (变量名), 计次)
.判断开始 (试文本 = 变量名 [计次])
最终公式 [计数] = 变量名 [计次]
.默认
.判断结束
.计次循环尾 ()
.判断结束
.计次循环尾 ()

.子程序 运算, , , 计算公式
.参数 运算类型, 整数型, 数组
.参数 运算结果, 双精度小数型, 数组
.参数 变量, 双精度小数型, 数组
.参数 变量名, 文本型, 数组
.参数 过渡公式, 文本型
.参数 最终公式, 文本型, 数组
.参数 运算法则, 文本型
.局部变量 计数, 整数型
.局部变量 计次, 整数型
.局部变量 判断变量与否, 逻辑型
.局部变量 左, 双精度小数型
.局部变量 右, 双精度小数型
重定义数组 (运算结果, 假, 取数组成员数 (运算类型))
.计次循环首 (取数组成员数 (运算结果), 计数)
判断变量与否 = 假
.计次循环首 (取数组成员数 (变量名), 计次)
.判断开始 (最终公式 [运算类型 [计数] - 2 × (计数 - 1) - 1] = 变量名 [计次])
左 = 变量 [计次]
判断变量与否 = 真
.默认
.判断结束
.计次循环尾 ()
.如果真 (判断变量与否 = 假)
左 = 到数值 (最终公式 [运算类型 [计数] - 2 × (计数 - 1) - 1])
.如果真结束
判断变量与否 = 假
.计次循环首 (取数组成员数 (变量名), 计次)
.判断开始 (最终公式 [运算类型 [计数] - 2 × (计数 - 1) + 1] = 变量名 [计次])
右 = 变量 [计次]
判断变量与否 = 真
.默认
.判断结束
.计次循环尾 ()
.如果真 (判断变量与否 = 假)
右 = 到数值 (最终公式 [运算类型 [计数] - 2 × (计数 - 1) + 1])
.如果真结束
.判断开始 (运算法则 = “乘方”)
运算结果 [计数] = 求次方 (左, 右)
.判断 (运算法则 = “乘”)
运算结果 [计数] = 左 × 右
.判断 (运算法则 = “除”)
运算结果 [计数] = 左 ÷ 右
.判断 (运算法则 = “加”)
运算结果 [计数] = 左 + 右
.判断 (运算法则 = “减”)
运算结果 [计数] = 左 - 右
.默认
.判断结束
最终公式 [运算类型 [计数] - 2 × (计数 - 1) - 1] = 到文本 (运算结果 [计数]) ' 这里把已算过的部分压缩成运算结果
删除成员 (最终公式, 运算类型 [计数] - 2 × (计数 - 1), 2)
.计次循环尾 ()
过渡公式 = “”
计数 = 0
.计次循环首 (取数组成员数 (最终公式), 计数) ' 这里重新排布压缩后的公式
过渡公式 = 过渡公式 + 最终公式 [计数]
.计次循环尾 ()

.子程序 变量公式运算, 双精度小数型, , 不支持括号,运算符有:+、-、*、/、^
.参数 公式, 文本型, , 变量请按A,B,C……,Z顺序写,不要例如:A+C+D
.参数 变量组, 双精度小数型, 数组, 按顺序分别为A,B,C……,Z
.局部变量 加工后公式, 文本型
.局部变量 过渡公式, 文本型
.局部变量 最终公式, 文本型, , "0"
.局部变量 变量, 双精度小数型, , "0"
.局部变量 计数, 整数型
.局部变量 同变量第一个位置, 整数型
.局部变量 变量名, 文本型, , "0"
.局部变量 加, 整数型, , "0"
.局部变量 减, 整数型, , "0"
.局部变量 乘, 整数型, , "0"
.局部变量 除, 整数型, , "0"
.局部变量 乘方, 整数型, , "0"
.局部变量 常数文本集, 文本型, , "0"
.局部变量 乘方结果, 双精度小数型, , "0"
.局部变量 乘结果, 双精度小数型, , "0"
.局部变量 除结果, 双精度小数型, , "0"
.局部变量 加结果, 双精度小数型, , "0"
.局部变量 减结果, 双精度小数型, , "0"
.局部变量 结果, 双精度小数型
.计次循环首 (26, 计数) ' 这里计算有多少种变量并记录变量名
同变量第一个位置 = 寻找文本 (公式, 字符 (64 + 计数), , 假)
.判断开始 (同变量第一个位置 ≠ -1)
加入成员 (变量名, 字符 (64 + 计数))
.默认
.判断结束
.计次循环尾 ()
重定义数组 (变量, 假, 取数组成员数 (变量名)) ' 输入变量数据
.计次循环首 (取数组成员数 (变量), 计数)
变量 [计数] = 变量组 [计数]
.计次循环尾 ()
分析公式 (公式, 加工后公式, 最终公式, 变量名, 常数文本集, 加, 减, 乘, 除, 乘方) ' 这里进行复杂的多则运算
运算 (乘方, 乘方结果, 变量, 变量名, 过渡公式, 最终公式, “乘方”)
分析公式 (过渡公式, 加工后公式, 最终公式, 变量名, 常数文本集, 加, 减, 乘, 除, 乘方)
运算 (乘, 乘结果, 变量, 变量名, 过渡公式, 最终公式, “乘”)
分析公式 (过渡公式, 加工后公式, 最终公式, 变量名, 常数文本集, 加, 减, 乘, 除, 乘方)
运算 (除, 除结果, 变量, 变量名, 过渡公式, 最终公式, “除”)
分析公式 (过渡公式, 加工后公式, 最终公式, 变量名, 常数文本集, 加, 减, 乘, 除, 乘方)
运算 (加, 加结果, 变量, 变量名, 过渡公式, 最终公式, “加”)
分析公式 (过渡公式, 加工后公式, 最终公式, 变量名, 常数文本集, 加, 减, 乘, 除, 乘方)
运算 (减, 减结果, 变量, 变量名, 过渡公式, 最终公式, “减”)
结果 = 到数值 (最终公式 [1])
返回 (结果)

把以上内容全部复制粘贴到易语言里就行了,你要使用此函数(变量公式运算)就把它当成命令,注意看看子程序中参数的类型,还有,参数变量组的成员数必须跟公式中变量的种类数相同,否则运行会出错,例如:
.版本 2
.子程序 _按钮1_被单击
.局部变量 变量组, 双精度小数型, , "2"
变量组 [1] = 到数值 (编辑框2.内容)
变量组 [2] = 到数值 (编辑框3.内容)
编辑框1.内容 = 到文本 (变量公式运算 (编辑框1.内容, 变量组))

若还不懂就问我~