Advertisement
Guest User

LEP com contexto

a guest
Aug 20th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #define MaxStackSize 100
  5. #define ContadorPilha 0
  6.  
  7.  
  8. /*
  9. Nome: Nycolas Lacerda de Oliveira
  10. Disciplina: Algoritmos e estrutura de dados
  11. Numero EP: 3
  12.  
  13.  
  14. */
  15.  
  16. int numeral=0;
  17. int resultadoaux=0;
  18. int casosbase[];
  19. char vexpre[20];
  20.  
  21. typedef struct lista
  22. {
  23.     char conteudo;
  24.     struct lista *prox;
  25.   /*  struct lista *ant; */
  26. } celula;
  27.  
  28. typedef struct {
  29.    int elements[MaxStackSize];
  30.    int count;
  31. } stackT;
  32.  
  33. typedef struct{
  34.     int valor;
  35.     celula* lista;
  36.  
  37. }Contexto;
  38.  
  39.  
  40.  
  41.  
  42.  
  43. /*Função auxiliar para adicionar elementos  na lista*/
  44. void addfim(celula **lista, char valor)
  45. {
  46.     celula *pNow, *pNavegar;
  47.  
  48.     pNavegar = *lista;
  49.  
  50.     if((pNow = malloc(sizeof(celula))) == NULL)
  51.     {
  52.         printf("\nMemory Failure\n");
  53.     }
  54.     else
  55.     {
  56.  
  57.         pNow->conteudo = valor;
  58.         pNow->prox = NULL;
  59.         /*pNow->ant = NULL; */
  60.         if(*lista == NULL)
  61.         {
  62.             *lista = pNow;
  63.         }
  64.         else
  65.         {
  66.             while(pNavegar->prox!= NULL)
  67.             {
  68.                 pNavegar = pNavegar->prox;
  69.             }
  70.  
  71.             pNavegar->prox = pNow;
  72.             /*pNow->ant = pNavegar;*/
  73.         }
  74.     }
  75. }
  76. /*Função para preencher a lista*/
  77. void preencher_lista(char vetor[], int n, celula *p)
  78. {
  79.     int i;
  80.     for(i=0; i<n; i++)
  81.     {
  82.        addfim(&p,vetor[i]);
  83.     }
  84.  
  85. }
  86. /*Operação de empilhar elemento na pilha*/
  87.  
  88. void Push(stackT *s, int element) {
  89.    if (s->count == MaxStackSize){
  90.         printf( "Stack size exceeded.\n");
  91.       exit( EXIT_FAILURE);
  92.    }
  93.    s->elements[s->count++] = element;
  94. }
  95.  
  96. /*Função para imprimir elementos da lista*/
  97. void imprimiresquerda(celula *lista)
  98. {
  99.     celula *p;
  100.     p = lista;
  101.     if(p == NULL)
  102.     {
  103.         printf("\nLista Vazia");
  104.     }
  105.     else
  106.     {
  107.        p = p->prox;
  108.         while(p!=NULL)
  109.         {
  110.  
  111.             printf("%c",p->conteudo);
  112.             p = p->prox;
  113.         }
  114.     }
  115. }
  116.  
  117.  
  118. /*Operação de desempilhar elemento do topo da pilha*/
  119. char Pop( stackT *s) {
  120.    if (s->count == 0) {
  121.       printf( "Pop of an empty stack.\n");
  122.       exit( EXIT_FAILURE);
  123.    }
  124.    return s->elements[--s->count];
  125. }
  126. void   ApplyOperator( char op, stackT *s);
  127. void   DisplayStack( stackT* pilha);
  128.  
  129. /*Função que faz o calculo dos operadores*/
  130. void ApplyOperator( char op, stackT *s)
  131. {
  132.     /*Primeiro operando*/
  133.     int irh = Pop(s);
  134.     /*Segundo operando*/
  135.     int ilh = Pop(s);
  136.  
  137.     int result;
  138.  
  139.    switch (op) {
  140.       case '+': result = ilh + irh; break;
  141.       case '-': result = ilh - irh; break;
  142.       case '*': result = ilh * irh; break;
  143.       case '/': result = ilh / irh; break;
  144.       default : printf( "Illegal operator\n");
  145.                 exit( EXIT_FAILURE);
  146.    }
  147.    printf( "\n--Resultado dos calculos: %d\n--", result);
  148.  
  149.    resultadoaux = result;
  150.    Push(s,result);
  151.  
  152.  
  153. }
  154.  
  155.  
  156. /*Função que imprime o conteudo da pilha*/
  157.  
  158. void DisplayStack(stackT *pilha)
  159. {
  160.    int i;
  161.  
  162.    printf( "Stack: ");
  163.    if (pilha->count == 0)
  164.       printf( "empty\n");
  165.    else {
  166.       for (i = 0; i < pilha->count; i++) {
  167.         printf( "%d", pilha->elements[i]);
  168.       }
  169.       printf( "\n");
  170.    }
  171. }
  172.  
  173. int resolverContexto(int n,celula* lista, celula* listacom, int casosbases[]){
  174. char m[2];
  175. m[1]='\0';
  176. m[0]=lista->prox->conteudo;
  177. /*Numero de chamadas recursivas*/
  178. int num = atoi(m);
  179.  
  180. int num_bases = strlen(casosbases);
  181.  
  182. celula* aux;
  183. aux = lista;
  184.  
  185. /*Pilha de contexto*/
  186. Contexto stackContex[50];
  187. int indexContexto = 0;
  188.  
  189. stackT* pilhaoperando;
  190. pilhaoperando = malloc(sizeof(stackT));
  191. pilhaoperando->count=0;
  192.  
  193. if(n<num_bases){
  194.     return casosbases[n];
  195. }
  196.  
  197.  
  198.  while (aux->prox!=NULL) {
  199.  
  200. int digit = n + num;
  201.  
  202.  
  203.     printf("\nELEMENTO VISTO NO MOMENTO:%c", aux->conteudo);
  204.    /* CONVERTER PRA INTEIRO O CONTEUDO DA CELULA*/
  205.     if(digit < num_bases){
  206.  
  207.             if(digit < 0){
  208.                         Push(pilhaoperando,casosbases[0]);
  209.             }else{
  210.                        Push(pilhaoperando,casosbases[digit]);
  211.                     }
  212.     }else if(isdigit(aux->conteudo)){
  213.         Push(pilhaoperando,aux->conteudo);
  214.     }else if(aux->conteudo=='n')
  215.         Push(pilhaoperando,n);
  216.       else if(!(digit < num_bases)){
  217.             stackContex[indexContexto].valor = n;
  218.             stackContex[indexContexto].lista= aux->prox;
  219.             indexContexto++;
  220.  
  221.             /*Reiniciando a expressão*/
  222.             aux = listacom;
  223.             n = digit;
  224.             continue;
  225.     }
  226.     else if(aux->conteudo == '/' || aux->conteudo == '*' || aux->conteudo == '+' || aux->conteudo == '-'){
  227.         ApplyOperator(aux->conteudo,pilhaoperando);
  228.     }
  229.  
  230.  
  231.  
  232.  
  233.     if(!aux->prox){
  234.             if(indexContexto > 0){
  235.                 int newIndex = indexContexto - 1;
  236.                 aux = stackContex[newIndex].lista;
  237.                 n = stackContex[newIndex].valor;
  238.  
  239.                 newIndex--;
  240.                 continue;
  241.             }
  242.         }
  243.  
  244.  
  245.     aux = aux->prox;
  246.  
  247.     return Pop(pilhaoperando);
  248.  
  249.  
  250. }
  251. }
  252.  
  253. void LEP(){
  254.  
  255. /*Lendo o arquivo para captar as informações de calculo*/
  256. FILE* arquivo;
  257. arquivo = fopen("lep1.in","r");
  258. char c;
  259. int tam_b;
  260. int n;
  261. int j=0;
  262.  
  263.  
  264.     if(arquivo == NULL)
  265.         printf("Arquivo nao encontrando");
  266.       else{
  267.  
  268.         do{
  269.             fscanf(arquivo, "%d", &tam_b);
  270.         }while((c=getc(arquivo))!= '\n');
  271.  
  272.  
  273.  
  274.         int i=0;
  275.         do{
  276.  
  277.         fscanf(arquivo,"%d",&casosbase[i]);
  278.         i++;
  279.  
  280.         }while(i!= tam_b+1 || (c=getc(arquivo))!= '\n');
  281.  
  282.  
  283.      /* ERRO ESTÁ OCORRENDO AQUI */
  284.  
  285.          do{
  286.             c = getc(arquivo);
  287.             vexpre[j] = c;
  288.  
  289.             j++;
  290.  
  291.         }while(c != '\n');
  292.  
  293.  
  294.  
  295.  
  296.  
  297.          do{
  298.             fscanf(arquivo,"%d",&n);
  299.         }while((c=getc(arquivo))!= EOF);
  300.  
  301. fclose(arquivo);
  302. }
  303.  
  304. numeral = n;
  305.  
  306.  /*ADICIONAR A EXPRESSÃO NA LISTA ENCADEADA*/
  307.   celula *lista;
  308.   lista = malloc (sizeof (celula));
  309.   lista->prox = NULL;
  310. preencher_lista(vexpre,j,lista);
  311. imprimiresquerda(lista);
  312.  
  313. celula* listaaux;
  314. listaaux = lista->prox;
  315.  
  316.  
  317. stackT* pilhaoperando;
  318. pilhaoperando = malloc(sizeof(stackT));
  319. pilhaoperando->count=0;
  320. celula* elemento;
  321. elemento = lista->prox;
  322.  
  323.  
  324.  
  325. int digit;
  326.  
  327.    /*enquanto não chega no final da lista*/
  328.    /* As vezes a lista armazena lixo, porém o que vale é o ultimo resultado */
  329.    while (elemento->prox!=NULL) {
  330.  
  331.  
  332.  
  333.    printf("\nELEMENTO VISTO NO MOMENTO:%c", elemento->conteudo);
  334.    /* CONVERTER PRA INTEIRO O CONTEUDO DA CELULA*/
  335.  
  336.         if(elemento->conteudo == 'n'){
  337.             Push(pilhaoperando,numeral);
  338.         }
  339.         if(isdigit(elemento->conteudo)){
  340.             char s1[2];
  341.             s1[1]='\0';
  342.             s1[0]= elemento->conteudo;
  343.             digit = atoi(s1);
  344.             Push(pilhaoperando, digit);
  345.         }
  346.  
  347.         if(elemento->conteudo == '/' || elemento->conteudo == '*' || elemento->conteudo == '+')
  348.             ApplyOperator(elemento->conteudo,pilhaoperando);
  349.         if(elemento->conteudo == '-'){
  350.             celula* aux;
  351.             aux = elemento->prox;
  352.  
  353.             if(aux->conteudo==NULL || (!isdigit(aux->conteudo)))
  354.                 ApplyOperator(elemento->conteudo,pilhaoperando);
  355.             else{
  356.                 /* PARAR A EXECUÇÃO, E RESOLVER AS CHAMADAS RECURSIVAS*/
  357.                  int calccontexto = resolverContexto(numeral,elemento,listaaux,casosbase);
  358.                  Push(pilhaoperando, calccontexto);
  359.                  elemento = elemento->prox;
  360.                 }
  361.  
  362.       }
  363.  
  364.       elemento = elemento->prox;
  365.  
  366.  
  367. }
  368.  
  369. }
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376. int main( void)
  377. {
  378.   LEP();
  379.  
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement