A tutorial to learn loops.

Objective

The goal of this tutorial is to learn loops. You already need to know how to use the interface, how to use variables, know conditions, and be familiar with functions.

Introduction

  1. Print 10 times the same thing

    Let's say we want to print "Hello world" 10 times, well we can write:
    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 !");
    }
    but if we need to execute ten million times an action, that's gonna be hard. Let's check out another solution:
    void main() {
        int n = 0;
        while( n < 10) {
            println("Hello World !");
            n = n + 1;
        }
    }
    • we have defined a counter n initialized with value 0 (int n = 0;),
    • then, while it is over 10 (while( n < 10)),
    • we print "Hello world",
    • and increment the counter (that is add 1 to its value)
    Not forgetting the curly braces { } to open and close void main() and while( n < 10). We now have a program that will allow us to repeat an 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.