Sunteți pe pagina 1din 14

Lecia 1.

Introducere
1. Noiunea de subprogram
Definiie. Un subprogram (funcie) reprezint un ansamblu de instruciuni (de declarare,
executabile) scrise n vederea executrii unei anumite prelucrri, ansamblu identificat
printr-un nume i implementat separat (n exteriorul oricrei alte funcii).
Subprogramele sunt uniti de program care:

au un algoritm propriu
pot fi proiectate independent
pot fi scrise independent
pot fi compilate independent
nu se pot executa independent ci numai n cadrul unui program (apel)

Un program scris n limbajul C/C++ este un ansamblu de funcii, fiecare dintre acestea
efectund o activitate bine definit. Doar una dintre aceste funcii este rdcin sau funcie
principal - adic nu poate lipsi i executarea programului ncepe automat cu ea. Aceasta se
numete main.

2. Avantajele utilizrii subprogramelor


elaborarea algoritmilor prin descompunerea problemei ce trebuie a fi rezolvat n mai
multe probleme mai simple n acest caz vom rezolva probleme mai simple
modularizarea problemei (descompunerea in subprobleme)
reutilizarea codului - subprogramul odat scris poate fi utilizat i n alte programe
reducerea numrului de erori care apar scrierea programului
depistarea i corectarea cu uurin a erorilor
realizarea unor programe uor de urmrit.

3. Clasificarea subprogramelor

4. Structura unui subprogram C++


n limbajul C/C++ se utilizeaz declaraii i definiii de funcii.

Declaraia conine antetul funciei i informeaz compilatorul asupra tipului, numelui funciei i
a listei parametrilor formali (n care se poate indica tipul parametrilor formali i numele
acestora). Declaraiile de funcii se numesc prototipuri, i sunt constituite din antetul funciei.
tip_returnat nume_funcie (lista tipuri parametri formali); //prototip

Definiia conine antetul funciei i corpul acesteia. Nu este admis definirea unei funcii n
corpul altei funcii.
tip_returnat nume_funcie (lista parametrilor formali) //antet
{
instruciune compus; // corpul funciei
}
Tip_returnat

Reprezint tipul rezultatului calculat i returnat de funcie sau tipul void (niciun

rezultat!!) . O funcie returneaz cel mult un rezultat.


rezultatului returnat poate fi orice tip de date cu excepia masivelor
(vectori, matrice, etc...). n cazul acesta se va utiliza tipul struct pentru a crea
un nou tip de date ce include masivele. Noul tip poate fi un tip_returnat.
Dac dorim ca funcia s returneze mai multe rezultate, putem utiliza variabile
globale, tipul struct sau parametri transmii prin referin (adres) care s
memoreze aceste rezultate i s le furnizeze modulului apelant
Dac tipul rezultatului este diferit de void, corpul funciei trebuie s conin cel
puin o instruciune return.
return expresie;
Tipul expresiei calculat i returnat de funcie trebuie s fie de acelai tip cu
tip_returnat sau poate fi un tip convertibil implicit la tipul rezultatului.
Un identificator ce reprezint numele dat funciei de ctre cel ce o definete,
pentru a o putea apela.

Tipul

Nume_funcie
Lista parametrilor
formali

Instruciune
compus

Reprezint o list de declaraii de parametri formali, separai prin virgul:


tip_parametru1 nume_parametru1,..., tip_parametruN nume_parametruN
Aceast list poate s fie i vid.
Poate conine declaraii de variabile (variabile locale) i instruciuni propriu-zise.

Lecia 2.

Sistemul de operare aloc fiecrui program trei zone distincte n memoria intern n care se gsesc
memorate variabilele programului.

segment de date / zona static


segment stiv / zona stiv
zona heap

O variabil se caracterizeaz prin 4 atribute:


1. Clasa de memorare;
Precizeaz locul unde este memorat variabila respectiv. O variabil poate fi memorat
n segmentul de date, n cel de stiv, n heap sau ntr-un registru al microprocesorului.
2. Vizibilitate
Precizeaz liniile textului surs din care variabila respectiv poate fi accesat. Astfel avem:
Vizibilitate la nivel de bloc (instruciune compus);
Vizibilitate la nivel de fiier n cazul n care programul ocup un singur fiier surs;

Vizibilitate la nivel de clas este n legtur cu programarea pe obiecte.

3. Durata de via
Reprezint timpul n care variabila respectiv arealocat spaiul n memoria intern. Astfel avem:
Durata static variabila are alocat spaiu n tot timpul execuiei programului (Global)
Durata local variabila are alocat spaiu n timpul n care se execut instruciunile blocului
respectiv (Local)
Durat dinamic alocarea i dezalocarea spaiului necesar variabilei respective se face de
ctre programator prin operatori sau funcii speciale.
4. Tipul variabilei

Variabile globale:

Se declar n afara corpului oricrei funcii.


Pot fi utilizate de toate funciile care urmeaz n textul surs declaraiei variabilei respective.
La declarare, variabilele globale sunt iniializate implicit cu 0.
Atributele variabilelor globale sunt:
1. Clasa de memorare segmentul de date.
2. Durata de via a variabilelor globale este static. Ele au spaiul de memorie rezervat n tot
timpul execuiei programului.
3. Vizibilitatea n cazul n care declaraiile acestora sunt naintea tuturor funciilor, ele sunt
vizibile la nivelul ntregului program (fiier). Dac anumite funcii se afl plasate naintea
declaraiilor acestor variabile, atunci ele sunt vizibile doar pentru funciile care sunt plasate
dup aceste declaraii.

Variabile locale:

Sunt declarate n corpul funciilor.


Variabilele declarate n corpul funciei main() sunt locale
Atributele variabilelor locale sunt:
1. Clasa de memorare a variabilelor locale este, implicit, segmentul de stiv.
Exist posibilitatea ca acestea s fie alocate void test ()
n registrele microprocesorului, caz n care { int a=1;}
declaraia lor trebuie precedat de cuvntul int main()
{ register int b=4; return 0;}
cheie register:
Variabilele locale nu sunt iniializate implicit cu 0. Dac nu sunt iniializate explicit de
programator, ele rein o valoare oarecare, numit valoare rezidual.
2. Durata de via a variabilelor locale este local. Triesc atta timp ct dureaz executarea
funciei sau blocului n care au fost definite.
3. Vizibilitatea.
Vizibilitatea variabilelor locale este la nivelul #include <iostream>
using namespace std;
blocului n care au fost declarate.

int a;
void F()
{ int a=2;
{int a=1; cout<<a<<endl;}
cout<<a<<endl;}
int main()
{a=3; F();cout<<a; return 0;}

n
cazul
n
care,
ntr-un
anumit
bloc sunt vizibile mai multe variabile, toate cu
acelai nume, dar au domenii de vizibilitate
diferite, se acceseaz variabila cu vizibilitatea
cea mai mic.

#include <iostream>
using namespace std;
int a;
void F()
{ int a=2;
{int a=1; cout<<a<<endl;}
cout<<a<<endl;}
int main()
{ a=3; F(); cout<<a; return 0;}

Var globala
Var.locale
Ecran
a_global (=0) a_F a_F_Bloc
3
2
1
1 (a_F_Bloc)
2 (a_F)
3 (a_global)
Dac se declar o variabil local n ciclul int n=4, s=0;
for (int i=1; i<=n; i++) s+=i;
for ea este vizibil doar n blocul for
cout<<s;

Lecia 3. Apelul subprogramelor.

O funcie poate fi apelat printr-o instruciune de apel, de forma:

nume_funcie (lista_parametrilor_efectivi);
Parametrii efectivi trebuie s corespund cu cei formali ca ordine i tip.

La apelul unei funcii, valorile parametrilor efectivi se atribuie parametrilor formali


corespunztori. n cazul n care tipul unui parametru efectiv difer de tipul parametrului formal
corespunztor, acesta (tipul) va fi convertit spre tipul parametrului formal (dac este posibil,
altfel compilatorul genereaz eroare).
n momentul n care se ntlnete un apel de funcie, controlul execuiei programul este
transferat primei instruciuni din funcie, urmnd a se executa secvenial instruciunile funciei.
Revenirea dintr-o funcie se face n unul din urmtoarele cazuri:
dup execuia ultimei instruciuni din corpul funciei
la ntlnirea unei instruciuni return
La revenirea din funcie, controlul este redat funciei apelante, i execuia continu cu
instruciunea urmtoare instruciunii de apel, din funcia apelant.

O alt posibilitate de a apela o funcie este aceea n care apelul funciei constituie operandul
unei expresii (apelul functiei intervine intr-o expresie). Acest lucru este posibil doar n cazul n
care funcia returneaz o valoare, folosit n calculul expresiei (doar pentru functiile cu tip).

Pentru memorarea parametrilor, subprogramele folosesc segmentul de stiv.


Memorarea parametrilor transmii se face n ordinea n care acetia figureaz n antet: de
la stnga la dreapta.
n cadrul subprogramului, parametrii transmii i memorai n stiv sunt variabile. Numele
lor este cel din lista parametrilor formali.
Variabilele obinute n urma memorrii parametrilor transmii sunt variabile locale

Transmiterea parametrilor prin valoare


Se utilizeaz atunci cnd suntem interesai ca subprogramul s lucreze cu acea valoare, dar, n
prelucrare, nu ne intereseaz ca parametrul efectiv (cel din blocul apelant) s rein valoarea
modificat n subprogram.
#include <iostream>
using namespace std;
void test(int n)
{ n++; cout<<n<<endl;}

Var.locale
n_main n_test
1
2
2 (n_F)

10

Ecran

int main()
{int n=1;
test(n); cout<<n<<endl;
return 0;}

1 (n_main)

#include<iostream>
using namespace std;
void test(int n)
{cout<<n<<endl;}
int main()
{ test(3); test(3+4*5);
return 0;}

Var.locale
Ecran
apel_main
n_test
test(3);
3
3 (n_test)
test(3+4*5); 23
23 (n_test)

#include <iostream>
using namespace std;

apel

int suma(int a, int b)


{ return a+b;}

suma(2,3)

int main()
{ int c=4, d=3;
cout<<suma(2,3)<<endl;
cout<<suma(2+7,3-1*2)<<endl;
cout<<suma(c,d)<<endl;
cout<<suma(1.9,3.3)<<endl;
return 0;
}

revenire
suma(2+7,31*2)
revenire
suma(4,3)

Variabila
c_main
d_main
a_suma
b_suma
a_suma

valoare ecran
4
3
2
3
5
9

b_suma

1
10

a_suma
b_suma

4
3

revenire
suma(1.9,3.3) a_suma
b_suma
revenire

1
3

PRECIZRI.
Se pot transmite prin valoare prin intermediul parametrilor efectivi:

valori reinute de variabile


valori constante
expresii (acestea pot conine i apeluri de funcii) caz n care mai nti se evalueaz
expresia i apoi se transmite valoarea rezultat
Transmiterea prin valoare a #include <iostream>
tablourilor (MASIVELOR) permite ca using namespace std;
int n;
funciile s ntoarc noile valori ale
acestora (care au fost atribuite n void citeste (int x[10])
funcii). Numele masivelor sunt de
{
cin>>n;
fapt pointeri ctre componentele lor.
for (int i=1; i<=n;i++)
cin>>x[i];
}
La transmiterea numelui unui tablou
ca parametru efectiv, se transmite
de fapt adresa de nceput a tabloului int main()
{ int a[10];
citeste(a);
for(int i=1; i<=n;i++)
return 0;
}

11

cout<<a[i]<<" ";

Transmiterea parametrilor prin referin

Se utilizeaz atunci cnd ne intereseaz ca la revenirea din subprogram variabila


transmis s rein valoarea stabilit n timpul execuiei programului i nu valoarea de la
apel.
Subprogramul reine n stiv adresele acestor variabilei.

//Citirea si afisarea unui vector


#include <iostream>
using namespace std;
void citeste (int x[], int &n)
{
cin>>n;
for (int i=1; i<=n;i++)
}
int main()
{ int a[10],n;
citeste(a,n);
for(int i=1; i<=n;i++)
return 0;
}

cin>>x[i];

cout<<a[i]<<" ";

12

13

S se scrie o funcie care calculeaz cel mai mare divizor


comun pentru dou numere naturale nenule (utiliznd algoritmul lui Euclid).

14