importjava.util.Scanner;publicclassMatriz{privatedoublemat[][];privateintm;privateintn;publicMatriz(intl,intc){m=l;n=c;mat=newdouble[m][n];}publicvoidlerMatriz(){Scannerinput=newScanner(System.in);for(inti=0;i<m;i++){for(intj=0;j<n;j++){System.out.println("Digite o elemento da linha ["+(i+1)+"] da coluna ["+(j+1)+"]: ");mat[i][j]=input.nextInt();System.out.println("");}}}publicvoidexibirMatriz(){for(inti=0;i<m;i++){for(intj=0;j<n;j++){System.out.print(mat[i][j]+" ");}System.out.println("\n");}}publicdouble[][]somar(double[][]matrizParaSomar){double[][]novaMatriz=newdouble[m][n];for(inti=0;i<m;i++){for(intj=0;j<n;j++){novaMatriz[i][j]=mat[i][j]+matrizParaSomar[i][j];}}returnnovaMatriz;}
Como poderia ser feita a chamada do método somar() para imprimir o resultado da soma de 2 matrizes ??
Hmm, ao invés de:public double[][] somar(double[][] matrizParaSomar){ Usepublic Matriz somar(Matriz matrizParaSomar){ Embora dentro do método fique um pouquinho mais chato o código, fora dele vai ficar bem melhor, mais simples e mais fácil de usar.
M
Mec_ico
victorwss, minha classe main ficou dessa forma!
Como poderei fazer a chamada do método somar() aqui??
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intm;intn;intx;double[][]novaMatriz;Scannerinput=newScanner(System.in);System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");x=input.nextInt();if(x==5){System.exit(0);}elseif(x==4){System.out.println("Digite o número de linhas da Matriz: ");m=input.nextInt();System.out.println("Digite o número de colunas da Matriz: ");n=input.nextInt();}elseif(x==1||x==2){System.out.println("Digite o número de linhas das Matrizes: ");m=input.nextInt();System.out.println("Digite o número de colunas das Matrizes: ");n=input.nextInt();System.out.println("Digite os elementos da 1ª matriz: ");Matrizmatriz1=newMatriz(m,n);matriz1.lerMatriz();matriz1.exibirMatriz();System.out.println("Digite os elementos da 2ª matriz: ");}elseif(x==3){System.out.println("Digite o número de linhas da 1ª Matriz: ");m=input.nextInt();System.out.println("Digite o número de colunas da 1ª Matriz: ");n=input.nextInt();Matrizmatriz1=newMatriz(m,n);matriz1.lerMatriz();matriz1.exibirMatriz();System.out.println("Digite o número de linhas da 2ª Matriz: ");m=input.nextInt();System.out.println("Digite o número de colunas da 2ª Matriz: ");n=input.nextInt();}}}
victorwss
Se você mudar o retorno e o parâmeto do método somar como eu lhe disse, vai ficar assim:
Matriz m1 = new Matriz(m, n);
m1.lerMatriz();
Matriz m2 = new Matriz(m, n);
m2.lerMatriz();
Matriz m3 = m1.somar(m2);
Se você trabalhar um pouco o código - transformando o método lerMatriz em um método estático que cria uma Matriz - seu código ficaria ainda melhor:
EDIT: Depois, que matar o negócio do cálculo das matrizes, troque a sua classe main “linguição” por uma telinha swing. Você vai aprender bastante fazendo isso.
M
Mec_ico
victorwss, quando vc fala em transformar o método lerMatriz em um método estático que cria uma Matriz, não entendo como poderia ser feito isso!!
Viu, simples! Não precisou mudar quase nada no código e ele já fica muito mais fácil de usar. :D
M
Mec_ico
Poxa victorwss com esse método estático ficou muito mais fácil mesmo!
Vlw amigo
Obrigado
Abraços…
Ahh, ainda tenho que escrever o método multiplicar(), tenho que respeitar aquelas restrições de multiplicação que fala que para multiplicar 2 matrizes o número de colunas da primeira deve necessariamente ser igual o número de linhas da segunda!!
Vc poderia me passar dicas de implementação deste método ?
Abraços…
Ironlynx
Mec?ico, já que você ficou empolgado com o estudo de matrizes, dá uma olhada nesse tópico: http://www.guj.com.br/posts/list/15/85824.java
Mais precisamente na classe MatrizUtils do Dieval Guizelini. Leia-a com bastante atenção, que você vai gostar e aprender bem.
victorwss
Mec?ico:
Poxa victorwss com esse método estático ficou muito mais fácil mesmo!
Vlw amigo
Obrigado
Abraços…
Ahh, ainda tenho que escrever o método multiplicar(), tenho que respeitar aquelas restrições de multiplicação que fala que para multiplicar 2 matrizes o número de colunas da primeira deve necessariamente ser igual o número de linhas da segunda!!
Vc poderia me passar dicas de implementação deste método ?
Abraços…
Vou dar as dicas no método somar. Daí você acha as do multiplicar facinho.
No começo do método somar, coloque isso:if (this.m != matrizParaSomar.m) {
throw new IllegalArgumentException("O número de linhas das duas matrizes deve ser igual.");
}
if (this.n != matrizParaSomar.n) {
throw new IllegalArgumentException("O número de colunas das duas matrizes deve ser igual.");
}Com isso você consegue fazer a restrição do método multiplicar facilmente.
Uma dica: Mude o nome dos atributos m e n para qtdLinhas e qtdColunas, para ficar mais fácil entender o código.
Quanto ao IllegalArgumentException, você o lança sempre que o seu método receber um conjunto de parâmetros inválidos. Por exemplo, se o construtor da matriz for chamado com o tamanho da matriz negativo, seria bom você lançar isso.
Por fim, bem vindo ao tratamento de exceções. Não se esqueça de dar uma estudada no try-catch, para saber como capturar e tratar os erros.
M
Mec_ico
Vlw victorwss , mas olha sóh, pq não tah compilando ?
importjava.util.Scanner;publicclassMatriz{privatedoublemat[][];privateintm;privateintn;publicMatriz(intl,intc){m=l;n=c;mat=newdouble[m][n];}publicstaticMatrizlerMatriz(intm,intn){Matrizmatriz=newMatriz(m,n);matriz.lerMatriz();returnmatriz;}publicvoidlerMatriz(){Scannerinput=newScanner(System.in);for(inti=0;i<m;i++){for(intj=0;j<n;j++){System.out.println("Digite o elemento da linha ["+(i+1)+"] da coluna ["+(j+1)+"]: ");mat[i][j]=input.nextInt();System.out.println("");}}}publicvoidexibirMatriz(){for(inti=0;i<m;i++){for(intj=0;j<n;j++){System.out.print(mat[i][j]+" ");}System.out.println("\n");}}publicMatrizsomar(MatrizmatrizParaSomar){MatriznovaMatriz=newMatriz[m][n];// Aqui dá o seguinte erro: type mismatch:for(inti=0;i<m;i++){//cannot convert from Matriz[][] to Matrizfor(intj=0;j<n;j++){novaMatriz.mat[i][j]=this.mat[i][j]+matrizParaSomar.mat[i][j];}}returnnovaMatriz;}/* public void somarEAtribuir(){ } public Matriz subtrair(){ } public void subtrairEAtribuir(){ } public Matriz multiplicar(){ } public void copiar(){ } public Matriz obterTransposta(){ } */}
victorwss
Não é new Matriz[m][n] e sim new Matriz(m, n).
M
Mec_ico
Vlw[b]victorwss[\b], Obrigado mesmo
Agora compilo
Abraços…
Tem outras sugestões para este código ? , apesar de ainda não estar pronto, sugestões para facilitar a leitura serão muito bem vindas!!
Segue a Classe Main que irá realizar as tarefas desse programa. SUGESTÕES…
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intm;intn;intx;Scannerinput=newScanner(System.in);System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");x=input.nextInt();if(x==5){System.exit(0);}elseif(x==4){System.out.println("Digite o número de linhas da Matriz: ");m=input.nextInt();System.out.println("Digite o número de colunas da Matriz: ");n=input.nextInt();Matrizmatriz1=newMatriz(m,n);matriz1.lerMatriz();//matriz1.exibirMatriz();}elseif(x==1||x==2){System.out.println("Digite o número de linhas das Matrizes: ");m=input.nextInt();System.out.println("Digite o número de colunas das Matrizes: ");n=input.nextInt();System.out.println("Digite os elementos da 1ª matriz: ");Matrizmatriz1=newMatriz(m,n);matriz1.lerMatriz();matriz1.exibirMatriz();System.out.println("Digite os elementos da 2ª matriz: ");//Matriz matriz2 = new Matriz( m, n);//matriz2.lerMatriz();//matriz2.exibirMatriz();}elseif(x==3){System.out.println("Digite o número de linhas da 1ª Matriz: ");m=input.nextInt();System.out.println("Digite o número de colunas da 1ª Matriz: ");n=input.nextInt();Matrizmatriz1=newMatriz(m,n);matriz1.lerMatriz();matriz1.exibirMatriz();System.out.println("Digite o número de linhas da 2ª Matriz: ");m=input.nextInt();System.out.println("Digite o número de colunas da 2ª Matriz: ");n=input.nextInt();//Matriz matriz2 = new Matriz( m, n);//matriz2.lerMatriz();//matriz2.exibirMatriz();}}}
Abraços…
victorwss
Pega o conteúdo de cada if e separa cada um em um método a parte. Assim o seu método main fica mais limpo e cada operação fica independente do main.
Tente evitar códigos repetidos. Em vez de repetir códigos, crie métodos a parte que façam o trabalho que iria se repetir e chame esse método de todos os lugares necessários. Assim, se precisar mexer neste código, você só mexe em um lugar. Além disso, o código fica menor e mais simples. É extamente isso que está por trás daquele public static Matriz lerMatriz(int m, int n). O trabalho repetitivo (criar a matriz e ler os valores em seguida) foi isolado em um método a parte.
M
Mec_ico
victorwss , pensei em fazer isso, mas veja que cada pergunta muda em cada if (nem que seja a palavra indo para o plural)!!
Daí acho que nem tem como utilizar métodos para chamar essas “Perguntas ao usuário”
Vc tem alguma sugestão, pois não consigo enxergar outra saída.
Abraços…
Vlw pelas sugestões victorwss
M
Mec_ico
victorwss, o método somarEAtribuir() deverá somar duas matrizes (o objeto utilizado na chamada do método e o objeto passado como parâmetro) e o resultado deverá ser armazenado no objeto utilizado na chamada do método.
Não entendi isso !! como poderei fazer isso, vc poderia me esclarecer passando o código se necessário também !
Abraços…
victorwss
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intx;Scannerinput=newScanner(System.in);System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");x=input.nextInt();if(x==5){System.exit(0);}elseif(x==4){transposta();}elseif(x==1){soma();}elseif(x==2){subtracao();}elseif(x==3){multiplicacao();}}privatestaticvoidsoma(){...}privatestaticvoidsubtracao(){...}privatestaticvoidmultiplicacao(){...}privatestaticvoidtransposta(){...}privatestaticMatrizlerMatrizDoUsuario(intnum){System.out.println("Digite o número de linhas da "+num+"ª Matriz: ");intm=input.nextInt();System.out.println("Digite o número de colunas da "+num+"ª Matriz: ");intn=input.nextInt();returnMatriz.lerMatriz(m,n);}}
O somarEAtribuir() é quase igual ao somar. Só tem 3 diferenças:
1) Ele não cria uma nova matriz.
2) Ele soma os valores em si próprio. (dica, use o operador +=)
3) Ele retorna this.
M
Mec_ico
victorwss , como vc conseguiu chamar o método somar() da classe Matriz a partir da classe Main para rodar o programa??
Abraços…
M
Mec_ico
victorwss , [i]quando chamei o método somar() da Classe Matriz a partir da Classe Main deu erro na Compilação ?
Você conseguiu ?
Abraços…
victorwss
Mostre o erro de compilação.
M
Mec_ico
Aí está o erro de compilação !
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intm;intn;intx;Scannerinput=newScanner(System.in);System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");x=input.nextInt();if(x==5){System.exit(0);}elseif(x==4){transposta();}elseif(x==1){soma();}elseif(x==2){subtracao();}elseif(x==3){multiplicacao();}}privatestaticvoidsoma(){Matrizmatriz=newMatriz(m,n);//Erro de compilaçao aqui !matriz.somar(matrizParaSomar);matriz.exibirMatriz();}privatestaticvoidsubtracao(){}privatestaticvoidmultiplicacao(){}privatestaticvoidtransposta(){}privatestaticMatrizlerMatrizDoUsuario(intnum){Scannerinput=newScanner(System.in);System.out.println("Digite o número de linhas da "+num+"ª Matriz: ");intm=input.nextInt();System.out.println("Digite o número de colunas da "+num+"ª Matriz: ");intn=input.nextInt();returnMatriz.lerMatriz(m,n);}}
victorwss, no caso do método somar(), o programa deverá solicitar as dimensões das matrizes apenas uma vez(afinal esta é a única forma de somar matrizes).
considerando estes métodos, qual seria a alteração a ser realizada no programa ?
Abraços…
victorwss
private static void soma() {
Matriz matriz = lerMatrizDoUsuario(1);
Matriz matrizParaSomar = Matriz.lerMatriz(matriz.getQtdLinhas(), matriz.getQtdColunas());
Matriz resposta = matriz.somar(matrizParaSomar);
resposta.exibirMatriz();
}
}Você vai precisar criar os métodos getQtdLinhas() e getQtdColunas() na classe Matriz.
M
Mec_ico
victorwss, As classes ficaram assim, porém, está dando erro de exceção !! Confira
Classe Matriz
importjava.util.Scanner;publicclassMatriz{privatedoublemat[][];privateintm;privateintn;privateintqtdLinhas;privateintqtdColunas;publicMatriz(intl,intc){m=l;n=c;mat=newdouble[m][n];}publicintgetQtdLinhas(){returnqtdLinhas;}publicvoidsetQtdLinhas(intqtdLinhas){this.qtdLinhas=qtdLinhas;}publicintgetQtdColunas(){returnqtdColunas;}publicvoidsetQtdColunas(intqtdColunas){this.qtdColunas=qtdColunas;}publicstaticMatrizlerMatriz(intm,intn){Matrizmatriz=newMatriz(m,n);matriz.lerMatriz();returnmatriz;}publicvoidlerMatriz(){Scannerinput=newScanner(System.in);for(inti=0;i<m;i++){for(intj=0;j<n;j++){System.out.println("Digite o elemento da linha ["+(i+1)+"] da coluna ["+(j+1)+"]: ");mat[i][j]=input.nextInt();System.out.println("");}}}publicvoidexibirMatriz(){for(inti=0;i<m;i++){for(intj=0;j<n;j++){System.out.print(mat[i][j]+" ");}System.out.println("\n");}}publicMatrizsomar(MatrizmatrizParaSomar){MatriznovaMatriz=newMatriz(m,n);for(inti=0;i<m;i++){for(intj=0;j<n;j++){novaMatriz.mat[i][j]=this.mat[i][j]+matrizParaSomar.mat[i][j];}}returnnovaMatriz;}/* public void somarEAtribuir(){ } public Matriz subtrair(){ } public void subtrairEAtribuir(){ } public Matriz multiplicar(){ } public void copiar(){ } public Matriz obterTransposta(){ } */}
Classe Main
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intm;intn;intx;Scannerinput=newScanner(System.in);System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");x=input.nextInt();if(x==5){System.exit(0);}elseif(x==4){transposta();}elseif(x==1){soma();}elseif(x==2){subtracao();}elseif(x==3){multiplicacao();}}privatestaticvoidsoma(){Matrizmatriz=lerMatrizDoUsuario(1);MatrizmatrizParaSomar=Matriz.lerMatriz(matriz.getQtdLinhas(),matriz.getQtdColunas());Matrizresposta=matriz.somar(matrizParaSomar);resposta.exibirMatriz();}privatestaticvoidsubtracao(){}privatestaticvoidmultiplicacao(){}privatestaticvoidtransposta(){}privatestaticMatrizlerMatrizDoUsuario(intnum){Scannerinput=newScanner(System.in);System.out.println("Digite o número de linhas da "+num+"ª Matriz: ");intm=input.nextInt();System.out.println("Digite o número de colunas da "+num+"ª Matriz: ");intn=input.nextInt();returnMatriz.lerMatriz(m,n);}}
[i]Sabe o porquê do comportamento do erro ?
Abraços…
victorwss
Ou você usa os atributos m e n, ou usa qtdLinhas e qtdColunas. Misturá-los não dá certo.
Eu tinha dito para você mudar o nome dos atributos m e n para qtdLinhas e qtdColunas, e não para criar dois novos atributos!
M
Mec_ico
Como fazer para que quando for invocado o método somar(), o programa solicite as dimensões das matrizes apenas uma vez, ou seja," Digite o número de linhas das matrizes "…“Digite o número de colunas das matrizes”
Classe Matriz
importjava.util.Scanner;publicclassMatriz{privatedoublemat[][];privateintm;privateintn;publicMatriz(intl,intc){m=l;n=c;mat=newdouble[m][n];}publicintgetM(){returnm;}publicvoidsetM(intm){this.m=m;}publicintgetN(){returnn;}publicvoidsetN(intn){this.n=n;}publicstaticMatrizlerMatriz(intm,intn){Matrizmatriz=newMatriz(m,n);matriz.lerMatriz();returnmatriz;}publicvoidlerMatriz(){Scannerinput=newScanner(System.in);for(inti=0;i<m;i++){for(intj=0;j<n;j++){System.out.println("Digite o elemento da linha ["+(i+1)+"] da coluna ["+(j+1)+"]: ");mat[i][j]=input.nextInt();System.out.println("");}}}publicvoidexibirMatriz(){for(inti=0;i<m;i++){for(intj=0;j<n;j++){System.out.print(mat[i][j]+" ");}System.out.println("\n");}}publicMatrizsomar(MatrizmatrizParaSomar){MatriznovaMatriz=newMatriz(m,n);for(inti=0;i<m;i++){for(intj=0;j<n;j++){novaMatriz.mat[i][j]=this.mat[i][j]+matrizParaSomar.mat[i][j];}}returnnovaMatriz;}/* public void somarEAtribuir(){ } public Matriz subtrair(){ } public void subtrairEAtribuir(){ } public Matriz multiplicar(){ } public void copiar(){ } public Matriz obterTransposta(){ } */}
Classe Main
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intm;intn;intx;Scannerinput=newScanner(System.in);System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");x=input.nextInt();if(x==5){System.exit(0);}elseif(x==4){transposta();}elseif(x==1){soma();}elseif(x==2){subtracao();}elseif(x==3){multiplicacao();}}privatestaticvoidsoma(){Matrizmatriz=lerMatrizDoUsuario(1);MatrizmatrizParaSomar=Matriz.lerMatriz(matriz.getM(),matriz.getN());Matrizresposta=matriz.somar(matrizParaSomar);resposta.exibirMatriz();}privatestaticvoidsubtracao(){}privatestaticvoidmultiplicacao(){}privatestaticvoidtransposta(){}privatestaticMatrizlerMatrizDoUsuario(intnum){Scannerinput=newScanner(System.in);System.out.println("Digite o número de linhas da "+num+"ª Matriz: ");intm=input.nextInt();System.out.println("Digite o número de colunas da "+num+"ª Matriz: ");intn=input.nextInt();returnMatriz.lerMatriz(m,n);}}