De ce contează?
Gândește-te la un automat de cafea. Apeși un buton (îi dai comanda), introduci niște bani (parametrii), automatul lucrează în interior după rețeta lui și îți întoarce o cafea (rezultatul). Tu nu vezi mecanismul dinăuntru — îți pasă doar ce bagi și ce primești. O funcție în program este exact acest automat: îi dai niște valori, ea face un calcul ascuns și îți întoarce un răspuns.
Ce este
O funcție este o bucată de cod cu nume, scrisă o singură dată, pe care o poți folosi de câte ori vrei. În loc să copiezi aceleași zece linii în trei locuri diferite, le pui într-o funcție și o apelezi prin nume.
Orice funcție are trei părți:
- Antetul — prima linie. Spune cum se numește funcția, ce primește (parametrii) și ce tip de valoare întoarce.
- Corpul — blocul de instrucțiuni dintre acolade
{și}. Aici se face calculul propriu-zis. return— instrucțiunea care întoarce rezultatul înapoi și oprește funcția pe loc.
De ce ai vrea așa ceva? Din trei motive: scrii codul o singură dată, îl citești mai ușor (un nume bun ca maxim spune ce face, fără să citești zece linii) și, dacă găsești o greșeală, o repari într-un singur loc.
Cuvântul-cheie e ascunderea: când scrii maxim(a, b) în programul tău, nu te interesează CUM calculează funcția maximul — te interesează doar că primește două numere și întoarce pe cel mai mare. Asta îți eliberează mintea: gândești la nivelul „de ce", nu la nivelul „cum", de fiecare dată.
Cum arată
Citim antetul unei funcții care întoarce maximul a două numere, bucată cu bucată:
int | maxim | (a_b) |
tip | nume | parametri |
Citește antetul de la stânga la dreapta: int (ce tip de valoare iese din funcție) → maxim (numele cu care o apelezi) → (int a, int b) (ce primește la intrare). Apoi vine corpul, între acolade:
int maxim(int a, int b) { // antet: intoarce int, primeste a si b
if (a > b) // corp: blocul de instructiuni
return a; // intoarce a si opreste functia aici
return b; // altfel intoarce b
}Când programul ajunge la un return, funcția se oprește imediat și trimite valoarea înapoi în locul de unde a fost apelată. Pentru maxim(4, 9): 4 > 9 e fals, deci sare peste primul return și execută return b, adică întoarce 9.
O funcție void este automatul fără pahar la ieșire: face o acțiune, dar nu întoarce nicio valoare. Tipul ei este void (în română: „gol, nimic"). O folosești când vrei doar un efect — de exemplu, să afișezi ceva pe ecran:
void salut(int n) { // void: nu intoarce nimic
for (int i = 0; i < n; i++)
cout << "Salut!\n"; // doar un efect: afiseaza
} // nu are nevoie de returnDiferența esențială: maxim îți dă un număr pe care îl poți folosi mai departe (int m = maxim(4, 9);), pe când salut doar produce un efect (apare text pe ecran) și nu poți scrie int x = salut(3); — nu există nimic de pus în x.
Implementare C++
Programul de mai jos definește două funcții și le apelează din main. Observă: funcțiile se scriu înaintea lui main, dar nu se execută până nu sunt apelate.
#include <iostream>
using namespace std;
// Functie care INTOARCE o valoare: primeste doua numere, da maximul
int maxim(int a, int b) {
if (a > b)
return a;
return b;
}
// Functie VOID: face o actiune (afiseaza), nu intoarce nimic
void afiseazaRezultat(int valoare) {
cout << "Numarul mai mare este " << valoare << "\n";
}
int main() {
int x = 4, y = 9;
int m = maxim(x, y); // apelez maxim, pun rezultatul in m -> m = 9
afiseazaRezultat(m); // apelez void, doar afiseaza
// pot apela functia de cate ori vreau, cu alte valori
cout << maxim(15, 7) << "\n"; // 15
return 0;
}Ce afișează programul:
Numarul mai mare este 9
15Urmărește firul: main calculează maxim(4, 9), primește 9, îl pune în m, apoi cheamă afiseazaRezultat(9). La final mai apelează o dată maxim, cu alte numere — aceeași funcție, refolosită.
Trei capcane clasice, în ordinea în care îți strică programul:
1. Uiți return într-o funcție care nu e void. Dacă antetul spune int maxim(...) dar pe vreun drum prin cod nu ajungi la niciun return, funcția întoarce o valoare „gunoi", imprevizibilă. Orice cale de execuție trebuie să se termine cu un return.
2. Tipul întors nu se potrivește. Dacă antetul spune int dar scrii return 3.7;, valoarea e tăiată la 3 — pierzi informație fără să-ți spună nimeni. Tipul din antet trebuie să fie cel pe care chiar îl întorci.
3. Crezi că funcția rulează singură. A defini o funcție înseamnă doar a o descrie, nu a o porni. Codul din corpul funcției NU se execută până nu scrii undeva apelul ei, ca maxim(4, 9). O funcție definită dar neapelată e ca o rețetă scrisă pe care nu o gătește nimeni.