Accueil

Corrigé Sujet N°12

- Gestion d'un Refuge pour Renards -

Vous pouvez télécharger les éléments suivants en cliquant sur les boutons associés :
Sujet (PDF) Fichier Python Initial Données CSV
Fichier Python Corrigé

Question 1

Écrire le code du constructeur __init__ de la classe Renard, qui initialise les quatre attributs : identifiant, nom, poids et date_arrivee.
Correction : Le constructeur reçoit les quatre paramètres et les affecte aux attributs d'instance avec le préfixe self.. C'est le mécanisme standard de Python pour créer des attributs d'objet.

class Renard:
    def __init__(self, identifiant, nom, poids, date_arrivee):
        self.identifiant = identifiant
        self.nom = nom
        self.poids = poids
        self.date_arrivee = date_arrivee
                

Question 2

Écrire le code de la méthode __str__ de la classe Renard qui renvoie une chaîne au format précis : "Renard ID [id] - [Nom] (Arrivé le [date_arrivee])". Tester ensuite en instanciant un renard renard1 (ID 200, Oscar, 5.1 kg, arrivé le 1er janvier 2026).
Correction : La méthode __str__ est la méthode spéciale appelée par print(). On utilise une f-string pour insérer les attributs de l'objet dans la chaîne au format demandé.

    def __str__(self):
        return f"Renard ID {self.identifiant} - {self.nom} (Arrivé le {self.date_arrivee})"

# Test
renard1 = Renard(200, "Oscar", 5.1, "2026-01-01")
print(renard1)
# >> Renard ID 200 - Oscar (Arrivé le 2026-01-01)
                

Question 3

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 l'erreur, proposer une correction, puis tester en instanciant le refuge "SOS Goupil".
Identification de l'erreur : Dans le code original, les valeurs lues depuis le CSV sont toutes des chaînes de caractères (str). Les champs id et poids sont transmis tels quels au constructeur de Renard sans conversion de type. Ainsi, renard.poids contient la chaîne "6.5" au lieu du flottant 6.5. La comparaison renard.poids < 6.0 dans lister_peu_corpulents lève alors une TypeError (impossible de comparer un str à un float en Python 3).

Correction : Il faut convertir explicitement ligne['id'] en int et ligne['poids'] en float lors de la création de chaque objet Renard.

    def importer_donnees(self, nom_fichier):
        print(f"Tentative d'importation depuis {nom_fichier}...")
        with open(nom_fichier, 'r', encoding='utf-8') as f:
            lignes = csv.DictReader(f, delimiter=';')
            for ligne in lignes:
                renard = Renard(
                    int(ligne['id']),        # CORRECTION : conversion en int
                    ligne['nom'],
                    float(ligne['poids']),   # CORRECTION : conversion en float
                    ligne['date_arrivee']
                )
                self.recueillir(renard)

# Test
refuge = Refuge("SOS Goupil", "1 rue de la Forêt, 75000 Paris")
refuge.importer_donnees("donnees_renards.csv")
print(f"Renards importés : {len(refuge.liste_renards)}")
# >> Renards importés : 30
                

Question 4

Exécuter les deux méthodes d'analyse de la corpulence sur l'instance du 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.
Correction : Un renard est dit peu corpulent si son poids est strictement inférieur à 6,0 kg. On compte les renards concernés puis on calcule le ratio. Avec les 30 renards du fichier CSV, 13 ont un poids < 6,0 kg, ce qui donne un pourcentage d'environ 43,3 %.

peu_corpulents = refuge.lister_peu_corpulents()
total = len(refuge.liste_renards)
nb_peu = len(peu_corpulents)

print(f"Renards peu corpulents : {nb_peu} / {total}")
print(f"Pourcentage : {refuge.pourcentage_peu_corpulents():.1f}%")

# Affichage détaillé
for r in peu_corpulents:
    print(f"  {r}")

# >> Renards peu corpulents : 13 / 30
# >> Pourcentage : 43.3%
# >> Renard ID 102 - Roxy (Arrivé le 2023-02-10)
# >> Renard ID 104 - Kira (Arrivé le 2024-11-20)
# >> ... (etc.)
                

Justification : 13 renards sur 30 ont un poids strictement inférieur à 6,0 kg. Le calcul est : 13 ÷ 30 × 100 ≈ 43,3 %. Cette proportion représente près de la moitié des pensionnaires du refuge, ce qui peut alerter les vétérinaires sur un suivi nutritionnel à renforcer.