Menu
Coddy logo textTech

Lógica de retiro

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 25 de 61.

challenge icon

Desafío

Fácil

¡Tu cuenta bancaria está creciendo! Ahora agreguemos la capacidad de retirar fondos. A diferencia de los depósitos, los retiros tienen una restricción adicional. No puedes retirar más dinero del que tienes. Tu función withdraw debe comprobar el balance antes de permitir la transacción.

Partiendo de tu proyecto existente de cuenta bancaria, ampliarás el módulo con funcionalidad de retiro. Aquí es donde la encapsulación realmente demuestra su utilidad. Tu función puede acceder al balance oculto para verificar que haya fondos suficientes, algo que el código externo nunca podría hacer directamente.

Trabajarás con tres archivos:

  • account.h: Añade un nuevo prototipo de función: withdraw. Esta función recibe un puntero a Account y un importe double, y devuelve un int (1 si tiene éxito, 0 si el retiro falla). Conserva todas tus declaraciones existentes para create_account, destroy_account y deposit.
  • account.c: Implementa la función withdraw. Un retiro debe tener éxito solo si se cumplen dos condiciones: el importe debe ser positivo (mayor que cero), Y la cuenta debe tener fondos suficientes (balance >= importe). Si ambas condiciones se cumplen, resta el importe del balance y devuelve 1. De lo contrario, devuelve 0 sin modificar el balance.
  • main.c: Muestra el flujo completo de deposit y withdraw. Crea una cuenta, realiza un depósito para establecer un balance y, después, prueba los retiros: tanto los exitosos como los no exitosos.

Recibirás cuatro entradas: el ID de la cuenta (un entero), un importe de depósito (para establecer los fondos iniciales), un importe de retiro exitoso (menor o igual que el importe depositado) y un importe de retiro fallido (mayor que el balance restante).

En tu archivo principal, crea una cuenta e imprime una confirmación. Deposita los fondos iniciales e imprime el resultado. Después, realiza el retiro exitoso e imprime si tuvo éxito. Finalmente, intenta realizar el retiro que debería fallar (por fondos insuficientes) e imprime ese resultado. Destruye la cuenta y confirma la limpieza.

Imprime la salida con este formato:

Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyed

Donde 1001 es el ID de la cuenta, 500.00 es el depósito, 200.00 es el retiro exitoso y 400.00 es el retiro fallido (porque solo quedan 300.00 después del primer retiro). Da formato a todos los importes con dos decimales usando %.2f.

Tu función withdraw demuestra el poder de la encapsulación. Puede comprobar internamente el balance oculto para tomar decisiones, mientras que el código externo no tiene forma de omitir esta validación ni de consultar directamente el balance.

Pruébalo tú mismo

#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;
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online