Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

darkangel_13

Erros de codigo.. Out of bounds

Mensagens Recomendadas

darkangel_13

Boa tarde estava terminei agora um codigo que tem como função tratamento de matrizes , mas quando compilei não me deu erro quando executo da-me este erro

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at OperaMatriz.calculaSoma(OperaMatriz.java:128)
at RunMatriz.main(RunMatriz.java:37)

public class FornecedorMatriz{

public static boolean eMatrizQuadrada(int[][] m){
  if(m.length==m[0].length)
      return true;
      return false;
  }

public static int[] vectorDiagonal(int[][] matrizquadrada){
  int[] vectorDiagonal=new int[matrizquadrada.length];
  for(int i=0;i<matrizquadrada.length;i++){
       for(int j =0;j<matrizquadrada[i].length;j++){
             if(i==j){
                    vectorDiagonal[i]=matrizquadrada[i][j];

                }
          }
  }
  return vectorDiagonal;
}

/**o traço de uma matriz quadrada é o somatório dos elementos do seu vector diagonal. Esta função, dada uma matriz quadrada de entrada, devolve o seu traço escalar.
**/
public static int calculaTraco(int[][] matrizquadrada){

      return calculaSoma(matrizquadrada,1,3);
}
/**método que devolve uma matriz que se obtém multiplicando um número inteiro por cada um dos elementos da matriz dada.**/
public static int[][] multiplicaEscalar(int[][] matriz, int escalar){
  int multiplicada[][]=new int[matriz.length][matriz[0].length];
  for(int i=0;i<matriz.length;i++){
         for(int j=0;j<matriz[0].length;j++){
               multiplicada[i][j]=matriz[i*escalar][j*escalar];
         }
  }
  return multiplicada;
}
/** método que devolve uma matriz que se obtém multiplicando um número inteiro por uma e uma só linha da matriz dada.**/
public static int[][] multiplicaEscalarLinha(int[][] matriz, int escalar, int linha){
     int multiplicada[][]=new int[matriz.length][matriz[0].length];
     for(int i=0;i<matriz.length;i++){
                 for(int j=0;j<matriz[i].length;j++){
                               if(i==linha)
                                    multiplicada[linha][j]=matriz[linha*escalar][j*escalar];
                               else
                                    multiplicada[i][j]=matriz[i][i];
                 }
     }
     return multiplicada;
}

/** subtrai os valores de uma linha da matriz dada dos valores respectivos de todas as outras linhas, excepto da linha indicada. Devolve a matriz modificada.
**/
int[][] subtraiLinha(int[][] matriz, int linha) {
     int [][]subtraida=new int [matriz.length][matriz[0].length];
     for(int i=0;i<subtraida.length;i++){
             for(int j=0;j<subtraida[i].length;j++){
                   if(i!=linha){
                          subtraida[i][j]-=matriz[linha][j];
                   }
             }
     }
     return subtraida ;
}

/** método que devolve o somatório da linha, coluna, ou da diagonal principal da matriz, consoante o valor do parâmetro de entrada tipo:

**/
public static int calculaSoma(int[][] matriz, int n, int tipo){
    int soma = 0;

    if(tipo==1) { // a função devolve a soma da linha n da matriz
             for(int i=0;i<matriz.length;i++)
            soma+=matriz[n][i];
    }
    else if(tipo==2){ //a função devolve a soma da coluna n da matriz
         for(int i=0;i<matriz[n].length;i++){
              soma+=matriz[i][n];
         }
    }
    else if(tipo==3){ //a função devolve a soma da diagonal da matriz (o valor n é ignorado)
              int [][] temp=diagonal(matriz);
              for(int i =0;i<temp.length;i++){
                   for(int j =0;j<temp[i].length;j++){
                         soma+=temp[i][j];
                   }
              }
    }
    else
            System.out.print("Obrigado");
    return soma;
}
public static int[][] diagonal(int[][] matrizquadrada){
        int diagonal[][]=new int [matrizquadrada.length][matrizquadrada[0].length];
        int tamanho=(matrizquadrada.length)*(matrizquadrada.length);


        for(int i=0;i<matrizquadrada.length;i++){
              for(int j =0;j<matrizquadrada[i].length;j++){
                      if(i==j)
                         diagonal[i][j]=matrizquadrada[i][j];
                      else
                         diagonal[i][j] =0;
                 }
        }
        return diagonal;
}
}

import java.util.Scanner;
import java.io.*;
public class ClienteMatriz{
public static void main(String[] args)throws IOException{
Scanner leitor=new Scanner(new FileReader("ficheiro.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("teste.txt"));
int x= leitor.nextInt();
int y= leitor.nextInt();
int[][]matriz=new int[x][y];
 if( leitor.hasNextInt()==false)
       System.out.println("ficheiro nao contem matriz");
  else{
      leitor.nextLine();
           for(int i =0;i<x;i++){
                   for(int j=0;j<y;j++){
                       matriz[i][j]=leitor.nextInt();
                 }
             }

           for(int h =0;h<matriz.length;h++){
                   for(int z =0;z<matriz[h].length;z++){
                             System.out.print(matriz[h][z]);}
                     System.out.println("");
                 }
if(OperaMatriz.eMatrizQuadrada(matriz)==true){
        int[][] mquadrada=OperaMatriz.diagonal(matriz);
        int[] diagonal=OperaMatriz.vectorDiagonal(mquadrada);
        int traco=OperaMatriz.calculaTraco(mquadrada);
   }
       for(int i=0;i<matriz.length;i++){
         int linha = OperaMatriz.calculaSoma(matriz,i,1);
         bw.write(linha+"\n");
              for(int j=0;j<matriz[i].length;j++){

                 int coluna = OperaMatriz.calculaSoma(matriz,j,2);
                bw.write(coluna+"\n");
        }
  }
System.out.println("Escreva um inteiro :");
int n=leitor.nextInt();
int[][] multiplicada=OperaMatriz.multiplicaEscalar(matriz,n);
bw.write(multiplicada.length+""+multiplicada[0].length);
            for(int i=0;i<multiplicada.length;i++){
                     for(int j=0;j<multiplicada[i].length;j++){
                         bw.write(multiplicada[i][j]);
              }
                bw.write("");
        }
}
bw.close();
}
}

Se alguem poder dar uma ajuda cumps!

edit: obrigado pela observação

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

um código sem indentação e sem o uso correcto das tags do GeSHi, é impossível saber que linha é esta : at OperaMatriz.calculaSoma(OperaMatriz.java:128)


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.