Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int esOp(char c){
- if(c=='+')
- return 1;
- else if(c=='-')
- return -1;
- else
- return 0;
- }
- int ConvAEntero(char** cad){ /* Genera una cadena auxiliar con los caracteres mientras sean numeros */
- char* i; int buf_index=0; char buffer[30];
- i=*cad;
- while(isdigit(*i)){
- buffer[buf_index]=*i;
- buf_index++;
- i++;
- }
- buffer[buf_index]='\0'; /* Se finaliza la cadena con \0 */
- *cad=i; /* Actualiza el puntero a la ultima posicion */
- return atoi(buffer); /* Retorna el resultado de la conversion de la cadena a int */
- }
- int parser(char* str, int *mayor, int coeficientes[], int tam){
- char* i;
- int esX=0;
- int a,b,grado;
- int op;
- i=str;
- while(*i!='\0'){
- a=0;b=0;
- if((esOp(*i)==1) || (esOp(*i)==-1)){/* Determina el operador */
- op=*i;
- i++;
- }
- 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 */
- op='+';
- if(*i=='('){ /* Si empieza un binomio.. */
- i++;
- if(!isdigit(*i)){/* Si no es un numero, el primer operando es x, por lo tanto el coeficiente es 1 */
- a=1;
- esX=1;
- }
- 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 */
- a=ConvAEntero(&i);
- }
- if(*i=='x'){ /* Como el coeficiente de x ya se guardo, aumenta el puntero */
- i++;
- esX=1;
- }
- else if(esX && !isdigit(*i)) /* Si la condicion se cumple, ambos operandos del binomio son variables, lo cual equivale a una sintaxis incorrecta */
- return 0;
- else if(esX && isdigit(*i)){
- b=esOp(*i); /* Se almacena el signo del segundo operando */
- i++;
- b=ConvAEntero(&i);
- if(*i=='x') /* Si es un numero seguido de x, hay 2 variables y la sintaxis es incorrecta */
- return 0;
- }
- /* El caracter actual deberia ser ')' */
- if(*i==')'){
- i++; /* Avanza hacia el signo de exponenciacion */
- if(*i!='^'){
- grado=1; /* Si no hay signo de exponenciacion, el grado del binomio es 1 */
- if(grado>(*mayor))
- *mayor=grado;
- desarrollarBinomio(coeficientes,a,b,grado,op);
- }
- else if(isdigit(*i)){
- grado=*(++i) - '0'; /* Se convierte el caracter a un entero y se lo asigna al grado */
- if(grado>(*mayor))
- *mayor=grado; /* Determina el grado del polinomio */
- desarrollarBinomio(coeficientes,a,b,grado,op);
- }
- else
- return 0;
- }
- else
- return 0; /* La sintaxis es incorrecta ya que no se cierra el parentesis luego del 2do operando del binomio */
- }
- else if((op=esOp(*i))!=0){/* Si es un operador, puede estar seguido de una constante */
- i++;
- if(isdigit(*i)){ /* Si entra en este bloque, *i deberia equivaler al comienzo del termino independiente */
- coeficientes[0]+=op * (ConvAEntero(&i));
- }
- 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 */
- i--;
- }
- else if(*i!='\0')
- i++;
- }
- return 1; /* Cuando termina el while retorna que termino sin errores */
- }
Add Comment
Please, Sign In to add comment