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.
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:
- se identifică operațiile distincte;
- se scrie câte un subprogram pentru fiecare operație;
- fiecare subprogram se testează separat;
- 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.
S-a încheiat minutul de citit liber.
Ce cuprinde subcapitolul
- Funcție și procedură
- Componentele unui subprogram
- Definirea și apelul subprogramelor
- Parametri și transmiterea datelor
- Mai multe rezultate
- Variabile locale și globale
- Variabile locale cu același nume
- Proiectarea unui subprogram
- Complexitate și efecte secundare
- 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.
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