找回密码
 点一下
查看: 2064|回复: 5

~~~☆才不是什么笨蛋的代数式求值呢!☆~~~

[复制链接]
发表于 2011-11-6 11:25:00 | 显示全部楼层 |阅读模式
唔~好吧,其实素前一阵子写得东西~
不过一直很忙所以米有时间转过来的说...        
效果嘛,描述起来很简单的说~就素让war3变聪明,可以看懂数学表达式并且算出来~        
乃们可不要小瞧这个,越是看似简单的东西越不容易的说~        
下面素效果图的说~
(无PS,非外部程序,运算结果由于单精度浮点型的缘故,所以有一些误差呢...)














☆支持的运算符如下

+ - * /四则运算
% 取模运算
tan cos sin 三角函数
sqrt 平方根
pow 幂运算
abs 绝对值
() 括号,支持多重嵌套
☆关于原理~
唔......很久以前就想做一个数学式子识别了但是一直米有思路呢~
这次的方法是偶然碰到的,嘛,简单来说,类似 前缀表达式 的思想~

    2+3-5

这个我们常用的数学式(其实叫中缀表达式),用前缀表达式写出来,就素下面:

    + 2 - 3 5

很多童鞋可能要问了,这个方式有什么好的?看起来又别扭又麻烦,连怎么读、计算都不知道~
确实,这并不是人常用的思维方式,而是利用栈,是适合计算机的思维方式~

    对于前缀表达式,运算基本可以按照下面法则进行~

    ①从右端开始,依次读取被空格隔开的值~
    ②如果是数字,则将其压入一个栈~
           0:| 5    【栈底】
           1:| 3    【栈顶】
           2:| 无
           3:| 无
           4:| 无

    ③如果是运算符(加减乘除之类的),则对栈顶数字进行运算~
           0:| 5    【栈底】
           1:| 3    【栈顶】

             ↓  { - 减号 运算符 }

           0:| 3-5=-2    【新栈顶】【只有1个元素,同时也是栈底】
           1:| 无

    ④循环②~③,直到读取至表达式最左端~
    ⑤最后栈顶的值,就是整个表达式的结果咯~
        
嘛,以上的话,实现起来并不复杂,但是注意了哟~
星这个,可是能够计算 普通的数学表达式 的说~

为了实现这个,只需要有一个函数,把中缀表达式转换成前缀表达式~

当然这里的并不是标准前缀表达式,因为多了函数形式的表示以及逗号~


实现这个的话,要稍稍复杂一些的说~
    * 因为过程过于复杂~
    * 仅提供部分逻辑思路~
    * 如果想理解的话,请下载研究具体实现代码~
    * 从中缀表达式右边开始读取~
    * 准备一个运算符栈,并且给运算符编优先级(加减 1;乘除取模 2;^乘方 3)
    * 如果是数字或其他字符,直接输出~
    * 如果是右括号")",直接入运算符栈~
    * 如果是运算符,则比较优先级。如果当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),则将运算符直接入栈;否则将栈顶运算符出栈并输出,直到当前运算符的优先级大于等于栈顶运算符的优先级,再将当前运算符入栈。(星懒的写了,此条引用度受百科的说~)
    * 如果是左括号"(",则将运算符栈中的运算符依次清栈,直到碰到一个右括号,则将两个括号一并删除,停止~
    * (例,运算符栈:{+ - * ) * / + },入左括号则,输出 + / * ,并删除那个 ")" )
    * 如果到达表达式最左端,则输出所有运算符~
    * 如果遇到逗号,则输出运算符,直到遇到右括号为止~
    * 遇到减号时,特定情况下,需要处理:设置某一标记为true,接下来如果碰到其他非空格、非括号、非逗号字符,则标记为false~
    * 在输出栈中运算符的时候(左括号,表达式最左端,逗号),补输出一个0~注意顺序~

真素卡帕的规则的说~
☆后话呢的说~
首先还素放出下载呢的说~:
Prefix&InfixExpr by wow8 夜の星.w3x (18 KB, 下载次数: 17)
星表示这个东西有以下用途:
    ①好玩~
    ②卖萌~(自粽X2)
    ③计算器
    ④用war3画函数~
    ⑤学术研究~
    ⑥动态轨迹~比如击退之类的~
    ⑦拓展出去,求解方程之类的说~
    ......

其实像EXCEL之类的,功能的核心就是这种字串识别~
这种功能其实素起到了非常重要的作用的哦~
      
      
☆存在的某些小问题~
唔~单论功能的话,这个其实已经很完美了,至少星自己还米有试出能出错的数据~

第一的话,这个的效率可能不素很乐观,毕竟要经过大量的字符比对,逻辑判断等~

第二,函数运算过程中会不可避免的生成大量字符串,war3的string泄漏不可逆~

不过,作为一个卖萌物,它已经无可挑剔了的说!~哼~

评分

参与人数 1威望 +31 收起 理由
zhuzeitou + 31 GJGJ~~

查看全部评分

发表于 2011-11-6 11:37:15 | 显示全部楼层
在WOW8的时候木有看呢……当时看着感觉乱乱的。。
不知为何在刚才看着看着就懂了……
果然我还是喜欢GA的界面吗~
回复

使用道具 举报

 楼主| 发表于 2011-11-6 11:38:56 | 显示全部楼层
话说星表示基本上素直接复制过来的说......

嘛~如果配上一个求导数的函数的话,就能解方程了~
回复

使用道具 举报

发表于 2011-11-6 14:46:10 | 显示全部楼层
其实也有想过用T做计算器,不过难度不是一般的大,最终放弃……

内容来自[手机版]
回复

使用道具 举报

发表于 2011-11-13 18:46:18 | 显示全部楼层
太深奥了,不懂。
回复

使用道具 举报

发表于 2011-11-25 21:12:32 | 显示全部楼层

回 2楼(夜の星) 的帖子

夜の星:话说星表示基本上素直接复制过来的说......

嘛~如果配上一个求导数的函数的话,就能解方程了~ (2011-11-06 11:38) 
能弄贝塞尔函数什么的吗?泰勒展开什么的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-20 02:00 , Processed in 0.248932 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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