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}
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.
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]
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
Écrire une boucle pour placer sur l’axe des ordonnées les points d’ordonnée de 1 à 10
Écrire une boucle pour placer sur la diagonale des axes des abscisses et des ordonnées les points de coordonnée de 1 à 10
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]
Modifier l’Exemple 2.26 pour afficher les points sur l’axes des abscisses de -5 à 5, tous les 2 dixièmes
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]
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}
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éé.
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)
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] ]
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.
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.