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.
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:
- identificăm operațiile distincte;
- scriem câte un subprogram pentru fiecare operație;
- testăm separat fiecare subprogram;
- 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.
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.
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ă.
Nu am putut înregistra adresa. Verifică e-mailul și materia aleasă, apoi încearcă din nou.
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