Documente Academic
Documente Profesional
Documente Cultură
<
'
+
+ +
x daca
x daca
x daca
x x
x x
x f
0.A. S se scrie un program care citete un numr real ., ce
reprezint msura unui ung&i n radiani, i l transform n grade, minute i
secunde se.agesimale.
0.B. S se scrie un program care simuleaz funcionarea unui
numrtor de tip ceas Dse indic ora, minutul i secunda#.
0.C. Scriei un program pentru a indica numrul de octei ocupai n
memorie de tipurile de date din limbajul C*C++.
>?
0.E. Convertii n binar, prin calcul, anul naterii i anul curent.
-rtai cum se reprezint ca o dat de tip int. !fectuai operaiile de
deplasare stnga cu 6 bii, dreapta cu > bii, complement fa de 2 asupra lor,
precum i operaiile pe bii V, Y, W , avnd ca operanzi cele dou date. Scriei
un program pentru a verifica corectitudinea calculelor dumneavoastr.
0.2?. Scriei un program ce efectueaz operaii aritmetice asupra a
dou date de tip ntreg i real. !.ecutai-l pentru valori care conduc la
rezultat n afara limitelor de reprezentare intern. Ce se ntmpl n acest
cazP
>2
Lucrarea de laborator nr. 3
INSTRUCIUNI
1. Co/0i/utul lu1r2rii
/n lucrare sunt prezentate principalele instruciuni simple i
structurate din limbajul C*C++" instruciunea e.presie, instruciunea vid,
instruciunea compus, instruciunea i6, instruciunea 3`it15 i instruciunile
repetitive.
2. Co/3i4era0ii teoreti1e
)rogramul structurat este un program care are o structur de control
realizat numai cu"
- structura secvenial$
- structura alternativ i selectiv$
- structura repetitiv.
/n limbajul C*C++ mai e.ist instruciunile retur/, Kreaa, 1o/ti/ue
i goto, care asigur o fle.ibilitate mare n scrierea de programe.
2.1. I/3tru10iu/ea e=8re3ie
,nstruciunea e.presie are formatul"
e=8re3ie7
adic dup e.presie se scrie 87(.
!a se utilizeaz ca instruciune de atribuire sau ca instruciune de
apel a unei funcii.
!.emplu de utilizare"
>>
/< Programul ("E=1.188 </
/< Programul a6i3eaZa ma=imul 4i/tre 2 i/tregi </
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3t4io.5@
mai/9;
A
i/t a,K,17
8ri/t69bE/I/tro4u1eti 4oi i/tregi a 3i KE/b;7
31a/69bO4 O4b,Ia,IK;7
1Na@K_aQK7
8ri/t69bE/'a=imul 4i/tre aNO4 3i KNO4 e3te 1NO4E/b,a,K,1;7
get159;7
B
2.2. I/3tru10iu/ea :i42
,nstruciunea vid se reduce la punct i virgul, fr a avea vreun
efect. !a se utilizeaz acolo unde se cere prezena unei instruciuni, dar de
fapt nu trebuie s se e.ecute ceva Dde e.emplu n instruciunile repetitive#.
!.emplu de utilizare"
6or9i N -, 3 N -7 i ? /7 3 N 3 P aHiC, PPi;7
2.". I/3tru10iu/ea 1om8u32
,nstruciunea compus este o succesiune de instruciuni incluse ntre
acolade, eventual precedate de declaraii Dvalabile numai n acest loc#"
A
4e1lara0ii7
i/3tru10iu/i7
B
,nstruciunea compus se utilizeaz acolo unde este nevoie conform
sinta.ei de o singur instruciune, dar procesul de calcul necesit mai multe
instruciuni.
!.emplu de utilizare este dat n programul '0!.>.cpp "
>0
/< Programul ("E=2.188 </
/< Cal1ulul ra4a1i/ilor e1uatiei a<=]2 PK<= P1 N- </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?mat5.5
mai/9;
A
6loat a,K,1,4elta,=1,=27
8ri/t69bE/I/tro4u1eti a,K,1E/b;7
31a/69bO6 O6 O6b,Ia,IK,I1;7
i6 9a[N-;
A
4eltaNK<KX#<a<17
i6 94elta @N -; A
=1N9XKX3Rrt94elta;;/92<a;7
=2N9XKP3Rrt94elta;;/92<a;7
8ri/t69bE/E1uatia are ra4a1i/ile =1NOg 3i
=2NOgE/b,=1,=2;7
B
el3e A
=1NXK/92<a;7
=2N3Rrt9X4elta;/92<a;7
8ri/t69bE/E1uatia are ra4a1i/ile 1om8le= 1o/cugateQE
=1NOg X c<Og 3i =2N OgP c<OgE/b,=1,=2,=1,=2;7
B
B
el3e 8ri/t69bE/E1uatia /u e3te 4e or4i/ul 2 9aN-;E/b;7
get159;7
B
2.# I/3tru10iu/ea i6
,nstruciunea if are dou formate"
a; i6 9 e=8re3ie ;
i/3tru10iu/e
>6
K; i6 9 e=8re3ie ;
i/3tru10iu/eJ1
el3e i/3tru10iu/eJ2
!fectul ei este urmtorul"
Se evalueaz e.presia 8e.presie(.
%ac rezultatul e.presiei este true se e.ecut n cazul a#
instruciunea 8instruciune( i n cazul b# 8instruciune[2( i apoi se trece la
instruciunea imediat urmtoare instruciunii i6.
%ac rezultatul e.presiei este 6al3e se trece n cazul a# la
instruciunea imediat urmtoare instruciunii if, iar n cazul b# se trece la
e.ecuia 8instruciune[>( i apoi se trece la instruciunea imediat urmtoare
instruciunii structurate i6.
Observaii"
a# instruciunile 8instruciune(, 8instruciune[2(,
8instruciune[>( pot conine instruciuni de salt la alte instruciuni
dect cea urmtoare instruciunii i6.
b# instruciunea if poate conine alte instruciuni if. =rebuie
atenie la mbinarea lui el3e, n sensul de a ti la care i6 aparine.
!.emplu de utilizare" )rogramul '0!.>.cpp Da se vedea punctul
>.0#.
2.$ I/3tru10iu/ea 3`it15
,nstruciunea 3`it15 are urmtoarea sinta."
3`it15 9 e=8re3ie ;
A
1a3e C1Q 3irJi/3tru10iu/iJ17
Kreaa7
1a3e C2Q 3irJi/3tru10iu/iJ27
Kreaa7
L...........................................
1a3e C/Q 3irJi/3tru10iu/iJ/7
Kreaa7
4e6aultQ 3irJi/3tru10iu/i
B
>7
!fectul instruciunii 3`it15 este urmtorul"
a# se evalueaz 8e.presie($
b# se compar pe rnd rezultatul evalurii cu constantele C2, C>,
\, Cn. %ac rezultatul evalurii coincide cu constanta Ci se e.ecuta
instruciunile 8sir[instruciuni[i( i apoi se trece la instruciunea
imediat urmtoare 3`it15-ului. %aca rezultatul evalurii nu coincide
cu nici una din constantele C2, C>, \, Cn se e.ecut instruciunile
8sir[instruciuni( aflate dup 84e6ault(.
Observaii"
a# -lternativa 4e6ault este opional. %ac nu este prezent, n
cazul n care rezultatul e.presiei 8e.presie( nu coincide cu nici o
constant Ci, instruciunea 3`it15 nu are nici un efect.
b# %ac Kreaa nu este prezent, atunci se e.ecut i irurile de
instruciuni imediat urmtoare, pn la ntlnirea unei instruciuni
Kreaa sau pn la terminarea instruciunii 3`it15.
c# ,nstruciunea structurata 3`it15 poate fi nlocuit prin
instruciuni i6 imbricate.
!.emplu de utilizare"
/< Programul ("E=".188 </
/< %8eratii 1u /umere i/tregi 4e 6orma
%PERAND1o8erator%PERAND2 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3t4liK.5@
>4e6i/e INFINIT -=!666
mai/9;
A
i/t o8era/41,o8era/42,reZultat7
15ar o8eratie7
8ri/t69bE/S1rieti e=8re3ia 6ara 38atii i/tre o8era/Zi FiE
o8eratorE/b;7
31a/69bO4O1O4b,Io8era/41,Io8eratie,Io8era/42;7
3`it159o8eratie;
A
1a3e dPdQ reZultatNo8era/41Po8era/427
Kreaa7
>A
1a3e dXdQ reZultatNo8era/41Xo8era/427
Kreaa7
1a3e d<dQ reZultatNo8era/41<o8era/427
Kreaa7
1a3e d/dQ i6 9o8era/42[N-; reZultat N
o8era/41/o8era/427
el3e i6 9o8era/41 @-; reZultatNINFINIT7
el3e reZultatNXINFINIT7
Kreaa7
4e6aultQ e=it91;7
B7
8ri/t69bE/O4 O1 O4 N O4E/b, o8era/41, o8eratie,
o8era/42, reZultat;7
get159;7
B
2.) I/3tru10iu/ea `5ile
3ormatul instruciunii `5ile este urmtorul"
`5ile 9 e=8re3ie ;
i/3tru10iu/e
!fectul instruciunii `5ile este urmtorul"
a# se evalueaz 8e.presie($
b# dac rezultatul este true se e.ecut corpul su D8instruciune(# i
se revine la pasul a#. %aca rezultatul este 6al3e se trece la
e.ecuia instruciunii imediat urmtoare instruciunii `5ile.
Observaii"
a# /n cazul n care e.presie este 6al3e de la nceput, atunci
8instruciune( nu se e.ecut niciodat.
b# /n cadrul corpului instruciunii `5ile este nevoie de e.istena
unor instruciuni de modificare a variabilelor care intr n
8e.presie(.
!.emplu de utilizare"
>B
/< Programul ("E=#.188 </
/< Cal1ulul 1.m.m.4.1. 3i a 1.m.m.m.1
a 4oua /umere /aturale a 3i K </
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3t4io.5@
mai/9;
A
i/t a,K,a1,K1,1mm41,1mmm1,re3t7
8ri/t69bI/tro4u1eti aNb;7
31a/69bO4b,Ia;7
8ri/t69bI/tro4u1eti KNb;7
31a/69bO4b,IK;7
/< A6larea 1.m.m.4.1. </
a1Na7K1NK7
`5ile 99re3tNa1OK1;[N-;
A a1NK17
K1Nre3t7
B7
1mm41NK17
1mmm1Na<K/1mm417
1lr31r9;7
8ri/t69baNO4 KNO4 1mm419a,K;NO4 1mmm1NO4b, a, K,
1mm41, 1mmm1;7
get159;7
B
2.! I/3tru10iu/ea 6or
3ormatul instruciunii 6or este urmtorul"
6or 9 e=8r17 e=8r27 e=8r" ;
i/3tru10iu/e
unde"
- e.pr2, e.pr>, e.pr0 sunt e.presii$
- instruciune este corpul instruciunii.
%escrierea efectului instruciunii 6or, cu ajutorul instruciunii `5ile
este urmtorul"
>C
e=8r17
`5ile 9 e=8r2 ; A
i/3tru10iu/e7
e=8r"7
B
Observaie" e.pr2, e.pr>, e.pr0 pot fi vide, ns caracterele D7G nu
pot lipsi.
!.emplu de utilizare"
/< Programul ("E=$.188 </
/< Cal1ulul me4iei aritmeti1e a / /umere reale </
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3t4io.5@
mai/9;
A
6loat aH1--C,me4ia,3uma7
i/t i,/7
8ri/t69bE/I/tro4u1eti /r.4e eleme/te /Nb;7
31a/69bO4b,I/;7
8ri/t69bE/I/tro4u1eti eleme/tele 3iruluiE/b;7
6or9iN-,3umaN-7i?/7PPi;
A
8ri/t69baHO24CNb,i;7
31a/69 bO6b,IaHiC;7
3umaPNaHiC7
B7
me4iaN3uma//7
8ri/t69bE/'EDIANOgE/b,me4ia;7
get159;7
B
2.+ I/3tru10iu/ea 4oX`5ile
,nstruciunea 4oX`5ile este instruciunea ciclic cu test final.
3ormatul ei este urmtorul"
>E
4o
i/3tru10iu/e
`5ile 9 e=8re3ie ;7
!fectul ei este descris cu instruciunea `5ile astfel"
i/3tru10iu/e7
`5ile9 e=8re3ie ;
i/3tru10iu/e7
Se observ c corpul ciclului se e.ecut cel puin o dat.
!.emplu de utilizare"
/< Programul ("E=).188 </
/< Cal1ulul 1.m.m.4.1. 3i a 1.m.m.m.1
a 4oua /umere /aturale a 3i K </
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3t4io.5@
mai/9;
A
i/t a,K,a1,K1,1mm41,1mmm1,re3t7
8ri/t69bI/tro4u1eti aNb;7
31a/69bO4b,Ia;7
8ri/t69bI/tro4u1eti KNb;7
31a/69bO4b,IK;7
/< A6larea 1.m.m.4.1. </
a1Na7K1NK7
4oA
re3tNa1OK17
a1NK17
K1Nre3t7
B
`5ile 9re3t[N-;7
1mm41Na17
1mmm1Na<K/1mm417
1lr31r9;7
0?
8ri/t69baNO4 KNO4 1mm419a,K;NO4
1mmm1NO4b,a,K,1mm41,1mmm1;7
get159;7
B
2.9 I/3tru10iu/ile 1o/ti/ue Fi Kreaa
,nstruciunile 1o/ti/ue i Kreaa se pot utiliza numai n corpul unui
ciclu.
,nstruciunea 1o/ti/ue abandoneaz iteraia curent i se trece la
e.ecuia pasului de reiniializare n cazul instruciunii 6or, respectiv la
revalidarea e.presiei care stabilete continuarea sau terminarea ciclului n
cazul instruciunilor `5ile i 4oX`5ile.
,nstruciunea Kreaa termin ciclul i se trece la instruciunea imediat
urmtoare celei repetitive D6or, `5ile, 4oX`5ile#.
2.1-. I/3tru10iu/ea goto
,nstruciunea goto este utilizat pentru saltul dintr-un punct al unei
funcii Dc&iar i dintr-un ciclu# n alt punct al aceleai funcii, respectiv la o
instruciune etic&etat.
!tic&eta este un nume urmat de caracterul 8"(
/umeQ
3ormatul instruciunii goto este"
goto eti15eta7
!.emplu"
L
goto al6a7
L
al6aQ i6 9 ; L
L
2.11. Fu/10ia 3ta/4ar4 e=it
)rototipul funciei standard e=it este descris n fiierele 3t4liK.5 i
8ro1e33.5 i este"
02
:oi4 e=it9i/t 1o4;7
3uncia e=it are ca scop terminarea forat a programului. Codul de
ieire folosit este zero pentru terminare normal i alte valori pentru
terminare datorat unor erori.
". 'er3ul lu1r2rii
0.2. Se vor analiza i e.ecuta programele date ca e.emplu n lucrare.
0.>. %e la tastatur se citesc 6 perec&i de numere reale, care
reprezint n coordonate rectangulare vrfurile unui patrulater. S se
stabileasc natura acestui patrulater.
0.0. %e pe mediul de intrare sunt citite elementele reale ale unui ir
de dimensiunea n. S se gseasc valoarea minim i valoarea ma.im
dintre elementele irului i poziia lor.
0.6. S se scrie un program pentru generarea tuturor numerelor prime
mai mici sau egale cu un numr natural n.
0.7. Se citete un numr natural n. S se gseasc cel mai mare
ptrat perfect mai mic sau egal cu n. -ceeai problem, dar s se indice
numrul prim cel mai mic, dar mai mare sau egal cu numrul citit.
0.A.
%e pe mediul de intrare se citete un numr natural n. S se
verifice dac numrul respectiv este palindrom.
0.B.
%e pe mediul de intrare se citesc cifrele &e.azecimale ale unui
numr ntreg n baza 2A. Sa se calculeze i s se afieze reprezentarea
numrului n baza 2?.
0.C.
Se citete gradul i coeficienii polinomului pD.#Ra
?
+a
2
.
2
+......+ a
n
.
n
S se calculeze valoarea polinomului n .R .
?
D.
?
se
citete#.
0.E.
S se scrie un program pentru efectuarea operaiilor de
0>
adunare, scdere, nmulire i mprire ntre dou polinoame"
-D.#Ra
?
+a
2
.
2
+......+ a
n
.
n
4D.#Rb
?
+b
2
.
2
+......+ b
m
.
m
@radele i coeficienii reali ai polinoamelor se citesc de pe
mediul de intrare.
0.22.Se d un sistem de n ecuaii liniare cu n necunoscute. S se
scrie un program de rezolvare a sistemului, folosind o metoda numeric.
0.2>. Sa se calculeze polinoamele )D.# i ]D.# din relaia"
;alorile n, a
i
, b
i
, c
i
se citesc de la tastatur.
0.20. Se d un ir de n elemente reale ordonate cresctor. S se
verifice dac o valoare citit . se gsete n ir i s se indice poziia sa.
0.26. Se d un ir de n numere ntregi. S se e.trag subirul de
dimensiune ma.im, ordonat cresctor.
0.27. )entru elaborarea unui test de aptitudini se dispune de un set de
n ntrebri, fiecare ntrebare i fiind cotat cu un numr de p
i
puncte. S se
elaboreze toate c&estionarele avnd ^ ntrebri, fiecare c&estionar totaliznd
ntre a i b puncte. /ntrebrile sunt date prin numr i punctaj.
0.2A. Se dau > iruri de n si respectiv m elemente de tip ntreg. S se
calculeze"
a# irul ce conine elementele comune ale celor dou iruri$
b b# irul ce conine toate elementele celor dou iruri
luate o sin-
gura dat$
c c# irul ce conine elementele primului ir din care au
fost
eliminate elementele comune.
d
0.2B. Se d un numr real a n baza 2?. S se scrie programul de
conversie a lui n baza 4, 4 SR 2A.
00
n
i i i
i
c x b
a
X P
X Q
2
# D
# D
0.2C. Se d un numr natural n.
a# S se gseasc numrul obinut prin eliminarea cifrelor care
apar de mai multe ori n numr.
b#S se gseasc numrul obinut prin intersc&imbarea ntre ele
a primei cifre cu ultima , a celei de a doua cu penultima .a.m.d.
c#S se gseasc cel mai mare numr ce se poate obine din
cifrele sale.
0.2E. Se d o matrice de n.n elemente ? i 2. S se stabileasc dac
matricea respectiv este simetric.
0.>?. %e pe mediul de intrare se citete o propoziie. S se indice
numrul cuvintelor i cuvntul cel mai lung din propoziie.
06
Lucrarea de laborator nr.4
FUNCII
1. Co/0i/utul lu1r2rii
/n lucrare se prezint structura unei funcii, apelul unei funcii prin
valoare i prin referin, prototipul unei funcii.
2. Co/3i4era0ii teoreti1e
<n program conine una sau mai multe funcii, dintre care una este
funcia principal avnd numele mai/. Celelalte au un nume dat de
programator.
2.1. Stru1tura u/ei 6u/10ii
O funcie are urmtoarea structur"
ti8 /ume 9li3taJ8arametrilorJ6ormali;
A
4e1lara0ii
i/3tru10iu/i
B
)rimul rnd din definiia funciei se numete a/tet, iar restul se
numete 1or8ul 6u/10iei.
/n limbajul C*C++ e.ist dou categorii de funcii"
07
- funcii care returneaz n punctul de apel o valoare prin
instruciunea retur/ e=8re3ie7 valoarea avnd tipul specificat n
antet prin 8tip($
- funcii care nu returneaz nici o valoare n punctul de apel, tip
fiind nlocuit prin cuvntul c&eie 8:oi4(.
'ista parametrilor formali poate conine"
- zero parametri, caz n care antetul funciei se reduce la"
ti8 /ume 9; sau ti8 /ume 9:oi4;
- unul sau mai muli parametri formali, separai ntre ei prin
virgul. <n parametru formal se indic prin" ti8 /ume.
!.emplu"
i/t reZol:J3i3tem 9i/t /, 4ouKle a H1-C H1-C, 4ouKle KH1-C, 4ouKle = H1-C;
)rototipul unei funcii se obine scriind punct i virgul dup o
construcie identic cu antetul funciei respective sau obinut prin
eliminarea numelui parametrilor formali.
!.emplu"
i/t 6a1torial 9i/t /;7
i/t 6a1torial 9i/t;7
3unciile standard de bibliotec au prototipurile n diferite fiiere cu
e.tensia .5, cum ar fi 3t4io.5, 1o/io.5, mat5.5 etc. 3unciile standard de
bibliotec se gsesc n format obiect De.tensia .oKc#, i se adaug n
programe n faza de editare de legturi. )rototipurile funciilor standard se
includ n program nainte de apelul lor prin construcia >i/1lu4e.
1.1. A8elul u/ei 6u/10ii
O funcie care nu returneaz nici o valoare se apeleaz astfel"
/ume 9li3taJ8arametrilorJe6e1ti:i;7
0A
Corespondena ntre parametrii formali i cei efectivi este
poziional.
O funcie care returneaz o valoare poate fi apelat
- fie printr-o instruciune de apel ca mai sus, caz n care valoarea
returnat se pierde$
- fie ca un operand al unei e.presii, valoarea returnat folosindu-se la
evaluarea e.presiei respective.
=ipul parametrilor formali i cei actuali se recomand s fie acelai.
/n caz contrar, n limbajul C tipul parametrului efectiv este convertit
automat la tipul parametrului formal. /n limbajul C++ se utilizeaz o
verificare mai comple. pentru apelul funciilor. %e aceea se recomand
utilizarea operatorului de conversie e.plicit 9ti8;, adic e.presiile cast.
!.emplu"
6994ouKle;/;
1evenirea dintr-o funcie se face fie dup e.ecuia ultimei
instruciuni din corpul funciei, fie la ntlnirea instruciunii retur/.
,nstruciunea retur/ are formatele"
retur/$
sau
retur/ e=8re3ie$
Observaie"
a# %ac tipul e.presiei din instruciune este cel din antetul funciei, se
face conversia automat spre cel al funciei.
b# )rimul format al funciei retur/ se folosete n funciile care nu
returneaz nici o valoare.
=ransmiterea parametrilor efectivi Dactuali# se poate face"
- prin valoare Dcall bZ value#$
- prin referin Dcall bZ reference#.
/n cazul apelului prin valoare, unui parametru formal i se transfer
valoarea parametrului efectiv. /n acest caz, funcia apelat nu poate modifica
parametrul efectiv din funcia care a fcut apelul, neavnd acces la el.
)rogramul '6!.2.cpp ilustreaz acest lucru"
0B
/<Programul (#E=1.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< APE( PRIN *A(%ARE </
/<Pro1e4ura 4e i/ter315imKare i/tre a 3i K </
:oi4 i/ter315imKare9i/t a,i/t K;
A
i/t au=7
8ri/t69bE/I/ 6u/1tie la i/trare aNO4 KNO4E/b,a,K;7
au=Na7aNK7KNau=7
8ri/t69bE/I/ 6u/1tie la ie3ire aNO4 KNO4E/b,a,K;7
B
:oi4 mai/9;
A
i/t a,K7
aN27KN"7
8ri/t69bE/I/ mai/ i/ai/tea a8elului 6u/1tiei i/ter315imKareE
aNO4 KNO4E/b,a,K;7
i/ter315imKare9a,K;7
8ri/t69bE/I/ mai/ la re:e/irea 4i/ 6u/1tia i/ter315imKareE
aNO4 KNO4E/b,a,K;7
get159;7
B
Se va constata c a i b i pstreaz vec&ile valori.
)entru ca intersc&imbarea s se produc, este necesar folosirea
pointerilor, ca mai jos"
/<Programul (#E=2.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< APE( PRIN *A(%ARE F%(%SIND P%INTERI</
/<Pro1e4ura 4e i/ter315imKare i/tre a 3i K </
:oi4 i/ter315imKare9i/t <a,i/t <K;
A
i/t au=7
8ri/t69bE/I/ 6u/1tie la i/trare aNO4 KNO4E/b,<a,<K;7
0C
au=N<a7<aN<K7<KNau=7
8ri/t69bE/I/ 6u/1tie la ie3ire aNO4 KNO4E/b,<a,<K;7
B
:oi4 mai/9;
A
i/t a,K7
aN27KN"7
8ri/t69bE/I/ mai/ i/ai/tea a8elului 6u/1tiei i/ter315imKareE
aNO4 KNO4E/b,a,K;7
i/ter315imKare9Ia,IK;7
8ri/t69bE/I/ mai/ la re:e/irea 4i/ 6u/1tia i/ter315imKareE
aNO4 KNO4E/b,a,K;7
get159;7
B
Se va constata c valorile a i b au fost intersc&imbate ntre ele.
-cest mod de transmitere a parametrilor este tot prin valoare, adic unui
pointer i s-a transmis o adres.
/n cazul apelului prin referin, se transmit adresele parametrilor, nu
valoarea lor. -cest mod de transmitere este valabil n C++. /n acest caz,
parametrii formali sunt definii ca fiind de tip referin.
-celai e.emplu n acest caz devine"
/<Programul (#E=".188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< APE( PRIN REFERINTA </
/<Pro1e4ura 4e i/ter315imKare i/tre a 3i K </
:oi4 i/ter315imKare9i/tI a,i/tI K;
A
i/t au=7
8ri/t69bE/I/ 6u/1tie la i/trare aNO4 KNO4E/b,a,K;7
au=Na7aNK7KNau=7
8ri/t69bE/I/ 6u/1tie la ie3ire aNO4 KNO4E/b,a,K;7
B
0E
:oi4 mai/9;
A
i/t a,K7
aN27KN"7
8ri/t69bE/I/ mai/ i/ai/tea a8elului 6u/1tiei i/ter315imKareE
aNO4 KNO4E/b,a,K;7
i/ter315imKare9a,K;7
8ri/t69bE/I/ mai/ la re:e/irea 4i/ 6u/1tia i/ter315imKareE
aNO4 KNO4E/b,a,K;7
get159;7
B
Se va constata c valorile lui a i b au fost intersc&imbate ntre ele.
Observaie important" n cazul n care un parametru efectiv este
numele unui tablou, atunci acesta are ca valoare adresa primului element,
deci se transmite adresa ca valoare pentru parametrul formal corespunztor.
/n acest caz, dei apelul s-a fcut prin valoare, funcia respectiv poate
modifica elementele tabloului al crui nume s-a folosit ca parametru efectiv.
%rept e.emplu de folosire a funciilor, n continuare se prezint un
program care realizeaz cteva operaii asupra a dou polinoame.
/<Programul (#E=#.188 </
/< %8eratii a3u8ra 8oli/oamelor
U/ 8oli/om are 6orma P9=;N8H-CP8H1C<=P 8H2C<=]2 P...8H/C< =]/ </
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3t4io.5@
> 4e6i/e &RAD'A 2-
:oi4 8ro4u39i/t /,6loat aHC, i/t m,6loat KHC,
i/t <8,6loat 1HC;
A
i/t i,c7
<8N/Pm7
6or9iN-7i?N/Pm7iPP; 1HiCN-.-7
6or9iN-7i?N/7iPP;
6?
6or9cN-7c?Nm7cPP;
1HiPcCPNaHiC<KHcC7
B
:oi4 im8artire9i/t /, 6loat aHC,i/t m,6loat KHC,
i/t <gra4J1at,6loat 1atHC, i/t <gra4Jre3t, 6loat re3tHC;
A
i/t i,c,a7
i6 9/?m; A
<gra4J1atN-71atH-CN-.-7
<gra4Jre3tNm7re3tN1at7
B
el3e A
<gra4J1atN/Xm7<gra4Jre3tNmX17
6or9iN/Xm,cN/7i@N-7iXX,cXX;
A
1atHiCNaHcC/KHmC7
6or 9aNm7a@N-7aXX;
aHiPaCNaHiPaCX1atHiC<KHaC7
aHcCN-7
B7
6or9iN-7i?NmX17iPP;
re3tHiCNaHiC7
B
B
:oi4 1itireJ8oli/om9i/t </,6loat aHC;
A
i/t i7
8ri/t69bE/I/tro4u1eti gra4ul 8oli/omului b;7
31a/69bO4b,/;7
6or9iN-7i?N</7iPP;
A
8ri/t69bE/aHO4CNb,i;7
31a/69bO6b,IaHiC;7
B7
8ri/t69bE/b;7
B
62
6loat :alJ8oli/om96loat =,i/t /,6loat aHC;
A
i/t i7
6loat :7
:N-.-7
6or9iN/7i@N-7iXX;
:N:<=PaHiC7
retur/ :7
B
:oi4 a6i3J8oli/om9i/t /,6loat aHC,15ar 1;
A
i/t i7
8ri/t69bE/O1H=CNOgb,1,aH-C;7
6or9iN17i?N/7iPP;
8ri/t69bPOg<=]O4b,aHiC,i;7
8ri/t69bE/b;7
B
:oi4 mai/9#
A
i/t /,m,gra4Jr,gra4J1at,gra4Jre3t7
6loat =, :,8H&RAD'AP1C,RH&RAD'AP1C,rH&RAD'AP1C,
1atH&RAD'AP1C,re3tH&RAD'AP1C7
1lr31r7
1itireJ8oli/om9I/,8;7a6i3J8oli/om9/,8,dPd;7
1itireJ8oli/om9Im,R;7a6i3J8oli/om9m,R,ded;7
8ri/t69bE/I/tro4u1eti =Nb;731a/69bO6b,I=;7
:N:alJ8oli/om9=,/,8;7
8ri/t69b*al.Poli/omului 8 8e/tru =NO6 e3te O6b,=, :;7
get159;7
8ro4u39/,8,m,R,Igra4Jr,r;7
8ri/t69bE/RH=CNPH=C<eH=CE/b;7
a6i3J8oli/om9gra4Jr,r,dRd;7
get159;7
im8artire9/,8,m,R,Igra4J1at,1at,Igra4Jre3t,re3t;7
8ri/t69bE/REfU(TATU( I'PARTIRII PH=C/eH=CN@1atul CH=C FiE
re3tul RH=CE/b;7
a6i3J8oli/om9gra4J1at,1at,dCd;7
a6i3J8oli/om9gra4Jre3t,re3t,dRd;7
6>
get159;7
8ri/t69bE/ATENTIE[ Poli/omul 8 e3te mo4i6i1atE/b;7
a6i3J8oli/om9/,8,dPd;7
get159;7
B
".'er3ul lu1r2rii
0.2. Se va analiza modul de transmitere a parametrilor efectivi n
programele din lucrare date ca e.emplu.
/n continuare se vor scrie programe pentru rezolvarea urmtoarelor
probleme, folosind funcii i diverse moduri de transmitere a parametrilor.
Se va evita folosirea variabilelor globale.
0.>. %e pe mediul de intrare se citete gradul unui polinom i
coeficienii si, care sunt numere ntregi.
n
n
x p x p p x P + + + ... # D
2
2
n care p
?
este nenul.
9tiind c polinomul admite numai rdcini ntregi simple, s se
gseasc rdcinile polinomului.
0.0. %e pe mediul de intrare se citete n i perec&ile de numere
ntregi
n i y x
i i
, 2 #, , D
reprezentnd o relaie binar 1 peste mulimea :.
a# -dmind c fiecare element din mulimea : apare n cel puin o
perec&e dintre cele citite, s se determine mulimea :.
b# S se verifice dac relaia 1 este o relaie de ec&ivalen
Drefle.iv, simetric i tranzitiv#.
0.6. Se dau dou iruri de caractere care reprezint numere ntregi
zecimale foarte mari. S se scrie un program de efectuare a operaiilor
aritmetice asupra lor.
0.7. S se scrie funciile pentru adunarea, scderea i nmulirea a
dou matrice i apoi s se realizeze calculul -R4OC M>OD4+C#, unde 4 i C
sunt dou matrice ptratice de ordinul n.
60
0.A. S se scrie funcia care realizeaz operaiile aritmetice asupra a
dou matrice rare Dmatricea rar este o matrice de dimensiune mare, care
are multe elemente nule#.
0.B. 3iind date anul, luna, ziua, s se scrie o funcie care s returneze
a ctea zi din an este ziua respectiv i cte zile au mai rmas din anul
respectiv.
0.C.S se scrie o funcie care primind ca parametru un numr roman
sub forma unui ir de caractere, returneaz numrul respectiv ca numr arab
n baza 2?.
0.2?.
S se scrie o funcie care primind ca parametru un numr
arab n baza 2?, calculeaz irul de caractere ce reprezint numrul
respectiv sub form roman.
0.22.
%e pe mediul de intrare se citete un numr ntreg, multiplu
de 2??. S se gseasc numrul minim de bancnote romneti necesare
pentru plata sumei respective.
66
Lucrarea de laborator nr.5
PR%&RA'AREA '%DU(AR
1. Co/0i/utul lu1r2rii
/n lucrare sunt prezentate conceptele de modul, programare
modular i vizibilitate a variabilelor
2. Co/3i4era0ii teoreti1e
>.2. No0iu/ea 4e mo4ul
:odulul surs este o parte a te.tului surs al programului, care se
compileaz separat de restul te.tului surs a programului.
:odulul obiect este rezultatul compilrii unui modul surs.
<n modul surs conine funcii nrudite, n sensul ca ele concur la
rezolvarea unei subprobleme.
%e fapt modulele corespund subproblemelor rezultate n urma
proiectrii top-doJn a unei probleme comple.e.
)rogramarea modular este stilul de programare care are la baz
utilizarea de module. )rin acest stil de programare se poate pune n valoare
posibilitile de 8ascundere( a datelor i procedurilor mpotriva unor accese
neautorizate din alte module. -stfel, datele statice declarate n afara
funciilor modulului, pot fi utilizate n comun de acestea, dar nu pot fi
accesate de ctre funciile din alte module.
1ecomandarea care se face n scrierea unui program comple. este
de a-l modulariza, permind lucrul n ec&ip.
:odularizarea unui program duce la punerea la punct a programului
Dimplementarea i testarea# mai rapid.
:odulele puse la punct pot fi utilizate ulterior pentru rezolvarea
altor probleme.
/n rezolvarea unor probleme comple.e, programul e.ecutabil poate
fi obinut n urmtoarele moduri"
67
a# Se scriu mai multe fiiere surs, fiecare surs constituind un
modul surs. !vident, fiecare modul surs este pus la punct
separat. Cu ajutorul construciei
>i/1lu4e D38e1i6i1ator 4e 6iFierG
sunt incluse te.tele surs fie n modulul care conine funcia
principal mai/, fie ntr-un fiier care conine numai includerile
tuturor modulelor, inclusiv a modulului care conine funcia
principal mai/9;.
/n felul acesta se obine de fapt un singur program surs, care va fi
compilat, lin_editat i e.ecutat.
b# Se scriu mai multe module surs. Se compileaz separat
obinndu-se mai multe module obiect Davnd e.tensia .obj#. Se
lin_editeaz aceste module obiect, obinndu-se fiierul e.ecutabil.
:odulele surs pot fi compilate separat i lin_editate folosind un
fiier de tip )roject. -cesta se editeaz utiliznd meniul )roject al
mediului =urbo C++.
2.2. Dome/iul 4e :alaKilitate al :ariaKilelor
2.2.1. *ariaKile gloKale
;ariabilele globale sunt definite la nceputul unui fiier surs, deci
naintea primei funcii. !le sunt variabile vizibile din locul respectiv pn la
sfritul fiierului surs respectiv. %ac programul are mai multe fiiere
surs, o variabil global definit ntr-un fiier surs poate fi utilizat n
celelalte, dac este declarat ca e.tern. %eclararea unei variabile e.terne
se poate face"
- dup antetul unei funcii, caz n care variabila global este valabil
numai n acea funcie$
- la nceputul fiierului surs, adic naintea primei funcii, caz n care
este valabil pentru toate funciile din acel fiier.
6A
%K3er:a0ie"Se recomand ca variabilele e.terne s fie declarate n
fiecare funcie unde se utilizeaz, evitnd erorile care pot aprea prin
mutarea ulterioar a unei funcii n alt modul
;ariabilele globale sunt alocate la compilare, ntr-o zon de memorie
special.
2.2.2.*ariaKilele lo1ale
;ariabilele declarate ntr-o funcie sau intr-o instruciune compus au
valabilitate numai n unitatea declarat.
!le pot fi"
a# automati1e M care sunt alocate pe stiv la e.ecuie. !le i pierd
e.istena la revenirea din funcie sau la terminarea instruciunii
compuse. %eclararea lor este cea obinuita Dint a,b,c$ double .$
etc.#$
b; 3tati1e - care sunt alocate la compilare ntr-o zon special.
%eclararea se face cu ajutorul cuvntului c&eie 3tati1 naintea tipului
variabilei. !.emplu"
3tati1 i/t =,V,Z$
%eclararea unei variabile statice poate fi fcut"
- la nceputul fiierului surs Ddeci naintea primei funcii#. /n acest
caz variabila static respectiv este valabil n tot fiierul surs
respectiv, dar nu poate fi declarat ca e.tern n alte fiiere$
- n corpul unei funcii, caz n care este valabil numai n ea sau n
instruciunea compus unde a fost declarat.
c# :ariaKile regi3tru M care sunt alocate n registrele procesorului.
!le pot fi numai variabile int, c&ar i pointer. Se recomand
declararea ca variabile registru, variabilele des utilizate n funcia
respectiv. 5umrul variabilelor registru este limitat. %ac s-au
declarat mai multe, cele care nu pot fi alocate n registre vor fi
alocate pe stiv ca variabile automatice.
%eclararea variabilelor registru se face cu ajutorul cuvntului c&eie
regi3terQ
6B
regi3ter ti8 :ariaKil2$
-locarea este valabil numai n funcia n care au fost declarate.
2.". E=em8lu 4e 8rogram mo4ulariZat
<rmtorul program calculeaz inversa i determinantul unei matrice
ptrate cu elemente double. )rogramul a fost modularizat astfel"
3iierul '7!.2[2.cpp M conine funcia de citire a dimensiunilor i
elementelor unei matrice i funcia de afiare a unei matrice"
/< A6i3area 3i 1itirea u/ei matri1e 4e /<m eleme/te 4e ti8
4ouKle </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>4e6i/e N'A 1-
:oi4 a6i3are9i/t /,i/t m,4ouKle aHN'ACHN'AC,15ar 15;
A
i/t i,c7
8ri/t69bE/ 'ATRICEA O1E/b,15;7
6or9iN-7i?/7iPP;
A 6or9cN-7c?m7cPP;
8ri/t69bO+.2l6 b,aHiCHcC;7
8ri/t69bE/b;7
B
B
:oi4 1itireJmatri1e9i/t </,i/t <m,4ouKle aHN'ACHN'AC;
A
i/t i,c7
8ri/t69bE/I/tro4u1eti /r.li/ii /Nb;731a/69bO4b,/;7
8ri/t69bE/I/tro4u1eti /r.1oloa/e mNb;731a/69bO4b,m;7
8ri/t69bE/I/tro4u1eti eleme/tele matri1eiE/b;7
6or 9iN-7i?</7iPP;
6or9cN-7c?<m7cPP;
6C
A
8ri/t69baHO4,O4CNb,i,c;731a/69bOl6b,IaHiCHcC;7
B
8ri/t69bE/b;7
B
3iierul '7!.2[>.cpp M conine funcia de nmulire a dou matrice$
/< Fu/1tia 1al1uleaZa 8ro4u3ul matri1elor aH/CHmC
3i KHmCH8C 4e ti8 4ouKle reZulta/4 matri1ea 1H/HCH8C </
>4e6i/e N'A 1-
:oi4 8ro4u39i/t /,i/t m,i/t 8,4ouKle aHN'ACHN'AC,
4ouKle KHN'ACHN'AC,4ouKle 1HN'ACHN'AC;
/< Cal1ulul 8ro4u3ului 1Na<K; </
A
i/t i,c,a7
4ouKle 37
6or9iN-7i?/7iPP;
6or9cN-7c?87cPP;
A
3N-.-7
6or9aN-7a?m7aPP;
3N3PaHiCHaC<KHaCHcC7
1HiCHcCN37
B7
B
3iierul '7!.2[0.cpp M conine funcia de calcul a inversei unei
matrice ptrate i a determinatului afiat"
/<Program 4e 1al1ul a i/:er3ei u/ei matri1e 3i a 4etermi/a/tului
ata3at </
>i/1lu4e ?mat5.5@
>4e6i/e N'A 1-
6E
:oi4 i/:er39i/t /,4ouKle aHN'ACHN'AC,4ouKle e83,
4ouKle KHN'ACHN'AC,4ouKle <4etJa,
i/t <err;
A
i/t i,c,a,8oZma=7
4ouKle ama=,au=7
/< I/itialiZarea matri1ei K 1u matri1ea u/itat`e </
6or9iN-7i?/7iPP;
6or9cN-7c?/7cPP;
i69iNNc; KHiCHcCN1.-7
el3e KHiCHcCN-.-7
/< I/itialiZarea 4etermi/a/tului </
<4etJaN1.-7
/< Se 6a1e -3uK 4iago/ala 8ri/1i8ala 3i 1 8e ea </
aN-7 /<aN/r.li/iei </
<errN-7
`5ile99a?/; II 9<errNN-;;
A
/<Cal1ul eleme/t 8i:ot</
ama=N6aK39aHaCHaC;78oZma=Na7
6or9iNaP17i?/7iPP;
i6 96aK39aHiCHaC; @ama=; A
ama=N6aK39aHiCHaC;7
8oZma=Ni7
B7
/<I/ter315imKarea li/iei a 1u 8oZma= i/ matr. a 3i K </
i69 a[N8oZma=; A
6or9cN-7c?/7cPP;
A
au=NaHaCHcC7
aHaCHcCNaH8oZma=CHcC7
aH8oZma=CHcCNau=7
au=NKHaCHcC7
KHaCHcCNKH8oZma=CHcC7
KH8oZma=CHcCNau=7
B7
<4etJaNX<4etJa7
B7
7?
i69 6aK39aHaCHaC; ?e83; <errN17
el3e A
<4etJa N<4etJa<aHaCHaC7
au=NaHaCHaC7
6or9cN-7c?/7cPP;
A
aHaCHcCNaHaCHcC / au=7
KHaCHcCNKHaCHcC / au=7
B7
6or9iN-7i?/7iPP;
i69i[Na; A
au=NaHiCHaC7
6or9cN-7c?/7cPP;
A
aHiCHcCNaHiCHcCXaHaCHcC<au=7
KHiCHcCNKHiCHcCXKHaCHcC<au=7
B
B
B
aPP7
B
B
3iierul '7!.2[6.cpp M conine funcia main$
/<Program 4e 1al1ul a i/:er3ei u/ei matri1e 3i a
4etermi/a/tului ata3at </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>4e6i/e N'A 1-
:oi4 1itireJmatri1e9i/t </,i/t <m,4ouKle aHN'ACHN'AC;7
:oi4 a6i3are9i/t /,i/t m,4ouKle aHN'ACHN'AC,15ar 15;7
:oi4 8ro4u39i/t /,i/t m,i/t 8,4ouKle aHN'ACHN'AC,
4ouKle KHN'ACHN'AC,4ouKle 1HN'ACHN'AC;7
:oi4 i/:er39i/t /,4ouKle aHN'ACHN'AC,4ouKle e83,
4ouKle KHN'ACHN'AC,4ouKle <4etJa,i/t <err;7
72
:oi4 mai/9;
A
i/t i,c,/,m,err7
4ouKle e83,4etJa,aHN'ACHN'AC,a1HN'ACHN'AC,
KHN'ACHN'AC,1HN'ACHN'AC7
1lr31r7
1itireJmatri1e9I/,Im,a;7
a6i3are9/,m,a,dAd;7
get159;7
6or9iN-7i?/7iPP;
6or9cN-7c?/7cPP;
a1HiCHcCNaHiCHcC7
e83N1.-eX)7
i/:er39/,a1,e83,K,I4etJa,Ierr;7
i69errNN1; 8ri/t69bE/'ATRICEA A ESTE SIN&U(ARAb;7
el3e A 8ri/t69bE/'ATRICEA IN*ERSA .NA]9X1;E/b;7
a6i3are9/,/,K,d.d;7
8ri/t69bE/DETER'INANTU( 'ATRICEI A ESTE
O+.#l6b,4etJa;7
8ro4u39/,/,/,a,K,1;7
8ri/t69bE/*ERIFICARE CNA<. REfU(TA 'ATRICEA
UNITATE[b;7
a6i3are9/,/,1,dCd;7
get159;7
B
B
3iierul '7!.2[7.cpp M conine construciile de includere a fiierelor
de mai sus.
>i/1lu4e b4QEio3i6ElimKacJCE($E=1J1.188b
>i/1lu4e b4QEio3i6ElimKacJ1E($E=1J2.188b
>i/1lu4e b4QEio3i6ElimKacJ1E($E=1J".188b
>i/1lu4e b4QEio3i6ElimKacJ1E($E=1J#.188b
7>
". 'er3ul lu1r2rii
0.2. Se va compila, e.ecuta i analiza programul dat ca e.emplu mai
sus.
0.>. Se vor compila separat modulele programului e.emplificat i
apoi cu lin_-editorul se va obine programul e.ecutabil.
Se va construi un fiier de tip )roject cu modulele programului
e.emplificat.
/n continuare se va scrie cte un program modularizat pentru
rezolvarea urmtoarelor probleme"
0.0. %ndu-se forma postfi.at a unei e.presii aritmetice care
conine numai numere ntregi i operatori +,-,O,*, s se scrie un program
pentru evaluarea sa.
0.6. S se scrie un program pentru calculul c.m.m.d.c. i a c.m.m.m.c
a dou polinoame.
0.7. S se implementeze noiunea de mulime i operaiile permise
asupra sa.
0.A. S se implementeze un editor de te.te care s permit cteva
operaii definite de %vs. Dinserarea unui te.t, tergere, modificare
etc. ..#
70
Lucrarea de laborator nr.
P%INTERI
1. Co/0i/utul lu1r2rii
/n lucrare se prezint tipul pointer, operaiile permise asupra
pointerilor, modul de alocare i eliberare dinamic a memoriei.
2. Co/3i4era0ii teoreti1e
2.1. Ti8ul 8oi/ter
<n pointer este o variabil care are ca valori adrese. %ac pointerul p
are ca valoare adresa de memorie a variabilei ., se spune c p pointeaz spre
..
p
-dresa din memorie `
.
-dresa din memorie a
<n pointer este legat de un tip. %ac . este de tipul int, pointerul p
este legat de tipul int.
%eclararea unui pointer se face la fel ca declararea unei variabile, cu
deosebirea c numele pointerului este precedat de caracterul O"
ti8 </ume$
!.emplu"
i/t <87
76
a
>???
-dresa unei variabile se obine cu ajutorul operatorului unar I,
numite o8erator 4e re6ere/0iere.
!.emplu" 3ie declaraiile"
i/t =7
i/t <87
-tunci 8NI=$ are ca efect atribuirea ca valoare pentru p a adresei
variabilei =. /n desenul de mai sus, variabila = fiind localizat la adresa g,
valoarea lui 8 va fi g.
3urnizarea valorii din zona de memorie a crei adres este coninut
n p se face cu ajutorul operatorului unar <, numit o8erator 4e
4ere6ere/0iere.
!.emplu"
a# instruciunea =NV este ec&ivalent cu una din secvenele"
8NI=7 sau 8NIV7
<8NV7 =N<87
b# instruciunea =PP este ec&ivalent cu secvena"
8NI=7
9<8;PP7
/n aceste e.emple p trebuia s fie legat de tipul lui .,Z. %e e.emplu"
i/t =,V7
i/t <87
!.ist cazuri cnd un pointer trebuie s nu fie legat de un tip de date.
/n acest caz, se folosete declaraia urmtoare"
:oi4 </ume$
/n acest caz, dac avem declaraiile"
i/t =7
6loat V7
77
:oi4 <87
atunci este corect oricare din instruciunile"
8NI=7
8NIV7
ns este necesar folosirea e.presiilor de tip cast, pentru a preciza tipul
datei spre care pointeaz p"
9ti8 <;8
Observaie" este necesar cunoaterea n fiecare moment a tipului valorii
ce se gsete la adresa atribuit pointerului de tip void O. 5einnd seama
de acest lucru se ajunge la erori.
!.emplu de utilizare a unui pointer de tip void"
i/t =7
:oi4 <87
,nstruciunea =N1- este ec&ivalent cu secvena "
8NI=7
<9i/t <;8N1-$
/n esen, dac 8 este pointer declarat ca :oi4 <8, nu poate fi folosit
dereferenierea <8 fr a preciza tipul datei referite printr-o e.presie de tipul
cast.
2.2. (eg2tura 4i/tre 8oi/teri Fi taKlouri
5umele unui tablou are drept valoare adresa primului su element.
Ca urmare, se spune c numele unui tablou este un pointer constant,
neputnd fi modificat n timpul e.ecuiei.
!.emplu"
7A
i/t taKH1--C7
i/t <87
i/t =7
...
8Nt7 /< 8 8rimeFte 1a :aloare a4re3a eleme/tului taKH-C </
L
/n acest e.emplu, atribuirea =NtaKH-C este ec&ivalent cu
=N<8$
Ca urmare a celor prezentate, rezult c dac un parametru efectiv este un
tablou unidimensional, atunci parametrul formal corespunztor poate fi
declarat n dou moduri"
a; ca tablou" ti8 /umeJ8arametruJ6ormalHC$
K; ca pointer" ti8 </umeJ8arametruJ6ormal7
Cele dou declaraii ale parametrului formal sunt ec&ivalente, fiind
corect utilizarea n corpul funciei a construciei de variabil inde.at"
/umeJ8arametruJ6ormal Hi/4i1eC$
-cest lucru este ilustrat n e.emplul de mai jos, care are drept scop
gsirea ma.imului i minimului dintre elementele unui ir.
/< Programul ()E=1.188 </
/< Programul e=em8li6i1a tra/3miterea 8arametrului 6ormal
taKlou 8ri/ 8oi/ter </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
:oi4 'a=Jmi/19i/t /,i/t aHC,i/t <ma=,i/t< mi/;
A
i/t i7
<ma=NaH-C7
<mi/NaH-C7
6or 9iN17i?/7iPP;
A
i6 9aHiC@<ma=; <ma=NaHiC7
el3e i6 9aHiC? <mi/; <mi/NaHiC7
B
B
7B
:oi4 'a=Jmi/29i/t /,i/t <a,i/t <ma=,i/t <mi/;
A
i/t i7
<ma=NaH-C7
<mi/NaH-C7
6or 9iN17i?/7iPP;
A
i6 9aHiC@<ma=; <ma=NaHiC7
el3e i6 9aHiC? <mi/; <mi/NaHiC7
B
B
:oi4 mai/9:oi4;
A
i/t i,/,ma=im,mi/im7
i/t =H1--C7
/< I/tro4u1erea 4atelor </
8ri/t69bE/Numarul eleme/telor taKloului /Nb;7
31a/69bO4b,I/;7
6or9iN-7i?/7iPP;
A
8ri/t69bE/=HO4CNb,i;7
31a/69bO4b,I=HiC;7
B7
/< A8elul 8rimei 8ro1e4uri </
'a=Jmi/19/,=,Ima=im,Imi/im;7
8ri/t69bE/(a a8elul 6u/1tiei 'a=Jmi/1 reZultaQE
ma=imulNO4 mi/imulNO4E/b,ma=im,mi/im;7
/< A8elul 1elei 4e a 4oua 8ro1e4uri </
'a=Jmi/29/,=,Ima=im,Imi/im;7
8ri/t69bE/(a a8elul 6u/1tiei 'a=Jmi/2 reZultaQE
ma=imulNO4 mi/imulNO4E/b,ma=im,mi/im;7
8ri/t69bE/A8a3ati o ta3ta[E/b;7
get159;7
B
2.". %8era0ii a3u8ra 8oi/terilor
-supra pointerilor sunt permise urmtoarele operaii"
7C
a# ,ncrementare*decrementare cu 2. /n acest caz valoarea
pointerului este incrementat*decrementat cu numrul de octei
necesari pentru a pstra o dat de tipul de care este legat
pointerul.
Operatorii folosii sunt PP i XX.
%e e.emplu"
i/t taKH1--C7
i/t <87
LLLLLL..
8NItaKH1-C7
8PP7 /< *aloarea lui 8 e3te i/1reme/tat2 1u 2, a:S/4 a4re3a
eleme/tului taKH11C</
b# -dunarea i scderea unui ntreg dintr-un pointer.
Operaia 8h/ are drept efect creterea, respectiv scderea din
valoarea 8 a /</um2rul 4e o1te0i necesari pentru a pstra o dat de tipul de
care este legat pointerul.
)entru e.emplul de mai sus, dac = este de tipul i/t, atunci"
=NtaKHiC$
este ec&ivalent cu"
=N<9taKPi;$
c# %iferena a doi pointeri.
%ac > pointeri p i ^ pointeaz spre elementele i i j ale aceluiai
tablou DjTi#, adic 8NItaKHiC i RNItaKHcC, atunci RX8 N 9c W
i;</um2rul 4e a1te0i necesari pentru a pstra o dat de tipul de baz
al tabloului.
d# Compararea a doi pointeri
%oi pointeri care pointeaz spre elementele aceluiai tablou pot fi
comparai folosind operatorii de relaie i de egalitate"
? ?N @ @N NN [N
:ai jos este prezentat programul de la paragraful precedent, folosind
operaii asupra pointerilor.
7E
/< Programul ()E=2.188 </
/< Programul e=em8li6i1a 6olo3irea o8eratiilor
a3u8ra 8oi/terilor </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
:oi4 'a=Jmi/19i/t /,i/t aHC,i/t <ma=,i/t< mi/;
A
i/t i7
<ma=NaH-C7
<mi/NaH-C7
6or 9iN17i?/7iPP;
A
i6 9aHiC@<ma=; <ma=NaHiC7
el3e i6 9aHiC? <mi/; <mi/NaHiC7
B
B
:oi4 'a=Jmi/29i/t /,i/t <a,i/t <ma=,i/t <mi/;
A
i/t i7
<ma=N<a7
<mi/N<a7
6or 9iN17i?/7iPP;
A
i6 9<9aPi;@<ma=; <ma=N<9aPi;7
el3e i6 9<9aPi;? <mi/; <mi/N<9aPi;7
B
B
:oi4 mai/9:oi4;
A
i/t i,/,ma=im,mi/im7
i/t =H1--C7
/< I/tro4u1erea 4atelor </
8ri/t69bE/Numarul eleme/telor taKloului /Nb;7
31a/69bO4b,I/;7
6or9iN-7i?/7iPP;
A?
A
8ri/t69bE/=HO4CNb,i;7
31a/69bO4b,I=HiC;7
B7
/< A8elul 8rimei 8ro1e4uri </
'a=Jmi/19/,=,Ima=im,Imi/im;7
8ri/t69bE/(a a8elul 6u/1tiei 'a=Jmi/1 reZultaQE
ma=imulNO4 mi/imulNO4E/b,ma=im,mi/im;7
/< A8elul 1elei 4e a 4oua 8ro1e4uri </
'a=Jmi/29/,=,Ima=im,Imi/im;7
8ri/t69bE/(a a8elul 6u/1tiei 'a=Jmi/2 reZultaQE
ma=imulNO4 mi/imulNO4E/b,ma=im,mi/im;7
8ri/t69bE/A8a3ati o ta3ta[E/b;7
get159;7
B
2.#. Alo1area/eliKerarea 4i/ami12 a memoriei 5ea8
-locarea memoriei pentru variabilele globale i statice este static,
adic alocarea rmne pn la terminarea programului.
-locarea memoriei pentru variabilele automatice este dinamic, n
sensul c stiva este 8curat( la terminarea funciei.
:emoria &eap este o zon de memorie dinamic, special, distinct
de stiv. !a poate fi gestionat prin funcii, care au prototipurile n fiierul
alloc.& i stdlib.&
-locarea unei zone de memorie &eap se poate realiza cu ajutorul
funciilor de prototip"
:oi4 <mallo1 9u/3ig/e4 /;7
:oi4 <1allo19u/3ig/e4 /rJelem, u/3ig/e4 4im;7
3uncia mallo1 aloc n &eap o zon contigu de / o1te0i, iar funcia
1allo1 o zon contigu de /rJelem < 4im n octei.
3unciile returneaz"
- n caz de succes, adresa de nceput a zonei alocate
Dpointerul fiind de tip void, este necesar conversia spre
tipul dorit#$
- n caz de insucces, returneaz zero Dpointerul 5<''#$
A2
!liberarea unei zone alocate cu malloc sau calloc se face cu ajutorul
funciei de prototip"
:oi4 6ree 9:oi4 <8;$
Observaie" )entru alocri de blocuri mai mari de A6 _octei, este
necesar utilizarea pointerilor de tipul far. /n acest caz, funciile de mai sus
au prototipurile"
:oi4 6ar <6armallo1 9u/3ig/e4 lo/g /;7
:oi4 6ar <6ar1allo19u/3ig/e4 lo/g /rJeleme/te, u/3ig/e4 lo/g
4im;7
:oi4 6ar6ree 9:oi4 6ar <8;7
:ai jos se prezint un e.emplu de utilizare a funciilor prezentate n
acest paragraf.
/< Programul ()E=".188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?allo1.5@
>i/1lu4e ?8ro1e33.5@
>i/1lu4e ?1o/io.5@
:oi4 mai/9:oi4;
A
15ar <3tr1,<3tr27
/< Alo1a memorie 8e/tru 8rimul 3ir 4e 1ara1tere </
i6 993tr1 N 915ar <; mallo191--;; NN NU((;
A
8ri/t69b'emorie i/3u6i1ie/taE/b;7
e=it91;7
B
8ri/t69bE/I/tro4u1eti 8rimul 3ir 4e 1ara1tere termi/at 1u
ENTERE/b;7
get393tr1;7
8ri/t69bE/Sirul 4e 1ara1tere i/tro4u3 e3teE/ O3E/b,3tr1;7
A>
/< Alo1a memorie 8e/tru al 4oilea 3ir 4e 1ara1tere </
i6 993tr2 N 915ar <; 1allo191--,3iZeo6915ar;;; NN NU((;
A
8ri/t69b'emorie i/3u6i1ie/taE/b;7
e=it92;7
B
8ri/t69bE/I/tro4u1eti al 4oilea 3ir 4e 1ara1tere termi/at 1u
ENTERE/b;7
get393tr2;7
8ri/t69bE/Sirul 4e 1ara1tere i/tro4u3 e3teE/ O3E/b,3tr2;7
8ri/t69bE/A8a3ati o ta3taE/b;7
get159;7
/< EliKerarea memoriei </
6ree93tr1;7
6ree93tr2;7
B
2.$. Folo3irea 1a 8arametru a u/ei 6u/10ii
5umele unei funcii este un pointer spre funcia respectiv. %e
aceea, numele unei funcii poate fi folosit ca parametru efectiv la apelul unei
funcii.
3ie 6 o funcie care va fi transmis ca parametru efectiv, avnd
antetul"
ti86 69li3taJ8arametrilorJ6ormaliJ6;$
/n acest caz, parametrul formal al unei funcii g care va fi apelat cu
parametrul efectiv f, este prezentat n antetul funciei g"
ti8g g9L, ti869<8;9li3taJ8arametrilorJ6ormaliJ6;, L;
-pelul se va face astfel"
g9L,6,..;7
)rogramul 'A!.6.cpp prezint un e.emplu n acest sens. !ste vorba
de integrarea unei funcii prin metoda trapezului.
A0
,
_
+ +
+
b
a
n
i
h i a f
b f a f
h dx x f
2
2
# O D
>
# D # D
# D
unde, n este numrul de subintervale n care s-a mprit intervalul Fa,bG,
dimensiunea unui subinterval fiind &.
/< Programul ()E=#.188 </
/< Programul e=em8li6i1a mo4ul 4e 6olo3ire
a u/ei 6u/1tii 1a 8arametru </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?mat5.5@
4ouKle 694ouKle =;
A
retur/ 9"<=<= P1;7
B
4ouKle i/tegrala94ouKle a,4ouKle K,i/t /,4ouKle9<8;94ouKle =;;
/< Cal1ulul i/tegralei 8ri/ meto4a tra8eZelor </
A
i/t i7
4ouKle 5,37
5N9KXa;//7
3N99<8;9a;P9<8;9K;;/2.-7
6or9iN17i?/7iPP;
3N3P9<8;9aPi<5;7
3N3<57
retur/ 37
B
:oi4 mai/9;
A
4ouKle a,K7
i/t /7
15ar 157
/< Citirea i/ter:alului 4e i/tegrare </
8ri/t69bE/aNb;731a/69bOl6b,Ia;7
8ri/t69bE/KNb;731a/69bOl6b,IK;7
15NdDd7
A6
`5ile 915NNdDd ^^ 15NNd4d;
A
8ri/t69bE//Nb;731a/69bO4b,I/;7
8ri/t69bE/Pe/tru /NO4 *aloarea i/tegralei e3te Ol6b,/,
i/tegrala9a,K,/,6;;7
8ri/t69bE/A8a3ati o ta3taE/b;7get159;7
8ri/t69bE/I/tro4u1eti alt /_ DAND/4 NUNalt 1ara1ter b;7
15Nget159;7
B
B
". 'er3ul lu1r2rii
0.2 Se vor e.ecuta e.emplele din lucrare. Se vor analiza urmtoarele
lucruri"
- folosirea unei variabile inde.ate, atunci cnd numele tabloului a fost
definit ca pointer n antetul funciei D'A!.2.cpp#$
- operaiile permise asupra pointerilor. Ce avantaj prezint nlocuirea
unei variabile cu indici cu o e.presie cu pointeriP D'A!.>.cpp#$
- cum se aloc n memoria &eap spaiul de memorie pentru variabile
dinamiceP D'A!.0.cpp#.
- care este avantajul transmiterii funciilor ca parametru efectiv
D'A!.6.cpp#.
/n continuare se vor scrie programele pentru rezolvarea urmtoarelor
probleme"
0.>. 3olosind numai pointeri i e.presii cu pointeri se vor scrie
funcii de citire, afiare i nmulire a dou matrice.
0.0. 3olosind numai pointeri i e.presii cu pointeri se vor scrie
funcii de sortare a unui vector cu elemente reale.
0.6. 3olosind numai pointeri i e.presii cu pointeri se va scrie o
funcie de interclasare a doi vectori, care conin elemente de tip real
ordonate cresctor.
A7
0.7. S se scrie o funcie care sorteaz n ordine cresctoare n iruri
de caractere.
0.A. S se scrie o funcie care determin rdcina unei funcii fD.#, n
intervalul Fa,bG, tiind c admite o singur rdcin n acest interval.
3uncia f va fi transmis ca parametru efectiv.
AA
Lucrarea de laborator nr. 7
1!C<1S,;,=-=!
1. Co/0i/utul lu1r2rii
/n lucrare este prezentat noiunea de recursivitate, avantajele i
dezavantajele funciilor recursive n raport cu cele nerecursive, pe baza unor
e.emple simple.
2. Co/3i4era0ii teoreti1e
2.1. 'e1a/i3mul re1ur3i:it20ii
<n obiect este recursiv dac este definit prin el nsui. O funcie este
recursiv dac ea se autoapeleaz.
1ecursivitatea poate fi"
- direct - cnd funcia conine un apel direct la ea
nsi$
- indirect - cnd funcia conine un apel al altei funcii,
care la rndul su o apeleaz pe prima.
'a fiecare apel al unei funcii, parametrii i variabilele automatice
ale ei se aloc pe stiv ntr-o zon independent. -cest lucru se ntmpl la
fiecare apel sau autoapel al funciei. %e aceea datele amintite au valori
distincte la fiecare reapelare ;ariabilele statice i cele globale ocup tot
timpul aceeai locaie de memorie. Ca urmare, orice modificare asupra lor
se face numai la adresa fi.at n memorie, deci ele i pstreaz valoarea de
la un reapel la altul.
1evenirea dintr-o funcie se face n punctul urmtor celui din care
s-a fcut apelul. -dresa de revenire se pstreaz tot n stiv. 'a revenire,
stiva se reface la starea ei dinaintea apelului, deci variabilele automatice i
parametrii vor reveni la valorile lor dinaintea reapelului respectiv.
O problem important este stoparea autoapelului. %e aceea trebuie
s e.iste o condiie de terminare, fr de care un apel recursiv ar conduce la
AB
o bucl infinit. /n aplicaiile practice este necesar nu numai ca adncimea
recursivitii sa fie finit, ci s fie relativ mic, deoarece fiecare apel
recursiv necesit alocarea pe stiv a zonei de memorie pentru"
- parametrii funciei$
- variabilele automatice locale funciei$
- adresa de return Drevenire n punctul de apel#.
Ca urmare, stiva poate crete foarte mult i repede se ajunge la
ocuparea ntregului spaiu de memorie alocat ei.
<n e.emplu clasic de proces recursiv este calculul factorialului
definit astfel"
Se observ c n definiia funciei fact e.ist o parte care nu se
definete prin ea nsi i anume factDn#R2 dac nR?.
/n limbajul C*C++, codul funciei corespunztoare este urmtoarea"
4ouKle 6a1t9i/t /;
A
i6 9/NN-; retur/ 1.-7
el3e retur/ /<6a1t9/X1;
B
1ecursivitatea liniar se caracterizeaz prin faptul c nu pot aprea
pe ramuri diferite ale e.ecuiei programului mai multe apeluri recursive,
adic pe un anumit nivel apare doar un singur apel recursiv.
1ecursivitatea liniar ntotdeauna poate fi transformat n iteraie,
ducnd la economie de memorie i timp de calcul Dse elimin operaiile de
salvare de conte.t la autoapelurile funciei#.
-vantajul principal al recursivitii este scrierea mai compact i mai
clar a funciilor care e.prim procese de calcul recursive. /n aceast clas
de procese intr cele generate de metodele de cutare cu revenire
D8bac_trac_ing(# i metodele de divizare D8divide et impera(#.
AC
?
?
# 2 D O
2
# D
>
'
n daca
n daca
n fact n
n fact
2.2. E=em8le
2.2.1. Citirea a / 1u:i/te 9Firuri 4e 1ara1tere;, 6ie1are termi/at
1u 38a0iu Fi ti82rirea lor M/ ogli/42.
/< Programul (!E=1.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< Programul 1ite3te / 1u:i/te 3e8arate 1u 38atiu7
94u8a ultimul 1u:a/t :a e=i3ta 38atiu 3i ?ENTER@;
3i le a6i3eaZa bi/ ogli/4ab </
:oi4 re:er39:oi4;
A
15ar 17
31a/69bO1b,I1;7
i6 91[NdE#-d; A8ri/t69bO1b,1;7re:er39;7B7
8ri/t69bO1b,1;7
B
:oi4 mai/9:oi4;
A
i/t /,i7
8ri/t69bE/Numarul 4e 1u:i/teNb;7
31a/69bO4b,I/;7
6or9iN17i?N/7PPi;
A
re:er39;7
8ri/t69bE/b;7
B7
8ri/t69bE/PR%&RA'U( SXA TER'INAT[[[E/b;7
get159;7
B
3uncia revers citete cte un caracter pe care l afieaz pn la
ntlnirea spaiului Dterminatorul irului de caractere#. 3iecare autoapel
AE
conduce la pstrarea n stiv a variabilei locale c. -pariia spaiului conduce
la terminarea apelurilor recursive ale funciei, urmnd scrierea spaiului i a
caracterelor n ordinea invers introducerii lor.
2.2.2. Determi/area terme/ului mi/im al u/ui Fir 4e / M/tregi.
/< Programul (!E=2.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< Programul 1al1uleaZa mi/imul 4i/trXu/ 3ir
1u terme/i i/tregi </
>4e6i/e N'A 1--
>4e6i/e 'AI' "2!)!
i/t 3irHN'AC7
i/t mi/im9i/t =,i/t V;
A
i6 9=?NV; retur/ =7
el3e retur/ V7
B
i/t terme/Jmi/im9i/t 4imJ3ir;
A
i6 94imJ3ir@N-; retur/ mi/im93irH4imJ3irC,terme/Jmi/im94imJ3irX1;;7
el3e retur/ 'AI'7
B
:oi4 mai/9:oi4;
A
i/t i,/7
8ri/t69bE/I/tro4u1eti /r 4e terme/i ai 3irului /Nb;7
31a/69bO4b,I/;7
8ri/t69bE/I/tro4u1eti :alorile terme/ilorE/b;7
6or9iN-7i?/7PPi;
A
8ri/t69b3irHO4CNb,i;7
31a/69bO4b,I3irHiC;7
B7
8ri/t69bE/SIRU( INTR%DUSE/b;7
B?
6or9iN-7i?/7PPi;
A
8ri/t69bO)4b,3irHiC;7
i6 99iP1; O 1- NN -; 8ri/t69bE/b;7
B7
8ri/t69bE/Cel mai mi1 terme/ e3te O4E/b,terme/Jmi/im9/X1;;7
8ri/t69bE/A8a3ati o ta3ta[b;7
get159;7
}
2.2.". *aria/ta re1ur3i:2 Fi /ere1ur3i:2 a g23irii :alorii 1elui 4e al /X
lea terme/ al Firului lui FiKo/a11i.
9irul lui 3ibonacci este definit astfel"
3ibD?#R?$ 3ibD2#R2$
3ibDn#R3ibDn-2#+3ibDn-># pentru n >
/< Programul (!E=".188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< Numerele lui FiKo/a11i </
i/t 6iK19i/t /;
/< *ARIANTA RECURSI*A </
A
i6 9/NN-; retur/ -7
el3e i6 9/NN1; retur/ 17
el3e retur/ 96iK19/X1;P6iK19/X2;;7
B
i/t 6iK29i/t /;
/< *ARIANTA NERECURSI*A </
A
i/t i,=,V,Z7
i6 9/NN-; retur/ -7
el3e i6 9/NN1; retur/ 17
el3e A
=N17VN-7
B2
6or9iN27i?N/7PPi;
A
ZN=7=N=PV7VNZ7
B7
retur/ =7
B
B
:oi4 mai/9:oi4;
A
i/t /7
15ar 157
15NdDd7
`5ile 9915NNd4d;^^ 915NNdDd;;
A
8ri/t69bE/I/tro4u1eti /Nb;7
31a/69bO4b,I/;7
8ri/t69bE/CA(CU( RECURSI*Q 6iK9O4;NO4E/b,/,6iK19/;;7
8ri/t69bE/CA(CU( NERECURSI*Q 6iK9O4;NO4E/b,/,6iK29/;;7
8ri/t69bE/Doriti 3a 1o/ti/uati _ DaND/4b;7
15Nget159;7
B
B
-pelul recursiv conduce la creterea rapid a stivei, de aceea este
preferabil implementarea nerecursiv.
". 'er3ul lu1r2rii
0.2. Se vor analiza i e.ecuta programele din e.emplele de mai sus.
)entru un caz concret, se va trasa starea stivei, urmrindu-se creterea pe
msura autoapelrii funciei i scderea ei la revenirea din autoapel.
0.>. S se scrie o funcie recursiv i una nerecursiv pentru calculul
valorii polinoamelor bermite bD.# definite astfel"
b
?
D.#R2$ b
2
D.#R>.$ b
n
D.#R>nb
n-2
D.#->Dn-2#b
n->
D.#,
pentru n2
0.0. )roblema turnurilor din banoi
B>
Se consider trei tije verticale -,4,C i n discuri de diametre diferite. ,niial
toate discurile sunt puse n tija -, n ordinea descresctoare a diametrului
Ddiscul cel mai mare la baz, iar cel mai mic n vrf#. Se cere s se mute
discurile de pe tija - pe tija C folosind tija 4 ca intermediar, folosind
condiiile"
a# la o manevr se mut un singur disc i anume cel din
vrful unei tije$
b# nu se poate pune un disc de diametru mai mare peste unul
de diametru mai mic$
c# n final, pe tija C, discurile trebuie s fie n aceeai ordine
ca n starea iniial de pe tija -.
0.6.S se scrie un program recursiv care citete n cuvinte i le
afieaz n ordinea invers a introducerii lor.
0.7.S se scrie un program recursiv de generare a produsului
cartezian a n mulimi.
0.A.S se scrie un program de generare recursiv a submulimilor
de _ elemente ale mulimii - cu n elemente Dcombinaiile de n elemente
luate cte _#.
0.B. S se scrie un program de rezolvare a problemei celor C
regine Ddeterminarea tuturor aezrilor pe tabla de a& a celor C regine astfel
nct s nu se atace#.
0.C.S se genereze recursiv permutrile mulimii - de n elemente.
0.E.Se consider o bar de lungime m i n repere de lungimi l
2
,
l
>
, .... , l
n
. %in bar trebuie tiate buci de lungimea reperelor date, astfel
nct s rezulte din fiecare reper cel puin o bucat i pierderile s fie
minime.
0.2?. 3uncia lui -c_ermann. S se scrie programul recursiv care
calculeaz funcia lui -c_ermann definit astfel"
-c_D?,n#Rn+2 pentru n c 5
-c_Dm,?#R-c_Dm-2,2# pentru m c 5O
-c_Dm,n#R-c_Dm-2,-c_Dm,n-2## pentru m,n c 5O
B0
B6
Lucrarea de laborator nr. !
IRURI DE CARACTERE
1. Co/0i/utul lu1r2rii
/n lucrare se prezint modul de reprezentare n memorie a unui ir de
caractere i unele funcii standard de prelucrare a irurilor de caracter.
2. Co/3i4era0ii teoreti1e
2.1. Re8reZe/tarea M/ memorie a u/ui Fir 4e 1ara1tere
<n ir de caractere este pstrat ntr-un tablou unidimensional de tip
c&ar. 3iecare caracter se pstreaz ntr-un octet prin codul -SC,, al su.
<ltimul caracter al irului, deci terminatorul irului, este caracterul 5<''
DKI?H#.
5umele tabloului care pstreaz irul de caractere este un pointer
constant spre irul de caractere.
!.emplu"
c&ar sir FGR(S,1 %! C-1-C=!1!($
/n memorie reprezentarea sa va fi Dn &e.azecimal#"
sir ? 2 > 0 6 7 A B C E 2? 22 2> 20 26 27 2A
70 6E 7> >? 66 67 >? 60 62 7> 62 60 76 67 7> 67 ??
3ir are ca valoare adresa zonei de memorie care conine irul.
-vem urmtoarele relaii"
sirFiG unde i c F?,2AG M reprezint codul -SC,, al celui de al i-lea
caracter din irul de caractere$
B7
sir + i unde i c F?,2AG, reprezint adresa celui de al i-lea caracter din
irul de caractere$
ODsir+i# are acelai efect ca sirFiG.
=ot ce s-a e.plicat mai sus, rmne valabil i n cazul declarrii n
felul urmtor"
15ar <1o/3t 3irNGSIR DE CARACTEREG7
%eclararea unui tablou de iruri de caractere se poate face astfel"
15ar <taKHCNA3irJ-,3irJ1,L,3irJ/B7
/n acest caz, tabFiG, pentru i c F?,nG, este un pointer spre irul de
caractere 8sir[i(.
/n cazul apelului
8ri/t69DO3E/G, taKHiC;7
se va afia te.tul 3irJi.
2.2. Fu/10ii 3ta/4ar4 4e 8relu1rare a Firurilor 4e 1ara1tere
3unciile standard de citire*scriere a irurilor de caractere"
- gets*puts$
- scanf*printf$
- sscanf*sprintf
au fost prezentate n lucrarea de laborator nr. 2.
/n continuare sunt prezentate cteva funcii de prelucrare a irurilor
de caractere, al cror prototip se gsete n fiierul 3tri/g.5
2.2.1. (u/gimea u/ui Fir 4e 1ara1tere
'ungimea unui ir de caractere, fr a fi luat n considerare
caracterul KI?H, este returnat de funcia 3trle/, care are prototipul"
u/3ig/e4 3trle/ 91o/3t 15ar <3;7
BA
!.emplu"
/< Programul (+E=1.188 </
/< Programul e=em8li6i1a utiliZarea 6u/1tiei 3trle/ </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3tri/g.5@
>4e6i/e al6a bA8a3ati o ta3ta[b
:oi4 mai/9:oi4;
A
15ar 3ir1HCNbSIR DE CARACTEREb7
15ar <3ir2NbSIR DE CARACTEREb7
i/t /1,/2,/"7
/1N3trle/93ir1;7
/2N3trle/93ir2;7
/"N3trle/9bSIR DE CARACTEREb;7
/< Atat /1,1at 3i /2 3i /" au 1a :aloare 1) </
8ri/t69bE/ /1NO4 /2NO4 /"NO4E/b,/1,/2,/";7
8ri/t69DO3E/G,al6a;7
get159;7
d
2.2..2. Co8ierea u/ui Fir 4e 1ara1tere
Copierea unui ir de caractere dintr-o zon de memorie de adres
3ur32 ntr-o alt zon de memorie de adres 4e3t se face cu ajutorul funciei
strcp", al crei prototip este"
15ar <3tr18V 915ar <4e3t, 1o/3t 15ar <3ur32;7
Se menioneaz c are loc copierea inclusiv a caracterului
5<''DKI?H#.
3uncia returneaz adresa unde a avut loc copierea, adic c&iar
destinaia.
BB
)entru a copia cel mult n caractere, din zona de memorie de adres
3ur32 n zona de memorie de adres 4e3t, se va folosi funcia 3tr/18V, al
crei prototip este urmtorul"
15ar <3tr/18V 915ar <4e3t, 1o/3t 15ar <3ur32, u/3ig/e4 /;7
%up ultimul caracter transferat, trebuie pus caracterul KI?H.
!vident c dac n T lungimea irului de la adresa surs, atunci are
loc transferarea ntregului ir de caractere.
!.emplu"
/< Programul (+E=2.188 </
/< Programul e=em8li6i1a utiliZarea 6u/1tiei 3tr18V </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3tri/g.5@
>4e6i/e al6a bE/A8a3ati o ta3ta[b
:oi4 mai/9:oi4;
A
15ar 3ir1HCNbSIR DE CARACTEREb7
15ar <3ir2NbSIR DE CARACTEREb7
15ar 3ir"H1--C,3ir#H1--C,3ir$H1--C7
3tr18V93ir",3ir1;7
8ri/t69bE/ 3ir" 1o/ti/eQ O3E/b,3ir";7
3tr18V93ir#,bFu/1tii 3ta/4ar4 4e 8relu1rare 3iruri 4e 1ara1tereb;7
8ri/t69bE/ 3ir# 1o/ti/eQ O3E/b,3ir#;7
3tr/18V93ir$,3ir2,);7/< 3ir$ 1o/ti/e SIR DE </
3ir$H)CNdE-d7
8ri/t69bE/ 3ir$ 1o/ti/eQ O3E/b,3ir$;7
8ri/t69al6a;7
get159;7
B
BC
2.2.". Co/1ate/area a 4ou2 Firuri 4e 1ara1tere
-dugarea irului de caractere de la adresa 3ur32 dup ultimul
caracter Dcel care precede 5<''# al irului de caractere de la adresa 4e3t se
face cu ajutorul funciei strcat, care are prototipul"
15ar <3tr1at915ar <4e3t, 1o/3t 15ar <3ur3;7
%up irul rezultat, se pune evident caracterul 5<'' DKI?H#. 3uncia
retuneaz valoarea adresei destinaie. !.ist posibilitatea de a prelua din
irul de caractere de la adresa surs numai n caractere, cu ajutorul funciei
3tr/1at, care are prototipul"
15ar <3tr/1at 915ar <4e3t, 1o/3t 15ar <3ur3a, u/3ig/e4 /;7
'a sfrit se pune automat caracterul 5<'' DKI?H#.
%ac nT lungimea irului de la adresa surs, atunci funcia 3tr/1at
are acelai efect ca i funcia 3tr1at.
!.emplu"
/< Programul (+E=".188 </
/< Programul e=em8li6i1a utiliZarea 6u/1tiei 3tr1at</
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3tri/g.5@
>4e6i/e al6a bE/A8a3ati o ta3ta[b
:oi4 mai/9:oi4;
A
15ar 3ir1H1--CNbSIR1 DE CARACTEREb7
15ar <3ir2Nb?SIR2 DE CARACTEREb7
15ar 3ir"H1--C7
3tr18V93ir",3ir1;7
3tr1at93ir1,3ir2;7
8ri/t69bE/ 3ir1 1o/ti/eQ O3E/b,3ir1;7
3tr/1at93ir",3ir2,$;7
/< Du8a ultimul 1ara1ter 4i/ 3r" 3e 8u/e im8li1it dE-d </
6or 9i/t iN-7i?N3trle/93ir";P17PPi; 8ri/t69bO=b,3ir"HiC;7
BE
8ri/t69bE/ 3ir" 1o/ti/eQ O3E/b,3ir";7
8ri/t69al6a;7
get159;7
B
2.2.#. Com8ararea a 4ou2 Firuri 4e 1ara1tere
Compararea a dou iruri de caractere se face caracter cu caracter
Dpe baza codurilor -SC,,# pn cnd"
- s-a ajuns la un caracter i din primul ir care difer de
caracterul i din al doilea ir$
- s-a ajuns la sfritul unuia din iruri sau a ambelor.
Compararea a dou iruri de caractere de la adresele 3ir1 i respectiv
3ir2 se poate face cu funcia de prototip"
i/t 3tr1m891o/3t 15ar <3ir1,1o/3t 15ar <3ir2;7
3uncia returneaz"
- o valoare negativ dac irul de caractere de la adresa
3ir1 este mai mic dect cel de la adresa 3ir2$
- zero dac irurile sunt egale$
- o valoare pozitiv, dac irul de la adresa 3ir1 este mai
mare dect cel de la adresa 3ir2.
%ac dorim s se compare numai primele n caractere din cele dou
iruri se folosete funcia de prototip"
i/t 3tr/1m8 91o/3t 15ar <3ir1, 1o/3t 15ar <3ir2, u/3ig/e4 /;7
%ac dorim s nu se fac distincie ntre literele mici i cele mari,
atunci cele dou funcii au drept corespondene"
i/t 3tri1m8 91o/3t 15ar <3ir1, 1o/3t 15ar <3ir2;7
i/t 3tr/i1m8 91o/3t 15ar <3ir1, 1o/3t 15ar <3ir2, u/3ig/e4 /;7
C?
!.emplu"
/< Programul (+E=#.188 </
/< Programul e=em8li6i1a utiliZarea 6u/1tiei 3tr1m8</
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3tri/g.5@
>4e6i/e al6a bE/A8a3ati o ta3ta[b
:oi4 mai/9:oi4;
A
15ar 3ir1H1--CNbSIR DE CARACTEREb7
15ar <3ir2NbSIR 4e 1ara1tereb7
i/t i,c,a,l7
iN3tr1m893ir1,3ir2;7/< i?- , reZulta 3ir1?3ir2 </
8ri/t69bE/iNO4E/b,i;7
cN3tr/1m893ir1,3ir2,";7/<cN- ,reZulta 1a 8rimele " 1ara1tere 4i/ 3ir1 3i
3ir2 3u/t egale </
8ri/t69bE/cNO4E/b,c;7
aN3tri1m893ir1,3ir2;7 /< aN-, reZulta 1a 1ele 2 3iruri 3u/t egale </
8ri/t69bE/aNO4E/b,a;7
lN3tr/i1m893ir1,bSIR 4e 1- 1ara1tereb,);7 /<lN- </
8ri/t69bE/lNO4E/b,l;7
8ri/t69al6a;7
get159;7
B
". 'er3ul lu1r2rii
0.2. Se vor analiza i e.ecuta programele din lucrare.
0.>. Se va scrie o funcie care s realizeze e.tragerea dintr-un ir de
caractere surs a unui subir specificat prin poziia n cadrul sursei i a
numrului de caractere e.trase.
C2
0.0. Se va scrie o funcie pentru inserarea unui ir de caractere surs
ntr-un ir de caractere destinaie, specificnd poziia din care ncepe
inserarea.
0.6. Se va scrie o funcie pentru tergerea unui subir dintr-un ir de
caractere dat. Subirul se va specifica prin poziie i numr de caractere.
0.7. Se va scrie o funcie pentru a verifica dac un ir dat este subir
al unui alt ir de caractere. /n caz afirmativ, se va specifica poziia pe care se
regsete pentru prima dat.
0.A. S se scrie dou funcii, una care convertete un numr ntreg
sau real ntr-un ir de caractere, iar cealalt face operaia invers.
0.B. S se scrie un program care citete n iruri de caractere i
afieaz irul cel mai lung i irul cel mai mare alfanumeric.
C>
Lucrarea de laborator nr. 9
TIPURI(E DE DATE STRUCTUR,
UNIUNE I ENU'ERARE
1. Co/0i/utul lu1r2rii
/n lucrare sunt prezentate tipurile definite de utilizator structur,
uniune i enumerare, accesul la componentele lor i asignarea de nume
pentru aceste tipuri.
2. Co/3i4era0ii teoreti1e
2.1. Ti8ul 4e 4ate b3tru1tur2b
O 3tru1tur2 conine mai multe componente de tipuri diferite
Dpredefinite sau definite de utilizator#, grupate conform unei ierar&ii.
%eclaraia unei structuri se poate face astfel"
C0
struct nume
e
'ista de
componente
d
,dentificator
variabil
$
,
Observaie" /n aceasta declaraie nu pot lipsi simultan fnumef i
8identificator[variabil(.
O variabil structur de tipul fnumef poate fi declarat i ulterior
conform diagramei de mai jos, cu meniunea c cuvntul c&eie fstructf
poate lipsi n C++"
!.emple ec&ivalente"
a# struct material e
long cod$
c&ar den F0?G$
c&ar um F2?G$
real cantitate$
real pret[unit$
d stofa, &artie, motor$
b# struct materiale
long cod$
c&ar den F0?G$
c&ar um F2?G$
real cantitate$
real pre[unitar$
d$
struct material stofa, &artie, motor$
sau
C6
'ista de
componente
tip identificator
$
,
struct nume ,dentificator
variabil
$
,
material stofa, &artie, motor$
c# struct e
long cod$
c&ar den F0?G
c&ar um F2?G$
real cantitate$
real pret[unitar$
d stofa, &artie, motor$
-ccesul la componentele unei structuri se poate face prin procedeul
de calificare"
i4e/ti6i1atorJ:ariaKil2.i4e/ti6i1atorJ1Sm87
!.emplu" stofa.den
&artie.cantitate
)rocedeul de calificare ptrunde din aproape n aproape n ierar&ia structur.
/n limbajul C, transmiterea ca parametru a unei structuri la apelul
unei funcii, se face numai prin adresa variabilei de tip structur. %e
e.emplu"
:oi4 6 93tru1t material <8, ...;7
-pelul se va face prin"
69I3to6a, ...;
/n funcie, selectarea unui cmp se face astfel"
DOp#.den
DOp#.cantitate
sau nlocuind 9<8;. prin 8X@ , ca mai jos"
p-Tden
p-Tcantitate
/n limbajul C++, o structur poate fi transferat prin parametri n 0
moduri"
C7
- direct" void f Dmaterial p, ..#
- pointer spre structur" void f Dmaterial Op, ...#
- referin la structur" void f Dmaterial Vp, ...#
O structur de acelai tip se poate atribui direct una alteia"
material alfa, beta$
alfaRbeta$ eeste corectd
2.2. Ti8ul 4e 4ate bu/iu/eb
/n momente diferite ale e.ecuiei, se pot pstra n aceeai zon de
memorie date de tipuri diferite pentru economisirea memoriei sau din
motive ale concepiei programului. -cest lucru se face grupnd toate datele
care se aloc n aceeai zon de memorie. Structura utilizator obinut se
numete u/iu/e. Sinta.a uniunii este identic cu cea a structurii, singura
deosebire constnd n nlocuirea cuvntului c&eie f3tru1tf cu fu/io/f n
diagramele de sinta. de la punctul >.2.
%e menionat c zona de memorie rezervat are dimensiunea
componentei care necesit cea mai mult memorie pentru reprezentare.
-ccesul la componente se face identic ca la structur.
%e menionat c programatorul trebuie s cunoasc n fiecare
moment care dat este reprezentat.
!.emplu"
union alfa e
c&ar cF7G$ *O reprezentare pe 7 octei O*
int i$ *O reprezentare pe > octei O*
long j$ *O reprezentare pe 6 octei O*
d$
union alfa .$
strcpZD..c, 8-4C%(#$
;ariabila . are reprezentarea n &e.azecimal, astfel"
62 6> 60 66 ??
CA
%aca se acceseaz componenta ..i, atunci aceasta va avea 6>62 n
&e.azecimal, adic 2AEA2 n zecimal.
/n sc&imb, aceeai zon de memorie interpretat ca ..j Dlong# va avea
valoarea 66606>62 n &e.azecimal, adic 2.267.>7C.7A2 n zecimal
2.". Ti8ul 4e 4ate be/umerareb
=ipul e/umerare permite programatorului de a folosi nume
sugestive pentru valori numerice. %iagrama de sinta. pentru tipul
enumerare este asemntoare cu tipurile structur i uniune. %eosebirea
const n faptul c lista de componente este format numai din identificatori
de valoare ntreag ?,2,>,..."
!.emple ec&ivalente"
a# enum spt eluni, mari, miercuri, joi, vineri, smbt, duminicd$
enum spt spt[vacan$
b# enum spt eluni, mari, miercuri, joi, vineri, smbt, duminicd
spt[vacan$
CB
=ip
enumerare
enum nume
e
,dentificator
valoare
,dentificator
variabil
d $
,
,
c# enum eluni, mari, miercuri, joi, vineri, smbt, duminicd spt[vacan$
-tribuiri posibile"
spt[vacanRvineri$
,dentificatorii luni, mari,\, au valorile ?,2,.\
2.#. De1lararea ti8urilor 4e 4ate 8ri/ /ume 3imKoli1e
/n limbajul C*C++ se poate atribui un nume simbolic unui tip
predefinit sau unui tip utilizator. %iagrama de sinta. pentru asignarea unui
nume simbolic fnume[tipf unui ftipf predefinit sau utilizator este
urmtoarea"
!.emplu"
a# tZpedef struct e
int i$
float j$
double .$
d -'3-$
-'3- Z, z$
b# tZpedef struct e
float re$
float im$
d CO:)'!g$
CO:)'!g ., Z$
c# tZpedef union e
c&ar .F2?G$
long cod$
CC
tZpedef tip 5ume[tip
$
d 4!=-$
4!=- u, v$
d# tZpedef enum efalse, trued 4OO'!-5$
4OO'!-5 _, l$
2.$. E=em8le 4e 8rograme
)rogramul urmtor prezint operaii asupra numerelor comple.e,
folosind tipul structur. Sunt ilustrate toate posibilitile de transmiterea a
parametrilor de tip structur.
/<Programul (9E=1.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?8ro1e33.5@
tV8e4e6 3tru1t A6loat re,im7BC%'P(E7
:oi4 a4u/a9C%'P(E <a,C%'P(E <K,C%'P(E <1;
/< tra/3miterea 8arametrilor 8ri/ 8oi/teri </
A
1X@reNaX@rePKX@re7
1X@imNaX@imPKX@im7
B7
:oi4 31a4e9C%'P(E a,C%'P(E K,C%'P(E <1;
/< tra/3miterea 8arametrilor 8ri/ :aloare b8o3iKil /umai i/ CPPb
3i a reZultatului 8ri/ 8oi/ter </
A
1X@reNa.reXK.re7
1X@imNa.imXK.im7
B7
:oi4 8ro4u39C%'P(E a,C%'P(E K,C%'P(E I1;
/<tra/3miterea 8arametrilor 8ri/ :aloare b8o3iKil /umai i/ CPPb
3i a reZultatului 8ri/ re6eri/ta </
A
1.reNa.re<K.reXa.im<K.im7
CE
1.imNa.im<K.rePa.re<K.im7
B7
:oi4 im8artire9C%'P(E <a,C%'P(E <K,C%'P(E <1;
/<tra/3miterea 8arametrilor 8ri/ 8oi/teri </
A
6loat =7
=NKX@re<KX@rePKX@im<KX@im7
i6 9=NN-; A
8ri/t69bE/im8artire la Zero[E/b;7
e=it91;7
B
el3eA
1X@reN9aX@re<KX@rePaX@im<KX@im;/=7
1X@imN9aX@im<KX@reXaX@re<KX@im;/=7
B
B7
:oi4 mai/9:oi4;
/< %8era0ii a3u8ra /umerelor 1om8le=e </
A
C%'P(E a,K,17
15ar 15,o87
15NdDd7
`5ile 9915NNdDd;^^ 915NNd4d;;
A
8ri/t69bE/I/tro4u1eti 8rimul /um2r 1om8le=E/b;7
8ri/t69ba.reNb;731a/69bO6b,Ia.re;7
8ri/t69ba.imNb;731a/69bO6b,Ia.im;7
8ri/t69bE/I/tro4u1e0i al 4oilea /um2r 1om8le=E/b;7
8ri/t69bK.reNb;731a/69bO6b,IK.re;7
8ri/t69bK.imNb;731a/69bO6b,IK.im;7
a4u/a9Ia,IK,I1;7
8ri/t69bE/9O6Pc<O6;P9O6Pc<O6;NO6Pc<O6E/b,
a.re,a.im,K.re,K.im,1.re,1.im;7
31a4e9a,K,I1;7
8ri/t69bE/9O6Pc<O6;X9O6Pc<O6;NO6Pc<O6E/b,
a.re,a.im,K.re,K.im,1.re,1.im;7
E?
8ro4u39a,K,1;7
8ri/t69bE/9O6Pc<O6;<9O6Pc<O6;NO6Pc<O6E/b,
a.re,a.im,K.re,K.im,1.re,1.im;7
im8artire9Ia,IK,I1;7
8ri/t69bE/9O6Pc<O6;P9O6Pc<O6;NO6Pc<O6E/b,
a.re,a.im,K.re,K.im,1.re,1.im;7
8ri/t69bE/C%NTINUAI_DAND/4,NuNalt 1ara1ter b ;7
31a/69bO<1O1b,I15;7
B
B
)rogramul urmtor prezint operaii asupra datelor de tipul funionf"
/< Programul (9E=2.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?3tri/g.5@
/< E=em8lu 4e 6olo3ire a ti8ului bu/io/b </
:oi4 mai/9;
AtV8e4e6 u/io/A
15ar 15H1-C7
i/t =7
lo/g V7
6loat 67
B al6a7
al6a a7
3tr18V9a.15,bA.CDEF&jIb;7
8ri/t69bE/Dime/3iu/ea Zo/ei 4e memorie reZer:ata NO4 o1tetiE/b,
3iZeo6 a;7
8ri/t69bE/C%NTINUTU( f%NEIQE/b;7
8ri/t69bE/X3ir 4e 1ara1tereQ O3b,a.15;7
8ri/t69bE/Xi/treg 4e ti8ul i/tQ O49O= i/ 5e=a;b,a.=,a.=;7
8ri/t69bE/Xi/treg 4e ti8ul lo/gQ Ol49Ol= i/ 5e=a;b,a.V,a.V;7
8ri/t69bE/Xreal 4e ti8ul 6loatQ Ogb,a.6;7
get159;7
B
E2
)rogramul urmator prezinta operatii asupra datelor de tipul fenumf.
/< Programul (9E=".188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< E=em8lu 4e 6olo3ire a ti8ului be/umb </
:oi4 mai/9;
A
tV8e4e6 e/umAZero,u/u,4oi,trei,8atru,1i/1iB NR7
NR =,V7
i/t Z,`7
=N4oi7 /< =N2 </
VNtrei7 /<=N"</
ZN=PV7
`N=<V7
8ri/t69bE/ZNO4 `NO4E/b,Z,`;7
get159;7
=N27VN"7/< o a3t6el 4e atriKuire i/4i1a b`ar/i/gb </
ZN=PV7`N=<V7
8ri/t69bE/ZNO4 `NO4E/b,Z,`;7
get159;7
B
". 'er3ul lu1r2rii
0.2. 3olosind tipul structur pentru o dat curent an, lun, zi, s se
scrie un program pentru a afia a ctea zi din an este ziua respectiv i cte
zile au mai rmas pn la sfritul anului.
0.>. 3olosind tipul structur pentru data de natere a %-voastr i
tiind c n anul curent v aniversai ziua de natere n ziua de . Fluni,
mari, ..., duminicG, scriei un program pentru a afia ziua Ddin sptmn#
n care v-ai nscut.
E>
0.0. S se scrie un program modularizat care citete datele legate de
studenii unei grupe" nume, data naterii, adresa i i afiseaz n ordine
cresctoare le.icografic.
0.6. S se scrie un program pentru calculul valorii unui polinom de
gradul n cu coeficieni compleci pentru o valoare comple.. Calculul se va
face cu ajutorul unei funcii.
0.7. S se introduc tipul 1-h,O5-' ca o structur formata din
numrtor i numitor. S se scrie funcii de simplificare, adunare, scdere,
nmulire, mprire, ridicare la putere.
0.A. 3olosind tipul uniune, care conine cmpurile necesare pentru a
putea reprezenta un cerc, un dreptung&i, un ptrat, un triung&i, s se scrie o
funcie pentru a calcula aria figurii respective.
0.B. 3olosind tipul enumerare, s se introduc tipul boolean. S se
scrie o funcie de ordonare cresctoare a unui ir folosind metoda bulelor i
un semafor de tipul boolean.
0.C. Se citete un ir de caractere format din litere i cifre. S se
indice frecvena de apariie a caracterelor ntlnite n ir folosind o list
ordonat alfabetic Dnodul conine caracterul, frecvena i adresa urmtorului
nod#.
E0
Lucrarea de laborator nr. 10
PRE(UCRAREA FIIERE(%R
DE CTRE NI*E(U( INFERI%R A( S.&.F.
1. Co/0i/utul lu1r2rii
/n lucrare sunt prezentate funciile de prelucrare a fiierelor la
nivelul inferior, adic acelea care fac apel la sistemul de operare. !.emplul
prezentat n lucrare ilustreaz principalele operaii asupra unui fiier"
crearea, adugarea, modificarea i citirea unui fiier.
2. Co/3i4era0ii teoreti1e
3iierul este o colecie ordonat de nregistrri, memorate pe un
suport e.tern.
)rincipalele operaii asupra unui fiier sunt"
- desc&iderea unui fiier e.istent$
- crearea unui fiier$
- citirea*scrierea ntr-un fiier$
- poziionarea ntr-un fiier$
- tergerea unui fiier.
)relucrarea unui fiier se poate face n dou moduri"
a# utiliznd funciile sistemului de operare Dnivelul inferior#$
b# utiliznd funciile specializate de gestiune a fiierelor Dnivelul superior#.
:odul de e.ploatare a unui fiier poate fi"
- secvenial$
- direct.
E6
/n lucrare sunt prezentate funciile de nivel inferior de prelucrare a
fiierelor.
2.1. Crearea u/ui 6iFier /ou
)entru a avea un fiier nou, se utilizeaz funcia creat, care are
urmtorul prototip"
i/t 1reat 91o/3t 15ar <1aleaJ/ume, i/t mo4;7
unde"
- calea[nume - este un pointer spre un ir de caractere care definete calea
de nume Dpat&[name# a fiierului care se creeaz$
- mod - este un ntreg care poate fi definit prin combinarea cu f3au
8e Ki0if a urmtoarelor drepturi de acces"
S[,1!-% - dreptul de citire$
S[,i1,=! - dreptul de scriere.
3uncia returneaz descriptorul de fiier n caz de succes sau -2 n
caz de eroare.
3uncia creat necesit includerile de fiiere"
jinclude Sio.&T
jinclude SsZs*stat.&T
%K3er:a0ie im8orta/t2" desc&iderea n creare a unui fiier e.istent conduce
la tergerea saU
3iierul creat este e.ploatat n mod te.t DO[=!g=# sau binar
DO[4,5-1k#, dup valoarea variabilei globale [fmode Dimplicit are
valoarea O[=!g=#.
!.emplu"
[fmodeRO[4,5-1k$
dfRcreat Dfa"II3,S.4,5(,S[,i1,=!#$
E7
2.2. De315i4erea u/ui 6iFier e=i3te/t
%esc&iderea unui fiier e.istent se face cu ajutorul funciei open,
care are urmtorul prototip"
i/t o8e/ 91o/3t 15ar <1aleaJ/ume, i/t a11e3;7
unde"
calea[nume - este un pointer spre un ir de caractere care definete calea de
nume a fiierului e.istent$
acces - este un ntreg care este generat prin combinarea pe bii cu ajutorul
operatorului f3au 8e Ki0i f ntre urmtoarele constante"
O[1%O5'k - desc&iderea pentru 1!-%$
O[i1O5'k - desc&iderea pentru i1,=!$
O[1%i1 - desc&iderea pentru 1!-% i i1,=!$
O[-))!5% - pointerul n fiier va fi fi.at pe sfritul de fiier naintea
fiecrei scrieri$
O[=1<5C - dac fiierul e.ist, el este trunc&iat la zero. %repturile de
acces la fiier rmn nesc&imbate$
O[4,5-1k - modul de lucru binar$
O[=!g= - modul de lucru caracter Dimplicit#.
Observaie" cu ajutorul funciei open, fiierul poate fi creat, caz n
care open are prototipul urmtor"
i/t o8e/ 91o/3t 15ar <1aleJ/ume, i/t a11e3, u/3ig/e4 mo4;7
/n acest caz, accesul este o combinaie ntre opiunile prezentate anterior i
urmtoarele"
O[C1!-= - pentru crearea fiierului$
O[!gC' - pentru a returna eroare n caz c fiierul e.ist.
Opiunile pentru parametrul mo4 sunt identice cu cele de la creat.
3iierele care trebuie incluse sunt"
jinclude Sfcntl.&T
jinclude Sio.&T
3uncia open returneaz descriptorul de fiier sau -2 n caz de eroare.
EA
!.emplu"
dfRopenDfC"IIlimbaj[cII3,S.%-=f, O[1%i1#$
Observaie" numrul fiierelor desc&ise la un moment dat este limitat de
obicei la >?.
2.". Citirea 4i/trXu/ 6iFier
Citirea dintr-un fiier e.istent desc&is cu open se face cu ajutorul
funciei read, care are urmtorul prototip"
i/t rea4 9i/t 46, :oi4 <Ku6, u/3ig/e4 lu/gime;7
unde"
df - este descriptorul de fiier returnat de open la desc&iderea
fiierului respectiv$
buf - este pointerul spre zona de memorie n care se pstreaz
nregistrarea citit din fiier$
lungime - este lungimea n octei a nregistrrii citite.
3iierul este interpretat ca o succesiune de octei, ncepnd cu zero.
%up fiecare citire, indicatorul din fiier indic octetul cu care ncepe citirea
urmtoare.
'a desc&idere cu O[1%O5'k sau O[1%i1, indicatorul este
poziionat pe octetul ?.
3uncia read returneaz n caz de succes numrul de octei efectiv
citii, iar n caz de eroare returneaz -2, felul erorii fiind dat de variabila
EB
!O3
Sfrit de fiier
indicator
i
2 > 0 6
e.tern err/o. /n caz de ntlnire a sfritului de fiier DC=1'*L#, funcia
read returneaz valoarea zero.
3iierul standard de intrare are descriptorul de fiier zero.
3uncia read necesit includerea fiierului io.&.
!.emplu. Citirea a >? de octei din fiierul 3,S.%-= aflat in directorul
curent"
dfRopen Df3,S.%-=f, O[1%O5'k#$
nRread Ddf, adr, >?#$
2.#. S1rierea M/trXu/ 6iFier
Scrierea ntr-un fiier desc&is cu open sau cu creat se face cu ajutorul
funciei Jrite, care are ca prototip"
i/t `rite 9i/t 46, :oi4 <Ku6, u/3ig/e4 lu/gime;7
unde"
df - este descriptorul de fiier returnat de funcia open sau creat$
buf - este pointerul spre zona de memorie din care se preia
nregistrarea care se scrie n fiier$
lungime - este numrul de octei de scris.
3uncia returneaz numrul de octei efectiv scrii sau -2 n caz de
eroare.
3uncia Jrite implic includerea fiierului io.&.
3uncia Jrite poate fi folosit pentru scrierea n fiierul standard,
care are dfR2$
!.emplu" Scrierea n fiierul 3,S.%-= din directorul curent a >? de
octei de la adresa adr"
dfRcreat Df3,S.%-=f, S[,i1,=!#$
nRJrite Ddf,adr,>?#$
EC
2.$. PoZi0io/area M/trXu/ 6iFier
/n cazul n care se dorete citirea sau scrierea de la o anumit poziie
dintr-un fiier pe suport magnetic, se utilizeaz funcia lsee_, care are
prototipul"
lo/g l3eea 9i/t 46, lo/g i/1reme/t, i/t origi/e;7
unde"
df - este descriptorul de fiier desc&is$
increment - numrul de octei peste care se va poziiona indicatorul n
fiier, innd cont de parametrul origine$
origine - are una din valorile"
? - incrementul se consider fa de nceputul fiierului$
2 - incrementul se consider fa de poziia curent a indicatorului de
fiier$
> - incrementul se consider fa de sfritul fiierului.
3uncia returneaz deplasamentul rezultat fa de nceputul fiierului sau -2
n caz de eroare. <tilizarea funciei necesit includerea fiierului io.&.
!.emple"
a# poziionarea indicatorului la nceputul fiierului"
lsee_Ddf,?l,?#$
b# poziionarea indicatorului la sfritul fiierului, caz utilizat pentru
adugarea de noi nregistrri n fiier "
lsee_ Ddf, ?l, >#
2.). i/15i4erea u/ui 6iFier
%up terminarea prelucrrii unui fiier, acesta se nc&ide apelnd
funcia close, care are prototipul"
int closeDint df#$
df fiind descriptorul fiierului.
3uncia returneaz zero n caz de succes sau -2 n caz de eroare.
3olosirea funciei necesit includerea fiierului io.&.
EE
2.!. E=em8lu
/n programul urmtor sunt ilustrate urmtoarele operaii asupra unui
fiier"
- crearea fiierului$
- adugarea de noi nregistrri$
- modificarea unor nregistrri. /n acest caz se poziioneaz indicatorul n
fiier pe nceputul nregistrrii i se scrie noua nregistrare$
- citirea i afiarea coninutului fiierului$
- sortarea fiierului, avnd drept c&eie media, un cmp din nregistrare.
/ntruct numrul nregistrrilor unui fiier este mare, s-au citit iniial
nregistrrile din care s-au e.tras c&eile de sortare, reinndu-se numrul de
ordine al nregistrrilor i se ordoneaz n memoria interna. -poi se obine
fiierul sortat.
/< Programul (1-E=1.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
>i/1lu4e ?io.5@
>i/1lu4e ?61/tl.5@
>i/1lu4e ?3V3E3tat.5@
>i/1lu4e ?8ro1e33.5@
>i/1lu4e ?3t4liK.5@
/< E=em8lu 4e utiliZare a 6iFierelor </
tV8e4e6 3tru1tA
15ar /umeH"2C7
6loat me4ia7
/<alte i/6orma0ii </
B STUDENT7
tV8e4e6 u/io/ A
STUDENT 3tu47
15ar 3tH3iZeo69STUDENT;C7
B .UF7
tV8e4e6 3tru1t A
i/t /r7
6loat me47
B E(E'ENT7
2??
:oi4 3ortare915ar /umeJ6i3HC,15ar /umeJ6i3J3ortatHC;
A
E(E'ENT el,tH1--C7
i/t a,c,/,i,461,4627
.UF 3tu7
cN-7
461No8e/9/umeJ6i3,%JRD%N(k;7
`5ile 9rea49461,3tu.3t,3iZeo69STUDENT;;@-;
A
tHcC./rNc7
tHcC.me4N3tu.3tu4.me4ia7
cNcP17
B7
/< Sortarea taKloului t 4u82 me4ie </
/NcX17/< Eleme/tele taKloului t 3u/t -,1,2,...,/ </
cN-7
4o
A
aN17cNcP17 /<aNTRUE</
6or9iN-7i?N/Xc7iPP;
i6 9tHiC.me4 @ tHiP1C.me4;
A
elNtHiC7tHiCNtHiP1C7tHiP1CNel7
aN-7/<aNFA(SE </
B7
B
`5ile9aNN-;7
1lo3e9461;7
/<Crearea 6iFierului 3ortat </
462N1reat9/umeJ6i3J3ortat,SJIlRITE^SJIREAD;7
461No8e/9/umeJ6i3,%JRD%N(k;7
6or9iN-7i?N/7iPP;
A
l3eea9461,9lo/g;9tHiC./r < 3iZeo69STUDENT;;,-;7
rea49461,3tu.3t,3iZeo69STUDENT;;7
`rite9462,3tu.3t,3iZeo69STUDENT;;7
B7
1lo3e9461;7
2?2
1lo3e9462;7
B
:oi4 a6i3are9 15ar /umeJ6i3HC;
A
.UF 3tu7
i/t c,4617
cN-7
461No8e/9/umeJ6i3,%JRD%N(k;7
`5ile 9rea49461,3tu.3t,3iZeo69STUDENT;;@-;
A
8ri/t69bE/O4 OX"23 O!.26b, c, 3tu.3tu4./ume,
3tu.3tu4.me4ia;7
cNcP17
B7
1lo3e9461;7
B
:oi4 mai/9;
A
i/t i,/,m,4617lo/g l7
15ar 157
.UF 3tu7
15ar /umeJ6i3H$-CNb1QEEig/atEE(imKacJCEEgru8a.4atb7
15ar /umeJ6i3J3ortatH$-CNb1QEEig/atEE(imKacJCEEgru8a3ort.4atb7
8ri/t69bE/Nr.3tu4e/tilor 4e i/tro4u3 /Nb;7
31a/69bO4b,I/;7
/<1rearea 6iFierului </
i6 99461N1reat9/umeJ6i3,SJIlRITE^SJIREAD;;NNX1;
A
8ri/t69bNu 3e 8oate 1rea 6iFierulE/b;7
e=it91;7
B
/< I/tro4u1erea 4atelor 4e38re 3tu4e/ti </
6or9iN17i?N/7iPP;
A
8ri/t69bE/Numele 3tu4e/tuluiQ b;7
31a/69bO<1b;7
2?>
get393tu.3tu4./ume;7
8ri/t69bE/'e4iaNb;7
31a/69bO6b,I3tu.3tu4.me4ia;7
`rite9461,3tu.3t,3iZeo69STUDENT;;7
B7
1lo3e9461;7 /< i/15i4erea 6iFierului </
/<A42ugarea 4e /oi arti1ole i/ 6iFier </
8ri/t69bE/Nr.3tu4e/tilor 4e a4augat mNb;7
31a/69bO4b,Im;7
461No8e/9/umeJ6i3,%JRDlR;7
l3eea9461,-l,2;7
6or9iN17i?Nm7iPP;
A
8ri/t69bE/Numele 3tu4e/tului a42ugatQ b;7
31a/69bO<1b;7
get393tu.3tu4./ume;7
8ri/t69bE/'e4iaNb;7
31a/69bO6b,I3tu.3tu4.me4ia;7
`rite9461,3tu.3t,3iZeo69STUDENT;;7
B7
1lo3e9461;7 /<i/15i4erea 6iFierului </
8ri/t69bE/ FIIERU( DUPA CREAREE/b;7
a6i3are9/umeJ6i3;7
/< 'o4i6i1area 4atelor 4i/ 6iFier </
8ri/t69bE/ 'o4i6i1ati_ DAND/4 NUN alt 1ara1ter b;7
31a/69bO<1O1b,I15;7
461No8e/9/umeJ6i3,%JRDlR;7
`5ile9915NNdDd;^^915NNd4d;;
A
8ri/t69bNr.4e or4i/e al 3tu4e/tului Nb;7
31a/69bO4O<1b,Ii;7
lNl3eea9461,9lo/g;93iZeo69STUDENT; <i;,-;7
8ri/t69b4e8lNOl4 8e/tru iNO4E/b,l,i;7
rea49461,3tu.3t,3iZeo69STUDENT;;7
8ri/t69bE/Numele :e15i e3teQO3E/b,3tu.3tu4./ume;7
8ri/t69bE/Numele mo4i6i1atQb;7
get393tu.3tu4./ume;7
8ri/t69bE/ 'e4ia :e15e e3teQ O6b,3tu.3tu4.me4ia;7
2?0
8ri/t69bE/'e4ia mo4i6i1at2Nb;7
31a/69bO6b,I3tu.3tu4.me4ia;7
lNl3eea9461,9lo/g;93iZeo69STUDENT; <i;,-;7
8ri/t69b4e8lNOl4 8e/tru iNO4E/b,l,i;7
`rite9461,3tu.3t,3iZeo69STUDENT;;7
8ri/t69bE/ 'ai mo4i6i1ati_ DAND/4 NUNalt 1ara1ter b;7
31a/69bO<1O1b,I15;7
B
1lo3e9461;7
8ri/t69bE/C%NINUTU( FISIERU(UI NES%RTATE/b;7
a6i3are9/umeJ6i3;7
get159;7
8ri/t69bE/C%NINUTU( FISIERU(UI S%RTATE/b;7
3ortare9/umeJ6i3,/umeJ6i3J3ortat;7
a6i3are9/umeJ6i3J3ortat;7
get159;7
B
". 'er3ul lu1rarii
0.2. Se va e.ecuta i analiza programul '2?!.2.cpp
0.>. Se citete de la tastatur un te.t care se scrie ntr-un fiier
fte.t.datf. S se afieze apoi coninutul fiierului, fiecare linie fiind
precedat de numrul de ordine al ei.
0.0. %e la tastatur se citesc partea real i partea imaginar pentru n
numere comple.e. S se creeze un fiier care conine numerele comple.e
citite, fiecare numr avnd partea real, partea imaginar, modulul i
argumentul su.
0.6. %ou firme i pstreaz informaiile referitoare la stocul de
mrfuri Dcod produs, denumire, cantitate, pre unitar# n fiierele
fmarfa2.datf i respectiv fmarfa>.datf, ordonate cresctor dup cod. )rin
fuzionarea celor dou firme, rezult un stoc comun care trebuie memorat n
fiierul fmarfa.datf, ordonat dup cod.
a# S se creeze fiierele iniiale, pe baza datelor introduse de la
tastatur i apoi s se creeze fiierul de stoc comun fmarfa.datf )entru
mrfuri cu cod comun, se consider c denumirea i preul unitar corespund.
2?6
b# 3iierul fmarfa.datf se va parcurge secvenial, tiprind pentru
fiecare component denumirea i cantitatea.
c#)entru o component dorit dat prin numrul de ordine, se va
modifica direct preul su unitar.
0.7. S se scrie programul pentru concatenarea a dou sau mai multe
fiiere ce conin numere reale. Se va tipri informaia din fiierul rezultat.
2?7
Lucrarea de laborator nr. 11.
PRE(UCRAREA FIIERE(%R
DE CTRE NI*E(U( SUPERI%R A( S.&.F.
1. Co/0i/utul lu1r2rii
/n lucrare sunt prezentate funciile de prelucrare a fiierelor de nivel
superior, utiliznd structuri speciale de tip 3,'!. )rincipalele operaii care
se pot efectua asupra fiierelor la acest nivel sunt" crearea, desc&iderea,
citirea*scrierea unui caracter sau a unui ir de caractere, citirea*scrierea
binar a unui numr de articole, poziionarea ntr-un fiier, nc&iderea unui
fiier, vidarea zonei tampon a unui fiier.
2. Co/3i4era0ii teoreti1e
'a acest nivel, fiecrui fiier i se ataeaz un pointer la o structur de
tip 3,'!"
FI(E <87
=ipul 3,'! i toate prototipurile funciilor de prelucrare se gsesc n
fiierul 3t4io.5
2.1. De315i4erea u/ui 6iFier
%esc&iderea unui fiier e.istent, precum i crearea unui fiier nou se
face cu ajutorul funciei 6o8e/, care are urmtorul prototip"
FI(E <6o8e/91o/3t 15ar <1aleJ/ume, 1o/3t 15ar <mo4;7
unde"
o cale[nume M este un pointer spre un ir de caractere care definete
calea de nume a fiierului$
2?A
o mod M este un pointer spre un ir de caractere care definete modul
de prelucrare a fiierului desc&is, dup cum urmeaz"
8r( - desc&idere n citire Dread#$
8J( - desc&idere n scriere DJrite#$
8a( - desc&idere pentru adugare Dappend#$
8r+( - desc&idere n citire*scriere Dmodificare#$
8rb( - citire binar$
8Jb( - scriere binar$
8r+b( - citire*scriere binar$
lJ+b( - citire*scriere binar$
8ab( M adugare de nregistrri n modul binar.
Coninutul unui fiier e.istent desc&is n scriere lJ( , va fi ters, el
considerndu-se desc&is n creare.
%ac fiierul este desc&is n modul la(, se vor putea aduga noi
nregistrri dup ultima nregistrare e.istent n fiier.
<n fiier ine.istent desc&is n modul lJ( sau la( va fi creat.
3uncia 6o8e/ returneaz un pointer spre tipul 3,'! n caz de succes
sau pointerul nul n caz de eroare.
3iierele standard de ,*! sunt desc&ise automat la lansarea
programului$ pentru ele, pointerii spre tipul 3,'! sunt"
3t4i/ M intrare standard$
3t4out M ieire standard$
3t4err M ieire standard erori$
3t48r/ M ieire paralel Dimprimant#$
3t4au= M comunicaie serial.
2.2. Prelu1rarea 8e 1ara1tere a u/ui 6iFier
<n fiier poate fi prelucrat, n citire sau scriere, caracter cu caracter,
folosind funciile get1 i 8ut1, ale cror prototipuri sunt"
i/t get1 9FI(E <86;7
i/t 8ut1 9i/t 15, FI(E <86;7
n care"
pf este pointerul spre tipul 3,'! returnat de funcia 6o8e/$
c& este codul -SC,, al caracterului care se scrie.
2?B
3uncia get1 returneaz codul -SC,, al caracterului scris. /n caz de
eroare ambele returneaz M2.
%e e.emplu, secvena de copiere a intrrii standard la ieirea standard
este"
`5ile 991Nget193t4i/;;[NE%F;
8ut191, 3t4out;7
2.". Citirea/31rierea u/ui Fir 4e 1ara1tere
Citirea dintr-un fiier a unui ir de caractere se face cu ajutorul
funciei 6get3, care are prototipul"
15ar <6get3915ar <3, i/t /, FI(E <86;7
n care"
s M este pointerul spre zona din memorie unde are loc pstrarea
irului de caractere$
n M este numrul de octei a zonei n care se citesc caracterele din
fiier. Citirea se oprete la ntlnirea caracterului KInH sau citirea a cel mult
n-2 caractere. <ltimul caracter n ambele cazuri va fi KI?H.
pf M este pointerul spre tipul 3,'!.
3uncia returneaz valoarea pointerului s. 'a ntlnirea sfritului de
fiier funcia returneaz valoarea zero.
Scrierea unui ir de caractere Dinclusiv caracterul lI?(# se face cu
funcia 68ut3, care are prototipul"
i/t 68ut3 91o/3t 15ar <3, 6ile <86;7
unde s este pointerul spre nceputul zonei de memorie care conine irul de
caractere care se scrie n fiier.
3uncia 68ut3 returneaz codul -SC,, al ultimului caracter scris n
fiier sau M2 n caz de eroare.
2.#. Citirea/31rierea 1u 6ormat
Citirea*scrierea cu format se poate face cu ajutorul funciilor
631a/6/68ri/t6, similare cu funciile 331a/6/38ri/t6, prezentate n lucrarea
2?C
'2., deosebirea constnd n faptul c n cadrul funciilor 331a/6/38ri/t6 se
precizeaz ca prim parametru pointerul zonei unde se pstreaz irul de
caractere, iar n cadrul funciilor 631a/6/68ri/t6 se precizeaz ca prim
parametru pointerul spre tipul 3,'!, aa cum reiese din prototipurile lor"
i/t 631a/69FI(E <86, 1o/3t 15ar <6ormat,Ha4re3a,LC;7
i/t 68ri/t69FI(E <86, 1o/3t 15ar <6ormat,Ha4re3a,LC;7
3uncia 631a/6 returneaz numrul de cmpuri citite corect$ la
ntlnirea sfritului de fiier funcia returneaz valoarea !O3.
3uncia 68ri/t6 returneaz numrul caracterelor scrise n fiier sau M2
n caz de eroare.
2.$. *i4area Zo/ei tam8o/ a u/ui 6iFier
;idarea zonei tampon a unui fiier se face cu ajutorul funciei fflus&,
avnd prototipul urmtor"
i/t 66lu359FI(E <86;7
unde pf este pointerul spre tipul file.
%ac fiierul e desc&is n scriere, coninutul zonei tampon se scrie n
fiierul respectiv.
%ac fiierul e desc&is n citire, caracterele necitite se pierd.
3uncia returneaz zero n caz de succes i M2 n caz de eroare.
2.). PoZi0io/area M/trXu/ 6iFier
)oziionarea ntr-un fiier pe un anumit octet se poate face cu ajutorul
funciei 63eea, care are prototipul"
i/t 63eea 9FI(E <86, lo/g i/1reme/t, i/t origi/e;7
-ceast funcie este similar cu l3eea, deosebirea constnd n faptul
c la 63eea se precizeaz pointerul spre tipul 3,'!, iar la l3eea se precizeaz
descriptorul de fiier.
)oziia curent a indicatorului intr-un fiier dat prin deplasamentul n
octei fa de nceputul su este returnat de ctre funcia 6tell de prototip"
2?E
lo/g 6tell9FI(E <86;7
2.!. Prelu1rarea 6iFierelor Ki/are
/n acest caz, fiierele sunt considerate ca o succesiune de nregistrri,
fiecare nregistrare coninnd un numr de articole, ca n figura urmtoare"
.......
nregistrare nregistrare
-rticolele sunt de lungime fi.. <n articol este o dat de un tip
predefinit sau definit de utilizator.
Citirea, respectiv scrierea unei nregistrri se face cu ajutorul funciilor
6rea4 i 6`rite, care au prototipurile"
u/3ig/e4 6rea49:oi4 <Ku6, u/3ig/e4 4im, u/3ig/e4 /rart, FI(E <86;7
u/3ig/e4 6`rite9:oi4 <Ku6, u/3ig/e4 4im, u/3ig/e4 /rart, FI(E <86;7
unde"
buf M este pointerul spre zona tampon care conine articolele
citite, respectiv cele care se scriu$
dim M este dimensiunea unui articol n octei$
nrart M numrul articolelor dintr-o nregistrare$
pf M este pointerul spre tipul 3,'!.
3unciile returneaz numrul articolelor citite, respectiv scrise n caz
de succes, sau M2 n caz de eroare.
2.+. i/15i4erea u/ui 6iFier
/nc&iderea unui fiier se realizeaz cu ajutorul funciei 61lo3e, care are
prototipul"
i/t 61lo3e9FI(E <86;7
unde pf este pointerul spre tipul 3,'! returnat de 6o8e/.
3uncia returneaz ? n caz de succes i M2 n caz de eroare.
22?
-1=,CO' -1=,CO' -1=,CO'
-1=,CO' -1=,CO'
!O3 -1=,CO'
2.9. tergerea u/ui 6iFier
<n fiier nc&is poate fi ters cu ajutorul funciei u/li/a, care are
prototipul"
i/t u/li/a 91o/3t 15ar <1aleJ/ume;7
unde cale[nume este un pointer spre un ir de caractere care red calea de
nume a fiierului.
3uncia returneaz ? n caz de succes i M2 in caz de eroare.
2.1-. E=em8le
E=em8lul 1
/n programul '22!.2.cpp este creat un fiier caracter cu caracter,
citite de la tastatur. -poi este ilustrat modul de adugare la sfritul
fiierului ,de data aceasta, a unor iruri de caractere. 'a sfrit fiierul este
listat linie cu linie, cu numerotarea lor.
/< Programul (11E=1.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< Programul ilu3treaZ2 8relu1rarea 6i3ierului
8e 1ara1tere 3i 3iruri 4e 1ara1tere </
:oi4 mai/9:oi4;
A
15ar 15,3H1--C,/umeJ6i3H$-CNb1QEE6i31.t=tb7
i/t i7
FI(E <867
/< 1rearea 6iFierului7 31rierea 1ara1terelor i/1lu3i:
d//di/tro4u3e 4e la ta3tatura </
86N6o8e/9/umeJ6i3,b`b;7
8ri/t69bE/I/tro4u1eti te=tul[E/b;7
`5ile 9915Nget193t4i/;;[NE%F;
A
8ut1915,86;7
B
61lo3e986;7
/<A4augarea 4e 3iruri 4e 1ara1tere</
222
86N6o8e/9/umeJ6i3,brPb;7
63eea986,-l,2;7
8ri/t69bE/INTR%DUCETI 3irurile 4e 1ara1tere 1are 3e
a4auga termi/ate 1u ENTER E/b;7
`5ile96get393,1--,3t4i/;[N915ar<;-;
A
68ut393,86;7
B
61lo3e986;7
/<A6i3area 1o/ti/utului </
8ri/t69bE/C%NTINUTU( FISIERU(UI 1u NU'ER%TAREA
(INII(%RE/b;7
iN-7
86N6o8e/9/umeJ6i3,brb;7
`5ile96get393,1--,86;[N915ar <;-;
A8ri/t69bO4 O3b,i,3;7
iPP7
B
61lo3e986;7
get159;7
u/li/a9/umeJ6i3;7
B
E=em8lul 2
)rogramul '22!.>.cpp ilustreaz modul de prelucrare binar a unui
fiier. )rogramul conine crearea fiierului i afiarea coninutului
su.
/< Programul (11E=2.188 </
>i/1lu4e ?3t4io.5@
>i/1lu4e ?1o/io.5@
/< Programul ilu3treaZa 8relu1rarea Ki/ara a u/ui 6i3ier </
tV8e4e6 3tru1t A
15ar /umeH#-C7
lo/g 3uma7
/<alte 1om8o/e/te </
B ARTIC%(7
:oi4 a6i3are915ar </umeJ6i3;
22>
A
FI(E <867
ARTIC%( Ku67
i/t i7
86N6o8e/9/umeJ6i3,brKb;7
8ri/t69bE/NR.CRT. SU'A NU'E(EXPRENU'E(EE/b;7
iN-7
`5ile96rea49IKu6,3iZeo69ARTIC%(;,1,86;@-;
A
8ri/t69bE/O)4 O1-l4 OX#-3b,i,Ku6.3uma,Ku6./ume;7
iPP7
B
61lo3e986;7
B
:oi4 mai/9:oi4;
A
FI(E <867
ARTIC%( Ku67
i/t i,/7
15ar 3H#-C,/umeJ6i3H#-CNb1QEE6i3.4atb7
/<Crearea 6i3ierului </
8ri/t69bE/I/tro4u1eti /r 8er3oa/elor /Nb;7
31a/69bO4b,I/;7
86N6o8e/9/umeJ6i3,b`Kb;7
6or9iN17i?N/7iPP;
A
66lu3593t4i/;7
8ri/t69bNumele 8er3oa/eiQ b;7
6get39Ku6./ume,#-,3t4i/;7
8ri/t69bSuma N b;7
31a/69b Ol4b,IKu6.3uma;7
6`rite9IKu6,3iZeo69ARTIC%(;,1,86;7
B
61lo3e986;7
8ri/t69bE/C%NTINUTU( FISIERU(UIE/b;7
a6i3are9/umeJ6i3;7
get159;7
B
220
". 'er3ul lu1r2rii
e 0.2. Se vor analiza i e.ecuta e.emplele '22!.2.cpp i '22!.>.cpp.
f
0.> S se creeze un fiier care s conin produsele unui magazin.
<n produs este reprezentat printr-o structur ce conine codul produsului,
denumirea, unitatea de msur, cantitatea, preul unitar.
)lecnd de la acest fiier, s se obin un fiier sortat dup cod.
0.0. -vnd creat fiierul sortat la punctul 0.>. se vor scrie funcii de
intrare i de ieire a produselor magazinului
0.6. Se va scrie un program pentru admiterea la facultate n anul ,.
)rogramul va cuprinde crearea fiierului cu candidaii nscrii. /n final
trebuie s se obin fiierele cu candidaii admii pe secii i cei respini pe
baza mediei obinute DDbacalaureat + > O test[matem# * 0.?#.
0.7. Se consider un director de fiiere. 3iecare intrare n director
conine numele DC caractere# i e.tensia D0 caractere# fiierului, numrul de
blocuri alocate pentru el, adresa primului bloc alocat, data i ora ultimei
actualizri. Dzi, luna, an, ora, minut, secunda#.
Se cere"
a# crearea directorului de fiiere$
b# afiarea directorului n ordine alfabetic a numelor
fiierelor$
c# afiarea directorului n ordine cresctoare a datei i orei
ultimei actualizri.
226
227
.I.(I%&RAFIE
1. *.Cri3tea, E.mali3Z, I.Ata/a3iu, *.Iorga. Te5/i1i 4e 8rogramare.
E4.Teora, .u1ureFti, 199$.
2. *.D24Srlat, I.Ig/at, '.To8a/, (.Petre31u. Programarea
1al1ulatoarelor. Stru1turi 4e 4ate Fi algoritmi. (itogra6ia U.T.C.N.,
199$.
". I.Ig/at, *,D24Srlat, '.To8a/, (.Petre31u.. TurKo Pa31al !.-.
Fu/4ame/te Fi a8li1a0ii. E4.AlKa3tr2, ClucXNa8o1a, 199).
#. I.Ig/at, *.D24Srlat, I.Ru3, A.ma13o. Programarea 3i3temati12 M/
TurKo Pa31al ).-. E4. C2r0ii 4e Stii/02, ClucXNa8o1a, 1992.
$. (.(i:o:315i, j.&eorge31u. A/aliZa Fi 3i/teZa algoritmilor. E4.
E/1i1lo8e4i12, .u1ureFti, 19+).
). (.Negre31u. (imKacele C Fi CPP 8e/tru M/1e82tori, *ol. 1 Fi 2. E4.
'i1roi/6ormati1a, ClucJNa8o1a, 199# 9ree4itare 2---;.
!. (.D.SerK2/a0i, *.Cri3tea, F.'ol4o:ea/u, *.Iorga. Programarea
3i3temati12 M/ limKacele Pa31al Fi Fortra/. E4.Te5/i12, .u1ureFti, 19+#.
+. N.lirt5. Algorit5m3 P Data Stru1ture3 N Program3.Pre/ti1e jall,
19!+.
22A