Problème très bizarre avec la boucle for (C)

Résolu/Fermé
e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009 - 14 janv. 2009 à 01:58
e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009 - 14 janv. 2009 à 16:14
Bonjour,

Je vient de rencontrer un problème incompréhensible, bizarre, flou, dans l'IDE code: :blocks :

voilà un simple code que j'ai compilé chez moi:

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

int main(void)
{
long a,b=20;
for (a=0;b>10;a++)
{
b--;
}

for (a=0;b<10;a--)
{
b++;
}
printf("%ld",a);
return (EXIT_SUCCESS);
}
-----------------------------------------------------------------------------------------

Le problème c'est que la première boucle ne marche jamais !!! Le prinrf en bas renvoie toujours 0 quand b>10
(je l'ai mis sur 20 dans cet exemple)
Tandis que quand je met par exemple 'b=0' la deuxième boucle s'exécute normalement et le printf renvoie -10 !

J'ai essayé de changer l'ordre des boucles comme suit:

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

int main(void)
{
long a,b=0;
for (a=0;b<10;a--)
{
b++;
}
for (a=0;b>10;a++)
{
b--;
}
printf("%ld",a);
return (EXIT_SUCCESS);
}
-----------------------------------------------------------------------------------------
eh ben là c'est le contraire ça marche pas pour la première boucle (si b<10) mais quant je met b=20 la deuxième marche...

C'est toujours la deuxième boucle qui marche si vous voyez ce que je veux dire...
Je sais pas s'il y a un problème dans le code je peux faire des erreurs car je suis encore débutant mais le code me parait claire et logique comme même !
aidez moi SVP
A voir également:

5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
14 janv. 2009 à 02:14
J'ai juste regardé ton premier code. Et il n'y a aucun problème.
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
long a,b=20;
for (a=0;b>10;a++)
{
b--;
}

for (a=0;b<10;a--)
{
b++;
}
printf("%ld",a);
return (EXIT_SUCCESS);
} 

Première boucle for :
Tu mets la variable "a" à 0. b vaut 20.
La condition de fin de la boucle est b>10 et dans le corps on a la décrémentation de b.
La boucle aura donc 10 itérations. A la fin de la boucle b vaudra 10 (10>10 renvoie faux) et a vaudra 10.

deuxième boucle for :
Tu remets la variable "a" à 0. b vaut toujours 10.
La première condition b<10 échoue. Donc aucune itération.
La variable "a" reste donc à 0. Donc pas d'entourloupe de la part du compilateur ;)

Cdlt
0
Bonjour,
tout a fait d accord avec fiddy. Dasn ton cas j utiliserai les short plutôt que les long. ça serait plus rapide selon le compilo.
0
e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009 14
14 janv. 2009 à 13:34
Exact malheureusement ce n'est pas le cas la première boucle ne marche pas toujours pas dans le style de ce code, mais quant je met b=0 (La deuxième marche et a vaut -10 dans le premier code)

J'ai essayé d'autres compilateurs mais j'ai toujours le même problème !

essayez le code et vous verrez

Help please...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842 > e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009
14 janv. 2009 à 14:28
Mais si, la première boucle marche. Ce n'est pas parce que tu obtiens a=0 que la première boucle n'a pas fonctionné. C'est que dans ta deuxième boucle tu réinitialises a à 0. Après, le nombre d'itération de la deuxième boucle dépend en combien de temps la condition deviendra fausse. Donc comme l'a dit Char Snipeur, le problème ne vient pas du compilateur mais de ton algorithme.
Pour t'aider, tu peux afficher des :
puts("boucle 1");

dans le corps de ta boucle for1 et même astuce pour ta deuxième boucle for. Tu verras le nombre de fois qu'elles sont exécutées.
0
e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009 14 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
14 janv. 2009 à 15:20
mais non ! dans la deuxième boucle la condition est fausse car b=10 donc la boucle ne doit normalement pas s'exécuter j'ai même essayé de faire des printf comme ceci...

---------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
long a,b=20,n;
for (a=0;b>10;a++)
{
b--;
printf("%ld\n",a);
}
printf("%ld\n",b);
for (a=0;b<10;a--)
{
b++;
printf("%ld\n",a);
}
printf("%ld",a);
system("pause");
return (EXIT_SUCCESS);
}
---------------------------------------------------------------------------------------------
voilà ce que la console m'affiche:

--------------------------------------------------------------------------------------------
0
1
2
3
4
5
6
7
8
9
10
0
appuyer sur une touche pour continuer...
--------------------------------------------------------------------------------------------
les printf à l'intérieur de la boucle et juste avant la seconde boucle s'exécutent normalement. le printf à l'intérieur de la deuxième boucle ne s'exécute pas car la condition est fausse b=10 et la condition est si b<10

MAIS CE QUI EST VRAIMENT BIZARRE C'EST QUE LE PRINTF JUSTE APRÈS LA SECONDE BOUCLE AFFICHE a=0 DONC a A PRIS LA VALEUR 0 PAR LA MAGIE DE DAVID BLAINE !!!) j'aimerai juste savoir pourquoi on rencontre ce problème avec la boucle for ?!!

Avec la boucle de type while ça marche super nickel

--------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
long a=0,b=20,n;
while (b>10)
{
a++;
b--;
printf("%ld\n",a);
}
printf("%ld\n",b);
while (b<10)
{
a--;
b++;
printf("%ld\n",a);
}
printf("%ld\n",a);
system("pause");
return (EXIT_SUCCESS);
}

----------------------------------------------------------------------------------------------------------
La console affiche:

----------------------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
10
10
appuyer sur une touche pour continuer...
----------------------------------------------------------------------------------------------------------

Ce n'est pas de la folie ça ?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298 > e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009
14 janv. 2009 à 15:30
il est possible qu'il ne rentre pas dans la deuxième boucle, en effet, mais qu'en est il de l'initialisation de la variable ???
Si tu suit le cheminement de l'ordinateur (du moins je l'imagine ainsi)
- tu arrive sur une boucle for, tu regarde le premier argument, l'initialisation.
- tu effectue cette première commande, après tout pourquoi pas !?
- tu regarde la condition de sortie.
Pour moi, une boucle for() écrite ainsi for(x;y;z) est équivalente à une boucle while() suivante :
x;
while(1){
... //corps du for()
if(y) z;
else break;}
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
14 janv. 2009 à 14:18
comme dit fiddy, c'est logique !
Le problème viens de ton algorithme pas du compilateur.
Enfin, d'un autre coté j'ai aussi remarqué un comportement étrange des boucles for lorsque je commence avec une condition fausse. (i.e. : for(a=0;a<0;a++))
Dans ton cas, je pense qu'une boucle while serait plus clair.
dit nous plutôt quel résultat tu espère avoir.
0
papymucho Messages postés 140 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 1 novembre 2009 220
14 janv. 2009 à 15:29
le dernier 0 indique la valeur de a dans ta deuxième boucle... il n'éxécute la boucle qu'une fois, la condition n'est remplie qu'une fois... A savoir que la condition de fin de ta première boucle est b=11....

Oups la belle connerie que je viens de dire :p
0
papymucho Messages postés 140 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 1 novembre 2009 220
14 janv. 2009 à 15:35
Tu viens d'éditer ta réponse ggrr..... de toute façon j'ai dit n'importe quoi :p

Bah si c'est normal ;-)

{
long a=0,b=20,n;
while (b>10)
{
a++;
b--;
printf("%ld\n",a); //=1- 2 -3 - 4 5 - 6 - 7 - 8 - 9 - 10
}
printf("%ld\n",b); //=10
while (b<10) // CONDITION REMPLIE, tu ne rentre pas dans la boucle
{
a--;
b++;
printf("%ld\n",a);
}
printf("%ld\n",a); //=10
system("pause");
return (EXIT_SUCCESS);
}



donc tes print sont corrects.... Cordialement...
0

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

Posez votre question
e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009 14
14 janv. 2009 à 16:14
Merci super gentil de votre part les gars.
J'ai compris maintenant que l'initialisation dans la boucle for s'exécute toujours même si la condition est fausse comme l'a expliqué Loupius et Fiddy.

Merci de votre aide et bonne journée :)
0