Invatare Atomica

Vreau sa fac functii care accepta date diferite de fiecare data!

Progres lectie:
0%
🎯

Obiectivul lectiei

Ai invatat sa creezi functii, dar pana acum ele faceau mereu acelasi lucru. Cum le faci sa fie flexibile?

Dupa aceasta lectie vei putea:

  • Sa explici ce sunt paRAMetrii
  • Sa explici doua nume, doua roluri
  • Sa aplici functii cu mai multi paRAMetri
  • Sa aplici functia primeste o copie
  • Sa aplici functia lucreaza cu originalul - semnul &

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> #include <string> using namespace std; void afiseazaSalut(string nume, int varsta) { cout << "Salut, " << nume << "! Ai " << varsta << " ani." << endl; } int main() { afiseazaSalut("Ana", 14); afiseazaSalut("Ion", 15); afiseazaSalut("Maria", 13); return 0; }
▶ Deschide OneCompiler
2
Adauga inca un apel cu numele tau si varsta ta. Ce observi? Functia se comporta diferit de fiecare data!
3
Acum inverseaza ordinea argumentelor: scrie afiseazaSalut(14, "Ana"); (numarul inainte de text). Ce se intampla? De ce?
4
Incearca sa apelezi functia cu un singur argument: afiseazaSalut("Test"); - fara al doilea parametru. Ce spune compilatorul?
🌟 BONUS: Adauga un al treilea parametru string clasa la functie si modifica mesajul sa afiseze si clasa elevului!
Blocat la pasul 3? Click aici pentru un indiciu

Compilatorul da eroare! Ordinea conteaza: primul argument merge la primul parametru, al doilea la al doilea. Daca pui 14 (un int) unde asteapta string, tipurile nu se potrivesc.

Regula: argumentele trebuie sa fie in aceeasi ordine si de acelasi tip ca parametrii din declaratie.

Blocat la pasul 4? Click aici

Compilatorul spune ceva de genul: "too few arguments" (prea putine argumente).

Functia asteapta 2 valori (nume SI varsta), dar i-ai dat doar una. Trebuie sa dai exact cate argumente are functia parametri!

Blocat la BONUS? Click aici

Modifica declaratia asa: void afiseazaSalut(string nume, int varsta, string clasa)

In corpul functiei adauga: cout << " din clasa " << clasa;

La apel: afiseazaSalut("Ana", 14, "8A");

1

Ce sunt parametrii?

Ce sunt parametrii?

Parametrii sunt variabile speciale declarate in parantezele unei functii. Ele primesc valori din exterior atunci cand functia este apelata, permitandu-i sa lucreze cu date diferite de fiecare data.

Fara parametri, o functie face mereu acelasi lucru. Cu parametri, functia devine flexibila - ca un sablon care se adapteaza la datele pe care le primeste.

🍔 Analogie: Comanda la restaurant

Imaginati-va un chelner (functia). Fara parametri, chelnerul aduce mereu aceeasi mancare. Cu parametri, ii spui: "Vreau pizza si suc de portocale" - el primeste comanda ta (parametrii) si serveste exact ce ai cerut.

Acelasi chelner (aceeasi functie) serveste clienti diferiti cu comenzi diferite (argumente diferite)!

2

Doua nume, doua roluri

Doua nume, doua roluri

Exista doi termeni importanti care se confunda des:

Declaratie - aici avem PARAMETRI FORMALI
// parametru formal parametru formal // | | void salut(string nume, int varsta) { cout << "Salut, " << nume << "! Ai " << varsta << " ani."; }
Apel - aici avem ARGUMENTE (parametri actuali)
// argument argument // | | salut("Ana", 14); // "Ana" -> nume, 14 -> varsta salut("Ion", 15); // "Ion" -> nume, 15 -> varsta
💡 Rezumat simplu

Parametru formal = variabila din declaratia functiei (e ca un "loc gol" care asteapta o valoare).
Argument (parametru actual) = valoarea concreta pe care o trimiti la apel (e valoarea care "umple" locul gol).

In practica, multi programatori folosesc "parametru" si "argument" interschimbabil. Important e sa intelegi mecanismul.

3

Functii cu mai multi parametri

Functii cu mai multi parametri

O functie poate avea oricat de multi parametri, separati prin virgula. Fiecare parametru trebuie sa aiba tipul si numele lui.

Functie cu 2 parametri
int suma(int a, int b) { return a + b; } // Apel: int rez = suma(5, 3); // a=5, b=3 -> rez = 8 int rez2 = suma(10, 20); // a=10, b=20 -> rez2 = 30
Functie cu 3 parametri de tipuri diferite
void afiseazaElev(string nume, int varsta, float medie) { cout << nume << ", " << varsta << " ani, media: " << medie << endl; } // Apel corect: afiseazaElev("Ana", 14, 9.75); // OK! afiseazaElev("Ion", 15, 8.50); // OK!
⚠ Ordinea argumentelor trebuie sa fie aceeasi!
// GRESIT - ordine inversata: afiseazaElev(14, "Ana", 9.75); // EROARE! 14 nu e string! // GRESIT - prea putine argumente: afiseazaElev("Ana", 14); // EROARE! lipseste medie! // GRESIT - prea multe argumente: afiseazaElev("Ana", 14, 9.75, "8A"); // EROARE! 4 argumente la 3 parametri!
4

Functia primeste o COPIE

Functia primeste o COPIE

In mod implicit (fara &), cand trimiti o variabila ca argument, functia primeste o copie a valorii. Orice modificare in functie afecteaza doar copia - variabila originala ramane neschimbata!

Exemplu: modificarea NU se propaga inapoi
void dubleaza(int x) { x = x * 2; // modifica doar COPIA cout << "In functie: x = " << x << endl; } int main() { int nr = 5; dubleaza(nr); // trimite COPIA lui nr (valoarea 5) cout << "In main: nr = " << nr << endl; return 0; }
Output
In functie: x = 10 In main: nr = 5 // nr NU s-a schimbat!
5

Functia lucreaza cu ORIGINALUL - semnul &

Functia lucreaza cu ORIGINALUL - semnul &

Daca adaugi & dupa tipul parametrului, functia primeste variabila originala, nu o copie. Orice modificare in functie se reflecta si in afara ei!

Exemplu: cu & - modificarea SE propaga
void dubleaza(int &x) { // & = referinta! x = x * 2; // modifica ORIGINALUL cout << "In functie: x = " << x << endl; } int main() { int nr = 5; dubleaza(nr); // trimite ORIGINALUL (referinta la nr) cout << "In main: nr = " << nr << endl; return 0; }
Output
In functie: x = 10 In main: nr = 10 // nr S-A SCHIMBAT!
6

De ce swap NECESITA referinta

De ce swap NECESITA referinta

Functia swap trebuie sa interschimbe valorile a doua variabile. Fara &, schimba doar copiile - nu se intampla nimic util!

GRESIT - fara & (nu functioneaza!)
void swap_gresit(int a, int b) { int temp = a; a = b; b = temp; // a si b sunt COPII - originalele nu se schimba! } int main() { int x = 3, y = 7; swap_gresit(x, y); cout << x << " " << y; // afiseaza: 3 7 (neschimbate!) }
CORECT - cu & (functioneaza!)
void swap_corect(int &a, int &b) { int temp = a; a = b; b = temp; // a si b sunt ORIGINALELE - schimbarea persista! } int main() { int x = 3, y = 7; swap_corect(x, y); cout << x << " " << y; // afiseaza: 7 3 (interschimbate!) }
7

Valori implicite - cand nu dai un argument

Valori implicite - cand nu dai un argument

Poti da unui parametru o valoare implicita (default). Daca nu furnizezi acel argument la apel, se foloseste valoarea implicita. Daca furnizezi, se foloseste valoarea ta.

Exemplu cu valoare implicita
void salut(string nume = "elev") { cout << "Buna, " << nume << "!" << endl; } int main() { salut("Ana"); // Buna, Ana! salut("Ion"); // Buna, Ion! salut(); // Buna, elev! (foloseste valoarea implicita) }
Regula: valorile implicite merg de la dreapta la stanga!
// CORECT: parametrii cu default sunt la sfarsit void elev(string nume, int varsta = 14, string clasa = "8A"); // GRESIT: parametru fara default DUPA unul cu default // void elev(string nume = "?", int varsta); // EROARE!
💡 De ce de la dreapta la stanga?

La apel, argumentele se completeaza de la stanga. Daca omiti un argument, compilatorul nu stie pe care l-ai omis decat daca cele optionale sunt toate la sfarsit. Asa, poti omite ultimul, ultimele doua, etc.

Exercitii practice

Exercitiul 1 (Nivel minim) - Analiza parametrilor

Raspunde la urmatoarele intrebari despre parametri:

  1. Care este diferenta dintre un parametru formal si un argument? Da un exemplu cu o functie care calculeaza aria unui dreptunghi.
  2. De ce urmatorul cod NU interschimba valorile?
    void swap(int a, int b) { int t = a; a = b; b = t; }
    int x = 5, y = 10; swap(x, y);
    Cum il repari sa functioneze?
  3. Ce se intampla daca apelezi void f(int a, int b = 5) cu f(10)? Dar cu f(10, 20)? De ce nu poti scrie void f(int a = 5, int b)?

Raspunde numerotat: 1. ... 2. ... 3. ...

Exercitiul 2 (Nivel standard) - Programeaza cu parametri

Cerinta: Scrie un program C++ cu urmatoarele functii:

  1. int maxim(int a, int b) - returneaza maximul dintre doua numere
  2. void citeste(int &x) - citeste un numar de la tastatura si il pune in x (foloseste referinta!)
  3. void afiseazaRezultat(string mesaj, int valoare, string unitate = "") - afiseaza mesajul, valoarea si unitatea (optional)

Exemplu output:

Introdu primul numar: 15
Introdu al doilea numar: 8
Maximul: 15
Diferenta: 7 puncte

Indicii:

  • Pentru citeste, parametrul trebuie sa fie int &x (cu &) ca sa se salveze valoarea citita
  • Pentru maxim, foloseste un if simplu sau operatorul ternar ?:
  • Apeleaza afiseazaRezultat("Maximul", m) fara unitate si afiseazaRezultat("Diferenta", d, "puncte") cu unitate

Exercitiul 3 (Nivel performanta) - Explicatie scrisa

Cerinta: Explica in cuvintele tale diferenta dintre transmiterea prin valoare si transmiterea prin referinta, folosind o analogie din viata reala.

Indicii:

  • Exemplu de analogie pentru valoare: ii dai cuiva o copie a documentului tau - el poate scrie pe copie, dar documentul tau original ramane intact
  • Exemplu de analogie pentru referinta: ii dai cuiva documentul original - orice scrie pe el, se vede si la tine
  • Da un exemplu de situatie in care ai vrea sa folosesti fiecare metoda

Cuvinte cheie de folosit: parametru, argument, valoare, referinta, copie, original, &, modificare

Ce ai invatat astazi

  • Ai invatat ce sunt parametrii
  • Acum stii doua nume, doua roluri
  • Ai descoperit functii cu mai multi parametri
  • Ai explorat functia primeste o copie
  • Ai inteles functia lucreaza cu originalul - semnul &
  • Ai invatat de ce swap necesita referinta
  • Acum stii valori implicite - cand nu dai un argument

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →