Logique de retrait
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 25 sur 61.
Défi
FacileVotre compte bancaire s'agrandit ! Ajoutons maintenant la possibilité de retirer des fonds. Contrairement aux dépôts, les retraits ont une contrainte supplémentaire : vous ne pouvez pas retirer plus d'argent que vous n'en avez. Votre fonction withdraw doit vérifier le solde avant d'autoriser la transaction.
En vous appuyant sur votre projet de compte bancaire existant, vous allez étendre le module avec la fonctionnalité de retrait. C'est là que l'encapsulation brille vraiment : votre fonction peut accéder au solde caché pour vérifier si les fonds sont suffisants, ce qu'un code externe ne pourrait jamais faire directement.
Vous travaillerez avec trois fichiers :
account.h: Ajoutez un nouveau prototype de fonction :withdraw. Cette fonction prend un pointeur Account et un montant de typedouble, retournant unint(1 pour le succès, 0 si le retrait échoue). Conservez toutes vos déclarations existantes pourcreate_account,destroy_account, etdeposit.account.c: Implémentez la fonctionwithdraw. Un retrait ne doit réussir que si deux conditions sont remplies : le montant doit être positif (supérieur à zéro), ET le compte doit avoir des fonds suffisants (balance >= amount). Si les deux conditions sont remplies, soustrayez le montant du solde et retournez 1. Sinon, retournez 0 sans modifier le solde.main.c: Démontrez votre flux de travail complet de dépôt et de retrait. Créez un compte, effectuez un dépôt pour établir un solde, puis testez les retraits — à la fois ceux qui réussissent et ceux qui échouent.
Vous recevrez quatre entrées : l'ID du compte (un entier), un montant de dépôt (pour établir les fonds initiaux), un montant de retrait réussi (inférieur ou égal au montant déposé), et un montant de retrait échoué (supérieur au solde restant).
Dans votre fichier principal, créez un compte et affichez une confirmation. Déposez les fonds initiaux et affichez le résultat. Effectuez ensuite le retrait réussi et affichez s'il a réussi. Enfin, tentez le retrait qui devrait échouer (fonds insuffisants) et affichez ce résultat. Détruisez le compte et confirmez le nettoyage.
Affichez la sortie dans ce format :
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedOù 1001 est l'ID du compte, 500.00 est le dépôt, 200.00 est le retrait réussi, et 400.00 est le retrait échoué (car il ne reste que 300.00 après le premier retrait). Formatez tous les montants avec deux décimales en utilisant %.2f.
Votre fonction withdraw démontre la puissance de l'encapsulation — elle peut vérifier le solde caché en interne pour prendre des décisions, tandis que le code externe n'a aucun moyen de contourner cette validation ou de consulter le solde directement.
Essayez vous-même
#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;
}Toutes les leçons de Object Oriented Programming
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle