Calculadora java

8 respostas
M

Olá!
Gostaria de pedir ajuda para poder fazer esse trabalho:

Construir uma calculadora que avalie se uma expressão matemática está correta lexicamente e informe o resultado do cálculo. Exemplos de expressões:

x+2 |x+2=0 | x+y-z-23 | x+y-z >= 23 | (((x+2)+(y-3))*3/4)

A calculadora deve incluir operadores matemáticos: soma(+); subtração(-); divisão(/); multiplicação(*) e potência(**). Neste caso o resultado da expressão deve ser numérico (Universo dos números reais com sinal). Permitir mesclar com operadores relacionais: ( > ; < ; >= ; <= ; <> ; =). Neste caso o resultado da expressão deve ser lógico (Verdadeiro ou Falso). Permitir a mudança de precedência de operadores por meio de parênteses: (). Permitir trabalhar com até três variáveis: x, y, z. A calculadora deverá solicitar os valores das variáveis após a avaliação léxica para poder calcular o resultado.

Att, MYU23.

8 Respostas

drsmachado

E o que já fez?

M

Um colega meu conseguiu fazer até aqui mas o algoritimo não roda. Gostaria de lembrar que sou iniciante em Java. E se puder, gostaria de saber como ficaria numa interface gráfica.

package calculadora;

import java.util.Scanner;

import java.util.Stack;

import java.util.StringTokenizer;

import java.util.Vector;

public class CalculadoraSistematizacao {

static String expressao;
	public static void main(String args[]){
		
		
		System.out.println(" Digite a expressão matemática" + "\n pode conter até três variáveis (x, y, z):");
	
		Scanner in = new Scanner(System.in);
		expressao = in.next();
		if(!Parenteses()){
			System.out.println("Expressão inválida!");		
		}
		if(expressao.indexOf("x") >= 0){
			System.out.println("Digite um valor para x:");
			String x1 = in.next();	
			expressao = expressao.replace("x", x1);
		}
		if(expressao.indexOf("y") >= 0){
			System.out.println("Digite um valor para y:");
			String y1 = in.next();
			expressao = expressao.replace("y", y1);
		}
		if(expressao.indexOf("z") >= 0){
			System.out.println("Digite um valor para z:");
			String z1 = in.next();
			expressao = expressao.replace("z", z1);
		}
		
		else{
			System.out.println(expressao + " = " + String.valueOf(res(expressao)));
			}
		
	}
	public static boolean Parenteses(){
		int abrepar = expressao.replaceAll("[^(]", "").length();
		int fechapar = expressao.replaceAll("[^)]", "").length();
	
		if(abrepar != fechapar){
			return false;
		}
		return true;
	}
	
	static Vector<String> Tokens(String expressao){
		Vector<String> r = new Vector<String>();
		StringTokenizer exp1;
		
		exp1 = new StringTokenizer(expressao, "()+-*/", true);
		while(exp1.hasMoreTokens()){
			String exp2 = exp1.nextToken();
			r.addElement(exp2);			
		}
		return r;
	}
	static Vector<String> Conv(Vector<String> v){
		Vector<String> r = new Vector<String>();
		Stack<String> p = new Stack<String>();
		for(int i = 0; i < v.size(); i++){
			String t = (String) v.elementAt(i);
			if(t.equals("*") || t.equals("/") || t.equals("+") || t.equals("-")){
				p.push(t);
			}
			else if(t.equals(")")){
				r.addElement(p.pop());
			}
			else if(!t.equals("(")){
				r.addElement(t);
			}
		}
		return r;
	}
	static int res(String expressao){
		Vector<String> v = Tokens(expressao);
		v = Conv(v);
		Stack<String> p = new Stack<String>();
		
		for(int i = 0; i < v.size(); i++){
			String t = (String) v.elementAt(i);
			if(t.equals("+")){
				int e2 = Integer.parseInt(p.pop());
				int e1 = Integer.parseInt(p.pop());
				p.push(String.valueOf(new Integer( e1 + e2)));
			}
			else if(t.equals("-")){
				int e2 = Integer.parseInt(p.pop());
				int e1 = Integer.parseInt(p.pop());
				p.push(String.valueOf(new Integer(e1 - e2)));
			}
			else if(t.equals("*")){
				int e2 = Integer.parseInt(p.pop());
				int e1 = Integer.parseInt(p.pop());
				p.push(String.valueOf(new Integer(e1 * e2)));
			}
			else if(t.equals("/")){
				int e2 = Integer.parseInt(p.pop());
				int e1 = Integer.parseInt(p.pop());
				p.push(String.valueOf(new Integer(e1 / e2)));
			}
			else{
				p.push(String.valueOf(new Integer(t)));
			}
		}
		return (Integer.parseInt(p.pop()));
		
	}
		
}
drsmachado

myu23:
Um colega meu conseguiu fazer até aqui mas o algoritimo não roda. Gostaria de lembrar que sou iniciante em Java. E se puder, gostaria de saber como ficaria numa interface gráfica.

Ficaria muito complexo, acho que não seria viável para um iniciante.
1 - Não faça tudo no main… Fica deselegante.
2 - Cada “ação” fica mais simples em um método próprio, por exemplo, “+” chama o método somarValores(int val1, int val2)

M

Mas se eu não fizer no main, eu farei em que método? E como eu chamaria esse método somarvalores?

Att, Myu23

ViniGodoy
  1. Desde o java 1.2 (e já estamos no 6, indo para o 7), não se deve mais usar Vector. Use ArrayList no lugar:
    http://www.guj.com.br/java/74068-classe-vector#389435

  2. Não use a classe StringTokenizer. Ela foi descontinuada no Java 5. No lugar, use o método split da classe String:
    http://download.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)

  3. Você precisará usar uma pilha para resolver esse problema.
    http://www.guj.com.br/java/55235-stack-pilha#289988

  4. Revise os conceitos de notação infixa e pós-fixa.

  5. Quando for postar códigos no GUJ, siga essas dicas:
    http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor

  6. Bom trabalho. :slight_smile:

M

Valeu pelas dicas!!
Vou dar uma estudada nesses links.

Obrigado a todos!

M

Quem tiver mais dicas, por favor. Estou começando agora em Java e tenho q entregar esse trabalho até o dia 23 desse mês.

Construir uma calculadora que avalie se uma expressão matemática está correta lexicamente e informe o resultado do cálculo. Exemplos de expressões:

x+2 |x+2=0 | x+y-z-23 | x+y-z >= 23 | (((x+2)+(y-3))*3/4)

A calculadora deve incluir operadores matemáticos: soma(+); subtração(-); divisão(/); multiplicação(*) e potência(**). Neste caso o resultado da expressão deve ser numérico (Universo dos números reais com sinal). Permitir mesclar com operadores relacionais: ( > ; < ; >= ; <= ; <> ; =). Neste caso o resultado da expressão deve ser lógico (Verdadeiro ou Falso). Permitir a mudança de precedência de operadores por meio de parênteses: (). Permitir trabalhar com até três variáveis: x, y, z. A calculadora deverá solicitar os valores das variáveis após a avaliação léxica para poder calcular o resultado.

Att, MYU23.

ViniGodoy

Não precisa repetir o enunciado. Nós já entendemos da primeira vez.
Tente estudar e fazer o trabalho, e poste aqui suas dúvidas.

Ninguém vai fazer o trabalho por você.

Aliás, vc abriu o tópico no local errado, o certo era o fórum de “Java básico”. Estou movendo o tópico.

Criado 17 de maio de 2011
Ultima resposta 17 de mai. de 2011
Respostas 8
Participantes 3