Contrôle Final 1 – Année 2020/2021
- Durée du contrôle : 2h
- Tous les documents sont autorisés
Pour commencer, téléchargez l'archive se trouvant ici. Ensuite décompressez l'archive avec la commande suivante :
Dans la suite du contrôle, vous devez travailler dans le répertoire csc4103-cf1.
Afin de rendre votre projet sous moodle, vous devez générer une archive avec la commande suivante :
Cette commande va générer une archive csc4103-cf1-rendu.tar.xz dans le répertoire parent de csc4103-cf1. Il vous suffit ensuite de déposer cette archive dans moodle.
Mise en œuvre d'une Hashmap (10 points)
Dans le répertoire exo1/, vous trouverez plusieurs fichiers :
- hashmap.h: defini l'interface d'une hashmap
- hashmap.c: implemente une hashmap
- test_hashmap.c: un programme pour tester l'implémentation de la hashmap
Une hashmap est une structure de données qui associe un clé à une valeur. Ce type de structure de données est fréquemment utilisée pour indexer des bases de données ou pour mettre en cache des données.
Dans notre mise en œuvre, la clé (une chaîne de caractères) est hachée par la fonction uint32_t hash(K key). Le hash obtenu identifie la case du tableau entries dans laquelle est stockée la valeur.
Puisque plusieurs clés peuvent avoir le même hash, la case du tableau entries contient une liste chaînée de toutes les clés ayant le même hash.
2 points
- la bibliothèque partagée libhashmap.so à partir du fichier hashmap.c
- l'exécutable test_hashmap à partir de test_hashmap.c et libhashmap.so
1 point
3 points
- appeler hash(key) pour savoir dans quelle case (appelée h) du tableau entries insérer la nouvelle entrée;
- allouer une nouvelle struct hashmap_entry_t (appelée new_entry) et l'initialiser. Pensez à y recopier key et value;
- insérer new_entry dans la liste chaînée h.
2 points
2 points
Dépouillage de votes à l'américaine (10 points)
Pour ou contre le retour en présentiel en cours? Les étudiants de la planète entière ont été invités à répondre à cette question et il est à présent l'heure de dépouiller les votes. Ceux-ci-sont stockés sous la forme de caractères : 1 pour exprimer un "pour" et 0 pour "contre"; mis les uns à la suite des autres dans un fichier au format texte nommé votes.txt.
Afin d'accélérer le traitement de cet énorme fichier, on propose dans cet exercice de procéder au dépouillement en faisant appel à plusieurs dépouilleurs en charge de traiter en parallèle des parties différentes du fichier de votes et de transmettre le résultat exprimé par la majorité des votes qu'il a eus à traiter. Le résultat final étant ainsi un décompte de ces résultats partiels, comme cela serait fait aux États-Unis en faisant le dépouillement état par état puis en comptant le nombre d'états exprimant le même avis.
À partir de l'archive fournie, les questions vous permettront de construire le programme de manière incrémentale. Seul le code final devra être soumis pour notation. Le programme depouillage.c correspond au programme principal en charge de distribuer les données à traiter et de collecter les résultats produits par les dépouilleurs dont le code se trouve dans le fichier depouilleur.c.