推 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)