Sunteți pe pagina 1din 7

Capitolul 8 Funcii n limbajul C

Obiectiv: stabilirea avantajelor pe care le aduce n programarea structurat folosirea funciilor. Activiti: Prezentarea funciilor definite de utilizator Descrierea parametrilor formali i a parametrilor actuali Transmiterea parametrilor prin valoare i transmiterea prin adres (referin)

8.1 Prezentarea funciilor definite de utilizator


O funcie reprezint o secven de instruciuni care poate fi identificat i apelat prin intermediul unui nume. Funciile sunt un element foarte important n orice limbaj de programare, deoarece uureaz foarte mult munca programatorului, eliminnd necesitatea scrierii aceluiai cod de mai multe ori. De asemenea, prin folosirea funciilor programele pot fi structurate n blocuri, implicnd o mai bun depanare i modularizare a programelor respective. Utilizarea unei funcii presupune dou elemente distincte: - definirea funciei; - apelul funciei; Definirea unei funcii reprezint precizarea tipului returnat de funcia respectiv, a argumentelor funciei i a tipurilor acestora i scrierea corpului funciei (instruciunile care vor fi executate cnd va fi apelat funcia). Forma general a unei funcii este urmtoarea: tip_returnat nume_functie (tip_date1 tip_dateN argN ); { . . . corpul_functiei; . . . } arg1, tip_date2 arg2, ...,

Exemplu de definire de funcie care returneaz o valoare de tip ntreg: int calcul (int a, int b) { int c; c = a + b; return c; } Exemplu de funcie care nu primete nici un (argument) i nu returneaz nimic: void afisare (void) // sau void afisare () { printf (Functie care nu returneaz nici o valoare...; } Apelarea unei funcii const n folosirea propriu-zis a funciei, ntr-o alt funcie. Apelarea se poate face att n funcia principal (main), ct i ntr-o alt funcie.

// valoarea returnat de funcie

Programarea Calculatoarelor

Capitolul 8 Funcii n limbajul C

Returnarea unei valori de ctre o funcie se face folosind instruciunea return nainte de ncheierea funciei respective. De asemenea, instruciunea return se poate folosi i pentru ncheierea forat a execuiei unei funcii. O funcie poate returna orice valoare dintr-un tip de baz, cu excepia unui tablou. Dac funcia nu returneaz nici o valoare, atunci se consider c returneaz void (tipul vid). Atenie! dac nu se specific nimic la tipul returnat de funcie, compilatorul C consider c funcia respectiv returneaz o valoare de tip ntreg (va fi semnalat un avertisment (warning) Function should return a value) Exemplu: definirea i apelarea unei funcii care returneaz o valoare ntreag: int calcul (int a, int b) { int c; c = a + b; return c; } void main (void) { int x, y, z; x = calcul (y, z); // apelarea funciei

printf (Rezultatul este %d, x); } Exemplu: definirea i apelarea unei funcii care nu retuneaz nici o valoare: void afisare (void) { printf (Functie care nu returneaz nici o valoare...); } int main (void) { int x, y, z; afisare (); return 0; } nainte de a fi folosit, o funcie poate fi declarat. Declararea (precizarea prototiplui) unei funcii este necesar doar dac funcia respectiv este declarat (n program) dup ce a fost declarat funcia main (), sau dac se folosete o funcie ntr-o alt funcie, nainte ca prima s fie declarat. Declararea (prototipul) funciei afisare () definit anterior este urmtorul: void afisare (void); // apelarea funciei

8.2 Parametrii locali, parametrii formali i parametrii actuali


n utilizarea funciilor se pot deosebi dou tipuri de parametri, n funcie de specificul lor: parametrii formali; parametrii actuali; Variabilele care sunt declarate n interiorul unei funcii se numesc variabile locale i sunt accesibile doar n interiorul funciei respective. Valorile reinute n aceti parametrii se pierd odat cu ieirea din blocul respectiv. Exemplu: funcie pentru calculul minimului dintr-un ir de numere:

Programarea Calculatoarelor

Capitolul 8 Funcii n limbajul C

int getmin (int n, int a[]) { int min, i; // min, i - variabile locale min = a[0]; for (i = 1; i < n; i++) if (min > a[i]) min = a[i]; return min; } Exemplu: funcie pentru cutarea poziiei unui numr ntr-un ir de numere ntregi: int poz (int n, int a[], int nr_cautat) { int poz, i; for (i = 0; i < n; i++) if (nr_cautat == a[i]) { poz = i; } return poz; } Argumentele (parametrii) cu care este definit o funcie sunt numii parametrii formali. Dup ce a fost definit funcia, parametrii formali pot fi folosii n funcia respectiv ca i variabile locale obinuite. Ei sunt numii formali deoarece funcia nu va fi apelat cu parametrii respectivi, ci cu parametrii de tipurile respective (ei sunt precizai pentru a se cunoate prototipul funciei respective). Parametrii actuali sunt parametrii cu care se apeleaz propriu-zis o funcie. n exemplul urmtor se pot observa cele dou tipuri de parametrii: float medie (int a, int b) // a, b - parametrii formali { float c; // c variabil local c = (a + b) / 2; return c; } int main (void) { int y, z; float x;

// x, y, z - variabile locale

x = calcul (y, z);// y, z - parametrii actuali printf (Rezultatul este %f, x); return 0; }

8.3 Transmiterea parametrilor prin valoare, transmiterea prin adres


n general, este necesar transmiterea valorilor calculate ntr-o funcie, pentru a putea fi folosite ntr-o alt funcie. Transmiterea valorilor se poate face n dou moduri: - prin valoare; - prin adres;

Programarea Calculatoarelor

Capitolul 8 Funcii n limbajul C

8.3.1

Transmiterea parametrilor prin valoare

Transmiterea parametrilor prin valoare const n copierea valorii unui argument ntr-un parametru formal al unei funcii. n cazul transmiterii prin valoare, modificrile efectuate asupra parametrului formal NU au efect asupra argumentului funciei. Transmiterea parametrilor prin valoare este cea mai folosit metod de transfer din limbajul C. Exemplu: float medie (int a, int b) { float c; c = (a + b) / 2; return c; } int main (void) { int y, z; float x; x = calcul (y, z); printf (Rezultatul este %f, x); return 0; } Transmiterea matricelor ca argumente pentru o funcie reprezint o excepie de la regula de transmitere prin valoare a parametrilor. Dac se folosete o matrice ca i argument al unei funcii, atunci funciei respective i se transmite adresa matricei respective (adresa primului element al matricei), iar funcia respectiv poate aciona asupra coninutului matricei respective. Exemplu de transformare a unui ir de caractere n majuscule: void majuscule (char *sir) { int i; for (i = 0; sir[i]; i++) { sir[i] = toupper (sir[i]); printf (%c, sir[i]); } } int main (void) { char sir1[50]; gets(sir1); majuscule (sir1); return 0; } Exemplu de program care realizeaz citirea unei matrice de numere ntregi: #include <stdio.h> int citire (int tablou[]) /* funcia are ca parametru tabloul de numere ntregi care este iniial gol // apelarea funciei

Programarea Calculatoarelor

Capitolul 8 Funcii n limbajul C

- elementele tabloului se pstreaz i la prsirea funciei - funcia returneaz numrul de numere ntregi introduse n tablou */ { int i, nr; printf ("Numarul de elemente al tabloului:"); scanf("%d", &nr); for (i=0;i<nr;i++) { printf("Dati elementul %d >",i); scanf ("%d", &tablou[i]); } return nr; } int main(void) { int n; int tab[20]; n=citire(tab); return 0; }

/* apelarea funciei de citire a tabloului de numere ntregi */

8.3.2

Transmiterea parametrilor prin adres

n limbajul C exist i instrumente prin care se poate simula un transfer prin referin. Pentru a transfera un obiect V ca parametru prin referin, se transfer un pointer ctre V; parametrul formal va fi un pointer ctre valoarea obiectului V. Transmiterea parametrilor prin referin const n copierea adresei unui argument ntr-un parametru. n funcia n care se face apelarea, este folosit adresa respectiv pentru accesarea argumentului folosit efectiv la apelare. n transmiterea prin adres, modificrile efectuate asupra unui parametru formal afecteaz argumentul cu care se face apelarea funciei (parametrul actual). Pentru a folosi transmiterea prin referin, argumentele funciei trebuie declarate ca pointeri. Exemplu interschimbarea a dou numere: void interschimba (int *a, int *b) //transmit prin adres { int c; c = *a; *a = *b; *b = c; } int main (void) { int *x, *y; int z, w; x = &z; y = &w;

// parametrii locali - pointeri // parametrii locali // z i w sunt folosite pentru // iniializarea celor doi pointeri

printf ("Introd. valoarea primului numar: "); scanf ("%d", x);

Programarea Calculatoarelor

Capitolul 8 Funcii n limbajul C

printf ("Introd. valoarea pentru al doilea numar: "); scanf ("%d", y); interschimba (x, y); // apelarea funciei interschimba (&z, &w); // apel recomandat al funciei printf ("Nr. interschimbate sunt %d si %d", *x, *y); getch (); return 0; }

8.4 Probleme rezolvate


Exemplu 1 - modificarea unui numr ntreg, transmis prin adres, ntr-o funcie: #include <stdio.h> void incrementare_numr (int *nr) { (*nr)++; } int main (void) { int n=0; incrementare_numr (&n); printf (Numarul este: %d, n); return 0; } Exemplu 2 - definirea i folosirea unei funcii care citete un ir de caractere i l returneaz: #include <stdio.h> void citire_sir (char *sir) { gets (sir); } int main (void) { char sir1[50]; citire_sir (sir1); printf (Sirul introdus este: %s, sir1); return 0; } Exemplu 3 - declararea i folosirea unei funcii care citete i returneaz o dat calendaristic. #include <stdio.h> #include <string.h> void citire_data (int *zi, int *luna, int *an) { printf (Introduceti ziua: ); scanf (%d, zi); printf (Introduceti luna: );

Programarea Calculatoarelor

Capitolul 8 Funcii n limbajul C

scanf (%d, luna); printf (Introduceti anul: ); scanf (%d, an); } int main (void) { int *a, *b, *c; int x, y, z; a = &x; b = &y; c = &z; //iniializarea pointerilor citire_data (a, b, c); printf (Data citita este: %d %d %d, *a, *b, *c); return 0; }

8.5 Probleme propuse


1. 2. 3. 4. 5. S se realizeze un program care, folosind un meniu, s calculeze ariile mai multor figuri geometrice, fiecare arie fiind calculat folosind cte o funcie. S se realizeze un program care s rezolve o ecuaie de gradul 2 cu coeficienii citii de la tastatur, folosind o funcie care s returneze dou valori - rdcinile, i s precizeze dac are sau nu rdcini reale). S se realizeze un program care s determine dac un numr citit de la tastatur este prim, utiliznd o funcie definit de utilizator. S se scrie un program care determin toate numerele prime mai mici sau egale cu un numr N dat de la tastatur. S se scrie un program n C care s permit prin intermediul unui meniu interactiv urmtoarele aciuni: - Introducere numr n tabloul de numere (toate numerele din tablou trebuie s fie diferite) - Afiare numere - terge un numr din tablou - Ieire S se scrie un program n C care s permit prin intermediul unui meniu interactiv urmtoarele aciuni: - Adugare elev (elevul este identificat prin nume) - Afiare elevi - Cutare dup nume - Sortare alfabetic dup nume - Ieire

6.

S-ar putea să vă placă și