elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  AYUDA !!! Programa calcula raices n-esimas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA !!! Programa calcula raices n-esimas  (Leído 3,531 veces)
Ensslin

Desconectado Desconectado

Mensajes: 5



Ver Perfil
AYUDA !!! Programa calcula raices n-esimas
« en: 24 Febrero 2013, 00:18 am »

//      nraices.c
//

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int main(int na, char *arg[])
{
   double v;
   double n;
      
   
    if (na < 3) {
        fprintf(stderr, "Introduce radicando y número\n"
               "Así: \n"
               "\t%s <radicando> <numero>\n"
               "\n\ny yo te daré su raiz enésima \n\n"

                ,arg[0]);
              exit(-1);
       return (-1);
   }

    v = atof(arg[2]);
    n = atof(arg[1]);


    if (v<= 0)
    {
       fprintf(stderr, "El número debe ser positivo.\n");
       exit(-1);
    }
     if (n<= 1)
    {
       fprintf(stderr, "El radicando debe ser mayor de 1.\n");
       exit(-1);
    }


double pow(double x, double n);


double f(double x)
{
   
   return pow(x, n)-v;              //Función cuya raíz busco

}

double Df(double x)
{
    
    return n*(pow(x, (n-1)));           //Derivada de la función f(x)

}


double newton(double semilla, double tolerancia)
{
   double x1, x2;
   double dif;

   x1 = semilla;
   do {
      x2 = x1 - f(x1)/Df(x1);
      dif = fabs(x2-x1);
      x1 = x2;
   } while (dif > x2*tolerancia);

   return x1;
}

   double raiz = newton(1.0, 1e-9);
   printf("La raíz enésima es %17.12f\n",raiz );


   return 0;
}
________________________________

Tengo que hacer un programa que calcule raices n-ésimas pero no logro que me compile, los errores que me da el compilador de geany son :
" /tmp/ccYhZhGT.o: In function `f.3225':
nraices.c:(.text+0x23): undefined reference to `pow' "
" /tmp/ccYhZhGT.o: In function `Df.3228':
nraices.c:(.text+0x184): undefined reference to `pow' "


collect2: ld returned 1 exit status

Espero que podáis ayudarme, ya que a mí no se me ocurre nada--
Gracias


« Última modificación: 24 Febrero 2013, 00:21 am por Ensslin » En línea

pacoperico

Desconectado Desconectado

Mensajes: 100


Ver Perfil
Re: AYUDA !!! Programa calcula raices n-esimas
« Respuesta #1 en: 24 Febrero 2013, 00:36 am »

Creo que es porque tanto la varibale v y n no son globales y por lo tanto las funciones donde tienes los pow() no pueden acceder a sus valores. Declara v y n fuera del cuerpo de main a ver que tal te va.


En línea

diskontrol

Desconectado Desconectado

Mensajes: 89


RAWR!


Ver Perfil
Re: AYUDA !!! Programa calcula raices n-esimas
« Respuesta #2 en: 24 Febrero 2013, 00:42 am »

¿Has añadido el parámetro -lm al compilar?
En línea

Siempre ten tus cosas cuando las necesites con @Dropbox. ¡Una cuenta de 2 GB es gratis! http://db.tt/YxRhsCI
Ensslin

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Re: AYUDA !!! Programa calcula raices n-esimas
« Respuesta #3 en: 24 Febrero 2013, 00:57 am »


int main(int na, char *arg[])
{   
      double v;
      double n;
   
   
    if (na < 3) {
        fprintf(stderr, "Introduce radicando y número\n"
               "Así: \n"
               "\t%s <radicando> <numero>\n"
               "\n\ny yo te daré su raiz enésima \n\n"
                ,arg[0]);
              exit(-1);
       return (-1);
   }

   

   v = atof(arg[2]);
   n = atof(arg[1]);
   
    if (v<= 0)
    {
       fprintf(stderr, "El número debe ser positivo.\n");
       exit(-1);
    }
     if (n<= 1)
    {
       fprintf(stderr, "El radicando debe ser mayor de 1.\n");
       exit(-1);
    }





double pow(double x, double n);




double f(double x)
{
   double v;
    double n;

   return pow(x, n)-v;              //Función cuya raíz busco

}

double Df(double x)
{
     
     double n;
    return n*(pow(x, (n-1)));           //Derivada de la función f(x)
}



double newton(double semilla, double tolerancia)
{
   double x1, x2;
   double dif;

   x1 = semilla;
   do {
      x2 = x1 - f(x1)/Df(x1);
      dif = fabs(x2-x1);
      x1 = x2;
   } while (dif > x2*tolerancia);

   return x1;


   double raiz = newton(1.0, 1e-9);
   printf("La raíz enésima es %17.12f\n",raiz );


   return 0;
}

Ahora sólo me marca este error

"nraices.c:87: error: expected declaration or statement at end of input" Por los dos corchetes que tengo en rojo
En línea

Ensslin

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Re: AYUDA !!! Programa calcula raices n-esimas
« Respuesta #4 en: 24 Febrero 2013, 00:58 am »

¿Has añadido el parámetro -lm al compilar?

Creo que no, voy a ver
En línea

Ensslin

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Re: AYUDA !!! Programa calcula raices n-esimas
« Respuesta #5 en: 24 Febrero 2013, 01:07 am »

Si compilo el programa inicial del post desde la terminal y añadiendo la librería matemática me funciona, muchas gracias por la ayuda!  :D
En línea

pacoperico

Desconectado Desconectado

Mensajes: 100


Ver Perfil
Re: AYUDA !!! Programa calcula raices n-esimas
« Respuesta #6 en: 24 Febrero 2013, 01:08 am »

Lo que has hecho es declarar esas variables v y n dentro de las funciones. De esta forma estas variables son distintas de las que tienes declaradas dentro de main. A lo que me referia es a esto:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

   double v;
   double n;

int main(int na, char *arg[])
{

   double v;
   double n;
    
    if (na < 3) {
        fprintf(stderr, "Introduce radicando y número\n"
               "Así: \n"
               "\t%s <radicando> <numero>\n"
               "\n\ny yo te daré su raiz enésima \n\n"
                ,arg[0]);
              exit(-1);
       return (-1);
   }

    v = atof(arg[2]);
    n = atof(arg[1]);


    if (v<= 0)
    {
       fprintf(stderr, "El número debe ser positivo.\n");
       exit(-1);
    }
     if (n<= 1)
    {
       fprintf(stderr, "El radicando debe ser mayor de 1.\n");
       exit(-1);
    }


double pow(double x, double n);


double f(double x)
{
  
   return pow(x, n)-v;              //Función cuya raíz busco

}

double Df(double x)
{
    
    return n*(pow(x, (n-1)));           //Derivada de la función f(x)

}


double newton(double semilla, double tolerancia)
{
   double x1, x2;
   double dif;

   x1 = semilla;
   do {
      x2 = x1 - f(x1)/Df(x1);
      dif = fabs(x2-x1);
      x1 = x2;
   } while (dif > x2*tolerancia);

   return x1;
}

   double raiz = newton(1.0, 1e-9);
   printf("La raíz enésima es %17.12f\n",raiz );


   return 0;
}
En línea

Ensslin

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Re: AYUDA !!! Programa calcula raices n-esimas
« Respuesta #7 en: 24 Febrero 2013, 01:22 am »

Sí, así tb me compila, declarando las variables fuera del main. Ya me funciona el programa. Muchas gracias  ;D
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: AYUDA !!! Programa calcula raices n-esimas
« Respuesta #8 en: 24 Febrero 2013, 09:16 am »

int main(int na, char *arg[])
{   
      double v;
      double n;
    if (na < 3) {
        fprintf(stderr, "Introduce radicando y número\n"
               "Así: \n"
               "\t%s <radicando> <numero>\n"
               "\n\ny yo te daré su raiz enésima \n\n"
                ,arg[0]);
              exit(-1);
       return (-1);
   }
   v = atof(arg[2]);
   n = atof(arg[1]);
       if (v<= 0)
    {
       fprintf(stderr, "El número debe ser positivo.\n");
       exit(-1);
    }
     if (n<= 1)
    {
       fprintf(stderr, "El radicando debe ser mayor de 1.\n");
       exit(-1);
    }
ouble pow(double x, double n); //<==¿ESTO QUE PINTA  AQUI? las
 //  declaraciones yson antes del main
double f(double x)//<==¿ESTO QUE PINTA  AQUI? las  funciones han de estar fuera de main                                                                                
{
   double v;
    double n;

   return pow(x, n)-v;              //Función cuya raíz busco
}

double Df(double x)//<==¿ESTO QUE PINTA  AQUI? las  funciones han de estar fuera  de main
{
    
    double n;
    return n*(pow(x, (n-1)));           //Derivada de la función f(x)
}
double newton(double semilla, double tolerancia)//<==¿ESTO QUE PINTA  AQUI? las funciones han de estar fuera  de main                                  
{[/color]
   double x1, x2;
   double dif;

   x1 = semilla;
   do {
      x2 = x1 - f(x1)/Df(x1);
      dif = fabs(x2-x1);
      x1 = x2;
   } while (dif > x2*tolerancia);
   return x1;
   double raiz = newton(1.0, 1e-9);
   printf("La raíz enésima es %17.12f\n",raiz );
   return 0;
}

Ahora sólo me marca este error

"nraices.c:87: error: expected declaration or statement at end of input" Por los dos corchetes que tengo en rojo



Fíjate en los comentarios que te pongo en "tu" código.

Te dejo como sería el formato del código funcionando, ya tu lo pasas a argumentos. Fíjate en que forma tomo la función, para evitar raices así como su derivada. También te dejo un par de printf para que observes la "evolución" de la aproximación;



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define RAIZ  2.0
  5. #define N  3.0   /*numero del que queremos hallar la raiz*/
  6. #define SEMILLA  1.0
  7. #define TOLERANCIA  1e-9
  8.  
  9. double f( double x);
  10. double Df(  double x );
  11. double newton(double x);
  12.  
  13. int main(){
  14.  double raizN = newton( RAIZ);
  15.  printf("La raiz %lf  de %lf es %1.12lf\n",RAIZ,N,raizN);//calculo Newton
  16.  return 0;
  17. }
  18. /**********************************************/
  19. double newton(  double x)
  20. {
  21.   double x1, x2;
  22.   double dif;
  23.    double dif_;
  24.   x1 = SEMILLA;
  25.   do {
  26.      x2 = x1 - f(x1)/Df(x1);
  27.      printf("f(x1,RAIZ) %1.12lf  Df(x1,RAIZ) %1.12lf\n",f(x1),Df(x1));//prescindible
  28.      dif_=x2-x1;
  29.      if (dif_<0)
  30.        dif_=-dif_;
  31.      printf("dif %1.12lf\n",dif_);//prescindible
  32.      printf("x1= %1.12lf  x2= %1.12lf fabs %1.12lf\n",x1,x2,dif_);//prescindible
  33.      x1 = x2;
  34.   } while (dif_ > x2*TOLERANCIA);
  35.  
  36.   return x1;
  37. }
  38. /**********************************************/
  39. double f ( double x)
  40. {
  41.    /* x = (N)(^1/RAIZ) ==> x^RAIZ-N = f */
  42.    return (pow(x, RAIZ)-N);  
  43. }
  44. /**********************************************/
  45. double Df(  double x )
  46. {
  47.    /* Df = RAIZ*x^(RAIZ-1) */
  48.    return RAIZ*(pow(x, RAIZ-1));
  49. }
  50. /**********************************************/
  51.  

Saluditos!.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa que calcula el número más próximo al primero « 1 2 3 »
Programación C/C++
DickGumshoe 22 22,463 Último mensaje 29 Enero 2019, 10:07 am
por dijsktra
[Help] Programa que calcula sueldos
Programación C/C++
sora_ori 2 2,233 Último mensaje 11 Diciembre 2013, 21:03 pm
por sora_ori
BlackBerry Classic: retorno a las raíces
Noticias
wolfbcn 0 1,324 Último mensaje 18 Diciembre 2014, 01:56 am
por wolfbcn
Raices cubicas?
.NET (C#, VB.NET, ASP)
andrecid 2 2,389 Último mensaje 17 Mayo 2015, 00:41 am
por kub0x
Problemas con raíces. « 1 2 »
Programación C/C++
KaizerPlazz 11 5,627 Último mensaje 14 Octubre 2016, 02:31 am
por hsk75rv
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines