Logica di prelievo
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 25 di 61.
Sfida
FacileIl tuo conto bancario sta crescendo! Ora aggiungiamo la possibilità di prelevare fondi. A differenza dei depositi, i prelievi hanno un vincolo aggiuntivo. Non puoi prelevare più denaro di quanto ne hai. La tua funzione di prelievo deve controllare il saldo prima di autorizzare la transazione.
Partendo dal progetto del conto bancario che hai già realizzato, estenderai il modulo aggiungendo la funzionalità di prelievo. È qui che l’incapsulamento dà il meglio di sé. La tua funzione può accedere al saldo nascosto per verificare che i fondi siano sufficienti, cosa che il codice esterno non potrebbe mai fare direttamente.
Lavorerai con tre file:
account.h: aggiungi un nuovo prototipo di funzione:withdraw. Questa funzione accetta un puntatore a Account e un importo di tipodouble, e restituisce unint(1 in caso di successo, 0 se il prelievo non va a buon fine). Mantieni tutte le dichiarazioni esistenti percreate_account,destroy_accountedeposit.account.c: implementa la funzionewithdraw. Un prelievo dovrebbe andare a buon fine solo se sono soddisfatte due condizioni: l’importo deve essere positivo (maggiore di zero) E il conto deve avere fondi sufficienti (saldo >= importo). Se entrambe le condizioni sono soddisfatte, sottrai l’importo dal saldo e restituisci 1. Altrimenti, restituisci 0 senza modificare il saldo.main.c: mostra l’intero flusso di deposito e prelievo. Crea un conto, effettua un deposito per stabilire un saldo, poi verifica i prelievi: sia quelli riusciti sia quelli non riusciti.
Riceverai quattro input: l’ID del conto (un intero), un importo da depositare (per stabilire i fondi iniziali), un importo per un prelievo riuscito (inferiore o uguale all’importo depositato) e un importo per un prelievo non riuscito (superiore al saldo rimanente).
Nel tuo file principale, crea un conto e stampa una conferma. Deposita i fondi iniziali e stampa il risultato. Poi effettua il prelievo riuscito e stampa se è andato a buon fine. Infine, prova a effettuare il prelievo che dovrebbe fallire (per fondi insufficienti) e stampa il risultato. Distruggi il conto e conferma la pulizia.
Stampa l’output in questo formato:
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedDove 1001 è l’ID del conto, 500.00 è il deposito, 200.00 è il prelievo riuscito e 400.00 è il prelievo non riuscito (perché dopo il primo prelievo rimangono solo 300.00). Formatta tutti gli importi con due cifre decimali usando %.2f.
La tua funzione di prelievo dimostra la potenza dell’incapsulamento. Può controllare internamente il saldo nascosto per prendere decisioni, mentre il codice esterno non ha modo di aggirare questa convalida o di consultare direttamente il saldo.
Provalo tu
#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;
}Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online