Contact și feedback

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.

Shortcuturi

Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.

Generale

Meniu shortcuturi?
Căutare probleme sau utilizatori/
Navigare printre rezultatele căutării↑, ↓
Meniu de contact și feedbackCTRL + Shift + F
Ieșire din meniuriEsc

Editor probleme

Setări editorCTRL + Shift + S
Schimbare stil editorCTRL + Shift + E
Șabloane de codCTRL + Shift + 1/2/3
Golire editorCTRL + Shift + 4

Funcții în C++. Ce sunt subprogramele

Ce sunt funcțiile în C++?

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ă împartă codul în unități ușor de urmărit pentru om (util în special în cazul programelor complexe, unde lucrează mai multe persoane);
  • Să evite repetarea unei secvențe de cod în mai multe locuri.

Exemplu

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.

Cum se construiește o funcție

O funcție este alcătuită din mai multe părți.

Antetul funcției

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:

  • ce tip de funcție este (int, bool, char, …, sau chiar void);
  • cum se numește funcția (asemănător cu un nume de variabilă, care ne ajută să apelăm funcția mai târziu în programul nostru);
  • care sunt parametrii funcției:
    • parametrii funcției precizează care sunt valorile care se prelucrează în funcție;
    • vom vorbi mai încolo despre importanța acestora.

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

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;
}

Apelarea funcției

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.

Funcții cu parametri vectori (tablouri unidimensionale) în C++

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.

Valori prestabilite pentru parametri

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)

Parametrii prin referință. Funcții de tipul 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;
}

Probleme propuse

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

Alte resurse sau bibliografie

Obține medalia mult dorită. Devino As la olimpiadă.

Curs complet de olimpiadă, pregătit de olimpici de la Oxford și TU Delft.

Cuprinsul lecției

Se încarcă…

Citește și

Aria unui triunghi folosind coordonatele acestora în C++Divide et Impera (metodă de programare C++)Structuri repetitive (while, do while, for, etc)Cel mai semnificativ bit în C++Do while vs while în C++ - Care e diferența?Ce este o variabilă unsigned în C++?Verifică dacă un număr dat este o putere de 2 în C++Suma elementelor unui vector recursiv în C++Funcții în C++. Ce sunt subprogrameleRidicarea la putere în timp logaritmic în C++. Exponențiere rapidăAl N-lea termen dintr-o progresie geometricăVerifică dacă un număr este par sau impar fără modulo în C++Maximul și minimul a n valori în C++Verifică dacă un număr aparține șirului Fibonacci în C++Numărul minim de peroane pentru o gară în C++Transformarea unei litere mici în literă mare în C++Cea mai lungă secvență de elemente crescătoare în C++Verificarea unui an bisect în C++Cum să citești și să afișezi în fișiere în C++Maximul și minimul a două valori în C++Cifrele unui număr. Prelucrarea cifrelor unui număr în C++Generarea șirului Fibonacci generalizat în C++Al N-lea termen Fibonacci în C++Instrucțiunea do while (structuri repetitive)Cum să afișezi partea întreagă a unui număr real în C++Tutorial instalare CodeBlocks (ușor) - Introducere în informatică C++Suma 1 + 2 + 3 + ... + N în C++Sortare crescătoare recursivă în C++ - Merge sort și Bubble sortCâte numere naturale sunt într-un interval dat? (C++)Calculul combinărilor de n luate câte k (nCk) în C++Numărul de divizori primi ai unui număr în C++Aplicații cu ciurul lui Eratostene în C++: suma divizorilor, numărul divizorilorSuma divizorilor numerelor de la 1 la N (Folosind ciurul lui Eratostene)Cel mai frecvent element dintr-un șir în C++Verifică dacă o literă este vocală în C++Suma numerelor naturale dintr-un interval dat în C++Bordarea unei matrice în C++Vectorii în C++: citire și afișareVerifică dacă o literă este mică sau mare în C++Cum să calculezi instant 2 la puterea N în C++Valoarea absolută (modulul) unui număr în C++Distanța dintre două puncte în C++Numărul de apariții al unui număr într-un vector în C++Recursivitate în C++Căutare binară în C++Suma divizorilor unui număr în C++Transformarea unei litere mari în literă mică în C++Comentarii în C++Numărul de divizori al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Numărul combinărilor în C++ (formula combinărilor)Vectori de frecvență (de apariții) în C++Instrucțiunea while (structuri repetitive)Vectorii în C++: declarare și parcurgereFuncții predefinite în C++ (matematice, șiruri de caractere)Interclasarea a doi vectori în C++Verificare dacă șir de caractere este palindrom în C++Șirul lui Fibonacci în C++Maximul și minimul a trei valori în C++Șiruri de caractere în C++. Tot ce trebuie să știiMaximul și minimul unui vector în C++Verifică dacă trei puncte sunt coliniare C++Indicatorul lui Euler în C++Copiuțe: Cifrele unui numărCel mai mic/mare divizor prim al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Numărul de cifre ale factorialului unui numărAria și circumferința unui cerc în C++Ce înseamnă variabilă globală și locală în C++?Oglinditul recursiv al unui număr în C++CMMMC a două numere în C++ (cel mai mic multiplu comun)Numărul aranjamentelor în C++ (formula aranjamentelor)Al N-lea termen dintr-o progresie aritmeticăRădăcina cubică a unui număr în C++ (cube root)Tipuri de date în C++: numere întregi, reale, caractere și alteleMatrice în C++. Declararea și parcurgerea tablourilor bidimensionaleTransformarea unui număr din baza 10 în baza 2 în C++Numărul permutărilor în C++ (formula permutărilor)Cel mai mare divizor comun (CMMDC) a două numere în C++Instrucțiunea continue (structuri repetitive)Cel mai mic număr cu suma cifrelor N în C++Factorialul unui număr în C++Matrice pătratice în C++. Diagonala principală și secundarăCifra de control a unui numărCiurul lui Eratostene în C++Ce înseamnă endl în C++?Numărul de divizori al unui număr în C++Verifică dacă un bit de pe o anumită poziție este 1 sau 0 în C++Instrucțiunea for (structuri repetitive)Ce este o funcție void în C++?Oglinditul unui număr în C++Afișarea divizorilor primi ai unui număr în C++Indicatorul lui Euler al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Algoritm recursiv pentru căutare binară (clasa a X-a)Codul ASCII (tabel complet)Cel mai puțin semnificativ bit în C++Matrice Fibonacci - al n-lea termen Fibonacci în timp logaritmicCifra maximă a unui număr recursiv în C++Verifică dacă un caracter este literă în C++Inversarea unui șir de caractere în C++Inversarea unui vector în C++De ce cer unele probleme răspunsul modulo 666013 sau modulo 1.000.000.007?Pointer în C++. Variabile de tipul char * (char steluță)Numere triunghiulare. Verificarea unui număr triunghiularMateria pentru olimpiada de informatică - tot ce trebuie să știiCifra maximă și minimă a unui număr în C++Citirea și afișarea matricelor în C++Operații cu numere mari în C++ - Toate funcțiile explicateComplexitatea unui algoritm (timp și spațiu) în C++Interschimbarea a două variabile în C++ (3 metode)Tipul struct în C++. Ce sunt structurile de date neomogeneCitește un șir de caractere cu spații în C++Mediana unui șir de valori în C++Instrucțiunea de decizie în C++: if, else, switch, caseCMMDC recursiv a două numere naturale în C++Radicalul unui număr în C++ (rădăcina pătrată)Afișarea elementelor unui vector recursiv în C++Verificare număr prim în C++ (Clasa a IX-a)Combinatorică în C++: permutări, aranjamente, combinări și altelePrima cifră a unui număr în C++Instrucțiunea break (structuri repetitive)Află secolul unui an citit de la tastatură în C++Verificare dacă un număr este palindrom în C++Transformarea unui număr din baza 2 în baza 10 în C++Aflarea sumei primelor N sume GaussVerifică dacă un caracter este cifră în C++

© Drepturi de autor

Echipa InfoAs își rezervă drepturile de autor pentru conținutul acestei pagini. Copierea conținutului fără acordul scris expres al InfoAs reprezintă o încălcare a Legii 8/1996 și va fi tratată ca atare.

Trimite lecția

Toată lecția

Doar videoclipul pe YouTube

Informatica devine ușoară cu InfoAs

Intră în cont