subprograme c/c++ · web viewfunctiile care nu returneaza valori, au tipul void si sunt folosite in...

31
FUNCTII UTILIZATOR IN C++ 1. Definirea subprogramelor Ce sunt subprogramele? Subprogramele reprezintă părţi ale unui program ce se identifică prin nume Subprogramele se pot activa la cere prin intermediul acestor nume În limbajele C, C++ subprogramele se numesc funcţii Când definim un subprogram? Dacă algoritmul cuprinde o secvenţă de operaţii ce se repetă Dacă problema iniţială e complexă, o împărţim în mai multe subprobleme, iar pentru rezolvarea fiecărei subprobleme definim o funcţie Pentru a ascunde detaliile de implementare Funcţii în limbajul C++ Un program C++ este format din una sau mai multe funcţii Orice program C are o funcţie principală, main, de unde se lansează executarea programului Din funcţia main se pot apela alte funcţii care la rândul lor pot să activeze noi funcţii. Funcţiile fie calculează o valoare (ex: sqtr) fie execută anumite operaţii fără a returna o valoare (ex: clrscr()). 2. Clasificarea subprogramelor În C/C++ funcţiile pot fi de două tipuri: funcţii procedurale funcţii operanzi 1

Upload: others

Post on 29-Jan-2021

6 views

Category:

Documents


0 download

TRANSCRIPT

Subprograme C/C++

FUNCTII UTILIZATOR IN C++

1. Definirea subprogramelor

Ce sunt subprogramele?

· Subprogramele reprezintă părţi ale unui program ce se identifică prin nume

· Subprogramele se pot activa la cere prin intermediul acestor nume

· În limbajele C, C++ subprogramele se numesc funcţii

Când definim un subprogram?

· Dacă algoritmul cuprinde o secvenţă de operaţii ce se repetă

· Dacă problema iniţială e complexă, o împărţim în mai multe subprobleme, iar pentru rezolvarea fiecărei subprobleme definim o funcţie

· Pentru a ascunde detaliile de implementare

Funcţii în limbajul C++

· Un program C++ este format din una sau mai multe funcţii

· Orice program C are o funcţie principală, main, de unde se lansează executarea programului

· Din funcţia main se pot apela alte funcţii care la rândul lor pot să activeze noi funcţii.

· Funcţiile fie calculează o valoare (ex: sqtr) fie execută anumite operaţii fără a returna o valoare (ex: clrscr()).

2. Clasificarea subprogramelor

În C/C++ funcţiile pot fi de două tipuri:

· funcţii procedurale

· funcţii operanzi

Funcţii procedurale

Funcţiile procedurale sunt funcţii care pot returna zero, una sau mai multe valori prin intermediul parametrilor.

Exemple:

a) Functia main() returneaza 0, daca programul s-a terminat corect

b) Functie care returneaza o singura valoare prin return valoare

c) Funcţie care returneaza mai multe valori prin intermediul parametrilor

aduna (int a, int b, int&s);

Funcţii operanzi

Funcţiile operanzi sunt funcţii care returnează o valoare asociată numelui funcţiei

Exemple de funcţii operand predefinite în C/C++:

abs(x) – returnează modulul lui x

sqrtl(x) – returnează radicalul valorii x

Apelul unei funcţii

Apelul unei funcţii se poate face în două moduri: printr-o instrucţiune de apel sau ca operand într-o expresie

1) Instrucţiunea de apel are forma:

nume(lista parametrilor efectivi);

Instrucţiunea de apel se foloseşte atunci când funcţia apelată nu returnează nici o valoare, ne interesează doar prelucrările efectuate de funcţie

Exemplu:

void afisare(char cuv[20])

{int i;

for (i=1; i<=strlen(cuv); i++)

cout<<‘*’;

cout<

}

int main()

{char x[]=“exemplu”,a[20];

afisare(“salut”);

afisare(x);

cin>>a;

afisare(a);

return 0;

}

Observaţie: Funcţia afişare a fost apelată printr-o instrucţiune de apel.

2) Operand într-o expresie

Funcţia se apelează în cadrul expresiei astfel:

nume(lista parametrilor efectivi)

Observaţie: Când funcţia se apelează ca operand într-o expresie atunci nu se foloseşte ; după numele funcţiei.

Exemplu:

int maxim(int a, int, b)

{

if(a>b) return a;

return b;

}

int main()

{ int x=20, y=30, z;

z = maxim(x,y);

cout<

int v, w;

cin>>v>>w;

cout<<“valoarea maxima este ”<

}

Observaţie: Funcţia maxim a fost apelată ca operand într-o expresie.

3. Părţile unei funcţii C/C++

O funcţie C/C++ este formată dintr- un antet şi un corp. Forma generală a unei funcţii C/C++ este următoarea:

 tip_rezultat nume_functie ([lista parametrilor formali]) //antet

{

declaratii variabile locale //corp

instructiuni

}

Antetul unei funcţii

· Antetul cuprinde tipul valorii returnate de funcţie, numele funcţiei şi parametrii formali cuprinşi între două paranteze rotunde:

tip_rezultat nume_functie ([lista parametrilor formali])

· Este posibil ca funcţia să nu aibă parametrii, în acest caz apar doar cele două paranteze rotunde

· Tipul returnat de funcţie poate fi orice tip cu excepţia tipului tablou

· Tipul returnat poate fi void

· Parametrii formali pot fi de tip tablou

· Valoarea returnată de funcţie se specifică prin:

return expresie;

Corpul unei funcţii

· Corpul unei funcţii C/C++ este o instrucţiune compusă cuprinsă între acolade:

· Forma generală a corpului unei funcţii este:

{ … }

Exemplu:

int maxim (int a, int b, int c) //antet

{int m=a;

//corp

if (b>m) m=b;

if (c>m) m=c; return m;

}

4. Transferul datelor între mediul apelant şi subprogramul apelat

Pentru comunicarea dintre subprogramul apelat şi mediul apelant se folosesc parametri. Parametri care apar în antet se numesc parametri formali. La activarea subprogramului se stabilesc valori concrete cu care se va executa subprogramul la acel apel. Aceşti parametri se numesc parametri actuali.

Ce legătură trebuie să existe între parametri formali şi cei actuali?

Parametri actuali trebuie să corespundă cu parametri formali ca număr, ordine şi tip. Există două moduri de transfer al parametrilor: prin valoare şi prin referinţă.

Transferul prin valoare

La apelarea unei funcţii, se alocă spaţiu de memorie pe stivă pentru copii ale valorile parametrilor actuali. La încheierea execuţiei funcţiei, zona de memorie alocată pe stivă pentru apel este eliberată.

Exemplu: Ce se afişează?

void schimba(int x, int y)

{

int aux;

aux=x;

x=y;

y=aux;

cout<<“x= “<

}

int main()

{int a=3,b=4;

schimba(a,b);

cout<<“a= “<

}

Rezultat

x=4 y=3

a=3 b=4

Explicaţia rezultatului

· Funcţia lucrează cu copiile parametrilor, copiile au fost interschimbate, la ieşirea din funcţie zona de memorie alocată pe stivă a fost eliberată, copiile s-au pierdut.

· Funcţia nu poate modifica valorile parametrilor actuali deoarece nu cunoaşte adresa la care sunt memoraţi ei.

Transferul prin referinţă

Tipul referinţă

· Este o facilitate suplimentară a limbajului C++

· O variabilă referinţă conţine adresa unei alte variabile, este un alt nume asociat variabilei, un sinonim

· Tip &var_referinta= variabila_referita;

Exemplu:

int x=10;

int &r=x;//r este o referinta pentru x;

cout<

cout<

Pentru o dată transmisă prin referinţă, la apelarea unei funcţii, se alocă spaţiu de memorie pe stivă pentru adresa de memorie a parametrului actual. Subprogramul va lucra direct cu zona de memorie în care se găseşte data. Atât modulul apelant cît şi modulul apelat lucrează asupra aceleaşi date şi orice modificare efectuată de funcţie se va reflecta şi în modulul apelant.

Exemplu: Realizaţi o funcţie care interschimbă valorile parametrilor.

void schimba(int & x, int &y)

{

int aux;

aux=x;

x=y;

y=aux;

cout<<“x= “<

}

int main()

{int a=3,b=4;

schimba(a,b);

cout<<“a= “<

}

Rezultat

x=4 y=3

a=4 b=3

Explicaţia rezultatului

· Funcţia lucrează cu adresele parametrilor, variabilele au fost interschimbate

· Funcţia modifică valorile parametrilor actuali deoarece cunoaşte adresa la care sunt memoraţi ei, toate prelucrările sunt făcute asupra variabilelor originale

5. Transmiterea parametrilor de tip tablou unidimensional

Parametri de tip tablou de transmit automat în C/C++ prin referinţă. Numele unui tablou este un pointer către primul element al tabloului, de aceea un parametru formal de tip tablou unidimensional se poate specifica prin oricare din formele:

tip *, tip [], tip[max]

Exemplul 1: parametru formal de tip vector

void afisare(int a[], int n) {….}

La apelul unei funcţii se specifică doar numele tabloului.

Exemplul 2: parametru actual de tip vector

afisare(x,n);

Exerciţiu: Realizaţi o funcţie care citeşte elementele unui vector, o funcţie care afişează elementele unui vector şi apelaţi aceste funcţii pentru două tablouri.

void citire_tablou( int x[],int &n)

{

int i;

cout<<"Dati numarul de elemente:";

cin>>n;

cout<<"dati elementele tabloului:";

for(i=1;i<=n;i++)

cin>>x[i];

}

void afisare_tablou(int x[], int n)

{

int i;

cout<<"Elementele tabloului sunt:"<

for(i=1;i<=n;i++)

cout<

cout<

}

int main()

{

int a[10],b[20],n,m;

citire_tablou(a,n);

citire_tablou(b,m);

afisare_tablou(a,n);

afisare_tablou(b,m);

}

Exerciţiu: Ce se afişează?

void ghici(int a[],int n)

{

int i;

for(i=1;i

a[i+1]=a[i];

}

int main()

{

int a[10],n;

citire_tablou(a,n);

ghici(a,n);

afisare_tablou(a,n);

}

Explicaţia rezultatului

Funcţia are acces la adresa tabloului, transformările se fac asupra originalului, de aceea după apel valorile din tablou sunt modificate

Variabilele care apar intr-un program sunt de doua feluri:

6. Globale

7. Locale

Variabilele globale sunt declarate in afara tuturor functiilor, este vazuta in toate functiile si sunt memorate in SEGMENTUL DE DATE. Durata de viata este de la lansarea in executie a programului si pana la terminarea programului

Variabila locala este declarata in interiorul unei functii, este vazuta numai in functia in care a fost declarata si este memorata in STIVA. Durata de viata este de la lansarea in executie a functiei in care a fost declarata si pana la terminarea ei .

Daca numele unei variabile locale dintr-o functie f1 coincide cu numele unei variabile globale, atunci in f1 este vazuta numai variabila locala.

I. FUNCTII CARE NU RETURNEAZA VALOARE , FARA PARAMETRII

II. FUNCTII CARE NU RETURNEAZA VALOARE , CU PARAMETRII

III. FUNCTII CARE RETURNEAZA O SINGURA VALOARE , FARA PARAMETRII

IV. FUNCTII CARE RETURNEAZA O SINGURA VALOARE , CU PARAMETRII

V. FUNCTII CARE RETURNEAZA MAI MULTE VALOARI

I. Functiile care nu returneaza valori, au tipul VOID si sunt folosite in general pentru scriere si calcule si lucreaza de cele mai multe ori cu variabile globale.

Exemplu:

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

s=a+b;

}

void produs()

{

p=a*b;

}

void expresie()

{

suma();

produs();

expr=p+s;

}

int main()

{

cin>>a;cin>>b;

expresie();

cout<

return 0;

}

Obs. 1. Toate variabilele sunt globale.

2. Apelarea functiei se face prin nume

3. Cand se termina functia de executat se revine la instructiunea imediat urmatoare

4. Functia apelata trebuie sa fie plasata inaintea functiei apelante

La lansarea in executie a programului de mai sus se procedeaza astfel:

1) Se rezerva zona de memorie pentru variabilele globale a,b,s,p si expr in zona de segment de date

2) Se rezerva zona de memorie pentru program

3) Se rezerva zona de memorie pentru stiva sistem

SEGMENT DE DATE

PROGRAM

STIVA

a

b

s

p

expr

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

1. int s1;

2. s1=a+b;

3. s=s1

}

void produs()

{

1. int p1;

2. p1=a*b;

3. p=p1;

}

void expresie()

{

1. suma();

2. produs(); // adresa 2

3. expr=p+s;// adresa 3

}

int main()

{

1. cin>>a;

2. cin>>b;

3. expresie();

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

(Varf )

4) Incepe executia functiei principale main()

5) Baza stivei este alocata functiei principale pentru memorarea de variabile locale din main() si a anumitor adrese de instructiuni in momentul apelarii altor functii

6)La instructiunea 1presupunem ca pentru a citim valoarea 3

7) La instructiunea 2 presupunem ca pentru b citim valoarea 4

8)La instructiunea 3 se apeleaza functia expresie()

9) In varf se tine minte adresa 1, adresa unde trebuie sa se revina dupa executarea functiei expresie()

SEGMENT DE DATE

PROGRAM

STIVA

a

3

b

4

s

p

expr

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

1. int s1;

2. s1=a+b;

3. s=s1

}

void produs()

{

4. int p1;

5. p1=a*b;

6. p=p1;

}

void expresie()

{

1. suma();

2. produs(); // adresa 2

3. expr=p+s;// adresa 3

}

int main()

{

1. cin>>a;

2. cin>>b;

3. expresie();

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

cout<

10) Varful este incrementat cu o unitate, fiind alocat functiei expresie() pentru memorarea de variabile locale din expresie() si a anumitor adrese de instructiuni in momentul apelarii altor functii

11)Se executa instructiunea 1 din expresie(), care este instructiunea de apelare a functiei suma()

12) Se retine in varf adresa instructiunii din expresie(), unde trebuie sa se revina dupa terminarea functiei suma() [adresa 2]

SEGMENT DE DATE

PROGRAM

STIVA

a

3

b

4

s

p

expr

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

1. int s1;

2. s1=a+b;

3. s=s1

}

void produs()

{

7. int p1;

8. p1=a*b;

9. p=p1;

}

void expresie()

{

1. suma();

2. produs(); // adresa 2

3. expr=p+s;// adresa 3

}

int main()

{

1. cin>>a;

2. cin>>b;

3. expresie();

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

(Varf )

adresa 2

Baza stivei

adresa 1

13) ) Varful este incrementat cu o unitate, fiind alocat functiei suma() pentru memorarea de variabile locale din suma() si a anumitor adrese de instructiuni in momentul apelarii altor functii

14)Se executa instructiunea 1 din suma(), adica se rezerva zona de memorie pentru variabila locala s1

15) Se executa instructiunea 2 din suma(), adica s1 ia valoarea expresiei a+b (7)

16)Se executa instructiunea 3 din suma(), adica variabila globala s ia ca valoare, valoarea variabilei locale s1

SEGMENT DE DATE

PROGRAM

STIVA

a

3

b

4

s

7

p

expr

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

1. int s1;

2. s1=a+b;

3. s=s1

}

void produs()

{

10. int p1;

11. p1=a*b;

12. p=p1;

}

void expresie()

{

1. suma();

2. produs(); // adresa 2

3. expr=p+s;// adresa 3

}

int main()

{

1. cin>>a;

2. cin>>b;

3. expresie();

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

(Varf )

s1

7

Nivel 2

adresa 2

Baza stivei

adresa 1

17) Se termina functia suma()

17.a Se sterge tot din varf

17.b Varful este micsorat cu o unitate

17.c Se revine la adresa 2

SEGMENT DE DATE

PROGRAM

STIVA

a

3

b

4

s

7

p

expr

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

1. int s1;

2. s1=a+b;

3. s=s1

}

void produs()

{

13. int p1;

14. p1=a*b;

15. p=p1;

}

void expresie()

{

1. suma();

2. produs(); // adresa 2

3. expr=p+s;// adresa 3

}

int main()

{

1. cin>>a;

2. cin>>b;

3. expresie();

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

(Varf )

adresa 2

Baza stivei

adresa 1

18) Se executa instructiunea 2 din functia expresie(), care apeleaza functia produs()

19)In varf se salveaza adresa 3, unde trebuie sa se revina dupa executia functiei produs()

20) Varful este incrementat cu o unitate, fiind alocat functiei produs() pentru memorarea de variabile locale din produs() si a anumitor adrese de instructiuni in momentul apelarii altor functii

21) Se executa instructiunea 1 din produs() (se rezerva zona de memorie pentru variabila locala p1)

22) Se executa instructiunea 2 din produs() (p1 ia ca valoare, valoarea expresiei a*b, adica 12)

23) Se executa instructiunea 3 din produs() (p ia ca valoare, valoarea lui p1)

SEGMENT DE DATE

PROGRAM

STIVA

a

3

b

4

s

7

p

12

expr

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

1. int s1;

2. s1=a+b;

3. s=s1

}

void produs()

{

16. int p1;

17. p1=a*b;

18. p=p1;

}

void expresie()

{

1. suma();

2. produs(); // adresa 2

3. expr=p+s;// adresa 3

}

int main()

{

1. cin>>a;

2. cin>>b;

3. expresie();

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

p1

12

Nivel 2

(Varf )

adresa 3

Baza stivei

adresa 1

24)Se termina functia produs()

24.a Se sterge varful stivei

24.b Varful este scazut cu o unitate

24.c Se revine la adresa 3

SEGMENT DE DATE

PROGRAM

STIVA

a

3

b

4

s

7

p

12

expr

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

1. int s1;

2. s1=a+b;

3. s=s1

}

void produs()

{

19. int p1;

20. p1=a*b;

21. p=p1;

}

void expresie()

{

1. suma();

2. produs(); // adresa 2

3. expr=p+s;// adresa 3

}

int main()

{

1. cin>>a;

2. cin>>b;

3. expresie();

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

(Varf )

adresa 3

Baza stivei

adresa 1

25) Se executa instructiunea 3 din expresie() (expr ia ca valoare valoare lui p plus valoarea lui s, adica 19)

26)Se termina functia expresie()

26.a Se sterge varful stivei

26.a Se micsoreaza varful cu o unitate

26.c Se revine la instructiunea de la adresa 1

SEGMENT DE DATE

PROGRAM

STIVA

a

3

b

4

s

7

p

12

expr

19

//Sa se afle expr=a*b+(a+b)

#include

using namespace std;

int a,b,expr,p,s;

void suma()

{

1. int s1;

2. s1=a+b;

3. s=s1

}

void produs()

{

22. int p1;

23. p1=a*b;

24. p=p1;

}

void expresie()

{

1. suma();

2. produs(); // adresa 2

3. expr=p+s;// adresa 3

}

int main()

{

1. cin>>a;

2. cin>>b;

3. expresie();

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

(Varf )

adresa 1

27) Se executa instructiunea 4 din functia main(). Se tipareste 19 pe ecran

28)Se executa instructiunea 5 din functia main(). Se termina programul si se sterg toate datele alocate programului

Exemplul 2: Sa se afle suma a doua numere

//Sa se afle suma a doua numere

//Functie care returneaza o valoare intreaga si are doi parametrii

//Parametrii actuali a si b(cunoscuti) corespund ca numar, ordine si tip

//cu parametrii formali (necunoscuti)

// La primirea valorilor de catre parametrii formali, acestia devin variabile locale

//Nu avem variabile globale

#include

using namespace std;

int suma(int c, int d)

{ int s;

s=a+b;

return s;

}

int main()

{ int a,b;

cin>>a;cin>>b;

cout<

return 0;

}

La lansarea in executie a programului de mai sus se procedeaza astfel:

1) Se rezerva zona de memorie pentru program

2) Se rezerva zona de memorie pentru stiva sistem

SEGMENT DE DATE

PROGRAM

STIVA

#include

using namespace std;

int suma(int c, int d)

{1. int s;

2. s=a+b;

3. return s;

}

int main()

{ 1. int a,b;

2. cin>>a;

3. cin>>b;

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

(Varf )

3) Incepe executia functiei principale main()

4) Baza stivei este alocata functiei principale pentru memorarea de variabile locale din main() si a anumitor adrese de instructiuni in momentul apelarii altor functii

5)La instructiunea 1 se rezerva zone de memorie pentru variabilele a si b

6) La instructiunea 2 presupunem ca pentru a citim valoarea 14

7) La instructiunea 3 presupunem ca pentru b citim valoarea 9

7)La instructiunea 4 se apeleaza functia suma(a,b)

8) In varf se tine minte adresa 1, adresa unde trebuie sa se revina dupa executarea functiei suma()

SEGMENT DE DATE

PROGRAM

STIVA

#include

using namespace std;

int suma(int c, int d)

{1. int s;

2. s=a+b;

3. return s;

}

int main()

{ 1. int a,b;

2. cin>>a;

3. cin>>b;

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

(Varf )

adresa 1

a

14

b

9

9)se incrementeaza varful cu o unitatea

10) Noua zona e rezervata functiei suma(a,b)

11) Se rezerva zona dememorie pentru parametrul formal c

12) Se rezerva zona de memorie pentru parametrul formal d

13)c ia valoarea lui a

14)d ia valoarea lui b

15) Se executa instructiunea 1 din suma(). Se rezerva zona de memorie pentru variabila intreaga s

16)Se executa instructiunea 2 din suma().s=a+b

17)Se executa instructiunea 3 din suma(). Se returneaza valoarea lui s functiei suma(a,b)

18) Se termina functia suma()

18.a Se sterg toate informatiile din varf

18.b Varful este micsorat cu o unitate

18.c Se revine la instructiunea cu adresa 1 din functia principala

SEGMENT DE DATE

PROGRAM

STIVA

#include

using namespace std;

int suma(int c, int d)

{1. int s;

2. s=a+b;

3. return s;

}

int main()

{ 1. int a,b;

2. cin>>a;

3. cin>>b;

4. cout<

5. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

(Varf )

adresa 1

a

14

b

9

19) Se tipareste 23 pe ecran

20) Se termina programul

21) Se elibereaza din memorie toate datele alocate programului

TRANSMITEREA PARAMETRILOR PRIN REFERINTA

In acest caz o functie de tip void poate returna functiei apelante mai multe date prin intermediul parametrilor.

Exemplul 3: Sa se interschimbe valorile a doua variabile utilizand o functie

//Sa se interschimbe valorile a doua variabile a si b

//Functia este de tip void si nu contine instructiunea return valoare

//Parametrii actuali a si b(cunoscuti) corespund ca numar, ordine si tip

//cu parametrii formali (necunoscuti)

// La transmiterea prin referinta avem functia void interschimbare(int &x,int &y), iar apelarea se

//face prin interschimbare(a,b). In acest caz semnul & are rolul de a da o alta denumire (alias )

//pentru a. La transmiterea prin valoare se aloca spatiu de memorie pentru x si x ar fi luat valoarea

//lui a

//Nu avem variabile globale

#include

using namespace std;

void interschimbare(int &x, int &y)

{ 1. int aux;

2. aux=x;

3. x=y;

4. y=aux;

}

int main()

{ 1. int a,b;

2. cin>>a;

3. cin>>b;

4. cout<

5. interschimbare(a,b);

6. cout<

7. return 0;

}

La lansarea in executie a programului de mai sus se procedeaza astfel:

1) Se rezerva zona de memorie pentru program

2) Se rezerva zona de memorie pentru stiva sistem

SEGMENT DE DATE

PROGRAM

STIVA

#include

using namespace std;

void interschimbare(int &x, int &y)

{ 1. int aux;

2. aux=x;

3. x=y;

4. y=aux;

}

int main()

{ 1. int a,b;

2. cin>>a;

3. cin>>b;

4. cout<

5. interschimbare(a,b);

6. cout<

7. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

(Varf )

3) Incepe executia functiei principale main()

4) Baza stivei este alocata functiei principale pentru memorarea de variabile locale din main() si a anumitor adrese de instructiuni in momentul apelarii altor functii

5)La instructiunea 1 se rezerva zone de memorie pentru variabilele a si b

6) La instructiunea 2 presupunem ca pentru a citim valoarea 14

7) La instructiunea 3 presupunem ca pentru b citim valoarea 9

8)La instructiunea 4, se afiseaza pe ecran 14 +++ 9

7)La instructiunea 5 se apeleaza functia interschimbare(a,b)

8) In varf se tine minte adresa 1, adresa unde trebuie sa se revina dupa executarea functiei interschimbare()

SEGMENT DE DATE

PROGRAM

STIVA

#include

using namespace std;

void interschimbare(int &x, int &y)

{ 1. int aux;

2. aux=x;

3. x=y;

4. y=aux;

}

int main()

{ 1. int a,b;

2. cin>>a;

3. cin>>b;

4. cout<

5. interschimbare(a,b);

6. cout<

7. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

(Varf )

a

14

b

9

adresa 1

9) varful stivei se incrementeaza cu 1, devenind zona alocata functiei interschimbare(a,b) pentru memorarea de variabile locale din interschimbare() si a anumitor adrese de instructiuni in momentul apelarii altor functii

10)Nu se rezerva zone de memorie pentru variabilele x si y, ci ele reprezinta aliasuri pentru variabilele a si b, x este aliasul lui a si y este aliasul lui b.

11)Se executa instructiunea 1 din interschimbare(), adica se rezerva zona de memorie pentru variabila locala aux

12) Se executa instructiunea 2 din interschimbare(), aux ia valoarea lui x, adica ia valoarea lui a (14)

13) Se executa instructiunea 3 din interschimbare(), x ia valoarea lui y, adica a ia valoarea lui b (9)

14) Se executa instructiunea 4 din interschimbare(), y ia valoarea lui aux, adica b ia valoarea lui aux(14)

15) Se termina functia interschimbare()

15)a. Se elibereaza zona alocata functiei expresie()

15)b. Varful stivei este decrementat cu o unitate

15)c. Se revine la instructiunea de la adresa 1

SEGMENT DE DATE

PROGRAM

STIVA

#include

using namespace std;

void interschimbare(int &x, int &y)

{ 1. int aux;

2. aux=x;

3. x=y;

4. y=aux;

}

int main()

{ 1. int a,b;

2. cin>>a;

3. cin>>b;

4. cout<

5. interschimbare(a,b);

6. cout<

7. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

(Varf )

aux

14

Baza stivei

a

9

b

14

adresa 1

16) Se executa instructiunea 6 din functia principala main(), adica se afiseaza 9 +++ 14 (Valorile variabilelor a si b au fost interschimbate)

17)Se termina programul si se elibereaza zona de memorie alocata lui

SEGMENT DE DATE

PROGRAM

STIVA

#include

using namespace std;

void interschimbare(int &x, int &y)

{ 1. int aux;

2. aux=x;

3. x=y;

4. y=aux;

}

int main()

{ 1. int a,b;

2. cin>>a;

3. cin>>b;

4. cout<

5. interschimbare(a,b);

6. cout<

7. return 0;

}

Nivel 6

Nivel 5

Nivel 4

Nivel 3

Nivel 2

Baza stivei

(Varf )

a

9

b

14

adresa 1

21