Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/09/2011, 11:17
Jarkaos
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 21 años, 5 meses
Puntos: 2
Mover elementos en un arreglo, problemas

Hola,

Estoy creando una classe que simula un banco. La clase hace las tareas típicas del banco. ingresar dinero, sacar dinero y mostrar el saldo.
El problema de la clase esta en que las ultimas 10 transacciones se deben guardar en un arreglo, si el usuario realiza una transacción mas , cada transacción en el arreglo deben moverse para dejar un lugar libre en el arreglo así la ultima transacción se pueda guardar en el arreglo.

Hasta ahora todo funciona, puedo realizar 10 transacciones, guardarlas en el arreglo y mostrarlas después. El problema esta en que cuando hago una transacción mas, ésta no se guarda en el arreglo, si no que la transacción que esta en el ultimo lugar del arreglo se copia a la posición 0 del arreglo.

Este es el codigo que he escrito:

Código:
public class Bank {

    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);

        int amount = 0, choice = 0, sum = 0, balance = 0;
        int[] trans = new int[10];

        //mientras el usuario no decide terminar ingresa al switch

        while (choice != 4) {
            choice = menu();
            switch (choice) {
                case 1:
                    System.out.print("Ingresar dinero: ");
                    sum = input.nextInt();
                    amount = (int) +sum;
                    makeTransactions(amount, trans);
                    break;

                case 2:
                    System.out.print("Sacar dinero: ");
                    sum = input.nextInt();
                    amount = (int) -sum;
                    makeTransactions(amount, trans);
                    break;

                case 3:
                    showTransactions(trans, balance);
                    break;

                default:
                    System.out.println("Terminar");
                    break;
            }
        }
    }

    // Muestra el menu y recive la opcion del usuario
    
    public static int menu() {
        int choice = 0;

        Scanner input = new Scanner(System.in);
        System.out.println("Banco");
        System.out.println("-------------------");
        System.out.println();
        System.out.println("1. Ingresar dinero");
        System.out.println("2. Scar dinero");
        System.out.println("3. Saldo");
        System.out.println("4. Terminar");
        System.out.println();
        System.out.print("Tu opcion: ");

        choice = input.nextInt();

        return choice;
    }

    
    //Muestra las ultimas 10 transacciones mas el saldo
    
    public static void showTransactions(int[] trans, int balance) {
        System.out.println();
        System.out.println("Historial: ");
        System.out.println();

        for (int i = 0; i < trans.length; i++) {
            if (trans[i] == 0) {
                System.out.print("");
            } else {
                System.out.print(trans[i] + "\n");
                balance += trans[i];
            }
        }

        System.out.println();
        System.out.println("Saldo: " + balance);
        System.out.println();
    }
    
    //Coloca la ultima transaccion en el ultimo lugar libre del array
    // si el array esta lleno, moveTrans creara un espacio libre en el array
    
    public static void makeTransactions(int amount, int[] trans) {
        int position = findNr(trans);
        if (position == -1) {
            moveTrans(trans);
        } else {
            trans[position] = amount;
        }
    }

    
    // Entrega la posicion en el array en donde la transaccion se guardara
    // si no hay lugares devuelve -1
    
    public static int findNr(int[] trans) {
        
        int position = - 1;

        for (int i = 0; i < trans.length; i++) {
            if (trans[i] == 0) {
                position = i;
                break;
            }
        }

        return position;
    }

    //Mueve todas las transacciones en el array un lugar para hacer espacio
    //para la nueva transaccion. La transaccion mas antigua se sobreescribe.
    
    public static void moveTrans(int[] trans) {
        for (int i = 0; i < trans.length - 1; i++) {
            trans[0] = trans[i + 1];
        }
    }
     
}
En este codigo el arreglo tiene 4 posiciones para probarlo mas rápido. Al ejecutarlo y seleccionando ingresar dinero las 4 veces obtengo esto:

Código PHP:
Historial

1
2
3
4

Saldo
10 
Cuando continuo e ingreso 5 (o un quinto elemento) el resultado es:

Código PHP:
Historial

4  <==== aqui se repite la ultima transacción
2
3
4

Saldo
10 
Lo ideal es sue sea:

Código PHP:
Historial

2
3
<==== las transacciones anteriores se mueven un lugar
<==== ultima transaccion

Saldo
14 <=== el saldo se actualiza 
Me magino que el problema debe estar en el metodo moveTrans() pero no logro entender donde esta el error.

Me podrían ayudar a resolver esto? Gracias a todos.