Guest User

Untitled

a guest
Jun 25th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.03 KB | None | 0 0
  1. int esOp(char c){
  2.     if(c=='+')
  3.         return 1;
  4.     else if(c=='-')
  5.         return -1;
  6.     else
  7.         return 0;
  8. }
  9.  
  10. int ConvAEntero(char** cad){ /* Genera una cadena auxiliar con los caracteres mientras sean numeros */
  11.     char* i; int buf_index=0; char buffer[30];
  12.    
  13.     i=*cad;
  14.    
  15.     while(isdigit(*i)){
  16.         buffer[buf_index]=*i;
  17.         buf_index++;
  18.         i++;
  19.     }
  20.     buffer[buf_index]='\0'; /* Se finaliza la cadena con \0 */
  21.     *cad=i; /* Actualiza el puntero a la ultima posicion */
  22.    
  23.     return atoi(buffer); /* Retorna el resultado de la conversion de la cadena a int */
  24.    
  25. }
  26.  
  27. int parser(char* str, int *mayor, int coeficientes[], int tam){
  28.     char* i;
  29.     int esX=0;
  30.     int a,b,grado;
  31.     int op;
  32.    
  33.     i=str;
  34.    
  35.     while(*i!='\0'){
  36.         a=0;b=0;
  37.    
  38.     if((esOp(*i)==1) || (esOp(*i)==-1)){/* Determina el operador */
  39.         op=*i;
  40.         i++;
  41.     }
  42.     else /* Si no hay un operador puede ser que el puntero se encuentre al comienzo de la ecuacion, en ese caso se toma como positivo */
  43.         op='+';
  44.    
  45.     if(*i=='('){ /* Si empieza un binomio.. */
  46.         i++;
  47.         if(!isdigit(*i)){/* Si no es un numero, el primer operando es x, por lo tanto el coeficiente es 1 */
  48.             a=1;
  49.             esX=1;
  50.         }
  51.         else{ /* Si en cambio, es un numero, puede tener mas de un digito, por lo tanto se pasa a una cadena auxiliar para luego convertirlo */
  52.             a=ConvAEntero(&i);
  53.         }
  54.         if(*i=='x'){ /* Como el coeficiente de x ya se guardo, aumenta el puntero */
  55.             i++;
  56.             esX=1;
  57.         }
  58.         else if(esX && !isdigit(*i)) /* Si la condicion se cumple, ambos operandos del binomio son variables, lo cual equivale a una sintaxis incorrecta */
  59.             return 0;
  60.         else if(esX && isdigit(*i)){
  61.             b=esOp(*i); /* Se almacena el signo del segundo operando */
  62.             i++;
  63.             b=ConvAEntero(&i);
  64.             if(*i=='x') /* Si es un numero seguido de x, hay 2 variables y la sintaxis es incorrecta */
  65.                 return 0;
  66.         }
  67.         /* El caracter actual deberia ser ')' */
  68.         if(*i==')'){
  69.             i++; /* Avanza hacia el signo de exponenciacion */
  70.             if(*i!='^'){
  71.                 grado=1; /* Si no hay signo de exponenciacion, el grado del binomio es 1 */
  72.                 if(grado>(*mayor))
  73.                     *mayor=grado;
  74.                 desarrollarBinomio(coeficientes,a,b,grado,op);
  75.             }
  76.             else if(isdigit(*i)){
  77.                 grado=*(++i) - '0'; /* Se convierte el caracter a un entero y se lo asigna al grado */
  78.                 if(grado>(*mayor))
  79.                     *mayor=grado; /* Determina el grado del polinomio */
  80.                 desarrollarBinomio(coeficientes,a,b,grado,op);
  81.             }
  82.             else
  83.                 return 0;
  84.            
  85.         }
  86.         else
  87.             return 0; /* La sintaxis es incorrecta ya que no se cierra el parentesis luego del 2do operando del binomio */
  88.     }
  89.     else if((op=esOp(*i))!=0){/* Si es un operador, puede estar seguido de una constante */
  90.         i++;
  91.         if(isdigit(*i)){ /* Si entra en este bloque, *i deberia equivaler al comienzo del termino independiente */
  92.             coeficientes[0]+=op * (ConvAEntero(&i));
  93.         }
  94.         else /* Si no esta seguido de un numero, puede estar seguido por otro binomio, con lo cual se decrementa y se pasa a la siguiente iteracion del while */
  95.             i--;
  96.            
  97.     }
  98.     else if(*i!='\0')
  99.         i++;
  100.     }
  101.     return 1; /* Cuando termina el while retorna que termino sin errores */
  102. }
Add Comment
Please, Sign In to add comment