Avec l'introduction du concept de type procédural il est possible de déclarer des procédures et des fonctions ayant pour paramètres des procédures ou des fonctions.
Exemple 1: Approximation numérique du maximum d'une fonction mathématique
Supposons que l'on se voit confronté au problème suivant: Concevoir une fonction Turbo-Pascal permettant de déterminer le maximum d'une fonction continue f (au sens mathématique du terme) dans un intervalle fermé [ a, b ].
Figure 12.6 Approximation du maximum d'une fonction f
définie sur un intervalle fermé [ a, b ]
Un principe de résolution est le suivant:
Evaluer l'expression f(x) de la fonction f aux points équidistants
x0, x1, x2, . . . , xn Î [ a, b ] tels que
x0 = a,
x1 = a + h,
. . .
xn = a + nh,
avec
où h est appelé le pas de la méthode.
Il s'agit donc d'approcher la fonction f sur l'intervalle [ a, b ] en l'évaluant aux points xk tels que:
Si fk (k = 0, 1, . . . , n) désignent les valeurs correspondantes de la fonction aux points xk, il s'agit d'en calculer le maximum.
D'après cette méthode de résolution, la fonction cherchée peut s'écrire en particulier pour
sous la forme:
FUNCTION FMax ( A, B: Real; N: Integer ): Real;
{Détermine le maximum de la fonction f( x ) = x*x*(x-1)
dans l'intervalle [ A, B ].}
VAR K: 1..N;
XK, FK, Max, Step: Real;
BEGIN
Step := (B - A)/N;
XK := A;
Max := Sqr( XK )*( XK - 1 );
FOR K:=1 TO N DO
BEGIN
XK := XK + Step;
FK := Sqr( XK )*( XK - 1 );
IF FK>Max THEN Max := FK
END;
FMax := Max
END; {-- FMax}
L'inconvénient est que la fonction FMax n'est valable que pour une fonction f bien précise. Elle n'est donc pas générale. Pour remédier à cet inconvénient, on peut déclarer en Turbo-Pascal une fonction comme paramètre formel de la fonction FMax.
En utilisant la définition de type procédural
TYPE MathFunction = FUNCTION ( X: Real ): Real;
la fonction FMax va s'écrire:
FUNCTION FMax ( F: MathFunction; A, B: Real; N: Integer ): Real;
{Détermine le maximum d'une fonction f( x ) dans l'intervalle [ A, B ].}
VAR K: 1..N;
XK, FK, Max, Step: Real;
BEGIN
Step := (B - A)/N;
XK := A;
Max := F( XK );
FOR K:=1 TO N DO
BEGIN
XK := XK + Step;
FK := F ( XK );
IF FK>Max THEN Max := FK
END;
FMax := Max
END; {-- FMax}
Pour la fonction
FUNCTION F ( X: Real ): Real; Far;
BEGIN
F := Sqr( X )*( X - 1 )
END; {-- F}
le maximum cherché peut être obtenu par exemple par l'affectation:
Maximum := FMax( F, 0, 20, 100 );
Evidemment faut-il que la fonction F soit déclarée en mode Far.
Cette technique de programmation est largement exploitée dans les programmes de calculs scientifiques. En général, le concept de type procédural est particulièrement intéressant si une certaine action commune doit être exécutée pour un ensemble de procédures et de fonctions.
Exemple 2: Une méthode d'intégration numérique: la méthode des trapèzes
On désire écrire une fonction qui calcule l'intégrale définie d'une fonction F( X ) entre les bornes réelles A et B:
Géométriquement, la fonction Int( X ) représente la surface délimitée par la courbe d'équation Y = F( X ), l'axe des abscisses et les droites d'équations respectives X = A et X = B. Cette surface peut être approximée en divisant l'intervalle [ A, B ] en N intervalles de diamètre h = (B - A)/N chacun et en calculant la somme des surfaces des trapèzes ainsi représentés dans la figure 12.7 ci-dessous.
Figure 12.7 Approximation d'une intégrale définie par la méthode des trapèzes
L'approximation s'écrit de la manière suivante:
En reprenant la définition de type procédural de l'exemple 1, on écrit sans peine le schéma de fonction suivant:
FUNCTION Int ( F: MathFunction; A, B: Real; N: Integer): Real;
{Calcule l'intégrale définie d'une fonction F( X ) définie sur l'intervalle
[ A, B ] d'après la méthode des trapèzes.}
<définitions et déclarations locales>
BEGIN
END; {-- Int}
Si nous choisissons à titre d'exemple les deux intégrales suivantes:
alors un programme Turbo-Pascal réalisant cette tâche peut s'écrire comme suit:
PROGRAM Integral;
Uses Crt;
CONST Pi = 3.14159;
TYPE MathFunction = FUNCTION ( X: Real ): Real;
FUNCTION Int ( F: MathFunction; A, B: Real; N: Integer): Real;
{Calcule l'intégrale définie d'une fonction F (X) définie sur l'intervalle
[ A, B ] d'après la méthode des trapèzes.}
VAR H, {pas}
Sum: Real;
BEGIN
H := ( B - A )/N;
Sum := 0;
WHILE A<B DO
BEGIN
Sum := Sum + F( A ) + F(A+H);
A := A + H
END; {WHILE, A>=B}
Int := (H/2)*Sum
END; {-- Int}
FUNCTION F ( X: Real ): Real; Far;
BEGIN
F := Sin( X )
END; {-- F}
FUNCTION G ( X: Real ): Real; Far;
BEGIN
G := X*Exp( X )
END; {-- G}
BEGIN {main}
ClrScr;
Writeln ( 'Intégrale de F( X ) entre 0 et PI/2: ', Int( F, 0, PI/2, 100 ) );
Writeln ( 'Intégrale de G( X ) entre 2 et 3: ', Int( G, 2, 3, 100 ) )
END. {-- Integral}
© Aflo Informatique , 2003-2004