ajout exercices, corrections diverses, glossaire

- Ajout des 10 TPs d'évaluation (sans PDF)
- Création GLOSSAIRE.md et AMELIORATIONS.md
- Corrections f-strings, eval(), sommaires

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-29 23:37:26 +01:00
parent 9ee1dcba80
commit 1290ccf453
43 changed files with 8682 additions and 42 deletions

View File

@@ -0,0 +1,527 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "cell-0",
"metadata": {},
"source": [
"# TP Évaluation - Gestion d'équipe de Football\n",
"\n",
"**Durée : 1h30**\n",
"\n",
"**Nom :** \n",
"\n",
"**Prénom :**\n",
"\n",
"---\n",
"\n",
"Dans ce TP, vous allez créer un système de gestion d'équipe de football.\n",
"\n",
"**Compétences évaluées :**\n",
"- Manipulation de tuples et listes\n",
"- Dictionnaires et structures imbriquées\n",
"- Algorithmes de sélection"
]
},
{
"cell_type": "markdown",
"id": "cell-1",
"metadata": {},
"source": [
"## Données initiales\n",
"\n",
"**Exécutez cette cellule avant de commencer.**"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-2",
"metadata": {},
"outputs": [],
"source": [
"# Effectif de l'equipe\n",
"# Chaque joueur est un tuple : (nom, poste, note_globale, stats)\n",
"# stats est un dictionnaire avec les caracteristiques\n",
"\n",
"effectif = [\n",
" (\"Mbappe\", \"ATT\", 91, {\"vitesse\": 97, \"tir\": 89, \"passe\": 80, \"dribble\": 92, \"defense\": 36, \"physique\": 78}),\n",
" (\"Griezmann\", \"ATT\", 87, {\"vitesse\": 80, \"tir\": 86, \"passe\": 84, \"dribble\": 88, \"defense\": 56, \"physique\": 72}),\n",
" (\"Dembele\", \"ATT\", 86, {\"vitesse\": 93, \"tir\": 78, \"passe\": 82, \"dribble\": 90, \"defense\": 32, \"physique\": 63}),\n",
" (\"Thuram\", \"ATT\", 84, {\"vitesse\": 86, \"tir\": 80, \"passe\": 72, \"dribble\": 82, \"defense\": 42, \"physique\": 84}),\n",
" (\"Tchouameni\", \"MIL\", 86, {\"vitesse\": 74, \"tir\": 72, \"passe\": 80, \"dribble\": 76, \"defense\": 82, \"physique\": 86}),\n",
" (\"Kante\", \"MIL\", 88, {\"vitesse\": 78, \"tir\": 66, \"passe\": 75, \"dribble\": 81, \"defense\": 87, \"physique\": 82}),\n",
" (\"Rabiot\", \"MIL\", 82, {\"vitesse\": 72, \"tir\": 75, \"passe\": 79, \"dribble\": 80, \"defense\": 76, \"physique\": 80}),\n",
" (\"Camavinga\", \"MIL\", 83, {\"vitesse\": 82, \"tir\": 64, \"passe\": 78, \"dribble\": 82, \"defense\": 76, \"physique\": 78}),\n",
" (\"Hernandez\", \"DEF\", 85, {\"vitesse\": 84, \"tir\": 65, \"passe\": 76, \"dribble\": 78, \"defense\": 82, \"physique\": 82}),\n",
" (\"Upamecano\", \"DEF\", 84, {\"vitesse\": 80, \"tir\": 48, \"passe\": 62, \"dribble\": 58, \"defense\": 86, \"physique\": 88}),\n",
" (\"Konate\", \"DEF\", 84, {\"vitesse\": 78, \"tir\": 42, \"passe\": 56, \"dribble\": 52, \"defense\": 87, \"physique\": 86}),\n",
" (\"Saliba\", \"DEF\", 86, {\"vitesse\": 76, \"tir\": 38, \"passe\": 65, \"dribble\": 60, \"defense\": 88, \"physique\": 84}),\n",
" (\"Maignan\", \"GK\", 87, {\"plongeon\": 88, \"reflexes\": 89, \"placement\": 84, \"jeu_pied\": 78}),\n",
" (\"Lloris\", \"GK\", 85, {\"plongeon\": 86, \"reflexes\": 87, \"placement\": 86, \"jeu_pied\": 72})\n",
"]\n",
"\n",
"# Formation 4-3-3 : nombre de joueurs par poste\n",
"formation = {\n",
" \"GK\": 1, # Gardien\n",
" \"DEF\": 4, # Defenseurs\n",
" \"MIL\": 3, # Milieux\n",
" \"ATT\": 3 # Attaquants\n",
"}\n",
"\n",
"# Historique des matchs : (adversaire, buts_pour, buts_contre, buteurs)\n",
"matchs = [\n",
" (\"Allemagne\", 2, 1, [\"Mbappe\", \"Griezmann\"]),\n",
" (\"Belgique\", 3, 0, [\"Mbappe\", \"Mbappe\", \"Dembele\"]),\n",
" (\"Espagne\", 1, 2, [\"Thuram\"]),\n",
" (\"Italie\", 2, 2, [\"Griezmann\", \"Mbappe\"]),\n",
" (\"Portugal\", 0, 1, []),\n",
" (\"Angleterre\", 3, 1, [\"Mbappe\", \"Griezmann\", \"Dembele\"])\n",
"]"
]
},
{
"cell_type": "markdown",
"id": "cell-3",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 1 - Gestion de l'effectif (25 min)\n",
"\n",
"### 1.1 Affichage des joueurs (4 pts)\n",
"\n",
"Écrivez une fonction `afficher_joueur(joueur)` qui affiche un joueur de manière formatée.\n",
"\n",
"Exemple pour un joueur de champ :\n",
"```\n",
"Mbappe (ATT) - Note: 91\n",
" VIT:97 | TIR:89 | PAS:80 | DRI:92\n",
"```\n",
"\n",
"Pour les gardiens (poste \"GK\"), afficher leurs stats spécifiques (plongeon, reflexes, etc.)."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-4",
"metadata": {},
"outputs": [],
"source": [
"def afficher_joueur(joueur):\n",
" # Extraire les infos du tuple\n",
" nom = joueur[0]\n",
" poste = joueur[1]\n",
" note = joueur[2]\n",
" stats = joueur[3]\n",
" \n",
" print(nom, \"(\" + poste + \") - Note:\", note)\n",
" \n",
" if poste == \"GK\":\n",
" # Afficher stats gardien\n",
" # Votre code ici\n",
" pass\n",
" else:\n",
" # Afficher stats joueur de champ\n",
" # Votre code ici\n",
" pass\n",
"\n",
"# Tests\n",
"afficher_joueur(effectif[0]) # Joueur de champ\n",
"print()\n",
"afficher_joueur(effectif[12]) # Gardien"
]
},
{
"cell_type": "markdown",
"id": "cell-5",
"metadata": {},
"source": [
"### 1.2 Filtrage par poste (4 pts)\n",
"\n",
"Écrivez une fonction `joueurs_par_poste(effectif, poste)` qui renvoie la liste des joueurs d'un poste donné, triés par note décroissante."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-6",
"metadata": {},
"outputs": [],
"source": [
"def joueurs_par_poste(effectif, poste):\n",
" joueurs = []\n",
" \n",
" for joueur in effectif:\n",
" if joueur[1] == poste:\n",
" joueurs.append(joueur)\n",
" \n",
" # Trier par note (indice 2) decroissante\n",
" joueurs = sorted(joueurs, key=lambda j: j[2], reverse=True)\n",
" return joueurs\n",
"\n",
"# Test\n",
"print(\"Attaquants :\")\n",
"for j in joueurs_par_poste(effectif, \"ATT\"):\n",
" print(\" \", j[0], \"-\", j[2])"
]
},
{
"cell_type": "markdown",
"id": "cell-7",
"metadata": {},
"source": [
"### 1.3 Meilleur dans une stat (4 pts)\n",
"\n",
"Écrivez une fonction `meilleur_stat(effectif, stat)` qui renvoie le tuple `(nom_joueur, valeur)` du joueur ayant la meilleure valeur pour cette statistique.\n",
"\n",
"*Attention : les gardiens n'ont pas les mêmes stats que les joueurs de champ.*"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-8",
"metadata": {},
"outputs": [],
"source": [
"def meilleur_stat(effectif, stat):\n",
" meilleur_nom = None\n",
" meilleure_valeur = -1\n",
" \n",
" for joueur in effectif:\n",
" nom = joueur[0]\n",
" stats = joueur[3]\n",
" \n",
" # Verifier si le joueur a cette stat\n",
" if stat in stats:\n",
" valeur = stats[stat]\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return (meilleur_nom, meilleure_valeur)\n",
"\n",
"# Tests\n",
"print(\"Plus rapide :\", meilleur_stat(effectif, \"vitesse\"))\n",
"print(\"Meilleur tireur :\", meilleur_stat(effectif, \"tir\"))\n",
"print(\"Meilleurs reflexes :\", meilleur_stat(effectif, \"reflexes\"))"
]
},
{
"cell_type": "markdown",
"id": "cell-9",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 2 - Composition d'équipe (35 min)\n",
"\n",
"### 2.1 Générer le XI de départ (6 pts)\n",
"\n",
"Écrivez une fonction `generer_xi(effectif, formation)` qui génère automatiquement le meilleur XI possible.\n",
"\n",
"Pour chaque poste, sélectionner les meilleurs joueurs (par note globale) en respectant le nombre requis.\n",
"\n",
"Renvoie un dictionnaire `{poste: [liste des joueurs sélectionnés]}`"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-10",
"metadata": {},
"outputs": [],
"source": [
"def generer_xi(effectif, formation):\n",
" xi = {}\n",
" \n",
" for poste, nb_joueurs in formation.items():\n",
" # Recuperer les joueurs de ce poste, tries par note\n",
" candidats = joueurs_par_poste(effectif, poste)\n",
" \n",
" # Prendre les n meilleurs\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return xi\n",
"\n",
"# Test\n",
"xi = generer_xi(effectif, formation)\n",
"print(\"=== XI de depart ===\")\n",
"for poste, joueurs in xi.items():\n",
" print(poste + \":\")\n",
" for j in joueurs:\n",
" print(\" -\", j[0], \"(\", j[2], \")\")"
]
},
{
"cell_type": "markdown",
"id": "cell-11",
"metadata": {},
"source": [
"### 2.2 Note moyenne du XI (5 pts)\n",
"\n",
"Écrivez une fonction `note_equipe(xi)` qui calcule la note moyenne de l'équipe sélectionnée."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-12",
"metadata": {},
"outputs": [],
"source": [
"def note_equipe(xi):\n",
" total_notes = 0\n",
" nb_joueurs = 0\n",
" \n",
" for poste, joueurs in xi.items():\n",
" for joueur in joueurs:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" if nb_joueurs == 0:\n",
" return 0\n",
" \n",
" return round(total_notes / nb_joueurs, 1)\n",
"\n",
"# Test\n",
"print(\"Note de l'equipe :\", note_equipe(xi))"
]
},
{
"cell_type": "markdown",
"id": "cell-13",
"metadata": {},
"source": [
"### 2.3 Statistiques des matchs (6 pts)\n",
"\n",
"Écrivez une fonction `stats_matchs(matchs)` qui renvoie un dictionnaire avec :\n",
"- `\"victoires\"` : nombre de victoires\n",
"- `\"nuls\"` : nombre de matchs nuls\n",
"- `\"defaites\"` : nombre de défaites\n",
"- `\"buts_pour\"` : total des buts marqués\n",
"- `\"buts_contre\"` : total des buts encaissés"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-14",
"metadata": {},
"outputs": [],
"source": [
"def stats_matchs(matchs):\n",
" victoires = 0\n",
" nuls = 0\n",
" defaites = 0\n",
" buts_pour = 0\n",
" buts_contre = 0\n",
" \n",
" for match in matchs:\n",
" adversaire = match[0]\n",
" bp = match[1] # buts pour\n",
" bc = match[2] # buts contre\n",
" \n",
" buts_pour = buts_pour + bp\n",
" buts_contre = buts_contre + bc\n",
" \n",
" if bp > bc:\n",
" victoires = victoires + 1\n",
" elif bp == bc:\n",
" nuls = nuls + 1\n",
" else:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return {\n",
" \"victoires\": victoires,\n",
" \"nuls\": nuls,\n",
" \"defaites\": defaites,\n",
" \"buts_pour\": buts_pour,\n",
" \"buts_contre\": buts_contre\n",
" }\n",
"\n",
"# Test\n",
"stats = stats_matchs(matchs)\n",
"print(\"Bilan :\", stats[\"victoires\"], \"V\", stats[\"nuls\"], \"N\", stats[\"defaites\"], \"D\")\n",
"print(\"Buts :\", stats[\"buts_pour\"], \"-\", stats[\"buts_contre\"])"
]
},
{
"cell_type": "markdown",
"id": "cell-15",
"metadata": {},
"source": [
"### 2.4 Classement des buteurs (6 pts)\n",
"\n",
"Écrivez une fonction `classement_buteurs(matchs)` qui renvoie une liste de tuples `(joueur, nb_buts)` triée par nombre de buts décroissant."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-16",
"metadata": {},
"outputs": [],
"source": [
"def classement_buteurs(matchs):\n",
" # Dictionnaire pour compter les buts par joueur\n",
" buts_par_joueur = {}\n",
" \n",
" for match in matchs:\n",
" buteurs = match[3] # liste des buteurs\n",
" for buteur in buteurs:\n",
" if buteur not in buts_par_joueur:\n",
" buts_par_joueur[buteur] = 0\n",
" buts_par_joueur[buteur] = buts_par_joueur[buteur] + 1\n",
" \n",
" # Convertir en liste de tuples et trier\n",
" classement = []\n",
" for joueur, buts in buts_par_joueur.items():\n",
" classement.append((joueur, buts))\n",
" \n",
" classement = sorted(classement, key=lambda x: x[1], reverse=True)\n",
" return classement\n",
"\n",
"# Test\n",
"print(\"Classement des buteurs :\")\n",
"for i, (joueur, buts) in enumerate(classement_buteurs(matchs), 1):\n",
" print(\" \", i, \".\", joueur, \":\", buts, \"but(s)\")"
]
},
{
"cell_type": "markdown",
"id": "cell-17",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 3 - Bonus (20 min)\n",
"\n",
"### 3.1 Points forts et faibles (5 pts)\n",
"\n",
"Écrivez une fonction `analyser_joueur(joueur)` qui renvoie un dictionnaire avec :\n",
"- `\"points_forts\"` : liste des stats >= 85\n",
"- `\"points_faibles\"` : liste des stats <= 60"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-18",
"metadata": {},
"outputs": [],
"source": [
"def analyser_joueur(joueur):\n",
" stats = joueur[3]\n",
" points_forts = []\n",
" points_faibles = []\n",
" \n",
" for stat, valeur in stats.items():\n",
" if valeur >= 85:\n",
" points_forts.append(stat)\n",
" # Votre code ici pour les points faibles\n",
" pass\n",
" \n",
" return {\n",
" \"points_forts\": points_forts,\n",
" \"points_faibles\": points_faibles\n",
" }\n",
"\n",
"# Test\n",
"analyse = analyser_joueur(effectif[0]) # Mbappe\n",
"print(\"Analyse de Mbappe :\")\n",
"print(\" Points forts :\", analyse[\"points_forts\"])\n",
"print(\" Points faibles :\", analyse[\"points_faibles\"])"
]
},
{
"cell_type": "markdown",
"id": "cell-19",
"metadata": {},
"source": [
"### 3.2 Rechercher un joueur (4 pts)\n",
"\n",
"Écrivez une fonction `rechercher_joueur(effectif, nom)` qui renvoie le joueur correspondant au nom (ou None si non trouvé)."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-20",
"metadata": {},
"outputs": [],
"source": [
"def rechercher_joueur(effectif, nom):\n",
" for joueur in effectif:\n",
" if joueur[0] == nom:\n",
" return joueur\n",
" return None\n",
"\n",
"# Test\n",
"joueur = rechercher_joueur(effectif, \"Kante\")\n",
"if joueur:\n",
" afficher_joueur(joueur)"
]
},
{
"cell_type": "markdown",
"id": "cell-21",
"metadata": {},
"source": [
"### 3.3 Performance d'un joueur (5 pts)\n",
"\n",
"Écrivez une fonction `performance_buteur(nom, matchs)` qui renvoie le nombre de buts et la moyenne de buts par match pour un joueur donné."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-22",
"metadata": {},
"outputs": [],
"source": [
"def performance_buteur(nom, matchs):\n",
" nb_buts = 0\n",
" nb_matchs = len(matchs)\n",
" \n",
" for match in matchs:\n",
" buteurs = match[3]\n",
" for buteur in buteurs:\n",
" if buteur == nom:\n",
" nb_buts = nb_buts + 1\n",
" \n",
" moyenne = 0\n",
" if nb_matchs > 0:\n",
" moyenne = round(nb_buts / nb_matchs, 2)\n",
" \n",
" return {\n",
" \"buts\": nb_buts,\n",
" \"matchs\": nb_matchs,\n",
" \"moyenne\": moyenne\n",
" }\n",
"\n",
"# Test\n",
"perf = performance_buteur(\"Mbappe\", matchs)\n",
"print(\"Performance de Mbappe :\")\n",
"print(\" Buts :\", perf[\"buts\"])\n",
"print(\" Moyenne par match :\", perf[\"moyenne\"])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}