FORUM Syndrome-OC - Jacky-PC


  Programmation


  Autre


  [Algo]Trier Noms ET Prénoms

 




Il y a 32 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Algo]Trier Noms ET Prénoms

n°4412
biboune77
BeYhhhh
Posté le 13-11-2004 à 19:49:33  profilanswer
 

Voila j'ai finit mon projet de C à 99%, il me manque juste une petite chose. J'ai un structure avec Nom et Prénom, plusieurs personne peuvent avoir le même Nom.
 
L'affichage doit se faire par ordre alphabétique sur le Nom et le prénom.
Donc je tri d'une part les tableaux(d'indices de la structure) par nom et après je ne troouve pas de moyen pour trier les prénoms quand le nom se répète, .
 
Voici un exemple !
On inscrit les gens au pif
Nom     Prénom
A         B
B         D
C         Z
C         A
B         M
B         A
A         A
 
Premier traitement j'obtiens
 
Nom     Prénom
A        B
A        A
B        D
B        M
B        A
C        Z
C        A
 
Je n'arrive pas à trouver un traitement qui me donne :
 
Nom     Prénom
A        A
A        B
B        A
B        D
B        M
C        A
C        Z
 
-----------------------------------------------------------------
J'ai malgré tout trouvé ca , cela fonctionne sauf qu'il m'oublie le premier je crois bien...
EDIT :Il fonctionne au bout de plusieur traitement lol
 

Code :
  1. /*---Deuxieme tri sur les Prénoms---*/
  2. for(Ind_P=0;Ind_P<Nb;Ind_P++)
  3. {
  4.  if(strcmp(TBase[TAFF[Ind_P]].Nom,TBase[TAFF[Ind_P+1]].Nom)==0)
  5.  {
  6.   if(strcmp(TBase[TAFF[Ind_P]].PNom,TBase[TAFF[Ind_P+1]].PNom)>0)
  7.   {
  8.    J=TAFF[Ind_P];
  9.    TAFF[Ind_P]=TAFF[Ind_P+1];
  10.    TAFF[Ind_P+1]=J;
  11.   }
  12.  }
  13. }


 
Signification des variables :
Ind_P :indice de position dans le tableau
TAFF: c'est le tableau d'indice qui ressemble brut à 0 1 2 3 ...
J c'est une variable temp
.Nom : c'est le nom
.PNom : c'est le prénom
TBase: tableau de structure qui contient les contacts


Message édité par biboune77 le 13-11-2004 à 19:54:28

---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
mood
Google
Posté le 13-11-2004 à 19:49:33  profilanswer
 

n°4413
Deadog
Dain Bramaged
Posté le 13-11-2004 à 19:55:05  profilanswer
 

ton algo il fait 2 srtcmp, spa génial niveau perf
 
fait voir tout ton algo

n°4414
biboune77
BeYhhhh
Posté le 13-11-2004 à 19:56:17  profilanswer
 

Bah je peux t'envoyer mes 700 lignes de projet ou juste la fonction qui trie les tableaux d'indices ?


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
n°4415
Deadog
Dain Bramaged
Posté le 13-11-2004 à 19:57:33  profilanswer
 

juste la fonction, ça suffira :d

n°4417
biboune77
BeYhhhh
Posté le 13-11-2004 à 19:58:10  profilanswer
 

Code :
  1. /**************************************************************************************************************
  2. *Fonction Traitement des tableaux d'indices                        *
  3. **************************************************************************************************************/
  4. void TraitTInd(PERS TBase[] ,int TAFF[],int Nb)
  5. {
  6. int Ind_P,Ind_Min,J;   //Declaration de l'indice position, l'indice du minimum,l'indice temporaire J
  7. /*---Premier tri sur les Noms---*/
  8. for(Ind_P=0;Ind_P<Nb;Ind_P++)
  9. {
  10.  Ind_Min=Ind_P;    //On considère que le premier est Minimum
  11.  for(J=Ind_P+1;J<Nb;J++)
  12.  {
  13.   if(strcmp(TBase[TAFF[J]].Nom,TBase[TAFF[Ind_Min]].Nom)<0) //Si le minimum est détrôné :p
  14.   {
  15.    Ind_Min=J;     //On met le nouvel indice du minimum dans Ind_Min
  16.   }
  17.  }
  18.  J=TAFF[Ind_P];    //On échange les lignes
  19.  TAFF[Ind_P]=TAFF[Ind_Min];
  20.  TAFF[Ind_Min]=J;
  21. }
  22. /*---Deuxieme tri sur les Prénoms---*/
  23. for(Ind_P=0;Ind_P<Nb;Ind_P++)
  24. {
  25.  if(strcmp(TBase[TAFF[Ind_P]].Nom,TBase[TAFF[Ind_P+1]].Nom)==0)
  26.  {
  27.   if(strcmp(TBase[TAFF[Ind_P]].PNom,TBase[TAFF[Ind_P+1]].PNom)>0)
  28.   {
  29.    J=TAFF[Ind_P];
  30.    TAFF[Ind_P]=TAFF[Ind_P+1];
  31.    TAFF[Ind_P+1]=J;
  32.   }
  33.  }
  34. }
  35. }


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
n°4418
Deadog
Dain Bramaged
Posté le 13-11-2004 à 20:26:11  profilanswer
 

la comme ça je vois pas le problème
c'est quel "premier" qu'il loupe ?
 
tu peux tjrs essayer de changer de méthode de trie pour un trie à bulles ou un trie par remplacement
je te conseil aussi de diviser des algos de trie en plusieurs petite fonction, c'est plus facile à comprendre et à débugger ;)
genre "recherche_minimum", "trie_prenom", etc ...
comme ça y'a juste à vérifier que chaque fonction marche correctement en supposant que si elle en appel d'autres, ces fonctions appelées sont viable
 
c'est une méthode qui évite les prises de tête à toute les étapes de la réalisation de ton algo ;)


Message édité par Deadog le 13-11-2004 à 20:26:43
n°4419
biboune77
BeYhhhh
Posté le 13-11-2004 à 20:27:56  profilanswer
 

ok bah le truc c'est que j'arrive pas à trouver un algo qui fonctionne bien pr classer les prénoms mais merci de ton aide, si je trouve je post...


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
n°4421
nicodache
marmotte en chocolat concept ©
Posté le 13-11-2004 à 20:39:40  profilanswer
 

remplacer par du bubble sort ?!
 
c'est pas le genre d'algo qui prend 3 plombes à tourner ?
 
[edit]je viens de penser à un truc tout con :
si tu concatène le nom et le prénom (dans ce sens là ;)), et que tu compares sur l'ensemble, le tableau ne peut pâs etre autrement que trier ;)
soit tu t'amuses à faire un tableau à 3 colonnes pour garder le nom, le prénom, et puis la concaténation des deux, ou soit c'est pas important, et tu tape une seule et bete colonne, avec un espace (ou un _, ou autre chose) entre le nom et le prénom (le _ peut être utile pour séparer nom et prénom ;))
 
(man strcat et strncat ;))


Message édité par nicodache le 13-11-2004 à 20:42:21

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4422
biboune77
BeYhhhh
Posté le 13-11-2004 à 21:37:04  profilanswer
 

J'ai repris mon algo

Code :
  1. /*---Deuxieme tri sur les Prénoms---*/
  2.     for(Ind_P=0;Ind_P+1<Nb;Ind_P++)
  3.     {
  4.         if(strcmp(TBase[TAFF[Ind_P]].Nom,TBase[TAFF[Ind_P+1]].Nom)==0)
  5.         {
  6.             if(strcmp(TBase[TAFF[Ind_P]].PNom,TBase[TAFF[Ind_P+1]].PNom)>0)
  7.             {
  8.                 J=TAFF[Ind_P];
  9.                 TAFF[Ind_P]=TAFF[Ind_P+1];
  10.                 TAFF[Ind_P+1]=J;
  11.             }


J'ai refléchis et comme il va cherche en Ind_P+1 on remplace (engras)


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
n°4425
Deadog
Dain Bramaged
Posté le 14-11-2004 à 13:10:12  profilanswer
 

la concaténation des noms et prénoms et une bonne solution sinon :)

n°4427
Deather2
OpenBSD: the way to go!
Posté le 14-11-2004 à 20:09:17  profilanswer
 

Question conne: ça veut dire quoi concaténation? :D
(Ça n'a pas un rapport avec cat sous Linux? J'ai cru voir un truc du genre sur la man page ^^)


Message édité par Deather2 le 14-11-2004 à 20:09:48
n°4428
ced-2k
TODO : Insert text here.
Posté le 14-11-2004 à 20:32:46  profilanswer
 

nom = "Deather"
prenom = "toto"
 
la contactenation des 2 = "Deather toto"

n°4429
nicodache
marmotte en chocolat concept ©
Posté le 15-11-2004 à 00:36:39  profilanswer
 

ou "toto Deather" [:dslam]
 
[edit]ca dépend dans quel sens tu concatène ;)


Message édité par nicodache le 15-11-2004 à 00:36:53

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4430
ced-2k
TODO : Insert text here.
Posté le 15-11-2004 à 00:38:49  profilanswer
 

si j'ai bien compris, il veut trier d'abord le nom, ensuite le prénom...
donc comme je l'ai fait ;)

n°4431
nicodache
marmotte en chocolat concept ©
Posté le 15-11-2004 à 00:54:16  profilanswer
 

vi, effectivement :D


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4432
Deather2
OpenBSD: the way to go!
Posté le 15-11-2004 à 07:35:45  profilanswer
 

Ah oki, c'est avec strcoll ça? :)
Vive les man pages :D

n°4438
biboune77
BeYhhhh
Posté le 16-11-2004 à 22:41:19  profilanswer
 

Le truc c'est que je veux pas utiliser un tableau ou une colonne de ma structure que je n'affiche pas donc j'essaye de trouver une solution de tri voila


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
n°4439
nicodache
marmotte en chocolat concept ©
Posté le 16-11-2004 à 23:25:45  profilanswer
 

et si tu t'arrangais plutot pour simplement faire des insertions triées, plutot que trier à l'affichage ?
 
comme ca, ya plus qu'a afficher, c'est trié quand tu ajoutes qqun...


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4441
biboune77
BeYhhhh
Posté le 17-11-2004 à 18:25:38  profilanswer
 

Non, j'ai demandé aux profs ils ont dit qu'il ne fallait pas trié à l'insertion mais j'ai trouvé malgré tout la solution :D; balayage optimisé sur Nom puis prénom sur un tableau d'indice qui fait reference au tableau de structure
 
Je poste l'algo ce soir
merci quand mm


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
n°4442
Deadog
Dain Bramaged
Posté le 17-11-2004 à 18:38:22  profilanswer
 

si tu fais mal ton suivie de structure (c'est à dire comme tu fais, utiliser un tableau et des indices), alors c'est sur que triéer à l'insertion est une mauvaise choses
 
alors que si tu faisais une liste chainée ça sert bcp bcp plus efficace

n°4443
biboune77
BeYhhhh
Posté le 17-11-2004 à 19:19:08  profilanswer
 

Code :
  1. for(Ind_P=0;Ind_P<Nb;Ind_P++)
  2.  {
  3.   Ind_Min=Ind_P;
  4.   for(J=Ind_P+1;J<Nb;J++)
  5.   {
  6.    if(strcmp(TBase[TAFF[J]].Nom,TBase[TAFF[Ind_Min]].Nom)<0) Ind_Min=J;
  7.    else
  8.    {
  9.     if((strcmp(TBase[TAFF[J]].Nom,TBase[TAFF[Ind_Min]].Nom)==0) && (strcmp(TBase[TAFF[J]].PNom,TBase[TAFF[Ind_Min]].PNom)<0)) Ind_Min=J;
  10.    }
  11.   }
  12.    if(C<=5)
  13.    {
  14.     printf("*-----------------------------------------------------*\n" );
  15.     printf("|%-15s | %-15s | %-10s | %-3s |\n*-----------------------------------------------------*\n",TBase[TAFF[Ind_Min]].Nom,TBase[TAFF[Ind_Min]].PNom,TBase[TAFF[Ind_Min]].Tel,TBase[TAFF[Ind_Min]].Cat);
  16.     TAFF[Ind_Min]=TAFF[Ind_P];
  17.     C++;
  18.    }
  19.    else
  20.    {
  21.     printf("\n" );
  22. #ifdef WIN32
  23.   system("PAUSE" );
  24. #endif
  25. #ifdef LINUX
  26.   while(getchar()!='\n');
  27. #endif
  28.     C=1;
  29.     printf("*-----------------------------------------------------*\n" );
  30.     printf("|%-15s | %-15s | %-10s | %-3s |\n*-----------------------------------------------------*\n",TBase[TAFF[Ind_Min]].Nom,TBase[TAFF[Ind_Min]].PNom,TBase[TAFF[Ind_Min]].Tel,TBase[TAFF[Ind_Min]].Cat);
  31.     TAFF[Ind_Min]=TAFF[Ind_P];
  32.     C++;
  33.    }
  34.  }


 
Pour ceuxque cela interesse :) :D


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
n°4444
biboune77
BeYhhhh
Posté le 17-11-2004 à 19:23:19  profilanswer
 

Oui while(getchar()!='\n');  cela fonctionne pr LINUX et WiNDOWS mais bon j'ai fait ca pour utiliser légèrement mon cours :p


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
n°4451
Dr Lous
I see old password
Posté le 18-11-2004 à 16:40:45  profilanswer
 

les else c pas pour les bruns ^^


---------------
Oseras-tu m'affronter ?
n°4452
biboune77
BeYhhhh
Posté le 18-11-2004 à 19:19:52  profilanswer
 

lol:p


---------------
Visit www.badtrip.fr.vu le site d'un groupe qui déchire ... Bad Trip !
mood
Google
Posté le 18-11-2004 à 19:19:52  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Autre


  [Algo]Trier Noms ET Prénoms

 

Hit Parade