Sunteți pe pagina 1din 34

Subprograme

Modul de transmitere a
parametrilor

Profesor: Sanda Popescu

Cum se rezolv problemele dintr-o


firm ntr-o lume tehnologic?

Cum poate rezolva directorul


(managerul) toate problemele?

Singur...

...sau poate trasa diferite sarcini


subalternilor.

Acetia le pot rezolva singuri...

... sau pot apela la subalternii


lor...

...pentru a rezolva probleme mai mici

Noiuni teoretice referitoare


la subprograme n C++

Teminologie folosit
Definiie: Un subprogram este o secven de

instruciuni care rezolv o anumit sarcin n


afara funciei main() i lansat n execuie de
cte ori este nevoie
Modul apelant: Modulul/subprogramul care
apeleaz la alte subprograme pentru rezolvarea
unei probleme
Modul apelat: Modulul/subprogramul care este
apelat de un alt modul, pentru a-i rezolva
acestuia o problem

Terminologie folosit
Variabile locale: variabile declarate n corpul unui subprogram; sunt

pstrate temporar pe stiva STACK de memorie, doar att ct se


execut subprogramul, adic sunt vizibile DOAR n interiorul
subprogramului care le-a definit; au o valoare nedefinit, rezidual,
pentru aceasta TREBUIE iniializate;
Variabile globale: sunt definite n afara oricrui subprogram; sunt
vizibile n toate subprogramele definite DUP declararea lor, adic pot
fi folosite i modificate de orice subprogram; ele sunt pstrate
permanent n zona/segmentul de date din memorie; la declarare ele
sunt iniializate cu 0;
Observaie: Dac sunt definite dou variabile, una local i una
global, CU ACELAI NUME, n subprogramul n care s-a definit
variabila global, compilatorul va folosi variabila local.

Elementele unui subprogram


Prototipul subprogramului: linia de program care declar

subprogramul, i care conine urmtoarele informaii: tipul


rezultatului, numele subprogramului i tipul parametrilor
folosii pentru comunicare (nu i numele parametrilor);
prototipul se termin cu caracterul ;(punct-virgul)
Antetul subprogramului: linia de recunoatere/definire a
subprogramului, n care se specific tipul subprogramului,
numele acestuia i lista parametrilor formali, separai prin
caracterul ,(virgul); antetul nu se termin cu caracterul ;
(punct-virgul)
Apelul subprogramului: linia de program care lanseaz n
execuie subprogramul

Identificarea elementelor unui


subprogram

Prototipul

subprogramului
Antetul subprogramului
Apelul subprogramului
Definiia
subprogramului
Modulul apelant
Modulul apelat

# include <iostream.h>
void functie();
void main()
{ functie();
}
void functie()
{ cout<<exemplu de functie;
}

Prototipul i antetul unei functii


O functie poate fi declarat prin prototip:
void citeste(int , float); // se ncheie cu ;
O funcie trebuie s aib un antet prin
care se precizeaz interfaa dintre
program i subprogram:
void citeste (int &n, float &m)

Parametrii de comunicare
Stabilesc legturile dintre modulul apelant i modulul apelat, realizeaz
legtura dintre module; Tipul parametrilor poate fi: ntreg, real,
caracter, pointer, tablou (vectori, matrice, string-uri). Acetia sunt:
Parametrii de intrare: datele ce se dau subprogramului, ce vor fi
prelucrate de subprogram
Parametrii de ieire: rezultatele obinute de subprogram dup ce le
prelucreaz i pe care le comunic modulului apelant, dup ce
subprogramul i termin execuia; reprezint valorile returnate de
ctre subprogram
Parametrii de intrare/ieire: datele ale cror valori pot fi modificate
att de subprogram ct i de modulul apelant; reprezint valorile
returnate de ctre subprogram

Clasificarea parametrilor
dup locul unde apar acetia
Parametrii formali: apar n antet, precedai de

tipul lor, separai prin caracterul ,(virgul)


Parametrii efectivi/actuali: apar la apel, doar
cu numele, separai prin caracterul ,(virgul)
Observaii:
1. Parametrii formali i cei actuali trebuie s
corespund ca numr, tip i poziie
2. Numele parametrilor actuali pot fi diferite de
numele parametrilor formali

Cum circul datele?


Subalternii
primesc
sarcini
(parametri de
intrare) i
ofer
rezultatele
muncii lor
(parametri de
ieire)

Funciile procedurale: ofer unul sau mai multe


rezultate prin intermediul parametrilor, sau nu
ofer nici un rezultat
Ex. void citeste(int &n, float &m)
Funcii operand: ofer un singur rezultat, prin
numele funciei
Ex. int suma(int n)

Parametru transmis
prin valoare

Tipul functiei

Parametri
transmii prin
referin

Funcie operand:
subprogram care returneaz un rezultat chiar prin numele lui, dar

eventual poate returna i alte rezultate prin intermediul parametrilor de


ieire; apelul unei funcii operand se realizeaz n expresii (atribuire,
instruciuni de control (if, while, for) ) sau ca parametrii ai unei alte
funcii (de exemplu: if (prim(invers(x))), sau cout<<prim(x) );
Tipul unei funcii operand poate fi: numeric( intreg sau real), caracter,
pointer, nregistrare(struct), NU poate fi tablou (vectori, matrici, stringuri).
O funcie operand trebuie s conin cel puin o instruciune return,
prin care returnez o valoare modulului apelant.
La prima ntlnire a unei instruciuni return, execuia funciei se
ntrerupe, restul instruciunilor nu se mai execut.

Funcie procedural:
subprogram care furnizeaz modulului apelant

unul, mai multe sau nici un rezultat, rezultatele


sunt furnizate prin intermediul parametrilor;
apelul unei funcii procedurale se realizeaz
printr-o instruciune procedural cu sintaxa:
nume_subprogram(list de parametri
actuali), de exemplu sch(a,b);
Tipul unei funcii procedurale este void (nici un
tip)

Utilizarea stivei (zona STACK


de memorie)
n zona stack se pstreaz temporar informaiile despre modulul apelat;
Etapele executate la apel sunt:
1. se ntrerupe execuia modulului apelant
2. se salveaz pe stack:
i. adresa de revenire a instruciunii imediat urmtoare apelului
ii. valorile parametrilor formali
iii. valorile variabilelor locale
cnd execuia subprogramului s-a ncheiat:
i. se elibereaz zona stack de toate variabilele locale i parametrii
ii. se revine n modulul apelant la adresa de revenire

Modul de transfer al parametrilor


Prin valoare: parametrului i se atribuie o valoare, o expresie

sau coninutul unei variabile; se folosete, de obicei, numai


pentru parametrii de intrare; dac se utilizeaz, totui, acest
mod pentru transmiterea rezultatelor, se pot folosi variabile
de tip pointer (Varianta 2)
Prin referin: subprogramul primete o adres de memorie
la care ste stocat variabila primit ca parametru; se
folosete pentru parametrii de ieire, sau intrare/ieire; n
lista parametrilor formali, sunt precedai de operatorul
adres de memorie (caracterul &);

Transfer prin valoare


Varianta 1 (transfer prin valoare a
parametrilor de intrare)
# include <iostream.h>
int a,b;
void sch (int x, int y)
{ int z;
z=x; x=y; y=z;
}
int main()
{ cin>>a>>b;
//a=10, b=20
sch(a,b);
cout<<a<<` `<<b; //a=10, b=20
return 0;
}

Varianta 2 (transfer prin valoare a


parametrilor de ieire, folosind
ponteri)
# include <iostream.h>
int a,b;
void sch (int *x, int *y)
{ int z;
z=*x; *x=*y; *y=z;
}
int main()
{ cin>>a>>b;
//a=10, b=20
sch(&a,&b);
//atenie la
//parametrii
cout<<a<<` `<<b; //a=20, b=10
return 0;
}

Observaii:
Parametrii efectivi/actuali corespunztori parametrilor formali de
intrare transmii prin valoare POT fi: variabile, constante, expresii,
apel de funcie operand, de exemplu:

cout<<prim(x);
cout<<prim(15);
cout<<prim(x+y);
cout<<prim(invers(x));

unde funcia prim(x) verific dac x este numr prim, iar funcia
invers(x) returneaz inversul parametrului x.

Parametrii formali corespunztori parametrilor


valoare pot fi iniializai n antetul
subprogramului, ca n exemplul de mai jos:

# include <iostream.h>
int a,b;
int test (int a=10, int b=20)
{ return a+b;
}
int main()
{ cout<<test(30,40)<<endl;
cout<<test(30)<<endl;
cout<<test()<<endl;
return 0;
}

//se afiseaza 70
//se afiseaza 50
//se afiseaza 30

Transfer prin referin


Varianta 3 (transfer prin
referin a parametrilor de
ieire)

Parametrii efectivi
corespunztori
parametrilor formali
transmii prin
referin TREBUIE s
fie doar variabile,
adic nu pot fi
constante, expresii,
apeluri ale altor
funcii;

# include <iostream.h>
int a,b;
void sch (int &x, int &y)
{ int z;
z=x; x=y; y=z;
}
int main()
{ cin>>a>>b; //a=10, b=20
sch(a,b);
/* nu se poate apela sch(20, 30),
parametrii actuali TREBUIE s fie variabile */
cout<<a<<` `<<b; //a=20, b=10
return 0;
}

Transmiterea parametrilor prin


valoare
Declararea functiei

Apelul funciei

void sch(int x, int y)


{ int z;
z=x;
x=y;
y=z;
}

void main()
{ cin>>a>>b;
cout<<a<< <<b;
sch(a,b);
cout<<a<< <<b;
}

Observm c nu intevine nicio schimbare a valorilor celor doua variabile a


i b, n urma apelului funciei sch, deoarece parametrii au fost transmii
prin valoare

Reprezentarea pe stiv (STACK)


Execuia funciei

z=3
Zona
STACK

Zona de
date

Dup apel zona STACK se elibereaz i


valorile variabilelor rmn neschimbate

y=5 3

Variabil local z=3


y=5 3

x=3 5

x=3 5

b=5

b=5

a=3

a=3

Zona
STACK

Zona de
date

Transmiterea parametrilor prin


valoare folosind variabile de tip
pointer
Declararea functiei

Apelul functiei

void sch(int *x, int *y)


{ int z;
z=*x;
*x=*y;
*y=z;
}

void main()
{ cin>>a>>b;
cout<<a<< <<b;
sch(&a, &b);
cout<<a<< <<b;
}

Observm c intevine schimbarea valorilor celor dou variabile a i b, n urma


apelului functiei sch, deoarece pe stiv s-a transmis adresa variabilelor .

Reprezentarea pe stiv (STACK)


n urma apelului funciei, zona STACK se elibereaz i valorile variabilelor a i b se
modific

Variabil local

z=3
y reine adresa variabilei b

Zona
STACK

x reine adresa variabilei a

b=5 3
a=3 5

Zona de
date

Transmiterea parametrilor prin


referin
Declararea functiei

Apelul functiei

void sch(int &x, int &y)


{ int z;
z=x;
x=y;
y=z;
}

void main()
{ cin>>a>>b;
cout<<a<< <<b;
sch(a,b);
cout<<a<< <<b;
}

Observm c intevine schimbarea valorilor celor doua variabile a i b, n


urma apelului functiei sch, x i y fiind variabile de tip referin

Reprezentarea pe stiv (STACK)


n urma apelului funciei, zona STACK se elibereaz i valorile variabilelor a i b se
modific

Variabil local

z=3
y= se refer la variabila b

Zona
STACK

x=se refer la variabila a

b=5 3
a=3 5

Zona de
date

Tablourile de memorie ca
parametri de funcii
Dac parametrii de ieire sau intrare/ieire sunt

tablouri sau iruri de caractere, NU trebuie folosit


transferul prin referin, deoarece numele
tablourilor (vectori, matrici, stringuri...) sunt
pointeri (adrese ale primului element al tabloului).
Prin urmare se folosete transfer prin valoare
folosind pointeri, pe stiva stack se transfer
adresa tabloului i orice modificare se face la
acea adres.

Vectori ca parametrii
Dac un parametru formal este un tablou

unidimensional (vector), la declararea acestuia nu


trebuie precizat lungimea fizic a acestuia,
parantezele drepte ce apar dup numele vectorului
arat compilatorului c este vorba despre un vector

de exemplu void F(int n, int v[ ]).

Matrici ca parametri
Dac se transmite ca paramentru un tablou

bidimensional, adic o matrice, la declararea


acestuia n lista parametrilor formali, nu trebuie
precizat numrul de rnduri, n schimb numrul
de coloane este obigatoriu s apar.
de exemplu void G(int n, int a[ ][20]).

Bibliografie
Mariana Miloescu, Manual de informatic pentru clasa a

X-a, Editura Didactic i Pedagogic


Emanuela Cerchez, Marinel erban, Programarea n
limbajul C/C++ pentru liceu, Editura Polirom
Clara Ionescu, Informatic pentru grupele de
performan, Editura Dacia Educaional

S-ar putea să vă placă și