Documente Academic
Documente Profesional
Documente Cultură
Funcții în C
❻ Funcții în C
OBIECTIVELE LABORATORULUI
1. FUNCȚII ÎN LIMBAJUL C
O funcţie reprezintă o secvenţă de instrucţiuni ce poate fi apelat ă din mai multe puncte ale unui
program, executând prelucrări determinate asupra unor date comunicate în momentul apelului.
DECLARAREA FUNCȚIILOR
Declarația unei funcții va da numele funcției, tipul datei returnate de aceasta și numărul și tipul
argumentelor care trebuie precizate la apelul funcței. Declaraţia funcţiei este necesară
compilatorului în momentul în care este nevoit să "rezolve" apelul funcţiei. Dacă funcţia a fost
definită înaintea primului său apel atunci declaraţia nu mai este necesară.
Sintaxa generală:
<tip_returnat> <nume_funcție>([<lista_declaratii_parametrii>]);
Observații:
În momentul declarării nu este necesară cunoaşterea denumirii parametrilor formali ai
funcţiei, aşa că ei pot lipsi (ca nume, dar nu ca și tip).
DEFINIREA FUNCȚIILOR
Corpul funcţiei va apărea în afara funcţiei main și în afara oricărei alte funcţii din program. Dacă
plasăm acest corp de funcţie (definiţia funcţiei) după funcţia main, vom fi nevoiţi să declarăm funcţia
respectivă, declaraţie ce va apărea în faţa primului apel al funcţiei.
Sintaxa generală este:
[<tip_returnat>] <nume_funcție>([<lista_declaratii_parametrii>])
{
[<declaratii_identificatori_locali >]
[<instructiuni>]
[return [<expresie>]; ]
}
unde:
tip_returnat:= int|char|unsigned|float|double|short|long
APELUL FUNCȚIEI
Acesta poate fi utilizat în funcţia main sau în oricare alt ă funcţie din program, prin
specificarea numelui funcţiei şi, între paranteze rotunde, lista parametrilor reali, transmişi funcţiei.
Parametri reali pot fi, în cazul general, expresii de tipul parametrilor formali asociaţi sau expresii de
tipuri convertibile la acele tipuri.
Sintaxa generală:
<nume_funcție>([<lista_parametrii_reali>]);
Exemplu
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x, y;
printf("Dati valori lui x si y: ");
scanf("%d%d", &x, &y);
Funcțiile predefinite sunt acele funcții care sunt definite în bibliotecile ce însoțesc orice
mediu de programare. Bibliotecile conțin un fișier header (*.h), în care se regăsesc prototipurile
funcțiilor și alte declarații de variabile și fișierul sursă asociat în care regăsim definițiile funcțiilor
propriu-zise. Funcțiile predefinite sunt împărțite în biblioteci în funcție de aplicabilitatea lor. De
exemplu, funcțiile standard se regăsesc în biblioteca stdlib, funcțiile matematice în biblioteca math
etc.
Pentru a utiliza funcțiile predefinite trebuie ca fișierul header asociat bibliotecii să fie inclus
în programul apelant printr-o directivă preprocesor (#include <nume_biblioteca.h>).
Exemplu
#include <stdio.h>
#include <stdlib.h>
int main()
{
char text[50];
int i;
for(i=0;i<strlen(text);i++)
text[i] = toupper(text[i]);
return 0;
}
Exemplu
#include <stdio.h>
#include <stdlib.h>
// definitia/corpul functiei
Observații:
1. În cazul exemplului prezentat "f-1, 3" reprezinta parametri reali, iar "double b, int exp"
sunt parametri formali.
În momentul apelului "val = putere(f-1, 3);", cele doua expresii sunt evaluate, iar rezultatele
convertite la double, respectiv int. La pasul următor valorile deja convertite vor fi COPIATE în
parametrii "b", respectiv "exp".
2. În cazul parametrilor de tip ȘIR/MATRICE orice schimbare produsă în interiorul funcţiei va
fi vizibilă şi după revenirea din funcţie. Acest lucru este posibil deoarece, în aceste cazuri, se face
accesul la elementul unui şir pe baza adresei şirului, motiv pentru care accesul se va produce asupra
şirului transmis ca parametru.
#include <stdio.h>
#include <stdlib.h>
return 0;
}
Un program scris în limbajul C (sau C++) este compus din unul sau mai multe fişiere sursă (*.c, *.cpp).
Un fişier sursă este un fişier text care conţine codul sursă (în limbajul C) al unui program. Fiecare
fişier sursă conţine una sau mai multe funcţii şi eventual, referinţe către unul sau mai multe fişiere
header (*.h).
Prin intermediul acestui tip de funcţie avem posibilitatea de a transmite un număr variabil de
parametri reali, în momentul apelului funcţiei.
Acest număr de parametru reali poate varia de la un apel la altul, în cadrul aceluia si program.
O funcţie de acest gen va con ţine în lista parametrilor formali si simbolul elipsis (...). Declaraţia va fi
asemănătoare cu cea prezentată în continuare.
DECLARAREA FUNCȚIILOR
DEFINIREA FUNCȚIILOR
Macrodefiniţiile utilizate în operarea funcţiilor cu număr variabil de argumente sunt:
Aceste macrouri dau posibilitatea utilizatorului de a accesa argumentele unei funcţii ce nu are un
număr constant (fix) de argumente după cum urmează:
va_start() - setează variabila ap de tip va_list la primul argument ce este transmis funcţiei;
va_args() - transformă argumentul curent din lista la tipul type si îl întoarce, după care trece
la următorul argument din listă;
va_end() - ajută funcţia să efectueze un return normal (să golească stiva înainte de
întoarcere).
Parametrul lastfix al funcţiei va_start() este de fapt numele ultimului parametru fix transmis
funcţiei.
APELUL FUNCȚIEI
Acesta poate fi utilizat în funcţia main sau în oricare alt ă funcţie din program, prin
specificarea numelui funcţiei şi, între paranteze rotunde, lista parametrilor reali, transmişi funcţiei.
Parametri reali pot fi, în cazul general, expresii de tipul parametrilor formali asociaţi sau expresii de
tipuri convertibile la acele tipuri.
Sintaxa generală:
// apeluri functie
modelFunctie( varA );
modelFunctie( varA. 2, 3, 1, 0 );
/* ... */
return 0;
Exemplu de calcul a sumei unor numere transmise ca și parametrii variabili într-o funcție
#include <stdio.h>
#include <stdarg.h>
return s;
}
// apeluri functie
s1 = suma( 0 );
printf("suma( 0 ) = %d.\n",s1);
s2 = suma( 4, 2, 3, 1, 0 );
printf("suma( 4, 2, 3, 1, 0 ) = %d.\n",s2);
return 0;
}
3. FUNCȚII RECURSIVE
Matematic, factorialul este definit printr-o funcție produs (1) sau o relație de recurență (2):
n
n ! k 1 2 3 ... n (1)
k 1
1, daca n 0
n! (2)
n (n 1)!, daca n 0
Din relația de recurență (2) putem observa că valoarea lui n! se calculează în funcție de valoarea
lui (n-1)!, deci și pentru (n-1)! se aplică aceiași relație de recurență. În cele ce urmează sunt
prezentate două definiții ale funcției de calcul al factorialului pentru cele 2 relații, (1) și (2),
implementări reprezentând varianta iterativă, respectiv varianta recursivă a funcției factorial.
return f; }
}
2. Scrieţi un program ce va realiza diferite operaţii pe şiruri de numere întregi și care să afişeze şi să
implementeze opţiunile următorului meniu:
C. Citire şir de numere.
A. Afişare sir.
S. Afişare sumă.
F. Căutare element în vector.
I. Info autor.
X. Ieşire.
Obs. Pentru implementarea tuturor opțiunilor (exceptând optiunile ’I’ și ’X’) se vor utiliza funcții.
n 1, daca m 0
a(m, n) a(m 1,1), daca n 0
a(m 1, a(m, n 1)), altfel
4. Scrieţi un program ce va rezolva problema calculului celui mai mare divizor comun dintre
două numere naturale a și b. Aceasta problemă poate fi rezolvată recursiv, conform definiţiei
următoare:
a, a b
(a, b) (a b, b), a b
(a, b a), b a
5. Scrieți un program care va calcula suma si produsul primelor numere naturale utilizând două
funcții recursive.
6. Scrieti un program care realizeaza calculul recursiv al sumei elementelor unui vector.
3. Scrieţi un program care să afişeze şi să implementeze opţiunile următorului meniu (se vor utiliza
funcţii):
C. Citire matrice.
A. Afişare matrice.
S. Verificare dacă este simetrică sau nu.
F. Căutare element în matrice şi afişarea poziţiilor în care se găseşte elementul (o poziţie = o
pereche de coordonate (x, y)).
O. Afişare contur matrice.
P. Parcurgerea în spirala a matricei se memorează într-un vector, apoi se afişează toate
subşirurile de elemente consecutive. Aceasta opţiune va fi lansata în execuţie numai dacă
matricea este pătratică.
F. Info autor.
X. Ieşire.