Sunteți pe pagina 1din 11

MODULUL 4

Functii

In acest modul sunt prezentate pe parcursul unei lectii notiunea majora a


programarii structurate: functiile.

La sfarsitul parcurgerii acestui modul studentul va trebui


ƒ sa stie cum se apeleaza functiile predefinite in bibliotecile standard
ƒ sa poata implementa functii simple
ƒ sa inteleaga cum sunt transferati parametrii unei functii
ƒ sa inteleaga cum sunt returnate valorile unei functii
ƒ sa inteleaga diferenta dintre variabile locale si variabile globale si sa poata
identifica cele doua tipuri de variabila

Organizarea materialului este următoarea:


ƒ prezentarea notiunilor teoretice de mai sus si a unui numar de exemple de
programe sau secvente de programe care puncteaza caracteristicile importante
ale notiunilor introduse si care faciliteaza o intelegere mai rapida a
materialului inclus.
ƒ o serie de exercitii (pe langa cele incluse la sfirsitul fiecarui modul) cu intentia
ca ele sa fie rezolvate in timp ce materialul teoretic este parcurs.
ƒ o lista de exercitii si probleme de programare care testeaza cunoasterea
notiunilor introduse de catre student. Mentionam ca aceste probleme nu sunt
ordonate dupa gradul lor de dificultate.
ƒ bibliografie recomandata

Recomandam parcurgerea materialului in ordinea sa fireasca. De asemenea, va


recomandam ca atunci cand parcurgeti materialul sa rulati atat exemplele de programe
prezentate cat si scurte programe, scrise de dvs, similare celor date in exemple. Pentru
a invata un limbaj de programare cel mai bine este sa programezi direct in acel limbaj.

Timpul mediu necesar parcurgerii şi însuşirii noţiunilor teoretice, formării


deprinderilor practice de rezolvare şi dobândirii competenţelor anunţate este de
aproximativ 6-8 ore de studiu pentru acesta lecţie.
Lectia 1
Un program este gandit ca fiind constituit din mai multe parti ca de exemplu, o
parte pentru prelucrarea datelor de intrare, o parte pentru efectuarea calculelor sau a
altor operatii asupra datelor, o parte pentru afisarea rezultatelor. C, ca cele mai multe
limbaje de programare prezinta facilitati prin care fiecare parte poate fi scrisa separat
de celelalte parti. In C aceste parti se numesc functii. Daca ati auzit de termenii
procedura, subprogram sau metoda, ei inseamna de fapt acelasi lucru ca si termenul
de functie.
In C o functie poate returna o valoare sau poate sa efectueze o actiune fara sa
returneze o valoare. Inainte de a invata cum sa scrieti o functie sa vedem mai intai
cum puteti folosi functiile deja scrise (predefinite).

1.1 Functii predefinite

C are cateva biblioteci de programe care contin functii predefinite ce pot fi


folosite in alte programe. Ati vazut deja cum se pot apela functiile scanf si printf ce
apartin bibliotecii stdio.h. Pentru functiile matematice exista o biblioteca numita
math.h.

Exista, de exemplu, o functie sqrt care calculeaza radacina patrata a unui numar dat.

9.0 sqrt 3.0


in math.h
argument valoare returnata
de tip double de tip double
Functia abs calculeaza valoarea absoluta a unui intreg dat.

-4 abs 4 in stdlib.h
argument valoare returnata
de tip int de tip int

rand intoarce un intreg generat aleator intre 0 si RAND_MAX

rand 11 in stdlib.h
fara valoare returnata
argumente de tip int

Functia trigonometrica sin:

x sin sin x in math.h


argument valoare returnata
de tip double de tip double
reprezinta unghiul in radiani
Exemple:

1) exemplu1.C
#include<math.h>
#include<stdio.h>

main( ) 2.000000 1.414214


va afisa
{
double x = 4.0, y = 2.0;
double z1, z2;
z1 = sqrt(x);
z2 = sqrt(y);
printf("%f %f\n", z1, z2);
}

2) exemplu2.C

#include<math.h>
#include<stdio.h>
va afisa 1.000000
const double pi = 3.1415926535;
main( )
{
double x = pi/2;
double y = sin(x);
printf("%f\n",y);
}

3) exemplu3.C

#include<stdlib.h>
#include<stdio.h> |x|=1
va afisa
|y|=4
main( )
{
int x=1, y=-4;
printf("|x|=%d\n", abs(x));
printf("|y|=%d\n", abs(y));
}

4) exemplu4.C
#include<stdlib.h>
#include<stdio.h>

main( )
{ tipareste zece numere intregi generate
int i; aleator.
for(i = 1; i <=1 0; i ++)
printf("%d\n", rand( ));
}

Exercitiu: Scrieti un program care sa genereze zece numere aleatoare intre 0 si 1 (cu
valorile 0 si 1 inclusiv).

Pentru a utiliza o functie predefinita trebuie sa stim:


ƒ numele functiei
ƒ tipul functiei (adica tipul valorii returnate sau void daca functia
• nu returneaza nimic)
ƒ numarul si tipul argumentelor ce se asteapta sa fie introduse (sau
ceea ce se numeste prototipul functiei.)
ƒ pachetul de programe din care face parte
ƒ semnificatia datelor de intrare ale functiei
ƒ semnificatia valorilor returnate
ƒ
Prototipul unei functii C este:
tip_functie nume_functie (tip_parametru1 nume_parametru1,
tip_parametru2 nume_parametru2, ...);

De exemplu, prototipurile functiilor de mai sus sunt:


double sqrt(double x);
double sin(double x);
int rand( );
int abs(int x);

1.2 Functii definite de utilizator

Pana acum am vazut cum putem folosi functii predefinite. Este randul nostru
sa scriem functii. Sa incepem cu un exemplu. Vrem sa scriem o functie care primeste
doua date de intrare de tip int, sa zicem m si n, si returneaza valoarea lui mn. O vom
numi functia putere. Prototipul acestei functii va fi deci:

int putere(int m, int n);

m si n se numesc parametrii functiei. Ei sunt variabile care vor prelua valoarea


argumentelor. Definitia acestei functii este:
int putere(int m, int n)
{
int i, p = 1;
for (i = 1; i <= n; i++)
p = p * m;
return p;
}

Deci definitia unei functii este cea care precizeaza instructiunile pe care calculatorul
trebuie sa le efectueze astfel incat functia saproduca rezultatul dorit. Aceste
instructiuni alcatuiesc corpul functiei. Corpul functiei poate contine orice instructiune
C.
O instructiune return are sintaxa:

return expresie;

si are ca efect evaluarea expresiei, terminarea executiei functiei cu valoarea returnata


fiind valoarea expresiei calculate. Uneori expresia se scrie intre paranteze dar acest
lucru nu este obligatoriu.
Definitiile functiilor pot aparea in orice ordine si intr-unul sau mai multe
fisiere. Definitiile functiilor pot aparea oriunde in program dar nu putem defini o
functie in interiorul definitiei altei functii.
O functie poate fi apelata de catre alta functie cu conditia ca functia apelata sa
fie definita sau cel putin declarata inainte de definitia functiei apelante sau, pe scurt, o
functie nu poate fi apelata inainte de a fi declarata. Deci putem avea unul din cele
doua cazuri:

prototipul functiei g definitia tip g ( lista param)


functiei g {
tip f ( lista param) …
definitia { }
functiei f …

g(lista argumente) tip f ( lista param)


definitia {
… functiei f …
}
g(lista argumente)
definitia tip g ( lista param)
functiei g { …
… }
}

Prezentam intregul program care va calcula toate puterile lui 2 pana la 210.
puteri.C
#include <stdio.h>

int putere(int m, int n); /* prototipul functiei */

main()
{
int i;
for(i=0; i<=10; i++)
printf("2^%d = %d\n", i, putere(2, i));
}

int putere(int m, int n)


{
int i,p = 1;
for(i=1;i<=n;i++)
p = p * m;
return p;
}

Observatie: m si n se numesc parametrii functiei putere si ei trebuie sa fie neaparat


variabile in timp ce 2 si i se numesc argumentele apelarii functiei power. Argumentul
unei functii poate fi orice expresie care se poate converti la tipul parametrului
corespunzator. Numarul si tipul argumentelor unei functii trebuie sa fie acelasi cu
numarul si tipul parametrilor.
Un aspect important al limbajului C este faptul ca argumentele unei functii
sunt transmise functiei prin valoare, aceasta insemnand ca parametrii functiei vor
prelua numai valorile argumentelor si deci o modificare a parametrilor in corpul
functiei nu duce la modificarea argumentelor.
De exemplu, programul urmator
testparamvaloare.C
#include <stdio.h>

int f(int a, int b)


{
a ++; 46
va afisa
b ++; 3 5 10
printf("%d %d\n", a, b);
return a + b;
}

main( )
{
int x = 3, y = 5;
int z = f(x,y);
printf("%d %d %d\n",x, y, z);
}
Si totusi uneori dorim ca o functie sa poata modifica valoarea unui argument.
Nu putem face asta in C? Rapunsul este pozitiv. Aceasta se poate face prin
intermediul pointerilor care vor fi studiati in capitolul 7.

1.3 Variabile locale, globale

Variabilele care sunt declarate in corpul functiei, precum si parametrii functiei


se numesc variabile locale deoarece ele sunt create in momentul apelarii functiei si
sunt distruse in momentul terminarii executiei functiei. Aceasta inseamna ca nu se
poate face nici o confuzie daca doua functii au definiti doi parametrii cu acelasi nume.
In exemplul de mai sus, a si b sunt variabile locale functiei f iar x, y, z locale functiei
main. Acelasi program poate fi scris cu functia f modificata.

int f(int x, int y)


{
x ++;
y ++;
printf("%d %d \n", x, y);
return x + y;
}

Cele doua programe sunt echivalente.


Chiar si constantele definite in interiorul unei functii sunt valabile numai in
acea functie. In urmatorul fragment de program TVA in functia f este o constanta
definita ca avand valoarea 19, iar in functia main este o constanta definita ca avand
valoarea 3.5. Nu este nici o confuzie.

int f(int c)
{
const int TVA = 19;
...
}
main( )
{
const double TVA = 3.5;
...
}

In C putem declara si variabile globale. Acestea se definesc in afara oricarei


functii si pot fi folosite de catre orice functie.
Exemplu:
globale.C

#include <stdio.h>

int suma = 0; /* variabila globala*/

void f(int x)
{
suma += x;
}
1
main() va afisa 4
{
6
int i;
for(i=1; i<=2; i++)
{
f(i);
printf("%d\n", suma);
suma += i;
}
printf("%d\n",suma);
}

In C se pot defini si constante globale care pot fi folosite de orice functie, dar evident
nu pot fi modificate de nici o functie. De exemplu programul urmator afiseaza aria si
lungimea cercului.
cerc2.C
#include <stdio.h>

const double PI =3.141593;

double aria(double raza)


{
return PI * raza * raza;
}
double lungime(double raza)
{
return 2 * PI * raza;
}
main ( )
{
double raza;
printf("raza cercului = ");
scanf("%lf", &raza);
printf("Aria cercului = %f \n", aria(raza));
printf("Lungimea cercului = %f \n", lungime(raza));
}
EXERCITII SI PROBLEME PROPUSE

1. Ce afiseaza programul urmator?

#include <stdio.h>
#include <math.h>

int f(int a, int b, int c)


{
c = c + 5;
a = (int) sqrt(a);
b ++;
printf( "%d %d %d\n", a, b, c);
return c < a + b;
}

main()
{
int a = 9, b = 16, c = 25;
if( f(a,b,c) )
{ printf( "true\n" );
printf("%d %d %d\n", a, b, c );
}
else
{ printf( "false\n" );
printf("%d %d %d\n", c ,b ,a );
}
a = 9; b = 16; c = 25;
if( f(b,c,a) )
{ printf( "true\n" );
printf("%d %d %d\n", b ,c ,a );
}
else
{ printf( "false\n" );
printf("%d %d %d\n", a ,c ,b );
}
a = 9; b = 16; c = 25;
if( f(a,b,b) )
{ printf( "true\n" );
printf("%d %d %d\n", c ,a ,b );
}
else
{ printf( "false\n" );
printf("%d %d %d\n", b ,a ,c );
}
}

2. Scrieti o functie maxmin care ii cere utilizatorului sa introduca n numere de la


tastatura si tipareste valoarea celui mai mare si a celui mai mic, atfel incat
secventa de program urmatoare sa compileze

#include <stdio.h>
// aici se scrie prototipul functiei maxmin

main()
{
int n, max, min;
scanf("%d", &n);
maxmin(n);
}
// aici se scrie definitia functiei maxmin

si daca utilizatorul introduce pe rand, 5 pentru valoarea lui n si apoi 0 -1 10 3


5 atunci programul afiseaza

Cel mai mare numar este 10 si cel mai mic –1.

Observatie: Nu folositi siruri.

3. Scrieti o functie care calculeaza suma cifrelor unui numar dat n. Includeti
functia intr-un program si testati-o.

4. O serie de studenti are 4 examene intr-un semestru. Pentru ca un student sa


treaca anul trebuie sa aiba o medie ≥ 6. Scrieti un program care citeste notele
studentului la cele 4 examene si afiseaza media studentului, precum si daca a
trecut sau nu. Pentru calcul mediei scrieti o functie. Programul trebuie sa
permita utilizatorului sa repete calculele de cate ori doreste.

5. Scrieti o functie care afiseaza un tabel pentru toti intregi n in intervalul


[n1, n2]. Pentru fiecare n in acest interval, n si n3 vor fi afisate. n1 si n2 sunt
introdusi de la tastatura. Includeti functia intr-un program si testati-o.

6. Scrieti o functie care evalueaza semnul unui intreg dat. Functia returneaza 1
daca intregul este > 0, 0 daca intregul este egal cu 0 si –1 daca intregul este
< 0. Includeti functia intr-un program si testati-o.

7. Un numar intreg pozitiv este perfect daca suma divizorilor sai mai mici decat
el (inclusiv 1) este egala cu numarul dat (de exemplu: 6 = 1 + 2 + 3, 28 = 1 + 2
+ 4 + 7 + 14). Scrieti o functie care returneaza 1 daca un numar intreg pozitiv
este perfect si 0 daca nu. Includeti functia intr-un program si testati-o.

8. Scrieti o functie pentru calculul lui xy unde x, y sunt numere reale. Folositi
formula xy = e yln x.

9. Scrieti o functie cmmdc care returneaza cel mai mic divizor comun a doi
intregi pozitivi m si n folosind algoritmul lui Euclid:
1) Imparte m la n. Fie r restul impartirii.
2) Daca r = 0 atunci STOP. Rezultatul este n.
3) Altfel, atribuie lui m si n valorile m = n, n = r. Reia pasul 1.
Scrieti un program care citeste un numar arbitrar de perechi de numere intregi
pozitive si scrie cmmdc al fiecarei perechi.

10. Folosind functia din problema 9, scrieti o functie care calculeaza cmmdc a trei
numere intregi pozitive. Generalizati pentru n numere intregi pozitive unde n
este introdus de la tastatura, iar cele n numere se citesc de la tastatura in
functia care trebuie scrisa.

Bibliografie recomandata:

1. Daniela Joita, Programare procedurala, Editura Universitatii Titu Maiorescu,


2008
2. Brian Kernighan si Denis Ritchie, "Limbajul C", Editura TEORA, 1998-2004
3. Clint Hicks, "Utilizare C", Editura TEORA, 1996
4. Manual electronic: Bruce Eckel, Thinking in C

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