Sunteți pe pagina 1din 7

Capitolul 8 – Funcţii în limbajul C

Obiectiv: stabilirea avantajelor pe care le aduce în programarea structurată folosirea funcţiilor.

Activităţi:
- Prezentarea funcţiilor definite de utilizator
- Descrierea parametrilor formali şi a parametrilor actuali
- Transmiterea parametrilor prin valoare şi transmiterea prin adresă (referinţă)

8.1 Prezentarea funcţiilor definite de utilizator


O funcţie reprezintă o secvenţă de instrucţiuni care poate fi identificată şi apelată prin
intermediul unui nume.
Funcţiile sunt un element foarte important în orice limbaj de programare, deoarece uşurează
foarte mult munca programatorului, eliminând necesitatea scrierii aceluiaşi cod de mai multe ori. De
asemenea, prin folosirea funcţiilor programele pot fi structurate în blocuri, implicând o mai bună
depanare şi modularizare a programelor respective.
Utilizarea unei funcţii presupune două elemente distincte:
- definirea funcţiei;
- apelul funcţiei;
Definirea unei funcţii reprezintă precizarea tipului returnat de funcţia respectivă, a argumentelor
funcţiei şi a tipurilor acestora şi scrierea corpului funcţiei (instrucţiunile care vor fi executate când va
fi apelată funcţia).
Forma generală a unei funcţii este următoarea:
tip_returnat nume_functie (tip_date1 arg1, tip_date2 arg2, ...,
tip_dateN argN );
{
. . .
corpul_functiei;
. . .
}
Exemplu de definire de funcţie care returnează o valoare de tip întreg:
int calcul (int a, int b)
{
int c;

c = a + b;
return c; // valoarea returnată de funcţie
}
Exemplu de funcţie care nu primeşte nici un (argument) şi nu returnează nimic:
void afisare (void) // sau void afisare ()
{
printf (“Functie care nu returnează nici o valoare...”;
}
Apelarea unei funcţii constă în folosirea propriu-zisă a funcţiei, într-o altă funcţie. Apelarea se
poate face atât în funcţia principală (main), cât şi într-o altă funcţie.
Programarea Calculatoarelor Capitolul 8 – Funcţii în limbajul C

Returnarea unei valori de către o funcţie se face folosind instrucţiunea return înainte de
încheierea funcţiei respective. De asemenea, instrucţiunea return se poate folosi şi pentru încheierea
forţată a execuţiei unei funcţii.
O funcţie poate returna orice valoare dintr-un tip de bază, cu excepţia unui tablou. Dacă funcţia
nu returnează nici o valoare, atunci se consideră că returnează void (tipul vid).
Atenţie! dacă nu se specifică nimic la tipul returnat de funcţie, compilatorul C consideră că
funcţia respectivă returnează o valoare de tip întreg (va fi semnalat un avertisment (warning) –
Function should return a value)
Exemplu: definirea şi apelarea unei funcţii care returnează o valoare întreagă:
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 funcţiei

printf (“Rezultatul este %d”, x);


}
Exemplu: definirea şi apelarea unei funcţii care nu retunează nici o valoare:
void afisare (void)
{
printf (“Functie care nu returnează nici o valoare...”);
}

int main (void)


{
int x, y, z;

afisare (); // apelarea funcţiei


return 0;
}
Înainte de a fi folosită, o funcţie poate fi declarată. Declararea (precizarea prototiplui) unei
funcţii este necesară doar dacă funcţia respectivă este declarată (în program) după ce a fost declarată
funcţia main (), sau dacă se foloseşte o funcţie într-o altă funcţie, înainte ca prima să fie declarată.
Declararea (prototipul) funcţiei afisare () definită anterior este următorul:
void afisare (void);

8.2 Parametrii locali, parametrii formali şi parametrii actuali


În utilizarea funcţiilor se pot deosebi două tipuri de parametri, în funcţie de specificul lor:
- parametrii formali;
- parametrii actuali;
Variabilele care sunt declarate în interiorul unei funcţii se numesc variabile locale şi sunt
accesibile doar în interiorul funcţiei respective. Valorile reţinute în aceşti parametrii se pierd odată cu
ieşirea din blocul respectiv.
Exemplu: funcţie pentru calculul minimului dintr-un şir de numere:

2
Programarea Calculatoarelor Capitolul 8 – Funcţii în limbajul C

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: funcţie pentru căutarea poziţiei unui număr într-un şir 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 definită o funcţie sunt numiţi parametrii formali. După ce
a fost definită funcţia, parametrii formali pot fi folosiţi în funcţia respectivă ca şi variabile locale
obişnuite. Ei sunt numiţi “formali” deoarece funcţia nu va fi apelată cu parametrii respectivi, ci cu
parametrii de tipurile respective (ei sunt precizaţi pentru a se cunoaşte prototipul funcţiei respective).
Parametrii actuali sunt parametrii cu care se apelează propriu-zis o funcţie.
În exemplul următor se pot observa cele două tipuri de parametrii:
float medie (int a, int b) // a, b - parametrii formali
{
float c; // c – variabilă locală
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;
}

8.3 Transmiterea parametrilor prin valoare, transmiterea prin adresă


În general, este necesară transmiterea valorilor calculate într-o funcţie, pentru a putea fi folosite
într-o altă funcţie. Transmiterea valorilor se poate face în două moduri:
- prin valoare;
- prin adresă;

3
Programarea Calculatoarelor Capitolul 8 – Funcţii în limbajul C

8.3.1 Transmiterea parametrilor prin valoare


Transmiterea parametrilor prin valoare constă în copierea valorii unui argument într-un
parametru formal al unei funcţii. În cazul transmiterii prin valoare, modificările efectuate asupra
parametrului formal NU au efect asupra argumentului funcţiei.
Transmiterea parametrilor prin valoare este cea mai folosită metodă 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 funcţie reprezintă o excepţie de la regula de
transmitere prin valoare a parametrilor.
Dacă se foloseşte o matrice ca şi argument al unei funcţii, atunci funcţiei respective i se
transmite adresa matricei respective (adresa primului element al matricei), iar funcţia respectivă poate
acţiona asupra conţinutului matricei respective.
Exemplu de transformare a unui şir 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 funcţiei


return 0;
}
Exemplu de program care realizează citirea unei matrice de numere întregi:
#include <stdio.h>

int citire (int tablou[]) /* funcţia are ca parametru tabloul de


numere întregi care este iniţial gol

4
Programarea Calculatoarelor Capitolul 8 – Funcţii în limbajul C

- elementele tabloului se păstrează şi la


părăsirea funcţiei
- funcţia returnează numărul 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 funcţiei de citire a
tabloului de numere întregi */
return 0;
}
8.3.2 Transmiterea parametrilor prin adresă
În limbajul C există şi instrumente prin care se poate simula un transfer prin referinţă. Pentru a
transfera un obiect V ca parametru prin referinţă, se transferă un pointer către V; parametrul formal va
fi un pointer către valoarea obiectului V.
Transmiterea parametrilor prin referinţă constă în copierea adresei unui argument într-un
parametru. În funcţia în care se face apelarea, este folosită adresa respectivă pentru accesarea
argumentului folosit efectiv la apelare.
În transmiterea prin adresă, modificările efectuate asupra unui parametru formal afectează
argumentul cu care se face apelarea funcţiei (parametrul actual). Pentru a folosi transmiterea prin
referinţă, argumentele funcţiei trebuie declarate ca pointeri.
Exemplu – interschimbarea a două numere:
void interschimba (int *a, int *b) //transmit prin adresă
{
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 şi w sunt folosite pentru


y = &w; // iniţializarea celor doi pointeri

printf ("Introd. valoarea primului numar: ");


scanf ("%d", x);

5
Programarea Calculatoarelor Capitolul 8 – Funcţii în limbajul C

printf ("Introd. valoarea pentru al doilea numar: ");


scanf ("%d", y);

interschimba (x, y); // apelarea funcţiei


interschimba (&z, &w); // apel recomandat al funcţiei

printf ("Nr. interschimbate sunt %d si %d", *x, *y);


getch ();
return 0;
}

8.4 Probleme rezolvate


Exemplu 1 - modificarea unui număr întreg, transmis prin adresă, într-o funcţie:
#include <stdio.h>

void incrementare_număr (int *nr)


{
(*nr)++;
}

int main (void)


{
int n=0;
incrementare_număr (&n);
printf (“Numarul este: %d”, n);
return 0;
}
Exemplu 2 - definirea şi folosirea unei funcţii care citeşte un şir de caractere şi îl returnează:
#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 şi folosirea unei funcţii care citeşte şi returnează o dată calendaristică.
#include <stdio.h>
#include <string.h>

void citire_data (int *zi, int *luna, int *an)


{
printf (“Introduceti ziua: “);
scanf (“%d”, zi);

printf (“Introduceti luna: “);

6
Programarea Calculatoarelor Capitolul 8 – Funcţii în limbajul C

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; //iniţializarea pointerilor

citire_data (a, b, c);


printf (“Data citita este: %d %d %d”, *a, *b, *c);
return 0;
}

8.5 Probleme propuse


1. Să se realizeze un program care, folosind un meniu, să calculeze ariile mai multor figuri
geometrice, fiecare arie fiind calculată folosind câte o funcţie.
2. Să se realizeze un program care să rezolve o ecuaţie de gradul 2 cu coeficienţii citiţi de la
tastatură, folosind o funcţie care să returneze două valori - rădăcinile, şi să precizeze dacă are
sau nu rădăcini reale).
3. Să se realizeze un program care să determine dacă un număr citit de la tastatură este prim,
utilizând o funcţie definită de utilizator.
4. Să se scrie un program care determină toate numerele prime mai mici sau egale cu un număr N
dat de la tastatură.
5. Să se scrie un program în C care să permită prin intermediul unui meniu interactiv următoarele
acţiuni:
- Introducere număr în tabloul de numere (toate numerele din tablou trebuie să fie diferite)
- Afişare numere
- Şterge un număr din tablou
- Ieşire
6. Să se scrie un program în C care să permită prin intermediul unui meniu interactiv următoarele
acţiuni:
- Adăugare elev (elevul este identificat prin nume)
- Afişare elevi
- Căutare după nume
- Sortare alfabetică după nume
- Ieşire

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