Double en C

Résolu/Fermé
jet - 16 avril 2009 à 10:23
 Loic - 22 avril 2009 à 17:10
Bonjour,
Alors voilà, je commence en c (enfin g deja quelques bases) mais j'ai un gros probleme je dois faire un prog dont l'énoncé est le suivant:
Exercice 2 Le nombre ! peut ˆetre approche en utilisant la suite de Leibnitz
:pi/4=1-1/3+1/5-1/7 .......

Supposons que l’on veuille calculer ! avec une precision p. On est assure
d’obtenir une precision d’au moins p si le dernier terme ajoute a la somme
est inferieur a p.
Quel type de boucle vous semble le plus approprie pour calculer ! ? ´ Ecrire
une fonction prenant en parametre un double representant la precision et qui
calcule une valeur approchee de pi


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

int leibniz(double p)
{double pi;double som;double div;int i;
i=1;
som=1;
div=1/i;
while (div<p);
{i=i+2;
som=(som-(div));}
if ((i/2)==0);
pi=-4*som; //en fonction du nombre on fera -4 ou 4 seulement
printf("la valeur est %f",pi);
return 0;
}

int main()
{ float p;
p=lire_double(*lf);
leibniz(p);
return 0;}

Le probleme est dans mon lire double qui n"existe pas et si je lui dis de lire un réel alors le type de variable ne correspond pas !
Est ce que que quelqu'un saurait m'aider ... je suis dépassée
Merci
A voir également:

8 réponses

Tiens bizarre le meme programme que j ai du faire pour ce vendredi, je trouve ton programme bien trop complexe par rapport a ce qui est demandé et beaucoup trop de chose en trop, de plus tu utilise lecture.h, mais cela fonctionne seulement pour lire un entier donc ne peux pas fonctionné ici a moins que tu le modifis, donc utilise des scanf, ça sera mieux je pense pour toi
1
Tu veux saisir un 'double', alors autant déclarer un double, d'autant plus que c'est ce qu'attend ta fonction 'leibniz'):
double precision;
scanf ("%lf", &precision);

Il y a quelque chose qui ne va pas, c'est div = 1/i; la valeur de div ne changera plus... il faut faire cette opération dans la boucle ! Et il n'y a point de point-virgule à la fin du while !
D'autre part dans ton code, pour l'initialisation, autant écrire:
 
int i = 1;
double div, somme = 1;
C'est plus lisible et il est inutile de définir un 'pi'.
Bon courage.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
16 avril 2009 à 11:50
Salut,
Je vois plusieurs erreurs.
Dans le main :
Tout d'abord, pourquoi mettre float p, alors que tu lis un double et que ta fonction leibniz prend en arguments un double ? Mets plutôt double p..
En suite, tu nous as pas mis le prototype de lecture_double(), donc je ne peux pas te dire ce qu'il faut mettre en arguments (peut-être rien d'ailleurs, car je ne vois pas le genre d'informations utiles).

Dans la fonction leibiniz :
div=1/i; 1 et i sont des entiers, donc div contiendra 0.0. Il faut plutôt calculer 1.0/i.
som=(som-(div)); Ca n'est pas une erreur, mais les parenthèses sont complètement inutiles.
if ((i/2)==0); Attention au point-virgule. Il ne faut pas en mettre, sinon les instructions après ne seront pas tributaires de la condition. Que veux-tu dire algorithmiquement ?
De plus, ne mets pas de point-virgule à la fin de ton while, sinon aucune instruction ne sera traitée en boucle. Et enfin, aucune des variables pi et div conditionnant l'arrêt de ta boucle while ne sont changées dans le bloc. => risque de boucle infinie.

Cdlt
0
Tout d'abord merci pour vos réponses.
Voici le résultat après erreurs de synthaxe corrigées. Ce que j'ai fait c'est calculé la fameuse somme tant que la précision n'est pas atteinte , mais maintenant toujours le même bug avec lire double il me dit que lire double n'est pas défini ... (undefined reference to lire_double()) ....


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

int leibniz(double p)
{
double pi;
double som;
double div;
int i;
i=1;
som=1;

while (div<p)
{
div=1/i;
i=i+2;
som=(som-(div));
}
pi=4*som;
if ((i/2)==0);
pi=-4*som;
printf("la valeur est %f",pi);
return 0;
}

int main()
{
double p;
p=lire_double();
leibniz(p);
return 0;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
16 avril 2009 à 20:07
Oui mais je ne connais toujours pas le prototype de lire_double. Sans ça je ne peux pas t'aider.
Ensuite il y a toujours le problème de div=1/i;. Pour la solution, relis mon post précédent.
Ensuite i, va augmenter à chaque itération, donc div va diminuer. Or la condition d'arrêt est : div>=p.
Donc il y a un souci à ce niveau-là aussi.

if ((i/2)==0);
Voire remarque dans mon précédent post.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Oui merci tu as raison c'est inférieur ou égal.Merci
Par contre il faudrait que j'écrive moimême le processus pour liire un double ? Parce que j'utilise lire_entier et lire_reel avec lecture.h sans probleme, j'ai pensé que lire_double marcherais .... ce serait trop facile.
Y aurait il une solution pour arriver à la même fin par un autre moyen ? C'est à dire que l'utilisateur rentre un double (O,OO1 ) par exemple et que cela fonctionne?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
17 avril 2009 à 00:40
T'as le droit d'ouvrir ton fichier lecture.h ;-))). Tu verras le prototype des fonctions proposées. S'il n'y a rien concernant double, prend lire_float. Il y aura conversion implicite du float vers le double.
0
Voici le resultat et ... ca ne marche toujours pas je comprends pas manuellement ca marche (si je prends un stylo papier et que j'execute j'arrive au bon résultat. Est ce qie quelqu'un verrait ,,, je suis desesperée parce que je suis sur que c'est une erreur débile mais jla vois pas ..?(Je pense que c'est au nivo de div que c'est pas bon car lorsque je demande la valeur de div c'est toujours 0.000).MErci

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

int leibniz(double p)
{
float var;
float som;
float div;
int i;
float x;
x=1/p;
i=3;
som=1;
var=-1;
div=1.0/i;

while ((div)>= p);
{ som=som+var*(1.0/i);
var=-var;
i=i+2;
div=1/i;

}
printf("la valeur est %f",som);

return 0;

}

int main()
{
float n;
n=lire_reel();
leibniz(n);
return 0;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840 > jet
17 avril 2009 à 15:39
div=1/i;
Toujours la même erreur...
0
oui pardon je l'avais corrigé mais ca ne marche toujours pas ....
#include <stdio.h>
#include <stdlib.h>
#include <lecture.h>
#include <math.h>

int leibniz(double p)
{
float var;
float som;
float div;
float i;
float x;
i=1.0;
som=1;
var=-1;
div=1.0/i;

while ((div)> p);
{
div=1.0/i;
som=som+var*div;
i=i+2;
var=-var;
printf("la valeur est %f",4*som);

}
return 0;

}

int main()
{
float n;
n=lire_reel();
leibniz(n);
return 0;
}
0
Ca marche !!!!!! je sais pas ce que j'ai changé mais cté bien les 1.0 ...mais je pense aussi que j'avais mis un point virgule a while aussi .. MERCI BEAUCOUP en tout cas !!!
#include <stdio.h>
#include <stdlib.h>
#include <lecture.h>
#include <math.h>

int leibniz(double p)
{
float var;
float som;
float div;
float i;
float x;
i=3;
som=1;
var=1;
div=1.0/i;

while (div>= p)
{
var=-var;
som=som+var*div;
i=i+2;
div=1.0/i;

}
printf("la valeur est %f",4*som);
return 0;

}

int main()
{
float n;
n=lire_reel();
leibniz(n);
return 0;
}
0