2.8 Structures de contrôle

Supposons que nous souhaitions placer des points sur l’axe des abscisses. Un point sur l’axe des abscisses a comme coordonnées (1;0), (2;0), (-3;0), (2,5;0), etc. Sa deuxième coordonnée, l’ordonnée, est toujours 0 car le point est collé sur l’axe des abscisses !

Pour créer des points d’abscisse respective 1, 2, 3 nous utilisons donc le code figure point: 1 @ 0, figure point: 2 @ 0, figure point: 3 @ 0.

Écrire le code d’une figure comprenant 10 points placés sur l’axe des abscisses dont les abscisses sont {1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9 ; 10}

Exercice 2.26: Points sur axe des abscisses

La résolution de l’Exercice 2.26 n’est pas compliqué, mais c’est répétitif d’écrire 10 fois le même code pour créer un point. Et bien cela tombe bien car les programmes sont excellents pour répéter des instructions.

2.8.1 Boucle

Pour répéter un ensemble d’instructions de code, nous utilisons une boucle. Pour résoudre l’Exercice 2.26 intelligemment, nous utilisons donc une boucle pour les valeurs d’abscisse de 1 à 10. Cela donne le code suivant :

| figure |
figure := DrGeoFigure nouveau afficherAxes.
1 à: 10 faire: [:abscisse |
   figure point: abscisse @ 0]

Exemple 2.25: Boucle de 1 à 10

Ici, nous introduisons un nouveau message à mot clé à:faire: avec deux paramètres. Ce message permet d’exécuter un code pour un intervalle de valeur, ici de 1 à 10, de 1 en 1.

Le receveur du message est le nombre 1, la valeur initiale des abscisses. Son premier paramètre est le nombre 10, valeur finale des abscisses.

Le deuxième paramètre, le bloc de code, est le code à exécuter pour chacune des valeurs d’abscisse. Ainsi le bloc [:abscisse | figure point: abscisse @ 0] est répété 10 fois et le paramètre abscisse prend successivement les valeurs entières de 1 à 10.

Dans le bloc de code la première ligne [:abscisse| déclare son paramètre. Si le bloc avait nécessité deux paramètres, nous écririons cette première ligne [:abscisse :ordonnée|. Le nom des paramètres est libre.

Écrire une boucle pour placer sur l’axe des abscisses les points d’abscisse de -10 à -1

Exercice 2.27: Sur l’axe des abscisses, les négatifs aussi

Écrire une boucle pour placer sur l’axe des ordonnées les points d’ordonnée de 1 à 10

Exercice 2.28: Sur l’axe des ordonnées

Écrire une boucle pour placer sur la diagonale des axes des abscisses et des ordonnées les points de coordonnée de 1 à 10

Exercice 2.29: Sur la diagonale

Nous constatons l’efficacité des boucles pour répéter un grand nombre de fois du code. Nous avons fait une boucle sur les valeurs entières de 1 à 10. Serait-il possible de le faire avec un pas de 0,5, comme 1 ; 1,5 ; 2 ; 2,5 etc. ?

Oui, il suffit d’utiliser le message à:par:faire: pour indiquer dans le 3ème paramètre le pas de progression dans la boucle. Notre code devient alors :

| figure |
figure := DrGeoFigure nouveau afficherAxes.
1 à: 10 par: 0.5 faire: [:abscisse |
   figure point: abscisse @ 0]

Exemple 2.26: Boucle de 1 à 10 à demi-pas

Modifier l’Exemple 2.26 pour afficher les points sur l’axes des abscisses de -5 à 5, tous les 2 dixièmes

Exercice 2.30: Des pas de lilliputiens

Encore plus fort, comment faire une boucle sur des abscisses hétéroclites, non régulières cette fois-ci. Par exemple des abscisses comme {-2 ; 4 ; 1/3 ; 3,14 ; -1/5} ?

Et bien nous utilisons un autre message faire: que nous envoyons cette fois-ci à une collection. Dans Exemple 2.18 nous avons fait connaissance avec une collection de coordonnées de points, cette fois-ci nous utilisons une collection de valeurs hétéroclites.

| figure |
figure := DrGeoFigure nouveau afficherAxes.
{-2 . 4 . 1/3 . 3.14 . -1/5} faire: [:abscisse |
   figure point: abscisse @ 0]

Exemple 2.27: Une boucle sur des valeurs en vrac

A l’aide d’une boucle sur une collection de nombres, placer les points de l’axe des ordonnées {-1 ; 5,2 ; -3,14 ; 2,6}

Exercice 2.31: Nuage de points

Lorsque nous plaçons les points, il serait judicieux de nommer les points avec leur abscisse.

Modifier l’Exemple 2.27 afin que les points aient comme nom leur abscisse. Indice : envoyer le message nommer: à chaque point créé.

Exercice 2.32: Points nommés avec leur abscisse

Une collection peut contenir n’importe quelle sorte d’objet : des valeurs ou des coordonnées de point comme déjà vu précédemment, et bien d’autres. Il est aussi possible de faire une boucle sur une collection hétéroclite de nombres – entiers, décimaux, fractionnaires.

À l’aide d’une boucle faire: sur une collection, placer les points de coordonnées (1;1), (-1;1), (3;-1) et (2/3;-1/2)

Exercice 2.33: Points en vrac

2.8.2 Test

Une chose intéressante à faire est de placer sur une droite les points dont les abscisses sont des nombres pairs, c’est à dire divisible par deux. Par exemple afficher les points dont les abscisses entre 1 et 100 sont des nombres pairs.

Pour cela nous devons tester si les abscisses sont des nombres pairs. Cela s’appelle tester si une condition est vraie ou fausse, c’est fondamental dans l’écriture d’un programme informatique. Voici l’exemple complet. Ne pas hésiter à grossir dans la figure pour mieux voir :

| figure |
figure := DrGeoFigure nouveau afficherAxes.
figure échelle: 5.
1 à: 100 faire: [:abscisse |
   abscisse pair siVrai: [figure point: abscisse @ 0]
]

Exemple 2.28: Abscisse pair

Nous introduisons ici un nouveau message à mot clé siVrai:. Il fonctionne de cette façon :

(condition) siVrai: [bloc de code à exécuter si condition vraie]

Le code de notre (condition) est ici abscisse pair. Le message unaire pair est envoyé à un nombre et ce dernier nous répond par un objet "vrai" ou "faux" (true ou false en anglais) selon que le nombre est pair ou non. Lorsque la condition est vraie alors le bloc en paramètre du message siVrai: est exécuté et le point est créé. Sinon il ne se passe rien et la boucle reprend avec la valeur suivante de l’abscisse.

Il existe de nombreux messages pour tester des conditions. En voici quelques uns à envoyer à un nombre : impair, estPremier, estEntier, estDecimal, positif, strictementPositif.

Tester chacun des messages ci-dessus en l’envoyant aux nombres 0 ; 1 ; 2 ; -5 ; 3,4. Pour afficher le résultat de chaque test, lancer le code avec la commande "Print it" du menu de l’espace de travail ou le raccourci clavier Ctrl-p.

Exercice 2.34: Conditions sur nombre

Afficher des nombres pairs n’est pas très intéressant, mais finalement avec peu de modifications nous pouvons afficher les nombres premiers.

Modifier l’Exemple 2.28 afin d’afficher uniquement les nombres dont l’abscisse est un nombre premier. Nommer les points avec leur abscisse.

Exercice 2.35: Nombres premiers