La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

USTL Licence S.T.A. S3 Les sous-programmes - 1A.P.I.2 LES SOUS-PROGRAMMES.

Présentations similaires


Présentation au sujet: "USTL Licence S.T.A. S3 Les sous-programmes - 1A.P.I.2 LES SOUS-PROGRAMMES."— Transcription de la présentation:

1 USTL Licence S.T.A. S3 Les sous-programmes - 1A.P.I.2 LES SOUS-PROGRAMMES

2 USTL Licence S.T.A. S3 Les sous-programmes - 2A.P.I.2 Intérêts Ne pas réécrire plusieurs la même chose Factoriser le code Rendre le programme plus lisible Gagner de la place en mémoire

3 USTL Licence S.T.A. S3 Les sous-programmes - 3A.P.I.2 Deux types de sous-programmes : Les fonctions qui calculent une valeur à partir dautres valeurs, la valeur résultat nest pas une instruction, elle doit être utilisée dans une instruction Les procédures qui peuvent être considérées comme de nouvelles instructions

4 USTL Licence S.T.A. S3 Les sous-programmes - 4A.P.I.2 Déclarations Fonction function [list_par]: ; begin... := ;... end (* *) ; On peut avoir plusieurs instructions fonct := … La liste de paramètres list_par peut être éventuel- lement vide (exemple : fonction Date )

5 USTL Licence S.T.A. S3 Les sous-programmes - 5A.P.I.2 Déclarations Procédures procedure [list_par] ; begin... end (* *) ; Un programme peut être considéré une procédure sans paramètre.

6 USTL Licence S.T.A. S3 Les sous-programmes - 6A.P.I.2 Déclarations On peut bien sûr déclarer un sous-programme à lintérieur dun autre sous-programme et dans tous ces sous-programmes des variables dites locales. La multi-imbrication possible des sous-programmes entraîne lexistence de problèmes de visibilité. Visibilité des variables locales que lon peut déclarer dans un sous-programme, mais aussi visibilité des sous-programmes eux-même les uns par rapport aux autres

7 USTL Licence S.T.A. S3 Les sous-programmes - 7A.P.I.2 Règle de portée des variables locales Il ny a quune seule règle pour les variables locales : Une variable (locale ou non) est visible depuis la fin de sa déclaration jusquau « end » du programme ou sous-programme où elle a été déclarée, elle peut cependant être momentanément cachée dans un sous- programme par une autre variable ou un paramètre portant le même nom.

8 USTL Licence S.T.A. S3 Les sous-programmes - 8A.P.I.2 Un exemple scolaire program programme ; var variable : INTEGER ; // variable globale procedure sous_programme ; var variable : CHAR ; // variable locale begin... // ICI variable désigne la variable locale end (*sous_programme*) ; function f(variable : BOOLEAN):... ; begin... // ICI variable désigne le paramètre end (*f*) ; begin... // ICI variable désigne la variable globale end (*programme*).

9 USTL Licence S.T.A. S3 Les sous-programmes - 9A.P.I.2 Un autre exemple scolaire program p ; var x,y,z : INTEGER ; // variables globales procedure q(x : INTEGER) ; var u,y : INTEGER ; // variables locales begin... end (*q*) ; procedure r ; var z,u,v : INTEGER ; begin... end (*r*) ; begin... end (*p*). u v? x y z u v x y z u? v? x y z

10 USTL Licence S.T.A. S3 Les sous-programmes - 10A.P.I.2 Un exemple concret program AfficherFactorielle ; var nbre : CARDINAL ; // variable globale function f(nbre:CARDINAL): CARDINAL ; var i,fact : CARDINAL ; begin i := 2 ; fact := 1 ; // fact = 1! = (i-1)! while i <= nbre do begin // nbre désigne le paramètre fact := fact*i ; i := i+1 ; end (*while*) ; // i=nbre+1 donc fact=nbre ! f := fact ; end (*f*) ; begin readln(nbre) ; write(f(nbre)); // nbre=variable globale end.

11 USTL Licence S.T.A. S3 Les sous-programmes - 11A.P.I.2 Un exemple concret (autre version) program AfficherFactorielle ; function f(nbre:CARDINAL):CARDINAL ; var i, fact : CARDINAL ; begin i := 2 ; fact := 1 ; // fact = 1! = (i-1)! while i <= nbre do begin // nbre désigne le paramètre fact := fact*i ; i := i+1 ; end (*while*) ; // i=nbre+1 donc fact=nbre ! f := fact ; end (*f*) ; var nbre : CARDINAL ; // variable globale begin readln(nbre) ; write(f(nbre)); // nbre=variable globale end.

12 USTL Licence S.T.A. S3 Les sous-programmes - 12A.P.I.2 Règle de visibilité des sous-programmes Encore une fois il ny a quune seule règle : Un sous-programme est visible depuis la fin de son entête jusquau « end » du programme ou sous- programme où il a été déclaré, il peut cependant être momentanément caché dans un sous-programme par une autre sous-programme ayant la même entête (surcharge).

13 USTL Licence S.T.A. S3 Les sous-programmes - 13A.P.I.2 Un exemple scolaire program programme ; procedure sous_programme_1 ; function fonction(…) : … ; begin … end (*fonction*) ; begin... // ICI on peut utiliser fonction end (*sous_programme_1*) ; procedure sous_programme_2 ; begin... // ICI on peut utiliser sous_programme_1 mais pas fonction end (*sous_programme_2*) ; begin... // ICI on peut utiliser sous_programme_1 et sous_programme_2... // mais pas fonction end (*programme*).

14 USTL Licence S.T.A. S3 Les sous-programmes - 14A.P.I.2 Un autre exemple scolaire program programme ; procedure machin(x : INTEGER) ; overload ; begin... end (*machin*) ; procedure machin(x,y : INTEGER) ; overload ; begin... end (*machin*) ; procedure truc ; procedure machin(x : INTEGER); begin... begin //programme end (*machin*) ;... begin end (*programme*). end (*truc*) ; // on peut utiliser machin et machin // on peut utiliser machin //on peut machin et machin machin et machin

15 USTL Licence S.T.A. S3 Les sous-programmes - 15A.P.I.2 Un exemple concret program AfficherPpcm is function ppcm(x,y : CARDINAL) : CARDINAL ; // on utilise x * y = ppcm(x,y) * pgcd(x,y) function pgcd(x,y : CARDINAL) : CARDINAL ; var a,b : CARDINAL ; begin a := x ; b := y ; while a <> b do begin if a

16 USTL Licence S.T.A. S3 Les sous-programmes - 16A.P.I.2 Un exemple concret var x,y : CARDINAL ; begin write( ' tapez deux entiers strictement positifs : ' ) ; readln(x) ; readln(y) ; write( ' le ppcm est ' ) ; writeln(ppcm(x,y)) ; end (*AfficherPpcm*).

17 USTL Licence S.T.A. S3 Les sous-programmes - 17A.P.I.2 Un exemple concret (autre version) program AfficherPpcmEtPgcd ; function pgcd(x,y : CARDINAL):CARDINAL ; a,b : CARDINAL ; begin a := x ; b := y ; while a /= b do begin if a

18 USTL Licence S.T.A. S3 Les sous-programmes - 18A.P.I.2 Un exemple concret (autre version) fonction ppcm(x,y : CARDINAL):CARDINAL ; // utilise x * y = ppcm(x,y) * pgcd(x,y) begin return (x/pgcd(x,y))*y ; end (*ppcm*) ; x,y : CARDINAL ; begin write( ' tapez deux entiers strictement positifs : ' ) ; readln(x) ; readln(y) ; write( ' le ppcm est ' ) ; writeln(ppcm(x,y)) ; write( ' et le pgcd est ' ) ; writeln(pgcd(x,y)) ; End.

19 USTL Licence S.T.A. S3 Les sous-programmes - 19A.P.I.2 Que faire si on a deux fonctions (ou procédures) faisant chacune appel à lautre ? La première doit être avant la seconde puisque la seconde fait appel à la première, mais la première doit être après la seconde puisquelle fait appel à cette seconde (!!!). Pour cette raison (et dautres aussi quon verra plus tard), il est possible de faire une première déclaration courte dun sous- programme. Ça consiste à nécrire que lentête en la terminant par le mot-clef « forward » et après cette déclaration le sous-programme existe et peut être utilisé (en respectant la règle de visibilité citée auparavant) Appels récursifs croisés

20 USTL Licence S.T.A. S3 Les sous-programmes - 20A.P.I.2 program tester_appels_croises ; function EstImpair(n : CARDINAL):BOOLEAN ; forward ; function EstPair(n : CARDINAL):BOOLEAN ; begin if n=1 then begin EstPair := FALSE ; end else begin EstPair := (n=0) or EstImpair(n-1) ; end (*if*) ; end (*EstPair*) ; function EstImpair(n : CARDINAL):BOOLEAN ; begin if n=0 then begin EstImpair := FALSE ; end else begin EstImpair := (n=1) or EstPair(n-1) ; end (*if*) ; end (*EstImpair*) ; ………… Exemple dappels récursifs croisés


Télécharger ppt "USTL Licence S.T.A. S3 Les sous-programmes - 1A.P.I.2 LES SOUS-PROGRAMMES."

Présentations similaires


Annonces Google