找回密码
 点一下
查看: 3484|回复: 7

算术表达式求值(尚未完成,过几天再补)

[复制链接]
发表于 2012-6-5 23:42:36 | 显示全部楼层 |阅读模式
请保证自己有jass基础和高中数学基础,至于这个东西有什么用,我是不会说的
首先来一个jass函数
[jass]
function GetSubString takes string source, integer index returns string
    return SubString(source,index-1,index)
endfunction
[/jass]
一个表达示由运算符和运算量组成,例如:“3+5”3和5示运算量,+号是运算符,运算符需要几个运算量,便叫几元运算符,比如+和-做正号或负号时为一元运算符,做加和减为二元运算符,但为了某些方便.
   除了 + - * / 四种运算符
  我还自己自定义了几种,%:取余 ,sin:正弦,cos:余弦,tan:正切,++:自增1,--:自减1
  他们的运算优先权为:++,--,sin,cos,tan > (+(正号),-(负号))(事实上,本人系统不支持这个优先权) > *,/,% > +(加) , -(减)。我们还需要两个栈结构(你不用知道他是什么),和一个取得运算符优先权的函数。
[jass]
globals
real array Ods
integer Ods_Top = -1
string array Ops
integer Ops_Top = -1
string array Operator
endglobals
function Init_OperatorPower takes nothing returns nothing
    set Operator[0] = ""
    set Operator[1] = "-"
    set Operator[2] = "+"
    set Operator[3] = "%"
    set Operator[4] = "/"//这个我无法保证能通过编译,可能要写成“//"
    set Operator[5] = "sin"
    set Operator[6] = "cos"
    set Operator[7] = "tan"
    set Operator[8] = "++"
    set Operator[9] = "--"
    set Operator[10] = "//"//这个我无法保证能通过编译,可能要写成“////"
    set Operator[11] = "**"
endfunction
//This function requires MapInitialize the run
function GetOperatorPower takes string operator returns integer
    local integer i = 0
    loop
       exitwhen i >= 12
        if Operator == operator then
             return i
        endif
        set i = i + 1
   endloop
endfunction
[/jass]

经过痛苦的思考,我发现加入了++和--运算符导致写出了算式十分古怪,而且我差点不知道怎么写代码,本来想一次性改掉了,只支持最原始
的,但是人怎么能偷懒了,于是呼,我有加入**和//,这两个是乘方和开方,到底算式有多古怪了,恩,本来是要支持如+++1++++++1++这种算
式的,孩子,你看晕了吧。确实可以写这么多的加,但是我技术有限,只能支持++1+++++1++不支持正负号)。下面给出算法流程图,这是个
好东西啊!

未标题-2.jpg

但是还有个问题需要解决,那就是空格的问题,我们需要一个函数去掉所有的空格,我们需要遍历字符串
,把空格给删掉
[jass]
function DeleteSpace takes string source returns string
    local integer long = StringLength(source)
    local integer i = 1
    local string front
    local string beside
    loop
        exitwhen i > long
        if GetSubString(source,i) == " " then
            set front = SubStringBJ(source,1,i - 1)
            set beside = SubStringBJ(source,i + 1,long)
            set source = front + beside
            set long = StringLength(source)
            set i = i - 2
        endif
        set i = i + 1
    endloop
    return source
endfunction
[/jass]
接下来是栈操作,两个数组分别需要两个函数(push和pop)
[jass]
function OdsPush takes real number returns nothing
set Ods_Top = Ods_Top + 1
set Ods[Ods_Top] = number
endfunction
function OdsPop takes nothing returns real
local real temp = Ods[Ods_Top]
set Ods[Ods_Top] = 0
set Ods_Top = Ods_Top - 1
return temp
endfunction
function OpsPush takes string source returns nothing
set Ops_Top = Ops_Top + 1
set Ops[Ops_Top] = source
endfunction
function OpsPop takes nothing returns string
local string temp = Ops[Ops_Top]
set Ops[Ops_Top] = null
set Ops_Top = Ops_Top - 1
return temp
endfunction
[/jass]
过几天再补上来啊,尽管写一半就发上来是不对,不过我不好把这些东西保存啊,在网吧
发表于 2012-6-7 07:54:45 | 显示全部楼层
算作支持一下吧
采用波兰式还是逆波兰式呢?
回复

使用道具 举报

 楼主| 发表于 2012-6-7 13:58:56 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:算作支持一下吧
采用波兰式还是逆波兰式呢? (2012-06-07 07:54)
  难道还需要波兰和逆波兰吗?
                    直接按正常语序写,接着计算。
   没必要把算式转成那种形式(那个我也不会,编译原理没看懂)
   现在还在想把法区分++和--这种运算符的前缀和后缀.....
  问一个很纠结的问题,怎样检查语法错误.........
回复

使用道具 举报

发表于 2012-6-7 17:21:33 | 显示全部楼层
直接写不方便运算的
如1+2*3+5*5*5这种
读取到2的时候你不知道是不是应该计算1+2……

关于逆波兰式我也不是很懂……
不是学计算机的,没编程基础

http://blueve.me/archives/318
可以看这里,貌似这里的最容易理解了

算法都给出了
语法的问题很简单
可以转换的就是没错误
回复

使用道具 举报

 楼主| 发表于 2012-6-7 20:31:15 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:直接写不方便运算的
如1+2*3+5*5*5这种
读取到2的时候你不知道是不是应该计算1+2……

关于逆波兰式我也不是很懂……
....... (2012-06-07 17:21)
  兄弟 ,你没看上面的流程图...
  1+2*3,读到3根本不会发生计算..知道读到下一个才发生*法运算
   ....  
   我这个 其实就是逆波兰的直接求解版本
   边压栈,边计算了...  
逆波兰的算法需要所有的东西压栈再计算
   刚看了一下他的算法,确实可以,为我提供了括号的写法,不过栈结构就要写过了....
         我这个上面算法跟他的没有多大区别
回复

使用道具 举报

发表于 2012-6-7 23:55:43 | 显示全部楼层
哦,我来看看了呀。支持了
回复

使用道具 举报

发表于 2012-6-22 23:48:05 | 显示全部楼层
逆波兰式说白了就是表达式的后缀表示法。好处是表达式本身蕴涵优先级。基于栈,可以很方便使得计算机理解和求值。
正常的数学表达式为中缀表示法
如 1+3*2+2*(1+2)
其后缀表达式(逆波兰式)即为 132*+212+*++
转换成逆波兰式后 计算非常方便 扫描式子(实际上是依次入栈) 遇到操作符就取出该操作符之前的两个数(栈顶和栈顶下面一个)进行该操作符运算,并将结果入栈。继续根据该规则运算直至结束。
回复

使用道具 举报

发表于 2012-7-7 14:04:40 | 显示全部楼层
这是程序设计的基础。。。
表示高中奥赛的基本要求就是计算表达式
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:45 , Processed in 0.038298 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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