Épreuve pratique NSI

Sujet n° 12 · Session 2026 · 1 heure

Le refuge pour renards

Un refuge recueille des renards blessés ou orphelins et suit leur poids. Le candidat écrit une classe, l'affiche proprement, puis découvre qu'un import CSV laisse des nombres sous forme de chaînes.

  • Programmation objet
  • Méthode __str__
  • Fichier CSV
  • Types et conversions
  • Débogage

Mise en situationRenards et refuge

Un renard est défini par un identifiant entier, un nom (chaîne de caractères), un poids en kilogrammes (flottant) et une date d'arrivée (chaîne au format AAAA-MM-JJ). Un refuge est défini par son nom, son adresse postale et la liste des objets Renard qu'il héberge.

Les données sont dans le fichier donnees_renards.csv, avec le point-virgule comme séparateur :

idnompoidsdate_arrivee
101Zorro6.52023-01-15
102Roxy5.82023-02-10
103Filou7.22023-03-05

Les trois premières lignes du fichier fourni.

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.

Pour l'examinateur

Repère

L'extrait imprimé dans l'énoncé (Édgar, César, Gérard, Sybille) ne correspond pas au fichier fourni (Zorro, Roxy, Filou…). Le candidat peut s'en étonner.

1

Question 1Le constructeur

Le fichier gestion_refuge.py comporte des éléments à compléter pour définir la classe Renard. Écrire le code du constructeur __init__ de la classe Renard.

Appel professeur

À demander au candidat

  1. Dans __init__, quel est le rôle de self ? Pourquoi ne pas écrire simplement poids = poids ?
  2. Quelle différence entre un attribut et une méthode ? Donnez un exemple de chacun dans votre code.
  3. identifiant est-il un paramètre ou un argument ? Quand parle-t-on d'argument ?
Point de vigilance

Les conversions int et float peuvent se faire ici ou à l'import (question 3) : les deux sont acceptables si le candidat reste cohérent.

2

Question 2Présenter un renard

Écrire le code de la méthode __str__ de la classe Renard qui renvoie une chaîne de caractères qui présente l'animal sous le format précis : "Renard ID [id] - [Nom] (Arrivé le [date_arrivee])".

Tester ensuite cette classe en instanciant un renard dans une variable renard1 ayant pour identifiant 200, se nommant Oscar, ayant un poids de 5.1 kg et étant arrivé le 1er janvier 2026. Afficher les informations de cette instance dans la console.

Appel professeur

À demander au candidat

  1. print(renard1) appelle __str__ implicitement. Qu'afficherait-il si l'on supprimait cette méthode ?
Point de vigilance

Le format est imposé au caractère près, espaces et parenthèses compris.

Résultats attendus
print(renard1)
Renard ID 200 - Oscar (Arrivé le 2026-01-01)
3

Question 3Une importation trompeuse

Le fichier gestion_refuge.py comporte une classe Refuge. Une méthode importer_donnees y est pré-écrite pour lire le fichier CSV et peupler le refuge.

L'exécution de la méthode importer_donnees provoque une erreur logique lors de l'utilisation ultérieure des données, notamment lors de la manipulation du poids et de l'identifiant des renards. Identifier la source de cette erreur dans la lecture des données brutes, proposer une correction du code de la méthode, puis tester cette correction en instanciant le refuge « SOS Goupil » (situé « 12 rue de la Forêt ») et en y important le fichier donnees_renards.csv.

Appel professeur

À demander au candidat

  1. Si poids vaut '5.8', que donne renard.poids < 6.0 ? Pourquoi Python ne signale-t-il rien au moment de l'import ?
  2. csv.DictReader lit chaque ligne comme un dictionnaire. Comment obtenir la valeur de la colonne nom ?
  3. Que garantit with open(...) ? Que se passerait-il sans with si une erreur survenait en pleine lecture ?
Point de vigilance

L'erreur est silencieuse à l'import : les valeurs restent des chaînes et l'erreur n'apparaît qu'à la comparaison avec 6.0.

Résultats attendus
Code fourni, à l'analyse
TypeError : '<' entre str et float
Renards importés
30
4

Question 4Surveiller la corpulence

Le refuge utilise ces données pour surveiller la santé des animaux. Les vétérinaires considèrent qu'un renard est peu corpulent si son poids est strictement inférieur à 6.0 kg. La classe Refuge dispose de deux méthodes nommées lister_peu_corpulents et pourcentage_peu_corpulents pour effectuer ce suivi.

Exécuter les deux méthodes d'analyse de la corpulence sur l'instance de votre refuge. Justifier le pourcentage obtenu en isolant et en affichant le nombre de renards peu corpulents par rapport au nombre total de renards hébergés.

Appel professeur

À demander au candidat

  1. Réécrivez la liste en compréhension de lister_peu_corpulents avec une boucle for classique.
  2. Pourquoi le test len(self.liste_renards) == 0 est-il indispensable dans pourcentage_peu_corpulents ?
Point de vigilance

lister_peu_corpulents renvoie une liste d'objets Renard : c'est sa longueur qu'il faut comparer au nombre total.

Résultats attendus
Peu corpulents
15 sur 30
Pourcentage
50,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 gestion_refuge.py à ouvrir dans votre éditeur habituel.

Chargement de Python…