Documente Academic
Documente Profesional
Documente Cultură
Noţiunea de funcţie
Funcţia este elementul structural de bază în componenţa unui program din clasa limbajelor C. O
descriere sumară a funcţiei a fost deja prezentată în secţiunea Structura unui program C.
În majoritatea limbajelor procedurale pe lîngă subprograme de tip funcţie se utilizează şi subprograme
de tip procedură. Ceea ce le diferenţiază sînt modul de apelare şi numărul rezultatelor întoarse
programului principal. Funcţia se apelează prin numele ei şi returnează cel mult un rezultat, iar
procedura se activează printr-o instrucţiune de apel de procedură şi furnizează un număr nedeterminat
de rezultate. În limbajele de tip C se foloseşte doar noţiunea de funcţie, care nu impune restricţii asupra
numărului de rezultate furnizate, iar apelarea ei poate să constituie o instrucţiune de sine stătătoare sau
să se facă prin intermediul unor instrucţiuni de ieşire sau de tip expresie.
Astfel, noţiunea de funcţie permite, pe de o parte ca rezolvarea oricărei probleme, indiferent de
gradul ei de dificultate, să se facă prin descompunerea acesteia într-un număr arbitrar de subprobleme
simple, uşor de modificat, reprezentabile prin funcţii, iar pe de alta, presupune participarea unui număr
mai mare de programatori, care are ca efect scurtarea timpului de soluţionare a problemei (adică,
presupune lucrul în echipă). De asemenea, se adaugă creşterea facilităţii de lizibilitate şi urmărirea mai
uşoară a unui program vast, posibilitatea de codificare în limbaje de programare diferite a funcţiilor
care intervin în componenţa unui program şi nu în ultimul rînd, testarea şi depanarea funcţiilor pe
sisteme de calcul diferite, dar compatibile.
Funcţiile pot apela la rîndul alte funcţii sau se pot autoapela (funcţii recursive) şi astfel este posibil să
se ajungă la programe în care modulul principal (main()) să conţină doar cîteva linii de apeluri de
funcţii. De asemenea, am văzut că modulul principal main() este singura funcţie care controlează toate
celelalte funcţii componente. Aceasta este apelată şi activată la începutul lansării în execuţie a
programului.
Legătura între funcţiile apelante şi cele apelate se păstrează prin intermediul parametrilor
actuali (efectivi) şi respectiv, formali (fictivi), între ei existînd concordanţe de număr, de tip, de
dimensiune şi de loc. Parametrii actuali permit furnizarea de date spre funcţia apelată, iar rezultatul
returnat modulului apelant poate fi ignorat sau utilizat în cele ce urmează.
Definirea şi declararea funcţiilor, apelarea unei funcţii, mecanismul de transmitere al parametrilor,
funcţii recursive, pointerii de funcţii, funcţii cu liste variabile de parametri şi funcţii predefinite
constituie conţinutul secţiunilor din acest capitol.
2
întoarcerea în funcţia apelantă se determină prin instrucţiunea return [nume_rezultat];, unde
parantezele pătrate exprimă opţionaliatea argumentului nume_rezultat. Limbajul C nu permite ca
ultima instrucţiune a blocului de definţie să fie o instrucţiune expresie, unde numelui funcţiei i se
atribuie valoarea ce urmează să se returneze funcţiei apelante. Deci, absenţa instrucţiunii return
provoacă încheierea execuţiei funcţiei cu returnarea unui rezultat nu totdeauna corect. Rezultatul
furnizat este cel obţinut în ultimul pas de iterare într-o structura repetitivă (situaţie inoportună) sau prin
rezolvarea secvenţială a unor expresii de atribuire.
Funcţia suma determină suma cuburilor primelor n numere naturale. Aceasta furnizează un
rezultat întreg, care se păstrează în numele funcţiei (funcţia 12.1.2) sau în variabila s, cu simbolizarea
returnării rezultatului prin intermediul lui return, în funcţia 12.1.3. În primul program se procedează ca
şi cum ar exista un return înainte de acolada de închidere a blocului funcţiei.
/* Definire functie suma */ /*Definire functie suma*/
int suma(int n )
{ int i; suma = 0;
for (i=0; i<=n; ++i) suma += i*i*i;}
Funcţia 12.1.2
int suma(int n )
{ int i, s = 0;
for (i=0; i<=n; ++i) s += i*i*i;
return s; }
Funcţia 12.1.3
3
În programul prezentat în secţiunea următoare, funcţia suma va constitui obiectul
unor apeluri de funcţie.
V. Instrucţiunea return
Instrucţiunea return ca şi continue, a fost preluată din limbajul Fortran. Aceasta permite
terminarea activităţii unei funcţii, într-un moment fixat al rezolvării cu sau fără returnarea
unei valori în funcţia care a generat apelul. Deci, în unele situaţii instrucţiunea return
produce un salt necondiţionat dintr-un anume punct al unei funcţii în programul apelant,
cu furnizarea cel mult a unei valori de un tip compatibil cu cel precizat în prototipul şi
antetul definirii ei, fără ca funcţia să se rezolve în totalitate. Aşa se întîmplă chiar dacă
tipul funcţiei este void (adică, nu se întoarce nici un rezultat). De asemenea, instrucţiunea
return este necesară şi în situaţia în care funcţia se execută în întregime, dar rezultatul
furnizat este memorat într-o variabilă diferită de cea care fixează numele simbolic al
funcţiei.
Formatul general al acestei instrucţiunii este: return expresie;.
Expresia este opţională. În cazul cînd este prezentă, valoarea ei va fi furnizată funcţiei
apelante, eventual cu aplicarea unei conversii implicite la tipul rezultatului ( ca la orice
atribuire).
Mai multe utilizări ale instrucţiunii return sînt prevăzute în definirea funcţiei
fact(), care poate fi găsită, chiar în două abordări, aproape în orice lucrare de programare
procedurală. Această funcţie determină n!, unde n este un număr natural. Calculul
factorialului se face pe baza relaţiei n! = 1x2x3x … xn.
Funcţia fact este apelată de mai multe ori în printf():
- de trei ori în determinarea, în ordine, a valorilor n!, k! şi (n-k)! ;
- de trei ori în expresia Cnk = n!/(k!(n-k)!).
Prototipul funcţiei int fact(int); precede definirea şi apelurile funcţiei.
Dacă n = 0, atunci funcţia returnează 1; altfel, valoarea expresiei n!.
/* Functia factorial */
#include <stdio.h>
#include <conio.h>
int fact(int);
void main(void)
{ int n, k;
clrscr();
printf("\n Introduceti n = "); scanf("%d", &n);
printf("\n Introduceti k = "); scanf("%d", &k);
printf("%d\! = %d %d\! = %d %d\! = %d \n
Combinari de %d luate cite %d : %d", n, fact(n), k,
fact(k), n-k, fact(n-k), n, k, fact(n)/(fact(k)*fact(n-k)));
getch(); }
int fact(int n)
{ int i, produs = 1;
if (n == 0) return 1;
{ for ( i = 1; i <= n; ++i) produs *= i; }
return produs;
}
Introduceti n = 5
Introduceti k = 2
n! = 120 k! =2 (n-k)! = 6
Combinari de 5 luate cite 2 : 10
Programul 12.5.1
În continuare se prezintă modalitatea de codificare a funcţiei fact(), unde prin intermediul
parametrului n se controlează atît structura for cît şi aflarea factorialului.
int fact(int n)
{ int i, produs = 1;
for (; n>1; --n) produs *= n;
return produs; }
Funcţia 12.5.1