Documente Academic
Documente Profesional
Documente Cultură
=
b
a
dx ) x ( f 0
va avea prototipul:
do'b$% int%,ra$a(do'b$%, do'b$%, do'b$%(!)(do'b$%));
Definii o funcie pentru calculul unei integrale definite prin metoda trapezelor,cu un numr
fixat n de puncte de diviziune:
Folosii apoi aceast funcie pentru calculul unei integrale definite cu o precizie dat . Aceast
precizie este atins n momentul n care diferena ntre dou integrale, calculate cu n, respectiv /n
puncte de diviziune este inferioar lui
1inc$'d% 2math.h3
n
a b
h c' ) ih a ( f
/
) b ( f ) a ( f
h dx ) x ( f
b
a
1 n
1 i
+ +
+
=
=
do'b$% sinxp();
do'b$% trap%4(do'b$%,do'b$%,int,do'b$%(!)());
do'b$% a=0.0, b=1.0, %ps=1567;
int 8=10;
void main(void)
{ int n=8;
do'b$% 0n,0/n,vabs;
0n=trap%4(a,b,n,sinxp);
do { n!=/;
0/n=trap%4(a,b,n,sinxp);
if((vabs=0n60/n)20) vabs=6vabs;
0n=0/n;
} #hi$%(vabs 3 %ps);
printf(%7./$f\n, 0/n);
}
do'b$% trap%4(do'b$% a,do'b$% b,int n,do'b$%(!f)())
{ do'b$% h,s;
int i;
h=(b6a)9n;
for(s=0.0,i=1;i2n;i&&)
s&=(!f)(a&i!h);
s&=((!f)(a)&(!f)(b))9/.0;
s!=h;
r%t'rn s;
}
4. Declaratii complexe.
6 declaratie complex este o combinaie de pointeri tablouri si functii. (n acest scop se folosesc
atributele:
() 5 functie
*+ 5 tablou
! - pointer
care pot genera urmatoarele combinatii:
! () 5 funcie ce returneaz un pointer
(!)() 5 pointer la o funcie
! *+ - tablou de pointeri
(!) *+ 5 pointer la tablou
* + *+ 5 tablou bidimensional
3xist i combinaii incorecte, provenite din faptul c n , nu este permis declararea:
- unui tablou de funcii
- unei funcii ce returneaz un tablou.
!cestea sunt:
( ) * + 5 funcie ce returneaz un tablou
* + ( ) 5 tablou de funcii
( ) ( ) 5 funcie ce returneaz o funcie
4entru a interpreta o declaraie complex vom inlocui atributele prin urmtoarele abloane text:
!tribut #ablon text
() functia returneaz
*n+ tablou de n
! pointer la
/escifrarea unei declaraii complexe se face aplic7nd regula dreapta stnga care presupune
urmtorii pai:
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-st7nga
se oprete procesul la nt7lnirea tipului datei.
/e exemplu:
int (! a*10+) ( );
tablou de %&
pointeri la
funcii ce returneaz int
do'b$% (!(!pf)())*-+*:+;
pointer la
o funcie ce returneaz un pointer
la un tablou cu 8 linii si 9 coloane de do'b$%
(n loc de a construi declaraii complexe se prefer pentru creterea claritii s definim progresiv
noi tipuri folosind typ%d%f. :eamintim c declaraia typ%d%f asociaz un nume unei definiri de tip:
typ%d%f 2d%finir% d% tip3 id%ntificator;
3xemple:
typ%d%f char !;0<; 9!tip'$ ;0<=sir d% caract%r%!9
typ%d%f f$oat =5>?@<*10+;9!tip'$ =5>?@<=tab$o' d% 10f$oat!9
typ%d%f f$oat AB?<0>5*10+*10+;9!tip'$ AB?<0>5= tab$o' d%
10x10 f$oat !9
typ%d%f do'b$% (!CDBE<E)(do'b$%);9!tip'$ CDBE<E=point%r $a
f'ncti% d% ar,'m%nt do'b$% si r%4'$tat do'b$% !9
;om putea folosi aceste tipuri noi n definirea de variabile:
;0< s1, s/;
=5>?@< b, x;
AB?<0>5 a;
CDBE<E pf1;
Talouri !i pointeri (2).
1. "locarea dinamic# a memoriei.
.tilizatorul poate solicita n timpul execuiei programului alocarea unei zone de memorie.
!ceast zon de memorie poate fi eliberat n momentul n care nu mai este necesar.
!locarea i eliberarea de memorie la execuie permite gestionarea optim a memoriei.
<iblioteca standard ofer 9 funcii av7nd prototipurile n 2a$$oc.h3 i 2std$ib.h3.
!cestea sunt:
void !ma$$oc('nsi,n%d n);
$uncia aloc un bloc de memorie de n octei. $uncia ntoarce un pointer la nceputul zonei
alocate. n caz c cererea de alocare nu poate fi satisfcut funcia returneaz 8FGG.
void !ca$$oc('nsi,n%d n%$%m, 'nsi,n%d dim);
!loc n%$%m!dim octei de memorie (n%$%m blocuri formate din dim octei fiecare*. ntoarce
un pointer la nceputul zonei alocate sau 8FGG.Memoria alocat este iniializat cu zerouri.
void fr%%(void !p);
$uncia elibereaz o zon de memorie indicat de p, alocat n prealabil prin ma$$oc() sau
ca$$oc().
void !r%a$$oc(void !p, 'nsi,n%d dim);
Modific dimensiunea spaiului alocat prin pointerul p, la dim. $uncia ntoarce adresa zonei de
memorie realocate iar pointerul p va adresa zona realocat.
dac dimensiunea blocului realocat este mai mic dec7t a blocului iniial, p nu se modific iar funcia
va ntoarce valoarea lui p.
dac dim==0 zona adresat de p va fi eliberat i funcia ntoarce 8FGG.
dac p==8FGG, funcia aloc o zon de dim octei )ec"ivalent cu ma$$oc()).
$unciile de alocare ntorc pointeri generici (void!) la zone de memorie n timp ce utilizatorul
aloc memorie ce pstreaz informaii de un anumit tip. 4entru a putea accesa memoria alocat indirect
prin intermediul pointerului acesta va trebui s fie un pointer cu tip ceea ce impune conversia explicit
)prin cast* a pointerului ntors de funcia de alocare ntr-un pointer cu tip.
/e exemplu pentru a aloca un vector de ntregi av7nd n elemente vom folosi:
int !pH
if (p=(int!)ma$$oc(n!si4%of(int))==8FGG) {
printf(A%mori% ins'fici%nta\n);
%xit(1);
}
$unciile care ntorc pointeri sunt utile n alocarea de spaiu pentru variabile dinamice.
;ariabilele dinamice sunt alocate n momentul execuiei nu au nume i sunt accesate prin pointeri.
.n constructor este o funcie care aloc spaiu n mod dinamic pentru o variabil i ntoarce un
pointer la spaiul rezervat.
.n destructor este o funcie care primete un pointer la o zon alocat dinamic i elibereaz
aceast zon.
6 funcie util strd'p() 5 salveaz un ir de caractere ntr-o zon alocat dinamic i ntoarce
un pointer la acea zon sau 8FGG.
char !strd'p(char !s)
{ char !p;
p=(char!) ma$$oc(str$%n(s)&1);
if (pI=8FGG)
strcpy(p,s);
r%t'rn p;
}
$xemplul 2%& Citii de la intrarea standard un ir de caractere de lungime necunoscut ntrun vector
alocat dinamic. Alocarea de memorie se va face progresiv, n incremente de lungime 08>, dup citirea a
08> caractere se face o realocare.
char !citir%()
{ char !p, !J;
int n;
'nsi,n%d dim=08>;
p=J=(char!)ma$$oc(dim);
for(n=1; (!p=,%tchar())I=K\nK ""!pI=5@D; n&&) {
if(n%08>==0) {
dim&=08>;
p=J=r%a$$oc(J,dim);
p&=n;
contin'%;
}
p&&;
}
!p=K\0K;
r%t'rn r%a$$oc(J,n);
}
n ,-- alocarea dinamic se face mai simplu i mai sigur folosind operatorii n%# i d%$%t%.
6peratorul n%# permite alocarea de memorie n "eap. 3l se folosete ntr-una din formele:
tip !p, !J, !r;
p=n%# tip; 99r%4%rva in h%ap o 4ona d% si4%of(tip) oct%ti
J=n%# tip(%xpr%si%);99ac%$asi %f%ct c' initia$i4ar% c' va$.%xpr%si%i
r=n%# tip*%xpint+; 99r%4%rva o 4ona n%initia$i4ata d%
99 %xpint!si4%of(tip) oct%ti
3liberarea memoriei alocate se face prin:
d%$%t% p;
d%$%t% *+ r; 99%$ib%r%a4a m%moria a$ocata p%ntr' tab$o'
2. Pointeri la pointeri.
!dresa unei variabile pointer va fi de tip pointer ctre pointer )pointer dublu*
# considerm definiiile:
int x=10, !px="x, !!ppx="px;
care corespund situaiei:
ppx px x
pentru a obine valoarea %& putem folosi x, !px sau !!ppx.
6 funcie care intersc"imb doi pointeri are forma:
void pschimb(int !!pa, int !!pb)
{ int !pt%mp;
pt%mp=!pa;
!pa=!pb;
!pb=pt%mp;
}
cu apelul:
int !px, !py;
pschimb("px, "py);
/eoarece un tablou este accesat printr=un pointer tablourile de pointeri pot fi accesate cu pointeri
dubli:
char !a*10+;
char !!pa;
p=a;
$uncia de afiare a irurilor de caractere adresate de un tablou de
pointeri poate fi rescris ca:
void afisar%(char !!tp, int n)
{ #hi$%(n66)
printf(%s\n,!tp&&);
}
3. Talouri multidimensionale.
%&
.n tablou cu mai multe dimensiuni se definete prin:
tip n'm%*d1+*d/+L*dn+;
:eferirile la elemente unui tablou cu mai multe dimensiuni se fac folosind variabile indexate de
forma: n'm%*i1+*i/+L*in+, n care 02=iM2=dM61
.n tablou cu n dimensiuni poate fi considerat ca un tablou cu o dimensiune av7nd ca elemente
tablouri cu n61 dimensiuni.
3lementele tabloului ocup o zon continu de memorie de:
d1 x d/ xLx dn x si4%of(?) octei.
!dresa n memorie a unui element a*i1+*i/+L*in+ este dat de funcia de alocare:
"a*i1+*i/+L*in+=a&si4%of(?)!*i1!d/!L!dn&i/!d-!L!dn&L&in+
n cazul vectorilor: "a*i+=a&si4%of(?)!i
aceasta ne permite ca la declararea unui parametru vector s nu specificm dimensiunea tabloului.
n cazul matricilor compilatorul le transform n vectori:
"a*i+*N+=a&si4%of(?)!(i!>&N)
>i n cazul matricelor ca i la vectori putem nlocui indexarea prin operaii cu indici i avem:
a*i+*N+ = (!(a&i)*N+=!(!(a&i)&N)
2a transmiterea unui tablou multidimensional ca parametru al unei funcii vom omite numai prima
dimensiune celelalte trebuind s fie specificate.
4rin urmare prototipul unei funcii de afiare a unei matrici av7nd $ linii i c coloane nu poate fi
scris ca:
void matprint(int a*+*+, int $, int c);
ci:
void matprint(int a*+*EABO+, int $, int c);
n care EABO este numrul de coloane al matricii din apel ceeace ne limiteaz utilizarea funciei numai
pentru matrici cu EABO coloane!
;om reda generalitate funciei de afiare a matricilor declar7nd matricea parametru ca un vector
de pointeri:
void matprint(int (!a)*+, int $, int c)
{ int i,N;
for(i=0;i2$;i&&)
{ for (N=0;N2c;N&&)
printf(%d,((int!)a)*i!n&N+;
printf(\n);
}
}
4roblema transmiterii matricilor ca parametri poate fi evitat dac le linearizm transform7ndu-le
n vectori. n acest caz n locul folosirii a doi indici i i j vom folosi un singur indice:
M=i!>&N
$xemplul 3'& !criei o funcie pentru nmulirea a dou matrici B i P av"nd mxn, respectiv nxp
elemente.
Matricea produs va avea mxp elemente care vor fi calculate cu relaia:
void matprod(int m,int n, int p,
=
=
1 n
0 M
MN iM iN
P B >
do'b$% B*+, do'b$% P*+, do'b$% >*+)
{ int i, N, M, iN;
for (i=0; i2m; i&&)
for (N=0; N2p; N&&) {
iN=i!p&N;
for (M=0; M2n; M&&)
>*iN+=>*iN+&B*i!n&M+!P*M!p&N+;
}
}
#oluia propus nu ne permite s acceesm elementele matricelor folosind ? indici.
!m putea nlocui matricea printr-un vector de pointeri la liniile matricei.
Exemplul 31: Definii o funcie care aloc dinamic memorie pentru o matrice avnd l linii i c
coloane.
a plin pelem
plin[0] pelem[0][0]
plin[1] pelem[0][1]
plin[2] pelem[1][0]
pelem[1][1]
pelem[2][1] pelem[2][0]
do'b$% !!a$ocmat(int $in, int co$)
{ do'b$% !!p$in;
do'b$% !p%$%m;
int i;
p%$%m=(do'b$%!)ca$$oc($in!co$, si4%of(do'b$%));
if(p%$%m==(do'b$%!)8FGG){
printf(spati' ins'fici%nt\n);
%xit(1);}
p$in=(do'b$%!!)ca$$oc($in, si4%of(do'b$%!);
if(p$in==(do'b$%!!)8FGG){
printf(spati' ins'fici%nt\n);
%xit(1);
}
for (i=0; i2 $in; i&&) {
p$in*i+=p%$%m;
p%$%m&=co$;
}
r%t'rn p$in;
}
4. Proleme propuse.
%. # se construiasc un patrat magic de dimensiune n )cu n impar* adic o matrice cu n linii i n coloane
av7nd elemente numerele naturale 1,/,...,n
/
astfel nc7t sumele elementelor pe linii pe coloane i pe
cele dou diagonale s fie identice.
? .# se stabileasc dac exist elemente comune tuturor liniilor unei matrici date. #e vor afia c7te
asemenea elemente sunt care sunt acestea i apoi se va indica ce poziie ocup acestea n fiecare linie.
8. 6 matrice ptrat a are n linii i n coloane. ,ele dou diagonale determin patru zone notate %?89
care nu includ elementele de pe diagonale.
# se calculeze mediile geometrice ale elementelor pozitive din zonele % i ?. /ac media nu se poate
calcula se va afia un mesaj corespunztor.
# se calculeze procentajul de elemente strict pozitive din zona 8 i numrul de elemente divizibile cu '
din zona 9./ac nu exist elemente cu proprietile cerute se va afia un mesaj corespunztor.
9. #e dau dou matrici B i P ptrate de ordin n. # se stabileasc dac cele dou matrici sunt sau nu
una inversa celeilalte.n acest scop se creeaz matricea produs >=B!P i se verific dac aceasta este
matricea unitate.
'. /intr-o matrice ! av7nd n linii i n coloane s se afieze liniile care reprezint iruri ordonate
cresctor i coloanele care reprezint iruri ordonate descresctor.
@. 6 matrice a are p linii i J coloane. # se creeze o nou matrice b, din matricea a, except7nd liniile i
coloanele la intersecia crora se afl elemente nule.#e vor utiliza doi vectori n care se vor marca
liniile respectiv coloanele care nu vor apare n b.
A. #e consider o matrice B cu p linii i J coloane de elemente reale. # se creeze pe baza acesteia o nou
matrice P av7nd m coloane cu elementele pozitive din B i un vector > cu elementele negative din
matricea B.
B. #e d o matrice B ptrat cu n linii i n coloane. # se fac sc"imbrile de linii i de coloane astfel
nc7t elementele diagonalei principale s fie ordonate cresctor.
C. # se calculeze coeficieni polinomului ,eb7ev de ordinul n, pornind de la relaia de recuren
?
M
(x) = /x?
M61
(x) Q ?
M6/
(x), M 3 /
?
0
(x) = 1, ?
1
(x) = x
obin7nd n prealabil relaii de recuren pentru coeficieni.
10. a* # se defineasc o funcie care calculeaz produsul scalar a doi vectori adic:
b* # se defineasc o procedur care calculeaz produsul diadic a doi vectori:
c* # se scrie un program care citete: un numr ntreg n ( n 2= 10 ), o matrice ptrat B cu n
linii i coloane i doi vectori ' i v cu c7te n componente i calculeaz matricea P, n care:
P = B 6 '.vR9'R.v
%%. # se scrie un program care citete un numr ntreg n i o matrice ptrat B cu n linii i coloane i
afieaz numerele liniilor av7nd n prima poziie elementul minim i n ultima poziie - elementul
maxim din linie. #e vor afia de asemenea numerele coloanelor av7nd n prima poziie elementul maxim i
n ultima elementul minim.
%?. # se realizeze un program care simuleaz jocul DviaaD adic traseaz populaia unei comuniti de
organisme vii prin generarea de nateri i mori timp de S generaii.
i
1 n
0 i
i
?
y x y x
=
=
1 n 1 n 1 1 n 0 1 n
1 n 1 1 1 0 1
1 n 0 1 0 0 0
?
y x y x y x
y x y x y x
y x y x y x
y x
,omunitatea de organisme este descris printr-o matrice cu 8 linii i 8 coloane fiecare element
reprezent7nd o celul care poate fi vid sau poate conine un organism. $iecare celul din reea
except7ndu-le pe cele de la periferie are B vecini.
0aterile i morile de organisme se produc simultan la nceputul unei noi generaii. 2egile
genetice care guverneaz creterea i descreterea populaiei sunt:
fiecare celul vid care este adiacent la 8 celule ocupate va da natere n urmtoarea generaie la un
organism
fiecare celul care conine un organism ce are numai un vecin sau niciunulva muri la nceputul
generaiei urmtoare)datorit izolrii*
orice organism dintr-o celul cu patru sau mai muli vecini n generaia prezent va muri la nceputul
generaiei urmtoare)datorit suprapopulaiei*.
%8. # se scrie n ,:
6 funcie care verific dac dou linii date i i N dintr-o matrice ptrat (nxn) sunt identice sau
nu.
6 funcie care afieaz numerele liniilor i coloanelor dintr-o matrice ptrat unde se afl elemente
nule )zero*.
.n program care citete o matrice ptrat cu maxim 8& de linii i coloane de numere ntregi verific
dac exist sau nu ? linii identice n aceast matrice folosind funcia de la punctul a*. /ac toate
liniile sunt distincte atunci se afieaz poziia tuturor elementelor nule din matrice folosind funcia de
la punctul b*
%9. # se nmuleasc dou matrici utiliz7nd o funcie pentru calculul produsului scalar a doi vectori.
%'. #e d o matrice B av7nd G linii i > coloane (G,>10, >3-) de elemente ntregi.
# se afieze liniile n care exist cel puin trei elemente av7nd minim cinci divizori nebanali. #e va
defini i utiliza o funcie care stabilete c7i divizori nebanali are un numr dat.
%@. # se defineasc o funcie care calculeaz diferena ntre elementul maxim i elementul minim ale
unei linii date dintr-o matrice.
# se scrie un program care citeste: numerele naturale $ i c ($,c 10), valoarea real eps i
matricea B av7nd $ x c elemente i afieaz liniile din matrice care au diferena ntre extreme
inferioar valorii %ps.
%A. (ntr-o matrice dat B cu G linii i > coloane s se permute circular dreapta fiecare linie i cu i
pozitii. #e va utiliza o funcie care permut circular dreapta cu o poziie componentele unui vector.
%B. 4entru o matrice dat B cu G linii i > coloane s se afieze toate cuplurile (i,N) reprezent7nd
numere de linii av7nd elementele respectiv egale. #e va defini i utiliza o funcie care stabilete dac doi
vectori sunt sau nu egali.
%C. #e dau dou matrici A i B av7nd n linii i coloane fiecare. # se stabileasc dac una dintre ele este
sau nu inversa celeilalte. #e va defini i utiliza o funcie pentru a nmuli dou matrici.
?&. .n punct a ntr-o matrice este un element maxim pe coloan i minim pe linia pe care se afl sau
minim pe coloan i maxim pe linia sa..tiliz7nd funcii care verific dac un element este
minim=maxim pe linia=coloana sa s se determine punctele n a dintr-o matrice cu elemente distincte.
21. /oi vectori x i y cu cite n componente fiecare (n 2= /0) se afl n relaia x 2= y
dac x
i
2= y
i
,pentru iH=0..n61
# se defineasc o funcie care primind ca parametri dou linii i i k ale unei matrici stabilete dac
acestea se afl n relaia 2=.
# se defineasc o funcie care primind ca parametri numerele a dou linii dintr-o matrice calculeaz
diferena lor depun7nd rezultatul ntr-un vector.
# se scrie un program care citete un numr ntreg n (n 2= /0) i o matrice cu n linii i
coloane i afieaz pentru toate perec"ile de linii care nu se gsesc n relatia 2= diferena lor.
??. # se defineasc o funcie care stabilete dac o linie specificat a unei matrici este sau nu o secven
ordonat cresctor.
# se defineasc o funcie care pentru o linie specificat a unei matrici determin elementul minim
i elementul maxim din acea linie.
#e citete o matrice ptrat B cu n linii i coloane (n 2= 10). # se afieze pentru fiecare linie care
nu reprezint un ir de valori cresctoare: numrul liniei elementul maxim i elementul minim.
(ndicaie: 6 linie i dintr-o matrice reprezint o secven ordonat cresctor dac:
B
0,N
2= B
0,N&1
pentru NH= 1..n61.
?8. # se defineasc o funcie care stabilete dac doi vectori dai ca parametri sunt sau nu ortogonali.
# se scrie un program care citete o matrice ptrat cu n linii i coloane i stabilete dac matricea
este sau nu ortogonal pe linii i n caz afirmativ calculeaz matricea invers. #e tie c pentru o
matrice ortogonal matricea invers se obine transpun7nd matricea dat i imprind fiecare coloan
cu norma euclidian a ei )radicalul produsului scalar al coloanei cu ea nsi*. 6 matrice este
ortogonal dac oricare dou linii diferite sunt ortogonale.