#include "expressao.h" char *LeExpressao(){ /* Lê expressao em notação entre-fixa com parênteses. */ char *e; e = (char *) calloc(TAMEXP,sizeof(char )); fscanf(stdin,"%[^\n]",e); return(e); } void GravaExpressao(char *e){/* Grava expressão em notação pós-fixa. */ fprintf(stdout,"%s\n",e); } int main() { char *entre=NULL; /* Expressões em entre-fixa e pós-fixa respectivamente */ char acao[10]; /* Acao a ser tomada conforme indicado na entrada */ /* ------------------------------------------------------------ VÁLIDO APENAS PARA LINUX Declarações para verificação do uso da memória dinâmica. A variável 'lixo' está sendo usada apenas para contornar um problema do funcionamento das funções da biblioteca 'malloc': a memória por ela apontada é desalocada logo a seguir! ------------------------------------------------------------ */ void *lixo = malloc(1); /* truque: variável auxiliar */ struct mallinfo info; int MemDinInicial, MemDinFinal; free(lixo); /* truque */ info = mallinfo(); MemDinInicial = info.uordblks; /* ------------------------------------------------------- */ /* Executa o teste */ fscanf(stdin,"%s",acao); while(strcmp(acao,"t")!=0) { switch(*acao) { case 'l': /* Ler expressão em entre-fixa */ if (entre != NULL) free(entre); entre = LeExpressao(); if (TestaExpressao(entre)) printf("Correto.\n"); else printf("Incorreto.\n"); break; default: fprintf(stderr,"Ação %s inválida\n",acao); exit(-1); } fscanf(stdin,"%s",acao); } if (entre != NULL) free(entre); /* ------------------------------------------------------------ Verificação do uso da memória dinâmica. ------------------------------------------------------------ */ info = mallinfo(); MemDinFinal = info.uordblks; if (MemDinInicial!=MemDinFinal) printf("\n\nMemória dinâmica não foi totalmente liberada (%d, %d)\n", MemDinInicial,MemDinFinal); /* ------------------------------------------------------------ */ printf("\n\nFim da execução.\n\n"); return 0; } /* testpilha */ /* author: Gustavo Sverzut Barbieri (http://www.gustavobarbieri.com.br) */