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