static int p;
public static void main(String[] args) {
do {
int aberto = 0, fechado = 0;
p = 0;
String continha = JPrompt.readStringPane("Digite uma conta: ");
for (int i = 0; i < continha.length(); i++) {
char parenteses = continha.charAt(i);
if (parenteses == '(') {
aberto = aberto + 1;
} else if (parenteses == ')') {
fechado = fechado + 1;
}
}
if (aberto < fechado || fechado < aberto) {
JPrompt.printPane("Voce se esqueceu de fechar um parenteses:");
continha = JPrompt.readStringPane("Digite uma conta: ");
} else {
continha = continha.replace(",", ".");
Double resultado = E(continha.replace(" ", "") + "\0");
if (resultado == null) {
JPrompt.printPane("A expressão " + continha + " está mal formada! =/");
} else {
JPrompt.printPane(continha + " = " + resultado);
}
}
} while (JPrompt.printConf("Continha", "Deseja continuar?"));
}
public static Double E(String e) {
// E --> T + E | T - E | T
Double numero1 = T(e), numero2;
char caractere = e.charAt(p);
if (caractere == ')') {
p = p + 1;
return numero1;
}
if (p < e.length() && numero1 != null) {
if (caractere == '+') {
p = p + 1;
numero2 = E(e);
if (numero2 != null) {
return numero1 + numero2;
}
} else if (caractere == '-') {
p = p + 1;
numero2 = E(e);
if (numero2 != null) {
return numero1 - numero2 + numero1;
}
}
}
return numero1;
}
public static Double T(String e) {
// T --> F * T | F
Double numero1 = F(e), numero2;
char caractere = e.charAt(p);
if (caractere == ')') {
p = p + 1;
return numero1;
}
if (p < e.length() && numero1 != null) {
if (caractere == '*') {
p = p + 1;
numero2 = T(e);
if (numero2 != null) {
return numero1 * numero2;
}
} else if (caractere == '/') {
p = p + 1;
numero2 = T(e);
if (numero2 != null) {
return numero1 / numero2;
}
}
}
return numero1;
}
public static Double F(String e) {
Double numero1 = G(e), numero2;
char caractere = e.charAt(p);
if (caractere == ')') {
p = p + 1;
return numero1;
}
if (p < e.length() && numero1 != null) {
if (caractere == '√') {
p = p + 1;
numero2 = F(e);
if (numero2 != null) {
return numero1 * Math.sqrt(numero2);
}
} else if (caractere == '^') {
p = p + 1;
numero2 = F(e);
if (numero2 != null) {
return Math.pow(numero1, numero2);
}
} else if (caractere == '%') {
p = p + 1;
numero2 = F(e);
if (numero2 == null) {
return numero1 / 100;
} else if (numero2 != null) {
return (numero1 * numero2 / 100);
}
}
} else if (caractere == '√') {
p = p + 1;
numero2 = F(e);
if (numero2 != null) {
return Math.sqrt(numero2);
}
} else if (caractere == '-') {
p = p + 1;
numero2 = F(e);
if (numero2 != null) {
String negativo = "-";
String contatenei = negativo + numero2;
Double vai = new Double(contatenei);
return vai;
}
}
return numero1;
}
public static Double G(String e) {
Double numero1 = H(e), numero2;
char caractere = e.charAt(p);
if (caractere == '(') {
p = p + 1;
return E(e);
}
return numero1;
}
public static Double H(String e) {
// F --> num
String texto = "";
Double numero = null;
boolean temPontinho = false;
boolean temNumero = false;
char caractere = e.charAt(p);
while (Character.isDigit(caractere) || caractere == '.') {
if (temPontinho == false && caractere == '.') {
texto = texto + caractere;
temPontinho = true;
} else {
if (Character.isDigit(caractere)) {
texto = texto + caractere;
}
}
p = p + 1;
caractere = e.charAt(p);
temNumero = true;
}
if (temNumero) {
numero = new Double(texto);
} else {
if (temPontinho) {
numero = new Double(texto);
}
}
return numero;
}
}
Estou tendo dificuldade para concertar um erro que tem nessa mini calculadora que toda vez que o usuário digita “-” 3 vezes seguidas ele da erro exemplo: o usuário digitou -8-5-3 = -10 ele deveria retornar -16 mas ele esta retornando -10.