Quel résultat pour ce programme ?


#1

Bonjour ,
Je ne saisis pas la totalité du cheminement de ce code . Dabord le code :

#include  <stdio.h>
          int main(){
          int n=0;
         do
          { if(n%2==0) {printf("%d est pair\n",n);
                                 n+=3;
                                continue;
                                }
          if(n%3==0) {printf("%d est multiple de 3\n",n);
                                  n+=5;
                              }
          if(n%5==0){printf("%d est multiple de 5\n",n);
                              break;
                            }
          n+=1;
          }while(1);
    }

Je comprends ceci :
Je pars avec n=0 , je rentre dans la boucle do while .
Si le modulo est egale a 0 , j’affiche le printf et j’additionne n a 3 . C’est le cas donc la valeur n devient 3 .
Mais quel est le role de l’instruction continue ?( etait elle nécéssaire ?)Est ce que ca veut dire que pour ce if on passe directement au prochain if sans passer par le : n+= 1; (fin du code)
Enfin j’ai compris aussi que la condition while etait vrai donc , la boucle ne s’arretera qu’au break .
Pouvez vous m’eclairer d’avantage sur le deroulement de ce code ?
Merci


#2

Oui, ça veut dire qu’on saute à l’itération suivante de la boucle tout de suite.

Oui, c’est exactement ça.

0 est pair
3 est multiple de 3
8 est pair
12 est multiple de 3
18 est pair
21 est multiple de 3
26 est pair
…

J’avoue que je comprend pas bien le but de ce programme et j’ai bien l’impression qu’il ne s’arrêtera jamais.


#3

Et la réponse est: effectivement, elle saute les if suivants dans la boucle, mais ce ‘continue’ ne se déclenche que pour n=0 en évitant, aprés avoir dit que 0 était pair, de préciser aussi qu’il est divisible par 3 et 5.
Aprés, ce ‘continue’ n’est plus nécessaire, car plus jamais la boucle ne donne une valeur paire à n, les incréments de n dans la boucle étant pairs et n devenant impair avec n=3 aprés la première itération est forcément toujours impair aprés chaque itération.

Non @Almtesh , tu as oublié le +=1 de fin de boucle do, pour n=3 (il n’y a ni break ni continue), ce qui fait passer à n=9 l’itération suivante.
Ca donne donc:
0 est pair
3 est multiple de 3
9 est multiple de 3
15 est multiple de 3
20 est multiple de 5
(début de cycle)
21 est multiple de 3
27 est multiple de 3
33 est multiple de 3
39 est multiple de 3
45 est multiple de 3
50 est multiple de 5
(nouveau cycle)
51 est multiple de 3
57 est multiple de 3
63 est multiple de 3
69 est multiple de 3
75 est multiple de 3
80 est multiple de 5
(etc…)


#4

Ok tout dabord , je vous remercie tous les deux d’avoir pris le temps de toutes ces explications .
Lorsque l’on passe pour la 3 eme fois dans cette boucle avec n ayant la valeur 15 :

On affiche que 15 est un multiple de 3 et , on rajoute 5 a la valeur de 15 . Mais pourquoi n ne prend t il pas une valeur de 1 supplémentaire avec le : n+= 1 de la fin de code ?
La valeur de n ne devrait elle pas etre de 21 plutot que 20 ?


#5

il rentre n=15, affiche “15 est multiple de 3”, puis ajoute 5.
Par contre, et c’est la que tu ne vois pas, il n’y a ni break ni continue, donc il passe au test modulo 5, puis affiche “20 est multiple de 5”.
Et c’est là que je me suis planté, j’ai oublié qu’il y avait un break, donc il sort direct de la boucle et n’effectue jamais le +=1.
Donc la bonne sortie complète est juste:
0 est pair
3 est multiple de 3
9 est multiple de 3
15 est multiple de 3
20 est multiple de 5


#6

Parfaitement compris cette fois . Encore merci !


#7

par contre , c’est dommage de ce quitter comme ca ,une derniere pour la route ! :grinning:
J’ai un peu de mal a comprendre ce que peux produire ceci :
int i,n;
for(i=0, n=50; n>10; i++, n-=i){}
printf(“A : i=%d, n =%d\n”,i,n);


#8

A : i=0, n =50
A : i=1, n =40
A : i=2, n =30
A : i=3, n =20


#9

Désolé de prendre un peu plus de ton temps , j’ai compris que l’on partait de i=0 et n=50 et que n va en decroissant dans la boucle jusqu’a 10 mais je ne comprends pas la suite et comment tu as obtenu ces résultats . Peux tu decomposer ?
En fait le resultat du bouquin est :
A: i = 9, n = 5


#10

Bah j’ai zappé le n-=i, j’ai lu n-=10.
Donc je recommence, ça donne plutôt:
A : i=0, n =50
A : i=1, n =49
A : i=2, n =47
A : i=3, n =44
A : i=4, n =40
A : i=5, n =35
A : i=6, n =29
A : i=7, n =22
A : i=8, n =14
A : i=9, n =5


#11

Ok je te remercie . J’ai compris cette fois
Bon week-end


#12

(je rectifie les quotes et la lise en forme)

Simplement pour le plaisir de pinailler : il n’y a qu’une ligne émise par le programme, l’instruction printf n’est pas à l’intérieur de la boucle for.
À titre d’exemple que donnerait

int i,n;
for(i=0, n=50; n>10; i++, n-=i){}
n = printf("A : i=%d, n =%d\n",i,n);
n = printf("A : i=%d, n =%d\n",i,n);

?
Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة


F. Petitjean
Ingénieur civil du Génie Maritime.

« On ne perd pas son temps en aiguisant ses outils. »
Proverbe français

« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » (R. Devos)


#13

Pas fait attention. C’est con.