În lucru: lecțiile se refac de la capăt. Lecțiile noi ale clasei: lecțiile noi ale clasei a VIII-a →
Invatare Atomica

Vreau sa fac functii care imi dau raspunsuri!

Progres lectie:
0%
🎯

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!

🎯 INCEARCA

Testeaza inainte sa inveti!

Nu trebuie sa intelegi totul acum. Doar copiaza, ruleaza si observa ce se intampla.

Misiunea ta (5 minute):
1
Copiaza codul de mai jos si lipeste-l pe OneCompiler. Apasa Run.
#include <iostream> using namespace std; int patrat(int n) { return n * n; } int main() { int a = patrat(3); int b = patrat(4); int c = patrat(5); cout << "3 la patrat = " << a << endl; cout << "4 la patrat = " << b << endl; cout << "5 la patrat = " << c << endl; int suma = a + b + c; cout << "Suma patratelor: " << suma << endl; return 0; }
▶ Deschide OneCompiler
2
Observa: functia patrat nu afiseaza nimic ea insasi. Ea doar returneaza un numar. Cine afiseaza? main()! Acolo decidem ce facem cu rezultatul.
3
Adauga si patrat(6) in suma. Modifica linia int suma = a + b + c; ca sa includa si patrat(6). Ce rezultat obtii?
4
Incearca sa scrii direct: cout << patrat(10); Merge si fara variabila? Ce afiseaza?
🌟 BONUS: Creeaza o functie int cub(int n) care returneaza n * n * n. Apeleaz-o cu cub(3) si afiseaza rezultatul.
▶ Blocat la pasul 3? Click aici pentru un indiciu

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;

▶ Blocat la pasul 4? Click aici

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!

▶ Blocat la BONUS? Click aici

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.

1

Ce face return?

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.

📦 Analogie: Reteta si rezultatul

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.

2

Sintaxa: return valoare;

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.

Exemplu simplu
int dublu(int n) { return n * 2; // trimite n*2 inapoi si opreste functia } int main() { int x = dublu(7); // x primeste valoarea 14 cout << x; // Afiseaza: 14 return 0; }
💡 return opreste functia IMEDIAT

Orice cod scris dupa return nu se mai executa. E ca un "exit" din functie.

Atentie: codul dupa return NU se executa
int test() { return 42; cout << "Aceasta linie NU se executa niciodata!"; // cod mort }
3

3 moduri de a folosi rezultatul

3 moduri de a folosi rezultatul

Cand o functie returneaza o valoare, o putem folosi in mai multe feluri:

Modul 1: Salvam in variabila
int rezultat = patrat(5); // rezultat = 25 cout << rezultat; // Afiseaza: 25
Modul 2: Direct in cout
cout << patrat(5); // Afiseaza: 25 (fara variabila!)
Modul 3: In alte expresii / calcule
int suma = patrat(3) + patrat(4); // 9 + 16 = 25 if (patrat(5) > 20) { cout << "Mai mare!"; // 25 > 20, deci se afiseaza }
4

Functii care FAC vs. Functii care PRODUC

Functii care FAC vs. Functii care PRODUC

In C++ exista doua categorii mari de functii:

🔧 void - Face o actiune

Nu returneaza nimic. Doar executa ceva (afiseaza, modifica).

void saluta(string nume) { cout << "Salut, " << nume; } // Folosire: saluta("Ana"); // NU poti face: // int x = saluta("Ana"); EROARE!
📦 int/float/bool - Produce o valoare

Returneaza un rezultat pe care il putem folosi.

int patrat(int n) { return n * n; } // Folosire: int x = patrat(5); cout << patrat(5); int s = patrat(3) + patrat(4);
🍔 Analogie: Chelnerul

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

5

Tipul din declaratie = tipul din return

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)
Exemple corecte
int aduna(int a, int b) { return a + b; // OK: a + b este int } float medie(int a, int b) { return (float)(a + b) / 2; // OK: float } bool esteAdult(int varsta) { return varsta >= 18; // OK: comparatia da true/false }
6

return in if/else - pentru cazuri diferite

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:

Functia maxim - returneza cel mai mare numar
int maxim(int a, int b) { if (a > b) { return a; // daca a > b, returneaza a si STOP } else { return b; // altfel, returneaza b si STOP } } // Folosire: cout << maxim(7, 3); // Afiseaza: 7 cout << maxim(2, 9); // Afiseaza: 9
👁 Pas cu pas: maxim(7, 3)
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 -
Functia absolut - valoarea absoluta
int absolut(int n) { if (n < 0) { return -n; // daca e negativ, il facem pozitiv } return n; // daca e pozitiv, il lasam asa } cout << absolut(-5); // Afiseaza: 5 cout << absolut(3); // Afiseaza: 3
7

bool = true sau false

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!

Exemplu: estePar - verifica daca un numar e par
bool estePar(int n) { return (n % 2 == 0); // true daca restul e 0 } // Folosire in if: if (estePar(4)) { cout << "4 este par"; // Se afiseaza! (4%2==0 este true) } if (estePar(7)) { cout << "7 este par"; // NU se afiseaza (7%2==0 este false) }
Mai multe exemple de functii bool
bool estePozitiv(int n) { return n > 0; } bool esteVocala(char c) { return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'); } bool esteMajor(int varsta) { return varsta >= 18; }
8

Calculator de note cu functii

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.

Program complet - ruleaza-l!
#include <iostream> using namespace std; // Functie care returneaza media a doua note float medie(int a, int b) { return (float)(a + b) / 2; } // Functie care verifica daca nota e de trecere bool trece(float nota) { return nota >= 5; } // Functie care returneaza maximul dintre doua numere int maxim(int a, int b) { if (a > b) return a; return b; } int main() { int nota1 = 8, nota2 = 6; float m = medie(nota1, nota2); cout << "Media: " << m << endl; if (trece(m)) { cout << "Elevul a trecut!" << endl; } else { cout << "Elevul nu a trecut." << endl; } cout << "Nota maxima: " << maxim(nota1, nota2) << endl; return 0; }
▶ Ruleaza pe OneCompiler

Exercitii practice

Exercitiul 1 (Nivel minim) - Analiza functiilor cu return

Raspunde la urmatoarele intrebari despre return:

  1. Avem functia int triplu(int n) { return n * 3; }. Ce valoare are variabila x dupa executia liniei int x = triplu(4) + triplu(2);? Explica pas cu pas.
  2. Care este diferenta dintre cout << n * 3; si return n * 3; in interiorul unei functii de tip int? Cand folosesti fiecare?
  3. 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
  1. triplu(4) = 12, triplu(2) = 6. Deci x = 12 + 6 = 18.
  2. 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).
  3. 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:

  1. int minim(int a, int b) - returneaza minimul dintre doua numere
  2. bool esteDivizibil(int a, int b) - returneaza true daca a se imparte exact la b
  3. float 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:

  1. 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.
  2. 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.
  3. 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.

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →