Épreuve pratique NSI

Sujet n° 18 · Session 2026 · 1 heure

Températures de l'océan en Polynésie

Des bouées mesurent la température de surface de l'océan dans quatre archipels polynésiens. Le candidat calcule des moyennes, repère des anomalies, puis écrit les tests qui démasquent un calcul de décennie faux.

  • Liste de dictionnaires
  • Moyenne
  • Valeur absolue
  • Tests et assertions
  • Division entière

Mise en situationLes relevés

Un réseau de bouées océanographiques mesure quotidiennement la température de surface de l'océan dans quatre archipels : Société, Tuamotu, Marquises et Australes. Chaque relevé est un dictionnaire {'date': 'AAAA-MM-JJ', 'zone': ..., 'temperature': ...}. Le fichier contient la liste donnees_test : 6 relevés pour la Société (2010 à 2021), 3 pour les Tuamotu (2015 à 2021) et 3 pour les Marquises (2020 à 2022). Aucun relevé pour les Australes.

Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.

1

Question 1Température moyenne d'une zone

Écrire une fonction temperature_moyenne(zone, donnees) qui prend en paramètres une chaîne zone (nom d'un archipel) et un tableau donnees de dictionnaires représentant les relevés, et qui renvoie la température moyenne (float) pour cette zone, ou None si la zone n'a aucun relevé. Exemple :

>>> donnees = [
    {'date': '2020-01-15', 'zone': 'Societe', 'temperature': 28.5},
    {'date': '2020-01-16', 'zone': 'Societe', 'temperature': 29.0},
    {'date': '2020-01-15', 'zone': 'Tuamotu', 'temperature': 27.5}
]
>>> temperature_moyenne('Societe', donnees)
28.75
>>> temperature_moyenne('Marquises', donnees)
>>>

Appel professeur

À demander au candidat

  1. Que se passerait-il sans le test compteur == 0 ? Pourquoi renvoyer None plutôt que 0 ?
  2. Pourrait-on remplacer compteur par len(donnees) ? Expliquez.
Point de vigilance

Renvoyer None (et non 0) pour une zone absente, puis tenir compte de ce None à la question 2.

Résultats attendus
Société
27,75 °C
Tuamotu
27,43 °C
Marquises
26,0 °C
2

Question 2Détecter les anomalies

Écrire une fonction detecter_anomalies(zone, seuil, donnees) qui prend en paramètres une zone, un seuil (float) et la liste donnees, calcule la température moyenne de la zone, et renvoie la liste des dates où la température s'écarte de plus de seuil degrés (en valeur absolue, via la fonction abs()) de cette moyenne. Elle renvoie une liste vide si la zone n'existe pas.

Par exemple, detecter_anomalies('Societe', 1.0, donnees_test) renvoie ['2010-06-20', '2021-05-30'].

Appel professeur

À demander au candidat

  1. Pourquoi écrire moy is None plutôt que moy == None ? Quelle différence entre is et == ?
  2. Pourquoi appeler temperature_moyenne plutôt que recalculer la moyenne dans la fonction ?
Point de vigilance

La moyenne se calcule une seule fois, avant la boucle, et seulement sur la zone demandée.

Résultats attendus
Société, seuil 1,0
['2010-06-20', '2021-05-30']
Tuamotu, seuil 0,5
['2015-04-10', '2021-09-20']
3

Question 3Des tests qui trouvent le bug

Le fichier contient le code de la fonction evolution_par_decennie(zone, donnees) censée calculer l'évolution des températures moyennes par décennie (2010, 2020).

Compléter les trois fonctions de test, situées à la fin du fichier, pour la fonction evolution_par_decennie en utilisant le jeu de données fourni :

  • test_zone_inexistante() : tester une zone qui n'existe pas ;
  • test_une_seule_decennie() : tester une zone avec données sur une seule décennie ;
  • test_plusieurs_decennies() : tester une zone avec données sur plusieurs décennies.

Vos tests doivent permettre d'identifier le bug présent dans le code.

Appel professeur

À demander au candidat

  1. Pourquoi choisir les Marquises pour tester une seule décennie ? Que se passerait-il avec la Société ?
  2. Avec le code fourni, test_zone_inexistante passe-t-il ? Pourquoi ce test ne révèle-t-il pas le bug ?
  3. Décrivez pas à pas int(releve['date'].split('-')[0]). Quel est le type avant int ?
Point de vigilance

Les moyennes attendues se calculent à la main : Société 27,0 pour 2010-2011 et 28,5 pour 2020-2021.

Seuls les tests qui vérifient les clés 2010 ou 2020 échouent sur le code fourni : ce sont eux qui désignent la ligne fautive.

Résultats attendus
Code fourni, Société
{201: 27.0, 202: 28.5}
4

Question 4Corriger la décennie

Après avoir identifié le bug grâce à vos tests, corriger la fonction evolution_par_decennie. Elle se trouve à la question 3.

Appel professeur

À demander au candidat

  1. Pour 2021, que valent annee // 10 et (annee // 10) * 10 ? Pourquoi l'une donne-t-elle une clé fausse ?
  2. Pourquoi passer par des listes de températures plutôt qu'accumuler directement une somme ?
Point de vigilance

Le code s'exécute sans erreur : seules les clés du dictionnaire sont fausses (201 au lieu de 2010).

Résultats attendus
Société
{2010: 27.0, 2020: 28.5}
Tuamotu
{2010: 26.8, 2020: 27.75}
Marquises
{2020: 26.0}

Le fichier du candidat

Le jour de l'épreuve, le candidat travaille dans un seul fichier. Ce bouton rassemble vos cellules dans l'ordre, telles qu'elles sont à l'écran, en un analyse_temperatures_polynesie.py à ouvrir dans votre éditeur habituel.

Chargement de Python…