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.
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