Mots français D) Liste affichée et permutée

Description

Mots français D) Liste affichée et permutée

Bonjour,

Ce code est composé de trois parties:
1. Lire une liste mot par mot (ici ligne par ligne) dans buf.
2. Créer une liste "vector<char*> list" de pointeurs sur les mots.
3. Appliquer une permutation aléatoire sur cette liste.

Un menu permet d'activer ou de réactiver ces parties.
Le résultat est directement affiché dans une fenêtre RichEdit et son titre indique alors le nombre de mots.

La fonction void Display() "remplit" la fenêtre RichEdit en une seule fois grâce à l'array buf:
HWND main,rich;
char *buf,*mots=0;
std::vector<char*> list;

void Display() {
  int i=0;
  for (int m=0,j=0; m<list.size(); ++m,j=0) {
    char *c=list[m];
    do buf[i++]=c[j]; while (c[++j]);
    buf[i++]='n';
  }
  buf[--i]=0; SetWindowText(rich,buf);
}
Remarquez la vitesse d'affichage de la liste générée par le "grand fichier" 336531mots.txt.

Le code void Liste(int n) crée la liste vector<char*> list de pointeurs de mots:
void Liste(int nChar) {
  char tit[256];
  int i,b=0,p=0;
  for (i=0; i<nChar; ++i) {
    if (buf[i]=='n') {
      if (b) {list.push_back(mots+p); b=0;}
      mots[i]=0; p=i+1;
    } else {mots[i]=buf[i]; b=1;}
  }
  if (b) {mots[i]=0; list.push_back(mots+p);}
  sprintf_s(tit,"Mots français [%i mots]",list.size());
  SetWindowText(main,tit);
}


La routine void Permut() est une adaptation de CodeS-SourceS: Permutations aléatoires pour de grands ensembles:
void Permut() {
  for (int i=list.size(); i>0;) { // ► CodeS-SourceS: Permutations aléatoires
    int r=(rand()+(rand()<<15))%i; // pour i > 32767 = RAND_MAX
    char *e=list[r]; list[r]=list[--i]; list[i]=e;
  }
}
L'expression (rand()+(rand()<<15) permet d'obtenir un nombre aléatoire entres 0 et 2³⁰-1 = 1073741823.

Il ne semble pas très utile de permuter aléatoirement une liste de mots déja bien ordonnée.
Mais cela nous permettra de tester différents algorithmes de tri sur ces listes.

La fonction void Open() donne la possibilité d'ouvrir n'importe quel fichier contenant des mots enregistrés ligne par ligne:
void Open() {
  char name[256]="";
  OPENFILENAME ofn={sizeof(ofn),main,0,"All*.*Text*.TXT",0,0,0,name,
    256,0,0,0,0,OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST,0,0,0,0,0,0,0,0,0};
  GetOpenFileName(&ofn);
  FILE *fil;
  if (name[0]) {fopen_s(&fil,name,"r"); fseek(fil,0,SEEK_END);} else return;
  int nChar=ftell(fil);
  if (mots) {delete[] buf; delete[] mots;}
  buf=new char[nChar+8]; mots=new char[nChar+8];
  if (mots==0) {MessageBox(0,"Manque de mémoire !","Erreur",0); return;}
  fseek(fil,0,SEEK_SET); fread(buf,nChar,1,fil); fclose(fil);
  list.clear(); Liste(nChar);
}

Pour le moment, par mesure de simplicité, l'ensemble du programme se trouve sur un seul fichier ListePermutee.cpp.

En ce qui concerne la liste de mots français, je propose celle tirée du fichier compressé "liste.de.mots.francais.frgut.txt.gz" qui figure parmi les liens ci-dessous, car c'est la plus "grande" que j'ai trouvée, et elle a l'air d'être "bien" ordonnée.
Elle donne les 336531 mots français actuels contenus également dans le fichier 336531mots.txt (789 Ko) que j'ai ajouté au Zip.
Ce fichier ne contient pas de caractères CR (Retour chariot, Carriage return).

Cet article servira de "base" pour l'étude de quelques algorithmes de tri d'ensembles de mots français.
 
 
Bonne lecture
 

Liens

CodeS-SourceS: Mots français A) Affichage sur console
CodeS-SourceS: Mots français B) Affichage avec Edit
CodeS-SourceS: Mots français C) Affichage avec RichEdit
CodeS-SourceS: Permutations aléatoires
frgut: liste.de.mots.francais.frgut.txt.gz
 

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.