Java - Algoritmo de Bhaskara

Olá pessoal. Eu desenvolvi uma aplicação que resolve o calculo de Bhaskara passo a passo, diferente dos que pela internet que só da a resposta. O programa efetua o calculo do jeito que eu planejei. Porém, na matemática, existem situações que a resposta de Bhaskara é em forma de fração como por exemplo 1/2 . O meu programa não exibi 1/2 , mas sim 0,5 , ou seja , ele está dividindo 1/2. Alguém ai consegui dar uma ajudinha para eu fugir desse resultado decimal ? Sei que 0,5 = 5/10. O numerador e o denominador é divisível por 5 dae temos 1/2. Vou deixar o código abaixo. Lembrando que funciona perfeitamente. Só queria que minha resposta viesse em forma de fração e não decimal.

public void calculoDelta(){
    double a = Double.parseDouble(n1.getText());
    double b = Double.parseDouble(n2.getText());
    double c = Double.parseDouble(n3.getText());
    
   // int calculo = (int) ((Math.pow(b, 2)) - (4*a*c));

Double calculo = ((b*b) - (4*a*c));
String delta = "Delta = "+ (b*b) + "- 4 x " +a+" x "+c ;
resultado.setText(delta+"\n" + "Delta = " +Double.toString(calculo));


if (calculo < 0) {              //condição para resultado negativo
saida.setText ("A equação não possui raiz real");
} else {
    
if (calculo > 0){           // condição para calcular duas raízes do delta
saida.setText ("Calcular duas raízes");



double x1 =  (-b + (int)Math.sqrt(calculo)); //x1 = numerador
double denominador = (2*a);
double calc1 = x1 / denominador;


double x2 =  (-b - (int)Math.sqrt(calculo));
double calc2 = x2 / (2*a);

    
resultado2.setText(( -b + "+"+(int)Math.sqrt(calculo)) +"\n"+ "----- "+ "\n"+ 2*a + "\n" + "\n"+"x1 ="+ calc1+"\n"+
"\n"+( -b + "-"+(int)Math.sqrt(calculo)) +"\n"+ "----- "+ "\n"+ 2*a + "\n" + "\n"+"x2 ="+ calc2);




} else {
saida.setText("Calcular uma raíz apenas"); 
// calculo de uma raiz do delta

double x1 =  (-b + (int)Math.sqrt(calculo));
double denominador = (2*a);
double calc1 = x1 / denominador;


resultado2.setText(( -b + "+"+(int)Math.sqrt(calculo)) +"\n"+ "----- "+ "\n"+ 2*a + "\n" + "\n"+"x1 ="+ calc1);



}
} 


}

Fico agradecida quem puder ajudar

Oi Luciana, tudo bem.
Fiz esse exemplo aqui rapidinho, pois ultimamente estou sem tempo. Não testei, e foi o que conseguir pensar ate o momento, talvez te ajude ai.

Só uma coisa, acho que você esqueceu de fazer a verificação do valor de a, que não pode ser igual a zero.
Basicamente, fiz a conversão do valor de x1 em String, pois achei necessario para exibir da forma pre-definida que você pretende, pois pergunto com o metodo contais se o resultado de x1 é uma fração, caso seja a fração que quero, então atribui a String x1Format um valor predefinido, 1/2 por ex.

import java.util.*;
public class Baskara {
	public static void main (String args[]) {
		double a, b, c, delta, x1, x2;
		Scanner entrada;
		entrada = new Scanner(System.in);  
  		System.out.print("Digite o valor de a: ");
  		a = entrada.nextDouble();		
  		System.out.print("Digite o valor de b: ");
  		b = entrada.nextDouble();		
  		System.out.println("Digite o valor de c: ");
  		c = entrada.nextDouble();		
  		if (a == 0)
                System.out.println("Estes valores não formam uma equação de segundo grau ");
                else { 
     			delta = (b * b) - ( 4 * a * c);
       			if (delta < 0)
	  			 System.out.println("Não existe raiz real ");
       			if (delta == 0) { 
	  			System.out.println("Existe uma raiz real");
	    			x1 = (- b) / (2 * a);
                                //x1Format recebe o valor de x1 e o convert em String
                                //assim, posso perguntar se ele contem a fração que preciso
                                //caso verdadeiro, atribuo o valor de x1 a uma String definida, que seria nesse ex: 1/2
                                String x1Format = String.valueOf(x1);
                                if (x1Format.contains("0.5")){ 
                                //aqui voce faz os outros if, para representar um terço, um quarto, um quinto, etc
                                //dependendo da necessidade, caso for representações maiores, teria que mudar um pouco a logica
                                x1Format = "1/2";
                                System.out.println("Raiz = "+x1Format);
                                }
	    			//System.out.println("Raiz = "+x1);
	  			 }
                        //------------ fim exemplo
       			if (delta > 0) { 
	  			System.out.println("Existem duas raízes reais");
	    			x1 = (- b + Math.sqrt(delta))/(2 * a);
	    			x2 = (- b - Math.sqrt(delta))/( 2 * a);
	    			System.out.println("Primeira raiz = " + x1);
	    			System.out.println("Segunda raiz = " + x2);
	  			 }
    		}
	}
}

Nunca na vida! As combinações são, literalmente, infinitas.

Para converter um número decimal em fração deves efetuar os seguintes passos:

  1. Criar a fração com denominador múltiplo de 10, consoante o número de casas decimais.
  2. Encontrar o máximo divisor comum do numerador e denominador
  3. Dividir numerador e denominador de 1) pelo valor encontrado em 2)
2 curtidas

Olá Luci…

Já acompanhei alguns alunos de engenharia com alguns problemas desse porte.
Geralmente o que dá erro é a função “sqrt”, não utilizado de modo correto.
Faça testes e acompanhe os resultados, para ajustar.
Qualquer coisa, eleve DELTA a exponenciação de 0,5, que ele fará a raiz quadrada do mesmo.

Outro ponto importante da Báskara, deve ser apresentado 2 resultados (x’ e x’’), onde ±B em um dos cálculos deve ser positivo e no outro negativo…

Na questão da resposta, veja tópico: Decimal para fração!

Repasse, ajude a outros também… :slight_smile:

Essa resposta tem exatamente o mesmo problema da dada aqui em cima… Ter infinitos ifs não é, não pode ser, solução para um problema.

1 curtida

Olá

Concordo com o @pmlm.

A Internet está repleto de código Java para calcular MDC. Assim cria-se uma classe para calcular o MDC de dois números com seu tratamento de erro; e da mesma forma, cria-se uma classe para retornar um String com a fração, também com seu tratamento de erro, e que usa a classe anterior. E seguindo as boas práticas de Orientação a Objetos.

Bom eu consegui resolver parte do problema. Quando delta possui uma raiz real da tudo certo. Consegui a solução usando um algoritmo de MDC (máximo divisor comum) para poder simplificar. Agora estou tendo problema quando são duas raízes. Na parte que eu descrevi, tem um IF e ELSE. ele responde ao if, mas no else ele não faz nada. Eu destaquei em maiúsculo onde inicia o problema abaixo. Pode me dar uma força ?

if (calculo > 0){
                
                saida.setText("Possui duas raízes");
                
    int numerador = (-b + (int) Math.sqrt(calculo)); //x1 = numerador
        int calcnu = numerador; // resultado do calculo da variavel numerador
        
        int denominador = (2 * a); 
        int calcde = denominador; // resultado do calculo da variável denomiador
        
        int numerador1 =  (-b - (int)Math.sqrt(calculo));
        int calcnu2 = numerador1; // resultado do calculo da variável numerador1
        
        int denominador2 = (2*a);
        int calcde2 = denominador2; // resultado do calculo da variável denominador2
            
          int resto = 0; 
   int aux = 0;
  
 
  
  if (( numerador < denominador ) ||(numerador > denominador)){  //algoritmo para calcular o MDC
   aux = numerador;
   numerador = denominador;
   denominador = aux;
   
  }
  
  resto = numerador % denominador; 
       while ( resto != 0 ) {
   numerador = denominador;
   denominador = resto;
   resto = numerador % denominador; // fim do calculo mdc. variável denominador terá o mdc da divisao
   
  int divisao = calcnu / denominador;  //divisao do resultado do MDC por calcnu 
   int divisao2 = calcde / denominador; //divisao do resultado do MDC por calcde
   
 // Comentário dessa linha para separar o calculo de x duas linhas --------------------------------
 
   if (( numerador1 < denominador2 ) ||(numerador1 > denominador2)){  //algoritmo para calcular o MDC
   aux = numerador1;
   numerador1 = denominador2;
   denominador2 = aux;
  }
  
  resto = numerador1 % denominador2; 
       while ( resto != 0 ) {
   numerador1 = denominador2;
   denominador2 = resto;
   resto = numerador1 % denominador2; // fim do calculo mdc. variável denominador terá o mdc da divisao
   
  int divisao3 = calcnu2 / denominador2;  //divisao do resultado do MDC por calcnu2
   int divisao4 = calcde2 / denominador2; //divisao do resultado do MDC por calcde2
   
  if ((divisao2==1) && (divisao4==1)){
 divisao = divisao/divisao2;
 divisao3 = divisao3/divisao4;
      
  resultado2.setText(-b +"+"+(int) Math.sqrt(calculo)+"\n"+"-------"+"\n"+denominador+"\n"+"\n"+"x1 =" +Integer.toString(divisao)+"\n"+
          "\n"+( -b + "-"+(int)Math.sqrt(calculo))+"\n"+"-------"+"\n"+denominador2+"\n"+"\n"+"x2 =" +Integer.toString(divisao3));

                                                          // ATÉ AQUI TUDO OK
  } else{
      
            resultado2.setText("teste");  // PROBLEMA NESSA LINHA. NÃO consigo nem imprimir frase.                  
                                                     //  EU DEVO ESTAR COM ALGUM PROBLEMA DE CONDIÇÃO

  }
      
  }
       }     
  }

Botei aqui para o colega acima um pergunta sobre um problema. A lógica do calculo ta feito. Só estou com um problema no if e else. No if está responde, mas no else nada acontece. Botei até pra imprimir uma string so para testar, mas nada acontece. alguem puder ajudar tb fico agradecida.

Olá,

Justamente para não ficar esse código feio e bagunçado, assim difícil de ler e entender, que citei as boas práticas. Se fizer como citei então vai ficar bem mais claro e fácil de entender. É o que chamamos de Princípio de Responsabilidade Única. Ou seja, cada um no seu quadrado, ou melhor, no seu código separado :wink:

q me ajudou também a resolver essa foi um víddeo que vi no yt

tá bem mastigado aí