Exist trei mari avantaje ale utilizrii funciilor definite n program: 1) mprirea unor sarcini de calcul ample n altele mai mici, ceea ce conduce la scrierea mai simpl a programului n ansamblu; 2) reutilizarea unui cod deja scris sub form de funcii pentru programe anterioare(ex. funciile de bibliotec). 3) eliminarea repetarii secventelor de cod prin factorizarea acestora in functii separate Limbajul C a fost special conceput s permit utilizarea simpl i eficient a funciilor; programele C sunt, n general, formate din multe funcii mici i nu din cteva funcii mari. Funcii definite n program Exemple de programe /*Calculul valorii unei functii, intr-un punct #include <stdio.h> #include <math.h> float f(float x) { if (x <=-1) return x*x; if (x <=1) return x+3; return atan(x); } f(x) =|x^2, x <=-1 |x+3, -1 <x <=1 |arctg(x), x >1 Funcii definite n program Exemple de programe void main() { float v; printf("Calculul valorii unei functii pentru "); printf("un argument citit de la tastatura \n"); printf(Introduceti valoarea argumentului:"); scanf("%f",&v); printf("Valoarea functiei in punctul %.2f este %.2f \n", v, f(v)); } Funcii definite n program Bazele definirii i utilizrii funciilor Fiecare definiie de funcie are forma tip-rezultat nume-functie(declaratii-de-parametri) { declaratii si instructiuni } tip-rezultat esteoricetip de variabila(int, float, char, etc) void (vid, nimic) inseamnaca functianu returneaza niciovaloare(dar ea totusi realizeazao sarcinautila) functiileNU pot returnavectori ( int[] formare(int n) ) Funcii definite n program Bazele definirii i utilizrii funciilor declaratii-de-parametri se definescla fel ca in cazul variabilelor (tip nume) mai multi parametri se separaprinvirgula(,) fiecareparametrutrebuiesaaibadeclarat propriul sau tip, chiar dacamai multi parametri alaturati au acelasi tip (void afisare(int a, int b) ; void afisare(int a, b) ) Exemplede declaratii de functii: float calculMarire(float salariu, float spor); float medie(float nota1, float nota2, float nota3); void afisareInterval(intxMin, int xMax); int citesteNr(); Funcii definite n program Bazele definirii i utilizrii funciilor return expresie; returneazao valoarecare devinevaloarearezultantaa functiei incheieexecutiafunctiei si rezumaexecutia programului de la punctul de apel al functiei in cazul functiilor void expresie lipseste, deoarece acesteanu returneazaniciovaloaredar totusi pot fi intreruptesi eleoricand( return; ) expresiareturnatatrebuiesafie de tipul functiei, saude un tip convertibil implicit la acesta dacareturn lipseste, functiase vaterminala acolada finala(rezultandvalori necunoscutela tipurilenon-void) Funcii definite n program Exemple de functii int citireNr() { int a; printf(introduceti numarul: ); scanf(%d,&a); return a; } void afisareNr(int n) { printf(numarul este: %d\n, n); } Funcii definite n program Bazele definirii i utilizrii funciilor functiile nu pot fi declarate in interiorul altor functii, ci ele trebuie sa urmeze una dupa cealalta la fel ca in cazul variabilelor, functiile trebuie definite INAINTE de a fi folosite in C nu pot exista doua functii cu acelasi nume (este permis in C++, in anumite conditii) daca tipul de return al unei functii lipseste, se considera implicit ca fiind int, dar este considerat ca fiind un stil recomandat de programare sa se specifice explicit tipul o greseala frecventa este returnarea unor valori doar pe unele ramuri de executie, de exemplu la if dar nu la else Funcii definite n program Transfer de argumente prin valoare void setMax(int max, int a, int b) { if(a>b)max=a; else max=b; } transferul variabilelor simple catre argumentele functiilor se face COPIINDU-SE valoarea variabilelor in noi locatii de memorie. Din acest motiv, orice operatie executata asupra argumentelor unei functii in cadrul acelei functii, va fi locala doar functiei, fara sa afecteze in niciun fel originalul void main() { int x=7,y=10,m; setMax(m,x,y); //m este neinitializat //=> o val. aleatorie printf(%d,m); } Funcii definite n program Variabile locale variabileledefinite in interiorul unei functii se numesc LOCALE acelei functii au duratade viataegalacu durataunui apel al functiei si la sfarsitul executiei functiei dispar din memorie NU sunt initializatecu niciovaloare, deci trebuie initializateinaintede a fi folosite sunt vizibiledoar din interiorul acelei functii void stelute(intn) { int i; //variabilalocala for(i=1;i<=n;i++) printf(*); printf(\n); } Funcii definite n program Variabile globale variabileledefinite in exteriorul functiilor se numesc variabileGLOBALE au duratade viataegalacu duratade executiea programului, deci isi pastreazanealteratavaloareapanala o nouamodificarea ei sunt initializateimplicit de compilator cu 0 sunt vizibiledin toatefunctiile int suma; //variabilaglobala void acumulare(int n) { suma+=n; } Funcii definite n program Bazele definirii i utilizrii funciilor comunicarea intre functii se face prin parametri, valori retunate si variabile globale o functie care pe langa valoarea returnata mai modifica si alte componente ale programului (de ex: variabile globale), se spune ca are efecte colaterale (side effects). Programele care au multe functii cu efecte colaterale sunt in general greu de urmarit deoarece executia unei functii poate sa influenteze prin efectele sale colaterale executiile altor functii. Din acest motiv este bine ca numarul variabilelor globale sa fie redus al minim apelurile de functii pot sa apara oriunde unde este permisa o expresie si rezultatul apelului devine valoarea returnata de functie Exemplu: S se determine maximul dintre trei numere ntregi, utiliznd o funcie care determin maximul dintre dou numere ntregi. Funcii definite n program Bazele definirii i utilizrii funciilor #include <stdio.h> int max (int a, int b) { if (a > b)return a; return b; } void main( ) { int x, y, z; printf(Introduceti 3 numere intregi\n); scanf(%d%d%d, &x, &y, &z); printf(Maximul este %d\n, max( x, max( y, z))); } Funcii definite n program Operatorul conditional deoarece returnarea unei valori in functie de o conditie este foarte des intalnita, exista un operator special care realizeaza aceasta: conditie ? val_true : val_false din cauza ca ?: este un OPERATOR, el poate fi folosit in interiorul expresiilor, ceea ce nu este posibil pentru if return a>b?a:b; int min=a<b ? (a<c?a:c) : (b<c?b:c) ; Funcii definite n program Vectorii ca argumente pentru functii deoarece vectorii nu isi stiu numarul de valori, de obicei cand se paseaza un vector unei functii se mai paseaza inca un argument, care reprezinta numarul de elemente din vector float medie(float note[], int n) { int i; float s=0; for(i=0;i<n;i++) s+=note[i]; return s/n; } cand un vector este pasat ca argument, nu se specifica numarul elementelor sale Funcii definite n program Vectorii ca argumente pentru functii spre deosebire de transferul ca argumente al variabilelor simple (care se face prin copii), transferul vectorilor se face IN ORIGINAL. Din acest motiv, orice modificare facuta in functie asupra vectorului va modifica originalul cand este pasat ca argument, un vector se poate scrie si sub forma: int *v Funcii definite n program Vectorii ca argumente pentru functii int sterge(int *v, int n, int k) { int i; for(i=0;i<n;i++) if(v[i]==k){ v[i]=v[n-1]; n--; i--; } return n; } void main() { int a[]={4,9,5,5,3,1,7,5}; int i,n=8; n=sterge(a,n,5); for(i=0;i<n;i++) printf(%d ,a[i]); //4 9 7 1 3 } modificarile facute de functia sterge in vectorul a au fost vizibile in original. n-ul din sterge, din cauza ca a fost modificat doar in copie, nu ar fi fost reflectat in n-ul din main. Din acest motiv, el a fost returnat de functie si a fost folosit pentru a actualiza n-ul original Funcii definite n program Funcii ce returneaz altfel de valori dect ntregi Exemplul 1: S se scrie o funcie putere care calculeaz baza exponent , unde exponent este un numr natural. #include <stdio.h> float putere (float baza, int exponent) { float p; int i; if (exponent == 0) return 1.0; for (i = 1, p = 1.0; i <= exponent; i++) p *= baza; return p; } Funcii definite n program Funcii ce returneaz altfel de valori dect ntregi main() { int e; float b, p; printf(Introduceti baza si exponentul \n); scanf(%f%d, &b, &e); p = putere(b, e); printf(%f la puterea %d = %f\n, b, e, p); printf(5 la puterea 3 = %f\n, putere(5, 3)); printf((2 la 3) la 2 = %f\n, putere(putere(2, 3), 2)); } Funcii definite n program Exemple de programe Algoritmul lui Euclid de aflare a celui mai mare divizor comun a dou nr. ntregi Formularea n cuvinte a algoritmului este urmtoarea: Dac unul dintre numere este zero, c.m.m.d.c. al lor este cellalt numr. Dac nici unul dintre numere nu este zero, atunci c.m.m.d.c. nu se modific dac se nlocuiete unul dintre numere cu restul mpririi sale cu cellalt. Funcii definite n program Exemple de programe /*determinarea cmmdc pentru doua numereintregi*/ #include <stdio.h> int cmmdc(int m, int n) { int r; r=m % n; while (r != 0) { m=n; n=r; r=m % n; } return n; } Funcii definite n program Exemple de programe void main() { int n1,n2,divizor; printf("Calculul cmmdc si cmmmc cu alg. lui Euclid\n"); printf("Numerele sunt:\n"); printf(n1 = "); scanf("%d",&n1); printf(n2 = "); scanf("%d",&n2); divizor=cmmdc(n1,n2); printf("CMMDC = %d\n",divizor); printf("CMMMC = %d\n",(n1*n2)/ divizor); }