Corrigé Sujet N°17
- Analyse du Budget d'un Club de Handball -
Vous pouvez télécharger les éléments suivants en cliquant sur les boutons associés :
Question 1
Écrire la fonction
total_par_type(mouvements, type_mouvement) qui renvoie la somme des montants pour un type donné ('recette' ou 'dépense'). Créer ensuite une fonction test_total() avec au moins deux assertions.
Correction : On parcourt la liste et on accumule les montants dont le champ
'type' correspond au paramètre. Si aucun mouvement ne correspond, la variable total reste à 0, ce qui satisfait la condition de l'énoncé.
def total_par_type(mouvements, type_mouvement):
"""Renvoie la somme des montants pour le type demandé."""
total = 0
for m in mouvements:
if m['type'] == type_mouvement:
total += m['montant']
return total
def test_total():
# Recettes : 1200 + 300 + 800 = 2300
assert total_par_type(mouvements_test, 'recette') == 2300.0
# Dépenses : 450 + 200 + 1500 = 2150
assert total_par_type(mouvements_test, 'dépense') == 2150.0
# Type inexistant → 0
assert total_par_type(mouvements_test, 'inconnu') == 0
print("test_total : OK")
test_total()
Question 2
Calculer manuellement le solde annuel pour
mouvements_test, puis écrire test_solde_annuel() avec une assertion. Exécuter le test (qui doit échouer).
Calcul manuel :
Mois 1 : recettes = 1 200 €, dépenses = 0 € → solde = +1 200 €.
Mois 6 : recettes = 300 €, dépenses = 450 € → solde = −150 €.
Mois 12 : recettes = 800 €, dépenses = 200 + 1 500 = 1 700 € → solde = −900 €.
Total attendu = 1 200 − 150 − 900 = 150 €.
def test_solde_annuel():
# Résultat théorique calculé manuellement : 150.0
assert solde_annuel(mouvements_test) == 150.0, \
f"Résultat obtenu : {solde_annuel(mouvements_test)}"
print("test_solde_annuel : OK")
test_solde_annuel()
# → AssertionError : le résultat renvoyé n'est pas 150.0 (bug à corriger)
Question 3
Analyser le code de
solde_annuel, identifier l'erreur logique, expliquer pourquoi certains mouvements sont ignorés, puis proposer une correction. Appliquer ensuite sur le fichier complet.
Identification du bug : La boucle de
solde_annuel est for m in range(1, 12). Or range(1, 12) génère les entiers de 1 à 11 inclus, sans jamais atteindre 12. Tous les mouvements du mois de décembre (mois 12) sont donc ignorés dans le calcul.
Correction : Il suffit d'écrire
range(1, 13) pour couvrir les 12 mois de janvier (1) à décembre (12).
def solde_annuel(mouvements):
total = 0
for m in range(1, 13): # CORRECTION : 13 au lieu de 12 (pour inclure décembre)
total += solde_mensuel(mouvements, m)
return total
# Vérification sur les données de test
assert solde_annuel(mouvements_test) == 150.0
print("Correction validée.")
# Application sur le fichier complet
mouvements_complets = lire_mouvements_depuis_csv("budget_complet.csv")
print("Solde annuel (fichier complet) :", solde_annuel(mouvements_complets), "€")
Remarque : C'est une erreur classique avec
range en Python : la borne supérieure est exclue. Pour itérer de 1 à n inclus, il faut toujours écrire range(1, n+1).
© 2026 - Clément Legoubé