Subprograme

 

            Programele se pot descompune in subprobleme (module), adica in grupe de actiuni care se pot repeta de un numar de ori si care se executa numai in functie de anumite conditii. Acest lucru determina existenta unui modul principal pentru prelucrarile principale si pentru activarea “subordonatilor”.

           

In faza de programere modulele vor deveni subprograme iar modulul principal –program principal.

            Subprogramele in limbajul C++ se numesc functii.       

 

Un program scris în limbajul C/C++ este un ansamblu de funcţii, fiecare dintre acestea efectuând o activitate bine definită.

 

Un program C++ este alcatuit din una sau mai multe functii, din care una este radacina sau functie principala - adica nu poate lipsi si executia incepe automat cu ea. Aceasta se numeste main.

 

 

Funcţiile comunică prin argumente: ele primesc ca parametri (argumente) datele de intrare, efectuează prelucrările descrise în corpul funcţiei asupra acestora şi pot returna o valoare (rezultatul, datele de ieşire).

Funcţiile pot fi descrise în cadrul aceluiaşi fişier, sau în fişiere diferite, care sunt testate şi compilate separat, asamblarea lor realizându-se cu ajutorul linkeditorului de legături.

 

Definitie. Subprogramul este prin urmare un ansamblu alcatuit din tiputi de date, variabile si instructiuni scrise in vederea unei anumite prelucrari (calcule, citiri, scrieri), care se identifica printr-un nume  si care poate fi  executat doar daca este apelat .

 

Avantajele utilizarii subprogramelor:

·         Modularizarea problemei (descompunerea in subprobleme)

·         Reutilizarea aceleasi secvente de mai multe ori (in contexte diferite)

·         Depanarea si intretinerea mai usoara

 

 

 

O funcţie este formata din antet si corp:

antet_funcţie

  {corpul_funcţiei

  }

Sau:

tip_val_return nume_func (lista_declaraţiilor_param_ formali)

{declaraţii_variabile_locale

instrucţiuni

[return valoare]

}

 

Antetul unei functii:

Prima linie reprezintă antetul funcţiei, în care se indică: tipul funcţiei, numele acesteia şi lista declaraţiilor parametrilor formali.

 La fel ca un operand sau o expresie, o funcţie are un tip, care este dat de tipul valorii returnate de funcţie în funcţia apelantă. Dacă funcţia nu întoarce nici o valoare, în locul tip_vali_return se specifică void. Dacă tip_val_return lipseşte, se consideră, implicit, că acesta este int.

 Nume_funcţie este un identificator

Lista_declaraţiilor_param_formali (încadrată între paranteze rotunde) constă într-o listă (enumerare) care conţine tipul şi identificatorul fiecărui parametru de intrare, despărţite prin virgulă. Tipul unui parametru poate fi oricare, chiar şi tipul pointer. Dacă lista parametrilor formali este vidă, în antet, după numele funcţiei, apar doar parantezele ( ), sau (void).

Corpul funcţiei este un bloc, care implementează algoritmul de calcul folosit de către funcţie. În corpul funcţiei apar (în orice ordine) declaraţii pentru variabilele locale şi instrucţiuni. Dacă funcţia întoarce o valoare, se foloseşte instrucţiunea return valoare. La execuţie, la întâlnirea acestei instrucţiuni, se revine în funcţia apelantă.

 

Corpul unei functii:

Corpul funcţiei este un bloc, care implementează algoritmul de calcul folosit de către funcţie. În corpul funcţiei apar (în orice ordine) declaraţii pentru variabilele locale şi instrucţiuni. Dacă funcţia întoarce o valoare, se foloseşte instrucţiunea return valoare. La execuţie, la întâlnirea acestei instrucţiuni, se revine în funcţia apelantă.

 

În limbajul C/C++ se utilizează declaraţii şi definiţii de funcţii.

 

Declaraţia conţine antetul funcţiei şi informează compilatorul asupra tipului, numelui funcţiei şi a listei parametrilor formali (în care se poate indica tipul parametrilor formali şi numele acestora). Declaraţiile de funcţii se numesc prototipuri, şi sunt constituite din antetul funcţiei.

Definiţia conţine antetul funcţiei şi corpul acesteia. Nu este admisă definirea unei funcţii în corpul altei funcţii.

 

Apelul şi prototipul funcţiilor

 

O funcţie poate fi apelată printr-o construcţie urmată de punct şi virgulă, numită instrucţiune de apel, de forma:

nume_funcţie (lista_parametrilor_efectivi);

 

Parametrii efectivi trebuie să corespundă cu cei formali ca ordine şi tip. La apel, se atribuie parametrilor formali valorile parametrilor efectivi, după care se execută instrucţiunile din corpul funcţiei. La revenirea din funcţie, controlul este redat funcţiei apelante, şi execuţia continuă cu instrucţiunea următoare instrucţiunii de apel, din funcţia apelantă. O altă posibilitate de a apela o funcţie este aceea în care apelul funcţiei constituie operandul unei expresii (apelul functiei intervine intr-o expresie). Acest lucru este posibil doar în cazul în care funcţia returnează o valoare, folosită în calculul expresiei(doar pentru functiile cu tip).

 

Parametrii declaraţi în antetul unei funcţii sunt numiţi formali, pentru a sublinia faptul că ei nu reprezintă valori concrete, ci numai ţin locul acestora pentru a putea exprima procesul de calcul realizat prin funcţie. Ei se concretizează la execuţie prin apelurile funcţiei.

Parametrii folosiţi la apelul unei funcţii sunt parametri reali, efectivi, concreţi, actuali iar valorile lor vor fi atribuite parametrilor formali, la execuţie. Utilizarea parametrilor formali la implementarea funcţiilor şi atribuirea de valori concrete pentru ei, la execuţie, reprezintă un prim nivel de abstractizare în programare. Acest mod de programare se numeşte programare procedurală şi realizează un proces de abstractizare prin parametri.

    

Variabilele declarate în interiorul unei funcţii, cât şi parametrii formali ai acesteia nu pot fi accesaţi decât în interiorul acesteia. Aceste variabile sunt numite variabile locale şi nu pot fi accesate din alte funcţii. Domeniul de vizibilitate a unei variabile este porţiunea de cod la a cărei execuţie variabila respectivă este accesibilă. Deci, domeniul de vizibilitate a unei variabile locale este funcţia în care ea a fost definită.

 

Iata un exemplu simplu care ilustreaza aspectele amintite anterior:

 

#include<iostream.h>

#include<conio.h>

#include<string.h>

#include<math.h>

 

void calcule(int poz,char s[100])     //a si s parametri formali

{int n;   char c;                                //parametri locali

 cout<<"caracterul de pe pozitia "<<poz<<" este "<<s[poz]<<endl;

 c=s[poz];

 c=c+1;

 cout<<"urmatoarea litera din alfabet este "<<c<<endl;

 n=abs(s[strlen(s)-1]-s[0]-1);        //apel de functii predefinite: strlen() si abs()

 cout<<"intre ultima litera din sir "<<s[strlen(s)-1]<<" si prima litera "<<s[0]<<" sunt "<<n<<" litere";

}

 

void main()

{clrscr();                                 //apel de functie

 char s1[100]="carte";           //parametru local

 calcule(1,s1);                       //apel de functie, 1 si s1 sunt parametri efectivi, de apel

 cout<<endl<<endl;

 calcule(2,s1);                       //apel de functie, 2 si s1 sunt parametri efectivi, de apel

 char s2[100]="subprograme"; //parametru local

 int n=5;                                 //parametru local

 cout<<endl<<endl;

 calcule(n,s2);               //n si s2 parametri efectivi

getch();                         //apel de functie

}

 

Apelul calcule(1,s1) va afisa:

 

Caracterul de pe pozitia 1 este a

Urmatoarea litera din alfabet este b

Intre ultima litera din sir e si prima litera c sunt 1 litere

 

Apelul calcule(2,s1) va afisa:

 

Caracterul de pe pozitia 2 este r

Urmatoarea litera din alfabet este s

Intre ultima litera din sir e si prima litera c sunt 1 litere

 

 

Apelul calcule(n,s2) va afisa:

 

Caracterul de pe pozitia 5 este o

Urmatoarea litera din alfabet este p

Intre ultima litera din sir e si prima litera c sunt 15 litere

 

Probleme propuse:

 

(functii fara tip)

1.      Sa se defineasca un subprogram care primeste ca parametru un numar natural n si afiseaza numerele de la 1 la n (se va apela de 3 ori)

2.      Sa se defineasca un subprogram care primeste ca parametru un numar natural n si afiseaza primii n termini din sirul lui Fibonacci (se va apela de 4 ori)

3.      Sa se defineasca un subprogram care primeste ca parametru un numar natural n si afiseaza si numara toti divizorii lui n (se va apela de 3 ori)

4.      Sa se defineasca un subprogram care primeste ca parametru un numar natural n si afiseaza numarul incepand cu cifra unitatilor

5.      Sa se defineasca un subprogram care primeste ca parametri doua numere naturale si afiseaza cate zerouri are produsul lor

6.      Sa se defineasca un subprogram care primeste ca parametru un numar real n si afiseaza aria patralului si triunghiului avand latura cu lungime n

7.      Sa se defineasca un subprogram care sa rezolve ecuatia aX+b=0 (de gradul I). Se va apela de 3 ori

8.      Sa se defineasca un subprogram care sa rezolve ecuatia aX2+bX+c=0 (de gradul II). Se va apela de 3 ori

9.      Sa se simplifice o fractie astfel incat sa devina fractie ireductibila

10.  Sa se afiseze o piramida de tipul:

1

1 2

1 2 3

……

1 2 3 ….n

pentru o valoare a lui n transmisa ca paramtru

11.  Sa se afiseze vocalele unui sir transmis ca parametru

12.  Citirea /afisarea unui vector

13.  Citirea afisarea unei matrici

14.  Se citesc 2 vectori de intregi avand n componente. Sa se afiseze vectorul suma

15.  Se citesc 2 matrici de intregi. Sa se afiseze matricea suma

16.  Afisarea diagonalelor unei matrici patratice