作者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