abcdAlgos

abcdAlgosCollectif d'auteurs [x]

Un tutoriel pour utiliser des boucles..

Objectif

Le but de ce tutoriel d'apprendre à utiliser des boucles. Il faut déjà savoir utiliser l'interface, se servir de variables, avoir découvert l'instruction conditionnelle, et s'être familiarisé avec les fonctions.

Introduction

  1. Imprimer 10 fois la même chose.

    Supposons vouloir imprimer "Hello world" 10 fois, bien sûr, nous pouvons écrire :
    void main() {
        println("Hello World !");
        println("Hello World !");
        println("Hello World !");
        println("Hello World !");
        println("Hello World !");
        println("Hello World !");
        println("Hello World !");
        println("Hello World !");
        println("Hello World !");
        println("Hello World !");
    }
    mais si nous devons écrire un code qui doit répéter un million de fois une action, nous ne sommes pas rendus ! Regardons alors cette autre solution :
    void main() {
        int n = 0;
        while( n < 10) {
            println("Hello World !");
            n = n + 1;
        }
    }
    • nous avons défini un compteur n qui initialisé à la valeur zéro (int n = 0;),
    • puis, tant qu'il est plus petit que 10 (while( n < 10)),
    • nous imprimons "Hello world",
    • et incrémentons (c'est-à-dire lui ajoutons 1) sa valeur (n = n + 1;).
    Non sans bien noter le jeu d'accolades { } pour ouvrir et fermer void main() et while( n < 10). Nous voilà avec un mécanisme qui va nous permettre de répéter autant de fois que nécessaire une action.
  2. Tous les ingrédients des algorithmes.

    Il y a quelque chose de formidable ici : avec des variables et des fonctions, une séquence d'instruction, l'instruction conditionnelle, et une instruction1 pour faire des boucles, nous avons tous les ingrédients pour programmer efficacement tous les algorithmes possibles! Il y a bien entendu une subtilité ici : les fonctions doivent pouvoir s'appeler elles-même, c'est à dire être recursives2. Mais la plupart des programmes que nous avons besoin de faire n'ont pas besoin de fonctions récursives et se programment très bien avec les ingrédients proposés ici, grâce aux boucles.

Travail proposé

  1. A nous de jouer.

    Recopier le 2ème programme proposé ci-dessus et :
    • Le modifier pour imprimer 11 fois le "Hello World !".
    • Puis partir de n = 1 (donc écrire int n = 1;) et le modifier pour écrire 8 fois "Hello World !".
    • Retirer la ligne n = n + 1;: que se passe t'il3?
    • Remplacer la ligne n = n + 1; par n = n - 1; et expliquer ce qui se passe.
  2. Comprendre quelques exemples de boucles.

    Pour chacun des bouts de codes suivants, expliquer ce qui est calculé (vous pouvez essayer les codes si besoin) :
    • Combien de fois s'exécute cette boucle ?
      int n = 5;
      while( n >= 0) {
          println("Hello World !");
          n = n - 1;
      }
    • Combien de fois s'exécute cette boucle ?
      int n = 0;
      while( n == 5) {
          println("Hello World !");
          n = n + 2;
      }
    • Que calcule cette fonction ?
      int mul(int x, int y) {
          int r = 0;
          while( x > 0) {
              r = r + y;
              x = x - 1;
          }
          return r;
      }
  3. Programmer quelques boucles.

    :
    • Programmer une boucle qui imprime tous les nombres impairs de 1 à 39 inclus, avec l'instruction println("n = " + n);
    • Le nombre d'or est défini par une suite (qui n'est pas celle de Fibonacci) de la forme : r = 1 + 1 / r initialisée avec r = 1. Ecrire une boucle qui part de r = 1 et calcule 30 fois r = 1 + 1 / r en imprimant à chaque fois r (par exemple avec l'instruction println("r = " + r); et commenter le résultat. Comparer avec les valeurs du nombre d'or connues par ailleurs.
    • Avec votre professeur (ou quelqu'un pour vous aider si besoin) essayer de calculer les 10 premières décimales de PI par la méthode d'Archimède, et discuter le résultat.
  4. D'autres formes de boucles.

    Les langages informatiques proposent d'autres formes de boucles1, qui sont équivalentes à la construction while apprise ici, mais peuvent être plus pratiques à utiliser. En voici un exemple
    • La boucle for permet de rassembler en une ligne la boucle avec un compteur que nous avons découvert ici. Le même programme peut s'écrire :
      for(int n = 0; n < 10; n = n + 1) {
          println("Hello World !");
      }
      ce qui est plus concis ... mais ne change rien sur le fond.
    A partir du travail précédent expliquer quelle est la boucle while équivalente.

Remarques

  1. D'autres formes de boucles.

    Les langages informatiques proposent d'autres formes de boucles, qui sont équivalentes à la construction while apprise ici, mais peuvent être plus pratiques à utiliser. En voici deux exemples :
    • La boucle for permet de rassembler en une ligne des boucles complexes. La construction :
      for(initiatisation_de_la_boucle; test_de_fin_de_boucle; increment_avant_de_recommencer_la_boucle) {
          corps_de_la_boucle
      }
      est en fait très générale.
    • L'itérateur foreach permet d'énumérer tous les éléments d'une liste sans ce soucier d'utiliser un while, par exemple (attention ce n'est PAS du Java'sCool !)
      foreach(nom, liste_de_noms) {
          envoyer_un_mail(nom);
      }
      permet dans d'autres langages comme le PHP de, par exemple ici, poster un mail à toute une liste de noms.
    En bref, nous avons d'autres façons de faire mais nous connaissons déjà les fondements dont nous avons besoin.
  2. A propos de fonctions récursives.

    Imaginons une fonction A qui appelle, selon ses entrées, une fonction B qui appelle elle-même la fonction A ou tout autre combinaison telle que, finalement et selon ses entrées, la fonction A se rappelle elle-même. On dit qu'elle est récursive: cela peut donner des boucles infinies (donc des bugs !), ou des calculs très complexes et très intéressants ... et c'est plus compliqué que ce que nous pouvons découvrir ici, alors retenons juste deux choses:
    • Il faut éviter de définir des fonctions récursives, sauf dans les cas indispensables.
    • Il faut être prudent si c'est le cas, et bien comprendre la notion de boucle avant.
    .
  3. Arrêter un programme.

    C'est le bouton qui permet d'arrêter un programme qui boucle indéfiniment.