Sari la conținut
EduCamp

Tematică științifică · 2.6

Subprograme definite de utilizator

Proiectarea modulară a rezolvării unei probleme, declararea, definirea și apelul funcțiilor, transmiterea datelor prin parametri și domeniul de vizibilitate al variabilelor, în C++ și Python.

∗ Și la proba practică — Titularizare

Programul principal îl poate apela ori de câte ori are nevoie, cu date diferite.

Prin folosirea subprogramelor, o problemă mare se împarte în probleme mai mici, în etapele următoare:

  1. se identifică operațiile distincte;
  2. se scrie câte un subprogram pentru fiecare operație;
  3. fiecare subprogram se testează separat;
  4. apelurile se combină în programul principal.

Un subprogram bine scris realizează o singură operație, primește numai datele de care are nevoie și întoarce rezultatul într-o formă ușor de folosit.

Funcție și procedură

valoare ← functie(date)
procedura(date)

În C++, funcția are un tip de retur, iar procedura se scrie cu tipul void. În Python, orice subprogram este definit cu def; dacă nu întâlnește o instrucțiune return, el întoarce implicit valoarea None.

Componentele unui subprogram

Un subprogram poate avea:

  • nume, identificatorul prin care este apelat;
  • parametri formali, variabilele din antet care primesc date;
  • corp, instrucțiunile executate la apel;
  • tip de retur, în C++, tipul valorii întoarse;
  • valoare returnată, dacă subprogramul este funcție.

El conține numele subprogramului, lista parametrilor formali și, în C++, tipul rezultatului.

Definirea și apelul subprogramelor

La apel, execuția trece la prima instrucțiune a subprogramului; după încheierea lui, execuția continuă din locul apelului.

Subprograme definite de utilizator în C++

În C++, orice subprogram se scrie ca funcție: definiția cuprinde antetul și corpul, delimitat de acolade.

Definirea unei funcții

Forma generală este:

tip_rezultat nume(parametri) {
    instrucțiuni;
    return rezultat;
}

Exemplu:

int maxim(int a, int b) {
    if (a > b)
        return a;
    return b;
}

a și b sunt parametri formali, iar rezultatul funcției este un int. Instrucțiunea return încheie execuția funcției și transmite valoarea către locul apelului.

Apelul unei funcții

int x = 14, y = 9;
int m = maxim(x, y);
cout << m;

La apel, x și y sunt argumente. Ordinea lor corespunde parametrilor a și b. Funcția se execută, iar expresia maxim(x, y) este înlocuită cu valoarea întoarsă.

O funcție poate fi apelată direct într-o condiție:

if (maxim(a, b) > 100)
    cout << "mare";

Declararea prin prototip

Dacă funcția este scrisă după main, compilatorul trebuie să-i cunoască antetul înainte de primul apel. Se scrie un prototip:

#include <iostream>
using namespace std;

int maxim(int a, int b);

int main() {
    cout << maxim(4, 7);
}

int maxim(int a, int b) {
    return a > b ? a : b;
}

Prototipul conține tipul rezultatului, numele și tipurile parametrilor, dar nu are corp. Caracterul ; de la sfârșit este obligatoriu.

Dacă definiția apare înainte de main, prototipul separat nu mai este necesar:

int maxim(int a, int b) {
    return a > b ? a : b;
}

int main() {
    return maxim(4, 7);
}

Proceduri cu void

O procedură nu întoarce o valoare:

void afiseaza(int x) {
    cout << x << '\n';
}

Se apelează ca instrucțiune:

afiseaza(25);

Într-o procedură void se poate scrie return; pentru oprirea anticipată, dar nu return valoare;.

Subprograme definite de utilizator în Python

În Python, orice subprogram se definește cu instrucțiunea def: antetul se încheie cu caracterul :, iar corpul se scrie pe rândurile următoare, indentat.

Definirea unei funcții

Forma generală este:

def nume(parametri):
    instructiuni
    return rezultat

Exemplu:

def maxim(a, b):
    if a > b:
        return a
    return b

Indentarea arată corpul funcției. a și b sunt parametri formali, iar return transmite valoarea către locul apelului.

Apelul unei funcții

x = 14
y = 9
m = maxim(x, y)
print(m)

Argumentele pot fi expresii:

if maxim(a, b) > 100:
    print('mare')

Python nu cere prototip separat. Definiția trebuie însă executată înainte de apel. În mod obișnuit, funcțiile se definesc înaintea programului principal.

Procedura

Un subprogram care nu are return explicit se comportă ca o procedură:

def afiseaza(x):
    print(x)

afiseaza(25)

El întoarce implicit None. O instrucțiune return fără expresie oprește funcția și întoarce tot None:

def afiseaza_pozitiv(x):
    if x <= 0:
        return
    print(x)

Parametri și transmiterea datelor

Parametrii fac subprogramul reutilizabil. În loc să se scrie câte o funcție separată pentru fiecare pereche de numere, valorile se transmit ca argumente.

Transmiterea prin valoare

În transmiterea prin valoare, subprogramul primește o copie. Modificarea parametrului în interior nu modifică argumentul din programul apelant:

void mareste(int x) {
    x++;
}

int n = 5;
mareste(n);
cout << n;  // 5

Aceasta este forma implicită pentru parametrii simpli.

Transmiterea prin referință

Un parametru de forma tip& este o referință la variabila apelantului. Modificarea lui se vede și după revenirea din subprogram:

void mareste(int& x) {
    x++;
}

int n = 5;
mareste(n);
cout << n;  // 6

Referința se folosește când subprogramul trebuie să modifice direct o variabilă sau când se dorește întoarcerea mai multor rezultate.

Pentru un parametru care nu trebuie modificat, dar este un obiect mare, copierea poate fi evitată printr-o referință constantă:

int lungime(const string& s) {
    return s.length();
}

Vectorii ca parametri

Un vector transmis unei funcții poate fi modificat de funcție:

void dubleaza(int v[], int n) {
    for (int i = 0; i < n; i++)
        v[i] *= 2;
}

La apel se transmite numele vectorului și numărul de elemente:

int v[] = {1, 2, 3};
dubleaza(v, 3);

Funcția nu află singură câte elemente are vectorul. Dimensiunea trebuie transmisă separat sau stabilită printr-o constantă cunoscută.

Materialul acesta se citește pe educamp.ro și nu se tipărește.

Ce cuprinde subcapitolul

  1. Funcție și procedură
  2. Componentele unui subprogram
  3. Definirea și apelul subprogramelor
  4. Parametri și transmiterea datelor
  5. Mai multe rezultate
  6. Variabile locale și globale
  7. Variabile locale cu același nume
  8. Proiectarea unui subprogram
  9. Complexitate și efecte secundare
  10. Greșeli frecvente la examen

Continuă lectura ca și cursant

Cel puțin un subcapitol din fiecare capitol este disponibil gratuit și integral. Pentru a citi toate celelalte subcapitole ale disciplinei, te înscrii la cursul de pregătire.

Te înscrii, alegi în cont când începe cursul și plătești prima lună prin transfer bancar. Pentru a vedea mai întâi cum este prezentată materia, poți reveni la primul subcapitol al capitolului.

Acces la suportul de curs

25 RON / lună, fără ședințe

Ce cuprinde:

  • Acces la toate lecțiile disponibile
  • Suport de curs pentru tematica științifică și metodică
  • Exemple, explicații și exerciții
  • Acces la materialele noi adăugate pe platformă
  • Posibilitatea de a adresa întrebări

Poți alege și variante cu ședințe online, în grup sau individuale. Le vezi pe pagina cursului.

Ai întrebări sau o problemă? Scrie-mi pe WhatsApp, la 0745 874 576.

Înscrie-te Alte varianteCum plătești Login

Surse (3)
  • Cerchez, E., Șerban, M., „Programarea în limbajul C/C++ pentru liceu”, Editura Polirom, Iași, 2005
  • „Informatică. Manual pentru clasa a XI-a”, Editura Didactică și Pedagogică, București
  • „Tutorialul de Python”, documentația oficială a limbajului Python, https://docs.python.org/ro/3/tutorial/controlflow.html#defining-functions
Actualizat: 20 octombrie 2026