Académique Documents
Professionnel Documents
Culture Documents
Exercice 1 : Parfum
On a obtenu d’un parfumeur la composition générale de plusieurs de ses parfums, sous la forme d’un fichier.
La composition de chaque parfum se trouve sur une ligne. Les éléments sont séparés par un espace. Tout est écrit
en caractères minuscules.
Les éléments composant un parfum s’appellent des fragrances (odeurs). Chaque parfum doit comporter différents
types de fragrances :
— Celles que l’on détecte en premier, puis qui se dissipent (tête).
— Celles que l’on perçoit immédiatement après (cœur).
— Celles qui forment la base du parfum ; ce sont des molécules plus lourdes et donc plus persistantes (fond).
On veut créer une copie du fichier initial avec une disposition différente. Pour chaque parfum, on veut écrire
quatre lignes : la première correspond au numéro du parfum, la deuxième correspond aux fragrances de tête, la
troisième aux fragrances de cœur, et la quatrième aux fragrances de fond qui entrent dans sa composition.
Parfum 2
violette
rose
cedre patchouli
...
Pour cela, on dispose de trois fichiers texte Tete.txt, Coeur.txt et Fond.txt qui contiennent chacun respec-
tivement les fragrances de Tete, Cœur et Fond, une par ligne. Chaque fragrance apparaît dans exactement un de
ces fichiers.
Exemple :
2. Écrire une fonction getFragrances qui prend en argument un nom de fichier, supposé formatté comme
Tete.txt, Coeur.txt ou Fond.txt, et qui renvoie la liste des fragrances contenues dans ce fichier.
3. Écrire une fonction ecritParfums qui prend en argument un nom de fichier supposé contenir la composition
des parfums au même format que l’exemple parfum.txt, et un nom de fichier de destination, et qui écrit la
composition des parfums dans le fichier de destination au format voulu avec 4 lignes par parfum (une ligne
avec la numérotation, une ligne avec seulement les fragrances de tête, une ligne avec seulement les fragrances
de cœur et une ligne avec seulement les fragrances de fond), en supposant que l’on dispose dans le même
dossier des fichiers Tete.txt, Coeur.txt et Fond.txt. On laissera une ligne blanche entre deux parfums. On
s’autorisera à écrire des espaces supplémentaires en fin de ligne si cela simplifie l’algorithme.
1,2,3
2,4,9 ==> [[1,2,3],[2,4,9],[3,8,27]]
3,8,27
2. On suppose maintenant que l’on va travailler avec des fichiers CSV contenant plutôt majoritairement des
cellules texte, et dont la première ligne du fichier fournit les noms des colonnes. Les lignes suivantes contiennent
les valeurs.
Nom,Naissance,Ville
Toto,1977,Ajaccio [{'Nom':'Toto','Naissance':'1977','Ville':'Ajaccio'},
Alice,2000,Montpellier ==> {'Nom':'Alice','Naissance':'2000','Ville':'Montpellier'}
Bob,1998,Grenoble {'Nom':'Bob','Naissance':'1998','Ville':'Grenoble'}]
Écrire une fonction dicoCSV qui prend en argument un nom de fichier CSV et un qui crée à partir de ce
fichier une liste de dictionnaires, chaque dictionnaire représentant une ligne de valeurs (type str) du fichier,
dont les clés sont les noms présents sur la première ligne.
Il est conseillé d’écrire une fonction auxiliaire listeNettoyee qui prend en argument une chaîne de carac-
tère correspondant à une ligne de fichier (terminant par \n), et une chaîne de caractère correspondant au
séparateur CSV, et qui renvoie une liste de chaînes de caractères "nettoyées" correspondant au contenu des
cellules non-vides, sans caractères blancs au début ni à la fin.
Exercice 3 : Histogramme
On s’intéresse à des données mesurant le nombres de visiteurs à un stand pendant un salon d’exposition.
L’intervalle entre deux mesures n’étant pas régulier, chaque relevé est du type minute:nombreDeVisiteurs où
minute est un entier indiquant le nombre de minutes écoulées depuis l’ouverture du stand. Le but est de construire
un histogramme de ces relevés, minute par minute, en extrapolant pour les minutes sans relevé le nombre de visiteurs
au point de relevé précédent (avec un symbole différent pour distinguer les véritables relevés des extrapolations).
1. Écrire une fonction getDonnees qui prend en argument un nom de fichier supposé formaté comme présenté
précédemment et qui renvoie un dictionnaire contenant les relevés. Pour l’exemple ci-dessus, on doit obtenir
{1: 2, 3: 5, 4: 4, 6: 10, 8: 3}
2. Écrire une fonction strAvecZero qui prend en argument deux entiers n et borne et qui renvoie la chaîne de
caractères correspondant à n, précédé d’un ou plusieurs zéros de telle sorte qu’elle ait la même longueur que
l’écriture décimale de l’entier borne. Exemple : strAvecZero(14, 3512) vaut "0014" car on rajoute deux
zéros pour avoir 4 chiffres au total, comme 3512.
3. Écrire une fonction histogramme qui prend en argument un dictionnaire d contenant les relevés, et une
borne entière donnant la dernière minute voulue dans l’histogramme, et qui renvoie la chaîne de caractère
correspondant à l’histogramme, comme illustré sur l’exemple ci-dessus. Les véritables relevés de visiteurs
doivent être représentés par des barres avec des *, et les barres issues d’extrapolation (reproduction du
dernier relevé) doivent être affichées avec des -. L’exemple représenté ci-dessus est la chaîne correspondant à
l’histogramme pour le dictionnaire {1: 2, 3: 5, 4: 4, 6: 10, 8: 3} et borne valant 10.
4. Écrire une fonction ecritHistogramme qui prend en argument un nom de fichier source contenant les relevés,
un nom de fichier destination dans lequel il faut écrire l’histogramme, un entier borne, et un argument
optionnel affiche valant False par défaut. Si affiche est vrai, il faut afficher l’histogramme dans la console
en plus de l’écrire dans le fichier destination.
1. Écrire une fonction get_lines qui prend en argument un nom de fichier et qui renvoie la liste des lignes
"simplifiées" du fichier, c’est-à-dire une liste de chaînes de caractères, où chaque élément de la liste correspond
à une ligne du fichier à laquelle on a supprimé les caractères blancs (espaces, retours à la ligne, ...).
2. Écrire une fonction dico_resultats qui prend en argument un nom de fichier, supposé contenir les résultats
des étudiants à une épreuve (au format décrit plus haut, comme Info.txt ou Maths.txt) et qui renvoie un
dictionnaire qui contient une entrée pour chaque étudiant : la clé du dictionnaire est son numéro étudiant,
et la valeur associée est la note de l’étudiant à cette épreuve. La clé (numéro étudiant) devra être une chaîne
de caractères (pour garder les éventuels 0 en début de numéro), et la note devra être un nombre à virgule.
Exemple avec Info.txt : vous devez obtenir {"304304": 14.5, "202356": 4.67, "758843": 9.8, "233345":
12.3}
3. Écrire une fonction dico_noms qui prend en argument un nom de fichier, supposé contenir la liste des étudiants
inscrits (au format décrit plus haut, comme Inscrits.txt) et qui renvoie un dictionnaire de dictionnaires au
format suivant : si l’on appelle etudiants le dictionnaire qui est renvoyé, alors etudiants contient une entrée
pour chaque étudiant : la clé est son numéro étudiant (sous forme de chaîne de caractères) et la valeur associée
est un dictionnaire à deux clés : "nom" et "prenom" (les valeurs associées étant respectivement le nom et le
prénom de l’étudiant).
Exemples : sur un fichier contenant :
304304;DURAND;Alexis
202356;TOULI;Maria
Attention : un étudiant peut être inscrit mais ne pas avoir passé l’épreuve. En revanche, on suppose que tous
les étudiants qui ont passé l’épreuve sont bien inscrits.
5. Écrire une fonction cree_ligne qui prend en argument un dictionnaire contenant les données d’un étudiant
(une clé "nom" associée à son nom, une clé "prenom" associée à son prénom, et pour chaque épreuve que
l’étudiant a passée, une clé égale à la matière concernée, associée à sa note dans cette matière) et une liste de
matières, et qui renvoie une chaîne de caractères composée (comme dans resultats.txt) : du nom et prénom
de l’étudiant, séparés par un espace ; puis pour chaque matière qui est dans la liste des matières et qui est
égale à une clé du dictionnaire : un tiret, le nom de la matière, deux-points ( : ), la note de cet étudiant pour
cette matière. Il faut respecter l’ordre de matières telles qu’elles apparaissent dans la liste.
Exemple : si d vaut
{'nom': 'DURAND', 'prenom': 'Alexis', 'Info': 12.5, 'Maths':17.2, 'Physique':13.1}, alors
cree_ligne(d, ["Info", "Maths", "Anglais"]) vaut : "DURAND Alexis-Info:12.5-Maths:17.2"