C
FUNCTII IN C++ - forma generala a unei functii, argumentele functiei, apelul unei functii, prototipul unei functiiFUNCTII IN C++Un program in C este un ansamblu de functii care efectueaza o activitate bine definita. Dintre aceste functii, intotdeuna o functie este numita main si este functia care este apelata la lansarea in executie a programului.1. Forma generala a unei functiiSintaxa unei functii este urmatoarea:tip_rezultat nume_functie (lista_de_parametrii)tip_rezultat – specifica tipul de date pe care il returneaza functia . o functie poate returna orice tip de data cu exceptia unei matrice. Daca nu este specificat nici un tip, compilatorul presupune ca acea functie returneaza un rezultat de tip intreg.lista_de_parametrii – este o lista separata prin virgule de nume de variabile si tipurile lor associate care primesc valorile argumentelor atunci cand este apelata functia. O functie poate sa nu aiba parametrii, caz in care lista lor este vida. Totusi parantezele sunt necesare, chiar daca nu exista parametri.In declaratiile de variabile globale ne putem referi la mai multe variabile de acelasi tip folosind o lista cu numele lor separate prin virgula. Spre deosebire de acestea variabilele locale (parametrii unei functii) trebuie declarati individual, fiecare continand atat tipul cat si numele.Ex.f(int i, int k, float j) /*corect*/f (int i, k, float j) /*gresit*/Fiecare functie este un bloc de cod discret. O functie nu poate avea acces la codul unei alte functii decat printr-un apel de functie. Variabilele declarate intr-o functie sunt variabile locale, adica snt create la intrarea in functia respectiva si distruse la iesirea din aceasta. Nu se poate defini o functie intr-o alta functie, deci toate functiile au aceeasi sfera de influenta.2. Argumentele functieiDaca o functie urmeaza sa foloseasca argumente, ea trebuie sa declare variabile care accepta valori ale argumentelor. Aceste variabile sunt denumite parametri formali ai functiei. Ei se comporta ca si celelalte variabile locale din functie si sunt create la intrarea intr-o functie si distruse la iesirea din ea. Declararea parametrilor se face dupa numele functiei.3. Apelul unei functiiApelul unei functii se face specificand numele functiei urmat de lista parametrilor actuali. Aceasta este formata din variabile, constante sau expresii compatibile ca tip cu parametrii formali, adica fiecarui parametru formal i se asociaza o variabila, o constanta sau o expresie compatibila ca tip.Daca lista de parametrii este vida, apelul se face specificand numele functiei urmat de paranteze rotunde.Ex.int f(int k, int i, float a);int g (void);apelul functiilor f si g se poate face astfel:int m, j;float b;j=g();f (m, j+1, 12.5);4. Prototipul unei functii.Definitia unei functii apare in cadrul fisierului sursa, inaintea fiecarui apel, numai in cazuri particulare. Definitia lipseste in cazul functiilor din biblioteci sau atunci cand functia se afla in alt fisier sursa sau proiect (in cadrul unui proiect nu se admite ca o functie sa fie definita de doua ori).Pentru ca la compilare sa se poata efectua si validarea apelurilor unei functii, limbajul C prevede declaratii fara definirea functiilor, numite prototipuri. Aceste sunt recomandate in C si impuse in C++.Forma generala de definire a unui prototip este:tip_rezultat nume_functie (tip_1 nume_var_1, tip_2 nume_var_2, , tip_n nume_var_n);Ex.int f(int k, int i, float a);void g (int *p1, int *p2);Prototipurile permit compilatorului sa verifice si sa gaseasca deferentele dintre argumentele utilizate la apelare si parametrii functiei (tipurile si numarul acestora).Folosirea numelor parametrilor este optionala. Utilizarea lor este insa recomandata deoarece acestia pot fi utilizati de compilator in cadrul mesajelor de eroare.Ex. de prototipuri de functii, fara specificarea numelor parametrilor:int f(int, int, float);void g (int *, int *);in C lipsa parametrilor se specifica prin void. In C++ lista vida indica faptul ca functia nu are parametrii si nu este necesara inserarea cuvantului void.Pentru functia main nu este necesar un prototip, iar lipsa parametrilor nu se mai indica prin cuvantul void.Prototipul trebuie inserat in program (de regula la inceputul programului), inaintea oricarui apel al functiei.Prototipurile functiilor ajuta la ocolirea greselilor inainte ca ele sa apara . in plus dau posibilitatea verificarii corectitudinii programului, nepermitand functiilor sa fie apelate cu argumente nepotrivite.5. Revenirea dintr-o functie. Instructiunea return.Exista doua cai de incheiere a executiei unei functii si de revenire in programul apelant: prima varianta de revenire are loc dupa ce se executa ultima instructiune a functiei (dupa care urmeaza acolada de sfarsit), iar cea de-a doua varianta de revenire are loc la intalnirea instructiunii return.Sintaxa instructiunii return este urmatoarea:return expresie;unde expresie reprezinta rezultatul intors de functie, deci acesta trebuie sa fie compatibil cu tipul indicat de prototipul functiei.Exceptand functiile de tip void, toate functiile returneaza o valoare. Aceasta valoare este specificata explicit de catre instructiunea return.Valori returnate. Toate functiile, cu exceptia celor de tip void, returneaza o valoare. Aceasta valoare este specificata explicit de catre instructiunea return. Daca nu exista nici o instructiune return, atunci valoarea returnata de functie este teoretic nedefinita. Deci, atata vreme cat o functie nu este declarata ca fiind void, ea poate fi folosita ca operand in orice expresie valida.Obs. O functie nu poate fi niciodata tinta unei atribuiri. O instructiune de forma:modific(x,y)=100; /*instructiune incorecta*/este gresita. Compilatorul o va taxa ca eroare si nu va compila un program care contine asa ceva.In general, la scrierea de programe in C++, functiile vor fi de trei tipuri:- functii de calcul simplu - care sunt proiectate pentru a efectua operatii asupra argumentelor lor si a returna o valoare rezultata din aceste operatii (Ex. functiile standard de biblioteca sqrt() si sin()care calculeaza radacina patrata, respectiv sinusul argumentelor lor);- functii ce manevreaza informatiile si returneaza o valoare care indica reusita sau nereusita acestei manevre (Ex. functia de biblioteca fclose()care este folosita pentru a inchide un fisier- daca operatia de inchidere a decurs cu succes, functia returneaza 0, daca operatia nu a reusit, functia returneaza un cod de eroare);- functii care nu au o valoare returnata explicit. In esenta o astfel de functie este strict de procedura si nu returneaza o valoare (Ex. exit() – care termina un program). Toate functiile care nu returneaza valori trebuie declarate ca returnand tipul void.6. Transferul parametrilor. La apelul unei functii, transferul parametrilor se poate face prin valoare sau prin referinta. Transferul prin valoare. Valorile parametrilor si altor variabile locale ale functiei sunt memorate in stiva sau in registrele microprocesorului. In cazul transferului prin valoare, valoarea unui argument se copiaza in zone de memorie reyervata parametrului formal corespunzator. Daca argumentul este o variabila, orice operatiune efectuata asupra parametrului formal nu afecteaza variabila, ceea ce poate constitui o protectie utila. Transferul unei valori poate fi insotit de eventuale conversii de tip, corespunzator informatiilor pe care compilatorul le are despre functie. Pentru conversii explicite se poate utiliza operatorul „cast”. Ex. Combinari de n luate cate k: /*combinari de n luate cite k*/ #include <stdio.h> #include <conio.h> unsigned long int f (int n); /*prototip functie*/ void main () unsigned long int f(int n) /*definire functie*/ Transferul prin referinta Cand o functie trebuie sa modifice valoarea unei variabile indicate ca parametru, parametru formal corespunzator variabilei trebuie declarat ca pointer. In acest mod, la apelare, se ofera explicit adresa variabilei.
De exemplu, programul Combinari din n luate cate k (cu pointeri) utilizeaza transferul prin referinta. /* Combinari din n luate cate k (cu pointeri si functii) */ #include <stdio.h> #include <conio.h> void f(int n, unsigned long int *nf); void main() void f(int n, unsigned long int *nf) Transferul tablourilor ca argumente. Cand un tablou este utilizat ca argument, acesta constituie o exceptie de la regula de transfer prin valoare, deoarece transmite adresa tabloului. Astfel, codul functiei poate opera asupra continutului elementelor tabloului si poate sa-l modifice. In cazul transmiterii unui sir, parametrul se poate declara pointer, iar in cazul matricelor, parametrul se declara ca o matrice. /* Radacina polinom */ #include <stdio.h> #include <conio.h> #include <math.h> float cit_nr(char c); void cit_sir(int n, float *p); float val_pol(int n, float *p, float x); void calc_rad(int n,float *a,float p,float q); void main(void) float cit_nr(char c) void cit_sir(int n, float *p) } float val_pol(int n, float *p, float x) void calc_rad(int n, float *a, float p, float q) else ; m=(p+q)/2; fm=val_pol(n,a,m); } printf('Radacina este: %f',m); } } 7. Functii care returneaza pointeri. Pointerii sunt adrese de memorie ale anumitor tipuri de date. Deoarece fiecare tip de date are o anumita lungime si aritmetica pointerilor se bazeaza pe tipul de date catre care indica acestia, trebuie cunoscut tipul de date catre care indica un pointer. Din acest motiv, pentru o functie care returneaza un pointer, trebuie sa se declare explicit tipul acestuia . Forma generala de declarare a unei astfel de functii este urmatoarea: tip_rezultat *nume_functie ( lista_tip_parametrii ); De exemplu, programul Functie care returneaza pointer utilizeaza finctia *cauta_nr() care returneaza un pointer de tip float care este adresa elementului unui sir, daca acesta coincide cu o valoare cautata x, sau valoarea NULL, in caz contrar. /* Functie care returneaza pointer */ #include <stdio.h> #include <conio.h> float cit_nr(char c); void cit_sir(char c, int n, float *p); float *cauta_nr(int n, float *p, float x); void afis_sir(int n, float *p); void main() float cit_nr(char c) void cit_sir(char c, int n, float *p) } float *cauta_nr(int n, float *p, float x) void afis_sir(int n, float *p)
|