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

Un subprogram definit de utilizator este o secvență de instrucțiuni scrisă de programator pentru a realiza o operație bine precizată. Programul principal îl poate apela ori de câte ori are nevoie, cu date diferite.

Folosirea subprogramelor transformă o problemă mare în probleme mai mici:

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

Această organizare se numește programare modulară. Un subprogram bun are o responsabilitate clară, primește numai datele de care are nevoie și întoarce rezultatul într-o formă ușor de folosit.

Funcție și procedură

O funcție întoarce o valoare prin numele ei. O procedură execută o operație, dar nu întoarce o valoare ca rezultat al apelului.

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.

Parametrul formal este o variabilă locală subprogramului. Valoarea transmisă la apel se numește argument sau parametru efectiv.

Definirea și apelul subprogramelor

Subprograme definite de utilizator în C++

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ă semnătura î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. Punctul și virgula 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

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ă scriem o funcție separată pentru fiecare pereche de numere, transmitem valorile 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 nu dorim copierea unui obiect mare, se poate folosi 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.

Cursul cuprinde suportul de curs publicat până acum, care se completează capitol cu capitol, și două întâlniri de câte două ore în fiecare lună. Prima săptămână este gratuită, fără plată și fără card. Dacă vrei să vezi mai întâi cum este prezentată materia, poți reveni la primul subcapitol al capitolului.

Începe săptămâna gratuită Sunt cursant — login

Află când publicăm materiale noi

Materia este publicată treptat, capitol cu capitol. Înscrie-te pentru a primi un e-mail atunci când apare un capitol nou de informatică.

Vei primi mesaje numai despre materia selectată și despre cursul de pregătire. Te poți dezabona oricând, dintr-o singură apăsare.

Surse

  • 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: 10 septembrie 2026