Sunteți pe pagina 1din 22

Funcii definite n program

Bazele definirii i utilizrii funciilor


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);
}

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