Bonjour,
Je travaille actuellement sur un projet de math, mon but ici est de coder une fonction logarithme sans faire appel à la bibliothèque <math.h>. Cependant dans mon programme je dois faire appel à d'autres fonctions que j'ai crée mais je n'arrive pas. Je ne trouve pas le problème, pourriez-vous m'aider ? Merci d'avance aux personnes qui me répondront.
Voici mon programme :
#include <stdio.h>
#include <stdlib.h>
double factorielle(double n)
{
double i;
double valeur = 1;
for(i= 1; i <= n; i++)
valeur = i;
return valeur;
};
double puissance (double n,int p)
{
int compteur;
double a;
a=n;
if(p==0)
{
a=1;
return a;
}
if(p==-1)
{
a=1/a;
return a;
}
if(p==1)
{
a=a;
return a;
}
if(p<0)
{
compteur=-1;
do
{
a=n;
compteur--;
}while (compteur>p);
a=1/a;
}
else
{
compteur=1;
do
{
a=an;
compteur++;
}while (compteur<p);
}
return a;
};
double expo(double x)
{
double n,nombre,fact,boucle,exp;
n=2;
fact = factorielle(n);
boucle=0;
do
{
fact = factorielle(n);
exp=exp+(puissance(nombre,n)/fact);
n=n+1;
boucle++;
}while (boucle<100);
exp=exp+1+nombre;
return expo;
}
int main ()
{
double x,mil,min,max,nombre;
printf("Donnez un nombre positif, nous calculerons son log\n");
scanf("%lf",&nombre);
x=nombre;
while (x<0)
{
printf("Ceci n'est pas un nombre positif\n");
printf("Donnez un nombre positif\n");
scanf("%lf",&x);
}
if (x<1)
{
x=1/x;
}
if (expo(x)>0)
{
min=0,max=x;
}
do
{
mil=(min+max)/2;
if(expo(mil)>x)
{
max=mil;
}
else
{
min=mil;
}
}while ((max-min)/mil>1e-6);
if (nombre<1)
{
mil=mil-1;
}
printf("Le Ln de %lf est %lf",nombre,mil);
return 0;
}
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023124 18 août 2020 à 17:45
Bonjour !
De ce que je vois:
a=a ne sert à rien ligne 34
an n'existe pas ligne 52
ligne 73, tu retournes le nom de la fonction (expo) au lieu de la variable exp
x n'est pas utilisé ligne 59, donc ta fonction expo ne risque pas de fonctionner
La fonction puissance me parait étrangement compliqué pour une fonction qui devrait te prendre à peine 3 lignes.
Factorielle est fausse :)
Ligne 15 et ligne 57 tu as un ";" inutile en dehors de ta fonction
Il faut penser à activer et regarder les erreurs de compilation ! (je me suis contenté ici de lister ce que le compilateur m'a dit).
En corrigeant tout ça, je n'ai plus qu'une looooongue liste de warning, mais le projet compile bien.
toto.c:34:6: warning: explicitly assigning value of variable of type 'double' to itself [-Wself-assign] a=a; ~^~ toto.c:59:20: warning: unused parameter 'x' [-Wunused-parameter] double expo(double x) ^ toto.c:68:24: warning: variable 'nombre' is uninitialized when used here [-Wuninitialized] exp=exp+(puissance(nombre,n)/fact); ^~~~~~ toto.c:61:18: note: initialize the variable 'nombre' to silence this warning double n,nombre,fact,boucle,exp; ^ = 0.0 toto.c:61:31: warning: variable 'exp' is used uninitialized whenever function 'expo' is called [-Wsometimes-uninitialized] double n,nombre,fact,boucle,exp; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ toto.c:68:9: note: uninitialized use occurs here exp=exp+(puissance(nombre,n)/fact); ^~~ toto.c:61:34: note: initialize the variable 'exp' to silence this warning double n,nombre,fact,boucle,exp; ^ = 0.0 toto.c:92:7: warning: variable 'max' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] if (expo(x)>0) ^~~~~~~~~ toto.c:98:14: note: uninitialized use occurs here mil=(min+max)/2; ^~~ toto.c:92:3: note: remove the 'if' if its condition is always true if (expo(x)>0) ^~~~~~~~~~~~~~ toto.c:78:23: note: initialize the variable 'max' to silence this warning double x,mil,min,max,nombre; ^ = 0.0 toto.c:92:7: warning: variable 'min' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] if (expo(x)>0) ^~~~~~~~~ toto.c:98:10: note: uninitialized use occurs here mil=(min+max)/2; ^~~ toto.c:92:3: note: remove the 'if' if its condition is always true if (expo(x)>0) ^~~~~~~~~~~~~~ toto.c:78:19: note: initialize the variable 'min' to silence this warning double x,mil,min,max,nombre; ^ = 0.0 6 warnings generated.