helpi :( Java primeiro trabalho

Isso é o que?

Bem, mas não funcionou :(

1 0 3 0 0 5 6 0 0
0 0 0 0 0 0 0 0 0
0 0 0 7 0 0 0 0 0
0 0 0 8 0 0 0 4 0
0 0 2 0 0 0 0 6 0
0 0 4 0 0 0 0 0 0
0 0 5 0 0 0 0 0 11
0 0 9 0 0 0 0 -1 0
Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
at Problema1.main(Problema1.java:58)

Deu isso.
 
hummm, olha lá..., o if devia estar dentro do for (falta-te as chavetas), como tem o else julgo que identifica como 2 blocos, mas não tenho a certeza.

Quanto ao que aquilo é, é apenas uma flag para identificar que encontrou um erro na tabela, portanto não vale a pena averiguar os restantes valores.

Podia fazer um break ao for, mas isso apenas iria interromper o primeiro for, o segundo continuava, daí a minha ideia de usar a flag.
 
Não dá :(
1 0 3 0 0 5 6 0 0
0 0 0 0 0 0 0 0 0
0 0 0 7 0 0 0 0 0
0 0 0 8 0 0 0 4 0
0 0 2 0 0 0 0 6 0
0 0 4 0 0 0 0 0 0
0 0 5 0 0 0 0 0 11
0 0 9 0 0 0 0 -1 0
Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Incorrecta (contém valores fora do intervalo [0-9])Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
at Problema1.main(Problema1.java:58)

Código:
(...)
int CHECK = 0;

         for (int linha = 0; linha != matriz_a_usar.length || CHECK != 1; linha++) 

                for (int coluna = 0; coluna != matriz_a_usar[linha].length || CHECK != 1; coluna++)
                {
            if ((matriz_a_usar[linha][coluna] >= 0) && (matriz_a_usar[linha][coluna] <= 9))
            
                System.out.print("Matriz Correcta (todos os valores estão no intervalo [0-9])");
                
                else 
                    CHECK = 1;
                    System.out.print("Matriz Incorrecta (contém valores fora do intervalo [0-9])");
                }
(...)
 
Já sei qual o problema :P

O teu else é um bloco, lá dentro deve conter o CHECK e o print, não tens chavetas no else ;) Ele só considera o CHECK como parte do else ;)

Se isso não resultar, tenho outra solução em mente, estou bué cansado para raciocinar hoje :S Desculpa a falta de rigor nas ajudas :S
 
Não dá.

1 0 3 0 0 5 6 0 0
0 0 0 0 0 0 0 0 0
0 0 0 7 0 0 0 0 0
0 0 0 8 0 0 0 4 0
0 0 2 0 0 0 0 6 0
0 0 4 0 0 0 0 0 0
0 0 5 0 0 0 0 0 11
0 0 9 0 0 0 0 -1 0
Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Matriz Correcta (todos os valores estão no intervalo [0-9])Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
at Problema1.main(Problema1.java:58)
E não te preocupes com isso, é melhor que nada, eu estava mesmo à toa (e ainda não estou a eprceber porque é que não está a dar..porque raio é que da uma frase por cada valor?).

Venha daí a outra solução já que eu não estou mesmo a ver...
 
Última edição:
Porque tu tens isso dentro de um for..., ele está em ciclo, logo a cada iteracção ele imprime uma frase (tal como tu mandaste).

Uma recomendação, habitua-te a identar bem o teu código, atrofiei-me todo com aquele else, pensei que a chaveta fosse do else e era do for, isso ajuda bastante a quem te quer ajudar e ajuda-te a evitares erros. É uma excelente prática de programação.

Coloca aqui a alteração que fizeste, sff. Se não der, apresento-te outra solução que tenho em mente.
 
Pus as chavetas

Código:
                else {
                    CHECK = 1;
                    System.out.print("Matriz Incorrecta (contém valores fora do intervalo [0-9])");
                }

Está assim, o codigo todo (tirando a declaraçao da matriz):

Código:
for (int linha = 0; linha != matriz_a_usar.length; linha++) {

            for (int coluna = 0; coluna != matriz_a_usar[linha].length; coluna++)

                System.out.print(matriz_a_usar[linha][coluna] + " ");
            System.out.println();
        }

        int CHECK = 0;

        for (int linha = 0; linha != matriz_a_usar.length || CHECK != 1; linha++) 

            for (int coluna = 0; coluna != matriz_a_usar[linha].length || CHECK != 1; coluna++)
            {
                if ((matriz_a_usar[linha][coluna] >= 0) && (matriz_a_usar[linha][coluna] <= 9))

                    System.out.print("Matriz Correcta (todos os valores estão no intervalo [0-9])");

                else {
                    CHECK = 1;
                    System.out.print("Matriz Incorrecta (contém valores fora do intervalo [0-9])");
                }
            }
 
Código:
	int check= 0;

    for (int linha = 0; linha != matriz_a_usar.length || check!= 1; linha++) 
           for (int coluna = 0; coluna != matriz_a_usar[linha].length || check!= 1; coluna++)
        	   if (!((matriz_a_usar[linha][coluna] >= 0) && (matriz_a_usar[linha][coluna] <= 9)))       
        		   check = 1;
        	   
    if  (check==1)
        System.out.println("Matriz incorrecta");
   else
        System.out.println("Matriz Correcta");

Ai essa identação.. :)
 
Código:
int CHECK = 0;

         for (int linha = 0; linha != matriz_a_usar.length || CHECK != 1; linha++) 
                {
                for (int coluna = 0; coluna != matriz_a_usar[linha].length || CHECK != 1; coluna++)
                    {
                     if [SIZE=6][COLOR=Blue](![/COLOR][/SIZE]((matriz_a_usar[linha][coluna] >= 0) && (matriz_a_usar[linha][coluna] <= 9))[SIZE=6][COLOR=Blue])[/COLOR][/SIZE]
                       [COLOR=Red]{
                        [/COLOR][COLOR=Red]CHECK = 0;
                       }
                     else 
                         {[/COLOR] 
                          CHECK = 1;
                         [COLOR=Red]}[/COLOR]
                    }
                 }
if (CHECK == 1)
{
System.out.print("Matriz Incorrecta (contém valores fora do intervalo [0-9])");
}
else
{
System.out.print("Matriz Correcta (todos os valores estão no intervalo [0-9])");
}
Era a alternativa que tinha em mente agora, no entanto o que assinalei a vermelho é desnecessário, pois até pode dar problemas (caso o ultimo valor SEJA válido), pois vai alterar o CHECK.
A minha proposta é igual à tua removendo o indicado a vermelho e acrescentando o indicado a azul.
 
Era a alternativa que tinha em mente agora, no entanto o que assinalei a vermelho é desnecessário, pois até pode dar problemas (caso o ultimo valor SEJA válido), pois vai alterar o CHECK.
A minha proposta é igual à tua removendo o indicado a vermelho e acrescentando o indicado a azul.

Mas na minha um CHECK == 1 ia ser alterado para 0 caso a próxima posição na matriz fosse válida. E também estou a dormir.
 
Última edição:
Agora só da isto :sad::confused:

1 0 3 0 0 5 6 0 0
0 0 0 0 0 0 0 0 0
0 0 0 7 0 0 0 0 0
0 0 0 8 0 0 0 4 0
0 0 2 0 0 0 0 6 0
0 0 4 0 0 0 0 0 0
0 0 5 0 0 0 0 0 11
0 0 9 0 0 0 0 -1 0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
at Problema1.main(Problema1.java:58)
 
Muda isto:
for (int linha = 0; linha != matriz_a_usar.length || CHECK != 1; linha++)

para isto:
for (int linha = 0; linha < matriz_a_usar.length && CHECK != 1; linha++)

(faz isto também para o for da coluna, claro :))

e, já agora, porque é que o check não é um boolean?
 
Algo está mal com aquele or que te sugeri...

Ultima tentativa, depois corto os pulsos :x

Código:
int CHECK = 0;

for (int linha = 0; linha != matriz_a_usar.length; linha++)  {
     for (int coluna = 0; coluna != matriz_a_usar[linha].length; coluna++) {
          if (!((matriz_a_usar[linha][coluna] >= 0) && (matriz_a_usar[linha][coluna] <= 9))) {
               CHECK = 1;
               break;
          }
     }
     if (CHECK == 1)
          break;

}
if (CHECK == 1)
   System.out.print("Matriz Incorrecta (contém valores fora do intervalo [0-9])");
else
   System.out.print("Matriz Correcta (todos os valores estão no intervalo [0-9])");

Sobre o CHECK não ser booleano..., porque não calhou :x
 
Com a solução do crazybomber deu certo.

Já agora, ha alguma forma alternativa de fazer isto? Eu nunca tinha falado de nada deste genero nas aulas.

Para ja fica feito assim depois vou vendo.

Muito bbrigado a todos, agora estou por minha conta
 
Última edição:
Desculpem por demorar, mas fui jantar entretanto :)

Aqui fica a minha solução

Código:
        int[][] matriz_incorrecta = {{-1, 0, 3, 0, 0, 5, 6, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 7, 0, 0, 0, 0, 0},
                {0, 0, 0, 8, 0, 0, 0, 4, 0},
                {0, 0, 2, 0, 0, 0, 0, 6, 0},
                {0, 0, 4, 0, 0, 0, 0, 0, 0},
                {0, 0, 5, 0, 0, 0, 0, 0, 1},
                {0, 0, 9, 0, 0, 0, 0, 1, 0}};
        
        int matriz[][] = matriz_incorrecta;

        
        int linha = matriz.length;
        boolean matrizOk = true;

        while (--linha >= 0[COLOR=Red] && matrizOk[/COLOR]) {
            int coluna = matriz[linha].length;
            while (--coluna >= 0[COLOR=Red] && matrizOk[/COLOR])
                matrizOk = matrizOk 
                            && matriz[linha][coluna] >= 0
                            && matriz[linha][coluna] <= 9;
        }
        
        System.out.println("A matriz é " + (matrizOk?"válida":"inválida") + "!");

As condições a vermelho podem ser uteis numa matriz muito grande, pois permitem a paragem dos ciclos assim que se encontra um valor inválido, mas por outro lado são mais alguns cálculos que o CPU faz. Nas matrizes pequenas como esta, isto é quase desnecessário.
 
Breaks não é má prática?Pelo menos tenho ideia de o meu prof reclamar bastante disso e aconselhar sempre o uso de variáveis de controlo...Se o rapaz tá a começar...Não convem começar com maus hábitos..

Quanto a soluções alternativas...Se reparares só usas o básico...for, if,...nada de especial..só um truquezito qualquer como a variável de controlo..
 
O break não tem nada de má prática, de facto prefiro o uso de variáveis de controlo tal como tentei na minha solução inicial, só que dei o || em vez do &&. Tal como referi, o break foi a solução alternativa.

Quanto à velocidade..., não há qualquer alteração de desempenho, a comparação é exactamente a mesma. A diferença está na memória utilizada para armazenar a variável, um booleano requer menos que um inteiro, no entanto isso não afecta absolutamente nada no desempenho do programa, pelo menos em programas pequenos.
 
Back
Topo