13.演算子の処理を作る
『キーボード処理』
まずは、キーボードからの演算子の入力を行えるようにする。
数字処理では、配列BTNSUU内の要素からボタン番号と同じ内容を含む要素の要素番号を取得することで、押されたボタンの数字を認識している。
今回の演算子も同配列への追加で対応したいと思う。配列を次のように変更する。(青い部分が追加部分である)
DIM BTNSUU( 14 ) ARRAY BTNSUU( 0 ) = ( 82 , 79 , 80 , 81 , 75 , 76 , 77 , 71 , 72 , 73 ) ARRAY BTNSUU( 10 ) = ( 78 , 74 , 55 , 181 , 156 )
配列BTNSUUに追加した各要素はそれぞれ10キーの「+(78)」「−(74)」「*(55)」「/(181)」「ENTER(156)」である。
なお、ENTERは「=」の機能として処理する。
この結果、ボタンの種類を判定するFOR〜NEXT処理の結果として「+−*/=」を押すと、それぞれ「10,11,12,13,14」の値(これを「演算子番号」と呼ぶ)が変数 I に代入される。
『演算部の処理』
ここまでくれば簡単である。変数 I が「10〜14」の時は演算子が押されたとして、演算部の処理を実行するようにする。
FOR I = 0 TO 14 //配列をたどる IF BTNSUU( I ) == BT THEN //ボタンの種類を配列から調べる BREAK //ボタンが分かったのでFOR〜NEXTを抜ける ENDIF NEXT //最後まで見つからなければI=10で終わる IF ( 10 <= I ) AND ( I <= 14 ) THEN //演算子が押された 〜演算部〜 ENDIF
演算部では、変数ENZAN1の演算子番号に該当する演算を行う。
IF ( 10 <= I ) AND ( I <= 14 ) THEN //演算子が押された IF ENZAN1 == 10 THEN SUU1 = SUU1 + SUU2 ENDIF IF ENZAN1 == 11 THEN SUU1 = SUU1 - SUU2 ENDIF IF ENZAN1 == 12 THEN SUU1 = SUU1 * SUU2 ENDIF IF ENZAN1 == 13 THEN SUU1 = SUU1 / SUU2 ENDIF ENDIF
後は、次の演算の準備をすればよい。
例えば「+」が押された時は、変数 I が「10」となるので、その時に「KEKKA = SUU1 + SUU2」を実行してあげればよい。
IF ( 10 <= I ) AND ( I <= 14 ) THEN //演算子が押された IF ENZAN1 == 10 THEN SUU1 = SUU1 + SUU2 ENDIF IF ENZAN1 == 11 THEN SUU1 = SUU1 - SUU2 ENDIF IF ENZAN1 == 12 THEN SUU1 = SUU1 * SUU2 ENDIF IF ENZAN1 == 13 THEN SUU1 = SUU1 / SUU2 ENDIF ENZAN1 = I SUU2 = 0 ENDIF
ここまでのプログラムを次に示す。ただし、「=」の処理はまだない。
DIM BTNSUU( 14 ) ARRAY BTNSUU( 0 ) = ( 82 , 79 , 80 , 81 , 75 , 76 , 77 , 71 , 72 , 73 ) ARRAY BTNSUU( 10 ) = ( 78 , 74 , 55 , 181 , 156 ) CH=G@SETUP(320,240,16,1) //画面の準備 CH2=G@CHRLOAD("DENTAKU.BMP") //電卓の画像を読み込み G@COLOR(0,0,1) //文字を黒色にする SUU1 = 0 //画面に表示する数字 LOOP G@CHRCOPY( CH2 , CH , 0 , 0 ) //電卓の画像を画面に貼る I@KEYGET2( ) //キーボートのチェック IF I@KEYBTN2( 1 ) == 1 THEN //ボタンは押された BT = I@KEYBTN2( 0 ) //ボタンの種類を変数BTに代入 FOR I = 0 TO 14 //配列をたどる IF BTNSUU( I ) == BT THEN //ボタンの種類を配列から調べる BREAK //ボタンが分かったのでFOR〜NEXTを抜ける ENDIF NEXT //最後まで見つからなければI=10で終わる IF I < 10 THEN //「I<10」ならば数字が押された IF ( 214748364 > SUU2 )OR(( 214748364 == SUU2 )AND( I<=7 )) THEN //オーバーフローしない? SUU2 = SUU2 * 10 + I //桁の処理 RENZOKU = 1 //演算子の連続投入でない ENDIF ENDIF ENDIF IF ( 10 <= I ) AND ( I <= 14 ) THEN //演算子が押された IF ENZAN1 == 10 THEN SUU1 = SUU1 + SUU2 ENDIF IF ENZAN1 == 11 THEN SUU1 = SUU1 - SUU2 ENDIF IF ENZAN1 == 12 THEN SUU1 = SUU1 * SUU2 ENDIF IF ENZAN1 == 13 THEN SUU1 = SUU1 / SUU2 ENDIF ENZAN1 = I SUU2 = 0 ENDIF G@PRINT( CH , 32 , 8 , STR( SUU2 ) ) //数字を表示する G@FLIP( ) //画面を更新 ENDLOOP
『結果の表示』
これで演算部は出来ました。しかし、次の演算の為に変数SUU2を「0」に初期化している為、演算子を押した直後には「0」が表示されていまが、演算子を押したら演算結果を表示して欲しいところです。そこで、新規に変数KEKKAを作り変数KEKKAを画面に表示するようにします。つまり、表示したい値を変数KEKKAに代入するということであり、数字の処理では変数SUU2を、演算の処理では変数SUU1を画面に表示したいので、それぞれの値を変数KEKKAに代入する処理を追加しました。
DIM BTNSUU( 15 ) ARRAY BTNSUU( 0 ) = ( 82 , 79 , 80 , 81 , 75 , 76 , 77 , 71 , 72 , 73 ) ARRAY BTNSUU( 10 ) = ( 78 , 74 , 55 , 181 , 156 ) CH=G@SETUP(320,240,8,1) //画面の準備 CH2=G@CHRLOAD("DENTAKU.BMP") //電卓の画像を読み込み G@COLOR(0,0,1) //文字を黒色にする SUU1 = 0 //画面に表示する数字 ENZAN1 = 10 LOOP G@CHRCOPY( CH2 , CH , 0 , 0 ) //電卓の画像を画面に貼る I@KEYGET2( ) //キーボートのチェック IF I@KEYBTN2( 1 ) == 1 THEN //ボタンは押された BT = I@KEYBTN2( 0 ) //ボタンの種類を変数BTに代入 FOR I = 0 TO 14 //配列をたどる IF BTNSUU( I ) == BT THEN //ボタンの種類を配列から調べる BREAK //ボタンが分かったのでFOR〜NEXTを抜ける ENDIF NEXT //最後まで見つからなければI=10で終わる IF I < 10 THEN //「I<10」ならば数字が押された IF ( 214748364 > SUU2 )OR(( 214748364 == SUU2 )AND( I<=7 )) THEN //オーバーフローしない? SUU2 = SUU2 * 10 + I //桁の処理 KEKKA = SUU2 //表示する値を設定 ENDIF ENDIF IF ( 10 <= I ) AND ( I <= 14 ) THEN //演算子が押された IF ENZAN1 == 10 THEN SUU1 = SUU1 + SUU2 ENDIF IF ENZAN1 == 11 THEN SUU1 = SUU1 - SUU2 ENDIF IF ENZAN1 == 12 THEN SUU1 = SUU1 * SUU2 ENDIF IF ENZAN1 == 13 THEN SUU1 = SUU1 / SUU2 ENDIF ENZAN1 = I SUU2 = 0 KEKKA = SUU1 //表示する値を設定 ENDIF ENDIF G@PRINT( CH , 32 , 8 , STR( KEKKA ) ) //数字を表示する G@FLIP( ) //画面を更新 ENDLOOP