Le format d'entrée et de sortie indiqué ici doit être respecté à la
lettre car vos programmes seront testés automatiquement et le résultat
sera comparé (avec l'utilitaire "diff") avec le résultat produit par
notre programme (dont le binaire exécutable est disponible dans
"~dift2030/tp3/modele"). Faites attention tout particulièrement à des
blancs superflus que votre programme pourrait imprimer. Lorsque vos
programmes seront testés, nous ferons varier artificiellement l'espace
mémoire disponible aux programmes. Il est donc tout à fait possible
que n'importe quel requête d'allocation mémoire échoue.
Pendant la phase de développement de votre programme C, utilisez le
truc suivant pour isoler les problèmes d'allocation mémoire dans votre
programme. Insérez au tout début de votre programme une ligne
qui contient:
#include "/u/dift2030/tp3/debug.h"
Ce fichier redéfinit les fonctions de gestion mémoire (malloc et free)
de telle façon que certaines erreurs de programmation seront
détectées. N'oubliez pas d'enlever cette ligne lors de la remise de
votre programme. Il est important que votre fonction main soit
définie ainsi:
int main (int argc, char *argv[])
...
1.2 Contraintes de programmation
Pour simplifier la programmation et la correction, on vous demande de
représenter la base de donnée par une liste d'individus. Cette
liste doit être allouée dynamiquement.
Par souci de conservation d'espace mémoire, on vous demande aussi de:
1) Partager autant que possible les chaînes de caractères identiques.
C'est à dire que si deux individus habitent la ville de "St-Jean",
il ne devrait y avoir qu'une seule chaîne "St-Jean" allouée
en mémoire. Il n'est pas nécessaire non plus d'allouer une
chaîne si un individu habite la rue "St-Jean" (ou s'il se nomme
"St-Jean"!). Supposez qu'il n'y a pas de partage entre les
chaînes "St-Jean" et "Lac St-Jean".
2) Au cours de l'exécution du programme, il faut récupérer l'espace
mémoire occupé par les informations qui ne sont plus utilisées
dans la base de donnée.
3) Lorsque le programme termine, normalement ou à la suite d'une
erreur, il faut récupérer tout l'espace mémoire occupé par la
base de donnée.
Dans le programme C, utilisez seulement la fonction getchar pour lire
les commandes de l'usager (car la fonction gets est dangereuse, faites
"man gets" pour les détails). Dans le programme Java, vous pouvez
utiliser la méthode readLine de la classe java.io.BufferedReader.
Dans le programme C, n'utilisez pas la fonction exit pour terminer
l'exécution. Votre programme doit terminer proprement en sortant de
la fonction main, qu'il termine normalement ou à la suite d'une
erreur.
2. Rapport
Vous devez rédiger un rapport qui:
1) Explique brièvement le fonctionnement général de chaque
programme (maximum de 1 page au total).
2) Compare les programmes en expliquant chaque problème de
programmation rencontré et comment le problème a été résolu
dans chaque langage (de 3 à 5 pages au total). Exemples de
problèmes de programmation: comment lire les chaînes de longueur
quelconque, comment implanter le partage des chaînes,
comment récupérer l'espace occupé par les chaînes, comment
traiter les erreurs.
3) Résume les forces et faiblesses de chaque langage pour
la programmation de cette application (maximum de 1/2 page).
4) En un maximum de 1/2 page répondez à la question suivante. Pour
implanter le partage de chaînes il aurait été possible d'utiliser
une table d'adressage dispersé (hashing) avec liste de collisions
externe. C'est-à-dire que chaque élément de la table est
une liste des chaînes qui ont la même valeur de hachage. Pour
savoir si une chaîne existe déjà il suffit donc de hacher la
chaîne et la chercher dans la liste appropriée de la table.
Cette approche est plus efficace que celle demandée ci-haut
mais elle introduit un problème important d'allocation mémoire
dans le programme Java. Décrivez ce problème et comment
on pourrait faire pour le régler. Si vous ne voyez pas de
problème, expliquez l'implantation de votre table de hachage.
3. Évaluation
- Ce travail compte pour 10 points dans la note finale du cours. Vous
DEVEZ le faire par groupes de 2 personnes. Indiquez vos noms
clairement au tout début de vos programmes.
- Chaque programme sera évalué sur 2.5 points et le rapport sur 5
points.
Un programme qui plante à l'exécution, même dans une situation
extrême, se verra attribuer zéro sur 2.5 . Assurez-vous de
prévoir toutes les situations d'erreur (en particulier un appel
à la fonction malloc de C qui retourne NULL).
- Vous devez remettre votre rapport au démonstrateur au plus tard
le 17 avril. Vous avez jusqu'à minuit le même jour pour
remettre vos programmes. Vous serez pénalisés de 5 points
sur 10 par jour de retard.
- Vous devez remettre vos programmes par remise électronique
grâce à la commande suivante:
remise ift2030 tp3 tp3.c tp3.java classe1.java classe2.java
Notez que le programme C est contenu dans un seul fichier (qui doit
se nommer tp3.c), que chaque classe du programme Java est dans un
fichier et que la classe principale qui contient la méthode main
doit se nommer tp3.java.