Les pointeurs de fonctions

Exposé du thème

Soit la fonction qsort de la bibliothèque standard du C. Elle permet, comme son nom l'indique d'appliquer un algorithme de tri rapide sur un tableau d'éléments quelconques, a condition bien sur de fournir une fonction permettant de les comparer. Voici son prototype :

void qsort (void   *base, 
            size_t  nmemb, 
            size_t  size,
            int    (*compar)(const void *, const void *))

Les arguments ont les significations suivantes :

  1. le tableau
  2. le nombre d'éléments
  3. la taille de chaque élément
  4. la fonction de comparaison

Les trois premiers arguments se passent de commentaire. En revanche, analysons le 4ième.

int (*compar)(const void *, const void *)

Il s'agit d'un pointeur de fonction (nommé compar) laquelle renvoie un entier et prend 2 pointeurs sur void en argument. Ces 2 derniers vont recevoir les adresses des éléments à comparer. Les pointeurs sont sur void car la fonction se doit d'être aussi générique que possible.

Nous allons utiliser qsort pour trier un tableau d'entiers :


/* Fonction de comparaison : */

int comparaisonEntiers(const void *g, const void *d)
/* Doit renvoyer -1 si *g < * d
   0 si *g == *d
  1 si *g > *d 
*/

{
  const int *gi=(const int *)g;
  const int *di=(const int *)d;

  if (*gi < *di)
   return -1;

  if (*gi == *di)
   return 0;

  return 1;
}


#define TAILLE 10

int main(int argc, char *argv[])
{
  int tableau[TAILLE]={0, 5, 3, 7, 8, 4, 2, 6, 5, 3};
  int i=0;

  qsort(tableau, TAILLE, sizeof(int), &comparaisonEntiers);

  for (i=0;
       i;
       ++i)
  {
    printf("%d\n",tableau[i]);
  }
  return 0;
}

Enoncé

Le but de l'exercice est maintenant le suivant. On définit un étudiant par 3 données :

Ecrire un programme qui :

  1. saisit les caractéristiques des étudiants (à mettre dans un sous programme séparé)
  2. propose de les trier selon 3 critères :
    1. alphabétique selon le nom
    2. par ordre croissant selon la note de C
    3. par ordre décroissant selon la note de physique

Quelques pistes pour faciliter la résolution :

  1. écrire le premier sous programme avec passage par adresse
  2. écrire 3 sous programmes de comparaison ; La fonction strcmp sera utile dans le premier cas.

Pour aller plus loin :

Solution