Maquina de cambio en java

oskrok
07 de Noviembre del 2005
Bien, mi programa se compone de 2 clases, la clase Usuario:

public class Usuario {
/**
* Variable que almacena la cantidad de dinero a cambiar
*/
double dineroUsu;

/**
* Metodo que lee de teclado
* @return Devuelve la cadena leida
*/

public String leerTeclado() {
String cad = "";
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
try {
return teclado.readLine();
}
catch (IOException e) {
System.out.println(" Se ha producido el siguiente error: ");
System.out.println(e.getMessage());
}
return cad;
}

/**
* Metodo que lee la cantidad de dinero a cambiar
* @param banesto se le pasa una clase tipo Caja
*/

public void introducirDinero(Caja banesto) {
String cad = "";
System.out.println("Introduce la cantidad de dinero que deseas cambiar:");
cad = leerTeclado();
dineroUsu = Double.parseDouble(cad);
banesto.darCambio(dineroUsu);
}

/**
* Metodo que carga la maquina de dinero.
* @param banesto se le pasa una clase tipo Caja
*/

public void cargarMaquina(Caja banesto) {
int dineroCargado[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
System.out.println("Proceso de carga de la maquina");
System.out.println("Nº de monedas de 1 cent:");
dineroCargado[0] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 2 cent:");
dineroCargado[1] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 5 cent:");
dineroCargado[2] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 10 cent:");
dineroCargado[3] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 20 cent:");
dineroCargado[4] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 50 cent:");
dineroCargado[5] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 1 €:");
dineroCargado[6] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 2 €:");
dineroCargado[7] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 5 €:");
dineroCargado[8] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 10 €:");
dineroCargado[9] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 20 €:");
dineroCargado[10] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 50 €:");
dineroCargado[11] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 100 €:");
dineroCargado[12] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 200 €:");
dineroCargado[13] = Integer.parseInt(leerTeclado());
for (int i = 0; i < dineroCargado.length; i++) {
banesto.cargarDinero(i, dineroCargado[i]);
}
}

/**
* Metodo que vacia la maquina en caso de que estea llena.
* @param banesto se le pasa una clase de tipo Caja
*/

public void vaciarMaquina(Caja banesto) {
int dineroRetirado[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
System.out.println("Proceso de vaciado de la maquina");
System.out.println("Nº de monedas de 1 cent:");
dineroRetirado[0] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 2 cent:");
dineroRetirado[1] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 5 cent:");
dineroRetirado[2] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 10 cent:");
dineroRetirado[3] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 20 cent:");
dineroRetirado[4] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 50 cent:");
dineroRetirado[5] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 1 €:");
dineroRetirado[6] = Integer.parseInt(leerTeclado());
System.out.println("Nº de monedas de 2 €:");
dineroRetirado[7] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 5 €:");
dineroRetirado[8] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 10 €:");
dineroRetirado[9] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 20 €:");
dineroRetirado[10] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 50 €:");
dineroRetirado[11] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 100 €:");
dineroRetirado[12] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 200 €:");
dineroRetirado[13] = Integer.parseInt(leerTeclado());
System.out.println("Nº de billetes de 500 €:");
dineroRetirado[14] = Integer.parseInt(leerTeclado());
for (int i = 0; i < dineroRetirado.length; i++) {
banesto.vaciarDinero(i, dineroRetirado[i]);
}

}

/**
* Metodo con el menu principal
*/
public void menu() {
System.out.println(" -- Maquina de cabios -- ");
System.out.println("***********************************************");
System.out.println("* *");
System.out.println("* 1. Para entrar como Administrador. *");
System.out.println("* *");
System.out.println("* 2. Si desea cambio. *");
System.out.println("* *");
System.out.println("* 3. Para salir. *");
System.out.println("* *");
System.out.println("***********************************************");

}

/**
* Metodo con el menu del administrador
* @param banesto Se le pasa una clase de tipo Caja
*/


public void menuAdm(Caja banesto) {
String cad = new String();
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
System.out.println("^ -- Menú del administrador -- ^");
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
System.out.println("^ 1. Cargar la máquina. ^");
System.out.println("^ 2. Vaciar la máquina. ^");
System.out.println("^ 3. Ver dinero de la maquina. ^");
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
cad = leerTeclado();
switch (Integer.parseInt(cad)) {
case 1:
cargarMaquina(banesto);
break;
case 2:
vaciarMaquina(banesto);
break;
case 3:
banesto.mostrarDinero();
break;
default:
break;
}

}
/**
* Metodo principal que llama a los metodos restantes
* @param args Se le pasa una cadena
*/

public static void main(String[] args) {
Caja banesto = new Caja();
Usuario fulano = new Usuario();
String cad = "";
int c;
do {
fulano.menu();
cad = fulano.leerTeclado();
c = Integer.parseInt(cad);
switch (c) {
case 1:
fulano.menuAdm(banesto);
break;
case 2:
fulano.introducirDinero(banesto);
break;
default:
}
if (c < 1 || c > 3) {
System.out.println("Introducca una opcion valida(Nº entre 1 y 3)");
}
}
while (c != 3);

}
}

Y la clase Caja:

public class Caja {
/**
* Array que almacena la cantidad de monedas que hai de cada tipo.
*/
private int dinero[] = {
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0};
/**
* Array que almacena los tipos de monedas y de billetes.
*/
double tipoDinero[] = {
0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 100.0,
200.0, 500.0};

/**
* Metodo que resta una cantidad a la existente en la maquina.
* @param pasta Array con el dinero a restar.
*/
public void vaciarDinero(int i, int pasta) {
if (pasta > dinero[i]) {
pasta = dinero[i];
System.out.print("No hai suficiente dinero");
}
dinero[i] = dinero[i] - pasta;
}

/**
* Metodo que suma una cantidad a la existente en la maquina.
* @param pasta Array con el dinero a sumar.
*/
public void cargarDinero(int i, int pasta) {
dinero[i] = dinero[i] + pasta;
}

/**
* Metodo que muestra la cantidad de dinero que queda en la maquina.
*/
public void mostrarDinero() {
System.out.println("La maquina contiene");
System.out.println("Monedas de 1 cent:" + dinero[0]);
System.out.println("Monedas de 2 cent:" + dinero[1]);
System.out.println("Monedas de 5 cent:" + dinero[2]);
System.out.println("Monedas de 10 cent:" + dinero[3]);
System.out.println("Monedas de 20 cent:" + dinero[4]);
System.out.println("Monedas de 50 cent:" + dinero[5]);
System.out.println("Monedas de 1 €:" + dinero[6]);
System.out.println("Monedas de 2 €:" + dinero[7]);
System.out.println("Billetes de 5 €:" + dinero[8]);
System.out.println("Billetes de 10 €:" + dinero[9]);
System.out.println("Billetes de 20 €:" + dinero[10]);
System.out.println("Billetes de 50 €:" + dinero[11]);
System.out.println("Billetes de 100 €:" + dinero[12]);
System.out.println("Billetes de 200 €:" + dinero[13]);
System.out.println("Billetes de 500 €:" + dinero[14]);
}

public void darCambio(double dineroUsu) {
int i;
double nBilletes = 0;
double dinRes = 0;
int tipoMon = 0;
if (dineroUsu == 0.01 || dineroUsu == 0.02 || dineroUsu == 0.05 ||
dineroUsu == 0.1 || dineroUsu == 0.2 || dineroUsu == 0.5 ||
dineroUsu == 1.0 || dineroUsu == 2.0 || dineroUsu == 5.0 ||
dineroUsu == 10.0 ||
dineroUsu == 20.0 || dineroUsu == 50.0 || dineroUsu == 100.0 ||
dineroUsu == 200.0 || dineroUsu == 500.0) {
for (i = 0; i < tipoDinero.length; i++) {
if (tipoDinero[i] == dineroUsu) {
tipoMon = i;
}
}
dinRes = dineroUsu;
cargarDinero(tipoMon, 1);
do {
nBilletes = dinRes / tipoDinero[tipoMon - 1];
dinRes = dinRes % tipoDinero[tipoMon - 1];
vaciarDinero(tipoMon - 1, (int) nBilletes);
if (tipoDinero[tipoMon - 1] <= 7) {
System.out.println("Retirando " + (int) nBilletes + " modedas de " +
tipoDinero[tipoMon - 1]);
}
else {
System.out.println("Retirando " + (int) nBilletes + " billetes de " +
tipoDinero[tipoMon - 1]);
}

tipoMon--;
}
while (dinRes > 0);

}
else {
System.out.println("Introduca una moneda o billete validos!");
}

}

}

El problema esta en el metodo darCambio, lo que hace es cambiar el dinero introduciod con los billetes o monedas mas grandes(o lo que deveria hacer...) pero lo que no se hacer es la comprobacion de si no hai billetes suficientes pasar al tipo de dinero anterior, me explico: Si se introduce un billete de 500 y suponiendo que hai solo 1 de 200€ en la caja, deveria comprobar que hai solo uno, y despues sacar 3 de 100, pero no lo se hacer, valla rollo que e soltado, bueno a ver si me pueden ayudar y gracias solo por leer el texto.

SALU2.