www.facultedegenie.net |
|
* Guest-Book * f = w & g = f = w & g |
Informatique : PASCAL (Chapitre VII) FONCTIONS,
PROCEDURES, RECURSIVITE This
text copyright = www.ziade.net (VII.1) Fonctions (définies par l'utilisateur) Nous avons vu que le Pascal possède des fonctions prédéfinies (comme: EXP, LN, SIN, …). Le programmeur peut aussi créer des nouvelles fonctions, elles sont dites ''définies par l'utilisateur''. (VII.1.a) Déclaration d'une fonction (non prédéfinie) Voici un exemple simple d'une fonction SIGNE définie par l'utilisateur:
***
Important 1: Dans l'exemple ci-dessus (cas
particulier): ***
Important 2: Voici un exemple d'une fonction ayant plusieurs paramètres (ici ils sont deux):
. Voici un exemple d'une fonction ayant des paramètres de types différents:
***
Important 3: Voici un exemple d'une telle fonction (SINE donnera: [sin(x)/x] si [sin(x)/x]>0, et 0 sinon) :
***
Important 4: (VII.1.b) Utilisation d'une fonction (non prédéfinie) Une fois déclarée, une
fonction définie par l'utilisateur s'utilise de la même
façon qu'une fonction prédéfinie (comme EXP, SIN,
…). Par exemple: (VII.1.c) Qu'est ce qu'un paramètre ? Revenons à la fonction suivante (définie par l'utilisateur) :
Le paramètre de cette fonction
est X. En effet, si nous exécutons (dans le corps du programme) les trois instructions
nous obtenons à l'affichage: Remarquons que si le
paramètre X avait été confondu avec la variable X,
alors nous aurions obtenu l'affichage suivant: X = 7 et Y
= 1 *** On dit que les paramètres sont passés par valeur c'est-à-dire que le compilateur passe à la fonction la valeur du paramètre (ou photocopie), mais ne passe pas la variable (en tant que variable). (VII.1.d) Partie déclarative locale (dans une fonction) Une fonction peut contenir une partie déclarative (voir la partie déclarative d'un programme). Cette partie déclarative est locale c'est-à-dire que ce qui est déclaré existe seulement pendant l'exécution de la fonction (ensuite les variables locales sont oubliées). PROGRAM
FACTORIELLE ;
BEGIN { corps du programme } Dans le programme précédent,
les variables locales (i et ACCU) sont utilisables
seulement dans la fonction dans laquelle elles sont
déclarées, ensuite ces variables sont oubliées. Il en
est de même pour toutes les déclarations locales qui
sont utilisables seulement dans la fonction (ou dans la
procédure) dans laquelle elles sont déclarées, ensuite
ces déclarations sont oubliées. (VII.2) Procédures (définies par l'utilisateur) Nous avons vu que le Pascal
possède des procédures prédéfinies (comme: WRITELN,
…). (VII.2.a) Déclaration d'une procédure (non prédéfinie) Voici un exemple simple d'une procédure CARRE définie par l'utilisateur:
(VII.2.b) Utilisation d'une procédure (non prédéfinie) Une fois déclarée, une
procédure définie par l'utilisateur s'utilise de la
même façon qu'une procédure prédéfinie (comme: writeln,
readln, …). Par exemple: ATTENTION: le nombre, l'ordre et le type des paramètres déclarés doivent être respectés. Les exemples suivants sont
impossibles: (VII.2.c) Comment obtenir des résultats ? Une procédure peut donner: un résultat de type non simple (comme un tableau), ou un résultat de type ''non prédéfini'' (c'est-à-dire défini par l'utilisateur), ou plusieurs résultats. Mais une procédure ne donne pas une valeur (contrairement à une fonction qui donne une valeur). Les résultats sont obtenus
grâce aux ''paramètres passés par variable'' c.-à-d. ''paramètres passés par
adresse'' qui sont
appelés ''paramètres
de sortie''. Dans l'exemple ci-dessous, les résultats ou paramètres de sortie sont B et TRACE (car passés par adresse ou par variable à cause du mot clé VAR), tandis que le(s) paramètre(s) d'entrée est A. PROGRAM PRO ;
BEGIN { corps du programme } Dans l'exemple ci-dessus les paramètres (A et B) ne sont pas déclarés au début du programme. Important 5: (VII.3) Différences entre ''paramètres passés par valeur'' et ''paramètres passés par variable (ou par adresse)'' Revenons à l'exemple précédent (très instructif au sujet des paramètres) : - La matrice A est un ''paramètre passé par valeur'', donc quand le programme appelle la procédure TRANSPOSE(MAT, MAT, X) le compilateur va travailler sur le paramètre A qui est une copie de la matrice MAT. - La matrice B est un ''paramètre passé par variable (ou par adresse)'', donc quand le programme appelle la procédure TRANSPOSE(MAT, MAT, X) le compilateur va travailler sur le paramètre B qui est alors la variable MAT. ***
Important 6: L'exemple suivant a pour but de bien montrer la différence entre ''paramètre passé par valeur'' et ''paramètre passé par variable''. PROGRAM FOLKLORE ;
BEGIN { corps du programme } A l'exécution de ce programme,
nous obtenons l'affichage suivant: Donc les modifications des ''paramètres passés par valeur'' sont oubliées à la sortie de la procédure, tandis que les modifications des ''paramètres passés par variable (ou par adresse)'' vont rester. (VII.4) Différences entre ''variables globales'' et ''paramètres passés par variable'' Nous avons vu que les paramètres sont des ''variables muettes'' et que compilateur travaille directement sur les ''paramètres passés par variable''. Considérons le programme suivant: PROGRAM DISTINGUER
;
BEGIN { corps du programme } Nous obtenons l'affichage
suivant: Donc dans la procédure: X est le paramètre, ce n'est pas la variable globale X. Pour cette raison à
l'exécution de l'instruction BIDULE(ALPHA); le
compilateur va travailler directement sur la variable
ALPHA qui est le '' paramètre passé par variable ''. Dans cette procédure: X est le
paramètre, simplement car X est déclaré paramètre
dans la procédure. (VII.5) Différences entre ''variables globales'' et ''paramètres passés par valeur'' Nous avons vu que les paramètres sont des ''variables muettes'' et que le compilateur travaille sur une copie des ''paramètres passés par valeur''. Il suffit de reprendre l'exemple ci-dessus en enlevant le mot réservé VAR dans la déclaration de BIDULE alors X devient un ''paramètre passé par valeur'' dans la procédure.
Cette modification donne
l'affichage suivant: En effet, un ''paramètre passé par valeur'' est une copie de la variable (d'appel). (VII.6) Différences entre variables globales et variables locales Nous avons vu que les variables globales sont déclarées au début du programme, et que nous pouvons faire des déclarations locales donc nous pouvons avoir des variables locales (dans une fonction ou une procédure). Considérons le programme suivant: PROGRAM
DISTINCTION ;
BEGIN Nous obtenons l'affichage
suivant: Donc dans la procédure: N est une variable locale, ce n'est pas la variable globale N. Pour cette raison à l'exécution de l'instruction MACHIN; le compilateur va travailler sur une nouvelle variable N qui est une ''variable locale'', c'est-à-dire que cette nouvelle variable n'existera que pendant la procédure et ce n'est pas la ''variable globale'' N. Dans la procédure: N est une variable locale, simplement car N est déclaré locale dans la procédure. (VII.7) Récursivité (fonction ou procédure récursive) Une fonction ou une procédure est dite récursive si elle s'appelle elle-même. Par exemple:
L'idée vient de l'égalité: N! = N * (N-1)! qui implique que la valeur de FAC(N) est N * FAC(N-1). D'où l'écriture de cette fonction { car le FAC situé à gauche dans FAC := N * FAC(N-1) est la valeur de FAC(N) puisque le paramètre de FAC est N }. La fonction FAC est récursive car elle utilise FAC(N-1) pour calculer FAC(N). La récursivité est naturellement possible car le Pascal utilise des paramètres. Voici un exemple d'une procédure récursive: PROGRAM HEXADECIMAL ;
BEGIN Cet exemple illustre bien l'avantage et le principe de la récursivité: il suffit de savoir comment ramener le cas général (entier positif quelconque) à un cas simple (entier de 0 à 15) qu'on sait faire facilement. ATTENTION: IL FAUT TOUJOURS PREVOIR UN TEST POUR FINIR LA RECURSIVITE. (II) Erreurs ou Limites des Calculs Numériques et informatiques ***** (III) Types, Opérateurs, Fonctions et Procédures prédéfinis (IV) Partie Déclarative d'un programme (VI) Affectations, Tests, Boucles (VII) Fonctions, Procédures, Récursivité |