Funcții în C++: definire, apel și return
Învață să definești și să apelezi funcții în C++. Urmărește argumentele, parametrii și rezultatul returnat prin exemple complete și o diagramă clară.
În acest material
O funcție grupează instrucțiunile care rezolvă o sarcină precisă. În loc să copiezi același calcul în mai multe locuri, îi dai un nume și îl apelezi cu datele potrivite. Separarea ajută și când verifici programul: poți explica intrările și rezultatul unei funcții înainte să urmărești restul soluției.
Recapitulează variabilele și structura de decizie. Începem cu o funcție care întoarce maximul a două numere. Ea nu citește de la tastatură și nu afișează: primește două valori și produce o valoare.
Ce conține definiția unei funcții
În int maxim(int a, int b), primul int este tipul rezultatului, maxim este numele funcției, iar a și b sunt parametrii formali. Corpul dintre acolade conține instrucțiunile executate la fiecare apel. Parametrii sunt variabile locale ale acelui apel.
La apelul maxim(x, y), expresiile x și y sunt argumentele. Valorile lor sunt transmise, în ordine, parametrilor a și b. Numele din apel nu trebuie să coincidă cu numele din definiție. Poți apela aceeași funcție cu variabile, constante sau rezultate deja calculate.
Argumente → parametri → calcul → rezultat returnat.
return trimite rezultatul înapoi
Instrucțiunea return a; încheie imediat apelul curent și transmite valoarea lui a către expresia care a apelat funcția. Instrucțiunile de după acel return nu mai sunt executate în apelul respectiv. Un alt apel pornește însă din nou de la începutul funcției, cu propriii parametri.
O funcție care trebuie să întoarcă un rezultat trebuie să ajungă la un return potrivit pe fiecare cale de execuție relevantă. În exemplul nostru, dacă a > b este adevărat, întoarcem a; altfel, ajungem la return b. La egalitate putem întoarce oricare dintre valori, fiindcă sunt egale.
return nu este echivalent cu cout. Prima operație transmite o valoare în program, a doua scrie text în fluxul de ieșire. O funcție care doar afișează maximul nu poate fi folosită direct ca operand într-un calcul care așteaptă acel maxim.
Maximul a trei numere
Programul citește trei întregi x, y, z, fiecare între -1000000000 și 1000000000. Afișează maximul lor. Calculăm întâi maximul primelor două valori și folosim rezultatul într-un al doilea apel. Valorile nu sunt adunate sau înmulțite, deci rezultatul rămâne în intervalul dat.
#include <iostream>
int maxim(int a, int b) {
if (a > b) {
return a;
}
return b;
}
int main() {
int x = 0, y = 0, z = 0;
std::cin >> x >> y >> z;
int primeleDoua = maxim(x, y);
int rezultat = maxim(primeleDoua, z);
std::cout << rezultat << '\n';
return 0;
}
Pentru 7 4 9, primul apel întoarce 7, iar al doilea întoarce 9. Pentru -8 -2 -5, rezultatul este -2. Inițializarea unui maxim cu zero ar fi greșită pe aceste date negative; funcția compară direct valorile primite și nu are nevoie de un prag artificial.
Am scris cele două apeluri pe linii separate pentru a vedea clar ordinea. Putem exprima același calcul prin maxim(maxim(x, y), z): apelul interior trebuie să producă argumentul pentru cel exterior. Această compunere nu înseamnă recursivitate, deoarece funcția maxim nu se apelează pe ea însăși.
Vizibilitate, ordine și cost
Definiția funcției apare înainte de main, astfel încât compilatorul cunoaște numele și tipurile în momentul apelului. Dacă definiția ar fi după main, ai avea nevoie înainte de apel de o declarație precum int maxim(int a, int b);. Punctul și virgula încheie declarația; definiția cu corp nu este înlocuită de ea.
Variabilele locale din main nu devin automat vizibile în funcția maxim. Parametrii sunt calea explicită prin care îi trimitem datele. Evită variabilele globale pentru un calcul care poate fi descris complet prin intrări și rezultat: dependențele sunt mai ușor de urmărit și de verificat.
Fiecare apel face o singură comparație și folosește un număr constant de variabile. Timpul și spațiul suplimentar sunt O(1). Două apeluri consecutive nu modifică această clasificare. Funcțiile nu fac automat algoritmul mai rapid; aici avantajul este organizarea clară și refolosirea aceleiași operații.
Exersează
- Ce întoarce
maxim(5, 5)? - Ce se schimbă dacă inversăm argumentele la apelul acestei funcții?
- De ce
maximpoate fi apelată fără să citească singură datele? - Scrie funcția corespunzătoare pentru minimul a două numere.
Răspunsuri: 5; rezultatul maximului rămâne același; datele vin prin parametri; înlocuiești comparația cu a < b, păstrând cele două returnări. Această simetrie a maximului nu se aplică oricărei funcții: la scădere, ordinea argumentelor contează.
Continuă cu parametri și transmiterea datelor.
Un pas mai departe
Se încarcă progresul…