Curs C++ | Sectiunea 17 – Functii

 

Ce este o functie? Este un fel de cutie (nu neaparat neagra) ce face ceva util pentru noi, precum evaluarea unei valori sau executia unor actiuni. Deducem din exemple ca o functie ar trebui sa aiba un rezultat si un efect.

💡 In alte cuvinte, o functie este o parte de cod separata ce poate fi folosita aproape in orice moment de timp pentru a evalua si executa ceva de interes pentru noi. Identificam o functie dupa numele acesteia.

Numele functiei se supune acelorasi reguli precum si numele variabilelor. Mai mult, nu putem avea o variabila si o functie cu acelasi nume.

Fiecare functie este capabila sa-si modifice comportamentul folosind parametrii. Acestia pot afecta ceea ce este executat in interior. In plus, poate modifica si valoarea parametrilor daca este nevoie.

❗ Cand dorim o functie in particular, trebuie sa o invocam. Invocarea este o instructiune speciala in C++. Trebuie sa specificam numele functiei pe care dorim sa o invocam, parametrii pe care ii primeste (daca exista) si cum sa folosim rezultatul returnat (daca exista).

📝 Nu trebuie sa invocam o functie ce este necunoscuta de compilator. Compilatorul trebuie sa fie constient de natura functiei (numele, parametrii, rezultatul), astfel ca exista moduri in care putem sa-l informam. In general, le putem imparti in doua categorii:

  • functii scrise de cineva (nu noi) ce sunt disponibile, poarta numele de predefinite (predefined) sau functii din librarii (library functions)
  • functii scrise de noi

 

De ce avem nevoie de functii?

Putem spune ca este aproape imposibil sa scriem un program complex fara sa le folosim. Chiar si daca reusim, nu va fi un program viabil din cauza multor motive precum eficienta, refolosirea etc.

Functiile din librarii sunt primele cu care intram in contact la inceput dar rapid observam ca nu este suficient pentru rezolvarea problemelor tot mai complicate. In acest moment, ne decidem sa ne scriem propriile noastre functii.

❗ Nu uitati, este mereu recomandat sa verificam daca functia pe care vrem sa o implementam nu a fost scrisa deja. In acest mod putem fi siguri ca “nu reinventam roata”. Nu este nimic gresit daca ne dorim sa facem ceva mai eficient, dar in majoriatea cazurilor avem nevoie doar de ceva functional.

💡 Prin implemenarea functiilor, putem divide problema (si codul in acelasi timp) in bucati mai mici. Un cod mai mic este mai usor de scris, de testat, de mentinut si de inteles.

🧱 Avand un set de functii bine scrise si testate, ne permit sa construim programul nostru intr-un mod similar cu construirea unei case: folosind blocuri de cod gata facute (ready-made blocks). Aceasta metoda de a divide problema este cunoscuta si sub numele de descompunere (decomposition).

Exista in general doua abordari posibile pentru a folosi descompunerea.

  1. Abordarea top-down ce presupune definirea celor mai generale functii la inceput si apoi le dividem in functii si mai simple si mai specializate.
  2. Abordarea bottom-up ce presupune mai intai crearea unor functii specializate si apoi asamblarea lor in structuri mai complexe.

 

Introducere

Cum am spus anterior, fiecare functie este caracterizata de urmatorele trasaturi:

  • nume
  • parametrii
  • tipul rezultatului

💡 Partea de cod ce specifica toate aceste elemente este cunoscuta ca si declararea functiei (function declaration). Compilatorul trebuie sa o cunoasca pentru a se putea interpreta corect in momentul in care invocam functia. Uneori mai poarta si numele de prototipul functiei (function prototype).

Declararea unei functii nu spune nimic despre ce face acea functie mai exact. Aceasta informatie este furnizata de corpul functiei (function body), fiind o parte separata de cod aflata intre acolade.

💡 Cele doua componente, declararea si corpul functiei, formeaza impreuna definitia functiei (function definition).

 

Prima functie

Sa luam un exemplu practic. Avem nevoie de o functie ce calculeaza suma a doua numere cu virgula. O putem declara astfel:

float sumOfTwo(float x, float y);
  • sumOfTwo este numele ales pentru functie, este suficient de clar pentru a intelege rolul ei; bineinteles, putem alege orice nume dorim, important este sa fie reprezentativ
  • avem nevoie de doi parametrii de tip float; i-am numit x si y
  • rezultatul sumei va fi tot de tip float, astfel ca mentionam tipul inaintea numelui

Putem mai departe sa adaugam si definitia functiei prin adaugarea corpului.

float sumOfTwo(float x, float y) {
float sum;

sum = x + y;
return sum;
}
  • declaram o variabila sum ce va stoca rezultatul functiei; aceasta este folosita numai in interiorul functiei, nu este vizibila si nici accesibila in orice alta parte din cod
  • variabila rezultat va stoca suma celor doi parametrii
  • ultima linie ce contine keyword-ul return are urmatoarele roluri:
    • indica ce valoare este returnata ca rezultat al functiei
    • termina executia functiei

Pentru a ne putea folosi de ea, o vom apela astfel:

#include <iostream>


float sumOfTwo(float x, float y) {
float sum;

sum = x + y;
return sum;
}

int main()
{
float x = 10.5, y = 17.68;

std::cout <<"Suma lui x si y este = " << sumOfTwo(x,y);

return 0;
}

❗ Parametrii definiti in interiorul functiei sunt numiti parametrii formali (formal parameters). Iar cei care sunt transferati functiei noastre, in momentul apelarii, sunt numiti parametrii efectivi (actual parameters).

Dupa cum se poate observa, am creat doua variabile, x si y de tip float care au fost initializate. Ulterior, invocam functia, transferand variabilele noastre ca argumente. Rezulultatul va fi afisat direct pe ecran sub forma unui mesaj.

#include <iostream>

float sumOfTwo(float x, float y);

int main()
{
float x = 10.5, y = 17.68;

std::cout <<"Suma lui x si y este = " << sumOfTwo(x,y);

return 0;
}

float sumOfTwo(float x, float y) {
float sum;

sum = x + y;
return sum;
}

❓ Putem plasa functia sumOfTwo si dupa functia noastra main? Raspunsul este da, dar compilatorul trebuie sa fie atentionat in privinta ei in momentul in care o invocam. Astfel ca vom pune declararea inainte de a fi invocata.

📝 In momentul declararii putem omite numele parametrilor formali.

float sumOfTwo(float, float);

 

Aici se termina si aceasta sectiune dar inca nu am termina cu functiile asa ca urmariti si urmatoarele sectiuni 🙂 . Pentru intrebari suplimentare folositi informatiile de aici.

➡ Sectiunea anterioara:Curs C++ | Sectiunea 16 – Pointeri Aritmetici

➡ Sectiunea urmatoare:Curs C++ | Sectiunea 18 – Functii (Declarare & Definire)

You may also like...