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.
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
- Que se passerait-il sans la variable
trouve, en renvoyant simplementtotal? Dans quel cas le résultat serait-il faux ? mest un dictionnaire : comment accède-t-on à la valeur de la clé"chaude", et quel est son type ?
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
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").
| Heure | 00:00 | 01:00 | 02:00 | 03:00 | 04:00 | 05:00 | Résultat |
|---|---|---|---|---|---|---|---|
| Consommation | 5 | 3 | 0 | 3 | 0 | 0 | False |
| Consommation | 2 | 1 | 1 | 0 | 0 | 0 | True |
Appel professeur
À demander au candidat
- 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 ?
m["heure"] <= "05:00"compare deux chaînes. Pourquoi est-ce correct ici, et faux avec"9:00"?- La boucle parcourt toute la liste, même les autres jours. Est-ce un problème d'exactitude ou de coût ?
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)
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
- Pour l'indice 2 de
[10, 20, 30, 40, 50], que valentvaleurs[i-1],valeurs[i]etvaleurs[i+1]? Que calcule le code, et qu'attendait-on ? - Pourquoi utiliser
assertplutôt queprintdanstest_lissage? Que se passe-t-il quand une assertion échoue ? - Quelle assertion révèle la division par 2 ? Pourquoi
[10, 20, 30]plutôt que[10, 10, 10]?
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]
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
- Quelle erreur provoque une liste d'un seul élément, et à quelle ligne ?
- Que renvoie la fonction fournie pour une liste vide ? Pourquoi n'y a-t-il pas d'erreur dans ce cas ?
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 fourniIndexError[]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.