next up previous contents
Next: Functii de biblioteca Up: Functii. Functii de biblioteca Previous: Functii. Functii de biblioteca   Cuprins


Functii definite de utilizator

Functiile reprezinta un aspect important al programarii, independent de limbajul utilizat. Ele permit încapsularea unor rutine în cadrul unor "cutii negre", astfel ca programatorul care se foloseste de anumite functii trebuie sa cunoasca doar actiunea lor - ce fac ele, nu si modul cum sunt implementate. În plus, functiile permit structurarea programului pe blocuri, separând astfel zonele de cod ce îndeplinesc actiuni diferite si conferind o mai mare lizibilitate a codului.

La fel ca în capitolul precedent, vom analiza modul în care utilizatorul poate defini si apela o functie urmarind un exemplu. Se va defini o functie pentru a verifica daca restul împartirii a doua numere este 0; cu ajutorul acestei functii se verifica apoi divizibilitatea cu 3 a primelor 100 numere naturale.




#include <stdio.h>

int divizibil(int, int);

void main(void)
{
   int i;

   for (i=1; i<=100; i++)
      if (divizibil(i,3))
         printf("numarul %d se divide cu 3\n",i);
      else
         printf("numarul %d nu se divide cu 3\n",i);
}


int divizibil(int a, int b)
{
   if (a%b)
      /* a modulo b este diferit de 0,
         returneaza 0 */ 
      return 0;
   else   
      /* a modulo b este 0 (a este
         divizibil cu b) */
      return 1;

}



Observatie: O alta implementare a functiei divizibil este prezentata mai jos:

int divizibil(int a, int b)
{
   return !(a%b);
}



Definirea unei functii se face în maniera:

tip_returnat nume_functie(declaratia parametrilor)
{
   definitii locale
   instructiuni
}
Definirea unei functii se poate face oriunde în cadrul codului sursa, sau chiar în alte fisiere, însa nu poate fi facuta în interiorul altei functii.

În exemplul anterior, a doua linie a programului reprezinta declaratia sau prototipul functiei divizibil. Aceasta are rolul de a anunta numele functiei, tipul returnat si tipul si numarul parametrilor. Nu este obligatorie prezenta prototipului, dar daca acesta lipseste, iar functia este apelata înaintea declaratiei ei, unele compilatoare (mai vechi) vor da mesaje de avertizare în momentul compilarii. Prototipurile au fost introduse în standardul ANSI C (versiunile mai vechi de C nu prevedeau prototipuri de functii) pentru a permite compilatorului sa faca anumite verificari legate de numarul parametrilor functiei si de conversii ilegale între tipul parametrilor si cel al argumentelor.

În exemplu anterior, functia divizibil are doi parametri întregi si returneaza o valoare întreaga. Valoarea returnata de o functie se transmite prin instructiunea return, care are ca efect si parasirea executiei functiei. În cazul ca functia nu are parametri sau nu returneaza nici o valoare, se foloseste tipul vid void.

Spre deosebire de alte limbaje (ca de ex. Pascal) unde mecanismul de transmitere a parametrilor catre functii este prin adresa sau prin valoare, în C exista doar transmiterea prin valoare. La transmiterea prin valoare, modificarile asupra parametrilor efectuate în interiorul functiei nu se propaga si în afara functiei, dupa cum se poate observa si din executia exemplului urmator:




#include <stdio.h>

void schimba(int a, int b)
{
   int k;

   k=a;
   a=b;
   b=k;
   printf("in cadrul functiei, dupa schimbare a=%d b=%d\n",a,b);
}

void main(void)
{
   int a=1, b=4;

   printf("inainte de apelul functiei a=%d b=%d\n",a,b);
   schimba(a,b);
   printf("dupa apelul functiei a=%d b=%d\n",a,b);
}



Chiar daca mecanismul de transmitere a parametrilor este doar prin valoare, în C se pot transmite parametri si prin adresa, într-un mod indirect, folosind pointeri (dupa cum se va arata în capitolele urmatoare).


next up previous contents
Next: Functii de biblioteca Up: Functii. Functii de biblioteca Previous: Functii. Functii de biblioteca   Cuprins
Cristian Gavrila 2001-10-02