Subprograme (Funcții) în C++ - Ghid Complet
Învață să creezi și să folosești funcții în C++: declarare, parametri, transmitere prin valoare și referință. Tutorial complet pentru BAC și admitere.
Subprograme (Funcții) în C++ - Ghid Complet
Definiție
Un subprogram (sau funcție) este o secvență de instrucțiuni cu un nume, care poate fi apelată de mai multe ori din programul principal sau din alte subprograme.
Avantaje:
- •Reutilizare - scriem codul o singură dată, îl folosim de mai multe ori
- •Modularitate - programul este împărțit în părți mai mici, ușor de înțeles
- •Întreținere - modificările se fac într-un singur loc
Teorie
Structura unei funcții
1tip_returnat nume_functie(parametri) { 2 // corpul funcției 3 return valoare; // dacă tip_returnat != void 4}
Tipuri de funcții
- •Funcții care returnează valoare (tip: int, double, char, etc.)
- •Proceduri (tip: void) - nu returnează nimic
Transmiterea parametrilor
- •Prin valoare - se transmite o copie (modificările NU afectează originalul)
- •Prin referință - se transmite adresa (modificările AFECTEAZĂ originalul)
Exemple C++ Compilabile
Exemplul 1: Funcție simplă - calculul ariei
1#include <iostream> 2using namespace std; 3 4// Declarația funcției 5double ariePatrat(double latura) { 6 return latura * latura; 7} 8 9double arieDreptunghi(double lungime, double latime) { 10 return lungime * latime; 11} 12 13int main() { 14 double l; 15 cout << "Introduceti latura patratului: "; 16 cin >> l; 17 cout << "Aria patratului: " << ariePatrat(l) << endl; 18 19 double lung, lat; 20 cout << "Introduceti lungimea si latimea: "; 21 cin >> lung >> lat; 22 cout << "Aria dreptunghiului: " << arieDreptunghi(lung, lat) << endl; 23 24 return 0; 25}
Exemplul 2: Funcție void (procedură)
1#include <iostream> 2using namespace std; 3 4// Procedură - nu returnează nimic 5void afiseazaSalut(int de_cate_ori) { 6 for (int i = 0; i < de_cate_ori; i++) { 7 cout << "Salut!" << endl; 8 } 9} 10 11int main() { 12 afiseazaSalut(3); 13 return 0; 14}
Exemplul 3: Transmitere prin valoare vs. referință
1#include <iostream> 2using namespace std; 3 4// Transmitere prin VALOARE - x este o copie 5void incrementeazaValoare(int x) { 6 x = x + 1; 7 cout << "In functie: x = " << x << endl; 8} 9 10// Transmitere prin REFERINȚĂ - x este originalul 11void incrementeazaReferinta(int &x) { 12 x = x + 1; 13 cout << "In functie: x = " << x << endl; 14} 15 16int main() { 17 int a = 10; 18 19 cout << "Inainte: a = " << a << endl; 20 incrementeazaValoare(a); 21 cout << "Dupa transmitere prin valoare: a = " << a << endl; 22 // a ramane 10! 23 24 cout << endl; 25 26 cout << "Inainte: a = " << a << endl; 27 incrementeazaReferinta(a); 28 cout << "Dupa transmitere prin referinta: a = " << a << endl; 29 // a devine 11! 30 31 return 0; 32}
Exemplul 4: Funcție pentru verificare primalitate
1#include <iostream> 2using namespace std; 3 4int estePrim(int n) { 5 if (n < 2) return 0; 6 if (n == 2) return 1; 7 if (n % 2 == 0) return 0; 8 9 for (int d = 3; d * d <= n; d = d + 2) { 10 if (n % d == 0) 11 return 0; 12 } 13 return 1; 14} 15 16int main() { 17 int x; 18 cout << "Introduceti un numar: "; 19 cin >> x; 20 21 if (estePrim(x)) 22 cout << x << " este PRIM" << endl; 23 else 24 cout << x << " NU este prim" << endl; 25 26 return 0; 27}
Exemplul 5: Funcție cu vectori (transmitere prin referință implicită)
1#include <iostream> 2using namespace std; 3 4// Vectorii se transmit ÎNTOTDEAUNA prin referință! 5void citireVector(int v[], int &n) { 6 cout << "Numar de elemente: "; 7 cin >> n; 8 for (int i = 0; i < n; i++) { 9 cin >> v[i]; 10 } 11} 12 13void afisareVector(int v[], int n) { 14 for (int i = 0; i < n; i++) { 15 cout << v[i] << " "; 16 } 17 cout << endl; 18} 19 20int sumaVector(int v[], int n) { 21 int s = 0; 22 for (int i = 0; i < n; i++) { 23 s = s + v[i]; 24 } 25 return s; 26} 27 28int main() { 29 int a[100], n; 30 31 citireVector(a, n); 32 cout << "Vectorul: "; 33 afisareVector(a, n); 34 cout << "Suma: " << sumaVector(a, n) << endl; 35 36 return 0; 37}
Exemplul 6: CMMDC și CMMMC
1#include <iostream> 2using namespace std; 3 4int cmmdc(int a, int b) { 5 while (b != 0) { 6 int r = a % b; 7 a = b; 8 b = r; 9 } 10 return a; 11} 12 13int cmmmc(int a, int b) { 14 return (a / cmmdc(a, b)) * b; 15} 16 17int main() { 18 int x, y; 19 cout << "Introduceti doua numere: "; 20 cin >> x >> y; 21 22 cout << "CMMDC(" << x << ", " << y << ") = " << cmmdc(x, y) << endl; 23 cout << "CMMMC(" << x << ", " << y << ") = " << cmmmc(x, y) << endl; 24 25 return 0; 26}
Exemplul 7: Interschimbarea a două valori
1#include <iostream> 2using namespace std; 3 4// OBLIGATORIU prin referință pentru a modifica valorile! 5void interschimba(int &a, int &b) { 6 int temp = a; 7 a = b; 8 b = temp; 9} 10 11int main() { 12 int x = 5, y = 10; 13 14 cout << "Inainte: x = " << x << ", y = " << y << endl; 15 interschimba(x, y); 16 cout << "Dupa: x = " << x << ", y = " << y << endl; 17 18 return 0; 19}
Greșeli Frecvente
1. Uitarea return-ului
1// GREȘIT - funcția trebuie să returneze ceva 2int suma(int a, int b) { 3 int s = a + b; 4 // lipsește return s; 5} 6 7// CORECT 8int suma(int a, int b) { 9 return a + b; 10}
2. Transmitere prin valoare când vrem să modificăm
1// GREȘIT - x nu se modifică în main 2void modifica(int x) { 3 x = 100; 4} 5 6// CORECT - folosim referință 7void modifica(int &x) { 8 x = 100; 9}
3. Confuzia la declararea parametrilor vector
1// GREȘIT - nu punem dimensiunea în declarație 2void functie(int v[100], int n) { } 3 4// CORECT - [] gol sau cu dimensiune maximă 5void functie(int v[], int n) { }
4. Apelarea funcției fără paranteze
1int rezultat = suma; // GREȘIT - returnează adresa funcției 2int rezultat = suma(); // GREȘIT - lipsesc parametrii 3int rezultat = suma(3, 5); // CORECT
Exerciții Tip PBInfo
Exercițiul 1 - Factorial
Scrieți o funcție care calculează factorialul unui număr.
Exercițiul 2 - Număr palindrom
Scrieți o funcție care verifică dacă un număr este palindrom.
Exercițiul 3 - Sortare vector
Scrieți o funcție care sortează un vector crescător.
Exercițiul 4 - Cifra de control
Scrieți o funcție care calculează cifra de control (suma repetată a cifrelor până obținem o singură cifră).
Exercițiul 5 - Numere prietene
Scrieți funcții pentru a verifica dacă două numere sunt prietene (fiecare este egal cu suma divizorilor proprii ai celuilalt).
Tutorialul te-a ajutat?
Dacă ai nevoie de ajutor personalizat, găsește un profesor calificat pentru meditații
