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)
Parametri
transmii prin
referin
Tipul functiei
Parametru transmis
prin valoare
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, string-
uri).
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; //se afiseaza 70
cout<<test(30)<<endl; //se afiseaza 50
cout<<test()<<endl; //se afiseaza 30
return 0;
}
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
void sch(int x, int y)
{ int z;
z=x;
x=y;
y=z;
}
Apelul funciei
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)
a=3
b=5
x=3 5
y=5 3
z=3
Execuia funciei Dup apel zona STACK se elibereaz i
valorile variabilelor rmn neschimbate
Zona
STACK
Zona de
date
Zona
STACK
Zona de
date
a=3
b=5
x=3 5
y=5 3
z=3
Variabil local
Transmiterea parametrilor prin
valoare folosind variabile de tip
pointer
Declararea functiei
void sch(int *x, int *y)
{ int z;
z=*x;
*x=*y;
*y=z;
}
Apelul functiei
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
Zona
STACK
a=3 5
b=5 3
x reine adresa variabilei a
y reine adresa variabilei b
z=3
Zona de
date
Variabil local
Transmiterea parametrilor prin
referin
Declararea functiei
void sch(int &x, int &y)
{ int z;
z=x;
x=y;
y=z;
}
Apelul functiei
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
Zona
STACK
a=3 5
b=5 3
x=se refer la variabila a
y= se refer la variabila b
z=3
Zona de
date
Variabil local
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