Informatiile acestui spatiu sunt gratuite. Observatii si sugestii pot fi trimise pe adresa de contact sau pe forum.

     Functii in C++

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.

Programul principal este reprezentat tot de o functie: functia main().

Utilizarea functiilor in cadrul unui program presupune cunoasterea urmatoarelor concepte:


     Declararea unei functii

Pentru ca o functie sa poata fi utilizata (apelata) in cadrul unui program, este nevoie ca aceasta sa fie declarata.

Prin declararea unei functii se specifica:

  • tipul functiei
  • numele functiei
  • lista de parametri formali

Exemplu:

int suma(int a, int b)
     {
          ...
     }

Explicatii:
  • int - reprezinta tipul functiei suma
  • suma - reprezinta numele functiei
  • int a, int b - reprezinta parametrii (formali) ai functiei
  • { ... } - reprezinta corpul functiei

Tipul functiei poate fi:

  • 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:

int suma(int, int);

Explicatii:
  • int - reprezinta tipul functiei suma
  • suma - reprezinta numele functiei
  • int, int - reprezinta tipul parametrilor (formali) ai functiei

     Apelul unei functii

Prin apelul functiei se specifica:

  • 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int a, b, s;
int suma (int x, int y)
{
   int rez=x+y;
   return (rez);
}
void patrat(int *z)
{
   *z = *z * *z;
}
int main()
{
   cout<<"a=";cin>>a;
   cout<<"b=";cin>>b;
   patrat(&a);
   patrat(&b);
   cout<<"Primul numar la patrat este: "<<a<<endl;
   cout<<"Al doilea numar la patrat este: "<<b<<endl;
   cout<<"Suma patratelor numerelor este: "<<suma(a,b);
}
a=2
b=3
Primul numar la patrat este: 4
Al doilea numar la patrat este: 9
Suma patratelor numerelor este: 13

















   Observatii privind parametrii functiei:

  • Parametrii formali
    • se gasesc la nivelul declaratiei functiilor: int suma (int x, int y);
    • 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
    • parametrii formali pot fi considerati niste copii sau alias-uri ale parametrilor efectivi.

  • Parametrii efectivi
    • se gasesc la nivelul apelului functiei: suma(a,b);
    • sunt preluati din cadrul programului apelant (in cazul nostru chiar functia main - cin>>a; respectiv cin>>b;), valorile acestora transmitandu-se parametrilor formali.

   Explicatii asupra exemplului 1:

  • int suma (int x, int y)
    {
       int rez=x+y;
       return (rez);
    }


    reprezinta declaratia functiei suma, in care:

    • 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);

    • {
         int rez=x+y;
         return (rez);
      }


      reprezinta corpul functiei suma - locul unde se prelucreaza (insumeaza) valorile date (prin variabilele / parametrii formali x, respectiv y si se returneaza rezultatul - rez - catre programul apelant: functia main.

  • void patrat(int *z)
    {
       *z = *z * *z;
    }


    reprezinta declaratia functiei patrat, in care:

    • void patrat(int *z) - declara functia de tip void avand numele patrat, respectiv un parametru formal de tip pointer de tip intreg: *z.

    • {
         *z = *z * *z;
      }


      reprezinta corpul functiei patrat - locul unde se realizeaza ridicarea la patrat a variabilei date prin parametrul formal *z si se returneaza rezultatul progrmului apelant (functiei main).

  • int main() - reprezinta programul principal

  • se citesc valorile variabilelor a si b carora li se atribuie valorile 2, respectiv 3

  • patrat(&a); respectiv patrat(&b); - reprezinta apelul functiei patrat, utilizate pentru a prelucra cele 2 valori ale celor doua variabile: a si b

  • se afiseaza noile valori ale variabilelor in urma apelurilor functiei patrat

  • 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
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
int a, b, s;
int suma (int, int);
void patrat(int *);
int main()
{
   cout<<"a=";cin>>a;
   cout<<"b=";cin>>b;
   patrat(&a);
   patrat(&b);
   cout<<"Primul numar la patrat este: "<<a<<endl;
   cout<<"Al doilea numar la patrat este: "<<b<<endl;
   cout<<"Suma patratelor numerelor este: "<<suma(a,b);
}
int suma (int x, int y)
{
   int rez=x+y;
   return (rez);
}
void patrat(int *z)
{
   *z = *z * *z;
}
a=2
b=3
Primul numar la patrat este: 4
Al doilea numar la patrat este: 9
Suma patratelor numerelor este: 13





















Explicatii:
  • int suma (int, int);
    • reprezinta prototipul functiei suma.
    • nu este obligatoriu ca numele parametrilor formali sa fie prezenti la nivelul prototipului functiei.
    • la nivelul prototipului se specifica tipul finctiei (int), tipul, respectiv numarul parametrilor: 2 (int, int)

  • void patrat(int *);
    • reprezinta prototipul functiei patrat.
    • nu este obligatoriu ca numele parametrilor formali sa fie prezenti la nivelul prototipului functiei.
    • la nivelul prototipului se specifica tipul finctiei (void), tipul, respectiv numarul parametrilor: 1 (int *)
    • remarca: in cazul functiei patrat, parametrul este un pointer la tipul int.

  • int main() - reprezinta programul principal

  • se citesc valorile variabilelor a si b carora li se atribuie valorile 2, respectiv 3

  • patrat(&a); respectiv patrat(&b); - reprezinta apelul functiei patrat, utilizate pentru a prelucra cele 2 valori ale celor doua variabile: a si b

  • se afiseaza noile valori ale variabilelor in urma apelurilor functiei patrat

  • suma(a,b); - reprezinta apelul functiei suma, utilizate pentru calcularea sumei valorilor sticate in variabilele a si b

  • int suma (int x, int y)
    {
       int rez=x+y;
       return (rez);
    }

    reprezinta declaratia functiei suma, in care:

    • 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);

    • {
         int rez=x+y;
         return (rez);
      }


      reprezinta corpul functiei suma - locul unde se prelucreaza (insumeaza) valorile date (prin variabilele / parametrii formali x, respectiv y si se returneaza rezultatul - rez - catre programul apelant: functia main.

  • void patrat(int *z)
    {
       *z = *z * *z;
    }


    reprezinta declaratia functiei patrat, in care:

    • void patrat(int *z) - declara functia de tip void avand numele patrat, respectiv un parametru formal de tip pointer de tip intreg: *z.

    • {
         *z = *z * *z;
      }


      reprezinta corpul functiei patrat - locul unde se realizeaza ridicarea la patrat a variabilei date prin parametrul formal *z si se returneaza rezultatul progrmului apelant (functiei main).


     Variabile globale vs variabile locale

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
int a, b;
int suma (int x, int y)
{
   int rez=x+y;
   //cout<<s;
   return (rez);
}
int main()
{
   int s;
   cout<<s<<endl;
   cout<<a<<endl;
   cout<<b<<endl;
   cout<<"a=";cin>>a;
   cout<<"b=";cin>>b;
   cout<<"Suma numerelor este: "<<suma(a,b)<<endl;
   //cout<<rez;
   cout<<s<<endl;
}
4286094
0
0
a=2
b=3
Suma numerelor este: 5
4286094















Explicatii:
  • Varibilele a si b sunt variabile globale, recunoscute pe parcursul intregului program;
  • Variabila s este o variabila locala functiei main si este recunoscuta doar pe parcursul acesteia. Daca incercam sa-i afisam valoarea in cadrul altei functii (suma), obtinem eroare la compilare.
  • Variabila rez este o variabila locala functiei suma si este recunoscuta doar pe parcursul acesteia. Daca incercam sa-i afisam valoarea in cadrul altei functii (int), obtinem eroare la compilare.