Título: AYUDA !!! Programa calcula raices n-esimas Publicado por: Ensslin 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 Título: Re: AYUDA !!! Programa calcula raices n-esimas Publicado por: pacoperico 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.
Título: Re: AYUDA !!! Programa calcula raices n-esimas Publicado por: diskontrol en 24 Febrero 2013, 00:42 am ¿Has añadido el parámetro -lm al compilar?
Título: Re: AYUDA !!! Programa calcula raices n-esimas Publicado por: Ensslin 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 Título: Re: AYUDA !!! Programa calcula raices n-esimas Publicado por: Ensslin en 24 Febrero 2013, 00:58 am ¿Has añadido el parámetro -lm al compilar? Creo que no, voy a ver Título: Re: AYUDA !!! Programa calcula raices n-esimas Publicado por: Ensslin 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
Título: Re: AYUDA !!! Programa calcula raices n-esimas Publicado por: pacoperico 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[]) { 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; } Título: Re: AYUDA !!! Programa calcula raices n-esimas Publicado por: Ensslin 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
Título: Re: AYUDA !!! Programa calcula raices n-esimas Publicado por: leosansan 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
Saluditos!. |