Documente Academic
Documente Profesional
Documente Cultură
PREZENTARE TEORETICĂ
1. INTRODUCERE
Subprogramele sunt părţi ale unui program, identificabile prin nume, care se pot
activa la cerere prin intermediul acestor nume. Prezenţa subprogramelor implică
funcţionarea în strânsă legătură a două noţiuni: definiţia unui subprogram şi apelul
unui subprogram. Definiţia unui subprogram reprezintă de fapt descrierea unui
proces de calcul cu ajutorul variabilelor virtuale (parametri formali) iar apelul unui
subprogram nu este altceva decât execuţia procesului de calcul pentru cazuri
concrete (cu ajutorul parametrilor reali, (efectivi, actuali) ).
unde:
O funcţie care returnează o valoare poate fi apelată fie printr-o instrucţiune de apel simplă
(cazul funcţiilor care nu returnează valori) şi în plus poate fi apelată ca operand al unei
expresii. În cazul în care funcţia se apelează printr-o instrucţiune de apel simplă, rezultatul
funcţiei se pierde.
● return ;
● return expresie ;
#include<iostream> #include<iostream>
using namespace std; using namespace std;
void f1 (int k)
void f1 () {
{ for (int i=1; i<=k ; i++)
cout << "abc"; cout << "abc"<< " ";
} }
int main () int main ()
{ {
f1(); f1(5);
} }
OBS: În cazul în care tipul returnat de funcţie lipseşte din definiţia funcţiei, acesta este
implicit int şi nu void.
Compilatorul generează
eroare deoarece o
funcție cu tipul returnat
Compilatorul generează Compilatorul generează
void
eroare deoarece lipsește eroare deoarece lipsește
nu se poate apela în
tipul returnat de funcție tipul returnat de funcție
cadrul unei funcții, în
cazul de fata cout
#include #include
using namespace std; using namespace std;
int p( ) void p( )
{ {
return 25; cout << "abcd";
} }
int main () int main ()
{ {
cout << p( ); p();
} }
Funcţia main
În C++ funcţia main determină prima instrucţiune pe care o va executa programul. Aceasta
este unica diferenţă dintre main şi celelalte funcţii. Din acest motiv se poate spune că “orice
se poate face în main se poate face şi în celelalte funcţii”.
Variabile locale
La fel cum se declară variabilele în cadrul funcţiei main, la fel se pot declara variabile si în
cadrul celorlalte funcţii. Aceste variabile se numesc locale şi sunt accesibile doar în funcţia în
care au fost declarate.
In cadrul unei funcţii se pot apela şi alte funcţii, cu condiția ca acestea sa fi fost definite
înaintea eventualului apel sau este prezent un prototip de funcţie înaintea funcţiei apelate
Variabile globale
Variabilele globale sunt declarate în afara oricărei funcţii şi sunt vizibile (pot fi utilizate) în
tot programul (în programul principal şi în subprograme) din momentul declarării lor.
Regula de omonimie
În cazul în care există o variabilă locală care are acelaşi nume cu o variabilă globală,
aceste două variabile se numesc variabile omonime.
Variabilele locale sunt prioritare (ascund) variabilele globale omonime.
Exemplul 5.4
# include
<iostream>
using namespace
std;
int N=10; Variabila N este definită atât ca variabilă globală cât şi ca
void f1() variabilă locală în f1().
{ Se va afisa: 2 10
int N=2; Funcţia f1() acţionează asupra variabilei locale N.
cout << N<<" "; Funcţia main() acţionează supra variabilei globale N.
}
int main ()
{
f1();
cout << N;
}
Variabilelor locale li se rezervă spaţiu într-o zonă specială de memorie numită “stiva”. La
încheierea execuţiei subprogramului, conţinutul stivei este eliberat. Din acest motiv,
variabilele locale sunt vizibile doar în interiorul subprogramului în care au fost declarate.
Exemplu:
#include
void test(int n) {
n++;
cout << n << endl; // tipăreşte n=8
}
void main() {
int n = 7;
test(n);
cout << n << endl; // tipăreşte n=7
}
Parametrul n este transmis prin valoare. În funcţia main() acest parametru este
iniţializat cu valoarea 7. Când apelăm funcţia test(), se rezervă spaţiu pe stivă, spaţiu
care are numele parametrului formal (în acest caz, tot n) şi care este iniţializat cu
valoarea memorată de variabila n a programului principal. Altfel spus, pe stivă se
copie valoarea parametrului efectiv de apel. În funcţie, variabila n (care este locală
acestei funcţii) este incrementată şi devine 8, valoare care va fi tipărită. La ieşirea
din funcţie, variabila n din stivă se pierde, adică nu mai are spaţiu alocat, prin urmare
valoarea 8 este pierdută. În main() se tipăreşte valoarea variabilei n (locală acesteia)
care are valoarea 7.
Se observă că, în momentul apelului funcţiei test(), pe stivă sunt alocate două
variabile cu acelaşi nume n. Prima variabilă este variabila locală funcţiei main() care
se salvează pe stivă în momentul apelului pentru a putea reface contextul funcţiei
main() după încheierea apelului. A doua variabilă este parametrul formal tip valoare
n, vizibil numai în funcţia test() şi iniţializat în momentul apelului cu valoarea 7.
Indiferent ce valori primeşte acest n în corpul funcţiei test(), după încheierea
execuţiei acestei funcţii, spaţiul său este de alocat din stivă, adică variabila
respectivă este distrusă. Din acest motiv, după execuţia funcţiei test(), conţinutul
stivei este cel din dreapta. Se reface contextul din care s-a lansat apelul funcţiei
test(), adică se recuperează din stivă valoarea variabilei locale n=7 şi adresa de
revenire, adică adresa instrucţiunii cout.
b)Expresii. În acest caz, parametrii efectivi sunt expresii, care pot conţine şi funcţii şi
care mai întâi se evaluează. Exemplu:
#include
#include
void test(int n) {
cout << n << endl;
}
void main() {
test(5); // se va tipări 5
test(7 + (int)sqrt(45)); // se va tipări 13
}
Se va afisa:
1 2 (rezultatul inaintea
apelului functiei afis)
2 6 (rezultatul apelului functiei
afis)
Se va afisa: Se va afisa: 2 2 (rezultatul de dupa apelul
2 6 (rezultatul 2 6 (rezultatul functiei afis: variabila a isi
apelului functiei afis) apelului functiei afis) pastreaza
1 2 (rezultatul de 2 6 (rezultatul de valoarea dupa apel fiind
dupa apelul functiei dupa apelul functiei parametru transmis prin
afis) afis) referinta pe cand
variabila b revine la valoarea
pe care o avea inainte de apel
fiind
parametru transmis prin
valoare)
Exemplul 7.1
1. include