|
发表于 2011-10-14 17:41:42
|
显示全部楼层
江苏省南通市
[e].版本 2
.子程序 数学_表达式计算, 文本型, 公开, 计算表达式,支持+-*/.()
.参数 表达式文本, 文本型
.局部变量 表达式返回值, 双精度小数型
.局部变量 表达式代入文本, 文本型
表达式代入文本 = 表达式文本
.如果真 (校验表达式数符规范 (表达式代入文本) = 真)
.如果真 (校验表达式括号规范 (表达式代入文本) = 真)
.如果真 (校验表达式运算符规范 (表达式代入文本) = 真)
表达式返回值 = 计算表达式 (表达式代入文本)
返回 (到文本 (表达式返回值))
.如果真结束
.如果真结束
.如果真结束
返回 (“”)
.子程序 计算表达式, 双精度小数型
.参数 参_表达式文本, 文本型
.局部变量 分隔符定位, 整数型
.局部变量 左值, 双精度小数型
.局部变量 右值, 双精度小数型
.局部变量 括号内表达式求值, 双精度小数型
.局部变量 括号内表达式文本长度, 整数型
.局部变量 括号内表达式文本, 文本型
.局部变量 表达式文本修整, 文本型
.如果真 (取文本长度 (参_表达式文本) = 0)
返回 (0)
.如果真结束
表达式文本修整 = 参_表达式文本
分隔符定位 = 寻找文本 (表达式文本修整, “(”, 1, 假)
.判断循环首 (分隔符定位 > 0)
.判断开始 (分隔符定位 > 1)
.如果真 (寻找文本 (“(*+-/”, 取文本中间 (表达式文本修整, 分隔符定位 - 1, 1), 1, 假) > 0)
括号内表达式文本 = 取括号内表达式 (表达式文本修整, 分隔符定位 + 1)
括号内表达式文本长度 = 取文本长度 (括号内表达式文本)
括号内表达式求值 = 计算表达式 (括号内表达式文本)
括号内表达式文本 = 到文本 (括号内表达式求值)
.如果真 (括号内表达式文本 = “1.#INF” 或 括号内表达式文本 = “-1.#INF”)
返回 (括号内表达式求值)
.如果真结束
表达式文本修整 = 取文本左边 (表达式文本修整, 分隔符定位 - 1) + 括号内表达式文本 + 取文本右边 (表达式文本修整, 取文本长度 (表达式文本修整) - (分隔符定位 + 括号内表达式文本长度 + 1))
.如果真结束
.默认
括号内表达式文本 = 取括号内表达式 (表达式文本修整, 分隔符定位 + 1)
括号内表达式文本长度 = 取文本长度 (括号内表达式文本)
括号内表达式求值 = 计算表达式 (括号内表达式文本)
括号内表达式文本 = 到文本 (括号内表达式求值)
.如果真 (括号内表达式文本 = “1.#INF” 或 括号内表达式文本 = “-1.#INF”)
返回 (括号内表达式求值)
.如果真结束
表达式文本修整 = 取文本左边 (表达式文本修整, 分隔符定位 - 1) + 括号内表达式文本 + 取文本右边 (表达式文本修整, 取文本长度 (表达式文本修整) - (分隔符定位 + 括号内表达式文本长度 + 1))
.判断结束
分隔符定位 = 寻找文本 (表达式文本修整, “(”, 分隔符定位 + 1, 假)
.判断循环尾 ()
分隔符定位 = 寻找文本 (表达式文本修整, “+”, 2, 假)
.如果真 (分隔符定位 > 0)
左值 = 计算表达式 (取文本左边 (表达式文本修整, 分隔符定位 - 1))
右值 = 计算表达式 (取文本右边 (表达式文本修整, 取文本长度 (表达式文本修整) - 分隔符定位))
返回 (左值 + 右值)
.如果真结束
分隔符定位 = 寻找文本 (表达式文本修整, “-”, 2, 假)
.如果真 (分隔符定位 > 0)
.如果真 (寻找文本 (“(*+-/”, 取文本中间 (表达式文本修整, 分隔符定位 - 1, 1), 1, 假) ≤ 0)
左值 = 计算表达式 (取文本左边 (表达式文本修整, 分隔符定位 - 1))
右值 = 计算表达式 (取文本右边 (表达式文本修整, 取文本长度 (表达式文本修整) - 分隔符定位))
返回 (左值 - 右值)
.如果真结束
.如果真结束
分隔符定位 = 寻找文本 (表达式文本修整, “*”, 1, 假)
.如果真 (分隔符定位 > 0)
左值 = 计算表达式 (取文本左边 (表达式文本修整, 分隔符定位 - 1))
右值 = 计算表达式 (取文本右边 (表达式文本修整, 取文本长度 (表达式文本修整) - 分隔符定位))
返回 (左值 × 右值)
.如果真结束
分隔符定位 = 寻找文本 (表达式文本修整, “/”, 1, 假)
.如果真 (分隔符定位 > 0)
左值 = 计算表达式 (取文本左边 (表达式文本修整, 分隔符定位 - 1))
右值 = 计算表达式 (取文本右边 (表达式文本修整, 取文本长度 (表达式文本修整) - 分隔符定位))
返回 (左值 ÷ 右值)
.如果真结束
分隔符定位 = 寻找文本 (表达式文本修整, “^”, 1, 假)
.如果真 (分隔符定位 > 0)
左值 = 计算表达式 (取文本左边 (表达式文本修整, 分隔符定位 - 1))
右值 = 计算表达式 (取文本右边 (表达式文本修整, 取文本长度 (表达式文本修整) - 分隔符定位))
返回 (求次方 (左值, 右值))
.如果真结束
.判断开始 (取文本左边 (表达式文本修整, 1) = “-”)
返回 (-1 × 到数值 (取文本右边 (表达式文本修整, 取文本长度 (表达式文本修整) - 1)))
.默认
返回 (到数值 (表达式文本修整))
.判断结束
.子程序 校验表达式数符规范, 逻辑型
.参数 参_表达式文本, 文本型
.局部变量 i, 整数型
.局部变量 单个代码, 整数型
.变量循环首 (1, 取文本长度 (参_表达式文本), 1, i)
单个代码 = 取代码 (取文本中间 (参_表达式文本, i, 1), )
.判断开始 (单个代码 < 40 或 单个代码 > 57) ' 代码40-47 = 字符()*+,-./ 代码48-57 = 字符0-9
返回 (假)
.判断 (单个代码 = 44) ' 代码44 = 字符,
返回 (假)
.默认
.判断结束
.变量循环尾 ()
返回 (真)
.子程序 校验表达式运算符规范, 逻辑型
.参数 参_表达式文本, 文本型
.局部变量 i, 整数型
.局部变量 数码记录, 整数型
.局部变量 负号记录, 整数型
.局部变量 运算符记录, 整数型
.局部变量 左括号记录, 整数型
.局部变量 右括号记录, 整数型
.局部变量 文本长度, 整数型
.局部变量 单个代码, 整数型
数码记录 = 0
负号记录 = 0
运算符记录 = 0
左括号记录 = 0
右括号记录 = 0
文本长度 = 取文本长度 (参_表达式文本)
.变量循环首 (1, 文本长度, 1, i)
单个代码 = 取代码 (取文本中间 (参_表达式文本, i, 1), )
.判断开始 (单个代码 = 42 或 单个代码 = 43 或 单个代码 = 47) ' *+/
' 校验运算符
.如果真 (运算符记录 > 0 或 i = 1 或 i = 文本长度)
返回 (假)
.如果真结束
运算符记录 = 运算符记录 + 1
.判断 (单个代码 = 45) ' -
.判断开始 (i = 1 或 左括号记录 > 0)
' 校验负号
.如果真 (负号记录 > 0)
返回 (假)
.如果真结束
负号记录 = 负号记录 + 1
.默认
' 校验运算符
.如果真 (运算符记录 > 0 或 i = 文本长度)
返回 (假)
.如果真结束
运算符记录 = 运算符记录 + 1
.判断结束
.判断 (单个代码 = 40) ' (
.判断开始 (运算符记录 = 0 且 数码记录 > 0)
返回 (假)
.默认
左括号记录 = 左括号记录 + 1
.判断结束
.判断 (单个代码 = 41) ' )
.判断开始 (运算符记录 > 0)
返回 (假)
.默认
右括号记录 = 右括号记录 + 1
.判断结束
.判断 (单个代码 ≥ 48 且 单个代码 ≤ 57) ' 0-9
.判断开始 (左括号记录 > 0 且 运算符记录 = 0 且 数码记录 > 0)
返回 (假)
.判断 (右括号记录 > 0 且 运算符记录 = 0)
返回 (假)
.默认
负号记录 = 0
运算符记录 = 0
左括号记录 = 0
右括号记录 = 0
.判断结束
数码记录 = 数码记录 + 1
.默认
.判断结束
.变量循环尾 ()
返回 (真)
.子程序 校验表达式括号规范, 逻辑型
.参数 参_表达式文本, 文本型
.局部变量 i, 整数型
.局部变量 括号记录, 整数型
.局部变量 单个代码, 整数型
括号记录 = 0
.变量循环首 (1, 取文本长度 (参_表达式文本), 1, i)
单个代码 = 取代码 (取文本中间 (参_表达式文本, i, 1), )
.判断开始 (单个代码 = 40) ' (
括号记录 = 括号记录 + 1
.判断 (单个代码 = 41) ' )
括号记录 = 括号记录 - 1
.默认
.判断结束
.如果真 (括号记录 < 0)
跳出循环 ()
.如果真结束
.变量循环尾 ()
.判断开始 (括号记录 = 0)
返回 (真)
.默认
返回 (假)
.判断结束
.子程序 取括号内表达式, 文本型
.参数 参_表达式文本, 文本型
.参数 参_左括号后首字符定位, 整数型
.局部变量 i, 整数型
.局部变量 括号记录, 整数型
.局部变量 单个代码, 整数型
' 获取()内容
括号记录 = 0
.变量循环首 (参_左括号后首字符定位, 取文本长度 (参_表达式文本), 1, i)
单个代码 = 取代码 (取文本中间 (参_表达式文本, i, 1), )
.判断开始 (单个代码 = 40) ' (
括号记录 = 括号记录 + 1
.判断 (单个代码 = 41) ' )
括号记录 = 括号记录 - 1
.默认
.判断结束
.如果真 (括号记录 = -1)
跳出循环 ()
.如果真结束
.变量循环尾 ()
返回 (取文本中间 (参_表达式文本, 参_左括号后首字符定位, i - 参_左括号后首字符定位))
[/e]
这个应该够四则运算了把 |
|