Casio Basic入門12

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 2014/03/03

 4. CasioBasicを使ってみる(続き)


Chapter 2 - 初級

◆ Chapter 2 の目標: 動きのあるプログラムを作る
簡単なアクションゲームを作る

前回: Casio Basic入門11


Chapter 2-6 で、「フライング」と「タイムアウト」に対応し、総合得点を計算して表示するまでを作りました。

プログラム名 CH2-6

0→P:20→L
Locate 1,1,"P:0"
Locate 1,3,"L:"
Locate 3,3,L

Lbl M

0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
    (頭にスペース1個)
Locate 1,2,"                "
    (スペース16個)

RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"

Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Locate 8,2," "
    (スペース1個)

0→C
Do
E=1⇒Break
C>L⇒Break
Isz C
LpWhile Getkey≠57
C>L⇒2→E
Locate 8,2,C

If E=2
Then
P-L→P
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L→P
IfEnd
IfEnd
IfEnd
Locate 3,1,"    "
    (スペ-ス4個)
Locate 3,1,P

Goto M



プログラムのブロック構造は、次のようになります。

[プログラム全体の初期化]

Lbl M

    [繰り返し処理の初期化]

    [アニメーション表示]

    [反応速度の測定&表示]

    [例外処理]

Goto M



今回は、ゲームオーバーの処理を作り込んでゆきます。



Chapter 2-7

ゲーム仕様では、試行回数の残りが0になったらゲーム終了です。ゲーム開始時に、どの程度の試行回数を与えると良いかは、実際にゲームで遊んでみて微調整することにして、今は今はゲーム開始時に3回の試行回数を与えることにします。

試行回数は、試行 = トライ = TRY なので、頭のアルファベット T をとって、変数 T を残っている試行回数に割り当てることにします。ゲーム開始時に T に3を代入します。

そして、「タイムアウト」や「フライング」した時に、ペナルティーとして T を1つ減らすことにします。


これに伴う変更は、以下のようになります。

[プログラム全体の初期化] で、3→T を追加
[プログラム全体の初期化] で、T の表示を初期化する
[例外処理] で、タイムアウトとフライングの時に Dsz T を追加する
・新たに [ゲームオーバー時の処理] ブロックを追加し、そこでゲームオーバー時の表示を追加



[プログラム全体の初期化] 処理の変更

プログラムの1行目を、以下のようにします。

0→P:20→L:3→T
Locate 1,1,"P:0"
Locate 1,3,"L:"
Locate 3,3,L

Locate 10,1,"TRY:"
Locate 14,1,T

(追加部分を赤文字で示した)

CH2-7_Start 


[例外処理] の変更

If E=2
Then
P-L:Dsz T
Locate 5,2,"TIME OUT"

Else If E=1
Then
P-L+C→P:Dsz T
Locate 3,2,"FALSE START"

Else If E=0
Then
P+L-C→P
IfEnd
IfEnd
IfEnd
Locate 3,1,"    "
Locate 3,1,P
Locate 14,1,T


(追加部分を赤文字で示した)

ここで、追加した Dsz T は、T がゼロになると、Locate 文を飛ばして、次の Else If (正しくは Else)へジャンプすることを利用して余計な表示がされないようにしています。

そして、試行回数の残り T を表示します。


[ゲームオーバー時の処理] の追加

試行回数の残りが0になった時にゲームオーバーとするには、全体のループの Goto M を以下のように変更し、さらにゲームオーバー時の表示を追加します。

T⇒Goto M

Locate 1,2,"                "
Locate 4,2,"GAME OVER"
Locate 6,4,"  <AC>:QUIT


(追加部分を赤文字で示した)

T⇒Goto M は、T がゼロになったら Goto M を飛ばして、次の Locate 1,2,"                " へジャンプします。これは、条件ジャンプ命令:⇒ の機能です。


一番最後に追加したものは、[AC] キーを押すとプログラムが終了する」、と画面表示で説明する部分です。
CasioBasicでは、[AC] キーを押すとプログラムが強制終了するので、これを利用しています。

但し、頭にスペースが2個入っていることに注意! こうしないと、<EXE>:START を完全に上書きできません。
これは、Locate 6,4," <(-)>:STOP" で頭にスペースを1個入れるのと同じ理由です。


CH2-7_Quit 


以上をまとめます。

プログラム名 CH2-7

0→P:20→L:3→T
Locate 1,1,"P:0"
Locate 1,3,"L:"

Locate 10,10,"TRY:"
Locate 14,1,T


Lbl M

0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
Locate 1,2,"                "

RanInt#(2,50)→C
Do

If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "

0→C
Do
E=1⇒Break
C>L⇒Break
Isz C
LpWhile Getkey≠57
C>L⇒2→E

If E=2

Then
P-L→P:Dsz T
Locate 5,2,"TIME OUT"

Else If E=1
Then
P-L+C→P:Dsz T
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L-C→P
IfEnd
IfEnd
IfEnd
Locate 3,1,"    "
Locate 3,1,P
Locate 14,1,T

T⇒Goto M

Locate 1,2,"            "
Locate 4,2,"GAME OVER"
Locate 6,4,"  <AC>:QUIT"


(今回追加した部分を赤文字で示した)


プログラム構造は、以下のようになります。今回は新たに [ゲームオーバー時の処理] ブロックを追加しました。


[プログラム全体の初期化]

Lbl M

    [繰り返し処理の初期化]

    [アニメーション表示]

    [反応速度の測定&表示]

    [例外処理]

T⇒Goto M

[ゲームオーバー時の処理]




ゲーム仕様
1) ゲームスタート時、所定の試行回数与えられる
2) アニメーションを表示する待ち時間がある(待ち時間はランダム)
3) アニメーションが終わったら、できるだけ速くキーを押す
4) 反応が速いほうが多くの得点が加算される
5) 表示が変わる前のお手つきや、反応が遅すぎる場合は、得点試行回数が減る
6) 試行回数が0になるとゲーム終了し、その際の得点を競う

今回は、1)、4)、6) を追加して、ゲーム仕様を実装できました。



プログラム全体を、処理内容別のブロックを単純に並べた構造にしています。1つのブロック内で、分岐処理やループを使ってまとまった処理を行います。そして、次のブロックへ移ります。

プログラムをこのような構造にしておくと、機能追加や変更を、プログラムのどの部分でやれば良いかが分かりやすく、楽になることを、これまで体験してもらっています。



これまでの機能追加や変更について、ちょっと振り返ってみます。

[アニメーション表示]ブロックでは、フライングを検出しています。フライング検出後すぐに表示を行わずに、例外フラグを設定するだけにして、次のブロックへ処理を移しています。フライング検出をした直後で "FALSE START" と表示すれば楽なのに、回りくどいと思われたかも知れません。

実際問題、"FALSE START" の表示以外に、総得点の計算や、試行回数の計算も追加していますが、これらを [例外処理] ブロックにまとめることで、他のブロックを殆ど変更せずに機能追加ができました。これがブロック構造の利点です。

今回のようなアクションゲームでは、アニメーション表示 や 反応速度測定&表示 のループが軽く、速く回る必要があります。これが遅くなると、ゲームのレスポンスが遅くなり、つまらなくなる恐れがあります。なので、これらのループの中には余計な処理を入れたくないわけです。従って、余計な処理は別のブロックに入れた方が良い、と言う事情もあります。


[反応時間測定&表示]ブロックでは、タイムアウトを検出しています。ここでも例外フラグを設定するだけで、次のブロックへ処理を移しています。フライングフラグが設定されている時にも、直ちに次のブロックへ移動しています。


このように、まとまった処理ごとのブロックを作って、これらのブロックが上から下へ連なる構造を意図的に作る方法を、構造化プログラミングと言います。構造化プログラミングについては、こちら で裏話をしています。興味のある方は読んでみて下さい。

今使っている "新世代Casio Basic"は厳密には構造化Basic とは言えません。引数や戻り値のある関数を自由に作れず、局所変数(ローカル変数)が使えないからです。しかし、サブルーチンや大域変数を工夫して使いながら、ブロックが上から下へ連なるプログラム構造を作れます。Gotoであっちこっちにジャンプする構造ではなく、機能別に作った処理ブロックを上から下へ流れるようにコーディングし、必要な時は一箇所へジャンプし、用事が済めば元に戻るような流れを作ることこそが、重要です。そこで、"新世代Casio Basic" は構造化プログラミング風コーディング可能な言語と言えます。

簡単なプログラム、特にプログラム関数電卓での簡単なプログラムは、ブロックを意識する必要の無いことも多いのでですが、ちょっと機能追加をしようと思うと、とたんにプログラムが複雑になってしまいます。

「ブロックを並べて作る」構造化プログラミングの対極にあるのが、思いつきで色々な機能を追加したり変更し、同種の処理がプログラムのあちこちに分散しているもので、Goto を多用することが最大の原因です。


さて、このゲームで実際に遊んでみると、確実に試行回数が減ってゲーム終了....なんだか面白くありません。そこで、次回はゲームがチョットだけ面白くなる機能を追加しようと思います。



つづく...


CasioBasic入門13 / 目次




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ


関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic入門11

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 2015/01/08

 4. CasioBasicを使ってみる(続き)


Chapter 2 - 初級

◆ Chapter 2 の目標: 動きのあるプログラムを作る
簡単なアクションゲームを作る

前回: Casio Basic入門10


Chapter 2-4 でフライング対策をしたゲームの基本部分ができました。

プログラム名 CH2-4

0→E

RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "

0→C
Do
E=1⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2,C

If E=1
Then
Locate 3,2,"FALSE START"
IfEnd



プログラムのブロック構造

[初期化処理] ブロック

[アニメーション表示] ブロック

[反応時間測定&表示] ブロック

[例外処理] ブロック




ゲーム仕様
1) ゲームスタート時、所定の試行回数与えられる
2) アニメーションを表示する待ち時間がある(待ち時間はランダム)
3) アニメーションが終わったら、できるだけ速くキーを押す
4) 反応が速いほうが多くの得点が加算される
5) 表示が変わる前のお手つきや、反応が遅すぎる場合は、得点試行回数が減る
6) 試行回数が0になるとゲーム終了し、その際の得点を競う


項目の 2) と 3) と 5)の一部は実現できました。


残る部分を作るには、これまで作った部分を繰り返すようにプログラムの変更が必要だとわかります。その上で、試行回数、得点を表示し、試行回数0でゲームが終わるようにすれば完成です。



Chapter 2-5
プログラム制御

プログラムを繰り返すには、ループを使えば良いので、全体を繰り返すループに Lbl / Goto ループを使うことにします。メインループなので、Main LoopM を使って Lbl M / Goto M とします。

Lbl M
[ゲーム全体の処理]
Goto M


これは、無限ループです。

ゲーム仕様に従えば、試行回数(トライ回数)の残りが0になればゲーム終了となるので、試行回数(トライ回数)の残りが 0 になったときにループを終了すれはOKです。試行回数を変数 T (トライ=Try の T)に代入しておき、何かの条件により T を減らすようにしてゆきます。

T がゼロになったときゲームを終了するためには、以下のように 条件ジャンプ命令⇒ を使うと、うまくループを終了できます。

Lbl M
[ゲーム全体の処理]
M⇒Goto M


条件ジャンプ命令の仕様から、Mがゼロでない時は Goto M を実行しますが、Mがゼロになると、Goto M を飛ばして、次へジャンプするので、ループが終了します。トライ回数を減らす条件については、後で作ることにし、今は無限ループにしておきます。

それでは、無限ループを組み込みます。

Lbl M

0→E

RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "

0→C
Do
E=1⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2,C

If E=1
Then
Locate 3,2,"FALSE START"
IfEnd

Goto M

これを走らせてみてください。

プログラムが全く止まりません。忙しすぎて、メリハリが無くて、ゲームとしては問題です。そこで、アニメーションを開始するところで、一旦プログラムを止めます。止まると同時に操作方法を表示させることにします。

操作方法の表示のために、プログラム冒頭にある初期化処理部分に操作方法表示の Locate コマンドを追加します。


初期化処理部分は、今のところ

0→E

だけで、ここに以下のように追加します。

0→E
Locate 6,4,"<EXE>:START"◢

ここで、出力命令 を利用します。


出力命令 には一時停止の機能が付加されおり、それを利用するわけです。画面の右下に <EXE>:START と表示され、プログラムが一時停止します。

プログラムが出力命令 で止まった後、停止解除するには [EXE] キーを押します。それ以外のキーでは停止解除しません。従って、<EXE>:START としました。


[EXE] キーを押すと、ゲームが始まり、[(-)] キーを押せば、結果が出るかフライングになって、また最初の表示に戻ってプログラムが一時停止します。

操作方法を表示するのなら、ついでに <(-)>:STOP も表示させましょう。
[EXE] キーを押してゲームがスタートしたら、<(-)>:STOP に表示を切り替えることにします。
そして、結果が出るかフライングになるか、いずれにせよ [(-)] キーを押したときに、表示を <EXE>:START に切り替えます。

0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"


<(-)>:STOP の前に、スペースが1つ入っていることに注意してください。<EXE>:START をきれいに上書きするためには、このスペースが必要です。スペ-スを入れることで、どちらの表示も11桁になるように揃えました。

CH2-4_Start 

CH2-4_Stop 

もう一つ、必要な表示処理があります。フライングになった場合は 2行目の中央に FALSE START と表示されます。次の試行の前に、これを一旦消さないと、アニメ-ション表示と重なって表示されてしまいます。そこで、一旦2行目を端から端まで消去します。

2行目の1桁めから16桁めまで、スペースで上書きすればOKですね。

以上から、初期化部分は、以下のようになります。

0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
Locate 1,2,"                "


これで、連続して何回もゲームを続けられるようになりました。


プログラム名 CH2-5

Lbl M

0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
Locate 1,2,"                "


RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "

0→C
Do
E=1⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2,C

If E=1
Then
Locate 3,2,"FALSE START"
IfEnd

Goto M



プログラムのブロック構造

Lbl M

[初期化処理] ブロック

[アニメーション表示] ブロック

[反応速度測定&表示] ブロック

[例外処理] ブロック

Goto M



Chapter 2-6
複数条件分岐の記法

ゲームを何回もトライして、その点数を付ける機能を、追加します。

点数の付け方を次のようにしでみます。
1.毎回のトライで得た得点を積算して、総得点Pとする
2.制限時間を設定する: 変数L (Limit の L)、20とする
3.反応時間は、カウンターC
4.得点を、L-C とする
5.フライング時は、減点を L-C とする
6.タイムアウト時は、減点を L とする

ゲーム進行上は以下のようになります。
・制限時間を超えるとタイムアウト。減点L
・制限時間ギリギリで反応すると、得点ゼロ
・制限時間内で、速く反応するほど高得点になる: L-C
・フライングの時は、減点L-C。フライングが速いほど減点が多くなる。



このように決めると、実際の総得点は、

A) フライングしない時の総得点計算: P+L-C→P
B) フライングしたときの総得点計算: P-L+C→P
C)タイムアウトした時の総得点計算: P-L→P
※今は、Lを20とします。

最終的には、L をゲーム進光状況に応じて変化させると、ゲームが面白くなるかもしれません。そこで、制限時間には、決め打ちの20ではなくて、変数 L を使って、プログラムを作ります。但し、L の初期値は20としておきます。


先ずは、[初期化処理] (1ブロック)

0→P:20→L

を追加します。


今回、タイムアウトと言う要素を追加します。タイムアウトの条件は、C>L です。
タイムアウトは [反応時間測定&表示] (3ブロック)での例外事象として扱います。

0→0
Do
E=1⇒Break
Isz C
LpWhile Getkey≠57

Locate 8,2," "    (スペース16個)

この [反応時間測定&表示] (3ブロック)で、C>L の時 Break コマンドで  Doループから抜け、抜けた直後に 例外フラグE に 2 を代入します。

その結果、例外フラグE は3つの値をとります。例外フラグEが1の時はフライング、2の時はタイムアウトと言うわけです。例外でない場合は例外フラグEは0です。


以上をプログラムに反映させると、

0→C
Do
E=1⇒Break
C>L⇒Break

Isz C
LpWhile Getkey≠57
C>L⇒2→E
Locate 8,2,C


追加部分は、赤文字で示しました。


例外処理

総得点の計算は、[例外処理] ブロックで行います。

<総得点計算>
Eが2の時: P-L→P 
Eが1の時: P-L+C→P
Eが0の時: P+L-C→P

の計算を追加します。


表示内容は、以下の場合分けになります。

<表示内容>
Eが2の時: TIME OUT
Eが1の時: FALSE START
Eが0の時: 特になし


総得点の表示は、例外フラグEの値に関わらず、共通の処理で実装可能です。

Locate 3,1,"    "    (スペース4個)
Locate 3,1,P

総得点は増減するものなので、少ない桁数で更新されることもあります。その時は、既に何度も行っているように、あらかじめ消去(スペースで上書き)した上に、総得点を上書きする必要があります。


複数条件分岐

If ~ Then ~ Else ~ IfEnd は、1つの条件に対して、それが成り立つかそうでないか、つまり真か偽かによって処理を振り分けます。二者択一の処理をします。

今回は例外フラグEが、2、1、0 の3通りの値になります。これらを条件として3通りに処理を振り分けたいので、Ifを使う場合は Ifの中にもう1つ Ifを入れる多重構造(入れ子構造)が必要になります。

ところで、Visualbasicでは、ElseIf と言うコマンドがあって、

If [条件1]
    Then [処理1]
ElseIf [条件2]
    Then [処理2]
ElseIf [条件3]
    Then [処理3]
        :
        :
Else
[処理0]
End If

といった、複数の条件による分岐処理が可能です。


或いは、

Select Case [変数]
    Case 1
        [処理1]
    Case 2
        [処理2]
    Case 3
        [処理3]
    Case 4
        [処理4]
        :
        :
End Select


といった、複数分岐処理も可能です。


C言語でも

switch (変数) {
    case 1:
        [処理1];
    case 2:
        [処理2];
    case 3;
        [処理3];
    case 4:
        [処理4];
        :
        :
    default:
        [処理0];
}


といった処理が可能です。

このように、多くの高級言語には、複数条件分岐処理が可能なステートメントが備わっています。一方で、Casio Basicには、このような複数条件分岐処理のステートメントが用意されておらず不便に感じます。

ところが、Casio Basic では、次のような記述方法を使えば、簡単に複数条件分岐処理を実現できます。


CasioBasic用 複数条件分岐の構文

基本構文は以下の通りです(Else と If を組み合わせるところがミソ):

If [変数]=4:Then
[処理4]
Else If [変数]=3:Then
[処理3]
Else If [変数]=2:Then
[処理2]
Else If [変数]=1:Then
[処理1]
Else If [変数]=0:Then
[処理0]
IfEnd
IfEnd
IfEnd
IfEnd
IfEnd

※注意点: If の数と同数の IfEnd を最後に書くこと

Else If は、普通に ElseIf を続いて入力します。

Casio Basic には ElseIf と言う1語(ワンワード)のコマンドは用意されていないものの、ElseIf を並べて書くことで、プログラムの読みやすさ(可読性)を損なわずに複数条件分岐ができます。但し、この記法を用いる時には、最後に IfEnd を If と同じ数だけ記述する点に留意してください。

※ IfEnd が If の数よりも少なくても正常動作する可能性はありますが、運が良いだけです。制御構造が複雑になると必ず誤動作するので、原則通りにIfEndを記述すべきです。


さて、今回の例外処理を行うには、[変数]「例外フラグE」を使えば良いわけです。

※ CasioBasicコマンドリファレンス
      - If 文


[例外処理] ブロックのプログラム

話を元に戻して、[例外処理]ブロックのプログラムは、以下のようになります。

If E=2
Then
P-L→P
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P
Locate 3,2,"FALSE START"
Else If E=0
Then

P+L-C→P
IfEnd
IfEnd
IfEnd

Locate 3,1,"    "        (スペース4個)
Locate 3,1,P


ここまでをまとめると、以下のプログラムになります。

プログラム名 CH2-6

0→P:20→L
Locate 1,1,"P:0"
Locate 1,3,"L:"
Locate 3,3,L

Lbl M

0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
    (頭にスペース1個)
Locate 1,2,"                "
    (スペース16個)

RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"

Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Locate 8,2," "
    (スペース1個)

0→C
Do
E=1⇒Break
C>L⇒Break
Isz C
LpWhile Getkey≠57
C>L⇒2→E
Locate 8,2,C

If E=2
Then
P-L→P
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L→P
IfEnd
IfEnd
IfEnd
Locate 3,1,"    "
    (スペ-ス4個)
Locate 3,1,P

Goto M



プログラムのブロック構造


Lbl M

[初期化処理]

[アニメーション表示]

[反応速度測定&表示]

[例外処理]

Goto M


フライングとタイムアウトの例外処理を作り、総合得点の表示までできました。プログラムを走らせてみると、なんとかゲームの形ができあがってきたことが分かります。

次回では、引き続きゲームオーバーの処理を作り込んでゆきます。



つづく...


CasioBasic入門12 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ



関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: Stop

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
2015/01/09 更新

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50


Stop

◆ 概 要: プログラムを強制終了させるコマンド

◆ 書 式: Stop

◆ 引 数:なし

◆ 戻り値:なし


[AC] キーと同様に、実行中のプログラムを強制終了させる。

サブルーチンでStopコマンドを実行すると、呼出元のメインルーチンの実行を強制終了させる。


Returnコマンドは、サブルーチンで実行すると実行されたサブルーチンのみを強制終了させ、メインルーチンは終了させない。



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicStopプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - 多重ループの謎

楽 屋 裏
e-Gadget

最終更新: 2014/03/10

[2014/03/10 追記]: 今回の異常が発生する条件以外でも多重ループの異常が見つかりましたこちらへ


原因不明の Syntac ERROR の件の続報:

問題を単純化すると、こうなります。

以下のようなWhile ループ内にDoをループが入ったプログラムで、Syntax Errorが発生し、問題の発生場所が WhileEnd だと表示されます。

プログラム1
While 1
20→C
Do
Dsz C
LpWhile 1
WhileEnd


=====

頭のWhile 1 を Lbl 0 に、お尻の WhileEnd を Goto 0 に変更した以下のプログラムでは エラーが発生しません。

プログラム2
Lbl 0
20→C
Do
Dsz C
LpWhile 1
Goto 0


エラーの発生源である WhileEnd を無くせばエラーが消えるわけで、問題はWhile ループにあることが確認されます。

=====

次に、Dsz C の代わりに、C-1→C とジャンプのためのGoto / Lbl に置き換えます。

プログラム3
While 1
20→C
Do
C-1→C:C=0⇒Goto 0
LpWhile 1
Lbl 0
WhileEnd


この場合は、エラーは発生せず、正常動作します。
どうやら、Dsz C で WhileEnd にジャンプする時にエラーが発生するようです。

=====

While ループの代わりに Doループを使うと、以下になります。

プログラム4
Do
20→C
Do
Dsz C
LpWhile 1
LpWhile 1


内側の Doループから抜けると、外側の LpWhile 1 から外側の Do までジャンプするのが正常動作ですが、内側の Do にジャンプするようです。ループの相手を見つける検索に問題が発生してるようです。

具体的には、以下を実行してはっきりました。

プログラム5
Do
20→C
C◢
Do
Locate 1,1,"    "
LOocate 1,1,C◢
Dsz C
LpWhile 1
Cls
LpWhile 1


これを実行すると、動作異常の状況がはっきりします。

=====

While ループの例と同様に、Dsz C を C-1→C:C=0⇒Goto 0 と Lbl 0 に変えて以下を実行すると、正常動作します。

プログラム6
Do
20→C
C◢
Do
Locate 1,1,"    "
Locate 1,1,C◢
C-1→C:C=0⇒Goto 0
LoWhile 1
Lbl 0:Cls
LpWhile 1


=====


以上から、WhileループやDoループを2重構造にして、内側のループを抜けるために Dsz 命令を使うと正常動作しないことが分かりました。

改めて、問題のプログラム2つを書いてみます。

これらは、特に問題を感じないプログラムです。

問題プログラム1
While 1
20→C
Do
Dsz C
LpWhile 1
WhileEnd


これは、最後のWhileEndでSyntax ERROR が発生します。


問題プログラム2
Do
20→C
Do
Dsz C
LpWhile 1
LpWhile 1


これは、エラーとして検出されませんが、外側のDoループが異常動作します。
その結果、Cをマイナスの値でどんどん減らしながら、内側のDoループが回り続けることになります。


これら2つの問題プログラムは、皆さんのfx-5800Pでも同じように異常になりますでしょうか?
是非お聞かせください。




現時点では、
「While および Do ループからの脱出に Dsz命令を使う場合は、さらにその外側に While およびDo ループを使ってはならない」
と言う予防策を講じる必要があります。



もし私のfx-5800Pだけでの問題でないことが分かれば、カシオに相談したいと思いますので、ご協力をお願い致します。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicループのエラープログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - Else If

楽 屋 裏
e-Gadget


思い込みとは怖いものだ。

Ifにまつわる話です。

これまで、Basic言語一般で使える記法 ElseIf が、CasioBasic には無いので、Else If は可読性が悪くなって使えないものとばかり思っていたのですが、思い込みだと言うことが分かりました。

Else If は結構使えます!


何のことかと言えば...

変数Eが、0、1、2、3 と異なる値になるとき、Eの値に応じて処理を切り替える...これは、Else If と言う記法を使えば、見やすいプログラムが書けるのですが、それが出来ないと思っていたばっかりに、確かめもせずに、If 文の入れ子構造が複雑になって使えず、不便だなぁ、と...

Else If の入力方法は、単に If を入力し、続けて Else を入力するだけです。

Else If を使えば、以下のように可読性を犠牲にせず、スッキリと書けます。

If E=3:Then
[処理3]
Else If E=2:Then
[処理2]
Else If E=1:Then
[処理1]
Else If E=0:Then
[処理0]
IfEnd
IfEnd
IfEnd
IfEnd


但し、If と同数の IfEnd を最後にまとめて書きます。


このように便利な Else If は使えないと思っていたので、Goto / Lbl を使って同じ構文を作って使っていました。Goto を使うのは出来れば避けたいところですが、正しく使えば役に立つ事例として、私は考えていました。

E=3⇒Goto 3
E=2⇒Goto 2
E=1⇒Goto 1
E=0⇒Goto 0
Goto Z

Lbl 3
[処理3]

Goto Z

Lbl 2
[処理2]

Goto Z

Lbl 1
[処理1]

Goto Z

Lbl 0
[処理0]

Goto Z

Lbl Z



一時の恥は一生の得 ということで、これからは Else If を必ず検討しようと思います。

懺悔にも近いこんなことを書いたのは、少し前 藤堂様 とのやりとりで、Goto は用法・用量を守って正しく使えば良い、と私の主張をし、その効用の1例として、上の複数条件分岐を例として挙げたのです。

それを、キチンと訂正したいと思ったので、別エントリーに書くことにしました。

藤堂様、失礼しました。


但し、一言だけ言い訳をしますと、

switch(E) {
    case 3:
       
[処理3]
        break;
    case 2:
        [処理2]
        break;
    case 1:
        [処理1]
    case 0:    
        [処理0]
}


といった、C言語風の処理は、Else If では出来ないのです。
case 3:case 2: では、break; がありますが、case1:case 0: では break; が省略されています。
break; によって siwtch( )文を抜けます。

Eが3や2、そして0 の時は、それぞれ対応する処理を行います。

ところが、Eが1の時は [処理1] に続いて [処理0] を行います。[処理1] の後に break; が無いためです。

私が作った構文では、Goto Zbreark; に相当するので、C言語と同等の柔軟性がありますが、Else If の記法 にはそのような柔軟性が有りません。

このように break; を省略するのを fall through (フォールスルー) と言われます。個人的には柔軟性があって良いと感じていますが、プログラミングスタイルとしてフォールスルーを推奨しないことが多いと聞いています。break; が本来入るところを例外的に入れないと、他人がソースを見たとき、あるいは時間が経って身分でソースを見直すとき、必要なのに入れ忘れたのか、不要だから入れないのかが明確に分かりません。つまりバグの温床になるからです。

つまり、goto を使った複数条件分岐の記法は、フォールスルー処理ができる柔軟性に利点がある、という主張は危険な発想だと告白しておきます。





(言い訳終わり) (^^;)


...と言うことで、CasioBasicコマンドリファレンスIf 文 の項目も修正しました。

但し、Goto は用法・用量を守って正しく使いましょう! は撤回せずにおきます。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-5800PCasioBasicElse If複数条件分岐プログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - Syntax ERROR

楽 屋 裏
e-Gadget


実は今、原因不明の Syntac ERROR に悩んでいます。

CasioBasic入門10 で作ったプログラム CH2-4 を Whle 1 と WhileEnd で挟んでループにすると、WhileEnd のところで Syntax ERROR が表示されます。

具体的には、

While 1

0→E

RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey→K
K=57⇒1→E
Dsz C
LpWhile K≠57
Locate 8,2," "

0→C
Do
E≠0⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2,C

If E=1
Then
Locate 3,2,"FALSE START"
IfEnd


WhileEnd


プログラムCH2-4 を単に While 1 / WhileEnd で挟んだだけです。

While  1 /  WhileEnd の代わりに、Do / LpWhile 1 で挟むと、LpWhile 1 から Do までキチンと戻らず、2行を読み飛ばして3行目にジャンプすることが分かっています。

いずれの場合も、解決策としては、最後の WhileEnd あるいは LpWhile 1 の直前に Goto Z:Lbl Z を追加すれば良く、エラーは無くなり正常に動作します。

面白いことに、上で赤文字で示した If 文を、以下のように書き換えると、エラーは発生せず、正常に動作ます。

E=1⇒Goto 1
Goto Z

Lbl 1
Locate 3,2,"FALSE START"

Goto Z

Lbl Z


実は、このコードを書くとエラーが発生しないことから、Goto Z:Lbl Z を入れるとエラーが無くなることが分かったのです。
このコードは、上の If 文と同じことを If を使わずに書いたコードです。

WhileループやDoループの代わりに、Lbl / Goto でループを作ると、エラーは発生しません。

具体的には、While 1 の代わりに Lbl M、WhileEnd の代わりに Goto M を書くとエラーが発生しないのです。


そこで、原因にならない部分をそぎ落としてゆくと

While 1

20→C
Do
Dsz C
LpWhile 1

WhileEnd


といったシンプルなプログラムで、Syntac ERROR が発生し、発生部位が WhileEnd と表示されます。

このシンプルなプログラムで、WhileEnd の直前に、Goto 0:Lbl 0 を書くとエラーは消えます。

While 1

20→C
Do
Dsz C
LpWhile 1

Goro 0:Lbl0
WhileEnd



どうやら、私の fx-5800P では、While ループや Do ループで エラーが発生していることがハッキリしました。


さらに、While / WhileEndLbl / Goto に置き換えると、異常が発生しません。

Lbl M

20→C
Do
Dsz C
LpWhile 1

Goto M



以上から、今のところ言えるのは、WhileDoループの中に WhileDoループを入れる、つまり多重ループ構造にすると問題が発生するようです。



皆さんの fx-5800P でも同じことが発生するでしょうか?



私のfx-5800P特有の問題なのかどうかが分からないので、バグだと断定するのはまだ早いのですが....


ちなみに、これまで作ったプログラムを見直してみると、ループの中にループを書いたプログラムは無く、私にとっては多重ループは今回始めてのケースです。と言うのも、実行速度を早くするために、私は Lbl / GotoDsz を組み合わせたループLbl / Goto と ジャンプ命令⇒ を組み合わせたループを多用していて、WhileDo の多重ループは必要に迫られた時に使うつもりでした。


取扱説明書を見ても、多重ループに関する記述が見つかっていません(´д`)


もし、皆さんのfx-5800Pでも再現するならば、仕様なのかバグなのか、カシオに聞いて確かめようと思っています。





 [2014/02/23 追記]

CasioBasic入門では、ループには WhileDo を使わず、Lbl / Goto を使って進める予定です。手元で完成しているプログラムでも多重ループを使わなければ異常動作は発生していません。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-5800PCasioBasicループのエラープログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - スプラッシュ

楽 屋 裏
e-Gadget


読者の方からのレスポンスは、本当に嬉しい( ^o^)ノ

少し前に、読者の Ku さんから、愉しいメッセージが届きました



fx-5800Pのプログラムでは、数字とアルファベットを使えますが、アルファベットは大文字のみです。

Kuさんは、うまく工夫することで、

e-Gadget 

と表示できることを示してくれました。


ハイ、この通り!

e-Gadget Logo






私もチョット頑張って、自分のハンドルネーム Krtyski の表示に成功( ^o^)ノ


さらに悪のりして、こんな画面を作りました↓↓




fx-5800P のゲームプログラム起動時に表示するスプラッシュ画面です。


CasioBasic入門では、「動きのあるプログラムを作る」と言うテーマで、アクションゲームを題材にしています。連載の記事よりも、手元では進んでいて、ゲームはほぼ完成していて、 React! と名付けました。CasioBasic入門でも、このスプラッシュ画面の作り方を紹介する予定です。

読者の方からのコメントや情報は、このように役立っています。


CasioBasic入門は、fx-5800Pでプログラムを作るための入門講座です。
題材のプログラムは、プログラムの作り方を説明するためのものですが、どうせ作るなら面白いプログラムにしたいと、力が入ってしまいます。

それによって、解説の難易度が上がってしまっていないか? と少し気にしています。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-5800PCasioBasicスプラッシュプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: Break

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
修正: 2015/01/09

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
Break

◆概 要:
ループから強制的に抜ける

◆書 式: Break

◆引 数:なし

◆戻り値:なし


Doループ、Whileループ、Forループの中で Break が実行されると、実行されたところから強制的にループの外へ抜け、そのループの次に記述されている処理までジャンプします。

例外処理やエラー処理などで有用です。



使用例

0→E:-1→X
Do
[処理]
If E≠0
Then Break
IfEnd
LpWhile X
"getting out of Do loop!" 


変数Eが0でない時、Doループを強制終了し、getting out of Do loop! (Doループから出た!) を表示します。

Breakを利用すると、複数の条件でループから抜けることができます。この例では、[処理] の中で、Eが0でなくなる時、Xが0になる時、の2つの条件でループから出られます。


0→M
While Getkey
[処理]
M⇒
Break

WhileEnd
"getting out of While loop"


変数Mがゼロでない時、Whileループを強制終了し、getting out of While loop (Whileループから出た) を表示します。

何かキーが押されていると Whileループへ入り [処理] を行います。そして [処理] の中で変数Mが変化して0でなくなると、ループを抜けます。これも2つの条件でループを抜けられる事例。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicBreakプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic入門9

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 2015/01/07

 4. CasioBasicを使ってみる(続き)

前回: Casio Basic入門8 - Chapter 1


Chapter 2 - 初級
動きのあるプログラムを作る

Chapter 1 でまだ紹介していないコマンドやプログラム構成(ロジック)を使いながら、新しいプログラムを作ってゆきます。


◆ Chapter 2 の目標: 動きのあるプログラム作る


Chapter 2 では、動きのあるプログラムをテーマにしようと思います。

そこで、以下の概略仕様で、「反射ゲーム」を作ることにします。

1) ゲームスタート時、所定の試行回数が与えられる
2) アニメーションを表示する待ち時間がある(待ち時間はランダム)
3) アニメーションが終わったら、できるだけ速くキーを押す
4) 反応が速いほうが多くの得点が加算される
5) 表示が変わる前のお手つきや、反応が遅すぎる場合は、得点試行回数が減る
6) 試行回数が0になるとゲーム終了し、その際の得点を競う





Chapter 2-0
Lbl / Goto ループを使う

今回は、待ち時間でのアニメーションを 「回転している羽根」にします。




アニメーションを作る前に、アニメーションの準備をします。

取りあえず、アニメーションの代わりに「静止している羽根」を "X" で現し、(8桁、2行)の位置に表示させます。そして、所定時間だけ「静止している羽根」を表示させるプログラムを作ります。これは、アニメーションの基本構造になります。

プログラム名 CH2-0
50→C
Lbl 0
Locate 8,2,"X"
Dsz C
Goto 0
Locate 8,2," "


上のプログラム CH2-0 を詳しく見てゆきます。その中で、所定時間だけ表示させるためには、ループの中に表示処理を入れて、ループを所定回数まわすようにしています。表示時間を決める部分を赤文字で示しています。


さて、赤文字部分だけを抜き出します。

50→C
Lbl 0
Dsz C

Goto 0

この部分は、Lbl / Goto を用いたループで構成されていて、ループを50回まわしています。

Lbl 0Goto 0 の間で、ループが回ります。
そして、カウンタ変数Cは、最初50で、ループを1回まわるたびに、カウンタCが1づつ減ります。

Dsz C は、ディクリメント・ジャンプ命令と言います。Cを1つ減らします(デクリメントします)。そして、デクリメントした結果Cが0(ゼロ)になった場合は次の処理を飛ばして、その次の処理までジャンプします。

「その次の処理」は、ここでは Locate 8,2," " ですね。

ここで思い出してもらいたいのは、「プログラムは特に指示がなければ上から下へ処理が進む」と言うことです。だから、Lbl / GotoDsz を組み合わたカウントループを作ることが出来ます。


Chapter 1 では、Isz 命令 を使いました。この時は、単に変数を1つ増やす目的で使用しましたが、Isz 命令も Dsz 命令と同様に、変数が0になると2つ目の処理へジャンプする機能を持っていて、インクリメント・ジャンプ命令といいます。変数に負の数を指定すれば、いずれ変数が0になり、そこでインクリメント・ジャンプします。Chapter 1 では変数に正の数を指定したので、0になることはなく単にインクリメント(1づつ増える)だけでした。

incrementは「増やす」と言う意味の英語。increaseの方が馴染みがあるかも知れません(これも「増やす」の意味)。一方 decrement は「減らす」と言う意味で、同様にdecrease も「減らす」と言う意味です。


Dsz命令やIsz命令は、IfLbl/Goto を組み合わせて、同じ処理を記述することができます。しかし同じ処理を行う場合は、Dsz命令やIsz命令の処理速度の方が速いことが分かっています。

C-1→C の代わり Dsz C とすると処理が速くなるだけでなく、変数Cが0かどうかの判定とジャンプ処理まで含んでいるので、記述もシンプルになります。

従って、Casio Basic特有のこれらの命令を、私は積極的に使っています。

※ CasioBasicコマンドリファレンス
     - Dsz 命令

プログラム CH2-0 は、ループの中で羽根を表示し、ループが50回まわった後羽根の表示を消しています。Cの初期値を変えると、ループ回数が変わります。そこで、Cをランダムに変更すれば、羽根の表示時間をがランダムに変化します。

では、羽根がまわるアニメーションを作ってゆきます。



Chapter 2-1
回る羽根をつくる

アニメーションは、映画もテレビもパラパラ漫画も、理屈は同じです。連続して表示される静止画を見ると、我々には動いているように見えるわけです。そこで静止画を見せる間隔は、長すぎても短すぎてもダメで、ちょうど良い間隔があります。

回る羽根のアニメーションは、× と + を交互に見せて実現しています。つまり、

Locate 8,2,"×"



Locate 8,2,"+"

を適切な間隔で交互に表示させれば回っているように見えるはずです。

そこで、例えば

50→C
Lbl 0
Locate 8,2,"×"

Locate 8,2,"+"
Dsz C
Goto 0
Locate 8,2," "


を実際に走らせてみてください。なんだか、薄ぼけたXと+が同時表示されているように見えます。2つの静止画の間隔が短すぎるのでしょう。そこで、この2つのLocate コマンドの表示間隔を、もう少し長くしようと思います。間隔が長すぎてもダメなはずなので、間隔を調節できるようにしたいものです。

仮に、以下のようにしてみても、状況は改善しません(実際に試してみるとわかります)。

50→C
Do
Locate 8,2,"×"
Locate 8,2,"×"
Locate 8,2,"×"
Locate 8,2,"+"
Locate 8,2,"+"

Locate 6,2,"+"
Dsz C
Goto 0
Locate 8,2," "


× の表示と + の表示の間隔がほとんど無いことが、うまくゆかない最大の理由でしょう。そこで、Lbl/Goto ループがくりかえし実行されるとき、有るときは × を表示し、有るときは + を表示する作戦に切り替えます。表示の切り替えは、ループを通る回数から判定すれば良さそうです。

さて、ループが回るたびに変数Cが1づつ減る(Dsz C)ので、Cが奇数の時にxを表示し、偶数の時に + を表示する方法を試してみます。判定処理にかかる時間だけ間隔が長くなることを利用します。

その判定は、ループの中で変数Cが奇数か偶数かを判定 (奇遇判定) すれば、交互に ×+ を表示させられます。

Cの奇遇判定には、「奇数は2で割り切れず、偶数は2で割り切れる」ことを利用します。そこで、C÷2 の小数部を取り出して、それがセロなら割り切れる、ゼロでないなら割り切れないと判定できそうですね。

小数部を取り出すには CasioBasicの関数 Frac( ) を利用します。

Frac(C÷2)

これが「0でない」か「0か」を Ifを使って調べます。「0でない」場合はCは奇数、「0である」場合はCは偶数だとわかります。

If [条件]

の条件が0でない時は「真」0の時は「偽」でした。

従って、Frac(C÷2)「真」「偽」かを判断すればよいので、以下のようにIf を使って書けます。

50→C
Lbl 0
If Frac(C÷2)
Then Locate 8,2,"×"
Else Locate 8,2,"+"
IfEnd
Dsz C
Goto 0
Locate 8,2," "


実際にこのプログラムを走らせると、動きが見えるようになりました(試してみてください)。しかし実行してみると分かりますが、チカチカした感じで、羽根が回るようには見えません。今度は、×+ それぞれの表示時間が短いのでしょう。

そこで、上の考え方を発展させて、ループが2回まわる時に連続して × を表示し、続く2回で + を連続して表示させるようにします。Cが Dsz C で1づつ減ってゆくとき、連続する2回をうまく区別する方法が必要です。

具体的には、「Cを4で割った時の余りが 0、1、2、3のいずれかになる」性質を利用します。
Cがループの中で1づつ順に減ってゆき、Cを4で割った時の余りは

3⇒2⇒1⇒0⇒3⇒2⇒1

の順に循環してゆきます。つまり、4で割った余りが 0と1の時、及びそれ以外の時を判定できれば、連続する2回を判定できますね。余りが0か1の時は × を表示し、余りが2か3の時は + を表示します。

理屈はさておき、実際にプログラムを作ってみましょう。この方法は、取りあえず覚えておくと色々なところで使えて便利です。理屈を納得するのは後回しにしても良いと思います。

Cを4で割った余りは、

C-4Int(C÷4)

です。

もっと一般的に言うと、CをNで割った余りは C-NInt(C÷N) です。但し、CとNは整数です。

CasioBasicには、Int( ) 関数があります。これは、( ) 内の整数部を取り出す関数です。

Int(C÷4)

は、C÷4 の結果から整数部を取り出します。

Int(C÷4) に 4 を掛けた結果、つまり

4Int(C÷4)

は、当然ながら4で割り切れますね。そして、この結果は、Cと等しいか、Cより小さくなります(当たり前ですね)。

なので、C から 4Int(C÷4) を引き算すると、つまり、C-4Int(C÷4) の計算結果は Cを4で割った余りになります。

例えば、C25 の時は、C÷4 は、6.25 です。そして、Int(C÷4) は 整数部を取り出すので 6 となります。そして 4Int(C÷4) は、6×4 = 24 です。なので、C-4Int(C÷4) は 25 - 24 = 1 となり、これは 25÷4 の余りです。

つまり、4Int(C÷4)Cに一番近い4で割り切れる数(同時にC以下)になるので、これをCから引き算すれば余りが求まる、と考えても良いです。

※ CNで割った余りは C-NInt(C÷Nとなります。

これは、プログラムを作る際、色々なところで使える計算です。
これを使う他の事例は、「矢印キーの効用」 でも紹介していますので、を参考にしてください。

※ CasioBasicコマンドリファレンス
      - Int( )関数 / Frac( )関数


さて、Ifを使って、Cを4で割った余りが0か1の時に × を表示、2か3の時に + を表示する方法で、プログラムを具体的に書いてみます。

プログラム名 CH2-1
50→C
Lbl 0
If C-4Int(C÷4)≦1
Then
Locate 8,2,"X"
Else
Locate 8,2,"+"
IfEnd
Dsz C
Goto 0
Locate 8,2," "


このプログラムを走らせると、冒頭の動画が得られます。


※ プログラムが走る?
プログラムは「走る」もののようです。広く普及しているプログラミング言語にはアメリカ生まれが多く、Basicも最初はアメリカで開発されました。だから、コマンドは英語から派生したものが多くなります。で、A program runs. などと彼らが言うので、日本語で「プログラムが走る」 と言うようになっているようです。余談ですが、日本語を使ってプログラミングが書ける "Mind"というプログラム言語もあります。

BASICの起源
BASICは、1964年にダートマス大学の ジョン・ケイニー と トーマス・カーツ により、教育用の ダートマスBASIC として作られたのが最初で、その後発展してきたと、いうことのようです。[ 出典: Wikipedia - BASIC ]




つづく...

CasioBasic入門10 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

fx-5800Pの行列計算機能

fx-5800Pには、関数電卓として行列計算機能を搭載しています。
私は、fx-5800Pを普通の関数電卓としても使い、さらにプログラム電卓としても使います。

関数電卓として使うとしても、行列計算をしたことはないし、しようと思ったことがありません。一方で、プログラムでも使うこともなさそうなので、行列計算については放置していました。

ブログ「電卓情報」で「fx-5800Pの行列計算能について」と言うエントリーがありました。それによると、fx-5800Pの取扱説明書を読む限り、プログラムで行列計算を扱うための十分な情報が無い、とあります。私も改めて取扱説明書を読んでみましたが、確かにプログラムで使えるために必要な機能の説明がありません。

やはり、使えないのか....と


CasioBasicは電卓のプログラミング言語としては、今や世界標準です。海外のカシオ電卓ファンのコミュニティーは活況を呈しています。そして、とあるコミュニティーで、fx-9860GII の行列計算機能についての話題を見つけました。fx-5800Pと言えども、CasioBasic搭載機種です。そこで、取扱説明書に書かれていないコマンドを試してみました。

すると、なんと、動くではありませんか( ^o^)ノ

さすが世界標準の CasioBasic! fx-5800Pも立派なものです。



そこで、

CasioBasicコマンドリファレンス
に「CasioBasic: 行列計算」を追加しました。



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800Pプログラミング行列計算プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR