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, soitprint
pour afficher les valeurs des variables au cours de l’exécution. Pour vous aider, vous pouvez également utiliser unassert
pour tester l'invariant, ainsi qu'unassert
pour tester le variant.
On rappelle l'invariant de la recherche dichotomique :
« Si l'élément recherchév
est présent dans le tableau, alorsv
est compris entre l'élément d'indicegauche
et l'élément d'indicedroite
».
On peut écrire l'assertion vérifiant cet invariant de la manière suivante :
v
n'est pas dans le tableau, soit (siv
est dans le tableau)v
est compris entre les éléments d'indicesgauche
etdroite
.
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
tri
avec 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.