8.数字の入力




『全数字の処理』
これまでのプログラムで押された、又は離されボタンの情報を取得できるようになりましたが、電卓には押された時だけ分かれば良く、離された時は知らなくても良い。
そこで、以下のように青い部分を追加してみた。

CH=G@SETUP(320,240,16,1)
CH2=G@CHRLOAD("DENTAKU.BMP")
LOOP
  G@CHRCOPY( CH2 , CH , 0 , 0 )
  I@KEYGET2( )
  IF I@KEYBTN2( 1 ) == 1 THEN
    BT = I@KEYBTN2( 0 )
  ELSE
    BT = 0
  ENDIF
  G@PRINT( CH , 0 , 0 , STR( BT ) )
  G@FLIP( )
ENDLOOP


何をしているのかといえば、ボタンが押された時だけI@KEYBTN2関数を実行し、結果を変数BTに代入します。それ以外のときは変数BTに「0」を代入します。
I@KEYBTN2関数の引数に「0」をしてした場合ボタンの番号を取得できますが、同関数の引数に「1」を指定すると、ボタンが押された時は「1」、ボタンが離された時は「2」、ボタンが押されても離されてもいない場合は「0」が取得されます。
そこで、IF〜THEN命令を使いI@KEYBTN2関数の結果が「1」の場合だけI@KEYBTN2関数を実行し、それ以外は「BT=0」を実行します。

『テンキーの”1”を認識』
ここまでで、ボタンが押された事を認識する事が出来ましたので、次にボタンの種類を限定して認識してみます。まず、テンキーの”1”を認識してみます。

CH=G@SETUP(320,240,16,1)
CH2=G@CHRLOAD("DENTAKU.BMP")
LOOP
  G@CHRCOPY( CH2 , CH , 0 , 0 )
  I@KEYGET2( )
  SUU = 0
  IF I@KEYBTN2( 1 ) == 1 THEN
    BT = I@KEYBTN2( 0 )
    IF BT == 79 THEN
      SUU = 1
    ENDIF
  ELSE
    BT = 0
  ENDIF
  G@PRINT( CH , 0 , 0 , STR( SUU ) )
  G@FLIP( )
ENDLOOP


変数BTに79(テンキーの「1」に割当てられた番号)が代入された場合に変数SUUに「1」を入れる事にし、それ以外では「0」を代入する。また結果の表示も変数SUUにする事に変えてみた。

『他のテンキーも認識』
テンキーの「1」を確認する事が出来れば残りの数字キーも確認したくなるのが人情と言う物です。
まあここは単純に「1」の処理を複写して順番に処理するようにしましょう。下にプログラムを載せますので、実行して見てください。

CH=G@SETUP(320,240,16,1)
CH2=G@CHRLOAD("DENTAKU.BMP")
LOOP
  G@CHRCOPY( CH2 , CH , 0 , 0 )
  I@KEYGET2( )
  SUU = 0
  IF I@KEYBTN2( 1 ) == 1 THEN
    BT = I@KEYBTN2( 0 )
    IF BT == 79 THEN          //ボタン「1」
      SUU = 1
    ENDIF
    IF BT == 80 THEN          //ボタン「2」
      SUU = 2
    ENDIF
    IF BT == 81 THEN          //ボタン「3」
      SUU = 3
    ENDIF
    IF BT == 75 THEN          //ボタン「4」
      SUU = 4
    ENDIF
    IF BT == 76 THEN          //ボタン「5」
      SUU = 5
    ENDIF
    IF BT == 77 THEN          //ボタン「6」
      SUU = 6
    ENDIF
    IF BT == 71 THEN          //ボタン「7」
      SUU = 7
    ENDIF
    IF BT == 72 THEN          //ボタン「8」
      SUU = 8
    ENDIF
    IF BT == 73 THEN          //ボタン「9」
      SUU = 9
    ENDIF
    IF BT == 82 THEN          //ボタン「0」
      SUU = 10
    ENDIF
  ELSE
    BT = 0
  ENDIF
  G@PRINT( CH , 0 , 0 , STR( SUU ) )
  G@FLIP( )
ENDLOOP


『数字をストック』
入力の処理はここまでで完璧です。では、押された数字を意識できた所で、電卓を作るのに必要な次の作業は何でしょう?それは、押された数字の順番を覚えて「桁」を意識する作業です。
プログラムの作り方に規則はないので色々な処理方法が考えられます。こういう時は自分が電卓になりきって、どういう風に処理をするのかを考えてみるといいでしょう。例えば「1」「2」「3」と続けてキーが押されたら数字の「123」と解釈したいわけです。
まず「1」が押されたら数字の「1」と解釈したいので変数に1を入れておきます。次に「2」が押されたら数字の「12」と解釈したいので・・・・規則を考えると、先の1を10倍した値に2を足してあげれば良い事が分かると思います。次に「2」が押されたら、先の12を10倍した値に3を足してあげれば良いのです。
この論理をプログラムにすると次のようになります。青い部分が前回からの変更点です。

CH=G@SETUP(320,240,16,1)
CH2=G@CHRLOAD("DENTAKU.BMP")
G@COLOR(0,0,1)
SUU = 0
LOOP
  G@CHRCOPY( CH2 , CH , 0 , 0 )
  I@KEYGET2( )
  IF I@KEYBTN2( 1 ) == 1 THEN
    BT = I@KEYBTN2( 0 )
    IF BT == 79 THEN          //ボタン「1」
      SUU = SUU * 10 + 1
    ENDIF
    IF BT == 80 THEN          //ボタン「2」
      SUU = SUU * 10 + 2
    ENDIF
    IF BT == 81 THEN          //ボタン「3」
      SUU = SUU * 10 + 3
    ENDIF
    IF BT == 75 THEN          //ボタン「4」
      SUU = SUU * 10 + 4
    ENDIF
    IF BT == 76 THEN          //ボタン「5」
      SUU = SUU * 10 + 5
    ENDIF
    IF BT == 77 THEN          //ボタン「6」
      SUU = SUU * 10 + 6
    ENDIF
    IF BT == 71 THEN          //ボタン「7」
      SUU = SUU * 10 + 7
    ENDIF
    IF BT == 72 THEN          //ボタン「8」
      SUU = SUU * 10 + 8
    ENDIF
    IF BT == 73 THEN          //ボタン「9」
      SUU = SUU * 10 + 9
    ENDIF
    IF BT == 82 THEN          //ボタン「0」
      SUU = SUU * 10
    ENDIF
  ELSE
    BT = 0
  ENDIF
  G@PRINT( CH , 32 , 8 , STR( SUU ) )
  G@FLIP( )
ENDLOOP




合計した結果を覚えておく領域を変数SUUとして、最初に0で初期化後、キー
が押される度に前の値を10倍してキーの値を加算してあげます。

ただ注意して欲しい事なのですが、2の31乗がLGPで扱える値の最大なので今のままでは最大値を超えると数値が狂ってしまいます。後で最大値の処理を考える事にします。