Accueil

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 :
Sujet (PDF) Fichier Python Initial Données CSV (budget complet)
Fichier Python Corrigé

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).