10.処理をさらに煮詰める




『数字の処理を煮詰める』
「入力待ち」で数字が押された場合の詳細な処理を考えてみます。
現在の処理シーケンスでは、入力された数字を変数SUU2に代入するだけとなっているが、これでは1桁の数字を扱う事しか考えていません。
しかし、桁の処理は前章までで解決案が出ているので、それを下図に追加してみます。
また、何も数字が入力されていない時や、演算子を押した直後(この時点は何も数字が押されていないと同じようになるようにする為)には、変数SUU2に「0」が入っていなければならないので、その処理(初期化処理)も追加する。



以前、LGPで扱える値の最大値が2の31乗(2,147,483,647)であるので、最大値を超えないようにすると書いたが、ここでその処理を追加する。
最大値を超えない条件を考えると次のようになる。
@ 変数SUU2を10倍した値が2,147,483,647を超えたら駄目である。という事は、10倍する前の変数SUU2が214,748,364以下ならば、「SUU2=SUU2*10+数字」を実行しても最大値を超える事はない。
A 10倍する前の変数SUU2が214,748,364であっても、数字が7以下ならば、「SUU2=SUU2*10+数字」を実行しても最大値を超える事はない。


この判定を実際のプログラムでかくと次のようになる。

  IF 214748364 > SUU2 OR (214748364 == SUU2 AND 数字 <= 7 ) THEN
    〜処理〜
  ENDIF


判定式を説明する。下線の部分はそれぞれ条件@、Aとなる。その内のAを説明すると、「214748364 == SUU2」「数字 <= 7」の各判定式が同時に成り立つ場合に条件が成り立つとするように「AND」を間に書いている。





『演算子の処理を作る』
「演算子の処理を作る」と言われても既に出来ているだろうと思われるかも知れませんが、今出来ているのは加減乗除(+−*/)を押された場合だけを考慮したものであり、まだまだ足りない事はいろいろあります。

@ イコール「=」が押された場合の処理。
A 演算子が連続で押された場合の処理


『イコールが押された場合』
イコール「=」が押された場合の処理は加減乗除「+−*/」とは異なります。
試しにWindows標準装備の電卓を起動して試してみると分かりますが、イコール「=」を押した後は、起動した直後と同じ状態(「0+」が入力された状態)になる事が分かります。
なので、イコール「=」が押された場合は、演算までは加減乗除と同じ処理を行い、その直後で分岐し初期化処理(「0+」が入力された状態にする)を行うようにします。



演算子が連続で押された場合
演算子が連続で押された場合ですが、これもWindows標準装備の電卓の仕様にあわせる事にします。
演算子が連続で押された場合は、変数ENZAN1の演算子を新たに押された演算子に変更する作業を行います。しかし、演算子が連続で押された事をプログラムが理解する為の処理はまだ無いので、作ってあげなければなりません。
連続で押されたかどうかを覚えておく為に、変数RENZOKUと言う変数を新たに使う事にします。数字が何も入っていない時は変数RENZOKUに「0」を入れておき、一度でも数字が入たら「1」を入れる事にします。
演算子を押した時、変数RENZOKUの中身が「0」の場合は、演算子が連続で押されたとして変数ENZAN1を新たな演算子に更新してあげます。