電卓ソフトの作り方(アルゴリズム)を紹介します。(戻る)
ここで紹介する電卓関数と表示関数を利用すると 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[ ] | 0 | 0 | (不定) | ans=0 num=0 ope=OPE_SET | オールクリア |
[1]キー | 1[ ] | 0 | 1 | OPE_SET(SPC) | num=0 num=num*10+1 | (入力中) |
[2]キー | 12[ ] | 0 | 12 | OPE_SET(SPC) | num=num*10+2 | |
[3]キー | 123[ ] | 0 | 123 | OPE_SET(SPC) | num=num*10+3 | |
[+]キー | 123[+] | 123 | 123 | OPE_SET(SPC) | ans=num ope=OPE_ADD | 最初は代入 |
[4]キー | 4[+] | 123 | 4 | OPE_ADD(+) | num=0 num=num*10+4 | (入力中) |
[5]キー | 45[+] | 123 | 45 | OPE_ADD(+) | num=num*10+5 | |
[6]キー | 456[+] | 123 | 456 | OPE_ADD(+) | num=num*10+6 | |
[-]キー | 579[-] | 579 | 456 | OPE_ADD(+) | ans+=num ope=OPE_SUB | ここで加算 |
[7]キー | 7[-] | 579 | 7 | OPE_SUB(-) | num=0 num=num*10+7 | (入力中) |
[9]キー | 79[-] | 579 | 79 | OPE_SUB(-) | num=num*10+9 | |
[=]キー | 500[=] | 500 | 79 | OPE_SUB(-) | ans-=num ope=OPE_EQU | ここで減算 |
[=]キー | 500[=] | 500 | 79 | OPE_EQU(=) | ope=OPE_EQU | 演算文字の変更 |
[AC]キーは、全ての変数を初期化します。
数字キーは、最初に押された時だけ入力メモリをクリアします。
その後は「num=(num*10)+(数字-'0')」の計算式で桁数を増やします。演算キーは、前回の演算文字で入力メモリと結果メモリを計算します。
- OPE_SET(ans = num)
- OPE_ADD(ans += num)
- OPE_SUB(ans -= num)
- OPE_MUL(ans *= num)
- OPE_DIV(ans /= num)
- OPE_MOD(ans %= num)
- 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桁区切りを切り替える。
電卓の作り方
- 第1章 電卓観察
- 第2章 基本機能
- メイン関数から電卓関数を考える
- 電卓関数と表示関数からサブ関数を考える
- 置数キーの実装 (0-9)
- 演算キーの実装 (+-×÷=)
- 訂正キーの実装 (AC・CE・BS)
- 不具合対策の実装
- 電卓関数のまとめ
- 第3章 拡張機能
- 第4章 GUI電卓
- 第5章 メニューバー
※コメント投稿者のブログIDはブログ作成者のみに通知されます