Guest User

Untitled

a guest
Jun 25th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <time.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #define LimpiaBuffer while(getchar() != '\n')
  8. #define TVECTOR_PUNTOS 100
  9.  
  10. void primero(int a, int b, int coef[], char coefX, int op){
  11.     int buffer_coeficientes[6]= {0,0,0,0,0,0};
  12.     int i;
  13.    
  14.     if(coefX=='a'){
  15.         buffer_coeficientes[1]=a;
  16.         buffer_coeficientes[0]=b;
  17.     }
  18.     else{
  19.         buffer_coeficientes[0]=a;
  20.         buffer_coeficientes[1]=b;
  21.     }
  22.    
  23.     if(op){
  24.         for(i=0;i<2;i++)
  25.             coef[i]+=buffer_coeficientes[i];
  26.     }
  27.     else{
  28.         for(i=0;i<2;i++)
  29.             coef[i]-=buffer_coeficientes[i];
  30.     }
  31. }
  32.  
  33. void cuadrado(int a, int b, int coef[], char coefX, int op){
  34.     int buffer_coeficientes[6]= {0,0,0,0,0,0};
  35.     int i;
  36.    
  37.     if(coefX=='a'){ /* Si el binomio es de la forma (x+m) */
  38.         buffer_coeficientes[2]=pow(a,2);
  39.         buffer_coeficientes[1]=(2*b*a);
  40.         buffer_coeficientes[0]=pow(b,2);
  41.     }
  42.     else{
  43.         buffer_coeficientes[0]=pow(a,2);
  44.         buffer_coeficientes[1]=(2*b*a);
  45.         buffer_coeficientes[2]=pow(b,2);
  46.     }
  47.    
  48.     if(op){
  49.         for(i=0;i<3;i++)
  50.             coef[i]+=buffer_coeficientes[i];
  51.     }
  52.     else{
  53.         for(i=0;i<3;i++)
  54.             coef[i]-=buffer_coeficientes[i];
  55.     }
  56.    
  57. }
  58.  
  59. void cubo(int a, int b, int coef[], char coefX, int op){
  60.     int buffer_coeficientes[6]= {0,0,0,0,0,0};
  61.     int i;
  62.    
  63.     if(coefX=='a'){ /* Si el binomio es de la forma (x+m) */
  64.         buffer_coeficientes[3]=pow(a,3);
  65.         buffer_coeficientes[2]=(3*b*pow(a,2));
  66.         buffer_coeficientes[1]=3*a*pow(b,2);
  67.         buffer_coeficientes[0]=pow(b,3);
  68.     }
  69.     else{
  70.         buffer_coeficientes[0]=pow(a,3);
  71.         buffer_coeficientes[1]=(3*b*pow(a,2));
  72.         buffer_coeficientes[2]=3*a*pow(b,2);
  73.         buffer_coeficientes[3]=pow(b,3);
  74.     }
  75.    
  76.     if(op){
  77.         for(i=0;i<4;i++)
  78.             coef[i]+=buffer_coeficientes[i];
  79.     }
  80.     else{
  81.         for(i=0;i<4;i++)
  82.             coef[i]-=buffer_coeficientes[i];
  83.     }
  84. }
  85.  
  86. void cuarto(int a, int b, int coef[], char coefX, int op){
  87.     int buffer_coeficientes[6]= {0,0,0,0,0,0};
  88.     int i;
  89.    
  90.     if(coefX=='a'){ /* Si el binomio es de la forma (x+m) */
  91.         buffer_coeficientes[4]=pow(a,4);
  92.         buffer_coeficientes[3]=4*pow(a,3)*b;
  93.         buffer_coeficientes[2]=6*pow(a,2)*pow(b,2);
  94.         buffer_coeficientes[1]=4*a*pow(b,3);
  95.         buffer_coeficientes[0]=pow(b,4);
  96.     }
  97.     else{
  98.         buffer_coeficientes[0]=pow(a,4);
  99.         buffer_coeficientes[1]=4*pow(a,3)*b;
  100.         buffer_coeficientes[2]=6*pow(a,2)*pow(b,2);
  101.         buffer_coeficientes[3]=4*a*pow(b,3);
  102.         buffer_coeficientes[4]=pow(b,4);
  103.     }
  104.    
  105.     if(op){
  106.         for(i=0;i<5;i++)
  107.             coef[i]+=buffer_coeficientes[i];
  108.     }
  109.     else{
  110.         for(i=0;i<5;i++)
  111.             coef[i]-=buffer_coeficientes[i];
  112.     }
  113. }
  114.  
  115. void quinto(int a, int b, int coef[], char coefX, int op){
  116.     int buffer_coeficientes[6]= {0,0,0,0,0,0};
  117.     int i;
  118.    
  119.     if(coefX=='a'){ /* Si el binomio es de la forma (x+m) */
  120.         buffer_coeficientes[5]=pow(a,5);
  121.         buffer_coeficientes[4]=5*pow(a,4)*b;
  122.         buffer_coeficientes[3]=10*pow(a,3)*pow(b,2);
  123.         buffer_coeficientes[2]=10*pow(a,2)*pow(b,3);
  124.         buffer_coeficientes[1]=5*a*pow(b,4);
  125.         buffer_coeficientes[0]=pow(b,5);
  126.     }
  127.     else{
  128.         buffer_coeficientes[0]=pow(a,5);
  129.         buffer_coeficientes[1]=5*pow(a,4)*b;
  130.         buffer_coeficientes[2]=10*pow(a,3)*pow(b,2);
  131.         buffer_coeficientes[3]=10*pow(a,2)*pow(b,3);
  132.         buffer_coeficientes[4]=5*a*pow(b,4);
  133.         buffer_coeficientes[5]=pow(b,5);
  134.     }
  135.    
  136.     if(op){
  137.         for(i=0;i<6;i++)
  138.             coef[i]+=buffer_coeficientes[i];
  139.     }
  140.     else{
  141.         for(i=0;i<6;i++)
  142.             coef[i]-=buffer_coeficientes[i];
  143.     }
  144.    
  145. }
  146.  
  147. void desarrollarBinomio(int coef[], int a, int b, int grado, int op, char coefX){
  148.     switch(grado){
  149.     case 1:
  150.         primero(a,b,coef,coefX,op);
  151.         break;
  152.     case 2:
  153.         cuadrado(a,b,coef,coefX,op);
  154.         break;
  155.     case 3:
  156.         cubo(a,b,coef,coefX,op);
  157.         break;
  158.     case 4:
  159.         cuarto(a,b,coef,coefX,op);
  160.         break;
  161.     case 5:
  162.         quinto(a,b,coef,coefX,op);
  163.         break;
  164.     }
  165. }
  166.  
  167.  
  168. int esOp(char c){
  169.     if(c=='+')
  170.         return 1;
  171.     else if(c=='-')
  172.         return -1;
  173.     else
  174.         return 0;
  175. }
  176.  
  177. int ConvAEntero(char** cad){ /* Genera una cadena auxiliar con los caracteres mientras sean numeros */
  178.     char* i; int buf_index=0; char buffer[30];
  179.    
  180.     i=*cad;
  181.    
  182.     while(isdigit(*i)){
  183.         buffer[buf_index]=*i;
  184.         buf_index++;
  185.         i++;
  186.     }
  187.     buffer[buf_index]='\0'; /* Se finaliza la cadena con \0 */
  188.     *cad=i; /* Actualiza el puntero a la ultima posicion */
  189.    
  190.     return atoi(buffer); /* Retorna el resultado de la conversion de la cadena a int */
  191.    
  192. }
  193.  
  194.  
  195.  
  196. int parser(char* str, int *mayor, int coeficientes[]){
  197.     /* Escribir las ecuaciones sin espacios */
  198.     /* No se permiten las apariciones de x fuera de un binomio. Ej: (x-3)^2+x-1 */
  199.     /* Los operadores unarios (ej: -1) no estan permitidos */
  200.     /* x no puede estar elevada a ninguna potencia dentro de los binomios. Ej: (x^2-1)^3 */
  201.     char* i;
  202.     int esX=0;
  203.     int a,b,grado;
  204.     int op;
  205.     char coefX;
  206.    
  207.     i=str;
  208.    
  209.     while(*i!='\0'){
  210.         a=0;b=0;
  211.        
  212.         if((esOp(*i)==1) || (esOp(*i)==-1)){/* Determina el operador */
  213.             op=esOp(*i);;
  214.             i++;
  215.         }
  216.         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 */
  217.             op=1;
  218.        
  219.        
  220.        
  221.         if(*i=='('){ /* Si empieza un binomio.. */
  222.             i++;
  223.             if(!isdigit(*i)){/* Si no es un numero, el primer operando es x, por lo tanto el coeficiente es 1 */
  224.                 a=1;
  225.                 esX=1;
  226.                 coefX='a';
  227.                 i++;
  228.             }
  229.             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 */
  230.                 a=ConvAEntero(&i);
  231.             }
  232.             if(*i=='x'){ /* Como el coeficiente de x ya se guardo, aumenta el puntero */
  233.                 i++;
  234.                 esX=1;
  235.                 coefX='a';
  236.             }
  237.             if((b=esOp(*i))==0) /* Se almacena el signo del 2do operando */
  238.                 return 0; /* Si lo que sigue no es un operador retorna un error de sintaxis */
  239.             else /* Si es un operador, incrementa el puntero */
  240.                 i++;
  241.            
  242.             if(esX && !isdigit(*i)) /* Si la condicion se cumple, ambos operandos del binomio son variables, lo cual equivale a una sintaxis incorrecta */
  243.                 return 0;
  244.             else if(esX && isdigit(*i)){
  245.                 b*=ConvAEntero(&i);
  246.                 if(*i=='x') /* Si es un numero seguido de x, hay 2 variables y la sintaxis es incorrecta */
  247.                     return 0;
  248.             }
  249.             else if(!esX && !isdigit(*i)){ /* Si el primer operando es un numero */
  250.                 b*=1; /* Si el segundo operando es x entonces el coeficiente es 1 */
  251.                 coefX='b';
  252.                 i++;
  253.             }
  254.             else if(!esX && isdigit(*i)){ /* Si el primer operando es un num */
  255.                 b*=ConvAEntero(&i);
  256.                 if(*i!='x')
  257.                     return 0; /* Si los dos operandos son numeros (no hay variable) retorna un error */
  258.                
  259.             }
  260.            
  261.            
  262.             /* El caracter actual deberia ser ')' */
  263.             if(*i==')'){
  264.                 i++; /* Avanza hacia el signo de exponenciacion */
  265.                 if(*i!='^'){
  266.                     grado=1; /* Si no hay signo de exponenciacion, el grado del binomio es 1 */
  267.                     if(grado>(*mayor))
  268.                         *mayor=grado;
  269.                     desarrollarBinomio(coeficientes,a,b,grado,op,coefX);
  270.                 }
  271.                 else if(isdigit(*++i)){
  272.                     grado=(*i) - '0';
  273.                     i++;/* Se convierte el caracter a un entero y se lo asigna al grado */
  274.                     if(grado>(*mayor))
  275.                         *mayor=grado; /* Determina el grado del polinomio */
  276.                     desarrollarBinomio(coeficientes,a,b,grado,op,coefX);
  277.                 }
  278.                 else
  279.                     return 0;
  280.                
  281.             }
  282.             else
  283.                 return 0; /* La sintaxis es incorrecta ya que no se cierra el parentesis luego del 2do operando del binomio */
  284.         }
  285.         else if((esOp(*i))!=0){/* Si es un operador, puede estar seguido de una constante */
  286.             op=esOp(*i);
  287.             i++;
  288.             if(isdigit(*i)){ /* Si entra en este bloque, *i deberia equivaler al comienzo del termino independiente */
  289.                 coeficientes[0]+=op * (ConvAEntero(&i));
  290.             }
  291.             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 */
  292.                 i--;
  293.            
  294.         }
  295.         else if(isdigit(*i)){ /* En el caso de que el operador ya se haya recorrido */
  296.             coeficientes[0]+= (op * (ConvAEntero(&i)));
  297.         }
  298.         else if(*i!='\0')
  299.             i++;
  300.     }
  301.     return 1; /* Cuando termina el while retorna que termino sin errores */
  302. }
  303.  
  304.  
  305. int CalcImagen(int coef[], int x, int grado){
  306.     int i,img=0;
  307.     for(i=0;i<=grado;i++){
  308.         img+=((pow(x,i)) * (coef[i]));
  309.     }
  310.    
  311.     return img;
  312. }
  313.  
  314. void Integral(void){
  315.     int ingreso;
  316.     char cad_ecuacion[50];
  317.     int x1,x2,i,j,grado=0;
  318.     int coeficientes[6]={0,0,0,0,0,0};
  319.     int* imagen;
  320.     int intervalo;
  321.     int PosicionY; /* Posicion en el eje Y, el valor maximo es 50, porque es el valor mas grande que se puede graficar */
  322.    
  323.     system("cls");
  324.    
  325.     puts("De que manera desea ingresar los datos?\n(0) Coeficiente a coeficiente\n(1) Toda la ecuacion\n");
  326.     scanf("%d",&ingreso);
  327.    
  328.     if(!ingreso){
  329.    
  330.     /* Ingreso y validacion de datos */
  331.    
  332.     printf("Ingrese el grado del polinomio: ");
  333.     scanf("%d",&grado);
  334.     while(grado>5){
  335.         printf("El grado del polinomio debe ser menor o igual a 5. Ingreselo nuevamente: ");
  336.         scanf("%d",&grado);
  337.     }
  338.     for(i=grado;i>=0;i--){
  339.         printf("Ingrese el coeficiente del grado %d: ",i);
  340.         scanf("%d",&coeficientes[i]);      
  341.     }
  342.    
  343.     }
  344.     else{
  345.         puts("IMPORTANTE: Lea el documento 'analisis_enunciado.doc' para evitar errores de sintaxis\n\nIngrese la ecuacion: ");
  346.         scanf("%s",cad_ecuacion);
  347.         parser(cad_ecuacion,&grado,coeficientes);
  348.     }
  349.    
  350.     printf("Graficar entre x1= ");scanf("%d",&x1);
  351.     printf("y x2= ");scanf("%d",&x2);LimpiaBuffer;printf("\n");
  352.    
  353.     while ((x2<=x1)||((x1<0)||(x2<0))){
  354.         if (x2<x1)
  355.             printf("x2 debe ser mayor a x1. Intente nuevamente\n");
  356.         else if (x2==x1)
  357.             printf("x2 es igual a x1. Intente nuevamente\n");
  358.         else
  359.             printf("Alguna de las coordenadas es negativa\n");
  360.         printf("Ingrese x1= ");
  361.         scanf("%d",&x1);
  362.         printf("y x2= ");
  363.         scanf("%d",&x2);
  364.     }
  365.    
  366.     intervalo=(x2-x1+1);
  367.    
  368.     imagen=malloc(sizeof(int)*intervalo);
  369.    
  370.     for(i=x1,j=0;i<=x2;i++,j++)/* Se calcula la imagen para cada punto del intervalo y se almacenan */
  371.         imagen[j]=CalcImagen(coeficientes,i,grado);
  372.    
  373.     /* Partiendo del maximo valor representable (50), se grafica el area hasta llegar al eje X (es decir, cuand PosicionY==0) */
  374.     for(PosicionY=50;PosicionY>0;PosicionY--){
  375.         for(i=0;i<intervalo;i++){ /* Grafica la imagen por renglones */
  376.             if(imagen[i]>=PosicionY)
  377.                 printf("*");
  378.             else
  379.                 printf(" ");
  380.         }
  381.         printf("\n");
  382.     }
  383.    
  384.     free(imagen);
  385.    
  386.     getchar();
  387.    
  388. }
Add Comment
Please, Sign In to add comment