Accroche et situation-problème
« On souhaite saisir un entier N strictement compris entre 2 et 100 (la saisie doit être répétée tant qu'elle n'est pas conforme). On calcule ensuite la somme de ses diviseurs stricts pour tester si le nombre est parfait (un nombre est parfait s'il est égal à cette somme). Enfin, on compte combien de divisions successives entières par 2 ce nombre peut subir tant qu'il reste pair. »
Contrôle de saisie
Structure post-test : Répéter ... Jusqu'à.
Somme des diviseurs
Boucle complète : Pour i de 1 à n-1.
n - 1, connu et fixé dès le départ.
Divisions par 2
Boucle préalable : Tant que.
Questionnement oral (cliquez pour afficher la réponse didactique) :
Tableau de correspondance : Algorithmique ↔ Python
Mise au point sur les règles officielles des structures itératives (Conventions 2024-2025) :
| Structure | Algorithmique (Norme) | Python (Conventions 2024-2025) |
|---|---|---|
| Boucle complète | Pour i de D à F [Pas = p] Faire |
for i in range(D, F + 1, p):Borne F+1 exclue en Python |
| Boucle préalable | Tant que Condition Faire |
while Condition:Condition de maintien / continuation |
| Boucle post-test | Répéter |
while not (Condition):Négation de la condition d'arrêt |
Consignes officielles impératives (Interdictions formelles) :
- Proscription absolue du
break: L'utilisation de l'instructionbreakpour forcer la sortie d'une boucleforouwhileest formellement interdite. - Intégrité du compteur de boucle
Pour: La valeur de la variable de contrôle d'une bouclePourne doit jamais être modifiée manuellement dans le traitement. - Division entière : Les calculs de parité et de division itérative doivent employer l'opérateur euclidien
//(et non pas/) pour préserver le typeint.
Pour compter à rebours en Python, la borne finale doit être F - 1 pour s'arrêter à F.
range(10, -1, -2)
La condition de Jusqu'à indique quand sortir. En Python, le while continue tant que la condition est vraie.
while not (n > 2): # ou n <= 2
Dans une boucle while, une variable de la condition doit impérativement être modifiée à chaque itération.
nb_div2 = nb_div2 + 1
Conception algorithmique & T.D.O. Standard
Construction guidée au tableau articulant les trois familles d'itérations en un algorithme cohérent :
ALGORITHME AnalyseNombre
DEBUT
// 1. Contrôle de saisie post-test
Répéter
Écrire("Donner un entier N (2 à 100) : ")
Lire(n)
Jusqu'à (n > 2) Et (n < 100)
// 2. Boucle complète : somme des diviseurs stricts
somme_div ← 0
Pour i de 1 à n - 1 Faire
Si n Mod i = 0 Alors
somme_div ← somme_div + i
FinSi
Fin Pour
est_parfait ← (somme_div = n)
Écrire("Le nombre est-il parfait ? ", est_parfait)
// 3. Boucle préalable : divisions successives par 2
temp ← n
nb_div2 ← 0
Tant que temp Mod 2 = 0 Faire
temp ← temp Div 2
nb_div2 ← nb_div2 + 1
Fin Tant que
Écrire("Nombre de divisions par 2 possibles : ", nb_div2)
FIN
| Objet | Type / Nature |
|---|---|
| n, somme_div, i, temp, nb_div2 | Entier |
| est_parfait | Booléen |
n: Entier saisi contrôlé dans ]2, 100[.i: Compteur automatique de la bouclePour(de 1 à n-1).somme_div: Accumulateur de somme, initialisé à 0 avant la boucle.temp: Copie de travail denpour éviter d'altérer la valeur initiale.nb_div2: Compteur incrémenté à chaque division valide par 2.
Traduction, Exécution sur machine & Laboratoire
Implémentation individuelle du script en respectant les conventions d'écriture Python officielles :
# 1. Contrôle de saisie émulant 'Répéter ... Jusqu'à' sans break
n = 0
while not (2 < n < 100):
n = int(input("Donner un entier N (2 à 100) : "))
# 2. Somme des diviseurs avec 'for in range' (borne n incluse dans le range via n)
somme_div = 0
for i in range(1, n):
if n % i == 0:
somme_div = somme_div + i
est_parfait = (somme_div == n)
print("Le nombre est-il parfait ? :", est_parfait)
# 3. Divisions successives par 2 avec 'while'
temp = n
nb_div2 = 0
while temp % 2 == 0:
temp = temp // 2
nb_div2 = nb_div2 + 1
print("Nombre de divisions par 2 possibles :", nb_div2)
range(1, n) :Pour tester les diviseurs stricts jusqu'à
n - 1, la borne passée à range doit impérativement être n (puisque la fin est exclue).
// :S'assurer que les élèves utilisent
temp = temp // 2 et non temp / 2, sous peine de convertir temp en nombre flottant.
while True + break :Rappeler l'obligation normative de pré-initialiser
n = 0 pour amorcer la boucle while not (2 < n < 100):.
nb_div2) :
{{ nbDiv2 }}