Année universitaire 2002-2003
espace

Licence d'informatique
Module 4 - partie "C / shell"



Travaux dirigés 10 :

  • 1. Pointeurs de fonctions.
  • 2. Exercice 1 : tri de vecteurs.
  • 3. Appels système.
  • 4. Exercice 2 : appel système.

  • 1. Pointeurs de fonctions.

    Il est possible de définir des variables ayant le type "pointeur de fonction". La valeur d'une telle variable est l'adresse en mémoire du début du code exécutable d'une fonction, et sa déclaration s'écrit selon l'une des deux syntaxes suivantes :

    Pour lire de telles déclarations sans risque de confusion, on a intérêt à procéder en plusieurs étapes.

    Exemple :

    Attention :

    L'intérêt essentiel de telles variables est de pouvoir passer des fonctions en paramètres à une fonction. Dans un cas de ce genre, le paramètre formel doit être de type "pointeur de fonction".

    Exemple :

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define EPSILON 0.001

    double derivee(double (*p_f)(double),double x)
    /* Calcul de la dérivée d'une fonction par une expression approchée. */
    {
    return(((*p_f)(x+EPSILON)-(*p_f)(x-EPSILON))/(2*EPSILON));
    }

    int main(void)
    {
    char reponse='\n';
    double x;
    do
    {
    printf("Dérivées des fonctions trigonométriques :\n");
    printf("\t[c]osinus\n");
    printf("\t[s]inus\n");
    printf("\t[t]angente\n");
    printf("\t[q]uitter\n");
    printf("\tVotre choix (c,s,t ou q) : ");

    fflush(stdout);
    if (reponse!='\n')
    while (getchar()!='\n') ;
    scanf("%c",&reponse);
    if ((reponse=='c')||(reponse=='s')||(reponse=='t'))
    {
    printf("En quel point voulez-vous calculer la dérivée : ");

    fflush(stdout);

    scanf("%lf",&x);
    }
    printf("\n");
    switch (reponse)
    {
    case 'c' : printf("Résultat : %f\n\n",derivee(&cos,x));
        break;
    case 's' : printf("Résultat : %f\n\n",derivee(&sin,x));
        break;
    case 't' : printf("Résultat : %f\n\n",derivee(&tan,x));
        break;
    case 'q' : break;
    default  : printf("Tapez c, s, t ou q !\n\n");
    }
    } while (reponse!='q');
    exit(0);
    }

    Remarque :

    2. Exercice 1.

    On désire écrire un programme qui trie et affiche un ensemble de vecteurs du plan, par ordre croissant, selon la valeur de leur norme euclidienne. Pour cela, on utilise la fonction qsort, déclarée dans le fichier stdlib.h, qui réalise un tri rapide ("quick sort"), et qui a l'en-tête suivant :

    void qsort(void *tab,size_t nb_elem,size_t taille,
    int (*compare)(const void *,const void *))

    Remarques :

    La fonction qsort réalise le tri (croissant) du tableau d'adresse tab, comportant nb_elem éléments de taille octets. Pour cela, qsort va effectuer différentes comparaisons entre les éléments du tableau, en appelant une fonction de comparaison. Cette fonction de comparaison devra retourner :

    Après avoir défini le type vecteur par :

    réaliser les tâches suivantes :

    3. Appels système.

    Le langage C permet de lancer des "commandes système", grâce à l'utilisation de la fonction system. Cette fonction doit être appelée avec un seul paramètre effectif, qui est une chaîne de caractères représentant la commande système requise (ne pas oublier les guillemets, si la chaîne est une constante). Son utilisation nécessite l'inclusion du fichier stdlib.h

    4. Exercice 2.

    Écrire un programme en C qui demande à l'utilisateur le nom d'un répertoire, et qui le crée à partir du répertoire courant. On suppose que c'est le système d'exploitation UNIX qui est utilisé.

    Remarque :


    Ces pages ont été réalisées par A. Crouzil, J.D. Durou et Ph. Joly.
    Pour tout commentaire, envoyer un mail à crouzil@irit.fr, à durou@irit.fr ou à Philippe.Joly@irit.fr.