Problème d'appel de fonction

Signaler
-
 Liam22 -
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;
}

3 réponses

Messages postés
2223
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
3 septembre 2020
113
Bonjour
Pour la factorielle ce ne serait pas plutôt ainsi
double factorielle(double n)
{
    double i;
    double valeur = 1;
    for(i= 1; i <= n; i++)
            valeur =  valeur * i; 
    return valeur;
};

Messages postés
3817
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
2 septembre 2020
110
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.


Si tu as d'autres questions n'hésite pas.
Merci beaucoup! Je vais essayer de régler tout ça. Bonne soirée