Adloun

Problème — Débogage guidé par les tests

Exercice de TD · niveau 3 (difficile) · NSI (terminale), chapitre 10 — Modularité, mise au point et tests

Énoncé

Problème — Débogage guidé par les tests.

On fournit la fonction tri_insertion ci-dessous, censée trier une liste par ordre croissant. Elle contient un bogue. Écrire un jeu de tests révélant l'erreur, identifier la cause, puis corriger la fonction.

Corrigé


# Version buguee fournie :
# def tri_insertion(t):
#     for i in range(1, len(t)):
#         cle = t[i]
#         j = i - 1
#         while j >= 0 and t[j] < cle:   # ERREUR : < au lieu de >
#             t[j + 1] = t[j]
#             j -= 1
#         t[j + 1] = cle
#     return t

# Jeu de tests qui revele le bug :
# tri_insertion([3, 1, 2]) renvoyait [3, 2, 1] (decroissant)

def tri_insertion(t):
    """Trie la liste t par ordre croissant (tri par insertion).

    Modifie t en place et la renvoie.
    """
    for i in range(1, len(t)):
        cle = t[i]
        j = i - 1
        while j >= 0 and t[j] > cle:   # correction : > au lieu de <
            t[j + 1] = t[j]
            j -= 1
        t[j + 1] = cle
    return t

# Jeu de tests
assert tri_insertion([]) == []                 # cas limite
assert tri_insertion([5]) == [5]               # un element
assert tri_insertion([3, 1, 2]) == [1, 2, 3]   # cas general
assert tri_insertion([4, 4, 1]) == [1, 4, 4]   # doublons
assert tri_insertion([5, 4, 3, 2, 1]) == [1, 2, 3, 4, 5]  # ordre inverse
print("Probleme 2 : tri corrige, tous les tests passent.")

Le test tri_insertion([3, 1, 2]) produisait [3, 2, 1] : en lisant le résultat, on repère que la liste est triée à l'envers, ce qui oriente vers la comparaison t[j] &lt; cle. La corriger en t[j] &gt; cle résout le problème, validé par l'ensemble du jeu de tests.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.