Résultat mathématique. Un nombre naturel est un nombre entier et positif, 0 compris. L’ensemble des nombres naturels est infini.
Pour obtenir le 1er million de ces nombres, nous le codons 0 à:
999999
. Pour vérifier son cardinal – nombre d’éléments – nous
codons (0 à: 999999) taille
et nous affichons le résultat par
Print it (Ctrl-p).
Résultat mathématique. Lorsque le reste d’une division euclidienne est égale à zéro cela signifie que le dividende est un multiple du diviseur. Cela revient à dire que le diviseur est un diviseur du dividende.
Avec le division euclidienne nous disposons donc d’une méthode pour tester si un nombre est multiple d’une autre nombre ou si un nombre est diviseur d’un autre nombre. Exécuter l’exemple ci-dessous avec la commande Print it – Ctrl-p – et observer la réponse affichée.
85214 \\ 24 = 0 siVrai: ['C''est un multiple !'] siFaux: ['Ce n''est pas un multiple.']
Modifier l’Exemple 3.9 avec les valeurs 85200 et 24. Quelle réponse est obtenue ?
Adapter l’Exemple 3.9 pour tester si 24 est un diviseur de 85200.
L’exemple suivant montre comment créer un programme interactif pour tester si un nombre est multiple d’un autre nombre nombre.
| a b | a := (self request: 'Un premier nombre' initialAnswer: '1') commeNombre. b := (self request: 'Un deuxième nombre' initialAnswer: '2') commeNombre. a \\ b = 0 siVrai: [ self inform: a asString, ' est un mulitple de ', b asString ] siFaux: [ self inform: a asString, ' n''est pas un mulitple de ', b asString ]
Dans cet exemple, a
et b
sont deux variables pour
représenter nos deux nombres. Pour demander à l’utilisateur la valeur
de ces nombres, nous utilisons le message
request:initialAnswer:
envoyé à n’importe quel objet.
Cela affiche une petite fenêtre où saisir le nombre, le mot
request:
signifie requête/demande. Le message nous retourne
alors la réponse de l’utilisateur. Cette réponse est une phrase que
nous convertissons en nombre avec le message commeNombre
. Pour
afficher la réponse, nous utilisons le message inform:
. Cette
réponse est construite à partir de portions de phrase concaténées –
collées – avec le message binaire virgule :“,
”.
Modifier l’Exemple 3.10 afin de tester si un nombre est diviseur d’un autre nombre. La réponse est donnée sous la forme d’une phrase affichée dans une fenêtre.
Pour construire l’ensemble des diviseurs de 100, nous choisissons chacun des nombres naturels de 1 à 100 qui divise 100. Le code ci-dessous lancé par un Print it (Ctrl-p) affiche une collection des diviseurs de 100.
(1 à: 100) choisir: [ :n | 100 \\ n = 0]
Le message à mot clé choisir:
est envoyé à l’ensemble
{1;...;100}. Dans le bloc de code []
, l’argument n
prend chacune des valeurs des nombres de l’ensemble. Nous testons
alors si n
divise 100, c’est vrai lorsque le reste de la
division est égale à 0, en code cela donne 100 \\ n = 0
. Dans
ce cas, la méthode choisir:
retient la valeur de n
.
Adapter l’Exemple 3.11 pour obtenir les diviseurs de 155.
Une dernière chose à faire est de transformer ce code en un bloc de code. De cette façon nous pouvons demander les diviseurs de plusieurs nombres naturels sans répéter tout le code.
| diviseurs | diviseurs := [:nombre | (1 à: nombre) choisir: [ :n | nombre \\ n = 0]]. diviseurs valeur: 100. diviseurs valeur: 155
Le bloc de code []
est affecté à la variable
diviseurs
. Dans ce bloc, :nombre
est un paramètre qui
prend la valeur de 100 lorsque nous codons diviseurs valeur:
100
ou qui prend la valeur de 155 lorsque nous codons diviseurs
valeur: 155
.
Attention, dans cet exemple seule la dernière ligne est affichée lors
d’une exécution par un P rint it. Pour afficher à la fois les
diviseurs de 100 et 155, nous concaténons les réponses en remplaçant
les deux dernières lignes de code par (diviseurs valeur: 100),
(diviseurs valeur: 155)
.
Résultat mathématique. Un diviseur est commun à deux nombres naturels lorsqu’il divise ces deux nombres.
Examinons en détail l’Exemple 3.12 avec les diviseurs communs de 100 et 155.
Pour 100, le code nous retourne cette liste de diviseurs :
| diviseurs | diviseurs := [:nombre | (1 à: nombre) choisir: [ :n | nombre \\ n = 0]]. diviseurs valeur: 100. ⇒ #(1 2 4 5 10 20 25 50 100)
Pour 155, le code nous retourne cette liste de diviseurs :
| diviseurs | diviseurs := [:nombre | (1 à: nombre) choisir: [ :n | nombre \\ n = 0]]. diviseurs valeur: 155. ⇒ #(1 5 31 155)
Nous observons que 1 et 5 sont les diviseurs communs de 100 et 155 car
ils sont présents dans les collections #(1 2 4 5 10 20 25 50
100)
et #(1 5 31 155)
. Nous le traduisons en code en
demandant l’intersection de ces deux collections, c’est-à-dire ne
retenir que leurs nombres communs, cela se code :
#(1 2 4 5 10 20 25 50 100) & #(1 5 31 155) ⇒ #(5 1)
Modifier l’Exemple 3.12 pour afficher la collection des diviseurs communs de 100 et 155
Maintenant, écrivons un programme interactif pour demander et calculer les diviseurs communs de deux nombres.
Adapter la solution de l’Exercice 3.15 pour écrire un programme interactif comme l’Exemple 3.10 calculant et affichant les diviseurs de deux nombres.
Nous pouvons aussi définir un nouveau bloc de code pour calculer les diviseurs communs de deux nombres.
| a b diviseurs divCommuns | diviseurs := [:nombre | (1 à: nombre) choisir: [ :n | nombre \\ n = 0]]. divCommuns := [:x :y | (diviseurs valeur: x) & (diviseurs valeur: y)]. "" divCommuns valeur: 100 valeur: 155
Résultat mathématique. Lorsque nous nous intéressons aux diviseurs communs de deux nombres naturels, il y en a un de particulier, c’est le Plus Grand Diviseur Commun. Dans l’ensemble des diviseurs communs c’est le plus grand, le maximum.
Toujours avec l’exemple des diviseurs communs de 100 et 155, nous
avions trouvé la collection #(5 1)
, pour obtenir le PGDC, nous
demandons le maximum de cette collection en lui envoyant le message
max
, cela donne le code :
#(5 1) max ⇒ 5
Le PGDC de 100 et 155 est 5 !
Écrire un bloc de code affecté à une variable
pgdc
et qui retourne le PGDC de deux nombres naturels. Le bloc de code reprendra la solution de l’Exercice 3.15. Comme l’Exemple 3.13, ce bloc aura deux arguments.
Écrire un programme interactif qui demande deux nombres naturels à l’utilisateur et qui répond d’une phrase le PGDC affiché dans une fenêtre. S’inspirer de l’Exemple 3.10 et de la solution de Exercice 3.17
Résultat mathématique. Un nombre premier est un nombre naturel qui a exactement deux diviseurs : 1 et lui-même. Lorsque nous connaissons la collection des diviseurs d’un nombre, il est premier si elle contient exactement deux nombres : 1 et le nombre lui-même.
Par exemple 155 n’est pas premier car sa collection de diviseurs
#(1 5 31 155)
contient 4 nombres. Pour le coder il suffit donc
de demander la taille de la collection des diviseurs en lui envoyant
le message taille
:
#(1 5 31 155) taille ⇒ 4 "155 n'est pas premier"
En posant la question 155 est-il premier ?, nous attendons une
réponse qui est soit Vrai, soit Faux. En code informatique cela se
traduit en true
ou false
. Pour obtenir cette réponse
nous comparons la taille de la collection des diviseurs à 2. Si la
taille est égale à 2 nous obtenons la réponse true
, sinon
false
.
| diviseurs | diviseurs := [:nombre | (1 à: nombre) choisir: [ :n | nombre \\ n = 0]]. "" "Tester chacune des lignes ci-dessous" (diviseurs valeur: 155) taille = 2. "⇒ false" (diviseurs valeur: 29) taille = 2. "⇒ true" (diviseurs valeur: 100) taille = 2. "⇒ false" (diviseurs valeur: 1) taille = 2. "⇒ false" (diviseurs valeur: 2) taille = 2. "⇒ true"
Écrire un bloc de code affecté à une variable
premier
qui retourne une réponsetrue
oufalse
selon que le nombre passé en paramètre est premier ou non.
Nous disposons maintenant d’un bloc de code pour tester si un nombre est premier ou non. Il serait intéressant de construire la collection des nombres premiers de 1 à 1000. Une ligne de code supplémentaire est nécessaire par rapport à la solution de l’Exercice 3.19.
Compléter la solution de l’Exercice 3.19 avec une ligne de code supplémentaire pour déterminer la collection des nombres premiers entre 1 et 1000. Indice : utiliser les messages à mot clé
1 à: 1000
etchoisir:
.
Résultat mathématique. Deux nombres sont premiers entre eux lorsque leur seul diviseur commun est 1. Cela signifie que leur PGDC est 1.
Par exemple 21 et 25 sont premiers entre eux car 1 est leur seul diviseur commun. Noter que 21 et 25 pris individuellement ne sont pas des nombres premiers.
Écrire un programme interactif qui demande à l’utilisateur deux nombres naturels et qui répond par une phrase si les nombres sont premiers entre eux ou pas. S’inspirer de la solution de l’Exercice 3.18.