Problème d'appel de fonction [Résolu]

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
2247
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 octobre 2020
115
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
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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