Activité préliminaire¶
Source
Inspiré d'une activité du Hachette NSI Terminale.
Ajouter des traces¶
La fonction suivante a été écrite par un élève de première suite à une consigne de son professeur pour implémenter l’algorithme de recherche dichotomique.
La docstring, présente dans la fonction, spécifie ce qu'elle est censée faire.
def recherche(t, v):
''' Renvoie l'indice de l'élément v dans le tableau t.
Si l'élément n'est pas trouver, renvoie -1.
:param t: (list) un tableau d'entiers
:param v: (int) l'entier à chercher
:return: (int) l'indice de l'élément s'il est trouvé, ou -1 sinon '''
gauche = 0
droite = len(t)
while gauche < droite:
milieu = (gauche+droite) // 2
if t[milieu] < v:
gauche = milieu
else:
droite = milieu
return droite
Exercice 1
Copier le programme ci-dessus dans l’éditeur de script de Thonny
- Tester la fonction recherche avec le tableau
[2, 3, 4, 6, 7]et la valeur 5. Qu’observe-t-on ? La fonction est-elle correcte ? -
Ajouter des instructions
Autrement dit, soitprintpour afficher les valeurs des variables au cours de l’exécution. Pour vous aider, vous pouvez également utiliser unassertpour tester l'invariant, ainsi qu'unassertpour tester le variant.
On rappelle l'invariant de la recherche dichotomique :
« Si l'élément recherchévest présent dans le tableau, alorsvest compris entre l'élément d'indicegaucheet l'élément d'indicedroite».
On peut écrire l'assertion vérifiant cet invariant de la manière suivante :
vn'est pas dans le tableau, soit (sivest dans le tableau)vest compris entre les éléments d'indicesgaucheetdroite.
Pour ce qui est du variant, il s'agit dedroite - gauche + 1(quantité positive et strictement décroissante). Il faut vérifier que cette quantité diminue à chaque itération de la boucle. -
Identifier la ou les erreurs à l’aide de ces traces et les corriger.
Utiliser un débogueur¶
L’implémentation suivante de l’algorithme de tri par sélection contient elle aussi des erreurs.
def tri(t):
''' Effectue un tri par sélection en place du tableau entré.
:param t: (list) Une liste d'éléments à trier
:return: (None) On ne renvoie rien '''
for i in range(len(t)):
jmin = i
for j in range(i, len(t)):
if t[j] <= t[jmin]:
jmin = j
if jmin != i:
t[i] = t[jmin]
t[jmin] = t[i]
Exercice 2
Nous allons utiliser un outil de mise au point appelé débogueur (ou debugger en anglais).
- Copier le programme ci-dessus dans l’éditeur de script de Thonny et ajouter une instruction qui appelle la fonction
triavec le tableau[4, 2, 6, 7, 1, 8]. - Exécuter le programme. Qu’observe-t-on ?
- Lancer le programme avec le débogueur de Thonny (l'icône juste à droite de celle permettant d'exécuter un script). Vous pouvez également mettre des points d'arrêt sur des lignes précises pour pouvoir exécuter votre programme normalement et ne l'arrêter qu'à ces points définis en vue du déboguage.
Un autre outil bien sympathique pour vous aider à déboguer un programme Python Tutor. - Identifier la ou les erreurs à l’aide du débogueur et les corriger.