Returnarea valorilor în subprogram

  În funcție de tipul de dată ales la declararea subprogramului, o dată de acel tip va fi returnată în final.

    Astfel, pentru:
  • int, float, short, unsigned, char, long, double - se va returna o dată de tipul respectiv;
  • bool - se returnează true(1), sau false(0);
  • void - nu se returnează nimic.

  Returnarea se face folosind construcția return urmată de o variabilă, sau o expresie. După întâlnirea și executarea acestei instrucțiuni, se iese automat din subprogram. Aceasta poate veni în ajutorul nostru atunci când vrem să ieșim forțat din funcție; un exemplu bun în acest caz este funcția de verificare a proprietății de număr prim.

bool nrPrim (int n){
  if (n==2) return true;
  else
    if (n%2==0 || n<2) return false;
    else{
      int d=3;
      for(d; d*d<=n; d+=2)
        if(n%d==0)
          return false;
    }
  return true;
}

  Pentru numărul n pe care îl primim ca parametru vom verifica inițial câteva cazuri particulare. Dacă este 2, știm că este prim și vom returna true; se va ieși din subprogram cu rezultatul true. Apoi, dacă numărul este par sau mai mic decât 2, știm că nu este prim și returnăm direct false. Cu această metodă evităm executarea în plus a unor instrucțiuni inutile.

Returnarea unei variabile

  Uneori vom dori să returnăm o variabilă care a fost construită în cadrul acesteia.

Exemplu: Se citește un număr k reprezentând o sumă de cifre, urmat de n numere naturale. Să se afișeze toate numerele cu suma cifrelor mai mare decât k.

#include <iostream>
using namespace std;
int n, x, k;
int SumaC(int a){
  int s=0;
  while(a){
    s+=a%10;
    a/=10;
  }
  return s;
}
int main(){
  cin>>k>>n;
  for(int i=1; i<=n; i++){
    cin>>x;
    if(SumaC(x)>k) cout<<x<<' ';
  }
  return 0;
}
8 4
232 35 80 11
35 80 
3 3
91 10 4
 

  Vom construi funcția SumaC care va primi parametru un număr și care va returna o dată de tip int. În corpul funcției, vom ține minte în variabila s suma cifrelor numărului primit ca parametru, iar la sfârșit o returnăm.
  În funcția principală, condiția din if se interpretează în felul următor: avem o inegalitate, termenul stâng fiind un apel de funcție. Se va executa funcția SumaC, cu parametrul x. La sfârșitul executării subprogramului știm că se returnează valoarea unei variabile. Astfel, când ne întoarcem la inegalitatea noastră, în urma executării funcției apelate termenul stâng va fi s (pe care îl compară cu k ș.a.m.d).

  Să urmărim schematic executarea pentru următorul set de date de intrare:

5 2
2 14
  1. se citesc cele 2 numere k și n;
  2. pentru numărul nou citit vom apela în if funcția SumaC (cu parametrul numărul respectiv);
  3. în funcție se determină suma cifrelor și se returnează (în cazul primului număr citit 2);
  4. se întoarce în condiție și înlocuiește apelul cu valoarea returnată, apoi evaluează expresia (la primul număr din exemplu este falsă);
  5. ne întoarcem la pasul 2 (citim un nou număr, se apelează funcția, ... ).

Returnarea unei expresii/condiții

  Avem posibilitatea de a pune o expresie sau o condiție după return (inegalități, if ternar etc). Expresia se calculează, iar condiția este evaluată și i se returnează valoarea de adevăr. Returnarea expresiilor este foarte întâlnită la recursivitate, procedeu explicat în materialul dedicat.

Exemplu: Se citesc n numere naturale. Să se afișeze cele care au oglinditul un număr par.

#include <iostream>
using namespace std;
int n,x;
bool OglinditPar(int a){
  while(a>9) a/=10;
  return a%2==0;
}
int main(){
  cin>>n;
  for(int i=1; i<=n; i++){
    cin>>x;
    if(OglinditPar(x)) cout<<x<<' ';
  }
  return 0;
}
5
785 6054 58 683 41
6054 683 41 
3
121 475 3
475

  A determina dacă oglinditul este număr par este de fapt verificare proprietății de număr par pentru prima cifră a numărului, întrucât ea dă paritatea oglinditului. În subprogram, vom tăia cifre din variabilă până când rămâne doar cifra din față, pe care trebuie de fapt să o testăm.
  Instucțiunea return a%2==0; va evalua condiția descrisă după return, iar dacă este adevărată, subprogramul returnează adevărat. Analog pentru fals. În funcția principală vom apela acest subprogram pentru fiecare număr citit și îl afișăm doar dacă funcția OglinditPar „întoarce” valoarea true(1).