Documente Academic
Documente Profesional
Documente Cultură
tip nume([lista-parametri-formali])
unde:
• tip poate fi un tip simplu de dată. Dacă lipseşte, este considerat tipul implicit
(int pentru unele compilatoare, void pentru altele);
• nume este un identificator care reprezintă numele funcţiei;
• lista-parametrilor-formali conţine parametrii formali sub forma:
Parametrii sunt separaţi prin virgulă. La limită, lista poate fi vidă. Pentru fiecare
parametru trebuie specificat tipul, chiar dacă mai mulţi parametri sunt de acelaşi
tip (nu este posibilă definirea de liste de parametri cu acelaşi tip).
Pentru funcţiile care nu întorc o valoare prin numele lor, tipul funcţiei va fi
void sau va fi omis.
return(expresie); sau
return expresie; sau
return;
Exemple: Să se scrie o funcţie care calculează cel mai mare divizor comun dintre
două numere întregi nenule, utilizând algoritmul lui Euclid şi un apelant pentru
testare.
#include <stdio.h>
/*definirea functiei cmmdc*/
int cmmdc(int a, int b)
{ int r,d=a,i=b;
do {r=d%i;
d=i; i=r;}
while(r<>0);
return i;}
void main()
{ int n1,n2;
printf("Numerele pentru care se va calcula cmmdc:");
scanf("%d%d",&n1,&n2);
if(n1&&n2) printf("\ncmmdc=%d",cmmdc(n1,n2));
else printf("Numerele nu sunt nenule!"); }
#include <stdio.h>
/* prototipul functiei cmmdc*/
int cmmdc(int, int);
void main()
{ int n1,n2;
printf("Numerele pentru care se va calcula cmmdc:");
scanf("%d%d",&n1,&n2);
if(n1&&n2) printf("\ncmmdc=%d",cmmdc(n1,n2));
else printf("Numerele nu sunt nenule! ");
}
/*definirea functiei cmmdc*/
int cmmdc(int a, int b)
{ int r,d=a,i=b;
do {r=d%i;
d=i; i=r;}
while(r<>0);
return i;
}
Subprograme
Principial, transferul se poate face prin valoare sau prin adresă. În limbajul
C este implementat numai transferul prin valoare (valoarea parametrului real este
copiată în stivă, iar subprogramul lucrează numai cu această copie). Operaţiile
efectuate asupra unui parametru formal scalar (care nu este masiv) nu modifică, la
ieşirea din subprogram, parametrul real corespunzător.
Transferul valorii este însoţit de eventuale conversii de tip realizate pe
baza informaţiilor de care dispune compilatorul despre subprogram. Dacă
prototipul precede apelul subprogramului şi nu există o sublistă variabilă de
parametri, conversiile se fac similar atribuirilor.
Exemplu:
tip_returnat nume(tip_parametru p); Ù p este transferat prin valoare
Exemplu:
tip_returnat nume(tip_parametru *p); Ù p este transferat prin valoare,
fiind adresa parametrului real.
Exemple:
1. Să se calculeze produsul scalar dintre doi vectori.
a) rezultatul se întoarce prin numele funcţiei:
Programarea calculatoarelor
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
void main()
{ int i,j,p,n,l,m; float **a,**ap,f;
clrscr();
printf("\n n=");
scanf("%i",&n);
a=(float **)malloc(n*sizeof(float *));
for(i=0;i<n;i++)
*(a+i)=(float *)malloc(n*sizeof(float));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{scanf("%f ",&f);
*(*(a+i)+j)=f;
}
scanf("%i",&p);
ap=putere(a,p,n);
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
printf("%f ",*((*(ap+i)+j)));
printf("\n");
}
getch();
}
Subprograme
Exemplu:
1. Fie un subprogram care calculează suma elementelor unui vector v de lungime n.
Variabilele globale se declară în afara funcţiilor. Ele pot fi referite din orice
alte funcţii. De aceea, schimbul de valori între apelant şi apelat se poate realiza prin
intermediul lor. Variabilele declarate într-o funcţie se numesc locale (din clasa
automatic) şi pot fi referite numai din funcţia respectivă. Domeniul de valabilitate
a unei variabile locale este blocul (funcţia sau instrucţiunea compusă) în care a fost
definită.
Exemplu:
#include <stdio.h>
int a;
float z(char b)
{ int b;
……………
}
main()
{ int c;
……………
{ /* instructiunea compusa r */
int d;
……………
}
}
unde nume_var este o variabilă de tip procedural şi are tipul pointer spre funcţie cu
parametrii lista_parametri_formali şi care returnează o valoare de tipul
tip_rezultat. Lui nume_var i se poate atribui ca valoare doar numele unei funcţii de
prototip:
tip_rezultat nume_f(lista_parametrilor_formali);
tip_rezultat nume_functie(lista_parametrilor_formali)
{ … }
void main()
{ …
f(…, nume_functie, …); }
void main()
{ float tab[10]; int m,i;
printf("Numarul de elemente(<10): ");
scanf("%d ", &m);
for(i=0,i<m;i++)
{printf("a(%d)=",i);
scanf("%f",&tab[i]);
}
printf("Se calculeaza suma elementelor…\n");
functie(tab, m, suma);
printf("Se calculeaza media elementelor…\n");
functie(tab, m, media);
return;
}
/* functia principala*/
void main()
{ float a,b,eps,x;
Subprograme
int cod;
long n;
float (*functie)(float);
clrscr();
printf("Introduceti capetele intervalului:");
scanf("%f%f",&a,&b);
printf("\nEroarea admisa:");
scanf("%f",&eps);
printf("\nNumarul maxim de iteratii:");
scanf("%li",&n);
functie=fct;
bisectie(a,b,functie,eps,n,&cod,&x);
if(!cod)
printf("\nNu se poate calcula solutia aproximativa");
else
printf("\n Solutia aproximativa este: %f",x);
}
unde ultim reprezintă numele ultimului parametru din sublista variabilă. În unele
situaţii (vezi exemplele) se transferă în acest parametru numărul de variabile
trimise.
Programarea calculatoarelor
unde tip_element este tipul elementului transferat din listă. După fiecare apel al
funcţiei va_arg, variabila ptlist este modificată astfel încât să indice următorul
parametru.
- va_end încheie operaţia de extragere a valorilor parametrilor şi trebuie apelată
înainte de revenirea din funcţie. Prototipul funcţiei este:
Exemple:
1. Să se calculeze cel mai mare divizor comun al unui număr oarecare de numere
întregi.
#include<stdio.h>
#include<conio.h>
#include<stdarg.h>
int cmmdc_var(int,...);
int cmmdc(int, int);
void main()
{ int x,y,z,w;
clrscr();
scanf("%d%d%d%d",&x,&y,&z,&w);
printf("\nCmmdc al primelor 3 numere:%d\n",cmmdc_var(3,x,y,z));
printf("\nCmmdc al tuturor numerelor:%d\n",cmmdc_var(4,x,y,z,w));
}
void main()
{ int n1,n2,n3,n4;
double x1[10],x2[10],x3[10],x4[10],z[50];
clrscr();
scanf("%d%d%d%d",&n1,&n2,&n3,&n4);
for(int i=0;i<n1;i++)
scanf("%lf",&x1[i]);
for(i=0;i<n2;i++)
scanf("%lf",&x2[i]);
for(i=0;i<n3;i++)
scanf("%lf",&x3[i]);
for(i=0;i<n4;i++)
scanf("%lf",&x4[i]);
inter_var(z,4,x1,n1,x2,n2);
printf("\nRezultatul interclasarii primilor 2 vectori\n");
for(i=0;i<n1+n2;i++)
printf("%lf ",z[i]);
inter_var(z,8,x1,n1,x2,n2,x3,n3,x4,n4);
printf("\nRezultatul interclasarii celor 4 vectori\n");
for(i=0;i<n1+n2+n3+n4;i++)
printf("%lf ",z[i]);
}
Programarea calculatoarelor
void inter(double *x, int n1, double *y, int n2, double *z)
{ int i,j,k;
for(i=0,j=0,k=0;(i<n1)&&(j<n2);k++)
if(x[i]<y[j])
z[k]=x[i++];
else z[k]=y[j++];
if(i<n1)
for(;i<n1;z[k++]=x[i++]);
else for(;j<n2;z[k++]=y[j++]);
}