Problemas com expressões infixas em C

Iniciado por willmesquita, 12 de Agosto de 2014, 11:42

tópico anterior - próximo tópico

willmesquita

Bom dia, vim aqui porque estou com sérias dúvidas em resolver um problema com expressões infixas: (2+(3*3)), estou com várias dúvidas sobre como fazer o código e praticamente estou estagnado pois só consigo ler e fazer a operação dos últimos parenteses lidos e não da expressão como um todo, vou postar o código aqui


void resul(char expression[])
{
int n,t=0,b=0,a=0,tmp[10],resultado=0,i;
char *pi,aux[5];

n = strlen(expression);
    pi = calloc(n,sizeof(char));



for(i=0;i<10;i++)tmp[i]=0;

for(i=0;expression[i]!='\0';i++)
{

        switch(expression[i])
        {
        case '(':
            pi[t]=expression[i];
            t++;
            break;
        case ')':
            while(1)
            {
                if(pi[t-1]=='(') break;
                else
                {
                    if(pi[t-1]=='+')
                    {
                      tmp[a]=atoi(aux);
                      aux[0]='\0';
                      b=0;
                      resultado=tmp[a]+tmp[a-1];
                      tmp[a-1]=resultado;
                      tmp[a]=0;
                      --a;
                      --t;
                    }

                      printf("teste\n");
                    }
              }
            break;
        case '+':
            while(1)
            {
                if(pi[t-1]='(') break;
                --t;
            }
                tmp[a]= atoi(aux);
                a++;
                aux[0]='\0';
                b=0;
                pi[t]=expression[i];
                t++;
            break;
        default:
            aux[b]=expression[i];
            b++;
            aux[b]='\0';
            break;
        }

        }

    printf("resultado: %d", resultado);
    free(pi);
      }

delhmc

#1
Boa noite, então... Estão faltando detalhes nesta lógica:

1) Você precisa fazer um tratamento também com o caractere '*' (Asterisco) e também com a barra "/" (Divisão), não existe no código. Dessa forma, vc precisa calcular primeiro, o total resultante entre o valor anterior e posterior tendo um destes caracteres no meio (Multiplicação ou divisão). Para tanto, o array aux[] deveria comportar valor decimal (float, double, number, etc) e não uma cadeia de caracteres. Sobretudo pela divisão, mas se vc também imaginar valores decimais como entrada (2.13, 4.2, etc) será preciso também fazer um tratamento com '.' (Ponto), mas daí seria mais complicadinho.

2) Só depois de multiplicar e/ou dividir os pares (Guardando-os no aux[], por exemplo) é que vc deve partir pra soma e divisão. Sugiro também, ter um outro array indicador de soma ou subtração em sequência, do tipo operacaoSomaSubtrai[] (Para usar no final e poder calcular o total, pois vc precisa seguir rigorosamente uma sequência).

3) Já que vc calculou o total de caracteres da variável expression, poderia usar i < n no segundo FOR (Em vez de expression!='\0');

Curiosidade: Faz um tempo que não mexo com linguagem C, mas seria preciso mesmo zerar o seu array? Como aqui:

for(i=0;i<10;i++)tmp[/i]=0;

Ela já não vem zerado? Creio que sim, principalmente se for referente à número inteiro. No caso de array de caracteres acho que daria pra fazer isso: *aux='\0', não? (Só como exemplo) Pois se eu não estiver enganado, me lembro que algumas vezes, um instanciamento de um array de caracteres vinha com sujeira/resquício de alguma área de memória, mas isso faz um bom tempo atrás, rs...