Logika wypłaty
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 25 z 61.
Wyzwanie
ŁatwyTwoje konto bankowe rośnie! Teraz dodajmy możliwość wypłacania środków. W przeciwieństwie do wpłat, wypłaty mają dodatkowe ograniczenie. Nie możesz wypłacić więcej pieniędzy, niż masz. Twoja funkcja wypłaty musi sprawdzić saldo przed zatwierdzeniem transakcji.
Rozwijając istniejący projekt konta bankowego, rozszerzysz moduł o funkcjonalność wypłat. Właśnie tutaj enkapsulacja pokazuje swoją siłę. Twoja funkcja może uzyskać dostęp do ukrytego salda, aby sprawdzić, czy środki są wystarczające — czego kod zewnętrzny nie może zrobić bezpośrednio.
Będziesz pracować z trzema plikami:
account.h: Dodaj nowy prototyp funkcji:withdraw. Ta funkcja przyjmuje wskaźnik na Account oraz kwotę typudouble, a zwracaint(1 w przypadku powodzenia, 0, jeśli wypłata się nie powiedzie). Zachowaj wszystkie dotychczasowe deklaracje funkcjicreate_account,destroy_accountideposit.account.c: Zaimplementuj funkcjęwithdraw. Wypłata powinna się powieść tylko wtedy, gdy spełnione są dwa warunki: kwota musi być dodatnia (większa od zera) ORAZ na koncie muszą znajdować się wystarczające środki (saldo >= kwota). Jeśli oba warunki są spełnione, odejmij kwotę od salda i zwróć 1. W przeciwnym razie zwróć 0 bez zmieniania salda.main.c: Zademonstruj pełny przebieg wpłaty i wypłaty. Utwórz konto, dokonaj wpłaty, aby ustalić saldo, a następnie przetestuj wypłaty: zarówno udane, jak i nieudane.
Otrzymasz cztery dane wejściowe: identyfikator konta (liczbę całkowitą), kwotę wpłaty (aby zapewnić początkowe środki), kwotę udanej wypłaty (mniejszą lub równą wpłaconej kwocie) oraz kwotę nieudanej wypłaty (większą niż pozostałe saldo).
W pliku głównym utwórz konto i wyświetl potwierdzenie. Wpłać początkowe środki i wyświetl wynik. Następnie wykonaj udaną wypłatę i wyświetl informację, czy się powiodła. Na koniec spróbuj wykonać wypłatę, która powinna się nie powieść (z powodu niewystarczających środków), i wyświetl jej wynik. Zniszcz konto i potwierdź zwolnienie zasobów.
Wyświetl wynik w tym formacie:
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedGdzie 1001 to identyfikator konta, 500.00 to wpłata, 200.00 to udana wypłata, a 400.00 to nieudana wypłata (ponieważ po pierwszej wypłacie pozostaje tylko 300.00). Formatuj wszystkie kwoty z dokładnością do dwóch miejsc po przecinku, używając %.2f.
Twoja funkcja wypłaty pokazuje siłę enkapsulacji. Może wewnętrznie sprawdzać ukryte saldo, aby podejmować decyzje, podczas gdy kod zewnętrzny nie ma możliwości ominięcia tej walidacji ani bezpośredniego podejrzenia salda.
Spróbuj swoich sił
#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;
}Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania modularnego
Pliki nagłówkoweZabezpieczenia przed wielokrotnym dołączeniemPliki źródłoweFunkcje statycznePodsumowanie: kalkulator modularny4Enkapsulacja
Koncepcja niejawnych wskaźnikówDefiniowanie niejawnych strukturGettery i setteryWalidacja w setterachPowtórka: tajemnicze pudełko2Obiekty i metody
Struktury jako obiektyWskaźnik „self”Poprawność constWskaźnik czy wartośćMetody pomocniczePodsumowanie: menedżer punktów5Projekt: Proste konto bankowe
Konfiguracja projektuImplementacja konta8Polimorfizm
Wskaźniki do funkcji w strukturachSymulowanie metodKoncepcja interfejsuImplementowanie interfejsówIteracja polimorficznaPodsumowanie: Greeter11Wzorce projektowe w C
Wzorzec SingletonWzorzec fabrykiWzorzec iteratoraPodsumowanie: fabryka loggera3Cykl życia obiektu
Wzorzec konstruktoraWzorzec destruktoraInicjalizacja na stosieKopia głębokaPodsumowanie: klasa opakowująca ciąg znaków6Dziedziczenie przez kompozycję
Osadzanie strukturZasada pierwszego elementuDostęp do elementów klasy nadrzędnejKonwersja w górę hierarchiiPodsumowanie: hierarchia kształtów9Projekt: Rysownik kształtów
Przegląd projektuImplementacja kołaImplementacja prostokątaZastosowanie polimorfizmuKontener kształtówPoćwicz samodzielnie: Kompilator C online