• Aucun résultat trouvé

Travaux Pratiques de programmation n

N/A
N/A
Protected

Academic year: 2022

Partager "Travaux Pratiques de programmation n"

Copied!
3
0
0

Texte intégral

(1)

Travaux Pratiques de programmation n

o

2

Cours de Programmation C

—L2.1—

Le but de ce TP est d’´ecrire un programmelexiquepermettant d’´etablir la liste des mots d’un texte contenu dans un fichier, chaque mot ´etant associ´e `a son nombre d’occurences. Pour cela, on se servira des tables de hachages vues en cours. Les sources seront organis´ees en trois fichiers.

Dans toute la suite, on d´esigne par mot une chaˆıne de caract`eres lue grˆace au format %s de scanf.

Les mots seront rang´es dans une table de listes de mots de taille MAX. On pourra tester diff´erentes valeurs de MAX.

On utilisera ainsi les types

typedef struct cellule{

char *mot;

int occurence;

struct cellule *suivant;

} CelluleMot, *ListeMot;

typedef ListeMot TableHachage[MAX];

xExercice 1.Gestion des listes

Cr´eer les fichiersliste.cetliste.hqui seront d´edi´es `a la gestion de listes ordonn´ees de mots avec comptage des occurences.liste.hcontiendra la d´eclaration des typesCelluleMot etListeMot.

Ecrire les fonctions d’allocation, d’affichage et d’ajout ordonn´´ e d’un mot dans une liste.

Pour l’ajout, si une cellule est d´ej`a pr´esente, on incr´ementera le nombre d’occurences (on utilisera la fonction strcmp pour comparer deux mots).

xExercice 2.Hachage

Cr´eer les fichierhachage.cethachage.hqui serviront `a la gestion de la table de hachage.

hachage.h contiendra la d´eclaration du type TableHachage.

1. ´Ecrire deux fonctions de hachage pour les chaines de caract`eres : – Somme des codes ASCII des lettres

– Somme des produits du code ASCII de la lettre par sa position dans le mot (i.e.

l−1

X

i=0

(i+ 1)∗m[i]o`ul est la longueur du motm).

1

(2)

2. ´Ecrire une fonction int AjouteMot(char* mot, TableHachage T)qui ajoute le mot mot`a la table T.

3. ´Ecrire une fonctionInfoTable qui affiche le nombre de listes non vides, la taille maxi- mum atteinte et la moyenne des tailles des listes non vides.

4. ´Ecrire une fonctionVideTablequi vide la table de hachage et retourne la liste des mots de la tables (la liste n’a pas besoin d’ˆetre ordonn´ee).

5. La fonction suivante est souvent utilis´ee pour le hachage des chaines caract`eres, elle utilise des notions qui seront abord´ees plus tard dans le cours. Copiez-la et Ajoutez-la

`

a votre programme :

unsigned hash(char *p) { unsigned h=0,g;

for(;*p;p++) {

h = (h<<4)+*p;

if(g=h&0xf0000000) /*il y a des valeurs dans les 4 bits de poids fort*/

{

h = h^(g>>24); /*Elles vont influencer le haut de l’octet de poids faible */

h = h^g; /* on les supprime du haut de h */

} }

return h;

}

xExercice 3.Lecture / ´Ecriture en fichier

Cr´eer un fichier main.cqui contiendra la fonction main de votre programme.

1. ´Ecrire une fonctionListeMot LitFichier(FILE *f)qui prend en param`etre un poin- teur sur un fichier et utilise une table de hachage pour cr´eer la liste ordon´ee avec nombre d’occurence de ses mots. Utilisez la fonction d’affichage de liste ´ecrite dansliste.cpour tester votre fonction.

2. Dans le fichier liste.c, ´ecrivez une fonction void EcritListe(ListeMot liste, FILE *f)qui ´ecrit dans un fichier la liste des mots avec leur nombre d’occurences.

3. Ecrivez une fonction mainqui lit dans les arguments de la ligne de commande un nom de fichiersourceet un nom de fichiercibleet qui enregistre dans le fichier cible la liste des mots du fichier source, si aucun fichier cible n’est donn´e, on affichera le r´esultat sur la sortie standard.

Exemple :

2

(3)

Affichage sur la sortie standard : lexique cleve

Affichage dans un fichier cleve.l:lexique cleve cleve.l

Le fichier de test cleve peut-ˆetre t´el´echarg´e `a cette adresse : http ://www-igm.univ- mlv.fr/ pons/ens/2011-L2/

4. Que fait la commande :lexique cleve |sort > cleve.l?

5. Modifier votre programme pour afficher les informations deInfoTable et effectuer des tests avec vos diff´erentes fonctions de hachage.

3

Références

Documents relatifs

Pour les redoublants : pour ne pas avoir de collision entre votre travail de l’année dernière et celui de cette année, il faut supprimer ou renommer votre ancien répertoire ProgMod,

Dans le fichier bridge.cpp, réalisez la fonction nbreCarteCouleur qui prend en entrée une MainJ et une CouleurCarte et qui renvoie le nombre de cartes de la main qui ont la

Surchar- ger la fonction sqrt pour calculer la racine carrée d’un nombre complexe.. En fait, la suite précédente ne converge pas dans le cas particulier où a est un

On va donc se baser sur ce que vous aviez codé pour effectuer des surcharges d’opérateurs pour la manipulation des dates et utiliser ensuite doctest pour réaliser des tests sur

Pour désigner une personne enregistrée dans le système, on peut utiliser l’indice de l’élément du vecteur qui contient les informations sur la personne.. De plus, pour

Écrire et tester la méthode float coutTotal de la classe Prescription qui, étant donné une prescription, renvoie le prix total des boîtes nécessaires pour couvrir la prescription et

qui pour une durée exprimée sous la forme « heures, minutes, secondes » retourne la durée correspondante exprimée en secondes.. Écrire

Le haut présente le code du programme, le bas est la zone de commande où l’on va interagir avec le programme en cours d’exécution.. raccourcis clavier