Le dimanche 27 octobre prochain doit avoir lieu à Baisieux, commune du Nord frontalière de la Belgique, la Course du Chicon. Cette course se décline sur plusieurs distances entre 5km et 10km.
Vous avez la responsabilité du traitement informatique des données : gestion des inscriptions, récolte des performances des participants et la publication des résultats.
Vous avez à disposition 2 fichiers :
inscrits.csv
qui représente la liste de tous les participants de la course.performances.csv
qui représente la liste des résutlats de la course.Chaque fichier possède une version small
avec moins de données permettant de faire des tests.
Participant.py
Le module Participant.py
permet de créer et de manipuler des données représentant les participants de la course. On considère qu'un participant est caractérisé par :
Ce module sera composé de plusieurs fonctions :
La fonction creer_participant
qui prend en paramètre un nom, un prénom, une date de naissance, une lettre représentant le sexe (M
ou F
) et un numéro de dossard. Cette fonction retourne un nouveau participant.
Les fonctions get_nom
, get_prenom
, get_date_naissance
, get_dossard
, get_sexe
et get_resultat
. Ces fonctions prennent en paramètre un participant et retournent l'information correspondante.
La fonction set_resultat
qui prend en paramètre un participant et un résultat. Cette fonction définit un nouveau résultat à un participant.
La fonction to_string
qui prend en paramètre un participant et retourne une chaine de caractères de l'ensemble des informations du participant.
Question 1 - Créer un nouveau fichier nommé Participant.py
. Ce fichier sera un module python permettant de représenter et manipuler les participants de la course.
Question 2 - À l'aide des informations ci-dessus, écrire la fonction creer_participant
. Voici quelques pistes pour écrire cette fonction :
M
ou F
et le numéro de dossard est un entier positif. On pourra utiliser des assertions.Question 3 - Écrire les fonctions get_nom
, get_prenom
, get_date_naissance
, get_dossard
, get_sexe
et get_resultat
.
Question 4 - Écrire la fonction set_resultat
.
Question 5 - Écrire la fonction to_string
.
Temps.py
Les résultats des participants vont être représentés par leur temps de course exprimé en heures, minutes et secondes. Il faut donc définir à un module qui offre les fonctionnalités pour gérer des temps.
Question 6 - Créer un nouveau fichier nommé Temps.py
. Ce fichier sera un module python permettant de représenter et manipuler les temps des participants.
Question 7 - Écrire une fonction creer_temps
qui prend 3 paramètres représentant un nombre d'heures, de minutes et de secondes. Cette fonction permet de créer une donnée représentant un temps. Voici quelques pistes pour écrire cette fonction :
Question 8 - Sur le même principe que pour le module Participant
, écrire les fonctions permettant d'avoir accès aux différentes informations : heures, minutes et secondes.
Question 9 - Écrire une fonction comparer
qui prend en paramètre 2 variables représentant un temps. De manière conventionnelle, le résultat de cette fonction est négatif si son premier paramètre est inférieur au second, positif s'il lui est plus grand et nul quand ils sont égaux.
Remarque : Pour simplifier la comparaison, il peut être utile de définir une fonction
to_seconds
qui fournit en résultat le nombre de secondes correspondantes au temps passé en paramètre.
Question 10 - Écrire la fonction to_string
qui prend en paramètre un temps et retourne une chaine de caractères de l'ensemble des informations de ce temps.
Il est maitenant l'heure de s'intéresser à la gestion de la course. Les fonctions suivantes sont à définir dans un nouveau module course_chicon
qui regroupera les fonctions utiles à la gestion de la course.
Il sera bien sûr nécessaire d'importer les modules Participant
et Temps
.
Votre première mission est de récupérer les informations sur les participants inscrits à la course. Les données concernant ces participants se trouvent dans le fichier inscrits.csv
(ou small_inscrits.csv
) qui est un fichier au format CSV, c'est-à-dire un fichier texte contenant des données tabulées. La première ligne de ce fichier est constituée des libellés des données
qui suivent :
prenom;nom;sexe;date_naiss
Cette ligne précise que chacune des lignes qui suivent contient dans cet ordre le prénom, le nom, le sexe et la date de naissance du compétiteur inscrit. Ces informations sont séparées par un point-virgule.
Avec ces données, vous allez construire des compétiteurs à l'aide de la fonction creer_participant
du module Participant
. Il vous faudra attribuer à chacun de ces compétiteurs un numéro de dossard, obtenu par simple incrémentation d'un compteur, le premier compétiteur recevant le dossard 1.
Question 11 - Écrire une fonction lire_fichier_participants
qui prend en paramètre un nom de fichier CSV contenant les données des inscrits. Cette fonction génère un dictionnaire de participants dont les clés seront les numéros de dossard et les valeurs les compétiteurs associés (sous la forme d'un dictionnaire).
split
des chaînes de caractères.rstrip
peut également être utilisée pour supprimer les marqueurs de fin de ligne.FileNotFoundError
.Question 12 - Tester votre fonction à l'aide du fichier de test small_inscrits.csv
.
Question 13 - Écrire une fonction qui prend en paramètre une liste de données Participant
. Cette fonction affiche chacune de ces données à raison d'une par ligne.
to_string
de Participant
.Nous allons écrire quelques fonctions de recherche dans un dictionnaire de valeurs qui satisfont un critère.
Dans cette partie, l'ensemble des participants est passé en paramètre de chacune des fonctions sous la forme d'un dictionnaire tel que celui construit par la fonction lire_fichier_participants
.
Les fonctions à écrire disposent d'un autre paramètre qui correspond à un critère de sélection des compétiteurs dans le dictionnaire. Les fonctions ont pour résultat soit une seule donnée, soit une liste de données représentant un participant.
Ce résultat correspond à la sélection selon le critère cherché.
Question 14 - Écrire une fonction selection_par_anne_naissance
qui prend en paramètre le dictionnaire avec l'ensemble des participants et une année. Cette fonction retourne la liste des participants dont l'année de naissance est égale à celle passée en paramètre.
endswith
des chaînes de caractères.En testant avec le petit jeu de données, vous obtenez 2 participants nés en 1980.
Question 15 - Écrire une fonction selection_par_nom
qui prend en paramètre le dictionnaire avec l'ensemble des participants et une chaine de caractères. Cette fonction retourne la liste des participants dont le nom contient la chaîne de caractères passée en paramètre.
Question 16 - Écrire une fonction selection_intervalle_dossard
qui prend en paramètre le dictionnaire avec l'ensemble des participants et 2 entiers. Cette fonction retourne la liste des participants dont le numéro de dossard est compris entre les deux paramètres.
La course terminée, votre tâche consiste à reporter les performances des participants.
Les données concernant les résultats se trouvent dans le fichier performances.csv
(ou
small_performances.csv
) qui est un fichier au format CSV. La première ligne de ce fichier est constituée des libellés des données qui suivent :
num_dossard;heures;minutes;secondes
Cette ligne précise que chacune des lignes qui suivent contient dans cet ordre le numéro de dossard, le nombre d'heures, de minutes et de secondes du temps de parcours d'un participant, ces informations étant séparées par un point-virgule.
Seuls les compétiteurs ayant effectivement participé et achevé la course figurent dans ce fichier.
Question 17 - Écrire une fonction lire_fichier_resultats
qui prend en paramètre un nom de fichier CSV contenant des temps. Cette fonction génère un dictionnaire des performances qui associe à un numéro de dossard une donnée représentant un temps comme définie par le module Temps.py
que vous avez implémenté.
split
des chaînes de caractères.rstrip
peut également être utilisée pour supprimer les marqueurs de fin de ligne.FileNotFoundError
.Question 18 - Tester votre fonction à l'aide du fichier de test small_performances.csv
.
Maintenant que l'on dispose des données sur les participants et leurs performances sous forme de dictionnaires qui partagent les mêmes clefs (les numéros de dossard), votre travail consiste à reporter les performances au sein des dictionnaires représentant les compétiteurs.
Question 19 - Écrire une fonction fusion_participant_resultat
qui prend en paramètre 2 dictionnaires (celui des participants et celui des résultats). Cette fonction modifie les données représentant les participants en reportant leur résultat. Cette fonction ne renvoie pas de valeur.
Participant
offre une fonction set_resultat
.Question 20 - Tester votre fonction à l'aide du fichier de test small_performances.csv
et small_inscrits.csv
..
On souhaite maintenant trier le dictionnaire des participants selon le nom ou le résultat afin de définir un classement.
Question 21 - Dans le module Participant
, écrire une fonction compare_nom
qui prend en paramètre 2 participants. Cette fonction définit une relation d'ordre entre 2 participants selon l'ordre alphabétique de leurs noms.
Le résultat de cette fonction est négatif si son premier paramètre est inférieur au second, positif s'il lui est plus grand et nul quand ils sont égaux
Question 22 - Dans le module course_chicon
, écrire une fonctionn tri_par_nom
qui prend en paramètre un dictionnaire de participants. Cette fonction retourne la liste des participants triée par ordre alphabétique de leurs noms.
Pour trier, vous pouvez utiliser la fonction tri_selection
disponible ci-dessous.
def tri_selection(liste, fonction_comparaison):
n = 0
while len(l)-n > 0 :
tmp = l[0]
ip = 0
for i in range(1, len(l)-n):
if fonction_comparaison(tmp, l[i]) > 0 :
tmp = l[i]
ip = i
l.append(tmp)
del l[ip]
n+=1
La fonction tri_selection
prend en paramètre une liste et une fonction de comparaison.
Dans notre cas, on pourra obtenir la liste des valeurs dun dictionnaire à l'aide de l'expression list(dic.values())
. La fonction compare_nom
de la question 1 sera utilisée comme fonction de comparaison.
Question 23 - Dans le module Participant
, écrire une fonction compare_resultat
qui prend en paramètre 2 participants. Ce fonction définit une relation d'ordre entre 2 participants selon leurs résultats.
Question 24 - Dans le module course_chicon
et sur le même principe que la question 22, écrire une fonctionn tri_par_resultat
qui prend en paramètre un dictionnaire de participants. Cette fonction retourne la liste des participants triée par ordre croissant de leur résultat.
Les compétiteurs sans résultat sont placés en fin de liste par ordre alphabétique.
Il est temps de procéder à la publication des résultats.
Question 25 - Écrire une fonction afficher_resultats_par_resultats
qui prend en paramètre un dictionnaire de participants. Cette fonction affiche cette liste en précisant leur prénom, nom, sexe, numéro de dossard et performance.
Par exemple, avec le petit jeu de données, et en supposant que le report des performances a été effectué et que la liste de participants est triée par ordre de performance, on pourrait obtenir un affichage de la forme :
[7]: Archard Rivard (M - 10/6/1950) => 0h46mn31s
[8]: Cheney Chassé (M - 21/3/1949) => 0h48mn10s
[4]: Saville Marier (M - 19/11/1969) => 0h56mn29s
[5]: Namo Lereau (M - 26/3/1980) => 1h 6mn20s
[10]: Sidney Charest (M - 5/3/1981) => 1h 6mn38s
[1]: Sidney Robert (M - 21/7/1970) => 1h 8mn55s
[6]: Romaine Hughes (F - 17/10/1943) => 1h17mn 8s
[3]: Vincent Riquier (M - 16/9/1980) => 1h21mn23s
[9]: Avelaine CinqMars (F - 14/2/1983) =>
[2]: Paien Gilbert (M - 26/11/1953) =>
Question 26 - Sur le même principe, écrire la fonction afficher_resultats_par_nom
.
Enfin pour la pérennité de ces résultats, il est important de les sauvegarder dans un fichier.
Question 27 - Écrire une fonction sauvegarder_resultats
qui prend en paramètre le dictionnaire des participants et un nom de fichier. Cette fonction permet de sauvegarder les données au format CSV selon les règles suivantes :
num_dossard;prenom;nom;resultat
7;Archard;Rivard; 0h46mn31s
8;Cheney;Chassé; 0h48mn10s
Question 28 - Tester votre fonction à l'aide du fichier de test.
Les organisateurs souhaitent mettre à disposition les résultats sur une interface web accessible depuis Internet.
Question 29 - À l'aide du module Flask et des fonctions précédentes, créer un module Server.py
. Ce module permet :