Vreau sa fac functii care imi dau raspunsuri!
Obiectivul lectiei
Stii sa faci functii care fac ceva (afiseaza, modifica). Dar cum faci o functie carecalculeazaceva si iti da rezultatul inapoi?
Dupa aceasta lectie vei putea:
- Sa explici ce face return
- Sa explici sintaxa: return valoare;
- Sa aplici 3 moduri de a folosi rezultatul
- Sa aplici functii care fac vs. functii care produc
- Sa aplici tipul din declaratie = tipul din return
Incearca singur!
Testeaza inainte sa inveti!
Nu trebuie sa intelegi totul acum. Doar copiaza, ruleaza si observa ce se intampla.
patrat nu afiseaza nimic ea insasi. Ea doar returneaza un numar. Cine afiseaza? main()! Acolo decidem ce facem cu rezultatul.
patrat(6) in suma. Modifica linia int suma = a + b + c; ca sa includa si patrat(6). Ce rezultat obtii?
cout << patrat(10); Merge si fara variabila? Ce afiseaza?
int cub(int n) care returneaza n * n * n. Apeleaz-o cu cub(3) si afiseaza rezultatul.
Poti folosi patrat(6) direct in expresie, fara sa-l salvezi intr-o variabila:
int suma = a + b + c + patrat(6);
Sau poti crea o variabila noua: int d = patrat(6); si apoi int suma = a + b + c + d;
Da! Poti folosi rezultatul functiei direct in cout:
cout << patrat(10); va afisa 100.
Nu e obligatoriu sa salvezi rezultatul intr-o variabila. Il poti folosi direct!
Scrie functia exact ca patrat, dar cu n * n * n:
int cub(int n) { return n * n * n; }
Apoi in main: cout << cub(3); va afisa 27.
Ce face return?
Instructiunea return face doua lucruri simultan:
1. Trimite o valoare inapoi catre codul care a apelat functia (ca un raspuns).
2. Opreste functia imediat - orice cod de dupa return nu se mai executa.
Imagineza-ti un bucatar (functia) caruia ii dai ingredientele (parametrii: numarul de intrare). El le prelucreaza dupa reteta (calculul din corpul functiei) si iti aduce inapoi rezultatul (return) — de exemplu, un patrat sau o medie. Fara return, ar fi ca si cum bucatarul gateste... si nu aduce niciodata farfuria la masa!
Schema: tu (apelant) → dai ingrediente (parametri) → bucatar (functia) prelucreaza → return aduce rezultatul inapoi → tu folosesti rezultatul.
Sintaxa: return valoare;
Cand o functie ajunge la return, se opreste si trimite valoarea inapoi. Tipul valorii trebuie sa se potriveasca cu tipul de return al functiei.
Orice cod scris dupa return nu se mai executa. E ca un "exit" din functie.
3 moduri de a folosi rezultatul
Cand o functie returneaza o valoare, o putem folosi in mai multe feluri:
Functii care FAC vs. Functii care PRODUC
In C++ exista doua categorii mari de functii:
Nu returneaza nimic. Doar executa ceva (afiseaza, modifica).
Returneaza un rezultat pe care il putem folosi.
void = "Sterge masa!" - chelnerul face actiunea dar nu iti aduce nimic inapoi.
int = "Adu-mi nota de plata!" - chelnerul face ceva si iti aduce un rezultat (nota).
Tipul din declaratie = tipul din return
Daca functia spune ca returneaza int, atunci return trebuie sa trimita un int. La fel pentru float, bool, string, etc.
| Tipul functiei | return trebuie sa fie | Exemplu |
|---|---|---|
| int | un numar intreg | return 42; |
| float | un numar cu zecimale | return 3.14; |
| bool | true sau false | return true; |
| char | un caracter | return 'A'; |
| void | nimic (fara return) | return; (optional) |
return in if/else - pentru cazuri diferite
O functie poate avea mai multe instructiuni return, dar numai una se executa (prima la care ajunge). Acest lucru e util cand ai cazuri diferite:
| Pas | Ce se intampla | Rezultat |
|---|---|---|
| 1 | Se apeleaza maxim(7, 3) - a=7, b=3 | - |
| 2 | Se verifica: a > b? 7 > 3? | DA |
| 3 | Se executa return a; | return 7 |
| 4 | Functia se opreste. else NU se mai executa | - |
bool = true sau false
Functiile de tip bool sunt extrem de utile. Ele raspund la o intrebare cu true (da) sau false (nu). Le poti folosi direct in if!
Calculator de note cu functii
Un program care foloseste mai multe functii cu return: calculeaza media, verifica daca nota e de trecere, si gaseste nota maxima.
Exercitii practice
Exercitiul 1 (Nivel minim) - Analiza functiilor cu return
Raspunde la urmatoarele intrebari despre return:
- Avem functia
int triplu(int n) { return n * 3; }. Ce valoare are variabilaxdupa executia linieiint x = triplu(4) + triplu(2);? Explica pas cu pas. - Care este diferenta dintre
cout << n * 3;sireturn n * 3;in interiorul unei functii de tipint? Cand folosesti fiecare? - De ce e gresit sa scrii
patrat(5);pe o linie separata fara sa salvezi rezultatul? Ce se intampla cu valoarea calculata?
Raspunde numerotat: 1. ... 2. ... 3. ...
Vezi rezolvarea
triplu(4)= 12,triplu(2)= 6. Decix = 12 + 6 = 18.cout << n*3;doar AFISEAZA valoarea pe ecran, in interiorul functiei - nu o trimite inapoi si nu opreste functia.return n*3;trimite valoarea inapoi catre apelant SI opreste functia. Folosesti cout cand vrei doar sa arati ceva acolo; folosesti return cand apelantul are nevoie sa refoloseasca rezultatul (in alt calcul, alt cout, etc).patrat(5);pe o linie separata calculeaza rezultatul dar il ARUNCA - nu e salvat in nicio variabila, nu e afisat, nu e folosit nicaieri. Calculul se face degeaba.
Exercitiul 2 (Nivel standard) - Programeaza cu functii return
Cerinta: Scrie un program C++ care contine 3 functii:
int minim(int a, int b)- returneaza minimul dintre doua numerebool esteDivizibil(int a, int b)- returneaza true dacaase imparte exact labfloat celsius_la_fahrenheit(float c)- conversia e: F = C * 9/5 + 32
In main(), demonstreaza fiecare functie cu cel putin 2 apeluri diferite.
Exemplu output:
Minimul dintre 7 si 3 este: 3
12 se imparte la 4? Da
25 grade C = 77 grade F
Indicii:
- Pentru
minim, foloseste if/else cu doua return-uri - Pentru
esteDivizibil, foloseste operatorul%(restul impartirii):return a % b == 0; - Pentru conversie, atentie la formula:
return c * 9.0 / 5 + 32;(9.0 nu 9, ca sa obtii zecimale)
Vezi rezolvarea
Program complet:
int minim(int a, int b) { if (a < b) return a; return b; } bool esteDivizibil(int a, int b) { return a % b == 0; } float celsius_la_fahrenheit(float c) { return c * 9.0 / 5 + 32; } int main() { cout << "Minimul dintre 7 si 3 este: " << minim(7,3) << endl; cout << "12 se imparte la 4? " << (esteDivizibil(12,4) ? "Da" : "Nu") << endl; cout << "25 grade C = " << celsius_la_fahrenheit(25) << " grade F" << endl; cout << "10 se imparte la 3? " << (esteDivizibil(10,3) ? "Da" : "Nu") << endl; return 0; }
Exercitiul 3 (Nivel performanta) - Explicatie scrisa
Cerinta: Explica in cuvintele tale diferenta dintre o functie void si una care returneaza o valoare. Foloseste o analogie proprie (alta decat cele din lectie).
Indicii:
- Descrie o situatie din viata reala unde "faci ceva" fara a da un rezultat inapoi (void)
- Descrie o situatie unde "faci ceva" SI dai un raspuns (return)
- Explica de ce este important sa folosesti valoarea returnata (sa nu o pierzi)
Cuvinte cheie de folosit: return, void, valoare returnata, apelant, tip de date, bool, true, false
Vezi rezolvarea
Nu-ti dam analogia gata facuta - construieste-o singur, dupa aceasta schita:
- Alege o situatie reala unde cineva FACE ceva fara sa aduca un rezultat inapoi (ex: cineva stinge lumina - actiunea se termina acolo, nimeni nu primeste "ceva" inapoi). Asta e void.
- Alege o situatie unde cineva FACE ceva SI ADUCE un raspuns folositor mai departe (ex: intrebi pe cineva cat e ceasul, el iti spune ora si TU o folosesti). Asta e return.
- Explica de ce, daca ignori raspunsul (nu-l salvezi/afisezi), munca de calcul se pierde degeaba.
Criterii de evaluare: analogie proprie (nu copiata din lectie), explicatie corecta a diferentei void/return, mentionarea a cel putin un tip cu return (int/float/bool) si un exemplu concret pentru fiecare caz.
Ce ai invatat astazi
- Ai invatat ce face return
- Acum stii sintaxa: return valoare;
- Ai descoperit 3 moduri de a folosi rezultatul
- Ai explorat functii care fac vs. functii care produc
- Ai inteles tipul din declaratie = tipul din return
- Ai invatat return in if/else - pentru cazuri diferite
- Acum stii bool = true sau false
- Ai descoperit calculator de note cu functii
Vrei mai mult?
Provocare: Scrie o functie int semn(int n) care returneaza 1 daca n > 0, -1 daca n < 0, si 0 daca n == 0, folosind 3 instructiuni return in if/else if/else. Testeaz-o apeland semn(5), semn(-3) si semn(0) si confirma ca fiecare da valoarea asteptata.
De gandit: In exemplul cu "cod mort" (return 42; urmat de un cout care nu se mai executa), de ce compilatorul NU da nicio eroare pentru acea linie, desi stie sigur ca nu va rula niciodata?
Deschidere: Functiile bool sunt peste tot in programarea reala - orice validare (parola corecta? varsta e valida? fisierul exista?) e o functie care raspunde true/false. Un sistem de login verifica parola printr-o functie care returneaza exact un bool, la fel ca estePar() din aceasta lectie.