[RESOLVIDO]Ajuda em calculadora cientifica

E aí pessoal, eu tenho que criar uma "calculadora cientifica" usando métodos. O usuário vai escolher no menu qual operação que deseja e daí tem que aparecer o resultado na tela, eu consegui fazer quase tudo exceto a parte das raizes de uma equação de segundo grau. O cara vai digitar os valores para "a,b, c", daí resolvo a equação só que não tô conseguindo mostrar o resultado na tela.

O código:

[code]import java.util.Scanner;
public class c{
public static void main(String[] args){

Scanner scn = new Scanner(System.in);
    int fim = 0, escolha;
	double r2;
	
    System.out.println("!!Calculadora Cientifica!!" );
    
    
    while(fim == 0){
        
    System.out.println("Menu" );
    System.out.println("1 - Raiz quadrda \n2 - Exponenciacao \n3 - Raizes de uma equacao de 2 grau \n4 - Area do retangulo \n5 - Fatorial \n8- Sair do programa" );
    System.out.println("Escolha sua opcao:" );
    escolha = scn.nextInt();
        
    switch(escolha){
            case 1:
                System.out.println("Digite um valor:" );
				int r1 = scn.nextInt();
				System.out.println();
				System.out.println("Resultado: " +raiz(r1));
				System.out.println();
                break;
            case 2:
                System.out.println("Digite um valor para a base:" );
                double b = scn.nextDouble();
				System.out.println("Digite um valor para o exponte:" );
				double e = scn.nextDouble();
				System.out.println();
				System.out.println("Resultado: " + expoente(b,e));
				System.out.println();
                break;
            case 3:
                System.out.println("Digite um valor para a:" );
				double a = scn.nextDouble();
				System.out.println("Digite um valor para b:" );
				double b1 = scn.nextDouble();
				System.out.println("Digite um valor para c:" );
				double c = scn.nextDouble();
				System.out.println("Resultado: " +equacao(a,b1,c));
                break;
            case 4:
                System.out.println("Digite um valor para a base:" );
                double base = scn.nextDouble();
				System.out.println("Digite um valor para a altura:");
				double altura = scn.nextDouble();
				System.out.println("Resultado: " +retangulo(base,altura));
				System.out.println();
                break;
            case 5:
                System.out.println("Digite um valor:" );
				double f = scn.nextDouble();
				System.out.println();
				System.out.println("Resultado: " +fatorial(f));
				System.out.println();
                break;
            case 8:
                System.out.println("Espero que tenha ajudado. ");
                fim++;
                break;
            default:
                System.out.println("Digite uma opcao valida :) " );
				System.out.println();
        }
    
    }
}
//metodo pra raiz
public static double raiz(double a){
	double r = Math.sqrt(a);
	return r;
}
//metodo pra exponenciacao
public static double expoente(double b1, double e1){
	//pra calcular o expoente
	double r2 = 1;
	for(int x = 0; x < e1; x++){
		r2 = r2 * b1;
	}	
	return r2;
}	
//metodo para o retangulo
public static double retangulo(double base2, double altura2){
	double area = 0;
	area = base2 * altura2;
	return area;
}
//metodo para fatorial
public static double fatorial(double f1){
	double fat = 1;
	for(int x = 0; x < f1; x++){
		fat = fat * (f1 - x);
	}
	return fat;
}
[b]//metodo para as raizes
public static double equacao(double a1, double b2, double c2){
	double delta = (b2 * b2) - (4 * a1 * c2);
	if(delta == 0){
		double x = (- b2 + Math.sqrt(delta)) / (2 * a1);
	}
	else if(delta > 0){
		double x = (- b2 + Math.sqrt(delta)) / (2 * a1);
		double x2 = (- b2 - Math.sqrt(delta)) / (2 * a1);
	}
	else{
		System.out.println("Não existe raiz real." );
	}
	return x;
}[/b]

}[/code]

Quando eu compilo da erro no meu return, o que posso fazer pra arrumar esses erros? Obrigado.

Comece por aqui.

Você pode fazer com que o método “equacao” retorne um array de doubles, que pode ser de tamanho 0 (sem raízes), 1 (uma única raiz), 2 (duas raízes).

O que não pode ocorrer é ele não retornar nada, como você tentou fazer. E mais, pra onde foi o valor de x2?

E de que jeito posso fazer isso? Sou nova na área então tô ainda pegando o jeito e tal.

Dona Gabriela (é esse o nome? ) você poderia fazer algo como:

    public static double[] equacao(double a1, double b2, double c2){  
        double delta = (b2 * b2) - (4 * a1 * c2);  
        if(delta == 0){  
            return new double[] { (- b2 + Math.sqrt(delta)) / (2 * a1) };  
        }  
        else if(delta > 0){  
            return new double[] {
                (- b2 + Math.sqrt(delta)) / (2 * a1);  
                (- b2 - Math.sqrt(delta)) / (2 * a1);  
            };
        }  
        else{  
            return new double[0];
        }  
    }

Se delta for zero, torna-se desnecessário somar a sua raiz quadrada, já que raiz de 0 é 0 :slight_smile:

No caso 3 do seu switch, aí você precisa verificar o retorno do método “equacao”. Algo como:

                case 3:  
                    System.out.println("Digite um valor para a:" );  
                    double a = scn.nextDouble();  
                    System.out.println("Digite um valor para b:" );  
                    double b1 = scn.nextDouble();  
                    System.out.println("Digite um valor para c:" );  
                    double c = scn.nextDouble();  
                    double[] x = equacao (a, b1, c);
                    if (x.length ==0) {
                         System.out.println ("Equacao nao tem raizes reais");
                    } else if (x.length == 1) {
                         System.out.println ("A unica raiz da equacao eh " + x[0]);
                    } else if (x.length == 2) {
                         System.out.println ("A equacao tem 2 raizes, " + x[0] + " e " + x[1]);
                    }

Agora fica dando um erro de not a statement e não consigo arrumar -.-

public static double[] equacao(double a1, double b2, double c2){ double delta = (b2 * b2) - (4 * a1 * c2); if(delta == 0){ return new double[1]; { (- b2 + Math.sqrt(delta)) / (2 * a1); //aqui } } else if(delta > 0){ return new double[2]; { (- b2 + Math.sqrt(delta))/ (2 * a1); //aqui (- b2 - Math.sqrt(delta)) / (2 * a1); //aqui } } else{ return new double[0]; } }

Ah, desculpe, o correto seria:

    public static double[] equacao(double a1, double b2, double c2){      
            double delta = (b2 * b2) - (4 * a1 * c2);      
            if(delta == 0){      
                return new double[1];  
                {   
                    (- b2 + Math.sqrt(delta)) / (2 * a1)
                }      
            }      
            else if(delta > 0){      
                return new double[2];  
                {    
                    (- b2 + Math.sqrt(delta))/ (2 * a1),
                    (- b2 - Math.sqrt(delta)) / (2 * a1)
                }    
            }      
            else{      
                return new double[0];    
            }      
        }  

Quando eu compilo, o erro dá no travessão “/”, é estranho.

Tem dois ponto e virgula a mais:

[code]return new double[1];

return new double[2];[/code]

Estes não devem existir.

Desculpe mais uma vez. É questão de eu não ter visto direito os “;” - não pus todo o código no compilador :frowning:

E de qualquer maneira, evite usar nomes tão curtos para classes - que raio de classe tem nome “c”? Está batendo com o nome dos parãmetros da equação de segundo grau, o que é sempre muito confuso.

KKKK É que quando eu iniciei o código eu botei c, agora já alterei pra Calculadora.

E aah, obrigado pela ajuda. Não consegui ajeitar, mas de qualquer jeito obrigado, agora já tenho que sair daí quando eu voltar eu olho o código direitinho e vou tentar solucionar.

Dei uma acertadinha no seu programa, mas não sei se ele está funcionando direitinho :frowning:

import java.util.Scanner;

// 1) Evite usar métodos estáticos - mas neste caso não deve haver problemas.
//
// 2) Evite usar nomes de variáveis curtos (a menos que, como no caso desta calculadora, seja melhor usar
// os nomes curtos)
// 
// 3) Dentro de um "case", se precisar definir uma nova variável, é melhor então
// pôr o conteúdo do "case" dentro de chaves. 

public class Calculadora {
    public static void main(String[] args) {

        Scanner scn = new Scanner(System.in);
        int fim = 0;
        int escolha;

        System.out.println("!!Calculadora Cientifica!!");

        while (fim == 0) {

            System.out.println("Menu");
            System.out.println("1 - Raiz quadrada \n2 - Exponenciacao \n3 - Raizes de uma equacao de 2 grau \n4 - Area do retangulo \n5 - Fatorial \n8- Sair do programa");
            System.out.println("Escolha sua opcao:");
            escolha = scn.nextInt();

            switch (escolha) {
            case 1:
                System.out.println("Digite um valor:");
                int r = scn.nextInt();
                System.out.println();
                System.out.println("Resultado: " + raiz(r));
                System.out.println();
                break;
            case 2: {
                System.out.println("Digite um valor para a base:");
                double b = scn.nextDouble();
                System.out.println("Digite um valor para o expoente:");
                double e = scn.nextDouble();
                System.out.println();
                System.out.println("Resultado: " + expoente(b, e));
                System.out.println();
            }
                break;
            case 3: {
                System.out.println("Digite um valor para a:");
                double a = scn.nextDouble();
                System.out.println("Digite um valor para b:");
                double b = scn.nextDouble();
                System.out.println("Digite um valor para c:");
                double c = scn.nextDouble();
                double[] x = equacao(a, b, c);
                if (x.length == 0) {
                    System.out.println("Equacao nao tem raizes reais");
                } else if (x.length == 1) {
                    System.out.println("A unica raiz da equacao eh " + x[0]);
                } else if (x.length == 2) {
                    System.out.println("A equacao tem 2 raizes, " + x[0] + " e " + x[1]);
                }
            }
                break;
            case 4: {
                System.out.println("Digite um valor para a base:");
                double base = scn.nextDouble();
                System.out.println("Digite um valor para a altura:");
                double altura = scn.nextDouble();
                System.out.println("Resultado: " + retangulo(base, altura));
                System.out.println();
            }
                break;
            case 5: {
                System.out.println("Digite um valor:");
                double f = scn.nextDouble();
                System.out.println();
                System.out.println("Resultado: " + fatorial(f));
                System.out.println();
            }
                break;
            case 8:
                System.out.println("Espero que tenha ajudado. ");
                fim++;
                break;
            default:
                System.out.println("Digite uma opcao valida :) ");
                System.out.println();
            }

        }
    }

    // metodo pra raiz
    public static double raiz(double a) {
        double r = Math.sqrt(a);
        return r;
    }

    // metodo pra exponenciacao
    public static double expoente(double b1, double e1) {
        // pra calcular o expoente
        double r2 = 1;
        for (int x = 0; x < e1; x++) {
            r2 = r2 * b1;
        }
        return r2;
    }

    // metodo para o retangulo
    public static double retangulo(double base2, double altura2) {
        double area = 0;
        area = base2 * altura2;
        return area;
    }

    // metodo para fatorial
    public static double fatorial(double f) {
        double fat = 1;
        for (int x = 0; x < f; x++) {
            fat = fat * (f - x);
        }
        return fat;
    }

    // metodo para as raizes
    public static double[] equacao(double a, double b, double c) {
        double delta = (b * b) - (4 * a * c);
        if (delta == 0) {
            return new double[] { (-b + Math.sqrt(delta)) / (2 * a)
            };
        } else if (delta > 0) {
            return new double[] {
                (-b + Math.sqrt(delta)) / (2 * a), (-b - Math.sqrt(delta)) / (2 * a)
            };
        } else {
            return new double[0];
        }
    }
}