Correction des rendus du TP N°3 en expliquant les problèmes de compréhension de la procédure et de la fonction [email protected] J’ai pris au hasard un échantillon représentatif des réponses, je vais essayer de faire mes remarques sur les choses qui n’ont pas été comprises. Quelle est la différence entre une procédures et une fonction ? - Une procédure est un sous-programme qui ne renvoie pas de résultat. Il vaut mieux afficher le résultat avant de quitter la procédure avec writeln. Par exemple : Procedure psomme (a,b : integer) ; Var z :integer ; {z est une variable qui reçoit le résultat, elle est locale à la procédure, c’est-à-dire quand on quitte la procédure sa valeur est perdue} Begin Z :=a+b ; Writeln(‘La valeur de la somme est :’,z) ; End ; N.B. Quand on utilise var, ce n’est pas la même chose voire en bas les explications. - Une fonction renvoie toujours un résultat. En fait, une fonction c’est comme en math, pour l’appeler on fait y=f(x,y), mais cela se fait dans l’appel, c’est-à-dire dans le programme principal. Donc une fonction renvoie un résultat et le type du résultat doit être déclaré. Par exemple : Function Fsomme(a,b : integer) : integer ;{le type du résultat est en rouge} Var z :integer ; {z est une variable qui reçoit le résultat, elle est locale à la procédure, c’est-à-dire quand on quitte la procédure sa valeur est perdue} Begin Z :=a+b ; Fsomme :=z ; {le nom de la fonction en rouge reçoit le résultat z} {pas d’affichage du résultat, il sera fait dans le programme principal} End ; Comment se fait l’appel des procédures et fonctions ? - Je vais essayer de faire l’appel de la procédure et la fonction déjà définies plus haut dans le programme principal, voici donc le programme principal qui contiendra le corps de chaque sous-programme et le programme principal Program Var exempleAppelsProcetFonc; c,d,e : integer ; {c, d et e sont des variables réservées au programme principal] {il vaut mieux ne pas les utiliser dans la procédure et la fonction} Procedure psomme (a,b : integer) ; Var z :integer ; {z est une variable qui reçoit le résultat, elle est locale à la procédure, c’est-à-dire quand on quitte la procédure sa valeur est perdue} Begin z:=a+b ; Writeln(‘La valeur de la somme est :’,z) ; End ; Function Fsomme(a,b : integer) : integer ;{le type du résultat est en rouge} Var z :integer ; {z est une variable qui reçoit le résultat, elle est locale à la procédure, c’est-à-dire quand on quitte la procédure sa valeur est perdue} Begin z :=a+b ; Fsomme :=z ; {le nom de la fonction en rouge reçoit le résultat z} {pas d’affichage du résultat, il sera fait dans le programme principal} End ; {Ici le programme principal qui fait l’appel} Begin Write(‘Donnez deux nombres :’) ; Readln(c,d) ; Psomme(c,d) ; //appel de la procédure, elle affichera toute seule e :=fsomme(c,d) ; //appel de la fonction avec affectation writleln ; //ne pas oublier d’afficher le résultat de la fonction writeln(‘La somme effectuée par la fonction est :’,e) ; End. C’est quoi une procédure ou fonction paramétrée ? - Je peux écrire la procédure psomme sans paramètres, mais il faut demander la saisie dans le corps de la procédure (voire partie en rouge ci-dessous), ainsi ma procédure deviendra : Procedure psommeSP; Var z,a,b :integer ; {z est une variable qui reçoit le résultat, elle est locale à la procédure, c’est-à-dire quand on quitte la procédure sa valeur est perdue} Begin Write(‘Donnez deux nombres a et b :’) ; Readln(a,b) ; z:=a+b ; Writeln(‘La valeur de la somme est :’,z) ; End ; Le concept de « Var » dans les paramètres ? Si on souhaite que les modifications apportées dans la procédure soient reportées dans le code appelant, il faut mettre le mot clé var dans le passage de paramètre. C'est alors la référence à la variable (et non pas la valeur de cette variable) qui est passé en paramètre. Par exemple : procedure echange(var a,b:real) ; var temp:real; begin temp:=a; a:=b; b:=temp; end; Ici on peut remarque que dans la procédure, il n y a pas de writeln donc pas d’affichage, pourtant le changement s’effectue même quand on quitte la procédure. Cela veut dire que a et b vont vraiment être échangés. Vous pouvez tester cette procédure dans un programme principal avec var, il y aura échange et sans var pas d’échange. Je vous conseille vraiment de la tester. Maintenant on va faire la correction des exercices. Exercice 1 : Program calcul_puissance ; Uses crt ; Var a , b : integer ; z:longint; Procedure saisir(var {ici var Begin Write('Donnez un Write('Donnez un End ; x,y:integer) ; c'est important car sinon x et y seront perdues} nombre: ');readln(x) ; exposant: ');readln(y) ; Function puissance(x,n:integer):longint ; Var i:integer; P:longint ; {longint, c'est pour les entiers grands} Begin P:=1 ; For i:=1 to n do P:=P*x; Puissance:=P ; {résultats P affecté au nom de la fonction} End ; Begin saisir(a,b) ; z:=puissance(a,b) ; {Appel d’une fonction avec affectation} Writeln('La puissance calculée est :',z:5) ; End. Exercice 2 : Program Calcul_factorielle ; Uses crt ; Var a : integer ; z:longint; Procedure saisir(var n:integer) ; {ici var c'est important car sinon n sera perdues} Begin Write('Donnez un nombre: ');readln(n) ; End ; Procedure afficher(f,n:integer) ; Begin Writeln('La factorielle de:', n, ' est égale à:', f ); End ; Function factorielle(n:integer):longint ; Var i:integer; F:longint ; {longint, c'est pour les entiers grands} Begin F:=1 ; For i:=1 to n do F:=F*i; factorielle:=F ; {résultats P affecté au nom de la fonction} End ; Begin saisir(a) ; z:=factorielle(a) ; {Appel d’une fonction avec affectation} afficher(z,a); End. Exercice 3 : Program Calcul_factorielle ; Uses crt ; Var a : integer ; Procedure saisir(var n:integer) ; {ici var c'est important car sinon n sera perdue} Begin Write('Donnez un nombre: ');readln(n) ; End ; Procedure PairImpair(n:integer); Var i:integer; Begin if (n mod 2 =0) Then writeln('le nombre ',n, ' est pair') else writeln('le nombre ',n, ' est impair'); End ; Begin saisir(a) ; PairImpair(a) ; {Appel d’une procédure avec un seul paramètre} End. Exercice 4 : L’exercice 4 sera repris dans le TP suivant.