Re: [VB6 ] 計算機

看板Visual_Basic作者 (小獅子)時間19年前 (2005/06/11 16:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串33/51 (看更多)
※ 引述《TrueFeeling (昨日之死)》之銘言: : 沒想到竟然也可以算次方,可是我想不出原理是什麼 : 如果說程式執行到^的時候,字串已經裡面不會再有加減乘除號了, : 這樣 : p = InStr(s, "^") : If p > 0 Then GoSub SplitProc: F = F(op1) ^ F(op2): GoTo EndProc : 這邊就可以理解 : 但是這邊 : ElseIf op1 = "^" Then : p = p - 1: GoSub SplitProc : 如果-前面有^,後面有*, : 例如:Eval(5^-3*2)的時候 : 照理說,我沒有設定Eval=Eval(op1) ^ Eval(op2): : (因為設了會出錯) : Eval(5^-3*2)應該無法分割,但是答案卻出乎我預料的正確@@!! 怎麼可能正確 你 F 那行就錯誤了 ... 正確程式碼是這樣... Public Function Eval(s As String) Dim p As Integer, op1 As String, op2 As String, o As String Static c As Integer: c = c + 1 If c = 1 Then s = Replace(s, " ", "") p = InStr(s, "+") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc If s Like "-*" Then p = 2 Else p = 1 p = InStr(p, s, "-") If p > 0 Then op1 = Mid(s, p - 1, 1) If op1 = "+" Then p = p - 1: GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc ElseIf op1 = "-" Then p = p - 1: GoSub SplitProc: Eval = Eval(op1) - Eval(op2): GoTo EndProc ElseIf op1 = "*" Then p = p - 1: GoSub SplitProc: Eval = Eval(op1) * Eval(op2): GoTo EndProc ElseIf op1 = "/" Then p = p - 1: GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc ElseIf op1 = "^" Then Else GoSub SplitProc: Eval = Eval(op1) + Eval("-" & op2): GoTo EndProc End If End If p = InStr(s, "*") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) * Eval(op2): GoTo EndProc p = InStr(s, "/") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc p = InStr(s, "^") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) ^ Eval(op2): GoTo EndProc Eval = Val(s) EndProc: c = c - 1: Exit Function SplitProc: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return End Function 為什麼 ElseIf op1 = "^" Then p = p - 1: GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc 會錯誤,我算了一下, 是因為 ^ 的優先等級的問題... 因為 ^ 這個運算子的優先等級比 * 、 / 還要高 所以優先順序應該是 ^ / * - + 程式要反過來變成 + - * / ^ ElseIf op1 = "^" 的下面那行全部消掉, p = p - 1: Gosub SplitProc 根本也沒意義 ^ 這個運算子是要留在最後處理的,所以在 ElseIf 這裡就不做處理 如果真的打成這樣... ElseIf op1 = "^" Then p = p - 1: GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc 會變成 5 ^ (-3 * 2) 正確的結果應該是 (5 ^ -3) * 2 -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43
文章代碼(AID): #12ggQG7c (Visual_Basic)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 33 之 51 篇):
10
19
2
3
文章代碼(AID): #12ggQG7c (Visual_Basic)