Logo Tortue, le logo du langage logo
Apprendre à programmer, programmer pour apprendre

Introduction à la programmation Logo

Le Logo est généralement connu par sa tortue (un simple triangle dans le cas de MSWLogo) : la première série d'exemples ci-dessous (Tortue et graphisme) lui est consacrée. Cependant le Logo est un langage de programmation complet et puissant. Tortue et graphisme ne sont qu'une des manières d'aborder le Logo et la programmation (par exemple aucun des trois tomes du livre Computer Science Logo Style n'utilise cet aspect du Logo).

Conseils de lecture de ce document

Sommaire

Tortue et graphismeretour au sommaire

Ce chapitre Tortue et graphisme est inspiré de A quick lesson in Logo (Terrapin Software).

Même les jeunes enfants apprennent rapidement à déplacer la tortue en se servant de mots spéciaux qui sont intuitifs et faciles à mémoriser. Par exemple, tapez l'instruction avance 50 pour déplacer la tortue de 50 pas (des pixels en fait, c'est-à-dire des points d'écran). Tapez l'instruction droite 90 pour la faire tourner à droite de 90 degrés (dans le sens des aiguilles d'une montre). Dans MSWLogo, on tape ces instructions dans la ligne de commande de la fenêtre texte, la tortue quant à elle se déplace dans la fenêtre graphique (on dit simplement l'écran).

avance 50 est une instruction, c'est-à-dire quelque chose que le Logo est capable d'interpréter comme un ordre. Une instruction doit contenir la description exacte de ce que vous voulez que le Logo fasse pour vous.

Les mots qui comme avance et droite font partie du vocabulaire du langage Logo sont des noms de procédures. Une procédure est comme une recette décrivant une tâche à accomplir. Par exemple la procédure qui a pour nom avance a pour tâche de faire avancer la tortue.

En combinant les 2 instructionsavance 50et droite 90, il est facile de faire dessiner un carré à la tortue, sachant qu'elle se déplace en trainant un crayon de couleur :

dessin d'un carré
avance 50
droite 90
avance 50
droite 90
avance 50
droite 90
avance 50
droite 90

Notes

En utilisant la procédure répète, vous pouvez combiner ces 2 instructions pour vous simplifier la tâche et arriver plus rapidement au même dessin d'un carré :

répète 4 [avance 50 droite 90]

Notez qu'après le dessin de ce carré, la tortue a repris son état initial, c'est-à-dire qu'elle occupe la même position et a le même cap (orientation). Vous pouvez aisément le vérifier en utilisant les procédures pos et cap, en tapant les instructions montre pos et montre cap :

montre pos
>> [0 0]
montre cap
>> 0

Par convention, le symbole >> ci-dessus indique qu'une valeur a été calculée par l'évaluateur Logo (par exemple la valeur [0 0]) et que celui-ci a affiché cette valeur dans la fenêtre texte.

[0 0]représente une position, c'est-à-dire une paire de coordonnées selon les axes X et Y. La position[0 0]correspond à l'origine des axes X et Y qui est au centre de l'écran.

La valeur du cap est donnée en degrés : 0 correspond à une orientation verticale vers le haut (le nord).

Le Logo vous permet de définir très facilement vos propres nouvelles procédures en les construisant à partir d'autres procédures. Voici comment définir une procédure carré dont la tâche sera de dessiner notre carré de 50 pas de côté :

pour carré
 répète 4 [avance 50 droite 90]
end

En pratique, vous écrirez vos définitions de procédures (comme carré) dans un fichier Logo, à l'aide de l'éditeur Logo (similaire au Bloc-notes de Windows).

Dorénavant, pour dessiner un carré, il vous suffira de taper carré dans la ligne de commande. De plus la procédure carré s'utilise comme n'importe quelle procédure du langage Logo lui-même (une procédure du langage Logo est dite une procédure primitive). En particulier toute procédure existante peut être utilisée dans la définition d'une nouvelle procédure : de fait, les procédures sont les blocs de constructions d'un programme.

Voici quelques exemples d'utilisation de la procédure carré.

 

dessin d'un drapeau

Pour dessiner un drapeau :

avance 60
carré
recule 60

La dernière instruction n'est pas indispensable : elle fait revinir la tortue à son point de départ.

 

Pour dessiner un cercle de carrés, tapez :

répète 12 [carré droite 30]
dessin d'un cercle de carrés

La tortue parcourt 12 carrés décalés chacun de 30 degrés. Au bout du compte, elle aura tournéde 360 degrés - un cercle complet - et occupera de nouveau la même position et le même cap qu'au début du dessin.

Il est très facile d'expérimenter en Logo. Si vous voulez voir de plus près la progression du dessin ci-dessus, vous pouvez par exemple taper l'instruction :

répète 3 [carré droite 30]

Ceci correspond au premier quart du dessin. Pour terminer le dessin, tapez l'instruction :

répète 9 [carrédroite 30]
dessin d'une maison

 

Pour dessiner une maison, on peut définir une nouvelle procédure maison à partir de la procédure carré et d'une autre nouvelle procédure triangle.

pour maison
 carré
 avance 50
 droite 90
 triangle
end

pour triangle
 répète 3 [avance 50 gauche 120]
end
dessin d'une suite de carrés

On peut aussi ajouter un argument à la définition de la procédure carré pour obtenir facilement des dessins de carré de taille différente.

pour carré :taille
 répète 4 [avance :taille droite 90]
end

Les carrés de différentes tailles s'obtiennent en tapant successivement : carré 10, carré 20, carré 30,  etc.

 

dessin d'une spirale

La procédure poly.spirale ci-dessous est plus complexe. Elle a 2 arguments, une distance et un angle. C'est une procédure récursive, c'est-à-dire qu'elle est définie en terme d'elle-même : dans l'avant-dernière instruction, la procédure s'appelle elle-même avec des arguments modifiés (par exemple le 1er argument, la distance, est augmenté de 5 via l'instructionsomme :distance 5). La 2ème ligne est une instruction conditionnelle qui arrête l'exécution de la procédure dès que la distance dépasse la valeur 205 . Pour obtenir le dessin ci-dessus, tapezpoly.spirale 5 120dans la ligne de commande.

pour poly.spirale :taille :angle
 si :taille>205 [stop]
 avance :taille
 droite :angle
 poly.spirale somme :taille 5 somme :angle 0.12
end

 

Pour terminer ce chapitre, quelques images fractales réalisée en Logo :

Si vous avez suivi cette première leçon, vous avez peut-être remarqué combien la syntaxe de l'utilisation d'une procédure est simple et uniforme : c'est toujours le nom de la procédure suivi de ses arguments. Ceci est vrai aussi bien pour une procédure primitive que pour une procédure que vous avez définie vous-même. Dans la plupart des autres langages ce n'est pas le cas : chaque procédure primitive a sa syntaxe particulière différente de celle des autres.

Application numériqueretour au sommaire

Conversion d'un montant en FB en euros en arrondissant aux centimes

A titre de préparation, commencez par simplement convertir 50 FB en tapant quelques instructions dans la fenêtre texte.

Un euro valant 40.3399 FB, la conversion se fait en divisant par 40.3399 à l'aide de la procédure quotient.

La procédure quotient retourne une valeur qui est le résultat de la division de son premier argument par son second.

La procédure montre n'a qu'un argument : elle affiche celui-ci dans la fenêtre texte. Dans ce qui suit, l'affichage d'une valeur dans la fenêtre texte est symbolisé par  >> suivi de la valeur.

montre quotient 50 40.3399
>> 1.2394676238662

En arrondissant aux centimes, vous obtiendriez 1.24 euro. Ce qui en programmation peut se faire selon les 3 étapes suivantes:

montre produit 100 1.2394676238662
>> 123.94676238662

montre arrondi 123.94676238662
>> 124

montre quotient 124 100
>> 1.24

Donc pour convertir un montant en FB en euros et arrondir aux centimes, il faut effectuer les 4 étapes suivantes :

  1. diviser par 40.3399
  2. multiplier par 100
  3. arrondir à l'entier
  4. diviser par 100

La première étape sera réalisée par la procédure FB.euro ci-dessous. La procédure primitive retourne ne s'emploie que dans la définition d'une procédure : elle termine l'exécution de la procédure là où elle apparaît de telle sorte que cette procédure retourne la valeur spécifiée en argument de retourne. La procédure retourne n'accepte qu'un argument.

pour FB.euro :n
   retourne quotient :n 40.3399
end

La procédure finale, FB.euro.arrondi, se définit comme suit :

pour FB.euro.arrondi :n
 retourne quotient arrondi produit 100 FB.euro :n 100
end

Afin d'augmenter la lisibilité d'une expression, il toujours permis d'ajouter des parenthèses autour de l'application d'une procédure. Dans la 2ème version de FB.euro.arrondi ci-dessous, les parenthèses permettent de mieux visualiser les 2 argument de quotient qui sontarrondi produit 100 FB.euro :n et 100, ce qui donne :

pour FB.euro.arrondi :n
 retourne quotient (arrondi produit 100 FB.euro :n) 100
end

Vous pourriez utiliser plus de parenthèses et par exemple écrire le premier argument de quotient comme ceci :

(arrondi produit 100 (FB.euro :n))

Exemples de calcul :

montre FB.euro 100
>> 2.47893524773239

montre FB.euro.arrondi 100
>> 2.48

Fonctionnement de l'évaluateurretour au sommaire

Que se passe-t-il quand l'évaluateur Logo rencontre une instruction comme :

 montre produit 100 quotient 50 40.3399

Le Logo évalue l'instruction pas à pas en la parcourant de gauche à droite :

  1. Il rencontre d'abord le mot montre qu'il reconnaît comme un nom de procédure. Sachant que montre reçoit un argument, il continue de parcourir l'instruction à la recherche de cet argument.
  2. L'élément suivant dans l'instruction est le nom de procédure produit, ce qui permet à Logo de considérer que la valeur retournée par produit sera celle à donner à montre comme valeur d'argument.
  3. Sachant que produit prend deux arguments, le Logo continue de lire l'instruction : 100 sera la valeur du 1er argument, le deuxième sera la valeur retournée par quotient.
  4. Sachant que quotient prend deux arguments, le Logo continue de lire l'instruction et rencontre les valeurs 50 et 40.3399 en même temps qu'il note que la fin de l'instruction est atteinte.
  5. Le Logo est maintenant en mesure d'exécuter la procédure quotient avec comme arguments 50 et 40.3399 ; ce qu'il fait et trouve comme résultat 1.2394676238662 .
  6. Maintenant le Logo peut exécuter la procédure produit avec comme valeurs d'arguments 100 et 1.2394676238662 . Il trouve 123.94676238662 .
  7. La valeur retournée par produit est celle à donner à montre. Le Logo applique montre à 123.94676238662 ce qui a pour effet d'afficher 123.94676238662 dans la fenêtre texte.

Une façon schématique de présenter les choses est d'utiliser des flèches pour relier chaque procédure à ses arguments. Par exemple dans la définition de FB.euro.arrondi, l'expression quotient arrondi produit 100 FB.euro :n 100 se représente comme ceci :

Schéma des arguments

ce qui montre bien que :