TP Hachages (tableaux associatifs)



Tables de hachage (ou tableaux associatifs)

  TP

############ comptes.pl : manipulations de hachage #############

Compléter, comprendre chaque instruction et tester si nécessaire.
#!/usr/bin/perl
%tab = %uid = ("jean" , 500, "toto" , 501, "stage", 502, "prof", 503);
@cles = keys(%tab);
@valeurs = values(%tab);
print "La liste des clés : @cles\n";
print "La liste des valeurs : @valeurs\n";
($cle, $val)= each(%tab);
print "Le premier couple : ($cle, $val) \n";
($cle, $val)= each(%tab);
print "Le deuxième  : ($cle, $val) \n";

print "affichage du hachage \%uid de 2 façons :\n";
print "\navec une boucle while :\n";
   ...
print "\navec une boucle foreach :\n";
   ...
print "affichage du hachage trié suivant les clés croissantes :\n";
   ...
print "affichage du hachage trié suivant les valeurs décroissantes :\n";
   ...
print "inverser \%uid en \%comptes puis l'afficher \n";
   ...
# UNIX : construire un hachage %comptes à partir de /etc/passwd
# les clés et et les valeurs sont resp. les noms (1er champ) et les n° uid (3ème champ)
%comptes=();
open P, "/etc/passwd";
while ($ligne=<P>) {
chomp($ligne);
( .. )= split(":",$ligne);
$comptes{..} = ...;
}
# affichage de %comptes
.....

############# dico.pl : utiliser un dictionnaire ###############

  1. Créer un hachage dont les clés sont des mots ou des expressions courantes en français, et dont les valeurs correspondantes en sont les traductions en anglais (ou autre langue au choix !)
  2. Construire une boucle TANT QUE exécutée jusqu'à ce que le mot entré au clavier soit "zzz"
  3. Faire rechercher et afficher sa traduction en anglais ou le message "mot inconnu du dictionnaire"
  4. Prolongement
    1. Le dictionnaire est stocké dans le fichier dico.txt, une ligne contenant une correspondance français anglais, avec un espace comme séparateur (ou autre)
    2. Ecrire 2 routines et les tester : lit_hachage() qui ouvre le fichier passé en paramètre et le charge dans un hachage %dico, puis ecrit_hachage() qui effectue la transformation inverse en écrivant le hachage %dico dans un fichier passé en paramètre (on pourra envisager des routines plus générales)
    3. Ecrire le script traduction.pl utilisant les 2 fonctions précédentes, puis qui ouvre un fichier contenant un texte en Français, le parcourt, et le traduit "mot à mot", le texte initial suivi de sa "traduction" étant enfin enregistrés en ajout dans le fichier traduction.txt
    4. On pourra évaluer le travail pour permettre une mise à jour du fichier dictionnaire
%dico = (
  maison => house,
  femme => wife,
  logiciel => software,
  voiture=>car
  );
......

########## nbmots.pl : compter les occurrences des mots d'un texte ##########

  1. Ouvrir en lecture un texte quelconque, puis parcourir ses lignes
  2. Pour simplifier on considère l'espace comme séparateur de mots sur chaque ligne
  3. Si le mot courant $mot existe déjà, comme clé du hachage %compteur, incrémenter la valeur correspondante, sinon mettre le mot comme clé d'une nouvelle entrée de %compteur.
    Conseil : l'incrémentation peut se faire dans les 2 cas par : $compteur{$mot}++;. En effet cette instruction crée une nouvelle entrée avec cette clé si elle n'existe pas auparavant (en contexte chaine, la valeur est la chaine vide et en contexte numérique, c'est 0)
  4. Lorsque le parcours est terminé, récapituler en affichant les mots trouvés par ordre décroissant de leur occurrence
    Pour cela, il faudra d'abord trier la liste des clés dans l'ordre décroissant des valeurs par :
    @mots_tries = sort { $compteur{$b} <=> $compteur{$a} } keys(%compteur) ;
    
    puis parcourir cette liste triée.

######### * codage_proteines.pl : traduction d'une séquence d'ADN en protéines #########