Projet 2015 · Analyse des données IMdb

Objectifs
L'objectif de ce projet est de vérifier que vous maîtrisez les principes vus en cours de programmation avancée comme les structures de données complexes, lecture / écriture de fichiers, compilation séparée et automatique, utilisation de gestionnaire de version...

Ce dépôt GIT contient le sujet et les données utiles pour la réalisation du petit projet du module de Programmation Avancée.

Objectif

L’objectif de ce projet est de créer un programme qui permet de rechercher un réalisateur de cinéma et éventuellement d’avoir des informations sur sa filmographie. Ce projet se base sur des données réelles provenant de IMDB (Internet Movie Database). Le choix de se concentrer sur les réalisateurs a été fait pour permettre une utilisation avec les contraintes d’espace de stockage que vous avez (par exemple la filmographie par acteurs fait 250Mo).

Principe

Les fichiers de données contiennent des listes de réalisateurs ainsi que pour chaque réalisateur sa liste de films. La filmographie de chaque réalisateur se présente sous la forme suivante (TAB désigne une tabulation et les crochets ne font pas partie de la syntaxe) :

[NOM DE FAMILLE], [PRENOMS][TAB][TAB][ELEMENT_1]
[TAB][TAB][TAB][ELEMENT_2]
...
[TAB][TAB][TAB][ELEMENT_N]

[NOM DE FAMILLE], [PRENOMS][TAB][TAB][ELEMENT_1]
...

Ensuite chaque élément est constitué d’un titre d’oeuvre ainsi que de sa date de publication donnée entre parenthèses. Les oeuvres peuvent être de différentes natures, comme indiqué ci-dessous :

xxxxx          = a movie
"xxxxx"        = a television series
"xxxxx" (mini) = a television mini-series
        (TV)   = TV movie, or made for cable movie
        (V)    = made for video movie (this category does NOT include TV
                 episodes repackaged for video, guest appearances in
                 variety/comedy specials released on video, or
                 self-help/physical fitness videos)
        (VG)   = video game

Par exemple, voici une partie de la filmographie de Quentin Tarentino :

Tarantino, Quentin  Death Proof (2007)
            Django Unchained (2012)
            Sin City (2005)  (special guest director)
            "CSI: Crime Scene Investigation" (2000) {Grave Danger (#5.24)}
            "ER" (1994) {Motherhood (#1.24)}

où l’on voit que les trois premiers éléments sont des films et les trois suivants des épisodes de séries télévisées. Pour plus d’exemples, référez-vous aux fichiers mentionnés dans la suite de ce document.

On note dans l’exemple ci-dessus qu’entre accolades figurent le nom de l’épisode ainsi que le numéro de saison et d’épisode (format libre de type “commentaire”). Il y a de nombreuses “irrégularités” de ce type par rapport au format que nous venons de vous décrire. Quelques exemples : prénom vide, année de la forme 2011/III (plusieurs films de même nom la même année), année inconnue (????), etc. Référez-vous aux fichiers d’exemples pour constater ces irrégularités. Vous prendrez bien soin de documenter les éventuelles limitations de votre programme face à certaines de ces irrégularités.

Cahier des Charges

Il vous est demandé de construire la filmographie des réalisateurs à partir d’un des fichiers de données fournis. Ensuite il devra être possible de :

Au vu de la masse de données utilisées, un soin particulier devra être porté aux structures de données choisies pour les représenter, afin de limiter l’espace mémoire ainsi que le temps d’accès aux données (par exemple : si l’on cherche un réalisateur particulier). Les choix que vous ferez devront absolument être justifiés dans le rapport.

Déliverables

La date de fin de projet est le dimanche 07 juin 23:59 CEST. Tout retard entraînera des pénalités.

Vous n’avez rien à imprimer, ni des documents à envoyer par e-mail. Il faudra donner l’accès du dépôt à votre correcteur et celui-ci corrigera à partir de la dernière version du dépôt avant la date limite. Les push suivants ne seront pas considérés.

Sur votre dépôt devront figurer :

Contenu du dépôt

README.md

Le fichier README.md est initialement vide. À vous de le remplir pour donner les indications qui permettent au correcteur de compiler et d’exécuter votre programme.

Makefile

Un fichier Makefile vide est présent à la racine de votre dépôt. Il sera nécessaire de le remplir pour que les correcteurs puissent compiler automatiquement votre projet sans connaître l’arborescence de vos fichiers source.

Données

Toutes les données se trouvent dans le répertoire data du dépôt sauf le dernier exemple qui est accessible via le site IMDB en raison de son poids. L’intérêt de ces différents exemples est de déboguer plus facilement votre programme et de vérifier de manière incrémentale son bon fonctionnement.

Remarques Diverses

Pour démarrer

Pour commencer à travailler, vous pouvez récupérer le dépôt qui contient le fichier README.md que vous êtes en train de lire ainsi que les données via la commande:

git clone https://archives.plil.fr/jdequidt/ima3_tutorat_pa_2015.git

Ensuite vous pouvez créer un nouveau dépôt sur https://archives.plil.fr, les explications sont très détaillées pour savoir comment créer soit un projet vide, soit créer un projet qui se base sur ima3_tutorat_pa_2015.git. Ne pas oublier d’ajouter votre correcteur dans la liste des personnes ayant accès à votre dépôt (menu Settings à droite puis Menu Members puis bouton New Projet Member).

On rappelle brièvement les commandes GIT que vous serez amené à utiliser:

N’hésitez pas à vous référer au poly de programmation avancée pour les détails de chacune des commandes.

Évaluation

Les critères d’évaluation se basent sur le respect du cahier des charges. En particulier seront évalués :

De plus :

Quelques indications

Comme vous l’aurez remarqué, ce projet repose beaucoup sur la manipulation de chaînes de caractères. Vous pouvez utiliser toutes les fonctions de string.h, en particulier :

#include <string.h>

size_t  strlen(const char *s); // la taille
char*   strcpy(char *restrict dst, const char *restrict src); // copie
int     strcmp(const char *s1, const char *s2); // comparaison
char*   strcat(char *restrict s1, const char *restrict s2); // concaténation
char*   strpbrk(const char *s1, const char *s2); // détecter des caractères
char*   strtok(char *restrict str, const char *restrict sep); // couper une chaîne suivant des séparateurs

Pour chacune de ces fonctions, n’hésitez pas à consulter l’aide dans le terminal via la commande man nom_de_la_fonction.

Enfin on rappelle les caractères spéciaux que vous êtes susceptibles de rencontrer: