GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

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


#1

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.

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);
	}
}

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

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;
	}
}

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

 
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();
	}
}

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.


#2

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


#3

Obrigado pela dica, vou procurar aplicar o que disse!


#4

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


#5

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


#6

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)?


#7

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...


#8

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!


#9