Avaliador de Expressões

3 respostas
M

Bem galera estou com um probleminha, tenho q fazer um avaliador de expressões, vamos logo ao problema, eu tenho eu expressão assim: ((((8+5)-(8+0))+4)+(2*2)) aí tenho q fazer um algoritmo pra ir removendo os parenteses mais externos e ir pegando as subexpressões, destrinchar totalmente até q só reste números e sinais. Mas o problema é como eu vou separar as subexpressões.

((((8+5)-(8+0))+4)+(2*2))

String exp1 = (((8+5)-(8+0))+4)

String exp2 = (2*2)

String opCentral = +

OBS: Não posso usar a biblioteca do java.

3 Respostas

drsmachado

E os professores não ajudam…
Camarada, a idéia é utilizar a lógica.
Como assim?
Perceba que existem padrões em expressões.
Você comça com parênteses, vai até um operando (número), operação (sinal matemático) outro operando e assim por diante.

Sorte tua estar utilizando java.
Eu tive que fazer isso usando pilha e C ANSI.

O que você vai fazer é comparar os padrões (ou seja, ver se é um parêntese abrindo, primeiro operando, operador, segundo parâmetro ou um parêntese fechando).

luxu

Vou passar um exemplo(manipulador de string) v se ajuda

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct StringDin
{
    char letra;
    struct StringDin *prox;
};
typedef struct StringDin stringDin;

void vazia (stringDin **str)  // EXERCÍCIO 1
{
    *str = NULL;
}

void push(stringDin **str, char letra)
{
    stringDin *aux = (stringDin *)malloc(sizeof(stringDin));
    aux->letra = letra;
    aux->prox = *str;
    *str = aux;
}

void reinicia(stringDin **str)   // EXERCÍCIO 2
{
    stringDin *aux;
    while (*str != NULL)
    {
        aux = *str;
        *str=(*str)->prox;
        free(aux);
    }
}

void reiniciaR(stringDin **str,int cont)  // EXERCÍCIO 2
{
    if (*str != NULL)
    {
        reiniciaR(&(*str)->prox,cont);
    }
    free(*str);
    *str=NULL;
}

void exibeR(stringDin *str)  // EXERCÍCIO 3
{
    if (str != NULL)
    {
        printf("%c",str->letra);
        //getchar();
        exibeR(str->prox);
    }
    free(str);
    str=NULL;
}

void exibeInverso(stringDin *str) // exercício 4
{
    stringDin *aux, *aux2;
    while (str != NULL)
    {
        printf("\n%c",str->letra);
        aux2=str;
        printf("\n%c",aux2->letra);
        aux2->prox=aux;
        aux=aux2;
        printf("\n%c",aux->letra);
//        free(aux2);
        str=str->prox;
        getchar();
    }
    //exibeR(aux);
}

int tamanho(stringDin *str)
{
    int cont = 0;
    while (str != NULL)
    {
        cont++;
        str=str->prox;
    }
    return cont;
}

void insereCar(stringDin **str, char letra)
{
    stringDin *aux =(stringDin *)malloc(sizeof(stringDin));;
    aux->letra=letra;
    aux->prox=*str;
    *str=aux;
}

void exibe(stringDin *str)  // EXERCÍCIO 3
{
    while (str != NULL)
    {
        printf("%c",str->letra);
//        getchar();
        str=str->prox;
    }
}

void copia(stringDin *str1, stringDin **str2)
{
    while (str1 != NULL)
    {
        insereCar(&*str2,str1->letra);
        str1 = str1->prox;
    }
}

void concatena(stringDin *str, stringDin *str2, stringDin **str3)
{
    copia(str, &(*str3));

    copia(str2, &(*str3));
    exibe(*str3);
}

int contaString(stringDin *str)
{
    int cont = 0;
    while (str != NULL)
    {
        cont++;
        str = str->prox;
    }
    return cont;
}

void removeQT(stringDin **str, int nro, int start)
{
    int tam = contaString(* str);

    int cont = 1;
    stringDin *ant, *aux;
    if (start <= tam)
    {
        while (start != cont)
        {
            aux=*str;
            ant=aux;
            aux=aux->prox;
            cont++;
        }
        cont = 1;
        while (cont <= nro)
        {
            printf("%c\n",aux->letra);
            ant->prox=aux->prox;
            free(aux);
            aux = ant->prox;
            cont++;
        }
    }
    else printf("Posição Inicial Inválida!");
}

int menu()
{
    stringDin *str, *str2, *str3 = (stringDin *) malloc(sizeof(stringDin));
    char op='x', letra;
	while(op != '0')
	{
		//system("cls");
		printf("a-String vazia\n");
		printf("b-Reiniciar\n");
		printf("c-Exibe\n");
		printf("d-Exibe Invertida\n");
		printf("e-Tamanho\n");
		printf("f-Insere Caracter\n");
		printf("g-Copia\n");
		printf("h-Concatena\n");
		printf("i-Remove\n");
		printf("j-Insere Substring\n");
		printf("k-Verifica Menor/Maior\n");
		printf("l-Verifica Igual\n");
		printf("m-Busca Posicao\n");
		printf("n-Carregar String\n");
		printf("0-Sair");
		printf("\n\nOpcao: ");
		op=getchar();
        //system("cls");
		if(op=='a')
		{
            vazia(&str); // Exercicio 1
            vazia(&str2); // Exercicio 1
            printf("Strings Inicializadas!\n");
            system("PAUSE");
		}
		else if(op=='b')
		{
			if (str != NULL)
            {
                reinicia(&str);// Exercicio 2
			    reinicia(&str2);// Exercicio 2
                printf("\nStrings ReInicializadas!n->");
            }
            else printf("Strings Vazias!\n");
            system("PAUSE");
		}
		else if(op=='c')
		{
			if (str != NULL)
            {
                printf("\n**** Exibir String ****\n");
                //exibeR(str);// Exercicio 3
                exibe(str);// Exercicio 3
            }
            else printf("Strings Vazias!\n");
            system("\nPAUSE");
		}
		else if(op=='d')
		{
            printf("\n**** Exibir String Invertida****");
            exibeInverso(str);// Exercicio 4
            system("PAUSE");
		}
		else if(op=='e')
		{
            printf("\n**** Tamanho da String ****");
            printf("Tamanho: %d\n",tamanho(str));// Exercicio 5
            system("PAUSE");
		}
		else if(op=='f')
		{
            printf("\n**** Exibir String Invertida****");
            insereCar(&str,'r'); // Exercicio 6
            system("PAUSE");
		}
		else if(op=='g')
		{
		printf("\nCodigo do Filme:\n->");
		}
		else if(op=='h')
		{
		printf("\nCodigo do Filme:\n->");
		}
		else if(op=='i')
		{
		printf("\nCodigo do Filme:\n->");
		}
		else if(op=='j')
		{
		printf("\nCodigo do Filme:\n->");
		}
		else if(op=='k')
		{
		printf("\nCodigo do Filme:\n->");
		}
		else if(op=='l')
		{
		printf("\nCodigo do Filme:\n->");
		}
		else if(op=='m')
		{
		printf("\nCodigo do Filme:\n->");
		}
		else if(op=='n')
		{
            printf("Digite uma letra: ");
            letra = getchar();
            while(letra != ' ')
            {
                push(&str,'W');
                printf("Outra letra: ");
                letra = getchar();
            }
		}
	}
return 0;
}

main(void)
{

    int cont=0, nro = 5, start = 2;
    menu();



//    exibe(str3);
//    printf("%c\n",str3->letra);
//    printf("%c\n",str3->prox->letra);
//    copia(str,&str2);// Exercicio 7
//    concatena(str, str2, &str3); //Exercicio 8
//    exibe(str);
//    removeQT(&str, nro, start); //Exercicio 9

   // exibe(str);
//    getchar();
  //  system("\nPAUSE");
}
M

drsmachado:
E os professores não ajudam…
Camarada, a idéia é utilizar a lógica.
Como assim?
Perceba que existem padrões em expressões.
Você comça com parênteses, vai até um operando (número), operação (sinal matemático) outro operando e assim por diante.

Sorte tua estar utilizando java.
Eu tive que fazer isso usando pilha e C ANSI.

O que você vai fazer é comparar os padrões (ou seja, ver se é um parêntese abrindo, primeiro operando, operador, segundo parâmetro ou um parêntese fechando).

blza eu to ligado que é nessa parte de identificar padrões que está a solução, mas tipo eu identifico que o parênteses abriu eu tenho q saber onde ela fecha e pegar o q está dentro ou separar o q está lá dentro. O problema está em como transformar o esses splits em códigos. Pq essa lógica de “vai até um operando (número), operação (sinal matemático) outro operando e assim por diante” vai ser no último grau de splits, pois antes esses operandos serão expressões.

Vou dar uma olhada no código do amigo.

Criado 24 de setembro de 2011
Ultima resposta 24 de set. de 2011
Respostas 3
Participantes 3