Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1677 connectés 

  FORUM HardWare.fr
  Programmation
  C

  tri d'un tableau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tri d'un tableau

n°1945694
msedirim
Posté le 29-11-2009 à 17:21:25  profilanswer
 

Bonjour,
J'ai  un tableau T de taille N où chaque case contient une chaine de caractère.
Comment trier ce tableau T de manière rapide car la fonction 'strlen' ne résoudre pas le problème. A titre d'information, la chaine de caractère contient des mots séparés par un 1 seul espace.
Comment on va trier ce tableau selon le nombre des mots le plus petit vers le plus grand ?
 
Voici mon essai

Code :
  1. /** Compte le nombre de mot dans str (un mot correspond à une suite de lettre et s'arrête dès qu'un caractère autre est rencontré */
  2. int count_word(const char *str)
  3. {
  4.     int n = 0;
  5.     int a=0;
  6.    
  7. while (*str)/* Equivaut à while(*str != '\0') */
  8.     {
  9.         a = 0; /* Cette variable sert à indiquer si au moins une lettre a été trouvé (pour éviter les lignes vides) */
  10.         //while (isalpha((unsigned char) *str) && *str) str++, a = 1;
  11.  /* Tant que c'est une lettre et que ce n'est pas la fin de la chaine, on parcourt la chaine
  12.         et on met a à 1 pour indiquer qu'on a trouvé au moins une lettre */
  13.         //if (a) n++; /* Si on a trouvé au moins une lettre, on augmente le nombre de mot */
  14.         //while (isspace((unsigned char) *str) && *str) str++; /* On saute tous les caractères qui ne sont pas des lettres */
  15.     while (!isspace((unsigned char) *str) && *str) str++, a = 1;
  16.     if (a) n++;
  17. while (isspace((unsigned char) *str) && *str) str++;
  18. }
  19.     return n;
  20. }
  21. int main()
  22. {
  23. char aux[1024];
  24. int i,j;
  25. .........
  26. //avant le tri
  27. for(i=0;i<N;i++)
  28. printf("%s\n",t[i]);
  29. //le tri
  30. aux[0]='\0';
  31. for(i=0;i<N;i++)
  32. {
  33.    taille1 = count_word(t[i]);
  34.    for(j=i+1;j <= N;j++)
  35.    {   
  36.    taille2 = count_word(t[j]);
  37.    if(taille1>taille2)
  38.    {
  39.              strcpy(aux,t[i]);
  40.              strcpy(t[i],t[j]);
  41.      strcpy(t[j],aux);
  42.    }
  43.      }
  44. }
  45. //après le tri
  46. for(i=0;i<N;i++)
  47. printf("%s\n",t[i]);
  48. return 0;
  49. }


Mais, le tri ne passe pas bien car l'exécution s'arrête au niveau de 1 ère itération et exactement au niveau boucle 'while' de la fonction 'count_word'.
 
Est ce que il y a une fonction prédéfinie qui prend une chaine de caractère et nous retourne le nombre de mot formant cette chaine car je ne sais pas pourquoi la fonction 'count_word' ne marche pas ou bien le problème est dans le traitement de tri ?
 
Je souhaite que vous m'aidez.
 
Merci.
 

mood
Publicité
Posté le 29-11-2009 à 17:21:25  profilanswer
 

n°1945698
malka1986
Posté le 29-11-2009 à 17:59:31  profilanswer
 

je te conseille de tout stocker dans un char ** dont chaque élément contient un mot, puis d'appliquer un algo de tri en utilisant le retour de strcmp. L'algo le plus simple à programmer (mais pas du tout opti, si tu veux opti, go tri-fusion.), c'est le "tri à bulle".


Message édité par malka1986 le 29-11-2009 à 18:01:39
n°1945765
msedirim
Posté le 30-11-2009 à 07:53:23  profilanswer
 

Bonjour,
 
Sil vous plait, Pouvez vous expliquer encore votre idée car je n'ai pas compris ?
 
Merci.

n°1945945
tpierron
Posté le 30-11-2009 à 16:09:12  profilanswer
 

Pas la peine de réinventer la roue, utilise plutôt la fonction qsort()  :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int compare_word(const void * w1, const void * w2)
  4. {
  5.     int n1, n2;
  6.     const char * str;
  7.     for (n1 = 0, str = * (const char **) w1; *str; n1 += (*str == ' '), str ++);
  8.     for (n2 = 0, str = * (const char **) w2; *str; n2 += (*str == ' '), str ++);
  9.     return n2 - n1; // Plus grand au plus petit
  10.     // return n1 - n2; // Plus petit au plus grand
  11. }
  12. int main()
  13. {
  14.     int i;
  15.     .........
  16.     //avant le tri
  17.     for(i=0;i<N;i++)
  18.         printf("%s\n",t[i]);
  19.     //le tri
  20.     qsort(t, N, sizeof t[0], compare_word);
  21.     //après le tri
  22.     for(i=0;i<N;i++)
  23.         printf("%s\n",t[i]);
  24.     return 0;
  25. }


Message édité par tpierron le 30-11-2009 à 16:15:00

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  tri d'un tableau

 

Sujets relatifs
Tableau indexé par un enum[VBA] Remplir une table Access à partir d'un tableau
Probleme d'espace autour des images dans tableau...
{C++} Tableau de structurevb excel - MAJ un tableau
Cacher/Faire apparaitre dynamiquement une ligne dans un tableau[RESOLU]Plusieurs requetes SQL en une seul sous forme de tableau
update mysql par lignes d'un tableauProblèmes avec un tableau à 2 dimensions
Plus de sujets relatifs à : tri d'un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR