goo blog サービス終了のお知らせ 

プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

電卓のアルゴリズム入門 - トップページ

2012年04月04日 01時00分00秒 | アルゴリズム関連

電卓ソフトの作り方(アルゴリズム)を紹介します。(戻る)

ここで紹介する電卓関数表示関数を利用すると Windows 電卓のような電卓ソフトを開発できます。
なお、ここで扱う電卓アルゴリズムは整数電卓(long型)とプログラマ電卓(long long型)の2つです。
プログラマ電卓とは、プログラマにとって便利なn進数の計算やAND・OR・XOR・NOTの論理演算が可能です。

小数も扱えるようにするには、BCD演算、多倍長演算、指数表現などいろいろと工夫をしないと実現できません。
しかし、浮動小数点の誤差を気にしないのであれば long 型から double 型(long double型)に変更すれば良いでしょう。
この場合は内部で double 型で計算を行って表示部分では有効桁数 12 桁で四捨五入して表示します。
こうすることで浮動小数点の欠点である誤差を感じなくさせることができます。
ここでは紹介しませんが興味のある方は挑戦してみて下さい。

電卓の考え方

次のリストは「123+456-79=」と入力したときの電卓の仕組み(状態遷移表)です。
ここでは入力メモリ(num)、結果メモリ(ans)、前回の演算文字(ope)とその処理が書かれてます。
赤色の部分 は電卓画面に表示するメモリ(ans/num)を表してます。

キー入力 電卓画面(表示) 結果メモリ(ans) 入力メモリ(num) 前回の演算文字(ope) 電卓処理 備考
[AC]キー0[ ]00(不定)ans=0
num=0
ope=OPE_SET
オールクリア
[1]キー1[ ]01OPE_SET(SPC)num=0
num=num*10+1
(入力中)
[2]キー12[ ]012OPE_SET(SPC)num=num*10+2
[3]キー123[ ]0123OPE_SET(SPC)num=num*10+3
[+]キー123[+]123123OPE_SET(SPC)ans=num
ope=OPE_ADD
最初は代入
[4]キー4[+]1234OPE_ADD(+)num=0
num=num*10+4
(入力中)
[5]キー45[+]12345OPE_ADD(+)num=num*10+5
[6]キー456[+]123456OPE_ADD(+)num=num*10+6
[-]キー579[-]579456OPE_ADD(+)ans+=num
ope=OPE_SUB
ここで加算
[7]キー7[-]5797OPE_SUB(-)num=0
num=num*10+7
(入力中)
[9]キー79[-]57979OPE_SUB(-)num=num*10+9
[=]キー500[=]50079OPE_SUB(-)ans-=num
ope=OPE_EQU
ここで減算
[=]キー500[=]50079OPE_EQU(=)ope=OPE_EQU演算文字の変更
  • [AC]キーは、全ての変数を初期化します。

  • 数字キーは、最初に押された時だけ入力メモリをクリアします。
    その後は「num=(num*10)+(数字-'0')」の計算式で桁数を増やします。

  • 演算キーは、前回の演算文字で入力メモリと結果メモリを計算します。

    1. OPE_SET(ans = num)
    2. OPE_ADD(ans += num)
    3. OPE_SUB(ans -= num)
    4. OPE_MUL(ans *= num)
    5. OPE_DIV(ans /= num)
    6. OPE_MOD(ans %= num)
    7. OPE_EQU(計算しない)

  • [=]キーも、前回の演算文字で入力メモリと結果メモリを計算します。
    その後は計算は終了したので計算を行いません。
    (今回は連続演算を禁止とする)

電卓のルール

  • 置数キーは[0]~[9]キーで小数は入力できない。
  • 英字キーは[A]~[F]キーで16進数を入力する。
  • 終了キーは[Q]キーで電卓ソフトを終了する。
  • 演算キーは[+][-][×][÷][%][=]キーで順に加算、減算、乗算、除算、剰余(あまり)、計算結果を行う。
  • 訂正キーは[ESC][DEL][BS]キーで順にオールクリア(AC)、入力キャンセル(CE)、1桁下がり(→)を行う。
  • 符号キーは[TAB]キーでプラス/マイナスの符号を切り替える。
  • 独立メモリは[↑][↓][←][→]キーで順にメモリ加算(M+)、メモリ減算(M-)、メモリクリア(MC)、メモリリコール(MR)を行う。
  • 定数メモリは[F01]~[F12]キーで定数呼び出し、[SHIFT]+[F01]~[SHIFT]+[F12]キーで定数記憶を行う。
  • n進モードは[INS]キーで2進数、4進数、8進数、10進数、16進数のモードに切り替わる。
  • 論理演算は[&][|][^][~][<][>]キーで順にAND、OR、XOR、NOT、LSH、RSHを行う。
  • 桁区切りは[¥]キーで桁区切りなし、3桁区切り、4桁区切りを切り替える。

電卓の作り方



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 数式文字列の関数処理を実装 | トップ | キー入力と電卓画面を観察する »
最新の画像もっと見る

コメントを投稿

アルゴリズム関連」カテゴリの最新記事