Documente Academic
Documente Profesional
Documente Cultură
Programare Orientata Obiect in C++
Programare Orientata Obiect in C++
++
POO
Prejmerean Vasile
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&
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
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&
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
04&04&@4
C+
PO
'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
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
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
04&04&@4
@0
C+
PO
Con%ersiile implicite 9reali*ate automat: se fa astfel1
a/ b/ / d/ e/
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
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
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
2 f 3 , unde1
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 &
".?.
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 &
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&
@
>.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/
B
Declaraii &nstruciuni
A
>xemplu1 E int i?
55 Variabil local instru !iunii? 55
f .i/? F ?
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
C break? D C break? D
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
.. )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
04&04&@4
@O
C+
PO
04&04&@4
@N
C+
PO
#8ile .e,pr@/ if .e,pr2/ goto et?
&&&
E &&&
&&& F 55 instru
!iune
et1 &&&
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
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
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?
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
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.
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
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();
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./?
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
&&&
>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/
,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/
.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
,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
Valoare 3 ?
sau
-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=?
,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
int Pop./ E if .bext=0/ return 0tiva2BBbext3? else E printf.S 0ti,a ,ida JnS/? return 0? F
F
E bextG0? F E
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&
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+
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+
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?
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./?
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
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(); /
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;
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
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.1.
unde1
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.
+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.".
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.>.
1-.1.?.
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+
1-.2.1.
unde1
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
&&&
1-.2.2.
unde1
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
04&04&@4
AM
C+
PO
1-.2.3. Tnc&iderea unui fi0ier 9#Close:
int fclose . +Q'> 6 Pf / ?
1-.2.".
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=-;
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();
C+
PO
Einclude <!tdio.#> Einclude <conio.#> void main (void) { F%"# 8Produse; c#ar Den;2-<; int 9ant; float Oret;
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
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!!.#>
.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.
.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(! );
1-.2.?.
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/&
1-.2.E.
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;
2rintf ("Bn Numarul de articole : "); :rticolul 4d 6 Den. : "); 6 9ant.: "); 6 Oret : ");
f+rite ($:rt,!izeof(:rticol),1,Of);
fclo!e (Of); /
...
0etc#ar();
{...
fread
($: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
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
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.
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.".".
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.?.
04&04&@4
42
C+
int
PO
11.E.
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
Semnifica 'ie Cite"te Data curent F 'odific Data curent F Cite"te 4ra 2,act F 'odific 4ra 2,act F
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&
04&04&@4
4A
C+
PO
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
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
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/?
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/
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&
Einclude <iostrea$.(>;
void main (void)
{ int i;
<< " 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.#>;
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#();
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 =
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 = " <<
for (int i=11; i<::i; ::i6=11) cout << i <<"::"<< ::i << endl; /
1".2.2.
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.#>;
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#();
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#();
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.
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.#>;
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();
.. :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+
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.#>;
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
!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.#"
!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.
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+
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#();
/
..
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); /
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)
{
{ { { {
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+
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.#>;
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>.>.
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.#"
!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
!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() ; /
3rogram.Cpp
Compilare
3rogram.Ob$ %in.-editare
'ad.& Compilare
3rogram.#.e
'ad.Cpp
3rogram.Ob$
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 >);
.. 3Vult.Cpp BB
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
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/&
- implementarea unui KPU, - instana unei lase, - mesajul prin are se asigur interfa!a .opera!iile/&
metoda
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+
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,
protected permite a esul din lasele deri,ate, public permite a esul din afara lasei?
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 };
pri1ate6
(!,y) e
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
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+
-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();/ /;
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*
onstru torul i
cla!!
Natural { 2u)lic:
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
Specificarea rela'iilor dintre clase 1 rela!ia de aso iere 1 rela!ia de deri,are 1 55 prietenie 55 mo"tenire
04&04&@4
O2
C+
PO
cla!! Punct {
2u)lic:
/;
float !,y;
BB pri1ate6
Ounct ( ) { == -, N= -; / Ounct (float =-, float N-) { ===-, N=N-; /
cla!! 0erc
2u)lic:
Punct 9;
float r;
/;
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
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:
/;
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
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.#>
Clasa friend
E include <0ra2#ic!.#>
E include <io!tream.#>
BB
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 () { /
/;
[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.
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(); /
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&
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.#>
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; /
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)); / () { /
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(); /
// x(t) // y(t)
04&04&@4
ON
C+
PO
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=-; /
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
2t_2us, .r_Oos; @inX() { return @a!X() { return @inP() { return @a!P() { return
} } } }
BB BB BB BB
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();
Krafic @od(DL?L9?);
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
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 () { \ /
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^
// 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; /
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
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.#>
..
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
friend
a: b:
/; 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+
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.#>
(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 ... ... ... ... ... < <= > >= == <>
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
(Op.
:=, )= ) BB
E include <Mo!tream.#>
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+
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:
..
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
/;
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; /
04&04&@4
NM
C+
PO
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.#>;
X void /;
Produs (X);
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();
= : "); 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*
04&04&@4
NN
C+
PO
77 Numere comple,eF %C
Einclude <io!tream.#> Einclude <conio.#> Einclude <mat#.#>
>xemplu1
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; /
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
cla!! X { 2u)lic:
lon0 m; lon0 n; X (lon0, lon0); operator double(); X o2erator 8(X); ?i2 (con!t c#ar8 @e!);
/; 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#();
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#.#>
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".1.
+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.#>
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+
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+
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.#>
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=;
G pra3$a option XO3d tN2edef Wect<int, 1-> Wint1-; tN2edef Wect<float,1-> Wflo1%;
04&04&@4
$4
C+
PO
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&
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
Clas asociat BB
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
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
04&04&@4
$N
C+
PO
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
..
Clas ,gregat BB
<<
ectSort.Cpp >>
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 ( ) /;
{ { { {
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
Raza 9entrul
-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();
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
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[[[
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 /;
N(s:*)
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; /
1emn; ) : N( ) !) : N(! 1) ) )
/ / / /
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
..
*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;
!,y;
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
Cl"!er1
Cl"!er2
Clas"!eri&at
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.#>
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%--,'); /
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.#>
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
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 &
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+
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
{
0(9)8 2) { 26>f(); /
clr!cr();
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
{
0(9)5 r) { r.f(); /
clr!cr();
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.#>;
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();
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+
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: 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 { { }
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
Ounct
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:
/; 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);
04&04&@4
@2@
C+
PO
0etc#e();
04&04&@4
@22
C+
PO
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/&
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/&
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
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#();
77 /e+ultateF
r = *7B*8
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.#>
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; /
/ 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 /?
F?
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
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
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
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) {
..
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();
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
/;
@/ 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[
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) {
..
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 . /?
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&
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
>. 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%
G. Structuri de date dinamice....................................................................3$&@& 'ist simplu 4nln!uit ordonat&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&A0 $&2& Pbori binari&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&A@
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
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$
04&04&@4
@AM
C+
PO
2?. 3olimorfism........................................................................................11>
2M&@& +un !ii membru Virtuale&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@M 2M&2& Clase abstra te B fun !ii membru ,irtuale pure&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@$
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,
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