Curso básico de Java - #13 - POO: Ejercicio cuenta de banco

Buenas,
Ya que tenemos una pequeña base en POO, por lo que hoy vamos a hacer un ejercicio que he copiado y pegado de los mas básicos que he encontrado del curso que he cursado este año.


Enunciado

Crea una clase llamada CuentaBancaria con los siguientes atributos: numeroCuenta, saldo y titular. Crea métodos para ingresar y retirar dinero (si se intenta retirar una cantidad mayor que el saldo, debe mostrarse un mensaje), así como un método que muestre el saldo actual.

Esto describe una clase funcional, de la cual hacer objetos, por lo que ademas de hacer esta clase (CuentaBancaria), haremos otra (AdministraCuenta) para interactuar con la primera.


CuentaBancaria

  1. Primero crearemos la clase con los respectivos atributos bien encapsulados:

    • El atributo numeroCuenta tiene que ser String ya que como se ve en la foto esta compuesto por caracteres alfanumericos.

    • El atributo saldo tiene que ser float ya que sera un numero real con dos decimales.

    • Y el atributo titular tiene que ser String ya que guardara una cadena de caracteres.

    Asi pues, empezamos con lo siguiente:

public class CuentaBancaria
{
	private String numeroCuenta;
	private float  saldo;
	private String titular;
}
  1. Creamos un método para ingresar dinero:
/**
 * Incrementa el saldo de la cuenta en la cantidad recibida.
 * @param cantidad (float) Cantidad a ingresar.
 */
public void ingresa(float cantidad)
{
	saldo += cantidad;
}
  1. Creamos el método para sacar dinero:
    Recordad que nos pide asegurarnos de que no se retire una cantidad mayor que el saldo existente, y, que en tal caso nos pide que se imprima un mensaje.
    Para esto seria muy conveniente hacer uso de las excepciones,, pero, bueno, aun no las hemos visto.
/**
 * Resta al saldo de la cuenta la cantidad recibida asegurándose que el resultado no sea negativo.
 * @param cantidad (float) Cantidad a retirar.
 */
public void retira(float cantidad)
{
	if (cantidad > saldo)
	{
		System.err.println("!Error: El saldo es menor a la cantidad a retirar");
	}
	else
	{
		saldo -= cantidad;
	}
}
  1. Para terminar con los requisitos, crearemos un método que devuelva el saldo actual.
/**
 * Getter del atributo saldo.
 * @return (float) Saldo de la cuenta.
 */
public float getSaldo()
{
	return saldo;
}
  1. También añadiré getters a los demás atributos aun cuando no se pide en el ejercicio:
/**
 * Getter del atributo numeroCuenta.
 * @return (String) Numero Id. de la cuenta.
 */
public String getNumeroDeCuenta()
{
	return numeroCuenta;
}

/**
 * Getter del atributo titular.
 * @return (String) Nombre y apellidos del titular de la cuenta.
 */
public String getTitular()
{
	return titular;
}
  1. Por ultimo, y aunque tampoco se pida, creare un método constructor con el cual inicializare los atributos de la clase:
public CuentaBancaria(String numeroCuenta, String titular)
{
	this.numeroCuenta = numeroCuenta;
	this.titular = titular;
}

this es una palabra clave que hace referencia a la clase desde donde se le llama, en este caso se usa para diferenciar las variables de la clase (los atributos), y las del método (los parámetros) que tienen el mismo nombre.

El resultado:

CuentaBancaria.java
/**
 * Clase CuentaBancaria.
 * Representa una cuenta bancaria básica.
 * Cada cuenta tiene un número de cuenta, un titular y un saldo.
 * Permite realizar operaciones como ingresar, retirar y consultar saldo.
 */
public class CuentaBancaria
{
	private String numeroCuenta;
	private float  saldo;
	private String titular;
	
	/**
	 * Constructor que inicializa una cuenta bancaria con su número y el nombre del titular.
	 * El saldo inicial es 0 por defecto.
	 * @param numeroCuenta (String) Número de cuenta (formato IBAN).
	 * @param titular (String) Nombre completo del titular.
	 * El saldo comienza en 0.
	 */
	public CuentaBancaria(String numeroCuenta, String titular)
	{
		this.numeroCuenta = numeroCuenta;
		this.titular = titular;
		this.saldo = 0;
	}
	
	/**
	 * Incrementa el saldo de la cuenta en la cantidad recibida.
	 * @param cantidad (float) Cantidad a ingresar.
	 */
	public void ingresa(float cantidad)
	{
		saldo += cantidad;
	}
	
	/**
	 * Resta al saldo de la cuenta la cantidad recibida asegurándose que el resultado no sea negativo.
	 * @param cantidad (float) Cantidad a retirar.
	 */
	public void retira(float cantidad)
	{
		if (cantidad > saldo)
		{
			System.err.println("!Error: El saldo es menor a la cantidad a retirar");
		}
		else
		{
			saldo -= cantidad;
		}
	}
	
	/**
	 * Getter del atributo saldo.
	 * @return (float) Saldo de la cuenta.
	 */
	public float getSaldo()
	{
		return saldo;
	}
	
	/**
	 * Getter del atributo numeroCuenta.
	 * @return (String) Numero Id. de la cuenta.
	 */
	public String getNumeroDeCuenta()
	{
		return numeroCuenta;
	}
	
	/**
	 * Getter del atributo titular.
	 * @return (String) Nombre y apellidos del titular de la cuenta.
	 */
	public String getTitular()
	{
		return titular;
	}
}

AdministraCuenta
Bien, ya tenemos la base para crear cuentas de banco, ahora toca crear una clase para poder utilizar CuentaBancaria.
Esto no lo pide en el ejercicio.

Mi idea es hacer un menú donde se listaran las diferentes cuentas de banco que tengamos creadas, y, al seleccionar una podamos administrarla.

AdministraCuenta.java
import java.util.Scanner;

/**
 * Clase AdministraCuenta
 * Permite gestionar múltiples cuentas bancarias a través de una interfaz de consola.
 * El usuario puede seleccionar una cuenta, y luego realizar acciones como ingresar dinero,
 * extraer dinero o consultar el saldo.
 */
public class AdministraCuenta
{
	// Array estático de cuentas bancarias, inicializado con algunos datos de ejemplo.
	private static CuentaBancaria[] cuentas = 
	{
		new CuentaBancaria("ES91 2100 0418 4502 0005 1332", "Juan Pérez"),
	    new CuentaBancaria("ES76 2038 5778 9876 1234 5678", "María López"),
	    new CuentaBancaria("ES12 0049 1500 1123 4567 8890", "Carlos García"),
	    new CuentaBancaria("ES43 1465 0100 9412 3456 7891", "Lucía Martínez"),
	    new CuentaBancaria("ES30 2103 4500 6100 1234 5678", "Ana Fernández"),
	    new CuentaBancaria("ES18 3183 4900 0012 3456 7890", "Pedro Sánchez"),
	    new CuentaBancaria("ES65 0049 2412 2820 0123 4567", "Elena Gómez")
	};
	
	private static Scanner entrada = new Scanner(System.in); // Creamos objeto estatico scanner para poder usarlo durante todo el programa.
	
	/**
	 * Método principal.
	 * Muestra el menú principal, permite seleccionar una cuenta y realizar 
	 * acciones sobre ella hasta que el usuario decida salir.
	 */
	public static void main(String[] args)
	{
		while (true)
		{
			// Mostrar el menú de cuentas y guardar la selección del usuario.
			int posicionCuenta = menuListarCuentas();
			
			// Si el usuario elige salir (opción 0) se saldra del bucle.
			if (posicionCuenta == -1)
			{
				break;
			}
			
			boolean seguirAdministrandoCuenta = true;
			
			while (seguirAdministrandoCuenta)
			{
				// Mostrar el menú de operaciones para la cuenta seleccionada, guardar accion que desea el usuario.
				int accion = menuCuenta(posicionCuenta);
				
				// Si el usuario elige volver atrás (opción 0), el bucle se terminara en la siguiente ejecucion.
				if (accion == 0)
				{
					seguirAdministrandoCuenta = false;
				}
				
				// Ejecuta la acción elegida (ingresar, extraer o consultar) sobre la cuenta seleccionada.
				administraCuenta(accion, posicionCuenta);
			}
		}
		
		System.out.println("Hasta pronto :)"); // Imprimir mensaje de terminar programa.
		
		entrada.close();  // Cerrar objeto Scanner (recomendado).
	}
	
	/**
	 * Muestra al usuario la lista de cuentas disponibles para seleccionar.
	 * @return el índice de la cuenta seleccionada (empezando por  0) o -1 si elige salir.
	 */
	private static int menuListarCuentas()
	{
		System.out.println("------------------------------------------");
		System.out.println("                CUENTAS:");
		System.out.println("------------------------------------------");
		
		// Listar las cuentas con un numero para seleccionarlas.
		for (int i = 0; i < cuentas.length; i++)
		{
			System.out.println("  " + (i + 1) + " - " + cuentas[i].getNumeroDeCuenta());
		}
		
		System.out.println();
		System.out.println("  0 - Salir.");
		
		System.out.println("------------------------------------------");
		
		int seleccionado;
		
		// Se pide seleccionar una cuenta hata que el numero sea valido.
		do
		{
			System.out.print("Seleccione cuanta: ");
			seleccionado = entrada.nextInt();
		} while (seleccionado < 0 || seleccionado > cuentas.length);
		
		return seleccionado - 1; // Devolvemos seleccion convertido a índice de array (empezando por 0), o, -1 si eligió salir.
	}
	
	/**
	 * Muestra el menú de opciones para una cuenta específica (extraer, ingresar, consultar saldo).
	 * @param posCuenta (int) Índice de la cuenta seleccionada.
	 * @return la acción seleccionada por el usuario (1 extraer, 2 ingresar, 3 consultar saldo o 0 para volver).
	 */
	private static int menuCuenta(int posCuenta)
	{
		System.out.println("------------------------------------------");
		System.out.println(" " + cuentas[posCuenta].getNumeroDeCuenta() + " - " + cuentas[posCuenta].getTitular());
		System.out.println("------------------------------------------");
		System.out.println("   1 - Extraer dinero.");
		System.out.println("   2 - Ingresar dinero.");
		System.out.println("   3 - Consultar saldo.");
		System.out.println();
		System.out.println("   0 - Atras.");
		System.out.println("------------------------------------------");
		
		int seleccionado;
		
		// Se pide una accion hata que el numero sea valido.
		do
		{
			System.out.print("Seleccione opcion: ");
			seleccionado = entrada.nextInt();
		} while (seleccionado < 0 || seleccionado > 3);
		
		return seleccionado;
	}
	
	/**
	 * Ejecuta una acción sobre la cuenta seleccionada según el código de acción recibido.
	 * @param accion (int) Código de acción (1: extraer, 2: ingresar, 3: consultar saldo)
	 * @param posCuenta (int) Índice de la cuenta sobre la que se realiza la acción
	 */
	private static void administraCuenta(int accion, int posCuenta)
	{
		switch (accion)
		{
		// Extraer dinero
		case 1:
			System.out.print("Cantidad a extaer: ");
			float cantidad = entrada.nextFloat();
			cuentas[posCuenta].retira(cantidad);
			break;
			
		// Ingresar dinero
		case 2:
			System.out.print("Cantidad a ingresar: ");
			float cantidad2 = entrada.nextFloat();
			cuentas[posCuenta].ingresa(cantidad2);
			break;
			
		// Consultar saldo
		case 3:
			System.out.println("El saldo actual es de " + cuentas[posCuenta].getSaldo() + "€.");
			break;
		
		}
	}
}

Ejemplo de ejecucuion

Output
------------------------------------------
                CUENTAS:
------------------------------------------
  1 - ES91 2100 0418 4502 0005 1332
  2 - ES76 2038 5778 9876 1234 5678
  3 - ES12 0049 1500 1123 4567 8890
  4 - ES43 1465 0100 9412 3456 7891
  5 - ES30 2103 4500 6100 1234 5678
  6 - ES18 3183 4900 0012 3456 7890
  7 - ES65 0049 2412 2820 0123 4567

  0 - Salir.
------------------------------------------
Seleccione cuanta: 5
------------------------------------------
 ES30 2103 4500 6100 1234 5678 - Ana Fernández
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 2
Cantidad a ingresar: 100
------------------------------------------
 ES30 2103 4500 6100 1234 5678 - Ana Fernández
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 1
Cantidad a extaer: 500
!Error: El saldo es menor a la cantidad a retirar
------------------------------------------
 ES30 2103 4500 6100 1234 5678 - Ana Fernández
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 999
Seleccione opcion: 1
Cantidad a extaer: 20
------------------------------------------
 ES30 2103 4500 6100 1234 5678 - Ana Fernández
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 3
El saldo actual es de 80.0€.
------------------------------------------
 ES30 2103 4500 6100 1234 5678 - Ana Fernández
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 0
------------------------------------------
                CUENTAS:
------------------------------------------
  1 - ES91 2100 0418 4502 0005 1332
  2 - ES76 2038 5778 9876 1234 5678
  3 - ES12 0049 1500 1123 4567 8890
  4 - ES43 1465 0100 9412 3456 7891
  5 - ES30 2103 4500 6100 1234 5678
  6 - ES18 3183 4900 0012 3456 7890
  7 - ES65 0049 2412 2820 0123 4567

  0 - Salir.
------------------------------------------
Seleccione cuanta: 2
------------------------------------------
 ES76 2038 5778 9876 1234 5678 - María López
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 2
Cantidad a ingresar: 200
------------------------------------------
 ES76 2038 5778 9876 1234 5678 - María López
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 3
El saldo actual es de 200.0€.
------------------------------------------
 ES76 2038 5778 9876 1234 5678 - María López
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 0
------------------------------------------
                CUENTAS:
------------------------------------------
  1 - ES91 2100 0418 4502 0005 1332
  2 - ES76 2038 5778 9876 1234 5678
  3 - ES12 0049 1500 1123 4567 8890
  4 - ES43 1465 0100 9412 3456 7891
  5 - ES30 2103 4500 6100 1234 5678
  6 - ES18 3183 4900 0012 3456 7890
  7 - ES65 0049 2412 2820 0123 4567

  0 - Salir.
------------------------------------------
Seleccione cuanta: 5
------------------------------------------
 ES30 2103 4500 6100 1234 5678 - Ana Fernández
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 3
El saldo actual es de 80.0€.
------------------------------------------
 ES30 2103 4500 6100 1234 5678 - Ana Fernández
------------------------------------------
   1 - Extraer dinero.
   2 - Ingresar dinero.
   3 - Consultar saldo.

   0 - Atras.
------------------------------------------
Seleccione opcion: 0
------------------------------------------
                CUENTAS:
------------------------------------------
  1 - ES91 2100 0418 4502 0005 1332
  2 - ES76 2038 5778 9876 1234 5678
  3 - ES12 0049 1500 1123 4567 8890
  4 - ES43 1465 0100 9412 3456 7891
  5 - ES30 2103 4500 6100 1234 5678
  6 - ES18 3183 4900 0012 3456 7890
  7 - ES65 0049 2412 2820 0123 4567

  0 - Salir.
------------------------------------------
Seleccione cuanta: 0
Hasta pronto :)

En fin, esto se puede afrontar de muchas formas, y sobre todo en la clase AdministraCuenta, por lo que animo a los seguidores del curso (si es que existe tal cosa) que aporten sus propias versiones (mejoradas o independientes a la mía).

Añadir que en este programa urge control de excepciones, pues a la mínima que el usuario haga algo raro el programa se caerá, pero bueno, aun no las hemos dado, y, me parece que así esta bien a modo de ejemplo de muchas funcionalidades que hemos visto teóricamente.

En el siguiente tema seguiremos con la POO, veremos la sobrecarga de constructores.

3 Me gusta

¡Me alegro mucho de que parezca interesante y educativo!
Te animo a comentar todas las dudas que te surjan a lo largo del curso, así tu y los que vengan después podrán resolver cosas que igual no están explicadas con mucho esmero.

También te animo a corregirme si ves algún error y a aportar conocimiento extra. Que aproveche : ) .

1 me gusta