Documente Academic
Documente Profesional
Documente Cultură
Funcţii utilizator
11.1. Introducere
Noţiunea de funcţie este foarte importantă în limbajul C, datorită faptului că un program C este compus
în principal din funcţii. Un program scris în C conţine o funcţie principală, numită main(), execuţia
programului fiind asigurată de această funcţie.
Din corpul funcţiei main pot fi apelate alte funcţii care să realizeze anumite acţiuni specifice. Aceste
funcţii apelate pot fi funcţii de bibliotecă sau pot fi funcţii definite de utilizator.
La apelul unei funcţii de bibliotecă trebuie ca înainte de apel să se includă în program (prin intermediul
directivelor preprocesor #include) fişierul antet care conţine prototipul funcţiei. Datorită acestei includeri, în
etapele de compilare şi link-editare funcţia de bibliotecă va fi recunoscută, fişierul antet fiind căutat şi legat la
programul sursă.
Un programator care doreşte să-şi scrie propriile funcţii trebuie să aibă în vedere trei elemente:
definiţiile, prototipul şi apelul funcţiilor.
Noţiunea de funcţie a apărut în contextul modularizării programelor, adică în contextul scrierii
programelor formate din mai multe module, astfel încât fiecare modul să execute o anumită acţiune. Modulele
trebuie să fie coordonate din cadrul unui modul principal.
Avantajele utilizării funcţiilor sunt:
- funcţiile pot fi apelate din diferite părţi ale unui program şi pentru valori diferite ale parametrilor
acestora;
- funcţiile pot fi utilizate şi de alţi programatori;
- funcţiile pot fi utilizate şi în alte programe.
Program exemplu: Calculul ariei bazei, ariei laterale, ariei totale şi a volumului pentru un cilindru
pentru care se introduc raza bazei şi înălţimea.
#include<stdio.h>
#include<conio.h>
#include<math.h>
void cilindru(void)
{ float raza, inalt, ariab, arial, ariat, volum;
printf("\n Introduceti raza bazei:") scanf("%f",&raza);
printf("\n Introduceti inaltimea:"); scanf("%f",&inalt);
ariab=M_PI*raza*raza;
arial=2*M_PI*raza*inalt;
ariat=2*ariab+arial;
volum=ariab*inalt;
printf("\n Aria bazei: Ab = %5.2f",ariab);
printf("\n Aria laterala: Al = %5.2f",arial);
printf("\n Aria totala: At = %5.2f",ariat);
printf("\n Volumul: V = %5.2f",volum);
}
2
void main(void)
{ clrscr();
printf("\n Calculeaza ariile si volumul unui cilindru:");
cilindru();
getch();
}
Observaţie: Programul conţine o funcţie creată de utilizator (denumită cilindru) cu ajutorul căreia se
citesc datele de intrare (raza bazei şî înălţimea) şi se calculează ariile şi volumul cilindrului. În corpul funcţiei
main se apelează această funcţie.
Variabile locale:
Variabilele declarate în corpul unei funcţii sau în corpul unui bloc se numesc variabile locale. Aceste
variabile sunt “vizibile” numai în interiorul funcţiei sau blocului în care au fost declarate, lor li se alocă
memorie la execuţie, la intrarea în corpul funcţiei sau a blocului, durata lor de viaţă este numai pe pasrcursul
execuţiei corpului sau a blocului şi sunt distruse la ieşirea din corpul funcţiei sau din bloc. Din acest motiv
numele de variabile pot fi utilizate în două funcţii diferite, cu valori şi semnificaţii diferite în cele două funcţii,
fiecăruia i se alocă un spaţiu de memorie separat şi sunt văzute numai în corpul funcţiei în care a fost declarată.
Aceste variabile se mai numesc şi automatice (auto) pentru că aparţin clasei de memorare auto.
Exemplu: Funcţie care citeşte de la tastatură o valoare strict pozitivă şi o returnează funcţiei apelante.
Programul realizează calculul factorialului unui număr întreg, strict pozitiv citit cu ajutorul funcţiei create.
#include<stdio.h>
#include<conio.h>
int citstrpoz(void)
{ int a;
do{ printf(“\n Introduceti un numar:”)
scanf (“%d”,&a);
} while(a<=0);
return a;
}
void main(void)
{ int i,n; long int fact=1; clrscr();
n = citstrpoz(); // citirea valorii lui n
for(i=1;i<=n;i++) // calculul factorialului
fact*=i;
printf(“\n %n! = %ld”,n,fact); // afisarea valorii factorialului
getch();
}
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void eroare(void) // functia eroare
{printf("\n EROARE!!!!! \n Program TERMINAT!!!"); getch(); }
void main(void)
{float x; int y,i; double p=1; clrscr();
printf("\n Introdu valoarea bazei: x = "); scanf("%f",&x); // citirea lui x
// citirea lui y. Se verifica daca s-a introdus un numar intreg, daca NU se intrerupe
// executia programului
printf("\n Introdu valoarea exponentului: y = ");
if( scanf("%d",&y)!=1 )
{ printf("\n Nu ai introdus un numar intreg"); eroare(); exit(1); }
// se verifica daca y apartine intervalului [1, 100]
if(y<1 || y>100)
{printf("\n y nu apartine intervalului [1,100]"); eroare(); exit(1); }
// se calculeaza valoarea xy
for(i=1;i<=y;i++)
p*=x;
// se afiseaza rezultatul
printf("\n %f la puterea %d = %f",x,y,p); getch();
// sfarsit program
exit(0); printf("\n****");
}
5
Observaţie: Limitele superioare ale tablourilor declarate ca şi parametrii formali pot să lipsească, adică:
float func(float tab[ ], int n);
Program exemplu: Calculul sumei elementelor strict pozitive dintr-un şir de numere reale.
#include<stdio.h>
#include<conio.h>
// functie pt. citirea elementelor sirului
void cit_sir(int n, float a[])
{ int i;
for(i=1;i<=n;i++) {printf("\n a[%d]=",i); scanf("%f",&a[i]); }
}
// functie pt. afisarea elementelor sirului
void tip_sir(int n, float a[ ])
{ int i;
for(i=1;i<=n;i++) printf("%7.2f",a[i]);
}
// functie pt. calculul sumei elem. str. poz. dintr-un sir
float suma_poz(int n, float a[])
{ float s=0;int i;
for(i=1;i<=n;i++) if(a[i]>0) s+=a[i]; return s;
}
void main(void) // functia principala
{ int n; float a[15], s; clrscr();
printf("\n Introduceti numarul de elemente:"); scanf("%d",&n);
cit_sir(n,a); tip_sir(n,a); s = suma_poz(n,a); // apelul functiilor create anterior
printf("\n Suma elem. str. poz. este: s = %7.2f",s);//afisarea sumei calculate anterior
getch();
}
6
Program exemplu nr. 1: Calculul sumei elementelor strict pozitive dintr-un şir de numere reale.
#include<stdio.h>
#include<conio.h>
int n; float a[15], s; // declaratii de variabile globale
void cit_sir() // functie pt. citirea elementelor sirului
{ int i;
for(i=1;i<=n;i++)
{printf("\n a[%d]=",i); scanf("%f",&a[i]);}
}
void tip_sir() // functie pt. afisarea elementelor sirului
{ int i;
for(i=1;i<=n;i++) printf("%7.2f",a[i]);
}
float suma_poz() // functie pt. calculul sumei elem. str. poz. dintr-un sir
{ float s=0;int i;
for(i=1;i<=n;i++) if(a[i]>0) s+=a[i];
return s;
}
void main(void) // functia principala
{ clrscr();
printf("\n Introduceti numarul de elemente:"); scanf("%d",&n);
cit_sir(); tip_sir(); s = suma_poz(); // apelul functiilor create anterior
printf("\n Suma elem. str. poz. este: s = %7.2f",s);//afisarea sumei calculate anterior
getch();
}
Observaţie: din definiţiile funcţiilor au dispărut declaraţiile de variabile. Acestea nu mai sunt necesare
deoarece variabilele n, a[ ] şi s sunt vizibile în toate funcţiile din program.
Program exemplu nr. 2: Determinarea numărului de elemente nule dintr-o matrice dreptunghiulară.
#include<stdio.h>
#include<conio.h>
// citirea matricei
void cit_mat(int m, int n, float mat[][10])
{ int i,j; float c;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{printf("\n a[%d][%d] = ",i,j);
scanf("%f",&mat[i][j]);
}
}
// afisarea matricei
void tip_mat(int m, int n, float mat[][10])
{ int i,j;
for(i=1;i<=m;i++)
{ printf("\n");
for(j=1;j<=n;j++)
printf("%7.2f",mat[i][j]);
}
}
7
// determinarea nr. de elemente nule
int nrnulemat(int m,int n, float mat[][10])
{ int i,j,nn=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(mat[i][j]==0)
nn++;
return nn;
}
void main(void)
{ int m,n,nrnule; float mat[10][10];
clrscr();
printf("\n Introduceti m si n:"); scanf("%d %d",&m, &n);
getch();
}