スタック電卓2

 プログラム例で挙げたスタック電卓2について説明します。スタック処理の詳細は,スタックの項を参照してください。

 電卓プログラムは色々なデータの処理や計算をプログラム無しで,対話的に行うものです。勿論本格的な処理を行うには,プログラムを書いてそれを実行させるのが最適です。しかし,単純な処理の場合はプログラムを書かないでも,十分対応することが出来ます。

 Tiny Basic はコマンドラインをサポートしてますから,Basic に標準で組み込まれている機能については,コマンドラインで実行するのが最も適しています。しかし,特別な機能をプログラミングして,それを電卓的に使いたいこともあるかも知れません。Tiny Basic のコマンドラインでそのようなことも実は可能なのですが,ここでは独自に電卓用にプログラムを作ることにします。 電卓用プログラムを作ると,自分の好みに合わせた操作法を実現することが出来ます。

 このプログラムはスタック処理を基本にしています。このスタック処理を使うと,プログラミングも簡単で,操作や機能向上が簡単に可能です。

 

プログラムの構成要素

 スタック電卓ですから,まずスタックを利用します。ここでは数値スタックを使うことにします。より文字列操作を含むような処理をする場合は,文字列スタックを利用するのも良いでしょう。

 ここで使うスタックは配列 NStk() で構成され,要素は

  • スタックトップ(NumTop)
  • PushN(A)
  • PopN

です。


 このプログラムの基本部分は次の3つの要素から成ります。

  • コマンド・数データ入力・解釈

  • コマンド実行

  • スタック表示

以下これらの説明をします。

 

コマンド・数データ入力・解釈

 データやコマンドを入力する方法は,ソフトウエアより色々あります。Tiny Basic でもデータ入力の方法は色々あります。

 今回のスタック電卓は, Tiny Basic Ver.1.1 で可能になったコントロール画面のビジュアルな機能を使って作ってみました。

以下が起動画面です。

左上側にある大きな TextBox はスタックの内部を表示するためのもので,下にあるTextBoxがデータ入力用のものです。

 右側にあるボタン群がコマンドを担当します。


データ入力は,データ入力用の TextBox に入力されたものを,データ入力ボタンを押すことによってスタックに積みます。

入力用のTextBox は,CTextBox(2) を使います。 また,入力用のボタンは,上から順にボタン番号をつけているので,CButtin(17)です。ですから,入力処理は,以下のように単純なものです。

 

Sub CButton17_Click()  ' 入力ボタン
   PushN(Val(CTextBox(2).Text))    ' 入力されたものを数値に変換して,スタックに積む。
   CTextBox(2).Text =""            ' 入力後データ入力ボックスをクリアする。
   Call PrintStack                 ' 更新されたスタックの内容を表示しなおす。
End Sub

ここで, PrintStackは,スタックの内容を更新して,表示用の TextBox にスタックデータの内容を表示する Sub で次のようになります。これも比較的単純です。

 

Sub PrintStack
   CR$= Chr$(13)+Chr$(10)       ' 改行コードの設定
   PT$=""                       ' 表示用文字列
   for i=NumTop-12 to NumTop    ' スタックトップから13行表示
      If i>0 then 
          P$ = Str$(NStk(i))    ' 各行
      Else
          P$ = ""
      end If
      PT$=PT$+CR$+P$            ' 改行を加えて付け加える
   next i
   CTextBox(1).Text = PT$       ' 得られた内容を 表示用の TextBox に表示する。
End Sub

 コマンドは各ボタンを押すことで実行しますから,各ボタンごとに実行用のSub をCall すればよいだけです。

例えば,加法ボタンが押されたときは次のSub がまず呼ばれます。

 

Sub CButton1_Click()  ' 加法
   Call AddSubMul(1)  ' 加減乗用 Sub の1番目
   Call PrintStack    ' 更新されたスタックの内容を表示しなおす。
End Sub

これも単純です。

 

コマンド実行

 各コマンドごとに,Sub を書くわけですが,例えば,類似なコマンドはまとめて引数によって処理を区別します。

加減乗 Sub  は次です。

Sub AddSubMul(m) :' 加法減法乗法
   If NumTop<=1 then
      Call WriteError("データがたりません!")
   Else
      B = PopN()
      A = PopN()
      Select Case m
        Case 1 : Call PushN(A + B)
        Case 2 : Call PushN(A - B)
        Case 3 : Call PushN(A * B)
      End Select
   End If
End Sub

  2,3行はエラー処理です。加法減法乗法の演算は2個の引数が必要ですから,スタックに実際に2個以上の数があるか確認します。スタックに積んである数の個数は(スタックポインタ或いはスタックトップ) NumTop と言う Public 変数に入っています。ですから, NumTop <= 1 なら,演算が実行できません。この場合はエラー表示して,Sub を抜けます。

 そうでない場合,演算を実行します。実行する場合の引数はスタックに積まれていますから,スタックからPop をしてそれをそれぞれA, Bとします。Bが先にあるのは,スタックがLIFO(後入れ先出し)で順序が逆になるからです。そして 渡された引数に応じて,A+B,A-B, A*B を計算して,それを Push します。


 一般に,コマンド用のSub は次の様な形をしています。

 Sub NewCOM :' 新しいコマンド 引数は c 個
    If NumTop<=(c-1) then
       Call WriteError("データがたりません!")
    Else
       AC = PopN()
        ...                 c個だけ pop
       A1 = PopN()

        ...                  A1~ACを使って計算:計算結果が Result のとき

       Call PushN(Result)
    End If
 End Sub

 

まとめ

 このプログラム全体はここにあります。 全体は500行近くあり,小さいものではありませんが,それらは小さな機能を並べているだけで,プログラム構造自身は単純です。

 またこのプログラムは,コントロール画面の使い方の基本的例になっています。このプログラムを1つの枠組みとして,自分の好みのプログラムへと変身させてみて下さい。