{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Université d’Orléans -- Licence 1 semestre 1 -- 2026-27  <br> Algorithmique et Programmation 1      \n",
    "<h3 align=\"center\">TP 06</h3>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exercice 1 - Exploitation d'un fichier csv\n",
    "\n",
    "On rappelle qu'un fichier csv est un fichier texte (donc utilisable directement avec un éditeur de texte comme gedit) qui regroupe des données par ligne, avec un séparateur de données (classiquement la virgule, le point-virgule, mais on peut en utiliser d'autres).\n",
    "\n",
    "Un fichier csv peut aussi être ouvert avec un logiciel tableur comme LibreOffice, qui va le présenter dans une interface de tableau très lisible, à condition qu'on ait indiqué au logiciel quels sont les séparateurs utilisés.\n",
    "\n",
    "Ici, le fichier qui nous intéresse est *ligue1.csv*. C'est un fichier qui regroupe l'ensemble des résultats des matchs du championnat de football de première division française sur la saison 1995 - 1996. \n",
    "\n",
    "Téléchargez ce fichier de Celene et placez-le à la racine du répertoire où vous avez placé ce notebook.\n",
    "Téléchargez aussi *notes.txt* qui explique les abbréviations utilisées dans le fichier csv.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 1\n",
    "Récupérez les noms des équipes dans une liste python, triée par ordre alphabétique. Vous ferez attention de ne pas utiliser la première ligne qui n'est que la ligne des titres de colonnes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def liste_equipes(nomFichier) :\n",
    "    pass\n",
    "\n",
    "# test\n",
    "equipes = liste_equipes(\"ligue1.csv\")\n",
    "print(equipes)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 2\n",
    "Ecrivez une fonction *matchs_de(equipe, nomFichier)* qui retourne la liste de tous les matchs de l'équipe passée en paramètre. Cette liste sera d'emblée triée par ordre croissant des dates de matchs en principe. Chaque match récupéré sera une liste composée du nom des deux équipes, du score de chaque équipe en fin de match et du type du résultat (H, D ou A). On ne retient pas les résultats à la mi-temps.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matchs_de(equipe, nomFichier) :\n",
    "    pass\n",
    "\n",
    "# test\n",
    "for match in matchs_de(\"Bastia\", \"ligue1.csv\") :\n",
    "    print(match)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 3\n",
    "Pour une victoire, une équipe marque 3 points. Pour un match nul, 1 point et, pour une défaite, 0 point.\n",
    "Ecrivez une fonction *nb_points_apres_n_journees(equipe, nb_journees, nomFichier)* qui retourne le nombre de points inscrits par l'équipe passée en paramètre après les nb_journees premières journées du championnat."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nb_points_apres_n_journees(equipe, nb_journees, nomFichier) :\n",
    "    pass\n",
    "\n",
    "# test \n",
    "# pour n = 38 Auxerre a 72 points, Paris SG 68, etc\n",
    "# voir https://fr.wikipedia.org/wiki/Championnat_de_France_de_football_1995-1996#R%C3%A9sultats\n",
    "\n",
    "n = int(input(\"nombre de journées pour le calcul ? \"))\n",
    "for equipe in equipes :\n",
    "    pts = nb_points_apres_n_journees(equipe, n, \"ligue1.csv\")\n",
    "    print(f\"{equipe} a obtenu {pts} points après les {n} premières journées.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 4\n",
    "Ecrivez une fonction *nb_max_points_apres_n_journees(n, nomFichier)* qui retourne le nombre de points maximum obtenu par l'une des équipes après *n* journées."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nb_max_points_apres_n_journees(n, nomFichier) :\n",
    "    pass\n",
    "\n",
    "# test\n",
    "for i in range(1, 39) :\n",
    "    nbmaxpts = nb_max_points_apres_n_journees(i, \"ligue1.csv\")\n",
    "    print(f\"journée {i} : max_points = {nbmaxpts}\")  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 5\n",
    "Ecrivez une fonction *coleaders_apres_n_journees(n, nomFichier)* qui retourne la liste des coleaders éventuels après *n* journées (autrement dit, la liste des équipes qui ont le plus de points après *n* journées).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def coleaders_apres_n_journees(n, nomFichier) :\n",
    "    pass\n",
    "\n",
    "# test \n",
    "for i in range(1, 39) :\n",
    "    colead = coleaders_apres_n_journees(i, \"ligue1.csv\")\n",
    "    print(f\"après {i} journées, leaders = {colead}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exercice 2 - Ecriture dans un fichier csv\n",
    "Dans cet exercice, on fait le bilan chiffré de la saison, équipe par équipe. Ce bilan global est écrit dans un fichier csv.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 1\n",
    "Ecrivez une fonction *bilan(equipe, nomFichier)* qui retourne le bilan chiffré de l'équipe sous forme d'un dictionnaire. Ce dictionnaire sera par exemple, pour les équipes d'Auxerre, Lille et Metz :\n",
    "\n",
    "{'nom': 'Auxerre', 'pts': 72, 'G': 22, 'N': 6, 'D': 10, 'bp': 66, 'bc': 30, 'diff': 36}\n",
    "\n",
    "{'nom': 'Paris SG', 'pts': 68, 'G': 19, 'N': 11, 'D': 8, 'bp': 65, 'bc': 36, 'diff': 29}\n",
    "\n",
    "{'nom': 'Monaco', 'pts': 68, 'G': 19, 'N': 11, 'D': 8, 'bp': 64, 'bc': 39, 'diff': 25}\n",
    "\n",
    "- pts : nombre total de points\n",
    "- G : nombre total de victoires\n",
    "- N : nombre total de matchs nuls\n",
    "- D : nombre total de défaites\n",
    "- bp : nombre total de buts marqués (buts pour)\n",
    "- bc : nombre total de buts encaissés (buts contre)\n",
    "- diff : différence de buts (bp - bc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bilan(equipe, nomFichier) :\n",
    "    pass\n",
    "\n",
    "\n",
    "# test \n",
    "print(bilan('Auxerre', 'ligue1.csv'))\n",
    "print(bilan('Paris SG', 'ligue1.csv'))\n",
    "print(bilan('Monaco', 'ligue1.csv'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 2\n",
    "Pour départager les équipes qui ont le même nombre de points, il y a un moyen simple : on va ajouter une paire clé/valeur au dictionnaire, construite ainsi : à la clé \"pts_diff\" on fera correspondre la valeur pts + diff / 1000. Ainsi, si la différence de buts n'est pas la même, ce nouvel indicateur fera une différence. \n",
    "\n",
    "Par exemple, pour Paris SG et Monaco, qui ont 68 points chacune, ce nouvel indicateur donne 68 + 0.029 = 68.029 pour Paris SG et \"seulement\" 68.025 pour Monaco, ce qui placera Paris SG devant Monaco au classement final.\n",
    "\n",
    "Ecrivez une fonction *bilan_ameliore(equipe, nomFichier)* qui retourne le bilan classique de l'équipe, enrichi de la paire clé / valeur décrite ci-dessus."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bilan_ameliore(equipe, nomFichier) :\n",
    "    pass\n",
    "\n",
    "# test \n",
    "print(bilan_ameliore('Auxerre', 'ligue1.csv'))\n",
    "print(bilan_ameliore('Paris SG', 'ligue1.csv'))\n",
    "print(bilan_ameliore('Monaco', 'ligue1.csv'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 3\n",
    "Ecrivez une fonction *liste_bilans(nomFichier)* qui retourne la liste composée de tous les dictionnaires de type bilan amélioré."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def liste_bilans(nomFichier) :\n",
    "    pass\n",
    "    \n",
    "# test\n",
    "liste = liste_bilans(\"ligue1.csv\")\n",
    "for d in liste :\n",
    "    print(d)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 4\n",
    "On peut trier une liste en donnant, comme argument à la méthode sort, une fonction qui va servir au tri. En l'occurrence, on va donner une fonction qui permet de retourner la valeur correspondant à la clé \"pts_diff\" des dictionnaires.\n",
    "\n",
    "Cette fonction peut être décrite comme une \"lambda fonction\". \n",
    "\n",
    "Par exemple, imaginons que liste = [{\"a\" : 1, \"b\" : 4}, {\"a\" : 8, \"b\" : 2}, {\"a\" : 3, \"b\" : 5}]\n",
    "\n",
    "Alors on peut : \n",
    "\n",
    "- trier liste par ordre croissant des valeurs de \"a\" ainsi : liste.sort(key = lambda dico : dico[\"a\"])\n",
    "- trier liste par ordre décroissant des valeurs de \"b\" ainsi : liste.sort(key = lambda dico : dico[\"b\"], reverse = True)\n",
    "- trier liste par ordre croissant des sommes des valeurs de \"a\" et de \"b\" ainsi : liste.sort(key = lambda dico : dico[\"a\"] + dico[\"b\"])\n",
    "\n",
    "Remarque : le nom \"dico\" est ici \"transparent\", il ne sert qu'à définir l'image d'un dictionnaire par la fonction lambda.\n",
    "\n",
    "Ecrivez une fonction *trier_liste_bilans(liste_des_bilans, valeur_servant_au_tri, croissant)* qui trie la liste passée en paramètre en fonction du critère de tri (par exemple \"pts_diff\") et du booléen *croissant* qui peut valoir True ou False."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def trier_liste_bilans(liste_des_bilans, valeur_servant_au_tri, croissant) :\n",
    "    pass\n",
    "\n",
    "# test \n",
    "liste = liste_bilans(\"ligue1.csv\")\n",
    "\n",
    "trier_liste_bilans(liste, \"pts_diff\", False)\n",
    "print(\"tri décroissant par ordre de pts_diff\")\n",
    "for d in liste :\n",
    "    print(d)\n",
    "\n",
    "trier_liste_bilans(liste, \"pts_diff\", True)\n",
    "print(\"tri croissant par ordre de pts_diff\")\n",
    "for d in liste :\n",
    "    print(d)\n",
    "\n",
    "trier_liste_bilans(liste, \"nom\", True)\n",
    "print(\"tri croissant par ordre du nom\")\n",
    "for d in liste :\n",
    "    print(d)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 5\n",
    "Ecrivez une fonction *sauvegarde(nomFichierOrigine, nomFichierSauvegarde)* qui sauvegarde l'ensemble du bilan dans un nouveau fichier csv. \n",
    "Ce bilan sera classé par ordre décroissant de \"pts_diff\", et on ne fera pas figurer dans le fichier de sauvegarde l'indicateur \"pts_diff\" qui n'a servi qu'à départager les équipes. C'est en fait le classement final, à comparer avec celui donné dans la page wikipédia."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sauvegarde(nomFichierOrigine, nomFichierSauvegarde) :\n",
    "    pass\n",
    "\n",
    "# test\n",
    "sauvegarde(\"ligue1.csv\", \"classement.csv\")   "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
