TP : les boucles for#

Exercice 1 : comptons!#

  1. Exécutez les cellules suivantes et observez l’affichage produit :

#include <iostream>
using namespace std;
for ( int i = 0; i < 10; i++ ) {
    cout << i << endl;
}
  1. Remplacez int i = 0 par int i = 5 ci-dessous et exécutez; observez ce qui change :

for ( int i = 0; i < 10; i++ ) {
    cout << i << endl;
}
  1. Remplacez i < 10 par i <= 10 ci-dessous et exécutez; observez ce qui change :

for ( int i = 0; i < 10; i++ ) {
    cout << i << endl;
}
  1. Remplacez i++ par i = i + 2 ci-dessous et exécutez; observez ce qui change :

for ( int i = 0; i < 10; i++ ) {
    cout << i << endl;
}

Rappel : l’instruction i++ est une écriture simplifiée pour i = i + 1.

  1. Copiez l’instruction for ci-dessous dans la cellule suivante, et remplacez les trois « ? » par les valeurs appropriées pour afficher les entiers pairs entre 0 et 20 (0,2,4,…,20) :

    for (int i = ?; i <= ?; i = ? ) {
        cout << i << endl;
    }
    
/// BEGIN SOLUTION
for (int i = 0; i <= 20; i = i + 2 ) {
    cout << i << endl;
}
/// END SOLUTION
  1. Pour chaque exemple ci-dessous, écrivez une boucle for qui affiche les nombres indiqués dans l’ordre donné :

0, 3, 6, 9, 12 :

/// BEGIN SOLUTION
for (int i = 0; i < 13; i+=3) {
    cout << i << endl;
}
/// END SOLUTION

20, 21, 22, 23, 24, 25 :

/// BEGIN SOLUTION
for (int i = 20; i < 26; i++) {
    cout << i << endl;
}
/// END SOLUTION

10, 9, 8, 7, 6, 5, 4, 3, 2, 1 :

/// BEGIN SOLUTION
for (int i = 10; i > 0; i--) {
    cout << i << endl;
}
/// END SOLUTION

2, 4, 8, 16, 32 :

/// BEGIN SOLUTION
for (int i = 2; i < 33; i = i*2) {
    cout << i << endl;
}
/// END SOLUTION

Exercice 2 : accumulons !#

  1. Observez les cellules suivantes et devinez la valeur finale de la variable c; puis exécutez pour vérifier.

int c = 0;
for (int i = 0; i < 6; i++) {
    c = i + c;
}
c

Entre c et i quelle variable sert de compteur? d’accumulateur?

/// BEGIN SOLUTION

  • i sert de compteur

  • c sert d’accumulateur

/// END SOLUTION

  1. Recopiez la boucle ci-dessous puis modifiez la condition d’arrêt pour que la variable c soit égale à \(36\) après l’exécution :

c = 0;
/// BEGIN SOLUTION
for (int i = 0; i < 9; i++) {
/// END SOLUTION
    c = c + i;
}
c   // doit valoir 36

La cellule suivante contient des tests automatisés; nous reviendrons dessus plus en détails par la suite; pour le moment, vous pouvez juste exécuter la cellule et vérifier qu’il n’y a pas de message d’erreur.

CHECK( c == 36 )
  1. En vous inspirant de l’exemple ci-dessus, écrivez ci-dessous un programme qui calcule la valeur de \(n! = 1×2×\cdots×n\), en utilisant une variable f comme accumulateur :

int n = 5;
/// BEGIN SOLUTION
int f = 1;
for (int i = 1; i <= n; i++) {
    f = f * i;
}
/// END SOLUTION
f // 120 pour n = 5
CHECK( f == 120 )
  1. Reprenez votre programme pour le mettre sous la forme d’une fonction qui calcule \(n!\) :

int factorielle(int n) {
    /// BEGIN SOLUTION
    int f = 1;
    for (int i = 1; i <= n; i++) {
        f = f * i;
    }
    /// END SOLUTION
    return f;
}

L’appel suivant à votre fonction devrait renvoyer 120 :

factorielle(5)
  1. Vérifiez votre fonction grâce aux tests suivants (ils doivent tous afficher true) :

factorielle(5) == 120
factorielle(6) == 720
factorielle(10) == 3628800
factorielle(1) == 1
factorielle(0) == 1 // convention mathématique

Tests automatisés :

CHECK( factorielle(0) ==   1 );
CHECK( factorielle(1) ==   1 );
CHECK( factorielle(2) ==   2 );
CHECK( factorielle(3) ==   6 );
CHECK( factorielle(4) ==  24 );
CHECK( factorielle(5) == 120 );
/// BEGIN HIDDEN TESTS
CHECK( factorielle(8) == 40320);
/// END HIDDEN TESTS

Exercice 3 : Utilisation de la boucle for dans Laby#

  1. Relevez le défi Laby ci-dessous si vous ne l’avez pas encore fait en Semaine 1 :

#include <laby/global_fr.hpp>
LABY("counting-the-rocks")
/// BEGIN SOLUTION
/** Prend le caillou qui est devant et pose le derrière
 **/
void deplace_caillou_derriere() {
    prend();
    avance();
    gauche(); 
    gauche();
    pose();
    gauche();
    gauche();
}
/// END SOLUTION
debut();
/// BEGIN SOLUTION
avance();
// Avance et pose les cailloux derrière (7 fois)
for (int i = 0; i < 7; i++) {
	deplace_caillou_derriere();
}
// Tourne à gauche puis avance (2 fois)
for (int i = 0; i < 2; i++){
    gauche();
    avance(); 
    avance();
}
// Tourne à droite puis avance à travers les cailloux (4 fois)
droite();
for (int i = 0; i < 4; i++) {
	deplace_caillou_derriere();
}
// Tourne à droite puis avance à travers les cailloux (5 fois)
droite();
avance();
for (int i = 0; i < 5; i++) {
	deplace_caillou_derriere();
}
gauche();
avance(); 
avance();
ouvre();
/// END SOLUTION
CHECK( a_gagne() );
  1. ♣ Écrivez une fonction carre(int L) qui prend en paramètre un entier L, et qui fait faire à la fourmi une trajectoire carrée de côté L cases. La fourmi doit revenir à la case de départ à la fin de la fonction.

#include <laby/global_fr.hpp>
LABY_BAR(
u8"o o o o o o o o o o o o\n"
u8"o . . . . . . . . . . o\n"
u8"o . . . . . . . . . . o\n"
u8"o . . . . . . . . . . o\n"
u8"o . . . . . . . . . . o\n"
u8"o . . . . . . . . . . o\n"
u8"o . . . . . . . . . . o\n"
u8"o . . . . . . . . . . o\n"
u8"o . . . . . . . . . . o\n"
u8"o . . . . . . . . . . o\n"
u8"o ↑ . . . . . . . . . o\n"
u8"o o o o o o o o o o o o\n"
)
// Entrée : un entier L, correspondant à la longeur d'un côté de la trajectoire.
// Sortie : aucune, déplace la fourmi selon un carré de longueur L
//BEGIN SOLUTION
void carre(int L){
    if (L > 0) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < L-1; j++) {
                avance();
            }
            droite();
        }
    }
}
//END SOLUTION
debut();
carre(0) // La fourmi ne fait rien
debut();
carre(1) // La fourmi doit faire un tour sur elle-même
debut();
carre(5) // la fourmi doit parcourir un carré de longueur 5 cases

Bilan#

Dans cette feuille, vous avez mis en pratique la boucle for pour compter et pour accumuler. Vous avez maintenant les outils requis pour passer à la suite du TP.