Auszahlungslogik
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 25 von 61.
Aufgabe
EinfachDein Bankkonto wächst! Jetzt fügen wir die Möglichkeit hinzu, Geld abzuheben. Im Gegensatz zu Einzahlungen gelten für Abhebungen zusätzliche Einschränkungen. Du kannst nicht mehr Geld abheben, als du hast. Deine withdraw-Funktion muss den Kontostand prüfen, bevor sie die Transaktion zulässt.
Aufbauend auf deinem bestehenden Bankkonto-Projekt erweiterst du das Modul um die Abhebungsfunktionalität. Hier zeigt sich die Kapselung besonders deutlich. Deine Funktion kann auf den verborgenen Kontostand zugreifen, um ausreichendes Guthaben zu prüfen – etwas, das externer Code niemals direkt tun könnte.
Du arbeitest mit drei Dateien:
account.h: Füge einen neuen Funktionsprototyp hinzu:withdraw. Diese Funktion übernimmt einen Account-Zeiger und einen Betrag vom Typdoubleund gibt einenintzurück (1 bei Erfolg, 0, wenn die Abhebung fehlschlägt). Behalte alle bestehenden Deklarationen fürcreate_account,destroy_accountunddepositbei.account.c: Implementiere die Funktionwithdraw. Eine Abhebung darf nur erfolgreich sein, wenn zwei Bedingungen erfüllt sind: Der Betrag muss positiv sein (größer als null), UND das Konto muss über ausreichendes Guthaben verfügen (balance >= amount). Wenn beide Bedingungen erfüllt sind, ziehe den Betrag vom Kontostand ab und gib 1 zurück. Andernfalls gib 0 zurück, ohne den Kontostand zu verändern.main.c: Zeige den vollständigen Ablauf für Einzahlungen und Abhebungen. Erstelle ein Konto, zahle Geld ein, um einen Kontostand festzulegen, und teste anschließend Abhebungen: sowohl erfolgreiche als auch erfolglose.
Du erhältst vier Eingaben: die Kontonummer (eine Ganzzahl), einen Einzahlungsbetrag (zum Festlegen des Anfangsguthabens), einen erfolgreichen Abhebungsbetrag (kleiner oder gleich dem eingezahlten Betrag) und einen fehlgeschlagenen Abhebungsbetrag (größer als der verbleibende Kontostand).
Erstelle in deiner Hauptdatei ein Konto und gib eine Bestätigung aus. Zahle das Anfangsguthaben ein und gib das Ergebnis aus. Führe anschließend die erfolgreiche Abhebung durch und gib aus, ob sie erfolgreich war. Versuche schließlich die Abhebung, die fehlschlagen sollte (unzureichendes Guthaben), und gib auch dieses Ergebnis aus. Zerstöre das Konto und bestätige die Bereinigung.
Gib die Ausgabe in diesem Format aus:
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedDabei ist 1001 die Kontonummer, 500.00 die Einzahlung, 200.00 die erfolgreiche Abhebung und 400.00 die fehlgeschlagene Abhebung (weil nach der ersten Abhebung nur noch 300.00 verbleiben). Formatiere alle Beträge mit zwei Dezimalstellen mithilfe von %.2f.
Deine withdraw-Funktion demonstriert die Leistungsfähigkeit der Kapselung. Sie kann den verborgenen Kontostand intern prüfen, um Entscheidungen zu treffen, während externer Code keine Möglichkeit hat, diese Validierung zu umgehen oder den Kontostand direkt einzusehen.
Probier es selbst
#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;
}Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler