Menu
CoddyTech

復習 - 銀行口座マネージャー

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 33/104。

challenge icon

チャレンジ

簡単

この章で学んだクラスのプロパティに関する概念、つまりゲッターとセッターを使った非公開メンバー、constメンバー関数、mutableメンバー、static変数とメソッド、フレンド関数をすべて組み合わせて、完全な銀行口座管理プログラムを作りましょう。

コードを整理するため、2つのファイルを作成します。

  • BankAccount.h: 適切なカプセル化を用いて口座データを管理するBankAccountクラスを定義します。クラスには次のものを含めます。
    • 非公開メンバー: accountNumber(string)、ownerName(string)、balance(double)、および残高が確認された回数を記録するmutable int queryCount
    • 存在する口座数を記録する非公開のstaticメンバーtotalAccounts
    • 口座番号、所有者名、初期残高を受け取るコンストラクター。queryCountを0に初期化し、totalAccountsをインクリメントします。
    • constゲッター: getAccountNumber()、getOwnerName()、getBalance()。残高ゲッターは、呼び出されるたびにqueryCountをインクリメントします。
    • 残高が確認された回数を返すconstゲッターgetQueryCount()
    • 金額が正の場合に限り残高に加算するdeposit(double amount)メソッド
    • 金額が正で、現在の残高を超えない場合に限り残高から差し引くwithdraw(double amount)メソッド
    • 作成された口座の総数を返すstaticメソッドgetTotalAccounts()
    • 口座間でお金を移動するフレンド関数transfer(BankAccount& from, BankAccount& to, double amount)を宣言します。金額が正で、送金元に十分な資金がある場合に限り、送金を行います。

    クラス定義の後に、staticメンバーとフレンド関数を定義します。

  • main.cpp: これらすべての機能が連携して動作することを示します。入力から所有者名2つと初期残高2つを読み取ります(合計4行: name1、balance1、name2、balance2)。次に、以下を行います。
    • 口座番号"ACC001"と"ACC002"を持つBankAccountオブジェクトを2つ作成します。
    • "Total accounts: <count>"を出力します。
    • 1つ目の口座について"<name>: $<balance>"を出力します。
    • 2つ目の口座について"<name>: $<balance>"を出力します。
    • 1つ目の口座に500.0を入金します。
    • 1つ目の口座について"After deposit - <name>: $<balance>"を出力します。
    • フレンド関数を使って、1つ目の口座から2つ目の口座へ300.0を送金します。
    • "After transfer:"を出力します。
    • 1つ目の口座について" <name>: $<balance>"を出力します。
    • 2つ目の口座について" <name>: $<balance>"を出力します。
    • 1つ目の口座について"Query count for <name>: <count>"を出力します。

<iomanip>のstd::fixedとstd::setprecision(2)を使い、すべての残高を小数点以下2桁で表示します。残高の入力値は、std::stod()を使って文字列からdoubleに変換します。

ヘッダーファイルにヘッダーガードを忘れずに記述し、必要に応じて<string>と<iostream>をインクルードしてください。

自分で試してみよう

#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"

int main() {
    // 入力を読み込む
    std::string name1, name2;
    std::string balance1Str, balance2Str;
    
    std::getline(std::cin, name1);
    std::getline(std::cin, balance1Str);
    std::getline(std::cin, name2);
    std::getline(std::cin, balance2Str);
    
    double balance1 = std::stod(balance1Str);
    double balance2 = std::stod(balance2Str);
    
    // 出力形式を小数点以下2桁に設定する
    std::cout << std::fixed << std::setprecision(2);
    
    // TODO: 口座番号が "ACC001" と "ACC002" の2つのBankAccountオブジェクトを作成する
    
    // TODO: "Total accounts: <count>" を出力する
    
    // TODO: 最初の口座について "<name>: $<balance>" を出力する
    
    // TODO: 2番目の口座について "<name>: $<balance>" を出力する
    
    // TODO: 最初の口座に500.0を入金する
    
    // TODO: 最初の口座について "After deposit - <name>: $<balance>" を出力する
    
    // TODO: friend関数を使って、最初の口座から2番目の口座へ300.0を振り替える
    
    // TODO: "After transfer:" を出力する
    
    // TODO: 最初の口座について "  <name>: $<balance>" を出力する(2スペースのインデントに注意)
    
    // TODO: 2番目の口座について "  <name>: $<balance>" を出力する(2スペースのインデントに注意)
    
    // TODO: 最初の口座について "Query count for <name>: <count>" を出力する
    
    return 0;
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: C++オンラインコンパイラ