Q1 (21-SPO1U59-INFO-TS1-Q1)
Soit le programme Python suivant :
k = int(input("Saisir un entier positif "))
for j in range(2,k+1):
i=2
while (i<j) and (j%i!=0):
i=i+1
if (i == j) :
print("j=", j)Quels sont les affichages produits par l’exécution de ce programme avec la saisie de $k=8$ ?
Allons-y ligne par ligne :
k = int(input("Saisir un entier positif "))On définit une variable $k$, qui sera une variable entière, notez l’utilisation de int.
La commande input fonctionne très simplement : Elle affiche un message (contenu entre les guillemets) et permet à l’utilisateur de saisir une valeur qui sera assignée à la variable $k$ !


Vérifions que la valeur $8$ a bien été assignée à $k$ :

Passons à la ligne suivante :
for j in range(2,k+1):Nous entrons ici dans une boucle for. Une boucle for permet de répéter une série d’instructions (i.e., un bloc de code) un nombre prédéterminé de fois.
Comment les choses fonctionnent-elles ?
Lorsque la boucle for est exécutée, une variable j est initialisée :
Les boucles permettent de répéter une suite d’instructions. Il en existe deux types : Les boucles while et les boucles for.
La boucle while répète une suite d’instructions tant qu’une condition est vraie.
Comme indiqué par
for j in range(2,k+1):la variable $j$ prendra des valeurs comprises dans $\text{range}(2,k+1).$
La commande $$\text{range}(n,m)$$ produit une suite de nombres, qui commence à $n$ et s’arrête à $m-1$. La fonction $\text{range}$ est aussi souvent utilisée avec un seul argument : $$ \text{range}(n)$$ produit la suite de nombres $$ 0, 1, 2, \dots , n-1.$$ Notez que la commande $ \text{range}(n)$ est équivalente à $\text{range}(0,n)$.
Pour revenir à la ligne de code
for j in range(2,k+1):il est à présent clair que la variable $j$ peut prendre les valeurs de la séquence $\text{range}(2,k+1)$, i.e.,
$$2,3,\dots,k-2,k-1,k.$$
L’énoncé stipule que nous devons supposer que $k=8$.
Par conséquent, $j$ peut prendre les valeurs $$2,3,4,5,6,7,8.$$
Comment fonctionne la boucle ? La variable $j$ se voit d’abord assigner la valeur $j=2$.
Le code dans la boucle est exécuté.
Une fois que le code a été entièrement exécuté, on revient au début de la boucle. On assigne alors la valeur suivante à $j$, i.e., $j=3$, on exécute le code, et ainsi de suite… Jusqu’à ce que nous arrivions à la valeur $j=8$. On exécute alors une dernière fois le code, et c’est terminé.
Notez que le code dans la boucle peut contenir des instructions qui vont nous faire sortir de la boucle de façon prématurée !
Ici, ce n’est pas le cas, mais ça peut arriver !
Quelles sont les instructions contenues dans notre boucle for ? Concrètement, tout le code surligné en vert est contenu dans la boucle for

On commence par poser $j=2$.
La première commande exécutée consiste à définir une variable $i$ et à lui assigner la valeur $2$ :
i=2
Nous arrivons ensuite à une boucle while contenu dans la boucle for :
while (i<j) and (j%i!=0):
Cela signifie : Tant que les deux conditions :
- $i$ est strictement inférieur à $j$, et
- $j$ modulo $i$ est non nul, i.e., le reste de la division euclidienne de $j$ par $i$ est non-nul, i.e., $i$ ne divise pas $j$,
sont satisfaites, alors on met à jour la variable $i$ en l’incrémentant de $1$ :
i=i+1Par exemple, pour $j=2$ et $i=2$, la condition $i<j$ n’est pas satisfaite. Bien sûr, $i$ divise $j$, mais il faut que les deux conditions mentionnées ci-dessus soient satisfaites pour que la valeur de $i$ soit incrémentée de $1$.
Par conséquent, lorsque $j=2$ et $i=2$, la boucle while n’a aucun effet.
Sous la boucle while (mais hors de celle-ci) se situe un test conditionnel if :
if (i == j) :
print("j=", j)Cette instruction est un test :
Si la valeur de la variable $i$ est égale à celle de la variable $j$, i.e., si $i = j$, alors on va afficher la valeur de la variable $j$ en utilisant la fonction print :
Ici, la fonction print prend deux arguments :
print("texte de décoration", variable à afficher)Dans notre cas, nous avons $i=j=2$. Le test booléen
i==jretourne donc True. La commande dans la boucle if est alors exécutée :
print("j=", j)et nous verrons la valeur $2$ apparaître sur l’écran, i.e., le programme retourne
$$j=2.$$
Nous venons de terminer une première itération de la boucle for principale, qui structure notre code sur cet exemple.
Nous avons vu que $j$ peut prendre les valeurs $$2,3,4,5,6,7,8.$$
Nous venons de terminer l’itération où $j$ est égal à $2$. Passons à l’itération suivante, où $$j=3.$$
En reprenant le code, nous voyons que la variable $i$ est à nouveau définie et se voit assigner la valeur $2$ :
i=2Nous rentrons dans la boucle while :
while (i<j) and (j%i!=0):
i=i+1Cette fois, nous avons $i<j$ et $j$ modulo $i$ non-nul, i.e., $i$ est strictement inférieur à $j$ et $i$ ne divise pas $j$ : Gardez bien à l’esprit que nous avons ici $j = 3$.
Cette fois, les conditions pour exécuter le code
i=i+1sont réunies.
La variable $i$ est donc incrémentée de $1$.
On a ainsi $$i = 2 + 1 = 3.$$
Notez bien cela : On a maintenant $$ i = 3.$$
Nous arrivons dans au test en fin de code :
if (i == j) :
print("j=", j)Comme $j =3$ et $i=3$, la condition
i == j est vraie : La commande
print("j=", j)est ainsi exécutée : On voit apparaître sur l’écran :
$$j = 3.$$
On passe à l’itération suivante de la boucle for :
On a $j =4$.
Le programme initiale à nouveau la variable $i$ et lui donne la valeur $2$ :
i=2On rentre dans la boucle while :
On a bien $i<j$ mais cette fois $i$ divise $j$ : En effet, $2$ divise bien sûr $4$, le reste de la division euclidienne de $j$ par $i$ est donc $0$, i.e., la condition
(j%i!=0) n’est pas satisfaite !
Cette condition n’étant pas satisfaite, le code contenu dans la boucle while n’est pas exécuté !
On passe au test
if (i == j) :
print("j=", j)On a $j=4$ tandis que $i=2$ : La condition
i == j n’est pas satisfaite ! La commande
print("j=", j)n’est donc pas exécutée ! Le programme ne retourne donc pas $$ j = 4.$$
Le concept est exactement le même pour les itérations suivantes !
Pour l’itération où $j=5$, on applique le même raisonnement que pour les précédentes itérations, et l’on constate que le programme affichera $$j=5.$$
Concernant l’itération où $j=6$, on procède de façon analogue. Remarquez que $i$ divise $j$, i.e., $2$ divise $6$. Par conséquent, le code dans la boucle while n’est pas exécuté. La valeur de $i$ n’est pas incrémentée jusqu’à atteindre $i=6$, et le test final avec le if échoue : Le programme n’affiche pas $$j = 6.$$
Pour l’itération où $j=7$, le programme affiche bien $$j=7.$$
Concernant l’itération finale où $j=8$, remarquez que $i$ divise $j$, i.e., $2$ divise $8$. Comme pour tous les autres valeurs de $j$ paires différentes de $2$, le code dans la boucle while n’est pas exécuté. La valeur de $i$ n’est pas incrémentée jusqu’à atteindre $i=8$. Le test final avec le if échoue : Le programme n’affiche pas $$j = 8.$$
Voilà une capture d’écran du résultat de l’exécution du programme proposé dans cet exercice :

