Array bidimencionais

9 respostas
Alan_Delgado

Ola pessoal
Estou tendo uma dificuldade em um projeto de iniciação cientifica, não sei como passar por parametros um array multidimensional ou bidimencional, e depois quero receber ele de volta, eu nao sei se é assim:

...
int matriz1[][]=new int[i][j];
int matriz2[][]=new int[i][j];
int matrizFinal[][]=new int[i][j];
public int[][] soma(matriz1 , matriz2){
int matriz3[][];
//aqui eu somo as duas matrizes....

return matriz3[][];
}

matrizFinal=soma(matriz1 , matriz2);
...

Se alguem poder me dar algumas dicas de como passar array bidimencionais por parametros e depois para recebelos, me ajudem…

9 Respostas

Marlon_Meneses

bom…
no metodo da soma deve ser assim

public int[][]soma(int matriz1[][], int matriz2[][]){ int matriz3[][] = new int[i][j]; //soma da matrizes return matriz3; }

sendo q i e j jah dever ser inicializados logo no inicio do codigo

yorgan

Da uma olhada se é isso:

public int[][]soma(int matriz1[][], int matriz2[][]){   
     int matriz3[][] = new int[i][j];   
    for (int a = 0; a < i; ++a) {
        for(int b = 0; b < j; ++b) {
            matriz3[a][b] = matriz1[i][j] + matriz2[i][j];
        }
    }
    return matriz3;   
}

[]´s

Alan_Delgado

Sim quanto esta parte acho que ja entendi mas tenho uma duvida em relação na hora de chamar o metodo

...
matriz[][]=soma(matriz1, matriz2);
...

nesta parte que nao sei como a matriz vai receber, pois estou trabalhando com herança, eu mandaria somar em outra classe para depois obter de volta o resultado

yorgan

Desculpe, mas não estou entendendo onde quer chegar.
Poderia postar todo o seu código?

[]´s

Alan_Delgado

Bom eu tenho 3 classe a primeira e a central(Funcao), depois a soma que é herdeira da central, outra executa:
A primeira:

import javax.swing.*;
public class Funcao {
    private int i1,i2,j1,j2;
    /** Creates a new instance of Funcao */
    public Funcao() {
    }
    public int getLinha1()
    {
        return i1;
    } public int getLinha2()
    {
        return i2;
    } public void setLinha1(int linha)
    {
        i1=linha;
    }
    public void setLinha2(int linha)
    {
        i1=linha;
    }
    public int getColuna1()
    {
        return j1;
    } public int getColuna2()
    {
        return j2;
    } public void setColuna1(int coluna)
    {
        j1=coluna;
    }
    public void setColuna2(int coluna)
    {
        j1=coluna;
    }
    
    public void tamanho()
        {
    i1=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite o numero de linhas da primeira tabela:","Inserindo Dados",JOptionPane.QUESTION_MESSAGE));    
    j1=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite o numero de colunas da primeira tabela:","Inserindo Dados",JOptionPane.QUESTION_MESSAGE));
    i2=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite o numero de linhas da Segunda tabela:","Inserindo Dados",JOptionPane.QUESTION_MESSAGE));    
    j2=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite o numero de colunas da Segunda tabela:","Inserindo Dados",JOptionPane.QUESTION_MESSAGE));
    }
    public int[][] receberNumeros(int i, int j){
        int matriz[][]=new int[i][j];
        int cont=0;
       int cont2=0;
    while(cont<i)
    {
       
            cont2=0;   
    while(cont2><j) 
    {        
               matriz[cont][cont2]=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite o número do elemento da "+cont+"X"+cont2,"Inserindo os Valores",JOptionPane.PLAIN_MESSAGE));               
               cont2++;
    }
            cont++;
    } 
    return matriz;
    }
    public void Imprimir(int[][] matriz, int i, int j){
         int cont=0;
       int cont2=0;
       String Mostrar="";
        while(cont><i){
       
            cont2=0;   
    while(cont2><j){        
               
               cont2++;
             Mostrar+=matriz[cont][cont2]+" ";  
           }
            cont++;
       }
    JTextArea mostrarArea=new JTextArea();
    mostrarArea.setText(Mostrar);
    JOptionPane.showMessageDialog(null,mostrarArea,"Teste de matriz",JOptionPane.PLAIN_MESSAGE);    
    }
    
}

a segunda que é a soma:

public class Soma extends Funcao{
    
    /** Creates a new instance of Soma */
    public Soma() {
    }
    public int[][] somaFuncao(int matriz1[][], int matriz2[][],int i1, int j1){
        int matrizFinal[][]=new int[i1][j1];
        int cont=0;
        int cont2=0;
        while(cont><i1){
      
            cont2=0;   
    while(cont2><j1){        
               matrizFinal[cont][cont2]=matriz1[cont][cont2]+matriz2[cont][cont2];
               cont2++;
            
           }
            cont++;
       }
    return matrizFinal;
    }
}

e a ultima que é a executa:

import javax.swing.*;
public class Executa {
    
    /** Creates a new instance of Executa */
    public Executa() {
    }
    public static void main(String args[]){
        int i1,i2,j1,j2=0;
        int matriz1[][],matriz2[][], matrizFinal[][];
        int num=0;
        num=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite o número da operação que você deseja fazer:\n1 - Soma de duas matrizes\n2 - Subtrair duas matrizes\n3 - Oposta de uma matriz\n4 - Multiplicar duas matrizes\n5 - Trasposta de uma matriz\n6 - Matriz escalar\n","Manipulando Matrizes",JOptionPane.PLAIN_MESSAGE));
        switch(num){
            case 1:
            Soma obj=new Soma();
            obj.tamanho();
            if(obj.getLinha1()==obj.getLinha2()&&obj.getColuna1()==obj.getColuna2())
            {
              matriz1=obj.receberNumeros(obj.getLinha1(),obj.getColuna1());
              matriz2=obj.receberNumeros(obj.getLinha2(),obj.getColuna2());
            matrizFinal=obj.somaFuncao(matriz1,matriz2,obj.getLinha1(),obj.getColuna1());
            obj.Imprimir(matrizFinal,obj.getLinha1(),obj.getColuna1());
            }
            else
            {
                JOptionPane.showMessageDialog(null,"Impossivel fazer Soma de matrizes, numero incompativel","ERRO",JOptionPane.ERROR_MESSAGE);
            }
            break;
            default:
                JOptionPane.showMessageDialog(null,"Numero Invalido","ERRO",JOptionPane.ERROR_MESSAGE);
        } 
    }
}

eu nao estou conseguindo receber a matriz, depois da soma…>

sergiotaborda

Alan Delgado:
Ola pessoal
Estou tendo uma dificuldade em um projeto de iniciação cientifica, não sei como passar por parametros um array multidimensional ou bidimencional, e depois quero receber ele de volta, eu nao sei se é assim:

Java não é C. Crie um objecto Matrix.
Este objeto não precisa trabalhar com arrays bidimencionais embora pareça.

class Matrix  {

    int[] values;
  int rows, columns;
 public Matrix  (int rows, int columns){
      this.rows = rows; 
this.columns=columns;
values = new int[rows*columns];
}

   public int get(int row, int column){
             return values[row*rows + columns];
  }

 public void set(int row, int column , in value){
        values[row*rows + columns] = value;
 }

}

Além disso vc pode programa funções como determinate ou soma ou multiplicação
directamente na classe. dessa forma vc pdoe fazer coisas como

Matrix A = new Matrix(3,3);
Matrix B = new Matrix(3,3);
Matrix C = A.plus(B);
Alan_Delgado

O que seria

row*rows

e como eu colocaria os valores, se por exemplo o usuario for colocando de um em um? , como esta no meu codigo, e como eu iria fazer para multiplicar as matrizes sem precisar multiplicar elemento por elemento?

sergiotaborda

Alan Delgado:
O que seria

row*rows

rows é o numero de linhas
e row é a linha que foi passada como argumento

row*rows+colum é o indice de um array unidimencional que corresponde ao um array bidimencional.
É um truque matematico.


e como eu colocaria os valores, se por exemplo o usuario for colocando de um em um? , como esta no meu codigo, e como eu iria fazer para multiplicar as matrizes sem precisar multiplicar elemento por elemento?

Com set(r,c,valor)

int valor = Integer.parseInt(JOptionPane.showInputDialog(null,"Digite o número do elemento da "+cont+"X"+cont2,"Inserindo os Valores",JOptionPane.PLAIN_MESSAGE));  

matriz.set(cont,cont2,valor);

Não lhe estou a dizer que criar um objeto torna as coisas mágicas. Estou a dizer-lhe que as torna mais legiveis, mais manipuláveis. O codigo de multiplicação é o mesmo , mas fica no objeto e não fora delete. A função soma idem

class Matrix {

    multiply (Matrix  other ){
             Matrix result = new Matrix(this.rows, this.columns);
            
            for (int r = 0 ; r < rows ; r++){
                    int sum=0;
                    for (int c = 0 ; c <columns ; c ++ ){

                            for (int k = 0; k < columns; k++) {
                                    sum += this.get(r,k) * other.get(k,r);  
                            }
                           
                    }                     
                    result.set(r, c  sum);
           }

 return result;
    }

}

O objetivo é criar uma classe que a ajude com as regras de calculo. O seu objeto função deveria ser matrix.
depois vc pergunta pelos valores e faz as operações.

Alan_Delgado

Valew sergiotaborda tu me ajudou muito,ja tenho uma nova ideia de como fazer a matriz, vlw

Criado 14 de março de 2008
Ultima resposta 18 de mar. de 2008
Respostas 9
Participantes 4