Java - Recorrer matriz en vertical problema

 
Vista:
sin imagen de perfil

Recorrer matriz en vertical problema

Publicado por Pedro Javier (3 intervenciones) el 19/12/2014 21:58:43
El programa inicia una matriz en horizontal y vertical con un valor que le pasamos por parámetro la horizontal me la hace bien la vertical no.

A ver si alguien puede echarle un vistazo.

public static void main(String[] args) throws IOException {
int matriz[][] = new int[5][5];

System.out.println("****************************");
System.out.println("****** Iniciar Modo 1 ******");
System.out.println("****************************");
IniciarModo1(matriz, 1);
Mostrar(matriz);

System.out.println();
Reiniciar(matriz, 0);

System.out.println("****************************");
System.out.println("****** Iniciar Modo 2 ******");
System.out.println("****************************");
IniciarModo2(matriz, 1);
Mostrar(matriz);

}

private static void IniciarModo1(int[][] matriz, int num) {
int f, c, cant;

for (f = 0; f < matriz.length; f++) {
for (c = 0; c < matriz[f].length; c++) {
cant = matriz[0].length;
if (f == 0 && c == 0) {
matriz[0][0] = num;
}
if (f == 0 && c != 0) {
matriz[f][c] = matriz[f][c - 1] + 1;
}
if (f != 0 && c == 0) {
matriz[f][c] = matriz[f - 1][cant - 1] + 1;
}
if (f != 0 && c != 0) {
matriz[f][c] = matriz[f][c - 1] + 1;
}
}
}
}

private static void IniciarModo2(int[][] matriz, int num) {
int f, c, cuantas_fila;

for (f = 0; f < matriz.length; f++) {
for (c = 0; c < matriz[f].length; c++) {
cuantas_fila = matriz[f].length;
if (f == 0 && c == 0) {
matriz[f][c] = num;
}
if (f != 0 && c == 0) {
matriz[f][c] = matriz[f - 1][c] + 1;
}
if (f == 0 && c != 0) {
// matriz[f][c] = AQUI TENGO EL PROBLEMA QUE NO COJO DE LA ULTIMA FILA EL VALOR DE LA COLUMNA ANTERIOR
}
}
}
}

private static void Mostrar(int[][] matriz) {
int f, c;

for (f = 0; f < matriz.length; f++) {
for (c = 0; c < matriz[f].length; c++) {
System.out.print(matriz[f][c] + " ");
}
System.out.println();
}
}

private static void Reiniciar(int[][] matriz, int i) {
int f, c;

for (f = 0; f < matriz.length; f++) {
for (c = 0; c < matriz[f].length; c++) {
matriz[f][c] = 0;
}
}
}

}

Gracias de antemano.

Si podéis darme consejos de como optimizar el código más lo agradecería.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 144
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Recorrer matriz en vertical problema

Publicado por Thanatos (97 intervenciones) el 20/12/2014 06:46:23
Por lo general es mejor tratar de no repetir lineas de código innecesariamente, como en el caso de los títulos que pusiste antes de mostrar la matriz, por eso utilicé un método para mostrar los títulos.

Cuando llenas el array bidimensional (matriz) de tu código, siempre lo haces completamente, es decir, reemplazas todos los valores que contenía previamente. Siendo ese el caso, el método Reiniciar no tiene mucha utilidad, al menos de la forma en la que lo estás utilizando en el método main.

Al analizar el código que te propongo te darás cuenta que no necesitabas utilizar los condicionales en las funciones que llenan la matriz, para estos dos casos. El propósito de este tipo de ejercicios es lograr entender la manera en la que se pueden utilizar los índices de los arrays. Analiza el código y verás que no es complicado de entender.

El método Mostrar que escribiste funciona, sólo modifiqué ese método para mostrarte una manera diferente de implementarlo, en este caso utilicé for-each anidados para recorrer la matriz. En ésta página puedes encontrar una explicación de cómo funciona. Desde la salida de Java 8, se tiene una manera más de realizar esta operación, además de las tres formas que se describen en esa página, se trata del for-each Iterable.

La sentencia:
1
System.out.printf ("%5d", numero);
Es la que muestra el contenido de la matriz. El método printf() permite el uso de especificadores de formato, como:%d, que sirve para mostrar números enteros (negativos y positivos). El número 5, especifica el ancho que ocupará cada número, si el número es de una cifra, entonces tendrá 4 espacios antes de esa cifra. Esto hace que la salida se vea más ordenada, porque se conserva la alineación de los números de la matriz.

Por convención del lenguaje Java, los nombres de los métodos deben empezar con minúsculas, esto no afecta en el funcionamiento del programa, pero es la manera en la que suele hacerse.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Matrices {
 
    public static void main (String[] args) {
        int matriz[][] = new int[5][5];
 
        mostrarTitulo(1);
        iniciarModo1(matriz, 1);
        mostrarMatriz(matriz);
 
        System.out.println();
 
        mostrarTitulo(2);
        iniciarModo2(matriz, 1);
        mostrarMatriz(matriz);
    }
 
    private static void mostrarTitulo (int modo) {
        System.out.println("****************************");
        System.out.println("****** Iniciar Modo " + modo + " ******");
        System.out.println("****************************");
    }
 
    private static void iniciarModo1 (int[][] matriz, int inicio) {
        for (int fila = 0; fila < matriz.length; ++fila) {
            for (int columna = 0; columna < matriz[fila].length; ++columna) {
                matriz[fila][columna] = inicio;
                inicio++;
            }
        }
    }
 
    private static void iniciarModo2 (int[][] matriz, int inicio) {
        for (int columna = 0; columna < matriz.length; ++columna) {
            for (int fila = 0; fila < matriz[columna].length; ++fila) {
                matriz[fila][columna] = inicio;
                inicio++;
            }
        }
    }
 
    private static void mostrarMatriz (int[][] matriz) {
        for (int[] vector : matriz) {
            for (int numero : vector) {
                System.out.printf ("%5d", numero);
            }
            System.out.println();
        }
    }
 
}

Saludos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar