Cosinus

anek971 Messages postés 34 Date d'inscription dimanche 23 novembre 2003 Statut Membre Dernière intervention 6 juillet 2008 - 11 déc. 2003 à 04:56
anek971 Messages postés 34 Date d'inscription dimanche 23 novembre 2003 Statut Membre Dernière intervention 6 juillet 2008 - 11 déc. 2003 à 14:36
Bonjour ,ben avt de demander de l'aide j'ai chercher sur le forum mais ya pas le programme en c.
Et en faite c juste pr une verification car mon programme ne marche po et j'ai exam vendredi :).
sachant ke l'on doit effectuer le calcul suivant (-1)^n*x^2n/(2n)! tant que <= a epsilon=0.00001
#include<stdio.h>
double puis(double x, int n)
{
double a,y;
int b,i;
a=x;
b=n;
y=1.0;
i=0;
if(b==0)
return 1;
while(i<b)
{
y=y*a;
i++;
}
int fact (int b)
{
int a,r,i;
i=1;
r=1;
a=b;
if(a==0)
return 1;
while (i<b)
{
r=r*i;
i++;
}
return r;
}
int main (void)
{
double x,y,epsilon;
int n;
n=1;
y=1;
printf("tapez la valeur de x:\);
scanf("%lf",&x);
while(puis(-1,n)*puis(x,2*n)/fact(2*n)<=epsilon)
{
y=y+puis(-1,n)*puis(x,2*n)/fact(2*n);
n++;
}
printf("cos(%lf)=%lf",x,y);
}
pitié aidez moi et si un mail comme le mie a déjà été posté mille excuse mais pitiez de l'aide.

2 réponses

garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
11 déc. 2003 à 08:53
1) Dans mes sources tu trouveras comment on calcule un cos, fact et pow (la source intitulée qqc comme "MATH.H reprogrammé")

2) Ton code est rempli de fautes...ta fonction puissance est fausse (elle renvoie en fait x^(N-1) ). Tes fonctions sont mal concues puisque tu utilises while à tout bout de champ ce qui n'est pas la bonne solution...
ton test <=epsilon devrait être >epsilon : tant qu'on est superieur à epsilon on cherche plus petit.

Bref...voila comment tu aurais pu faire (j'ai refait tes fonctions puis avec fact mais j'ai laissé l'esprit de ton main)

double puis(double x, int n)
{
double res = 1;
for (int i=0; i<n; i++)
res *= x;
return res;
}

int fact (int b)
{
int res = 1;
for (int i=1; i<=b; i++)
res *= i;

return res;
}

double fabs(double x)
{
if (x<0)
return -x;
return x;
}

int main (void)
{
double x,y,epsilon;
epsilon = 0.00001;

int n;
n=0;
y=0;
printf("tapez la valeur de x:");
scanf("%lf",&x);

while(fabs(puis(-1,n)*puis(x,2*n)/fact(2*n))>epsilon)
{
y=y+puis(-1,n)*puis(x,2*n)/fact(2*n);
n++;
}
printf("cos(%lf)=%lf\nfact 5=%lf",x,y, puis(2,10));

return 0;
}

Sur le principe il faudrait aussi éviter de calculer 2 fois puis(-1,n)*puis(x,2*n)/fact(2*n). Et donc de le mettre dans une variable mais bon...je ne vais pas refaire ce qui est deja dans mes sources !

Je vais te donner un bon conseil pour savoir quand il faut utiliser while et quand il faut utiliser for :
On utilise for "quand on sait d'où on part et où on termine". Sinon on utilise while.
Par exemple pour la factorielle, onsait quand par de i=1 et qu'on s'arrete à i=N...donc for
Pour la puissance on sait qu'on va faire N itérations (donc on part de 0 et on va jusqu'à N-1 par exemple)
Par contre on ne peut pas savoir à l'avance combien de temps on va mettre pour arriver à moins de epsilon => il faut utiliser while.

Voila. En esperant que ces conseils te fassent reussir ton exam !

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
anek971 Messages postés 34 Date d'inscription dimanche 23 novembre 2003 Statut Membre Dernière intervention 6 juillet 2008
11 déc. 2003 à 14:36
Merci beaucoup garslouche ;).
j'avoe ca fait pas ltps ke je programme bon ok ca se voit lol.
mais le truc c ke ds mon enoncé j'étais obliger d'utiliser while d'ou mon prog.(Y avais tant def aute ke ca !!arfffff).
En tout cas encore merci.
0
Rejoignez-nous