Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: clodan en 25 Agosto 2010, 17:27 pm



Título: Funciones polinomicas y racionales
Publicado por: clodan en 25 Agosto 2010, 17:27 pm
Bueno, comparto este codigo que hice en C, simplemente te devuelve los valores de x para las raices y los valores de y para la ordenada al origen.

En caso de que sea polinomica y teniendo en cuenta el siguiente modelo: ax^2 + bx + c. Y en el programa se debera ingresar los valores para a, b, c.

Y en el caso de la racional, teniendo el cuenta el siguiente modelos:
(ax^2+bx+c)/(ax^2+bx+c). Y tendremos que ingresar los valores a,b,c del numerador y del denominador.
Aqui el codigo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <conio.h>
  5.  
  6.  
  7. float divis(float numa,float numb,float numc,float dena,float denb,float denc);
  8. float div0(float numa,float numb,float numc,float dena,float denb,float denc);
  9. float divt(float numa,float numb,float numc,float dena,float denb,float denc);
  10. float diva(float numa,float numb,float numc,float dena,float denb,float denc);
  11. float var10(float b,float c);
  12. float var20(float a,float c);
  13. float vartrue(float a,float b,float c);
  14. float a;
  15. float b;
  16. float c;
  17. float raiz1;
  18. float raiz2;
  19. float ordenada;
  20. float numa;
  21. float numb;
  22. float numc;
  23. float dena;
  24. float denb;
  25. float denc;
  26. float asihor;
  27. float asiver1;
  28. float asiver2;
  29. int x;
  30.  
  31. int main(int argc, char *argv[]){ //comienzo funcion main
  32.  prin: //menu principal
  33.  system("cls");
  34.  printf ("    *****************Version 2.0*******************\n\a");
  35.  printf (" ----------------------------------------------------\n| Si desea calcular una funcion polinomica ingrese 1.|\n| Si desea calcular una funcion racional ingrese 2.  |\n ----------------------------------------------------\n");
  36.  scanf ("%d",&x);
  37.  switch (x){  
  38.         case 1:
  39.              goto poli;
  40.         case 2:
  41.              goto raci;
  42.         case 1992:
  43.              goto rights;        
  44.         default:
  45.              goto prin;
  46.              }
  47.  rights: //Rights
  48.         system("cls");
  49.         printf ("PROGRAMADO Y DISEÑADO POR ALEJANDRO BENTIVENGO ^^ \n");
  50.         system("PAUSE");
  51.         goto prin;
  52.  
  53.  poli:  //ACA EMPIEZA LA SELECCION DE LAS POLINOMICAS
  54.  system("cls");
  55.  printf ("Esta opcion unicamente calcula los valores correspondientes a funciones polinomicas de hasta grado 2\n\a");
  56.  printf ("Ingrese el valor a de la funcion\nEn caso de que no exista colocar 0\n");
  57.  scanf ("%f",&a);
  58.  printf ("Ingrese el valor b de la funcion\nEn caso de que no exista colocar 0\n\a");
  59.  scanf ("%f",&b);
  60.  printf ("Ingrese el valor c de la funcion\nEn caso de que no exista colocar 0\n\a");
  61.  scanf ("%f",&c);
  62.  if (a==0) {
  63.            var10(b,c);
  64.            goto pregunta;
  65.  }
  66.  else if (b==0){
  67.            var20(a,c);
  68.            goto pregunta;
  69.  }
  70.  else {
  71.            vartrue(a,b,c);
  72.            goto pregunta;
  73.  }
  74.  pregunta: //PREGUNTA PARA ARRANCAR DE VUELTA
  75.  system("cls");
  76.  printf ("     ********************************************\n     * Si desea resolver otra funcion ingrese 1.*\n     *        Si desea salir ingrese 2.         *\n     ********************************************\n\a");
  77.  scanf ("%d",&x);
  78.  switch (x){
  79.         case 1:
  80.              goto prin;
  81.         case 2:
  82.              return (0);
  83.         default:
  84.                 goto pregunta;
  85.         }
  86.  
  87.  raci: // Comiendo funciones RACIONALES
  88.  system("cls");
  89.  printf ("Esta opcion unicamente calcula los valores correspondientes a funciones racionales de hasta grado 2\nEste programa expresa: Las asintotas, las raices, y la ordenada al origen.\n\a");
  90.  printf ("Comenzando por el numerador, ingrese a.\nEn caso que no exista colocar 0.\n\a");
  91.  scanf ("%f",&numa);
  92.  printf ("Ingrese el b del numerador.\nEn caso que no exista colocar 0.\n\a");
  93.  scanf ("%f",&numb);
  94.  printf ("Ingrese el c del numerador.\nEn caso que no exista colocar 0.\n\a");
  95.  scanf ("%f",&numc);
  96.  printf ("Siguiendo por el denominador, ingrese el a del mismo.\nEn caso que no exista colocar 0.\n\a");
  97.  scanf ("%f",&dena);
  98.  printf ("Ingrese el b del denominador.\nEn caso que no exista colocar 0.\n\a");
  99.  scanf ("%f",&denb);
  100.  printf ("Ingrese el c del denominador.\nEn caso que no exista colocar 0.\n\a");
  101.  scanf ("%f",&denc);
  102.  if (numa==0 && dena==0){
  103.              divis(numa,numb,numc,dena,denb,denc);
  104.              goto pregunta;
  105.  }
  106.  else if (numa==0 && dena!=0){
  107.              div0(numa,numb,numc,dena,denb,denc);
  108.              goto pregunta;
  109.  }
  110.  else if (numa!=0 && dena==0){
  111.              diva(numa,numb,numc,dena,denb,denc);
  112.              goto pregunta;
  113.  }
  114.  else {
  115.              divt(numa,numb,numc,dena,denb,denc);
  116.              goto pregunta;
  117.  }
  118. }
  119.  
  120. float var10(float b,float c){
  121.      system("cls");
  122.      raiz1=((0-c)/b);
  123.      ordenada=c;
  124.      printf ("La raiz esta en %f\nY la ordenada al origen en %f\n\a", raiz1, ordenada);
  125.      system("PAUSE");
  126.      return (0);
  127. }
  128. float var20(float a,float c){
  129.      system("cls");
  130.      raiz1=(-4*(a*c));
  131.      if (raiz1>0){
  132.           raiz1=sqrt(raiz1);
  133.           raiz1=0-raiz1;
  134.           raiz1=raiz1/(2*a);
  135.      }
  136.      else {
  137.           ordenada=c;
  138.           printf ("La funcion no tiene raices.\nLa ordenada esta en %f\n\a", ordenada);
  139.           system("PAUSE");
  140.           return (0);
  141.      }
  142.      raiz2=(-4*(a*c));
  143.      raiz2=sqrt(raiz2);
  144.      raiz2=0+raiz2;
  145.      raiz2=raiz2/(2*a);
  146.      ordenada=c;
  147.      printf ("La raiz 1 esta en %f\nLa raiz 2 esta en %f\nY la ordenada al origen en %f\n\a", raiz1, raiz2, ordenada);
  148.      system("PAUSE");
  149. }
  150.  
  151. float vartrue(float a,float b,float c){
  152.      system("cls");
  153.      raiz1=((b*b)-4*(a*c));
  154.      if (raiz1>0){
  155.           raiz1=sqrt(raiz1);
  156.           raiz1=(0-b)-raiz1;
  157.           raiz1=raiz1/(2*a);
  158.      }
  159.      else {
  160.           ordenada=c;
  161.           printf ("La funcion no tiene raices.\nLa ordenada esta en %f\n\a", ordenada);
  162.           system("PAUSE");
  163.           return (0);
  164.      }
  165.      raiz2=((b*b)-4*(a*c));
  166.      raiz2=sqrt(raiz2);
  167.      raiz2=(0-b)+raiz2;
  168.      raiz2=raiz2/(2*a);
  169.      ordenada=c;
  170.      printf ("La raiz 1 esta en %f\nLa Raiz 2 esta en %f\nY la ordenada al origen en %f\n\a", raiz1, raiz2, ordenada);
  171.      system("PAUSE");
  172. }
  173.  
  174. float divis(float numa,float numb,float numc,float dena,float denb,float denc){
  175.      system("cls");
  176.      asiver1=((0-denc)/denb);
  177.      asihor=(numa/dena);
  178.      raiz1=((0-numc)/numb);
  179.      ordenada=(numc/denc);
  180.      printf ("La raiz se encuentra en %f.\nLa asintota Vertical en %f y la horizontal en %f.\nLa ordenada esta en %f\n\a", raiz1, asiver1, asihor, ordenada);
  181.      system("PAUSE");
  182. }
  183.  
  184. float div0(float numa,float numb,float numc,float dena,float denb,float denc){
  185.      system("cls");
  186.      asihor=0;
  187.      asiver1=((denb*denb)-4*(dena*denc));
  188.      if (asiver1>0){
  189.                    asiver1=sqrt(asiver1);
  190.                    asiver1=((0-denb)-asiver1);
  191.                    asiver1=asiver1/(2*dena);
  192.                    asiver2=((denb*denb)-4*(dena*denc));
  193.                    asiver2=sqrt(asiver2);
  194.                    asiver2=((0-denb)+asiver2);
  195.                    asiver2=asiver2/(2*dena);
  196.                    printf ("Existe asintota Vertical en %f y %f\n\a", asiver1, asiver2);
  197.      }
  198.  
  199.      else {
  200.           printf ("No existe Asintota Vertical\n\a");
  201.      }
  202.      raiz1=((0-numc)/numb);
  203.      ordenada=(numc/denc);
  204.      printf ("La asintota horizontal se encuentra en %f.\nLa raiz se encuentra en %f.\nLa ordenada se encuentra en %f\n\a",asihor,raiz1,ordenada);
  205.      system("PAUSE");
  206. }
  207.  
  208. float divt(float numa,float numb,float numc,float dena,float denb,float denc){
  209.      system("cls");
  210.      asihor=numa/dena;
  211.      asiver1=((denb*denb)-4*(dena*denc));
  212.      if (asiver1>0){
  213.                    asiver1=sqrt(asiver1);
  214.                    asiver1=((0-denb)-asiver1);
  215.                    asiver1=asiver1/(2*dena);
  216.                    asiver2=((denb*denb)-4*(dena*denc));
  217.                    asiver2=sqrt(asiver2);
  218.                    asiver2=((0-denb)+asiver2);
  219.                    asiver2=asiver2/(2*dena);
  220.                    printf ("Existe asintota Vertical en %f y %f\n\a", asiver1, asiver2);
  221.      }
  222.  
  223.      else {
  224.           printf ("No existe Asintota Vertical\n\a");
  225.      }
  226.      raiz1=((numb*numb)-4*(numa*numc));
  227.      if (raiz1>0){
  228.                   raiz1=sqrt(raiz1);
  229.                   raiz1=((0-numb)-raiz1);
  230.                   raiz1=(raiz1/(2*numa));
  231.                   raiz2=((numb*numb)-4*(numa*numc));
  232.                   raiz2=sqrt(raiz2);
  233.                   raiz2=((0-numb)+raiz2);
  234.                   raiz2=(raiz2/(2*numa));
  235.                   printf ("Existe raiz en %f y %f\nCUIDADO!: Si el valor de las raices es igual al de las asintotas\nentonces no es una raiz!!!\n\a",raiz1,raiz2);
  236.      }
  237.      else {
  238.           printf ("No existen raices\n\a");
  239.      }
  240.      ordenada=(numc/denc);
  241.      printf ("La ordenada se encuentra en %f\nY la asintota horizontal en %f.\n\a", ordenada, asihor);
  242.      system("PAUSE");
  243. }
  244.  
  245. float diva(float numa,float numb,float numc,float dena,float denb,float denc){
  246.      system("cls");
  247.      printf ("No existe asintota horizontal\n\a");
  248.      raiz1=((numb*numb)-4*(numa*numc));
  249.      if (raiz1>0){
  250.                   raiz1=sqrt(raiz1);
  251.                   raiz1=((0-numb)-raiz1);
  252.                   raiz1=(raiz1/(2*numa));
  253.                   raiz2=((numb*numb)-4*(numa*numc));
  254.                   raiz2=sqrt(raiz2);
  255.                   raiz2=((0-numb)+raiz2);
  256.                   raiz2=(raiz2/(2*numa));
  257.                   printf ("Existe raiz en %f y %f\nCUIDADO!: Si el valor de las raices es igual al de las asintotas\nentonces no es una raiz!!!\n\a",raiz1,raiz2);
  258.      }
  259.      else {
  260.           printf ("No existen raices\n\a");
  261.      }
  262.      asiver1=((0-denc)/denb);
  263.      ordenada=numc/denc;
  264.      printf ("Existe asintota vertical en %f\nYla ordenada al origen en %f\n\a",asiver1,ordenada);
  265.      system("PAUSE");
  266. }


El programa esta 100% probado y resuelve las funciones con un 99.9999% de exito.

Espero respuestas =)


Título: Re: Funciones polinomicas y racionales
Publicado por: Gallu en 25 Agosto 2010, 22:37 pm
Consejos...

- No uses goto , por que no llamas directamente a las funciones?

- No uses llamadas a system

- No uses conio.h

- Limpia el buffer de entrada despues de las llamadas a scanf .

- Es buena práctica comentar los procedimientos , parámetros que recibe, finalidad y valor de retorno.



Título: Re: Funciones polinomicas y racionales
Publicado por: clodan en 26 Agosto 2010, 14:57 pm
muchas gracias por los consejos!! jejeje yo recien toy empezando :P

El problema que tuve es que si no pongo goto, como hago para que vuelva a empezar ¬¬

El conio.h ni me acuerdo porque lo use xD

lo del system, estoy tratando de reemplazar el pause por el getchar de a poquito jajaja y el system("cls"); con que puede reemplazarse???

Como haces para limpiar el buffer de entrada?? cual es la funcion??

jejeje lo de los comentarios siempre lo uso pero pense que iba a quedar re pet* poner los comentarios mios en un post publico jejeje


Título: Re: Funciones polinomicas y racionales
Publicado por: Littlehorse en 26 Agosto 2010, 22:13 pm
Citar
El problema que tuve es que si no pongo goto, como hago para que vuelva a empezar ¬¬

Con un ciclo, un switch mas las funciones que necesites. Hay mil variantes que podes realizar para conseguir ese objetivo, sea cual sea va a ser mejor que "goto", que dicho sea de paso es considerada una muy mala practica.

Citar
El conio.h ni me acuerdo porque lo use xD

Olvídate de conio, completamente.

Citar
lo del system, estoy tratando de reemplazar el pause por el getchar de a poquito jajaja y el system("cls"); con que puede reemplazarse???

No hay un reemplazo estándar, para limpiar la pantalla no te queda otra que o bien usar funciones especificas de cada sistema o librerías multi-plataforma.

Citar
Como haces para limpiar el buffer de entrada?? cual es la funcion??

Función estándar no existe, esos aspectos son inherentes a cada sistema. Aplica igual que en el caso anterior, funciones especificas del sistema o librerías multi-plataforma.
Ignora los códigos que utilizan fflush(stdin) u setbuf(stdin,NULL) y demás, invocan comportamiento indefinido y no limpian el buffer precisamente. Lo ideal es que utilices fgets+sscanf y no tengas que preocuparte por la basura en el buffer.

Saludos


Título: Re: Funciones polinomicas y racionales
Publicado por: Gallu en 27 Agosto 2010, 08:27 am
Como dice LittleHorse , lo suyo sería usar fgets+sscanf, pero si de todas maneras usas scanf , para limpiar el buffer  después de cada llamada haces

Código
  1. while(getchar() != '\n');
  2.  

saludos.


Título: Re: Funciones polinomicas y racionales
Publicado por: clodan en 27 Agosto 2010, 14:53 pm
barbaroo!!! muchas gracias por las respuestas!!!