[C] Aide pour comprendre un petit code

Aide pour comprendre un petit code [C] - C - Programmation

Marsh Posté le 04-03-2013 à 04:27:50    

En vue d'un examen prochain je m’entraîne sur des exercices et je bute littéralement sur celui ci  

Code :
  1. void decompose (long n) {
  2. long d;
  3. for (d = 2; d * d <= n;)
  4. if (n % d == 0) {
  5. printf (" %d", d);
  6. n = n / d;
  7. }
  8. else d++;
  9. printf (" %d\n", n);
  10. }


 
L'appel => decompose(200);  affiche dans la console : 2 2 2 5 5
Mon premier problème : je ne comprends pas le rôle d'un "for" sans crochet et je ne vois pas sa portée.
Deuxième problème : je pense avoir compris d'où viennent les 2 2 2 mais je ne comprends pas les 5
Voici mon raisonnement :

d=2   2x2 < 200
 si ( 200 % 2 == 0) (vrai)
 on affiche d (2)
 et on fait n = 200/2 (n=100)
 si ( 100 % 2 == 0) (vrai)
 on affiche d (2)
 et on fait n = 100/2 (n=50)
 si ( 50 % 2 == 0) (vrai)
 on affiche d (2)
 et on fait n = 50/2 (n=25)
 si (25 % 2 == 0) (faux) il reste 1


Ensuite c'est le brouillard, merci pour toute aide

Reply

Marsh Posté le 04-03-2013 à 04:27:50   

Reply

Marsh Posté le 04-03-2013 à 06:17:44    

Salut caps lock,
 
Pour ton premier problème (portée du for), je pense que c'est surtout là pour t'embrouiller :D . Quand tu ne mets pas les crochets { } la boucle for prend le prochain statement (et non la prochaine ligne). Ici il va prendre for { if(...) else(...) }
Autrement dit, c'est la même chose que d'écrire ceci :

Code :
  1. void decompose (long n) {
  2.    long d;
  3.    for (d = 2; d * d <= n;) {
  4.       if (n % d == 0) {
  5.          printf (" %d", d);
  6.          n = n / d;
  7.       }
  8.       else d++;
  9.    }
  10.    printf (" %d\n", n);
  11. }


 
Par rapport à ton deuxième problème, il suffit de lire ce que fait le if puis le else.
En gros ce serait :
n = 200, divisible par d=2 ? (if) -> oui, donc n = 100, afficher d = 2.
n = 100, divisible par d=2 ? (if) -> oui, donc n = 50, afficher d = 2.
n = 50, divisible par d=2 ? (if) -> oui, donc n = 25, afficher d = 2.
n = 25, divisible par d=2 ? (if) -> non, donc incrémenter d, d = 3.
n = 25, divisible par d=3 ? (if) -> non, donc incrémenter d, d = 4.
n = 25, divisible par d=4 ? (if) -> non, donc incrémenter d, d = 5.
n = 25, divisible par d=5 ? (if) -> oui, donc n = 5, afficher d = 5.
Sortie de boucle car d * d > n, afficher n = 5 (le reste)
 
J'espère que j'ai été clair.

Reply

Marsh Posté le 04-03-2013 à 06:41:51    

Excellent merci pour le détail

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed