Documente Academic
Documente Profesional
Documente Cultură
Obiectiv: stabilirea avantajelor pe care le aduce n programarea structurat folosirea funciilor. Activiti: Prezentarea funciilor definite de utilizator Descrierea parametrilor formali i a parametrilor actuali Transmiterea parametrilor prin valoare i transmiterea prin adres (referin)
Exemplu de definire de funcie care returneaz o valoare de tip ntreg: int calcul (int a, int b) { int c; c = a + b; return c; } Exemplu de funcie care nu primete nici un (argument) i nu returneaz nimic: void afisare (void) // sau void afisare () { printf (Functie care nu returneaz nici o valoare...; } Apelarea unei funcii const n folosirea propriu-zis a funciei, ntr-o alt funcie. Apelarea se poate face att n funcia principal (main), ct i ntr-o alt funcie.
Programarea Calculatoarelor
Returnarea unei valori de ctre o funcie se face folosind instruciunea return nainte de ncheierea funciei respective. De asemenea, instruciunea return se poate folosi i pentru ncheierea forat a execuiei unei funcii. O funcie poate returna orice valoare dintr-un tip de baz, cu excepia unui tablou. Dac funcia nu returneaz nici o valoare, atunci se consider c returneaz void (tipul vid). Atenie! dac nu se specific nimic la tipul returnat de funcie, compilatorul C consider c funcia respectiv returneaz o valoare de tip ntreg (va fi semnalat un avertisment (warning) Function should return a value) Exemplu: definirea i apelarea unei funcii care returneaz o valoare ntreag: int calcul (int a, int b) { int c; c = a + b; return c; } void main (void) { int x, y, z; x = calcul (y, z); // apelarea funciei
printf (Rezultatul este %d, x); } Exemplu: definirea i apelarea unei funcii care nu retuneaz nici o valoare: void afisare (void) { printf (Functie care nu returneaz nici o valoare...); } int main (void) { int x, y, z; afisare (); return 0; } nainte de a fi folosit, o funcie poate fi declarat. Declararea (precizarea prototiplui) unei funcii este necesar doar dac funcia respectiv este declarat (n program) dup ce a fost declarat funcia main (), sau dac se folosete o funcie ntr-o alt funcie, nainte ca prima s fie declarat. Declararea (prototipul) funciei afisare () definit anterior este urmtorul: void afisare (void); // apelarea funciei
Programarea Calculatoarelor
int getmin (int n, int a[]) { int min, i; // min, i - variabile locale min = a[0]; for (i = 1; i < n; i++) if (min > a[i]) min = a[i]; return min; } Exemplu: funcie pentru cutarea poziiei unui numr ntr-un ir de numere ntregi: int poz (int n, int a[], int nr_cautat) { int poz, i; for (i = 0; i < n; i++) if (nr_cautat == a[i]) { poz = i; } return poz; } Argumentele (parametrii) cu care este definit o funcie sunt numii parametrii formali. Dup ce a fost definit funcia, parametrii formali pot fi folosii n funcia respectiv ca i variabile locale obinuite. Ei sunt numii formali deoarece funcia nu va fi apelat cu parametrii respectivi, ci cu parametrii de tipurile respective (ei sunt precizai pentru a se cunoate prototipul funciei respective). Parametrii actuali sunt parametrii cu care se apeleaz propriu-zis o funcie. n exemplul urmtor se pot observa cele dou tipuri de parametrii: float medie (int a, int b) // a, b - parametrii formali { float c; // c variabil local c = (a + b) / 2; return c; } int main (void) { int y, z; float x;
// x, y, z - variabile locale
x = calcul (y, z);// y, z - parametrii actuali printf (Rezultatul este %f, x); return 0; }
Programarea Calculatoarelor
8.3.1
Transmiterea parametrilor prin valoare const n copierea valorii unui argument ntr-un parametru formal al unei funcii. n cazul transmiterii prin valoare, modificrile efectuate asupra parametrului formal NU au efect asupra argumentului funciei. Transmiterea parametrilor prin valoare este cea mai folosit metod de transfer din limbajul C. Exemplu: float medie (int a, int b) { float c; c = (a + b) / 2; return c; } int main (void) { int y, z; float x; x = calcul (y, z); printf (Rezultatul este %f, x); return 0; } Transmiterea matricelor ca argumente pentru o funcie reprezint o excepie de la regula de transmitere prin valoare a parametrilor. Dac se folosete o matrice ca i argument al unei funcii, atunci funciei respective i se transmite adresa matricei respective (adresa primului element al matricei), iar funcia respectiv poate aciona asupra coninutului matricei respective. Exemplu de transformare a unui ir de caractere n majuscule: void majuscule (char *sir) { int i; for (i = 0; sir[i]; i++) { sir[i] = toupper (sir[i]); printf (%c, sir[i]); } } int main (void) { char sir1[50]; gets(sir1); majuscule (sir1); return 0; } Exemplu de program care realizeaz citirea unei matrice de numere ntregi: #include <stdio.h> int citire (int tablou[]) /* funcia are ca parametru tabloul de numere ntregi care este iniial gol // apelarea funciei
Programarea Calculatoarelor
- elementele tabloului se pstreaz i la prsirea funciei - funcia returneaz numrul de numere ntregi introduse n tablou */ { int i, nr; printf ("Numarul de elemente al tabloului:"); scanf("%d", &nr); for (i=0;i<nr;i++) { printf("Dati elementul %d >",i); scanf ("%d", &tablou[i]); } return nr; } int main(void) { int n; int tab[20]; n=citire(tab); return 0; }
8.3.2
n limbajul C exist i instrumente prin care se poate simula un transfer prin referin. Pentru a transfera un obiect V ca parametru prin referin, se transfer un pointer ctre V; parametrul formal va fi un pointer ctre valoarea obiectului V. Transmiterea parametrilor prin referin const n copierea adresei unui argument ntr-un parametru. n funcia n care se face apelarea, este folosit adresa respectiv pentru accesarea argumentului folosit efectiv la apelare. n transmiterea prin adres, modificrile efectuate asupra unui parametru formal afecteaz argumentul cu care se face apelarea funciei (parametrul actual). Pentru a folosi transmiterea prin referin, argumentele funciei trebuie declarate ca pointeri. Exemplu interschimbarea a dou numere: void interschimba (int *a, int *b) //transmit prin adres { int c; c = *a; *a = *b; *b = c; } int main (void) { int *x, *y; int z, w; x = &z; y = &w;
// parametrii locali - pointeri // parametrii locali // z i w sunt folosite pentru // iniializarea celor doi pointeri
Programarea Calculatoarelor
printf ("Introd. valoarea pentru al doilea numar: "); scanf ("%d", y); interschimba (x, y); // apelarea funciei interschimba (&z, &w); // apel recomandat al funciei printf ("Nr. interschimbate sunt %d si %d", *x, *y); getch (); return 0; }
Programarea Calculatoarelor
scanf (%d, luna); printf (Introduceti anul: ); scanf (%d, an); } int main (void) { int *a, *b, *c; int x, y, z; a = &x; b = &y; c = &z; //iniializarea pointerilor citire_data (a, b, c); printf (Data citita este: %d %d %d, *a, *b, *c); return 0; }
6.