Documente Academic
Documente Profesional
Documente Cultură
Functiile sunt instrumete ale limbajului de programare C++ care permit modularizarea programelor.
Atunci cand se observa ca o anumita secventa de instructiuni se poate repeta de mai multe ori in cadrul
unui program, atunci aceasta se inglobeaza in cadrul unei functii, care urmeaza a se apela in cadrul
programului principal ori de cate ori va fi nevoie.
declararea functiei
prototipul functiei
apelul functiei in cadrul programului principal sau in cadrul altei functii
parametrii formali ai functiei
parametrii efectivi ai functiei
variabile locale vs variabile globale
Pentru ca o functie sa poata fi utilizata (apelata) in cadrul unui program, este nevoie ca aceasta sa fie
declarata.
tipul functiei
numele functiei
lista de parametri formali
Exemplu:
Explicatii:
void
unul din tipurile de baza ale variabilelor: char, int, float, etc.
Numele functiei este reprezentat de un sir de caractere alfanumerice prin intermediul careuia functia va
fi recunoscuta pe parcursul progrmului
Lista de parametri formali este constituita dintr-o lista de variabile reprezentand valorile care vor fi
preluate din programul principal si transmise functiei. Parametrii formali sunt niste copii sau alias-uri ale
parametrilor efectivi din apelul functiilor.
Prototipul functiei
In anumite cazuri, este necesar sa lucram cu mai multe functii care se apeleaza reciproc. In aceste cazuri
se se declara prototipul functiilor utilizate, care introduc tipul si numele functiilor, precum si parametrii cu
care acestea opereaza. In felul acesta, atunci can o functie apeleaza pe alta, aceasta va sti care sunt
tipul, numele si parametrii functiei apelate (vezi aici un exemplu de program care foloseste prototipuri de
functii).
Prototipul functiei este amplasat inaintea functiei principale, acesta mai putand fi denumit si declaratia
forward a functiei in sine, aceasta fiind declarata dupa functia main.
Prototipul fiunctiei, spre deosebire de declaratia finctiei, se termina cu (;), iar lista parametrilor formali este
optionala, fiind necesar, in schimb, sa se specifice tipul acestora.
Exemplu:
Explicatii:
numele functiei
lista de parametri efectivi - constituita dintr-o lista de variabile reprezentand valorile din
programul principal care vor fi transmise functiei pentru a fi prelucrate in scopul producerii unui
anumit rezultat.
Exemplul 1: Sa se realizeze suma patratelor a doua numere introduse de la tastatura, utilizandu-se
apelul unor functii.
Parametrii formali
o se gasesc la nivelul declaratiei functiilor: int suma (int x, int y);
o preiau valorile date in apelul functiei: suma(a,b) prin intermediul parametrilor efectivi:
valoarea data parametrului efectiv: a (in cadrul programului principal: cin>>a;) - este
transmisa parametrului formal: x, iar valoarea data parametrului efectiv: b (in cadrul
programului principal: cin>>b;) - este transmisa parametrului formal: y
o parametrii formali pot fi considerati niste copii sau alias-uri ale parametrilor efectivi.
Parametrii efectivi
o se gasesc la nivelul apelului functiei: suma(a,b);
o sunt preluati din cadrul programului apelant (in cazul nostru chiar functia main - cin>>a;
respectiv cin>>b;), valorile acestora transmitandu-se parametrilor formali.
o int suma (int x, int y) - declara functia de tip int avand numele suma, respectiv un
numar de 2 parametri formali de tip int: x si y. Acestia vor prelua valorile variabilelor a si b
transmise in cadrul apelului functiei:
cout<<"Suma patratelor numerelor este: "<<suma(a,b);
o {
int rez=x+y;
return (rez);
}
o {
*z = *z * *z;
}
suma(a,b); - reprezinta apelul functiei suma, utilizate pentru calcularea sumei valorilor sticate in
variabilele a si b
Observatie: In cadrul exemplului de mai sus, apelul functiei patrat este un apel prin referinta, in timp ce
apelul functiei suma este un apel prin valoare.
Exemplul 2: Sa se realizeze suma patratelor a doua numere introduse de la tastatura, urmarindu-se
prototipul, declaratia, respectiv apelul unor functii.
1
2
3
4
5
6
7
8 #include <iostream> a=2
9 using namespace std; b=3
1 int a, b, s; Primul numar la patrat este: 4
0 int suma (int, int); Al doilea numar la patrat este: 9
1 void patrat(int *); Suma patratelor numerelor este: 13
1 int main()
1 {
2 cout<<"a=";cin>>a;
1 cout<<"b=";cin>>b;
3 patrat(&a);
1 patrat(&b);
4 cout<<"Primul numar la patrat este: "<<a<<endl;
1 cout<<"Al doilea numar la patrat este: "<<b<<endl;
5 cout<<"Suma patratelor numerelor este:
1 "<<suma(a,b);
6 }
1 int suma (int x, int y)
7 {
1 int rez=x+y;
8 return (rez);
1 }
9 void patrat(int *z)
2 {
0 *z = *z * *z;
2 }
1
2
2
2
3
2
4
Explicatii:
suma(a,b); - reprezinta apelul functiei suma, utilizate pentru calcularea sumei valorilor sticate in
variabilele a si b
o int suma (int x, int y) - declara functia de tip int avand numele suma, respectiv un
numar de 2 parametri formali de tip int: x si y. Acestia vor prelua valorile variabilelor a si b
transmise in cadrul apelului functiei:
cout<<"Suma patratelor numerelor este: "<<suma(a,b);
o {
int rez=x+y;
return (rez);
}
o {
*z = *z * *z;
}
Asa cum am mai mentionat si in cadrul capitolului Variabile si tipuri de date, pentru a rezolvarea
problemelor avem nevoie de variabile, in functie de locul in care sunt declarate, acestea clasificandu-se
in:
variabile globale
variabile locale
Variabilele globale sunt variabilele declarate in afara functiei main, si sunt "recunoscute" atat in
programul principal cat si in functiile adiacente acestuia. Variabilele globale sunt initailizate in momentul
declararii cu valoarea 0.
Variabilele locale sunt variabilele declarate in interiorul unei functii (inclusiv in nteriorul functiei main) si
sunt "recunoscute" doar la nivelul functiilor in care acestea au fost declarate. In absenta unei initializari
prealabile, valoarea unei variabile locale este una aleatoare, aflata la momentul respctiv la adresa de
memorie corespunzatoare variabilei declarate.
Exemplul 3: Sa se realizeze suma a doua numere introduse de la tastatura, utilizandu-se apelul unei
functii.
Explicatii:
unde:
Exemplu:
Explicatii:
int - tipul functiei: valoarea pe care functia o va returna programului/functiei apelante va fi de tip
int;
suma - numele functiei;
int x, int y - lista de parametri formali ai functiei suma: doua variabile (x, y) de tip int;
int rez - declararea unei variabile locale functiei suma, in care se va stoca direct suma dintre
valorile variabilelor x si y;
return rez - comanda prin care functia suma intoarce programului/functiei apelante valoarea
calculata anterior in variabila rez.
Observatii:
1. tipul functiei poate sa fie void - in acest caz, functia nu va returna nici o valoare
programului/functiei apelante (nu va mai fi nevoie de intructiunea return;
2. lista de parametri formali este optionala, putand exista functii in care acestia sa nu existe
3. cand exista mai multe functii care se apeleaza reciproc, se foloseste prototipul functiilor (vezi
conceptele functiilor prezentate in capitolul anterior;
4. asa cum am mai explicat si aici, parametrii formali ai functiei: int suma(int x, int y) reprezinta
niste copii/aliasuri ale parametrilor efectivi din apelul functiei: suma(a,b)
1
2
3 #include <iostream> a=2
4 using namespace std; b=3
5 int a, b, s; Suma numerelor 2 si 3 este: 5
6 int suma (int x, int y)
7 {
8 int rez=x+y;
9 return rez;
1 }
0 int main()
1 {
1 cout<<"a=";cin>>a;
1 cout<<"b=";cin>>b;
2 cout<<"Suma numerelor "<<a<<" si "<<b<<" este:
1 "<<suma(a,b);
3 }
1
4
Exemplul 2: Sa se calculeze suma a doua numere citite de la tastatura (folosindu-se o functie void).
Exemplul 3: Sa se calculeze suma a doua numere citite de la tastatura (folosindu-se o functie void fara
parametri).
1
2
3
4 #include <iostream> a=2
5 using namespace std; b=3
6 void suma () Suma numerelor 2 si 3 este: 5
7 {
8 int a, b, s;
9 cout<<"a=";cin>>a;
1 cout<<"b=";cin>>b;
0 s=a+b;
1 cout<<"Suma numerelor "<<a<<" si "<<b<<" este:
1 "<<s;
1 }
2 int main()
1 {
3 suma();
1 }
4
1
5
unde:
Exemplu:
Explicatii:
void - tipul functiei este void deoarece functia, in cazul de fata, nu intoarce un alt rezultat
programului/functiei apelante, ca in cazul apelurilor prin valoare;
schimba - numele functiei;
int &x, int &y - lista de parametri formali ai functiei schimba: acesti parametri reprezinta adresele
de memorie a doua variabile (&x, &y) de tip int;
int temp - declararea unei variabile locale functiei schimba, in care se va stoca temporar
valoarea aflata la o adresa de memorie corespunzatoare variabilelor x si y
temp=x; x=y; y=temp; - interschimbarea valorilor aflate la adresele de memorie &x si &y
Observatii:
1. tipul functiei este void - in acest caz, functia nu va returna nici o alta valoare programului/functiei
apelante
2. lista de parametri formali este obligatorie, functia producand rezultate numai prin intermediul
acestora
3. cand exista mai multe functii care se apeleaza reciproc, se foloseste prototipul functiilor (vezi
conceptele functiilor prezentate in capitolul anterior);
4. spre deosebire de cazul apelului prin valoare al functiilor, in cazul apelului prin referinta,
parametrii formali nu mai sunt niste copii ale parametrilor efectivi ai functilor ci chiar adresele de
momorie alea acestora. Astfel, operatiile efectuate in cadrul functiilor se vor efectua direct asupra
acestor variabile, schimbandu-le valoarea.
Exemplul 1: Sa se interschimbe valorile a doua variabile prin intermediul unei functii.
Observatii:
In programul de mai sus, numele parametrilor efectivi este acelasi cu numele parametrilor formali.
Parametrii formali preiau adresele parametrilor efectivi si, de aceea, apar aceleasi nume de
variabile atat in lista de parametri afectivi (in apelul functiei) cat si in lista de parametri formali (in
definitia functiei);
Daca in cadrul programului de mai sus utilizam apelul prin valoare, atunci:
o parametrii formali nu vor mai fi adrese de variabile ci copii ale acestora (cu alt
nume/identificator
o numele variabilelor utilizate in lista de parametrii formali (din definitia functiei) este diferit
de numele utilizate in lista de parametri efectivi (din apelul functiei)
o valorile variabilelor ce se doresc a fi interschimbate (date in programul principal si
transmise prin parametrii efectivi ai apelului functiei) nu se vor schimba
o valorile parametrilor formali se vor schimba in cadrul functiei - fara a afecta valorile
parametrilor afectivi ai functiei.
o Scopul de a interschimba valorile a doua variabile nu va fi atins.
Exemplul 2: Sa se afle patratul unui numar prin intermediul unei functii cu apel prin referinta.
Functii recursive
O functie recursiva este o functie care se autoapeleaza, adica, cel putin una dintre instructiunile
compoenete ale sale reprezinta apelul aceleiasi functii, dar, cu o alta iteratie. Iteratia functiei este
reprezentata de valoarea curenta a parametrului/prametrilor functiei.
Exemplu:
Explicatii:
Corpul functiei suma contine apelul aceleiasi functii pe o iteratie inferioara: suma(x-1). Valoarea
curenta a rezultatului functiei depinde de valoarea anterioara a acestuia.
Corpul functiei contine conditia de iesire din recursivitate: if (x==1). Rezultatul apelului functiei
este conditionat de valoarea iteratiei functiei. Pentru valoarea minima a iteratiei (x==1) se
returneaza o valoare fixa (x), iar pentru restul iteratiilor se returneaza o valoare calculata, plecand
de la valoarea returnata de prima iteratie (x+suma(x-1)).
Functiile recursive sunt functii care se autoapeleaza, in felul acesta creindu-se o structura
repetitiva (atentie, a nu se confunda cu structurile repetitive descrise in capitolele
anterioare: for, while, do..while).
1
2
3
4
5
#include <iostream> n=4
6
using namespace std; 0
7
int n; 1
8
int suma (int x) 3
9
{ 4
1
int ret; 10
0
if (x==0) Suma primelor 4 numere naturale este: 10
1
ret=x;
1
else
1
ret=x+suma(x-1);
2
cout<<ret<<endl;
1
return ret;
3
}
1
int main()
4
{
1
cout<<"n=";cin>>n;
5
int s=suma(n);
1
cout<<"Suma numerelor "<<n<<" numere naturale este:
6
"<<s;
1
}
7
1
8
1
9
Explicatii:
1. Metoda:
1. se pleaca de la solutia matematica - pentru n=4 avem:
suma(4)=4+suma(3)
suma(3)=3+suma(2)
suma(2)=2+suma(1)
suma(1)=1+suma(0)
suma(0)=0
2. recursiv (de la valoarea de baza - suma(0) - catre ultima valoare - suma(4)), vom calcula
suma finala :
suma(0)=0
suma(1)=1+suma(0)=1+0=1
suma(2)=2+suma(1)=2+1=3
suma(3)=3+suma(2)=3+3=6
suma(4)=4+suma(3)=4+6=10
2. In program:
1. se citeste variabila n
2. se apeleaza functia suma(n) si se atribuie variabilei s;
3. functia suma contine:
declararea unei variabile locale ret care va returna valoarea functiei catre
programul/functia apelanta - functia main;
valoarea de baza, de la care se pleaca in construirea solutiei: 0;
formula generala, dupa care se calculeaza valoarea functiei la fiecare iteratie:
x+suma(x-1);
conditia de iesire din recurenta: x==0;
4. mod de lucru:
parametrul formal x preia valoarea parametrului efectiv n: n=4 => x=4
se testeaza valoarea lui x
deoarece valoarea lui x este 4, deci x!=0 se merge pe varianta else a conditiei:
ret=x+suma(x-1); ret va avea deci valoarea: 4+suma(x-1) => autoapel al functiei
suma dar pentru iteratia x=x-1=3
se retesteaza valoarea lui x
deoarece valoarea lui x este 3, deci x!=0 se merge pe varianta else a conditiei:
ret=x+suma(x-1); ret va avea deci valoarea: 4 (din iteratia anterioara) + 3 +
suma(x-1) => autoapel al functiei suma dar pentru iteratia x=x-1=2
se retesteaza valoarea lui x
deoarece valoarea lui x este 2, deci x!=0 se merge pe varianta else a conditiei:
ret=x+suma(x-1); ret va avea deci valoarea: 4 + 3 (din iteratiile anterioare) + 2 +
suma(x-1) => autoapel al functiei suma dar pentru iteratia x=x-1=1
se retesteaza valoarea lui x
deoarece valoarea lui x este 1, deci x!=0 se merge pe varianta else a conditiei:
ret=x+suma(x-1); ret va avea deci valoarea: 4 + 3 + 2 (din iteratiile anterioare) +
1 + suma(x-1) => autoapel al functiei suma dar pentru iteratia x=x-1=0
se retesteaza valoarea lui x
deoarece valoarea lui x este 0, deci x==0 se merge pe varianta adevarata a
conditiei: ret=x=0; aceasta reprezinta valoarea de baza: suma(0)=0, de la care se
pleaca in construirea solutiei
din acest punct se incepe, recursiv, construirea solutiei, conform formulelor de la
punctul 1.2 :
suma(1)=1+suma(0)=1+0=1
suma(2)=2+suma(1)=2+1=3
suma(3)=3+suma(2)=3+3=6
suma(4)=4+suma(3)=4+6=10
Explicatii:
1. Metoda:
1. se pleaca de la solutia matematica - pentru n=4 avem:
nfact(4)=4+nfact(3)
nfact(3)=3+nfact(2)
nfact(2)=2+nfact(1)
nfact(1)=1+nfact(0)
nfact(0)=0
2. recursiv (de la valoarea de baza - nfact(0) - catre ultima valoare - nfact(4)), vom calcula
valoarea finala :
nfact(0)=0
nfact(1)=1+nfact(0)=1+0=1
nfact(2)=2+nfact(1)=2+1=3
nfact(3)=3+nfact(2)=3+3=6
nfact(4)=4+nfact(3)=4+6=10
2. In program:
1. se citeste variabila n
2. se apeleaza functia nfact(n) si se atribuie variabilei s;
3. functia nfact contine:
declararea unei variabile locale ret care va returna valoarea functiei catre
programul/functia apelanta - functia main;
valoarea de baza, de la care se pleaca in construirea solutiei: 1;
formula generala, dupa care se calculeaza valoarea functiei la fiecare iteratie:
x+nfact(x-1);
conditia de iesire din recurenta: x==1;
4. mod de lucru:
parametrul formal x preia valoarea parametrului efectiv n: n=4 => x=4
se testeaza valoarea lui x
deoarece valoarea lui x este 4, deci x!=1 se merge pe varianta else a conditiei:
ret=x*nfact(x-1); ret va avea deci valoarea: 4*nfact(x-1) => autoapel al functiei
nfact dar pentru iteratia x=x-1=3
se retesteaza valoarea lui x
deoarece valoarea lui x este 3, deci x!=1 se merge pe varianta else a conditiei:
ret=x*nfact(x-1); ret va avea deci valoarea: 4 (din iteratia anterioara) * 3 * nfact(x-
1) => autoapel al functiei nfact dar pentru iteratia x=x-1=2
se retesteaza valoarea lui x
deoarece valoarea lui x este 2, deci x!=1 se merge pe varianta else a conditiei:
ret=x*nfact(x-1); ret va avea deci valoarea: 4 * 3 (din iteratiile anterioare) * 2 *
nfact(x-1) => autoapel al functiei nfact dar pentru iteratia x=x-1=1
se retesteaza valoarea lui x
deoarece valoarea lui x este 1, deci x==1 se merge pe varianta adevarata a
conditiei: ret=x=1; aceasta reprezinta valoarea de baza - nfact(1)=1 - de la care
se pleaca in construirea solutiei
din acest punct se incepe, recursiv, construirea solutiei, conform formulelor de la
punctul 1.2 :
nfact(2)=2*nfact(1)=2*1=2
nfact(3)=3*nfact(2)=3*2=6
nfact(4)=4*nfact(3)=4*6=24