Documente Academic
Documente Profesional
Documente Cultură
1
2
Definirea funcţiilor
3
Ce înseamnă o functie ?
f:AB
corpul
valoarea functiei
returnata
f(x,y) f(x,y) = sin(x*y)
numele Argumentele/parametrii
functiei functiei
(f) (x si y)
Forma generala:
5
tip_dată nume ( tip_arg1 arg1, ..., tip_angN argN )
{
secventa de instructiuni;
[return expresie;]
}
• arg1, ..., argN reprezintă variabilele de intrare, avand tipurile tip_arg1, …, tip_angN,
pe care le primeste functia din programul sau sub-programul în care este apelată.
ATENTIE : 1) Este posibil ca functia să nu primească date de intrare, caz în care lista
este vidă.
tip_data nume () sau se poate folosi tipul void tip_data nume(void)
6
tip_dată nume ( tip_arg1 arg1, ..., tip_angN argN )
{
secventa de instructiuni;
[return expresie;]
}
• return expresie : comanda return este folosită pentru a returna valoarea dorită.
7
Exemplu de definire functie:
- am definit functia adunare care
int adunare(int a, int b) primeste două numere întregi si
{ returnează un număr întreg
int r;
r=a+b;
return r; - calculează suma în variabila r
} si returnează valoarea lui r.
Mai eficient:
8
Apelarea functiilor:
dupa ce a fost definita o functie poate sa fie apelata in main sau in alta functie.
int main( )
{ sau
int x, y, suma=0; int main( )
{
printf(“Dati doua valori care se aduna”); int x, y;
scanf(“%d %d”, &x, &y);
printf(“Dati doua valori care se aduna”);
suma= adunare(x, y); scanf(“%d %d”, &x, &y);
#include <stdio.h>
int main(){
salut(); Apelarea unei unei functii de tip void
}
Buna ziua!
int main(){
Buna ziua!
salut(); salut(); salut(); Buna ziua!
10
Unde se definesc functiile?
Formă generală program:
Varianta 1: Varianta 2:
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535897932384626433832795 Varianta 1
float arie(float r)
{ Definitia unei functii:
float a; Am definit functia arie care calculează aria unui
a = PI*pow(r, 2); cerc cunoscand raza cercului si returnează această
valoare sub forma unui float.
return a;
}
int main( ){
float raza, a;
printf("Dati valoarea razei: ");
scanf("%f", &raza);
Apelul functiei:
a = arie(raza); Am apelat functia arie cu parametrul efectiv raza, a
carui valoare am citit-o de la tastatura.
printf("Aria este %f", a);
}
2) Sa se scrie un program care calculeaza aria unui dreptunghi folosind o functie,
denumita arie.
double factorial(int n)
{
int i; Definitia unei functii:
double fact=n; Am definit functia factorial care calculează
for (i=n-1; i>0; i--) factorialul unui număr întreg n si returnează
fact=fact*i; această valoare sub forma unui double.
return fact;
}
int main()
{ Apelarea unei functii:
printf(“20!=%lf”, factorial(20) ); Functiile se apelează în mod identic cu modul
} de apelare al functiilor disponibile în C.
Executia functiei factorial(20):
double f; - n=20
f= factorial(20); - se efectuează calculele
printf(“20!=%lf”, f); - factorial(20) devine valoarea specificată de
return.
14
Altă variantă:
double factorial(int n)
{
Am definit functia, detaliind corpul acesteia după
int i; double fact=n;
programul principal.
for (i=n-1; i>0; i--)
fact=fact*i;
return fact;
}
15
Observatii: Variabile globale
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
int offset=3;
double factorial(int n)
{ float produs(float a, float b)
int i; {
double fact=n; return a*b+offset;
for (i=n-1; i>0; i--) }
fact=fact*i; int main()
return fact; {
} printf(“%d, %f”, offset, produs(5,6) );
int main() }
{
printf(“%d %lf”, i, factorial(20) ); -variabila offset este definită după comenzile
} de preprocesare, dar înaintea definirii functiilor
programului
eroare
Observatie: variabilele declarate în corpul unei Observatie: variabilele declarate în afara
functii sunt valabile doar în acesta, si doar pe programului principal main(), s.n. variabile
parcursul executiei functiei respective. globale, sunt vizibile peste tot în program: în
functia main(), în toate functiile, etc.
16
Observatii: Variabile globale
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
int offset=3;
double factorial(int n)
{ float produs(float a, float b)
int i; {
double fact=n; return a*b+offset;
for (i=n-1; i>0; i--) } 3, 33
fact=fact*i; int main()
return fact; {
} printf(“%d, %f”, offset, produs(5,6) );
int main() }
{
printf(“%d %lf”, i, factorial(20) ); -variabila offset este definită după comenzile
} de preprocesare, dar înaintea definirii functiilor
programului
eroare
Observatie: variabilele declarate în corpul unei Observatie: variabilele declarate în afara
functii sunt valabile doar în acesta, si doar pe programului principal main(), s.n. variabile
parcursul executiei functiei respective. globale, sunt vizibile peste tot în program: în
functia main(), în toate functiile, etc.
17
Vizibilitatea variabilelor în cadrul functiilor
#include <stdio.h>
18
#include <stdio.h> ce valoare va returna functia produs ???
int main()
-în main( ), variabila offset este
{
printf(“%d, %f”, offset, produs(5,6) ); cea definită global, cea din
functie neexistând decât în
}
interiorul fct. produs (executie).
19
#include <stdio.h>
ce valoare va returna functia produs???
int offset=3;
3, 10.00, 3
float produs(float a, float b)
{
int offset=4;
3, 2*3+4=10.00, 3
return a*b+offset;
} !!! cu toate că variabila offset,
este definită global si este
vizibilă si în functia produs,
int main() redefinirea ei local duce la
{ ignorarea variabilei globale.
printf(“%d, %f, %d”, offset, produs(2,3), offset );
}
20
Exemplu de utilizare a unei functii:
Sã se întocmeascã un program în care se definesc urmãtoarele funcţii:
- functie de afişare a divizorilor unui întreg;
- funcţie care returneazã c.m.m.d.c. a doi întregi preluaţi ca parametri;
- funcţie care returneazã c.m.m.m.c. a doi întregi preluaţi ca parametri.
În funcţia main se citesc doi întregi de la tastaturã pentru care se vor afişa
divizorii, c.m.m.d.c, c.m.m.m.c.
22
int main()
{
int nr1, nr2, optiune;
printf("nr1= ");
scanf("%d", &nr1);
printf("nr2= ");
scanf("%d", &nr2);
do
{ meniu();
printf("\n\nIntrodu optiunea: ");
scanf("%d", &optiune);
switch(optiune)
{
case 1: printf("\nDivizorii numarului %d sunt: ", nr1);
af_div(nr1);
break;
case 2: printf("\nDivizorii numarului %d sunt: ", nr2);
af_div(nr2);
break;
23
case 3: printf("\nCMMDC = %d ", cmmdc(nr1,nr2) );
break;
case 4: printf("\nCMMMC = %d ", cmmmc(nr1,nr2) );
break;
case 5: printf("\nSfarsit de program !\n");
break;
default: printf("\nOptiunea dumneavoastra este gresita !");
} //end switch
}
while ( optiune != 5 ); //sfarsit do while
return 0;
} //sfarsit main
Observatie: S-ar putea ca la introducerea valorilor pentru variabilele nr1 si nr2 (slide 23) sa
se aleaga valori irelevante (valori negative, 0 sau 1). Prin urmare, la citirea de la tastatura
se poate verifica daca ceea ce s-a introdus este corect sau nu. Daca valoarea introdusa nu
este corecta (este <=1), se solicita din nou introducerea unei valori. Acest lucru se poate
face astfel (slide 25):
24
int main() do
{ {
int nr1, nr2, optiune; printf("nr1= ");
scanf("%d", &nr1);
printf("nr1= "); }
se
scanf("%d", &nr1); while (nr1<=1); // verificam daca valoarea citita este >1
printf("nr2= "); inlocuieste
scanf("%d", &nr2); cu do
{
printf("nr2= ");
scanf("%d", &nr2);
}
while (nr2<=1); // verificam daca valoarea citita este >1
do
{ meniu();
printf("\n\nIntrodu optiunea: ");
scanf("%d", &optiune);
switch(optiune)
{
case 1: printf("\nDivizorii numarului %d sunt: ", nr1);
af_div(nr1);
break;
25
// continuarea programului ca inainte
Recursivitate
1, daca n 0
n!
n n 1 !
26
O functie recursivă trebuie să fie bine formată:
exemplu: f(0)=1,
f(n)=f(n-1)+3,
f(3)=f(2)+3=f(1)+3+3=f(0)+3+3+3=1+3+3+3=10
27
În general distingem:
28
#include <stdio.h>
int main() {
int nr;
int Factorial(int n)
{
if (n==0)
return 1; descrierea complete a fucntiei
else
return n*Factorial(n-1);
}
29
TEMA
30