Vreau sa fac functii care accepta date diferite de fiecare data!
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!
Testeaza inainte sa inveti!
Nu trebuie sa intelegi totul acum. Doar copiaza, ruleaza si observa ce se intampla.
afiseazaSalut(14, "Ana"); (numarul inainte de text). Ce se intampla? De ce?
afiseazaSalut("Test"); - fara al doilea parametru. Ce spune compilatorul?
string clasa la functie si modifica mesajul sa afiseze si clasa elevului!
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.
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!
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");
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.
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)!
Doua nume, doua roluri
Exista doi termeni importanti care se confunda des:
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.
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.
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!
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!
De ce swap NECESITA referinta
Functia swap trebuie sa interschimbe valorile a doua variabile. Fara &, schimba doar copiile - nu se intampla nimic util!
Valori implicite - cand nu dai un argument ★ BONUS / AVANSAT
Acest concept depaseste curricula standard de clasa a VIII-a. Daca stapanesti bine atomii 1-6, continua. Daca nu, este complet normal sa revii dupa ce exersezi mai mult.
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.
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:
- Care este diferenta dintre un parametru formal si un argument? Da un exemplu cu o functie care calculeaza aria unui dreptunghi.
- De ce urmatorul cod NU interschimba valorile?
Cum il repari sa functioneze?
void swap(int a, int b) { int t = a; a = b; b = t; }
int x = 5, y = 10; swap(x, y); - Ce se intampla daca apelezi
void f(int a, int b = 5)cuf(10)? Dar cuf(10, 20)? De ce nu poti scrievoid 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:
int maxim(int a, int b)- returneaza maximul dintre doua numerevoid citeste(int &x)- citeste un numar de la tastatura si il pune in x (foloseste referinta!)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 fieint &x(cu &) ca sa se salveze valoarea citita - Pentru
maxim, foloseste unifsimplu sau operatorul ternar?: - Apeleaza
afiseazaRezultat("Maximul", m)fara unitate siafiseazaRezultat("Diferenta", d, "puncte")cu unitate
Exercitiul 3 (Nivel performanta) - Depaneaza si extinde
Cerinta: Codul de mai jos contine doua erori care fac ca valorile sa nu se schimbe corect. Gaseste erorile, repara-le, apoi extinde programul cu o noua functie.
#include <iostream>
using namespace std;
void triplica(int x) {
x = x * 3;
}
void swap(int a, int b) {
int t = a;
a = b;
b = t;
}
int main() {
int nr = 4;
triplica(nr);
cout << "nr triplicat: " << nr << endl; // asteptat: 12
int x = 10, y = 20;
swap(x, y);
cout << "dupa swap: " << x << " " << y << endl; // asteptat: 20 10
return 0;
}Pasi:
- Copiaza codul pe OneCompiler si ruleaza-l. Ce afiseaza in loc de valorile asteptate?
- Identifica de ce
triplicasiswapnu functioneaza corect. (Indiciu: ce lipseste din parametri?) - Repara ambele functii adaugand
&acolo unde este necesar. - Extindere: Adauga o a treia functie
void reseteaza(int &a, int &b, int val)care pune ambele variabile la valoareavalsi demonstreaz-o inmain().
Criterii de evaluare: ambele erori gasite si explicate, cod corectat care produce output asteptat, functia reseteaza implementata si apelata corect.
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