Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.
Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.
Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.
Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.
Meniu shortcuturi | ? |
Căutare probleme sau utilizatori | / |
Navigare printre rezultatele căutării | ↑, ↓ |
Meniu de contact și feedback | CTRL + Shift + F |
Ieșire din meniuri | Esc |
Setări editor | CTRL + Shift + S |
Schimbare stil editor | CTRL + Shift + E |
Șabloane de cod | CTRL + Shift + 1/2/3 |
Golire editor | CTRL + Shift + 4 |
Funcțiile sunt instrumente ale limbajului C++ (dar nu numai) care permit împărțirea unui cod în mai multe secvențe unitare. Funcțiile pot avea două roluri importante:
Să luăm următorul program, care citește un număr natural și care calculează numărul de divizori al oglinditului său.
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int ogl = 0;
while(n != 0) {
int cif = n % 10;
ogl = ogl * 10; ogl += cif;
n /= 10;
}
int nrdiv = 0;
for(int i = 1; i * i <= ogl; i++) {
if(ogl % i == 0) {
nrdiv++;
if(i != ogl / i) {
nrdiv++;
}
}
}
cout << nrdiv;
return 0;
}
Programul funcționează corect, însă codul poate fi cam greu de înțeles. Trebuie să analizăm cu atenție codul pentru a înțelege exact de unde până unde se calculează oglinditul și de unde până unde se calculează numărul de divizori. Aceste două calcule s-ar putea îngloba în două funcții separate, transformând codul într-unul mai logic:
#include <iostream>
using namespace std;
int ogl(int n) {
int rasp = 0;
while(n != 0) {
int cif = n % 10;
rasp = rasp * 10; rasp += cif;
n /= 10;
}
return rasp;
}
int nrdiv(int n) {
int nr = 0;
for(int i = 1; i * i <= n; i++) {
if(n % i == 0) {
nr++;
if(i != n / i) {
nr++;
}
}
}
return nr;
}
int main()
{
int n;
cin >> n;
int oglindit = ogl(n);
cout << nrdiv(oglindit);
return 0;
}
În acest caz, în main
, codul este mult mai intuitiv: calculăm oglinditul într-o variabilă oglinidit
, și afișăm pe ecran numărul său de divizori.
O funcție este alcătuită din mai multe părți.
Toate funcțiile au un antet, care arată cam așa:
tip numeFunctie(tip param1, tip param2, …)
Și care ne oferă următoarele informații:
int
, bool
, char
, …, sau chiar void
);Spre exemplu, următorul antet ar fi unul reprezentativ pentru calcularea sumei a două numere:
int suma(int a, int b)
Mai exact, funcția se numește suma
, are doi parametri numere întregi (a
și b
— iar pentru fiecare în parte trebuie să specificăm tipul lor, deoarece acestea nu trebuie să fie ambele de același tip). De asemenea, funcția ar trebui să ne furnizeze suma numerelor, reprezentată tot printr-un int
.
Corpul funcției reprezintă un set de instrucțiuni, delimitate de acolade ({}
), care precizează pașii care trebuie executați.
Orice variabilă declarată în funcție — inclusiv variabilele din parametri — sunt variabile locale și temporare, adică chiar dacă le vom modifica valorile între timp, acestea nu vor afecta valorile inițiale ale variabilelor din main
.
Rezultatul funcției pe care noi vrem să îl furnizăm se poate face cu instrucțiunea return rezultat;
, unde rezultat
reprezintă valoarea ca rezultat. Tipul de date al variabilei rezultat trebuie să fie totunul cu tipul funcției.
Atenție: După ce se apelează return
într-o funcție, toate celelalte operații de după nu se mai execută.
Spre exemplu, pentru o funcție care calculează suma a două numere, vom compune astfel funcția:
int suma(int a, int b) {
int r = a + b;
return r;
}
Sau, direct:
int suma(int a, int b) {
return a + b;
}
Pentru a apela o funcție, trebuie să menționăm numele funcției, iar între paranteze, să completăm parametrii dați. Spre exemplu, în int main
, am putea scrie:
int n = 3;
cout << suma(n, 4); //Afișează suma dintre n și 4, adică 7
Observăm că putem să furnizăm ca parametri atât variabile (n
), cât și valori efectiv (4
). Un alt aspect important este faptul că dacă am fi modificat în funcție valoarea primului parametru (care a luat valoarea lui n
), n
-ul nu și-ar fi modificat valoarea.
Pe lângă variabile, putem să oferim ca parametru tablouri (vectori sau matrici). Iată un cod în C++ care calculează suma numerelor unui vector:
int sumaVector(int n, int a[]) {
int sum = 0;
for(int i = 1; i <= n; i++)
sum += a[i];
return sum;
}
Atenție: spre deosebire de variabile, dacă vectorul din parametru se modifică în timpul funcției, atunci și vectorul inițial furnizat se modifică. Acest lucru se datorează faptului că un vector este defapt un pointer.
Putem extinde ideea vectorilor și în 2D, oferind ca parametru matrici.
Dacă avem o funcție cu o listă de parametri, putem să specificăm o valoare implicită pentru acestea, în cazul în care nu se furnizează niciuna. Spre exemplu, următoarea funcție calculează suma numerelor a
și b
, dar dacă b nu este furnizat, se face suma dintre a
și 0
(adică se returnează a
):
int suma(int a, int b = 0) {
return a + b;
}
Atenție: Este greșit să furnizăm o valoare prestabilită pentru un parametru, iar pentru parametrii de după să nu dăm nicio valoare. Următorul antet al unei funcții din C++ va da o eroare:
int sumaGresit(int a = 0, int b)
void
Am stabilit că furnizând o variabilă ca parametru într-o funcție, valoarea variabilei nu se modifică. Cu toate acestea, putem să specificăm explicit faptul că am vrea să fie modificată valoarea variabilei, folosind &
(and):
int functie(int &a) {
a = 0;
return a;
}
Funcția de mai sus, spre exemplu, îi dă variabilei a
valoarea 0
și o returnează.
De obicei, funcțiile care modifică valoarea variabilei nu returnează nimic. O funcție care nu returnează nimic se numește funcție de tipul void
(despre care am vorbit în această lecție). Spre exemplu, o funcție care interschimbă valorile a două variabile arată așa:
void interschimbare(int &a, int &b) { //Este de tipul void, deoarece nu se returnează nimic
int aux = a;
a = b;
b = aux;
}
# | Problemă | Dificultate | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
439. | Functie oglindit | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
440. | Functie suma Gauss | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
430. | Functie suma | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
437. | Functie numarul de cifre | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
435. | Functie valoare absoluta | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vrei mai multe probleme? Pe această pagină găsești întreaga listă de probleme propuse. |