C++ 4日目:電卓アプリの仕様の確認

この章では、電卓アプリの仕様を明確にします

フェーズ1:基本設計

今回作成する電卓アプリは、「最低限の機能(四則演算)」ができる普通電卓を作成することを目的としています

電卓のレイアウトは、0~9までのボタン、小数点、演算子(+、ー、×、÷、=)、クリアボタン、戻るボタンを配置します

主な機能は次の通りです

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

電卓のレイアウトおよび配置したコントロールを以下にまとめます

番号分類用途・動作コントロールコントロールID備考
ディスプレイ演算子を表示するEdit ControlIDC_EDIT_OPERATOR最後に押された演算子を表示する
ディスプレイ入力中の文字列および計算結果を表示するEdit ControlIDC_EDIT_RESULT入力できる文字数は10桁と限定しそれ以上は入力できないようにする
クリア入力中の数値、演算子、計算結果をすべて初期状態にするButtonIDC_BUTTON_AC
入力数字ボタンを押すと、ディスプレイ②に入力した数字を順番に表示するButtonIDC_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
計算四則演算の計算を行うButtonIDC_BUTTON_DIV,IDC_BUTTON_MULT,IDC_BUTTON_MINUS,IDC_BUTTON_PLUS数字を入力し四則演算ボタンで計算を続ける
本電卓は2つの数の演算しかできないため、押した順番に2つの数の演算を順に行う
計算計算結果を確定させるButtonIDC_BUTTON_EQUAL
入力小数点の入力ButtonIDC_BUTTON_DECIMAL1..のように小数点は複数入力できない
拡張用ルート計算、符号の切り替え(+/-)を実行ButtonIDC_BUTTON_1、IDC_BUTTON_2フェーズ2で対応する
拡張用戻るButtonフェーズ2で対応する

実装方法

1. 変数の定義

以下の変数を用意します

  1. current_buffer:文字列、初期値:空文字
    現在入力中の数値およびピリオドを文字列として保持します
    演算子が押されたタイミングでクリアします
  2. last_operator: 文字列、初期値:空文字
    最後に選択した演算子を保持します
  3. stack[2] : 文字列の配列、初期値:空文字
    演算子をはさんで、右辺、左辺の値を保持します
    2つ目以上の演算子が入力されると、stack[0]には、それまでの計算結果を代入し、stack[1]は空文字とします

2. ボタンによる操作

数値ボタン

ユーザーの操作数値ボタンを押す
UI(ディスプレイ)数字を末尾に追加して表示する
内部ロジックcurrent_bufferに押された数字ボタンを追加する

小数点ボタン

ユーザーの操作小数点ボタンを押す
UI(ディスプレイ)
  • 小数点がcurrent_bufferに含まれていない場合、`.`を追加して表示
  • 小数点がcurrent_bufferに存在している場合、ブザーを鳴らすが、表示は変更しない
内部ロジック
  • 小数点がcurrent_bufferに存在しないとき、current_bufferに小数点を追加する
  • 小数点がcurrent_bufferに存在するとき、current_bufferの値は変化しない

演算子(+、×、÷、ー)ボタン

ユーザーの操作演算子(+、×、÷、ー)ボタンを押す
UI(ディスプレイ)
  1. 選択された演算子を表示
  2. 途中までの計算結果を表示する
内部ロジック
  1. 演算子の前まで入力していた値(current_buffer)を、stackにコピー後、current_bufferをクリアする
  2. 入力された演算子はlast_operatorに代入しディスプレイにも表示する
  3. stack[0]、stack[1]がそろった場合、演算子で計算を行い、計算結果をディスプレイに表示し、stack[0]にコピーする
なお、演算子の押された位置で以下のことを考慮する
  • 入力の先頭で演算子を押す(current_buffer、stack[0]ともに空文字)
    ×1、-1、などを想定
    演算子の前に0が入力されたと判断し、stack[0]に0を代入する
  • 数値、演算子、数字のように押される場合
    ①1+、1-、1×、1÷など想定
    演算子に対して右辺値が未定義なので、計算処理は実施しない
    ②1+1、1×2、1+2+3×4などを想定
    stack[0]、stack[1]がそろったので、演算子で計算を行い、計算結果をディスプレイに表示し、stack[0]にコピーする
  • 演算子のあとに演算子を押す
    1++、1×-2、1‐÷2 、1 ×÷-+2などを想定
    入力された演算子はlast_operatorに代入しディスプレイにも表示する
※ー(マイナス記号)は演算子として使用し、負の値の入力は フェーズ2 の`+/-`切り替えボタンを使用する

=(イコール)ボタン

ユーザーの操作=ボタンを押す
UI(ディスプレイ)計算結果を表示
内部ロジック概要:
  1. =前まで入力していた値(stack[0]とstack[1])を、last_operatorが保持する演算子で計算し、計算結果を表示する
  2. その後、計算結果はstack[0]にコピーし、current_buffer、stack[1]をクリアする
  3. 入力された=はlast_operatorに代入しディスプレイにも表示する
=の押された位置で以下のことを考慮する
  • 入力の先頭で=を押す(current_buffer、stack[0]、last_operatorともに空文字) =しか入力されていないため、stack[0]に0を代入し、ディスプレイにも0を表示する 入力された=はlast_operatorに代入しディスプレイにも表示する
  • 数値、演算子、数字、演算子、数字、=のように押される場合
    1+1=、1×2=、1+2+3×4=などを想定
    =前まで入力していた値(stack[0]とstack[1])を、last_operatorが保持する演算子で計算し、計算結果を表示する
    その後、計算結果はstack[0]にコピーし、current_buffer、stack[1]をクリアする
    入力された=はlast_operatorに代入しディスプレイにも表示する
  • 演算子のあとに=を押す
    1+=、1×-=、1‐= 、1×2==などを想定
    演算子に対して、右辺値が未定義であるため、左辺値のstack[0]の値を計算結果としてディスプレイに表示する
    current_buffer、stack[1]はクリアする
    入力された=はlast_operatorに代入しディスプレイにも表示する

クリアボタン

ユーザーの操作ACボタンを押す
UI(ディスプレイ)ディスプレイをクリアする
内部ロジックすべての変数を初期状態に戻す

3. エラー処理

1, +, 2, = のように、数値と演算子が交互にくるのが基本的なパターンです

  1. 小数点の入力時
    (1)current_inputに小数点がすでに存在しているとき、「ブザー」を鳴らし最後に入力した小数点は受け付けません
    (2) 不適切な小数点の入力
    小数点の前に数値がない場合(例: .5 は 0.5 と自動変換する)
    小数点の後に数値がない場合(例: 5. は 5.0 と自動変換する)
    小数点の前後に数値がない場合(例: . は 0 と自動変換する)
  2. =、演算子押下時
    (1) 0で除算する場合、ディスプレイに「Cannot divide by zero」を表示します
    (2) 不適切な小数点の入力
  3. 計算時に数値として正しいか
    計算時に、左辺、右辺の値がそれぞれ数値として正しい形式かをチェックし、正しくない場合、ディスプレイに「Error」と表示します

フェーズ2:拡張機能

フェーズ2として、以下の機能を追加します
(※フェーズ1の基本機能が完全に動作することが前提となります)

フェーズ1から追加する処理は次の通りです

  • ルート計算の追加
    数値が入力された状態でルートボタンを押下することで、平方根の結果を表示します
  • 一つ戻る機能
    現在入力中(current_buffer)の値の末尾を削除します
  • +/-ボタンの追加
    現在入力中(current_buffer)の数値の符号を入れ変えます

以上が、今回作成する電卓アプリの仕様です
5日目からは、フェーズ1の実装方法に入ります

コメント

この記事へのコメントはありません。

関連記事

C++ 基礎編 5日目

C++ 発展編4日目

C++ 基礎編 7日目

PAGE TOP