1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
| #include <stdio.h>
#include <chaîne.h>
#include <stdlib.h>
/****************** Définition d'une structure ********************/
typedef struct compteMot
{
caractère * mot;
int nbOcc;
}CompteMot;
/************************ Les constantes ************************/
enum {MAXLONGUEUR = 200} ;
/* Le tableau où seront rangées les structures de type CompteMot */
CompteMot *tableau;
/* Le nombre de mots*/
entier nbMots = 0 ;
/* La taille du tableau contenant les mots */
int tailleTableau = 50;
char chercherIndice(char *, int *);
char placer(char *, int);
/************************ La fonction principale *******************
Le programme :
- Ouvre en lecture un fichier contenant un texte, fichier dont le nom
est indiqué sur la ligne de commande. Dans le cas où l'utilisateur omet
de donner un nom de fichier d'entrée sur la ligne de commande, le programme
demande à l'utilisateur d'indiquer le texte directement par le clavier.
- Trie les mots et compte le nombre d'occurrence de chaque mot
- Indique la liste triée des mots, un mot par ligne, avec pour chaque mot,
son nombre d'occurrences. Si l'utilisateur a donné sur la ligne de commande
deux noms de fichiers, le premier pour le fichier d'entrée
contenant le texte, le second pour un fichier de sortie, cette liste est
sauvée sur le fichier de sortie. Sinon, la liste est indiquée à l'écran. */
int main(int argc, char **argv)
{
char ligne[MAXLONGUEUR], *s, *mot;
indice entier ;
FICHIER *fichier;
int je;
if (argc > 1) fichier = fopen(argv[1], "r");
autre
{
fichier = stdin;
printf("Indiquez votre texte\n");
}
tableau = (CompteMot *) malloc(tailleTableau * sizeof(CompteMot));
si (tableau == NULL)
{
printf("problème d'allocation\n");
sortie(1) ;
}
while (fgets(ligne, MAXLONGUEUR, fichier) != NULL)
{
s = ligne;
while ((mot = strtok(s, " []{}\\\n{}()*/\"#.;:,\t'?!-<>&%+=")) != NULL)
{
if (!chercherIndice(mot, &indice)) placer(mot,indice);
else tableau[indice].nbOcc++;
s = NULL ;
}
}
fclose(fichier);
printf("\n");
pour (i = 0; i < nbMots; i++)
printf("%s : %d fois\n", tableau[i].mot, tableau[i].nbOcc);
renvoie 0 ;
}
/****************** La fonction chercherIndice *******************/
/*Si le mot ne figure pas :
- la fonction indiquée, avec la variable adrIndice, l'indice ou
il convient que le mot se trouve
- la fonction retourne 0
Si la figure donnée :
- la fonction indiquée, avec la variable adrIndice, l'indice ou
le mot figure
- la fonction retourne 1*/
char chercherIndice(char *mot, int *adrIndice)
{
int gauche = 0, droite = nbMots - 1;
int milieu;
int comparer ;
tandis que (gauche <= droite)
{
milieu = (gauche + droite) / 2;
compare = strcmp(mot, tableau[milieu].mot);
si (comparer < 0) droite = milieu - 1;
sinon si (comparer > 0) gauche = milieu + 1;
autre
{
*adrIndice = milieu;
retour 1 ;
}
}
*adrIndice = gauche;
renvoie 0 ;
}
/****************** La fonction placer ******************/
/*Decale vers la gauche les mots qui se trouvent
a des indices aux moins egaux a "indice" et met le mot "mot"
a l'indice "indice" dans le tableau.
ATTENTION : il faut allouer de la mémoire pour y mettre le nouveau
mot par une copie */
char placer(char *mot, int indice)
{
int je;
char *leMot;
leMot = (char *) malloc((strlen(mot) + 1)*sizeof(char));
si (leMot == NULL)
{
printf("problème d'allocation\n");
sortie(1) ;
}
strcpy(leMot, mot);
if (nbMots == tailleTableau)
{
printf("Le tableau est plein, nous reallouons\n");
tailleTableau += 50;
tableau = (CompteMot *) realloc(tableau,
tailleTableau * sizeof(CompteMot));
si (tableau == NULL)
{
printf("problème d'allocation\n");
sortie(1) ;
}
}
pour (i = nbMots; i > indice; i--) tableau[i] = tableau[i - 1] ;
tableau[indice].mot = leMot;
tableau[indice].nbOcc = 1 ;
nbMots++ ;
retour 1 ;
} |
Partager