Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-0202 Principios de informática - 2012b
Profesor Jeisson Hidalgo-Céspedes
Fecha: 13-oct-2012. Entrega tentativa grupo 10: 25-oct-2012, grupo 08: 26-oct-2012.
Implemente un pequeño simulador de un cajero automático el cual será capaz de realizar tres operaciones: cargar el cajero, consultar estado, y hacer retiros. Cargar el cajero se refiere a la acción hecha por el personal del banco de proveer el cajero con algún efectivo. Consultar el estado se refiere a desplegar la cantidad de efectivo actualmente en el cajero, necesario para permitir al personal del banco saber si el cajero necesita ser cargado de efectivo. Por su parte, los clientes del banco pueden retirar efectivo del cajero. Asuma que los clientes tienen infinita cantidad de dinero en sus cuentas.
El cajero sólo puede ser cargado o dispensar billetes de la denominación vigente: 50 mil, 20 mil, 10 mil, 5 mil, 2 mil y mil colones. Durante la carga, el personal del banco debe indicar cuántos billetes de cada denominación fueron depositados en el cajero, y éste reporta cuánto es su balance inicial y final. Al consultar el estado el cajero reporta su balance y la cantidad de billetes de cada denominación a disposición.
Al hacer un retiro, el cliente indica la cantidad de dinero que quiere obtener. Si este monto supera el balance del cajero, se le debe desplegar un mensaje de error ("Imposible dispensar el monto solicitado"). De lo contrario, el cajero automático tratará de hacer el retiro calculando cuántos billetes de cada denominación se requieren. Si es imposible construir este monto con los billetes existentes en el cajero, se desplegará el mismo mensaje de error. Si por el contrario, el monto se pudo construir, el cajero despliega sólo los billetes de cada denominación que deben ser dispensados y los descuenta de sus existencias. El siguiente podría ser un ejemplo de interacción con su cajero automático.
Cajero automatico v1.0
Menu:
1. Cargar dinero
2. Ver estado
3. Retirar dinero
0. Salir
Accion: 2
Estado del cajero
0 billete(s) de 50,000
0 billete(s) de 20,000
0 billete(s) de 10,000
0 billete(s) de 5,000
0 billete(s) de 2,000
0 billete(s) de 1,000
Balance: 0 colones
Menu:
1. Cargar dinero
2. Ver estado
3. Retirar dinero
0. Salir
Accion: 1
Balance inicial: 0
Indique la cantidad de billetes a cargar de:
50,000 colones: 10
20,000 colones: 10
10,000 colones: 10
5,000 colones: 10
2,000 colones: 10
1,000 colones: 10
Depositado: 880,000 colones
Balance final: 880,000 colones
Menu [...]
Accion: 3
Monto del retiro: 49700
Error: imposible dispensar el monto solicitado.
Menu [...]
Accion: 4
Accion: 3
Monto del retiro: 497000
Por favor tome su dinero:
9 billete(s) de 50,000
2 billete(s) de 20,000
1 billete(s) de 5,000
1 billete(s) de 2,000
Menu [...]
Accion: 2
Estado del cajero
1 billete(s) de 50,000
8 billete(s) de 20,000
10 billete(s) de 10,000
9 billete(s) de 5,000
9 billete(s) de 2,000
10 billete(s) de 1,000
Balance: 383,000 colones
Menu [...]
Accion: 3
Monto del retiro: 193000
Por favor tome su dinero:
1 billete(s) de 50,000
7 billete(s) de 20,000
1 billete(s) de 2,000
1 billete(s) de 1,000
Menu [...]
Accion: 2
Estado del cajero
0 billete(s) de 50,000
1 billete(s) de 20,000
10 billete(s) de 10,000
9 billete(s) de 5,000
8 billete(s) de 2,000
9 billete(s) de 1,000
Balance: 190,000 colones
Menu [...]
Accion: 1
Balance inicial: 190,000
Indique la cantidad de billetes a cargar de:
50,000 colones: 200
20,000 colones: 500
10,000 colones: 1000
5,000 colones: 2000
2,000 colones: 500
1,000 colones: 100
Depositado: 41,100,000 colones
Balance final: 41,290,000 colones
Menu [...]
Accion: 2
Estado del cajero
200 billete(s) de 50,000
501 billete(s) de 20,000
1,010 billete(s) de 10,000
2,009 billete(s) de 5,000
508 billete(s) de 2,000
109 billete(s) de 1,000
Balance: 41,290,000 colones
Menu [...]
Accion: 0
Para su solución implemente una clase Cajero, la cual tiene dos arreglos. Uno para almacenar las 6 denominaciones de billetes, y otro para almacenar la cantidad de billetes actualmente disponibles en el cajero de cada denominación. Ni los arreglos ni los métodos de la clase Cajero deben ser estáticos, a excepción del main(), el cual instancia un Cajero y le invoca un método simular().
El método simular() debe arrancar la simulación, presentando repetitivamente el menú y permitiendo al usuario escoger opciones. Por cada opción debe haber al menos un método en la clase. Sugerencia, implemente además un método para calcular el balance de dinero en el cajero. En cada método que necesite acceder a los arreglos, utilice ciclos. Si el Banco Central agrega una nueva denominación (por ejemplo, billetes de 100,000 colones), su programa debería funcionar adecuadamente con sólo incluir la nueva denominación en el arreglo correspondiente; es decir, ningún otro cambio debería hacérsele a su código fuente.
En cada lectura que haga al teclado, utilice su clase Keyboard para impedir que el usuario ingrese números inválidos, como por ejemplo, cantidades negativas de billetes o dinero. Sugerencia, para imprimir comas como separadores de miles en los números, utilice el formato "%,d" del método System.out.printf().
Note que antes de efectuar un retiro de dinero, su programa debe cerciorarse primero de que el retiro efectivamente puede hacerse. Para efectos de esta tarea, no es necesario hacer que su programa balancee la cantidad de billetes a dispensar. Es decir, cuando hay varias combinaciones de billetes que el cajero podría dispensar, su programa puede dar primero los billetes grandes hasta que estos se acaben para utilizar los billetes pequeños. Por ejemplo, si un cliente solicita 150,000 colones, el cajero le podría darle 3 billetes de 50,000; aunque en la vida real, eso probablemente sea inconveniente. Sugerencia: idee una solución matemática al retiro de billetes antes de implementarla en el lenguaje de programación.
Para efectos de esta evaluación, no se requiere que su cajero haga retiros inteligentes de dinero. Basta con implementar un algoritmo ávido, como el que se ejemplifica a continuación.
Supóngase que un cliente solicita retirar 164,000 colones y el cajero tiene suficiente cantidad de billetes de todas las denominaciones. El cajero podría empezar dispensando los billetes más grandes. De esta forma dispensaría 3 billetes de 50,000. A este punto habría dispensado 150,000 colones y le resta 14,000 de los solicitados por el cliente. Intenta entonces dispensar los 14,000 con los billetes de la siguiente denominación: 20,000 colones, para los que toma 0 de ellos. Continúa con la próxima denominación: 10,000, dispesando 1 de ellos, y así sucesivamente: 0 de 5,000; 2 de 4,000; y 0 de 1,000.
El algoritmo tras el ejemplo anterior se dice que es ávido (o voraz) porque en cada paso individual escoge la alternativa óptima con la esperanza de llegar a una solución óptima, sin embargo, el camino escogido puede ni siquiera llegar a una solución aunque la haya. Por ejemplo, supóngase que el cajero dispone de 3 billetes de 50,000; 3 de 20,000; 3 de 2,000 y se le solicita dispensar el mismo monto, 164,000 colones. El cajero tomará 3 billetes de 50,000 pero no puede formar los 14,000 con los billetes restantes, por lo que despliega el mensaje "Imposible dispensar el monto solicitado", lo cual es falso, dado que podría dispensar 2 billetes de 50,000, los 3 de 20,000 y 2 de 2,000. Encontrar una solución a este problema no es necesario para los objetivos de esta evaluación. Sin embargo, se deja como un ejercicio opcional para el estudiante interesado.
Cajero con dos arreglos como miembros de datos no estáticos. Su único método estático, main(), instancia un objeto Cajero e le invoca simular().Para presentar su solución, comprima los archivos .java que haya creado y súbalos a Mediación virtual en la asignación con nombre Tarea03.