Changes between Version 89 and Version 90 of CaoCourseTme2


Ignore:
Timestamp:
Mar 13, 2007, 12:42:25 PM (18 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme2

    v89 v90  
    3030 *  {{{Makefile .......................}}} description du processus de construction de l'exécutable.
    3131 *  {{{main.c, main.h .................}}} programme principal source et déclarations.
    32  *  {{{count.c, count.h ...............}}} algorithme de parcours d'un fichier texte en vue de comptage.
    33  *  {{{hte.c, hte.h ...................}}} fonction de création des tables de hachage et déclaration de toutes fonctions de gestion.
    34  *  {{{dico.c, dejavu.c, namealloc.c ..}}} fonctions de gestion des tables pour trois types d'usage
     32 *  {{{count.c, count.h ...............}}} analyseur lexical et fonctions de comptage et d'affichage du résultat.
     33 *  {{{dico.c, dico.h..................}}} fonctions de gestion de la table de hachage.
     34 *  {{{hash.c, hash.h..................}}} fonction générale de calcul de l'index à partir de la clé de hachage.
    3535 *  {{{man1/tool.1 ....................}}} fichier au format man
    36        
     36
    3737= Principe des tables de hachage =
    3838
     
    5151Pour accélérer la recherche, on créé un tableau de listes chainées.
    5252On définit ensuite une fonction, que l'on nomme '''fonction de hachage''',
    53 qui calcule un index d'une case à partir de la clé.
     53qui calcule un index à partir de la clé.
    5454Tout élément doit être rangé dans la liste chainée associée à la case du tableau
    5555définie par l'index calculé par la fonction de hachage. 
     
    6464qu'un petit nombre d'éléments dans chaque liste chainée. Le nombre de cases du tableau
    6565doit donc être du même ordre de grandeur que le nombre total d'éléments à stocker.
    66 De plus, on choisit généralement un nombre premier pourle nombre de cases du tableau.
    67 
    68 Il existe plusieurs méthodes de calcul de l'index, nous vous
    69 donnons celle proposée par Donald Knuth.
     66
     67Il existe plusieurs méthodes de calcul de l'index. La fonction hashindex() contenue dans lefichier hash.c implémente celle proposée par Donald Knuth.
    7068
    7169La propriété principale d'une table de hachage est que, si la taille de la table
     
    8078Les premières questions portent sur le fichier [attachment:Makefile Makefile]
    8179
    82 Completez la liste des dépendances pour les cibles : {{{main.o ... namealloc.o}}}, puis re-écrivez les commandes en utilisant les variables automatiques : {{{$@ $< $^}}} [[BR]]
     80Completez la liste des dépendances pour les cibles : {{{statt, main.o, etc ... }}}, puis re-écrivez les commandes en utilisant les variables automatiques : {{{$@ $< $^}}} [[BR]]
    8381- {{{$@}}} : désigne le fichier cible d'une règle.[[BR]]
    8482- {{{$<}}} : désigne le premier fichier de la liste des fichiers source d'une règle.[[BR]]
     
    9795
    9896 * '''QB1''' Expliquez à quoi sert chacun des fichiers inclus au début du fichier ''main.c''
    99  * '''QB2''' A quoi sert le fichier ''main.h'' ?
     97 * '''QB2''' A quoi sert le fichier ''main.h'' ? A quoi servent les 2 premières lignes  et la dernière du fichier ''main.h'' Pourquoi inclure {{{stdio.h}}} ici ?
    10098 * '''QB3''' Expliquez le fonctionnement de la fonction getopt() ({{{man 3 getopt}}})[[BR]]
    10199    Vous ajouterez plus tard dans la fonction getarg() l'option -s qui demande de fournir des statistiques concernant l'utilisation de la tables de hachage.
     
    107105 * '''QB9''' Qu'est-ce qu'un filtre unix ? Que faut-il faire pour transformer ce programme en filtre ?
    108106
    109 Questions sur le fichier de prototype associé [attachment:main.h main.h]
    110 
    111  * '''QB10''' A quoi servent les 2 premières lignes du fichier ''main.h'' et la dernière ?
    112  * '''QB11''' Pourquoi inclure {{{stdio.h}}} ici ?
    113 
    114 == C) La table de hachage générique ==
    115 
    116 Le fichier [attachment:hte.h hte.h] contient les déclarations des fonctions de base et des types de données permettant de manipuler une table de hachage générique possédant la structure décrite ci-dessous:
    117 
    118  * '''QC1''' Les types {{{hte_item_t}}} et {{{hte_data_t}}} sont des structures dont le contenu n'est pas défini dans les fichiers ''hte.h'' ou ''hte.c''. En effet, la table de hachage définie dans ces fichiers est une ressource "générique", qui peut être utilisées pour stocker différents types d'objets. Comme les 3 fichiers ''dico.c'', ''dejavu.c'' et ''namealloc.c'' définissent trois utilisations différentes de cette table de hachage, ils doivent redéfinir les types des objets stockés. Quelle est la contrainte d'usage de ces types dans le fichier ''hte.c'' ?
    119  * '''QC2''' Dans la définition des prototypes de fonctions, le nom des paramètre est-il nécessaire ? si non pourquoi les mettre ?
     107
     108
     109
    120110 
    121 questions sur le fichier [attachment:hte.c hte.c]
    122 
    123  * '''QC3''' Quel est l'encombrement (en nombre d'octets) des structures créées en mémoire par la fonction hte_create(nb_item) , quand nb_item=10 ? Quelle différence y-at-il entre les appels système malloc() et calloc() ?
    124  * '''QC4''' La fonction hte_hash() peut-elle provoquer une erreur de segmentation ? Comment y remèdier proprement ?
    125  * '''QC5''' Dans la fonction hte_create() comment fait-on pour tester le retour de l'appel système  malloc() ? à quoi celà sert-il ?
    126 
    127 == D) Le dictionnaire ==
    128 
    129 Le fichier [attachment:dico.c dico.c] rassemble les fonctions d'accès à une table de hachage utilisée comme dictionnaire.
    130  * '''QD1''' Pourquoi la structure de donnée {{{hte_item_s}}} a-t-elle un encombrement mémoire variable ?
    131  * '''QD2''' On aurait pu utiliser une structure de donnée de taille fixe en définissant le troisième champs de la structure comme un pointeur sur chaîne de caractères du type {{{char *KEY}}}. Pour quoi n'a-t-on pas utilisé cette technique ?
    132  * '''QD3''' Quelle est la technique utilisée dans la fonction hte_add() pour créer ce type d'objet de taille variable en mémoire ?
    133  * '''QD4''' La structure de donnée {{{hte_data_s}}} n'est pas définie dans le fichier ''dico.c''. Pourquoi ? Où devra-t-il être défini ? quel genre d'information devra-t-elle contenir ?
    134  * '''QD5''' Que font les fonctions hte_get() et hte_add() ?
    135  * '''QD5''' Pourquoi teste-on la valeur de l'argument ''key'' dans les deux fonctions hte_get() et hte_add() ?
    136  * '''QD6''' Que fait la fonction perror() ?
    137 
    138 == E) La fonction de comptage des mots ==
     111
     112== C) Le dictionnaire ==
     113
     114Les fichier [attachment:dico.c dico.c] et [attachement:dico.h dico.h] rassemblent les fonctions d'accès à une table de hachage utilisée comme dictionnaire.
     115 * '''QC1''' Quel est l'encombrement (en nombre d'octets) des structures créées en mémoire par la fonction dico_create(nb_item) , quand nb_item=10 ? Quelle différence y-at-il entre les appels système malloc() et calloc() ?
     116 * '''QC2''' Pourquoi la structure de donnée {{{dico_item_s}}} a-t-elle un encombrement mémoire variable ? On aurait pu utiliser une structure de donnée de taille fixe en définissant le troisième champs de la structure comme un pointeur sur chaîne de caractères du type {{{char *KEY}}}. Pour quoi n'a-t-on pas utilisé cette technique ?
     117 * '''QC3''' Quelle est la seule fonction capable d'introduire un nouvel item dans le dictionnaire? Quelle est la technique utilisée dans la fonction dico_get() pour créer ce type d'objet de taille variable en mémoire ?
     118 * '''QC4''' Dans la fonction dico_get() comment fait-on pour tester le retour de l'appel système  malloc() ? à quoi celà sert-il ? Pourquoi teste-on la valeur de l'argument ''key'' au début de cette fonction ? Que fait la fonction perror() ?
     119 * '''QC5''' La fonction hashindex() peut-elle provoquer une erreur de segmentation ? Comment y remèdier proprement ?
     120
     121== D) La fonction de comptage des mots ==
    139122
    140123Le fichier [attachment:count.c count.c] contient le code de la fonction count(), qui compte le nombre d'occurences des différents mots présents dans le fichier texte analysé. Il contient également la fonction auxiliaire token() qui lit le fichier texte mot par mot,
    141124et la fonction result_count() qui affiche les résultats.
    142125
    143  * '''QE1''' Le mot clé ''static'' est utilisé de deux manières différentes dans le fichier ''count.c'' (à l'intérieur et à l'extérieur d'une fonction). Précisez sa signification pour chacune des deux utilisations.
    144  * '''QE2''' Dans la fonction token(), pourquoi ne peut-on pas utiliser l'appel système malloc() pour allouer la mémoire correspondant au tableau ''buffer'' ?
    145  * '''QE3''' La fonction token() doit renvoyer un nouveau "token" (mot) du fichier texte analysé, ainsi que le numéro de ligne, chaque fois qu'elle est appelée. Elle utilise les fonctions fgets() et  strtok(). Que font ces deux fonctions ?
    146  * '''QE4''' Pourquoi as-ton mis une étoile devant l'argument ''numero'' de la fonction token() ?
    147  * '''QE5''' La fonction result_count() utilise-t-elle des fonctions d'accès spécifiques pour effectuer le parcours des éléments présents dans la table de hachage ? Quelles sont ces fonctions d'accès et que font-elles ? Dans quel fichier sont-elles définies? Dans quel ordre vont être affichés les élément de la table ?
    148 
    149 == F) Autres services utiles ==
    150 
    151 Vous trouverez deux autres services possibles utilisant des tables de hachage
    152 dans les fichiers [attachment:dejavu.c dejavu.c] et [attachment:namealloc.c namealloc.c].
    153 Ces services ne sont pas utilisés dans ce TME2, mais ils vous seront utiles lors des TME futurs.
    154 Vous pourrez faire alors une édition de liens avec la bibliothèque libhte.a.
    155 
    156 La fonction dejavu() permet de répondre à la question "ai-je déjà vu cette chaine de caractères".
    157 La fonction namealloc() est très utilisée dans la chaîne de CAO Alliance,
    158 et permet de garantir que si deux chaines de caractères sont identiques
    159 alors elles seront rangées à la même adresse.
     126 * '''QD1''' Le mot clé ''static'' est utilisé de deux manières différentes dans le fichier ''count.c'' (à l'intérieur et à l'extérieur d'une fonction). Précisez sa signification pour chacune des deux utilisations.
     127 * '''QD2''' Dans la fonction token(), pourquoi ne peut-on pas utiliser l'appel système malloc() pour allouer la mémoire correspondant au tableau ''buffer'' ?
     128 * '''QD3''' La fonction token() doit renvoyer un nouveau "token" (mot) du fichier texte analysé, ainsi que le numéro de ligne, chaque fois qu'elle est appelée. Elle utilise les fonctions fgets() et  strtok(). Que font ces deux fonctions ?
     129 * '''QD4''' Pourquoi as-ton mis une étoile devant l'argument ''numero'' de la fonction token() ?
     130 * '''QD5''' La fonction result_count() utilise-t-elle des fonctions d'accès spécifiques pour effectuer le parcours des éléments présents dans la table de hachage ? Quelles sont ces fonctions d'accès et que font-elles ? Dans quel fichier sont-elles définies? Dans quel ordre vont être affichés les élément de la table ?
    160131
    161132= Etape 2 : Modifications du programme =