/*Ce programme comporte plusieurs fonctions*/
#include <stdio.h>

enum {MAXDONNEES = 8};

int tab[MAXDONNEES];
/*le tableau tab est global*/

int lire(void); /*prototype de la fonction lire*/
void trier(int);
void afficher(int);

void main(void)
{
    int NbrDonnees;
 
    NbrDonnees = lire();
    trier(NbrDonnees);
    afficher(NbrDonnees);
}

int lire(void)
{
   int donnee, nbr = 0;
 
    printf("Entrez les données entières positives à trier.\n"
             "Terminez la saisie en tapant -1.\n"
              "Vous avez droit à au plus %d valeurs\n",MAXDONNEES);
    scanf("%d",&donnee);
    while((nbr <= MAXDONNEES) && (donnee != -1))
    {
       if (nbr  == MAXDONNEES)
       {
          printf("\nvous avez donné plus de %d entiers, seuls les %d "        
                  "premiers seront triés\n", MAXDONNEES, MAXDONNEES);
          break;
       }
       else
       {
          tab[nbr] = donnee;
          nbr++;
          scanf("%d", &donnee);
       }
    }
    return nbr;
}


void trier(int nombre)

{
    int i, j, cle;

    for (i = 1; i < nombre; i++)
    {
       cle = tab[i];
       for (j = i-1; (j >= 0) && (cle<tab[j]); j--) tab[j+1] = tab[j];
       tab[j+1] = cle;
    }
}

void afficher(int nombre)
{
   int i;

    printf("\nvoici le tableau trié\n");
    for(i = 0; i < nombre; i++) printf("%5d",tab[i]);
   printf("\n");
}
void main() La fonction principale de ce programme, la fonction "main" a pour seul rôle d'appeler trois fonctions, dont le nom décrit l'usage : lire, trier et afficher. L'intérêt de cette décomposition est d'augmenter la lisibilité du programme, de faciliter la mise au point, de disposer d'un arsenal de fonctions que l'on pourra éventuellement réutiliser.
En C, on ne peut pas définir une fonction à l'intérieur d'une autre fonction. Toutes les fonctions sont "au même niveau". Il n'existe pas comme en Pascal de procédures.
La décomposition en fonctions permet aussi de séparer le programme en plusieurs fichiers-source, et d'utiliser ainsi la "compilation séparée".