Documente Academic
Documente Profesional
Documente Cultură
/* lista corecta
/* lista incorecta
*/
*/
O list poate s vid, adic s nu conin parametrii. ntr-un asemenea caz, se poate
folosi cuvntul void ncadrat de paranteze rotunde sau numai de paranteze, care nu trebuie s
lipseasc.
Exemple de declaraii de liste vide:
f(void)
g()
Fiecare funcie este un bloc de cod discret. O funcie nu poate avea acces la codul unei
alte funcii dect printr-un apel de funcie. Variabilele declarate ntr-o funcie sunt variabile
locale, adic sunt create la intrarea n funcia respectiv i distruse la ieirea din aceasta. Nu se
poate defini o funcie ntr-o alt funcie, deci toate funciile au aceeai sfer de influen.
Apelul unei funcii
Apelul unei funcii se face specificnd numele funciei urmat de lista parametrilor
actuali. Aceasta este format din variabile, constante sau expresii compatibile ca tip cu
parametrii formali, adic fiecrui parametru formal i se asociaz o variabil, o constant sau o
expresie compatibil ca tip.
58
Dac lista de parametrii este vid, apelul se face specificnd numale funciei urmat de
paranteze rotunde.
De exemplu, n cazul funciilor:
int f(int k,int i,float a)
int g(void)
apeluri ale funciilor apar n urmtoarea secven:
int m, j;
float b;
j=g();
f(m, j+1, 12.5);
60
61
/* Radacina polinom */
#include <stdio.h>
#include <conio.h>
#include <math.h>
float cit_nr(char c);
void cit_sir(int n, float *p);
float val_pol(int n, float *p, float x);
void calc_rad(int n,float *a,float p,float q);
void main(void)
{
int n;
float a[50];
float p,q;
clrscr();
n=(int)cit_nr('n');
cit_sir(n,a);
p=cit_nr('p');
q=cit_nr('q');
calc_rad(n,a,p,q);
getch();
}
float cit_nr(char c)
{
float x;
printf("%c=",c);
scanf("%f",&x);
return x;
}
void cit_sir(int n, float *p)
{
int i;
float x;
printf("Coeficientii polinomului:\n");
for (i=0;i<=n;)
{
printf("a[%d]=",i++);
scanf("%f",&x);
*p++=x;
}
}
62
getch();
}
int cit_nr(char c)
{
int i;
printf("%c=",c);
scanf("%d",&i);
return i;
}
void cit_mat(char c, int n,float p[10][10])
{
int i,j;
float x;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{
printf("%c[%d,%d]=",c,i,j); scanf("%f",&x);
p[i][j]=x;
}
}
void afis_mat(int n, float p[10][10])
{
int i,j;
for (i=0;i<n;)
{
for (j=0;j<n-1;) printf("%f ",p[i][j++]);
printf("%f\n",p[i++]j[]);
}
}
void prod_mat(int n, float a[10][10], float b[10][10])
{
int i,j,k;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{
b[i][j]=0;
for (k=0;k<n;k++)
b[i][j]+=a[i][k]*a[k][j];
};
}
Funcii care returneaz pointeri
Pointerii sunt adrese de memorie ale anumitor tipuri de date. Deoarece fiecare tip de
date are o anumit lungime i aritmetica pointerilor se bazeaz pe tipul de date ctre care
indic acetia, trebuie cunoscut tipul de date ctre care indic un pointer. Din acest motiv,
64
pentru o funcie care returneaz un pointer, trebuie s se declare explicit tipul acestuia. Forma
general de declarare a unei astfel de funcii este urmtoarea:
tip_rezultat *nume_funcie ( lista_tip_parametrii );
De exemplu, programul Functie care returneaza pointer utilizeaz fincia *cauta_nr()
care returneaz un pointer de tip float care este adresa elementului unui ir, dac acesta
coincide cu o valoare cutat x, sau valoarea NULL, n caz contrar.
/* Functie care returneaza pointer */
#include <stdio.h>
#include <conio.h>
float cit_nr(char c);
void cit_sir(char c, int n, float *p);
float *cauta_nr(int n, float *p, float x);
void afis_sir(int n, float *p);
void main()
{
int n;
float a[100],x,*p;
clrscr();
n=(int)cit_nr('n');
cit_sir('a',n,a);
x=cit_nr('x');
p=cauta_nr(n,a,x);
if (p) afis_sir(n-(int)(p-a),p);
else printf("Numarul %f nu face parte din sir",x);
getch();
}
float cit_nr(char c)
{
float x;
printf("%c=",c);
scanf("%f",&x);
return x;
}
void cit_sir(char c, int n, float *p)
{
int i;
float x;
for (i=0;i<n;)
{
printf("%c[%d]=",c,i++);
65
scanf("%f",&x);
*p++=x;
}
}
float *cauta_nr(int n, float *p, float x)
{
int i;
for (i=0;i++<n;) if (*p==x) return p;
else p++;
return NULL;
}
void afis_sir(int n, float *p)
{
int i;
for (i=0;i++<n;)
printf("%f ",*p++);
}
Pointeri ctre funcii
Limbajul C permite operarea cu variabile de tip pointer care conin adresa de nceput a
codului executabil al unei funcii. Forma general de declarare a unui astfel de pointer ctre o
funcie este urmtoarea:
tip_rezultat (*nume_pointer) ( lista_tip_parametrii );
Observaie: La declararea unei funcii care returneaz un pointer, spre deosebire de
declararea unui pointer care ctre o funcie, nu se utilizeaz paranteze rotunde. De exemplu:
float *f (float a, float b); /* functie */
float (*p)(float a, float b); /* pointer */
Adresa unei funcii se obine dac unui pointer de funcii, compatibil ca tip i
parametrii cu funcia, i se atribuie numele funciei, fr ca acesta s fie urmat de paranteze. De
exemplu, pentru funcia f i pointerul de funcie p, din declaratia anterioar, se poate face
atribuirea:
p=f; /* atribuire de functie catre un pointer compatibil */
Apelul funciei se face specificnd, ntre paranteze rotunde, operatorul * urmat de
numele funciei i parametrii actuali. n cazul exemplului de mai sus, un apel este urmtorul:
float a,b,c;
c=(*p)(a,b); /* apel de functie */
Programul Pointeri catre o functie afieaz suma, diferena, produsul sau ctul a dou
numere reale a i b, utiliznd pointerul de funcie p cruia, succesiv, i se atribuie adresele unor
funcii compatibile: suma, dif, prod i cat.
66
67
68
ui cit_nr(char c)
{
ui x;
printf("%c=",c);
scanf("%u",&x);
return x;
}
uli fact(int n)
{
uli f=1;
if (n) f= n*fact(n-1);
return f;
}
Modificatorul const cu parametrii de funcii
Cnd un pointer este transmis ca parametru unei funcii, funcia poate s modifice
valoarea variabilei indicate de pointer. n anumite cazuri, este necesar ca funcia s nu
modifice valoarea indicat de un argument pointer. O asemenea situaie apare n cazul
tablourilor, situaie n care transferul se face n mod obligatoriu prin referin. Pentru ca
anumite obiecte, indicate de argumentele unei funcii, s nu fie modificate de funcia
respectiv, se utilizeaz modificatorul const.
Aceste aspecte sunt evideniate n urmtorul program:
/* Functiile si modificatorul const */
#include <stdio.h>
#include <conio.h>
#include <string.h>
void modif_sir(char *p1, char const *p2);
void main()
{
clrscr();
char s1[50],s2[50];
printf("Introduceti s1:");gets(s1);
printf("Introduceti s2:");gets(s2);
printf("\nInainte de apel functie:\n");
printf("s1=%s\ns2=%s\n",s1,s2);
modif_sir(s1,s2);
printf("\nDupa apel functie\n");
printf("s1=%s\ns2=%s\n",s1,s2);
69
getch();
}
void modif_sir(char *p1, char const *p2)
{
char *p;
p=p1;
for (; *p1;++p1) if (*p1==' ') *p1='+';
printf("\nApel functie\n");
printf("p1=%s\np2=",p);
/*
70
*/