Épreuve pratique NSI

Sujet n° 10 · Session 2026 · 1 heure

La consommation d'eau d'un foyer

Un compteur relève chaque heure l'eau chaude et l'eau froide consommées. Le candidat calcule une consommation journalière, détecte une fuite nocturne, puis corrige une moyenne glissante et cherche ses cas limites.

  • Liste de dictionnaires
  • Compteur de valeurs consécutives
  • Comparaison de chaînes
  • Débogage
  • Cas limites

Mise en situationLes relevés

Les données sont une liste de dictionnaires, triée par jour et heure croissants. Chaque mesure contient "jour" (chaîne "AAAA-MM-JJ"), "heure" (chaîne "HH:MM"), "chaude" et "froide" (volumes en litres consommés depuis la mesure précédente, entiers).

Exemple de mesure : {"jour": "2025-02-04", "heure": "08:00", "chaude": 5, "froide": 8}. La consommation totale d'une mesure est la somme de l'eau chaude et de l'eau froide.

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 1Consommation d'une journée

Écrire une fonction total_conso qui prend en paramètres donnees (une liste de mesures) et jour (une chaîne représentant le jour, par exemple "2025-02-04") et renvoie la consommation totale d'eau (somme de l'eau chaude et de l'eau froide) de toutes les mesures pour ce jour.

Par convention, si aucune mesure n'existe pour ce jour, la fonction renvoie None. Par exemple, total_conso(donnees, "2025-02-04") renvoie 33 et total_conso(donnees, "2025-12-25") ne renvoie rien.

Appel professeur

À demander au candidat

  1. Que se passerait-il sans la variable trouve, en renvoyant simplement total ? Dans quel cas le résultat serait-il faux ?
  2. m est un dictionnaire : comment accède-t-on à la valeur de la clé "chaude", et quel est son type ?
Point de vigilance

Renvoyer None seulement si aucune mesure n'a été trouvée : un total nul n'est pas une absence de mesure.

Résultats attendus
4 février
33 L
5 février
6 L
25 décembre
None
2

Question 2Une fuite la nuit ?

On considère que la nuit, quand tout le monde dort, la consommation d'eau n'est pas censée être supérieure à zéro pendant plusieurs heures consécutives. Une fuite est donc suspectée lorsqu'il y a au moins 3 mesures consécutives entre 00:00 et 05:00 inclus où la consommation totale est toujours non nulle (eau chaude + eau froide > 0).

Écrire une fonction fuite_possible qui renvoie True si une fuite est possible ce jour-là, False sinon. Cette fonction prend en paramètres donnees (une liste de mesures) et jour (une chaîne de caractères représentant la date, au format "AAAA-MM-JJ").

Heure00:0001:0002:0003:0004:0005:00Résultat
Consommation530300False
Consommation211000True

Appel professeur

À demander au candidat

  1. Pourquoi remettre le compteur à 0 dès qu'une mesure est nulle ? Que donnerait le code sans cette remise à zéro sur 2, 0, 1, 1, 0 ?
  2. m["heure"] <= "05:00" compare deux chaînes. Pourquoi est-ce correct ici, et faux avec "9:00" ?
  3. La boucle parcourt toute la liste, même les autres jours. Est-ce un problème d'exactitude ou de coût ?
Point de vigilance

Il faut des mesures non nulles consécutives : le compteur repart de 0 à chaque mesure nulle.

La plage 00:00 à 05:00 est incluse ; la comparaison de chaînes marche grâce au format sur deux chiffres.

Résultats attendus
4 février
False
5 février
True (01:00, 02:00, 03:00)
3

Question 3Une moyenne glissante fausse

Le fichier analyse_eau.py contient une fonction appelée lissage_conso censée calculer une moyenne sur 3 valeurs pour lisser les mesures de la consommation. Pour les cas particuliers :

  • premier élément : faire la moyenne du premier et du deuxième ;
  • dernier élément : faire la moyenne du dernier et de l'avant-dernier ;
  • éléments intermédiaires : faire la moyenne de trois valeurs (précédente, actuelle, suivante).

La fonction doit toujours renvoyer une liste de même taille que la liste d'origine. Cependant, cette fonction contient une erreur.

Expliquer pourquoi la fonction lissage_conso, testée avec la liste test = [10, 20, 30, 40, 50], présente un résultat incorrect, et proposer une correction.

Appel professeur

À demander au candidat

  1. Pour l'indice 2 de [10, 20, 30, 40, 50], que valent valeurs[i-1], valeurs[i] et valeurs[i+1] ? Que calcule le code, et qu'attendait-on ?
  2. Pourquoi utiliser assert plutôt que print dans test_lissage ? Que se passe-t-il quand une assertion échoue ?
  3. Quelle assertion révèle la division par 2 ? Pourquoi [10, 20, 30] plutôt que [10, 10, 10] ?
Point de vigilance

Les éléments intermédiaires sont divisés par 2 au lieu de 3. Une liste constante ne le révèle pas, il faut des valeurs différentes.

Résultats attendus
Code fourni sur test
[15.0, 30.0, 45.0, 60.0, 45.0]
Après correction
[15.0, 20.0, 30.0, 40.0, 45.0]
4

Question 4Un cas limite oublié

La fonction lissage_conso prend en compte les cas limites dans lesquels la liste fournie contient seulement deux valeurs. Identifier un autre cas limite qui n'est pas pris en compte par la fonction, et proposer une solution pour y remédier.

Appel professeur

À demander au candidat

  1. Quelle erreur provoque une liste d'un seul élément, et à quelle ligne ?
  2. Que renvoie la fonction fournie pour une liste vide ? Pourquoi n'y a-t-il pas d'erreur dans ce cas ?
Point de vigilance

Le cas fautif est la liste à un seul élément : valeurs[i+1] lève une IndexError dès i == 0.

La liste vide ne pose pas de problème : la boucle ne s'exécute pas et la fonction renvoie [].

Résultats attendus
[7] avec le code fourni
IndexError
[] avec le code fourni
[]

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

Chargement de Python…