Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
Descărcați ca doc, pdf sau txt
Sunteți pe pagina 1din 10
Functii în limbajul C
Obiectiv: stabilirea avantajelor pe care le aduce în
programarea structurata folosirea functiilor. Activitati: - Prezentarea functiilor definite de utilizator - Descrierea parametrilor formali si a parametrilor actuali - Transmiterea parametrilor prin valoare si transmiterea prin adresa (referinta)
1 Prezentarea functiilor definite de utilizator
O functie reprezinta o secventa de instructiuni care poate fi
identificata si apelata prin intermediul unui nume.
Functiile sunt un element foarte important în orice limbaj de
programare, deoarece usureaza foarte mult munca programatorului, eliminând necesitatea scrierii aceluiasi cod de mai multe ori. De asemenea, prin folosirea functiilor programele pot fi structurate în blocuri, implicând o mai buna depanare si modularizare a programelor respective.
Utilizarea unei functii presupune doua elemente distincte:
- definirea functiei; - apelul functiei;
Definirea unei functii reprezinta precizarea tipului returnat de
functia respectiva, a argumentelor functiei si a tipurilor acestora si scrierea corpului functiei (instructiunile care vor fi executate când va fi apelata functia).
Forma generala a unei functii este urmatoarea:
tip_returnat nume_functie (tip_date1 arg1, tip_date2 arg2, ..., tip_dateN argN ); { ... corpul_functiei; ... } Exemplu de definire de functie care returneaza o valoare de tip întreg: int calcul (int a, int b) { int c; c = a + b; return c; // valoarea returnata de functie } Exemplu de functie care nu primeste nici un (argument) si nu returneaza nimic: void afisare (void) // sau void afisare () { printf (“Functie care nu returneaza nici o valoare...”; }
Apelarea unei functii consta în folosirea propriu-zisa a functiei,
într-o alta functie. Apelarea se poate face atât în functia principala (main), cât si într-o alta functie.
Returnarea unei valori de catre o functie se face folosind
instructiunea return înainte de încheierea functiei respective. De asemenea, instructiunea return se poate folosi si pentru încheierea fortata a executiei unei functii. O functie poate returna orice valoare dintr-un tip de baza, cu exceptia unui tablou. Daca functia nu returneaza nici o valoare, atunci se considera ca returneaza void (tipul vid). Atenie! daca nu se specifica nimic la tipul returnat de functie, compilatorul C considera ca functia respectiva returneaza o valoare de tip întreg (va fi semnalat un avertisment (warning) – Function should return a value) Exemplu: definirea si apelarea unei functii care returneaza o valoare întreaga: 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 functiei printf (“Rezultatul este %d”, x); } Exemplu: definirea si apelarea unei functii care nu retuneaza nici o valoare: void afisare (void) { printf (“Functie care nu returneaza nici o valoare...”); } int main (void) { int x, y, z; afisare (); // apelarea functiei return 0; } Înainte de a fi folosita, o functie poate fi declarata. Declararea (precizarea prototiplui) unei functii este necesara doar daca functia respectiva este declarata (în program) dupa ce a fost declarata functia main (), sau daca se foloseste o functie într-o alta functie, înainte ca prima sa fie declarata. Declararea (prototipul) functiei afisare () definita anterior este urmatorul: void afisare (void);
2 Parametrii locali, parametrii formali si parametrii
actuali
În utilizarea functiilor se pot deosebi doua tipuri de parametri,
în functie de specificul lor: - parametrii formali; - parametrii actuali; Variabilele care sunt declarate în interiorul unei functii se numesc variabile locale si sunt accesibile doar în interiorul functiei respective. Valorile retinute în acesti parametrii se pierd odata cu iesirea din blocul respectiv. Exemplu: functie pentru calculul minimului dintr-un sir de numere: 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: functie pentru cautarea pozitiei unui numar într-un sir 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 definita o functie sunt numiti parametrii formali. Dupa ce a fost definita functia, parametrii formali pot fi folositi în functia respectiva ca si variabile locale obisnuite. Ei sunt numiti “formali” deoarece functia nu va fi apelata cu parametrii respectivi, ci cu parametrii de tipurile respective (ei sunt precizati pentru a se cunoaste prototipul functiei respective). Parametrii actuali sunt parametrii cu care se apeleaza propriu- zis o functie. În exemplul urmator se pot observa cele doua tipuri de parametrii: float medie (int a, int b) // a, b parametrii formali { float c; // c – variabila locala c = (a + b) / 2; return c; } int main (void) { int y, z; // x, y, z variabile locale float x; x = calcul (y, z);// y, z parametrii actuali printf (“Rezultatul este %f”, x); return 0; } 3 Transmiterea parametrilor prin valoare, transmiterea prin adresa În general, este necesara transmiterea valorilor calculate într-o functie, pentru a putea fi folosite într-o alta functie. Transmiterea valorilor se poate face în doua moduri: - prin valoare; - prin adresa; 3.1 Transmiterea parametrilor prin valoare Transmiterea parametrilor prin valoare consta în copierea valorii unui argument într-un parametru formal al unei functii. În cazul transmiterii prin valoare, modificarile efectuate asupra parametrului formal NU au efect asupra argumentului functiei. Transmiterea parametrilor prin valoare este cea mai folosita metoda 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 functie reprezinta o exceptie de la regula de transmitere prin valoare a parametrilor. Daca se foloseste o matrice ca si argument al unei functii, atunci functiei respective i se transmite adresa matricei respective (adresa primului element al matricei), iar functia respectiva poate actiona asupra continutului matricei respective. Exemplu de transformare a unui sir 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); // apelarea functiei return 0; } Exemplu de program care realizeaza citirea unei matrice de numere întregi: #include <stdio.h> int citire (int tablou[]) /* functia are ca parametru tabloul de numere întregi care este initial gol elementele tabloului se pastreaza si la parasirea functiei functia returneaza numarul 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); /* apelarea functiei de citire a tabloului de numere întregi */ return 0; } 3.2 Transmiterea parametrilor prin adresa În limbajul C exista si instrumente prin care se poate simula un transfer prin referinta. Pentru atransfera un obiect V ca parametru prin referinta, se transfera un pointer catre V; parametrul formal vafi un pointer catre valoarea obiectului V. Transmiterea parametrilor prin referinta consta în copierea adresei unui argument într-un parametru. În functia în care se face apelarea, este folosita adresa respectiva pentru accesarea argumentului folosit efectiv la apelare. În transmiterea prin adresa, modificarile efectuate asupra unui parametru formal afecteaza argumentul cu care se face apelarea functiei (parametrul actual). Pentru a folosi transmiterea prin referinta, argumentele functiei trebuie declarate ca pointeri. Exemplu – interschimbarea a doua numere: void interschimba (int *a, int *b) //transmit prin adresa { int c; c = *a; *a = *b; *b = c; } int main (void) { int *x, *y; // parametrii locali pointeri int z, w; // parametrii locali x = &z; // z si w sunt folosite pentru y = &w; // initializarea celor doi pointeri printf ("Introd. valoarea primului numar: "); scanf ("%d", x); printf ("Introd. valoarea pentru al doilea numar: "); scanf ("%d", y); interschimba (x, y); // apelarea functiei interschimba (&z, &w); // apel recomandat al functiei printf ("Nr. interschimbate sunt %d si %d", *x, *y); getch (); return 0; } 4 Probleme rezolvate Exemplu 1 - modificarea unui numar întreg, transmis prin adresa, într-o functie: #include <stdio.h> void incrementare_numar (int *nr) { (*nr)++; } int main (void) { int n=0; incrementare_numar (&n); printf (“Numarul este: %d”, n); return 0; } Exemplu 2 - definirea si folosirea unei functii care citeste un sir de caractere si îl returneaza: #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 si folosirea unei functii care citeste si returneaza o data calendaristica. #include <stdio.h> #include <string.h> void citire_data (int *zi, int *luna, int *an) { printf (“Introduceti ziua: “); scanf (“%d”, zi); printf (“Introduceti luna: “); 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; //initializarea pointerilor citire_data (a, b, c); printf (“Data citita este: %d %d %d”, *a, *b, *c); return 0; } 5. Probleme propuse 1. Sa se realizeze un program care, folosind un meniu, sa calculeze ariile mai multor figuri geometrice, fiecare arie fiind calculata folosind câte o functie. 2. Sa se realizeze un program care sa rezolve o ecuatie de gradul 2 cu coeficientii cititi de la tastatura, folosind o functie care sa returneze doua valori - radacinile, si sa precizeze daca are sau nu radacini reale). 3. Sa se realizeze un program care sa determine daca un numar citit de la tastatura este prim, utilizând o functie definita de utilizator. 4. Sa se scrie un program care determina toate numerele prime mai mici sau egale cu un numar N dat de la tastatura. 5. Sa se scrie un program în C care sa permita prin intermediul unui meniu interactiv urmatoarele actiuni: - Introducere numar în tabloul de numere (toate numerele din tablou trebuie sa fie diferite) - Afisare numere - Sterge un numar din tablou - Iesire 6. Sa se scrie un program în C care sa permita prin intermediul unui meniu interactiv urmatoarele actiuni: - Adaugare elev (elevul este identificat prin nume) - Afisare elevi - Cautare dupa nume - Sortare alfabetica dupa nume - Iesire