That's It!

請按左下角 Older Post 看較舊文章,搜尋出來的也可!

Casio fx-50FH 的程式模式

大家都應該知道 Casio 很多計算機都有內置的程式模式,以編寫不同的程式,用作建立一些特別的功能和進行一些特別的計算,以滿足不同方面、不同計算機用家的需要。而 Casio fx-50FH 則內置了 680 bytes 的空間,可供大家輸入程式。

但是,這個程式模式又怎樣用的? 怎樣編寫一個好的 Casio fx-50FH 程式? 其實這不簡單。以下,就是要注意的幾個地方。

另外,如果大家還是看不明白,請試試再看 WebCal 計數機網頁,或到站長的論壇發問也可。

 

輸入程式:

首先按 MODE 6,就會出現 3 個選擇: EDIT (1),RUN (2) 和 DEL (3)

按 1 即可進入編輯模式,按 2 即可進入執行模式,按 3 即可進入刪除模式。另外進入後也可以按 AC 到編輯模式,EXE 到執行模式,DEL 到刪除模式。

另外執行模式其實沒有什麼特別用途,因為在其他模式中直接按 Prog 也可以執行程式。

輸入或編輯程式的話則請按 1。接著將會顯示 EDIT PROGRAM P – 1234 XXX。
XXX是一個小於或等於 680 的數字,表示你還有的程式空間(單位: byte)。每輸入一個字元、函數或指令即會使用 1 byte。螢幕上方還有四顆小燈,如果亮了即是顯示該程式位置有程式碼。總共會有 4 個程式區。

接著請選程式位置,只要是空的即可,如果沒有入過程式的話即 可按 1 選第一個程式位置 (當然其他都可以)。

接著選模式: 有 1 -5 模式。程式為了作出不同的計算,會在不同模式中建立。注意: 模式只可以在輸入程式前選擇,輸入程式後不 能修改輸入的模式。

然後就是輸入程式了。按 Prog 可以選擇指令,也可按 Replay 左或右選其他。

 

指令用法:

這裡就是說指令用法:

 

首先站長喜歡用這種說法: 程式中其實是把數字記憶作出改變。

其實,在 Casio fx-50FH 中,有著 7 個不同的記憶(也稱為變量),每個都可以記著一個數字。我們可以提取或改變數字記憶裡的值。

要提取數字記憶,按 RCL (數字記憶)。例如: 看見 (-) 按鈕上面有一個粉紅色的 A 字嗎? 所以提取 A 記憶即是按 RCL (-)。又例如: 提取 D 就是按 RCL sin。

要輸入則按 SHIFT RCL。

例如: 把 1 儲存到 A 中,則是按 1 SHIFT RCL (-)。

又例如: 把 A 的數字加上 1,則是按 1 + RCL A SHIFT RCL (-) (即1+A→A,把 1+A 的數值儲進A)。

注意用RCL 或 SHIFT RCL 則不用再按多次 EXE。

要提取數字記憶到算式中,則可以按 ALPHA (數字記憶)。

例如: 計算 A 記憶乘 5 的結果,則是按 5 ALPHA A EXE

另外,稱為獨立記憶的 M 也有特別的用法,就是 M+ 和 M-。

M+ 和 M- 的作用是把數字加到記憶中或從記憶中減去數字,答案也會自動存到 M 中。

例如: 把 M 的數字加上 1,這樣當然我們可以按出算式 M+1→M,但更短的算式是 1M+。

又例如: 把 M 的數字減去 3 ,這樣是可以按出 M-3→M,但最好也是 3M-。

 

實際例子: 按 5 SHIFT RCL M+ 3 M+ RCL M

5 SHIFT RCL M+ 即是 5→M。

3 M+ 後,M 變成 8 (即3+5),再提取 M 按 RCL M 即是顯示 8。

 

那麼現在就說 3 個最基本的指令: 「?」「→」和「:」

首先,→ 和在正常模式中的沒有分別,也可以按 SHIFT RCL 得出,是指把→前面的值儲存到後面的變量,所以 → 後面一定要有一個變量才可以。

 

? 符號則只可以在 → 前面輸入。

? 的作用是把程式站時停下來,要求使用者輸入一個數字,並會把數字儲存到 → 後面的變量,同時也會顯示後面變量的數值。例如: ?→A,即是把計算機程式停下來,然後要求使用者輸入一個數字,而這數字會儲存在 A 中,當然也會同時顯示了 A 現在的值。注意 ?→ (變量) 並不會改變答案記憶 (Ans)。

 

「:」則是用來分隔算式或命令的。

當然,程式中不只可能有一句命令或算式,所以就要用了。

另外,程式執行到最尾完成後,會顯示最後命令或算式的答案。

例如: 如果要輸入一個數字,然後把該數字加 1 的答案顯示出來:

?→A: A+1

起初 ?→A,輸入數字並儲存在 A,然後把 A+1 即可以顯示出輸入數字 +1 的答案。

 

「◢」指令

對,你可能會問: 很多時程式會輸出不止一個答案,那麼怎樣才可以輸出多於一個答案? 答案就是用◢ 指令。

例如: 如果要輸入一個數字,然後先把該數字 +1 的答案顯示出來,再把該數字的 2 倍顯示出來:

?→A: A+1◢ 2A

起初 ?→A,輸入數字並儲存在 A,然後把 A+1 即可計算出該輸入的數字 +1,然後到◢,◢會把計算機程式停下來,然後顯示◢ 前面算式 (也就是 A+1) 的答案。然後再按 EXE,程式會繼續,最後會顯示 2A 的答案。由於程式到最後了,會自動顯示答案,所以程式最後不需要加◢ 也可。

 

2 個無條件轉移指令: Goto 和 Lbl (用作轉移或 loop)

Goto 和 Lbl 後面都要加上一個 0-9 的數字以表示組合。
執行到 Goto 指令,程式將會由相對的 Lbl 指令開始繼續執行。
例如: 執行到 Goto 0,程式則會繼續由 Lbl 0 開始執行。

例如以下程式: 輸入一個數字,然後每次把得出結果乘 2。例如輸入 2,則會順序輸出 4,8,16,32…

?→A: A: Lbl 0: 2Ans◢ Goto 0

起初程式 ?→A 問了 A 是多少,接著便執行 2Ans (顯示4),然後按 EXE,由於到了 Goto 0,所以由 Lbl 0 再開始執行,所以就會再次計算 2Ans (顯示8),然後就一直重覆。

所以程式就會輸出 4,8,16,32…

 

關係運算子函數

關係運算子函數是以下數個:  「>」、「≧」、「<」、「≦」、「=」和「≠」。

在數學上的意思,相信大家都知道,但在計算機的意思卻是截然 不同。

這個關係運算子函數可以連結著兩個數字,算式或變量,組成一 條算式。

如果結果為真,則算式答案為 1。如果是假則為 0。

例如: 3 >5 的答案為 0,5≧5 的答案為 1。

進一步的用法則可以用變量於有關係運算子函數的算式中,這可 以用作決定程式下一步的路向。

例如: ?→A: A>0

如果輸入 -5,由於 -5 >0 是錯誤,所以程式最終顯示 0。

如果輸入 2 ,由於 2 >0,所以程式最終顯示 1。

 

條件轉移指令「 =>」(雙箭號)

「 =>」可以用於在符合某些條件的情況下才要執行一段程式時使用。

用法: 如果 => 前面算式的答案為非 0,則會照常執行,由 => 開始繼續執行程式。

如果 => 前面算式的答案為 0,則會跳過由 => 至下一個「:」或「◢」中間的命令或算式,然後繼續執行。

=> 常配搭著 Goto 指令使用。

 

例子1: ?→A: A<0=>A+10→A: A2

輸入 A 為 5,由於 5 <0 為錯誤,所以直接計算A2,顯示答案 25。

輸入 A 為 -3,由於 -3 <0 為正確,所以先把 A加上10 (這時 A 為 7),再計算計算A2,顯示答案 49。

 

例子2: ?→A: A<0=>A+10→A◢ A2

與例子 1 不同:

輸入 A 為5,由於 5 <0 為錯誤,所以直接計算A2,顯示答案 25。

輸入 A 為 -3,由於 -3 <0 為正確,所以先把 A加上10 (這時 A 為 7),但由於用了◢,所以會先顯示答案為 7,用家按 EXE 後才再計算計算A2,顯示答案 49。

 

If 系列命令 (If, Then, Else, IfEnd)

格式:

If (算式):

Then (算式或命令): … : (算式或命令):

Else (算式或命令): … : (算式或命令):                   ( Else 這行可以省略)

IfEnd:

(繼續程式)

首先計算機會判斷 If 後面算式的值。如果是非 0 的數字則會繼續執行 Then 後面的算式或命令,直至 Else 出現,到了 Else 後就會直接跳到 IfEnd 繼續執行程式。

如果判斷 If 後面算式的值時,算式值是 0,則會改為立即跳過 Then 和 Else 之間的算式或命令,然後由 Else 開始,一直繼續執行。

注意: 如果 IfEnd 在程式最尾則可以省略,另外如果沒有輸入 Else,在 If 後面算式為錯誤時會直接跳至 IfEnd。

If 系列指令常被用作把程式分開兩部分,在不同時候執行不同部分。

例子: ?→A: If A>0: Then A+1→A: √(A->B: Else A -1→A: A2→B: IfEnd: B

輸入 A 為 2,由於 2>0 為正確,將會執行 A+1→A: √(A->B,所以 B 最後顯示 1.7321 (即√3)。

輸入了 A 為 -6時,由於 -6 >0 為錯誤,將會執行A -1→A: A2→B,所以 B 最後顯示 49 (即(-7))

適當地使用 If 系列指令可以節省程式空間。

 

While 系列命令 (While, WhileEnd)

格式:

While (算式):

(算式或命令): … : (算式或命令):

WhileEnd

首先計算機會判斷 While 後面的算式的值,也是分為兩種情況:

算式值為 0: 則直接跳過整個結構,到 WhileEnd 後繼續程式。

算式值非 0: 首先執行 While 至 WhileEnd 中間的算式或命令,直至 WhileEnd,然後計算機會把 While 後面的算式再檢查一次是否正確,如果這次檢查是錯誤的話,則到 WhileEnd 後繼續程式。如果這次也是正確,則再執行一次 While 至 WhileEnd 中間的算式或命令,直至 WhileEnd,然後再次檢查。如此重覆,直至遇到算式為 0 就會終止,繼續執行 WhileEnd 後的程式。

例子: ?→A: While A<10: A+1→A◢ WhileEnd: A+1

起初輸入 15,由於 15 <10 為錯誤,所以就會立即跳到 WhileEnd 後,執行 A +1,所以顯示 16。

起初輸入 7,由於 7 <10 為正確,所以會執行 While 和 WhileEnd 之間的 A+1→A◢ (顯示8),而到了 WhileEnd,由於 8 仍然是 8 <10 為正確,所以再會執行 A+1→A◢ (顯示9),然後會再執行一次 A+1→A◢ (顯示10),這時由於 10 <10 為錯誤,所以就會執行 WhileEnd 後的指令 (A+1),最後顯示11。

 

For 系列指令 (For, To, Next, Step)

格式:

For (算式)→(變量) To (算式) Step (算式): (算式或命令): … : (算式或命令): Next

Step (算式) 如果省略了則默認為 1。另外 For (算式)→(變量) To (算式) Step (算式) 中間是沒有「:」的

起初 For (算式)→(變量)是指定開始時的數值。

For 算式的值有兩種情況: 小於或等於 To 後算式 或 大於 To 後算式。

大於 To 後算式: 直接由 Next 後繼續程式。

小於或等於 To 後算式: 先把 For 變量加上 Step 數值 (沒有指定即加 1) ,接著執行中間的 (算式或命令): … : (算式或命令),直至 Next。接著計算機將會判斷新的 For 變量是否大於 To 後算式,如果是大於的話則由 Next 繼續程式,不是的話則繼續再執行中間的 (算式或命令): … : (算式或命令),直至大於 To 後算式為止。

例子: ?→A: For A→A To 10: A◢ Next: A+1

起初輸入 A 為 15,由於 15 >10,所以便直接執行 Next 後的 A+1 (顯示16)。

起初輸入 A 為 7,由於 7≦10,所以 A 會先加 1 (Step),顯示 A 為 8,接著由於 8≦10,所以 A 會加 1 變成 9,故 A 為 9。接著由於下兩次 9≦10 和 10≦10 也正確,所以 A 會最終變成 11。由於 11≦10 為錯誤,所以就跳到 Next 後執行 A+1 (顯示12)。

 

Break 指令 (需在 While 或 For 結構中使用)

如果在 While 或 For 結構中執行到 Break 指令,則不論條件為何,也立即停止執行,離開 While 或 For 結構,到 WhileEnd 或 Next 後面繼續執行。

例子: ?->A: While 1: A = 3.5=>Break: A+1→A◢ WhileEnd: 12345

輸入 A 為 1,由於 While 後面算式為 1 (永遠非0),故一般情況下程式不會離開 While 結構執行。另外,由於 1 加上多少次 1 都不會出現 3.5,所以即使有 Break,也不能離開 While 結構。

輸入 A 為 2.5,由於 While 後面算式為 1 (永遠非0),故一般情況下程式不會離開 While 結構執行。另外,第一次執行完成 While 結構時 A 為 3.5,第二次執行時將會執行 Break,所以最後將會離開 While 結構,顯示 WhileEnd 後的 12345。

 

以上全部指令要注意只有數點:

1. Goto 和 Lbl 的組合只有 10 對 (0-9),所以請善用,另外參數不能使用變數,即 Goto 0 是可以,但 0→A: Goto A 則不能 (計算機設計限制)。

2. If 結構內不能有多一個 If 結構。可嘗試用 =>和 Goto 指令代替。

3. While 或 For 結構內不能有多一個 While 或 For 指令。

 

至於後期工作就是優化程式了。程式設計的好壞因素有很多方面。

首先要考慮以下幾點:

(I) 程式的長度

程式如果在不改變其用法、運算速度和功能的前提下,大多可以 縮短的都會縮短。不要以為計算機內的 680 bytes 十分多,其實不久之後,很大機會位置將會爆滿。所以,站長則認為編寫程式時,程式考慮的因素最先應是長度。

那麼如何縮短程式? 那就要善用 Casio fx-50FH 的指令了。

例子1: 以下是一個程式,每次按一下 EXE 數字會加 1。

0: Lbl 0: Ans+1◢  Goto 0

對,程式入面有一對 loop 的指令。如果一對指令中只有一個 Goto 和 一個 Lbl ,則可以像以下利用 While 指令簡化。

0: While 1: Ans+1◢ WhileEnd

由於 While 後的算式 1 是永遠正確,所以將可以無限循環。代替 Lbl 0 和 Goto 0。

 

例子2: 先計算一個數的10倍,再計算該數的十分之一。

通常人們把程式簡化得最簡也要這樣:

?→A: 10A◢ .1A

以為已經很短了!? 其實還可以短多1 byte。

?→A: 10A◢ Ans%

另外注意: 善用 M+ 和 M- 也可以節省長度,例如: 1+M->M 可以取代成 1M+。有時如果不是採用數字記憶 M 的話,則可以把整個數字記憶調換,例如: 有 1+A->A 則把 A 和 M 兩個記憶調換。

 

(II) 程式的功能

程式的功能也是十分重要的。除了計算出基本的答案之外,其實 還可以計算其他數值的話,表示這些數值的方法就是關乎大家的設計了。

例如: 一元二次方程 (Quadratic Equation)

對,Casio fx-50FH 已經內置了 FMLA 01 (Quadratic Equation) 了,但其實一元二次方程還有很多其他數值,例如: 判別式,複數(complex number)根,頂點座標,根式答案等,如果只是為了計出兩根,是十分不足夠的。

不過功能多並不代表操作煩瑣。就以以上例子,其實程式也可以 只顯示兩根,然後把其他數值儲存到不同的數字記憶。

 

(III) 程式的方便程度

首先,由於執行程式時會改變數字記憶,所以用較少數字記憶會 較好,也儘量不要用 ClrMemory 指令。否則,如果用家打算把一至兩個數字暫時儲存,將不能執行程式,十分不便。

其次,如果關於把計算出來的答案運算的話,注意程式可以考慮 在最前部分加入 Ans→(數字變量)。

最後,程式最好不會改變計算機的原有設定,否則要改回是十分 麻煩的。特別在 Casio fx-50FH 中有 FreqOn 和 FreqOff 的設定。如果轉為 FreqOn 的話還好,FreqOff 的話則會產生問題,特別很多用家都不會知道是 FreqOff 設定出了問題。另外,較小的問題是 Fix 0 等,因為如果沒有留意的話會不易察覺的。

 

(IV) 程式的誤差問題

很簡單的,如果用家輸入的所有數字都是分數的話,是沒有這個 問題的,但當輸入小數就很可能有問題了。

原因是因為如果最後小數位數少了兩至三個位的話,則會引致小 數不能轉回分數的情況。

用回一元二次方程: 方程 0.03x2-3.01x+1=0

下列兩個程式:

?→A: ?→B: ?→C: ( -B+ √(B2– 4AC))┘(2A◢( -B- √(B2-4AC))┘(2A

?→A: ?→B: ?→C: ( -B+ √(B2– 4AC))┘(2A – B┘A -Ans

方程 0.03x2-3.01x+1=0 其中一個根 (第二個顯示的答案) 為 1/3。由於以小數轉入係數,所以計算機顯示第二個根為 0.333333333。

如果用第一個程式,根可以順利化為分數,但第二個就不可以 了。這是因為算式的設計所引致的,特別是算式內兩個循環小數的相減很易引起誤差。所以,在編寫程式時要注意這些誤差引起的問題。本次的答案中,因為是簡單 的分數 1/3,所以轉不到分數的問題還不算很大,但如果答案是較複雜的循環小數,問題將會嚴重影響用家使用程式。

 

因為減法而出現的誤差是因為以下原因:

首先第一個根是 100。接著,由於使用了兩根之和減第一個根的方法計算第二個根,看上去好像誤差會比第一條式小。但是,由於算式 ( -B- √(B2– 4AC)) 答案為 0.02,分母為 0.06,結果除出來的結果誤差不會很大。

相反如果用第二個程式的方法計算的話,首先第一個根計算出整數 100,當然沒有誤差,但計算第二個根時,由於 – B┘A 計算出 100.333333333333 (計算機內部儲存 15 個位中 12 個 3),減去 Ans (100) 後即會出現只有 12 位有效數字的 0.333333333333。由於準確度不足,最終就會引到計算機不能把答案轉為分數。

所以,由加減循環小數而引起的誤差是絕對不可以忽視的。

 

(V) 程式的速度

速度的問題在程式中是十分嚴重的,因為程式很多時會用多次重 覆的方法來計算答案,所以計算的速度會較為重要。

計算的速度可以用以下的方法來優化:

1. 避免程式中不必要的運算

2. 把程式中的分號儘量在不影響誤差的情況下改為除號。特別是遇到平方根,三角函數等不會出現小數的情況下,用除號的準確度相同,但是會更快。

3. 重覆部分應避免使用不必要的函數。例如: 很多程式內也會有 (算式) 除以 2 的情況出現。如果用 .5(算式) 則沒有問題,但如果用 2 -1的話,多次重覆後速度將會慢很多。

例如以下兩個都是質數測試的程式,輸入質數出 0,非質數出 1。

程式 1: ?→A: Fix 0: 1→M: While M <√(A M+: A÷M: Ans=Rnd(Ans=>1◢ WhileEnd

程式2: Fix 0: 1→M: ?→A: While 2(M 2<AM+: A÷M: Ans=Rnd(Ans=>1◢ WhileEnd

兩個程式都可以得到相同的答案,但不同是程式 2 會快很多。這主要是因為程式 1 的原理是由 2 開始試除,每次加 1,如果遇到能整除就停止,如果到 √(A 還未出現因數,就判為質數。

程式 2 採用了差不多的道理,但如果數字是雙數,根本是不用測試,所以試雙數為因數是不必要的,反而會浪費時間。所以雖然程式 2 不能測試雙數,但由於只會測試單數為因數,所以速度將會快很多。

 

站長在此希望大家可以更加明白和努力編寫 Casio fx-50FH 的程式,幫助其他人計算更快!

One comment on “Casio fx-50FH 的程式模式

  1. stlam
    2013/10/28

    thx

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

Information

This entry was posted on 2012/11/13 by in 計算機tony200910041.

分類

Night

十一月 2012
« 十月   十二月 »
 123
45678910
11121314151617
18192021222324
252627282930  
Dropbox 載點暫時掛了,請嘗試使用其他載點!

%d 位部落客按了讚: