Subprograme

Un subprogram constă într-o secvență de declarații și instrucțiuni care se identifică printr-un nume și poate fi apelat prin intermediul acestuia.

  Subprogramul este, în esență, o colecție de instrucțiuni pe care le putem apela la un moment dat în program. Am putea spune că sunt folosite pentru a evita repetarea unor secvențe de cod (sume de cifre, oglinditul etc), sau pentru a structura mai schematic un algoritm. Deși ele se scriu înaintea funcției principale (int main()), ele se execută doar atunci când sunt apelate.

    Categorii:
  1. Subprograme ce returnează o valoare (de tipul de dată ales);
  2. Subprograme ce nu returnează valori, eventual doar prin parametri.

Sintaxă

  În limbajul C++, subprogramele se numesc funcții și au următoarea structură:

<tip_dată> <nume_funcție> (<parametri_formali>) 1
{ *
  <declarații>
  <instrucțiuni>	2
  <și_mai_multe_instrucțiuni>
} *
1 Se numește antetul funcției și are următoarele componente:
  • <tip_dată> - reprezintă tipul de dată al valorii returnate (se folosește tipul void dacă nu se returnează nimic);
  • <nume_funcție> - este identificatorul subprogramului și va fi util atunci când vrem să îl apelăm;
  • <parametri_formali> - conține lista de parametri.
2 Corpul funcției unde se află instrucțiunile de executat.
* Acoladele au scopul de a „cuprinde” instrucțiunile din interiorul funcției; nu contează poziția lor, atâta timp cât vor încadra liniile de cod din interior.

Exemplu

#include <iostream>
using namespace std;
int A[101], B[101], C[101], a, b, c;
void Citire(int X[101], int&x){
  cin>>x;
  for(int i=0; i<x; i++) cin>>X[i];
}
int main (){
  Citire(A, a);
  Citire(B, b);
  Citire(C, c);
  ...
  return 0;
}

    Din antetul subprogramului putem observa câteva indicii:
  • tipul de dată void ne indică lipsa returnării unei variabile;
  • numele funcției este ales sugestiv pentru ceea ce face;
  • lista de parametri ne indică ce variabile „vin din exterior” și care vor suferi schimbări „permanente”; mai multe explicații și exemple în materialul transmiterea parametrilor.
  În acest exemplu presupunem că dorim sa citim, pe rând, 3 vectori cu număr diferit de elemente. Pentru a evita repetarea scrierii aceluiași for de 3 ori, vom creea o funcție de citire cu doi parametri: vectorul care se citește, și numărul total de elemente al acestuia.


Caracteristici

1. Declarare

  Subprogramele se declară după zona variabilelor globale, înainte de funcția principală (int main()). Poți vizita pagina Structura unui program C++ pentru a vedea ordinea structurilor dintr-un program.
  Când declarăm mai multe subprograme va trebui să ținem cont de efectul de stivă, însemnând că un subprogram este vizibil doar pentru cele următoare, el nefiind vizibil în cele precedente.

  Când scriem lista parametrilor, numele variabilelor va fi precedat de tipul datei; la tablouri vor trebui să existe și dimensiunile. Câteva exemple de declarări ale antetelor unor funcții:

void f1 (int A[101]);
unsigned f2 (int x, float y);
bool f3 (int a, short B[100][51], char c);

Se pot declara doar antetele funcțiilor urmate de ;. Ele trebuie apoi descrise mai jos.

2. Apelare

  Putem apela un subprogram în funcția principală sau într-un alt subprogram (dacă este vizibil). Poate fi folosit ca instrucțiune, sau ca o condiție; depinde unde avem nevoie de el.
  Sintaxa apelării este următoarea: <nume_funcție> (<variabile_parametri>).
În momentul apelării, pe stiva de memorie se creează spațiu pentru variabilele locale din subprogram și parametri.

  La fel ca la variabile, numele funcției este case sensitive (literele mici diferă de cele mari). Variabilele ca parametru vor apărea de această dată fără tipul datei în fața numelui.
Tablourile nu vor fi precedate de parantezele pătrate (dimensiuni).

  Apelarea funcțiilor din exemplul anterior s-ar realiza în felul următor:

f1(A);
f2(x,y);
f3(a,B,c);

Numele variabilelor la apelare poate să difere de cel scris ca parametru. Acest principiu este explicat în materialul Transmiterea parametrilor.


Materialele specifice subprogramelor

Denumire material Descriere pe scurt
Returnarea valorilor Folosind anumite tipuri de date la definirea subprogramului, se poate returna o valoare de tipul respectiv.
Transmiterea parametrilor În executarea instrucțiunilor pot interveni variabile transmise ca parametru, fie transmise prin valoare, fie prin referință.
Recursivitate Recursivitatea este un procedeu bazat pe capacitatea unui subprogram de a se defini prin el însuși. Acesta se autoapelează până când un caz de bază este îndeplinit și se opresc apelurile recursive.