Menu
Coddy logo textTech

Lógica de retiro

Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 25 de 61.

challenge icon

Desafío

Fácil

¡Tu cuenta bancaria está creciendo! Ahora vamos a añadir 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 verificar el saldo antes de permitir la transacción.

Basándote en tu proyecto de cuenta bancaria existente, ampliarás el módulo con la funcionalidad de retiro. Aquí es donde el encapsulamiento realmente brilla: tu función puede acceder al saldo oculto para verificar si hay 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 Account y un monto double, devolviendo un int (1 para éxito, 0 si el retiro falla). Mantén todas tus declaraciones existentes para create_account, destroy_account, y deposit.
  • account.c: Implementa la función withdraw. Un retiro solo debe tener éxito si se cumplen dos condiciones: el monto debe ser positivo (mayor que cero) Y la cuenta debe tener fondos suficientes (balance >= amount). Si ambas condiciones se cumplen, resta el monto del saldo y devuelve 1. De lo contrario, devuelve 0 sin modificar el saldo.
  • main.c: Demuestra tu flujo de trabajo completo de depósito y retiro. Crea una cuenta, realiza un depósito para establecer un saldo, luego prueba los retiros, tanto los exitosos como los fallidos.

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

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

Imprime la salida en 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). Formatea todos los montos con dos decimales usando %.2f.

Tu función withdraw demuestra el poder del encapsulamiento: puede verificar el saldo oculto internamente para tomar decisiones, mientras que el código externo no tiene forma de eludir esta validación o mirar el saldo directamente.

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 Object Oriented Programming