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

  FORUM HardWare.fr
  Programmation
  C

  Tri par insertion -> Adaptation pour chaine de car

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tri par insertion -> Adaptation pour chaine de car

n°1034237
finch911
Posté le 04-04-2005 à 13:07:33  profilanswer
 

Salut,
Je doit utiliser le tri par insertion simple pour trier des caractère
 

Code :
  1. i=1;
  2. while (i<10)
  3. {
  4.    tmp=tab[i];
  5.    j=i-1;
  6.    while (j>=0 && tmp<tab[j])
  7.    {
  8. tab[j+1]=tab[j];
  9. j--;
  10.    }
  11.    tab[j+1]=tmp;
  12.    i++;
  13. }


 
Il marche parfaitement.
Voilà mon adaptation:
 

Code :
  1. i=1;
  2. while (i<LGMAXP)
  3. {
  4. strcpy(tmp,(pindex+i)->sis);
  5. j=i-1;
  6. chaine=strcmp(tmp,(pindex+j)->sis);
  7. while (j>=0 && chaine<0)
  8. {
  9.  chaine=strcmp(tmp,(pindex+j)->sis);
  10.  strcpy((pindex+j+1)->sis,(pindex+j)->sis);
  11.  j--;
  12. }
  13. strcpy((pindex+j+1)->sis,tmp);
  14. i++;
  15. }


 
 
Hors il ne met que le premier élément par ordre alphabétique en premier et le dernier élément par ordre alphabétique en dernier...et il mélange totalement le reste des noms...


Message édité par finch911 le 04-04-2005 à 13:18:07
mood
Publicité
Posté le 04-04-2005 à 13:07:33  profilanswer
 

n°1034249
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-04-2005 à 13:30:40  profilanswer
 

finch911 a écrit :


Code :
  1. i=1;
  2. while (i<LGMAXP)
  3. {
  4. strcpy(tmp,(pindex+i)->sis);
  5. j=i-1;
  6. chaine=strcmp(tmp,(pindex+j)->sis);
  7. while (j>=0 && chaine<0)
  8. {
  9.  chaine=strcmp(tmp,(pindex+j)->sis);
  10.  strcpy((pindex+j+1)->sis,(pindex+j)->sis);
  11.  j--;
  12. }
  13. strcpy((pindex+j+1)->sis,tmp);
  14. i++;
  15. }


Or, il ne met que le premier élément par ordre alphabétique en premier et le dernier élément par ordre alphabétique en dernier...et il mélange totalement le reste des noms...


Comment est défini pindex ? Peux-tu poster un code complet et compilable...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1034252
finch911
Posté le 04-04-2005 à 13:36:00  profilanswer
 

Emmanuel Delahaye a écrit :

Comment est défini pindex ? Peux-tu poster un code complet et compilable...


Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. #define LGMAXP 10
  6. #define LGMAXS 20
  7. #define LGMAXE 8
  8. void trierindex();
  9. typedef struct {
  10. char sis [11];
  11. int indice;
  12. } org;
  13. void main ()
  14. {
  15. org tabo[LGMAXP]={"BRABN",2,"OPLO",4,"PRO",5,"GUSTAVE",6,"ALAIN",7,"XUPONT",0,"KAPOUL",9,"JAVERT",3,"GREG",2,"JOHN",3};
  16. trierindex(&tabo[0]);
  17. }
  18. void trierindex(org *pindex)
  19. {
  20. char tmp[11];
  21. int chaine,i,j;
  22. i=1;
  23. while (i<LGMAXP)
  24. {
  25.  strcpy(tmp,(pindex+i)->sis);
  26.  j=i-1;
  27.  chaine=strcmp(tmp,(pindex+j)->sis);
  28.  while (j>=0 && chaine<0)
  29.  {
  30.   chaine=strcmp(tmp,(pindex+j)->sis);
  31.   strcpy((pindex+j+1)->sis,(pindex+j)->sis);
  32.   j--;
  33.  }
  34.  strcpy((pindex+j+1)->sis,tmp);
  35.  i++;
  36. }
  37. printf("\n\n%s",pindex->sis);
  38. printf("\n%s",(pindex+1)->sis);
  39. printf("\n%s",(pindex+2)->sis);
  40. printf("\n%s",(pindex+3)->sis);
  41. printf("\n%s",(pindex+4)->sis);
  42. printf("\n%s",(pindex+5)->sis);
  43. printf("\n%s",(pindex+6)->sis);
  44. printf("\n%s",(pindex+7)->sis);
  45. printf("\n%s",(pindex+8)->sis);
  46. printf("\n%s",(pindex+9)->sis);
  47. }


 
 
J'ai mis des noms aléatoires. Ils sont la juste pour tester. Le numéros a coté ne sers a rien dans ce cas (il sert pour la gestion séquentielle indexé directe).


Message édité par finch911 le 04-04-2005 à 13:37:47
n°1034265
finch911
Posté le 04-04-2005 à 13:50:49  profilanswer
 

ok j'ai trouver, fallait mettre la ligne 40 deux ligne plus tard...pour que le j-- fasse effet dessus...

n°1034330
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-04-2005 à 14:30:40  profilanswer
 

finch911 a écrit :

ok j'ai trouver, fallait mettre la ligne 40 deux ligne plus tard...pour que le j-- fasse effet dessus...


Une version plus 'professionelle'...


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N(a) (sizeof(a)/sizeof*(a))
 
typedef struct
{
   char sis[11];
   int indice;
}
org;
 
char *str_dup (char const *s)
{
   char *s_dup = NULL;
   if (s != NULL)
   {
      size_t const size = strlen (s) + 1;
 
      s_dup = malloc (size);
 
      if (s_dup != NULL)
      {
         memcpy (s_dup, s, size);
      }
   }
   return s_dup;
}
 
 
void trierindex (org * pindex, size_t n)
{
   size_t i = 1;
 
   while (i < n)
   {
      char *tmp = str_dup (pindex[i].sis);
 
      if (tmp != NULL)
      {
         int j = i - 1;
         while (j >= 0 && strcmp (tmp, pindex[j].sis) < 0)
         {
            strcpy (pindex[j + 1].sis, pindex[j].sis);
            j--;
         }
         strcpy (pindex[j + 1].sis, tmp);
         free (tmp), tmp = NULL;
      }
      i++;
   }
}
 
int main (void)
{
   org tabo[] =
   {
      {"BRABN", 2,},
      {"OPLO", 4,},
      {"PRO", 5,},
      {"GUSTAVE", 6,},
      {"ALAIN", 7,},
      {"XUPONT", 0,},
      {"KAPOUL", 9,},
      {"JAVERT", 3,},
      {"GREG", 2,},
      {"JOHN", 3},
   };
 
   trierindex (tabo, N (tabo));
 
   {
      size_t i;
      for (i = 0; i < N (tabo); i++)
      {
         printf ("%s\n", tabo[i].sis);
      }
   }
   return 0;
}


 
Mais attention, les noms ont été déplacés (triés), mais pas les nombres. C'est voulu ?
 
Sinon, pourquoi ne pas utiliser qsort() ?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N(a) (sizeof(a)/sizeof*(a))
 
typedef struct
{
   char sis[11];
   int indice;
}
org;
 
int compare (void const *a, void const *b)
{
   org const *pa = a;
   org const *pb = b;
 
   return strcmp (pa->sis, pb->sis);
}
 
int main (void)
{
   org tabo[] =
   {
      {"BRABN", 2,},
      {"OPLO", 4,},
      {"PRO", 5,},
      {"GUSTAVE", 6,},
      {"ALAIN", 7,},
      {"XUPONT", 0,},
      {"KAPOUL", 9,},
      {"JAVERT", 3,},
      {"GREG", 2,},
      {"JOHN", 3},
   };
 
   qsort (tabo, N (tabo), sizeof *tabo, compare);
 
   {
      size_t i;
      for (i = 0; i < N (tabo); i++)
      {
         printf ("%s (%d)\n", tabo[i].sis, tabo[i].indice);
      }
   }
   return 0;
}


Message édité par Emmanuel Delahaye le 04-04-2005 à 14:43:08

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/

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

  Tri par insertion -> Adaptation pour chaine de car

 

Sujets relatifs
mot dans une chaineprobleme avec chaine contenant des "+"
[batch]Parcourir une chaîne de caractèreASP | Concaténation de chaine de caractere :fou:
Supprimer une chaine de caractère ds plusieurs fichiers .txtInsertion date dans formulaire
JList insertion en temps réelle ...concatener chaine + entier
Tri tableau ASP : énigme...Séparer une chaine de caractère [Résolu]
Plus de sujets relatifs à : Tri par insertion -> Adaptation pour chaine de car


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