Esta compilando certinho, mas nao esta executando

4 respostas
J
import javax.swing.*;

public class NPR{
public static String NPR(String infixa) {


		String saida = "";
		char ch;
		Pilha P = new Pilha();


		//Converte para maiúsculas
		infixa = infixa.toUpperCase();

		//Varre a expressão da esquerda para a direita
		for(int i=0; i<infixa.length(); i++) {
			//Captura caracter por caractere
			ch = infixa.charAt(i);

			//Se for identificador(operando), copiar para a saída
			if(ch>='0' && ch<='9')
				saida += ch;

			//Se for operador
			if(ch=='+' || ch=='-' || ch=='*' || ch=='/') {
				//Enquanto a pilha não estiver vazia e houver no seu topo
				//um operador com prioridade maior ou igual ao encontrado
				while(!P.isEmpty() && prio(P.top().toString().charAt(0))>=prio(ch))
				{
					//Desempilha o operador e coloque na saída
					saida += P.pop();
				}

				//Empilhe o operador encontrado
				P.push(ch);
			}

			//Se for parênteses de abertura, empilhe-o
			if(ch=='(')
				P.push(ch);

			//Se for parênteses de fechamento
			if(ch==')') {
				//Enquanto não encontrar o parênteses de abertura correspondente
				while(!P.top().toString().equals("(")) {
					//Desempilhe o operador e coloque na saída
					saida += P.pop();
				}
				//Tirar o parênteses de abertura
				P.pop();
			}
		}

		//Esvaziar a pilha na saída
		while(!P.isEmpty())
			saida += P.pop();


		return saida;

	}

	public static int prio(char op){
		int resp=0;
		switch(op) {
			case '(': resp = 1;	break;
			case '+': resp = 2; break;
			case '-': resp = 2; break;
			case '*': resp = 3; break;
			case '/': resp = 3; break;
		}
		return resp;
	}

	public static String avaliaExpressao(String resultado)
	{
		String res=resultado;
		String operador="";
		int num1, num2;
		num1=0;
		num2=0;
		int conta=0;

		//Cada caractere
		int ch;

		//Instanciar uma pilha
		Pilha p = new Pilha();

		//Varre a expressão da esquerda para a direita
		for(int i=0; i<res.length();i++)
		{
			//Pega caractere por caracter
			ch = Integer.parseInt(res);
			if(ch>= 0 && ch<=1000000)
			{
				p.push(ch);
			}

				switch(ch) {
	    	 	case '+':
	    	 		num1=0;
					num2=0;
					conta=0;
					num1=Integer.parseInt(p.pop().toString());
					num2=Integer.parseInt(p.pop().toString());
					conta=num2+num1;
					p.push(conta);
	    	 		break;
	    	  	case '-':
	    	  		num1=0;
					num2=0;
					conta=0;
					num1=Integer.parseInt(p.pop().toString());
					num2=Integer.parseInt(p.pop().toString());
					conta=num2+num1;
					p.push(conta);
	    	  		break;
	    	  	case '*':
	    	  		num1=0;
					num2=0;
					conta=0;
					num1=Integer.parseInt(p.pop().toString());
					num2=Integer.parseInt(p.pop().toString());
					conta=num2+num1;
					p.push(conta);
	    	  		break;
	    	   	case '/':
	    	   		num1=0;
					num2=0;
					conta=0;
					num1=Integer.parseInt(p.pop().toString());
					num2=Integer.parseInt(p.pop().toString());
					conta=num2+num1;
					p.push(conta);
	    	   		break;

    }
		
		}

	res=p.top().toString();
	return res;
	}
	public static void main(String args[])
	{

		String str = JOptionPane.showInputDialog(
				"Entre com a empressão infixa");

		JOptionPane.showMessageDialog(null,"Expressão em NPR: "+ NPR.NPR(str));
		JOptionPane.showMessageDialog(null,"Resultado: " + NPR.avaliaExpressao(NPR.NPR(str)));

	}
}

meu codigo esta usando instanciando uma classe de pilha… eu compilo de boa, digito a expressão de boa, aparece a expressão em NPR(notação polonesa reversa) mas na hora de mostrar o redultado da pau. Este é o erro que esta dando

Exception in thread "main" java.lang.NumberFormatException: For input string: "22+"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Integer.parseInt(Integer.java:458)
	at java.lang.Integer.parseInt(Integer.java:499)
	at NPR.avaliaExpressao(NPR.java:95)
	at NPR.main(NPR.java:202)

4 Respostas

danieldomingues86

Olá,

Simples de responder… Como voce acha que seria a conversão de “22+” para inteiro?

Seria a mesma coisa que tentar fazer isso :

int a = “palavra”; (Não vai funcionar)

Essa Exception ocorre pois ele não pode converter “22+” em int, tente passar apenas “22” pra ver se funciona :slight_smile:

Abraços.

J

Ola daniel;

eu preciso passar esse sinal, para que esteja indicando que o codigo trata 1º para NOTAÇÃO POLONESA REVERSA, (algo que o professor fez questão de querer…)

danieldomingues86

Ah tá agora entendi o que voce precisa, mas tenha em mente que não pra parsear 22+ para int.
O que voce pode fazer é passar 22+ como parametro inicial e separar o 22 do + e trata-los de forma independente.

utilizando substring por exemplo

Abraços.

J

eu digitei 2 + 2, depois ele me mostra como ele resolveria na forma de NPR (junta-se 1 dois operando e copia o sinal digitado para a direita 22+ e finalmente faz a conta).

Criado 5 de junho de 2010
Ultima resposta 5 de jun. de 2010
Respostas 4
Participantes 2