[C] Existe-t-il une fonction standart de tri alphabétique ?

Existe-t-il une fonction standart de tri alphabétique ? [C] - C++ - Programmation

Marsh Posté le 16-05-2002 à 13:53:24    

Salut les gens,  
 
  Tout est dans le titre !  
 
  Cette fonction servirait en fait à trier alphabétiquement une liste de nom ! !  
 
  Merci les gens !  :)

Reply

Marsh Posté le 16-05-2002 à 13:53:24   

Reply

Marsh Posté le 16-05-2002 à 14:03:39    

En C Standard, non, mais y a une fonction de comparaison de chaines de char. Avec ça y a pas plus bête que d'écrire une fonction de tri par ordre alphabètique.

Code :
  1. int strcmp( const char *string1, const char *string2 );


valeurs de retour:
< 0 string1 less than string2  
0 string1 identical to string2  
> 0 string1 greater than string2  
 
y faut inclure string.h

Reply

Marsh Posté le 16-05-2002 à 14:21:08    

f outiliser les fonctions strl*, car elles gerent les pointerus nulls, et on peut specifier le nb de caracteres (pour eviter les buffers overflow)

Reply

Marsh Posté le 16-05-2002 à 14:26:55    

tu voulais surment dire strn*

Reply

Marsh Posté le 16-05-2002 à 14:30:43    

qsort()        : tri d'un tableau sur lui-même (méthode:tri rapide)  
 
Prototype:  
void qsort( void * tab, size_t nt, size_t taille, int (*fcmp)(const void *px1, const void *px2));  
dans: <stdlib.h>  
 
 
Description:  
Le sous-programme qsort() trie les nt éléments du tableau tab, par la méthode quick-sort.  
 
La comparaison entre deux éléments est définie par le quatrième paramètre, qui est une fonction recevant les adresses p1 et p2 des éléments à comparer et renvoie:  
 
un entier négatif si *p1 est inférieur à *p2 + 0 si *p1 est égal à *p2  
un entier positif si *p1 est supérieur à *p2.  
 
Le paramètre taille doit indiquer la taille en octets d'un élément de tab; c'est aussi la taille des zones à échanger par l'algorithme de   tri.    
 
 
 
Voir aussi:  
     bsearch()    
 
 
Portabilité:  
DOS, UNIX, C ANSI.  
 
 
Exemple:  
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
  qsort() est d'abord utilisé pour trier un tableau de
     mots en utilisant l'ordre lexicographique lié au
     code ascii.
  Dans un deuxième exemple, un tableau d'entiers est trié
     par ordre décroissant.
  Un tableau a deux dimensions de mots est trié dans le
     dernier exemple.
*/
 
 
/* Type pointeur sur caractère */
typedef  char * Pchar;
 
/* TFcmp: Type pointeur sur fonction de comparaison */
typedef  int (* TFcmp) (const void *p1, const void *p2) ;
 
/* Deux fonctions de comparaisons */
int cmpMot( const void * m1, const void * m2);
int cmpEntier( const void * pm1, const void * pm2);
 
int main (void) {
/* Premier exemple: tableau de mots */
static Pchar liste[]={"alexandre","Aline","abel","andré","Andrée"};
/* Deuxième exemple: tableau d'entiers */
static int ti[]={ 17, 25, 21, 25, 19, 23};
/* Troisième exemple: tableaux à deux dimensions (6 colonnes) */
static char tc2[][6]={"alexa","Aline","abel ","andré","André"};
 
/* Tailles respectives de chaque tableau */
int i, nl = sizeof(liste)/sizeof(liste[0]),
       nti = sizeof(ti)/sizeof(ti[0]),
       ntc2 = sizeof(tc2)/sizeof(tc2[0]) ;
 
/* Premier tri avec la fonction de comparaison cmpMot */
printf("\nAvant tri:" );
for (i=0; i<nl; i++)   printf("  %s", liste[i]);
qsort( liste, nl, sizeof(liste[0]), cmpMot);
printf("\nAprès tri:" );
for (i=0; i<nl; i++)  printf("  %s", liste[i]);
 
/* Deuxième tri avec la fonction de comparaison cmpEntier qui permet
de trier par ordre décroissant */
printf("\n\nAvant tri:" );
for (i=0; i<nti; i++)   printf("  %d", ti[i]);
qsort( ti, nti, sizeof(int), cmpEntier);
printf("\nAprès tri:" );
for (i=0; i<nti; i++)  printf("  %d", ti[i]);
 
/* Troisième tri avec la fonction de comparaison standard strcmp */
printf("\n\nAvant tri:" );
for (i=0; i<ntc2; i++)   printf("  %s", tc2[i]);
qsort( tc2, ntc2, sizeof(tc2[0]), (TFcmp) strcmp);
printf("\nAprès tri:" );
for (i=0; i<ntc2; i++)  printf("  %s", tc2[i]);
 
printf("\n" );
return 0;
}
 
int cmpMot( const void * mot1, const void * mot2) {
return strcmp(*(Pchar*)mot1, *(Pchar*)mot2) ;
}
 
int cmpEntier( const void * p1, const void * p2) {
/* comparaison pour ordre décroissant */
typedef  const  int * PEntierConstant;
PEntierConstant pi1 = (PEntierConstant)p1,
                pi2 = (PEntierConstant)p2;
return *pi2 - *pi1 ;
}
 
 google,mon ami...

Reply

Marsh Posté le 16-05-2002 à 14:42:19    

tomate77 a écrit a écrit :

f outiliser les fonctions strl*, car elles gerent les pointerus nulls, et on peut specifier le nb de caracteres (pour eviter les buffers overflow)  




 
elle gèrent les pointeurs nuls !? tu veux dire quoi au juste pas là !?
et pr les buffer overflow, y suffit de pas faire n'imp, et de pas passer à ces fonctions, des chaines de char pas terminées par un caractère nul.

Reply

Marsh Posté le 16-05-2002 à 14:43:53    

je veux dire que la fonction teste si tu lui donnes un pointeur null, ce qui peut arriver (et est valide), ce qui evite des segfault...

Reply

Marsh Posté le 16-05-2002 à 14:44:00    

prettysmile a écrit a écrit :

qsort()        : tri d'un tableau sur lui-même (méthode:tri rapide)  
 
Prototype:  
void qsort( void * tab, size_t nt, size_t taille, int (*fcmp)(const void *px1, const void *px2));  
dans: <stdlib.h>  
 
 
Description:  
Le sous-programme qsort() trie les nt éléments du tableau tab, par la méthode quick-sort.  
 
La comparaison entre deux éléments est définie par le quatrième paramètre, qui est une fonction recevant les adresses p1 et p2 des éléments à comparer et renvoie:  
 
un entier négatif si *p1 est inférieur à *p2 + 0 si *p1 est égal à *p2  
un entier positif si *p1 est supérieur à *p2.  
 
Le paramètre taille doit indiquer la taille en octets d'un élément de tab; c'est aussi la taille des zones à échanger par l'algorithme de   tri.    
 
 
 
Voir aussi:  
     bsearch()    
 
 
Portabilité:  
DOS, UNIX, C ANSI.  
 
 
Exemple:  
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
  qsort() est d'abord utilisé pour trier un tableau de
     mots en utilisant l'ordre lexicographique lié au
     code ascii.
  Dans un deuxième exemple, un tableau d'entiers est trié
     par ordre décroissant.
  Un tableau a deux dimensions de mots est trié dans le
     dernier exemple.
*/
 
 
/* Type pointeur sur caractère */
typedef  char * Pchar;
 
/* TFcmp: Type pointeur sur fonction de comparaison */
typedef  int (* TFcmp) (const void *p1, const void *p2) ;
 
/* Deux fonctions de comparaisons */
int cmpMot( const void * m1, const void * m2);
int cmpEntier( const void * pm1, const void * pm2);
 
int main (void) {
/* Premier exemple: tableau de mots */
static Pchar liste[]={"alexandre","Aline","abel","andré","Andrée"};
/* Deuxième exemple: tableau d'entiers */
static int ti[]={ 17, 25, 21, 25, 19, 23};
/* Troisième exemple: tableaux à deux dimensions (6 colonnes) */
static char tc2[][6]={"alexa","Aline","abel ","andré","André"};
 
/* Tailles respectives de chaque tableau */
int i, nl = sizeof(liste)/sizeof(liste[0]),
       nti = sizeof(ti)/sizeof(ti[0]),
       ntc2 = sizeof(tc2)/sizeof(tc2[0]) ;
 
/* Premier tri avec la fonction de comparaison cmpMot */
printf("\nAvant tri:" );
for (i=0; i<nl; i++)   printf("  %s", liste[i]);
qsort( liste, nl, sizeof(liste[0]), cmpMot);
printf("\nAprès tri:" );
for (i=0; i<nl; i++)  printf("  %s", liste[i]);
 
/* Deuxième tri avec la fonction de comparaison cmpEntier qui permet
de trier par ordre décroissant */
printf("\n\nAvant tri:" );
for (i=0; i<nti; i++)   printf("  %d", ti[i]);
qsort( ti, nti, sizeof(int), cmpEntier);
printf("\nAprès tri:" );
for (i=0; i<nti; i++)  printf("  %d", ti[i]);
 
/* Troisième tri avec la fonction de comparaison standard strcmp */
printf("\n\nAvant tri:" );
for (i=0; i<ntc2; i++)   printf("  %s", tc2[i]);
qsort( tc2, ntc2, sizeof(tc2[0]), (TFcmp) strcmp);
printf("\nAprès tri:" );
for (i=0; i<ntc2; i++)  printf("  %s", tc2[i]);
 
printf("\n" );
return 0;
}
 
int cmpMot( const void * mot1, const void * mot2) {
return strcmp(*(Pchar*)mot1, *(Pchar*)mot2) ;
}
 
int cmpEntier( const void * p1, const void * p2) {
/* comparaison pour ordre décroissant */
typedef  const  int * PEntierConstant;
PEntierConstant pi1 = (PEntierConstant)p1,
                pi2 = (PEntierConstant)p2;
return *pi2 - *pi1 ;
}
 
 google,mon ami...  




 
génial cette fonction, en standard, j'aurais pas cru que ça existait !

Reply

Marsh Posté le 16-05-2002 à 16:29:43    

ah, zut c'est pas du C++..

Reply

Marsh Posté le 16-05-2002 à 16:56:04    

prettysmile, t'es un chef ! Ta fonction marche nikel  :sol:  
 
   :jap: Merci :jap:

Reply

Marsh Posté le 16-05-2002 à 16:56:04   

Reply

Marsh Posté le 16-05-2002 à 17:00:52    

:sol:

Reply

Marsh Posté le 16-05-2002 à 17:10:57    

The_White_Rabbit a écrit a écrit :

prettysmile, t'es un chef ! Ta fonction marche nikel  :sol:  
 
   :jap: Merci :jap:  




 
Ouais, enfin, c pas lui que l'as écrite non plus !  :D

 

[jfdsdjhfuetppo]--Message édité par el_gringo le 16-05-2002 à 17:11:08--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 16-05-2002 à 17:17:34    

non, elle ne l a pas ecrite mais au moins elle sait chercher sur google (faut lire les post jusqu au bout, g pas revendique la maternite du petit)  ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed