Année universitaire 2002-2003 |
Licence d'informatique
|
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.
Il ne faut surtout pas oublier les parenthèses autour de *p_f, sans quoi le compilateur comprendrait que p_f est une fonction retournant un pointeur sur un entier, ayant un seul paramètre de type flottant !
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".
Le programme ci-après permet de calculer la valeur approchée de la dérivée d'une fonction trigonométrique (cos, sin ou tan), en un point choisi par l'utilisateur. On utilise pour cela l'identité suivante, permettant le calcul approché de la dérivée d'une fonction f au point x :
f'(x) == (f(x+EPSILON)-f(x-EPSILON))/(2*EPSILON)
#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); } |
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 :
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 :
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
É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é.