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));
}
}
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.
[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.
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?
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.
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;
}
}
}