15.機能の追加




『いくつかの機能を追加』
電卓として最低限の機能を持つまでになりましたが、機能的に欲しいものはまだあります。
そこで、いくつかの機能を追加したいと思います。機能の実現方法を説明した後、プログラムを示します。プログラムの説明は特にしませんので、自分なりに理解してみてください。

『”BK”機能』
数字の打ち込みで誤った数字を打ち込んでしまい、誤った数字をキャンセルしたいと思う場合が考えられます。そこで、「BK」を押すと最後に押した数字をキャンセルします。
例えば「1234」と打ち込んだ場合、最後の「4」をキャンセルし「123」とする機能です。
実現方法は、「BK」を押したら数字を10分の1にしてあげる事にします。
「BK」の機能は「BackSpaceキー」に割り当てます。

DIM  BTNSUU( 16 )
ARRAY BTNSUU( 0  ) = ( 82 , 79 , 80 , 81 , 75 , 76 , 77 , 71 , 72 , 73 )
ARRAY BTNSUU( 10 ) = ( 78 , 74 , 55 , 181 , 156 , 14 )
CH=G@SETUP(320,240,16,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 15                      //配列をたどる
      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                    //表示する値を設定
        RENZOKU = 1                     //演算子の連続投入でない
      ENDIF
    ENDIF
    IF ( 10 <= I ) AND ( I <= 14 ) THEN //演算子が押された
      IF RENZOKU == 0 THEN
        ENZAN1 = I
      ELSE
        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
        IF I == 14 THEN
          KEKKA = SUU1                    //表示する値を設定
          SUU1 = 0
          ENZAN1 = 10
        ELSE
          KEKKA = SUU1                    //表示する値を設定
          ENZAN1 = I
        ENDIF
        SUU2 = 0
        RENZOKU = 0                      //演算子の連続投入になるかも
      ENDIF
    ENDIF
    IF ( I == 15 ) THEN                  //「BK」が押された
      SUU2 = SUU2 / 10                   //桁の処理
      KEKKA = SUU2                       //表示する値を設定
      RENZOKU = 1                        //演算子の連続投入でない
    ENDIF
  ENDIF
  G@PRINT( CH , 32 , 8 , STR( KEKKA ) ) //数字を表示する
  G@FLIP( )                             //画面を更新
ENDLOOP


『”CE”機能』
「BK」を押すと最後に押した数字をキャンセルしましたが、打ち込んだ数字を全てキャンセルしたい場合もあると思います。一般的な電卓では「CE」ボタンを押すとこの機能を実現します。
実現方法は、「CE」を押したら数字を変数SUU2を「0」に初期化してあげる事にします。
「CE」の機能は「Deleteキー」に割り当てます。

DIM  BTNSUU( 17 )
ARRAY BTNSUU( 0  ) = ( 82 , 79 , 80 , 81 , 75 , 76 , 77 , 71 , 72 , 73 )
ARRAY BTNSUU( 10 ) = ( 78 , 74 , 55 , 181 , 156 , 14 , 211 )
CH=G@SETUP(320,240,16,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 16                     //配列をたどる
      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                    //表示する値を設定
        RENZOKU = 1                     //演算子の連続投入でない
      ENDIF
    ENDIF
    IF ( 10 <= I ) AND ( I <= 14 ) THEN //演算子が押された
      IF RENZOKU == 0 THEN
        ENZAN1 = I
      ELSE
        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
        IF I == 14 THEN
          KEKKA = SUU1                    //表示する値を設定
          SUU1 = 0
          ENZAN1 = 10
        ELSE
          KEKKA = SUU1                    //表示する値を設定
          ENZAN1 = I
        ENDIF
        SUU2 = 0
        RENZOKU = 0                      //演算子の連続投入になるかも
      ENDIF
    ENDIF
    IF ( I == 15 ) THEN                  //「BK」が押された
      SUU2 = SUU2 / 10                   //桁の処理
      KEKKA = SUU2                       //表示する値を設定
      RENZOKU = 1                        //演算子の連続投入でない
    ENDIF
    IF ( I == 16 ) THEN                  //「CE」が押された
      SUU2 = 0                           //数字を「0」に初期化する
      KEKKA = SUU2                       //表示する値を設定
      RENZOKU = 0                        //演算子の連続投入でない
    ENDIF
  ENDIF
  G@PRINT( CH , 32 , 8 , STR( KEKKA ) ) //数字を表示する
  G@FLIP( )                             //画面を更新
ENDLOOP


『”C”機能』
電卓を起動直後の状態まで完全に初期化する機能を追加する。
一般的な電卓では「C」ボタンを押すとこの機能を実現します。
実現方法は、「C」を押したら「0+」と押した状態になるように変数を初期化してあげる事にします。
「CE」の機能は「Endキー」に割り当てます。

DIM  BTNSUU( 18 )
ARRAY BTNSUU( 0  ) = ( 82 , 79 , 80 , 81 , 75 , 76 , 77 , 71 , 72 , 73 )
ARRAY BTNSUU( 10 ) = ( 78 , 74 , 55 , 181 , 156 , 14 , 211 , 207 )
CH=G@SETUP(320,240,16,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 17                     //配列をたどる
      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                    //表示する値を設定
        RENZOKU = 1                     //演算子の連続投入でない
      ENDIF
    ENDIF
    IF ( 10 <= I ) AND ( I <= 14 ) THEN //演算子が押された
      IF RENZOKU == 0 THEN
        ENZAN1 = I
      ELSE
        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
        IF I == 14 THEN
          KEKKA = SUU1                    //表示する値を設定
          SUU1 = 0
          ENZAN1 = 10
        ELSE
          KEKKA = SUU1                    //表示する値を設定
          ENZAN1 = I
        ENDIF
        SUU2 = 0
        RENZOKU = 0                      //演算子の連続投入になるかも
      ENDIF
    ENDIF
    IF ( I == 15 ) THEN                  //「BK」が押された
      SUU2 = SUU2 / 10                   //桁の処理
      KEKKA = SUU2                       //表示する値を設定
      RENZOKU = 1                        //演算子の連続投入でない
    ENDIF
    IF ( I == 16 ) THEN                  //「CE」が押された
      SUU2 = 0                           //数字を「0」に初期化する
      KEKKA = SUU2                       //表示する値を設定
      RENZOKU = 0                        //演算子の連続投入でない
    ENDIF
    IF ( I == 17 ) THEN                  //「C」が押された
      KEKKA = 0                          //表示する値を設定
      SUU1 = 0
      SUU2 = 0
      ENZAN1 = 10
      RENZOKU = 0                        //演算子の連続投入でない
    ENDIF
  ENDIF
  G@PRINT( CH , 32 , 8 , STR( KEKKA ) ) //数字を表示する
  G@FLIP( )                             //画面を更新
ENDLOOP