Ajuda com Raiz Quadrada

Olá a todos, estou com dificuldades para implementar a raiz quadrada nessa app, pois funções com dois parâmetros não acontece erro algum mas a raiz esta dando erro… Se alguém puder me ajudar ficarei muito grato.

Obrigado.


import java.util.Scanner;

public class PolonesaReversa {

	// lista de atributos da classe

	private double x, y, resp = 0;
	private char op;
	private int erro;

	// métodos públicos da classe

	public PolonesaReversa() { // construtor
		erro = 0;
	}

	public void calculaPolonesaReversa() {
		Scanner entrada = new Scanner(System.in);
		String s;

		System.out.println("Polonesa Reversa: (Tecle <enter> para fechar a aplicacao)");
		do {
			if (resp == 0) {
				s = entrada.nextLine();
				if (s.equals("")) {
					System.out.println("Fim da Aplicacao");
					System.exit(0);
				}
				x = Double.parseDouble(s);
			} else {
				x = resp;
			}
			s = entrada.nextLine();
			if (s.equals("")) {
				System.out.println("Fim da Aplicacao");
				System.exit(0);
			}
			y = Double.parseDouble(s);
			do {
				s = entrada.nextLine();
				if (s.equals("")) {
					System.out.println("Fim da Aplicacao");
					System.exit(0);
				}
				op = s.charAt(0);
			} while (!strChr("+-*/pr", op));
			operaCalculadora();
			exibeCalculadora();
		} while (!s.equals(""));
	}

	// operaCalculadora

	private void operaCalculadora() {
		switch (op) {
		case '+':
			resp = soma(x, y);
			break;
		case '-':
			resp = subtracao(x, y);
			break;
		case '*':
			resp = multiplicacao(x, y);
			break;
		case '/':
			if (y == 0)
				erro = 1; // divisão por zero
			else
				resp = divisao(x, y);
			break;
		case 'p':
			resp = potencia(x, y); // potência
			break;
		case 'r':
			if (x == 0)
				erro = 2;
			else
				resp = raiz(x); // raiz
			break;
		}
	}

	// exibeCalculadora

	private void exibeCalculadora() {
		switch (erro) {
		case 1:
			System.out.println("Erro: Divisão por Zero");
			break;
		case 2:
			System.out.println("Erro: Raiz Complexa ou Inválida");
			break;
		case 3:
			System.out.println("Erro: Tangente Inválida");
			break;
		default:
			System.out.println(resp);
		}
	}

	// métodos privados da classe

	// strChr

	private boolean strChr(String s, char ch) {

		for (int i = 0; i < s.length(); i++) {
			if (s.charAt(i) == ch) {
				return (true);
			}
		}
		return (false);
	}

	// soma

	private double soma(double x, double y) {
		return (x + y);
	}

	// subtração

	private double subtracao(double x, double y) {
		return (x - y);
	}

	// multiplicação

	private double multiplicacao(double x, double y) {
		return (x * y);
	}

	// divisão

	private double divisao(double x, double y) {
		if (y == 0) {
			erro = 1;
			return (-1);
		}
		return (x / y);
	}

	// potencia

	private double potencia(double x, double y) {
		return (Math.pow(x, y));
	}

	// raiz

	private double raiz(double x) {
		return (Math.sqrt(x));
	}
}

Qual erro?

Quando executo ela da esse erro:

Exception in thread "main" java.lang.NumberFormatException: For input string: "r"
	at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
	at java.lang.Double.parseDouble(Unknown Source)
	at PolonesaReversa.calculaPolonesaReversa(PolonesaReversa.java:39)
	at Polonesa.main(Polonesa.java:8)

Você está usando uma pilha? Se você quer criar uma calculadora com notação polonesa reversa, precisa criar uma pilha, onde os parâmetros devem ser empilhados para posteriormente serem desempilhados à medida em que você faz as contas.

Aproveitando o ansejo, alguém manja implementar isso na mão?

private static int raiz(int x) { return (int) (Math.sqrt(x)); }

[quote=araujo_dionata]Quando executo ela da esse erro:

Exception in thread "main" java.lang.NumberFormatException: For input string: "r" at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) at java.lang.Double.parseDouble(Unknown Source) at PolonesaReversa.calculaPolonesaReversa(PolonesaReversa.java:39) at Polonesa.main(Polonesa.java:8) [/quote]

Você está executando

x = Double.parseDouble(s);

para o String “r”, o que vai causar um NumberFormatException. Trate sua exceção ou altere a lógica de funcionamento.

Abraço

[quote=andredecotia]Aproveitando o ansejo, alguém manja implementar isso na mão?

private static int raiz(int x) { return (int) (Math.sqrt(x)); } [/quote]

Clique AQUI para ver como implementar o cálculo da raiz quadrada.

J.E.Z, show…

Mas como implementar isso em Java? Sem usar o método já pronto…

???

J.E.Z obrigado, mas como eu disse com dois numeros x e y eu consigo mas operaçoes com apenas o x… como posso tratar essa exceção? ou como implemento isso com pilha como dito pelo entanglement?

Obrigado a todos.

[quote=andredecotia]J.E.Z, show…

Mas como implementar isso em Java? Sem usar o método já pronto…

???[/quote]

Se você ler o artigo vai chegar a ESTE TÓPICO que descreve exatamente como fazê-lo algoritmicamente. Que é bem simples, utilizando bit shifting. Boa sorte!

[quote=araujo_dionata]J.E.Z obrigado, mas como eu disse com dois numeros x e y eu consigo mas operaçoes com apenas o x… como posso tratar essa exceção? ou como implemento isso com pilha como dito pelo entanglement?

Obrigado a todos.[/quote]

Para descobrir como tratar exceções você pode olhar AQUI.

Esse exercício parece um clássico problema acadêmico. Caso seja esse o caso, o objetivo é ampliar sua habilidade em criar algoritmos eficientes utilizando os recursos da linguagem. Se eu lhe der a solução pronta o objetivo não será alcançado. No entanto, recomendo você procurar saber mais sobre expressões regulares.

J.E.Z belê? :smiley:

Cara, não consigo transformar isso em Java, o código/algorítimo não sei se é C não entendí mesmo, está abaixo:

[code]short sqrt(short num) {
short op = num;
short res = 0;
short one = 1 << 14; // The second-to-top bit is set: 1L<<30 for long

    // "one" starts at the highest power of four <= the argument.
    while (one > op)
        one >>= 2;

    while (one != 0) {
        if (op >= res + one) {
            op -= res + one;
            res = (res >> 1) + one;
        }
        else
          res >>= 1;
        one >>= 2;
    }
    return res;
}[/code]

Sei que a idéia/lógica é um número vezes sua esponenciação acha a raiz. Tal que até consigo implementar desta forma
numa lógica bizarra, veja: rs

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

	int valorDigitadoPeloUsuario = 25;

	pararIterador: for (int i = 0; i < 1000000000; i++) {//Na minha lógica não tenho controle de valor hardcode 1000000000, e o pior é perca de performance 
		int raizDescoberta = i * i;
		if (raizDescoberta == valorDigitadoPeloUsuario) {
			System.out.println("A raíz de " + valorDigitadoPeloUsuario + " é " + i + ".");
			break pararIterador;
		}
	}
}

}[/code]

Valeu pela ajuda.
Abraço,

Você precisa aprender a fazer Bit Shifting pra conseguir implementar.

Da uma olhada nesse link:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html