Sunteți pe pagina 1din 138

C

++
POO
Prejmerean Vasile

Cluj- Napoca 2004

C+

PO

1. Redactarea programelor C
1.1. Generaliti
Mediul Borland C a fost extins la Visual C i C++ Builder, adaptate programrii orientate obie t i interfe!ei grafi e "indo#s $%& 'imba(ul C a fost extins la C++ permi!)nd apli area on eptelor programrii prin abstra ti*area datelor i programrii orientate spre obie te& +iierele surs pot a,ea extensia C, CP, sau CPP&

1.2. Structura unui program


-n program C este on!ine o fun !ie prin ipal .main/ i e,entual alte fun !ii se undare, apelate de tre fun !ia prin ipal, situate la a elai ni,el .far imbri are/& 0tru tura unui program este urmtoarea1 Directive de procesare, Declaraii de date globale, Declaraii de funcii, sau doar 2 Antete de funcii .prototipuri/ 3 Funcia principal 2 Descrierea funciilor .implementri/ 3 0e obser, des rierea fun !iilor se poate fa e fie 4n 4ntregime 4naintea fun !iei main fie doar prototipul 4nainte, iar orpul dup a easta& Comentariile se s riu 4ntre ara terele 56 i 65 . &&& 56 comentariu 65 &&& /, sau la ni,elul unui r)nd dup ara terele 55 . &&& 55 comentariu /& 7nainte de ompilare, un program este precompilat, de tre un prepro esor, are permite in luderea unor fiier surs, definirea i apelul unror ma rouri, pre um i o ompilare ondi!ionat& Includerea unui fiier surs .6&8 sau 6& / se reali*ea* prin dire ti,a include astfel1 sau >xemplu1 9 include :specificator!fi"ier; 9 include <specificator!fi"ier= 9in lude <stdio&8=? 9in lude <iostream&8=? 55 pentru fiiere utili*ator 55 pentru fiiere standard 55 Standard Input Output Header 55 Console Input, Console Output

04&04&@4

C+

PO
Constantele simbolice se defines u a(utorul dire ti,ei define astfel1 9define Nume!constant #ir!caractere

>xemplu1 9define Pi A&@4@%$2 55 7nlo uiete Pi u A&@4@%$2 O onstant simboli poate fi redefinit sau anulat .9undef Nume!constant/&

1.3.

uncii

O fun !ie este format dintrBun antet i un blo . orp/& >a poate fi apelat da a fost definit 4n 4ntregime sau doar antetul su& !ntetul unei fun !ii are urmtorul format1 $ip Nume .%ist!parametri!formali/ unde1

$ip este tipul ,alorilor fun !iei . odomeniul/? Nume este un identifi ator .liter urmat e,entual de alte litere sau ifre/? %ist!parametri!formali on!ine parametrii formali separa!i prin C,D&

>xemplu1 int Min .int a, int b/ E if .a<b/ return a? else return b? F Obser,a!ie& Prototipul unei fun !ii este antetul a esteia urmat de C?D & Corpul unei fun !ii are urmtoarea stru tur1 E Declaraii &nstruciuni F >xemple1 int Cmmdc.int a, int b/ E if .bG G0/ return a? else return Cmmd .b,a H b/? F int cmmdc.int a, int b/ E int rest? do E restGaHb? aGb? bGrest? F #8ile .restIG0/? return a? F 55 Cmmd .a,b/ 55 Cmmd .b,a 'od b/? 55 mmd .a,b/

55 rest 0?

04&04&@4

C+

PO

1.". #lementele limba$ului


!lfabetul limba(ului C este format din litere mari i mi i, ifre i ara tere spe iale .JnGCr'f, JtGKab/& Identificatorii sunt forma!i din literL urmat e,entual de litereL sau ifre . ara terul CLD poate fi utili*at pe post de liter/& >xist cu%inte c&eie are pot fi utili*ate doar 4n ontextul definit .de exemplu case, float, int, long, return, s(ort, static, structure, s)itc(, union, unsigned, void /& 'ipurile predefinite sunt urmtoarele1

int .( 2B2@%,2@%B@3/, s(ort .( 2B2@%,2@%B@3/, long .( 2B2A@,2A@B@3/, unsigned .) 20,2@MB@3/, float .*+ 2BA&4@0BAN, A&4@0AN3/,

double .*+ 2B@&O@0BA0N, @&O@0A0N3/, c(ar . od P0CQQ/* Constantele numerice pot fi +ecimale .@2A, @2A,ong, @@@long/, octale .-OO/, (e,a .-.abba, -/fa /, sau flotante .2&O@N2N, M&02Ae2A, M&02A#2A/& Constantele de tip caracter pot fi afi"abile .RPR, R0R, RSR/ sau funcionale .RJbRG-ac.space, RJrRG/eturn, RJnRGNe)line, RJRRGApostrof, RJJRG-ac.slas(, RJ,RGVerticaltab, RJfRG0alt de pagin, RJ0RGNull& Constantele de tip 0ir de caractere se s riu 4ntre g8ilimele .SMesa(S/& 1eclararea %ariabilelor simple se fa e astfel1 $ip %ist!identificatori!de!variabile >xemplu1 int i, (? float x,T? 8ar ?

1eclararea unui tablou se reali*ea* astfel1 $ip Nume!$ablou 2d@3 2d 23 &&& 2di3 &&& 2dn3? >xemple1 float x2@003? int a22,23? x203G@? &&& x2$$3G@00? a203203G@? a2@3203GA? a2032@3G2? a2@32@3G4? 55 x este pointer la primul element 55 a on!ine adresa tabloului 55 indi ele .i1 0 .i<di

04&04&@4

C+

PO

2. 2ariabile
Variabilele pot fi stati e sau dinami e, lo ale sau globale&

2.1. 2ariabile globale


Ue lararea unei ,ariabile globale se fa e la 4n eputul unui fiier surs .4n afara tuturor fun !iilor/ i poate fi referit p)n la sf)ritul programului .4n ori e fun !ie/& -tili*area lor 4n alte fiiere surs se poate fa e doar da a estea sunt de larate a ,ariabile externe1 e.tern declaraie!variabil >xemplu1 2#.terne.Cpp1 9in lude <stdio&8=? 9in lude S s.&S? float 3iGA&@4? 55 ,ariabil global ,oid main .,oid/ E float r? printf.S Uati ra*a er ului 1 S/? s anf.SHfS,Vr/? printf.S 'ungimea er ului G Hf JnS,'ungC.r//? s anf .SJnS/? F s.&1 float 'ungC .float r/ E e.tern float 3i? return 263i6r? F 55 ,ariabil extern

2.2. 2ariabile locale


O ,ariabil lo al este utili*abil .,i*ibil/ doar 4n modulul sau 4n fun !ia 4n are a fost definit, put)nd fi alo at dinami .%ariabil automatic, alo at pe sti,/ sau stati .%ariabil static, alo at 4n *ona de memorie a programului/& Qmpli it o ,ariabil lo al este automati , iar da dorim a a easta s fie stati , de lara!ia ei trebuie s fie pre edat de u,)ntul 8eie static1 static declaraie!variabil +un !iile au impli it atributul extern, de i pot fi apelate din alte fiiere surs, dar da dorim a a est apel s nu fie permis, atun i se ,or de lara stati e prin s rierea u,)ntului 8eie static 4naintea antetului a esteia . static antet!funcie / 45&

04&04&@4

C+

PO

>xemplu1 2,ocale.Cpp1 9in lude <stdio&8=? 9in lude S0ursa&8S? ,oid main .,oid/ E int n? printf.S Uati un numar < 2%M 1 S/? s anf.SHdS,Vn/? printf.S Valoarea in Wexa este S/? PrintLWexa.n/? 55 PrintLBTte.n52%M/? PrintLBTte.nH2%M/? 54 s anf .SJnS/? F Sursa.&1 static int CifraLWexa .int s/ E static int ? if .s<@0/ Gs+R0R? else Gs+RPRB@0? 55 Gs+R0R+O return ? F static ,oid PrintLBTte.int b/ E static int W G b 5 @M? static int 8 G b H @M? printf.SH H S,CifraLWexa.W/,CifraLWexa.8//? F ,oid PrintLWexa.int */ E static int WW G * 5 2%M? PrintLBTte.WW/? static int 88 G * H 2%M? PrintLBTte.88/? F

2.3. 2ariabile de tip registru


>xist posibilitatea a 4ntrBun registru liber s fie alo at o ,ariabil are este utili*at fre ,ent, penntru a mri ,ite*a de exe u!ie& 7n registrii se pot memora parametri fun !iilor sau ,ariabile automati e de tip int, c(ar sau pointer& Pentru a o ,ariabil s fie memorat 4ntrBun registru, de lara!ia ei trebuie s fie pre edat de u,)ntul 8eie register1 register declaraie!variabil >xemplu1 float f . register int i /? E register int n? register 8ar ? &&& F

04&04&@4

C+

PO

2.". Iniiali6area %ariabilelor


2ariabilele simple se ini!iali*ea* printrBo de lara!ie de forma1 $ip &dentificator!de!variabil 1 2,presie >xemple1 float f . int n /? E int iG@? int mGn52? &&& F

'ablourile se ini!iali*ea* printrBo de lara!ie de forma1 $ip &dent!tablou 2n3 1 E2,presie@, 2,presie2,&&&, 2,presiemF unde mn, iar da n este omis, atun i nGm& >xemple1 int X 2@A3 G E0,A@,2N,A@,A0,A@,A0,A@,A@,A0,A@,A0,A@F? int Y 2 3 G E@,2,A,4,%,M,OF? int P2A32 3 G E E@,2,AF,E4,%F,EMF F? 55 EE@,2,AF,E4,%,ZF,EM,Z,ZFF

7irurile de caractere se ini!iali*ea* astfel1 char &dent!string 2n3 1 3#irLcaractereS iar n poate fi este omis& >xemple1 8ar Mesa( 2@003 G S[arurile ,or fi arun ate &&&S? 8ar PltLMesa( 23 G ES[arurile au fost arun ate ISF?

04&04&@4

C+

PO

3. #.presii
O e.presie este format din operan6i, operatori i parante6e pentru prioritate, i are o %aloare i un tip& !socierea operatorilor se fa e de la st)nga la dreapta, u ex ep!ia operatorilor unari i de atribuire, are se aso ia* de la dreapta la st)nga& Operan6ii pot fi1 onstante, onstante simboli e, ,ariabile simple sau stru turate .tablouri, stru turi, sau elemente ale a estora/, fun !ii sau apeluri de fun !ii&

3.1. Operatori
Operatorii, 4n ordinea des res toare a priorit!ii sunt urmtorii1

. / .unar/ + .unar/ 6 5 + << == < <G GG IG V ] ^ VV ^^ Z1 .ternar/ G 6G ,

2 3 6 .unar/ V .unar/ H =G =

++

.tip/ si+eof

5G

HG

+G

G <<G ==G VG

]G

^G

Operatorii aritmetici sunt urmtorii1 + , , 6 , 5 , H .mod/, pentru adunare, s dere, 4nmul!ire, )t .4mpr!ire/, rest& >xemple1 int i, ( ? int at G i 5 (? int rest G i H (? 55 @A 5 % G 2 55 @AH% G A

04&04&@4

C+

PO
Operatorii relaionali sunt urmtorii1

< , <G , = , =G , GG , IG , pentru < , , = , , G , , re*ultatul .,aloarea expresiei rela!ionale/ fiind 1 pentru adevrat, iar - pentru fals& >xemple1 int iG@? int (G2 ? &&& i<G( &&& &&& iGG( &&& Operatorii logici sunt1 I .Not/ , VV .And/ , ^ ^ .4r/& >xemplu1 5or G I,VV6 ^^ ,VVI6 77 , 5or 6 1 Not , And 6 4r , And Not 6 55 GG @ 55 GG 0

Ueoare e nu exist tipul boolean, ,aloarea fals este repre*entat prin -, iar adevrat prin ori e ,aloare diferit de -& Operaii pe bii se pot reali*a utili*)nd urmtorii operatori1 \ .complementul fa! de ++++, s 8imb fie are bit/, << .deplasare la st)nga/, == .deplasare la dreapta/, V .And bit u bit/, ] .5or bit u bit/, ^ .4r bit u bit/& >xemplu1 55 P0CQQ 9in lude <stdio&8=? 9in lude < onio&8=? int Cifra.int / 55 ifra 8exa1 0@&&&$PB&&&+ E if . <@0/ return ^ R0R? else return . B$/ ^ R_R? F int ? ,oid main .,oid/ E textba `ground.B'->/? text olor."WQK>/? lrs r./? do E printf.S Uati un ara ter 9>s 1 S/? Gget 8./? printf.S &&& Wexa G H H JnS,Cifra. ==4/,Cifra. V0x+//? F #8ile . IG0x@B/? F

04&04&@4

C+

PO

Operaia de atribuire se reali*ea* astfel1 Var G 2,presie? 55 e,presie de atribuire u tipul Var >xist posibilitatea reali*rii de atribuiri multiple prin expresii de forma1 Varn G *** G Var2 G Var@ G 2,presie? Mai exist o fa ilitate utili*)nd o opera!ie de atribuire de forma1 Var G 2,presie? a,)nd semnifi a!ia1 Var G Var 2,presie? >xemple1 , G e G 2&O@N@N2N? x +G dx? T G dT? n <<G `? 55 , G .e G 2&O@N@N2N/? 55 x G x+dx? T G T dT? 55 n G n62` 55 unde E+, , 6, 5,H, V, ], ^ , <<, ==F

Operatorii de incrementare 8 decrementare sunt C++D respe ti, C D prin are se mrete, respe ti, se mi orea*, ,aloarea operandului u unu& P etia pot fi utili*a!i1
4n

forma prefixat1 ++ operand ? respe ti, operand ? respe ti, operand ? 55 ,aloarea expresiei, dup apli area lor 55 ,aloarea expresiei, 4nainte de apli are forma postfixat1 operand ++?

4n

>xemple1 a G ++b? a G b ? 55 bGb+@? 55 aGb? aGb? bGb @?

Operatorul de con%ersie e.plicit 9expresie cast: reali*ea* operand 4ntrBun tip pre i*at astfel1 . $ip / operand ? >xemplu1 int aG@2? int bG%? float Ga5b? printf.S a Ui, b G H%&2f JnS, /? G.float/a5b? printf.S a 5 b G H%&2f JnS, /?

on,ersia unui

55 a Ui, b G 2&00 55 a 5 b G 2&40

04&04&@4

@0

C+

PO
Con%ersiile implicite 9reali*ate automat: se fa astfel1
a/ b/ / d/ e/

c(arint, floatdouble, .double,6/.double,double/Gdouble, .long,6/.long,long/Glong, .unsigned,6/.unsigned,unsigned/Gunsigned&

Operatorul pentru dimensiune 9sizeof: determin lungimea 4n o te!i a unei ,ariabile simple sau stru turate, pre um i a unui tip de dat1 sizeof . Data/ ? >xemplu1 int a? printf.S 0i*eOf int G Hd JnS, si*eof.a//? 55 0i+e4f int G 2 printf.S 0i*eOf s8ort G Hd JnS, si*eof.s8ort//? 55 0i+e4f s(ort G2

Operatorii condiionali 4

; sunt utili*a!i 4n

onstru !ii de forma1 ?

2,presie@ 4 2,presie2

; 2,presieA

Valoarea expresiei re*ultat este 2,presie2 da 2,presie@ este nenul, altfel este 2,presieA & >xemplu1 Max G a=b 4 a ; b? 55 Ua a=b Ptun i MaxGa Pltfel MaxGb?

Operatorul %irgul permite gruparea mai multor expresii 4ntrBuna singur, a easta a,)nd ,aloarea ultimei expresii1 2,presie@ < 2,presie2 < &&& >xemplu1 float x0,T0,r, x, T? printf.S Uati C.x0,T0,r/ G S/? s anf.SHf Hf HfS,Vx0,VT0,Vr/? 55 Cer ul C printf.S Uati P.x,T/ G S/? s anf.SHf HfS, Vx, VT /? 55 Pun tul P printf.S HsS,..xBGx0< TBGT0< x6Gx< T6GT< x+T/GGr6r/ 4 SP e pe CS ; SP nu e pe CS/?

< 2,presien ?

04&04&@4

@@

C+

PO

".

Operaii de intrare8ie0ire

7n limba(ul C nu exist instru !iuni de intrare5ieire, a este opera!ii rali*)nduBse prin fun !ii aflate 4n bibliote ile standard& Qmpli it, unui program i se ataea* fiierele stdin .intrare standard/, stdout .ieire standard /, stderr .ieire standard pentru erori/, stprn .ieire pentru imprimant/, stdoux .intrare5ieire serial/&

".1.

uncia Printf

P east fun !ie reali*ea* afiarea dup un ablon, a,)nd urmtorul format1 int printf .Control 2, %ist!2,presii3/? unde Control este ablonul .formatul/ s ris sub forma unui ir de ara tere are on!ine mesaje i specificatori de format orespun*tori ,alorile expresiilor din list& -n spe ifi ator de format se des rie astfel1
H 2a3 2m2&n3 3 2l3

2f3

unde1

2a3 2m3 2.n3 2 l3 2f3

B determin alinierea la st)nga, impli it fiind la dreapta, B pre i*ea* lungimea )mpului,
B pre i*ea* lungimea pr!ii *e imale, respe ti, numrul de ara tere,

B on,ersia se ,a efe tua din format intern long, B determin tipul on,ersiei pre i*at prin unul din urmtoarele ara tere1

d o , 5 u c s f e 2 g 8

B int *e imal extern, B int o tal extern, B int 8exa extern .0&&&$,a&&&f/, B int Wexa extern .0&&&$,P&&&+/, B unsigned *e imal extern .fr semn/, B binar intern ara ter .c(ar/, B string .ir de oduri P0CQQ terminat u J0Gb-'/ ir de ara tere, B float sau double *e imal extern 2m2&n3 3, impli it nGM, B float sau double *e imal extern forma exponen!ial .b6@0e/, B float sau double *e imal extern forma exponen!ial .b6@02/, B se alege dintre ,ariantele f sau e repre*entarea minim, B se alege dintre ,ariantele f sau 2 repre*entarea minim&

+un !ia printf returnea* numrul de o te!i afia!i da opera!ia a de urs ore t, iar 4n a* ontrar B@ .>O+/1 if .>O+ G G printf .Control , %ist!2,presii // &&& eroare &&& ?

04&04&@4

@2

C+

PO

>xemplu1 s8ort [iG@? 8ar 'una23GSQanuarieS? unsigned PnG200A? float QnaG@&N? printf.S [i1Hd, 'una1HA&As&, Pn1Hu JnS,[i,'una,Pn/? 55 [i1@, 'una1Qan&, Pn1200A printf.S Qnaltime.m/1H4&2f JnS,Qna/? 55 Qnaltime.m/1@&N0

".2.

uncia Scanf
int scanf .Control , %ist!Adrese!de!Variabile /?

P east fun !ie reali*ea* itirea datelor dup un ablon, a,)nd urmtorul format1 unde Control este ablonul .formatul/ s ris sub forma unui ir de ara tere are on!ine e,entual te,te 9obligatorii la intrare: i specificatori de format orespun*tori tipurilor ,ariabilelor din list& 0pe ifi atorii de format sunt asemntori elor pre*enta!i la fun !ia printf, reali*)nd 4ns on,ersiile in,erse1

H 263 2m3 2l3

2 f 3 , unde1

263 2m3 2 l3 2f3

B un ara ter op!ional, B pre i*ea* lungimea maxim a )mpului, B on,ersia se ,a efe tua din format intern long, B determin tipul on,ersiei pre i*at prin unul din urmtoarele ara tere1

d o , 5 u c s f

B int *e imal extern, B int o tal extern, B int 8exa extern .0&&&$,a&&&f/, B int Wexa extern .0&&&$,P&&&+/, B unsigned *e imal extern .fr semn/, B binar intern ara ter .c(ar/, B string ir de ara tere terminat la spa!iu sau dimensiunea m, B float flotant extern&
.nu este ne esar pentru tablouri/*

Pdresele ,ariabilelor de intrare sunt date prin operatorul de adrese = plasat 4naintea identifi atorului fie rei ,ariabile .simpleI/1 2V3 Variabil >xemplu1 s8ort [i? 8ar 'una2@A3? unsigned Pn? float Qna? s anf.S Hd Hs Hu Hf S, V[i, 'una, VPn, VQna/?
55 @ Qanuarie 200A @&N0

+un !ia scanf returnea* numrul de )mpuri itite ore t& 0f)ritul de fiier .Ctrl5[/ poate fi ,erifi at prin ,aloarea returnat >O+1 if .>O+ G G scanf .Control , %ist!2,presii// &&& 0f;r"it &&& ? >xemplu1 if .>O+GGs anf.S Hd Hs Hu HfS, V[i, 'una, VPn, VQna// printf.SCtrl5[S/? else E printf.S [i1Hd, 'una1HA&As&, Pn1Hu JnS,[i,'una,Pn/? printf.S Qnaltime.m/1H4&2f JnS,Qna/? F

04&04&@4

@A

C+

PO uncia PutChar

".3.

P east fun !ie reali*ea* tiprirea unui ara ter al rui od P0CQQ este pre i*at printrBo expresie1 putchar .2,presie/?

".".

uncia GetChar

P easta, returnea* odul P0CQQ al ara terului itit .pentru Ctrl5[ >O+GB@/1 getchar . /? >xemplu1 8ar ? do put 8ar ... Gget 8ar.//=R[R/Z ]R R 1 /? #8ile . IGR&R/?
55 'itere mi i 'QK>c> MPcQ 55 se termin u &

'itere mi i in 'itere MPcQ I 'QK>c> MQCQ Qb 'QK>c> MPcQ I 0e termina la & .Pun t/ 0> K>cMQbP 'P & get 8ar put 8ar get 8ar put 8ar

".>.

uncia GetCh e
int getche . /?

+un !ia returnea* odul ara terului itit direct i 4l afiea* .4n ecou/1 >xemplu1 do put 8ar ... Gget 8e.//=R[R/Z ]R R 1 /? #8ile . IGR&R/?
55 se termin u &

''iQt Ke>rce> mMiQ CiQ iQnb ''iQt Ke>rce> MMPPccQQ&&

".?.
afiat1

uncia GetCh

P east fun !ie returnea* odul ara terului itit .direct/ fr a a esta s mai fie int getch . /? >xemplu1 do put 8ar ... Gget 8.//=R[R/Z ]R R 1 /? #8ile . IGR&R/?
55 se termin u &

'QK>c> MQCQ Qb 'QK>c> MPcQ& 55 0Ba tastat1 'itere mi i in 'itere MPcQ&

04&04&@4

@4

C+

PO

>.

Instruciuni

7n limba(ul C instru !iunile se termin u @ mai pu!in ele are se termin u A&

>.1. Instruciunea Vid


P east instru !iune se utili*ea* 4n situa!ia 4n are este nes erar pre*en!a unei instru !iuni i are nu trebuie s exe ute nimi 1

@
>.2. Instruciunea Expresie
Qnstru !iunea are formatul general1 2,presie @ >xemple1 T G .x+@/6.xB@/? f.x,T/? ++? BB ?
55 Ptribuire1 vG2,presie ? 55 Ppel de fun !ie1 f9p@, p2,*** , pn:? 55 Qn rementri5Ue rementri .Pre5Post fixate/

>.3. Instruciunea Compus


P easta este format dintrBo su esiune de de lara!ii .proprii/ i instru !iuni, in luse 4ntre a olade1

B
Declaraii &nstruciuni

A
>xemplu1 E int i?
55 Variabil local instru !iunii? 55

f .i/? F ?

i se poate utili*a doar 4n a east instru !iune ompus?

55 Uup A nu se pune ?

04&04&@4

@%

C+

PO

>.". Instruciunea If
0tru tura alternati, u una sau dou ramuri poate fi s ris astfel1 if 9e,presie: instructiune@? C else instructiune2? D >xemplu1 P.,,6/ QBul Cadran .Ua , sau 6 este negati, se s 8imb semnul / float x, T? printf.S Uati P.x,T/ G S/? s anf.SHf HfS, Vx,VT/? 55 Pun tul P if .x=0/ if .T<0/ TGBT? 55 C4 else!? .instruciunea vid/ else E xGBx? 55 C2 sau CA .,/ if .T<0/ TGBT? 55 CA .6/ F printf.S xGH%&2f, TGH%&2f JnS, x,T/ ? F 55 trebuie pus pentru C@ instruciunea vid1 else!? E

>.>. Instruciunea Switch


Pentru stru tura alternati, instru !iunea 0)itc(1 switch .e,presie/
E case c@ 1 secven instructiuni @ case c2 1 secven instructiuni 2
***

u mai multe ramuri Case 90elect: se utili*ea*

C break? D C break? D

case cn 1 secven instructiu nin C break? D C default 1 secven instructiuni n+@ D


F

Qnstru !iunea break reali*ea* saltul la sf)ritul instru !iunii switch, iar 4n absen!a ei se ,or exe uta i urmtoarele se ,en!e de instru !iuni& >xemplu1 #8ile .s anf.SHd H HdS,Vo@,Vo,Vo2/IG>O+/ s#it 8 .o V 0X++/ E ase R+R 1 ,Go@+o2? brea`? ase RBR 1 ,Go@Bo2? brea`? ase R6R 1 ,Go@6o2? brea`? ase R5R 1 ,Go@5o2? brea`? default 1 printf .S Op& ne unos utIH JnS,o/? F printf .SHdH Hd G HdJnS,o@,o,o2,,/? E
55 O@ o O2

55 Ctrl5[

04&04&@4

@M

C+

PO

>xemplu1 55 br&[ile 5 lun JJ


9in lude <iostream&8= 9in lude < onio&8= void main (void) { int l,a; cout << " Dati anul : "; cin >> a; cout << " Numar de zile ... " << endl; for (l=1; l<=12; l ) { cout << l << " : "; !"itc# (l) { ca!e 2 : cout << (a$% & 2' : 2(); )rea*; ca!e + : ca!e , : ca!e ( : ca!e 11 : cout << %- ; )rea*; default : cout << %1 ; / cout << endl; / /

.. )rea*; 0etc#e();

>.?. Instruciunea

hile
while 9e,presie: instructiu ne?

0tru tura repetiti, pretestat poate fi s ris astfel1 >xemplu1 55 Program 2,emplu hile 9in lude <stdio&8=? int i,n? long f? 55 f1GnI ,oid main .,oid/ E printf.SJn Uati n 1 S/? s anf .SHdS, Vn/? iG.fG@/+@? #8ile .i<Gn/ f6Gi++? printf.S HdI G Hu JnS,n,f/? iG.fG@/? #8ile .i< n/ f6G++i? printf.S HdI G Hu JnS,n,f/? s anf.SJnS/? F

>.E. Instruciunea !o" hile


0tru tura repetiti, posttestat poate fi s ris astfel1 do instructiu ne while 9e,presie:? >xemplu1 do E rGaHb? aGb? bGr? F #8ile . /? mmd Ga? 55 IG0

04&04&@4

@O

C+

PO

>.F. Instruciunea #or


0tru tura repetiti, Pentru .5/ poate fi des ris astfel1 for .e,presie@? e,presie2? e,presieA/ instructiu ne ? Qnstru !iunea are a elai efe t a i1 e,presie@? while .e,presie2/ E instructiu ne? e,presieA ?F di in,ers .,e*i while/1 for .?e,presie?/ instructiune ? >xemplu1 int i,n? long f? 55 f1GnI printf.SJn Uati n 1 S/? s anf .SHdS, Vn/? fG@? for . iG@ ? i<Gn? i++/ f6Gi? printf.S HdI G Hu JnS,n,f/? fG@? for . iG@ ? i<Gn? ++i/ f6Gi? printf.S HdI G Hu JnS,n,f/? fGiG@? for . ? i<Gn? i+G@/ f6Gi? printf.S HdI G Hu JnS,n,f/? for .fGiG@? i<Gn? / f6Gi++? printf.S HdI G Hu JnS,n,f/?

>.G. Instruciunea $reak


P east instru !iune se folosete pentru a termina o stru tur repetiti,1 break? >xemplu1 for . ? ? / if .e,pr/ break? E &&&
&&& F

>.1-. Instruciunea Continue


P east instru !iune reali*ea* saltul la sf)ritul unei stru turi repetiti,e .pentru )(ile sau doL)(ile la ree,aluarea expresiei, iar pentru for la e,presieA/, a,)nd formatul1 continue? >xemplu1 for .&&& ?&&& ? e,prA/ if .e,pr/ continue? E &&&
&&& F

>.11. Instruciunea Go%o


P east instru !iune reali*ea* saltul ne ondi!ionat i fr re,enire la instru !iunea e poart eti 8eta spe ifi at, a,)nd formatul1 goto etic(et ? >xemplu1

04&04&@4

@N

C+

PO
#8ile .e,pr@/ if .e,pr2/ goto et?
&&&

E &&&
&&& F 55 instru
!iune

et1 &&&

>.12. !pelul unei funcii


Qnstru !iunea de apel a unei fun !ii este un a* parti ular al instru !iunii expresie1 Nume!funcie 9%ist!parametri!actuali:? O fun !ie poate fi apelat i 4n adrul unei expresii dintrBo instru !iune1
***

Nume!funcie 9%ist!parametri! actuali: *** ?

O fun !ie poate fi utili*at doar da a fost definit sau el pu!in a fost de larat prototipul ei 4ntrBuna din urmtoarele moduri1 $ip! funcie b/ $ip! f uncie / $ip! f uncie d/ $ip! f uncie
a/

Nume! funcie .%ista!parametrilor!formali/? Nume! funcie .%ista!tipurilor!parametrilor!formali/? Nume! funcie .Void/? 55 nu sunt parametri formali Nume! funcie . /? 55 nu se fa ,erifi rile de tip

!pelul impli it pentru ,ariabile simple .de ba*/ este prin &aloare, iar pentru tablouri prin referin'& !pelul prin referin' se ob!ine prin intermediul ,ariabilelor de tip pointer i a operatorului de adres () *e&enirea dintrBo fun !ie se poate reali*a fie prin instru !iunea return, fie automat dup ultima instru !iune a fun !iei .situa!ie 4n are nu se returnea* ni i o ,aloare/1 return C e,presie D ? fiind returnat ,aloarea expresiei .da exist/& >x& @1
9in lude <grap8i s&8= 9in lude <mat8&8= int u@,,@, u2,,2? float a, b, , d ? int u .float x/ E return ..xBa/5.bBa/6.u2Bu@/+u@/? F int , .float T/ E return ..TBd/5. Bd/6.,2B,@/+,@/? F ,oid Qniteraf.,oid/ E int ed G U>K>CK, em? initgrap8.Ved, Vem, S 1JJB JJBgiS/? F ,oid Vie#Port.int x@,int T@,int x2,int T2/ Eu@Gx@? ,@GT@? u2Gx2? ,2GT2? 56re tangle.u@,,@,u2,,2/?65 F ,oid "indo#.float x@,float T@,float x2,float T2/ E aGx@? dGT@? bGx2? GT2? F ,oid ce tangle.float x@,float T@,float x2,float T2/ E re tangle.u.x@/,,.T@/,u.x2/,,.T2//? F ,oid Bar.float x@,float T@,float x2,float T2/ E bar.u.x@/,,.T@/,u.x2/,,.T2//? F ,oid 'inie.float x@,float T@,float x2,float T2/ E line.u.x@/,,.T@/,u.x2/,,.T2//? F ,oid Muta.float x,float T/ E mo,eto.u.x/,,.T//? F ,oid Krag.float x,float T/ E lineto.u.x/,,.T//? F ,oid cot.float Vx,float VT, float x0, float T0, float Plfa/ E float xp? xpG.xBx0/6 os.Plfa/B.TBT0/6sin.Plfa/+x0? T G.xBx0/6sin.Plfa/+.TBT0/6 os.Plfa/+T0? x G xp? F

>x& 21 55 -ltima ifr nenul a lui nI JJ


9in lude <iostream&8=? 9in lude < onio&8=? int 1f (int$ f, int *) { int 2=-;

04&04&@4

@$

C+

+
"#ile (3(f4*)) { f.=*; 2 ; / return 2; / main () { clr!cr(); int n; int f2=-; int 5c=1; cout << " n : "; cin >> n; for (int i=2; i<=n; i ) { int f=i; f2 =1f(f,2); f26=1f(f,7); 5c=5c8f41-; / cout << " 5c= " << 5c8((f2$=%,int(f2&f281.+:%))<<1)41-; 0etc#(); /

PO

>x& A1 55 Cal & P B, P B JJ


9in lude <iostream&8=? 9in lude < onio&8=? int 9ard(int :;<) { return :;-<; / int :2art (int =, int :;<) { for (int i=1; i<=9ard(:); i ) if (===:;i<) return 1; return -; / void n (int :;<, int >;<, int 9;<) { 9;-<=-; for (int i=1; i<=9ard(:); i ) if (:2art(:;i<,>)) 9; 9;-<<=:;i<; / void u (int :;<, int >;<, int 9;<) { int i; for (i=-; i<=9ard(>); i ) 9;i<=>;i<; for (i=1; i<=9ard(:); i ) if (3:2art(:;i<,>)) 9; 9;-<<=:;i<; / void ?i2 (c#ar 8@ult, int :;<) { int i; cout << @ult << A{A ; for (i=1; i<=9ard(:); i ) cout << :;i< << ","; cout << "B)/" << endl; / void main (void) { clr!cr(); int :;<={7, 1,%,7,C,(/; ?i2 (" : : ",:); int >;<={7, 1,2,%,+,7/; ?i2 (" > : ",>); int :u>;1-<; u (:,>,:u>); ?i2 (" :u> = ",:u>); int :n>;1-<; n (:,>,:n>); ?i2 (" :n> = ",:n>); 0etc#e(); /

04&04&@4

20

C+

PO

?. 3ointeri
O ,ariabil p de tip pointer on!ine adresa unei ,ariabile a rei ,aloare se ob!ine utili*)nd operatorul 6 .6p G ,aloarea ,ariabilei de la adresa on!inut 4n p/& Pdresa unei ,ariabile v se poate ob!ine prin operatorul V .Vv G adresa ,ariabilei v/, de i putem atribui unui pointer p adresa unei ,ariabile v astfel1 p G Vv?

?.1. 1eclararea unui Pointer


Uefinirea unei ,ariabile de referin! .legat de un $ip/ se fa e astfel1 $ip 6VarL/eferin ? Ue i, tipul referin! se ob!ine prin urmtoarea onstru !ie1 $ip 6 Ue lararea unui pointer . are on!ine o adres nefiind 4ns legat de un anumit tip/ se fa e astfel1 &oid 6VarLPointer ? >xemplu1
9in lude <stdio&8=? 9in lude < onio&8=?
9in lude SCrt&CppS?

int Cifra.int / E if . <@0/ return ^ R0R? else return . B$/^R_R? F ,oid Cifre.int b/ E printf.SH H S,Cifra.b==4/,Cifra.bV0x+//? F ,oid main .,oid/ E int 6PointerLQnt? ,oid 6p? unsigned 6PointerL"ord? int x? printf.S Uati x 1 S/? s anf.SHdS,Vx/? pGPointerLQntGVx? PointerL"ordG.unsigned 6/ p? printf.S x GHu JnS,6PointerL"ord/? printf.S ^x^GHd JnS,si*eof 6PointerL"ord/? printf.S ^Vx^GHd JnS,si*eof PointerL"ord/? printf.S6.Vx/GS/? Cifre.6PointerL"ord==N/? Cifre.6PointerL"ordV0x++/? printf.SJnS/? F
get 8./?

Date1 /e+ultate 1

Uati x 1 4A$M2 x G4A$M2 ^x^ G2 ^Vx^G2 6.Vx/GPBBP

Date1 Uati x 1 B@ /e+ultate 1 x G M%%A%

^x^ G2 ^Vx^G2 6.Vx/G++++

?.2. Operaii cu Pointeri


P este opera!ii sunt opera!ii u adresele on!inute 4n ,ariabilele de tip pointer&

04&04&@4

2@

C+

PO
?.2.1. Incrementare 8 1ecrementare

P este opera!ii mres 5mio orea* ,aloarea de adres spre urmtorul element . u o ,aloare egal u lungimea tipului referit/1 VarLPointer + + ? >xemplu1
int [ile23GEA@,2N,A@,A0,A@,A0,A@,A@,A0,A@,A0,A@ F? int 6PointerLQnt? int 'una? 55 0,@,&&&,@@ printf.S Uati luna .@B@2/1S/? s anf.SHdS,V'una/? PointerLQntGV[ile2'una3? PointerLQntBB? 55 V[ile2'unaB@3 printf.S br&[ile GHd JnS,6PointerLQnt/?

VarLPointer a a ?

?.2.2.

!dunare 8 Scdere a unui numr Hntreg

P este opera!ii mres 5mio orea* ,aloarea de adres spre alt element . u o ,aloare egal u n f lungimea tipului referit/& VarLPointer + n >xemplu1
int [ile23GE0,A@,2N,A@,A0,A@,A0,A@,A@,A0,A@,A0,A@ F? int 6PointerLQnt? int 'una? printf.S 'una .@B@2/ 1 S/? s anf.SHdS,V'una/? PointerLQntG(ileI,una? printf.S br&[ileGHd JnS,6PointerLQnt/? PointerLQntG[ile? printf.S br&[ileGHd JnS,6.3ointerJIntI,una//?

?.2.3.

Comparare

Uoi pointeri ale elementului a eluiai tablou pot fi ompara!i utili*)nd operatorii rela!ionali& Valoarea )K,, mar 8ea* faptul un pointer nu refer ni i un element&
&&& p@

< p2 &&& ?

&&& p@

G G p2 &&& ?

&&& p@

IG p2 &&& ?

&&& p

G G )K,, &&&?

>xemplu1
int [ile23GE0,A@,2$,A@,A0,A@,A0,A@,A@,A0,A@,A0,A@ F? int 6luna? int [i,'una,Pn, br[ile? printf.S [i, 'una, Pn 1 S/? s anf.SHd Hd HdS,V[i,V'una,VPn/? if .PnVA/ [ile223G2N? if ..[i=[ile2'una3/ ^^ .'una=@2// lunaGb-''? else lunaG[ile? if .luna5L)K,,/ E br[ileG[i? do br[ile+G6.luna++/? #8ile .lunaM(ileI,una/? printf.S P Hd *i a anului JnS,br[ile/? F else printf.S Uata alendaristi a in ore taI JnS/?

?.2.".

1iferen

Uiferen!a a doi pointeri ai a eluiai tablou d a re*ultat diferen!a indi ilor& >xemplu1
int [ile23GE0,A@,2$,A@,A0,A@,A0,A@,A@,A0,A@,A0,A@ F? int 6luna? int [i,'una,Pn, [iua? printf.S Pn, P )ta *i din an1S/? s anf.SHd HdS,VPn,V[iua/? if .PnVA/ [ile223G2N? for .lunaG[ile+@? [iua=6luna? luna++/ [iuaNG6luna? printf.S [i1Hd, 'una1Hd, Pn1Hd JnS,[iua,lunaN(ile,Pn/?

04&04&@4

22

C+

PO

>xemplu1 55 Opera!ii u pointeri JJ


9in lude <iostream&8= 9in lude < onio&8=

void ?i2 (int 8=, int n) { int 82==; "#ile ( 26= < n ) cout << 8(2 ); cout << endl; / void main (void) { int =;<={11,22,%%,++,77,,,,CC/; int 82,8D; 2==; D=$=;C<; "#ile (D62) cout << 8(2 ); cout << endl; int $f==;C<; 2=$=;-<; D=$f; "#ile (D>2) cout << 8(2 ); cout << endl; 2==; "#ile (26=<C) cout << 8(2 ); cout << endl; 2==; int n = (!izeof =) . (!izeof (int)); "#ile ( 26= < n ) cout << 8(2 ); cout << endl; 2==; for (int i=1; i<=n; i ) cout << 8(2 i61); cout << endl; ?i2 (=,n); /

clr!cr();

0etc#e();

?.3. !locare dinamic a memoriei


Pentru alocarea 5 dealocarea %ariabilelor dinamice sunt utili*ate urmtoarele dou fun !ii definite 4n fiierele alloc&( i stdlib&(1 malloc, are returnea* adresa *onei alo ate de lungime dat n sau b-'' da nu se poate efe tua alo area1 void <malloc .unsigned n/?

free, are eliberea* o *on alo at, pre i*at prin adresa .pointerul/ ei 1 void <free .void <adres/?

>xemplu1
9in lude <stdio&8=? 9in lude <malloc&8=?
9in lude < onio&8=? int Cifra.int / ,oid Cifre.int b/ 9in lude SCrt&CppS? E if . <@0/ return ^ R0R? else return . B$/^R_R? F E printf.SH H S,Cifra.b==4/,Cifra.bV0x+//? F

,oid main .,oid/ E unsigned 6PointerL"ord? PointerL"ordG.unsigned 6/ malloc.si*eof .unsigned//? printf.S Uati x 1 S/? s anf.SHdS,PointerL"ord/? printf.S x GHu JnS,6PointerL"ord/?

printf.S ^x^GHd JnS,si*eof 6PointerL"ord/? printf.S ^Vx^GHd JnS,si*eof PointerL"ord/? printf.S6.Vx/GS/? Cifre.6PointerL"ord==N/? Cifre.6PointerL"ordV0x++/? printf.SJnS/?

free.PointerL"ord/?

get 8./?

?.". Pointeri la funcii

04&04&@4

2A

C+

PO

bumele unei fun !ii fiind un pointer la a ea fun !ie, ea poate fi parametru a tual, i e,ident trebuie des ris a parametru formal1
&&&

tip .<f / . /, *** 55 Pointeri la func ii .@/ JJ

>xemplu1
9in lude <grap8i s&8= 9in lude < onio&8= float Sin .float x/ float SOr .float x/ 9in lude <stdlib&8= 9in lude <mat8&8= E return sin .x/? F E return po# .x,2/?F 9in lude <stdio&8= 9in lude S8raf&(S float Cos .float x/ float SOrt.float x/

9define Pi A&@4@%$2M E return os .x/? F E return sgrt.x/? F

,oid erafi .float9+f:9float:,float a,float b,int u@,int ,@,int u2,int ,2/ E float x, p, ,d, T? Vie)Port .u@,,@,u2,,2/? re tangle .u@,,@,u2,,2/? pG.bBa/5.u2Bu@/6%? xGa? GdG9+f:9.:? do E x+Gp? TG9+f:9.:? if .T< / GT? else if .T=d/ dGT? F #8ile .x<b/? =indo).a,d,b, /? xGa? 'ove$o.x,9+f:9.:/? do E x+Gp? %ine$o.x,9+f:9.:/? F #8ile .x<b/?
F E

,oid main.,oid/

get 8./? losegrap8./? F

erafi erafi erafi erafi

.Sin, BPi,Pi,@0,@0, .int/ getmaxx./52B%, .int/ getmaxT./52B%/? .Cos, BPi,Pi,.int/ getmaxx./52+%,@0,getmaxx./B@0, .int/ getmaxT./52B%/? .SOr, BPi,Pi,@0,.int/ getmaxT./52+%, .int/ getmaxx./52B%, getmaxT./B@0/? .SOrt, 0,Pi,.int/ getmaxx./52+%,.int/ getmaxT./52+%,getmaxx./B@0, getmaxT./B@0/?

&nit8rap( ./?

-rmtorul exemplu onstruiete un tabel u ,alorile a patru fun !ii dintrBun inter,al dat 2a,b3 pentru o di,i*iune pre i*at .n/1 55 Pointeri la func ii .2/ JJ
Einclude Einclude Einclude Einclude <io!tream.#> <!tdio.#> <conio.#> <mat#.#>

dou)le F(dou)le =) { return =; / typedef double (*Pointer_la_Functie)(double); Pointer_la_Functie Functia[] = { X, sin, c#ar8 Gunctii = {" = 1in int NrHGunctii=%; void main(void) { dou)le a,=,); int n; cout << " Dati a,), n : "; cin >> a >> ) >> n; cout << Gunctii << endl << endl; for (int i=-; i<=n; i ) { ==a ()6a).n8i; for (int I=-; I<=NrHGunctii; I ) 2rintf ("4C.2f",(*Functia[ ])(!)); cout << endl; / /

cos, 9o!

tan }; ?0 "/;

clr!cr(); clr!cr();

0etc#();

04&04&@4

24

C+

PO

?.>. +tilizarea parametrilor din linia de comand


Ppelul unui program poate fi 4nso!it de o list de parametri1 = Nume!Program %ist!Parametri are se poate a esa s riind antetul fun !iei prin ipale astfel1 main . int ,rgC, c(ar 6,rgV 2 3 / unde1 ,rgC este o ,ariabil 4ntreag are on!ine numrul de parametri plus unu .I/, ,rgV este un tablou are on!ine adresele parametrilor din list1 ,rgV203 B pointer la Nume!Program .I/, ,rgV2@3 B pointer la primul parametru, &&& ,rgV2,rgCP@3 B pointer la ultimul parametru >xemplu1
9in lude <stdio&8=? 9in lude <stdlib &(=? 55 Calendar 200A

,oid main .int PrgC, 8ar 6PrgV23/ E 8ar 60apt23GES'uniS,SMartiS,SMier uriS,ShoiS,SVineriS,S0ambataS,SUumini aSF? int [ile23GEA@,2N,A@,A0,A@,A0,A@,A@,A0,A@,A0,A@F?int [i,'una,luna? if .PrgCGGA/ E [iGatoi.PrgV2@3/? 'unaGatoi.PrgV223/? for .lunaG@? luna<'una? luna++/ [i+G[ile2lunaB@3? printf.S Hs JnS,0apt2.[i+@/HO3/?
F

else printf .S Uati in linia de omada *iua si luna .din 200A/ I JnS/?
F 55

QCalendar 1> 3

?.?. 1eclararea c o n s t antelor


O alt modalitate de a defini o onstant este modificatorul Const astfel1

2 $ip 3 const Nume 2 1

Valoare 3 ?

sau

const 2 $ip 3 Nume 2 1 Valoare 3 ?

-nui parametru formal de larat u modificatorul Const nu i se mai poate s 8imba ,aloarea 4n subprogramul respe ti,& >xemplu1
9in lude <stdio&8=? 9in lude < onio&8=?

int Cifra.const int / E const 8ar >eroGR0R? if . <@0/ return ^ >ero?


F

int const C?@AG0x40? else return . B$/^C?@A?

,oid main .,oid/ E const -lueGB'->? const =(iteG"WQK>? const C@FG0x+? const 2scG0x@B? int ? textba `ground.-lue/? text olor.=(ite/? lrs r./? do E printf.S Uati un ara ter 9>s 1 S/? Gget 8./? printf.S &&& Wexa G H H JnS,Cifra. ==4/,Cifra. V C@F//? F #8ile . IG2sc/?
F

- ) . ) S t i &a

04&04&@4

2%

C+

PO

Prin sti& 4n!elegem o list u dis iplina /ast In #irst 0ut pentru are ,om defini urmtoarele trei fun !ii1 Push B adaug un element 4n sti,, Pop B extrage un element din sti,, Clear B ini!iali*area sti,ei .sti, ,id/, Vida B ,erifi da sti,a este ,id1 11 #act)Cpp RR
9in lude <stdio&8= 9in lude < onio&8= 9in lude SSti&a&hS ,oid main.,oid/
E

11 Sti&a)h RR
9define UimMax @A stati int 0tiva2UimMax3? ,oid Push.int x/
E

stati bextG0?

int n? unsigned long f? printf.S Uati n 1 S/? s anf.SHdS,Vn/? Clear./? #8ile .n/ Push.nBB/? fG@? #8ile .IVida.// f6GPop./? printf.S nI G H@%lu JnS,f/? get 8./?
F

if .bext<UimMax/ 0tiva2bext++3Gx? else printf.S Uepasire sti,a JnS/?


F

int Pop./ E if .bext=0/ return 0tiva2BBbext3? else E printf.S 0ti,a ,ida JnS/? return 0? F
F

,oid Clear./ int Vida./

E bextG0? F E

return .bextG G0/? F

E. Recursi%iate
>xist posibilitatea de a defini o fun !ie prin ea 4nsi .re ursi,/& >xemplu1
9in lude < onio&8= 9in lude <iostream&8= 9define 'a, .x,T/ .x=T Z x 1 T/ int a2@003? int 2axim.int n/
E F E

if .nG G@/ return a2@3? else return 'a, .2axim.nB@/,a2n3/? int i,n? lrs r./?

,oid main.,oid/ out << S Uati n 1 S? in == n? out << S Uati P 1 S? for .iG@? i<Gn? i++/ in == a2i3? out << S Max&G S << 2axim.n/? get 8./?

04&04&@4

2M

C+

PO

F. 'ipuri de date
>xist posibilitatea de a defini noi tipuri de date i 8iar de a le denumi&

F.1. 1efinirea unui tip de dat 9t3pedef :


Psignarea unei denumiri unui tip de dat se reali*ea* astfel1 t3pedef >xemplu1 t3pedef int Integer ? Integer i,(? t3pedef float *eal ? *eal X2@03? tip Denumire!$ip ?

F.2. 'ipul enumerare 9enum :


Uefinirea a estui tip se fa e astfel1 enum CDenumireD B &d0 CG2,pr0D, &d@CG2,pr@D,&&&, &dnCG2,prnD A C%ist!VarD? Qmpli it 2,pr0G0, iar 2,pri12,priB@B@, iar da se de lar o list de ,ariabile a,)nd a est tip atun i denumirea tipului enumerare definit poate lipsi& >xemplu1
9in lude <stdio&8=? 55 200A JJ 9in lude < onio&8=? enum E False, $rue F [iL'u ratoare? enum >ile0apt E %uni, 'arti, 'iercuri, Coi, Vineri, 0ambata, Duminica F? enum >ile0apt [iL0apt? 55 sau >ile0apt [iL0apt? ,oid main .,oid/
E

int [ile23GEA@,2N,A@,A0,A@,A0,A@,A@,A0,A@,A0,A@F? int [i,'una,luna? printf.S [i, 'una 1 S/? s anf.SHd HdS,V[i,V'una/? for .lunaG@? luna<'una? luna++/ [i+G[ile2lunaB@3? [iL0aptG%uni? [iG.[i+@/HO? #8ile .[iBB/ [iL0apt++? if .[iL0apt<0ambata/ [iL'u ratoareG$rue? else [iL'u ratoareGFalse? if .[iL'u ratoare/ printf.S >ste o *i lu ratoare JnS/? else printf.S >ste o *i libera JnS/? get 8./?
F

55 sau [i!0aptG[iL0apt+@?

04&04&@4

2O

C+

PO F.3. 1efinirea unei structuri 9struct :


Uefinirea unei structuri .Dnregistrri/ se fa e astfel1 struct CDenumireD B %ist!Declaraii!C;mpuri A C%ist!VarD?

Ua se de lar o list de ,ariabile a,)nd a est tip atun i denumirea stru turii poate lipsi& ceferirea omponentelor unei structuri se fa e astfel1 Denumire. Component? >xemplu1
9in lude <stdio&8=? 9in lude < onio&8=? tTpedef float ceal? struct Punct E ceal x, T? F? struct Cerc E Pun t Centru? ceal ca*a? F? ceal 0gr.ceal x/ E return x6x? F ,oid main .,oid/
E

Punct O G E 0, 0 F? Cerc C? printf.S Jn Cer 1 S/? s anf.SHf Hf HfS,VC&Centru&x,VC&Centru&T,VC&ca*a/? printf.S Jn C.x0,T0,r/G H%&2f H%&2f H%&2fS,C&Centru&x,C&Centru&T,C&ca*a/? if .0gr.C&Centru&xBO&x/+0gr.C&Centru&TBO&T/<G0gr.C&ca*a// printf.S Jn C ontine OS/? else printf.S Jn C nu ont&OS/? get 8./?
F

ceferirea omponentelor unei structuri definit printrBo ,ariabil de tip referin! .pointer/ se efe tuea*1 9 +Var!/ef :. Component? >xemplu1
&&&

sau

Var!/ef QComponent?

struct Cerc E float x, T? float ca*a? F? ,oid KipCer . Cerc +C/ E printf.S Jn C.x,T,r/G H%&2f H%&2f H%&2fS, 9 + C:..< 9 + C:.S< C Q Ra6a: ? F ,oid main .,oid/ E Cerc CGE@,2,AF? KipCer .VC/? F

04&04&@4

2N

C+

PO F.". *edefinirea unei date 9 union :


/edefinirea unei *one de memorie se poate fa e 4n adrul unei uniuni astfel1 union CDenumireD B %ist!Declaraii A C%ist!VarD?

Koate omponentele aflate 4n %ist!Declaraii o um a eeai *on de memorie .se suprapun/, lungimea uniunii fiind dat de maximul lungimilor de lara!iilor & ceferirea omponentelor unei uniuni se fa e astfel1 Denumire. Component? sau pentru o ,ariabil de tip referin!1 9 +Var!/ef :. Component? >xemplu1
&&&

sau

Var!/ef QComponent?

union E E float ceal? long unsigned Wexa? F x?


int Cifra.int / ,oid Cifre.int b/ ,oid Print.unsigned x/ E if . <@0/ return ^R0R? else return . B$/^R_R? F E printf.SH H S,Cifra.b==4/,Cifra.bV0x+//? F E Cifre.x==N/? Cifre.xV0x++/? F

,oid main .,oid/


E

do E printf.S Uati un numar 1 S/? s anf.SHfS,V..Real/? printf.S &&& Wexa G S/? Print ...He.a==@M/? Print...He.aV0x++++/? printf.S &&& JnS/? F #8ile ...He.aIG0/? get 8./?

F.>. C4mpuri de biti


>xist posibilitatea definirii unei structuri ale rei )mpuri s fie formate dintrBo se ,en! de bi!i onse uti,i .ai unui u,)nt/& P este )mpuri au tipul unsigned a,)nd fie are o lungime pre i*at .4n numr de bi!i/1 struct CDenumireD B C;mp0? C;mp@? &&& ? C;mpn? A C%ist!VarD? unde c;mpurile C;mpi sunt de forma1 unsigned C Nume!C;mpi D 1 %ungimei >xemplu1
9in lude <stdio&8=?

stru t CampJ$iti E unsigned BLL0LLA ; "? unsigned BLL4LLO ; "? unsigned BLLNL@@ ; "? unsigned BL@2L@% ; "? F? union E int Qntreg? Camp"$iti Cifre!Ae,a? F x ?
,oid Cifra.int / E if . <@0/ printf .SH S, ^R0R/? else printf .SH S,. B$/^R_R/? F

,oid main .,oid/ E do E printf.S Uati un numar 1 S/? s anf.SHdS,Vx&Qntreg/? printf.SWexaGS/? Cifra.x.CifreJHe.a.BLL0LLA/? Cifra.x.CifreJHe.a.BLL4LLO/? Cifra.x.CifreJHe.a.BLLNL@@/? Cifra.x.CifreJHe.a.BL@2L@%/? printf.S JnS/? F #8ile .x&QntregIG0/?
F

04&04&@4

2$

C+

PO

G. Structuri de date dinamice


Pentru a implementa stru tura liniar .lista simplu 4nln!uit/ i stru tura de tip arbore binar ,om apela la stru turi definite re ursi,&

G.1. ,ist simplu Hnlnuit ordonat


Considerm o list ne,id fiind format din primul element i sublista aflat la adresa de legtur memorat 4n fie are element pe l)ng informa!ia propriu*s& 7n exemplul urmtor ,om rea o list are ,a on!ine monoamele unui polinom 4n ordinea des res toare a gradelor& -n element din list ,a on!ine pe l)ng informa!ia propriu*is . oefi ientul i gradul monomului/ i adresa urmtorului monom .adresa sublistei/& Ue exemplu, pentru polinomul P.,/G@20,@2+OO,O+@A0,A+22,2 lista ,a on!ine patru elemente a,)nd informa!iile .20,@2/? .OO,O/? .@A0,A/? .22,2/, indiferent de ordinea introdu erii monoamelor& Ueoare e oefi ien!ii sunt nenuli, introdu erea datelor se termin la primul oefi ient nul&
Einclude <!tdio.#> Einclude <alloc.#> Einclude <io!tream.#> Edefine Nil (N5JJ) !truct Monom { int 9oef, Krad ; /; !truct Llem { Monom Mnf; Llem8 Je0; /; tN2edef Llem8 Polinom; 55 'ist de monoame ordonate de res tor dup grad int 9itit(@onom $@) { cin >> @.9oef; if (@.9oef) cin >> @.Krad; return @.9oef; / void :do(Oolinom $O, @onom @) { int lun0=!izeof(Llem); Oolinom Nou; if ((O==Nil)P(O6>Mnf.Krad<@.Krad)) {Nou=(Oolinom) malloc(lun0); Nou6>Mnf=@; Nou6>Je0=O; O=Nou;/ el!e :do(O6>Je0,@); / void 9re(Oolinom $O) { @onom @; O=Nil; "#ile (9itit(@)) :do(O,@); / void ?i2(Oolinom O) { if (O3=Nil) { cout << O6>Mnf.9oef << "FQ" << O6>Mnf.Krad; if (O6>Je03=Nil) cout << " " ; ?i2 (O6>Je0); / / void main (void) { Oolinom O; cout << " O (9oef,Krad) : "; 9re (O); cout << " Oolinomul O(F)="; ?i2 (O); 0etc#ar(); / Date F /e+ultate F O (9oef,Krad) : 12- 12 22 2 CC C 1%- % Oolinomul O(F)=12-FQ12 CCFQC 1%-FQ% 22FQ2 -

04&04&@4

A0

C+

PO

>xemplu1
.. Ji!t !im2l ordonat cre!ctor BB Einclude <io!tream.#> Einclude "9rt.922" tN2edef int Mnfo; !truct Llem; tN2edef Llem8 "ista; struct #le$ {%nfo %nf; "ista &r$;}; int 9itit(Mnfo$ inf) { cin >> inf; return inf; / void :do(Ji!ta$ J, Mnfo inf) { if (J $$ (J6>Mnf<inf)) :do(J6>5rm,inf); .. el!e {Ji!ta Nou=ne" Llem; Nou6>Mnf=inf; Nou6>5rm=J; J=Nou;/ 55sau el!e {Llem el={inf,J/; Ji!ta Nou = ne" Llem (el); J=Nou;/ / void 9re(Ji!ta$ J) { Mnfo Ll; J=N5JJ; "#ile (9itit(Ll)) :do(J,Ll); / void ?i2(Ji!ta J) { if (J) {cout << J6>Mnf << A,A; ?i2(J6>5rm); / cout << "B)."; / void main (void) { 9lr1cr(); Ji!ta J; cout << " Ji!ta : "; 9re (J); cout << " Ji!ta = "; ?i2 (J); Readln(); /

G.2. !bori binari


Considerm un arbore binar ne&id este format din rdcin, subarbore st4ng i subarbore drept& >xemplu1
.. :r)ore ordonat, traver!at Sn inordine BB Einclude <io!tream.#> Einclude "9rt.922" tN2edef int Mnfo; !truct 'od; tN2edef 'od8 Arb; !truct 'od {Mnfo %nf; :r) LegSt,LegDr;/; int 9itit(Mnfo$ inf) { cin >> inf; return inf; / void :do(:r)$ :, Mnfo inf) { if (:) if (inf<:6>Mnf) :do(:6>Je01t,inf); el!e :do(:6>Je0Dr,inf); el!e { :=ne" Nod; :6>Mnf=inf; :6>Je01t=N5JJ; :6>Je0Dr=N5JJ;/ / void :do(:r)$ :, Mnfo inf) { if (:) if (inf<:6>Mnf) :do(:6>Je01t,inf); el!e :do(:6>Je0Dr,inf); .. el!e { :=ne" Nod; :6>Mnf=inf; :6>Je01t=N5JJ; :6>Je0Dr=N5JJ;/ 55sau el!e { Nod n={inf,-,-/; :=ne" Nod (n); / / void 9re(:r)$ :) { Mnfo Ll; :=N5JJ; "#ile (9itit(Ll)) :do(:,Ll); / void Mno(:r) :) { if (:) { Mno(:6>Je01t); cout << :6>Mnf << A,A; Mno(:6>Je0Dr); / / void main (void) { Arb :; 9lr1cr(); cout << " :r) : "; 9re (:); cout << " :r) = "; Mno (:); Readln(); /

04&04&@4

A@

C+

PO

7n exemplul urmtor se iteste un arbore genealogi as endent .d)nd pentru fie are persoan nume prin!ilor/, apoi se ,a repre*enta grafi arborele onstruit 4ntrBo fereastr e ran pre i*at .u@,,@,u2,,2/& Uistan!a dintre dou ni,ele se al ulea* !in)nd ont de ad)n imea arborelui&
Einclude Einclude Einclude Einclude Einclude Einclude <!tdio.#> <alloc.#> <!trin0.#> <io!tream.#> <0ra2#ic!.#> <conio.#>

tN2edef c#ar ?Mnf ;1%< ; !truct Nod { Nod8 Ls; / ; tN2edef Nod8 Arb;

?Mnf Inf ; Nod8 Ld;

.. Radacin BB .. 1u).1t, 1u).Dr

int 9itit(?Mnf $Mnf) { cin >> Mnf; return (Mnf;-<3=A.A); / void Ken(:r) $:) { ?Mnf Mnf; int Jun0=!izeof(Nod); if (9itit(Mnf)) { :=(:r)) malloc(Jun0); !trc2N (:6>Mnf,Mnf); .. :6>Mnf=Mnf; cout << " @ama lui " << Mnf << " : "; Ken(:6>J!); cout << " ?atal lui " << Mnf << " : "; Ken(:6>Jd); / el!e :=N5JJ; / void Re2rHKrafic(:r) :, int u1, int v1, int u2, int v2, int 2) { int m; if (:3=N5JJ) { m=(u1 u2).2; if (v1>2-) lineto(m,v161%); elli2!e(m,v1,-,%,-,%1,1%); outte=t=N(m,v1,:6>Mnf); moveto(m62,v1 1%); Re2rHKrafic(:6>J!,u1,v1 2,m,v2,2); .. 1t moveto(m 2,v1 1%); Re2rHKrafic(:6>Jd,m,v1 2,u2,v2,2); / .. Dr / int @a= (int a, int )) { return (a>) & a : )); / int :di(:r) :) { if (:==N5JJ) return 61; el!e return @a=(:di(:6>J!),:di(:6>Jd)) 1; / void main (void) { Arb :; cout << " :r)ore 0enealo0ic a!cendent 2entru : "; Ken (:); int Kd = DL?L9?, Km; init0ra2#($Kd, $Km, "c:BB>cBB>0i"); !ette=tIu!tifN(9LN?LRH?LF?,9LN?LRH?LF?); Re2rHKrafic(:,7-,2-,0etma==()67-,0etma=N()62-,(0etma=N()6+-).:di(:)); 0etc#ar(); clo!e0ra2#(); /

04&04&@4

A2

C+

PO

1-. Ktili6area fi0ierelor


Prelu rarea fiierelor se poate efe tua la dou ni,ele1

Nivelul inferior B fa e apel dire t la sistemul de operare? Nivelul superior B utili*ea* pro eduri spe iale pentru opera!ii de intrare5ieire&

1-.1. )i%elul inferior


Prelu rrile la a est ni,el permit urmtoarele in i opera!ii1

1-.1.1.
unde1

1esc&iderea unui fi0ier 90pen8Creat:


int open . const c(ar 6 a l e , int a es / ?

a l e B este spe ifi atorul de fiier, a es B poate fi o ombina!ie .utili*)nd operatorul C^D/ a urmtoarelor ,alori1 OLcUOb'Y .fiier des 8is numai pentru itire/, OL"cOb'Y sau OLCc>PK .numai pentru s riere B reare/, OLcU"c . itire5s riere/, OLPPP>bU .des 8is pentru adugare la sf)rit/, OLBQbPcY .pentru prelu rare binar/, OLK>XK .pentru fiier de tip text/&

Ua des 8iderea fiierului sBa reali*at ore t, atun i fun !ia returnea* o ,aloare 4ntreag repre*ent)nd descriptorul de fi"ier .'-b, are ,a fi utili*at 4n ontinuare la elelelte opera!ii efe tuate asupra a estui fiier/, iar 4n a* de nereuit se ,a returna ,aloarea B@& Pentru a putea utili*a fun !ia 4pen trebuie in luse fiierele 8eader io&( i fcntl&(& >xemplu1
&&& int 'un? 'un G open .:+isier&Uat;,OcUOb'Y/? &&&

Pentru rearea unui fiier se ,a apela fun !ia Creat1 int creat . const c(ar 6 a l e , int mod / ? unde1

mod B poate lua una dintre ,alorile1 0LQc>PU .fiierul se poate iti/, 0LQ"cQK> .s riere 4n fiier/, 0LQ>X>C .exe u!ia programului din fiierul spe ifi at/& Pentru a putea utili*a fun !ia Creat trebuie in luse fiierele io&( i stat&(& +iierele text sunt impli ite&

04&04&@4

AA

C+

PO
1-.1.2. Citirea dintrPun fi0ier 9*ead:
int read . int ' u n , void 6buffer, unsigned lung / ?

unde1

' u n B este des riptorul definit la des 8idere .0G 0KUQb, @G0KUO-K, 2G0KU>cc,

AG0KUPcb, 4G0KUP-X/, buffer B este *ona de memorie 4n are se itete, l u n g B este lungimea .4n o te!i/ a 4nregistrrii itite&

+un !ia returnea* numrul de o te!i iti!i . el mult l u n g /, 0 la sfrit, sau B@ 4n a* de eroare& Putomat, dup o itire .a arti olului urent/ se tre e la urmtorul arti ol, impli it prima po*i!ionare fiind la 4n eput de fiier .a es se ,en!ial/& Pentru a utili*a fun !iile /ead, =rite, %0ee. sau Close trebuie in lus fiierul io&(&

1-.1.3.

Scrierea HntrPun fi0ier 9 rite:


int write . int ' u n , void 6buffer, unsigned lung / ?

+un !ia returnea* numrul de o te!i s rii 4n fiier, repre*ent)nd lungimea arti olului G l u n g , sau B@ 4n a* de eroare&

1-.1.".

3o6iionarea HntrPun fi0ier 9/Seek:


long lseek . int ' u n , long 6deplasament, int origine / ?

P east fun !ie permite a esul aleator printrBun apel de forma1 unde1

deplasament B repre*int numrul de o te!i peste are se deplasea* apul de itire5s riere, origine B repre*int pun tul din are se msoar deplasamentB ul .0G4n eputul fiierului, @Gpo*i!ia urent, 2Gsf)ritul fiierului/& +un !ia returnea* po*i!ia urent fa! de 4n eputul fiierului, sau B@ la eroare&

1-.1.>.

Tnc&iderea unui fi0ier 9Close:


int close . int ' u n / ?

+un !ia returnea* 0 la o 4n 8idere ore t, sau B@ la eroare&

1-.1.?.

Stergerea unui fi0ier 9+n/ink:


int unlink .const c(ar 6 a l e / ?

+un !ia returnea* 0 la o tergere ore t, sau B@ la eroare&

04&04&@4

A4

C+

PO

>xemple1
.. Einclude <io.(> Einclude <fcntl.(> Einclude <!tdio.#> Einclude <conio.#> Einclude <io!tream.#> void main (void) { int Jun; clr!cr(); Jun=open("Gi!.?=t",TH9RL:?PTH?LF?); if (Jun3=)*) { cout << "T2en ..." << endl; +rite(Jun,"Orimul...Bn",1-); +rite(Jun,":l DoileaBn",1-); / el!e cout << " T2en Mncorect 3 "; close(Jun); 0etc#ar(); / 9reare BB

.. Einclude <io,(> Einclude <fcntl,(> Einclude <!tdio.#> Einclude <conio.#> Einclude <io!tream.#>

9itire

BB

void main (void) { int Jun; c#ar Rand;1-<; te=tmode(1); te=t)ac*0round(>J5L); te=tcolor(UVM?L); clr!cr(); Jun=open("Gi!.?=t",TH?LF?); if (Jun3=)*) { read(Jun,Rand,1-); cout << Rand; read(Jun,Rand,1-); cout << Rand; / el!e cout << " T2en Mncorect 3 "; close(Jun); 0etc#ar(); /

04&04&@4

A%

C+

PO 1-.2. )i%elul superior


'a a est ni,el sunt posibile urmtoarele opera!ii1

1-.2.1.
unde1

1esc&iderea unui fi0ier 9#0pen:


F&%2 6 fopen . const c(ar 6 a l e , const c(ar 6 mod / ?

mod B poate fi :r; pentru des 8idere 4n itire, :U; pentru s riere, :a; pentru adugare, :rI; pentru modifi are . itire5s riere/, :rb; pentru itire binar, :Ub; pentru s riere binar, sau :rIb; pentru itire5s riere binar&

Ua la des 8iderea fiierului sBa ales modul :U; sau :a;, fiierul ,a fi reat .re reat/& +un !ia returnea* un pointer spre tipul F&%2 definit 4n fiierul stdio&(, iar 4n a* de nereuit se ,a returna ,aloarea b-'' .stdin, stdout, stderr, stdau, i stdprn sunt pointeri spre tipul F&%2 permi!)nd transferuri fr a fi ne esar des 8iderea sau 4n 8iderea lor/& >xemplu1
&&&

+Q'> 6 Pf? Pf G fopen .:+isier&Uat;,;#;/?


&&&

1-.2.2.
unde1

3relucrarea pe caractere a unui fi0ier 9PutC5 GetC:


int putc . int , +Q'> 6 Pf / ?

B este odul ara terului s ris, Pf B este ,aloarea returnat la des 8idere sau stdin, stdout, stderr, stdau,, stdprn& +un !ia returnea* ,aloarea lui sau B@ la eroare& int getc .+Q'> 6 Pf / ?

+un !ia returnea* odul ara terului itit, sau ,aloarea >O+ la sf)ritul fiierului, sau B@ la eroare& >xemplu1
9in lude <stdio&(=
,oid main .,oid/
E F

int ? #8ile .. Ggetc.stdin//IG>O+/ putc. ,stdout/?

04&04&@4

AM

C+

PO
1-.2.3. Tnc&iderea unui fi0ier 9#Close:
int fclose . +Q'> 6 Pf / ?

+un !ia returnea* 0 la 4n 8iderea ore t a fiierului sau @ la eroare&

1-.2.".

Citirea8Scrierea cu format 9#Scan#5 #Print#:


int fscanf . +Q'> 6 Pf , ontrol, listL,ariabile/ ?

Parametrii ontrol i listL,ariabile au a eeai semnifi a!ie a i pentru fun !ia scanf& +un !ia returnea* numrul de )mpuri itite sau >O+& int fprintf . +Q'> 6 Pf , ontrol, listLexpresii/ ?

+un !ia returnea* numrul de ara tere s rise 4n fiier sau B@ la eroare& >x&@1 55 Creare fiier text u bume, Prenume JJ
Einclude <!tdio.#> Einclude <conio.#> int 9itit(c#ar 8=, c#ar8N) { 2rintf (" Nume 2renume : "); return (!canf(" 4!4!",=,N)3=LTG); / void main (void) { c#ar 'u$e;27<, Prenu$e;17<; clr!cr(); F%"# 8Of=fopen("Gi!H?e=t.Dat","+"); "#ile (9itit(Nume,Orenume)) fprintf(Of,"4! 4!Bn",'u$e,Prenu$e); fclose (Of); 0etc#e(); /

>x&21 55 Creare fiier text u format .arti ole 1 .Uen, Cant, Pre!// JJ
Einclude <!tdio.#> Einclude <conio.#> void main (void) { F%"# 8Produse; c#ar Den;2-<; int 9ant; float Oret;

int n=-;

int #of; te=tmode(1); te=t)ac*0round(>J5L); te=tcolor(UVM?L); clr!cr();

if (Produse=fopen("Gi!HGorm.?=t","+")) { do { 2rintf (" :rticolul 4d Bn", n); 2rintf (" 6 Den. : "); #of=(scanf("4!",Den)==#-F); if(3#of){ 2rintf (" 6 9ant.: "); !canf ("4d",$9ant); 2rintf (" 6 Oret : "); !canf ("4f",$Oret); fprintf(Produse,"462-!4+d4C.2fBn",Den,9ant,Oret);/ / "#ile (3#of); fclose (Produse); / el!e 2rintf (" T2en incorect"); /

0etc#ar();

55 'istare fiier text JJ 04&04&@4 AO

C+

PO

Einclude <!tdio.#> Einclude <conio.#> void main (void) { F%"# 8Produse; c#ar Den;2-<; int 9ant; float Oret;

int n=-; te=tmode(1); te=t)ac*0round(>J5L); te=tcolor(UVM?L); clr!cr();

if (Produse=fopen("Gi!HGorm.?=t","r")) { "#ile (fscanf(Orodu!e,"4!4d4f",Den,$9ant,$Oret)3=#-F) { 2rintf (" :rticolul 4d : Bn", n); 2rintf (" 6 Den. : 462-! Bn",Den); 2rintf (" 6 9ant.: 4+d Bn",9ant); 2rintf (" 6 Oret : 4C.2f Bn",Oret); / fclose (Produse); / el!e 2rintf (" Gi!ier :)!ent"); /

0etc#ar();

1-.2.>.
unde1

Intrri8Ie0iri de 0iruri de caractere 9#GetS5 #PutS:


c(ar 6 fgets . c(ar 6s, int n, +Q'> 6 Pf / ?

s B *ona re eptoare .tablou de tip 8ar de dimensiune n, terminat u b-'GDJ0D/, nB@ B numr maxim de ara tere .nB@/, +un !ia returnea* adresa irului s, sau la >O+ returnea* b-''& int fputs . c(ar 6s, +Q'> 6 Pf / ?

+un !ia returnea* odul ultimului ara ter s ris sau B@ la eroare& -rmtorul program 4nlo uiete u,intele din fiierul F!Niv!0*Cpp aflate 4n partea st)ng a di !ionarului Dicio*$,t u ele orespun*toare din partea dreapt, re*ultatul fiind depus 4n fiierul F!Niv!0*Pas, aa um se poate ,edea 4n s 8ema de mai (os&

#in"6i&"S)Cpp

!ictio)%xt

%raduce

#in"6i&"S)Pas

04&04&@4

AN

C+

PO
55 %raduce +iier text B 0tring JJ
Einclude <conio.#> Einclude <2roce!!.#>

Einclude <!tdio.#> Einclude <io!tream.#> Einclude <!trin0.#>

int Jen0t#(c#ar8 !) { return !trlen(!); /

int Oo!(c#ar8 !, c#ar8 1) { c#ar8 2 = !tr!tr(1,!); return 2 & 261 : 61; /

.8 int Oo!(c#ar8 !, c#ar8 1) { for (int i=-; i<Jen0t#(1); i ) { int T*=1; for (int I=-; I<Jen0t#(!); I ) if (1;i I<3=!;I<) { T*=-; )rea*; / if (T*) return i; / return 61; / 8.

void Delete(c#ar8 !, int 2, int n) { for (int i=2; i<Jen0t#(!); i ) !;i<=!;i n<; /

.8 void Delete(c#ar8 !, int 2, int n) { "#ile (n) { n66; for (int i=2; i<Jen0t#(!); i ) !;i<=!;i 1<; / / 8.

void Mn!ert(c#ar8 !, c#ar 81, int 2) {

.8 void Mn!ert(c#ar8 !, c#ar 81, int 2) { for (int l=-; l<Jen0t#(!); l ) { for (int i=Jen0t#(1); i>=2 l; i66) 1;i 1<=1;i<; 1;2 l<=!;l<; / / 8.

/ void 1u)!t (c#ar8 =, c#ar8 N, c#ar8 1) { int 2=Oo!(=,1); if (2>=-) { Delete(1,2,Jen0t#(=)); Mn!ert(N,1,2); / / void main (void) { clr!cr(); con!t Dd=2-; tN2edef c#ar 9uv;Dd<; !truct Oer { 9uv 1t, Dr; /; Oer Dictio;2-<; int Nr9uv=1; F%"# 8.ic; .ic=fopen(".ictio./!t","r"); if (Dic==N5JJ) { cout << "Dictio &"; 0etc#e(); e=it(1); / +(ile (#-F3=fscanf(.ic,"4!4!",.ictio;'r0u1<.2t,.ictio;'r0u1<..r)) cout << Nr9uv << " : " << Dictio;Nr9uv <.1t << " 6> " << Dictio;'r0u1 <.Dr << endl; fclose(.ic); Nr9uv66; 0etc#e(); F%"# 8Fis%, 8Gi!L; Fis%=fopen("F_'i1_2,0pp","r"); Fis#=fopen("F_'i1_2,Pas","+"); if (Gi!M==N5JJ) { cout << "Gi!ier &"; 0etc#e(); e=it(1); / con!t Dm=1--; c#ar Rand;Dm<; +(ile (f3ets(4and,.$,Fis%)) { .. 3=N5JJ for (int i=1; i<=Nr9uv; i ) "#ile (Oo!(Dictio;i<.1t,Rand)>=-) Subst(Dictio;i<.1t,Dictio;i<.Dr,Rand); fputs(4and,Fis#); cout << Rand; / fclose(Fis%); fclose(Fis#); 0etc#e(); /

for (int i=n; i>=2; i66) 1;i m<=1;i<; c#ar8 2!=1 2; "#ile (8!) 82! =8(! );

int m=Jen0t#(!); int n=Jen0t#(1); if (2>n) 2=n; el!e if (2<-) 2=-;

1-.2.?.

3o6iionarea HntrPun fi0ier 9#Seek5 #%ell:


int fseek .+Q'> 6 Pf, long deplasamnet, int origine / ?

04&04&@4

A$

C+

PO
+un !ia fsee. returnea* 0 la po*i!ionare ore t sau o ,aloare 0 la eroare& long ftell . +Q'> 6 Pf /? +un !ia ftell returnea* po*i!ia urent .fa! de 4n eputul fiierului, 4n o te!i/&

unde deplasamnet i origine au a eeai semnifi a!ie a i la fun !ia lsee.&

1-.2.E.

3relucrarea fi0ierelor binare 9#*ead5 # rite:

P est tip de prelu rare permite transferul mai multor arti ole aflate 4ntrBo *on tampon astfel1 unsigned fread .void 6P*t, unsigned dim, unsigned nrart, +Q'> 6 Pf/ ? unde1 P*t B este adresa *onei tampon, dim B repre*int lungimea unui arti ol, nrart B repre*int numrul de arti ole are se transfer . ites /, unsigned fwrite .const void 6P*t, unsigned dim, unsigned nrart, +Q'> 6 Pf/ ? Pmbele fun !ii returnea* numrul de arti ole transferate sau B@ la eroare& >xemple1
Einclude <!tdio.#> tN2edef !truct { c#ar Den;1-<; int 9ant; float Oret; :rticol; int n,i;

/ void main (void) { GMJL 8Of; :rticol :rt;

if ((Of=fo2en("Gi!H?i2.Dat","")")) == N5JJ) 2rintf (" T2en incorect"); for (i=1; i<=n; i )


2rintf 2rintf 2rintf 2rintf (" (" (" (" !canf ("4d",$n);

2rintf ("Bn Numarul de articole : "); :rticolul 4d 6 Den. : "); 6 9ant.: "); 6 Oret : ");

f+rite ($:rt,!izeof(:rticol),1,Of);
fclo!e (Of); /
...

: Bn",i); !canf ("4!", :rt.Den ); !canf ("4d",$:rt.9ant); !canf ("4f",$:rt.Oret);

0etc#ar();

{...

if ((Of=fo2en("Gi!H?i2.Dat","r)")) == N5JJ) 2rintf (" T2en incorect");


...

for (i=1; i<=n; i )

fread

2rintf(":rticolul 4d : Bn",i); 2rintf("6 9ant.: 4dBn", :rt.9ant);

($:rt,!izeof(:rticol),1,Of);

2rintf("6 Den. : 4!Bn", :rt.Den ); 2rintf("6 Oret : 4fBn", :rt.Oret); / fclo!e (Of);

04&04&@4

40

C+

PO

11.

uncii standard

11.1. Vacrouri de clasificare


Ma rourile din a east ategorie .aflate 4n fiierul ct3pe&h/ ,erifi da un ara ter este de un anumit tip1
int int int int int int int int int int

isascii isalpha isalnum isupper islower isdigit isxdigit isgraph isprint isspace

.int a r /? .int .int .int .int .int .int .int .int .int a r /? a r /? a r /? a r /? a r /? a r /? a r /? a r /? a r /?

ar ar ar ar ar ar ar ar ar ar

20,@2O3 Z este odul unui ara ter alfanumeri Z este odul unei litere Z este odul unei litere mari Z este odul unei litere mi i Z este odul unei ifre *e imale Z este odul unei ifre 8exa Z este odul unui ara ter afiabil Z este odul unui ara ter imprimabil Z este spa!iu, tab, Cr, 'f, Vt sau bp Z

11.2. Vacrouri de transformare a simbolurilor


Ma rourile din a east las .aflate 4n fiierul ct3pe&h/ transform un ara ter astfel1 toascii int toupper int tolower
int .int a r /? .int a r /? .int a r /?

20,@2O3 .returnea* ultimii O bi!i/ a r liter mare .transform din l 4n '/ a r liter mi .transform din ' 4n l/
ar

11.3. Con%ersii
+un !iile are urmea* .aflate 4n fiierul stdlib&h/ reali*ea* on,ersii far format&
Format intern Format 9+ecimal : e,tern int atoi .const c(ar 6pt r /? binar 9int : +ecimal e,tern long atol .const c(ar 6pt r /? binar 9long: +ecimal e,tern double atof .const c(ar 6pt r /? virgul flotant 9dubl preci+ie: +ecimal e,tern Format e,tern Format intern c(ar 6itoa .int ,, c(ar 6s, int b/? s , b .,aloarea , de tip int, s ris 4n ba*a b/ c(ar 6ltoa .long ,, c(ar 6s, int b/? s , b .,aloarea , de tip long s ris 4n ba*a b/

04&04&@4

4@

C+

PO 11.".
11.".1.

uncii de prelucrare a 0irurilor de caractere


Copiere 9StrCnDCp3:

+un !iile din a east ategorie se afl 4n fiierul string&h&

c(ar 6 strCnDcp3 .c(ar 6destina!ie, const c(ar 6sursa C, unsigned n D/ ? unde sursa este opiat 4n destina!ie, e,entual doar primii n o te!i . el mult n/&

11.".2.

Concatenare 9StrCnDCat:

c(ar 6 strCnDcat .c(ar 6destina!ie, const c(ar 6sursa C, unsigned n D/ ? unde sursa este opiat la sf)ritul destina!iei, e,entual doar primii n o te!i ai sursei&

11.".3.

Comparare 9StrCnDCiDCmp:

int strCnDCiDcmp .c(ar 6ir @ , const c(ar 6ir 2 C, unsigned n D/ ? unde ir @ este omparat u ir2 .e,entual doar primii n o te!i, i e,entual ignor)nd diferen!a dintre literele mari i ele mi i/, iar re*ultatul omparrii este un numr negati, da ir@<ir2, este un numr po*iti, da ir@=ir2 sau *ero da ir@Gir2&

11.".".

,ungimea unui 0ir 9Str/en:


unsigned strlen .c(ar 6ir/ ?

returnea* lungimea irului .de ara tere, fr ara terul b-' are 4l termin/&

11.>.
Prototip

uncii de calcul
Semnifica'ie sin9,: cos9,: arcsin9,: arccos9,: arctg9,: s(9,: c(9,: t(9,: , e,
double log .double , /? double log1- .double , /? double ceil .double , /? double floor .double , /? double fabs .double , /? int abs .int , /? 7 long labs .long , /? 7 double atan2 .double 6, double , /? double pow .double ,, double 6 /? double cabs .struct comple, + /? double pol3 .double ,, int n, double a 2 3/?

P este fun !ii se afl 4n fiierul math&h .abs i labs i 4n stdlib&h 7/1
double sin .double , /? double cos .double , /? double asin .double , /? double acos .double , /? double atan .double , /? double sinh .double , /? double cosh .double , /? double tanh .double , /? double s8rt .double , /? double exp .double , /?

ln9,: lg9,: 2,3 trunc.,/ ^,^ ^,^ ^,^ arctg967,: ,6 ^+^ P9,:

11.?.

uncii pentru controlul proceselor


Semnifica 'ie
termin un program la eroare termin un program return;nd un cod de retur

-rmtoarele fun !ii se afl 4n fiierele stdlib&h i process&h &


void void

Prototip abort .void/? exit .int cod!retur/?

04&04&@4

42

C+
int

PO

s3stem .const c(ar <comand/?

e,ecut o comand "i returnea+ cod!retur .014./&

11.E.

uncii pentru timp

P este fun !ii se refer la dat i or, i sunt definite 4n fiierul dos&h 4mpreun u urmtoarele dou tipuri1
struct date {
int da_year; int da_day; int da_mon;

struct time

unsigned unsigned unsigned unsigned

char char char char

ti_min; ti_hour; ti_hund; ti_sec;

Semnifica 'ie Cite"te Data curent F 'odific Data curent F Cite"te 4ra 2,act F 'odific 4ra 2,act F

void void void void

Prototip getdate .struct date <Data/? setdate .const struct date <Data/? gettime .struct time <4ra2,act/? settime .const struct time <4ra2,act/?

>xemplu1
Einclude <!tdio.#>; .. ?im2 : Data, Tra BB Einclude <do!.#>; void main (void) { !truct date Data9; 0etdate($Data9); !truct time TraL=; 0ettime($TraL=); 2rintf(" Data : 42d 42d 4+d Bn", Data9.daHdaN,Data9.daHmon,Data9.daHNear); 2rintf(" Tra : 42d:42d:42d Bn", TraL=.tiH#our,TraL=.tiHmin,TraL=.tiH!ec); /

11.F.

uncii di%erse
Semnifica'ie
Clear 0creen =ait 9ms:

P este fun !ii sunt definite 4n fiierul conio&h1 Prototip void clrscr .double , /? void dela3 .unsigned ms /?
A& 4& %&

@& 2&

void void void

sleep .unsigned sec /? sound .unsigned A+ /? nosound .void /?

=ait 9sec: 0ound 9Fr: No0ound

04&04&@4

4A

C+

PO

12. #cranul Hn mod te.t


>xist posibilitatea de a defini urmtoarele moduri de lu ru1 void textmode . int mod / ? unde mod poate fi C"- .G@ pentru 40 oloane/, CF- .GA pentru N0 .GM4 pentru 4A5%0 linii/, i altele& oloane/, C"3>-

Uefinirea unei ferestre ecran .impli it este tot e ranul/ se reali*ea* astfel1 void )indow . int u @ , int , @ , int u 2 , int , 2 / ? dtergerea unei ferestre ecran1 void clrscr .void/ ? Po*i!ionarea cursorului1 void gotox3 . int x, int T/ ? Po*i!ia cursorului1 int wherex . void / ? int where3 . void/ ? 55 col 55 lin 55 col, lin

-n ara ter poate fi afiat pe e ran lipitor .W,I)XG@/, pe o uloare de fond .0BO/ i 4ntrBo anumit uloare de scriere .0B@%/, ulorile posibile fiind urmtoarele1

Colori 9nchise
1 2 3 " > ? E L L L L L L L L W,!CX W,K# GR##) CY!) R#1 V!G#)'! WROZ) ,IGH'GR!Y F G 111 12 13 1" 1>

Colori deschise
L L L L L L L L 1!RXGR!Y ,IGH'W,K# ,IGH'GR##) ,IGH'CY!) ,IGH'R#1 ,IGH'V!G#)'! Y#,,OZ ZHI'#

Culoarea de fond se poate stabili prin fun !ia1 void textbackground . int ul f / ? 55 ul f E0,&&&,OF

Culoarea de scriere se poate s 8imba printrBun apel de forma1 void textcolor . int ul s / ? 55 ul s E0,&&&,@%F

13. #cranul Hn mod grafic


$recerea 4n modul grafi 1 void far initgraph . int far 6 grap8dri,er, int far 6 grap8mode, c(ar far 6 pat8/ ?

04&04&@4

44

C+

PO
&e"irea din modul grafi 1 void closegraph .void/ ? 0etarea 8 Citirea ulorii de fond1 void far setbkcolor .int ul f / ? 0etarea 8 Citirea ulorii de scriere1 void far setcolor .int ul s / ?

8 8

int far getbkcolor .void / ?

int far getcolor .void / ?

Plte fun !ii1 Semnifica 'ie Numr de pi,eli 9 4ri+*7Vert*: Coordonatele %P/ 9Eltimul Punct /eferit : 'ut %P/ 9Abs*7/el*: $rasea+ segment din %P/ $rasea+ segment Desenea+ dreptung(i Desenea+ cerc 0crie mesaj C din %P/ D Pagin activ 7 Pagin vi+ual >xemple1
9in lude <graphics)h= 9in lude Sgraf)hS

#unc'ii getma,, ./? getma,6 ./? get, ./? get6 ./? moveto .,,6/? moverel .d,,d6/? lineto .,,6/? linerel .d,,d6/? line .,@,6@, ,2,62/? rectangle .,@,6@, ,2,62/? circle .,,6,r/? outte,tC,6D .C,,6,D mesaj/? setactivepage .pag/? setvisualpage .pag/?

55 Graficul unei suprafe'e JJ

9 i n l u d e < s t d l i b & 8 = 9 i n l u d e < s t d i o & 8 = 9 i n l u d e < on i o& 8 = 9 i n l u d e < ma t 8 & 8 =

float 0gr .float x/ E return x6x? F float 6 .float x, float T/ E return sin.0gr.x/+0gr.T//? F ,oid main.,oid/ E float x? float T? float px? float pT? int i? int (? int nG40? int mG40? InitGraf ./? ViewPort .@0,@0,getmaxx./B@0,getmaxT./B@0/? float lGA? float x@GBl? float x2Gl? float T@GBl? float T2Gl? !efPr.@&52,@/? aGPrX.x@,*.x@,T@//? bGa? GPrY.T@,*.x@,T@//? dG ? for .iG0? i<Gm? i++/ for .(G0? (<Gn? (++/ E xGx@+.x2Bx@/6i5m? TGT@+.T2BT@/6(5n? pxGPrX.x,*.x,T//? pTGPrY.T,*.x,T//? if .px<a/ aGpx? else if .px=b/ bGpx? if .pT< / GpT? else if .pT=d/ dGpT? F?

55 *Gf.x,T/

55 Uom .x,T/ 55 UefPr .r,a/

04&04&@4

4%

C+

PO
indow.a,d,b, /? setb` olor.B'->/? for .iG0? i<Gm? i++/ E xGx@+.x2Bx@/6i5m? TGT@? 2uta.PrX.x,*.x,T//,PrY.T,*.x,T///? for .(G@? (<Gn? (++/ E TGT@+.T2BT@/6(5n? %rag.PrX.x,*.x,T//,PrY.T,*.x,T///? F F set olor.Y>''O"/? for .(G0? (<Gn? (++/ E TGT@+.T2BT@/6(5n? xGx@? 2uta.PrX.x,*.x,T//,PrY.T,*.x,T///? for .iG@? i<Gm? i++/ E xGx@+.x2Bx@/6i5n? %rag.PrX.x,*.x,T//,PrY.T,*.x,T///? F F get 8./? losegrap8./? F

9in lude <graphics)h= 55 Graficul unei curbe JJ 9in lude < onio&8= 9in lude <mat8&8= 9in lude Sgraf)hS float x .float t/ E return os.t/? F float T .float t/ E return sin.t/? F float * .float t/ E return t 5 @0? F ,oid main.,oid/ E float t, px,pT? float t@GB%0? float t2G%0? float pG0&@? float ca*aG0&%? float PlfaG@? Qniteraf ./? setgrap8mode.@/? Vie#Port .20,20,getmaxx./B20,getmaxT./B20/? UefPr.ca*a,Plfa/? 55 Pr&^^.ca*a,Plfa/ tGt@? aGPrX.x.t/,*.t//? bGa? GPrY.T.t/,*.t//? dG ? for .tGt@+p? t<Gt2? t+Gp62/ E pxGPrX.x.t/,*.t//? pTGPrY.T.t/,*.t//? if .px<a/ aGpx? else if .px=b/ bGpx? if .pT< / GpT? else if .pT=d/ dGpT? F? "indo#.a,d,b, /? int PagG0? setb` olor.B'->/? enum E cosu, Verde F 0em G Verde? do E lear,ie#port./? outtextxT.@0,@0,Si OPS/? outtextxT.@0,20,SPS/? tGt@? Muta.PrX.x.t/,*.t//,PrY.T.t/,*.t///? for .tGt@+p? t<Gt2? t+Gp/ EKrag.PrX.x.t/,*.t//,PrY.T.t/,*.t///?F set,isualpage.Pag/? PagG@BPag? seta ti,epage.Pag/? 8ar caspGget 8./? s#it 8 .caspV0x%+/ E ase RPR 1 ca*aBG0&0@? brea`? ase RiR 1 ca*a+G0&0@? brea`? ase RPR 1 PlfaBG0&0@? brea`? ase ROR 1 Plfa+G0&0@? brea`? default 1 losegrap8./? 0emGcosu? F UefPr.ca*a,Plfa/? F #8ile .0emGGVerde/? F 11 Graf.h RR 9in lude <grap8i s&8= 9in lude <mat8&8= int u@,,@, u2,,2?

55 Vie#Port

04&04&@4

4M

C+

PO
float a, b, , d ? float ca*a, Plfa? int u .float x/ E return ..xBa/5.bBa/6.u2Bu@/+u@/? F int & .float T/ E return ..TBd/5. Bd/6.,2B,@/+,@/? F ,oid InitGraf.,oid/ E int ed G U>K>CK, em? initgrap8.Ved, Vem, S 1JJB JJBgiS/? F ,oid ViewPort.int x@,int T@,int x2,int T2/ E u@Gx@? ,@GT@? u2Gx2? ,2GT2? 56 re tangle.u@,,@,u2,,2/?65 F ,oid indow.float x@,float T@,float x2,float T2/ E aGx@? dGT@? bGx2? GT2? F ,oid 2uta.float x,float T/ E mo,eto.u.x/,,.T//? F ,oid %rag.float x,float T/ E lineto.u.x/,,.T//? F ,oid !efPr.float r, float a/ E ca*aGr? PlfaGa? F float Pr: .float x, float */ E return x+ca*a6*6 os.Plfa/? F float Pr; .float T, float */ E return T+ca*a6*6sin.Plfa/? F

55 "indo# 55 Pr .r,/

04&04&@4

4O

C+

PO

1".

aciliti CII

'imba(ul C++ ofer 4n plus fa! de limba(ul C unele fa ilit!i noi& -n a,anta( important 4l onstituie no!iunea de clas .prin are se definete un $AD/, iar a estea pot forma o ierar(ie, de i putem ,orbi de o programare orientat obiect&

1".1. #.tensii ale limba$ului C


7n C++ exist un nou tip de comentariu .de(a utili*at 4n exemplele anterioare/1 ))) 11 Comentariu Ua 4n limba(ul C de lara!iile erau s rise 4nainte de instru !iuni, 4n CII ele pot fi s rise oriunde& Uispo*iti,elor standard de intrareBieire li sBau ataat streamurile standard cin .pentru stdin/ i respe ti, cout .pentru stdout/, are permit efe tuarea opera!iilor de intrareB ieire apli )nd operatorul QQ streamului cin, respe ti, MM streamului cout& Qerar8iile ne esare sunt 4n fiierul iostream&h & >xemplu1
Einclude <!tdio.#>; Einclude <conio.#>;

Einclude <iostrea$.(>;
void main (void)

{ int i;

cout cout double =; cout cout c(ar !;1-<; cout cout

<< " Dati i : "; cin >> i; << " Wal. i = " << i << endl; << " Dati = : "; cin >> =; << " = i = " <<= i<< endl; << " Dati ! : "; cin >> !; << " 1ir. ! = " << ! << endl;

55 endlG<Cr=

0etc#();

Ua 4n C on,ersia expli it se poate efe tua prin .tip/ e,presie, 4n CII se poate reali*a i prin tip .e,presie/& >xemplu1
Einclude <!tdio.#>; Einclude <conio.#>;

Einclude <iostrea$ .(>;


void main (void) {

c#ar c; cout << " Dati c : "; cin >> c; cout << " 9ar. c = " << c << endl; cout << " Wal. c = " << (int) c << endl; cout << " Wal. c = " << int (c) << endl; void 82; 2=$c; cout << " Wal. c = " << 8(int 8) 2 << endl; tN2edef int 8 Oint; cout << " Wal. c = " << 8 Oint (2)<< endl; 0etc#();

55 Con!inutul adresei 55 la are se afl un 4ntreg

04&04&@4

4N

C+

PO 1".2. Operatori
1".2.1. Operatorul de re6oluie 9;;:

P est operator .;;/ se utili*ea* )nd dorim s referim o ,ariabil global redefinit 4ntrBo fun !ie, astfel1 ;; Variabil >xemplu1
Einclude <conio.#>; Einclude <io!tream.#>;

un!i0ned =; c#ar N;1-<; int i=((; void main (void) { un!i0ned =; int N; cout << " Dati doua numere : cout << " 9ele doua numere = cout << " 9ele doua numere = cout << " 9ele doua numere =

.. Waria)ile Klo)ale (::)

clr!cr(); .. Waria)ile Jocale "; cin >> ::= >> =; " << ::= << A A << = << endl; " << ::= << A A << 66= << endl; " << ::= << A A << = << endl;

cout << " Dati nume,var!ta : "; cin >> ::N >> N; cout << " Numele !i var!ta = " <<

::N << A,A <<

N << endl; 0etc#e();

for (int i=11; i<::i; ::i6=11) cout << i <<"::"<< ::i << endl; /

1".2.2.

Operatorul de adres 9=:

P est operator .=/ se poate utili*a i pentru a defini un tip referin printrB de lara!ie de forma tip = .asemntor u o onstru !ie de forma tip +, pentru pointer/& Cu a(utorul a estui operator putem redenumi o ,ariabil, putem reali*a un apel prin referin! sau putem s de larm o ,ariabil de referin! astfel1 tip ( parametru"formal tip ( nume!var!ref ? 77 par* ref* 9adres: 77 var* de tip referin

04&04&@4

4$

C+

PO

>xemple1
Einclude <conio.#>; Einclude <io!tream.#>;

11 *edefinirea unei &ariabile

void main (void) { int a;1<; int 8 ) = a; int ( c = a;-<; cout << " Dati a : "; cin >> a;-<; cout << " a,),c = " << a;-< << 8) << c << endl; int =; int 8 N = $=; int ( z = 8N; int ( " = =; cout << " Dati = : "; cin >> =; cout << " =,N,z," = " << = << 8N << z << " << endl;
/
Einclude <conio.#>; Einclude <io!tream.#>;

0etc#();

11 *edefinirea unei func 'ii

Einclude <mat#.#>; tN2edef dou)le Functie (dou)le); void main (void) { Functie ( Sin=!in; dou)le =; cout << " Dati = : "; cin >> =; cout << "1in(" << = << ")=" << Sin(=) << endl;
/
Einclude <conio.#>; Einclude <io!tream.#>;

0etc#();

11 ,pel prin *eferin'

void !uma (int =,int N,int *z) 11 x53 z { *z = = 8 N; / void Suma (int =,int N,int (z) 11 x53 z { z = = 8 N; / void main (void) { int =,N,z; cout << " Dati =,N : "; cin >> = >> N; !uma(=,N, 5z); cout << "(= 1)8(N 1)=" << z << endl; Suma(=,N, z); cout << "(= 1)8(N 1)=" << z << endl; 11 mai simpluG
0etc#();

1".2.3.

Operatorii de alocare8dealocare 96ew8!elete:


new tip new tip . Valoare!de!intiiali+are!a!variabilei!dinamice / new tip 2 Numrul!de!variabile!dinamice!alocate 3

Operatorul de alo are 6ew se poate folosi 4n ori are dintre urmtoarele trei ,ariante1

Uealo area se reali*ea* astfel1 delete Variabil!de!referin ? sau delete 2 Numrul!de!var!dinamice!alocate 3 Variabil!de!referin ? >xemplu1
Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>;

void main (void)

04&04&@4

%0

C+

PO
{ int 8i = ne+ int; int 8I; I = ne+ int (8i);

cout << " Dati v : "; cin >> 8i; cout << " v = " << 8i << endl;

cout << "8i ==8I = " << 8I << endl; delete i; delete I; int 8r; r = ne+ int ;2<; cout << " Dati v1 : "; cin >> 8 r; cout << " Dati v2 : "; cin >> 8(r 1); cout << " v1 = " << 8 r << endl; cout << " v2 = " << 8(r 1)<< endl; delete r;

0etc#();

7n exemplul urmtor se ,a utili*a o matrice P u numr ,ariabil de oloane i o matri e B utili*)nd adresele liniilor1
Einclude <io!tream.#>; Einclude "9rt.922"

tN2edef int ?i2; con!t n=+; void main () { ?i28 :;n 1<, 82; int i,I; for (i=1; i<=n; i ) { 2 = :;i< = ne+ ?i2 ;i 1<; for (I=1; I<=i; I ) 8( 2)=i81- I; / for (i=1; i<=n; i ) { 2=:;i<; cout << " " << i for (I=1; I<=i; I ) cout << 82 << A cout << endl; / for (i=1; i<=n; i ) { cout << " " << i << " for (I=1; I<=i; I ) cout << 8(8(: i) I) << cout << endl; / int >;n 1<;n 1<; for (i=1; i<=n; i ) for (I=1; I<=n; I ) >;i<;I<=i81- I; for (i=1; i<=n; i ) { cout << " " << i << " for (I=1; I<=n; I ) cout << 8(8(> i) I) << cout << endl; / /

9lr1cr();

<< " : "; A; : "; A A;

.. :iI

: "; A A;

.. >iI

Readln(); 77 / e + u l t a t e F
* 7 8 9 * 7 8 9 * 7 8 9 6 6 6 6 6 6 6 6 6 6 6 6 ** 7* 8* 9* ** 7* 8* 9* ** 7* 8* 9* 77 87 88 97 98 99 77 87 97 *7 77 87 97 88 98 *8 78 88 98

99 *9 79 89 99

04&04&@4

%@

C+

PO 1".3. Structur< uniune 0i enumerare

ceferirea a estor tipuri se poate fa e 4n CII fr a mai fi ne,oie de u,)ntul orespun*tor struct, union, respe ti, enum& Ue asemenea, parametrii i ,aloarea unei fun !ii pot fi structuri, pointeri la structuri sau referine la structuri& 0unt permise i atribuiri de stru turi& ceferirea omponentelor unei uniuni anonime din interiorul unei stru turi se fa e la fel a i referirea omponentelor stru turii, iar prima omponent se poate ini!iali*a& 7n CII, ,ariabilelor de tip enumerare nu se mai pot atribui de )t ,alori ale a estui tip .nu i numerele aso iate a estor elemente/& >xemple1
Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>;

tN2edef float Real;

enum Gi0ura { 2unct, cerc /; !truct Ounct { Real =, N; /; !truct 9erc { Ounct 9entru; Real Raza; /; !truct T)iect { Gi0ura GMK; union { Ounct O5N9?; 9erc 9LR9; /; /; -biect /ranslatat ( -biect o, Punct ? ) { o.O5N9?.= = o.O5N9?.= ?.=; o.O5N9?.N = o.O5N9?.N ?.N; return o; / void main (void) { Ounct O = { %,C /; T)iect T = { 2unct, { 1,2 / /; T)iect 9; 9.GMK=cerc; 9.9LR9.9entru=T.O5N9?; 9.9LR9.Raza=1-; T)iect D; D=/ranslatat(9,O); cout << " D(" << D.9LR9.9entru.= << "," << D.9LR9.9entru.N << "," << D.9LR9.Raza << ")" << endl; 0etc#(); /

04&04&@4

%2

C+

PO

Einclude <io!tream.#> Einclude "crt.#"

.. 1imetrizeaza cel mai a2ro2iat 2unct fata de ori0ine BB

!truct Ounct { float =, N; Punct5 0itP (); 1oid /ipP (); float .7 () { return !*! : y*y; } Punct5 2i$- () { !=)!; y=)y; return *t(is; } /; Punct5 Punct660itP () { cin ;; ! ;; y; return *t(is; } 1oid Punct66/ipP () { cout << ! << = = << y << endl; } Ounct$ :2ro2T( Ounct$ O, Ounct$ X ) { return O.D2()<X.D2() & O : X; / void main (void) { 9lr1cr(); cout << " O : "; Ounct O; ..O.9itO(); cout << " X : "; Ounct X; ..X.9itO(); cout << " @ = "; :2ro2T(O.9itO(),X.9itO()).1imT().?i2O(); cout << " O = "; O.?i2O(); cout << " X = "; X.?i2O(); Readln() ; /
Einclude <io!tream.#> Einclude "crt.#"

.. 1imetrizeaza cel mai a2ro2iat 2unct fata de ori0ine BB

!truct Ounct { float =, N; Punct () { cin >> = >> N; / void ?i2O() { cout << = << A A << N << endl; / float D2 () { return =8= N8N; / Ounct$ 1imT(); /; Ounct$ Ounct::1imT() { ==6=; N=6N; return 8t#i!; / Ounct$ :2ro2T (Ounct$ O, Ounct$ X) { return O.D2()<X.D2() & O : X; / void main (void) { 9lr1cr(); cout << " O : "; Ounct O=Ounct(); cout << " X : "; Ounct X=Ounct(); cout << " @ = "; :2ro2T(O,X).1imT().?i2O(); cout << " O = "; O.?i2O(); cout << " X = "; X.?i2O(); Readln() ; /

04&04&@4

%A

C+

PO

1>.
1>.1. uncii Inline

uncii CII

P este macrouri se pot defini astfel1 [ define numem 9 /ist"parametri"formali : <ir"caractere Ppelurile macrourilor se ,or 4nlo ui u "irul de caractere pre i*at, fr a fa e ,erifi ri de tipuri, eea e poate ondu e la erori& P este erori pot fi eliminate da utili*m fun !iile inline, a* 4n are se ,or fa e on,ersiile de tip ne esare& P este fun !ii se de lar prin s rierea u,)ntului inline la 4n eputul antetului, aa um se pate ,edea 4n exemplele urmtoare1 >x& @1
Einclude <conio.#>; Einclude <io!tream.#>;

Edefine :)!HK(=) (=)> - & (=) : 6(=) 55 eresit I Edefine :)!H0(=) ( = > - & = : 6 = ) 55 gresit I Edefine :)!Hc(=) ( (=)> - & (=) : 6(=) ) 55 Ma ro ore t inline lon0 >bs (lon0 =) 55 +un tie Qnline { return = > - & = : 6 = ; / void main (void) { lon0 =; cout << " = : " ; cin >> =; lon0 N=6=; cout << " P=P = " << :)!HK(=); cout << endl; cout << " P=P = " << :)!H0(=) << endl; cout << " P=P = " << :)!Hc(=) << endl; cout << " P=P = " << >bs (=) << endl; cout << " P1-6NP = " << :)!HK(1-6=); cout << endl; cout << " P1-6NP = " << :)!H0(1-6=) << endl; cout << " P1-6NP = " << :)!Hc(1-6=) << endl; cout << " P1-6NP = " << >bs (1-6=) << endl; 0etc#();
/

>x& 21
Einclude <io!tream.#>;

Edefine $a!( =, N) (=>N & = : N) .. Kre!it 3 inline int @a=(int =, int N) .. G.Mnline { return (=>N & = : N); / void main (void) { int =,N,z; ==7; N=2; z=$a!( =, N); cout <<" $a!("<<=<<A,A<<N<<")="<<z<< endl; ==7; N=2; z=@a=( =, N); cout <<" @a=("<<=<<A,A<<N<<")="<<z<< endl; /

77 /e+ultatele
$a!(?,8)=? @a!(A,8)=A

04&04&@4

%4

C+

PO

1>.2.

uncii de tip referin

Pntetul unei fun !ii u ,aloare de tip referin! este1 tip ( numef 9 /ist"parametri"formali : >xemplu1
Einclude <time.#>; Einclude <!tdli).#>; Einclude <conio.#>; Einclude <io!tream.#>;

int 5 >lba_'ea3ra ( int 5 >lbe, int 5 'e3re ) 77 /ef* la int { if (random(2)) return >lbe; 77 /ef* la ,lbe el!e return 'e3re; 77 /ef* la 6egre / void main (void) { int :l)e=-; int Ne0re=-; int i,n; randomize(); cout << "Dati n:"; cin >> n; for(i=1;i<=n;i ) >lbaH'ea3ra(>lbe,'e3re)::;
77 &nc.Albe7Negre/

cout <<":l)e ="<< :l)e << endl; cout <<"Ne0re="<< Ne0re<< endl;
0etc#(); /

7n urmtorul exemplu se dorete modifi area oordonatelor elui mai apropiat pun t .dintre P i i/ fa! de origine .nu doar oordonatele simetri ului lui P sau i/1
BB 0imetri+ea+ cel mai apropiat punct fa de origine
Einclude <io!tream.#> Einclude "crt.#"

struct Punct { float !, y; }; float .7 ( Punct P ) { return P,!*P,! : P,y*P,y; } Punct 2i$- ( Punct5 P ) { P,!=)P,!; P,y=)P,y; return P; } Punct= >prop-( Punct5 P, Punct5 C ) { return .7(P) < .7(C) D P 6 C; } Punct 0itP ( ) { Punct P; cin ;; P,! ;; P,y; return P; } 1oid /ipP ( Punct P ) { cout << P,! << = = << P,y << endl; } 1oid $ain { cout cout cout cout cout } (1oid) 0lr2cr(); << << << << << E E E E E P C @ P C 6 6 = = = E; E; E; E; E; Punct P = 0itP (); Punct C = 0itP (); /ipP (2i$- (>prop-(P,C)) ); /ipP (P); /ipP (C); 4eadln();

04&04&@4

%%

C+

PO
77 2,* /eferin HH

Einclude <io!tream.#>; Einclude "9rt.922" void !uma (int =,int N,int 8z) { 8z = = 8 N; / void 1uma (int =,int N,int $z) { z = = 8 N; / int8 ma= (int$ =, int$ N) { return ( = > N & $= : $N ); / int$ @a= (int$ =, int$ N) { return ( = > N & = : N ); / !truct Ounct { int =,N; /; Ounct :tri) (int =, int N) { Ounct O; O.===; O.N=N; return O; / Ounct !im (Ounct O) { O.==6O.=; O.N=6O.N; return O; / Ounct$ 1im (Ounct$ O) { O.==6O.=; O.N=6O.N; return O; / Ounct8 O!im(Ounct O) { O.==6O.=; O.N=6O.N; return $O; / void ?i2 (Ounct O) { cout << " O(" << O.= << A,A << O.N << A)A << endl; / void main (void) { int =,N,z; 9lr1cr(); cout << " Dati =,N : "; cin >> = >> N; !uma(=,N,$z); cout << " (= 1)8(N 1) = " << z << endl; 1uma(=,N, z); cout << " (= 1)8(N 1) = " << z << endl; cout << " =,N = " << = << A A << N << endl; cout << " ma=(=,N) 1 = " << :: *$a!(!,y) << endl; cout << " =,N = " << = << A A << N << endl; cout << " @a=(=,N) 1 = " << :: @a!(!,y) << endl; cout << " =,N = " << = << A A << N << endl; Ounct O=:tri)(=,N); ?i2(O); ?i2(!im(O)); ?i2(O); ?i2(1im(O)); ?i2(O); cout <<"O(=,N)=("<< si$(P) ,! <<A,A<< 2i$(P) , y <<A)A<< endl; cout <<"O(=,N)=("<<(*Psi$(P)),! <<A,A<< Psi$(P));y <<A)A<< endl; /

77 / e + u l t a t e F

Readln();

.ati !,y 6 * F (!:*)*(y:*) = *7 (!:*)*(y:*) = *7 !,y = * F $a!(!,y):* = A !,y = * A @a!(!,y):* = ? !,y = * ? P(*,?) P()*,)?) P(*,?) P()*,)?) P()*,)?) P(!,y)=(*,?) P(!,y)=()*,)?)

04&04&@4

%M

C+

PO 1>.3. SupraHncrcarea funciilor

P east proprietate d posibilitatea utili*rii unor fun !ii a,)nd a elai nume, dar diferite .4nrudite, u antete diferite/& >xemple1
Einclude <mat#.#>; Einclude <com2le=.#>; Einclude <conio.#>; Einclude <io!tream.#>;

dou)le >rc/3 (dou)le =) { return atan (=); / dou)le >rc/3 (dou)le N, dou)le =) { return atan2(N,=); / dou)le >rc/3 (com2le= z) { return real (atan(z)); / void main (void) { com2le= "(1,-); cout << " Oi = " << +8>rc/3(1.-) << endl; cout << " Oi = " << 28>rc/3(1,-) << endl; cout << " Oi = " << +8>rc/3( " ) << endl; 0etc#();
/

Einclude "0raf.#" Einclude <conio.#>

..

Rote!te un ?riun0#i in Iurul unui Ounct

BB

!truct Ounct { float =,N; /; !truct ?riun0#i { Ounct :,>,9; /; Ounct Init (float =, float N); ?riun0#i Init (Ounct :, Ounct >, Ounct 9); void /ranslat (Ounct$ O, Ounct X); void /ranslat (?riun0#i$ ?, Ounct X); void Rot (Ounct$ O, float :lfa, Ounct X); void Rot (?riun0#i$ ?, float :lfa, Ounct X); Ounct Init (float =, float N) { Ounct O = {=,N/; return O; / ?riun0#i Init (Ounct :, Ounct >, Ounct 9){ ?riun0#i ?; ?.:=:; ?.>=>; ?.9=9; return ?; / void /ranslat (Ounct$ O, Ounct X) { O.= =X.=; O.N =X.N; / void /ranslat (?riun0#i$ ?, Ounct X) { ?ran!lat(?.:,X); ?ran!lat(?.>,X);
?ran!lat(?.9,X); /

void Rot (Ounct$

O,Ounct X,float :lfa)

Rot(O.=,O.N,X.=,X.N,:lfa); Rot(?.:,X,:lfa); Rot(?.>,X,:lfa);

Rot(O.=,O.N,X.=,X.N,:lfa); / Rot(?.9,X,:lfa); /

void Rot (?riun0#i$ ?,Ounct X,float :lfa){ void @uta(Ounct O) void Trag(Ounct O) void Des (Ounct O) void Des (?riun0#i ?) void main(void)
{

{ { { {

@uta (O.=,O.N); / Trag (O.=,O.N); / circle(u(O.=),v(O.N),%);/ @uta(?.:); ?ra0(?.>); ?ra0(?.9); ?ra0(?.:);/

Ounct O = Mnit(1-,1-); ?riun0#i :>9 = Mnit(Mnit(7,7),Mnit(2-,C),Mnit(',12)); MnitKraf(); Wie"Oort (2-,1-,0etma==()62-,0etma=N()61-); !et)*color(>J5L); !et"ritemode(FTRHO5?); Uindo" (61-,2-,%-,61-); Jinie (61-, -,2-, -); Jinie ( -,2-, -,61-); c#ar L!c=-=1); float :lfa; c#ar Ra!2=AoA; Des(O); do { Des(:>9); if (Ra!2==AoA) :lfa=-.1; el!e :lfa=6 -.1; Rot(:>9,O,:lfa); / "#ile ((Ra!2=0etc#e())3=L!c); clo!e0ra2#();
/

04&04&@4

%O

C+

PO 1>.". Iniiali6area parametrilor formali

Parametrii formali pot a,ea o ,aloare impli it, da a etia lipses din lista parametrilor a tuali, ,aloare dat de o expresie& 7n lista parametrilor formali, ei u ,aloare impli it .ini!iali*a!i/ se ,or s rie ultimii astfel1 tip nume = expresie >xemplu1
Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>;

!truct int int T)iect {

T)iect { float =,N; float r; /; LJi2!a () { return 61; / L!teHOunct (T)iect o) { return o.r==LJi2!a(); / %nit( float =-=-, float N-=-, float raza=LJi2!a() ) T)iect o; o.===-; o.N=N-; o.r=raza; return o;

/ ?i2 ( T)iect o ) { if (L!teHOunct(o)) cout << " Ounct ( "; el!e cout << " 9erc ( "; cout << o.= << "," << o.N; if (L!teHOunct(o)) ; el!e cout << "," << o.r; cout << " ) " << endl; / main () { T)iect T=%nit(); ?i2(T); .. Tri0inea (-,-) T)iect :=%nit(C); ?i2(:); .. : T= (C,-) T)iect O=%nit(1,2); ?i2(O); .. O R2 (1,2) T)iect 9=%nit(%,+,7); ?i2(9); .. 9erc (%,+, 7) 0etc#(); /

7n exemplul are urmea* se poate ,edea um se pot folosi parametrii impli i!i pentru a de lara pun tul O.0,0/, un pun t P pe axa Ox, un pun t P 4n plan . 42/, un er C .4n plan/, extremit!ile unui segment din spa!iu .i,c4 A/, pre um i segmentele ic i cO1
Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>; !truct Ounct { float =,N,z; /; Ounct Mnit( float =-=-, float N-=-, float z-=- ) { Ounct O; O.===-; O.N=N-; O.z=z-; return O; / void ?i2 ( Ounct O ) { cout << " O(" << O.= <<A,A<< O.N <<A,A<< O.z <<A)A<< endl; /

04&04&@4

%N

C+

PO

!truct 1e0ment { Ounct :, >; / ; 1e0ment Mnit ( Ounct :, Ounct > = Mnit() ) { 1e0ment :> = {{:.=,:.N,:.z/,{>.=,>.N,>.z//; return :>; / void ?i2 ( 1e0ment :> ) { cout << " 1e0ment : Bn"; ?i2(:>.:); ?i2(:>.>); / void main () { clr!cr(); Ounct T=Mnit(); ?i2(T); (-,-,-) Ounct :=Mnit(C); ?i2(:); (C,-,-) Ounct O=Mnit(1,2); ?i2(O); (1,2,-) Ounct 9=Mnit(%,+,7); ?i2(9); (%,+,7) Ounct X =Mnit(1,2,%); Ounct R =Mnit(+,7,,); 1e0ment XR=Mnit(X,R); ?i2(XR); 1e0ment RT=Mnit(R); ?i2(RT); 0etc#e(); /

.. Tri0inea .. : e T= .. O e R2 .. 9erc .. X e R% .. R e R% .. XR e R%

1>.>.

uncii membru pentru Structuri

P estea se de lar 4n adrul stru turii a fin !ii inline sau prototipuri .urm)nd 4n a est a* des rierea lor u a(utorul operatorului de re*olu!ie .11/&
Einclude <io!tream.#> Einclude "crt.#"

.. 1imetrizeaza cel mai a2ro2iat 2unct fata de ori0ine BB

!truct Ounct { float =, N; Punct5 0itP (); 1oid /ipP (); float .7 () { return !*! : y*y; } Punct5 2i$- () { !=)!; y=)y; return *t(is; } /; Punct5 Punct660itP () { cin ;; ! ;; y; return *t(is; } 1oid Punct66/ipP () { cout << ! << = = << y << endl; } Ounct$ :2ro2T( Ounct$ O, Ounct$ X ) { return O.D2()<X.D2() & O : X; / void main (void) { 9lr1cr(); cout << " O : "; Ounct O; ..O.9itO(); cout << " X : "; Ounct X; ..X.9itO(); cout << " @ = "; :2ro2T(O.9itO(),X.9itO()).1imT().?i2O(); cout << " O = "; O.?i2O(); cout << " X = "; X.?i2O(); Readln() ; / .. 1imetrizeaza cel mai a2ro2iat 2unct fata de ori0ine BB

04&04&@4

%$

C+

PO

Einclude <io!tream.#> Einclude "crt.#"

!truct Ounct { float =, N; Punct () { cin >> = >> N; / void ?i2O() { cout << = << A A << N << endl; / float D2 () { return =8= N8N; / Ounct$ 1imT(); /; Ounct$ Ounct::1imT() { ==6=; N=6N; return 8t#i!; / Ounct$ :2ro2T (Ounct$ O, Ounct$ X) { return O.D2()<X.D2() & O : X; / void main (void) { 9lr1cr(); cout << " O : "; Ounct O=Ounct(); cout << " X : "; Ounct X=Ounct(); cout << " @ = "; :2ro2T(O,X).1imT().?i2O(); cout << " O = "; O.?i2O(); cout << " X = "; X.?i2O(); Readln() ; /

1?. 'ip !bstract de 1at


Programarea modular permite prote(area datelor prin memorie static, .a esul la date se poate efe tua doar din lo ul de larrii p)n la sf)ritul modulului, nu i 4n afara lui/& -n tip abstract de dat 9Domeniu, 4peraii: on!ine o interfa' .:$ad*(;/ i o implementare .:$ad*Cpp;/& Programul .:Program*Cpp;/ are utili*ea* a est tip abstract de dat ,a a,ea a es doar la modulul de interfa!, aa um se poate ,edea 4n s 8ema de mai (os1

3rogram.Cpp

Compilare

3rogram.Ob$ %in.-editare

'ad.& Compilare

3rogram.#.e

'ad.Cpp

3rogram.Ob$

7n proie t .meniul 3ro$ect/ ,or fi in luse fiierele 3rogram.Cpp i 'ad.Cpp&

04&04&@4

M0

C+

PO

7n exemplul urmtor, pentru $ad 'ulime, fiierele ,or fi 3Vult.Cpp< Vult.& i Vult.Cpp1
.. 3Vult.Cpp BB Einclude <conio.#> Einclude <io!tream.#> Ginclude E@ult,(E void main (void) { @ultime :, >, 9, D; Mnit(:); Mnit(>); Mnit(9); Mnit (D); cout << " : : "; 9it@(:); cout << " : = "; ?i2@(:); ..cout << "P:P: " << :6>card << endl; cout << "P:P: " << 9ard(:) << endl; cout << " > : "; 9it@(>); cout << " > = "; ?i2@(>); Mnit(9); Mnter!(:,>,9); cout << ":n>: "; ?i2@(9); Mnit(D); Reun (:,>,D); cout << ":u>: "; ?i2@(D); cout << (Mnclu!(:,>) & " :<=> " : " 3:<=> "); cout << (L0ale (:,>) & " :==> " : " :<>> "); /

clr!cr();

.. Nu !e 2.3 .. 1e 2.3

0etc#e();

.. Vult.& BB
Ginclude E#l@ult,(E !truct 0et; tN2edef 9et 8@ulti$e; void Mnit (@ultime $:); int 9ard (@ultime :); int LHWida (@ultime :); void Wida (@ultime :); void :dLl (?Ll =, @ultime :); void 9it@ (@ultime :); void ?i2@ (@ultime :); int :2art (?Ll =, @ultime :); void Mnter! (@ultime :, @ultime >, @ultime 9); void Dif (@ultime :, @ultime >, @ultime 9); void Reun (@ultime :, @ultime >, @ultime 9); int Mnclu! (@ultime :, @ultime >); int L0ale (@ultime :, @ultime >); @ultime DifLl (@ultime :, ?Ll a); @ultime Difer (@ultime :, @ultime >);

55 0unt definite elementele mul!imii

Einclude <io!tream.#> Einclude <conio.#>

.. 3Vult.Cpp BB

Ginclude E#l@ult,(E Ginclude E@ult,(E typedef !truct 0et

int card; ?Ll Llem;9m<; /;

04&04&@4

M@

C+

PO

int 9ard (@ultime :) { return :6>card; / void 9it@ (@ultime :) { cin >> :6>card; if (9ard(:)>9m62) cout << 9ard(:) << 9m << "3"; el!e for (int i=1; i<=9ard(:); i ) cin >> :6>Llem;i<; cout << endl; / void ?i2@ (@ultime :) { for (int i=1; i<=9ard(:); i ) cout << :6>Llem;i< << ","; cout << "B)Bn"; / int :2art (?Ll =, @ultime :) { for (int i=1; i<=9ard(:); i ) if (===:6>Llem;i<) return 1; return -; / void Mnter! (@ultime :, @ultime >, @ultime 9) { Wida(9); for (int i=1; i<=9ard(:); i ) if (:2art(:6>Llem;i<,>)) :dLl(:6>Llem;i<,9); / void Dif (@ultime :, @ultime >, @ultime 9) { int i; Wida(9); for (i=1; i<=9ard(:); i ) if (3:2art(:6>Llem;i<,>)) :dLl(:6>Llem;i<,9); / @ultime DifLl (@ultime :, ?Ll a) { if (:2art(a,:)) { @ultime D; Mnit(D); :dLl(a,D); Dif(:,D,D); return D; / el!e return :; / @ultime Difer (@ultime :, @ultime >) { @ultime D; Mnit(D); Dif(:,>,D); return D; / @ultime Difer (@ultime :, @ultime >) { @ultime D; Mnit(D); Dif(:,>,D); return D; / void Reun (@ultime :, @ultime >, @ultime 9) { int i; 89=8:; @ultime >H:; Mnit(>H:); Dif(>,:,>H:); for (i=1; i<=9ard(>H:); i ) :dLl(>H:6>Llem;i<,9); .. de!troN >H:; / int Mnclu! (@ultime :, @ultime >) { int i; for (i=1; i<=9ard(:); i ) if (3:2art(:6>Llem;i<,>)) return -; return 1; / int L0ale (@ultime :, @ultime >) { return Mnclu!(:,>) $$ Mnclu!(>,:); / int L0ale (@ultime :, @ultime >) { return Mnclu!(:,>) $$ Mnclu!(>,:); /

04&04&@4

M2

C+

PO

void :dLl(?Ll =, @ultime :) { if (3:2art(=,:)) if (9ard(:)>9m62) {cout << 9ard(:) << 9m << "3"; 0etc#();/ :6>Llem; (:6>card)<==; / void Wida(@ultime :) { :6>card=-; / void Mnit(@ultime $:) { : = ne" 9et; Wida(:); / int LHWida(@ultime :) { return (:6>card)==-; /

el!e

.. #lVult.& BB
Edefine 9m 277 typedef int /#l; 55 Kipul elementelor mul!imii

-n tip abstract de dat reali*ea* o unifi are .printrBo grupare de tip struct/ 4ntre date .date membru/ i opera!iile .funcii membru/ lor ara teristi e& Funciile membru sunt onsiderate de tip inline iar definirea lor 4n afara stru turii se fa e prin operatorul de re+oluie .;;/& 7n a est mod 4ns nu se reali*ea* o prote !ie a datelor .a esul la date se poate fa e i prin alte fun !ii, nu numai prin ele membru/, a east prote !ie put)nd fi reali*at .aa um ,om ,edea 4n ele e urmea*/ u a(utorul claselor& >xemplu1
Einclude <!tdio.#>; Edefine Oi %.1+17(2 Einclude <conio.#>; Einclude <io!tream.#>;

!truct

{ float =,N; float r; void Mnit (float =-, float N-, float raza) { ===-; N=N-; r=raza;/ float Jun0 (); float :ria (); /; float 0erc::"un3 () { return 28Oi8r; / float 0erc::>ria () { return Oi8r8r; / void main (void) { 9erc 9; 9.%nit(1,2,%); cout << "9(" << 0,! << "," << 0,y << "," << 0,r << ")" << endl; cout << ":ria = " << 9.>ria() << endl; cout << "Jun0 = " << 9."un3() << endl; 0etc#(); /

9erc

04&04&@4

MA

C+

PO

1E. 3 rogramare o rientat o biect 9 O O 3 :


OO3 este o metod de implementare 4n are1
a/ b/ /

4biectele sunt elementele de ba*, Ori e obie t este o instan! a unei clase, Clasele sunt legate .aso iate/ unele u altele prin mo"tenire&

-n limba( este orientat obie t da 1 a/ -tili*ea* obiecte, b/ Oblig obie tele s apar!in unei clase, / Permite mo"tenirea& 'imba(ul C++ ofer no!iunea de clas, prin are se pot forma ierar(ii, de i putem ,orbi de o programare orientat obiect .OO3/& OO3 4nseamn reali*area unor programe al tuite dintrBo mul!ime de obiecte are intera !ionea* pentru a re*ol,a problema propus, i permite reutili*area elementelor des rise .a interfe!ei i a odului/& -n obiect are o stare i un comportament .opera!ii des rise 4n interfa!a obie tului/ a este dou omponente fiind definite prin datele membru .variabile de instan/ i respe ti, prin funciile membru .metode/&

OO3 utili*ea* ormtoarele on epte1


clasa obiectul

- implementarea unui KPU, - instana unei lase, - mesajul prin are se asigur interfa!a .opera!iile/&

metoda

OO3 are urmtoarele ara teristi i .propriet!i/ de ba*1

9ncapsularea mo<tenirea

- gruparea datelor i a opera!iilor definite pentru a estea, pre um i prote !ia a estor date .ele neput)nd fi a esate de )t prin fun !iile membru/& - pstrarea elementelor .date i fun !ii ale/ unei lase .de ba+/, u definirea de noi elemente onstruind o nou las .derivat/, form)nd 4n felul a esta ierar(ii de lase& 'o"tenirea poate fi i multipl da o las motenete mai multe lase& - redefinirea .supraDncrcarea/ opera!iilor .fun !iilor/& 7ntrBo ierar8ie pot fi mai multe fun !ii u a elai nume, de i ,a fi efe tuat opera!ia orespun*toare obie tului are o apelea*& Ueterminarea opera!iei se poate fa e la ompilare .legare static/ sau la exe u!ie .legare dinamic, prin funcii vituale/&

polimorfism

04&04&@4

M4

C+

PO 1E.1. 1efinirea Claselor

O clas se de lar a i o structur, 4nlo uind u,)ntul struct u class& Prote !ia datelor se definete s riind modifi atorul dorit .private, protected sau public/ urmat de C1D& Ues rierea unei clase on!ine at)t datele membru .,ariabilele de instan!/ )t i fun !iile membru .metodele/, pre i*)nd pentru a estea gradul de prote !ie, astfel1 class Nume!clas B

B C 'odificator!de!protecie; D %ist!membrii A
A? unde1

'odificator!de!protecie B private, protected, publicA private nu permite a esul din afara lasei,

< private fiind impli it, N [ I

protected permite a esul din lasele deri,ate, public permite a esul din afara lasei?

%ist!membrii B %ist!declaraii!date!membru, %ist! declaraii !funcii!membru A

Uatele de tip private .N/ pot fi a esate doar de fun !iile membru sau fun !ii prietene .friend/& O fun !ie membru a unei lase poate fi fun !ie prieten a altei lase, iar da toate sunt prietene, atun i se poate de lara las prieten .friend/* 11

Vezi C>

+ie are obie t al unei lase de!ine un set de date membru .variabile de instan/& +un !iile membru publice pot fi utili*ate din ori e fun !ie din program, pe )nd ele private doar din fun !iile membru ale lasei& Uefinirea fun !iilor membru .metodelor/ se poate reali*a1 a/ imediat . omplet, antet plus corp/ 4n defini!ia lasei . a fun !ie inline/ da fun !ia nu on!ine multe instru !iuni i nu on!ine stru turi repetiti,e .apelul nu se fa e prin salt u re,enire/, astfel1 class Nume!clas B \ %ip"func'ie Nume!metod 9 &&& : B & & & A? \ A? 77 antet+corp

b/

ulterior .da a fost de larat 4n defini!ia lasei doar prototipul fun !iei/, utili*)nd operatorul de re*olu!ie .de s op/ astfel1 %ip"func'ie 6ume"clas ;; Nume!metod 9 &&& : 77 ;; operatorul de re+oluie B & & & A? 77 corpul funciei

04&04&@4

M%

C+

PO
.. .. 9la!a Ounct 66666666666666666666666666666 BB BB

>xemplu1
E include <conio.#> E include <io!tream.#>

class Punct { float !, y; 47 public6 Punct Punct Punct 1oid 0itP 1oid /ipP Punct5 2i$Pb };

BB ( ) (float !H, float yH) (Punct5 P) (c(ar* @es); (c(ar* @es); ( );

pri1ate6

(!,y) e

{ !=H; y=H; } { !=!H; y=yH; } { !=P,!; y=P,y; }

1oid Punct660itP (c(ar* @es) 1oid Punct66/ipP (c(ar* @es) Punct5 Punct662i$Pb( ) void { / main (void) . . .

{ cout << @es; cin ;; ! ;; y ; } { cout << @es << ! <<= =<< y << endl; } { float I=!; !=y; y=I; return *t(is; }

-n obiect este o instan a unei clase .o variabil de tipul clasei/& +ie are obie t apar!ine unei singure lase .a easta put)nd a,ea mai multe obie te/& 4biectele unei clase se de lar astfel1 Clas >xemplu1
.. .. E include <conio.#> E include <io!tream.#> T)iecte Ounct BB 66666666666666666666666666666 BB

/ist"0biecte@

cla!! Ounct { . . . /; . . . void { ); main (void) clr!cr( Punct -,>(*,7); T.?i2O(" T = "); :.?i2O(" : = "); Punct J*; >1.9itO(" >1: "); Punct J7 (>1.1imO)()); >2.?i2O(" >2= "); 0etc#e( ); /

04&04&@4

MM

C+

PO

Plo area .i ini!iali*area/ obie telor se fa e u o fun !ie membru spe ifi numit constructor . u numele Clas/ iar dealo area u o fun !ie destructor . u numele ]Clas/& >xemplu1
.. .. E E E E E E include include include include include define 9on!tructori 6 De!tructori BB 6666666666666666666666666666 BB <do!.#> <mat#.#> <conio.#> <0ra2#ic!.#> <io!tream.#> 9ale "c:BB>orland9BB>0i"

cla!! Krafic { int Kd, Km; 2u)lic: Krafic(int 0d) { Kd=0d; init0ra2#($Kd,$Km,9ale);/ LKrafic( ) { clo!e0ra2#(); / /; cla!! Punct { float =, N; 2u)lic: Ounct Ounct Ounct Punct LPunct .. 2rivate: (=,N) e R2 ( ) (float =-, float N-) (Ounct$ O) (int, int, int); (); { ==-; N=-; / { ===-; N=N-; / { ==O.=; N=O.N; /

int F() { return int(=); / int Y() { return int(N); / Ounct$ ?ran!l(Ounct$); /; Ounct:: Punct(int =-,int N-,int c) { ===-; N=N-; !etcolor(c); circle(=,N,7);/ Ounct::LPunct( ) { !etcolor(>J:9Z); circle(=,N,7);/ Ounct$ Ounct::?ran!l(Ounct$ ?) { = =?.=; N =?.N; return 8t#i!; / void main (void) { Krafic @od(DL?L9?); Ounct 9(0etma==().2,0etma=N().2,UVM?L); 0etc#e(); for (float :lfa=61.7C;:lfa<+.C1;:lfa =-.-1) { float Raza=1--; Ounct @(Raza8co!(:lfa),Raza8!in(:lfa)); Ounct O=@.?ran!l(9); Punct D(O.F-(),O.Y-(),YLJJTU); delaN(7); / 0etc#e(); /

.. 9entru

04&04&@4

MO

C+

PO
Componentele laselor .datele i fun !iile membru/ se refer prin operatorul

sau

Q, a i 4n a*ul unei stru turi& +un !iile membru refer dire t omponentele lasei .fr a eti operatori, utili*)nd poinetrul this de larat automat a pointer la obie tul urent/& >xemplu1
.. .. E E E E E E include include include include include define T2eratorii i Q BB 6666666666666666666666666666 BB

<do!.#> <mat#.#> <conio.#> <0ra2#ic!.#> <io!tream.#> 9ale "c:BB>orland9BB>0i"

cla!! Krafic { int Kd, Km; 2u)lic: Krafic(int 0d) { Kd=0d; init0ra2#($Kd,$Km,9ale);/ LKrafic( ) { clo!e0ra2#(); / /; cla!! Ounct { float =, N; 2u)lic: Ounct ( ) { ==-; N=-; / Ounct (float =-, float N-) { ===-; N=N-; / Ounct (con!t Ounct$ O) { ==O=; N=ON; / Ounct (int, int, int); [Ounct (); Ounct8 Mnit (float =-, float N-) { ===-; N=N-; return t(is; / int F() { return int(=); / int Y() { return int(N); / Ounct8 ?ran!l(con!t Ounct8); /; Ounct:: Ounct(int =-,int N-,int c) { ===-; N=N-; !etcolor(c); circle(=,N,7);/ Ounct::[Ounct( ) { !etcolor(>J:9Z); circle(=,N,7);/ Ounct8 Ounct::?ran!l(con!t Ounct8 ?){ = =?Q=; N =?QN; return t(is; / void main (void) { Krafic @od(DL?L9?); Ounct8 9 = ne" Ounct(0etma==().2,0etma=N().2,UVM?L); float Raza=1--; Ounct8 @ = ne" Ounct; for (float :lfa=61.7C;:lfa<+.C1;:lfa =-.-2)

0etc#e(); .. { @ 0

@=@QMnit(Raza8co!(:lfa),Raza8!in(:lfa)) Q?ran!l(9); Ounct 8O=ne" Ounct(@QF-(),@QY-(),YLJJTU); delaN(%); .. .esen, P delete O; / .. 2ter3e P delete @; 0etc#e(); delete 9; 0etc#e(); /

04&04&@4

MN

C+

PO 1E.2. Constructori i !estructori

-n obie t este reat de un constructor al lasei i este ters .distrus/ de tre destructor& Constructorii permit ini!iali*area obie telor u .mai multe/ fun !ii membru omonime .a,)nd a elai nume u lasa i are difer prin lista parametrilor formali/, fr a returna o ,aloare& Constructorul este apelat automat la rearea unui obie t& O las trebuie s on!in el pu!in doi onstru tori1

un constructor implicit .fr parametri, are ini!iali*ea* obie tele u o ,aloare impli it/, un constructor de copiere . are ini!iali*ea* u ,aloarea unui obie t existent, de a elai tip/&

>xemplu1
55 Constructori 0tring JJ
E include <9onio.#> E include <1trin0.#> E include <Mo!tream.#>

cla!! 1trin0 { c#ar8 !; 2u)lic: 1trin0 (); .. 9on!tructor im2licit 1trin0 (con!t 1trin0$); .. 9on!tructor de co2iere 1trin0 (con!t c#ar8); .. 9on!tructor de conver!ie 1trin0$ o2erator=(con!t 1trin0$); .. T2erator de atri)uire [1trin0 (); .. De!tructor int Jen0t# (); .. Jun0imea !irului void Orint (); .. ?i2are!te !irul /; 1trin0::1trin0 () { !=ne" c#ar; !;-<=-; / 1trin0::1trin0 (con!t 1trin0$ 1) { !=ne" c#ar;1.Jen0t#( ) 1<;!trc2N(!,1.!);/ 1trin0::1trin0 (con!t c#ar8 1) { !=ne" c#ar; !trlen(1) 1<;!trc2N(!,1); / 1trin0$ 1trin0::o2erator=(con!t 1trin0$ 1) { if (!3=1.!) {delete ;<!; !=ne" c#ar;1.Jen0t#() 1<; !trc2N(!,1.!);/ return 8t#i!;/ 1trin0::[1trin0 () { delete ;<!;/ int 1trin0::Jen0t# () { return !trlen(!); / void 1trin0::Orint () { cout << ! << endl; / void main () { clr!cr(); 1trin0 Wid; Wid.Orint (); 1trin0 Oro2 (" 9on!tructori 2entru cla!a 1trin0."); Oro2.Orint(); 1trin0 Rand(Oro2); Rand.Orint(); 1trin0 Rind=Rand; Rind.Orint(); 0etc#e(); /

04&04&@4

M$

C+

PO

Antetul unui constructor al unei lase e on!ine a date membru obiecte alte altor lase este de forma1 Clas 9/ist"par"formali: ; 0biect19/ist"par"formali1:<...<0biectn9/ist"par"formalin: >xemplu1
Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>; cla!! O%D { float =,N,z; 2u)lic: O%D () {==-;N=-;z=-;/ O%D (float =-, float N-, float z-) {===-;N=N-;z=z-;/ void ?i2(){ cout <<"O("<<=<<","<<N<<","<<z<<")"<<endl; / /; cla!! 9erc { O%D =HNHr; 2u)lic: 9erc () { /; 9erc (O%D 9) { =HNHr=9; / 9erc (con!t 9erc $ 9-) { =HNHr = 9-.=HNHr; / void ?i2(){ cout << " 9erc "; =HNHr.?i2();/ /;

0erc (float !H, float yH, float IH) 6 !_y_r(!H,yH,IH) { }

void main (void) { 9erc T; T.?i2(); 0erc 0(9,F,A); 9.?i2(); O%D O(1,2,%); O.?i2(); 9erc D(O); D.?i2(); 9erc L(D); L.?i2(); /

0etc#();

77 Constructor implicit 331 49@,@,@: 77 Constructor pentru obiect 331 77 Constructor 331 77 Constructor Cerc 77 Constructor de copiere

!estructorii reali*ea* automat dealo area obie telor globale la sf)ritul programului, iar a elor lo ale la sf)ritul fun !iei& Obie tele alo ate dinami . u ne)/ se ,or dealo a u operatorul delete& bumele destru torului este ompus din ara terul ? urmat de numele lasei . ? Cl as 9 : /& Uestru torii nu returnea* o ,aloare& >xemplu1
Einclude <io!tream.#>; cla!! 9erc { float =,N,r; 2u)lic: 9erc (float =-, float N-, float r-) {cout << ":locare ..." << endl; ===-;N=N-;r=r-;/ L0erc () {cout << "Dealocare..." << endl; / void ?i2 () {cout << " 9("<<=<<","<<N<<","<<r<<")" << endl; / /; void main (void) { 9erc 9(1,2,%); 9.?i2(); /

77 /e+ultatele afi"ateF
>locare ,,, 0(*,7,8) .ealocare,,,

04&04&@4

O0

C+

PO
are a !ionea*

7n exemplul urmtor se poate urmrii momentul 4n destru orul1

onstru torul i

7 7 4biecte alocate dinamic 9 operatorul d e l e t e :


Einclude <!trin0.#>; Einclude <io!tream.#>;

cla!!

Natural { 2u)lic:

c#ar8 Numar; Natural (c#ar8 Nr); [Natural (); /;

Natural::Natural(c#ar8 Nr) { Numar = ne+ c#ar;!trlen(Nr) 1<; !trc2N(Numar,Nr); cout << " 9on!tr.T). ..." << Numar << endl; / Natural::[Natural() { cout << " ... Di!tr.T). " << Numar << endl; delete Numar; / void f(Natural =) { cout << " ... f(=) ... " << endl; / Natural =("12%"); void main (void) { cout << "81tart8" << endl; Natural N("+7,"); f("C'("); cout << "81to28" << endl; /
0onstr,-b, ,,,*78 *2tart* 0onstr,-b, ,,,9FA 0onstr,-b, ,,,?MN ,,, f(!) ,,, ,,, .istr,-b, ?MN *2top* ,,, .istr,-b, 9FA ,,, .istr,-b, *78

77 /e+ultatele afi"ateF

04&04&@4

O@

C+

PO

1F. Specificarea claselor @ /imbaAul +2/9Enified 'odeling %anguage:


KV, spe ifi entit'ile . lasele/ dintrBun program i rela'iile dintre ele astfel1 Specificarea entit'ilor 1 numele lasei, date membru B protec'ie nume"dat ; tip fun !ii membru B protec'ie nume"func'ie 9tip par)formali: ; tip"func'ie . protec'ie poate fi N .pri,ate/, [ .prote ted/ sau I .publi / /& numele claseidate membrufunc'ii membru >xemplu1 Pun tB x 1 float B T 1 float+ Pun t . / + Pun t .Pun tV/ +\Pun t . /

Specificarea rela'iilor dintre clase 1 rela!ia de aso iere 1 rela!ia de deri,are 1 55 prietenie 55 mo"tenire

3unctB x 1 float B T 1 float+ Pun t . / + Pun t .Pun tV/ +\Pun t . /

3ersoanB bume 1 0tring+ Persoan . / + Persoan .Persoan V/ +\Persoan . /

SegmentB P 1 3unct B B 1 3unct+ 0egment . / + 0egment .0egmentV/


+\0egment . /

StudentB +a ultate1 0tring B Varst 1 int+ 0tudent ./ + 0tudent .0tudent V/ +\0tudent . /

04&04&@4

O2

C+

PO

BC) #unc'ii <i Clase Prietene D#riendE


O funcie este prieten u o las da are a es la datele membru pri,ate ale a elei lase& O fun !ie prieten poate fi o fun !ie global sau 8iar o fun !ie membru a altei lase& O clas este prieten u o alt las da ea are a es la datele membru ale a esteia& O funcie< respe ti, o clas prieten se de lar utili*)nd u,)ntul friend astfel1 friend %ip"func'ie 6ume"func'ie 9 %ist!parametri!formali :@ 55 uncie friend global b/ friend %ip"func'ie 6ume"clas;;6ume"func'ie9%ist!par*!formali:@ 55 uncie friend membru / friend 6ume"clas@ 55 Clas friend
a/

-rmtorul exemplu, nu este ore t, deoare e elementul C&S nu este a esibil1


E include <mat#.#> Einclude <io!tream.#>

55 uncie friend membru

cla!! Punct {
2u)lic:
/;

float !,y;

BB pri1ate6
Ounct ( ) { == -, N= -; / Ounct (float =-, float N-) { ===-, N=N-; /

cla!! 0erc

2u)lic:

Punct 9;

9erc (Ounct T, float raza) { 9=T, r=raza;/

float r;

/;

int /aie-!() { return fabs(0,y)<r; } BBinaccesibil

void main () { Ounct 9(1-,1-);

9erc c(9,+); if (c,/aie-!()) cout << " 9ercul c inter!ecteaza a=a T= "; el!e cout << " 9ercul c nu inter!ecteaza a=a T= ";
.. !ecret "orld

O solu!ie pentru a re*ol,a a east problem, ar putea fi de lararea fun !iei membru %aie0x a fun !ie prieten a lasei 3unct& P east modifi are nu este sufi ient deoare e lasa Cerc nu a fost 4n .de(aI/ definit, de i a easta trebuie mai 4nt)i de larat, iar pentru a easta refer lasa 3unct ,om de lara .pur i/ simplu lasa 3unct pentru a putea referi centrul cercului a pointer la 3unct& Pentru y nu este dat membru pentru er , fun !ia /aie-! nu poate fi definit imediat, i doar ulterior, dup de lararea omplet a lasei 3unct&
E include <mat#.#> Einclude <io!tream.#>

88

u n c i e f r i e n d me m b r u

cla!! Punct; cla!! 0erc { 2u)lic:


/;

Punct* 0; float r; 9erc (Ounct T, float raza) { *0=T; r=raza;/ int /aie-!(); float =,N;
Ounct ( ) { == -, N= -; / Ounct (float =-, float N-) { ===-, N=N-; /

cla!! Punct {
2u)lic:
/;

friend int Cerc 66/aie-!();

int Cerc66/aie-!() { return fabs(0);y)<r; }


void main () { Ounct 9(1-,1-); 9erc c(9,1+); if (c.?aieT=()) cout << " 9ercul c inter!ecteaza a=a T= "; el!e cout << " 9ercul c nu inter!ecteaza a=a T= "; /

04&04&@4

OA

C+

PO
.. #unctie globala friend BB

>xemple1
E E E E E include include include include define <do!.#> <conio.#> <0ra2#ic!.#> <io!tream.#> 9ale "c:BB>orland9BB>0i"

cla!! Krafic { int Kd, Km; 2u)lic: Krafic(int 0d) { Kd=0d; init0ra2#($Kd,$Km,9ale);/ [Krafic( ) { clo!e0ra2#(); / /; class Punct { int =, N; 2u)lic: Ounct (int =-=-,int N-=-) { ===-; N=N-; 2ut2i=el(=,N,= N);/ Ounct (Ounct$ O) { ==O.=; N=O.N; / void @uta () { moveto(=,N); / void ?ra0 () { lineto(=,N); / [Ounct () { / friend Ounct @i loc(Ounct,Ounct); BB Functii 3lobale friend Ounct >fin (Ounct,Ounct,float); BB friend /; Ounct @i loc (Ounct :, Ounct >) { Ounct @ (int((:.= >.=).2), int((:.N >.N).2)); return @; / Ounct >fin (Ounct :, Ounct >,float t) { Ounct @ (int((16t)8:.= t8>.= -.7), int((16t)8:.N t8>.N -.7)); return @; / class Segment{Ounct :, >; .. 9a2etele 1e0m. 2u)lic: 1e0ment ( ) : :(), >() { / 1e0ment (Ounct O, Ounct X) { :=O; >=X; :.@uta();>.?ra0(); / 1e0ment (1e0ment$ :>) { :=:>.:; >=:>.>; / [1e0ment () { :.@uta();>.?ra0(); / Ounct @iIloc! () { return @i loc(:,>);/ 55;;Mi(lo Ounct :fin! (float t) { return >fin(:,>,t);/ 55;;Mi(lo /; void main (void) { Krafic @od(DL?L9?); !et"ritemode(FTRHO5?); !et)*color(>J5L); Ounct8 : = ne" Ounct (%--,1--); .. : Ounct8 > = ne" Ounct (1--,%--); .. > Ounct8 9 = ne" Ounct (7--,%--); .. 9 1e0ment8 :> = ne" 1e0ment (8:,8>); .. :> 1e0ment8 >9 = ne" 1e0ment (8>,89); .. >9 1e0ment8 9: = ne" 1e0ment (89,8:); .. 9: for (float :lfa=-; :lfa<1; :lfa =-.-1) { Ounct8 O=ne" Ounct(:>6>:fin!(:lfa)); Ounct8 X=ne" Ounct(9:6>:fin!(:lfa)); 1e0ment8OX = ne" 1e0ment (8O,8X); OX6>@iIloc!(); delaN(22); .. ;Ounct @=< delete OX; delete O; delete X; / delete :>; delete :; delete >; 0etc#e(); delete >9; delete 9:; /

04&04&@4

O4

C+

PO
.. #unctie membru friend BB

E E E E E E

include include include include include define

<do!.#> <mat#.#> <conio.#> <0ra2#ic!.#> <io!tream.#> 9ale "c:BB>orland9BB>0i"

float 1Dr (int =) int 1Drt (float =) cla!! Krafic { int Kd, 2u)lic: /;

{ return float(=)8=; / { return ceil (!Drt(=) -.7); / Km; Krafic(int 0d) { Kd=0d; init0ra2#($Kd,$Km,9ale); !et)*color(>J5L); / [Krafic( ) { 0etc#e(); clo!e0ra2#(); /

class Punct; class 2e3$ent{Punct *>, *J; 2u)lic: 1e0ment 1e0ment 1e0ment [1e0ment Punct @i loc }; class Punct { int =, N; 2u)lic: Ounct Ounct @uta ?ra0 [Ounct friend Punct void void

.. 9a2etele 1e0m. ( ) : :(), >() { / (Ounct8,Ounct8); (1e0ment$); (); (); (int =-=-,int N-=-) { ===-; N=N-; 2ut2i=el(=,N,= N);/ (Ounct$ O) { ==O.=; N=O.N; / () { moveto(=,N); / () { lineto(=,N); / () { / 2e3$ent66@i loc();

/; 1e0ment:: 1e0ment (Ounct 8O, Ounct 8X) { :=O; >=X; :6>@uta(); >6>?ra0(); / 1e0ment:: 1e0ment (1e0ment$ :>) { :=:>.:; >=:>.>; / 1e0ment::[1e0ment ( ) { :6>@uta(); >6>?ra0(); / Punct 2e3$ent66@i loc() { Punct @ ( int((>);!:J);!)B7), int((>);y:J);y)B7)); return @; } void main (void) { Krafic @od(DL?L9?); !et"ritemode(FTRHO5?); int Jun0=+--; Ounct8 T = ne" Ounct; .. Tri0inea Ounct8 F = ne" Ounct(Jun0); Ounct8 Y = ne" Ounct(-,Jun0); 1e0ment8 TF = ne" 1e0ment(T,F); .. :=a T=; 1e0ment8 TY = ne" 1e0ment(T,Y); .. :=a T=; for (int ==1; =<Jun0; = ) { Ounct8 O = ne" Ounct (=); Ounct8 X = ne" Ounct (-,1Drt(1Dr(Jun0)61Dr(=))); 1e0ment8 OX = ne" 1e0ment(O,X); PC);@i loc(); delaN((); delete OX; delete O; delete X; / 0etc#e(); delete TF; delete TY; delete T; delete F; delete Y; /

04&04&@4

O%

C+

PO
..
E include <conio.#>

E include <do!.#> E include <mat#.#> E define 9ale "c:BB>orland9BB>0i"

Clasa friend

E include <0ra2#ic!.#>

E include <io!tream.#>

BB

!truct 2alettetN2e 2al;

cla!! Krafic { int Kd, Km; 0et2alette($2al); /

float Oi=%.1+1,, :lfa;

2u)lic: Krafic(int 0d) { Kd=0d; init0ra2#($Kd,$Km,9ale); { 0etc#e(); clo!e0ra2#(); /

2u)lic: Ounct (float =-=-,float N-=-) { ==int(=-);N=int(N-); / Ounct (float =-,float {==int(=- -.7);N=int(N- -.7);2ut2i=el(=,N,c);/ Ounct (Ounct$ O) { ==O.=; N=O.N; / void @uta () { moveto(=,N); / void ?ra0 () { lineto(=,N); / [Ounct () { /

class Punct { int

/;

[Krafic( )

=, N;

N-,int

c)

friend 2e3$ent; friend 0erc; friend /riun3(i; /; class 2e3$ent{Punct :, >; int 9ul;

friend /riun3(i; /; Punct 2e3$ent66@i loc () { Punct @(int((>,!:J,!)B7),int((>,y:J,y)B7)); return @;} class 0erc { int =, N, r;
2u)lic: 9erc (int =-=-,int N-=-,int r-){ ===-;N=N-;r=r-; circle(=,N,r);/ 9erc (Ounct O, int r-) { ==O.=; N=O.N; r=r-; circle(=,N,r);/ 9erc (9erc$ 9) { ==9.=; N=9.N; r=9.r; / Ounct Oe9erc(float a){ Ounct @(= r8co!(a),N6r8!in(a)); return @;/ [9erc () { .8circle(=,N,r);8. /

2u)lic: 1e0ment ( ) : :(), >() { / 1e0ment (Ounct O, Ounct X){ 9ul=0etcolor();!etcolor (9ul); :=O; >=X; :.@uta();>.?ra0(); / 1e0ment (1e0ment$ :>) { :=:>.:; >=:>.>; / [1e0ment () { !etcolor(9ul);:.@uta();>.?ra0(); / Ounct @iIloc ();

.. 9a2etele 1e0m.

/; class /riun3(i { Ounct :, >, 9;

2u)lic: ?riun0#i ( ) : :(), >(), 9() { / ?riun0#i (Ounct,Ounct,Ounct); ?riun0#i (?riun0#i$ :>9) { :=:>9.:; >=:>9.>; 9=:>9.9;/ [?riun0#i (){/

.. Warfuri

Punct 0entruKr(){ Punct K((>,!:J,!:0,!)B8,(>,y:J,y:0,y)B8,*F); return K; } { :=O; >=X; 9=R; 1e0ment >9(>,9); 1e0ment 9:(9,:); ::O(:,>9.@iIloc()); 99O(9,:>.@iIloc());
0 ) -, 9f); ,,%69f,-); 9f, ,%); 9f, 9f);

/; ?riun0#i::?riun0#i(Ounct O,Ounct X,Ounct R) !etcolor(YLJJTU); 1e0ment :>(:,>); !etcolor(JMKV?>J5L); 1e0ment 1e0ment >>O(>,9:.@iIloc());1e0ment
int 9f=int((Oi6fa)!(:lfa6Oi)).Oi8,%); .. !etr0)2alette(2al.color!;>J5L<, !etr0)2alette(2al.color!;YLJJTU<, !etr0)2alette(2al.color!;JMKV?>J5L<, !etr0)2alette(2al.color!;UVM?L<, delaN(int(2o"((fa)!(:lfa6Oi) -.%)8Oi,2)));

void
{

main (void)

r -, ,% -, 9f, /

Ounct T(%--,27-); 9erc c(T,2--); .. centru, cerc float u:=Oi.2, u>=Oi Oi.,, u9=6Oi.+; for (:lfa=-; :lfa<28Oi; :lfa =-.-1) { ?riun0#i :>9(c.Oe9erc(:lfa u:),c.Oe9erc(:lfa u>),c.Oe9erc(:lfa u9)); :>9.9entruKr(); /

Krafic @od(DL?L9?); !et"ritemode(FTRHO5?); !et)*color(>J5L);

04&04&@4

OM

C+

PO

2-. 2 e m b r i s t a t i c i D S t a t i c E

11 ^ ;

+ie are obie t dintrBo las de!ine toate datele membru .atributele/ a esteia& >xist 4ns posibilitatea a toate instan!ele unei lase s de!in anumite atribute comune tuturor obie telor lasei respe ti,e& P eti membri .date, fun !ii/ statici au a elai regim de prote !ie a i eilal!i membrii&

2-.1. ,tribute D!ate membruE Statice

11 ^ ;

!atele membru statice, are urmea* s fie utili*ate de tre toate obie tele lasei, se definesc prin spe ifi atorul static astfel1 class Nume!clas B A? !atele membru statice, se declar .se iniiali+ea+/ e.plicit 4n afara lasei1 $ip!dat!membru Nume!clas ;; Dat!membru C L Valaore D? *eferirea .utili+area/ datelor membru statice se poate fa e astfel1 I 6ume"clas ;; !at"membru I 55 /eferire natural 9global: la clas b/ I 4biect Dat!membru I 55 /eferire particular la un obiect / I Pointer!4biect QDat!membru I 55 /eferire particular prin pointer
a/

\ static F

%ist!Declaraii!date!membru ?

77 ^ ;

7n urmtorul exemplu, se numr )te Puncte sunt utli*ate la un moment dat 4n program, utili*)nd a dat omun pentru toate pun tele .4ntreaga las/ 'r_-b1 55 Membru Static
E include <conio.#> E include <io!tream.#>

class Punct { 2u)lic:

float

=, N; { ==-; N=-; 'r_-b::; { t#i!6>===; t#i!6>N=N; 'r_-b::; { ==O.=; N=O.N;'r_-b::; { 'r_-b)); / / / / 88 ^; 88 se iniiali+ea+

Ounct () Ounct (float =,float N) Ounct (Ounct$ O) [Ounct () static }; int Punct66'r_-b=H; int 'r_-b;

04&04&@4

OO

C+

PO
clr!cr();

void main (void) { Ounct :,>; cout << "Mnitial:" << Punct66'r_-b << endl; for (int i=1; i<=7; i ) { Ounct @(i,i); Ounct X(@); cout << "i>> "<<i<<":"<< Punct66'r_-b <<endl; if (i42==-) { Ounct8 N=ne" Ounct(i,i); Ounct R(8N); cout <<"i<<"<<i<<":"<< Punct66'r_-b <<endl; cout <<"i<<"<<i<<":"<< R .NrHT) <<endl; cout <<"i<<"<<i<<":"<< N6>NrHT) <<endl; delete N; / cout << "i..." <<i<< ":"<< Punct66'r_-b <<endl; / cout << "Ginal..." << Punct66'r_-b << endl; /

.. 9l::1tatic. .. T) .1tatic3 .. T)6>1tatic3

0etc#e();

7n exemplul urmtor, sunt utili*a!i membri statici a,b,c,d pentru a memora domeniul minim are on!ine toate pun tele urbei .definite parametri / are se desenea*1
E include <mat#.#> E include <conio.#> E include <0ra2#ic!.#> E define 9ale "c:BB>orland9BB>0i" cla!! Krafic { int Kd, Km; 2u)lic: Krafic(int 0d) { Kd=0d; init0ra2#($Kd,$Km,9ale); !et)*color(>J5L);/ [Krafic( ) { 0etc#e(); clo!e0ra2#();/ /; int u (float); int v (float);

55 Membri Statici

cla!! Ounct { float =, N; 2u)lic: Ounct () { ==-; N=-; / void :tri) (float =,float N) { t#i!6>===; if if t#i!6>N=N; if if
void void Ounct @uta ?ra0 [Ounct (Ounct$ O) { ==O.=; N=O.N; / () { moveto(u(=),v(N)); / () { lineto(u(=),v(N)); / () { /

(=<a) (=>b) (N<c) (N>d)

a==; el!e b==; c=N; el!e d=N; /

static float a,b, c,d; 11 #ereastra *eal /; float Punct66a, Punct66d, Punct66b, Punct66c; 11 #ereastra *eal int u1=11-, v1=2-, u2=7--, v2=+%-; 77 Fereastra 2cran int u (float =) { return ((=6Punct66a).(Punct66b)Punct66a)8(u26u1) u1); / int v (float N) { return ((N6Punct66d).(Punct66c)Punct66d)8(v26v1) v1); /
float = (float t) float N (float t)

void main (void) { int i,n=1---; float Oi=%.1+17%; Krafic @od(DL?L9?); Ounct O;1--1<; Punct66b=Punct66a=!(H); Punct66d=Punct66c=y(H); for (i=-; i<=n; i ) { float :lfa=28Oi8i.n; O;i<.:tri)(=(:lfa),N(:lfa));/ O;-<.@uta(); !etcolor(UVM?L); for (i=1; i<=n; i ) O;i<.?ra0(); /

{ return co!(28t)8co!(t); / { return co!(+8t)8!in(t); /

// x(t) // y(t)

04&04&@4

ON

C+

PO

2-.2. 2etode D#unc'ii membruE Statice

11 ^ ;

2etodele D#unc'iile membruE statice, a !ionea* doar asupra atributelor statice .ale claselor/, de i nu pot a !iona asupra atributelor obie tului urent .deoare e nu li se transmite poinetrul t(is/& Ue asemenea ele pot apela doar metodele stati e& Pot 4ns a !iona asupra atributelor unui anumit obie t prin operatorii sau Q& 2etodele statice, se definesc prin spe ifi atorul static astfel1 class Nume!clas B \ static %ip"func'ie 6ume"func'ie 9 %ist!par!formali : \ 77 ^ ; F A? *eferirea .utili+area/ metodelor statice se fa e astfel1 a/ I 6ume"clas ;; #unc'ie"membru 9%ist!par!actuali:I 55 /eferire natural la clas b/ I 4biect #unc'ie"membru 9%ist!par!actuali : I 55 /eferire la un obiect / I Pointer!4biect Q #unc'ie"membru 9%ist!par!actuali:I 55 /eferire prin pointer 7n urmtorul exemplu, se determin fereastra real .definit prin ele dou pun te diagonal opuse 2t_2us, .r_Oos/ utili*)nd fun !iile stati e @inX, @a!X, @inP, @a!P pentru a determina domeniul minimal are in lude pun tele din grafi &
E include <mat#.#> E include <conio.#> E define 9ale "c:BB>orland9BB>0i" cla!! Krafic { int Kd, Km; 2u)lic: Krafic(int 0d) { Kd=0d; init0ra2#($Kd,$Km,9ale); !et)*color(>J5L);/ [Krafic( ) { 0etc#e(); clo!e0ra2#();/ /; int u (float); int v (float); cla!! Ounct { float =, N; 2u)lic: Ounct () { ==-; N=-; /

55 +un !ii Statice

E include <0ra2#ic!.#>

void

:tri) (float =,float N){ t(is);!=!; if (!<@inX()) 2t_2us,!=!; el!e if (!;@a!X()) .r_Oos,!=!; t(is);y=y; if (y<@inP()) .r_Oos,y=y; el!e if (y;@a!P()) 2t_2us,y=y; /
Ounct (Ounct$ O) @uta () ?ra0 () [Ounct () { / { ==O.=; N=O.N; / { moveto(u(=),v(N)); / { lineto(u(=),v(N)); /

void void

/; Punct Punct662t_2us, Punct66.r_Oos;


int u1=11-, v1=2-, float = (float t) float N (float t) u2=7--, v2=+%-;

static static static static static

Punct float float float float

2t_2us, .r_Oos; @inX() { return @a!X() { return @inP() { return @a!P() { return

2t_2us,!; .r_Oos,!; .r_Oos,y; 2t_2us,y;

} } } }

BB BB BB BB

@etodQ @etodQ @etodQ @etodQ

BB Fereastra 4eala 2taticQ 2taticQ 2taticQ 2taticQ BB Fereastra 4eala


.. Gerea!tra Lcran

int u (float =) { return ((=6Punct66@inX())B(Punct66@a!X())Punct66@inX())8(u26u1) u1); / int v (float N) { return ((N6Punct66@a!P())B(Punct66@inP())Punct66@a!P())*(v26v1) v1); /
void main (void) { int i,n=1---; Ounct O;1--1<;
{ return co!(28t)8co!(t); /.. =(t) { return co!(+8t)8!in(t); /.. N(t)

Punct662t_2us=Punct66.r_Oos=P[H]; for (i=1; i<=n; i ) { float :lfa=28Oi8i.n; O;i<.:tri)(=(:lfa),N(:lfa));/ O;-<.@uta(); !etcolor(UVM?L); for (i=1; i<=n; i ) O;i<.?ra0();

float Oi=%.1+17%; O;-<.:tri)(=(-),N(-));

Krafic @od(DL?L9?);

GB) Pointeri la 2etode


O metod a unei lase poate fi referit .apelat/ i printrBun pointer la ea&

04&04&@4

O$

C+

PO
!efinirea unui pointer la o metod se poate fa e astfel1 %ip"func'ie 96ume"clas ;; 66ume"Pointer : 9 %ist!par!formali :

77 sau cu t6pedef

Ini'ializarea unui pointer la o metod se poate reali*a astfel1 6ume"Pointer L ( 6ume"clas ;; 6ume"2etod@
77 se pot reali+a "i la definire

*eferirea unui pointer la o metod .apelarea metodei/ 1

\ 96ume"0biect . 66ume"Pointer : 9 %ist!par!actuali : \

Ue exemplu, pentru programul anterior, modifi rile ne esare pentru a putea apela ele dou metode @uta i /ra3 ale lase Punct pot fi urmtoarele1
\

55 Pointeri la metode
=, N; :tri) \
Ounct (Ounct$ O) {\ / 2u)lic: Ounct () { \ /

cla!! Punct { float void

1oid 1oid

[Ounct () { / !tatic Ounct 1tH1u!, DrH]o!; !tatic float @inF() { return 1tH1u!.=; / \

@uta () /ra3 ()

{ $o1eto(u(!),1(y)); } { lineto(u(!),1(y)); }

.. @etod^ 1tatic^

/; R void main (void) { \

typedef 1oid (Punct 66 *P_@et)(); P_@et P$[7] = {5Punct66@uta,5Punct66/ra3};

// e!inire // Ini"iali#are // e!%Ini // &'el (uta // &'el Trag

// sau$ // 1oid (Punct 66 *P$[7])() = {5Punct66@uta,5Punct66/ra3}; (P[H],*P$[H])(); setcolor(ST%/#); for (i=*; i<=n; i::) (P[i],*P$[*])();
/

04&04&@4

N0

C+

PO

-n alt exemplu, are utili*ea* pointeri la metode . %riun, !rept i *omb/ este urmtorul1
E include <mat#.#> E include <conio.#> E include <0ra2#ic!.#> E define 9ale "c:BB>orland9BB>0i" cla!! Krafic { int Kd, Km; 2u)lic: Krafic(int 0d) { Kd=0d; init0ra2#($Kd,$Km,9ale); !et)*color(>J5L);/ [Krafic( ) { 0etc#e(); clo!e0ra2#();/ /; int u (float); int v (float);

55 Pointeri la 72etode

cla!! Ounct { float =, N; 2u)lic: Ounct () { ==-; N=-; / void :tri) (float =,float N) { t#i!6>===; if (=<@inF()) 1tH1u!.===; el!e if (=>@a=F()) DrH]o!.===; t#i!6>N=N; if (N<@inY()) DrH]o!.N=N; el!e if (N>@a=Y()) 1tH1u!.N=N; / Ounct (Ounct$ O) { ==O.=; N=O.N; /

void void void void

@uta () /riun () .rept ()

4o$b ()
() { / 1tH1u!, DrH]o!; @inF() { return @a=F() { return @inY() { return @a=Y() { return

/; Ounct Ounct::1tH1u!, Ounct::DrH]o!; .. Gerea!tra Reala int u1=11-, v1=2-, u2=7--, v2=+%-; .. Gerea!tra Lcran int u (float =) { return ((=6Ounct::@inF()).(Ounct::@a=F()6Ounct::@inF())8(u26u1) u1); / int v (float N) { return ((N6Ounct::@a=Y()).(Ounct::@inY()6Ounct::@a=Y())8(v26v1) v1); / float =- (float t) { return co!(+8t)8co!(t); / .. =(t) float N- (float t) { return co!(28t)8!in(t); / .. N(t) float =1 (float t) { return co!(28t)8co!(t); / .. =(t) float N1 (float t) { return co!(+8t)8!in(t); / .. N(t) float =2 (float t) { return co!(t); / .. =(t) float N2 (float t) { return !in(t); / .. N(t)

[Ounct !tatic Ounct !tatic float !tatic float !tatic float !tatic float

{ moveto(u(=),v(N)); / { !etcolor(UVM?L); @uta(); moverel(-,6%); linerel(62,7); linerel(+,-); linerel(62,67);/ { !etcolor(JMKV?RLD); @uta(); moverel(62,62); linerel(-,+); linerel(+,-); linerel(-,6+);linerel(6+,-);/ { !etcolor(YLJJTU); @uta(); moverel(-,6%); linerel(62,%); linerel(2,%); linerel(2,6%);linerel(62,6%);/
1tH1u!.=; DrH]o!.=; DrH]o!.N; 1tH1u!.N; / / / / .. Gerea!tra Reala

void main (void) { int i,I, n=%--; float Oi=%.1+17%; Krafic @od(DL?L9?); Ounct O;%<;%-1<; tN2edef float (8Gunctie)(float); Gunctie =;%<={$=-,$=1,$=2/ ,N;%<={$N-,$N1,$N2/; for (I=-; I<=2; I ) O;I<;-<.:tri)((8=;I<)(-),(8N;I<)(-)); Ounct::1tH1u!=Ounct::DrH]o!=O;-<;-<; for (I=-; I<=2; I ) for (i=-; i<=n; i ) { float :lfa=28Oi8i.n; O;I<;i<.:tri)((8=;I<)(:lfa),(8N;I<)(:lfa)); / 1oid (Punct66*.esen[8])()={5Punct66/riun,5Punct66.rept,5Punct664o$b}; for (I=-; I<=2; I ) for (i=-; i<=n; i ) (P[ ][i],*.esen[ ])(); / .. @ummer! Dance

04&04&@4

N@

C+

PO

GG) Supra9ncrcarea operatorilor


Pnumite opera!ii se pot exprima mult mai bine prin operatori& bu se pot defini operatori noi, dar se pot supra4n r a ei existen!i . I< M< II< IL< Q< C D< 9 :< new< delete< j, mai pu!in operatorii
6,

;; , 4; /, fr a modifi a 4ns aritatea, prioritatea sau

aso iati,itatea& Supra9ncrcarea se poate fa e u1 a/ func'ii membru B numrul parametrilor fiind egal u aritatea operatorului minus unu, deoare e un operand este 8iar obie tul urent pentru are se apelea* metoda .a esta put)nd fi referit prin pointerul this/, b/ func'ii prietene B numrul parametrilor fiind egal u aritatea operatorului& *edefinirea unui operator se reali*ea* printrBo fun !ie .prieten sau membru/ al rei nume este ompus din u,)ntul operator urmat de operatorul propriu*is .I< M< \/ & >xemplu1
E include <9onio.#> E include <1trin0.#>

..

0p erat ori de c on c at en are H (

BB
E include <Mo!tream.#>

cla!! 1trin0 { c#ar8 !; 2u)lic: 1trin0 (); 1trin0 (con!t 1trin0$); 1trin0 (con!t c#ar8); 2trin35 operator=(const 2trin35);

.. .. .. BB

9on!tructor 9on!tructor 9on!tructor -perator de

im2licit de co2iere de conver!ie atribuire

friend

2trin3 operator:(2trin35); 2trin3 operator5(2trin35,2trin35);

BB -perator : (concatenare) BB -perator 5 (concatenare)


.. De!tructor .. Jun0imea !irului .. ?i2are!te !irul

a: b:

[1trin0 (); int Jen0t# (); void Orint ();

/; 1trin0::1trin0 () { !=ne" c#ar; !;-<=-; / 1trin0::1trin0 (con!t 1trin0$ 1) { !=ne" c#ar;1.Jen0t#( ) 1<;!trc2N(!,1.!);/ 1trin0::1trin0 (con!t c#ar8 1) { !=ne" c#ar; !trlen(1) 1<;!trc2N(!,1); / 2trin35 2trin366operator=(const 2trin35 2) { if (!3=1.!) {delete ;<!; !=ne" c#ar;1.Jen0t#() 1<; !trc2N(!,1.!);/ return 8t#i!; / 2trin3 2trin366operator:(2trin35 2) BB func'ie membru a: { c#ar8 !1=ne" c#ar;t#i!6>Jen0t#() 1.Jen0t#() 1<; !trc2N(!1,!); !trc2N(!1 t#i!6>Jen0t#(),1.!); 1trin0 Rez(!1); delete !1; return Rez; / 1trin0::[1trin0 () { delete ;<!;/ int 1trin0::Jen0t# () { return !trlen(!); / 2trin3 operator5(2trin35 s,2trin35 2) BB func'ie prieten b: { c#ar8 !1=ne" c#ar;!.Jen0t#() 1.Jen0t#() 1<; !trc2N(!1,!.!); !trc2N(!1 !.Jen0t#(),1.!); 1trin0 Rez(!1); delete !1; return Rez; / void 1trin0::Orint () { cout << ! << endl; /
void main () { 1trin0 Nume("Oo2e!cu"), Orenume("Monel"); 1trin0 NumeHOrenume=Nume " " Orenume; NumeHOrenume.Orint(); 1trin0 OrenumeHNume=Orenume$" "$Nume; OrenumeHNume.Orint(); / clr!cr();

0etc#e();

04&04&@4

N2

C+

PO 22.1. Operatorul de asignare 9 atribuire : 0i ini'ializare 9L:

0peratorul de atribuire .L/ se poate utili*a i pentru obie te, a esta fiind supra4n r at impli it i reali*ea* copierea datelor membru& Ua 4ns datele membru sunt referin!e .pointeri/ la nite ,ariabile dinami e, atun i prin opiere se ,or ob!ine dou obie te are refer a eai *on de memorie, iar la dealo are se ,a elibera a eeai *on de dou ori, iar alta ni iodat, eea e ne oblig, 4n a east situa!ie, la redefinirea .supra4n r area/ a estui operator& Prin a easta, on!inutul ,ariabilelor dinami e sunt identi e, dar la adrese diferite, astfel 4n )t da un obie t 4i modifi ,alorile, ellalt obie t rm)ne nes 8imbat& Pentru o de lara!ie de tipul Clas 0biectI se ,a apela onstru torul impli it, sau el u to!i parametrii impli i!i, iar pentru o de lara!ie de forma Clas 0biect=0bI se ,a apela onstru torul de opiere .i nu operatorul de atribuire/ a i la o de lara!ie de forma Clas 0biectD0bEI & Constru torul de opiere se mai poate apela da parametrul unei fun !ii este un obie t sau da fun !ia returnea* un obie t& >xemplu1
..
E include <9onio.#> E include <1trin0.#> E include <Mo!tream.#>

C l asa 6u m ar 6at u ral

(Op.

= ) BB

cla!! Natural { c#ar8 !; int Jun0(un!i0ned lon0); 2u)lic: Natural ( ); Natural (con!t Natural$); Natural (un!i0ned lon0); 'atural5 operator= (const 'atural5); 'atural operator: (const 'atural5); 'atural operator) (const 'atural5); int int int int int int [Natural int Jen0t# void Mn2ut void Orint /; o2erator< (con!t o2erator<=(con!t o2erator> (con!t o2erator>=(con!t o2erator==(con!t o2erator3=(con!t (); (); (); (); Natural$); Natural$); Natural$); Natural$); Natural$); Natural$); .. 9on!tructor im2licit .. ... de co2iere .. ... de conver!ie BB -perator de atribuire BB -perator de adunare BB -perator de scadere .. .. .. .. .. .. .. .. .. .. ... ... ... ... ... ... relational ... ... ... ... ... < <= > >= == <>

De!tructor Numarul de cifre 9ite!te numar ?i2are!te numar

04&04&@4

NA

C+

PO

Natural::Natural ( ) { !=ne" c#ar;2<; !;-<=A-A; !;1<=-; / Natural::Natural (con!t Natural$ 1) { !=ne" c#ar;!trlen(1.!) 1<;!trc2N(!,1.!);/ Natural::Natural (un!i0ned lon0 1) { int n=Jun0(1); !=ne" c#ar;n 1<; !;n<=-; for(int i=n61;i>=-;i66) {!;i<=141- +'; 1.=1-;/ / 'atural5 'atural66operator = (const 'atural5 2) { if (sU=2,s) { delete []s; s=ne+ c(ar[strlen(2,s):*]; strcpy(s,2,s);} return *t(is; } c#ar8 1uma (con!t c#ar8, con!t c#ar8); 'atural 'atural66operator : (const 'atural5 2) { 'atural 2u$; 2u$,s=2u$a(s,2,s); return 2u$; } c#ar8 Dif(con!t c#ar8, con!t c#ar8); 'atural 'atural66operator ) (const 'atural5 2) { 'atural .; .,s=.if(s,2,s); return .; } int Natural::o2erator< (con!t Natural$ 1) { if (!trlen(!)<!trlen(1.!)) return 1; el!e if (!trlen(!)>!trlen(1.!)) return -; el!e return !trcm2(!,1.!)<-; / int Natural::o2erator<=(con!t Natural$ 1) { return 3(8t#i!>1); / int Natural::o2erator> (con!t Natural$ 1) { return 1< 8t#i!; / int Natural::o2erator>=(con!t Natural$ 1) { return 1<=8t#i!; / int Natural::o2erator==(con!t Natural$ 1) { return !trcm2(!,1.!)==-; / int Natural::o2erator3=(con!t Natural$ 1) { return !trcm2(!,1.!)3=-; / int Natural:: Jen0t# () { return !trlen(!); / void Natural:: Orint () { cout << ! << endl; / void Natural:: Mn2ut () { c#ar8 ==ne" c#ar;1--<; cin >> =; delete ;<!; !=ne" c#ar;!trlen(=) 1<; !trc2N(!,=); delete =; / Natural::[Natural() { delete ;<!; / int Natural::Jun0(un!i0ned lon0 n) { if (n<1-) return 1; el!e return Jun0(n.1-) 1;/ c#ar8 1uma (con!t c#ar8 a, con!t c#ar 8)) { int m=!trlen(a), n=!trlen()), i=m61, I=n61, t=-; if (m<n) return 1uma(),a); c#ar8 c=ne" c#ar;m 1<; c;m<=-; for ( ; i>=-; i66) { if (I>=-) c;i<=a;i< );I< t6+'; el!e c;i<=a;i< t; if(c;i<>A(A){ c;i<6=1-; t=1 ; / el!e t=-; I66; / if (3t) return c; c#ar8 d=ne" c#ar;m 2<; for (i=-,d;-<=A1A; i<=m; i ) d;i 1<=c;i<; delete ;<c; return d; / c#ar8 Dif (con!t c#ar8 a, con!t c#ar 8)) { int m=!trlen(a), n=!trlen()), i=m61, I=n61, t=-; c#ar8 c=ne" c#ar;m 1<; c;m<=-; for ( ; i>=-; i66) { if (I>=-) c;i<=a;i<6);I<6t +'; el!e c;i<=a;i<6t; if(c;i<<A-A){ c;i< =1-; t=1 ; / el!e t=-; I66; / c#ar 8d=c; "#ile((8d==A-A) $$ 8(d 1)) d ; !trc2N(c,d); return c; /

void main () { Natural a,); cout << " a : "; a.Mn2ut(); cout << " ) : "; ).Mn2ut(); cout << " a ) = "; (a )).Orint(); ; cout << "Pa6)P= "; if (a>=)) (a6)).Orint(); el!e ()6a).Orint(); /

clr!cr();

0etc#e();

04&04&@4

N4

C+

PO

22.2. Operatorii de atribuire IL < L < + L < 8L


P eti operatori .+G, G, 6G, 5G/ nu sunt supra4n r a!i automat, de i da dorim sBi utili*m ,a trebui s 4i redefinim .aa um se poate ,edea 4n exemplul urmtor supra4n r area operatorilor +G, G/& >xemplu1
..
E include <9onio.#> E include <1trin0.#>

C l asa 6u m ar 6at u ral

(Op.

:=, )= ) BB
E include <Mo!tream.#>

cla!! Natural { c#ar8 !;


int Jun0(un!i0ned lon0); 2u)lic: Natural Natural Natural Natural$ Natural Natural ( ); (con!t Natural$); (un!i0ned lon0); o2erator= (con!t Natural$); o2erator (con!t Natural$); o2erator6 (con!t Natural$); .. .. .. .. .. .. 9on!tructor im2licit ... de co2iere ... de conver!ie T2erator de atri)uire T2erator de adunare T2erator de !cadere BB ,,, de ad,5,atr, BB ,,, de sc,5,atr, .. ... relational < .. ... ... <= .. ... ... > .. ... ... >= .. ... ... == .. ... ... <> .. De!tructor .. Numarul de cifre .. ?i2are!te numar

'atural5 operator:=('atural5); 'atural5 operator)=('atural5);


int int int int int int [Natural int Jen0t# void Orint /; o2erator< (con!t o2erator<=(con!t o2erator> (con!t o2erator>=(con!t o2erator==(con!t o2erator3=(con!t (); (); (); Natural$); Natural$); Natural$); Natural$); Natural$); Natural$);

Natural::Natural ( ) { \ / Natural::Natural (con!t Natural$ 1) { \ / Natural::Natural (un!i0ned lon0 1) { \ / Natural$ Natural::o2erator= (con!t Natural$ 1){ \ / c#ar8 1uma (con!t c#ar8 a, con!t c#ar 8)) { \ / c#ar8 Dif (con!t c#ar8 a, con!t c#ar 8)) { \ /

Natural Natural::o2erator (con!t Natural$ 1){ Natural 1um; 1um.!=1uma(!,1.!); return 1um;/ Natural Natural::o2erator6 (con!t Natural$ 1){ Natural D; D.!=Dif(!,1.!); return D;/

'atural5 'atural66operator :=('atural5 2){return *t(is = *t(is : 2;} 'atural5 'atural66operator )=('atural5 2){return *t(is = *t(is ) 2;}
int Natural::o2erator< (con!t Natural$ int Natural::o2erator<=(con!t Natural$ int Natural::o2erator> (con!t Natural$ int Natural::o2erator>=(con!t Natural$ int Natural::o2erator==(con!t Natural$ int Natural::o2erator3=(con!t Natural$ int Natural:: Jen0t# () { \ / void Natural:: Orint () { \ / Natural::[Natural() { \ / int Natural::Jun0(un!i0ned lon0 n) { \ / 1) 1) 1) 1) 1) 1) { { { { { { \ \ \ \ \ \ / / / / / /

void main () { Natural a(127),)(1C7); "#ile (a3=)) if (a>)) a)=); el!e ))=a; if (a==1) cout << " Orime intre ele "; el!e { cout << "9mmdc="; a.Orint(); / /

clr!cr(); 0etc#e();
.

04&04&@4

N%

C+

PO 22.3. Operatorii de incrementare 9II: 0i decrementare 9 :

Continu)nd u exemplul anterior, dorim s supara4n r m operatorii de in rementare si de rementare, mai 4nt)i ei prefixa!i . IIx< x/, unde nu sunt probleme deosebite, apoi e postfixa!i .xII< x/& Pentru a supra4n r a i operatorii de in rementare postfi,ai ,om aduga )te o fun !ie membru a,)nd un parametru de tip int . are nu se ,a folosi, i are automat la un apel ,a lua ,aloarea *ero/& >xemplu1
E include <9onio.#> E include <1trin0.#> 2u)lic:

..

C l asa 6u m ar 6at u ral D0p ) HHx5 J J x5 xH H5 xJ JE BB


E include <Mo!tream.#> int Jun0(un!i0ned lon0); ( ); (con!t Natural$); (un!i0ned lon0); o2erator= (con!t Natural$); o2erator (con!t Natural$); o2erator6 (con!t Natural$); .. .. .. .. .. .. 9on!tructor ... de ... de T2erator de T2erator de T2erator de im2licit co2iere conver!ie atri)uire adunare !cadere

cla!! Natural { c#ar8 !;


Natural Natural Natural Natural$ Natural Natural

'atural5 'atural 'atural5 'atural

operator operator operator operator

::(); ::(int); ))(); ))(int);

BB BB BB BB

int o2erator < (con!t Natural$); [Natural (); int Jen0t# ();

,,, prefi!at incr ,,, postfi!at ,,, ,,, prefi!at decr ,,, postfi!at ,,, .. ... relational < .. De!tructor .. Numarul de cifre

o!tream$ ?i2 (o!tream$ 1); i!tream$ 9it (i!tream$ 1);


Natural::Natural ( ) { \ / Natural::Natural (con!t Natural$ 1) { \ / Natural::Natural (un!i0ned lon0 1) { \ / Natural$ Natural::o2erator= (con!t Natural$ 1){ \ \ Natural Natural::o2erator (con!t Natural$ 1) { \ Natural Natural::o2erator6(con!t Natural$ 1) { \ int Natural::o2erator< (con!t Natural$ 1) { \ Natural::[Natural() { \ /

.. cout << =\ .. cin >> =\

/;

/ / / / BB ::! BB ))! BB !:: BB !))

'atural5 'atural66operator::() { 'atural5 'atural66operator))() { 'atural 'atural66operator::(int){ 'atural 'atural66operator))(int){

return *t(is=*t(is:*; } return *t(is=*t(is)*; } 'atural !(*t(is); *t(is=*t(is:*; return !;} 'atural !(*t(is); *t(is=*t(is)*; return !;}

o!tream$ Natural::?i2 (o!tream$ 1) { 1 << !; return 1; / i!tream$ Natural::9it (i!tream$ 1) { c#ar8 ==ne" c#ar;27,<; 1>>=; delete;<!; !=ne" c#ar;!trlen(=) 1<; !trc2N(!,=); delete =; return 1; / o!tream$ o2erator << ( o!tream$ 1, Natural ! ) { return !.?i2(1); / i!tream$ o2erator >> ( i!tream$ 1, Natural$ ! ) { return !.9it(1); / void main () { Natural i, n=1--1, *; cout << " Jimita : "; cin >> *; for (i=1-1; i<n; i ) if (i<*) cout << i << endl; /

.. cout .. cin .. << .. >> clr!cr(); 0etc#e();

04&04&@4

NM

C+

PO

23. Con%ersii utili6ator


Con,ersiile sunt exe utate automat da 1 a/ operan*ii nu sunt de a elai tip .c(ar, enum int double, &&&, iar la atribuire se fa e on,ersia ,aloarii expresiei 4n tipul ,ariabilei/? b/ parametrul a tual nu are tipul parametrului formal .se fa e on,ersia primului/? / tipul ,alorii returnate de o fun !ie difer de tipul a esteia .se fa e on,ersia ,alorii/&

23.1. Con%ersii implicite


23.1.1. Con%ersia dintrPun tip predefint HntrPun tip abstract
Con,ersiile dintre un tip predefinit i un tip abstra t se pot reali*a printrBun constructor are s on!in un parametru a,)nd a el tip predefinit, iar eilal!i ,or fi ini!iali*a!i& >xemplu1 77 Numere raionaleF K
Einclude <!trin0.#>; Einclude <io!tream.#>; lon0 9mmdc(lon0, lon0); Einclude <conio.#>;

cla!! X { lon0 m, n; 55 m 5 n 2u)lic: C (lon3, lon3); 55 constructor implicit X$ o2erator [(); 55 operator de simplifi are friend C operator *(C, C); 55 fun tie prieten void ?i2(con!t c#ar8 @e!=""); 55 tiparire .mesa(/ /; inline C66C(lon3 p=H, lon3 V=* ) { $=p; n=V; } X$ X::o2erator [() { lon0 d=9mmdc(m,n); m.=d; n.=d; return 8t#i!; / C operator *(C r, C s) {return [X(r.m8!.m, r.n8!.n); / 55 friend inline void X::?i2 (con!t c#ar8 @e!) { if (n) cout << @e! << m << "." << n << endl; el!e cerr << " Numitor nul " ;/; lon0 9mmdc(lon0 a, lon0 )) { if ()) return 9mmdc(),a4)); el!e return a; /; void main () { clr!cr(); X =(%,2); =.?i2(" = : "); X N(2,(); N.?i2(" N : "); X z(2); z.?i2(" z : "); z==8N; z.?i2(" =8N = "); X "(2,1); ".?i2(" " : "); z==8"; z.?i2(" =8" = "); I=!*7; z.?i2(" =82 = "); I=7*!; z.?i2(" 28= = "); 0etc#(); /

77 / e + u l t a t e F
! y I !*y + !*+ !*7 7*! 6 6 6 = 6 = = = 8B7 7BN 7B* *B8 7B* 8B* 8B* 8B*

04&04&@4

NO

C+

PO

O alt ,ariant 4n are se e,it utili*area unei fun !ii prietene este de a defini o fun !ie membru .Produs/ are se ,a apela de tre fun !ia de supra4n r are a operatorului de 4nmul!ire& >xemplu1 77 Numere raionaleF K
Einclude <!trin0.#>; lon0 9mmdc(lon0, lon0); Einclude <io!tream.#>; Einclude <conio.#>;

cla!! X { lon0 m; lon0 n; 2u)lic: X (lon0, lon0);


X$ o2erator [();

X void /;

Produs (X);

?i2(con!t c#ar8 @e!="");

55 m 5 n 55 onstr& impli it 55 operator de simplifi are 55 Produs 55 tiparire .mesa(/

inline X::X(lon0 2=-, lon0 D=1 ) { m=2; n=D; / X$ X::o2erator [() { lon0 d=9mmdc(m,n); m.=d; n.=d; return 8t#i!; /

inline X X::Produs (X r) { return [X(m8r.m, n8r.n); / C operator *(C p, C V) { return 2.Produs(D); / 55 operator de inmultire
inline void X::?i2 (con!t c#ar8 @e!) { if (n) cout << @e! << m << "." << n << endl; el!e cerr << " Numitor nul " ;/; lon0 9mmdc(lon0 a, lon0 )) { if ()) return 9mmdc(),a4)); el!e return a; /;

void main () { X =(%,2); X N(2,(); X z(+,2); X "; "==8N; "==8z; +=!*7; +=7*!; /

clr!cr();

=.?i2(" N.?i2(" z.?i2(" ".?i2(" ".?i2(" ".?i2(" ".?i2("

= : "); N : "); z : "); =8N= =8z= =82= 28== "); "); "); ");

0etc#();

77 / e + u l t a t e F
! 6 y 6 I 6 !*y= !*I= !*7= 7*!= 8B7 7BN 9B7 *B8 8B* 8B* 8B*

23.1.2. Con%ersia dintrPun tip abstract HntrPun alt tip abstract


O alt problem pe are o ,om aborda 4n ele e urmea* este de a reali*a o on,ersie dintrBun tip abstra t 4n altul& Pentru a easta ,om defini un constructor pentru reali*area on,ersiei dorite& 7n programul urmtor am definit tipul omplex 4n ele dou forme1 a/ algebric B lasa C, b/ trigonometric .polar/ B lasa '& Con,ersia reali*at fa e tre erea din forma b/ 4n forma a/& Pentru a putea ,erifi a re*ultatele, se utili*ea* i tipul complex predefinit&

04&04&@4

NN

C+

PO
77 Numere comple,eF %C
Einclude <io!tream.#> Einclude <conio.#> Einclude <mat#.#>

>xemplu1

9in lude < omplex&8=


.. cla!! 9; cla!! / { 2u)lic: .. float float void cla!! 0 { 2u)lic: float Ro, Gi; // !orma 'olara ? (float @odul=-, float :r0=-); ? (9 "); .. 9onver!ie 96>? Re (); Mm (); ?i2 (con!t c#ar8 @e!aI); /; float Re, Mm; // !orma algebrica 9 (float a=-, float )=-);

float float float void

0 (/ I); 88 Conversie prin constructor CMP' float @odul (); float :r0 (); void ?i2 (con!t c#ar8 @e!aI); /; 9::9 ( float a, float ) ) { Re=a; Mm=); / 0660 (/ I) { 4e=I,4e(); %$=I,%$(); } 55 Conversie prin constructor CMP' 9::@odul( ) { return !Drt(Re8Re Mm8Mm); / 9:::r0 ( ) { return atan2 (Mm,Re); / 9:::r0 ( ) { return atan2 (Mm,Re); / 9::?i2 ( con!t c#ar8 @e!aI) { cout << @e!aI << Re << " " << Mm << "i" << endl; / ?::? ( float @odul, float :r0) { Ro=@odul; Gi=:r0; / ?::? (9 ") { Ro=".@odul(); Gi=".:r0(); / .. 9onver!ie 96>? ?::Re ( ) { return Ro8co!(Gi); / ?::Mm ( ) { return Ro8!in(Gi); / ?::?i2(con!t c#ar8 @e!aI) { cout << @e!aI << Ro << "," << Gi << ";" << endl; /

.. float float void

void main () { clr!cr(); / N(2,%); N.?i2(" (r,u) = "); 0 =; !=y; =.?i2(" (a,)) = "); com2le= z(N.Re(),N.Mm()); cout << " z = " << z << endl; cout << " (=,N) = " << real(z) << " " << ima0(z) << "i" << endl; cout << " (=,N) = " << !Drt(norm(z)) << "," << ar0(z) << ";" << endl; 0etc#(); /

77 / e + u l t a t e F
(r,u)=7,8; (a,b)= )*,N?NNMF:H,7M779i I =()*,N?NNMF,H,7M779) (!,y)= )*,N?NNMF:H,7M779i (r,u)=7,8;

04&04&@4

N$

C+

PO

23.2. Con%ersii e.plicite


23.2.1. Con%ersia dintrPun tip abstract HntrPun tip predefinit
Con,ersia dintrBun tip abstract de dat 4ntrBun tip predefinit se poate reali*a prin supra9ncrcarea operatorului de con&ersie explicit orespun*tor, printrBo fun !ie membru definit astfel1 class Clas E &&& publicF &&& operator %ip"Predefinit 9 :@ &&& F? Clas ;; operator %ip"Predefinit 9 : E &&& return Expresie"de"%ip"Predefinit@ F 7n exemplul urmtor se ,a reali*a o on,ersie dintrBun numr ra!ional 4ntrBun numr real1 77 Conversie $ad-J double
Einclude <!trin0.#>; Einclude <io!tream.#>; Einclude <conio.#>;

cla!! X { 2u)lic:

void inline inline inline X

lon0 m; lon0 n; X (lon0, lon0); operator double(); X o2erator 8(X); ?i2 (con!t c#ar8 @e!);

11 m 1 n 11 constr) implicit 11 * double 11 inmultire 11 tiparire

/; X::X(lon0 2, lon0 D) { m=2; n=D; / C66operator double () { return double($) B n; } X::o2erator 8 (X r) { return X(m8r.m, n8r.n); /

inline void X::?i2(con!t c#ar8 @e!) {cout << @e! << m << "." << n << endl;/ void main () { X =(2,7); X N(%,C); X z==8N; z.?i2(" z = "); dou)le a, ); a=!*9,F; cout << " a = " << a << endl; b=9,F*!; cout << " ) = " << ) << endl; /
clr!cr();

0etc#();

77 / e + u l t a t e F I = AB8F a = *,M b = *,M

04&04&@4

$0

C+

PO

23.2.2. Con%ersia dintrPun tip abstract HntrPun alt tip abstract .prin operatori/
P est tip de on,ersie se poate reali*a i prin oparatori .dar nu simultan i prin onstru tori/& 7n programul urmtor este reali*at on,ersia .prin operatorul de con&ersie/ din trigonometri . lasa ': 4n forma algebri . lasa C/1 77 Numere comple,eF %C
Einclude <io!tream.#> Einclude <conio.#> Einclude <mat#.#>

9in lude < omplex&8=


class 0 { 2u)lic: float float void 9::9 ( float 9::@odul( float 9:::r0 ( void 9::?i2 ( { class / { 2u)lic: operator float float void float Re, Mm; 11 forma algebric 9 (float a=-, float )=-); @odul (); :r0 (); ?i2 (con!t c#ar8 @e!aI); /; float a, float ) ) { Re=a; Mm=); / ) { return !Drt(Re8Re Mm8Mm); / ) { return atan2 (Mm,Re); / con!t c#ar8 @e!aI) cout << @e!aI << Re << " " << Mm << "i" << endl; / float ? 0 Re Mm ?i2

Ro, Gi; 11 forma polar (float @odul=-, float :r0=-); (); 11 0peratorul de con&ersie (); (); (con!t c#ar8 @e!aI); /; ?::? ( float @odul, float :r0) { Ro=@odul; Gi=:r0; / /66operator 0() { return 0(4e(),%$()); } 11 0p) Con&)

float ?::Re ( ) { return Ro8co!(Gi); / float ?::Mm ( ) { return Ro8!in(Gi); / void ?::?i2 (con!t c#ar8 @e!aI) { cout << @e!aI << Ro << "," << Gi << ";" << endl; / void main () { clr!cr(); ? N(2,%); N.?i2("(r,u)="); 9 =; !=y; =.?i2("(a,))="); com2le= z(N.Re(),N.Mm()); cout << " z =" << z << endl; cout << "(=,N)=" << real(z) << " " << ima0(z) << "i" << endl; cout << "(r,u)=" << !Drt(norm(z)) << "," << ar0(z) << ";" << endl; 0etc#(); /

77 / e + u l t a t e F
(r,u)=7,8; (a,b)= )*,N?NNMF:H,7M779i I =()*,N?NNMF,H,7M779) (!,y)= )*,N?NNMF:H,7M779i (r,u)=7,8;

04&04&@4

$@

C+

PO

2". Clase Lablon 9 %emplate :


Clasele %emplate .parametri+ate sau generice/ permit des rierea unor ategorii de lase, are difer prin tipul unor atribute, a esta fiind des ris generi .nu este pre i*at la des rierea lasei i doar la instan!ierea obie telor/& O astfel de las abstra t ,a fi parti ulari*at 4ntrBo las on ret 4nlo uind tipul general u un anumit tip ales&

2".1.

uncii Lablon 9 %emplate :

+un !iile %emplate .generice/ on!in i parametri formali generi i are ,or fi 4nlo ui!i u parametri de un anumit tip on ret& >xemplu1
Einclude <io!tream.#> Einclude <conio.#>

..

#unc'ii

% e m p l a t e (1) BB

te$plate <class /; / Max (/ =, / N) { return (=>N)& = : N; / clr!cr(); void main () { int a,); cout << " Dati a,) : "; cin >> a >> ); cout << " @a=imul = " << Max(a,)) << endl; float =,N; cout << " Dati =,N : "; cin >> = >> N; cout << " @a=imul = " << Max(=,N) << endl; 0etc#e(); /
77NKd-2usorsgre"e"tiG

0e obser, putem folosi a parametri a tuali parametri de di,erse tipuri, pentru are 4ns este definit operatorul Q & Ua a est operator nu este definit pentru un tip de dat u are dorim s lu rm, sau nu orespunde erin!elor noastre, a esta ,a trebui redefinit sau 8iar fun !ia ,a fi res ris onform erin!elor& >xemplu1
Einclude <io!tream.#> Einclude <conio.#>

..

#unc'ii

% e m p l a t e (2) BB

Einclude <!trin0.#>

tem2late <cla!! ?> ? @a= (? =, ? N) { return (=>N)& = : N; /

c(ar* @a!(c(ar* !, c(ar* y) { return (strc$p(!,y);H) D ! 6 y; } void main () { c#ar8 a=ne" c#ar;1-<; c#ar8 )=ne" c#ar;1-<; cout << " Dati a,) : "; cin >> a >> ); cout << " @a=imul = " << @a=(a,)) << endl; /

clr!cr(); 0etc#e();

04&04&@4

$2

C+

PO 2".2. Clase %emplate

O las %emplate este un model .ablon/ din are se ,or genera di,erse lase on rete prin parti ulari*area atributelor u tip ambiguu . generic/& O astfel de ategorie de lase are difer prin tipurile atributelor sunt spe ifi ate printrBo las template pentru a apoi s fie generate di,erse lase spe ifi e orespun*toare anumitor tipuri ne esare apli a!iei& >xemplu1
Einclude <io!tream.#> Einclude <conio.#>

..

Clase % e m p l a t e BB

te$plate <class /; class Wect { ?8 F; int Dim; 2u)lic: Wect (int n) { F = ne" ? ;Dim=n<; / [Wect ( ) { delete ; < F; / void 9itW ( ); ? @a=W ( ); /; te$plate <class /; 1oid Wect</;660itW () { for (int i=-; i<Dim; i ) cin >> F;i<; / te$plate <class /; / Wect</;66@a!W () { ? ma==F;-<; for (int i=1; i<Dim; i ) if (F;i<>ma=) ma==F;i<; return ma=; / void main () { int m; cout << " Dati nr.el. F : "; cin >> m; Wect<int; X($); cout << " Dati elem. F : "; F.9itW(); cout << " @a=imul e!te " << F.@a=W() << endl; int n; cout << " Dati nr.el. Y : "; cin >> n; Wect<float; P(n); cout << " Dati elem. Y : "; Y.9itW(); cout << " @a=imul e!te " << Y.@a=W() << endl; /

clr!cr();

0etc#e();

0e obser, 4n exemplul anterior sBau utili*at nu numai clase template i i funcii membru template& Prgumentele pot fi tipuri de date .class Nume!Parametru/, de exemplu1
te$plate <class /, int .i$;
Nume!$ip/

sau

onstante .$ip

04&04&@4

$A

C+

PO 2".3. Implementarea elementelor %emplate

7n ele e urmea* ne ,om referi la po*i!ia odului . are se expandea* onform erin!elor utili*atorului/ orespun*tor obie telor template& Codul template . orpul fun !iilor membru/ trebuie s fie ,i*ibil a olo unde sunt utili*ate elemente template& >xist dou metode .posibilit!i/ de implementare1 a/ template smart a tot odul unei lase template este s ris 4n fiierul header .defini!ii de lase, fun !ii pre um i implementarea fun !iilor/, a est mod put)nd fi pre i*at fie prin op!iunea de ompilare N_g, fie prin meniul Options , Compiler , C II options , op!iunea 'emplate Generation F 0mart , programul urm)nd s in lud a est fiier u toate des rierile& b/ template manual a doar de lara!iile elementelor template sunt s rise 4n fiierul header iar implemetarea f )nduBse separat, 4n alt fiier& P est mod trebuie pre i*at prin dire ti,a [pragma option, utili*)nd op!iunea de ompilare N_gd .urmea* o definire publi a instan!ierilor unor elemente template/ i op!iunea N_g. .urmea* o de lara!ie e.tern a instan!ierilor template/& P est mod este ilustrat 4n urmtorul exemplu simplu1
Einclude <conio.#> .. Program $emplate *** 'anual BB Einclude <io!tream.#>

E include "9H?em2l+.#" G pra3$a option )O3!

void main ()
{ Wint1- F; F.9itW("F"); cout << " @a=imul e!te " << F.@a=W( ) << endl; Wflo1% Y; Y.9itW("Y"); cout << " @a=imul e!te " << Y.@a=W( ) << endl; /
Einclude <conio.#> .. Cpp $emplate *** 'anual BB Einclude <io!tream.#>

clr!cr(); 0etc#e();

Einclude "9H?em2l+.#" tem2late <cla!! ?, int Dim> void Wect<?,Dim>::9itW (c#ar 8@e!) { cout << " Dati nr. elem.: "; cin >> n; cout << " Dati elem." << @e! << " : "; for (int i=-; i<n; i ) cin >> F;i<; / tem2late <cla!! ?, int Dim> ? Wect<?,Dim>::@a=W () { ? ma==F;-<; for (int i=1; i<n; i ) if (F;i<>ma=) ma==F;i<; / tem2late <cla!! ?, int Dim>
cla!! Wect { ? int 2u)lic: void ?

return ma=;

.. Aeader $emplate *** 'anual BB F;Dim<; n; 9itW (c#ar8); @a=W ( ); /;

G pra3$a option XO3d tN2edef Wect<int, 1-> Wint1-; tN2edef Wect<float,1-> Wflo1%;

04&04&@4

$4

C+

PO

2>. Relaii Hntre clase


'a elaborarea modelului obiectual al unei apli a!ii se disting urmtoarele dou etape1
a/ identificarea claselor a orespun*toare conceptelor apli a!iei .substanti&ele/, b/ stabilirea rela'iilor dintre clase a orespun*toare specifica'iilor apli a!iei .&erbele/&

7n ele e urmea* ne ,om referi la urmtoarele tipuri de rela!ii 4ntre lase1 @/ ,socia'ie a rela!ie de ooperare 4ntre lase a orespun*toare unui ,erb oare are din spe ifi a!ie, diferit de rela!ia parte-Dntreg .de exemplu rela!ia 0tudent a Facultate/& cela!ia orespun*toare dintre obie te apar!in)nd unor lase aso iate se numete legtur& O aso ia!ie poate fi simpl sau multipl .da un obie t asociant este pus 4n legtur, de exemplu prin pointeri, u mai multe obie te asociate, de a elai tip/& P east rela!ie se repre*int grafi .dup metodologia OMK/ 4n plan ori*ontal astfel1
C@ simpl C2 C@ multipl . C2

2/ ,gregare a rela!ie de asociaie prin are obie tul agregat este inclus 4n obie tul agregant .,erbul ara teristi este a a&ea/, i e,ident poate fi simpl sau multipl;
C@ simpl C2 C@ multipl . C2

A/ Specializare Dgeneralizare5 mo<tenireE a rela!ie prin are sunt pstrate . mo"tenite/ ara teristi ile unei lase .de ba+/ i sunt adugate diferen!ele spe ifi e, form)nd o nou las .derivat/& 'o"tenirea permite reutili+area de cod definit 4n lasa de ba* .superclas/ i 4n noua las .sublas/& Ue i, o subclas este o specializare a unei superclase .,erbul ara teristi fiind a fi/, iar o superclas este o generalizare a unei subclase& P east rela!ie este tranziti&, iar structura format de mul!imea laselor aflate 4n a east rela!ie . onstruit pe ,erti al/ se numete ierarhie de clase& Pt)t spe iali*area )t i motenirea poate fi simpl sau multipl, repre*entarea f )nduBse 4n plan ,erti al astfel1
C@ C@ C@ C2

C2 0peciali+are simpl

C2

CA

CA 'o"tenire multipl

0peciali+are multipl

0e pot ob!ine 4n felul a esta i ierar8ii spa!iale de lase, a,)nd rela!ii at)t pe ori*ontal )t i pe ,erti al&

2>.1. Relaia de ,socia'ie


04&04&@4 $%

C+

PO

Prin a east rela!ie dintre lase se modelea* o legtur 4ntre obie tele instan!iate . are depind unul de ellalt/& $raversarea unei aso ia!ii se fa e printrBun rol .nume dat extremitat!ii unei aso ia!ii/& Qmplementarea unei aso ia!ii se poate reali*a astfel1 a/ printrJun pointer a lasa asociant on!ine un atribut de tip pointer spre lasa asociat, b/ printrJo clas a u atribute i omportare proprie, fie are legtur fiind o instan! a a estei lase&

instaniere

C@ C@ rol@

asociaie rol2

C2 C2
instaniere

O@

legtur

O2

Pso ia!iile pot fi unidirecionale sau bidirecionale, iar rela!iile de aso ia!ie pot fi binare, ternare sau nBare& Pe de alt parte, aso ia!iile pot fi simple sau multiplicative .a estea din urm put)nd fi e,entual i cu restricii de ordonare sau de calificare/& Asociaiile multiplicative sunt ara teri*ate prin numrul de instan!e ale laselor are se afl 4n aso ia!ie, iar pentru a repre*enta dire !ia de aso ia!ie se pot utili*a sge!i& O asociaie multiplicativ poate s fie neordonat .instan!ele formea* o mulime/, sau poate s fie ordonat .instan!ele formea* o list ordonat/& 4 relaie multiplicati& cu restric'ie de calificare pune 4n rela!ie dou lase printrBun calificant .atribut are redu e multipli itatea aso ia!iei printrBun criteriu pe are trebuie sBl 4ndeplineas obie tele aso iate pentru a intra 4n rela!ie/&
C@ asociaia
MordonataN

C2

C@

asociaia
calificant

C2

'a implementarea rela!iilor de aso ia!ie putem apli a ele dou metode amintite anterior1 a/ prin pointeri spre lasa asociat 4n uibri!i 4n lasa asociant 4n fun !ie de tipul rela!iei de aso iere astfel1 a pentru rela!ia de asociaie simpl se adaug lasei aso iante 4n un atribut de tip pointer spre lasa aso iat, 4mpreun u relaxarea 4n apsulrii pentru tra,ersarea aso ia!iei aleg)nd o metod on,enabil dintre urmtoarele ,ariante1 modifi area prote !iei datelor membru impli ate 4n public, utili*area de metode sau lase friend, extinderea interfe!ei prin metode de acces la componente& a pentru rela!ia de asociaie multipl se adaug lasei aso iante mai multe atribute de tip pointer 4n fun !ie de tipul aso ia!iei i ordinul de multipli itate astfel1 da este relati, mi , se ,or aduga pointeri distinc'i, iar 4n a* ontrar se poate utili*a un <ir de pointeri? da rela!ia este supus unor restri !ii de ordonare, se pot utili*a liste ordonate& b/ prin clase distin te are reali*ea* abstra ti*area aso ia!iilor da legturile au m n
C@ C2

04&04&@4

Cas)

$M

C+

PO

propriet!i i opera!ii proprii .nemaifiind ne esar adugarea de atribute laselor are se aso ia*/, a east metod utili*)nduBse 4n spe ial 4n a*ul aso ia!iilor bidire !ionale de tip m-n/, sau o legtur poate one ta obie te de lase diferite& >xemplu1
..
Einclude <conio.#> Einclude <io!tream.#>

Clase asociate BB

Ginclude EWect0aut,(E void main (void) { int n; cout << " Dati n : "; cin >> n; Wect2ort X(n); .. F.1ort (); Wect0aut !(5X); X,Print(); int a,2; do { cout << " Dati a : "; cin >> a; if (2=!,0aut2ec(a)) cout << " Oe 2oz." << 2 << endl; el!e if(a) cout << " Mne=i!tent3 " << endl; / "#ile (a); cout << " Dati m : "; cin >> n; Wect2ort* P=ne+ Wect2ort(n); P);2ort(); Wect0aut* y=ne+ Wect0aut(P); P);Print(); do { cout << " Dati ) : "; cin >> a; if (2=y);0autJin(a)) cout << " Oe 2oz." << 2 << endl; el!e if(a) cout << " Mne=i!tent3 " << endl; / "#ile (a); / .. Clas Ginclude EWect2ort,(E cla!! Wect0aut { Wect2ort *1; 2u)lic: Wect9aut (Wect2ort*); int 9aut1ec (int a); int 9aut>in (int a); /; ..

clr!cr();

0etc#e();

asociant BB

<< )ect*aut+h >>

Clas asociat BB

<< )ectSort+h >>

cla!! Wect2ort { int 8v, n; 2u)lic: Wect1ort (int = 1-); void 1ort ( ); void Orint( ); int8 :dr ( ); int Dim ( ); [ Wect1ort ( ); /;

04&04&@4

$O

C+

PO
..

Clas asociant BB

<< )ect*aut+*'' >>

E include "Wect9aut.#" Wect9aut::Wect9aut (Wect1ort 82) { v = 2; / int Wect9aut::9aut1ec(int a) { int i=1, n=v6>Dim(), 8==v6>:dr(); "#ile ((i<=n) $$ (=;i<6a)) i ; return i4(n 1); / int Wect9aut::9aut>in(int a) { int 1t=1, Dr=v6>Dim(), 8==v6>:dr(); "#ile (1t<=Dr) { int m=(1t Dr).2; if (=;m<6a) if (=;m<<a) 1t=m 1; el!e Dr=m61; el!e return m; / return -; / .. E include <io!tream.#> E include "Wect1ort.#" Wect1ort::Wect1ort (int *) { n = *; v = ne" int;* 1<; for (int i=1; i<=n; i ) cin >> v;i<; / void Wect1ort::1ort( ) { int *=1; enum {Nu,Da/ 1ortat; do { 1ortat=Da; for (int i=1; i<=n6*; i ) if (v;i<>v;i 1<) { int ?em2=v;i<; v;i<=v;i 1<; v;i 1<=?em2; 1ortat=Nu; / * ; / "#ile (31ortat); / void Wect1ort::Orint ( ) { for (int i=1; i<=n; i ) cout << v;i< << A,A; cout << endl; / int8 Wect1ort:::dr ( ) { return v; / int Wect1ort::Dim ( ) { return n; / Wect1ort::[Wect1ort ( ) { delete ;<v; /

Clas asociat BB

<< )ectSort+*'' >>

04&04&@4

$N

C+

PO

2>.2. Relaia de ,gregare


/elaia de agregare este ea mai puterni rela!ie de aso ia!ie, 4n are o las este o omponent a altei lase, de i rela!ia este binar, unidire !ional, iar rela!iile multipli ati,e sunt de tip @Bn& Prin a east rela!ie dintre lase, un obie t al lasei agregate este parte onstituent, atribut, al lasei agregante, de i ,erbul ara teristi este a avea .conine/& Obie tele onstituente pot fi independente sau doar omponente ale obie tului are le in lude&

instaniere

C@ C@

Conine

C2 C2
instaniere

O@

conine

O2

P east rela!ie .notat u simbolul a,)nd semnifi a!ia conine/ are urmtoarele dou propriet!i de ba*1 a/ tanziti&itate 1 Ua Cx C3 i C3 Cz, atun i Cx Cz ,
b/ antisimetrie 1 Ua Cx C3 atun i C3 8 Cx &

cela!ia de agregare poate fi1 a/ fix a numrul i tipul omponentelor sunt fixe, b/ &ariabil a permite un numr ,ariabil de obie te de a elai tip, / recursi& a a ept a elai tip a tip agregat i agregant ) >xemplu1
.. *ela'ia de agregare BB Einclude <conio.#> Einclude <io!tream.#> Ginclude EWect_>3r,(E void main (void) { int n; cout << " Dati n : "; cin >> n; Wect0aut X(n); X,Print(); int a,2; do { cout << " Dati a : "; cin >> a; if (2=X,0aut2ec(a)) cout << " Oe 2oz." << 2 << endl; el!e if(a) cout << " Mne=i!tent3 " << endl; / "#ile (a); cout << " Dati m : "; cin >> n; Wect0aut* P=ne+ Wect0aut(n); P);2ort(); P);Print(); do { cout << " Dati ) : "; cin >> a; if (2=P);0autJin(a)) cout << " Oe 2oz." << 2 << endl; el!e if(a) cout << " Mne=i!tent3 " << endl; / "#ile (a); /

clr!cr();

0etc#e();

04&04&@4

$$

C+

PO
,gregant BB
<<

.. Clas Ginclude EWect2ort,(E class Wect0aut { Wect2ort W; 2u)lic: Wect9aut (int=1-); void 1ort (); void Orint(); int 9aut1ec (int); int 9aut>in (int); /; .. E include "WectH:0r.#" Wect9aut::Wect9aut (int n) : W(n) { / void Wect9aut::1ort () { W.1ort(); / void Wect9aut::Orint () { W.Orint(); / int Wect9aut::9aut1ec(int a) { int i=1, n=W.Dim(), 8==W.:dr(); "#ile ((i<=n) $$ (=;i<6a)) i ; return i4(n 1); /

ect!Agr." >>

Clas ,gregant BB

<<

ect!Agr.Cpp >>

int Wect9aut::9aut>in(int a) { int 1t=1, Dr=W.Dim(), 8==W.:dr(); "#ile (1t<=Dr) { int m=(1t Dr).2; if (=;m<6a) if (=;m<<a) 1t=m 1; el!e Dr=m61; el!e return m; / return -; / .. cla!! Wect2ort { int 8v, n;
2u)lic: Wect1ort (int = 1-); void 1ort ( ); void Orint( ); int8 :dr ( ); int Dim ( ); [ Wect1ort ( );

Clas ,gregat BB
..

<< ectSort." >> P fost des ris la clase asociate& BB

/; .. E include <io!tream.#> E include "Wect1ort.#"


\ ..

Clas ,gregat BB

<<

ectSort.Cpp >>

P fost de(a des ris la clase asociate&

BB

04&04&@4

@00

C+

PO

7n urmtorul exemplu se ,a folosi o las Iterator pentru list simplu 4nln!uit are utili*ea* lasa Elem pentru un nod al listei i lasa /ista1
.. Einclude <conio.#> Einclude <io!tream.#> E define ?el int cla!! #le$ { ?el Mnf; Llem8 Je0; 2u)lic: Llem (?el inf, Llem8 le0=-) { Mnf=inf; Je0=le0; / friend cla!! Ji!ta; friend cla!! Mterator;

Iterator /ist BB

/; cla!! "ista { Llem8 9a2; 2u)lic: Ji!ta ( ) { 9a2=-; / void :d (?el); friend cla!! Mterator; /; void Ji!ta:::d (?el elem) { if (9a2) { Llem8 2=9a2; "#ile (26>Je0) 2=26>Je0; 26>Je0=ne" Llem(elem,-);/ el!e 9a2=ne" Llem(elem,-); / cla!! %terator { Llem8 2; 2u)lic: Mterator(Ji!ta$ J) ?el o2erator () ( ) void o2erator ( ) int o2erator 3 ( ) /;

{ { { {

2 = J.9a2; return 26>Mnf; 2 = 26>Je0; return 23=-;

/ / .. elementul curent / .. avan!eaza in li!ta / .. e=i!ta element

void main (void) { Ji!ta J; J.:d (11); J.:d (22); J.:d (%%); Mterator l(J); "#ile (3l) { cout << l() <<" "; l ; / /

clr!cr();

0etc#e();

04&04&@4

@0@

C+

PO

2>.3. Clase Tncuibate9imbricate:


>xist posibilitatea definirii unei lase .Dncuibate/ 4n interiorul altei lase . a i atribut al esteia/& P east posibilitate exist de fapt i la stru turi .struct/ i uniuni .union/& Ue lararea obie telor din lasa Dncuibat se poate reali*a utili*)nd operatorul de scop .;;/ aa um se poate ,edea 4n exemplul urmtor1
cla!! 9erc { C l as e Im bri ca t e BB .. 9erc(=,N,r) float r; .. cla!! Ounct { .. Ounct(=,N) float =,N; .8 ... 8. /; .8 ... 8. ..

Raza 9entrul

/; void main () { 9erc 9; 9erc::Ounct O; .. ... /

-tili*area obie telor din lasa Dncuibat se poate reali*a utili*)nd operatorul de apartenen ../ dup um se ,ede 4n urmtorul exemplul1
..
Einclude <conio.#> Einclude <io!tream.#>

C l as e In cu i b at e

BB .. 9erc(=,N,r)

cla!! 9erc {

float cla!!

r; Ounct {

float 2u)lic: Ounct void Orint /; Ounct 9entru; 2u)lic: 9erc (Ounct O, float void Orint() /; void main () { 9erc::Ounct T(1,2); 9erc 9(T,%); /

.. Ounct(=,N) =,N; (float =-=-, float N-=-) { ===-; N=N-; / () { cout <<A A<< = <<A A<< N <<A A; / raza) { 9entru=O; r=raza; / { 9entru.Orint(); cout << r; /

T.Orint(); 9.Orint();

clr!cr(); cout << endl; cout << endl; 0etc#();

04&04&@4

@02

C+

PO

>,ident din lasa Dncuibat .Punct/ nu a,em a es la elementele lasei din are fa e parte .Cerc/& Ua se dorete a est lu ru, atun i se poate pro eda a i 4n urmtorul exemplu1
..
Einclude <conio.#> Einclude <io!tream.#>

C l as e In cu i b at e

BB

.. 9erc(=,N,r) float r; 2u)lic: 9erc (float raza) { r=raza; / class Punct; friend Punct; cla!! Ounct { .. Ounct(=,N) float =,N; 2u)lic: Ounct (float =-, float N-) { ===-; N=N-; / void Orint (9erc c){cout <<A A<<=<<A A<<N<<A A<<c,r;/ /; /; .. void 9erc::Ounct::Orint (9erc c) { cout <<A A<<=<<A A<<N<<A A<<c,r; / void main () { 9erc c(%); 9erc::Ounct T(1,2); / clr!cr(); T.Orint(c); 0etc#();

cla!! 9erc {

0e poate obser,a 4n exemplul dat referirea atributului r al lasei Cerc nu este permis din interiorul lasei 4n uibate .,e*i fun !ia Print des ris 4n ambele ,ariante/, moti, pentru are lasa Punct a fost de larat prieten& 7n urmtorul exemplu sunt imbri ate lasele R R2 R3 1
Einclude <conio.#> Einclude <io!tream.#>

..

C l as e In cu i b at e

BB

class 4

dou)le =; 2u)lic: R (dou)le =) { t#i!6>===; / cla!! R2; friend R2; class 47 { dou)le N; 2u)lic: R2 (dou)le N) { t#i!6>N=N; / cla!! R%; friend R%; class 48 { dou)le z; 2u)lic: R% (dou)le z) { t#i!6>z=z; / void Orint (R,R2); /; void Orint (R); /; /;

void R::R2::Orint (R a) {cout <<A A<<a.=;/ void R::R2::R%::Orint (R a, R2 )) {).Orint(a); cout <<A A<<).N<<A A<<z;/ void main () { R TF (1); R::R2 FTY(2); R::R2::R% FY_(%); / clr!cr(); FY_.Orint(TF,FTY);

0etc#();

04&04&@4

@0A

C+

PO

2>.". Relaia de deri%are


Prin a east rela!ie putem modela similitudinile dintre lase dou sau mai multe lase& Pornind de la o las de ba* .general/ se pot deri&a noi lase .prin diferen!ele spe ifi e/& Obie tele lasei deri,ate mo<tenesc atributele i metodele lasei de ba* la are se ,or aduga noile elemente ara teristi e .,or fi umflate/, eea e permite reutili*area resurselor de(a pregtite 4n lasele de ba* .pentru obie tele similare/& Verbul ara teristi al a estei rela!ii de speciali+are este a fi . j este un fel de I <a .ind of=/& 2o<tenirea permite pstrarea elementelor .date i fun !ii ale/ unei lase de ba+ .superclas/, u definirea de noi elemente onstruind o nou las derivat .subclas/, form)nd 4n felul a esta ierar(ii de lase& 'o"tenirea poate fi i multipl da o las motenete mai multe lase& Ueoare e a east rela!ie este tran*iti, se utili*ea* i termenii de strmo" i descendent&

generalizare

este o I

Cb

C@

C@

C@

C2

Cd
C2 0peciali+are simpl C2 CA CA 'o"tenire multipl

2>.".1.

0peciali+are multipl

Clase deri%ate

cela!ia de deri,are se poate des rie prin onstru !ii spe iale fr a mai fi ne,oie de o relaxare a 4n apsulrii, aa um a fost ne esar la rela!iile pre*entate anterior& Ua 4ntrBo apli a!ie se poate utili*a rela!ia de derivare, este de preferat 4n lo ul asociaiei sau agregrii pentru a,em instrumente spe iali*ate 4n limba(ul de programare& O las deri,at se de lar astfel1 class Clas!Derivat ; %ist!clase!de!ba+ E Date "i Funcii membru noi F?

04&04&@4

este un I

Ob

Od

specializare

@04

C+

PO

%ista claselor de ba+ poate s on!in i modifi atorii de prote !ie .2od"Pr/ public, protected sau private, de i o deri,are poate s fie public, protejat sau privat, a esul re*ultat fiind redat 4n urmtoarele tabele&
P esul 4n lasa de ba*2od"PrP esul 4n lasa deri,atprivate6Privateprivateprotected sau publicProtectedprotectedPublicnes 8imbat .protected sau public/

dRb[I I[I[[[

Ue exemplu, da ele dou lase sunt des rise astfel1


lass ClLBa* E pri,ate1 prote ted1 publi 1 F? publicO jaj jbj j j ClLUeri,at

bT

a protectedO ClLUeri,at x

lass ClLUeri,at 1 'od!Pr ClLBa* E pri,ate1 jaj prote ted1 jbj publi 1 j j F?

b T

atun i prote !ia membrilor din pri&ateO lasa deri,at este redat 4n s 8ema b x T * alturat& ClLUeri,at Ordinea de exe utare a constructorilor la instan!ierea obie telor dintrBo las deri,at1 prima dat se e,ecut constructorul clasei de ba+, apoi constructorul clasei derivate .se onstruite adrul, apoi se adaug diferen!ele spe ifi e/& Ordinea de exe utare a destructorilor la distrugerea obie telor dintrBo las deri,at1 prima dat se e,ecut destructorul clasei derivate, apoi destructorul clasei de ba+& Constru torul lasei deri,ate transmite parametrii ne esari onstru torului lasei de ba* prin apelul dire t al a estuia astfel1 Clas!Derivat . j / ; Clas!de!ba+ . j / E I F? 55 inline sau Clas!Derivat 11 Clas!Derivat . j / ; Clas!de!ba+ . j / E I F? 55inline

04&04&@4

@0%

C+

PO

Ueoare e rela!ia de deri,are este poate ea mai important rela!ie dintre lase, sunt oferite fa ilit!i de implementare, are permit urmtoarele fa ilit!i1 economia de cod a reutili+area codului s ris o singur dat dup are se motenete, e,tensibilitate a re-speciali+are prin deri,area de noi ramuri dintrBo ierar8ie, polimorfism a 4ntrBo ierar(ie de clase se poate implementa o omportare polimorfic, Dncapsularearela,are a rela!ia de deri,are ofer posibilitatea Dnc(iderii resurselor simultan u desc(iderea spre modifi are i extensie& cela!iile de deri,are .de fapt i elelalte rela!ii dintre lase/ sunt stabilite la ompilare, de i nu se mai pot modifi a pe par ursul exe u!iei& Mai trebuie unos ut faptul prin deri%are nu se pot mo0teni onstru torii, destru torii, elementele prietene .fun !ii, lase sau metode friend/ i ni i operatorii redefini!i& >xemplu1
..
Einclude <conio.#> Einclude <!trin0.#> Einclude <io!tream.#>

*elatia de deri&are BB

class N { protected6 c#ar8 c; 2u)lic: N (c#ar8 !) { c=ne" c#ar;!trlen(!) 1<; !trc2N(c,!); / ~N ( ) { delete ; < c; / c#ar8 @odul ( ) { return c; / /; void Orint (N n) { cout << n.@odul() << endl; / class Z 6 public N { 2rivate: 2u)lic: c#ar /;

c#ar 1emn; Z (c#ar8 !) : ~Z ( ) 1emnul( )

N(s:*)

{ 1emn=!;-<; / { / { return 1emn; /

void Orint (Z n) { cout << n.1emnul() << n.@odul() << endl; / void main (void) { N n("12%+"); Orint (n); Z *("612%"); Orint (*); N8 i = ne" N("7,C"); Orint (8i); Z8 I = ne" Z("6'("); Orint (8I); / clr!cr();

0etc#e();

04&04&@4

@0M

C+

PO

Con,ersia unui obie t dintrBo las deri,at 4ntrBun obie t apar!in)nd lasei de ba* este permis, in,ers 4ns nu .sursa trebuie s a opere destina!ia/1 ContraL>xemplu1 .. Con&ersii la deri&are 4 BB
\ void main (void) { clr!cr();

N _ N8 _8

n("12%+"); Orint (n); *(n); Orint (*); i = ne" N(*); Orint (8i); I = ne" _(i); Orint (8I);

#rror CO)2C1CW.C33 2F; Could not find a matc& for `(;;(9):` #rror CO)2C1CW.C33 3-; Could not find a matc& for `(;;(9) +:`
0etc#e();

Pentru o fun !ie are are a parametru formal un obie t al lasei de ba* este permis apelul a,)nd a parametru un obie t al lasei deri,ate, in,ers nu .o fun !ie are are a parametru formal un obie t al lasei deri,ate, nu poate fi apelat a,)nd a parametru a tual un obie t al lasei de ba*/& >xemplu1 .. Con&ersie la deri&are BB
Einclude <conio.#> Einclude <!trin0.#> Einclude <io!tream.#>

cla!! N { 2rotected: 2u)lic: N N N [N c#ar8 @odul /; cla!! _ : 2u)lic N { 2rivate: 2u)lic: c#ar /; void Orint c#ar8 ( (c#ar8 (N$ ( ( c; ) !) n) ) ) { { { { { c=ne" c#ar;2<; c;-<=A-A; c;1<=-; / c=ne" c#ar;!trlen(!) 1<; !trc2N(c,!); / c=ne" c#ar;!trlen(n.c) 1<; !trc2N(c,n.c); / delete ; < c; / return c; /

void Orint (N n) { cout << n.@odul() << endl; /

c#ar _( _ (c#ar8 [_ ( 1emnul(

1emn; ) : N( ) !) : N(! 1) ) )

{ 1emn=A A ; { 1emn=!;-<; { { return 1emn;

/ / / /

(_ n) { cout << n.1emnul() << n.@odul() << endl; /

void Urite:)! (N n) { Orint( n); / void Urite:)!H(N8n) { Orint(8n); / void main (void) { _ *(" 12%"); N n(*); Urite:)!(n); Urite:)!(Y); _8 2=ne" _("6+7,"); N8 D; V = p; Urite:)!(82); Urite:)!(8D); / clr!cr(); Orint (*); Orint (n); Orint (82); Orint (8D); Urite:)!H(2); Urite:)!H(D);

0etc#e();

7n exemplul urmtor se pornete de la lasa de ba* Vect-a+a i se onstruiete lasa deri,at Vect!Der 1

04&04&@4

@0O

C+

PO
..

Einclude <conio.#> Einclude <io!tream.#>

*ela'ia de deri&are BB
clr!cr();

Ginclude EWect_.er,(E void main (void) { int n; cout << " Dati n : "; cin >> n; WectHDer F(n); F.Orint(); int a,2; do { cout << " Dati a : "; cin >> a; if (2=F.9aut1ec(a)) cout << " Oe 2oz." << 2 << endl; el!e if(a) cout << " Mne=i!tent3 " << endl; / "#ile (a); cout << " Dati m : "; cin >> n; WectHDer8 Y=ne" WectHDer(n); Y6>1ort(); Y6>Orint(); do { cout << " Dati ) : "; cin >> a; if (2=Y6>9aut>in(a)) cout << " Oe 2oz." << 2 << endl; el!e if(a) cout << " Mne=i!tent3 " << endl; / "#ile (a); /

0etc#e();

.. Clas cla!! WectJaIa { 2rotected: int 8v, n; 2u)lic: Wect>aza (int = 1-); void 1ort ( ); void Orint( ); [ Wect>aza ( ); /;

de baz BB

<<

ect#a$a." >>

.. Clas de baz BB << E include <io!tream.#> E include "Wect>aza.#" Wect>aza::Wect>aza (int *) { n = *; v = ne" int;* 1<; for (int i=1; i<=n; i ) cin >> v;i<; / void Wect>aza::1ort( ) { int *=1; enum {Nu,Da/ 1ortat; do { 1ortat=Da; for (int i=1; i<=n6*; i ) if (v;i<>v;i 1<) { int ?em2=v;i<; v;i<=v;i 1<; v;i 1<=?em2; 1ortat=Nu; / * ; / "#ile (31ortat); / void Wect>aza::Orint ( ) { for (int i=1; i<=n; i ) cout << v;i< << A,A; cout << endl; / Wect>aza::[Wect>aza ( ) { delete ;<v; /

ect#a$a.Cpp >>

04&04&@4

@0N

C+

PO
!eri&at BB
<<

.. Clas Einclude "Wect>aza.#" cla!! WectHDer : 2u)lic Wect>aza { 2u)lic: WectHDer (int=1-); int 9aut1ec (int); int 9aut>in (int); /; ..

ect!Der." >>

Clas

!eri&at BB

<<

ect!Der.Cpp >>

E include "WectHDer.#" WectHDer::WectHDer (int n) : Wect>aza(n) { / int WectHDer::9aut1ec(int a) { int i=1; "#ile ((i<=n) $$ (v;i<6a)) i ; return i4(n 1); / int WectHDer::9aut>in(int a) { int 1t=1, Dr=n; "#ile (1t<=Dr) { int m=(1t Dr).2; if (v;m<6a) if (v;m<<a) 1t=m 1; el!e Dr=m61; el!e return m; / return -; /

7n exemplul are urmea*, datele !,y .din lasa de ba* Punct/ au fost de larate protected deoare e lasa deri,at .Cerc/ le refer& 'a lasa deri,at am utili*at modifi atorul public pentru a putea utili*a i pentru Cerc opera!ia 0ontine .PC/&
.. Oro0ram GctHNeWirtuala; BB

Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>; Einclude <mat#.#>; float 1Dr (float =) { return =8=; /

cla!!

Ounct (float =-=-, float N-=-); float .ist (Ounct O); int 9ontine(Ounct O); /; Ounct::Ounct (float =-, float N-) { ===-; N=N-; / float Ounct:: .ist (Ounct O) {return !Drt(1Dr(=6O.=) 1Dr(N6O.N)); / int Ounct:: 0ontine (Ounct O) {return .ist (O)==-; / cla!! 0erc : public Punct { float r; 2u)lic: 9erc (float =-=-, float N-=-, float raza=-) {===-; N=N-; r=raza;/ float .ist (Ounct O) {Ounct 9(!,y); return 9.Di!t(O)6r; / /; void main (void) { Ounct O(%,+); 9erc 9(-,-,7); if (9.0ontine (O)) cout << " 9ercul 9 contine 2unctul O." << endl; el!e cout << " 9ercul 9 nu contine 2unctul O." << endl;

Punct { protected : float 2u)lic:

!,y;

77 / e + u l t a t e F 0ercul 0 nu contine punctul P,

0etc#();

0e obser, 4n exemplul de mai sus re*ultatul nu este el dorit& P est nea(uns 4l ,om re*ol,a mai t)r*iu de lar)nd 1istan!a a funcie virtual .pentru legare dinamic/&

04&04&@4

@0$

C+

PO
Cb Cb1

+a! de motenirea simpl, 4n are dintrB o singur las de ba* se deri,ea* una sau mai multe lase deri,ate .spe iali*ate/, motenirea multipl presupune existen!a mai multor lase de ba* din are un sau mai multe lase motenes di,erse ara teristi i&

Cb2

Cd@

Cd2

Cd
2o<tenire multipl

'o"tenire simpl

Ue lararea unei lase deri,ate din mai multe lase de ba* se fa e astfel1 class Clas!de!ba+!@ E I F? class Clas!de!ba+!2 E j F? class Clas!!derivat 1 2od"Pr Clas!de!ba+!@, 2od"Pr Clas!de!ba+!2 E j F? unde 2od"Pr B public< protected< pri&ate A& Uatorit motenirii multiple o las de ba* poate fi pre*ent 4n mai multe exemplare 4ntrBo las deri,at, aa um se poate ,edea 4n exemplul alturat, unde datele membru ale lasei Animal ,or fi motenite 4n dou exemplare de tre lasa C;ine .unul prin lasa Domestic, altul prin lasa 'amifer/ i pot fi referite prin operatorul de re*olu!ie . ;; / apli at lasei prin are se fa e motenirea .Nume/& P east motenire repetiti, a unei lase de ba* este ore t i se poate utili*a astfel1

,nimal

2amifer

!omestic

C4ine

Cl"$az

Cl"$az

Cl"!er1

Cl"!er2

Clas"!eri&at

class Cl"$az B protected; j ,tribut j A@ class Cl"!er1 ; public Cl"$az B \ A@ class Cl"!er2 ; public Cl"$az B \ A@ class Clas"!eri&at ; public Cl"!er1< Cl"!er2 B \ Cl"!er1;;,tribut \ Cl"!er2;;,tribut F A@

04&04&@4

@@0

C+

PO

Ua dorim reali*area unei singure motenirea multipl &irtual1

opii a atributelor motenite, ,om folosi


Cl"$az

Cl"!er1

Cl"!er2

Clas"!eri&at

class class class class

Cl"$az B protected; ,tribut F A@ Cl"!er1 ; &irtual public Cl"$az B \ A@ Cl"!er2 ; &irtual public Cl"$az B \ A@ Clas"!eri&at ; public Cl"!er1< Cl"!er2 B \ ,tribut \ A@

04&04&@4

@@@

C+

PO

Pa um se poate ,edea 4n exemplul urmtor, ,om a,ea un nume de mamifer i un nume domestic& 77
Einclude <io!tream.#> Einclude <conio.#> Einclude <!trin0.#>

Program Clase NeVirtuale

HH

cla!! >ni$al { 2rotected: c#ar8 Nume; 2u)lic: :nimal (c#ar 8nume) { !trc2N(Nume,nume); / /; cla!! @a$ifer : 2u)lic >ni$al { 2rotected: int Kreu; 2u)lic: @amifer (c#ar8 nume,int 0r) : :nimal(nume) { Kreu=0r;/ /; cla!! .o$estic: 2u)lic >ni$al { 2rotected: int Oret; 2u)lic: Dome!tic(c#ar8 nume,int 2r) : :nimal(nume) { Oret=2r;/ /; cla!! 0aine : 2u)lic @a$ifer, 2u)lic .o$estic { 2rotected: int Jant; 2u)lic: 9aine(c#ar8 nu$e@,c#ar8 nu$e., int 0r, int 2r, int l) : @amifer(nu$e@,0r), Dome!tic(nu$e.,2r) { Jant=l;/ void ?i2() { cout << " Nume @amifer : " << @a$ifer::'u$e << endl << " Nume Dome!tic: " << .o$estic::'u$e << endl << " Kreutate : " << Kreu << endl << " Oret : " << Oret << endl << " Jant : " << Jant << endl ;/ /; void main (void) { 0aine c ("9ane","Nero",1%,1%--,'); /

clr!cr(); c.?i2(); 0etc#(); 77 /e+ultateF

Nume @a$ifer : Nume .o$estic: Kreutate : Oret : Jant :

9ane Nero 1% 1%-'

04&04&@4

@@2

C+

PO

Ua dorim a datele membru s fie pre*ente 4ntrBun singur exemplar 4n lasele deri,ate, atun i ,om utili*a clase virtuale& O las de ba* de,ine virtual prin motenire da se de lar a easta prin u,)ntul virtual plasat 4naintea lasei .de,enind astfel las ,irtual fa! de lasa deri,at/& Programul anterior modifi at astfel 4n )t numele s fie memorat 4ntrBun singur exemplar este urmtorul1 77
Einclude <io!tream.#> Einclude <conio.#> Einclude <!trin0.#>

Program Clase Virtuale

HH

cla!! >ni$al { 2rotected: c#ar8 'u$e; 2u)lic: :nimal (c#ar8 nume) { !trc2N(Nume,nume); / /; cla!! @a$ifer : 1irtual 2u)lic >ni$al { 55 Animal este clas virtual pentru 'amifer 2rotected: int Kreu; 2u)lic: @amifer (c#ar8 nume,int 0r) : :nimal(nume) { Kreu=0r;/ /; cla!! .o$estic: 1irtual 2u)lic >ni$al { 55 Animal este clas virtual pentru Domestic 2rotected: int Oret; 2u)lic: Dome!tic(c#ar8 nume,int 2r) : :nimal(nume) { Oret=2r;/ /; cla!! 0aine : 2u)lic @amifer, 2u)lic Dome!tic { 2rotected: int Jant; 2u)lic: 9aine(c#ar8 nume, int 0r, int 2r, int l) : >ni$al(nume), @a$ifer(nume,0r), .o$estic(nume,2r) {Jant=l;/ void ?i2() { cout << " 'u$e >ni$al : " << 'u$e << endl << " Kreutate : " << Kreu << endl << " Oret : " << Oret << endl << " Jant : " << Jant << endl ;/ /; void main (void) { clr!cr(); 0aine c ("Ju2",1%,1%--,'); c.?i2();
0etc#();

77 /e+ultateF
Nume >ni$al Kreutate Oret Jant : : : : Ju2 1% 1%-'

04&04&@4

@@A

C+

PO

Pentru o ierar8ie a ea din figura alturat, 4n are a,em lase ,irtuale ./ i ne,irtuale ./, se exe ut mai 4nt)i onstru torii laselor de ba* ,irtuale apoi ei ai laselor ne,irtuale, iar onstru torul lasei de ba* se ,a exe uta pentru o singur dat toate exemplarele ,irtuale i )te o dat pentru fie are exemplar ne,irtual&

1 G

>xemplul1
77 Program &erar(ie Clase Virtuale7Nevirtuale HH

Einclude <io!tream.#> Einclude <conio.#>

cla!! : { 2u)lic: : (c#ar8 a) { cout << " : : " << a << endl; / cla!! >: virtual 2u)lic : { 2u)lic: > (c#ar8 )) : :()) { cout << " > : " << ) << endl; / cla!! 9: virtual 2u)lic : { 2u)lic: 9 (c#ar8 c) : :(c) { cout << " 9 : " << c << endl; / cla!! D: 2u)lic : { 2u)lic: D (c#ar8 d) : :(d) { cout << " D : " << d << endl; / cla!! L { 2u)lic: L (c#ar8 e) { cout << " L : " << e << endl; / cla!! G { 2u)lic: G (c#ar8 f) { cout << " G : " << f << endl; / cla!! K: 2u)lic >, 2u)lic 9, 2u)lic D, 2u)lic L, virtual 2u)lic G { 2u)lic: K (c#ar8 0) : :(0), >(0), 9(0), D(0), L(0), G(0) { cout << " K : " << 0 << endl; / void main (void) { clr!cr(); K T)("T)."); 0etc#(); /

77 /e+ultateF
> F J 0 > . # K 6 6 6 6 6 6 6 6 -b, -b, -b, -b, -b, -b, -b, -b,

04&04&@4

@@4

C+

PO

G-) Polimorfism
Supra9ncrcarea .overloading/, prin redefinirea unor fun !ii sau metode, permite alegerea la compilareBlin.Leditare a fun !iei sau a metodei dorite prin semntura a esteia, fr a mai putea alege la exe u!ie& Polimorfismul permite a la exe u!ie s se de id e metod s fie apelat, oferind o fa ilitate a metodelor din lase aflate 4n rela!ie de deri,are& Prin polimorfism se exe ut a !iuni diferite prin mesa(e u semnturi identi e asupra obie telor de tip diferit .obie te din lase diferite rspund diferit la a elai mesa(/& Uou obie te sunt compatibile da apar!in a eleai lase .e,ident/ dar i dou ,ariabile
a/ de tip pointer la clasa de ba+, respe ti, pointer la clasa derivat, b/ de tip referin .pointer constant/ la clasa de ba+, respe ti, referin la clasa derivat &

Metodele unei lase pot fi1

Clasice @ metode legate static, la compilareBlin.Leditare fiind fixat adresa de apel a metodei, fr posibilitatea de a o s 8imba la rularea apli a!iei, Polimorifice @ metode legate dinamic, are permit 4nt)r*ierea de i*iei referitoare la adresa de apel a metodei, p)n la exe u!ie&

/egarea unei metode .binding/, 4n!eleg)nd prin a easta enexiunea logi dintre o entitate i o proprietate a a esteia . oresponden!a dintre un mesa( trimis unui obie t, adi ordinul de apel, i metoda are se exe ut a rspuns la a esta/ poate fi1

%impurie Dstatic @ earl3JbindingE @ ompilatorul i editorul de legturi ,or fixa adresa metodei are se exe ut, fr a a easta s mai poat fi modifi at pe par ursul exe u!iei? %4rzie Ddinamic @ lateJbindingE @ ompilatorul ,a onstrui un tablou de adrese ale metodelor posibile de apel, iar determinarea adresei metodei dorite se ,a efe tua doar la exe u!ie& 7n fun !ie ,aloarea pointerului spre lasa de ba*, are poate on!ine i adresa unui obie t al lasei deri,ate, se ,a alege metoda orespun*toare&

04&04&@4

@@%

C+

PO 2?.1. uncii membru Vi rt ua l e

Qmpli it, o metod este legat stati . earl6, la ompilare/, iar da se dorete o legare dinami .late, la exe u!ie/ se ,a de lara virtual prin s rierea u,)ntului &irtual 4naintea metodei& O metod ,irtual a unei lase de ba*, poate fi motenit 4ntrBo las deri,at sau poate fi redefinit .4nlo uit B overriding/& O metod se de lar ,itual 4n lasa de ba* .nu se poate de lara ,irtual doar 4ntrBo las deri,at& 0e poate obser,a 4n exemplul urmtor da dorim a re*ultatul s fie :JaIaB.eri1ata; i la apelul fun !iei 3, trebuie s de larm fun !ia f ,irtual, altfel re*ultatul ar fi :JaIaBJaIa;&
E include <conio.#> E include <io!tream.#>

..

2et od &i r t u al

BB

cla!! 9) { 2u)lic: 1irtual void f() { cout << " >aza /; cla!! 9d : 2u)lic 9) { 2u)lic: /; void
{

" << endl; /

void f() { cout << " Derivata " << endl; /

0(9)8 2) { 26>f(); /
clr!cr();

void main () 9)8 O) = ne" 9); O)6>f(); 0(O)); delete O);


/

9d8 Od = ne" 9d; Od6>f(); 0(Od); delete Od;

.. Je0are 1tatica .. Je0are Dinamica


0etc#e();

7n exemplul urmtor ,om utili*a ,ariabile de tip referin! la lasa de ba*, respe ti, la lasa deri,at&
E include <conio.#> E include <io!tream.#>

..

2et od &i r t u al

BB

cla!! 9) { 2u)lic: 1irtual void f() { cout << " >aza /; cla!! 9d : 2u)lic 9) { 2u)lic: /; void
{

" << endl; /

void f() { cout << " Derivata " << endl; /

0(9)5 r) { r.f(); /
clr!cr();

void main () 9) T); T).f(); 0(T));


/

9d Td; Td.f(); 0(Td);

.. Je0are 1tatica .. Je0are Dinamica

0etc#e();

04&04&@4

@@M

C+

PO

7n urmtorul exemplu se poate dedu e ne esitatea legrii dinami e, pentru a putea al ula ore t distan!a de la un pun t la un er i respe ti, la un segment .la o dreapt/& Uin p ate pentru metoda 9ontine exist 4n dublu exemplar .1tan0a i Drea2ta/ apelul nu se poate efe tua um ar fi de doritI
Einclude <conio.#>; Einclude <io!tream.#>; Einclude <mat#.#>;

..

2et od &i r t u al

BB

float cla!!

1Dr (float =) { return =8=; / Ounct { 2rotected: float =,N; 2u)lic: Ounct (float =-, float N-) { ===-; N=N-; / Ounct (Ounct $O) { ==O.=; N=O.N; / virtual float Di!t (Ounct O) {return !Drt(1Dr(=6O.=) 1Dr(N6O.N)); int 9ontine(Ounct O) {return Di!t(O)==-; /; /; 9erc : 2u)lic Ounct { float r; 2u)lic: 9erc (float =-, float N-, float R):Ounct(=-,N-){r=R;/ float Di!t (Ounct O) {Ounct 9(=,N); return 9.Di!t(O)6r; / /; 1tan0a : 2u)lic Ounct { 2u)lic:1tan0a (float =-, 1tan0a (Ounct$ O) /; Drea2ta: 2u)lic Ounct { 2u)lic:Drea2ta(float =-, Drea2ta(Ounct$ O) /; float N-) : Ounct(=-,N-) { / : Ounct(O) { / float N-) : Ounct(=-,N-) { / : Ounct(O) { /

cla!!

cla!!

cla!!

cla!!

1e0m : 2u)lic 1tan0a, Drea2ta { 2u)lic: 1e0m(Ounct 1t, Ounct Dr) : 1tan0a(1t), Drea2ta(Dr) { / float Di!t (Ounct 9) { Ounct :(1tan0a::=, 1tan0a::N); Ounct >(Drea2ta::=,Drea2ta::N); float a=>.Di!t(9); float )=:.Di!t(9); float c=:.Di!t(>); float 2=(a ) c).2; float 1=!Drt(28(26a)8(26))8(26c)); return 281.c; / /; clr!cr(); 9 contine 2unctul O." ; 9 nu contine 2unctul O." ; " 1e0m. :> contine 2unctul O." ; " 1e0m. :> nu contine 2unctul O." ; 0etc#e();

void main (void) { Ounct O(%,+); 9erc 9(-,-,7); if (9.9ontine(O)) cout << " 9ercul el!e cout << " 9ercul Ounct :(-,-), >(,,'); 1e0m :>(:,>); if (:>.1tan0a::9ontine(O)) cout << el!e cout << /

04&04&@4

@@O

C+

PO

Pproape ori e metod poate fi &irtual, 8iar i metodele inline, metodele friend .dar nu i fun !iile friend/ operatorii .da nu se redefines prin fun !ii friend/ i destructorii, 4n s 8imb constructorii i metodele statice nu pot fi ,irtuale& 7n exemplul pre*entat 4n ontinuare, al doilea produs . 7B8 * 9BF = MB*F/ nu ,a fi afiat da operatorul de 4nmul!ire a dou numere ra!ionale nu este de larat %irtual , .deoare e operatorul 8= ,a apela operatorul de 4nmul!ire pentru * 4n lo de um ar trebui, a i b fiind din lasa /& 0e obser, la 4nmul!irea a dou obie te din lasa * nu sunt tiprite fra !iile are se 4nmul!es , pe )nd la 4nmul!irea a dou obie te din lasa fra !iile are se 4nmul!es sunt tiprite&
..
Einclude <conio.#>;

Oro0ram T2erator Wirtual;

BB
Einclude <io!tream.#>;

cla!! C { 2rotected: int 2,D; 2u)lic: X (int m=-, int n=1) { 2=m;D=n; / 1irtual C operator * (C5 r) { return X(28r.2, D8r.D); / X$ o2erator 8= (X$ r) { return 8t#i!=8t#i! * r; / void ?i2 (c#ar8 @!) { cout << @! << 2 << "." << D; / /; cla!! F : 2u)lic X { 2u)lic: G (int m=-, int n=1) : X (m,n) { / X o2erator 8 (X$ r) { X f = X(8t#i!) 8 r; t#i!6>?i2(""); r.?i2(" 8 "); f.?i2(" = "); cout << endl; return f; / /; void main (void) { C 2(2,%), D(+,7), r; 2.?i2(" 2 = "); cout r=28=D; 2.?i2(" 2 = "); cout F a(2,%), b(+,7); C a.?i2(" a = "); cout d=a8b; d=a*=b; /

clr!cr();

<< endl; << endl; d; << endl;

D.?i2(" D = "); cout << endl; r.?i2(" r = "); cout << endl; b.?i2(" ) = "); cout << endl; d.?i2(" d = "); cout << endl; d.?i2(" d = "); cout << endl;
0etc#();

77 / e + u l t a t e F
p = 7B8 V = 9BF p = MB*F r = MB*F a = 7B8 b = 9BF 7B8 * 9BF = MB*F d = MB*F 7B8 * 9BF = MB*F d = MB*F

04&04&@4

@@N

C+

PO 2?.2. Clase abstracte P func'ii membru &irtuale p u r e

7n lasa de ba* se poate de lara o omportare generi a,)nd un nume i o semntur uni .urm)nd a fie are spe iali*are s ofere propria metod spe ifi / prin1
a/ metode nule are se de lar astfel1

&irtual $ip!met Nume!met 9%ist!Par!Formali: E F


b/ metode pure de larate 4n forma1

&irtual $ip!met Nume!met 9%ist!Par!Formali: L -? Pmbele ,ariante permit 4nlo uirea a estei metode u o metod proprie lasei spe iali*ate deri,at din lasa de ba*, permi!)nd astfel soli itarea unui omportament general, dar propriu fie rei spe iali*ri& 'etodele pure nu pot fi apelate, rolul lor fiind doar de a de lara tipul, numele i parametrii unei metode abstra te are urmea* s fie redefinit on ret 4n fie are las spe iali*at& O clas este abstract da ea on!ine el pu!in o funcie membru virtual pur& O funcie membru virtual este pur da ea este de larat .&irtual antet L -/ dar nu este definit 4n lasa din are fa e parte i 4ntrBo las deri,at& Ueoare e lasele abstra te on!in fun !ii membru nedefinite .virtuale pure/, nu se pot rea obie te apar!in)nd a estora .nu pot fi instan!iate, dar se pot defini ,ariabile de tip pointer sau referin! la o las abstra t/, iar da fun !iile ,irtuale nu sunt definite ni i 4n lasele deri,ate, atun i i a este lase de,in abstracte .o las deri,at dintrBo las abstra t rm)ne abstract da nu sBau redefinit toate metodele pure motenite, iar 4n a* ontrar de,ine las concret/& O las abstra t reali*ea* implementarea unei no!iuni are nu poate fi on reti*at .i atun i nu poate fi de )t enun!at/, dar surprinde o ara teristi omun a laselor spe iali*ate din a easta . are ,or on!ine implementrile efe ti,e/& Ue i, o las abstra t ,a generali*a .abstracti+a/ omportamentul sub laselor spe iali*ate& 7ntrBo ierar8ie, lasa de ba* poate a,ea nite propriet!i are nu se pot defini de )t 4n lasele deri,ate .anumite ara teristi i depind de lasa deri,at/& 7n exemplul alturat, u toate se unoate greutatea unui animal, nu se poate spune este slab sau gras de )t pentru o las deri,at/&

,nimal

Porumbel

+rs

Cal

04&04&@4

@@$

C+

PO

7n exemplul urmtor ,om da trei ara teri*ri pentru un anumit animal 4n fun !ie de greutatea lui i ea medie .slab5gras/, ,)rsta lui i ea medie .t;nr5btr;n/, i ,ite*a lui .de deplasare/ i ea medie .lent5rapid/, a estea pentru un Porumbel, Ers sau Cal& 77 Clas e A bs tr ac te - 'e to de Pur e HH
Einclude <io!tream.#> Einclude <conio.#>

cla!! >ni$al { 2rotected: dou)le Kreut, War!ta, Witeza; 2u)lic: :nimal (dou)le Z0, dou)le :ni, dou)le ZmHV) {Kreut= Z0; War!ta=:ni, Witeza=ZmHV;/ 1irtual dou)le KreutHH@edie () = H; 1irtual dou)le War!taH@edie () = H; 1irtual dou)le WitezaH@edie () = H; int 1la) () { return Kreut < KreutHH@edie(); / int ?anar() { return War!ta< War!taH@edie().2; / int Jent () { return Witeza< WitezaH@edie(); / void ?i2 () { cout << ( 1la) ()& "!la), " : "0ra!, " ) << ( ?anar()& "tanar, " : ")atran," ) << ( Jent ()& "lent Bn" : "ra2idBn" );/ /; cla!! Poru$bel:2u)lic >ni$al { 2u)lic: Oorum)el (dou)le Z0, dou)le :ni, dou)le ZmHV) : :nimal(Z0, :ni, ZmHV) { / dou)le KreutHH@edie () { return -.7; / dou)le War!taH@edie () { return ,.-; / dou)le WitezaH@edie () { return (-.-; / /; cla!! &rs: 2u)lic >ni$al { 2u)lic: 5r! (dou)le Z0, dou)le :ni, dou)le ZmHV) : :nimal(Z0, :ni, ZmHV) { / dou)le KreutHH@edie () { return +7-; / dou)le War!taH@edie () { return +%; / dou)le WitezaH@edie () { return +-; / /; cla!! 0al: 2u)lic >ni$al { 2u)lic: 9al (dou)le Z0, dou)le :ni, dou)le ZmHV) : :nimal(Z0, :ni, ZmHV) { / dou)le KreutHH@edie () { return 1---; / dou)le War!taH@edie () { return %,; / dou)le WitezaH@edie () { return ,-; / /; void main (void) { clr!cr(); Poru$bel p (-.,, 1, '-); p.?i2(); &rs u (7--,+-, +,); u.?i2(); 0al c ((--, ', C-); c.?i2(); 0etc#(); /

77 /e+ultateF
3ras, 3ras, slab, tanar, lent batran, rapid tanar, rapid

04&04&@4

@20

C+

PO
#igur

7n exemplul urmtor ,om apela o fun !ie Dra) pentru a desena o figur oare are .Punct, Ptrat sau Cerc/ i o fun !ie Arie are ,a apli a formula ara teristi fie rei figuri geometri e1 77 Clas A bs tr ac t - ' et od e Pur e H H
E E E E include include include include <9onio.#> <Oroce!!.#> <Mo!tream.#> <Kra2#ic!.#>

Punct

P trat

Cerc

cla!! Fi3ura { { }

2rotected: 2u)lic: 1irtual 1irtual

int =,N; Gi0ura (int u=-, int v=-) { ==u; N=v; / 1oid .ra+ () = H; BB Pura sau 'ula int int >rie () = H; Pret () { return >rie()81-- 1; /

cla!! Punct

/; : 2u)lic

Gi0ura { int 9ul; 2u)lic:

Ounct

(int u, int v, int { 9ul=c;

c=UVM?L):Gi0ura(u,v) / 1oid .ra+() { putpi!el(!,y,0ul); } int >rie() { return H; } cla!! Patrat Gi0ura(u,v) { Jat=J; / 1oid .ra+() { $o1eto(!,y); linerel(H,:"at); linerel(:"at,H); linerel(H,)"at); linerel() "at,H); } int cla!! 0erc /; : 2u)lic >rie() { return "at*"at; } Gi0ura { int Raza; 2u)lic: 9erc (int u, int v, int R=1) : Gi0ura(u,v) { Raza=R;/ 1oid .ra+() { circle(!,y,4aIa); } int >rie() { return 8*4aIa*4aIa; } /; : 2u)lic Gi0ura { int Jat; 2u)lic:

Oatrat (int u, int v, int J=1) :

/; void MnitKraf(void) { int Kd = DL?L9?, Km; init0ra2#($Kd, $Km, "9:BB>orland9BB>0i"); / void main (void) { clr!cr(); Gi0ura8 Gi0;22<; int i,n; cout << " Dati n : "; cin >> n; for (i=-; i<n; i ) { int t,=,N,z; cout << " Dati fi0." << i 1 << "(t,=,N,z): "; cin >> t >> = >> N >> z; !"itc# (t) { ca!e 1: Gi0;i<=ne" Ounct (=,N,z); )rea*; ca!e 2: Gi0;i<=ne" Oatrat(=,N,z); )rea*; ca!e %: Gi0;i<=ne" 9erc (=,N,z); )rea*;
default: e=it(1);

/; cout << " Oret = " << Fi3[i]);Pret() << endl; /;

04&04&@4

@2@

C+

PO
0etc#e();

MnitKraf(); ) { !etcolor(176i); Fi3[i]);.ra+();/


0etc#e(); clo!e0ra2#();

for (i=-; i<n; i /

04&04&@4

@22

C+

PO

2E. Ierarhii pentru Intrri1Ie<iri


Pentru nu exist instru !iuni de intrare5ieire, sBau definit fun !ii .4n C/, respe ti, dou ierar8ii de lase .4n CII/& P este dou ierar8ii .repre*entate 4n figurile de mai (os i de larate 4n fiierul iostream&(/ reali*ea* opera!iile de intrare5ieire prin streamBuri .flux de date sursdestinaie/&
strembuf

filebuf

strstreambu f

Clasa streambuf se folosete pentru gestionarea *onelor tampon i opera!ii de intrare5ieire simple& Clasa ios este lasa de ba* ,itual pentru lasa istream . are fa e on,ersia dup un format spe ifi at, din ara terele unui obie t de tip streambuf/, lasa ostream . are fa e on,ersia dup un format spe ifi at, 4n ara tere ale unui obie t de tip streambuf/ i lasa iostream . are fa e on,ersii 4n ambele sensuri/& 'egtura dintre ele dou ierar8ii se reali*ea* printrBo dat membru a lasei ios .pointer la streambuf/&

ios istream iostream istream"withassign ostream"withassig ostream

iostream"withassig

Clasele deri,ate din lasa istream sau ostream se numes lase stream iar obie tele laselor deri,ate din lasa ios se numes streamuri& 7n fiierul iostream&( sunt definite streamurile cin . istreamL)it(assign, pentru stdin/, cout . ostreamL)it(assign, pentru stdout/, clog i cerr . ostreamL)it(assign, pentru stderr, u respe ti, fr *one tampon/&

2E.1. 0peratorul de inserare MM


Opera!iile de s riere se pot efe tua u operatorul de inserare MM & Operandul st)ng trebuie s fie un obie t al lasei ostream .sau al unei lase deri,ate/& Pentru s rierea pe dispo*iti,ul standard se ,a folosi obie tul cout& Operandul drept este o expresie pentru al rei tip a fost supra4n r at operatorul MM & Pentru tipurile standard a fost supra4n r at printrBo fun !ie membru de forma1 ostreamK operator MM . $ip!0tandard /?

04&04&@4

@2A

C+

PO

Pentru tipurile abstra te programatorul poate supra4n r a a est operator, aa um se poate ,edea 4n ele e urmea*& Pentru a putea tipri un obie t cout MM 4biect ? ,om supra4n r r a .4ntrBo prim ,ariant/ operatorul de inserare .<</ printrBo fun !ie prieten astfel1 class Clas E &&& friend ostreamK operator MM . ostreamV, Clas /? &&& F? >xemplu1 7 7 Pr ogr am 4 per a tor LL Fr ie nd HH
Einclude <io!tream.#> Einclude <conio.#>

cla!! X { 2rotected: int 2,D; 2u)lic: X (int m=-, int n=1) { 2=m;D=n; / friend ostrea$5 operator << ( ostrea$5 s, C r ) { s << r,p << EBE << r,V; return s; } /; void main (void) { X r(12,1%); cout << E r = E << r << endl; /
clr!cr(); 0etc#();

77 /e+ultateF
r = *7B*8

0e obser, a est operator se poate apli a 4nln!uit pentru fun !ia prieten returnea* o referin! la streamBul urent& 7n ele e urmea* ,om da o alt re*ol,are fr a utili*a o fun !ie prieten . are mi orea* gradul de prote !ie a datelor/& Pentru o Clas ,om s rie o fun !ie membru de %iprire, are ,a fi apelat de tre fun !ia de supra4n r are a operatorului MM astfel1 class Clas E publicF &&& ostreamK %iprire &&& . ostreamK s /?

F? ostreamK %iprire . ostreamK s / E s MM &&& ? return s F ostreamK operator MM . ostreamV, Clas c / E return c*%iprire.s/ F

04&04&@4

@24

C+

PO
Pentru exemplul anterior .K/ programul ,a fi urmtorul1 77 Pr ogr am 4 per at or PP HH

Einclude <io!tream.#> Einclude <conio.#>

cla!! X { 2rotected: int 2,D; 2u)lic: X (int m=-, int n=1) { 2=m;D=n; / ostrea$5 /ip (ostrea$5 s) { s << p << EBE << V; return s; } /; ostrea$5 operator << ( ostrea$5 s, C r ) { return r,/ip(s); }
clr!cr(); 0etc#();

void main (void) { X r(12,1%); cout << E r = E << r << endl; /

77 /e+ultateF
r = *7B*8

2E.2. 0peratorul de extragere

QQ

Opera!iile de itire se pot efe tua u operatorul de e,tragere QQ & Operandul st)ng trebuie s fie un obie t al lasei istream .sau al unei lase deri,ate/& Pentru itirea de la dispo*iti,ul standard se ,a folosi obie tul cin& Operandul drept este o expresie pentru al rei tip .standard sau abstra t/ a fost supra4n r at operatorul QQ & Pentru tipurile standard a fost supra4n r at printrBo fun !ie membru de forma1 istreamK operator QQ . $ip!0tandard ( /? Pentru tipurile abstra te programatorul poate supra4n r a a est operator, aa um se poate ,edea 4n ele e urmea*& Pentru a putea iti un obie t cin QQ 4biect ? ,om supra4n r r a .4ntrBo prim ,ariant/ operatorul de extragere .==/ printrBo fun !ie prieten astfel1 class Clas E &&& friend istreamK operator QQ . istreamV, Clas( /? &&&

F?

04&04&@4

@2%

C+

PO

>xemplu1 77
Einclude <io!tream.#> Einclude <conio.#>

Pr ogr am 4 per a tor MM Fr ie nd

HH

cla!! X { 2rotected: int 2,D; 2u)lic: X (int m=-, int n=1) friend o!tream$ o2erator << { ! << r.2 << " . " << friend istrea$5 operator ;; { s ;; r,p ;; /; void main (void) { X r; cin ;; r; cout << " r = " << r << endl; /

{ 2=m; D=n; ( o!tream$ !, r.D; return ( istrea$5 s, r,V; return

/ X r ) !; / C5 r ) s; }
clr!cr(); 0etc#();

0e obser, a est operator se poate apli a 4nln!uit pentru fun !ia prieten returnea* o referin! la streamBul urent& 7n ele e urmea* ,om da o alt re*ol,are fr a utili*a o fun !ie prieten .fun !ie are mi orea* gradul de prote !ie a datelor/& Pentru o Clas ,om s rie o fun !ie membru de Citire, . are ,a fi apelat de tre fun !ia de supra4n r are a operatorului QQ / astfel1 class Clas
E

publicF

istreamK Citire
&&&

&&&

. istreamK s /?

istreamK Citire . istreamK s /? E s QQ &&& ? return s


F E F

F?

istreamK operator QQ . istreamV, Clas( c /? return c* Citire .s/

Pentru exemplul anterior .K/ programul ,a fi urmtorul1 77


Einclude <io!tream.#> Einclude <conio.#>

Pr ogr am 4 per at or QQ

HH

cla!! X { 2rotected: int 2,D; 2u)lic: X (int m=-, int n=1) { 2=m; D=n; / o!tream$ ?i2 (o!tream$ !) { ! << 2 << "." << D; return !; / istrea$5 0it (istrea$5 s) { s ;; p ;; V; return s; } /; o!tream$ o2erator << ( o!tream$ !, X r ) { return r.?i2(!); / istrea$5 operator ;; ( istrea$5 s, C5 r ) { return r,0it(s); } void main (void) { X r; clr!cr(); cin ;; r ; cout << " r = " << r << endl; 0etc#();

04&04&@4

@2M

C+

PO

2E.3. Intrri8Ie0iri cu format


Kiprirea .afiarea/ datelor dup un anumit format .ablon/ pre i*at .asemntor fun !iilor scanf i printf/ se poate reali*a i u a(utorul ierar8iilor de lase definite 4n C++, fie prin apelul fun !iilor membru setf% &idt"% fill% precision , fie u a(utorul unor metode spe iale numite manipulatori&

2E.3.1. unciile membru setf, +idt(, fill, precision


Clasa ios on!ine o dat membru x"flags are on!ine formatul opera!iilor de intrareB ieire& 7n a eeai las mai este definit un tip enumerare prin are se poate referi formatul orespun*tor on,ersiei ataate opera!iilor de transfer1
cla!! ios { enum { !*i2"! left ri0#t internal dec oct #e= !#o")a!e !#o"2oint u22erca!e !#o"2o! !cientific fi=ed unit)uf !tdio /; /; = = = = = = = = = = = = = = = -=---1, -=---2, -=---+, -=---', -=--1-, -=--2-, -=--+-, -=--'-, -=-1--, -=-2--, -=-+--, -=-'--, -=1---, -=2---, -=+--.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. salt peste .ignor la itire/ ara terele albe adrare la st)nga adrare la dreapta spa!iile dup semn sau ba* on,ersie 4n *e imal on,ersie 4n o tal on,ersie 4n 8e*a afiarea ba*ei afiare pun t *e imal ifre 8exa u litere mari afiare u semn reale u exponent reale fr exponent ,idare *one tampon sup s riere ,idare stdout i stderr \ 2u)lic: \

Ptributul ,!flags are o ,aloare impli it pentru fie are tip standard, are se poate modifi a utili*)nd fun !ia membru setf des ris 4n ontinuare& Metoda setf are urmtoarele dou forme1 @/ long setf .long format/? 2/ long setf .long bit, long grup/? +un !ia modifi atributul ,!flags pre i*)nd 4ntraga ,aloare .,arianta a// sau pre i*)nd un grup de bi!i i bitul dorit din adrul grupului .,arianta b//& erupele .i ,alorile orespun*toare/ sunt adjustfield .left, rig(t, internal/, basefield .dec, oct, (e,/ i floatfield .scientific, fi,ed/ 7n ambele ,ariante fun !ia returnea* ,aloarea anterioar a atributului ,!flags* ceferirea grupului i bitului dorit se fa e prin numele lasei urmat de operatorul de re*olu!ie i bitul dorit . ios;;b/& Valoarea atributului ,!flags se poate ob!ine i prin apelul metodei flags .cout.fla0!./ /& Ptributul ,!)idt( on!ine lungimea minim a )mpului de afiare a unei date .respe ti, lungimea maxim a )mpului din are se fa e itirea/, a,)nd ,aloarea impli it 04&04&@4 @2O

C+

PO

nul .afiare pe lungimea minim ne esar/, are se poate modifi a utili*)nd fun !ia membru &idt" des ris 4n ontinuare 4n ambele forme1 a/ int &idt" . /? b/ int &idt" .int lungime/? +un !ia returnea* ,aloarea atributului ,!flags .,arianta a// sau modifi atributul ,!)idt( pre i*)nd noua ,aloare .lungime are poate fi o expresie/ i returnea* ,aloarea anterioar a atributului ,!)idt( .,arianta b//* Uup fie are transfer ,aloarea atributului ,!flags de,ine nul& Ptributul ,!fill on!ine ara terul de umplere ne esar ompletrii )mpului de afiare a datei 4n situa!ia 4n are lungimea a estuia este mai mare de )t lungimea ne esar, a,)nd ,aloarea impli it spa!iu .C C/, are se poate modifi a utili*)nd fun !ia membru fill 1 a/ 8ar fill . /? b/ 8ar fill . 8ar car/? +un !ia returnea* ,aloarea atributului ,! fill .,arianta a// sau modifi atributul ,! fill pre i*)nd noul ara ter de umplere .car/ i returnea* ,aloarea anterioar .,arianta b//* Ptributul ,!precision on!ine pre i*ia de afiare .numrul de *e imale/ a unei date de tip real, a,)nd ,aloarea impli it 0, are se poate modifi a utili*)nd fun !ia membru precision 1 a/ int precision . /? b/ int precision .int n/? +un !ia returnea* ,aloarea atributului ,! precision .,arianta a// sau modifi atributul ,! precision pre i*)nd noua pre i*ie .p/ i returnea* ,aloarea anterioar .,arianta b//* 7n exemplul urmtor se poate ,edea apelul fun !iilor pre*entate anterior pre um i re*ultatele ob!inute1
.. Einclude <conio.#> Einclude <io!tream.#> cla!! N { int 2u)lic: i!tream$ o!tream$ o2erator /; c; N (int ==) { c==; / 9it (i!tream$ !) { ! >> c; return !; / ?i2 (o!tream$ !) { ! << c; return !; / dou)le ( ) { return t#i!6> c; / 0p erat oru l d e i n serare

MM cu form at BB

.. ' ); 4

i!tream$ o2erator >> (i!tream$ !, N$ 9) { return 9.9it(!); / o!tream$ o2erator << (o!tream$ !, N 9) { return 9.?i2(!); /

04&04&@4

@2N

C+

PO

void main (void) { N n; cout << " Dati un numar natural : "; cin >> n; cout << " Numarul natural n e!te: " << n << endl; cout.setf(ios66(e!,ios66basefield); cout << " Numarul natural n e!te: " << n << endl; cout.setf(ios66s(o+base); cout << " Numarul natural n e!te: " << n << endl; cout << " Numarul natural n e!te: "; cout.setf(ios66dec,ios66basefield); cout.+idt((,); cout.fill(A.A); cout << n << endl; dou)le =(n); cout << " Numarul n.%.1+17( e!te: "; cout.setf(ios66fi!ed,ios66floatfield); cout.+idt(((); cout.fill(AHA); cout.precision(2); cout << =.%.1+17( << endl;

clr!cr();

0etc#e(); /

/e+ultate1
Dati un Numarul Numarul Numarul Numarul Numarul numar natural : natural n e!te: natural n e!te: natural n e!te: natural n e!te: n.%.1+17( e!te: 1-1-,+ -=,+ ...1-HHHH%1.'%

2E.3.2.

Vanipulatori

Ptributele ,!flags, ,!)idt(, ,!fill i ,!precision pot fi modifi ate i u a(utorul manipulatorilor, a etia a,)nd a,anta(ul pot fi apela!i 4nln!uit .deoare e returnea* referin! la stream/& Primii apte manipulatori pre*enta!i 4n ontinuare sunt de lara!i 4n fiierul iostream*(, iar ultimii ase 4n fiierul iomanip*( 1
@& 2& A& 4& %& M& O& @& 2& A& 4& %& M&

Us dec oct &e. flus& ends endl setbase 9int b: setiosflags 9int f: resetiosflags 9long f: setU 9int l: setfill 9int c: setprecision 9int p:

setarea bitului de salt .s.ip)s/ on,ersie 4n *e imal on,ersie 4n o tal on,ersie 4n 8exa ,idarea *onei tampon a ob& stream inserare ar& bul CJ0D tre e la r)nd nou i ,idarea *onei tampon definete ba*a 4n are se fa e on,ersia setarea unor bi!i pre i*a!i tergerea unor bi!i pre i*a!i definete lungimea )mpului definete ara terul de umplere definete numrul de *e imale

>xemplul urmtor utili*ea* manipulatorii pentru a reali*a tiprirea re*ultatelor dorite1

04&04&@4

@2$

C+

PO
.. 0p erat oru l d e i n serare

MM cu m anipulatori BB
*ezultate 1
n 6 *HH n = *HH n = A9 6 7HH* n = H!A9 n = ,,,*HH nB8= ____88,88

Einclude <conio.#> Einclude <io!tream.#> Ginclude <io$anip,(;


cla!! N { int c; 2u)lic: N (int ==) { c==; / i!tream$ 9it (i!tream$ !) { ! >> c; return !; / o!tream$ ?i2 (o!tream$ !) { ! << c; return !; / o2erator dou)le ( ) { return t#i!6> c; / /; i!tream$ o2erator >> (i!tream$ !, N$ 9) { return 9.9it(!); / o!tream$ o2erator << (o!tream$ !, N 9) { return 9.?i2(!); /

void main (void) { N n; cout << " n : cout << " n = cout << " n = cout << " n = cout << " n = cout << "n.%= /

clr!cr(); "; cin >> n; " << n << endl; " << (e! << n <<" : "<< cout.!lags() << endl; " << setiosfla3s(cout.sho,base) << n << endl; " << dec <<set+(,)<<setfill(A.A)<< n << endl; " << set+(N)<<setfill(=_=)<<setprecision(7)<<n.%; 0etc#e();

7n exemplul urmtor se utili*ea* manipulatorii pentru a reali*a itirea datelor utili*)nd un format ,ariabil .&idt"(i 1)/1
Einclude <conio.#> Einclude <io!tream.#> Ginclude <io$anip,(; cla!! N { c#ar c;,<; 2u)lic: N ( i!tream$ 9it (i!tream$ o!tream$ ?i2 (o!tream$ /; i!tream$ o2erator >> (i!tream$ !, o!tream$ o2erator << (o!tream$ !, void main (void) {

..

0p erat oru l d e e xt r age re

QQ cu m anipulatori BB
*ezultate 1
* 6 *789FA?MNH _______________ n = * 7 6 _______________ n = 78 8 6 _______________ n = 9FA 9 6 _______________ n = ?MNH F 6 *789FA?MNH _______________ n = *789F
clr!cr();

) { c;-<=-; / !) { ! >> c; return !; / !) { ! << c; return !; / N$ 9) {return 9.9it(!);/ N 9) {return 9.?i2(!);/

N n; for (int i=1; i<=7; i ) { cout << i << " : "; cin >> set+(i 1) >> n ; .. cin.+idt((i 1); cout << " HHHHHHHHHHHHHHH n = " << n << endl; /
0etc#e(); /

04&04&@4

@A0

C+

PO

2E.". 'ratarea erorilor la operaiile de intrare8ie0ire


Ua o opera!ie de intrare5ieire nu sBa 4n 8eiat u su es .nu sBa desfurat ore t, situa!ie 4n are ,om spune streamul a(unge 4ntrBo stare de eroare/, programul poate lua o de i*ie . ontrol)nd 4n a est fel desfurarea transferurilor de date 4n s opul ore titudinii desfurrii lor/& 'ipul erorii .un codul de retur/ poate fi aflat ,erifi )nd bi!ii datei membru state .de tip int/ prin tipul enumerare io"state definit 4n lasa ios astfel1
cla!! ios { enum { 2u)lic: = = = = = -=--, -=-1, -=-2, -=-+, -='-, .. .. .. .. .. opera!ie ore t sf)rit de fiier eroare intrare5ieire opera!ie in,alid eroare fatal \ \

0ood)it eof)it fail)it )ad)it #ardfail /;

/;

@/ 2/ A/ 4/ %/

Valorile .bi!ilor/ atributului state se pot determina utili*)nd urmtoarele fun !ii1 int good ./? 55 bi!ii de eroare .eofbit, failbit, badbit, (ardfail/ nu sunt seta!i, int eof ./? 55 este setat bitul eofbit, int fail ./? 55 este setat bitul failbit sau badbit sau (ardfail, int bad ./? 55 este setat bitul badbit sau (ardfail, int rdstate ./? 55 returnea* toate ,alorile bi!ilor de stare .,aloarea datei state/&

Valorile bi!ilor datei state pot fi modifi ate u fun !ia1 ,oid clear .int G 0/? 'a un apel fr paramteru a tual se ,or anula bi!ii eofbit, failbit i badbit iar pentru a pre i*a un anumit bit se poate folosi a parametri a tual o expresie de forma1 in&clear .ios11nume!bit/? 55 nume!bit restul anula!i >xemplu1 in&clear .ios11bad!bit ^ in&rdstate./ /? 55 bad!bit restul nes 8imba!i Citirea .in lusi, a ara terelor albe/ se poate reali*a u fun !ia membru getline definit astfel1 istreamV getline .2un3signed 8ar6 +, int n, 8ar c G DJnD/? are itete el mult nB@ ara tere sau 4nt)lnete ara terul c& 7n exemplul urmtor se ites mai multe u,inte separate prin spa!ii1
\

cla!! N { c#ar

c;'-<;

*ezultate 1
6 0iteste spatiile, = 0iteste spatiile, 6 Z[

\ /; \ void main (void) { N n; /

i!tream$ 9it (i!tream$ !) {!. 3etline (c,'-); return !;/

do {cout <<A:A; cin >>n; if (cin. 3ood ()) cout <<A=A<<n<<endl;/ "#ile (3cin. eof());

04&04&@4

@A@

C+

PO
7n exemplul urmtor se repet itirea p)n )nd numrul tastat este ore t1

Einclude <conio.#> Einclude <io!tream.#> cla!! N { int c; 2u)lic: N ( ) { c=-; / i!tream$ 9it (i!tream$ !) { ! >> c; return !; / o!tream$ ?i2 (o!tream$ !) { ! << c; return !; / /; i!tream$ o2erator >> (i!tream$ !, N$ 9) { return 9.9it(!); / o!tream$ o2erator << (o!tream$ !, N 9) { return 9.?i2(!); / void main (void) {

..

C on t rol u l erori l or l a op ) I1E BB *ezultate 1


n 6 a 2tate 6 7 n 6 Z[ 2tate 6 8 n 6 *78 2tate 6 H n = *78
clr!cr();

N n; int Kre!it; do { cout << " n : "; cin >> n ; cout << " 1tate : " << #e= << cin.rd!tate() << endl; if (cin.0ood()) Kre!it=-; el!e { Kre!it=1; cin.clear(); .. anulare )iti c#ar t;277<; .. zona tam2on cin.0etline(t,277); .. vidare z.t. / / "#ile (Kre!it); cout << " n = " << dec << n << endl;
/

0etc#e();

Verifi area strii de eroare a unui stream se mai poate fa e prin operatorul 5 sau prin on,ersia 4ntrBun pointer fr tip .,oid6/ 1
a/ operatorul 5 este supra4n r at u metoda lasei ios1

int operator 5 . /?

55 returnea* o ,aloare egal u a fun !iei fail./?

Ue exemplu, 4n programul Propo+iie*Cpp pre*entat anterior instru !iunea if . in&good.// out << RGR << n << endl? se poate 4nlo ui u if .I5 in/ out << RGR << n << endl? sau mai simplu u if . in/ out << RGR << n << endl? on,ersia spre tipul ,oid6 permite ,erifi area strii de eroare a streamBului, i poate fi utili*at 4n onstru !ii de forma if . s == dat/ j ? re*ultatul .o referin! la obie tul stream lasei istream/ fiind '&"" .0/ da fun !ia fail. /
b/

0& Citirea ara terelor sau a datelor se poate reali*a i u fun !ia membru get definit astfel1 a/ int get . /? 55 e,trage un ara ter din streamBul urent, 55 nu e,trage ara terul c&

b/ istreamV get .2un3signed 8ar6 +, int n, 8ar c G DJnD/?

04&04&@4

@A2

C+

PO

7n exemplul urmtor se poate ,edea at)t utili*area on,ersiei spre tipul ,oid6, pre um i a fun !iei membru get . 4n ,arianta b//1
.. Einclude <io!tream.#> Einclude <!trin0.#> cla!! N { c; @e!; @er; @et; N (int c=-, c#ar8 me!=" : ", c#ar8 mer=" Lrr.Bn", c#ar8 met=" = "); i!tream$ 9it (i!tream$ !); o!tream$ ?i2 (o!tream$ !) {!<<@et<<c; return !;/ /; c#ar8 met) !trc2N(@e!,me!); !trc2N(@er,mer); !trc2N(@et,met); int c#ar8 c#ar8 c#ar8 2u)lic: C on t rol u l erori l or l a op ) I1E BB

N::N (int c, c#ar8 me!, c#ar8 mer, { t#i!6>c=c; @e!=ne" c#ar;!trlen(me!) 1<; @er=ne" c#ar;!trlen(mer) 1<; @et=ne" c#ar;!trlen(met) 1<; /

i!tream$ N::9it(i!tream$ !) { cout << @e!; "#ile (3(!>>c)) { c#ar t;277<; !.clear(); !.0et(t,277); if (!.0et()==LTG) return !; cout << @er << @e!; / return !; / i!tream$ o2erator >> (i!tream$ !, N$ 9) { return 9.9it(!); / o!tream$ o2erator << (o!tream$ !, N 9) { return 9.?i2(!); / void main (void) { N n; do { cin >> n; if (cin) cout << n << endl; / "#ile (3cin.eof()); / *ezultate 1
6 *78 = *78 6 a #rr, 6 9FA = 9FA 6 !y #rr, 6 Z[

04&04&@4

@AA

C+

PO

Cuprins
pag) 1. Redactarea programelor C.....................................................................2
@&@& eeneralit!i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2 @&2& 0tru tura unui program&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2 @&A& +un !ii&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&A @&4& >lementele limba(ului&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4

2. 2ariabile...................................................................................................>
2&@& Variabile globale&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&% 2&2& Variabile lo ale&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&% 2&A& Variabile de tip registru&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&M 2&4& Qni!iali*area ,ariabilelor&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&O

3. #.presii.....................................................................................................F
A&@& Operatori&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&N

". Operaii de intrare8ie0ire.......................................................................12


4&@& +un !ia Printf &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@2 4&2& +un !ia 0 anf &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@A 4&A& +un !ia PutC8ar &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@4 4&4& +un !ia eetC8ar &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@4 4&%& +un !ia eetC8e &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@4 4&M& +un !ia eetC8 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@4

>. Instruciuni.............................................................................................1>
%&@& Qnstru !iunea Vid &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@% %&2& Qnstru !iunea >xpresie &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@% %&A& Qnstru !iunea Compus &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@% %&4& Qnstru !iunea Qf &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@M %&%& Qnstru !iunea 0#it 8 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@M %&M& Qnstru !iunea "8ile &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@O %&O& Qnstru !iunea UoL"8ile &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@O %&N& Qnstru !iunea +or&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@N %&$& Qnstru !iunea Brea` &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@N %&@0& Qnstru !iunea Continue &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@N

04&04&@4

@A4

C+

PO

%&@@& Qnstru !iunea eoKo &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@N %&@2& Ppelul unei fun !ii &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@$

?. 3ointeri...................................................................................................21
M&@& Ue lararea unui Pointer &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2@ M&2& Opera!ii u Pointeri &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2@ M&A& Plo are dinami a memoriei &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2A M&4& Pointeri la fun !ii&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2A M&%& -tili*area parametrilor din linia de omand&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2% M&M& Ue lararea onstantelor &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2% M&O& 0ti,a &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2%

E. Recursi%iate ...........................................................................................2? F. 'ipuri de date.........................................................................................2E


N&@& Uefinirea unui tip de dat .tTpedef/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2O N&2& Kipul enumerare .enum/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2O N&A& Uefinirea unei stru turi .stru t/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2N N&4& cedefinirea unei date .union/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2$ N&%& C)mpuri de biti&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2$

G. Structuri de date dinamice....................................................................3$&@& 'ist simplu 4nln!uit ordonat&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&A0 $&2& Pbori binari&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&A@

1-. Ktili6area fi0ierelor..............................................................................33


@0&@& bi,elul inferior&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&AA @0&2& bi,elul superior&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&AM

11. uncii standard..................................................................................."1


@@&@& Ma rouri de lasifi are&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4@ @@&2& Ma rouri de transformare a simbolurilor&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4@ @@&A& Con,ersii&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4@ @@&4& +un !ii de prelu rare a irurilor de ara tere&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&42 @@&%& +un !ii de al ul&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&42 @@&M& +un !ii pentru ontrolul pro eselor&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&42 @@&O& +un !ii pentru timp&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4A @@&N& +un !ii di,erse &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4A

04&04&@4

@A%

C+

PO

12. #cranul Hn mod te.t............................................................................."" 13. #cranul Hn mod grafic.........................................................................."" 1". aciliti CII......................................................................................."F
@4&@& >xtensii ale limba(ului C&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4N @4&2& Operatori&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4$ @4&A& 0tru tur, uniune i enumerare&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%2

1>. uncii CII...........................................................................................>"


@%&@& +un !ii Qnline&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%4 @%&2& +un !ii de tip referin!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%% @%&A& 0upra4n r area fun !iilor&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%O @%&4& Qni!iali*area parametrilor formali&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%N @%&%& +un !ii membru pentru 0tru turi&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$

1?. 'ip !bstract de 1at...........................................................................?1E. 3rogramare orientat obiect 9OO3:.................................................?"


@O&@& Uefinirea Claselor &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&M% @O&2& Constru tori i Uestru tori &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&M$

1F. Specificarea claselor N ,imba$ul KV,9Knified Vodeling ,anguage: E2 1G. uncii 0i Clase 3rietene 9 riend:......................................................E3 2-. Vembri statici 9Static: 88 ^;................................................................EE
20&@& Ptribute .Uate membru/ 0tati e 55 k1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OO 20&2& Metode .+un !ii membru/ 0tati e 55 k1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&O$

21. 3ointeri la Vetode...............................................................................EG 22. SupraHncrcarea operatorilor ...........................................................F2


22&@& Operatorul de asignare .atribuire/ i ini!iali*are .G/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NA 22&2& Operatorii de atribuire +G, G, 6G, 5G&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&N% 22&A& Operatorii de in rementare .++/ i de rementare ./&&&&&&&&&&&&&&&&&&&&&&&&&&&NM

23. Con%ersii utili6ator..............................................................................FE


2A&@& Con,ersii impli ite&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NO 2A&2& Con,ersii expli ite&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$0

04&04&@4

@AM

C+

PO

2". Clase 7ablon 9'emplate:.....................................................................G2


24&@& +un !ii dablon .Kemplate/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$2 24&2& Clase Kemplate &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$A 24&A& Qmplementarea elementelor Kemplate &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$4

2>. Relaii Hntre clase.................................................................................G>


2%&@& cela!ia de Pso ia!ie &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$% 2%&2& cela!ia de Pgregare&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$ 2%&A& Clase 7n uibate.imbri ate/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@02 2%&4& cela!ia de deri,are&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@04

2?. 3olimorfism........................................................................................11>
2M&@& +un !ii membru Virtuale&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@M 2M&2& Clase abstra te B fun !ii membru ,irtuale pure&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@$

2E. Ierar&ii pentru Intrri8Ie0iri............................................................123


2O&@& Operatorul de inserare <<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@2A 2O&2& Operatorul de extragere ==&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@2% 2O&A& Qntrri5Qeiri u format&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@2O 2O&4& Kratarea erorilor la opera!iile de intrare5ieire&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@A@

133 Cuprins....................................................................................................13" Wibliografie..............................................................................................13F

04&04&@4

@AO

C+

PO

Wibliografie

@& 1an Roman, &ngineria programrii obiectuale, >ditura Plbastr, Clu(Lbapo a, @$$M? 2& 1orin = Ioan Vircea 3opo%ici< Iustin 'anase, $e(nologia orientat pe obiecte* Aplicaii, >ditura Keora, Bu ureti, @$$M? A& #llis HoroUit6< Sarta$ Sa&ni< 1ines& Vet&a , Fundamentals of data structures in CB
B,

Computer 0 ien e Press, be# Yor`, @$$%?

4& ,i%iu )egrescu, %imbajele C "i CBB pentru Dnceptori, >ditura Plbastr, Clu(Lbapo a, @$$O? %& '&omas !. Standis&, Data 0tructures, Algorit(ms K 0oft)are Principles in C, PddisonB"eslaT, California, @$$%? M& 2asile Cioban< (solt 1ar%aS, 'etode evoluate de programare, -BBBMateLQnfo, @$$$?

04&04&@4

@AN

S-ar putea să vă placă și