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

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