Prog. orientada a objetos

Proyecto: Simulador de sistema bancario

Objetivo

Durante esta actividad, los alumnos serán capaces de:


Introducción

Los sistemas informáticos juegan un papel crucial en la industria bancaria al proporcionar una infraestructura tecnológica robusta y segura para gestionar una amplia gama de servicios financieros. Estos sistemas permiten una operación eficiente, precisa y rápida, lo que resulta fundamental para mantener la confianza de los clientes, cumplir con las regulaciones gubernamentales y competir en un mercado cada vez más digitalizado. Además, facilitan la innovación en productos financieros y servicios, permitiendo a los bancos adaptarse ágilmente a las cambiantes demandas del mercado y ofrecer una experiencia bancaria moderna y conveniente a sus clientes.

En este proyecto desarrollarás una simulación simplificada de un sistema bancario en C++. El objetivo de este proyecto es proporcionar experiencia práctica con clases, herencia, polimorfismo, sobrecarga de operadores y manejo de excepciones. Crearás un sistema que gestione diferentes tipos de cuentas bancarias y realice diversas operaciones bancarias.

Descripción

IMPORTANTE

Para esta actividad de programación, se prohíbe el uso de sistemas de inteligencia artificial (IA) como ChatGPT o Copilot. El propósito es evaluar tu habilidad de programar de manera auténtica y sin ayuda de herramientas externas.

El incumplimiento de esta regla será considerado una violación académica y puede resultar en sanciones. Revisa la documentación oficial y otros recursos educativos, y no dudes en preguntar a tu profesor si tienes dudas.

¡Confía en tus habilidades y demuestra tu potencial!

En los equipos de dos personas ya conformados, escribe una aplicación en C++ que cumpla con los siguientes requisitos:

  1. Crea una clase base llamada BankAccount con los siguientes atributos y métodos:

    Atributos

    • std::string _account_number
    • std::string _account_holder_name
    • double _balance

    Métodos

    • Constructor para inicializar el número de cuenta, el nombre del titular de la cuenta y el saldo.
    • virtual void deposit(double amount)
    • virtual void withdraw(double amount)
    • std::string to_string() Devuelve como cadena de caracteres toda la información de la cuenta bancaria en un formato legible.

      Sugerencia: Se puede utilizar la siguiente función to_string_with_precision con el fin de que un número de punto flotante a_value se pueda convertir a una cadena de caracteres con exactamente n dígitos después del punto decimal:

      #include <sstream>
      
      std::string to_string_with_precision(double a_value, int n)
      {
          std::ostringstream out;
          out.precision(n);
          out << std::fixed << a_value;
          return std::move(out).str();
      }
      
  2. Crea dos clases derivadas de BankAccount:

    • SavingsAccount

      1. Atributo adicional: double _interest_rate
      2. Constructor para inicializar todos los atributos, incluida la tasa de interés.
      3. Sobrescribir el método deposit para agregar el interés basado en la tasa de interés después de realizar cada depósito.
      4. Sobrescribir el método withdraw lanzando una excepción si el retiro excede el saldo.

    • CheckingAccount

      1. Atributo adicional: double _overdraft_limit
      2. Constructor para inicializar todos los atributos, incluido el límite de sobregiro.
      3. Sobrescribir el método withdraw para permitir el retiro hasta el límite de sobregiro, lanzando una excepción en caso de excederlo.

    Asegúrate de que los métodos deposit y withdraw sean virtuales en la clase base y sobrescríbelos en las clases derivadas. Esto permite utilizar polimorfismo para manejar diferentes tipos de cuentas a partir de apuntadores o referencias a la clase base.

  3. Sobrecarga el operador << para mostrar en la salida estándar la información de cualquier cuenta bancaria en un formato legible (utilizando el método BankAccount::to_string).

  4. Implementa el manejo de excepciones para operaciones inválidas. Además de las ya mencionadas, también lanza una excepción si la cantidad de un depósito o retiro es negativa.

  5. Tu código debe funcionar correctamente con la siguiente función main:

    #include <iostream>
    #include <stdexcept>
    #include <vector>
    // Incluir aquí las definiciones de las clases:
    // BankAccount, SavingsAccount y CheckingAccount
    
    int main()
    {
        // Crear cuentas bancarias
        SavingsAccount c1(
            "SA12345", "Carmen Caramelo", 1000.0, 2.0);
        CheckingAccount c2(
            "CA54321", "Quique Queso", 500.0, 100.0);
        CheckingAccount c3(
            "CA00666", "Damien Thorn", 666.0, 66.0);
        SavingsAccount c4(
            "SA19999", "Waldo Waffles", 100.0, 9.8);
        const std::vector<BankAccount*> accounts = {
            &c1, &c2, &c3, &c4
        };
    
        // Probando depósitos y retiros
        for (BankAccount* account : accounts) {
            std::cout << *account << "\n";
            account->deposit(100.0);
            account->withdraw(50.0);
            std::cout << "=== Después de transacciones ===\n"
                << *account << "\n\n";
        }
    
        // Probando el manejo de excepciones
        try {
            c1.withdraw(2000.0);
        } catch (const std::exception& e) {
            std::cerr << "Error: " << e.what() << "\n";
        }
        try {
            c2.withdraw(700.0);
        } catch (const std::exception& e) {
            std::cerr << "Error: " << e.what() << "\n";
        }
        try {
            c3.withdraw(-1000.0);
        } catch (const std::exception& e) {
            std::cerr << "Error: " << e.what() << "\n";
        }
        try {
            c4.deposit(-1.0);
        } catch (const std::exception& e) {
            std::cerr << "Error: " << e.what() << "\n";
        }
    
        return 0;
    }
    

    La salida producida debe ser lo más parecida a lo siguiente:

    Número de cuenta: SA12345
    Titular de la cuenta: Carmen Caramelo
    Saldo: $1000.00
    === Después de transacciones ===
    Número de cuenta: SA12345
    Titular de la cuenta: Carmen Caramelo
    Saldo: $1072.00
    
    Número de cuenta: CA54321
    Titular de la cuenta: Quique Queso
    Saldo: $500.00
    === Después de transacciones ===
    Número de cuenta: CA54321
    Titular de la cuenta: Quique Queso
    Saldo: $550.00
    
    Número de cuenta: CA00666
    Titular de la cuenta: Damien Thorn
    Saldo: $666.00
    === Después de transacciones ===
    Número de cuenta: CA00666
    Titular de la cuenta: Damien Thorn
    Saldo: $716.00
    
    Número de cuenta: SA19999
    Titular de la cuenta: Waldo Waffles
    Saldo: $100.00
    === Después de transacciones ===
    Número de cuenta: SA19999
    Titular de la cuenta: Waldo Waffles
    Saldo: $169.60
    
    Error: Fondos insuficientes en la cuenta de ahorros
    Error: Se superó el límite de sobregiro
    Error: El monto del retiro no puede ser negativo
    Error: El monto del depósito no puede ser negativo
    

Consideraciones adicionales

¿Qué se debe entregar?

Crea un archivo comprimido TAR GZ o ZIP con el contenido completo del directorio proyecto. El archivo resultante se debe llamar proyecto.tar.gz o proyecto.zip.

Instrucciones para subir archivo

Para entregar el archivo proyecto.tar.gz/proyecto.zip, ingresa los siguientes datos:

Solicitar NIP

Solo es necesario que lo entregue un miembro del equipo.

La fecha límite es el miércoles 12 de junio.