Advertisement
Guest User

Untitled

a guest
Sep 1st, 2015
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.35 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define TAM 100000000
  6.  
  7. #define xDEBUG
  8. #define xDEBUG_PRINTF
  9.  
  10. #define K_S_DEGUB
  11.  
  12. #ifdef DEBUG
  13.     #ifdef DEBUG_PRINTF
  14.         #define PRINT(A,...) printf(A,##__VA_ARGS__);
  15.     #else
  16.         #define PRINT(A,...) fprintf(saida,A,##__VA_ARGS__);
  17.     #endif
  18. #else
  19.     #define PRINT(A,...) ;
  20. #endif
  21.  
  22. char* remove_parenteses(char* vi) {
  23.     char* final_expr = 0;
  24.     int i;
  25.     if (vi[0] != '(') {
  26.         while(*(++vi) != '\0');
  27.         return --vi;
  28.     }
  29.     int total = 0;
  30.     while (vi[total] == '(') total++;
  31.     int pos = 0, parent = 0;
  32.     for (i = total; vi[i]; i++) {
  33.         if (vi[i] == '(') {
  34.             parent++;
  35.             vi[pos++] = vi[i];
  36.         }
  37.         else if (vi[i] == ')') {
  38.             if (parent>0) {
  39.                 parent--;
  40.                 vi[pos++] = vi[i];
  41.             }
  42.             else {
  43.                 total--;
  44.             }
  45.         }
  46.         else {
  47.             vi[pos++] = vi[i];
  48.         }
  49.     }
  50.     vi[pos] = 0;
  51.     if(!final_expr)
  52.         final_expr = &vi[pos-1];
  53.  
  54.     return final_expr;
  55. }
  56.  
  57. /*
  58.  * Função que busca o início da expressão, ignorando os parênteses à esquerda da string.
  59.  * Não remove os parênteses de fato. Retorna o endereço de interesse.
  60.  *
  61.  * O número de parênteses abrindo pode ser dado por remove_parenteses(str) - str
  62.  */
  63. char* remove_parenteses_abrindo(char* str) {
  64.     for(;;++str)
  65.         if(*str != '(')
  66.             return str;
  67. }
  68.  
  69. /*
  70.  * Retorna o endereço do último parêntese baseado na quantidade de parênteses dada pelo arguemnto npar
  71.  */
  72. char* remove_parenteses_fechando(char* str, unsigned int npar, unsigned int* npar_ini) {
  73.     if(npar == 0) {
  74.         while(*(++str) != '\0');
  75.         return --str;
  76.     }
  77.  
  78.  
  79.     for(;;++str)
  80.         switch(*str) {
  81.             case '(':
  82.                 ++npar;
  83.                 break;
  84.             case ')':
  85.                 if(!(--npar))
  86.                     return str;
  87.                 break;
  88.             case '\0':
  89.                 return str;
  90.                 break;
  91.             default:
  92.                 ++(*npar_ini);
  93.                 break;
  94.         }
  95.  
  96. }
  97.  
  98. /*
  99.  * Função que busca o próximo termo válido. Retorna o endereço final, que fica
  100.  * no parêntese que fecha o termo, caso exista.
  101.  * A entrada deve ser o primeiro endereço APÓS o operador.
  102.  *
  103.  * Esta função verifica também se existe algum parêntese fechando logo após o operador.
  104.  * Se houver, deve-se diminuir a quantidade esperada de parênteses fechando no final da expressão.
  105.  */
  106. char* obtem_termo(char* str) {
  107.     unsigned int parentese = 0;
  108.  
  109.     while(*(str++) == ')');
  110.     --str;
  111.  
  112.     /* Colocando fora do laço ganha uma operação a menos por iteração */
  113.     if(*str != '(' && *str != ')') return str;
  114.  
  115.     for(;;++str)
  116.         switch(*str) {
  117.             case '(':
  118.                 ++parentese;
  119.                 break;
  120.             case ')':
  121.                 if(!(--parentese))
  122.                     return str;
  123.                 break;
  124.             default:
  125.                 break; 
  126.         }
  127. }
  128.  
  129. char str[TAM] = "S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))((S(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(S(S(KS)(S(KK)(SKK)))(K(S(SKK)(SKK))))(KK))K))K))K))K))K))K))K))K))K)";
  130. char buf[TAM];
  131. int main() {
  132.     FILE *saida;
  133.     saida = fopen("out.txt", "w");
  134.  
  135.     char* r = str;
  136.     char* w = buf;
  137.  
  138.     char* inicio_expr;
  139.     char* final_expr;
  140.     char* a; size_t tam_a;
  141.     char* b; size_t tam_b;
  142.     char* c; size_t tam_c;
  143.     char* d; size_t tam_d;
  144.  
  145.     #ifdef K_S_DEGUB
  146.         unsigned int K_reducao = 0;
  147.         unsigned int S_reducao = 0;
  148.     #endif
  149.  
  150.     do {
  151.         memset (w,'\0',TAM);
  152.  
  153.         final_expr = remove_parenteses(r);
  154.  
  155.         PRINT("str: %s\n",r);
  156.         switch(*(inicio_expr = r)) {
  157.             case 'K':
  158.                 #ifdef K_S_DEGUB
  159.                     ++K_reducao;
  160.                 #endif
  161.  
  162.                 a = obtem_termo(inicio_expr+1);
  163.  
  164.                 b = obtem_termo(a+1);
  165.  
  166.                 c = obtem_termo(b+1);
  167.  
  168.                 PRINT("i: %s\na: %s\nb: %s\nc: %s\nf: %s\n", inicio_expr, a, b, c, final_expr);
  169.  
  170.                 tam_a = a-inicio_expr;
  171.                 tam_b = b-a;
  172.  
  173.                 memcpy(
  174.                         memcpy(
  175.                                 w,
  176.                                 inicio_expr + 1,
  177.                                 tam_a
  178.                         ) + tam_a,
  179.                         b + 1,
  180.                         (final_expr) - b
  181.                 );
  182.  
  183.  
  184.                 PRINT("--> %s\n", w);
  185.  
  186.                 break;
  187.             case 'S':
  188.                 #ifdef K_S_DEGUB
  189.                     ++S_reducao;
  190.                 #endif
  191.  
  192.                 a = obtem_termo(inicio_expr+1);
  193.  
  194.                 b = obtem_termo(a+1);
  195.  
  196.                 c = obtem_termo(b+1);
  197.  
  198.                 d = obtem_termo(c+1);
  199.  
  200.                 PRINT("i: %s\na: %s\nb: %s\nc: %s\nd: %s\nf: %s\n", inicio_expr, a, b, c, d, final_expr);
  201.  
  202.                 tam_a = a-inicio_expr;
  203.                 tam_b = b-a;
  204.                 tam_c = c-b;
  205.  
  206.                 w[0] = '(';
  207.                 memcpy(
  208.                         memcpy(
  209.                                 w+1,
  210.                                 inicio_expr + 1,
  211.                                 tam_a
  212.                         ) + tam_a,
  213.                         b + 1,
  214.                         c - b
  215.                 );
  216.                 w[1 + tam_a + tam_c]        = ')';
  217.                 w[1 + tam_a + tam_c + 1]    = '(';
  218.  
  219.                 memcpy(
  220.                         memcpy(
  221.                                 w+1 + (1 + tam_a + tam_c + 1),
  222.                                 a + 1,
  223.                                 b - a
  224.                         ) + tam_b,
  225.                         b + 1,
  226.                         c - b
  227.                     );
  228.                 w[(1 + tam_a + tam_c + 1) + (1 + tam_b + tam_c)]        = ')';
  229.                
  230.  
  231.                 memcpy(
  232.                     w+1 + ((1 + tam_a + tam_c + 1) + (1 + tam_b + tam_c)),
  233.                     c + 1,
  234.                     strlen(c + 1)
  235.                 );
  236.  
  237.  
  238.                 PRINT("--> %s\n", w);
  239.  
  240.                 break;
  241.             default:
  242.                 break;
  243.         }
  244.         /* swap */
  245.         inicio_expr = w;
  246.         w = r;
  247.         r = inicio_expr;
  248.     } while(r[1] != '\0');
  249.  
  250.     fprintf(saida, "--> %s\n", w);
  251.  
  252.     fprintf(saida, "--> %s\n", r);
  253.  
  254.     #ifdef K_S_DEGUB
  255.         fprintf(saida, "K reducoes: %d\nS reducoes: %d\n", K_reducao, S_reducao);
  256.     #endif
  257.  
  258.     return 0;
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement