Java - Algoritmo de Bhaskara

9 respostas
L

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

9 Respostas

J

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

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

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:

P

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.

C

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.

L

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

  }
      
  }
       }     
  }
L

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.

C

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:

J

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

tá bem mastigado aí

Criado 11 de agosto de 2016
Ultima resposta 4 de dez. de 2019
Respostas 9
Participantes 6