Sunteți pe pagina 1din 5

Parametrii unei proceduri

Parametrii unei proceduri sunt date pe care modulul apelant le transmite la fiecare apel
unui subprogram, i pe care acesta le va folosi atunci cnd se execut.
Parametrii unei proceduri pot fi:
A. parametri transmii prin valoare
B. parametri transmii prin referin
A. Parametri transmii prin valoare
Pentru a nelege funcionarea parametrilor, vom pleca de la variantele V2 i V3 (vezi tema 1) ale
programului pentru calculul mediei aritmetice a dou numere.
Dac apelm procedura de mai multe ori n programul principal, ea se va executa de cte ori a fost apelat,
dar de fiecare dat va afia media aritmetic pentru aceleai numere a i b citite de la tastatur.
Dar, exist i posibilitatea ca procedura la fiecare execuie s foloseasc alte date. Acest lucru se face
transmind procedurii datele respective ca parametri.
Vom ilustra mecanismul funcionrii parametrilor pe acelai exemplu, calculul mediei aritmetice a dou
numere:
{Varianta V4}
program sub_4;
var ma,a0,b0,a,b:real;
procedure calcul_media(a,b:real);
begin
ma:=(a+b)/2;
writeln(ma:,ma:8:2);
end;
begin
calcul_media(2,3);
{apel 1}
a0:=-5;b0:=-4;
calcul_media(a0,b0);
{apel 2}
calcul_media(abs(a0),abs(b0));
{apel 3}
write(a,b:);readln(a,b);
calcul_media;
{apel 4}
end.
Procedura calcul_media trebuie s poat calcula i afia media aritmetic pentru oricare dou numere reale.
De aceea aceste numere vor fi transmise efectiv ca parametric procedurii atunci cnd aceasta este apelat. Pentru a
realize acest lucru definim n antetul procedurii doi parametri a i b de tipul real, care sunt de fapt nite
simboluri(nu au nici o valoare n momentul definirii), se numesc parametric formali.
Antetul procedurii va arta astfel:
procedure calcul_media(a:real;b:real);
Corpul procedurii va rmne la fel.
Pentru a se executa procedura aceasta trebuie apelat. La apel, se precizeaz numele procedurii i valorile
concrete ale parametrilor, aceste valori se numesc parametri actuali(efectivi).
Cnd este apelat o oprocedur modulul principal e abandonat temporar i se execut procedura. n
acest moment parametri formali sunt nlocuii n tot corpul procedurii cu parametri efectivi.
Dup terminarea execuiei procedurii, se revine imediat n programul principal la linia imediat
urmtoare celei care a fcut apelul.
Parametrii transmii prin valoare se comport ca nite variabile locale.
Acest mod de transmitere a parametrilor se numete transmiterea patrametrilor prin valoare.
n continuare, s urmrim ce se ntmpl cnd lansm n execuie {Varianta V4} a programului pentru
calculul mediei aritmetice.

Modulul principal ncepe cu apelul procedurii calcul_media(2,3); {apel 1}, n acest moment
parametrii formali a i b sunt nlocuii cu parametri efectivi 2 respectiv 3, n tot corpul procedurii:
- {ma:=(a+b)/2} nlocuiete valorile lor ma:=(2+3)/2)=2.5

- { writeln(ma:,ma:8:2);} va afia ma:uuuu2.50, u Space


n acest moment parametrii actuali sunt valori constante.

Dup ncheierea execuiei {apel 1} se revine n programul principal la linia imediat urmtoare

Se atribuie variabilelor a0 i bo valorile -5 respectiv -4 i se trece la linia urmtoare cu apelul


procedurii calcul_media(a0,b0); {apel 2}, n acest moment parametrii formali a i b sunt nlocuii cu parametri
efectivi -5 respectiv -4, n tot corpul procedurii:
- {ma:=(a+b)/2} nlocuiete valorile lor ma:=(-5-4)/2)=-4.5
- { writeln(ma:,ma:8:2);} va afia ma:uuu-4.50, u Space
n acest moment parametrii actuali sunt valori ale unor variabile.

Dup ncheierea execuiei {apel 2} se revine n programul principal la linia imediat urmtoare

Se execut {apel 3}, n acest moment parametrii formali a i b sunt nlocuii cu parametri efectivi
abs(-5) respectiv abs(-4), n tot corpul procedurii:
- {ma:=(a+b)/2} nlocuiete valorile lor ma:=(5+4)/2)=4.5
- { writeln(ma:,ma:8:2);} va afia ma:uuuu4.50, u Space
n acest moment parametrii actuali sunt valori returnate de ctre funcii.

Dup ncheierea execuiei {apel 3} se revine n programul principal la linia imediat urmtoare

n acest moment se vor citi de la tastatur valorile pentru a i b, dup care se realizeaz {apel 4}.
Dei parametri formali au acelai nume cu parametri actuali calculatorul nu va face confuzie ntre ei,deoarece
parametri formali nu au nici o valoare, iar cei actuali sunt valorile variabilelor a i b citite de la tastatur.
n acest moment parametrii actuali sunt pot fi nite variabile care au acelai nume ca i parametri
formali. Exemplu:
Valorile parametrilor actuali pot fi: constante, variabile, valori ale variabilelor obinute prin
atribuire sau citire, valori ale unor expresdii, valori returnate de funcii.
Parametri actuali trebuie s corespund ca numr,, ordine i tip cu parametri formali.
Fie procedura: procedure test(x,y:integer;z:real);
Apelul: test(5,3.5,-2.1); va genera eroare deoarece al doilea parametru efectiv(actual) este
3.5 este un numr real, iar parametru formal y este de tipul integer. Deci, n concluzie:

Sintaxa unei proceduri cu parametri este:


Procedure <id_proc>(<l1>:<tip1>;<l2>:<tip2>;<l3>:<tip3>;.);
{declaraii de variabile locale }
Begin
{corpul procedurii}
end;
Apelul unei proceduri: <id_proc>(<l1>,<l2>,<l3>,);
<l1>,<l2>,<l3>, sunt liste de parametri, ea poate conine unul sau mai muli parametric
separai prin virgul
<id_proc> identificatorul (numele) procedurii
<tip1>,<tip2>,<tip3>, tipurile parametrilor

Probleme rezolvate:
Problema 1. Se citesc de la tastatur n triplete de numere ntregi. Pentru fiecare dintre ele s se verifice
dac numerele care-l compun pot forma laturile unui triunghi, apoi n caz afirmativ se va afia aria triunghiului
calculat cu formula lui Heron, iar n caz contrar se va afia un mesaj de eroare. Pentru testarea unui triplet se va
folosi o procedur care primete ca parametric cele trei numere.
Soluie:
Reamintim: Aria trunghiului prin formula lui Heron se calculeaz astfel:

At

abc
2
1

p ( p a ) ( p b ) ( p c ) , unde p

Exemplu numeric:
Pentru n=4 i tripletele:
se afieaz
346
5.33
149
nu e triunghi
333
3.90
-2 -1 0
nu e triunghi
Definim o procedur {scriere_triunghi(a,b,c:integer;)} care va prelucra tripletul alctuit din numerele a, b, c.
1. Testm dac a, b, c formeaz laturile unui triunghi:
- sunt mai mari ca 0
- suma aoricare dou dintre ele este mai mare dect a treia
2. n caz contrar se tiprete un mesaj de eroare
n acest caz programu va avea urmtoarea form:
program sp5;
var i,n:integer; x,y,z:integer;
procedure scriere_triunghi(a,b,c:integer);
var p,A:real;
begin
{dac numerele a, b, c pot fi laturile unui triunghi}
if (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a) then
begin
{tiprete aria triunghiului de laturi a, b, c}
p:=(a+b+c)/2;
A:=sqrt(p*(p-a)*(p-b)*(p-c));
Writeln(Aria triunghiului:,A:6:2);
end
else
writeln(Nu este triunghi!);
end;
begin{PP}
write(Numrul de triplete:);readln(n);
{citire numere, testare triunghiuri i scriere arii/mesaje}
for i:=1 to n do
begin
readln(x,y,z); {la fiecare pas citesc cte un triplet}
scriere_triunghi(x,z,y);
end;
readln;end._______________________________________________________________
Autoevaluare
1. Care sunt parametrii unui subprogram? Cum funcioneaz transmiterea parametrilor?
2. Completai afirmaiile cu cuvntul (cuvintele lips):
a. Parametrii definii la scrierea unei proceduri se numesc.., iar cei transmii la apelul unui
subprogram se numesc
b. Valorile

parametrilor

transmii

la

apelul

unui

subprogram

pot

fi..
c. Dup

execuia

unui

subprogram,

se

revine

modulul

appellant

la

linia.

Parametri transmii prin referin


Exemplu:
Se citesc de la tastatur dou perechi de numere (a1,b1) i (a2,b2). S se calculeze media aritmetic a
numerelor fiecrei perechi apoi s se determine cea mai mare dintre mediile obinute.
Soluie: Dac folosim o procedur care calculeaz media aritmetic a dou numere oarecare a i b, ar fi
necesar s se execute de dou ori, mai mult ar trebui ca cele dou medii s fie memorate n dou variabile diferite,
Ma1 i Ma2, care apoi trebuie comparate pentru a o determina pe cea mai mare dintre ele.

Pentru a evita acest lucru vom folosi pentru declararea mediei un parametru gol care nu are nici o valoare la
apel. El va primi o valoare concret n timpul execuiei procedurii, numindu-se parametru transmis prin
referin, cnd l vom defini va fi precedat de cuvntul cheie var.

Funcionarea programului:
- {1} citim numerele a1 i b1
- {2} facem apelul procedurii
calcul_media(a1,b1,Ma1); Astfel, n timpul
execuiei procedurii vor avea loc nlocuirile:
aa1, bb1, maMa1, deci se va calcula
media aritmetic a numerelor a1 i b1, ce va fi
memorat n Ma1.
- {3} citesc numerele a2 i b2
- {4} facem apelul procedurii
calcul_media(a2,b2,Ma2); Astfel, n timpul
execuiei procedurii vor avea loc nlocuirile:
aa2, bb2, maMa2, deci se va calcula
media aritmetic a numerelor a2 i b2, ce va fi
memorat n Ma2.
! Ma1 i Ma2 sunt variable globale, de
aceea valoarea pe care o primesc prin apelul
procedurii este vzut n tot programul. Astfel se
trece la determinarea celei mai mari medii.

{Varianta V4}
program sub_4;
var ma1,ma2,a1,b1,a2,b2:real;
procedure calcul_media(a,b:real;var ma:real);
begin
ma:=(a+b)/2;
writeln(ma:,ma:8:2);
end;
begin{PP}
write(a1,b1:);readln(a1,b1); {1}
calcul_media(a1,b1,Ma1);
{2}
write(a2,b2:);readln(a2,b2); {3}
calcul_media(a2,b2,Ma2);
{4}
if Ma1>=Ma2 then
writeln(Ma1:,Ma1:6:2)
else
writeln(Ma2:,Ma2:6:2);end.

Limbajul Pascal permite i transmiterea parametrilor prin referin. Dac un parametru


transmis prin referin se modific n interiorul subprogramului, atunci noua valoare a
parametrului este vzut i la nivelul modulului apelant. De asemenea, putem s transmitem
prin referin i un parametru gol, n acest caz, acesta poate primi o valoare n corpul
subprogramului, valoare care va fi cunoscut i de modulul apelant
Probleme rezolvate:
1. Scrie un program care interschimb ntre ele dou numere reale, date ca parametric, folosind metoda
paharelor.
Soluie: Pentru a rezolva problema, prin metoda paharelor, vom folosi o variabil auxiliar care ne va ajuta s
realizm interschimbarea (aux).
Programul va fi:
Program sub6;
Var a,b:integer;
Procedure schimba(var x,y:integer);
Exemplu numeric: Fie a=7 i b=5
{interschimb x i y ntre ele}
- apelez procedura schimba(a,b), deci x a i
Var aux:integer;
y b (parametri formali se nlocuiesc cu cei
Begin
actuali)
aux:=a;
- n procedur se realizeaz:
a:=b;
aux:=a
aux:=7
b:=aux;
a:=b
a:=5
end;
b:=aux
b:=7,
begin{PP}
- se revine n programul principal unde se
{citeste numerele a i b}
write(Numerele:);readln(a,b);
afieaz noile valori pentru a i b
schimba(a,b);{apeleaz procedura}
a:=5
{afieaz noile numere a i b}
b:=7,
writeln(a:,a);
writeln(b:,b);
readln;end.
2. Se consider programul de mai jos:
a. ce se afieaz n urma execuiei sale
b. ce se va afia dac antetul procedurii p ar fi: p(x,y:integer);

var a,b:integer;
procedure
p(var x:integer; var y:integer);
begin
x:=x-b;
y:=y-a;
end;
begin
a:=4; b:=1;
writeln(a,b);{1}
p(a,b); write(a,b);{2}end.

Soluie: a. Variabilele a i b sunt globale. Primul apel {1} afieaz


valorile iniiale: a=4 i b=1. n urma apelului procedurii p(a,b) se
fac nlocuirile: a:=a-b
a:=4-1=3, b:=b-a
b:=1-3=-2
Variabilele a i b sunt transmise prin referin, deci
modificarea lor din procedur se vede i n programul principal,
deci la apelul {2} se afieaz: a:=3 i b:=-2
b. Dac antetul procedurii ar fi p(x,y:integer); b parametrii
s-ar tramsmite prin valoare, deci modificarea din cadrul procedurii
nu ar mai fi vzut dup revenirea din procedur n modulul
principal.
Deci:- {1} se afieaz a=4 i b=1
- apelul p(a,b) efectueaz acelei operaii ca la a.,
obinndu-se n procedur a:=3 i b:=-2,
- {2} se va afia a:=4 i b:=1