Programmation debutant en C

Résolu/Fermé
matthymatt - 28 sept. 2009 à 18:46
 matthymatt - 29 sept. 2009 à 02:14
Bonjour,
J'ai un exercice que je n'arrive pas a résoudre...

Exercice 3 :

En utilisant la boucle itérative la plus pertinante, proposer un programme en langage C qui permet de calculer Un avec n entier saisie par l'utilisateur (pout tout n>0) :

si n<=3 : Un = somme (2p)
si 3<n<=7 : Un = somme ((p-3)/(p+1)) (Toutes les somme vont de p a n)
si n>7 : Un = somme (2p-3)

Qu'est ce qui ne va pas dans mon programme?

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

int main()
{
int n,i;
double u=0;

do
{
printf("Faire la somme de combien de termes?\n");
scanf("%d",&n);
}while(n<=0);

for(i=1;i<=n;i++)
{
if(i<=3)
u=u+2*i;
else
if(3<i<=7)
u=u+(i-3)/(i+1);
else
u=u+2*i-3;
}

printf("La somme des %d premiers termes est de %lf",n,u);


return 0;
}
A voir également:

5 réponses

En fait, je précise que le probleme, c'est que si je rentre par exemple 6 (donc n=6), il me renvoie 12.
En fait, il me renvoie toujours 12 pour n>3 (c'est la valeure de u pour n=3)
Je pense qu'il y a un probleme a partir du else (ou du second if), mais je ne voie vraiment pas lequel!!)
Merci d'avance de vos reponses!
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
28 sept. 2009 à 19:38
Hello,
je vois deux erreurs.
D'abord, à la ligne 20 (d'après ton post)

if (3<i<=7)
Tu essayes de tester deux choses en même temps. Le premier test, 3<i, renvoie soit 0 soit 1 (le type booléen n'existe pas en C), et ensuite le deuxième test doit comparer soit 0 soit 1 avec 7. Résultat => toujours vrai !
C'est le genre d'erreur sournoise que le compilateur ne détecte pas :P Il faut utiliser &&

Ta deuxième erreur est plus une erreur de conception : ton programme ne fait pas ce que demande l'énoncé. L'énoncé demande :
1/ tester où est n par rapport à 3 et 7
2/ en fonction du résultat, faire une des trois sommes décrites.

Ton programme fait :
1/ commencer une somme à n tours
2/ à chaque tour, regarder où je suis par rapport à 3 et 7
3/ en fonction du résultat, ajouter une valeur donné par une des trois formules de somme décrites.

Je sais pas si j'explique bien mais j'espère que tu vois la différence ;)


Sinon y'a un truc pas clair dans l'énoncé tel que tu le donnes, « toutes les sommes vont de p à n », c'est comme ça en vrai ?
0
Ah ouais, merci pour le truc avec le if, il va falloir que j'essaie ca!

Concernant ta deuxieme remarque, le prof nous a expliqué que justement, contrairement a ce que l'on pourrait penser (et c'est d'ailleurs mal formulé je trouve), il faut regarder a chaque tour l'indice n, et calculer en fonction... C'est a dire tel que le programme est ecrit ici.

Enfin, concernant l'enoncé, je savais pas trop comment le tapper... En fait, dans l'enoncé, il y a le symbole Sygma, avec en dessous "p=1", et au dessus "n", c'est a dire "somme de 1 a n", mais c'était pas évident a formuler, et je m'en excuse!

Je souhaiterais rajouter une question : Est ce que ca marche quand j'écrit ca?
u=u+(i-3)/(i+1);
Je voudrais confirmation, comme quoi on peut utiliser / pour la division...

Merci pour tes conseils, je vais essayer ca de suite!
0
for(i=1;i<=n;i++)
{
if(i<=3)
u=u+2*i;
else
if(i<=7)
u=u+(i-3)/(i+1);
else
u=u+2*i-3;
}

Eh bien apres modification... Le progamme ne fonctionne toujours pas correctement... Il continue a m'afficher 12 pour tout n>3, ce qui est une abération!
U1 vaut 2
U2 vaut 6
U3 vaut 12
MAIS U4 vaut 12+1\5

Je pense qu'il y a un probleme dans la ligne 21 " u=u+(i-3)/(i+1);" est ce que le symbole "\" peut servir pour la division?

Merci d'avance pour vos reponses!
0

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

Posez votre question
Eh bien finalement, le probleme venait de la declaration des variables.
En effet, comme i est un entier, la division (i-3)/(i+1) est egalement declarée comme étant un entier!
Il suffisait donc de declarer i comme double ou comme float, et le probleme et résolu!

Merci beaucoup a groarh, sans qui une erreure aurait persister dans ce programme, et pour ces remarques pertinantes!

A bientot!
0