出金ロジック
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 25/61。
チャレンジ
簡単Your Bank Account が成長しています!それでは、資金を withdraw する機能を追加しましょう。deposit とは異なり、withdrawal には追加の制約があります。保有している金額を超えて引き出すことはできません。withdraw function では、取引を許可する前に balance を確認する必要があります。
既存の Bank Account プロジェクトを基に、モジュールを withdrawal 機能付きに拡張します。ここでカプセル化の真価が発揮されます。function は hidden balance にアクセスして十分な資金があるか確認できますが、外部のコードがそれを直接行うことは決してできません。
3つのファイルを扱います。
account.h: 新しい function prototype、withdrawを追加します。この function は Account pointer とdouble型の amount を受け取り、int(成功時は 1、withdrawal が失敗した場合は 0)を返します。create_account、destroy_account、depositの既存の宣言はすべて残してください。account.c:withdrawfunction を Implement します。withdrawal は、2つの条件が満たされた場合に only 成功します。amount が正(ゼロより大きい)であり、かつ account に十分な資金がある(balance >= amount)必要があります。両方の条件を満たしたら、balance から amount を subtract して 1 を return します。それ以外の場合は、balance を modifying せずに 0 を return します。main.c: 完全な deposit と withdraw のワークフローを示します。account を作成し、balance を確保するために deposit を行い、その後、成功する withdrawal と失敗する withdrawal の両方をテストします。
4つの入力を受け取ります。account ID(整数)、deposit amount(初期資金を確保するための金額)、successful withdrawal amount(deposit した金額以下)、およびfailed withdrawal amount(remaining balance より大きい金額)です。
main ファイルで account を作成し、確認メッセージを出力します。初期資金を deposit して、その結果を出力します。次に successful withdrawal を実行し、成功したかどうかを出力します。最後に、失敗するはずの withdrawal(資金不足)を試み、その結果を出力します。account を destroy_account し、クリーンアップを確認します。
次の形式で出力します。
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyed1001 は account ID、500.00 は deposit、200.00 は successful withdrawal、400.00 は failed withdrawal です(最初の withdrawal 後に残るのは 300.00 だけであるため)。すべての amount は、%.2f を使用して小数点以下2桁でフォーマットします。
withdraw function はカプセル化の力を示しています。内部で hidden balance を確認して判断できますが、外部のコードにはこの検証を回避したり、balance を直接参照したりする方法はありません。
自分で試してみよう
#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;
}オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ