この章では、電卓アプリの仕様を明確にします
フェーズ1:基本設計
今回作成する電卓アプリは、「最低限の機能(四則演算)」ができる普通電卓を作成することを目的としています
電卓のレイアウトは、0~9までのボタン、小数点、演算子(+、ー、×、÷、=)、クリアボタン、戻るボタンを配置します
主な機能は次の通りです
- ディスプレイ:
入力中の文字列および演算子を表示するテキストボックスをそれぞれ保持します
入力できる文字数は10桁と限定し、それ以上は入力できないようにします
計算結果も最大10桁まで表示するものとします - 入力:
数字ボタンを押すと、テキストボックスに入力した数字を順番に表示します - 計算:
数字を入力し四則演算ボタンで計算を続けるか、「=」ボタンで計算結果を確定させます
普通電卓では、2つの数の演算しかできません。そのため、押した順番に2つの数の演算を次々と行います - クリア:
「AC」ボタンを押すと、入力中の数値、演算子、計算結果をすべて初期状態に戻します - 戻るボタン:
1桁前の数値の入力を削除します
フェーズ2の拡張機能で組み込みます - エラー処理:
0による除算に対して「Cannot divide by zero」、=または演算子、押下時に、数値として判断できない場合には「Error」と表示します
クリアボタンを押すことで、エラーから復帰します
電卓のレイアウトおよび配置したコントロールを以下にまとめます

| 番号 | 分類 | 用途・動作 | コントロール | コントロールID | 備考 |
|---|---|---|---|---|---|
| ① | ディスプレイ | 演算子を表示する | Edit Control | IDC_EDIT_OPERATOR | 最後に押された演算子を表示する |
| ② | ディスプレイ | 入力中の文字列および計算結果を表示する | Edit Control | IDC_EDIT_RESULT | 入力できる文字数は10桁と限定しそれ以上は入力できないようにする |
| ③ | クリア | 入力中の数値、演算子、計算結果をすべて初期状態にする | Button | IDC_BUTTON_AC | |
| ④ | 入力 | 数字ボタンを押すと、ディスプレイ②に入力した数字を順番に表示する | Button | IDC_BUTTON_ZERO,IDC_BUTTON_ONE,IDC_BUTTON_TWO,IDC_BUTTON_THREE,IDC_BUTTON_FOUR,IDC_BUTTON_FIVE,IDC_BUTTON_SIX,IDC_BUTTON_SEVEN,IDC_BUTTON_EIGHT,IDC_BUTTON_ NINE | |
| ⑤ | 計算 | 四則演算の計算を行う | Button | IDC_BUTTON_DIV,IDC_BUTTON_MULT,IDC_BUTTON_MINUS,IDC_BUTTON_PLUS | 数字を入力し四則演算ボタンで計算を続ける 本電卓は2つの数の演算しかできないため、押した順番に2つの数の演算を順に行う |
| ⑥ | 計算 | 計算結果を確定させる | Button | IDC_BUTTON_EQUAL | |
| ⑦ | 入力 | 小数点の入力 | Button | IDC_BUTTON_DECIMAL | 1..のように小数点は複数入力できない |
| ⑧ | 拡張用 | ルート計算、符号の切り替え(+/-)を実行 | Button | IDC_BUTTON_1、IDC_BUTTON_2 | フェーズ2で対応する |
| ⑨ | 拡張用 | 戻る | Button | フェーズ2で対応する |
実装方法
1. 変数の定義
以下の変数を用意します
- current_buffer:文字列、初期値:空文字
現在入力中の数値およびピリオドを文字列として保持します
演算子が押されたタイミングでクリアします - last_operator: 文字列、初期値:空文字
最後に選択した演算子を保持します - stack[2] : 文字列の配列、初期値:空文字
演算子をはさんで、右辺、左辺の値を保持します
2つ目以上の演算子が入力されると、stack[0]には、それまでの計算結果を代入し、stack[1]は空文字とします
2. ボタンによる操作
数値ボタン
| ユーザーの操作 | 数値ボタンを押す |
|---|---|
| UI(ディスプレイ) | 数字を末尾に追加して表示する |
| 内部ロジック | current_bufferに押された数字ボタンを追加する |
小数点ボタン
| ユーザーの操作 | 小数点ボタンを押す |
|---|---|
| UI(ディスプレイ) |
|
| 内部ロジック |
|
演算子(+、×、÷、ー)ボタン
| ユーザーの操作 | 演算子(+、×、÷、ー)ボタンを押す |
|---|---|
| UI(ディスプレイ) |
|
| 内部ロジック |
|
=(イコール)ボタン
| ユーザーの操作 | =ボタンを押す |
|---|---|
| UI(ディスプレイ) | 計算結果を表示 |
| 内部ロジック | 概要:
|
クリアボタン
| ユーザーの操作 | ACボタンを押す |
|---|---|
| UI(ディスプレイ) | ディスプレイをクリアする |
| 内部ロジック | すべての変数を初期状態に戻す |
3. エラー処理
1, +, 2, = のように、数値と演算子が交互にくるのが基本的なパターンです
- 小数点の入力時
(1)current_inputに小数点がすでに存在しているとき、「ブザー」を鳴らし最後に入力した小数点は受け付けません
(2) 不適切な小数点の入力
小数点の前に数値がない場合(例: .5 は 0.5 と自動変換する)
小数点の後に数値がない場合(例: 5. は 5.0 と自動変換する)
小数点の前後に数値がない場合(例: . は 0 と自動変換する) - =、演算子押下時
(1) 0で除算する場合、ディスプレイに「Cannot divide by zero」を表示します
(2) 不適切な小数点の入力 - 計算時に数値として正しいか
計算時に、左辺、右辺の値がそれぞれ数値として正しい形式かをチェックし、正しくない場合、ディスプレイに「Error」と表示します
フェーズ2:拡張機能
フェーズ2として、以下の機能を追加します
(※フェーズ1の基本機能が完全に動作することが前提となります)
フェーズ1から追加する処理は次の通りです
- ルート計算の追加
数値が入力された状態でルートボタンを押下することで、平方根の結果を表示します - 一つ戻る機能
現在入力中(current_buffer)の値の末尾を削除します - +/-ボタンの追加
現在入力中(current_buffer)の数値の符号を入れ変えます
以上が、今回作成する電卓アプリの仕様です
5日目からは、フェーズ1の実装方法に入ります
コメント