TP : boucles imbriquées

TP : boucles imbriquées#

Exercice :

Dans cet exercice, nous utiliserons des boucles imbriquées pour dessiner en laby. Commencez par exécuter les cellules ci-dessous pour comprendre ce que fait l’instruction seme().

#include "laby_draw.hpp"
LABY_VIDE();
debut();
avance();
avance();
seme();
avance();
avance();
seme();
seme();
seme();
avance();
avance();
seme();
avance();
seme();
  1. Définissez une fonction carre(int L) qui prend en paramètre un entier L, et qui fait dessiner à la fourmi un carré plein avec côtés de longueur L. Par exemple, pour \(L=5\), la fourmi dessinera :

    *****
    *****
    *****
    *****
    *****
    

    Indication

    Il serait naturel d’introduire des sous fonctions, par exemple pour dessiner une ligne. L’objectif de l’exercice étant de s’entraîner aux boucles imbriquées, on s’abstiendra de le faire.

#include "laby_draw.hpp"
LABY_VIDE()
// Entrée : un entier L, correspondant à la longueur d'un côté du carré
// Sortie : aucune; dessine un carré plein
void carre(int L){
    debut();
    /// BEGIN SOLUTION
	for ( int i = 0; i < L; i++ ) {
        // Dessine une ligne de L cailloux en restant sur le dernier
	    for ( int j = 0; j < L-1; j++ ) {
            seme();
            avance();
        }
        seme();
        // Demi-tour
		droite();
		droite();
        // Revient au point de départ
	    for ( int j = 0; j < L-1; j++ ) {
            avance();
        }
        // Se met en place sur la ligne suivante
		gauche();
		avance();
		gauche();
    }
    /// END SOLUTION
}
debut();
carre(0) // La fourmi ne fait rien
debut();
carre(1) // La fourmi dessine sur elle-même
debut();
carre(5) // La fourmi dessine un carré plein avec côtés de longueur 5
CHECK( a_obtenu(
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") )
  1. Même question, mais cette fois la fonction carre_vide(int L) doit dessiner un carré vide. Pour l’exemple, pour \(L=5\), la fourmi dessinera :

     *****
     *   *
     *   *
     *   *
     *****
    
#include "laby_draw.hpp"
LABY_VIDE()
// Entrée : un entier L, correspondant à la longueur d'un côté du carré
// Sortie : aucune; dessine un carré de côté de longueur L
void carre_vide(int L){
    /// BEGIN SOLUTION
    if (L == 0)
        return;
    if (L == 1) {
        seme();
        return;
    }
    for ( int i = 0; i < 4; i++ ) {
	    for ( int j = 0; j < L-1; j++) {
		    seme();
			avance();
		}
        droite();
    }
    /// END SOLUTION
}
debut();
carre_vide(0) // La fourmi ne fait rien
debut();
carre_vide(1) // Dessine un carré d'une seule case
debut();
carre_vide(5) // Dessin d'un carré vide avec côtés de longueur 5
CHECK( a_obtenu(
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") )
  1. Définissez une fonction triangle_rectangle(int h) qui, pour un entier positif \(h\) donné, dessine un triangle rectangle plein avec côtés de longueur \(h\). Par exemple, pour \(h=5\), la fourmi dessinera :

        *
        **
        ***
        ****
        *****
    
#include "laby_draw.hpp"
LABY_VIDE()
debut()
void triangle_rectangle(int h) {
    /// BEGIN SOLUTION
    for ( int i = 0 ; i < h ; i++ ){
        for (int j = 0 ; j < h - i ; j++){
            seme();
            avance();
        }
        gauche();
        gauche();
        for (int j = 0 ; j < h - i ; j++){
            avance();
        }
        gauche();
        avance();
        gauche();
        
    }
    /// END SOLUTION
}
debut();
triangle_rectangle(4)
debut();
triangle_rectangle(2)
debut();
triangle_rectangle(0)
debut();
triangle_rectangle(8)
CHECK( a_obtenu(
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") )
  1. ♣ Définissez une fonction triangle_isocele(int h) qui, pour un entier positif \(h\) donné, dessine un triangle isocèle pointe en haut, de hauteur \(h\) et de base \(2 h - 1\). Par exemple, pour \(h = 5\), la fourmi dessinera :

            *
           * *
          *   *
         *     *
        *********
    
#include "laby_draw.hpp"
LABY_VIDE()
void triangle_isocelle(int h) {
    /// BEGIN SOLUTION
    if ( h == 0 )
        return;
    seme();
    // dessine les deux côtés diagonaux
    for ( int i = 0; i < 2; i++ ) {
        for ( int j = 1 ; j < h ; j++ ) {
            avance();
            droite();
            avance();
            gauche();
            seme();
        }
        droite();
    }
    // dessine la base
    droite();
    for ( int i = 0; i < 2*h; i++ ) {
        avance();
        seme();
    }
    /// END SOLUTION
}
debut();
triangle_isocelle(3)
debut();
triangle_isocelle(1)
debut();
triangle_isocelle(0)
debut();
triangle_isocelle(4)
CHECK( a_obtenu(
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") )