DEVOIR N°2    

                                        fish_orange.gif

 Accueil          

 

                                                                          Projet1: Manipulation d'un dictionnaire

 

Ecrire un programme permettant de manipuler un dictionnaire. Ce programme comportera au moins une procédure d'insertion d'un nouveau mot à sa place dans l'ordre alphabétique, une procédure de suppression d'un nouveau mot, une procédure de recherche de mot.etc

Insertion         Suppression       Recherche          Affichage: dico1  dico2

 

Détails du programme:                                                                                        

Pour pouvoir faire une manipulation du type d'un dictionnaire il va être alors nécessaire d'utiliser un tableau de type associatif ce qui simplifie l'ajout et le retrait d'éléments. La déclaration d'un tableau se fait par @, le % permet d'accéder à l'ensemble du tableau et la valeur $ est l'identificateur qui permettra d'accéder à un élément particulier.

Pour pouvoir effectuer une manipulation du dictionnaire il est demandé de créer quatre procédures qui sont : l'affichage, l'insertion, la suppression et la recherche d'un mot. Pour cela il suffira donc d'organiser le programme en :un programme principal qui fera appel aux procédures  indépendantes.

On commence donc par déclarer que l'on créer un tableau dans lequel on insèrera au fur et à mesure les éléments (on part donc d'une base zéro, soit d'un fichier vide). On indique à l'utilisateur des différentes options mises en ouvre et l on détermine les procédures. Les & font appel aux subroutine soit aux sous programmes mis en place.

On aura donc un subroutine qui nous permettra de lire le dictionnaire, un autre qui affichera le dictionnaire et un autre qui crée un fichier de sortie du dictionnaire.

En ce qui concerne les procédures, la première, celle qui consiste à lire, part de zéro et à chaque fois que l'utilisateur rentre des mots il les met les uns à la suite des autres et les impriment. On passe ensuite à l étape d'insertion, on demande à l'utilisateur de rentrer un mot, sa catégorie syntaxique et sa définition, et ensuite de tout imprimer. Phase de suppression, on demande à l'utilisateur de rentrer un mot à supprimer  ce mot ne figurera donc plus dans le dictionnaire final (dico1) mais figurera dans l'autre dictionnaire qui rend compte des manipulations faites (dico2). Phase de recherche, on part du fait que le mot à saisir figure dans la liste c'est pourquoi avant de faire la saisie du mot à rechercher on affiche à l'écran le contenu du dictionnaire , une fois le mot trouver s'affiche alors à l'écran le mot et sa definition.    

 

   Programme:

 

#defini un tableau associatif

%mots={};

@mots=[];

#On demande a l'utilisateur ce qu'il veut faire

print "\n Afficher le dictionnaire (Choix 1)\n Inserer un mot (Choix 2)\n Supprimer un mot (Choix 3)\n Rechercher un mot (Choix 4)\n Quel est votre choix ? ";

$choix=<STDIN>;

print "choix = $choix\n";

# 3 choix possibles :

if ($choix == 1) {

    &lecturedico;

    &affichedico;

  }

if ($choix == 2) {

     &lecturedico;

     &inseremot;

     &printdico;

     &lecturedico;

     &affichedico;

   }

if ($choix == 3) {

     &lecturedico;

     &supprimer;

     &printdico;

     &affichedico;

  }

if ($choix == 4) {

    &lecturedico;

    &rechercher;

    &affichedico;

  }

print "\n Souhaitez vous effectuez une autre etape?\n O ou N\n";

$choix=<STDIN>;

chomp($choix);

print "choix = $choix\n";

if ($choix == N) {

       &affichedico;

print "\n Voici le contenu de votre dictionnaire!\n";

   }

 if ($choix == O) {

print "\n Afficher le dictionnaire (Choix 1)\n Inserer un mot (Choix 2)\n Supprimer un mot (Choix 3)\n Rechercher un mot (Choix 4)\n Quel est votre choix ? ";

$choix=<STDIN>;

print "choix = $choix\n";

}

#ferme le programme

exit;

#-------procedures---------------

sub inseremot {

#instructions pour l utilisateur

    print "\n Saisissez un mot à inserer en indiquant sa categorie syntaxique:\n";

    $insert=<STDIN>;

    chomp($insert);

    print "\n Saisissez la definition du mot\n";

    $def=<STDIN>;

    chomp($def);

#permet d inserer un mot, si le mot n existe pas alors inserer sa definition. Dans le cas ou il existe previent de l existance du mot venant d etre saisi

    if (exists($dico{$inser})) {

        print "Mot deja present dans dico\n";

    }

    else {

        $mots{$insert}=$def;

    }

}

sub supprimer {

#donne des instructions a l utilisateur

 print "\n Saisissez le mot a supprimer:\n";

    $sup=<STDIN>;

    chomp($sup);

#permet de supprimer un mot choisi dans le dictionnaire cree

#if (delete($dico{$sup})) {

 #print "\n votre mot va etre supprime\n";

#}

#else {

    #$mots{$sup};

  #}

#print "\n\n $sup\n";

#}

#print "$mots";

 while ($a=<FILE>) {

chomp ($a);

#if

 ($a=~/($sup.+)/);

#$a=~s/$1/ /g;

   if ($1){

print "$a";

print FILE "$a\n";

}

}

}       

sub rechercher {

#instruction pour l utilisateur

    print "\ Saisissez un mot a rechercher:\n";

    $rech=<STDIN>;

    chomp($rech);

#indique que durant le parcours du fichier, si le mot saisi correspond a un mot du texte alors imprimer le mot.

    while ($a=<FILE>) {

        chomp($a);

   ($a=~/($rech.+)/);

if ($1) {

print "\n\n $rech $dico";

print FILE "$a\n\n";

}

      }

  }

sub lecturedico {

#On part ici d un dictionnaire vide, ie aucun mots n y figurent.Donc se sera a l utilisateur de les rentrer.une fois rentres ils seront places les uns a la suite des autres

    print "Lecture DICO\n";

    open (FILE,"dico.txt");

    while ($ligne=<FILE>) {

        if ($ligne=~/^(\w+)\t(\w+)/) {

            $mots{$1}=$2;

            print $1,"\n";

        }    

    }

    close(FILE);

}

sub affichedico {

#affiche les mots saisis (il s agit ici d un tableau) on affecte ainsi chaque mot a une case.Lorsqu un mot est saisi l affecter a une variable du tableau (case) et afficher le mot tel que le mot choisi suivi de sa definition

    print "Affichage DICO\n\n";

    foreach $mot (sort keys (%mots)) {

            print  "$mot : definition = $mots{$mot}\n";

    }

}

sub printdico {

#Creer un second "dictionnaire" a partir du premier cree.On se retrouve ainsi a faire une manipulation de dictionnaire sur 2fichiers: un qui sera le dictionnaire de base et l autre contenant

    open(RESU,">dico2.txt");

    foreach $mot (sort keys (%mots)) {

        print RESU "$mot\t$mots{$mot}\n";

    }

    close(RESU);

#creation des deux fichiers     

    $old="dico.txt";

    $oldarchive="dicoarchive.txt";

    $new="dico2.txt";

    rename($old,$oldarchive);

    rename($new,$old);

     

  }