TP — Parcourir un tableau

Lien vers ce notebook dans Capytale : https://capytale2.ac-paris.fr/web/c/b62b-12111866/mcer

Dans ce TP, vous allez programmer trois traitements classiques : rechercher des occurrences, trouver un maximum et calculer une moyenne. Vous construirez les algorithmes progressivement, les testerez et estimerez leur nombre d’opérations.

Travail individuel sur ordinateur. Exécutez les cellules dans l’ordre. Avant chaque exécution, lisez la question et prévoyez le résultat. Complétez les zones À FAIRE, puis décommentez les tests proposés.

Prérequis : indices, len, boucles for, conditions, listes et fonctions.

1. Démarrer : parcourir par indices

On veut afficher chaque note de musique avec sa position. Complétez la boucle : i doit prendre toutes les valeurs d’indice valides. Prévoyez d’abord ce qui sera affiché.

notes = ["DO", "RE", "MI", "FA", "SOL", "LA", "SI", "DO"]

# À FAIRE : parcourir les indices et afficher l'indice puis la note.
for i in range(...):
    print(..., ...)

Après l’exécution, vérifiez : combien d’itérations la boucle a-t-elle effectuées ? Dans la suite, nous utiliserons un parcours par indices lorsque l’indice est nécessaire (par exemple pour le retourner ou modifier une case).

2. Rechercher toutes les occurrences

La fonction recherchée reçoit un tableau et une valeur. Elle doit renvoyer la liste des indices où cette valeur apparaît. Si elle n’apparaît pas, le résultat est une liste vide.

2.1 Construire l’algorithme

Au départ, aucun indice n’a été trouvé : l’accumulateur indices est donc une liste vide. À chaque position, testez la valeur et ajoutez l’indice courant si elle correspond à la valeur recherchée. Complétez les deux zones À FAIRE.

def occurrences(tab, valeur):
    """Renvoie les indices où valeur apparaît dans tab."""
    indices = []
    for i in range(len(tab)):
        # À FAIRE : si la case i contient valeur, ajouter i à indices.
        pass
    return indices

2.2 Tester sur les notes

Sans exécuter d’abord, prévoyez les trois résultats : la première note apparaît deux fois, une autre une fois, et UT n’apparaît pas. Exécutez ensuite et comparez.

notes = ["DO", "RE", "MI", "FA", "SOL", "LA", "SI", "DO"]
print(occurrences(notes, "DO"))
print(occurrences(notes, "MI"))
print(occurrences(notes, "UT"))

# Test automatiques : ne pas modifier le code ci-dessous
assert occurrences(notes, "DO") == [0, 7]
assert occurrences(notes, "MI") == [2]
assert occurrences(notes, "UT") == []
assert occurrences([], "DO") == []
print("Bravo ! Tous les tests sont passés.")

3. Rechercher un maximum

On cherche maintenant la plus grande valeur d’un tableau de nombres. La stratégie : prendre la première valeur comme maximum temporaire, puis examiner les suivantes et mettre à jour le maximum si nécessaire.

Le tableau fourni à cette fonction doit être non vide. On choisit le nom maximum pour ne pas masquer la fonction intégrée max de Python.

3.1 Faire une trace avant de coder

Pour [201, 203, 35, 448, 55], notez le maximum temporaire après chaque valeur examinée. Le premier maximum temporaire est-il 0 ou la première valeur du tableau ? Expliquez pourquoi cette distinction compte si toutes les valeurs sont négatives.

# Répondez ici
def maximum(tab):
    """Renvoie la plus grande valeur de tab ; tab doit être non vide."""
    assert len(tab) > 0, "Le tableau doit être non vide"
    m = tab[0]
    for i in range(1, len(tab)):
        # À FAIRE : comparer tab[i] à m et mettre m à jour si besoin.
        pass
    return m

3.2 Tester et varier les données

Prévoyez le maximum avant d’exécuter. Les tests couvrent un tableau de plusieurs valeurs, des valeurs négatives et un tableau à un seul élément.

mesures = [201, 203, 35, 448, 55, 16, 2023, 14, 999, 100]
print(maximum(mesures))

# Test automatiques : ne pas modifier le code ci-dessous
assert maximum(mesures) == 2023
assert maximum([-8, -3, -11]) == -3
assert maximum([6]) == 6
print("Bravo ! Tous les tests sont passés.")

3.3 Estimer le nombre d’opérations

La première valeur sert d’initialisation : la boucle commence donc à l’indice 1. Pour un tableau de taille n, combien d’itérations et de comparaisons sont effectuées ?

# Répondez ici

4. Calculer une moyenne

Pour calculer une moyenne, on commence par additionner toutes les valeurs à l’aide d’un accumulateur somme, initialisé à 0. On divise ensuite cette somme par le nombre de valeurs. Comme pour le maximum, le tableau est supposé non vide.

4.1 Construire la fonction

Complétez la boucle pour ajouter chaque valeur à somme, puis retournez la somme divisée par le nombre de valeurs. Suivez l’évolution de somme pour [10, 14, 16] : elle doit contenir la somme des valeurs déjà parcourues.

def moyenne(tab):
    """Renvoie la moyenne des valeurs de tab ; tab doit être non vide."""
    assert len(tab) > 0, "Le tableau doit être non vide"
    somme = 0
    for i in range(len(tab)):
        # À FAIRE : ajouter la valeur d'indice i à somme.
        pass
    # À FAIRE : renvoyer la moyenne.
    return ...

4.2 Tester la fonction

Pour [10, 14, 16], la somme vaut 40. Préparez-vous à obtenir une moyenne décimale, puis lancez les tests.

mesures = [201, 203, 35, 448, 55, 16, 2023, 14, 999, 100]
print(moyenne(mesures))

# Test automatiques : ne pas modifier le code ci-dessous
assert moyenne([10, 14, 16]) == 40 / 3
assert moyenne([-2, 2]) == 0
assert moyenne([7]) == 7
print("Bravo ! Tous les tests sont passés.")

4.3 Estimer le coût

Pour un tableau de taille n, la boucle effectue n itérations et n additions. Il faut encore une division. Écrivez le nombre total de ces opérations. Comparez avec la recherche d’occurrences et la recherche du maximum.

# Répondez ici

5. Défi — compter les valeurs supérieures à un seuil

Réutilisez le principe de parcours et d’accumulateur pour écrire compter_superieurs(tab, seuil), qui renvoie le nombre de valeurs strictement supérieures au seuil. Testez votre fonction sur les mesures ci-dessous, puis sur un tableau vide.

Avant de coder, réfléchissez : quel est le type d’accumulateur à utiliser, comment l’initialiser et quand l’incrémenter ?

def compter_superieurs(tab, seuil):
    """Renvoie le nombre de valeurs strictement supérieures à seuil."""
    compteur = 0
    for i in range(len(tab)):
        # À FAIRE : compléter le code pour compter les valeurs supérieures à seuil.
        pass
    return ...

mesures = [201, 203, 35, 448, 55, 16, 2023, 14, 999, 100]
print(compter_superieurs(mesures, 200))

# Test automatiques : ne pas modifier le code ci-dessous
assert compter_superieurs(mesures, 200) == 6
assert compter_superieurs([3, 3, 4], 3) == 1
assert compter_superieurs([], 0) == 0
print("Bravo ! Tous les tests sont passés.")