{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Université d’Orléans -- Licence 1 semestre 1 -- 2024-25  <br> Algorithmique et Programmation 1      \n",
    "<h3 align=\"center\">TP 05 (enseignant)</h3>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Dictionnaire des fréquences d'un texte\n",
    "\n",
    "Dans cet exercice on procède à l'analyse statistique de divers textes. Le but est de :\n",
    "- produire un dictionnaire des fréquences contenant la fréquence d'apparition de chaque caractère dans le texte ;\n",
    "- déterminer la \"signature\" d'un texte, c'est-à-dire le dictionnaire des 5 plus grosses fréquences dans le texte ;\n",
    "- reconnaître la langue d'un texte par similarité des signatures avec des textes références.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 1\n",
    "\n",
    "Ecrivez une fonction *simplifier(nomFichier)* qui ouvre en mode lecture un fichier texte dont le nom sera passé en paramètre, puis qui :\n",
    "- supprime tous les accents en changeant les lettres accentuées en leur équivalent non accentué ;\n",
    "- met le texte en minuscules ;\n",
    "- sauvegarde ce texte simplifié dans un fichier dont le nom sera adapté à celui du fichier d'origine. Par exemple, le contenu du fichier \"fra.txt\" sera, une fois simplifié, sauvegardé dans un fichier \"fra_simp.txt\" ;\n",
    "\n",
    "Pour ces opérations on se servira à bon escient du dictionnaire **correspondances** dont les clés sont les lettres non accentuées et les valeurs des tuples de lettres accentuées correspondant à la clé.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tuple_a = (\"â\",\"à\",\"ä\",\"á\",\"å\",\"ã\",\"À\",\"Á\",\"Ä\",\"Å\",\"Ã\")\n",
    "tuple_e = (\"é\",\"ê\",\"è\",\"ë\",\"É\",\"È\",\"Ê\")\n",
    "tuple_i = (\"î\",\"ï\",\"ì\",\"í\",\"Í\")\n",
    "tuple_o = (\"ô\",\"ö\",\"ő\",\"ò\",\"ó\",\"õ\",\"Ô\",\"Ó\",\"Ö\",\"Ő\")\n",
    "tuple_u = (\"û\",\"ü\",\"ù\",\"ú\",\"ű\",\"Ú\",\"Ü\")\n",
    "tuple_c = (\"ç\",\"Ç\")\n",
    "tuple_n = (\"ñ\",\"Ñ\")\n",
    "\n",
    "correspondances = {\"a\" : tuple_a, \"e\" : tuple_e, \"i\" : tuple_i, \"o\" : tuple_o, \"u\" : tuple_u, \"c\" : tuple_c, \"n\" : tuple_n}\n",
    "\n",
    "def simplifier(nomFichier) :\n",
    "    pass\n",
    "    \n",
    "\n",
    "# test\n",
    "simplifier(\"le_grand_meaulnes.txt\")\n",
    "simplifier(\"tom_sawyer.txt\")\n",
    "simplifier(\"don_quijote.txt\")\n",
    "simplifier(\"germinal.txt\")\n",
    "simplifier(\"les_miserables.txt\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 2\n",
    "\n",
    "Ecrivez une fonction *statistiques(nomFichierSimplifie)* qui prend en paramètre un nom de fichier simplifié, et qui retourne un dictionnaire dont :\n",
    "- les clés sont les 26 lettres minuscules de l'alphabet ;\n",
    "- les valeurs correspondantes leur effectif dans le texte simplifié.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def statistiques(nomFichierSimplifie) :\n",
    "    pass\n",
    "    \n",
    "# test\n",
    "stats_lgm = statistiques(\"le_grand_meaulnes_simp.txt\")\n",
    "print(stats_lgm)\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 3\n",
    "\n",
    "Ecrivez une *frequences(nomFichierSimplifié)* qui prend en paramètre le nom d'un fichier simplifié, et qui renvoie un dictionnaire dont :\n",
    "- les clés sont les 26 lettres minuscules de l'alphabet ;\n",
    "- les valeurs correspondantes sont le pourcentage d'apparition de chaque lettre dans le texte simplifié."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def frequences(nomFichierSimplifie) :\n",
    "    pass\n",
    "\n",
    "print(frequences(\"germinal_simp.txt\"))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 4\n",
    "\n",
    "Ecrivez une fonction *signature(nomFichierSimplifie)* qui prend en paramètre un nom de fichier simplifié et qui renvoie le dictionnaire composé de 5 items dont :\n",
    "- les clés sont les 5 lettres les plus fréquentes dans le texte simplifié ;\n",
    "- les valeurs sont les fréquences de ces lettres. \n",
    "\n",
    "Exemples :\n",
    "\n",
    "- pour le roman (en français) \"Le Grand Meaulnes\" d'Alain-Fournier, on trouve comme signature :\n",
    "\n",
    "{'e': 0.1700917642126333, 'a': 0.09128409037118185, 's': 0.07947375895157527, 'i': 0.07399630779218144, 't': 0.07175799133075014}\n",
    "\n",
    "- pour le roman (en anglais) \"Tom Sawyer\" de Mark Twain, on trouve comme signature :\n",
    "{'e': 0.12032830331548489, 't': 0.09742617231867597, 'a': 0.07934785548163772, 'o': 0.07839458597003623, 'n': 0.06809116231272648}\n",
    "\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def signature(nomFichierSimplifie) : \n",
    "    pass\n",
    "\n",
    "print(signature(\"germinal_simp.txt\"))\n",
    "print(signature(\"tom_sawyer_simp.txt\"))\n",
    "print(signature(\"don_quijote_simp.txt\"))\n",
    "print(signature(\"germinal_simp.txt\"))\n",
    "print(signature(\"les_miserables_simp.txt\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 5\n",
    "\n",
    "Ecrivez une fonction *ecart(signature1, signature2)* qui prend en paramètres deux signatures (donc 2 dictionnaires du type décrit ci-dessus) et qui retourne un écart entre les deux, que vous calculerez en additionnant les valeurs absolues des 5 résultats obtenus en soustrayant les fréquences de même indice. \n",
    "\n",
    "Par exemple :\n",
    "- si signature1 = {'a' : 0.34, 'e' : 0.18, 'r' : 0.11, 'u' : 0.09, 'i' : 0.05}\n",
    "- et signature2 = {'b' : 0.32, 'a' : 0.21, 'f' : 0.13, 'm' : 0.05, 'j' : 0.03}\n",
    "\n",
    "alors ecart(signature1, signature2) = abs(0.34 - 0.32) + abs(0.18 - 0.21) + abs(0.11 - 0.13) + abs(0.09 - 0.05) + abs(0.05 - 0.03) \n",
    "\n",
    "donc ecart(signature1, signature2) = 0.02 + 0.03 + 0.02 + 0.04 + 0.02 = 0.13\n",
    "\n",
    "Il pourra être utile de récupérer les valeurs de signature1 et signature2 dans des listes qui, triées en ordre décroissant, pourront servir au calcul de l'écart."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def ecart(signature1, signature2) :\n",
    "    pass\n",
    "\n",
    "print(ecart(signature(\"le_grand_meaulnes_simp.txt\"), signature(\"germinal_simp.txt\")))\n",
    "print(ecart(signature(\"le_grand_meaulnes_simp.txt\"), signature(\"don_quijote_simp.txt\")))\n",
    "print(ecart(signature(\"le_grand_meaulnes_simp.txt\"), signature(\"tom_sawyer_simp.txt\")))\n",
    "print(ecart(signature(\"le_grand_meaulnes_simp.txt\"), signature(\"les_miserables_simp.txt\")))\n",
    "print(ecart(signature(\"tom_sawyer_simp.txt\"), signature(\"les_miserables_simp.txt\")))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 6\n",
    "\n",
    "On va considérer que la signature d'une langue en général est celle d'un texte représentatif (environ 300000 caractères) de cette langue.\n",
    "\n",
    "En utilisant les 3 romans\n",
    "\n",
    "- Le Grand Meaulnes - français, \n",
    "- Tom Sawyer - anglais, \n",
    "- Don Quijote - espagnol, \n",
    "\n",
    "on se dote d'un catalogue (voir ci-dessous) qui permettra la reconnaissance de la langue d'un autre texte. \n",
    "\n",
    "Ecrivez une fonction *reconnaître_langue(nomFichierSimplifie)* qui prend en paramètre un nom de fichier simplifié, et qui teste de quelle signature il est le plus proche.\n",
    "Pour cela, calculera les écarts entre la signature du fichier et celles des fichiers du catalogue, et on renverra la valeur (\"français\", \"anglais\" ou \"espagnol\") du fichier du catalogue dont il est le plus proche."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "catalogue = {\"le_grand_meaulnes_simp.txt\" : \"français\", \"tom_sawyer_simp.txt\" : \"anglais\", \"don_quijote_simp.txt\" : \"espagnol\"}\n",
    "\n",
    "\n",
    "def reconnaitre_langue(nomFichierSimplifie) : \n",
    "    pass\n",
    "\n",
    "print(reconnaitre_langue(\"germinal_simp.txt\"))       # attendu = français\n",
    "print(reconnaitre_langue(\"les_miserables_simp.txt\")) # attendu = anglais\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exploitation d'un fichier de notes\n",
    "\n",
    "Dans cet exercice on travaille sur plusieurs fichiers pour gérer la promotion d'étudiants et leur parcours d'enseignement en L1 maths-info. Le but est de produire d'autres fichiers avec divers calculs statistiques, sur les étudiants ou sur les unités d'enseignement (UE). \n",
    "\n",
    "Les deux fichiers initiaux, qui n'ont pas à être modifiés, sont :\n",
    "- UE.csv\n",
    "- promotion2026.csv\n",
    "\n",
    "Chaque ligne de UE.csv contient divers renseignements. \n",
    "\n",
    "Par exemple, la ligne \"UE04;1;programmation et algorithmique;6;6;20;20;16\" signifie que :\n",
    "\n",
    "- c'est l'UE d'identifiant \"UE04\",\n",
    "- elle se déroule au semestre 1,\n",
    "- son nom usuel est \"programmation et algorithmique\",\n",
    "- elle délivre 6 ECTS,\n",
    "- son coefficient dans la moyenne du semestre est 6, \n",
    "- cette UE se décompose en 20h de CM, 20h de TD et 16h de TP.\n",
    "\n",
    "Chaque ligne respecte le même ordre pour les renseignements.\n",
    "\n",
    "Pour le fichier promotion2026.csv, chaque ligne  contient aussi divers renseignements.\n",
    "\n",
    "Par exemple, la ligne \"o22500112;8.0;14.0;14.5;9.0;14.75;13.75;10.0;13.25;13.75;11.75;10.5;7.75\" signifie que l'étudiant o22500112 a obtenu, dans les 12 UE de l'année, les notes 8.0, ..., 10.5 et 7.75.\n",
    "\n",
    "La première note de l'étudiant est obtenue dans la première UE du fichier UE.csv, et ainsi de suite pour chacune des 12 notes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 1\n",
    "\n",
    "Ecrivez une fonction **import_UE(nomFichier)** qui récupère toutes les lignes du fichier dont le nom est en paramètre (par exemple \"UE.csv\"), puis qui retourne un dictionnaire dont les clés sont les identifiants des UE, et les valeurs sont elles-mêmes des dictionnaires, avec comme clé les chaînes \"semestre\", \"nom\", \"ECTS\", \"coefficient\", \"CM\", \"TD\" et \"TP\", et comme valeurs les données correspondantes. \n",
    "\n",
    "Ainsi, on pourra avoir un code de ce type : "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# lesUE = import_UE(\"UE.csv\")\n",
    "# print(lesUE[\"UE04\"][\"nom\"])\n",
    "# print(lesUE[\"UE04\"][\"ECTS\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def import_UE(nomFichier) :\n",
    "    pass\n",
    "\n",
    "# lesUE = import_UE(\"UE.csv\")\n",
    "# for cle, valeur in lesUE.items() :\n",
    "#     print(cle,\":\", valeur)\n",
    "            "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 2\n",
    "\n",
    "Ecrivez une fonction **afficher_details(nomFichier, UE)** qui prend en paramètre une chaîne de caractères correspondant au nom de fichier des UE (par exemple \"UE.csv\") et une chaîne de caractères correspondant à l'identifiant d'une UE (par exemple \"UE04\") et qui affiche les détails de cette UE sous une forme lisible pour l'utilisateur : le nom, le semestre, ...\n",
    "\n",
    "Exemple de résultat attendu :"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "identifiant de l'UE : UE04\n",
    "\n",
    "semestre            : S1<br>\n",
    "nom usuel           : programmation et algorithmique<br>\n",
    "ECTS                : 6<br>\n",
    "coefficient         : 6<br>\n",
    "CM                  : 20 h<br>\n",
    "TD                  : 20 h<br>\n",
    "TP                  : 16 h"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def afficher_details(nomFichier, UE) :\n",
    "    pass\n",
    "\n",
    "# afficher_details(\"UE.csv\", \"UE04\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 3\n",
    "\n",
    "Ecrivez une fonction **bilan(nomFichierUE, nomFichierPromo, etudiant)** qui prend en paramètres trois chaînes de caractères :\n",
    "\n",
    "- le nom du fichier des UE, par exemple \"UE.csv\", \n",
    "\n",
    "- le nom du fichier de promo, par exemple \"promotion2026.csv\", \n",
    "\n",
    "- le numéro de l'étudiant, par exemple \"o22500167\",\n",
    "\n",
    "et qui retourne le tuple composé des deux moyennes de l'étudiant (une pour chaque semestre). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bilan(nomFichierUE, nomFichierPromo, etudiant) :\n",
    "    pass\n",
    "\n",
    "# bilan(\"UE.csv\", \"promotion2026.csv\", \"o22500164\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## question 4\n",
    "\n",
    "Ecrivez une fonction **exporter_resultats(nomFichierUE, nomFichierPromo, nomFichierResultat)** qui prend en paramètres trois chaînes de caractères (les noms des fichiers d'UE et de promo, et le nom du fichier qui contiendra les résultats des étudiants de la promo). Pour chaque étudiant, il y aura une ligne dans le fichier créé, avec : \n",
    "\n",
    "- le nom de l'étudiant,\n",
    "\n",
    "- sa moyenne au S1, \n",
    "\n",
    "- sa moyenne au S2. \n",
    "\n",
    "Les moyennes seront arrondies à 0.01 près."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def exporter_resultats(nomFichierUE, nomFichierPromo, nomFichierResultat) :\n",
    "    pass\n",
    "        \n",
    "# exporter_resultats(\"UE.csv\", \"promotion2026.csv\", \"resultats2026.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
}
