# -*- coding: utf-8 -*- """ Corrigé Python - Bac NSI 2026 - Épreuve pratique - Sujet 12 Thème : refuge de renards, POO et fichier CSV """ from __future__ import annotations import csv class Renard: """Classe représentant un renard dans le refuge.""" def __init__(self, identifiant: int, nom: str, poids: float, date_arrivee: str) -> None: self.identifiant = identifiant self.nom = nom self.poids = poids self.date_arrivee = date_arrivee def __str__(self) -> str: return f"Renard ID {self.identifiant} - {self.nom} (Arrivé le {self.date_arrivee})" class Refuge: """Classe représentant un refuge contenant une liste de renards.""" def __init__(self, nom: str, adresse: str) -> None: self.nom = nom self.adresse = adresse self.liste_renards = [] def recueillir(self, un_renard: Renard) -> None: self.liste_renards.append(un_renard) def lister_peu_corpulents(self) -> list[Renard]: return [renard for renard in self.liste_renards if renard.poids < 6.0] def pourcentage_peu_corpulents(self) -> float: if len(self.liste_renards) == 0: return 0.0 return len(self.lister_peu_corpulents()) / len(self.liste_renards) * 100 def importer_donnees(self, nom_fichier: str) -> None: """ Importe les renards depuis un fichier CSV. Correction importante : id est converti en int et poids en float. """ with open(nom_fichier, "r", encoding="utf-8") as f: lignes = csv.DictReader(f, delimiter=";") for ligne in lignes: renard = Renard( int(ligne["id"]), ligne["nom"], float(ligne["poids"]), ligne["date_arrivee"], ) self.recueillir(renard) def tests() -> None: renard1 = Renard(200, "Oscar", 5.1, "2026-01-01") assert str(renard1) == "Renard ID 200 - Oscar (Arrivé le 2026-01-01)" refuge = Refuge("Test", "Adresse") refuge.recueillir(renard1) refuge.recueillir(Renard(201, "Alice", 6.5, "2026-01-02")) assert len(refuge.lister_peu_corpulents()) == 1 assert refuge.pourcentage_peu_corpulents() == 50.0 print("Tous les tests du sujet 12 sont passés.") if __name__ == "__main__": tests()