Épreuve pratique NSI

Sujet n° 19 · Session 2026 · 1 heure

Les réservoirs d'eau d'une île

Une commune polynésienne surveille ses réservoirs pour anticiper la sécheresse. Le candidat repère les pénuries, totalise l'eau par district, corrige une moyenne fausse d'un seul caractère, puis désigne les districts vulnérables.

  • Liste de dictionnaires
  • Dictionnaire d'agrégation
  • Moyenne
  • Assertions
  • Composition de fonctions

Mise en situationLes réservoirs

Un réservoir est un dictionnaire : "nom" (str), "capacite" (int, capacité maximale en litres), "volume" (int, volume d'eau disponible en litres) et "district" (str, lieu desservi). Plusieurs réservoirs peuvent alimenter un même district. Le fichier donnees.py contient la liste reservoirs :

NomCapacité (L)Volume (L)District
Nuiavai100 00055 000Tepua
Farepape120 00045 000Fare
Vaipuna80 00060 000Hiva Oro
Vaihere95 00020 000Fare
Teanavai110 00090 000Avera
Matavai70 00025 000Tepua
Anaʻitea85 00030 000Hiva Oro
Faaroa60 00040 000Avera
Vaitiare105 00095 000Fare
Motuavai90 00010 000Tepua

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 1Un réservoir en pénurie ?

Un réservoir est considéré comme en pénurie si son taux de remplissage est strictement inférieur à 20 %. Écrire en Python une fonction nommée est_en_penurie qui prend en paramètres une liste de réservoirs et le nom d'un réservoir. On supposera que le nom donné correspond à un réservoir présent dans les données. La fonction renverra un booléen indiquant si ce réservoir est en pénurie.

Appel professeur

À demander au candidat

  1. Votre fonction renvoie-t-elle toujours une valeur ? Que se passe-t-il si le nom est absent des données ?
  2. Pourquoi peut-on écrire directement return r['volume'] / r['capacite'] < 0.2 ?
Point de vigilance

« Strictement inférieur à 20 % » : Vaihere (21 %) n'est pas en pénurie, Motuavai (11 %) l'est.

Résultats attendus
En pénurie
Motuavai seulement
2

Question 2L'eau disponible par district

Écrire en Python une fonction nommée volume_par_district qui prend en paramètres une liste de réservoirs et qui renvoie un dictionnaire ayant pour clés chaque nom différent de district associés au volume total d'eau, en litres, disponible dans ce district.

Appel professeur

À demander au candidat

  1. Comment votre dictionnaire est-il initialisé pour un district rencontré pour la première fois ?
  2. Quelle est la différence entre parcourir les clés et les valeurs d'un dictionnaire ?
Point de vigilance

Créer la clé avant d'ajouter, sinon KeyError au premier réservoir de chaque district.

Résultats attendus
Tepua, Fare, Hiva Oro, Avera
90 000, 160 000, 90 000, 130 000 L
3

Question 3Une moyenne fausse

Le fichier gestion_eau.py contient aussi les fonctions volume_moyen, liste_districts et reservoirs_par_district. La fonction volume_moyen est censée renvoyer le volume moyen d'eau disponible sur l'ensemble des réservoirs de la commune. Le code de cette fonction est incorrect.

Proposer quelques tests simples, sous forme d'assertions, qui permettent de mettre ce ou ces problèmes en évidence :

  • vérifier que la liste contient au moins un réservoir ;
  • vérifier qu'une moyenne doit être inférieure ou égale à la plus grande valeur de capacité parmi les réservoirs de la liste ;
  • vérifier que la fonction renvoie le bon résultat dans un cas simple (par exemple deux réservoirs avec le même volume).

Proposer une version corrigée de la fonction volume_moyen qui valide ces tests et renvoie la valeur correcte.

Appel professeur

À demander au candidat

  1. Avec un seul réservoir, que se passe-t-il avec le code fourni ? Quelle erreur obtient-on ?
  2. Pourquoi le test « deux réservoirs de même volume » est-il si efficace pour révéler l'erreur ?
  3. Que vérifie l'assertion « la moyenne est inférieure ou égale à la plus grande capacité » ? Pourrait-elle échouer avec le code fourni ?
Point de vigilance

Diviser par len(reservoirs) - 1 donne 52 222 L au lieu de 47 000 L, et une division par zéro avec un seul réservoir.

Résultats attendus
Code fourni
52 222 L
Corrigé
47 000 L
4

Question 4Les districts vulnérables

Même si le volume moyen d'eau disponible au niveau de l'ensemble des réservoirs de la commune est satisfaisant, certains districts peuvent présenter un niveau d'eau disponible nettement insuffisant. À l'aide des fonctions précédentes et des fonctions liste_districts et reservoirs_par_district, écrire une fonction districts_vulnerables permettant d'identifier les districts dont le volume moyen est inférieur à 80 % du volume moyen global.

Appel professeur

À demander au candidat

  1. Quelles fonctions déjà écrites réutilisez-vous, et pourquoi ne pas tout recalculer ?
  2. Le seuil de 80 % de la moyenne globale est-il calculé une fois ou à chaque tour de boucle ? Est-ce important ?
Point de vigilance

On compare le volume moyen par réservoir de chaque district, pas le volume total du district.

Résultats attendus
Seuil (80 % de 47 000 L)
37 600 L
Moyennes par district
Tepua 30 000, Fare 53 333, Hiva Oro 45 000, Avera 65 000
Districts vulnérables
Tepua

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 gestion_eau.py à ouvrir dans votre éditeur habituel.

Chargement de Python…