Professional Documents
Culture Documents
=
(
+ +
+
=
}
=
1
1
) (
2
) ( ) (
) (
Calculul unei integrale definite.
#include <math.h>
double sinxp();
double
trapez(double,double,int,double(*)(double));
double a=0.0, b=1.0, eps=1E-6;
int N=10;
void main(void)
{ int n=N;
double In,I2n,vabs;
In=trapez(a,b,n,sinxp);
do { n*=2;
I2n=trapez(a,b,n,sinxp);
if((vabs=In-I2n)<0) vabs=-vabs;
In=I2n;
} while(vabs > eps);
printf(%6.2lf\n, I2n);
}
Integrala unei functii definite.
double trapez(double a,double b,int
n,double(*f)(double))
{ double h,s;
int i;
h=(b-a)/n;
for(s=0.0,i=1;i<n;i++)
s+=(*f)(a+i*h);
s+=((*f)(a)+(*f)(b))/2.0;
s*=h;
return s;
}
double sinxp(double x)
{ return sin(x*x); }
Declaratii complexe.
O declaratie complex este o combinaie de pointeri, tablouri
si functii. In acest scop se folosesc atributele:
() functie
[] tablou
* - pointer
care pot genera urmatoarele combinatii:
* () funcie ce returneaz un pointer
(*)() pointer la o funcie
* [] - tablou de pointeri
(*)[] pointer la tablou
[][] tablou bidimensional
Exist i combinaii incorecte, provenite din faptul c nu
este permis
declararea unui tablou de funcii
Declararea unei funcii ce returneaz un tablou
Declaratii complexe.
Combinatiile interzise sunt:
()[] funcie ce returneaz un tablou
[]() tablou de funcii
()() funcie ce returneaz o funcie
Regula dreapta stnga:
se incepe cu identificatorul
se caut n dreapta identificatorului un atribut
dac nu exist, se caut n partea stang
se substituie atributul cu ablonul text corespunztor
se continu substituia dreapta-stnga
se oprete procesul la ntlnirea tipului datei.
Declaratii complexe exemple.
int (* a[10]) ( );
tablou de 10
pointeri la
funcii ce returneaz int
double (*(*pf)())[3][4];
pointer la
o funcie ce returneaz un pointer
la un tablou cu 3 linii si 4 coloane de
double
Declaratii complexe.
Pentru creterea claritii, s definim progresiv noi tipuri
folosind typedef
/*tipul SIR=sir de caractere*/
typedef char *SIR;
/*tipul VECTOR=tablou de 10float*/
typedef float VECTOR[10];
/*tipul MATRICE= tablou de 10x10 float*/
typedef float MATRICE[10][10];
/*tipul PFADRD=pointer la functie de
argument double si rezultat double */
typedef double (*PFADRD)(double);
Declaratii complexe.
SIR s1, s2;
VECTOR b, x;
MATRICE a;
PFADRD pf1;
Tablouri multidimensionale
typedef struct nod3{
int n;
double *v;
} N3;
typedef struct nod2{
int n;
N3 **pn3;
} N2;
N2 *alocmat() {
N2 n2, *p2=&n2;
int i, j, n;
scanf("%d", &n);
p2->n = n;
p2->pn3=(N3**)malloc(n*sizeof(N3*));
for(i=0; i<n; i++)
{ p2->pn3[i]=(N3*)malloc(sizeof(N3));
scanf("%d", &p2->pn3[i]->n);
p2->pn3[i]->v=(double*)malloc(p2->pn3[i]->n* sizeof(double));
}
return p2;
}