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();
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") )
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") )
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") )
♣ 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") )