Multiplicação de Matrizes do tipo Fração

Boa tarde amigos! Antes quero desejar FELIZ PÁSCOA a todos ai! Bom, sou novo no GUJ então por favor me desculpem se estou procedendo de forma incorreta e me ajudem a não cometer mais erros ok?

Bom, estou com algumas dúvidas sobre a linguagem java. Iniciei este ano os estudos sobre a linguagem e de cara já peguei exercícios sobre matrizes. Até ai tudo bem, pois já trabalhei com matrizes, porém na linguagem C. O problema é que desta vez trata-se de matrizes de frações e acabei travado na multiplicação de duas matrizes. Vou explicar o que ja fiz de código, quem sabe vocês possam me dar uma idéia de onde está o erro!

Criei uma classe Fracao com os atributos privados: numerador, denominador e mdc, com um construtor que recebe como parâmetros numerador e denominador. Esta classe Fracao possui os métodos para as operações de somar, subtrair, multiplicar, dividir e simplificar fracoes e um método toString para imprimir frações. Até ai tudo bem, já testei o código e está funcionando bem! Bom, continuando… criei uma outra classe denominada Matriz com os atributos privados: int linhas, int colunas e Fracao m[][], com um construtor que recebe como parâmetros linhas, colunas e Fracao m[linhas][colunas]. Esta classe possui os metodos para operações de somar, mutiplicar, subtrair e transposta de matriz. Por último criei uma outra classe e a chamei de main para iniciar o programa, nesta classe estão as chamadas dos métodos. O problema se encontra na chamada do método da classe Matriz. Vou postar o código que já fiz:

CÓDIGO DA CLASSE FRAÇÃO: onde são realizadas operações com frações.

[code]
import java.util.Scanner;
public class Fracao {

private int numerador;
private int denominador;
private int mdc;

public Fracao(int n, int d){
	numerador = n;
	denominador = checarDenominador(d);
}

private int checarDenominador(int d){
	
	do{
	if(d > 0){
		return d;
	}
	else{
		System.out.printf("O valor %d nao e um valor valido!\n", d);
		System.out.println("INFORME UM NOVO VALOR \"POSITIVO\" PARA O DENOMINADOR: ");
		Scanner input = new Scanner(System.in);
		d = input.nextInt();
	}
	}while(d == 0);
	return d;
}

private int minimo(int n, int d){
	
	int mdc = n % d;
	
	while(mdc != 0){
		n = d;
		d = mdc;
		mdc = n % d;
	}

	return d;
}

public void simplificar(){
	
	mdc = minimo(numerador, denominador);
	numerador = this.numerador / mdc;
	denominador = this.denominador / mdc;
	
	if(numerador % denominador == 0){
		numerador = numerador/denominador;
	}
	
}


public Fracao somar(Fracao f){
	if(this.denominador == f.denominador){
		Fracao r = new Fracao(1, 1);
		r.numerador = this.numerador + f.numerador;
		r.denominador = this.denominador;
		
		r.simplificar();
		
		return r;
	}
	else{
		Fracao r = new Fracao(1, 1);
		r.denominador = f.denominador * this.denominador;
		r.numerador = (r.denominador/this.denominador)*this.numerador + (r.denominador/f.denominador)*f.numerador;

		r.simplificar();
		
		return r;
	}
}

public Fracao subtrair(Fracao f){
	if(this.denominador == f.denominador){
		Fracao r = new Fracao(1, 1);
			r.numerador = this.numerador - f.numerador;
			r.denominador = this.denominador;
			
			r.simplificar();

		     if(r.denominador < 0){
		    	 r.numerador = r.numerador*(-1);
		    	 r.denominador = r.denominador*(-1);
		      }
			
			return r;
	}
	else{
	   Fracao r = new Fracao(1, 1);
	      r.denominador = this.denominador * f.denominador;
	      r.numerador = ((r.denominador/this.denominador)*this.numerador) - ((r.denominador/f.denominador)*f.numerador);
		  
	      r.simplificar();
	      
	      if(r.denominador < 0){
	    	  r.numerador = r.numerador*(-1);
	    	  r.denominador = r.denominador*(-1);
	      }
	      
	      return r;
	}
}

public Fracao multiplicar(Fracao f){
	Fracao r = new Fracao(1, 1);
	r.numerador = this.numerador * f.numerador;
	r.denominador = this.denominador * f.denominador;
	
	r.simplificar();
	
	if(mdc < 0){
	   mdc = mdc*(-1);
	}
	
	r.numerador = r.numerador/mdc;
	r.denominador = r.denominador/mdc;
	
	return r;
}

public Fracao dividir(Fracao f){
	Fracao r = new Fracao(1, 1);
	r.numerador = this.numerador * f.denominador;
	r.denominador = this.denominador * f.numerador;
	
	r.simplificar();
	
	if(mdc < 0){
	   mdc = mdc*(-1);
	}
	
	r.numerador = r.numerador/mdc;
	r.denominador = r.denominador/mdc;

	return r;
}

public String toString(){
	return String.format("%d/%d\t", numerador, denominador);
}

}[/code]

CÓDIGO DA CLASSE MATRIZ: onde são realizadas os preenchimentos, operações e exibições das matrizes.

[code]
import java.util.Scanner;

public class Matriz{

private int linhas;
private int colunas;
private Fracao m[][];
	 
public Matriz(int l, int c){
	linhas = lerDimensao(l);
	colunas = lerDimensao(c);
	m = new Fracao[linhas][colunas];
}

public int lerDimensao(int dimensao){
	
	do{
		if(dimensao < 1){
			System.out.println("VALOR INVÁLIDO! O valor deve ser maior que zero!\n");
			System.out.println("Informe outro valor para dimensão: ");
			Scanner input = new Scanner(System.in);
			dimensao = input.nextInt();
		}
		
	}while(dimensao < 1);

	return dimensao;
}

public void lerMatriz(){
	
	int i, j;
	
	for(i = 0; i < linhas; ++i){
		for(j = 0; j < colunas; ++j){
			System.out.printf("Elemento [%d][%d]:  ", i, j);
			System.out.println("Informe um valor para o numerador e denominador: ");
			Scanner input = new Scanner(System.in);
			Fracao f = new Fracao(input.nextInt(),input.nextInt());		
			m[i][j] = f;
		}
	}	
}


public Matriz[][] multiplicar(Matriz m1){
	
	int i, j, k;
	
	if(this.colunas != m1.linhas){
		System.out.println("DIMENSÃO INVÁLIDA! O número de colunas da primeira matriz deve" +
				"ser igual ao numero de linhas da segunda matriz!");
		return null;
	}
	
	Matriz[][] mResultado = new Matriz[m1.linhas][this.colunas];
	
	for(i = 0; i < this.linhas; ++i){
		for(j = 0; j < m1.colunas; ++j){
			for(k = 0; k < this.linhas; ++k){
				mResultado[i][j] = this.m[i][j].multiplicar(m1[k][j]);
			}
		}
	}
	return mResultado;
	
}

public void exibirMatriz(){
	
	int i, j;
	
	for(i = 0; i < linhas; ++i){
		for(j = 0; j < colunas; ++j){
			System.out.printf(m[i][j].toString());
		}
			System.out.println("\n");
	}
}

public int getLinhas() {
	return linhas;
}

public void setLinhas(int linhas) {
	this.linhas = linhas;
}

public int getColunas() {
	return colunas;
}

public void setColunas(int colunas) {
	this.colunas = colunas;
}

public Fracao[][] getM() {
	return m;
}

public void setM(Fracao[][] m) {
	this.m = m;
}

}[/code]

CÓDIGO DA CLASSE MAIN: onde são feita as chamadas dos métodos.

[code]
public class Main {

public static void main(String[] args) {
	
	Fracao f1 = new Fracao(3, 5);
	Fracao f2 = new Fracao(14, 10);
	Fracao f3 = f1.somar(f2);
	System.out.println("f3 = " + f3);
	Fracao f4 = f1.subtrair(f2);
	System.out.println("f4 = " + f4);
	Fracao f5 = new Fracao(6, 9);
	f5.simplificar();
	System.out.println("f5 = " + f5);
	

	Matriz m1 = new Matriz(2, 3);
	m1.lerMatriz();
	Matriz m2 = new Matriz(2, 3);
	m2.lerMatriz();
	m2.exibirMatriz();
	Matriz m3 = m1.somar(m2);
	//m3.exibirMatriz();
	//Matriz m4 = m3.obterTransposta();
	//m4.exibirMatriz();

}

}[/code]

Obrigado,

Daniel

PS: Se puderem me dar uma força na parte da multiplicação eu agradeço! E mais uma vez me desculpe se estou procedendo de forma incorreta.

primeiramente, bem vindo.

Isto não é um erro quando não se sabe como faz. Mas é o seguinte, edite o seu post e coloque todos ot trechos de código dentro das marcações [‘code’] e [’/code’] sem as aspas claro, isso irá ajudar e muito a leitura e o pessoal te responderá bem mais rápido.

Boa Páscoa

Obrigado pela dica, vou procurar aplicar o que disse!

poe a tag code ae amigo, para ficar mais legivel e todos poderem ajudar vc, abraco.

Multiplicação de matrizes não deveria retornar um Matriz ao invés de um Matriz[][]?

Opa isso mesmo, deve retornar uma matriz! Mas é exatamente ai que estou com problemas. Não sei como fazer para percorrer as matrizes sem utilizar Matriz[i][j], além disso toda vez que crio um novo objeto do tipo Matriz não consigo fazer ele receber a soma e multplicação das matrizes, por isso a fiz Matriz[][] para que na posição tal recebece o valor do objeto que é do tipo fração.

public Matriz multiplicar(Matriz m1){   
           
        int i, j, k;   
           
        if(this.colunas != m1.linhas){   
            System.out.println("DIMENSÃO INVÁLIDA! O número de colunas da primeira matriz deve" +   
                    "ser igual ao numero de linhas da segunda matriz!");   
            return null;   
        }   
           
        Matriz mResultado = new Matriz(m1.linha this.colunas);
           
        for(i = 0; i < this.linhas; ++i){   
            for(j = 0; j < m1.colunas; ++j){   
                for(k = 0; k < this.linhas; ++k){   
                    mResultado[i][j] = mResultado[i][j].somar(this.m[i][j].multiplicar(m1[k][j]));   
                }   
            }   
        }   
        return mResultado;        
}

Eu não consigo fazer isso direto? Tenho que criar mais objetos para receber a soma, outro para receber a multiplicação e um ultimo para receber o resultado final (resultado da soma + da multiplicação)?

public Matriz multiplicar(Matriz m1){

        if (this.colunas != m1.linhas){
            throw new IllegalArgumentException("DIMENSÃO INVÁLIDA! O número de colunas da primeira matriz deve" +
                    "ser igual ao numero de linhas da segunda matriz!");   
        }

        Matriz mResultado = new Matriz(this.linhas, m1.colunas); // Este construtor deverá inicializar as posições da matriz com frações 0/1, não as deixando nulas, evitando NPEs

        for (int i = 0; i < this.linhas; ++i) {
            for (int j = 0; j < m1.colunas; ++j) {
                for (int r = 0; r < this.colunas; r++) {
                    Fracao a = this.m[i][r];
                    Fracao b = m1.m[r][j];
                    Fracao ab = a.multiplicar(b);

                    Fracao ab_antes = mResultado.m[i][j];

                    Fracao ab_soma = ab_antes.somar(ab);

                    mResultado.m[i][j] = ab_soma;
                }
            }
        }
        return mResultado;
}

Quem sabe funciona…

Opa obrigado amigo, esse código funcionou blz! Obrigado aos demais pela força ai, caso precisem de algo é só postar ai ok?

Abraço!