Funcţii în C

      Ne propunem să vedem cum se redactează o funcţie în C şi cum se transmit parametrii
funcţiei.În C, C++ şi Java (limbajele ce au la bază standardul ANSI C) ca subprograme nu avem
decât funcţii, o procedură putând fi implementă ca o funcţie care returnează tipul void (vid).
În C, o funcţie care returnează alt tip decât void poate fi apelată atât ca o funcţie (în
cadrul unei expresii), cât şi ca o procedură (ignorându-se valoarea returnată). De exemplu,
funcţia printf returnează valoarea int, care reprezintă numărul de octeţi care s-au afişat pe ecran.
De cele mai multe ori (după cum am văzut şi în exemplele de mai sus) funcţia printf este apelată
ca o procedură, ignorându-se valoarea returnată.
După cum am mai spus şi în primul capitol, funcţiile pot fi descrise atât la începutul
programului, deasupra funcţiei principale, cât şi după aceasta, situaţie în care definiţiile funcţiilor
trebuie totuşi să apară deasupra funcţiei principale.
Structura unei functii:

tip nume_functie(argumente)

corpul functiei (instructiuni)
}

           Definiţia funcţiei începe cu tip, care este tipul valorii pe care o returnează funcţia. Dacă
tip nu este void, atunci funcţia va conţine de regulă cel puţin o instrucţiune return expresie. Dacă
execuţia programului ajunge la o astfel de instrucţiune, atunci se evaluează expresia a cărei
valoare trebuie să fie de tipul tip sau unul compatibil şi valoarea obţinută se returnează, execuţia
programului continuând cu instrucţiunile de după locul în care a fost apelată funcţia.
Dacă o funcţie ce returnează o valoare de un tip diferit de void nu se termină cu o
instrucţiune return, atunci la compilare vom obţine mesajul de atenţionare Warning 5: Function
should return a value.
În C parametrii ce se returnează din funcţie (variabilele de ieşire) se transmit prin adresă.
În acest sens dăm un exemplu în care media aritmetică este returnată printre parametrii funcţiei:
void medie2(float x,float y,float *m)
{
*m=(x+y)/2;
}
void main()
{
float x,y,med;
printf("Dati doua numere reale: ");
scanf("%f%f",&x,&y);
medie2(x,y,&med); /* apel functie */
printf("Media este: %f",med);
}

La apelul unei funcţii valorile parametrilor de intrare, cei transmişi prin valoare (aşa cum
este cazul parametrilor x şi y), sunt copiate în zone de memorie noi şi de aceea, dacă le
modificăm, la părăsirea funcţiei, valorile modificate se pierd, zonele de memorie alocate pentru
aceşti parametri în funcţie fiind eliberate.
Parametrul m al funcţiei medie2 este transmis prin adresă. Mai exact, în funcţie se
transmite adresa la care este alocată memorie pentru variabila med din funcţia principală. În
funcţia medie2 se modifică valoarea de la adresa m, adresă care coincide cu cea a variabilei med
şi de aceea valoarea calculată rămâne în variabila med după ce se părăseşte funcţia.
Dacă vrem ca o variabilă transmisă prin adresă să nu poată fi modificată, punem în faţa ei
cuvântul rezervat const. În general, dacă se încearcă modificarea unei variabile declarate cu
const (a unei constante), atunci se semnalează eroare la compilare.
Variabilele de tip tablou sunt pointeri, de aceea valorile de la adresele indicate de ele se
transmit prin adresă şi eventualele modificări în interiorul funcţiei asupra elementelor tabloului
păstrându-se şi la părăsirea funcţiei.
În continuare prezentăm o funcţie care calculează media aritmetică a elementelor unui şir
de numere reale:
float mediesir(int n,const float *a)
{
int i;
float s=0;
for (i=0;i<n;i++) s+=a[i];
return s/n;
}
void main()
{
int i,n;
float a[100];

printf("Dati numarul de elemente al sirului: ");
scanf("%d",&n);
puts("Dati elementele sirului:");
for (i=0;i<n;i++)
{
printf("a[%d]=",i);
scanf("%f",&a[i]);
}
printf("Media aritmetica: %f",mediesir(n,a));
}

Rezumat:
Definiţia unei funcţii în C începe cu tipul returnat de către funcţie, urmat de numele
funcţiei şi de lista de argumente dată între paranteze. Dacă o funcţie are tipul returnat void,
atunci ea nu returnează nici o valoare şi se apelează practic ca o procedură.
Parametrii de intrare în funcţie se transmit prin valoare, iar cei de ieşire se transmit prin
adresă.
Cum se scrie o functie in C ?

1 comentarii:

Anonim spunea...

Am si eu nevoie de ajutor!!!Problema pe care am primit-o suna cam asa:Sa se determine f(X)=2x-1,daca x<2
7,daca x<=5
3x=1,daca x>5.Multumesc anticipat!

Trimiteți un comentariu