Documente Academic
Documente Profesional
Documente Cultură
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
Dup ncheierea execuiei {apel 1} se revine n programul principal la linia imediat urmtoare
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:
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.
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.
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.