2007年9月14日 星期五

[VB]最簡單的中置式求值法

常見的中置式求值做法,是要操作運算元堆疊和運算子堆疊,比較運算子優先順序逐一運算求值。

今天有人問我,想實驗用 VB 的 Print 指令直接求出中置式的值,例如輸入的中置式字串

"(5-3)*4/2+(2+3)"

先把運算子符號放一個陣列(例如叫 opr()),運算元數字放一個陣列(例如叫 opd()),再用 for next 依原來順序放在 Print 指令後執行

Print opr(0);opd(0);opr(1);opd(1)...

結果呢?當然是印出原運算式字串。

那有沒有辦法做到呢?其實是可以的。

他要的方法通常是在 script 語言如 VBScript 或 JavaScript 裡面的 eval() 函數。eval 函數接受一個字串參數,把字串內容當成程式語言來執行 ( 差不多是這個意思啦 ) 。但是 VB 本身不是 Script 語言,沒有 eval 函數,那怎麼辦呢?

只要讓 VB 具有 Script 功能就行啦!在 VB 的專案裡加入參考項目「 Microsoft Script Control 1.0 」就能讓 VB ( 6.0 與 2005 都試過了 ) 支援 Windows 的 Script 了。接下來,只是在程式裡宣告個 Script 物件,執行他的 eval 方法,就能達成目的,範例程式碼如下:

Dim infix As String = "(5-3)*4/2+(2+3)"
Dim sc As New ScriptControl
sc.Language = "VBSCRIPT"
Print sc.Eval(infix)

這樣就搞定了,不必再管什麼堆疊、運算子優先順序,連最煩人的字串分析都省了,怎麼樣!夠簡單吧!

只是,如果是程式設計競賽時,程式這樣寫能計分嗎?我不知道?除非比賽規則有寫明不能這麼做,否則再怎麼硬抝也可以要到分數吧。

在 google talk 上跟 huihui 聊到這個問題,他的回答是:「被我抓到就趕出場去 -_-」

後記:這方法只要用對關鍵字 ( VB eval ),在 google 上可以查到一大堆相關的資料。我只是想記下身邊曾發生過這樣的事情罷了。不過,我倒是對程式設計比賽時用這方法解題算不算分到是很感興趣。嘿!嘿!嘿!

沒有留言:

張貼留言