[Dúvida] "Estouro" no preenchimento da matriz

5 respostas
N

Olá.

Estou a tentar preencher uma matriz que recebo por parâmetro com o seguinte código e ela “rebenta” no seu preenchimento:

public static int[][] preenximento(int n) { Scanner ler = new Scanner(System.in); int[][] mat = new int[n][n]; int i = 0, k = 0; System.out.println("Preenximento da matriz quadrada:"); for (i = 0; i < mat.length; i++) { System.out.println("Insira um valor para a posição [" + i + "][" + k + "] da matriz: "); mat[i][k] = ler.nextInt(); for (k = 0; k < mat[i].length; k++) { System.out.println("Insira um valor para a posição [" + n + "][" + k + "] da matriz: "); mat[i][k] = ler.nextInt(); } } return mat; }

o output quando corro o programa é o seguinte:
[list]Insira a capacidade de linhas/colunas da matriz quadrada:
3

Preenximento da matriz quadrada:

Insira um valor para a posição [0][0] da matriz:

8

Insira um valor para a posição [3][0] da matriz:

4

Insira um valor para a posição [3][1] da matriz:

9

Insira um valor para a posição [3][2] da matriz:

2

Insira um valor para a posição [1][3] da matriz:

3

Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 3

at PL7exComp1.preenximento(PL7exComp1.java:28)

at PL7exComp1.main(PL7exComp1.java:12)

Java Result: 1

BUILD SUCCESSFUL (total time: 1 minute 29 seconds)

[/list]

Podem ajudar?
Obrigado pela vossa atenção.
Abraço

5 Respostas

E

Os índices para um array declarado como [3][3] vão de 0 até 2; o número 3 está fora da matriz. Existem duas maneiras de resolver isso, se suas matrizes começam no índice 1:

a) Subtrair 1 de todos os índices, ou
b) Declarar cada array com 1 elemento a mais em cada dimensão (exemplo, [4][4]) e descartar os elementos cujos índices são [0].

adriano_si

tá tentando acessar um indice que não existe no teu Array… Lembre, se o tamanho do Array é 3, o indíce máximo é 2, porque os índices começam no valor 0

0 - 1 - 2

Quando tentar acessar o índice 3, ele estoura essa bonita exceção que vês na tua tela…

Abs []

N

Viva… Modifiquei assim o código:

public static int[][] preenximento(int n) { Scanner ler = new Scanner(System.in); int[][] mat = new int[n][n]; int i = 0, k = 0; System.out.println("Preenximento da matriz quadrada:"); for (i = 0; i < mat.length-1; i++) { System.out.println("Insira um valor para a posição [" + i + "][" + k + "] da matriz: "); mat[i][k] = ler.nextInt(); for (k = 0; k < mat[i].length-1; k++) { System.out.println("Insira um valor para a posição [" + n + "][" + k + "] da matriz: "); mat[i][k] = ler.nextInt(); } } return mat; }

e o output foi este:

[list]debug:

Insira a capacidade de linhas/colunas da matriz quadrada:

3

Preenximento da matriz quadrada:

Insira um valor para a posição [0][0] da matriz:

8

Insira um valor para a posição [3][0] da matriz:

4

Insira um valor para a posição [3][1] da matriz:

9

Insira um valor para a posição [1][2] da matriz:

5

Insira um valor para a posição [3][0] da matriz:

4

Insira um valor para a posição [3][1] da matriz:

1

Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 3

at PL7exComp1.colunas(PL7exComp1.java:109)

at PL7exComp1.verificacao(PL7exComp1.java:45)

at PL7exComp1.main(PL7exComp1.java:13)

Java Result: 1

[/list]

Mas eu não me conformo, porque o a matriz tem capacidade de linhas = colunas = 3 e as posições vão do 0 a 2 (0, 1, 2) e o programa pede-me para preencher a matriz em posições do género de [3][0] quando os indices só vão de 0, 1 e 2 no máximo.
Até neste ciclo for:

for (i = 0; i < mat.length-1; i++) { o i começa em ZERO e é menor que o comprimento-1, ou seja, i<3-1 que origina i<2 e o array assim só vai de 0 a 1 porque nunca se irá igualar a dois. Por isso acho que está mal e devia ser como eu meti no primeiro post deste tópico onde tenho:

for (i = 0; i < mat.length; i++) { porque aí sei que o i=0 vai até i<3, ou seja 0, 1, 2.

Podem ajudar? abraço

até vou postar o programa todo, porque pode ser que o problema esteja noutro local. Peço desculpa pelo tamanho da resposta:

import java.util.Scanner;

public class PL7exComp1 {

    public static void main(String[] args) {
        Scanner ler = new Scanner(System.in);
        System.out.println("Insira a capacidade de linhas/colunas da matriz quadrada: ");
        int n = ler.nextInt();
        int[][] m = new int[n][n];
        boolean flag;
        m = preenximento(n);
        flag = verificacao(m, n);
        if (flag == true) {
            System.out.println("A matriz é um quadrado mágico!");
        } else {
            System.out.println("A matriz não é um quadrado mágico!");
        }
    }

    public static int[][] preenximento(int n) {
        Scanner ler = new Scanner(System.in);
        int[][] mat = new int[n][n];
        int i = 0, k = 0;
        System.out.println("Preenximento da matriz quadrada:");
        for (i = 0; i < mat.length-1; i++) {
            System.out.println("Insira um valor para a posição [" + i + "][" + k + "] da matriz: ");
            mat[i][k] = ler.nextInt();
            for (k = 0; k < mat[i].length-1; k++) {
                System.out.println("Insira um valor para a posição [" + n + "][" + k + "] da matriz: ");
                mat[i][k] = ler.nextInt();
            }
        }
        return mat;
    }

    public static boolean verificacao(int[][] m, int n) {
        int[] linhas = new int[n];
        int[] colunas = new int[n];
        int[] diagonais1 = new int[n];
        int[] diagonais2 = new int[n];
        int vlinhas=0, vcolunas=1, vdiagonais1=2, vdiagonais2=3;
        boolean flagLinhas = true, flagColunas = true, flagDiagonais1 = true, flagDiagonais2 = true, flag = false;
        linhas = linhas(m, n);
        colunas = colunas(m, n);
        diagonais1 = diagonais1(m, n);
        diagonais2 = diagonais2(m, n);
        //verificação das linhas
        for (int i = 0; i < linhas.length; i++) {
            for (int j = i + 1; j < linhas.length; j++) {
                if (linhas[i] != linhas[j]) {
                    flagLinhas = false;
                }
            }
            vlinhas=linhas[i];
        }
        //verificação das colunas
        for (int k = 0; k < colunas.length; k++) {
            for (int j = k + 1; j < colunas.length; j++) {
                if (colunas[k] != colunas[j]) {
                    flagColunas = false;
                }
            }
            vcolunas=colunas[k];
        }
        //verificação das diagonais1
        for (int k = 0; k < diagonais1.length; k++) {
            for (int z = k + 1; z < diagonais1.length; z++) {
                if (diagonais1[k] != diagonais1[z]) {
                    flag = false;
                }
            }
            vdiagonais1=diagonais1[k];
        }
        //verificação das diagonais
        for (int k = diagonais2.length; k <= 0; k--) {
            for (int z = diagonais2.length - 1; z <= 0; z--) {
                if (diagonais2[k] != diagonais2[z]) {
                    flag = false;
                }
            }
            vdiagonais2=diagonais2[k];
        }
        if(flagLinhas==true && flagColunas==true && flagDiagonais1==true && flagDiagonais2==true){
            if(vlinhas==vcolunas && vlinhas==vdiagonais1 && vlinhas==vdiagonais2){
                flag= true;
            }
        }
        return flag;
    }

    public static int[] linhas(int[][] m, int n) {
        boolean flag = true;
        int[] linhas = new int[n];
        //linhas
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                linhas[j] = m[i][j];
            }
        }
        return linhas;
    }

    public static int[] colunas(int[][] m, int n) {
        boolean flag = true;
        int[] colunas = new int[n];
        int i = 0;
        //colunas
        for (int j = 0; j < m[i].length; j++) {
            for (i = 0; i < m.length; i++) {
                colunas[j] = m[i][j];
            }
        }
        return colunas;
    }

    public static int[] diagonais1(int[][] m, int n) {
        boolean flag = true;
        int[] diagonais1 = new int[n];
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                if (i == j) {
                    diagonais1[i] = m[i][j];
                }
            }
        }
        return diagonais1;
    }

    public static int[] diagonais2(int[][] m, int n) {
        boolean flag = true;
        int[] diagonais2 = new int[n];
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                if (i == j) {
                    diagonais2[i] = m[i][j];
                }
            }
        }
        return diagonais2;
    }
}

Abraço

N

Boas…

já resolvi.

apenas tive que mudar em todos os ciclos for o vector.length pela sua capacidade:

for(int i =0; i<n;i++){ }

Só não entendo porque é que o netBeans não interpretou o que “n” é igual a vector.length

Se me poderem explicar eu ficava agradecido.
Abraço

P

uai cara… pra mim o length e o n tem o mesmo valor… coloca umas coroas de alho em volta do monitor e umas folhas de arruda que eu acho q resolve o problema kkk

Criado 22 de novembro de 2010
Ultima resposta 23 de nov. de 2010
Respostas 5
Participantes 4