import java.util.Scanner;
public class Matriz {
private double mat[][];
private int m;
private int n;
public Matriz (int l, int c){
m = l;
n = c;
mat = new double [m][n];
}
public void lerMatriz(){
Scanner input = new Scanner(System.in);
for (int i = 0; i < m; i++) {
for (int j = 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("");
}
}
}
public void exibirMatriz(){
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
System.out.print(mat[i][j] + " ");
}
System.out.println("\n");
}
}
public double[][] somar(double[][] matrizParaSomar){
double[][] novaMatriz = new double[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
novaMatriz[i][j] = mat[i][j] + matrizParaSomar[i][j];
}
}
return novaMatriz;
}
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.
Como poderei fazer a chamada do método somar() aqui??
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int m;
int n;
int x;
double[][] novaMatriz;
Scanner input = new Scanner(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);
}
else if (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();
}
else if (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: ");
Matriz matriz1 = new Matriz( m, n);
matriz1.lerMatriz();
matriz1.exibirMatriz();
System.out.println("Digite os elementos da 2ª matriz: ");
}
else if (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();
Matriz matriz1 = new Matriz( 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();
}
}
}
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.
[code]public Matriz somar(Matriz matrizParaSomar){
Matriz novaMatriz = new Matriz(m, n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
novaMatriz.mat[i][j] = this.mat[i][j] + matrizParaSomar.mat[i][j];
}
}
return novaMatriz;
}
public static Matriz lerMatriz(int m, int n) {
Matriz matriz = new Matriz(m, n);
matriz.lerMatriz();
return matriz;
}[/code] Viu, simples! Não precisou mudar quase nada no código e ele já fica muito mais fácil de usar.
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 ?
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.
[quote=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…[/quote]
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.
Vlw victorwss , mas olha sóh, pq não tah compilando ?
import java.util.Scanner;
public class Matriz {
private double mat[][];
private int m;
private int n;
public Matriz (int l, int c){
m = l;
n = c;
mat = new double [m][n];
}
public static Matriz lerMatriz(int m, int n) {
Matriz matriz = new Matriz(m, n);
matriz.lerMatriz();
return matriz;
}
public void lerMatriz(){
Scanner input = new Scanner(System.in);
for (int i = 0; i < m; i++) {
for (int j = 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("");
}
}
}
public void exibirMatriz(){
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
System.out.print(mat[i][j] + " ");
}
System.out.println("\n");
}
}
public Matriz somar(Matriz matrizParaSomar){
Matriz novaMatriz = new Matriz[m][n]; // Aqui dá o seguinte erro: type mismatch:
for (int i = 0; i < m; i++) { //cannot convert from Matriz[][] to Matriz
for (int j = 0; j < n; j++) {
novaMatriz.mat[i][j] = this.mat[i][j] + matrizParaSomar.mat[i][j];
}
}
return novaMatriz;
}
/* public void somarEAtribuir(){
}
public Matriz subtrair(){
}
public void subtrairEAtribuir(){
}
public Matriz multiplicar(){
}
public void copiar(){
}
public Matriz obterTransposta(){
}
*/
}
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…
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int m;
int n;
int x;
Scanner input = new Scanner(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);
}
else if (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();
Matriz matriz1 = new Matriz( m, n);
matriz1.lerMatriz();
//matriz1.exibirMatriz();
}
else if (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: ");
Matriz matriz1 = new Matriz( 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();
}
else if (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();
Matriz matriz1 = new Matriz( 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();
}
}
}
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.
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 !
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int m;
int n;
int x;
Scanner input = new Scanner(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);
} else if (x == 4){
transposta();
} else if (x == 1) {
soma();
} else if (x == 2) {
subtracao();
} else if (x == 3) {
multiplicacao();
}
}
private static void soma() {
Matriz matriz = new Matriz(m,n); //Erro de compilaçao aqui !
matriz.somar(matrizParaSomar);
matriz.exibirMatriz();
}
private static void subtracao() {
}
private static void multiplicacao() {
}
private static void transposta() {
}
private static Matriz lerMatrizDoUsuario(int num) {
Scanner input = new Scanner(System.in);
System.out.println("Digite o número de linhas da " + num + "ª Matriz: ");
int m = input.nextInt();
System.out.println("Digite o número de colunas da " + num + "ª Matriz: ");
int n = input.nextInt();
return Matriz.lerMatriz(m, n);
}
}