出金ロジック
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 25/61。
チャレンジ
簡単あなたの銀行口座(Bank Account)が成長しています!次は、資金を引き出す機能を追加しましょう。入金とは異なり、出金には追加の制約があります。持っている以上の金額を引き出すことはできません。withdraw 関数は、取引を許可する前に残高を確認する必要があります。
既存の銀行口座プロジェクトを基に、出金機能を追加してモジュールを拡張します。ここでカプセル化の真価が発揮されます。関数は隠された残高にアクセスして十分な資金があるかを確認できますが、外部のコードが直接これを行うことはできません。
3つのファイルを扱います:
account.h: 新しい関数のプロトタイプwithdrawを追加します。この関数は Account ポインタとdouble型の金額を受け取り、int型(成功した場合は 1、失敗した場合は 0)を返します。create_account、destroy_account、depositの既存の宣言はすべて保持してください。account.c:withdraw関数を実装します。出金は、2つの条件が満たされた場合にのみ成功する必要があります。金額が正(0より大きい)であること、かつ、口座に十分な資金がある(balance >= amount)ことです。両方の条件を満たす場合は、残高から金額を差し引き、1 を返します。それ以外の場合は、残高を変更せずに 0 を返します。main.c: 入金と出金の一連のワークフローを実演します。アカウントを作成し、入金して残高を確定させ、成功する場合と失敗する場合の両方の出金をテストします。
4つの入力を受け取ります:口座ID(整数)、入金額(初期資金を確定するため)、成功する出金額(入金額以下)、および失敗する出金額(残りの残高を超える額)。
メインファイルで、アカウントを作成し、確認メッセージを出力します。初期資金を入金し、その結果を出力します。次に、成功する出金を実行し、それが成功したかどうかを出力します。最後に、失敗するはずの出金(残高不足)を試行し、その結果を出力します。アカウントを破棄し、クリーンアップを確認します。
出力は以下の形式で表示してください:
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedここで、1001 は口座ID、500.00 は入金額、200.00 は成功した出金額、400.00 は失敗した出金額(最初の出金後に 300.00 しか残っていないため)です。すべての金額は %.2f を使用して小数点以下2桁でフォーマットしてください。
あなたの withdraw 関数はカプセル化の力を示しています。内部で隠された残高をチェックして判断を下すことができますが、外部のコードはこのバリデーションをバイパスしたり、残高を直接覗き見たりすることはできません。
自分で試してみよう
#include <stdio.h>
#include "account.h"
int main() {
int account_id;
scanf("%d", &account_id);
double valid_amount;
scanf("%lf", &valid_amount);
double invalid_amount;
scanf("%lf", &invalid_amount);
Account* account = create_account(account_id);
printf("Account %d created\n", account_id);
int result_invalid = deposit(account, invalid_amount);
printf("Deposit %.2f: %d\n", invalid_amount, result_invalid);
int result_valid = deposit(account, valid_amount);
printf("Deposit %.2f: %d\n", valid_amount, result_valid);
destroy_account(account);
printf("Account destroyed\n");
return 0;
}