精華區beta Visual_Basic 關於我們 聯絡資訊
小弟這次作業想做計算機 但是我一直不知道我的程式問題出在哪 有人可以幫在下看一下嗎 現在最大的困難在於要將text輸入的字元轉換成數學表示式 於是我就先嘗試作數字的加減運算, 目前用InStr嘗試將+-號作為分割字串的標準 能請大大們幫我看看哪裡出錯了嗎 Dim A() As Double Dim B() As String Dim G() As Double Private Sub Command1_Click(I As Integer) Text1.Text = Text1.Text + Command1(I).Caption End Sub Private Sub Command2_Click(I As Integer) Text1.Text = Text1.Text + Command2(I).Caption End Sub Private Sub Command3_Click() H = Text1.Text C = Len(Text1.Text) N = 0 D = "+" Or "-" Do ReDim Preserve A(N) ReDim Preserve B(M) A(N) = InStr(1, H, "D") If A(N) = 0 Then B(N) = H: Exit Do B(N) = Left(H, A(N) - 1) H = Right(H, C - A(N)) N = N + 1 Loop H = Text1.Text For I = 0 To N ReDim Preserve G(N) G(N) = Val(B(N)) Next I For I = 0 To N If Mid(H, A(I), 1) = "+" Then G(I + 1) = Val(G(I + 1)) Else G(I + 1) = -Val(G(I + 1)) End If Next I Sum = 0 For I = 0 To N Sum = Sum + G(I) Next I Label1.Caption = Sum End Sub Private Sub Command4_Click() Text1.Text = "" End Sub Private Sub Command5_Click() End End Sub -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.88.136
fumizuki:command1 和command2 怎麼會有參數... 61.222.155.162 06/09
fumizuki:Or 不是這樣用的 61.222.155.162 06/09
fumizuki:instr 的第三個參數為"D" ? 61.222.155.162 06/09
TrueFeeling:因為那些參數是用來做計算機按鈕的 218.162.88.136 06/09
fumizuki:參數不能自訂吧 61.222.155.162 06/09
TrueFeeling:可以阿 218.162.88.136 06/09
fumizuki:你把你的表單架構說明一下吧 61.222.155.162 06/09
fumizuki:事件參數不能自訂... 61.222.155.162 06/09
TrueFeeling:只要複製貼上他的Index就會一直增加 218.162.88.136 06/09
fumizuki:有一定的規則在... 61.222.155.162 06/09
fumizuki:是Index ,不是I 61.222.155.162 06/09
fumizuki:把你的表單架構說明一下,或把檔案上傳... 61.222.155.162 06/09
TrueFeeling:正在上傳 218.162.88.136 06/09
TrueFeeling:一開始是Index 後來我把他改成I 218.162.88.136 06/09
fumizuki:這樣你連編譯都不會過... 61.222.155.162 06/09
TrueFeeling:D適用來代替+-號的,該不會是這裡錯了吧^^ 218.162.88.136 06/09
TrueFeeling:sorry,我是初學者,請大大指導^^ 218.162.88.136 06/09
fumizuki:錯很多喔... 61.222.155.162 06/09
fumizuki:語法和語意都有錯... 61.222.155.162 06/09
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Thu Jun 9 16:12:32 2005 表單架構: 0-9 數字鍵--Command1(Index) +-*/鍵 --Command2(Index) Enter --Command3 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.88.136 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Thu Jun 9 16:14:51 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : 表單架構: : 0-9 數字鍵--Command1(Index) : +-*/鍵 --Command2(Index) : Enter --Command3 是打算輸入運算式後按enter再算出值? 還是像一般計算機一樣按下了加減乘除等於就會算出值? -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.222.155.162
TrueFeeling:輸入運算式,Enter算出值 218.162.88.136 06/09
TrueFeeling:目標是要做函數計算機 218.162.88.136 06/09
TrueFeeling:目前只先作加減,成功了才做乘除 218.162.88.136 06/09
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Thu Jun 9 16:19:58 2005 程式草稿: (有些設計一半的東西,就請大大們先略過吧orz) http://rapidshare.de/files/2267306/003.rar.html -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.88.136
TrueFeeling:忘了說,要先按下網頁下方的Free鍵, 218.162.88.136 06/09
TrueFeeling:然後才會出現下載網址 218.162.88.136 06/09
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Thu Jun 9 16:27:27 2005
fumizuki:Or 不是這樣用的 61.222.155.162 06/09
可以問一下要怎麼用嗎^^
fumizuki:instr 的第三個參數為"D" ? 61.222.155.162 06/09
我看書上寫說 第3個參數是要搜尋的東西 我用D代替+-號,電腦會不會直接用D下去算阿??orz -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.88.136 ※ 編輯: TrueFeeling 來自: 218.162.88.136 (06/09 16:27) > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Thu Jun 9 16:32:24 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ReDim Preserve A(N) : ReDim Preserve B(M) ^^^^不好意思,我原本是要打是B(N)才對 : A(N) = InStr(1, H, "D") : If A(N) = 0 Then B(N) = H: Exit Do -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.88.136 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Thu Jun 9 17:05:38 2005 我覺得寫的漫亂的, 所以解釋一下我的構思好了 使用者數入運算式-->字串-->用InStr搜尋字串裡面的+-號 -->找出+-號位置-->存入陣列A(N) 因為如果相同字串重新搜尋會找到同樣的位置,所以就把字串的前面減掉 把字串H設回沒找過的後半段,然後用迴圈的方式讓他一直找下去 另一方面: 每找出一個A(N)-->就選取A(N)之前的字串設為B(N) 由於前面的字串會一直剪掉,所以B(N)不會重複, 所選取的B(N),正是加減號中間的"數字",但是目前還是字串 然後,我再用A(N)將每一個B(N)作篩選, 如果A(N)是+號,B(N+1)就把他的字串轉為數值時設為正 如果是減號,那我就他的字串轉成數值的時候加個減號 然後再把所有的數值加起來,就完成了"字串轉換成運算式" 但是,我不知道哪裡寫錯了,請幫我抓BUG吧 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.88.136 ※ 編輯: TrueFeeling 來自: 218.162.88.136 (06/09 17:25) > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Thu Jun 9 22:21:00 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : 表單架構: : : 0-9 數字鍵--Command1(Index) : : +-*/鍵 --Command2(Index) : : Enter --Command3 : 是打算輸入運算式後按enter再算出值? : 還是像一般計算機一樣按下了加減乘除等於就會算出值? 哇哈!這種運算式真不好寫...好不容易才試了出來... 用遞迴法寫的,寫了一長串,看起來頗複雜的...~.~ Private Sub Command1_Click(Index As Integer) Text1.Text = Text1.Text & Index End Sub Private Sub Command2_Click(Index As Integer) Text1.Text = Text1.Text & Command2(Index).Caption End Sub Private Sub Command3_Click() Label1.Caption = Eval(Text1.Text) End Sub 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 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 Eval = Val(s) EndProc: c = c - 1: Exit Function SplitProc: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return End Function 1. 事件程序的命名規則及參數列是寫死的,一定要完全一樣,不然無法通過編譯。 2. Or、And 等運算子跟 + - * / 一樣,一定會算出一個值。 (語法沒錯,執行結果不對而已) 3. N 跟 "N" 是不相同的,一樣語法沒錯,但執行結果不對... ... 測試通過才貼上來的,應該是沒有問題的吧(汗) ? Eval("-2.3 * -3 / -7 + -5.6 - -6 + -2 + -3 * -2 / -1 + -0.5") ? -2.3 * -3 / -7 + -5.6 - -6 + -2 + -3 * -2 / -1 + -0.5 -9.08571428571429 -9.08571428571429 以上...XD 加、減、乘、除、負號,運算子優先順序,都有包含在內了...XD -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 15:13:03 2005 慘了.都看不懂T.T, 能不能解說一下整個思路是怎麼架構的,謝啦 還有GoSub,Return這些字我也不知道作用是什麼 Function我看書上(入門書啦)說,Function裡面的架構: 函數名=運算式 所以這種Function的寫法我也看不大懂T.T ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : 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 : 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 : Eval = Val(s) : EndProc: : c = c - 1: Exit Function : SplitProc: : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return : End Function -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 18:52:32 2005 有學過 Goto 嗎? GoSub 跟 Goto 一樣,無條件跳到指定行,但 GoSub 可以用 Return 回來。 函數名稱=運算式 的意思是傳回一個值。 這個函數(Eval)的流程是 把 s 運算式拆解並運算,先找加號,再找減號,再找乘號,再找除號, 當四個運算子都被消掉後,只剩下數值,直接傳回。 → Eval = Val(s) 例如:(以下紅色的數字代表第幾次執行 Eval,黃色代表傳回值) 原式 00 → "3 + 4 + 5 * 6 - 7" 去除所有空白 Replace(s, " ", "") 01 → "3+4+5*6-7" 找加號,將此運算式分割成前後兩組運算式 兩運算式相加 Eval(op1) + Eval(op2) 01 → "3" + "4+5*6-7" op1 = "3" 沒有四個運算子,直接傳回 02 → 3 op2 = "4+5*6-7" 找到加號,分割! 03 → "4" + "5*6-7" op1 = "4" 04 → 4 op2 = "5*6-7" 沒有加號,找到減號,分割! 05 → "5*6" - "7" 減一要改成加負一...>>>>> a - b = a + (-b) (不這麼做好像一定會有問題...有運算先後順序的問題@@") 05 → "5*6" + "-7" 沒有加號,沒有減號,找到乘號,分割!_! 06 → "5" * "6" 接下來 op1 及 op2 都是數值了 07 → 5 08 → 6 第6次執行的還沒完成... 06 → 5 * 6 = 30 第5次執行的 op2 運算式還沒處理 "-7" 前頭沒有運算元(數字),所以這個不是減號,視為負號,直接傳回 09 → -7 第5次執行的:op1 = 5 * 6 = 30,op2 = -7 05 → 30 + (-7) = 23 第3次執行的:op1 = 4,op2 = 5*6-7 = 23 03 → 4 + 23 = 27 第1次執行的:op1 = 3,op2 = 4+5*6-7 = 27 01 → 3 + 27 = 30 到此為止,全部都處理完畢了,最後傳回值是30。 vb 有一個偵錯工具列、偵錯功能表,可以利用它,來觀看執行過程。 也有快速鍵 F9 可以設中斷點,當程式執行到那一行會無條件中斷,並用一個顏色顯示中斷的那一行。 當程式中斷的時候,可以按 F5 繼續執行, 當再次遇到之前設的中斷點時,又會中斷執行。 或者在程式中斷的時候,按 F8 執行一行敘述, 在下一行中斷執行(不管下一行有沒有設中斷點)。 在程式中斷的時候,可以把滑鼠游標移到變數的上面, 停留約1秒,會顯示該變數目前的值。 這些偵錯的功能很好用,當你看不懂程式在幹麼的時候,可以用來看流程, 或執行結果有問題,不知道哪一個環節出了問題,也可以用來查看,找到錯誤的地方。 當然,不用 vb 給的工具也能偵錯,用你的頭腦偵錯:p 那是不容易的事 ~.~ 頭腦很容易混亂 ~.~ 所以工具還是好用:p 哪個語法不知道做什麼的,可以發問,最好找一本書查 去書店翻翻,書本的最後幾頁,或開頭有類似字典一樣的目錄 一些基本的關鍵字(GoSub.Return.For.Next.Do.Loop....等),都可以輕易查到。 或去 vb 研究小站 http://vb.infoserv.com.tw/ 不過他沒有關鍵字的目錄可以查 但是有所有內建函數庫可以查... ※ 引述《TrueFeeling (昨日之死)》之銘言: : 慘了.都看不懂T.T, : 能不能解說一下整個思路是怎麼架構的,謝啦 : 還有GoSub,Return這些字我也不知道作用是什麼 : Function我看書上(入門書啦)說,Function裡面的架構: : 函數名=運算式 : 所以這種Function的寫法我也看不大懂T.T -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 19:26:15 2005 首先要謝謝你拔刀相助,不然我真的不知道該怎麼辦^^ 我還是很多地方不懂想問問^^ ※ 引述《fumizuki (小獅子)》之銘言: : 有學過 Goto 嗎? : GoSub 跟 Goto 一樣,無條件跳到指定行,但 GoSub 可以用 Return 回來。 嗯,那這個我懂了 : 函數名稱=運算式 的意思是傳回一個值。 : 這個函數(Eval)的流程是 : 把 s 運算式拆解並運算,先找加號,再找減號,再找乘號,再找除號, : 當四個運算子都被消掉後,只剩下數值,直接傳回。 → Eval = Val(s) 我看書上說的是這種: Function F(X,Y,Z) F=X^2+3*Y+Z*X End Function == 呼叫: V=F(X,Y,Z) print V == 所以,我還是看不懂orz : 例如:(以下紅色的數字代表第幾次執行 Eval,黃色代表傳回值) : 原式 : 00 → "3 + 4 + 5 * 6 - 7" : 去除所有空白 Replace(s, " ", "") 嗯,這部分有3個問題: 1.當按鈕按下去後,Text1.Text顯示的字串如何傳到程式碼? (因為我沒有看到Function中有和Text1.Text的轉換關係) 2.為何字串中間會有空白? (因為數入Text1.Text的時候並沒有空白) 3. Static c As Integer: c = c + 1 If c = 1 Then s = Replace(s, " ", "") 這段程式碼中的c作用是什麼? : 01 → "3+4+5*6-7" : 找加號,將此運算式分割成前後兩組運算式 : 兩運算式相加 Eval(op1) + Eval(op2) 這部分 1.分成兩組運算式後,他們的資料型別(DataType)是? (因為如果還是字串的話,再用+連結好像又回到原本的字串了 : 01 → "3" + "4+5*6-7" : op1 = "3" : 沒有四個運算子,直接傳回 : 02 → 3 : op2 = "4+5*6-7" : 找到加號,分割! : 03 → "4" + "5*6-7" : op1 = "4" : 04 → 4 : op2 = "5*6-7" : 沒有加號,找到減號,分割! : 05 → "5*6" - "7" : 減一要改成加負一...>>>>> a - b = a + (-b) : (不這麼做好像一定會有問題...有運算先後順序的問題@@") : 05 → "5*6" + "-7" : 沒有加號,沒有減號,找到乘號,分割!_! : 06 → "5" * "6" : 接下來 op1 及 op2 都是數值了 : 07 → 5 : 08 → 6 : 第6次執行的還沒完成... : 06 → 5 * 6 = 30 : 第5次執行的 op2 運算式還沒處理 "-7" : 前頭沒有運算元(數字),所以這個不是減號,視為負號,直接傳回 : 09 → -7 : 第5次執行的:op1 = 5 * 6 = 30,op2 = -7 : 05 → 30 + (-7) = 23 : 第3次執行的:op1 = 4,op2 = 5*6-7 = 23 : 03 → 4 + 23 = 27 : 第1次執行的:op1 = 3,op2 = 4+5*6-7 = 27 : 01 → 3 + 27 = 30 : 到此為止,全部都處理完畢了,最後傳回值是30。 : vb 有一個偵錯工具列、偵錯功能表,可以利用它,來觀看執行過程。 : 也有快速鍵 : F9 可以設中斷點,當程式執行到那一行會無條件中斷,並用一個顏色顯示中斷的那一行。 : 當程式中斷的時候,可以按 F5 繼續執行, : 當再次遇到之前設的中斷點時,又會中斷執行。 : 或者在程式中斷的時候,按 F8 執行一行敘述, : 在下一行中斷執行(不管下一行有沒有設中斷點)。 : 在程式中斷的時候,可以把滑鼠游標移到變數的上面, : 停留約1秒,會顯示該變數目前的值。 : 這些偵錯的功能很好用,當你看不懂程式在幹麼的時候,可以用來看流程, : 或執行結果有問題,不知道哪一個環節出了問題,也可以用來查看,找到錯誤的地方。 : 當然,不用 vb 給的工具也能偵錯,用你的頭腦偵錯:p : 那是不容易的事 ~.~ : 頭腦很容易混亂 ~.~ : 所以工具還是好用:p : 哪個語法不知道做什麼的,可以發問,最好找一本書查 : 去書店翻翻,書本的最後幾頁,或開頭有類似字典一樣的目錄 : 一些基本的關鍵字(GoSub.Return.For.Next.Do.Loop....等),都可以輕易查到。 : 或去 vb 研究小站 http://vb.infoserv.com.tw/ : 不過他沒有關鍵字的目錄可以查 : 但是有所有內建函數庫可以查... : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : 慘了.都看不懂T.T, : : 能不能解說一下整個思路是怎麼架構的,謝啦 : : 還有GoSub,Return這些字我也不知道作用是什麼 : : Function我看書上(入門書啦)說,Function裡面的架構: : : 函數名=運算式 : : 所以這種Function的寫法我也看不大懂T.T -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 19:45:34 2005 不好意思,再問程式碼部分 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 是打算輸入運算式後按enter再算出值? : : 還是像一般計算機一樣按下了加減乘除等於就會算出值? : 哇哈!這種運算式真不好寫...好不容易才試了出來... : 用遞迴法寫的,寫了一長串,看起來頗複雜的...~.~ : Private Sub Command1_Click(Index As Integer) : Text1.Text = Text1.Text & Index : End Sub : Private Sub Command2_Click(Index As Integer) : Text1.Text = Text1.Text & Command2(Index).Caption : End Sub : Private Sub Command3_Click() : Label1.Caption = Eval(Text1.Text) : End Sub : Function Eval(s As String) 方程式名:Eval ? 方程式參數s設為字串? : 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, " ", "") 請問上面這段,c的作用是? : p = InStr(s, "+") : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc 我猜的意思是: If p > 0 -->如果有+號的話,然後執行SplitProc,不過後面就不知道為什麼 : If s Like "-*" Then p = 2 Else p = 1 我猜的意思是: 如果字串s裡面是-號後面是一串字元的話,然後後面還是看不懂 : p = InStr(p, s, "-") : If p > 0 Then 如果有減號的話,然後 : op1 = Mid(s, p - 1, 1) op1=字串中,減號的前一個字元 : If op1 = "+" Then 這邊看不懂,為什麼op1剛剛代表減號,現在為什麼代表加號 : p = p - 1: GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc p = p-1 ==>看不懂,後面也看不懂 : 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 : 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 如果字串中有/號.... : Eval = Val(s) 這裡傳回的模式也看不懂 : EndProc: : c = c - 1: Exit Function c = c - 1的作用是? : SplitProc: : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return 將字串拆成2份(以p的位置為分界點) 第1份是p的左邊 第2份是p的右邊 : End Function -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 19:46:44 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : 首先要謝謝你拔刀相助,不然我真的不知道該怎麼辦^^ : 我還是很多地方不懂想問問^^ : ※ 引述《fumizuki (小獅子)》之銘言: : : 有學過 Goto 嗎? : : GoSub 跟 Goto 一樣,無條件跳到指定行,但 GoSub 可以用 Return 回來。 : 嗯,那這個我懂了 : : 函數名稱=運算式 的意思是傳回一個值。 : : 這個函數(Eval)的流程是 : : 把 s 運算式拆解並運算,先找加號,再找減號,再找乘號,再找除號, : : 當四個運算子都被消掉後,只剩下數值,直接傳回。 → Eval = Val(s) : 我看書上說的是這種: : Function F(X,Y,Z) : F=X^2+3*Y+Z*X 傳回 X的2次方、3Y、XZ 的和 : End Function : == : 呼叫: : V=F(X,Y,Z) V=上面那個算出來的結果... : print V : == : 所以,我還是看不懂orz : : 例如:(以下紅色的數字代表第幾次執行 Eval,黃色代表傳回值) : : 原式 : : 00 → "3 + 4 + 5 * 6 - 7" : : 去除所有空白 Replace(s, " ", "") : 嗯,這部分有3個問題: : 1.當按鈕按下去後,Text1.Text顯示的字串如何傳到程式碼? : (因為我沒有看到Function中有和Text1.Text的轉換關係) Print Eval(Text1.Text) : 2.為何字串中間會有空白? : (因為數入Text1.Text的時候並沒有空白) 假設一定會有空白...這樣程式比較「活」,不會因為有空白就不能計算了... : 3. : Static c As Integer: c = c + 1 : If c = 1 Then s = Replace(s, " ", "") : 這段程式碼中的c作用是什麼? 進入函數加一,離開減一;第一次執行才做 Replace 的動作。 : : 01 → "3+4+5*6-7" : : 找加號,將此運算式分割成前後兩組運算式 : : 兩運算式相加 Eval(op1) + Eval(op2) : 這部分 : 1.分成兩組運算式後,他們的資料型別(DataType)是? 沒指定型態的話,預設是 Variant ,不固定的型態,由實際資料內容決定。 : (因為如果還是字串的話,再用+連結好像又回到原本的字串了 我給它字串,它就是字串;我給它整數,它就是整數。 字串加數字等於字串,數字加數字等於數字,字串加字串還是字串。 因為 Eval 最後傳回值一定是個數值,所以不會有型態的問題。 (傳入的值一定是字串) -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 19:57:16 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : 不好意思,再問程式碼部分 : ※ 引述《fumizuki (小獅子)》之銘言: : : 哇哈!這種運算式真不好寫...好不容易才試了出來... : : 用遞迴法寫的,寫了一長串,看起來頗複雜的...~.~ : : Private Sub Command1_Click(Index As Integer) : : Text1.Text = Text1.Text & Index : : End Sub : : Private Sub Command2_Click(Index As Integer) : : Text1.Text = Text1.Text & Command2(Index).Caption : : End Sub : : Private Sub Command3_Click() : : Label1.Caption = Eval(Text1.Text) : : End Sub : : Function Eval(s As String) : 方程式名:Eval ? 對的 : 方程式參數s設為字串? 限制只能傳入字串 : : 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, " ", "") : 請問上面這段,c的作用是? : : p = InStr(s, "+") : : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc : 我猜的意思是: : If p > 0 -->如果有+號的話,然後執行SplitProc,不過後面就不知道為什麼 分成兩部份,再相加,傳回,然後離開。 : : If s Like "-*" Then p = 2 Else p = 1 : 我猜的意思是: : 如果字串s裡面是-號後面是一串字元的話,然後後面還是看不懂 p 是 InStr 的第一個參數,指定要從第幾個字元開始尋找 "-",可省略這個參數不寫。 : : p = InStr(p, s, "-") : : If p > 0 Then : 如果有減號的話,然後 下面這串程式碼在剛才的範例我沒有說明的很清楚... 這是用來分辨正負號用的 在運算式中可能出現四種運算式(a+-b),(a--b),(a*-b),(a/-b) 這四種運算式的共通特性都是有「負號」 當「-」前方也是運算子的時候,則「-」為負號,否則就是減法運算。 : : op1 = Mid(s, p - 1, 1) : op1=字串中,減號的前一個字元 : : If op1 = "+" Then 負號前是「+」 : 這邊看不懂,為什麼op1剛剛代表減號,現在為什麼代表加號 : : p = p - 1: GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc : p = p-1 ==>看不懂,後面也看不懂 : : 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 因為先前 p 是負號的位置,但我 SplitProc 要求的是 加減乘除 四個運算子的位置, 所以要再減去 1... : : 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 : 如果字串中有/號.... : : Eval = Val(s) : 這裡傳回的模式也看不懂 哪裏不懂? Val() 是將 字串型態 轉換成 數值型態,得到的數值為 Double 型態的數值。 如果來源 s 不是個數字的話,就會傳回零。 所以 Eval = Val(s) 作用就是把 s 轉換成 Double 型態,再傳回。 : : EndProc: : : c = c - 1: Exit Function : c = c - 1的作用是? : : SplitProc: : : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return : 將字串拆成2份(以p的位置為分界點) : 第1份是p的左邊 : 第2份是p的右邊 : : End Function -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 20:42:05 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : 不好意思,再問程式碼部分 : : 方程式名:Eval ? : 對的 : : 方程式參數s設為字串? : 限制只能傳入字串 : : 請問上面這段,c的作用是? : : 我猜的意思是: : : If p > 0 -->如果有+號的話,然後執行SplitProc,不過後面就不知道為什麼 : 分成兩部份,再相加,傳回,然後離開。 Eval分成Eval(op1)和Eval(op2),但是如果op2裡面還有運算子的時候, 1.為什麼Eval能傳出值? 2.離開的話,剩下的運算子好像還沒處理 : : 我猜的意思是: : : 如果字串s裡面是-號後面是一串字元的話,然後後面還是看不懂 : p 是 InStr 的第一個參數,指定要從第幾個字元開始尋找 "-",可省略這個參數不寫。 可是,InStr 的第一個參數,指定要從第幾個字元開始尋找 那個參數要有一個確定的數字的樣子,所以不懂為什麼可以用p 而且p也用來作為InStr函數的傳出值,所以我這邊很混亂 : : 如果有減號的話,然後 : 下面這串程式碼在剛才的範例我沒有說明的很清楚... : 這是用來分辨正負號用的 : 在運算式中可能出現四種運算式(a+-b),(a--b),(a*-b),(a/-b) : 這四種運算式的共通特性都是有「負號」 : 當「-」前方也是運算子的時候,則「-」為負號,否則就是減法運算。 : : op1=字串中,減號的前一個字元 : 負號前是「+」 : : 這邊看不懂,為什麼op1剛剛代表減號,現在為什麼代表加號 : : p = p-1 ==>看不懂,後面也看不懂 : 負號前是「-」 : 負號前是「*」 : 負號前是「/」 : 因為先前 p 是負號的位置,但我 SplitProc 要求的是 加減乘除 四個運算子的位置, : 所以要再減去 1... : : 如果字串中有*號,..... : : 如果字串中有/號.... : : 這裡傳回的模式也看不懂 : 哪裏不懂? : Val() 是將 字串型態 轉換成 數值型態,得到的數值為 Double 型態的數值。 : 如果來源 s 不是個數字的話,就會傳回零。 : 所以 Eval = Val(s) 作用就是把 s 轉換成 Double 型態,再傳回。 這邊有一個問題: 就是如果一開始直接用Val(s)取代Eval的話,我覺得這樣應該比較直接 所以不懂這邊Eval的用意 : : c = c - 1的作用是? : : 將字串拆成2份(以p的位置為分界點) : : 第1份是p的左邊 : : 第2份是p的右邊 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 20:46:06 2005 ※ 引述《fumizuki (小獅子)》之銘言: : : 1.當按鈕按下去後,Text1.Text顯示的字串如何傳到程式碼? : : (因為我沒有看到Function中有和Text1.Text的轉換關係) : Print Eval(Text1.Text) 可是我沒看到這行耶 : : 2.為何字串中間會有空白? : : (因為數入Text1.Text的時候並沒有空白) : 假設一定會有空白...這樣程式比較「活」,不會因為有空白就不能計算了... 嗯,了解了 : : 3. : : Static c As Integer: c = c + 1 : : If c = 1 Then s = Replace(s, " ", "") : : 這段程式碼中的c作用是什麼? : 進入函數加一,離開減一;第一次執行才做 Replace 的動作。 進入和離開這個函數的"開關"在哪 : : 這部分 : : 1.分成兩組運算式後,他們的資料型別(DataType)是? : 沒指定型態的話,預設是 Variant ,不固定的型態,由實際資料內容決定。 : : (因為如果還是字串的話,再用+連結好像又回到原本的字串了 : 我給它字串,它就是字串;我給它整數,它就是整數。 : 字串加數字等於字串,數字加數字等於數字,字串加字串還是字串。 : 因為 Eval 最後傳回值一定是個數值,所以不會有型態的問題。 : (傳入的值一定是字串) Eval可以用Val取代嗎 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 20:57:27 2005 : : Dim p As Integer, op1 As String, op2 As String, o As String ^^^^^^^^^^^^ 這個o有什麼作用呢? (因為沒看它在別的地方出現過) -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149
fumizuki:抱歉,多打的... 210.58.156.43 06/10
TrueFeeling:歐,不會啦,你太客氣了 218.162.90.149 06/10
> -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 21:12:22 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 對的 : : 限制只能傳入字串 : : 分成兩部份,再相加,傳回,然後離開。 : Eval分成Eval(op1)和Eval(op2),但是如果op2裡面還有運算子的時候, : 1.為什麼Eval能傳出值? Function就是要做這用途的... : 2.離開的話,剩下的運算子好像還沒處理 一個離開,還有其它相同的函數還在執行... : : p 是 InStr 的第一個參數,指定要從第幾個字元開始尋找 "-",可省略這個參數不寫。 : 可是,InStr 的第一個參數,指定要從第幾個字元開始尋找 : 那個參數要有一個確定的數字的樣子,所以不懂為什麼可以用p : 而且p也用來作為InStr函數的傳出值,所以我這邊很混亂 沒人說不能用變數啊... 函數的每一個參數本來就是個變數... 就算是常數傳進去,在函數的本體還是以變數在看待 : : 下面這串程式碼在剛才的範例我沒有說明的很清楚... : : 這是用來分辨正負號用的 : : 在運算式中可能出現四種運算式(a+-b),(a--b),(a*-b),(a/-b) : : 這四種運算式的共通特性都是有「負號」 : : 當「-」前方也是運算子的時候,則「-」為負號,否則就是減法運算。 : : 負號前是「+」 : : 負號前是「-」 : : 負號前是「*」 : : 負號前是「/」 : : 因為先前 p 是負號的位置,但我 SplitProc 要求的是 加減乘除 四個運算子的位置, : : 所以要再減去 1... : : 哪裏不懂? : : Val() 是將 字串型態 轉換成 數值型態,得到的數值為 Double 型態的數值。 : : 如果來源 s 不是個數字的話,就會傳回零。 : : 所以 Eval = Val(s) 作用就是把 s 轉換成 Double 型態,再傳回。 : 這邊有一個問題: : 就是如果一開始直接用Val(s)取代Eval的話,我覺得這樣應該比較直接 : 所以不懂這邊Eval的用意 上面說了,s必須是一個數值,才能夠進行轉換,否則得到的數會是。 Eval 的目地就是要把運算子與運算元分離,Val()並不會幫你做計算的工作... -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 21:16:12 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : Print Eval(Text1.Text) : 可是我沒看到這行耶 在 Command3_Click 那裡... : : 假設一定會有空白...這樣程式比較「活」,不會因為有空白就不能計算了... : 嗯,了解了 : : 進入函數加一,離開減一;第一次執行才做 Replace 的動作。 : 進入和離開這個函數的"開關"在哪 第一次呼叫在 Command3_Click 那裡, 其它都是在 Eval() 裏面的 Eval(op1) 和 Eval(op2) 每一次呼叫,原本的 Eval 會被暫時存放在記憶體中,換新的 Eval 到 cpu 中執行 執行完畢後,在喚醒前一個 Eval 繼續執行,了解嗎? 執行第一次呼叫的 Eval 也宣告結束,才算是完工。 : : 沒指定型態的話,預設是 Variant ,不固定的型態,由實際資料內容決定。 : : 我給它字串,它就是字串;我給它整數,它就是整數。 : : 字串加數字等於字串,數字加數字等於數字,字串加字串還是字串。 : : 因為 Eval 最後傳回值一定是個數值,所以不會有型態的問題。 : : (傳入的值一定是字串) : Eval可以用Val取代嗎 -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 21:47:29 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : Eval分成Eval(op1)和Eval(op2),但是如果op2裡面還有運算子的時候, : : 1.為什麼Eval能傳出值? : Function就是要做這用途的... : : 2.離開的話,剩下的運算子好像還沒處理 : 一個離開,還有其它相同的函數還在執行... 你是說,Eval分成Eval(op1)和Eval(op2) 然後每一個Eval又可以分成Eval(op1)和Eval(op2)這樣嗎? 以下面這個為例 p = InStr(s, "+") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc 如果Eval分成Eval(op1)和Eval(op2)但是如果跳出方程式的話,不是就結束了嗎 GoSub SplitProc是重新跑方程式 GoTo EndProc是結束方程式 如果我上面的判斷沒錯的話,GoSub SplitProc和GoTo EndProc是衝突的 可是卻同時進行?讓我覺得很矛盾 : : 可是,InStr 的第一個參數,指定要從第幾個字元開始尋找 : : 那個參數要有一個確定的數字的樣子,所以不懂為什麼可以用p : : 而且p也用來作為InStr函數的傳出值,所以我這邊很混亂 : 沒人說不能用變數啊... : 函數的每一個參數本來就是個變數... : 就算是常數傳進去,在函數的本體還是以變數在看待 不好意思,我天資駑鈍,還是不懂><(原諒我吧orz) 可是p如果是變數的話,電腦要從第幾個字元開始找起呢 還是說p是承接上面 p=2 Else p=1 的p : : 這邊有一個問題: : : 就是如果一開始直接用Val(s)取代Eval的話,我覺得這樣應該比較直接 : : 所以不懂這邊Eval的用意 : 上面說了,s必須是一個數值,才能夠進行轉換,否則得到的數會是零。 : Eval 的目地就是要把運算子與運算元分離,Val()並不會幫你做計算的工作... -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 ※ 編輯: TrueFeeling 來自: 218.162.90.149 (06/11 03:20) > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 22:00:49 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : 可是我沒看到這行耶 : 在 Command3_Click 那裡... : : 嗯,了解了 : : 進入和離開這個函數的"開關"在哪 : 第一次呼叫在 Command3_Click 那裡, 我看到的是: Label1.Caption = Eval(Text1.Text) 這個意思我覺得是,點一下Command3然後他的Caption會顯示Text1.Text算出來的值 可是如果是這樣的話,代表的是輸出 但是如果要由輸入的Text1.Text變成方程式的話, 應該會有一個東西來影響方程式的東西 看程式內容我覺得Text1.Text就是Eval(s)中的s, 但是我沒有看到在Text1.Text和s有任何的轉換關係,所以..我還是不懂orz : 其它都是在 Eval() 裏面的 Eval(op1) 和 Eval(op2) : 每一次呼叫,原本的 Eval 會被暫時存放在記憶體中,換新的 Eval 到 cpu 中執行 : 執行完畢後,在喚醒前一個 Eval 繼續執行,了解嗎? : 執行第一次呼叫的 Eval 也宣告結束,才算是完工。 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 ※ 編輯: TrueFeeling 來自: 218.162.90.149 (06/11 01:10) > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Fri Jun 10 23:14:00 2005 ※ 引述《fumizuki (小獅子)》之銘言: : 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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 如果s字串前面有負號,則下面S字串由第2個找起,否則由第1個找起? 如果是的話下面 Else GoSub SplitProc: Eval = Eval(op1) + Eval("-" & op2): GoTo EndProc 這個的作用好像有重複 因為我把他拿掉測試似乎沒影響 : 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 ^^^ : p = p - 1: GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc 這5個地方的op1是不是可以用其他符號取代, 我測試過應該是沒問題 想問一下是不是真的像我想的那樣 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 ※ 編輯: TrueFeeling 來自: 218.162.90.149 (06/11 03:37) > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 03:12:01 2005 ※ 引述《fumizuki (小獅子)》之銘言: : 上面說了,s必須是一個數值,才能夠進行轉換,否則得到的數會是零。 : Eval 的目地就是要把運算子與運算元分離,Val()並不會幫你做計算的工作... 可是一開始S參數是設為String,它轉成數值的過程是什麼@@ -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.90.149 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 11:48:14 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : 如果我上面的判斷沒錯的話,GoSub SplitProc和GoTo EndProc是衝突的 : 可是卻同時進行?讓我覺得很矛盾 沒有同時進行呀,SplitProc跑完後,會 Return 回來,跑 Eval(op1) + Eval(op2)。 然後再 Goto EndProc,結束這一個函數。 跑 Eval = Eval(op1) + Eval(op2) 的時候會先執行 Eval(op1),得到一個值, 然後再執行 Eval(op2),也得到一個值,兩個值相加存進 Eval 中。 把我那串程式列成規則就是: 題目是一串四則運算的方程式(裡面有加、減、乘、除、負號、數字、及空白), 方程式解法如下所示,請告訴我答案。 1. 將方程式中的空白去除掉,但為求效率,所以只有第一次要做這個動作。 2. 先處理優先等級最低的加法,分割成二部份,並相加。 3. 處理優先等級最低的減法,分割成二部份,把被加數變負數,並相加。 4. 處理優先等級最高的乘法,分割成二部份,並相乘。 5. 處理優先等級最低的除法,分割成二部份,並相除。 6. 第一個字元是減號的時候,從第二個字元開始找起。 7. 處理減號的時候要注意是負號還是減號,當減號前一個字元不是數字的時候,此符號 則為負號。 上七項規則對照程式碼如下: 1. If c = 1 Then s = Replace(s, " ", "") 2. p = InStr(s, "+") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc 3.6.7. '第一個字元是減號的時候,從第二個字元開始找起。 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 Else '減號前一個字元是數字 GoSub SplitProc: Eval = Eval(op1) + Eval("-" & op2): GoTo EndProc End If End If 4. p = InStr(s, "*") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) * Eval(op2): GoTo EndProc 5. p = InStr(s, "/") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc : : 沒人說不能用變數啊... : : 函數的每一個參數本來就是個變數... : : 就算是常數傳進去,在函數的本體還是以變數在看待 : 不好意思,我天資駑鈍,還是不懂><(原諒我吧orz) : 可是p如果是變數的話,電腦要從第幾個字元開始找起呢 : 還是說p是承接上面 p=2 Else p=1 的p 既然我就指定是 p 了, p 是 1 就從第一個字元找, p 是 2 就是第二個字元找呀 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 在 Command3_Click 那裡... : : 第一次呼叫在 Command3_Click 那裡, : 我看到的是: : Label1.Caption = Eval(Text1.Text) : 這個意思我覺得是,點一下Command3然後他的Caption會顯示Text1.Text算出來的值 : 可是如果是這樣的話,代表的是輸出 : 但是如果要由輸入的Text1.Text變成方程式的話, : 應該會有一個東西來影響方程式的東西 : 看程式內容我覺得Text1.Text就是Eval(s)中的s, : 但是我沒有看到在Text1.Text和s有任何的轉換關係,所以..我還是不懂orz 什麼轉換? 程式就是你在 Text1.Text 輸入完方程式後,按下 Command3 然後會執行 Command3_Click(), 在 Command3_Click() 中會呼叫 Eval ,把 Text1.Text 的內容傳進去當作第一個參數。 進到 Eval 裏面,第一個參數 s 當然是 Text1.Text 的內容啦! 然後 Eval 就開始處理 s 的內容,該分割的就分割, 然後再次呼叫 Eval,交給新的 Eval 去處理被分割的二組運算式, 直到所有運算式都被分解成數字的時候再將數字相加或相減...等等四則運算。 最後就會得到一個答案,這個答案傳回給 Command3_Click()。 因為我說 Label1.Caption = Eval(Text1.Text),所以這個答案就會交給 Label1去處理 Label1 就會把它的 Caption 這個屬性的新值輸出。 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 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 : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ : 如果s字串前面有負號,則下面S字串由第2個找起,否則由第1個找起? : 如果是的話下面 : Else : GoSub SplitProc: Eval = Eval(op1) + Eval("-" & op2): GoTo EndProc : 這個的作用好像有重複 : 因為我把他拿掉測試似乎沒影響 上面有說了,之前沒說明清楚... 沒影響是因為你給的運算式剛好沒有符合條件... 至於下面那五個符號,為何想要用其它來取代? op1 的定義,我就是要它代表第一組運算式的, op2 就是第二組。 分割的程式碼有二段,主要的那段就是 SplitProc 那裡。 另一段程式碼是在 If p > 0 Then op1 = Mid(s, p - 1, 1) 這個區段中,為的只是要檢查目前這個運算子的前一個字元是不是也是運算子。 所以只有 op1,不會有op2... 你要用其它符號取代,當然是可以,只不過多使用了一個變數而已... -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 13:09:18 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : 如果我上面的判斷沒錯的話,GoSub SplitProc和GoTo EndProc是衝突的 : : 可是卻同時進行?讓我覺得很矛盾 : 沒有同時進行呀,SplitProc跑完後,會 Return 回來,跑 Eval(op1) + Eval(op2)。 : 然後再 Goto EndProc,結束這一個函數。 : 跑 Eval = Eval(op1) + Eval(op2) 的時候會先執行 Eval(op1),得到一個值, : 然後再執行 Eval(op2),也得到一個值,兩個值相加存進 Eval 中。 如果Eval(op1)和Eval(op2)的裡面還有運算子的時候, 例如: Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9) 那麼這兩個分割後的Eval函數, 要在什麼地方繼續分割呢?(因為已經Goto EndProc了) : 把我那串程式列成規則就是: : 題目是一串四則運算的方程式(裡面有加、減、乘、除、負號、數字、及空白), : 方程式解法如下所示,請告訴我答案。 : 1. 將方程式中的空白去除掉,但為求效率,所以只有第一次要做這個動作。 : 2. 先處理優先等級最低的加法,分割成二部份,並相加。 ^^^^^^^^^^^^ : 3. 處理優先等級最低的減法,分割成二部份,把被加數變負數,並相加。 ^^^^^^^^^^^^ : 4. 處理優先等級最高的乘法,分割成二部份,並相乘。 ^^^^^^^^^^^ : 5. 處理優先等級最低的除法,分割成二部份,並相除。 ^^^^^^^^^^^^ : 6. 第一個字元是減號的時候,從第二個字元開始找起。 : 7. 處理減號的時候要注意是負號還是減號,當減號前一個字元不是數字的時候,此符號 : 則為負號。 優先等級這裡有疑問,依照你程式的寫法 我的解讀是: 先用+號將字串分割成前段和後段,然後每一個分割後的字串依此繼續分割 當分割完的函數裡面沒有+號的時候才會-號,再來是乘號,再來是除號 ,所以優先等級我看不懂你說最高和最低是什麼意思 : 上七項規則對照程式碼如下: : 1. : If c = 1 Then s = Replace(s, " ", "") 是什麼東西讓c=1的呢?我一直找不到 = = : 2. : p = InStr(s, "+") : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc : 3.6.7. : '第一個字元是減號的時候,從第二個字元開始找起。 : 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 : Else '減號前一個字元是數字 : GoSub SplitProc: Eval = Eval(op1) + Eval("-" & op2): GoTo EndProc : End If : End If : 4. : p = InStr(s, "*") : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) * Eval(op2): GoTo EndProc : 5. : p = InStr(s, "/") : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc : : 不好意思,我天資駑鈍,還是不懂><(原諒我吧orz) : : 可是p如果是變數的話,電腦要從第幾個字元開始找起呢 : : 還是說p是承接上面 p=2 Else p=1 的p : 既然我就指定是 p 了, p 是 1 就從第一個字元找, p 是 2 就是第二個字元找呀 嗯嗯,這段我了解了原來p是承接上面 p=2 Else p=1 的p沒錯 : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : 我看到的是: : : Label1.Caption = Eval(Text1.Text) : : 這個意思我覺得是,點一下Command3然後他的Caption會顯示Text1.Text算出來的值 : : 可是如果是這樣的話,代表的是輸出 : : 但是如果要由輸入的Text1.Text變成方程式的話, : : 應該會有一個東西來影響方程式的東西 : : 看程式內容我覺得Text1.Text就是Eval(s)中的s, : : 但是我沒有看到在Text1.Text和s有任何的轉換關係,所以..我還是不懂orz : 什麼轉換? : 程式就是你在 Text1.Text 輸入完方程式後,按下 Command3 : 然後會執行 Command3_Click(), : 在 Command3_Click() 中會呼叫 Eval ,把 Text1.Text 的內容傳進去當作第一個參數。 是喔,呼叫可以這樣用@@||(驚!!) : 進到 Eval 裏面,第一個參數 s 當然是 Text1.Text 的內容啦! : 然後 Eval 就開始處理 s 的內容,該分割的就分割, : 然後再次呼叫 Eval,交給新的 Eval 去處理被分割的二組運算式, : 直到所有運算式都被分解成數字的時候再將數字相加或相減...等等四則運算。 : 最後就會得到一個答案,這個答案傳回給 Command3_Click()。 : 因為我說 Label1.Caption = Eval(Text1.Text),所以這個答案就會交給 Label1去處理 : Label1 就會把它的 Caption 這個屬性的新值輸出。 : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ : : 如果s字串前面有負號,則下面S字串由第2個找起,否則由第1個找起? : : 如果是的話下面 : : Else : : GoSub SplitProc: Eval = Eval(op1) + Eval("-" & op2): GoTo EndProc : : 這個的作用好像有重複 : : 因為我把他拿掉測試似乎沒影響 : 上面有說了,之前沒說明清楚... : 沒影響是因為你給的運算式剛好沒有符合條件... : 至於下面那五個符號,為何想要用其它來取代? : op1 的定義,我就是要它代表第一組運算式的, : op2 就是第二組。 : 分割的程式碼有二段,主要的那段就是 SplitProc 那裡。 : 另一段程式碼是在 : If p > 0 Then : op1 = Mid(s, p - 1, 1) : 這個區段中,為的只是要檢查目前這個運算子的前一個字元是不是也是運算子。 : 所以只有 op1,不會有op2... : 你要用其它符號取代,當然是可以,只不過多使用了一個變數而已... 但是依照程式裡面op1的定義是: op1 = Left(s, p - 1) 所以這樣來說,感覺實際上是兩個變數,只是因為前一個用完,後面一個重新定義的樣子 -- 感謝你還漫有耐心的,陪我喇勒這麼多^^|| -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 13:20:36 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 沒有同時進行呀,SplitProc跑完後,會 Return 回來,跑 Eval(op1) + Eval(op2)。 : : 然後再 Goto EndProc,結束這一個函數。 : : 跑 Eval = Eval(op1) + Eval(op2) 的時候會先執行 Eval(op1),得到一個值, : : 然後再執行 Eval(op2),也得到一個值,兩個值相加存進 Eval 中。 : 如果Eval(op1)和Eval(op2)的裡面還有運算子的時候, : 例如: : Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9) : 那麼這兩個分割後的Eval函數, : 要在什麼地方繼續分割呢?(因為已經Goto EndProc了) 你的問題大概是   Eval = Eval(op1) + Eval(op2): Goto EndProc 這一行吧   這是兩行敘述,第一行執行時會去呼叫 Eval, op1 和 op2 那兩個 Eval 都「執行完成」的時候,才會 Goto EndProc   : : 把我那串程式列成規則就是: : : 題目是一串四則運算的方程式(裡面有加、減、乘、除、負號、數字、及空白), : : 方程式解法如下所示,請告訴我答案。 : : 1. 將方程式中的空白去除掉,但為求效率,所以只有第一次要做這個動作。 : : 2. 先處理優先等級最低的加法,分割成二部份,並相加。 : ^^^^^^^^^^^^ : : 3. 處理優先等級最低的減法,分割成二部份,把被加數變負數,並相加。 : ^^^^^^^^^^^^ : : 4. 處理優先等級最高的乘法,分割成二部份,並相乘。 : ^^^^^^^^^^^ : : 5. 處理優先等級最低的除法,分割成二部份,並相除。 : ^^^^^^^^^^^^ : : 6. 第一個字元是減號的時候,從第二個字元開始找起。 : : 7. 處理減號的時候要注意是負號還是減號,當減號前一個字元不是數字的時候,此符號 : : 則為負號。 : 優先等級這裡有疑問,依照你程式的寫法 : 我的解讀是: : 先用+號將字串分割成前段和後段,然後每一個分割後的字串依此繼續分割 : 當分割完的函數裡面沒有+號的時候才會-號,再來是乘號,再來是除號 : ,所以優先等級我看不懂你說最高和最低是什麼意思 先乘除後加減啊   乘除優先運算,加減最後運算,這數學規則應該知道吧   因為最先進入的程式是最後才會結束的,所以要倒過來,變成加減先處理,再處理乘除   至於乘與除先後順序不會影響結果,加與減也是... : : 上七項規則對照程式碼如下: : : 1. : : If c = 1 Then s = Replace(s, " ", "") : 是什麼東西讓c=1的呢?我一直找不到 = = 前面翻翻程式碼吧   最開頭就寫了個 c = c + 1 了 : : 2. : : p = InStr(s, "+") : : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc : : 3.6.7. : : '第一個字元是減號的時候,從第二個字元開始找起。 : : 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 : : Else '減號前一個字元是數字 : : GoSub SplitProc: Eval = Eval(op1) + Eval("-" & op2): GoTo EndProc : : End If : : End If : : 4. : : p = InStr(s, "*") : : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) * Eval(op2): GoTo EndProc : : 5. : : p = InStr(s, "/") : : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc : : 既然我就指定是 p 了, p 是 1 就從第一個字元找, p 是 2 就是第二個字元找呀 : 嗯嗯,這段我了解了原來p是承接上面 p=2 Else p=1 的p沒錯 : : 什麼轉換? : : 程式就是你在 Text1.Text 輸入完方程式後,按下 Command3 : : 然後會執行 Command3_Click(), : : 在 Command3_Click() 中會呼叫 Eval ,把 Text1.Text 的內容傳進去當作第一個參數。 : 是喔,呼叫可以這樣用@@||(驚!!) 不然你以為是怎麼用@@?   呼叫就是這樣子用的@@" : : 進到 Eval 裏面,第一個參數 s 當然是 Text1.Text 的內容啦! : : 然後 Eval 就開始處理 s 的內容,該分割的就分割, : : 然後再次呼叫 Eval,交給新的 Eval 去處理被分割的二組運算式, : : 直到所有運算式都被分解成數字的時候再將數字相加或相減...等等四則運算。 : : 最後就會得到一個答案,這個答案傳回給 Command3_Click()。 : : 因為我說 Label1.Caption = Eval(Text1.Text),所以這個答案就會交給 Label1去處理 : : Label1 就會把它的 Caption 這個屬性的新值輸出。 : : 上面有說了,之前沒說明清楚... : : 沒影響是因為你給的運算式剛好沒有符合條件... : : 至於下面那五個符號,為何想要用其它來取代? : : op1 的定義,我就是要它代表第一組運算式的, : : op2 就是第二組。 : : 分割的程式碼有二段,主要的那段就是 SplitProc 那裡。 : : 另一段程式碼是在 : : If p > 0 Then : : op1 = Mid(s, p - 1, 1) : : 這個區段中,為的只是要檢查目前這個運算子的前一個字元是不是也是運算子。 : : 所以只有 op1,不會有op2... : : 你要用其它符號取代,當然是可以,只不過多使用了一個變數而已... : 但是依照程式裡面op1的定義是: : op1 = Left(s, p - 1) : 所以這樣來說,感覺實際上是兩個變數,只是因為前一個用完,後面一個重新定義的樣子 op1 有兩個地方在使用它,兩個地方並不會衝突,用過了後就不再使用了... -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 13:29:27 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : 如果Eval(op1)和Eval(op2)的裡面還有運算子的時候, : : 例如: : : Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9) : : 那麼這兩個分割後的Eval函數, : : 要在什麼地方繼續分割呢?(因為已經Goto EndProc了) : 你的問題大概是 :   : Eval = Eval(op1) + Eval(op2): Goto EndProc 這一行吧 :   : 這是兩行敘述,第一行執行時會去呼叫 Eval, : op1 和 op2 那兩個 Eval 都「執行完成」的時候,才會 Goto EndProc ^^^^^^^^^^^ 怎麼樣算是執行完成呢@@" :   : : ^^^^^^^^^^^^ : : ^^^^^^^^^^^^ : : ^^^^^^^^^^^ : : ^^^^^^^^^^^^ : : 優先等級這裡有疑問,依照你程式的寫法 : : 我的解讀是: : : 先用+號將字串分割成前段和後段,然後每一個分割後的字串依此繼續分割 : : 當分割完的函數裡面沒有+號的時候才會-號,再來是乘號,再來是除號 : : ,所以優先等級我看不懂你說最高和最低是什麼意思 : 先乘除後加減啊 :   : 乘除優先運算,加減最後運算,這數學規則應該知道吧 嗯,知道 :   : 因為最先進入的程式是最後才會結束的,所以要倒過來,變成加減先處理,再處理乘除 :   : 至於乘與除先後順序不會影響結果,加與減也是... 可是為什麼乘最高,其他最低呢? 我覺得應該是類似這樣吧: 最高-次高-低-最低 : : 是什麼東西讓c=1的呢?我一直找不到 = = : 前面翻翻程式碼吧 :   : 最開頭就寫了個 c = c + 1 了 嗯,這個我有看到,想問一下如果不設這個c的話, 方程式還可以運作嗎?為什麼? : : 嗯嗯,這段我了解了原來p是承接上面 p=2 Else p=1 的p沒錯 : : 是喔,呼叫可以這樣用@@||(驚!!) : 不然你以為是怎麼用@@? 我以為輸入和輸出要分開,沒想到你居然把它合在一起 嗯嗯,高手高手^^||   : 呼叫就是這樣子用的@@" 嗯,我又學到了一招^^ : : 但是依照程式裡面op1的定義是: : : op1 = Left(s, p - 1) : : 所以這樣來說,感覺實際上是兩個變數,只是因為前一個用完,後面一個重新定義的樣子 : op1 有兩個地方在使用它,兩個地方並不會衝突,用過了後就不再使用了... -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 13:55:10 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 你的問題大概是 : :   : : Eval = Eval(op1) + Eval(op2): Goto EndProc 這一行吧 : :   : : 這是兩行敘述,第一行執行時會去呼叫 Eval, : : op1 和 op2 那兩個 Eval 都「執行完成」的時候,才會 Goto EndProc : ^^^^^^^^^^^ : 怎麼樣算是執行完成呢@@" s 只剩下數值的時候, Eval 不是會把 s 分割成兩部份嗎? 並且這兩部份不包含中間的運算子, 然後這兩部份會再交給新的 Eval 處理,新的 Eval 一樣會分解,去掉運算子, 再交給新的 Eval 處理... 重複這樣的行為,直到 s 不再包含運算子時,傳回數值, 這裡就算是一個 Eval 的結束了,就是「執行完成」 另一個結束是 分成兩部份的那段程式碼收到了 Eval 傳回的數值後,計算, 然後 Goto EndProc,就是「執行完成」了。 : :   : : 先乘除後加減啊 : :   : : 乘除優先運算,加減最後運算,這數學規則應該知道吧 : 嗯,知道 : :   : : 因為最先進入的程式是最後才會結束的,所以要倒過來,變成加減先處理,再處理乘除 : :   : : 至於乘與除先後順序不會影響結果,加與減也是... : 可是為什麼乘最高,其他最低呢? : 我覺得應該是類似這樣吧: : 最高-次高-低-最低 沒有,你自己試試看就知道 加與減的順序不影響運算的結果 1 + 2 - 3 = 1 + (2 - 3) = (1 + 2) - 3 = 0 而且數學只說過先乘除後加減,並沒有說要先乘後除,還是先除後乘吧 依照我程式的撰寫,運算順序是除-乘-減-加,把它改成乘-除-加減,結果是一樣的。 (如果會不同的話,就 Orz 了,那我可要好好研究為何會不同...) : : 前面翻翻程式碼吧 : :   : : 最開頭就寫了個 c = c + 1 了 : 嗯,這個我有看到,想問一下如果不設這個c的話, : 方程式還可以運作嗎?為什麼? 可以,因為他只是個指標,表示 Eval 被執行了幾次 但是,還有個 c = c - 1,你大概會問為什麼要減 1 吧? 那是 Static c As Integer 的關係, Static 的目的就是讓 c 這個變數的值一直保存,不要因為 End Function 就消失掉。 正是因為值不會消失,所以如果這次執行了8次 Eval, 下一次再使用的時候,c 的值會是8 我設定每一次離開函數就減去一,是要 c 的值最後會歸零。 下次再使用 Eval 的時候, c 的值就是 0 c = c + 1 後,c 的值就是 1,才能判定 Eval 是第一次被呼叫, 而不是 Eval(op1) 或 Eval(op2) 在做重覆呼叫... : : 不然你以為是怎麼用@@? : 我以為輸入和輸出要分開,沒想到你居然把它合在一起 : 嗯嗯,高手高手^^||   : : 呼叫就是這樣子用的@@" : 嗯,我又學到了一招^^ : : op1 有兩個地方在使用它,兩個地方並不會衝突,用過了後就不再使用了... 新手的時候的我,也會用一大堆變數, 但後來看看程式碼,會發現,有些變數可以去掉, 不過也要看情況,相同性質的才共用變數,不同性質的千萬不要這樣做 因為很容易用錯變數,或變數相衝突... 程式碼精簡一點,以後比較好管理 不然常看不懂自己在寫些什麼 ( ′-`)y-~ -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 14:44:04 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : ^^^^^^^^^^^ : : 怎麼樣算是執行完成呢@@" : s 只剩下數值的時候, ^^^^^^^^^^^^^^^^^^^^^^^ 這邊的"s 只剩下數值"是什麼意思? 如果拿這個例子來分析的話: Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9) 2-3*5或7/5-9這樣算是數值嗎? 還有就是我再即時運算視窗中: === W=2-3*5 X=Val(2-3*5) Print X -13 === W=2-3*5 X=Val(W) Print X -13 == W="2-3*5" X=Val(W) Print X -13 == 為什麼第3個明明W就是字串,Val()函數還可以計算阿? : Eval 不是會把 s 分割成兩部份嗎? 並且這兩部份不包含中間的運算子, : 然後這兩部份會再交給新的 Eval 處理,新的 Eval 一樣會分解,去掉運算子, : 再交給新的 Eval 處理... : 重複這樣的行為,直到 s 不再包含運算子時,傳回數值, : 這裡就算是一個 Eval 的結束了,就是「執行完成」 這邊有個問題: 傳回數值的時候, 例如Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9): 假設到了算到了Eval(3)*Eval(5)的時候 這時會變成Val(3)*Val(5),對嗎? 然後Eval=Val()....Val()...Val()....對嗎 : 另一個結束是 分成兩部份的那段程式碼收到了 Eval 傳回的數值後,計算, : 然後 Goto EndProc,就是「執行完成」了。 : : 嗯,知道 : : 可是為什麼乘最高,其他最低呢? : : 我覺得應該是類似這樣吧: : : 最高-次高-低-最低 : 沒有,你自己試試看就知道 : 加與減的順序不影響運算的結果 : 1 + 2 - 3 = 1 + (2 - 3) = (1 + 2) - 3 = 0 : 而且數學只說過先乘除後加減,並沒有說要先乘後除,還是先除後乘吧 : 依照我程式的撰寫,運算順序是除-乘-減-加,把它改成乘-除-加減,結果是一樣的。 : (如果會不同的話,就 Orz 了,那我可要好好研究為何會不同...) 嗯,這個我知道 只是,不明白為什麼剛剛你在說明的時候,最高最低的意思 : : 嗯,這個我有看到,想問一下如果不設這個c的話, : : 方程式還可以運作嗎?為什麼? : 可以,因為他只是個指標,表示 Eval 被執行了幾次 : 但是,還有個 c = c - 1,你大概會問為什麼要減 1 吧? : 那是 Static c As Integer 的關係, : Static 的目的就是讓 c 這個變數的值一直保存,不要因為 End Function 就消失掉。 : 正是因為值不會消失,所以如果這次執行了8次 Eval, : 下一次再使用的時候,c 的值會是8 ^^^^^^^^ 這邊的下一次意思是? 我的想法是: 如果這串字串有8個運算子 那麼Eval執行的次數會變成1+2*8次的樣子 然後傳回 這邊有個問題: SplitProc裡面的Return是Return到哪裡? 感覺像是c=c+1 Eval0=Eval1+Eval2然後c=c-1 c=c+1 然後Eval1=Eval1a+Eval1b 然後c=c-1 c=c+1 然後Eval1=Eval2a+Eval2b 然後c=c-1 : 我設定每一次離開函數就減去一,是要 c 的值最後會歸零。 : 下次再使用 Eval 的時候, c 的值就是 0 : c = c + 1 後,c 的值就是 1,才能判定 Eval 是第一次被呼叫, : 而不是 Eval(op1) 或 Eval(op2) 在做重覆呼叫... : : 我以為輸入和輸出要分開,沒想到你居然把它合在一起 : : 嗯嗯,高手高手^^||   : : 嗯,我又學到了一招^^ : 新手的時候的我,也會用一大堆變數, : 但後來看看程式碼,會發現,有些變數可以去掉, : 不過也要看情況,相同性質的才共用變數,不同性質的千萬不要這樣做 : 因為很容易用錯變數,或變數相衝突... : 程式碼精簡一點,以後比較好管理 : 不然常看不懂自己在寫些什麼 ( ′-`)y-~ 嗯嗯,(筆記筆記ing)^^ -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 15:00:28 2005 ※ 引述《fumizuki (小獅子)》之銘言: : Private Sub Command1_Click(Index As Integer) : Text1.Text = Text1.Text & Index : End Sub : Private Sub Command2_Click(Index As Integer) : Text1.Text = Text1.Text & Command2(Index).Caption : End Sub : Private Sub Command3_Click() : Label1.Caption = Eval(Text1.Text) : End Sub : 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 p = p - 1: GoSub SplitProc : 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: F = F(op1) ^ F(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 沒想到竟然也可以算次方,可是我想不出原理是什麼 如果說程式執行到^的時候,字串已經裡面不會再有加減乘除號了, 這樣 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)應該無法分割,但是答案卻出乎我預料的正確@@!! -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 16:36:08 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : s 只剩下數值的時候, : ^^^^^^^^^^^^^^^^^^^^^^^ : 這邊的"s 只剩下數值"是什麼意思? 數值是 0 1 2 3 4 5 6 7 8 9 ,不含其它符號,更不包含空格等等.. 有加減乘除的都稱它為運算式 : 如果拿這個例子來分析的話: : Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9) : 2-3*5或7/5-9這樣算是數值嗎? : 還有就是我再即時運算視窗中: : == : W="2-3*5" : X=Val(W) : Print X : -13 : == : 為什麼第3個明明W就是字串,Val()函數還可以計算阿? Val() 並不是計算,是轉換,它只取前幾個字元,後面非數字的部份會捨棄。 非數字的部份之後還就算還有數字,也照樣捨棄... 你最後一個的輸出值抄錯了吧... 輸出是 2,不可能是-13 第一個字元是2,第二個字元不是數字,所以之後的通通捨棄,只剩下2... : 這邊有個問題: : 傳回數值的時候, : 例如Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9): : 假設到了算到了Eval(3)*Eval(5)的時候 : 這時會變成Val(3)*Val(5),對嗎? : 然後Eval=Val()....Val()...Val()....對嗎 沒錯,在這裡 Eval 和 Val 的意思是相同的, 不過 Val 會捨棄後方非數字的部份,Eval 不會做這個動作... Eval 就是自訂的函數,用來做四則運算用的... : : 另一個結束是 分成兩部份的那段程式碼收到了 Eval 傳回的數值後,計算, : : 然後 Goto EndProc,就是「執行完成」了。 : : 沒有,你自己試試看就知道 : : 加與減的順序不影響運算的結果 : : 1 + 2 - 3 = 1 + (2 - 3) = (1 + 2) - 3 = 0 : : 而且數學只說過先乘除後加減,並沒有說要先乘後除,還是先除後乘吧 : : 依照我程式的撰寫,運算順序是除-乘-減-加,把它改成乘-除-加減,結果是一樣的。 : : (如果會不同的話,就 Orz 了,那我可要好好研究為何會不同...) : 嗯,這個我知道 : 只是,不明白為什麼剛剛你在說明的時候,最高最低的意思 什麼? 最高是說優先等級最高,會最先被處理的呀... : : 可以,因為他只是個指標,表示 Eval 被執行了幾次 : : 但是,還有個 c = c - 1,你大概會問為什麼要減 1 吧? : : 那是 Static c As Integer 的關係, : : Static 的目的就是讓 c 這個變數的值一直保存,不要因為 End Function 就消失掉。 : : 正是因為值不會消失,所以如果這次執行了8次 Eval, : : 下一次再使用的時候,c 的值會是8 : ^^^^^^^^ : 這邊的下一次意思是? : 我的想法是: : 如果這串字串有8個運算子 8個運算子的話... 1+2+3+4+5+6+7+-8 1: 1+2+3+4+5+6+7+-8 2: 1 3: 2+3+4+5+6+7+-8 4: 2 5: 3+4+5+6+7+-8 6: 3 7: 4+5+6+7+-8 8: 4 9: 5+6+7+-8 10:5 11:6+7+-8 12:6 13:7+-8 14:7 15:-8 共15次 : 那麼Eval執行的次數會變成1+2*8次的樣子 等於說 Eval 執行的次數等於 運算元的數量 + 運算子的數量 上面有 8 個運算元 (1,2,3,4,5,6,7,8),和 7 個運算子 (都是+號) 8 + 7 = 15 (其中-8是負數,-8 視為一個運算元) : 然後傳回 : 這邊有個問題: : SplitProc裡面的Return是Return到哪裡? : 感覺像是c=c+1 : Eval0=Eval1+Eval2然後c=c-1 : c=c+1 : 然後Eval1=Eval1a+Eval1b : 然後c=c-1 : c=c+1 : 然後Eval1=Eval2a+Eval2b : 然後c=c-1 GoSub 和 Return 是互相配合的,有 Gosub 才有 Return 沒有 GoSub,使用 Return 是會發生錯誤的。 Return 當然是回到 GoSub 的地方呀 : : 我設定每一次離開函數就減去一,是要 c 的值最後會歸零。 : : 下次再使用 Eval 的時候, c 的值就是 0 : : c = c + 1 後,c 的值就是 1,才能判定 Eval 是第一次被呼叫, : : 而不是 Eval(op1) 或 Eval(op2) 在做重覆呼叫... : : 新手的時候的我,也會用一大堆變數, : : 但後來看看程式碼,會發現,有些變數可以去掉, : : 不過也要看情況,相同性質的才共用變數,不同性質的千萬不要這樣做 : : 因為很容易用錯變數,或變數相衝突... : : 程式碼精簡一點,以後比較好管理 : : 不然常看不懂自己在寫些什麼 ( ′-`)y-~ : 嗯嗯,(筆記筆記ing)^^ -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:05:06 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : : ^^^^^^^^^^^^^^^^^^^^^^^ : : 這邊的"s 只剩下數值"是什麼意思? : 數值是 0 1 2 3 4 5 6 7 8 9 ,不含其它符號,更不包含空格等等.. : 有加減乘除的都稱它為運算式 這我就不懂了,如果s只剩下數值的話,Eval應該不會再繼續分割下去才對 : : 如果拿這個例子來分析的話: : : Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9) : : 2-3*5或7/5-9這樣算是數值嗎? : : 還有就是我再即時運算視窗中: : : == : : W="2-3*5" : : X=Val(W) : : Print X : : -13 : : == : : 為什麼第3個明明W就是字串,Val()函數還可以計算阿? : Val() 並不是計算,是轉換,它只取前幾個字元,後面非數字的部份會捨棄。 : 非數字的部份之後還就算還有數字,也照樣捨棄... : 你最後一個的輸出值抄錯了吧... : 輸出是 2,不可能是-13 現在我是的結果: 竟然又變成0了@@|| 而且3種都是0 然後游標是一個"半形"的黑色長方體 怎麼會這樣?! : 第一個字元是2,第二個字元不是數字,所以之後的通通捨棄,只剩下2... : : 這邊有個問題: : : 傳回數值的時候, : : 例如Eval(2-3*5+7/5-9)=Eval(2-3*5)+Eval(7/5-9): : : 假設到了算到了Eval(3)*Eval(5)的時候 : : 這時會變成Val(3)*Val(5),對嗎? : : 然後Eval=Val()....Val()...Val()....對嗎 : 沒錯,在這裡 Eval 和 Val 的意思是相同的, : 不過 Val 會捨棄後方非數字的部份,Eval 不會做這個動作... : Eval 就是自訂的函數,用來做四則運算用的... : : 嗯,這個我知道 : : 只是,不明白為什麼剛剛你在說明的時候,最高最低的意思 : 什麼? : 最高是說優先等級最高,會最先被處理的呀... 嗯嗯,我們理解的應該都一樣,這應該只是表達的不同^^ : : ^^^^^^^^ : : 這邊的下一次意思是? : : 我的想法是: : : 如果這串字串有8個運算子 : 8個運算子的話... : 1+2+3+4+5+6+7+-8 : 1: 1+2+3+4+5+6+7+-8 : 2: 1 : 3: 2+3+4+5+6+7+-8 : 4: 2 : 5: 3+4+5+6+7+-8 : 6: 3 : 7: 4+5+6+7+-8 : 8: 4 : 9: 5+6+7+-8 : 10:5 : 11:6+7+-8 : 12:6 : 13:7+-8 : 14:7 : 15:-8 : 共15次 : : 那麼Eval執行的次數會變成1+2*8次的樣子 : 等於說 Eval 執行的次數等於 運算元的數量 + 運算子的數量 : 上面有 8 個運算元 (1,2,3,4,5,6,7,8),和 7 個運算子 (都是+號) : 8 + 7 = 15 : (其中-8是負數,-8 視為一個運算元) 嗯嗯,這邊我想錯了 : : 然後傳回 : : 這邊有個問題: : : SplitProc裡面的Return是Return到哪裡? : : 感覺像是c=c+1 : : Eval0=Eval1+Eval2然後c=c-1 : : c=c+1 : : 然後Eval1=Eval1a+Eval1b : : 然後c=c-1 : : c=c+1 : : 然後Eval1=Eval2a+Eval2b : : 然後c=c-1 : GoSub 和 Return 是互相配合的,有 Gosub 才有 Return : 沒有 GoSub,使用 Return 是會發生錯誤的。 : Return 當然是回到 GoSub 的地方呀 以這段程式為例: p = InStr(s, "+") If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc 你的意思是說,執行到GoSub SplitProc的時候 它會跳到 SplitProc: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return 然後SplitProc跑完又會回到GoSub SplitProc 然後在跳到 SplitProc: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return 就這樣反覆循環, 然後最後才進入Eval = Eval(op1) + Eval(op2)然後GoTo EndProc嗎? 如果是這樣的話, 在GoSub Return的循環過程中 Eval並沒有被分割,沒有被定義成Eval = Eval(op1) + Eval(op2) 它只在這一小段的程式中跳過去在跳回來, 沒有跑到程式的其他部分,這樣的話我無法理解 我一直以為是GoSub SplitProc以後,配合著 SplitProc: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return 有了op1 = Left(s, p - 1): op2 = Mid(s, p + 1)其中op1,op2的定義之後, 繼續定義Eval = Eval(op1) + Eval(op2)得到新的Eval(即Eval(op1)和Eval(op2)), 然後再用新的Eval(即Eval(op1)和Eval(op2))重Function的一開始, 原原本本的再跑一次 : : 嗯嗯,(筆記筆記ing)^^ -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:21:52 2005 ※ 引述《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 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:31:49 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 數值是 0 1 2 3 4 5 6 7 8 9 ,不含其它符號,更不包含空格等等.. : : 有加減乘除的都稱它為運算式 : 這我就不懂了,如果s只剩下數值的話,Eval應該不會再繼續分割下去才對 你問:什麼叫做「執行完成」 我說:只剩下數值的時候 當然不會再繼續分割下去呀@@... : : Val() 並不是計算,是轉換,它只取前幾個字元,後面非數字的部份會捨棄。 : : 非數字的部份之後還就算還有數字,也照樣捨棄... : : 你最後一個的輸出值抄錯了吧... : : 輸出是 2,不可能是-13 : 現在我是的結果: : 竟然又變成0了@@|| : 而且3種都是0 : 然後游標是一個"半形"的黑色長方體 : 怎麼會這樣?! ▍像這樣? 你按到 Insert 按鍵了... ...怎麼可能變成0...? 你式子一模一樣嗎 Val("2+3*7") = 2 沒有可能會不對啊... 你是不是按到什麼了... : : 第一個字元是2,第二個字元不是數字,所以之後的通通捨棄,只剩下2... : : 沒錯,在這裡 Eval 和 Val 的意思是相同的, : : 不過 Val 會捨棄後方非數字的部份,Eval 不會做這個動作... : : Eval 就是自訂的函數,用來做四則運算用的... : : 什麼? : : 最高是說優先等級最高,會最先被處理的呀... : 嗯嗯,我們理解的應該都一樣,這應該只是表達的不同^^ : : 8個運算子的話... : : 1+2+3+4+5+6+7+-8 : : 1: 1+2+3+4+5+6+7+-8 : : 2: 1 : : 3: 2+3+4+5+6+7+-8 : : 4: 2 : : 5: 3+4+5+6+7+-8 : : 6: 3 : : 7: 4+5+6+7+-8 : : 8: 4 : : 9: 5+6+7+-8 : : 10:5 : : 11:6+7+-8 : : 12:6 : : 13:7+-8 : : 14:7 : : 15:-8 : : 共15次 : : 等於說 Eval 執行的次數等於 運算元的數量 + 運算子的數量 : : 上面有 8 個運算元 (1,2,3,4,5,6,7,8),和 7 個運算子 (都是+號) : : 8 + 7 = 15 : : (其中-8是負數,-8 視為一個運算元) : 嗯嗯,這邊我想錯了 : : GoSub 和 Return 是互相配合的,有 Gosub 才有 Return : : 沒有 GoSub,使用 Return 是會發生錯誤的。 : : Return 當然是回到 GoSub 的地方呀 : 以這段程式為例: : p = InStr(s, "+") : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc : 你的意思是說,執行到GoSub SplitProc的時候 : 它會跳到 : SplitProc: : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return : 然後SplitProc跑完又會回到GoSub SplitProc : 然後在跳到 : SplitProc: : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return : 就這樣反覆循環, : 然後最後才進入Eval = Eval(op1) + Eval(op2)然後GoTo EndProc嗎? : 如果是這樣的話, : 在GoSub Return的循環過程中 : Eval並沒有被分割,沒有被定義成Eval = Eval(op1) + Eval(op2) : 它只在這一小段的程式中跳過去在跳回來, : 沒有跑到程式的其他部分,這樣的話我無法理解 : 我一直以為是GoSub SplitProc以後,配合著 : SplitProc: : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return : 有了op1 = Left(s, p - 1): op2 = Mid(s, p + 1)其中op1,op2的定義之後, : 繼續定義Eval = Eval(op1) + Eval(op2)得到新的Eval(即Eval(op1)和Eval(op2)), : 然後再用新的Eval(即Eval(op1)和Eval(op2))重Function的一開始, : 原原本本的再跑一次 不是這樣的意思... If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc SplitProc: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return 的執行順序是 GoSub SplitProc op1 = Left(s, p - 1) op2 = Mid(s, p + 1) Return Eval = Eval(op1) + Eval(op2) GoTo EndProc Return 是回到原地,但是並不是重覆再執行已執行過的東西, 那樣子毫無意義,會變成無窮迴圈... -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43
LPH66:不是啦 黑框框那是輸出錯誤的關係 61.62.178.179 06/11
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:38:32 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ※ 引述《TrueFeeling (昨日之死)》之銘言: : 正確程式碼是這樣... : 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 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) 嗯,我是過,結果答案似乎也不是這樣 例如我輸入2^-1*2 答案是0.5@@!! (不知道電腦怎麼算的!!) : 正確的結果應該是 : (5 ^ -3) * 2 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 > -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:42:41 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 正確程式碼是這樣... : : Public Function Eval(s As String) : : 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 : Then後面沒寫任何東西也可以喔@@?!! : 那如果程式跑到這裡的話,接下它會怎麼跑? 就是什麼也不做的意思,繼續下一個條件... : : 為什麼 : : 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) : 嗯,我是過,結果答案似乎也不是這樣 : 例如我輸入2^-1*2 : 答案是0.5@@!! : (不知道電腦怎麼算的!!) 你怎麼打的? ? Eval("2^-1*2") 1 ? 2^-1*2 1 沒有問題呀... : : 正確的結果應該是 : : (5 ^ -3) * 2 -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:47:21 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ▍像這樣? : 你按到 Insert 按鍵了... : ...怎麼可能變成0...? : 你式子一模一樣嗎 : Val("2+3*7") = 2 : 沒有可能會不對啊... : 你是不是按到什麼了... 我算Val("2+3*7") = 2沒錯 但是 X="2-3*5" ?Val(X) --> 0 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236
fumizuki:你一定是沒按到enter 在 X ="2-3*5"那一行... 210.58.156.43 06/11
TrueFeeling:對,我是直接複製貼上220.141.159.236 06/11
※ 編輯: TrueFeeling 來自: 220.141.159.236 (06/11 21:23) > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:53:12 2005 ※ 引述《fumizuki (小獅子)》之銘言: : 不是這樣的意思... : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc : SplitProc: : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return : 的執行順序是 : GoSub SplitProc : op1 = Left(s, p - 1) : op2 = Mid(s, p + 1) : Return : Eval = Eval(op1) + Eval(op2) : GoTo EndProc : Return 是回到原地,但是並不是重覆再執行已執行過的東西, : 那樣子毫無意義,會變成無窮迴圈... 有一個問題就是: 如果Return不是重頭開始的話, 那Eval = Eval(op1) + Eval(op2)"執行完",就會跳出Function 所以執行完的意思是執行到Eval = Eval(op1) + Eval(op2)的時候會自動的把每一個 Eval再重新重頭執行,然後算出值,最後才GoTo EndProc囉? -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:56:08 2005 : 你怎麼打的? : ? Eval("2^-1*2") : 1 : ? 2^-1*2 : 1 : 沒有問題呀... 喔,我的意思是我直接輸入計算機2^-1*2(用按鈕按) 然後按下ENTER,然後Lable1會出現0.5 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236
fumizuki:你程式碼有錯? 210.58.156.43 06/11
> -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 17:59:55 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : ※ 引述《fumizuki (小獅子)》之銘言: : : 不是這樣的意思... : : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc : : SplitProc: : : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return : : 的執行順序是 : : GoSub SplitProc : : op1 = Left(s, p - 1) : : op2 = Mid(s, p + 1) : : Return : : Eval = Eval(op1) + Eval(op2) : : GoTo EndProc : : Return 是回到原地,但是並不是重覆再執行已執行過的東西, : : 那樣子毫無意義,會變成無窮迴圈... : 有一個問題就是: : 如果Return不是重頭開始的話, : 那Eval = Eval(op1) + Eval(op2)"執行完",就會跳出Function : 所以執行完的意思是執行到Eval = Eval(op1) + Eval(op2)的時候會自動的把每一個 : Eval再重新重頭執行,然後算出值,最後才GoTo EndProc囉? 沒錯 Return 是回到 GoSub ,執行下一行敘述 → Eval = Eval(op1) + Eval(op2) 在此會呼叫 Eval,得到 op1 的值後,再呼叫另一次 Eval,得到 op2 的值 然後,相加,存回前面那個 Eval 變數, 最後 Goto EndProc -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43
TrueFeeling:嗯嗯,了解了^^220.141.159.236 06/11
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 18:04:30 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : : 你怎麼打的? : : ? Eval("2^-1*2") : : 1 : : ? 2^-1*2 : : 1 : : 沒有問題呀... : 喔,我的意思是我直接輸入計算機2^-1*2(用按鈕按) : 然後按下ENTER,然後Lable1會出現0.5
fumizuki:你程式碼有錯?
有,就是如果加上 If p > 0 Then GoSub SplitProc: Eval = Eval(op1) ^ Eval(op2): GoTo EndProc 的話 如果去掉的話,怎麼算都是對的 -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236
fumizuki:你沒照我剛才貼上的來執行... 210.58.156.43 06/11
fumizuki:你有照我貼上來的程式碼去執行嗎 210.58.156.43 06/11
TrueFeeling:嗯,確實可以^^220.141.159.236 06/11
TrueFeeling:還有一個疑問,函數名一定要用Eval嗎220.141.159.236 06/11
TrueFeeling:試過了,不用^^220.141.159.236 06/11
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 20:42:42 2005 續上次做到一半的計算機: 在Stop之前都可以正常運作 之後是因為宣告二維陣列出問題嗎 出現了錯誤消息: --------------------- Run-time error'9' Script out of range --------------------- ++++ 程式草稿: http://0rz.net/2d0qK ++++ Dim A() As Double Dim B() As String Dim GS() As Double Dim C() Dim D() Dim Accumulation() Dim GA() As Double Dim X, Y, Z Private Sub Command1_Click(Index As Integer) Text1.Text = Text1.Text & Index Text5.Text = Text5.Text & Index End Sub Private Sub Command2_Click(Index As Integer) Text1.Text = Text1.Text & Command2(Index).Caption Text5.Text = Text5.Text & Command2(Index).Caption End Sub Private Sub Command3_Click() X = Val(Text2.Text) Y = Val(Text3.Text) Z = Val(Text4.Text) H = Text1.Text N = 0 Do ReDim Preserve A(N) ReDim Preserve B(N) O = InStr(1, H, "+") P = InStr(1, H, "-") If O > 0 And P > 0 Then If O < P Then A(N) = O Else A(N) = P End If ElseIf O > 0 Then A(N) = O Else A(N) = P End If If A(N) = 0 Then B(N) = H: Exit Do B(N) = Left(H, (A(N) - 1)) H = Mid(H, A(N) + 1) N = N + 1 Loop Stop For I = 1 To N Do ReDim Preserve C(I, M) ReDim Preserve D(I, M) Q = InStr(1, B(I), "*") R = InStr(1, B(I), "/") If Q > 0 And R > 0 Then If Q < R Then C(I, M) = Q Else C(I, M) = R End If ElseIf Q > 0 Then C(I, M) = Q Else C(I, M) = R End If If C(I, M) = 0 Then D(I, M) = B(I): Exit Do D(I, M) = Left(B(I), (C(I, M) - 1)) B(I) = Mid(B(I), C(I, M) + 1) M = M + 1 Loop Next I Stop ReDim Preserve GA(I, J) For I = 0 To N For J = 0 To M GA(I, J) = Val(D(I, J)) Next J Next I For I = 0 To N For J = 0 To (N - 1) C(I, J + 1) = C(I, J + 1) + C(I, J) If Mid(B(I), C(I, J), 1) = "*" Then GA(I, J + 1) = Val(GA(I, J + 1)) Else GA(I, J + 1) = 1 / Val(GA(I, J + 1)) End If Next J Next I Accumulation(I) = 1 For I = 0 To N For J = 0 To M Accumulation(I) = Accumulation(I) * GA(I, M) Next J Next I H = Text1.Text ReDim Preserve GS(N) For I = 0 To N GS(I) = Val(Accumulation(I)) Next I For I = 0 To (N - 1) A(I + 1) = A(I + 1) + A(I) If Mid(H, A(I), 1) = "+" Then GS(I + 1) = Val(GS(I + 1)) Else GS(I + 1) = -Val(GS(I + 1)) End If Next I Sum = 0 For I = 0 To N Sum = Sum + GS(I) Next I Label1.Caption = Sum End Sub Private Sub Command4_Click() Text1.Text = "" Text5.Text = "" Label1.Caption = "" End Sub Private Sub Command5_Click() End End Sub Private Sub Command6_Click() Text1.Text = Text1.Text + Text2.Text Text5.Text = Text5.Text + "X" End Sub Private Sub Command7_Click() Text1.Text = Text1.Text + Text3.Text Text5.Text = Text5.Text + "Y" End Sub Private Sub Command8_Click() Text1.Text = Text1.Text + Text4.Text Text5.Text = Text5.Text + "Z" End Sub Private Sub Command9_Click() Text1.Text = Left(Text1.Text, Len(Text1.Text) - 1) Text5.Text = Left(Text5.Text, Len(Text5.Text) - 1) End Sub -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 ※ 編輯: TrueFeeling 來自: 220.141.159.236 (06/11 20:43) ※ 編輯: TrueFeeling 來自: 220.141.159.236 (06/11 20:45) ※ 編輯: TrueFeeling 來自: 220.141.159.236 (06/11 20:48) ※ 編輯: TrueFeeling 來自: 220.141.159.236 (06/11 20:48) ※ 編輯: TrueFeeling 來自: 220.141.159.236 (06/11 20:55)
fumizuki:說過了,多維陣列,只有最後一個上限可以變更 210.58.156.43 06/11
fumizuki:前面的上限不管變大變小都會錯誤 210.58.156.43 06/11
fumizuki:這是沒有辦法的 210.58.156.43 06/11
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sat Jun 11 21:08:59 2005 ※ 引述《TrueFeeling (昨日之死)》之銘言: : 續上次做到一半的計算機: : 在Stop之前都可以正常運作 : 之後是因為宣告二維陣列出問題嗎 : 出現了錯誤消息: : --------------------- : Run-time error'9' : Script out of range : --------------------- : ++++ : 程式草稿: : http://0rz.net/2d0qK : ++++ : Stop : For I = 1 To N : Do : ReDim Preserve C(I, M) : ReDim Preserve D(I, M) 剛剛測試的結果,問題好像出在上面這兩行 所以應該是二維陣列用法錯誤 好像宣告二維陣列前面那一維必須是常數? : Q = InStr(1, B(I), "*") : R = InStr(1, B(I), "/") -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236
LPH66:沒錯 ReDim只能重訂最後一維的維度 61.62.178.179 06/11
TrueFeeling:因為我以為前面那個N已經固定了,所以前面220.141.159.236 06/11
TrueFeeling:那一維不會被改變,結果他根本只接受常數的樣220.141.159.236 06/11
TrueFeeling:子220.141.159.236 06/11
fumizuki:不是常數的問題 210.58.156.43 06/11
fumizuki:請看我上面回的 210.58.156.43 06/11
fumizuki:第1024篇 210.58.156.43 06/11
TrueFeeling:但是我的N在第1個DoLoop的時候已經不會變了220.141.159.236 06/11
fumizuki:不是N的關係,是I 210.58.156.43 06/12
fumizuki:就說前面的上限都不能變 210.58.156.43 06/12
fumizuki:你原本就沒有指定上限,只個一維陣列 210.58.156.43 06/12
fumizuki:你在迴圈中宣告成二維陣列,一定會錯誤的 210.58.156.43 06/12
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sun Jun 12 00:33:20 2005 ※ 引述《fumizuki (小獅子)》之銘言: : 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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 發現Bug : End If 如果2^2+3^3-4^2 依照原式: 會變成 2^2+3^3+(-4)^2=50 如果改成 Eval = Eval(op1) - Eval(op2) 則2^2+3^3-4^2=15正確 但是我擔心補這洞,破另一個洞 不知道還有沒有Bug -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sun Jun 12 00:55:25 2005 ※ 引述《fumizuki (小獅子)》之銘言: : ElseIf op1 = "/" Then : p = p - 1: GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc ^^^^^^^^^^^^^^^^^^^^ 又發現Bug了 依照原式 5/-2*5=5/(-2*5)=0.5 100/-2/-2=100/(-2/-2)=100 100/5/5=100/(5/5)=100 這我就不知道怎麼改了T.T -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.159.236 ※ 編輯: TrueFeeling 來自: 220.141.159.236 (06/12 01:07) ※ 編輯: TrueFeeling 來自: 220.141.159.236 (06/12 01:12)
fumizuki:發現這樣的想法是大錯特錯,重新思考中.... 210.58.156.43 06/12
> -------------------------------------------------------------------------- < 作者: fumizuki (小獅子) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sun Jun 12 10:57:22 2005 Public Function Eval(s As String) '解開方程式的值 Dim p As Integer, f As Integer, op1 As String, op2 As String Dim a As String, o As String '第一次進入函式,把空白全去除掉。 Static c As Integer: c = c + 1 If c = 1 Then s = Replace(s, " ", "") '加法運算 o = "+": GoSub SearchProc If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc '減法運算 o = "-": GoSub SearchProc If p > 0 Then GoSub SplitProc: Eval = Eval(op1) - Eval(op2): GoTo EndProc '乘法運算 o = "*": GoSub SearchProc If p > 0 Then GoSub SplitProc: Eval = Eval(op1) * Eval(op2): GoTo EndProc '除法運算 o = "/": GoSub SearchProc If p > 0 Then GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc '指數運算 o = "^": GoSub SearchProc If p > 0 Then GoSub SplitProc If op1 Like "-*" Then Eval = -Eval(Mid(op1, 2)) ^ Eval(op2) Else Eval = Eval(op1) ^ Eval(op2) End If GoTo EndProc End If Eval = Val(s) EndProc: c = c - 1: Exit Function SearchProc: p = Len(s) + 1 Do p = InStrRev(s, o, p - 1) If o = "^" Then Exit Do If p <= 1 Then f = 0 '首字忽略;找不到則離開迴圈 Else a = Mid(s, p - 1, 1) If a = "+" Or a = "-" Or a = "*" Or a = "/" Or a = "^" Then f = 1 Else f = 0 End If End If Loop While f = 1 If p = 1 Then p = 0 Return SplitProc: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return End Function -- VB 程式設計 倉木麻衣 PTT 星爺板 行列輸入法 ====================================================== Visual_Basic MaiKuraki Stephen Array -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.58.156.43 ※ 編輯: fumizuki 來自: 210.58.156.43 (06/12 15:31) ※ 編輯: fumizuki 來自: 210.58.156.43 (06/12 15:36) > -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sun Jun 12 13:54:08 2005 ※ 引述《fumizuki (小獅子)》之銘言: : SearchProc: : p = Len(s) + 1 : Do : p = InStrRev(s, o, p - 1) : If p <= 1 Then : f = 0 '首字忽略;找不到則離開迴圈 : Else : a = Mid(s, p - 1, 1) : If a = "+" Or a = "-" Or a = "*" Or a = "/" Or a = "^" Then : f = 1 這邊的用意是?(看不懂) : Else : f = 0 : End If : End If : Loop While f = 1 : If p = 1 Then p = 0 : Return SearchProc2:怎麼完全沒用到@@ : SearchProc2: -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.158.129
fumizuki:表示忽略這個字,迴圈繼續跑,續續找下一個... 210.58.156.43 06/12
fumizuki:2那個原本以為 ^ 的順序是反過來的 210.58.156.43 06/12
fumizuki:結果不是,所以那個沒有用了 210.58.156.43 06/12
fumizuki:現在還不知道那個-3次方是怎麼回事 /.\ 210.58.156.43 06/12
TrueFeeling:從後面找回來這招真妙220.141.158.129 06/12
※ 編輯: TrueFeeling 來自: 220.141.158.129 (06/12 14:51)
TrueFeeling:你說-3次方是怎麼回事220.141.158.129 06/12
fumizuki:上一篇文章 210.58.156.43 06/12
TrueFeeling:喔,電腦的習慣和人不同,人看的董就好了^^220.141.158.129 06/12
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Sun Jun 12 15:17:02 2005 ※ 引述《fumizuki (小獅子)》之銘言: : '指數運算 : o = "^": GoSub SearchProc 指數前面應該不會有人打+-*/號吧??? : If p > 0 Then : GoSub SplitProc : If op1 Like "-*" Then : Eval = -Eval(Mid(op1, 2)) ^ Eval(op2) : Else : Eval = Eval(op1) ^ Eval(op2) : End If : GoTo EndProc : End If : Eval = Val(s) : EndProc: : c = c - 1: Exit Function : SearchProc: : p = Len(s) + 1 : Do : p = InStrRev(s, o, p - 1) : If p <= 1 Then : f = 0 '首字忽略;找不到則離開迴圈 : Else : a = Mid(s, p - 1, 1) : If a = "+" Or a = "-" Or a = "*" Or a = "/" Or a = "^" Then : f = 1 : Else : f = 0 : End If : End If : Loop While f = 1 : If p = 1 Then p = 0 : Return : a = Mid(s, p - 1, 1) : If a = "+" Or a = "-" Or a = "*" Or a = "/" Or a = "^" Then : f = 1 : Else : f = 0 : End If : End If : Loop While f = 1 : If p = 1 Then p = 0 : Return -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.158.129
fumizuki:的確是不會 210.58.156.43 06/12
fumizuki:修掉了... 210.58.156.43 06/12
TrueFeeling:修在哪裡220.141.158.129 06/12
fumizuki:在SearchProc裏 多一行 210.58.156.43 06/12
TrueFeeling:如果把: GoSub SearchProc刪掉是不是也可以220.141.158.129 06/12
fumizuki:不行 210.58.156.43 06/12
TrueFeeling:對吼,還有p220.141.158.129 06/12
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Mon Jun 13 17:24:00 2005 ※ 引述《fumizuki (小獅子)》之銘言: : Public Function Eval(s As String) : '解開方程式的值 : Dim p As Integer, f As Integer, op1 As String, op2 As String : Dim a As String, o As String : '第一次進入函式,把空白全去除掉。 : Static c As Integer: c = c + 1 : If c = 1 Then s = Replace(s, " ", "") : '加法運算 : o = "+": GoSub SearchProc : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc : '減法運算 : o = "-": GoSub SearchProc : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) - Eval(op2): GoTo EndProc : '乘法運算 : o = "*": GoSub SearchProc : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) * Eval(op2): GoTo EndProc : '除法運算 : o = "/": GoSub SearchProc : If p > 0 Then GoSub SplitProc: Eval = Eval(op1) / Eval(op2): GoTo EndProc : '指數運算 : o = "^": GoSub SearchProc : If p > 0 Then : GoSub SplitProc : If op1 Like "-*" Then : Eval = -Eval(Mid(op1, 2)) ^ Eval(op2) : Else : Eval = Eval(op1) ^ Eval(op2) : End If : GoTo EndProc : End If : Eval = Val(s) : EndProc: : c = c - 1: Exit Function : SearchProc: : p = Len(s) + 1 : Do : p = InStrRev(s, o, p - 1) 為什麼我把下面的a放到這裡就執行錯誤了?? = = a = Mid(s, p - 1, 1) : If o = "^" Then Exit Do : If p <= 1 Then : f = 0 '首字忽略;找不到則離開迴圈 : Else : a = Mid(s, p - 1, 1) : If a = "+" Or a = "-" Or a = "*" Or a = "/" Or a = "^" Then : f = 1 : Else : f = 0 : End If : End If : Loop While f = 1 : If p = 1 Then p = 0 : Return : SplitProc: : op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return : End Function -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.72.67
fumizuki:因為你p可能會小於1,減1變成0,Mid不接受 61.222.155.162 06/13
fumizuki:那是不合理的數字 61.222.155.162 06/13
TrueFeeling:明白了 218.162.72.67 06/13
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Tue Jun 14 00:19:36 2005 剛剛下午試著加入絕對值的計算功能 不知道哪裡做錯了 (不過迴圈那邊應該沒有錯,因為沒有用絕對值來跑的時候是OK的!!!) === 程式草稿: http://rapidshare.de/files/2358986/AAA.rar.html === Private Sub Command1_Click(Index As Integer) If Option1(0).Value Then Text1.Text = Text1.Text & Index Text5.Text = Text5.Text & Index ElseIf Option1(1).Value Then Text2.Text = Text2.Text & Index ElseIf Option1(2).Value Then Text3.Text = Text3.Text & Index ElseIf Option1(3).Value Then Text4.Text = Text4.Text & Index End If End Sub Private Sub Command10_Click() If Option1(0).Value Then Text1.Text = Text1.Text & Command10.Caption Text5.Text = Text5.Text & Command10.Caption ElseIf Option1(1).Value Then Text2.Text = Text2.Text & Command10.Caption ElseIf Option1(2).Value Then Text3.Text = Text3.Text & Command10.Caption ElseIf Option1(3).Value Then Text4.Text = Text4.Text & Command10.Caption End If End Sub Private Sub Command2_Click(Index As Integer) Text1.Text = Text1.Text & Command2(Index).Caption Text5.Text = Text5.Text & Command2(Index).Caption End Sub Private Sub Command3_Click() Label1.Caption = G(Text1.Text) End Sub Function G(s As String) Dim p As Integer, F As Integer, I As String, J As String Dim a As String, o As String, b As String, u As Integer Static c As Integer: c = c + 1 If c = 1 Then s = Replace(s, " ", "") o = "+": GoSub L20 If p > 0 Then GoSub L40: G = G(I) + G(J): GoTo L10 o = "-": GoSub L20 If p > 0 Then GoSub L40: G = G(I) - G(J): GoTo L10 o = "*": GoSub L20 If p > 0 Then GoSub L40: G = G(I) * G(J): GoTo L10 o = "/": GoSub L20 If p > 0 Then GoSub L40: G = G(I) / G(J): GoTo L10 o = "^": GoSub L20 If p > 0 Then GoSub L40 If I Like "-*" Then G = -G(Mid(I, 2)) ^ G(J) Else G = G(I) ^ G(J) End If GoTo L10 End If o = "Abs": GoSub L30 If p = 0 Then ElseIf p = 1 Then GoSub L50: G = G(I & J) ElseIf p > 1 Then a = Mid(s, p - 1, 1) If a = "+" Then GoSub L60: G = G(I & J) ElseIf a = "-" Then GoSub L70: G = G(I & J) Else GoSub L50: G = G(I & J) End If GoTo L10 End If G = Val(s) L10: c = c - 1: Exit Function L20: p = Len(s) + 1 u = 0 Do Do p = InStrRev(s, o, p - 1) If o = "^" Then Exit Do If p <= 1 Then F = 0 And u = u + 1 Else a = Mid(s, p - 1, 1) If a = "+" Or a = "-" Or a = "*" Or a = "/" Or a = "^" Then F = 1 And u = 0 Else F = 0 And u = u + 1 End If End If Loop While F = 1 If p <= 3 Then F = 0 And u = u + 1: Exit Do Do p = InStrRev(s, o, p - 3) If p <= 3 Then F = 0 And u = u + 1 Else b = Mid(s, p - 3, 3) If b = "Abs" Then F = 1 And u = 0 Else F = 0 And u = u + 1 End If End If Loop While F = 1 Loop While u < 2 If p = 1 Then p = 0 Return L30: p = InStrRev(s, o): Return L40: I = Left(s, p - 1): J = Mid(s, p + 1): Return L50: I = Left(s, p - 1): J = Abs(Val(Mid(s, s + 3))): Return L60: I = Left(s, p - 1): J = Abs(Val(Mid(s, s + 4))): Return L70: I = Left(s, p - 1): J = -Abs(Val(Mid(s, s + 4))): Return End Function Private Sub Command4_Click() Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" Text5.Text = "" Label1.Caption = "" End Sub Private Sub Command5_Click() End End Sub Private Sub Command6_Click() If Option1(0).Value Then Text1.Text = Text1.Text + Text2.Text Text5.Text = Text5.Text + "X" Else End If End Sub Private Sub Command7_Click() If Option1(0).Value Then Text1.Text = Text1.Text + Text3.Text Text5.Text = Text5.Text + "Y" Else End If End Sub Private Sub Command8_Click() If Option1(0).Value Then Text1.Text = Text1.Text + Text4.Text Text5.Text = Text5.Text + "Z" Else End If End Sub Private Sub Command9_Click() If Option1(0).Value Then If Len(Text1.Text) >= 1 Then Text1.Text = Left(Text1.Text, Len(Text1.Text) - 1) Text5.Text = Left(Text5.Text, Len(Text5.Text) - 1) Else End If ElseIf Option1(1).Value Then If Len(Text2.Text) >= 1 Then Text2.Text = Left(Text2.Text, Len(Text2.Text) - 1) Else End If ElseIf Option1(2).Value Then If Len(Text3.Text) >= 1 Then Text3.Text = Left(Text3.Text, Len(Text3.Text) - 1) Else End If ElseIf Option1(3).Value Then If Len(Text4.Text) >= 1 Then Text4.Text = Left(Text4.Text, Len(Text4.Text) - 1) Else End If End If End Sub -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.162.72.67 ※ 編輯: TrueFeeling 來自: 218.162.72.67 (06/14 00:42)
fumizuki:Mid(s, s + 3) ?????? 210.58.156.43 06/14
> -------------------------------------------------------------------------- < 作者: TrueFeeling (昨日之死) 看板: Visual_Basic 標題: Re: [VB6 ] 計算機 時間: Tue Jun 14 12:40:51 2005 : L50: : I = Left(s, p - 1): J = Abs(Val(Mid(s, s + 3))): Return 例如說:Text = "Abs-33" 從後面開始搜尋Abs I="" J = "-33" 從A之後的第3個字元的後面全部當做一個字串 然後G = G(I & J) = G( "" & 33 ) 例如說:Text = "AbsAbs-33" 從後面開始搜尋Abs I="Abs" ; J = "Abs-33" 從A之後的第3個字元的後面全部當做一個字串 然後G = G(I & J) = G("Abs" & 33) -- 少年讀書,如隙中窺月; 中年讀書,如庭中望月; 老年讀書,如臺上玩月。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.157.129 ※ 編輯: TrueFeeling 來自: 220.141.157.129 (06/14 13:01) ※ 編輯: TrueFeeling 來自: 220.141.157.129 (06/14 13:13)