Sunteți pe pagina 1din 138

Universitatea Stefan cel Mare Suceava Facultatea de Stiinte Economice si Administratie Public Specializarea : Informatic Economic Anul : III

!urs Pro"ramarea #rientat #biect

$$
P##

2010 - 2011

!$

P#

1. Redactarea programelor C
1.1. Generaliti
Mediul %orland ! a fost e&tins la 'isual ! (i !$$ %uilder adaptate pro"ramrii orientate obiect (i interfe)ei "rafice *indo+s ,-. /imba0ul ! a fost e&tins la !$$ permi)1nd aplicarea conceptelor pro"ramrii prin abstractizarea datelor (i pro"ramrii orientate spre obiecte. Fi(ierele surs pot avea e&tensia ! !P sau !PP.

1.2. Structura unui program


Un pro"ram ! este con)ine o func)ie principal 2main3 (i eventual alte func)ii secundare apelate de ctre func)ia principal situate la acela(i nivel 2far imbricare3. Structura unui pro"ram este urmtoarea: Directive de procesare, Declaraii de date globale, Declaraii de funcii, sau doar 4 Antete de funcii 2prototipuri3 5 Funcia principal; 4 Descrierea funciilor 2implementri3 5 Se observ c descrierea func)iilor se poate face fie 6n 6ntre"ime 6naintea func)iei main fie doar prototipul 6nainte iar corpul dup aceasta. Comentariile se scriu 6ntre caracterele 78 (i 87 2 ... 78 comentariu 87 ... 3 sau la nivelul unui r1nd dup caracterele 77 2 ... 77 comentariu 3. 9nainte de compilare un pro"ram este precompilat de ctre un preprocesor care permite includerea unor fi(ier surs definirea (i apelul unror macrouri precum (i o compilare condi)ionat. Includerea unui fi(ier surs 28.: sau 8.c3 se realizeaz prin directiva include astfel: sau E&emplu: ; include specificator_fi ier ; include <specificator_fi ier= ;include <stdio.:=> ;include <iostream.:=> 77 pentru fi(iere utilizator 77 pentru fi(iere standard 77 Standard Input Output Header 77 Console Input Console Output

?@.AA.AB

!$

P#
Constantele simbolice se definesc cu a0utorul directivei define astfel: ;define !ume_constant "ir_caractere

E&emplu: ;define Pi B.ADA-,C 77 9nlocuie(te Pi cu B.ADA-,C # constant simbolic poate fi redefinit sau anulat 2;undef !ume_constant3.

1.3.

uncii

# func)ie este format dintrEun antet (i un bloc 2corp3. Ea poate fi apelat dac a fost definit 6n 6ntre"ime sau doar antetul su. !ntetul unei func)ii are urmtorul format: #ip !ume 2$ist_parametri_formali3 unde:

#ip este tipul valorilor func)iei 2codomeniul3> !ume este un identificator 2liter urmat eventual de alte litere sau cifre3> $ist_parametri_formali con)ine parametrii formali separa)i prin F G.

E&emplu: int Min 2int a int b3 H if 2a<b3 return a> else return b> I #bserva)ie. Prototipul unei func)ii este antetul acesteia urmat de F>G . Corpul unei func)ii are urmtoarea structur: H Declaraii %nstruciuni I E&emple: int Cmmdc2int a int b3 H if 2bJ J?3 return a> else return !mmdc2b a K b3> I int cmmdc2int a int b3 H int rest> do H restJaKb> aJb> bJrest> I +:ile 2restLJ?3> return a> I 77 !mmdc2a b3 77 !mmdc2b a &od b3> 77 cmmdc2a b3

77 rest ?>

?@.AA.AB

!$

P#

1.". #lementele limba$ului


!lfabetul limba0ului ! este format din litere mari (i mici cifre (i caractere speciale 2MnJ!r/f MtJNab3. Identificatorii sunt forma)i din literO urmat eventual de litereO sau cifre 2caracterul FOG poate fi utilizat pe post de liter3. E&ist cu%inte c&eie care pot fi utilizate doar 6n conte&tul definit 2de e&emplu case, float, int, long, return, s'ort, static, structure, s(itc', union, unsigned, void 3. 'ipurile predefinite sunt urmtoarele:

int 2( 4ECA- CA-EA53 s'ort 2( 4ECA- CA-EA53 long 2( 4ECBA CBAEA53 unsigned 2) 4? CAPEA53 float 2*+ 4EB.DA?EB@ B.DA?B@53

double 2*+ 4EA.QA?EB?@ A.QA?B?@53 c'ar 2cod AS!II3) Constantele numerice pot fi *ecimale 2ACB ACB,on" AAAlon"3 octale 2-QQ3 'e+a 2-.abba -/fac3 sau flotante 2C.QA@C@ P.?CBeCB P.?CB#CB3. Constantele de tip caracter pot fi afi abile 2RAR R?R RSR3 sau funcionale 2RMbRJ,ac-space RMrRJ.eturn RMnRJ!e(line RMRRJApostrof RMMRJ,ac-slas' RMvRJ/erticaltab RMfRJ0alt de pagin RM?RJ!ull. Constantele de tip 0ir de caractere se scriu 6ntre ":ilimele 2SMesa0S3. 1eclararea %ariabilelor simple se face astfel: #ip $ist_identificatori_de_variabile; E&emplu: int i 0> float & T> c:ar c>

1eclararea unui tablou se realizeaz astfel: #ip !ume_#ablou 4dA5 4d C5 ... 4di5 ... 4dn5> E&emple: float &4A??5> int a4C C5> &4?5JA> ... &4,,5JA??> a4?54?5JA> a4A54?5JB> a4?54A5JC> a4A54A5JD> 77 & este pointer la primul element 77 a con)ine adresa tabloului 77 indicele -i: ? -i<di

?@.AA.AB

!$

P#

2. 2ariabile
'ariabilele pot fi statice sau dinamice locale sau "lobale.

2.1. 2ariabile globale


Ueclararea unei variabile "lobale se face la 6nceputul unui fi(ier surs 26n afara tuturor func)iilor3 (i poate fi referit p1n la sf1r(itul pro"ramului 26n orice func)ie3. Utilizarea lor 6n alte fi(iere surs se poate face doar dac acestea sunt declarate ca variabile e&terne: e.tern declaraie_variabil E&emplu: 2#.terne.Cpp: ;include <stdio.:=> ;include S s.&S> float 3iJB.AD> 77 variabil "lobal void main 2void3 H float r> printf2S Uati raza cercului : S3> scanf2SKfS Vr3> printf2S /un"imea cercului J Kf MnS /un"!2r33> scanf 2SMnS3> I s.&: float /un"! 2float r3 H e.tern float 3i> return C83i8r> I 77 variabil e&tern

2.2. 2ariabile locale


# variabil local este utilizabil 2vizibil3 doar 6n modulul sau 6n func)ia 6n care a fost definit put1nd fi alocat dinamic 2%ariabil automatic alocat pe stiv3 sau static 2%ariabil static alocat 6n zona de memorie a pro"ramului3. Implicit o variabil local este automatic iar dac dorim ca aceasta s fie static declara)ia ei trebuie s fie precedat de cuv1ntul c:eie static: static declaraie_variabil Func)iile au implicit atributul e&tern deci pot fi apelate din alte fi(iere surs dar dac dorim ca acest apel s nu fie permis atunci se vor declara statice prin scrierea cuv1ntului c:eie static 6naintea antetului acesteia 2 static antet_funcie 3 45.

?@.AA.AB

!$

P#

E&emplu: 2,ocale.Cpp: ;include <stdio.:=> ;include SSursa.:S> void main 2void3 H int n> printf2S Uati un numar < C-P : S3> scanf2SKdS Vn3> printf2S 'aloarea in We&a este S3> PrintOWe&a2n3> 77 PrintO%Tte2n7C-P3> PrintO%Tte2nKC-P3> 54 scanf 2SMnS3> I Sursa.&: static int !ifraOWe&a 2int s3 H static int c> if 2s<A?3 cJs$R?R> else cJs$RAREA?> 77 cJs$R?R$Q return c> I static void PrintO%Tte2int b3 H static int W J b 7 AP> static int : J b K AP> printf2SKcKcS !ifraOWe&a2W3 !ifraOWe&a2:33> I void PrintOWe&a2int z3 H static int WW J z 7 C-P> PrintO%Tte2WW3> static int :: J z K C-P> PrintO%Tte2::3> I

2.3. 2ariabile de tip registru


E&ist posibilitatea ca 6ntrEun re"istru liber s fie alocat o variabil care este utilizat frecvent penntru a mri viteza de e&ecu)ie. 9n re"istrii se pot memora parametri func)iilor sau variabile automatice de tip int c'ar sau pointer. Pentru ca o variabil s fie memorat 6ntrEun re"istru declara)ia ei trebuie s fie precedat de cuv1ntul c:eie register: register declaraie_variabil E&emplu: float f 2 register int i 3> H register int n> register c:ar c> ... I

?@.AA.AB

!$

P#

2.". Iniiali6area %ariabilelor


2ariabilele simple se ini)ializeaz printrEo declara)ie de forma: #ip %dentificator_de_variabil 1 2+presie E&emple: float f 2 int n 3> H int iJA> int mJn7C> ... I

'ablourile se ini)ializeaz printrEo declara)ie de forma: #ip %dent_tablou 4n5 1 H2+presieA 2+presieC ... 2+presiemI unde mn iar dac n este omis atunci nJm. E&emple: int X 4AB5 J H? BA C@ BA B? BA B? BA BA B? BA B? BAI> int Y 4 5 J HA C B D - P QI> int A4B54 5 J H HA C BI HD -I HPI I> 77 HHA C BI HD - ZI HP Z ZII

7irurile de caractere se ini)ializeaz astfel: char %dent_string 4n5 1 3"irOcaractereS iar n poate fi este omis. E&emple: c:ar Mesa0 4A??5 J S[arurile vor fi aruncate ...S> c:ar AltOMesa0 45 J HS[arurile au fost aruncate LSI>

?@.AA.AB

!$

P#

3. #.presii
# e.presie este format din operan6i operatori (i parante6e pentru prioritate (i are o %aloare (i un tip. !socierea operatorilor se face de la st1n"a la dreapta cu e&cep)ia operatorilor unari (i de atribuire care se asociaz de la dreapta la st1n"a. Operan6ii pot fi: constante constante simbolice variabile simple sau structurate 2tablouri structuri sau elemente ale acestora3 func)ii sau apeluri de func)ii.

3.1. Operatori
Operatorii 6n ordinea descresctoare a priorit)ii sunt urmtorii:

2 3 2unar3 $ 2unar3 8 7 $ << == < <J JJ LJ V ] ^ VV ^^ Z: 2ternar3 J 8J

4 5 8 2unar3 V 2unar3 K =J =

$$

2tip3 si*eof

7J

KJ

$J

J <<J ==J VJ

]J

^J

Operatorii aritmetici sunt urmtorii: $ E&emple: int i 0 > int cat J i 7 0> int rest J i K 0> 77 AB 7 - J C 77 ABK- J B 8 7 K 2mod3 pentru adunare scdere 6nmul)ire c1t 26mpr)ire3 rest.

?@.AA.AB

!$

P#
Operatorii relaionali sunt urmtorii:

< <J = =J JJ LJ pentru < = J e&presiei rela)ionale3 fiind 1 pentru adevrat iar - pentru fals. E&emple: int iJA> int 0JC > ... i<J0 ... ... iJJ0 ... Operatorii logici sunt: L 2!ot3 E&emplu: 5or J L+VV6 ^^ +VVL6 VV 2And3 ^ ^ 24r3. 77 JJ A 77 JJ ?

rezultatul 2valoarea

77 + 5or 6 1 !ot + And 6 4r + And !ot 6

Ueoarece nu e&ist tipul boolean valoarea fals este reprezentat prin - iar adevrat prin orice valoare diferit de -. Operaii pe bii se pot realiza utiliz1nd urmtorii operatori: \ 2complementul fa) de FFFF sc:imb fiecare bit3 << 2deplasare la st1n"a3 == 2deplasare la dreapta3 V 2And bit cu bit3 ] 25or bit cu bit3 ^ 24r bit cu bit3. E&emplu: 77 AS!II ;include <stdio.:=> ;include <conio.:=> int !ifra2int c3 77 cifra :e&a: ?A...,A%...F H if 2c<A?3 return c ^ R?R> else return 2cE,3 ^ R_R> I int c> void main 2void3 H te&tbac`"round2%/UE3> te&tcolor2*WINE3> clrscr23> do H printf2S Uati un caracter ;Esc : S3> cJ"etc:23> printf2S ... We&a J KcKc MnS !ifra2c==D3 !ifra2cV?&F33> I +:ile 2cLJ?&A%3> I

?@.AA.AB

!$

P#

Operaia de atribuire se realizeaz astfel: /ar J 2+presie> 77 e+presie de atribuire cu tipul /ar E&ist posibilitatea realizrii de atribuiri multiple prin e&presii de forma: /arn J ))) J /arC J /arA J 2+presie> Mai e&ist o facilitate utiliz1nd o opera)ie de atribuire de forma: /ar J 2+presie> av1nd semnifica)ia: /ar J /ar 2+presie> E&emple: v J e J C.QA@A@C@> & $J d&> T J dT> n <<J `> 77 v J 2e J C.QA@A@C@3> 77 & J &$d&> T J T dT> 77 n J n8C` 77 unde H$ 8 7 K V ] ^ << ==I

Operatorii de incrementare 8 decrementare sunt F$$G respectiv F G prin care se mre(te respectiv se mic(oreaz valoarea operandului cu unu. Ace(tia pot fi utiliza)i:
6n

forma prefi&at: $$ operand > respectiv operand > respectiv operand > 77 valoarea e&presiei dup aplicarea lor 77 valoarea e&presiei 6nainte de aplicare forma postfi&at: operand $$>

6n

E&emple: a J $$b> a J b > 77 bJb$A> 77 aJb> aJb> bJb A>

Operatorul de con%ersie e.plicit 9e&presie cast: realizeaz conversia unui operand 6ntrEun tip precizat astfel: 2 #ip 3 operand > E&emplu: int aJAC> int bJ-> float cJa7b> printf2S a Uiv b J K-.Cf MnS c3> cJ2float3a7b> printf2S a 7 b J K-.Cf MnS c3> 77 a Uiv b J C.?? 77 a 7 b J C.D?

?@.AA.AB

A?

!$

P#
Con%ersiile implicite 9realizate automat: se fac astfel:
a3 b3 c3 d3 e3

c'arint floatdouble 2double 832double double3Jdouble 2long 832long long3Jlong 2unsigned 832unsigned unsigned3Junsigned.

Operatorul pentru dimensiune 9sizeof: determin lun"imea 6n octe)i a unei variabile simple sau structurate precum (i a unui tip de dat: sizeof 2 Data3 > E&emplu: int a> printf2S Size#f int J Kd MnS sizeof2a33> 77 0i*e4f int J C printf2S Size#f s:ort J Kd MnS sizeof2s:ort33> 77 0i*e4f s'ort JC

Operatorii condiionali 4

; sunt utiliza)i 6n construc)ii de forma: ; 2+presieB


>

2+presieA 4 2+presieC

'aloarea e&presiei rezultat este 2+presieC dac 2+presieA este nenul altfel este 2+presieB . E&emplu: Ma& J a=b 4 a ; b> 77 Uac a=b Atunci Ma&Ja Altfel Ma&Jb>

Operatorul %irgul permite "ruparea mai multor e&presii 6ntrEuna sin"ur aceasta av1nd valoarea ultimei e&presii: 2+presieA < 2+presieC < ... E&emplu: float &? T? r & T> printf2S Uati !2&? T? r3 J S3> scanf2SKf Kf KfS V&? VT? Vr3> 77 !ercul ! printf2S Uati P2& T3 J S3> scanf2SKf KfS V& VT 3> 77 Punctul P printf2S KsS 22&EJ&?< TEJT?< &8J&< T8JT< &$T3JJr8r3 4 SP e pe !S ; SP nu e pe !S3>

< 2+presien >

?@.AA.AB

AA

!$

P#

".

Operaii de intrare8ie0ire

9n limba0ul ! nu e&ist instruc)iuni de intrare7ie(ire aceste opera)ii raliz1nduEse prin func)ii aflate 6n bibliotecile standard. Implicit unui pro"ram i se ata(eaz fi(ierele stdin 2intrare standard3 stdout 2ie(ire standard 3 stderr 2ie(ire standard pentru erori3 stprn 2ie(ire pentru imprimant3 stdoux 2intrare7ie(ire serial3.

".1.

uncia Printf

Aceast func)ie realizeaz afi(area dup un (ablon av1nd urmtorul format: int printf 28ontrol 4 $ist_2+presii53> unde 8ontrol este (ablonul 2formatul3 scris sub forma unui (ir de caractere care con)ine mesa9e (i specificatori de format corespunztori valorile e&presiilor din list. Un specificator de format se descrie astfel:
K 4a5 4m4.n5 5 4l5

4f5

unde:

4a5 4m5 4.n5 4 l5 4f5

E determin alinierea la st1n"a implicit fiind la dreapta E precizeaz lun"imea c1mpului


E precizeaz lun"imea pr)ii zecimale respectiv numrul de caractere

E conversia se va efectua din format intern long E determin tipul conversiei precizat prin unul din urmtoarele caractere:

d o + 5 u c s f e 2 g :

E int zecimal e&tern E int octal e&tern E int :e&a e&tern 2?..., a...f3 E int We&a e&tern 2?..., A...F3 E unsigned zecimal e&tern 2fr semn3 E binar intern caracter 2c'ar3 E string 2(ir de coduri AS!II terminat cu M?JbU/3 (ir de caractere E float sau double zecimal e&tern 4m4.n5 5 implicit nJP E float sau double zecimal e&tern forma e&ponen)ial 2b8A?e3 E float sau double zecimal e&tern forma e&ponen)ial 2b8A?23 E se ale"e dintre variantele f sau e reprezentarea minim E se ale"e dintre variantele f sau 2 reprezentarea minim.

Func)ia printf returneaz numrul de octe)i afi(a)i dac opera)ia a decurs corect iar 6n caz contrar EA 2E#F3: if 2E#F J J printf 28ontrol $ist_2+presii 33 ... eroare ... >

?@.AA.AB

AC

!$

P#

E&emplu: s:ort [iJA> c:ar /una45JSIanuarieS> unsi"ned AnJC??B> float InaJA.@> printf2S [i:Kd /una:KB.Bs. An:Ku MnS [i /una An3> 77 [i:A /una:Ian. An:C??B printf2S Inaltime2m3:KD.Cf MnS Ina3> 77 Inaltime2m3:A.@?

".2.

uncia Scanf
int scanf 28ontrol $ist_Adrese_de_/ariabile 3>

Aceast func)ie realizeaz citirea datelor dup un (ablon av1nd urmtorul format: unde 8ontrol este (ablonul 2formatul3 scris sub forma unui (ir de caractere care con)ine eventual te+te ;obli"atorii la intrare< (i specificatori de format corespunztori tipurilor variabilelor din list. Specificatorii de format sunt asemntori celor prezenta)i la func)ia printf realiz1nd 6ns conversiile inverse:

K 485 4m5 4l5

4f5

unde:

485 4m5 4 l5 4f5

E un caracter op)ional E precizeaz lun"imea ma&im a c1mpului E conversia se va efectua din format intern long E determin tipul conversiei precizat prin unul din urmtoarele caractere:

d o + 5 u c s f

E int zecimal e&tern E int octal e&tern E int :e&a e&tern 2?..., a...f3 E int We&a e&tern 2?..., A...F3 E unsigned zecimal e&tern 2fr semn3 E binar intern caracter 2c'ar3 E string (ir de caractere terminat la spa)iu sau dimensiunea m E float flotant e&tern.
2nu este necesar pentru tablouri3)

Adresele variabilelor de intrare sunt date prin operatorul de adrese = plasat 6naintea identificatorului fiecrei variabile 2simpleL3: 4V5 /ariabil E&emplu: s:ort [i> c:ar /una4AB5> unsi"ned An> float Ina> scanf2S Kd Ks Ku Kf S V[i /una VAn VIna3>
77 A Ianuarie C??B A.@?

Func)ia scanf returneaz numrul de c1mpuri citite corect. Sf1r(itul de fi(ier 2!trl7[3 poate fi verificat prin valoarea returnat E#F: if 2E#F J J scanf 28ontrol $ist_2+presii33 ... 0f=r it ... > E&emplu: if 2E#FJJscanf2S Kd Ks Ku KfS V[i /una VAn VIna33 printf2S!trl7[S3> else H printf2S [i:Kd /una:KB.Bs. An:Ku MnS [i /una An3> printf2S Inaltime2m3:KD.Cf MnS Ina3> I

?@.AA.AB

AB

!$

P# uncia PutChar

".3.

Aceast func)ie realizeaz tiprirea unui caracter al crui cod AS!II este precizat printrEo e&presie: putchar 22+presie3>

".".

uncia GetChar

Aceasta returneaz codul AS!II al caracterului citit 2pentru !trl7[ E#FJEA3: getchar 2 3> E&emplu: c:ar c> do putc:ar 222cJ"etc:ar233=R[R3Z c]R R : c3> +:ile 2cLJR.R3>
77 /itere mici /INEcE MAcI 77 se termin cu .

/itere mici in /itere MAcI L /INEcE MI!I Ib /INEcE MAcI L Se termina la . 2Punct3 SE NEcMIbA /A . "etc:ar putc:ar "etc:ar putc:ar

".>.

uncia GetCh e
int getche 2 3>

Func)ia returneaz codul caracterului citit direct (i 6l afi(eaz 26n ecou3: E&emplu: do putc:ar 222cJ"etc:e233=R[R3Z c]R R : c3> +:ile 2cLJR.R3>
77 se termin cu .

//iIt NeErceE mMiIc!iI iInb //iIt NeErceE MMAAccII..

".?.
afi(at:

uncia GetCh

Aceast func)ie returneaz codul caracterului citit 2direct3 fr ca acesta s mai fie int getch 2 3> E&emplu: do putc:ar 222cJ"etc:233=R[R3Z c]R R : c3> +:ile 2cLJR.R3>
77 se termin cu .

/INEcE MI!I Ib /INEcE MAcI. 77 SEa tastat: /itere mici in /itere MAcI.

?@.AA.AB

AD

!$

P#

>.

Instruciuni

9n limba0ul ! instruc)iunile se termin cu @ mai pu)in cele care se termin cu A.

>.1. Instruciunea Vid


Aceast instruc)iune se utilizeaz 6n situa)ia 6n care este nescerar prezen)a unei instruc)iuni (i care nu trebuie s e&ecute nimic:

@
>.2. Instruciunea Expresie
Instruc)iunea are formatul "eneral: 2+presie @ E&emple: T J 2&$A382&EA3> f2& T3> c$$> EEc>
77 Atribuire: vJ2+presie > 77 Apel de func)ie: f;pA pC ))) , pn<> 77 Incrementri7Uecrementri 2>re7>ost fi&ate3

>.3. Instruciunea Compus


Aceasta este format dintrEo succesiune de declara)ii 2proprii3 (i instruc)iuni incluse 6ntre acolade:

B
Declaraii %nstruciuni

A
E&emplu: H int i>
77 'ariabil local instruc)iunii> 77

f 2i3> I >

i se poate utiliza doar 6n aceast instruc)iune compus>

77 Uup A nu se pune >

?@.AA.AB

A-

!$

P#

>.". Instruciunea If
Structura alternativ cu una sau dou ramuri poate fi scris astfel: if ;e+presie< instructiuneA> C else instructiuneC> D E&emplu: P2+ 63 IEul !adran 2Uac + sau 6 este ne"ativ se sc:imb semnul 3 float & T> printf2S Uati P2& T3 J S3> scanf2SKf KfS V& VT3> 77 Punctul P if 2&=?3 if 2T<?3 TJET> 77 !D else_> 2instruciunea vid3 else H &JE&> 77 !C sau !B 2+3 if 2T<?3 TJET> 77 !B 263 I printf2S &JK-.Cf TJK-.Cf MnS & T3 > I 77 trebuie pus pentru !A instruciunea vid: else_> H

>.>. Instruciunea Switch


Pentru structura alternativ cu mai multe ramuri 8ase ;0elect< se utilizeaz instruc)iunea 0(itc': switch 2e+presie3
H case cA : secven instructiuni A case cC : secven instructiuni C
)))

C break> D C break> D

case cn : secven instructiu nin C break> D C default : secven instructiuni n$A D


I

Instruc)iunea break realizeaz saltul la sf1r(itul instruc)iunii switch iar 6n absen)a ei se vor e&ecuta (i urmtoarele secven)e de instruc)iuni. E&emplu: +:ile 2scanf2SKd Kc KdS VoA Vo VoC3LJE#F3 s+itc: 2o V ?XFF3 H case R$R : vJoA$oC> brea`> case RER : vJoAEoC> brea`> case R8R : vJoA8oC> brea`> case R7R : vJoA7oC> brea`> default : printf 2S #p. necunoscutLKcMnS o3> I printf 2SKdKcKd J KdMnS oA o oC v3> H
77 #A o #C

77 !trl7[

?@.AA.AB

AP

!$

P#

E&emplu: 77 br.[ile 7 lun MM


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

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

>.?. Instruciunea

hile
while ;e+presie< instructiu ne>

Structura repetitiv pretestat poate fi scris astfel: E&emplu: 77 >rogram 2+emplu ;include <stdio.:=> int i n> lon" f> void main 2void3 H printf2SMn Uati n : S3> scanf 2SKdS iJ2fJA3$A> +:ile 2i<Jn3 f8Ji$$> iJ2fJA3> +:ile 2i< n3 f8J$$i> scanf2SMnS3> I 77 f:JnL hile

Vn3> printf2S KdL J Ku MnS n f3> printf2S KdL J Ku MnS n f3>

>.E. Instruciunea !o" hile


Structura repetitiv posttestat poate fi scris astfel: do instructiu ne while ;e+presie<> E&emplu: do H rJaKb> aJb> bJr> I +:ile 2c3> cmmdcJa> 77 cLJ?

?@.AA.AB

AQ

!$

P#

>.F. Instruciunea #or


Structura repetitiv >entru 253 poate fi descris astfel: for 2e+presieA> e+presieC> e+presieB3 instructiu ne > Instruc)iunea are acela(i efect ca (i: e+presieA> while 2e+presieC3 H instructiu ne> e+presieB >I di invers 2vezi while3: for 2>e+presie>3 instructiune > E&emplu: int i n> lon" f> 77 f:JnL printf2SMn Uati n : S3> scanf 2SKdS Vn3> fJA> for 2 iJA > i<Jn> i$$3 f8Ji> printf2S KdL J Ku MnS n f3> fJA> for 2 iJA > i<Jn> $$i3 f8Ji> printf2S KdL J Ku MnS n f3> fJiJA> for 2 > i<Jn> i$JA3 f8Ji> printf2S KdL J Ku MnS n f3> for 2fJiJA> i<Jn> 3 f8Ji$$> printf2S KdL J Ku MnS n f3>

>.G. Instruciunea $reak


Aceast instruc)iune se folose(te pentru a termina o structur repetitiv: break> E&emplu: for 2 > > 3 if 2e+pr3 break> H ...
... I

>.1-. Instruciunea Continue


Aceast instruc)iune realizeaz saltul la sf1r(itul unei structuri repetitive 2pentru ('ile sau doO('ile la reevaluarea e&presiei iar pentru for la e+presieB3 av1nd formatul: continue> E&emplu: for 2... >... > e+prB3 if 2e+pr3 continue> H ...
... I

>.11. Instruciunea Go%o


Aceast instruc)iune realizeaz saltul necondi)ionat (i fr revenire la instruc)iunea ce poart etic:eta specificat av1nd formatul: goto etic'et > E&emplu:

?@.AA.AB

A@

!$

P#
+:ile 2e+prA3 if 2e+prC3 goto et>
...

H ...
... I 77 instruc)iune

et: ...

>.12. !pelul unei funcii


Instruc)iunea de apel a unei func)ii este un caz particular al instruc)iunii e&presie: !ume_funcie ;$ist_parametri_actuali<> # func)ie poate fi apelat (i 6n cadrul unei e&presii dintrEo instruc)iune:
)))

!ume_funcie ;$ist_parametri_ actuali< ))) >

# func)ie poate fi utilizat doar dac a fost definit sau cel pu)in a fost declarat prototipul ei 6ntrEuna din urmtoarele moduri: #ip_ funcie b3 #ip_ f uncie c3 #ip_ f uncie d3 #ip_ f uncie
a3

!ume_ funcie 2$ista_parametrilor_formali3> !ume_ funcie 2$ista_tipurilor_parametrilor_formali3> !ume_ funcie 2/oid3> 77 nu sunt parametri formali !ume_ funcie 2 3> 77 nu se fac verificrile de tip

!pelul implicit pentru variabile simple 2de baz3 este prin &aloare iar pentru tablouri prin referin'. !pelul prin referin' se ob)ine prin intermediul variabilelor de tip pointer (i a operatorului de adres () *e&enirea dintrEo func)ie se poate realiza fie prin instruc)iunea return fie automat dup ultima instruc)iune a func)iei 2situa)ie 6n care nu se returneaz nici o valoare3: return C e+presie D > fiind returnat valoarea e&presiei 2dac e&ist3. E&. A:
;include <"rap:ics.:= ;include <mat:.:= int uA vA uC vC> float a b c d > int u 2float &3 H return 22&Ea372bEa382uCEuA3$uA3> I int v 2float T3 H return 22TEd372cEd382vCEvA3$vA3> I void Initeraf2void3 H int ed J UENE!N em> init"rap:2Ved Vem Sc:MM%cMM%"iS3> I void 'ie+Port2int &A int TA int &C int TC3 HuAJ&A> vAJTA> uCJ&C> vCJTC> 78rectan"le2uA vA uC vC3>87 I void *indo+2float &A float TA float &C float TC3 H aJ&A> dJTA> bJ&C> cJTC> I void cectan"le2float &A float TA float &C float TC3 H rectan"le2u2&A3 v2TA3 u2&C3 v2TC33> I void %ar2float &A float TA float &C float TC3 H bar2u2&A3 v2TA3 u2&C3 v2TC33> I void /inie2float &A float TA float &C float TC3 H line2u2&A3 v2TA3 u2&C3 v2TC33> I void Muta2float & float T3 H moveto2u2&3 v2T33> I void Nra"2float & float T3 H lineto2u2&3 v2T33> I void cot2float V& float VT float &? float T? float Alfa3 H float &p> &pJ2&E&?38cos2Alfa3E2TET?38sin2Alfa3$&?> T J2&E&?38sin2Alfa3$2TET?38cos2Alfa3$T?> & J &p> I

E&. C: 77 Ultima cifr nenul a lui nL MM


;include <iostream.:=> ;include <conio.:=> int 1f (int$ f, int *) { int 2=-;

?@.AA.AB

A,

!$

$
"#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#(); /

P#

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

?@.AA.AB

C?

!$

P#

?. 3ointeri
# variabil p de tip pointer con)ine adresa unei variabile a crei valoare se ob)ine utiliz1nd operatorul 8 28p J valoarea variabilei de la adresa con)inut 6n p3. Adresa unei variabile v se poate ob)ine prin operatorul V 2Vv J adresa variabilei v3 deci putem atribui unui pointer p adresa unei variabile v astfel: p J Vv>

?.1. 1eclararea unui Pointer


Uefinirea unei variabile de referin) 2legat de un #ip3 se face astfel: #ip 8/arO.eferin > Ueci tipul referin) se ob)ine prin urmtoarea construc)ie: #ip 8 Ueclararea unui pointer 2care con)ine o adres nefiind 6ns le"at de un anumit tip3 se face astfel: &oid 8/arO>ointer > E&emplu:
;include <stdio.:=> ;include <conio.:=>
;include S!rt.!ppS>

int !ifra2int c3 H if 2c<A?3 return c ^ R?R> else return 2cE,3^R_R> I void !ifre2int b3 H printf2SKcKcS !ifra2b==D3 !ifra2bV?&F33> I void main 2void3 H int 8PointerOInt> void 8p> unsi"ned 8PointerO*ord> int &> printf2S Uati & : S3> scanf2SKdS V&3> pJPointerOIntJV&> PointerO*ordJ2unsi"ned 83 p> printf2S & JKu MnS 8PointerO*ord3> printf2S ^&^JKd MnS sizeof 8PointerO*ord3> printf2S ^V&^JKd MnS sizeof PointerO*ord3> printf2S82V&3JS3> !ifre28PointerO*ord==@3> !ifre28PointerO*ordV?&FF3> printf2SMnS3> I
"etc:23>

Date: .e*ultate :

Uati & : DB,PC & JDB,PC ^&^ JC ^V&^JC 82V&3JA%%A

Date: Uati & : EA .e*ultate : & J P--B-

^&^ JC ^V&^JC 82V&3JFFFF

?.2. Operaii cu Pointeri


Aceste opera)ii sunt opera)ii cu adresele con)inute 6n variabilele de tip pointer.

?@.AA.AB

CA

!$

P#
?.2.1. Incrementare 8 1ecrementare

Aceste opera)ii mresc7mioc(oreaz valoarea de adres spre urmtorul element 2cu o valoare e"al cu lun"imea tipului referit3: /arO>ointer $ $ > E&emplu:
int [ile45JHBA C@ BA B? BA B? BA BA B? BA B? BA I> int 8PointerOInt> int /una> 77 ? A ... AA printf2S Uati luna 2AEAC3:S3> scanf2SKdS V/una3> PointerOIntJV[ile4/una5> PointerOIntEE> 77 V[ile4/unaEA5 printf2S br.[ile JKd MnS 8PointerOInt3>

/arO>ointer a a >

?.2.2.

!dunare 8 Scdere a unui numr Hntreg

Aceste opera)ii mresc7mioc(oreaz valoarea de adres spre alt element 2cu o valoare e"al cu n f lungimea tipului referit3. /arO>ointer $ n E&emplu:
int [ile45JH? BA C@ BA B? BA B? BA BA B? BA B? BA I> int 8PointerOInt> int /una> printf2S /una 2AEAC3 : S3> scanf2SKdS V/una3> PointerOIntJ(ileI,una> printf2S br.[ileJKd MnS 8PointerOInt3> PointerOIntJ[ile> printf2S br.[ileJKd MnS 823ointerJIntI,una33>

?.2.3.

Comparare

Uoi pointeri ale elementului aceluia(i tablou pot fi compara)i utiliz1nd operatorii rela)ionali. 'aloarea )K,, marc:eaz faptul c un pointer nu refer nici un element.
... pA

< pC ... >

... pA

J J pC ... >

... pA

LJ pC ... >

... p

J J )K,, ...>

E&emplu:
int [ile45JH? BA C, BA B? BA B? BA BA B? BA B? BA I> int 8luna> int [i /una An br[ile> printf2S [i /una An : S3> scanf2SKd Kd KdS V[i V/una VAn3> if 2AnVB3 [ile4C5JC@> if 22[i=[ile4/una53 ^^ 2/una=AC33 lunaJbU//> else lunaJ[ile> if 2luna5L)K,,3 H br[ileJ[i> do br[ile$J82luna$$3> +:ile 2lunaM(ileI,una3> printf2S A Kd zi a anului MnS br[ile3> I else printf2S Uata calendaristica incorectaL MnS3>

?.2.".

1iferen

Uiferen)a a doi pointeri ai aceluia(i tablou d ca rezultat diferen)a indicilor. E&emplu:


int [ile45JH? BA C, BA B? BA B? BA BA B? BA B? BA I> int 8luna> int [i /una An [iua> printf2S An A c1ta zi din an:S3> scanf2SKd KdS VAn V[iua3> if 2AnVB3 [ile4C5JC@> for 2lunaJ[ile$A> [iua=8luna> luna$$3 [iuaNJ8luna> printf2S [i:Kd /una:Kd An:Kd MnS [iua lunaN(ile An3>

?@.AA.AB

CC

!$

P#

E&emplu: 77 #pera)ii cu pointeri MM


;include <iostream.:= ;include <conio.:=

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

clr!cr();

0etc#e();

?.3. !locare dinamic a memoriei


Pentru alocarea 7 dealocarea %ariabilelor dinamice sunt utilizate urmtoarele dou func)ii definite 6n fi(ierele alloc.' (i stdlib.': malloc care returneaz adresa zonei alocate de lun"ime dat n sau bU// dac nu se poate efectua alocarea: void ?malloc 2unsigned n3>

free care elibereaz o zon alocat precizat prin adresa 2pointerul3 ei : void ?free 2void ?adres3>

E&emplu:
;include <stdio.:=> ;include <malloc.:=>
;include <conio.:=> int !ifra2int c3 void !ifre2int b3 ;include S!rt.!ppS> H if 2c<A?3 return c ^ R?R> else return 2cE,3^R_R> I H printf2SKcKcS !ifra2b==D3 !ifra2bV?&F33> I

void main 2void3 H unsi"ned 8PointerO*ord> PointerO*ordJ2unsi"ned 83 malloc2sizeof 2unsi"ned33> printf2S Uati & : S3> scanf2SKdS PointerO*ord3> printf2S & JKu MnS 8PointerO*ord3>

printf2S ^&^JKd MnS sizeof 8PointerO*ord3> printf2S ^V&^JKd MnS sizeof PointerO*ord3> printf2S82V&3JS3> !ifre28PointerO*ord==@3> !ifre28PointerO*ordV?&FF3> printf2SMnS3>

free2PointerO*ord3>

"etc:23>

?.". Pointeri la funcii

?@.AA.AB

CB

!$

P#

bumele unei func)ii fiind un pointer la acea func)ie ea poate fi parametru actual (i evident trebuie descris ca parametru formal:
...

tip 2?f 3 2 3 ))) 77 >ointeri la func ii 2A3 MM

E&emplu:
;include <"rap:ics.:= ;include <conio.:= float Sin 2float &3 float SOr 2float &3 ;include <stdlib.:= ;include <mat:.:= H return sin 2&3> I H return po+ 2& C3>I ;include <stdio.:= ;include S:raf.'S float Cos 2float &3 float SOrt2float &3

;define Pi B.ADA-,CP H return cos 2&3> I H return sgrt2&3> I

void erafic2float9+f:9float: float a float b int uA int vA int uC int vC3 H float & p c d T> /ie(>ort 2uA vA uC vC3> rectan"le 2uA vA uC vC3> pJ2bEa372uCEuA38-> &Ja> cJdJ9+f:9.:> do H &$Jp> TJ9+f:9.:> if 2T<c3 cJT> else if 2T=d3 dJT> I +:ile 2&<b3> @indo(2a d b c3> &Ja> &ove#o2& 9+f:9.:3> do H &$Jp> $ine#o2& 9+f:9.:3> I +:ile 2&<b3>
I H

void main2void3

"etc:23> close"rap:23> I

erafic 2Sin EPi Pi A? A? 2int3 "etma&&237CE- 2int3 "etma&T237CE-3> erafic 2Cos EPi Pi 2int3 "etma&&237C$- A? "etma&&23EA? 2int3 "etma&T237CE-3> erafic 2SOr EPi Pi A? 2int3 "etma&T237C$- 2int3 "etma&&237CE- "etma&T23EA?3> erafic 2SOrt ? Pi 2int3 "etma&&237C$- 2int3 "etma&T237C$- "etma&&23EA? "etma&T23EA?3>

%nit:rap' 23>

Urmtorul e&emplu construie(te un tabel cu valorile a patru func)ii dintrEun interval dat 4a b5 pentru o diviziune precizat 2n3: 77 >ointeri la func ii 2C3 MM
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#();

?@.AA.AB

CD

!$

P#

?.>. +tilizarea parametrilor din linia de comand


Apelul unui pro"ram poate fi 6nso)it de o list de parametri: = !ume_>rogram $ist_>arametri care se poate accesa scriind antetul func)iei principale astfel: main 2 int ,rgC c'ar 8,rgV 4 5 3 unde: ,rgC este o variabil 6ntrea" care con)ine numrul de parametri plus unu 2L3 ,rgV este un tablou care con)ine adresele parametrilor din list: ,rgV4?5 E pointer la !ume_>rogram 2L3 ,rgV4A5 E pointer la primul parametru ... ,rgV4,rgCPA5 E pointer la ultimul parametru E&emplu:
;include <stdio.:=> ;include <stdlib .'=> 77 !alendar C??B

void main 2int Ar"! c:ar 8Ar"'453 H c:ar 8Sapt45JHS/uniS SMartiS SMiercuriS ShoiS S'ineriS SSambataS SUuminicaSI> int [ile45JHBA C@ BA B? BA B? BA BA B? BA B? BAI>int [i /una luna> if 2Ar"!JJB3 H [iJatoi2Ar"'4A53> /unaJatoi2Ar"'4C53> for 2lunaJA> luna</una> luna$$3 [i$J[ile4lunaEA5> printf2S Ks MnS Sapt42[i$A3KQ53>
I

else printf 2S Uati in linia de comada ziua si luna 2din C??B3 L MnS3>
I 77

QCalendar 1> 3

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


# alt modalitate de a defini o constant este modificatorul Const astfel:

4 #ip 5 const !ume 4 1

/aloare 5 >

sau

const 4 #ip 5 !ume 4 1 /aloare 5 >

Unui parametru formal declarat cu modificatorul Const nu i se mai poate sc:imba valoarea 6n subpro"ramul respectiv. E&emplu:
;include <stdio.:=> ;include <conio.:=>

int !ifra2const int c3 H const c:ar AeroJR?R> if 2c<A?3 return c ^ Aero>


I

int const 8B0CJ?&D?> else return 2cE,3^8B0C>

void main 2void3 H const ,lueJ%/UE> const @'iteJ*WINE> const 80FJ?&F> const 2scJ?&A%> int c> te&tbac`"round2,lue3> te&tcolor2@'ite3> clrscr23> do H printf2S Uati un caracter ;Esc : S3> cJ"etc:23> printf2S ... We&a J KcKc MnS !ifra2c==D3 !ifra2cV 80F33> I +:ile 2cLJ2sc3>
I

- ) . ) S t i &a

?@.AA.AB

C-

!$

P#

Prin sti& 6n)ele"em o list cu disciplina /ast In #irst 0ut pentru care vom defini urmtoarele trei func)ii: Push E adau" un element 6n stiv Pop E e&tra"e un element din stiv Clear E ini)ializarea stivei 2stiv vid3 Vida E verific dac stiva este vid: 11 #act)Cpp RR
;include <stdio.:= ;include <conio.:= ;include SSti&a.hS void main2void3
H

11 Sti&a)h RR
;define UimMa& AB static int 0tiva4UimMa&5> void Push2int &3
H

static be&tJ?>

int n> unsi"ned lon" f> printf2S Uati n : S3> scanf2SKdS Vn3> Clear23> +:ile 2n3 Push2nEE3> fJA> +:ile 2LVida233 f8JPop23> printf2S nL J KA-lu MnS f3> "etc:23>
I

if 2be&t<UimMa&3 0tiva4be&t$$5J&> else printf2S Uepasire stiva MnS3>


I

int Pop23 H if 2be&t=?3 return 0tiva4EEbe&t5> else H printf2S Stiva vida MnS3> return ?> I
I

void Clear23 int Vida23

H be&tJ?> I H

return 2be&tJ J?3> I

E. Recursi%iate
E&ist posibilitatea de a defini o func)ie prin ea 6ns(i 2recursiv3. E&emplu:
;include <conio.:= ;include <iostream.:= ;define &a+ 2& T3 2&=T Z & : T3 int a4A??5> int 2axim2int n3
H I H

if 2nJ JA3 return a4A5> else return &a+ 22axim2nEA3 a4n53> int i n> clrscr23>

void main2void3 cout << S Uati n : S> cin == n> cout << S Uati A : S> for 2iJA> i<Jn> i$$3 cin == a4i5> cout << S Ma&.J S << 2axim2n3> "etc:23>

?@.AA.AB

CP

!$

P#

F. 'ipuri de date
E&ist posibilitatea de a defini noi tipuri de date (i c:iar de a le denumi.

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


Asi"narea unei denumiri unui tip de dat se realizeaz astfel: t3pedef E&emplu: t3pedef int Integer > Integer i 0> t3pedef float *eal > *eal X4A?5> tip Denumire_#ip >

F.2. 'ipul enumerare 9enum :


Uefinirea acestui tip se face astfel: enum CDenumireD B %d? CJ2+pr?D %dACJ2+prAD ... %dnCJ2+prnD A C$ist_/arD> Implicit 2+pr?J? iar 2+pri12+priEADA iar dac se declar o list de variabile av1nd acest tip atunci denumirea tipului enumerare definit poate lipsi. E&emplu:
;include <stdio.:=> 77 C??B MM ;include <conio.:=> enum H False #rue I [iO/ucratoare> enum Aile0apt H $uni &arti &iercuri Eoi /ineri 0ambata Duminica I> enum Aile0apt [iOSapt> 77 sau Aile0apt [iOSapt> void main 2void3
H

int [ile45JHBA C@ BA B? BA B? BA BA B? BA B? BAI> int [i /una luna> printf2S [i /una : S3> scanf2SKd KdS V[i V/una3> for 2lunaJA> luna</una> luna$$3 [i$J[ile4lunaEA5> [iOSaptJ$uni> [iJ2[i$A3KQ> +:ile 2[iEE3 [iOSapt$$> if 2[iOSapt<0ambata3 [iO/ucratoareJ#rue> else [iO/ucratoareJFalse> if 2[iO/ucratoare3 printf2S Este o zi lucratoare MnS3> else printf2S Este o zi libera MnS3> "etc:23>
I

77 sau [i_SaptJ[iOSapt$A>

?@.AA.AB

CQ

!$

P# F.3. 1efinirea unei structuri 9struct :


Uefinirea unei structuri 2Fnregistrri3 se face astfel: struct CDenumireD B $ist_Declaraii_8=mpuri A C$ist_/arD>

Uac se declar o list de variabile av1nd acest tip atunci denumirea structurii poate lipsi. ceferirea componentelor unei structuri se face astfel: Denumire. 8omponent> E&emplu:
;include <stdio.:=> ;include <conio.:=> tTpedef float ceal> struct >unct H ceal & T> I> struct 8erc H Punct !entru> ceal caza> I> ceal Sgr2ceal &3 H return &8&> I void main 2void3
H

>unct # J H ? ? I> 8erc !> printf2S Mn !erc : S3> scanf2SKf Kf KfS V!.!entru.& V!.!entru.T V!.caza3> printf2S Mn !2&? T? r3J K-.Cf K-.Cf K-.CfS !.!entru.& !.!entru.T !.caza3> if 2Sgr2!.!entru.&E#.&3$Sgr2!.!entru.TE#.T3<JSgr2!.caza33 printf2S Mn ! contine #S3> else printf2S Mn ! nu cont.#S3> "etc:23>
I

ceferirea componentelor unei structuri definit printrEo variabil de tip referin) 2pointer3 se efectueaz: 9 +/ar_.ef :. 8omponent> E&emplu:
...

sau

/ar_.ef Q8omponent>

struct 8erc H float & T> float caza> I> void Nip!erc2 8erc +C3 H printf2S Mn !2& T r3J K-.Cf K-.Cf K-.CfS 9 + C:..< 9 + C:.S< C Q Ra6a: > I void main 2void3 H 8erc !JHA C BI> Nip!erc2V!3> I

?@.AA.AB

C@

!$

P# F.". *edefinirea unei date 9 union :


.edefinirea unei zone de memorie se poate face 6n cadrul unei uniuni astfel: union CDenumireD B $ist_Declaraii A C$ist_/arD>

Noate componentele aflate 6n $ist_Declaraii ocum aceea(i zon de memorie 2se suprapun3 lun"imea uniunii fiind dat de ma&imul lun"imilor declara)iilor . ceferirea componentelor unei uniuni se face astfel: Denumire. 8omponent> sau pentru o variabil de tip referin): 9 +/ar_.ef :. 8omponent> E&emplu:
...

sau

/ar_.ef Q8omponent>

union G H float ceal> lon" unsi"ned We&a> I &>


int !ifra2int c3 void !ifre2int b3 void Print2unsi"ned &3 H if 2c<A?3 return c^R?R> else return 2cE,3^R_R> I H printf2SKcKcS !ifra2b==D3 !ifra2bV?&F33> I H !ifre2&==@3> !ifre2&V?&FF3> I

void main 2void3


H

do H printf2S Uati un numar : S3> scanf2SKfS V..Real3> printf2S ... We&a J S3> Print 2..He.a==AP3> Print2..He.aV?&FFFF3> printf2S ... MnS3> I +:ile 2..He.aLJ?3> "etc:23>

F.>. C4mpuri de biti


E&ist posibilitatea definirii unei structuri ale crei c1mpuri s fie formate dintrEo secven) de bi)i consecutivi 2ai unui cuv1nt3. Aceste c1mpuri au tipul unsigned av1nd fiecare o lungime precizat 26n numr de bi)i3: struct CDenumireD B 8=mp?> 8=mpA> ... > 8=mpn> A C$ist_/arD> unde c=mpurile 8=mpi sunt de forma: unsigned C !ume_8=mpi D : $ungimei E&emplu:
;include <stdio.:=>

struct CampJ$iti H unsigned %OO?OOB ; "> unsigned %OODOOQ ; "> unsigned %OO@OAA ; "> unsigned %OACOA- ; "> I> union H int Intre"> Camp"$iti 8ifre_Ce+a> I & >
void !ifra2int c3 H if 2c<A?3 printf 2SKcS c^R?R3> else printf 2SKcS 2cE,3^R_R3> I

void main 2void3 H do H printf2S Uati un numar : S3> scanf2SKdS V&.Intre"3> printf2SWe&aJS3> !ifra2&.CifreJHe.a.%OO?OOB3> !ifra2&.CifreJHe.a.%OODOOQ3> !ifra2&.CifreJHe.a.%OO@OAA3> !ifra2&.CifreJHe.a.%OACOA-3> printf2S MnS3> I +:ile 2&.Intre"LJ?3>
I

?@.AA.AB

C,

!$

P#

G. Structuri de date dinamice


Pentru a implementa structura liniar 2lista simplu 6nln)uit3 (i structura de tip arbore binar vom apela la structuri definite recursiv.

G.1. ,ist simplu Hnlnuit ordonat


!onsiderm o list nevid fiind format din primul element (i sublista aflat la adresa de le"tur memorat 6n fiecare element pe l1n" informa)ia propriuzs. 9n e&emplul urmtor vom crea o list care va con)ine monoamele unui polinom 6n ordinea descresctoare a "radelor. Un element din list va con)ine pe l1n" informa)ia propriuzis 2coeficientul (i "radul monomului3 (i adresa urmtorului monom 2adresa sublistei3. Ue e&emplu pentru polinomul P2+3JAC?+AC$QQ+Q$AB?+B$CC+C lista va con)ine patru elemente av1nd informa)iile 2C? AC3> 2QQ Q3> 2AB? B3> 2CC C3 indiferent de ordinea introducerii monoamelor. Ueoarece coeficien)ii sunt nenuli introducerea datelor se termin la primul coeficient nul.
Einclude <!tdio.#> Einclude <alloc.#> Einclude <io!tream.#> Edefine Nil (N5JJ) !truct Monom { int 9oef, Krad ; /; !truct Llem { Monom Mnf; Llem8 Je0; /; tN2edef Llem8 Polinom; 77 /ist de monoame ordonate decresctor dup "rad int 9itit(@onom $@) { cin >> @.9oef; if (@.9oef) cin >> @.Krad; return @.9oef; / void :do(Oolinom $O, @onom @) { int lun0=!izeof(Llem); Oolinom Nou; if ((O==Nil)P(O6>Mnf.Krad<@.Krad)) {Nou=(Oolinom) malloc(lun0); Nou6>Mnf=@; Nou6>Je0=O; O=Nou;/ el!e :do(O6>Je0,@); / void 9re(Oolinom $O) { @onom @; O=Nil; "#ile (9itit(@)) :do(O,@); / void ?i2(Oolinom O) { if (O3=Nil) { cout << O6>Mnf.9oef << "FQ" << O6>Mnf.Krad; if (O6>Je03=Nil) cout << " " ; ?i2 (O6>Je0); / / void main (void) { Oolinom O; cout << " O (9oef,Krad) : "; 9re (O); cout << " Oolinomul O(F)="; ?i2 (O); 0etc#ar(); / Date H .e*ultate H O (9oef,Krad) : 12- 12 22 2 CC C 1%- % Oolinomul O(F)=12-FQ12 CCFQC 1%-FQ% 22FQ2 -

?@.AA.AB

B?

!$

P#

E&emplu:
.. 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;/ 77sau el!e {Llem el={inf,J/; Ji!ta Nou = ne" Llem (el); J=Nou;/ / void 9re(Ji!ta$ J) { Mnfo Ll; J=N5JJ; "#ile (9itit(Ll)) :do(J,Ll); / void ?i2(Ji!ta J) { if (J) {cout << J6>Mnf << A,A; ?i2(J6>5rm); / cout << "B)."; / void main (void) { 9lr1cr(); Ji!ta J; cout << " Ji!ta : "; 9re (J); cout << " Ji!ta = "; ?i2 (J); Readln(); /

G.2. !bori binari


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

?@.AA.AB

BA

!$

P#

9n e&emplul urmtor se citeste un arbore "enealo"ic ascendent 2d1nd pentru fiecare persoan nume prin)ilor3 apoi se va reprezenta "rafic arborele construit 6ntrEo fereastr ecran precizat 2uA vA uC vC3. Uistan)a dintre dou nivele se calculeaz )in1nd cont de ad1ncimea arborelui.
Einclude Einclude Einclude Einclude Einclude Einclude <!tdio.#> <alloc.#> <!trin0.#> <io!tream.#> <0ra2#ic!.#> <conio.#>

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

?Mnf Inf ; Nod8 Ld;

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

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

?@.AA.AB

BC

!$

P#

1-. Ktili6area fi0ierelor


Prelucrarea fi(ierelor se poate efectua la dou nivele:

!ivelul inferior E face apel direct la sistemul de operare> !ivelul superior E utilizeaz proceduri speciale pentru opera)ii de intrare7ie(ire.

1-.1. )i%elul inferior


Prelucrrile la acest nivel permit urmtoarele cinci opera)ii:

1-.1.1.
unde:

1esc&iderea unui fi0ier 90pen8Creat:


int open 2 const c'ar 8 c a l e int acces 3 >

c a l e E este specificatorul de fi(ier acces E poate fi o combina)ie 2utiliz1nd operatorul F^G3 a urmtoarelor valori: #OcU#b/Y 2fi(ier desc:is numai pentru citire3 #O*c#b/Y sau #O!cEAN 2numai pentru scriere E creare3 #OcU*c 2citire7scriere3 #OAPPEbU 2desc:is pentru adu"are la sf1r(it3 #O%IbAcY 2pentru prelucrare binar3 #ONEXN 2pentru fi(ier de tip te&t3.

Uac desc:iderea fi(ierului sEa realizat corect atunci func)ia returneaz o valoare 6ntrea" reprezent1nd descriptorul de fi ier 2/Ub care va fi utilizat 6n continuare la celelelte opera)ii efectuate asupra acestui fi(ier3 iar 6n caz de nereu(it se va returna valoarea EA. Pentru a putea utiliza func)ia 4pen trebuie incluse fi(ierele :eader io.' (i fcntl.'. E&emplu:
... int /un> /un J open 2Fisier.Uat #cU#b/Y3> ...

Pentru crearea unui fi(ier se va apela func)ia 8reat: int creat 2 const c'ar 8 c a l e int mod 3 > unde:

mod E poate lua una dintre valorile: SOIcEAU 2fi(ierul se poate citi3 SOI*cINE 2scriere 6n fi(ier3 SOIEXE! 2e&ecu)ia pro"ramului din fi(ierul specificat3. Pentru a putea utiliza func)ia 8reat trebuie incluse fi(ierele io.' (i stat.'. Fi(ierele te&t sunt implicite.

?@.AA.AB

BB

!$

P#
1-.1.2. Citirea dintrPun fi0ier 9*ead:
int read 2 int / u n void 8buffer unsigned lun" 3 >

unde:

/ u n E este descriptorul definit la desc:idere 2?J SNUIb AJSNU#UN CJSNUEcc

BJSNUPcb DJSNUAUX3 buffer E este zona de memorie 6n care se cite(te l u n " E este lun"imea 26n octe)i3 a 6nre"istrrii citite.

Func)ia returneaz numrul de octe)i citi)i 2cel mult l u n " 3 ? la sfr(it sau EA 6n caz de eroare. Automat dup o citire 2a articolului curent3 se trece la urmtorul articol implicit prima pozi)ionare fiind la 6nceput de fi(ier 2acces secven)ial3. Pentru a utiliza func)iile .ead @rite $0ee- sau 8lose trebuie inclus fi(ierul io.'.

1-.1.3.

Scrierea HntrPun fi0ier 9 rite:


int write 2 int / u n void 8buffer unsigned lun" 3 >

Func)ia returneaz numrul de octe)i scri(i 6n fi(ier reprezent1nd lun"imea articolului J l u n " sau EA 6n caz de eroare.

1-.1.".

3o6iionarea HntrPun fi0ier 9/Seek:


long lseek 2 int / u n long 8deplasament int ori"ine 3 >

Aceast func)ie permite accesul aleator printrEun apel de forma: unde:


deplasament E reprezint numrul de octe)i peste care se deplaseaz capul de citire7scriere ori"ine E reprezint punctul din care se msoar deplasamentE ul 2?J6nceputul fi(ierului AJpozi)ia curent CJsf1r(itul fi(ierului3. Func)ia returneaz pozi)ia curent fa) de 6nceputul fi(ierului sau EA la eroare.

1-.1.>.

Tnc&iderea unui fi0ier 9Close:


int close 2 int / u n 3 >

Func)ia returneaz ? la o 6nc:idere corect sau EA la eroare.

1-.1.?.

Stergerea unui fi0ier 9+n/ink:


int unlink 2const c'ar 8 c a l e 3 >

Func)ia returneaz ? la o (ter"ere corect sau EA la eroare.

?@.AA.AB

BD

!$

P#

E&emple:
.. 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(); /

?@.AA.AB

B-

!$

P# 1-.2. )i%elul superior


/a acest nivel sunt posibile urmtoarele opera)ii:

1-.2.1.
unde:

1esc&iderea unui fi0ier 9#0pen:


F%$2 8 fopen 2 const c'ar 8 c a l e const c'ar 8 mod 3 >

mod E poate fi r pentru desc:idere 6n citire U pentru scriere a pentru adu"are rI pentru modificare 2citire7scriere3 rb pentru citire binar Ub pentru scriere binar sau rIb pentru citire7scriere binar.

Uac la desc:iderea fi(ierului sEa ales modul U sau a fi(ierul va fi creat 2recreat3. Func)ia returneaz un pointer spre tipul F%$2 definit 6n fi(ierul stdio.' iar 6n caz de nereu(it se va returna valoarea bU// 2stdin stdout, stderr, stdau+ (i stdprn sunt pointeri spre tipul F%$2 permi)1nd transferuri fr a fi necesar desc:iderea sau 6nc:iderea lor3. E&emplu:
...

FI/E 8 Pf> Pf J fopen 2Fisier.Uat +3>


...

1-.2.2.
unde:

3relucrarea pe caractere a unui fi0ier 9PutC5 GetC:


int putc 2 int c FI/E 8 Pf 3 >

c E este codul caracterului scris Pf E este valoarea returnat la desc:idere sau stdin stdout stderr stdau+ stdprn. Func)ia returneaz valoarea lui c sau EA la eroare. int getc 2FI/E 8 Pf 3 >

Func)ia returneaz codul caracterului citit sau valoarea E#F la sf1r(itul fi(ierului sau EA la eroare. E&emplu:
;include <stdio.'=
void main 2void3
H I

int c> +:ile 22cJgetc2stdin33LJE#F3 putc2c stdout3>

?@.AA.AB

BP

!$

P#
1-.2.3. Tnc&iderea unui fi0ier 9#Close:
int fclose 2 FI/E 8 Pf 3 >

Func)ia returneaz ? la 6nc:iderea corect a fi(ierului sau A la eroare.

1-.2.".

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


int fscanf 2 FI/E 8 Pf control listOvariabile3 >

Parametrii control (i listOvariabile au aceea(i semnifica)ie ca (i pentru func)ia scanf. Func)ia returneaz numrul de c1mpuri citite sau E#F. int fprintf 2 FI/E 8 Pf control listOe&presii3 >

Func)ia returneaz numrul de caractere scrise 6n fi(ier sau EA la eroare. E&.A: 77 !reare fi(ier te&t cu bume Prenume MM
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(); /

E&.C: 77 !reare fi(ier te&t cu format 2articole : 2Uen !ant Pre)33 MM


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

int n=-;

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

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

0etc#ar();

77 /istare fi(ier te&t MM ?@.AA.AB BQ

!$

P#

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

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

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

0etc#ar();

1-.2.>.
unde:

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


c'ar 8 fgets 2 c'ar 8s int n FI/E 8 Pf 3 >

s E zona receptoare 2tablou de tip c:ar de dimensiune n terminat cu bU/JGM?G3 nEA E numr ma&im de caractere 2nEA3 Func)ia returneaz adresa (irului s sau la E#F returneaz bU//. int fputs 2 c'ar 8s FI/E 8 Pf 3 >

Func)ia returneaz codul ultimului caracter scris sau EA la eroare. Urmtorul pro"ram 6nlocuie(te cuvintele din fi(ierul F_!iv_0)8pp aflate 6n partea st1n" a dic)ionarului Dicio)#+t cu cele corespunztoare din partea dreapt rezultatul fiind depus 6n fi(ierul F_!iv_0)>as a(a cum se poate vedea 6n sc:ema de mai 0os.

Fin_Niv _S.Cp p

Dictio.Txt

Trad uce

Fin_Niv _S.Pas

?@.AA.AB

B@

!$

P#
77 %raduce Fi(ier te&t E Strin" MM
Einclude <conio.#> Einclude <2roce!!.#>

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

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

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

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

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

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

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

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

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

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

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

1-.2.?.

3o6iionarea HntrPun fi0ier 9#Seek5 #%ell:


int fseek 2FI/E 8 Pf long deplasamnet int ori"ine 3 >

?@.AA.AB

B,

!$

P#
Func)ia fsee- returneaz ? la pozi)ionare corect sau o valoare ? la eroare. long ftell 2 FI/E 8 Pf 3> Func)ia ftell returneaz pozi)ia curent 2fa) de 6nceputul fi(ierului 6n octe)i3.

unde deplasamnet (i ori"ine au aceea(i semnifica)ie ca (i la func)ia lsee-.

1-.2.E.

3relucrarea fi0ierelor binare 9#*ead5 # rite:

Acest tip de prelucrare permite transferul mai multor articole aflate 6ntrEo zon tampon astfel: unsigned fread 2void 8Pzt unsigned dim unsigned nrart FI/E 8 Pf3 > unde: Pzt E este adresa zonei tampon dim E reprezint lun"imea unui articol nrart E reprezint numrul de articole care se transfer 2citesc3 unsigned fwrite 2const void 8Pzt unsigned dim unsigned nrart FI/E 8 Pf3 > Ambele func)ii returneaz numrul de articole transferate sau EA la eroare. E&emple:
Einclude <!tdio.#> tN2edef !truct { c#ar Den;1-<; int 9ant; float Oret; :rticol; int n,i;

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

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


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

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

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

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

0etc#ar();

{...

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


...

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

fread

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

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

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

?@.AA.AB

D?

!$

P#

11.

uncii standard

11.1. Vacrouri de clasificare


Macrourile din aceast cate"orie 2aflate 6n fi(ierul ct3pe.h3 verific dac un caracter este de un anumit tip:
int int int int int int int int int int

isascii isalpha isalnum isupper islower isdigit isxdigit isgraph isprint isspace

2int ca r 3> 2int ca r 3> 2int ca r 3> 2int ca r 3> 2int ca r 3> 2int ca r 3> 2int ca r 3> 2int ca r 3> 2int ca r 3> 2int ca r 3>

ca r ca r ca r ca r ca r ca r ca r ca r ca r ca r

4? ACQ5 Z este codul unui caracter alfanumeric Z este codul unei litere Z este codul unei litere mari Z este codul unei litere mici Z este codul unei cifre zecimale Z este codul unei cifre :e&a Z este codul unui caracter afi(abil Z este codul unui caracter imprimabil Z este spa)iu tab !r /f 't sau bp Z

11.2. Vacrouri de transformare a simbolurilor


Macrourile din aceast clas 2aflate 6n fi(ierul ct3pe.h3 transform un caracter astfel: toascii int toupper int tolower
int 2int ca r 3> 2int ca r 3> 2int ca r 3>

4? ACQ5 2returneaz ultimii Q bi)i3 ca r liter mare 2transform din l 6n /3 ca r liter mic 2transform din / 6n l3
ca r

11.3. Con%ersii
Func)iile care urmeaz 2aflate 6n fi(ierul stdlib.h3 realizeaz conversii far format.
Format intern Format ;*ecimal < e+tern int atoi 2const c'ar 8pt r 3> binar ;int< *ecimal e+tern long atol 2const c'ar 8pt r 3> binar ;long< *ecimal e+tern double atof 2const c'ar 8pt r 3> virgul flotant ;dubl preci*ie< *ecimal e+tern Format e+tern Format intern c'ar 8itoa 2int v c'ar 8s int b3> s v b 2valoarea v de tip int scris 6n baza b3 c'ar 8ltoa 2long v c'ar 8s int b3> s v b 2valoarea v de tip long scris 6n baza b3

?@.AA.AB

DA

!$

P# 11.".
11.".1.

uncii de prelucrare a 0irurilor de caractere


Copiere 9StrCnDCp3:

Func)iile din aceast cate"orie se afl 6n fi(ierul string.h.

c'ar 8 strCnDcp3 2c'ar 8destina)ie const c'ar 8sursa C unsigned n D3 > unde sursa este copiat 6n destina)ie eventual doar primii n octe)i 2cel mult n3.

11.".2.

Concatenare 9StrCnDCat:

c'ar 8 strCnDcat 2c'ar 8destina)ie const c'ar 8sursa C unsigned n D3 > unde sursa este copiat la sf1r(itul destina)iei eventual doar primii n octe)i ai sursei.

11.".3.

Comparare 9StrCnDCiDCmp:

int strCnDCiDcmp 2c'ar 8(ir A const c'ar 8(ir C C unsigned n D3 > unde (ir A este comparat cu (irC 2eventual doar primii n octe)i (i eventual i"nor1nd diferen)a dintre literele mari (i cele mici3 iar rezultatul comparrii este un numr ne"ativ dac (irA<(irC este un numr pozitiv dac (irA=(irC sau zero dac (irAJ(irC.

11.".".

,ungimea unui 0ir 9Str/en:


unsigned strlen 2c'ar 8(ir3 >

returneaz lun"imea (irului 2de caractere fr caracterul bU/ care 6l termin3.

11.>.
Prototip

uncii de calcul
Semnifica'ie sin;+< cos;+< arcsin;+< arccos;+< arctg;+< s';+< c';+< t';+< + e+
double log 2double + 3> double log1- 2double + 3> double ceil 2double + 3> double floor 2double + 3> double fabs 2double + 3> int abs 2int + 3> 6 long labs 2long + 3> 6 double atan2 2double 6, double + 3> double pow 2double +, double 6 3> double cabs 2struct comple+ * 3> double pol3 2double +, int n, double a 45 3>

Aceste func)ii se afl 6n fi(ierul math.h 2abs (i labs (i 6n stdlib.h 63:


double sin 2double + 3> double cos 2double + 3> double asin 2double + 3> double acos 2double + 3> double atan 2double + 3> double sinh 2double + 3> double cosh 2double + 3> double tanh 2double + 3> double s7rt 2double + 3> double exp 2double + 3>

ln;+< lg;+< 4+5 trunc2+3 ^+^ ^+^ ^+^ arctg;67+< +6 ^*^ >;+<

11.?.

uncii pentru controlul proceselor


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

Urmtoarele func)ii se afl 6n fi(ierele stdlib.h (i process.h .


void void

Prototip abort 2void3> exit 2int cod_retur3>

?@.AA.AB

DC

!$
int

P#

s3stem 2const c'ar ?comand3>

e+ecut o comand i returnea* cod_retur 2?14-3.

11.E.

uncii pentru timp

Aceste func)ii se refer la dat (i or (i sunt definite 6n fi(ierul dos.h 6mpreun cu urmtoarele dou tipuri:
struct date {
int da_year; int da_day; int da_mon;

struct time

unsigned unsigned unsigned unsigned

char char char char

ti_min; ti_hour; ti_hund; ti_sec;

Semnifica 'ie 8ite te Data curent H &odific Data curent H 8ite te 4ra 2+act H &odific 4ra 2+act H

void void void void

Prototip getdate 2struct date ?Data3> setdate 2const struct date ?Data3> gettime 2struct time ?4ra2+act3> settime 2const struct time ?4ra2+act3>

E&emplu:
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
8lear 0creen @ait ;ms<

Aceste func)ii sunt definite 6n fi(ierul conio.h: Prototip void clrscr 2double + 3> void dela3 2unsigned ms 3>
B. D. -.

A. C.

void void void

sleep 2unsigned sec 3> sound 2unsigned C* 3> nosound 2void 3>

@ait ;sec< 0ound ;Fr< !o0ound

?@.AA.AB

DB

!$

P#

12. #cranul Hn mod te.t


E&ist posibilitatea de a defini urmtoarele moduri de lucru: void textmode 2 int mod 3 > unde mod poate fi C"- 2JA pentru D? coloane3 CF- 2JB pentru @? coloane3 2JPD pentru DB7-? linii3 (i altele. Uefinirea unei ferestre ecran 2implicit este tot ecranul3 se realizeaz astfel: void (indow 2 int u A int v A dter"erea unei ferestre ecran: void clrscr 2void3 > Pozi)ionarea cursorului: void gotox3 2 int & int T3 > Pozi)ia cursorului: int wherex 2 void 3 > int where3 2 void3 > 77 col 77 lin 77 col lin int u C int v C 3 > C"3>-

Un caracter poate fi afi(at pe ecran clipitor 2W,I)XJA3 pe o culoare de fond 2?EQ3 (i 6ntrEo anumit culoare de scriere 2?EA-3 culorile posibile fiind urmtoarele:

Colori 8nchise
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'#

!uloarea de fond se poate stabili prin func)ia: void textbackground 2 int cul f 3 > 77 cul f H? ... QI

!uloarea de scriere se poate sc:imba printrEun apel de forma: void textcolor 2 int cul s 3 > 77 cul s H? ... A-I

13. #cranul Hn mod grafic


#recerea 6n modul "rafic: void far initgraph 2 int far 8 "rap:driver int far 8 "rap:mode c'ar far 8 pat:3 >

?@.AA.AB

DD

!$

P#
%e irea din modul "rafic: void closegraph 2void3 > 0etarea 8 8itirea culorii de fond: void far setbkcolor 2int cul f 3 > 0etarea 8 8itirea culorii de scriere: void far setcolor 2int cul s 3 >

8 8

int far getbkcolor 2void 3 >

int far getcolor 2void 3 >

Alte func)ii: Semnifica 'ie !umr de pi+eli ; 4ri*)7/ert)< 8oordonatele $>. ;Gltimul >unct .eferit < &ut $>. ;Abs)7.el)< #rasea* segment din $>. #rasea* segment Desenea* dreptung'i Desenea* cerc 0crie mesa9 C din $>. D >agin activ 7 >agin vi*ual E&emple:
;include <graphics)h= ;include Sgraf)hS

#unc'ii getma++ 23> getma+6 23> get+ 23> get6 23> moveto 2+ 63> moverel 2d+ d63> lineto 2+ 63> linerel 2d+ d63> line 2+A 6A +C 6C3> rectangle 2+A 6A +C 6C3> circle 2+,6,r3> outte+tC+6D 2C+ 6 D mesa93> setactivepage 2pag3> setvisualpage 2pag3>

77 Graficul unei suprafe'e MM

; i n c l u d e < s t d l i b . : = ; i n c l u d e < s t d i o . : = ; i n c l u d e < con i o. : = ; i n c l u d e < m a t : . : =

float Sgr 2float &3 H return &8&> I float 6 2float & float T3 H return sin2Sgr2&3$Sgr2T33> I void main2void3 H float &> float T> float p&> float pT> int i> int 0> int nJD?> int mJD?> InitGraf 23> ViewPort 2A? A? "etma&&23EA? "etma&T23EA?3> float lJB> float &AJEl> float &CJl> float TAJEl> float TCJl> !efPr2A.7C A3> aJPrX2&A z2&A TA33> bJa> cJPrY2TA z2&A TA33> dJc> for 2iJ?> i<Jm> i$$3 for 20J?> 0<Jn> 0$$3 H &J&A$2&CE&A38i7m> TJTA$2TCETA3807n> p&JPrX2& z2& T33> pTJPrY2T z2& T33> if 2p&<a3 aJp&> else if 2p&=b3 bJp&> if 2pT<c3 cJpT> else if 2pT=d3 dJpT> I>

77 zJf2& T3

77 Uom 2& T3 77 UefPr 2r a3

?@.AA.AB

D-

!$

P#
indow2a d b c3> setb`color2%/UE3> for 2iJ?> i<Jm> i$$3 H &J&A$2&CE&A38i7m> TJTA> 2uta2PrX2& z2& T33 PrY2T z2& T333> for 20JA> 0<Jn> 0$$3 H TJTA$2TCETA3807n> %rag2PrX2& z2& T33 PrY2T z2& T333> I I setcolor2YE//#*3> for 20J?> 0<Jn> 0$$3 H TJTA$2TCETA3807n> &J&A> 2uta2PrX2& z2& T33 PrY2T z2& T333> for 2iJA> i<Jm> i$$3 H &J&A$2&CE&A38i7n> %rag2PrX2& z2& T33 PrY2T z2& T333> I I "etc:23> close"rap:23> I

;include <graphics)h= 77 Graficul unei curbe MM ;include <conio.:= ;include <mat:.:= ;include Sgraf)hS float & 2float t3 H return cos2t3> I float T 2float t3 H return sin2t3> I float z 2float t3 H return t 7 A?> I void main2void3 H float t p& pT> float tAJE-?> float tCJ-?> float pJ?.A> float cazaJ?.-> float AlfaJA> Initeraf 23> set"rap:mode2A3> 'ie+Port 2C? C? "etma&&23EC? "etma&T23EC?3> UefPr2caza Alfa3> 77 Pr.^^2caza Alfa3 tJtA> aJPrX2&2t3 z2t33> bJa> cJPrY2T2t3 z2t33> dJc> for 2tJtA$p> t<JtC> t$Jp8C3 H p&JPrX2&2t3 z2t33> pTJPrY2T2t3 z2t33> if 2p&<a3 aJp&> else if 2p&=b3 bJp&> if 2pT<c3 cJpT> else if 2pT=d3 dJpT> I> *indo+2a d b c3> int Pa"J?> setb`color2%/UE3> enum H cosu 'erde I Sem J 'erde> do H clearvie+port23> outte&t&T2A? A? Si #PS3> outte&t&T2A? C? SAS3> tJtA> Muta2PrX2&2t3 z2t33 PrY2T2t3 z2t333> for 2tJtA$p> t<JtC> t$Jp3 HNra"2PrX2&2t3 z2t33 PrY2T2t3 z2t333>I setvisualpa"e2Pa"3> Pa"JAEPa"> setactivepa"e2Pa"3> c:ar caspJ"etc:23> s+itc: 2caspV?&-F3 H case RAR : cazaEJ?.?A> brea`> case RiR : caza$J?.?A> brea`> case RPR : AlfaEJ?.?A> brea`> case R#R : Alfa$J?.?A> brea`> default : close"rap:23> SemJcosu> I UefPr2caza Alfa3> I +:ile 2SemJJ'erde3> I 11 Graf.h RR ;include <"rap:ics.:= ;include <mat:.:= int uA vA uC vC>

77 'ie+Port

?@.AA.AB

DP

!$

P#
float a b c d > float caza Alfa> int u 2float &3 H return 22&Ea372bEa382uCEuA3$uA3> I int & 2float T3 H return 22TEd372cEd382vCEvA3$vA3> I void InitGraf2void3 H int ed J UENE!N em> init"rap:2Ved Vem Sc:MM%cMM%"iS3> I void ViewPort2int &A int TA int &C int TC3 H uAJ&A> vAJTA> uCJ&C> vCJTC> 78 rectan"le2uA vA uC vC3>87 I void indow2float &A float TA float &C float TC3 H aJ&A> dJTA> bJ&C> cJTC> I void 2uta2float & float T3 H moveto2u2&3 v2T33> I void %rag2float & float T3 H lineto2u2&3 v2T33> I void !efPr2float r float a3 H cazaJr> AlfaJa> I float Pr9 2float & float z3 H return &$caza8z8cos2Alfa3> I float Pr: 2float T float z3 H return T$caza8z8sin2Alfa3> I

77 *indo+ 77 Pr 2r 3

?@.AA.AB

DQ

!$

P#

1".

aciliti CII

/imba0ul !$$ ofer 6n plus fa) de limba0ul ! unele facilit)i noi. Un avanta0 important 6l constituie no)iunea de clas 2prin care se define(te un #AD3 iar acestea pot forma o ierar'ie deci putem vorbi de o programare orientat obiect.

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


9n !$$ e&ist un nou tip de comentariu 2de0a utilizat 6n e&emplele anterioare3: ))) 11 Comentariu Uac 6n limba0ul C declara)iile erau scrise 6nainte de instruc)iuni 6n CII ele pot fi scrise oriunde. Uispozitivelor standard de intrareEie(ire li sEau ata(at streamurile standard cin 2pentru stdin3 (i respectiv cout 2pentru stdout3 care permit efectuarea opera)iilor de intrareE ie(ire aplic1nd operatorul QQ streamului cin respectiv MM streamului cout. Ierar:iile necesare sunt 6n fi(ierul iostream.h . E&emplu:
Einclude <!tdio.#>; Einclude <conio.#>;

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

{ int i;

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

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

77 endlJ<8r=

0etc#();

Uac 6n C conversia e&plicit se poate efectua prin 2tip3 e+presie 6n CII se poate realiza (i prin tip 2e+presie3. E&emplu:
Einclude <!tdio.#>; Einclude <conio.#>;

Einclude <iostrea$ .(>;


void main (void) {

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

77 !on)inutul adresei 77 la care se afl un 6ntre"

?@.AA.AB

D@

!$

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

Acest operator 2;;3 se utilizeaz c1nd dorim s referim o variabil "lobal redefinit 6ntrEo func)ie astfel: ;; Variabil E&emplu:
Einclude <conio.#>; Einclude <io!tream.#>;

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

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

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

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

::N << A,A <<

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

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

1".2.2.

Operatorul de adres 9=:

Acest operator 2=3 se poate utiliza (i pentru a defini un tip referin printrE declara)ie de forma tip = 2asemntor cu o construc)ie de forma tip + pentru pointer3. !u a0utorul acestui operator putem redenumi o variabil putem realiza un apel prin referin) sau putem s declarm o variabil de referin) astfel: tip ( parametru"formal tip ( nume_var_ref > 77 par) ref) ;adres< 77 var) de tip referin

?@.AA.AB

D,

!$

P#

E&emple:
Einclude <conio.#>; Einclude <io!tream.#>;

11 *edefinirea unei &ariabile

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

0etc#();

11 *edefinirea unei func 'ii

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

0etc#();

11 ,pel prin *eferin'

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

1".2.3.

Operatorii de alocare8dealocare 9;ew8!elete:


new tip new tip 2 /aloare_de_intiiali*are_a_variabilei_dinamice 3 new tip 4 !umrul_de_variabile_dinamice_alocate 5

#peratorul de alocare ;ew se poate folosi 6n oricare dintre urmtoarele trei variante:

Uealocarea se realizeaz astfel: delete /ariabil_de_referin > sau delete 4 !umrul_de_var_dinamice_alocate 5 /ariabil_de_referin > E&emplu:
Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>;

void main (void)

?@.AA.AB

-?

!$

P#
{ 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#();

9n e&emplul urmtor se va utiliza o matrice A cu numr variabil de coloane (i o matrice % utiliz1nd adresele liniilor:
Einclude <io!tream.#>; Einclude "9rt.922"

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

9lr1cr();

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

.. :iI

: "; A A;

.. >iI

Readln(); 77 . e * u l t a t e H
* 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

?@.AA.AB

-A

!$

P# 1".3. Structur< uniune 0i enumerare

ceferirea acestor tipuri se poate face 6n CII fr a mai fi nevoie de cuv1ntul corespunztor struct union respectiv enum. Ue asemenea parametrii (i valoarea unei func)ii pot fi structuri pointeri la structuri sau referine la structuri. Sunt permise (i atribuiri de structuri. ceferirea componentelor unei uniuni anonime din interiorul unei structuri se face la fel ca (i referirea componentelor structurii iar prima component se poate ini)ializa. 9n CII variabilelor de tip enumerare nu se mai pot atribui dec1t valori ale acestui tip 2nu (i numerele asociate acestor elemente3. E&emple:
Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>;

tN2edef float Real;

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

?@.AA.AB

-C

!$

P#

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

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

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

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

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

?@.AA.AB

-B

!$

P#

1>.
1>.1. uncii Inline

uncii CII

Aceste macrouri se pot defini astfel: [ define nume m 9 /ist"parametri"formali : <ir"caractere Apelurile macrourilor se vor 6nlocui cu irul de caractere precizat fr a face verificri de tipuri ceea ce poate conduce la erori. Aceste erori pot fi eliminate dac utilizm func)iile inline caz 6n care se vor face conversiile de tip necesare. Aceste func)ii se declar prin scrierea cuv1ntului inline la 6nceputul antetului a(a cum se pate vedea 6n e&emplele urmtoare: E&. A:
Einclude <conio.#>; Einclude <io!tream.#>;

Edefine :)!HK(=) (=)> - & (=) : 6(=) 77 eresit L Edefine :)!H0(=) ( = > - & = : 6 = ) 77 "resit L Edefine :)!Hc(=) ( (=)> - & (=) : 6(=) ) 77 Macro corect inline lon0 >bs (lon0 =) 77 Functie Inline { 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#();
/

E&. C:
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

?@.AA.AB

-D

!$

P#

1>.2.

uncii de tip referin

Antetul unei func)ii cu valoare de tip referin) este: tip ( numef 9 /ist"parametri"formali : E&emplu:
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 ;egre / 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 %nc2Albe7!egre3

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

9n urmtorul e&emplu se dore(te modificarea coordonatelor celui mai apropiat punct 2dintre P (i i3 fa) de ori"ine 2nu doar coordonatele simetricului lui P sau i3:
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();

?@.AA.AB

--

!$

P#
77 2+) .eferin JJ

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 H

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)=()*,)?)

?@.AA.AB

-P

!$

P# 1>.3. SupraHncrcarea funciilor

Aceast proprietate d posibilitatea utilizrii unor func)ii av1nd acela(i nume dar diferite 26nrudite cu antete diferite3. E&emple:
Einclude <mat#.#>; Einclude <com2le=.#>; Einclude <conio.#>; Einclude <io!tream.#>;

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

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

..

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

BB

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

void Rot (Ounct$

O,Ounct X,float :lfa)

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

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

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

{ { { {

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

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

?@.AA.AB

-Q

!$

P# 1>.". Iniiali6area parametrilor formali

Parametrii formali pot avea o valoare implicit dac ace(tia lipsesc din lista parametrilor actuali valoare dat de o expresie. 9n lista parametrilor formali cei cu valoare implicit 2ini)ializa)i3 se vor scrie ultimii astfel: tip nume = expresie E&emplu:
Einclude <!tdio.#>; Einclude <conio.#>; Einclude <io!tream.#>;

!truct int int T)iect {

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

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

9n e&emplul care urmeaz se poate vedea cum se pot folosi parametrii implici)i pentru a declara punctul #2? ?3 un punct A pe a&a #& un punct P 6n plan 2 4C3 un cerc ! 26n plan3 e&tremit)ile unui se"ment din spa)iu 2i c4 B3 precum (i se"mentele ic (i c#:
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; /

?@.AA.AB

-@

!$

P#

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

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

1>.>.

uncii membru pentru Structuri

Acestea se declar 6n cadrul structurii ca finc)ii inline sau prototipuri 2urm1nd 6n acest caz descrierea lor cu a0utorul operatorului de rezolu)ie 2::3.
Einclude <io!tream.#> Einclude "crt.#"

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

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

?@.AA.AB

-,

!$

P#

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

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

1?. 'ip !bstract de 1at


>rogramarea modular permite prote0area datelor prin memorie static 2accesul la date se poate efectua doar din locul declarrii p1n la sf1r(itul modulului nu (i 6n afara lui3. Un tip abstract de dat ;Domeniu, 4peraii< con)ine o interfa' 2#ad)'3 (i o implementare 2#ad)8pp3. Pro"ramul 2>rogram)8pp3 care utilizeaz acest tip abstract de dat va avea acces doar la modulul de interfa) a(a cum se poate vedea 6n sc:ema de mai 0os:

Prog ram .Cpp

Com pilare

Prog ram .Obj Link-editare

Tad.h Com pilare

Prog ram .Exe

Tad.Cpp

Prog ram .Obj

9n proiect 2meniul 3ro$ect3 vor fi incluse fi(ierele 3rogram.Cpp (i 'ad.Cpp.

?@.AA.AB

P?

!$

P#

9n e&emplul urmtor pentru #ad &ulime fi(ierele vor fi 3Vult.Cpp< Vult.& (i Vult.Cpp:
.. 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 >);

77 Sunt definite elementele mul)imii

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

.. 3Vult.Cpp BB

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

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

?@.AA.AB

PA

!$

P#

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!(>,:); /

?@.AA.AB

PC

!$

P#

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; 77 Nipul elementelor mul)imii

Un tip abstract de dat realizeaz o unificare 2printrEo "rupare de tip struct3 6ntre date 2date membru3 (i opera)iile 2funcii membru3 lor caracteristice. Funciile membru sunt considerate de tip inline iar definirea lor 6n afara structurii se face prin operatorul de re*oluie 2;;3. 9n acest mod 6ns nu se realizeaz o protec)ie a datelor 2accesul la date se poate face (i prin alte func)ii nu numai prin cele membru3 aceast protec)ie put1nd fi realizat 2a(a cum vom vedea 6n cele ce urmeaz3 cu a0utorul claselor. E&emplu:
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

?@.AA.AB

PB

!$

P#

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


OO3 este o metod de implementare 6n care:
a3 b3 c3

4biectele sunt elementele de baz #rice obiect este o instan) a unei clase !lasele sunt le"ate 2asociate3 unele cu altele prin mo tenire.

Un limba0 este orientat obiect dac: a3 Utilizeaz obiecte b3 #bli" obiectele s apar)in unei clase c3 Permite mo tenirea. /imba0ul !$$ ofer no)iunea de clas prin care se pot forma ierar'ii deci putem vorbi de o programare orientat obiect 2OO33. OO3 6nseamn realizarea unor pro"rame alctuite dintrEo mul)ime de obiecte care interac)ioneaz pentru a rezolva problema propus (i permite reutilizarea elementelor descrise 2a interfe)ei (i a codului3. Un obiect are o stare (i un comportament 2opera)ii descrise 6n interfa)a obiectului3 aceste dou componente fiind definite prin datele membru 2variabile de instan3 (i respectiv prin funciile membru 2metode3.

OO3 utilizeaz ormtoarele concepte:


clasa obiectul

- implementarea unui NAU - instana unei clase - mesa9ul prin care se asi"ur interfa)a 2opera)iile3.

metoda

OO3 are urmtoarele caracteristici 2propriet)i3 de baz:

8ncapsularea mo<tenirea

- "ruparea datelor (i a opera)iilor definite pentru acestea precum (i protec)ia acestor date 2ele neput1nd fi accesate dec1t prin func)iile membru3. - pstrarea elementelor 2date (i func)ii ale3 unei clase 2de ba*3 cu definirea de noi elemente construind o nou clas 2derivat3 form1nd 6n felul acesta ierar'ii de clase. &o tenirea poate fi (i multipl dac o clas mo(tene(te mai multe clase. - redefinirea 2supraFncrcarea3 opera)iilor 2func)iilor3. 9ntrEo ierar:ie pot fi mai multe func)ii cu acela(i nume deci va fi efectuat opera)ia corespunztoare obiectului care o apeleaz. Ueterminarea opera)iei se poate face la compilare 2legare static3 sau la e&ecu)ie 2legare dinamic prin funcii vituale3.

polimorfism

?@.AA.AB

PD

!$

P# 1E.1. 1efinirea Claselor

# clas se declar ca (i o structur 6nlocuind cuv1ntul struct cu class. Protec)ia datelor se define(te scriind modificatorul dorit 2private protected sau public3 urmat de F:G. Uescrierea unei clase con)ine at1t datele membru 2variabilele de instan)3 c1t (i func)iile membru 2metodele3 preciz1nd pentru acestea "radul de protec)ie astfel: class !ume_clas B

B C &odificator_de_protecie; D $ist_membrii A
A> unde:

&odificator_de_protecie B private protected publicA private nu permite accesul din afara clasei

< private fiind implicit N [ I

protected permite accesul din clasele derivate public permite accesul din afara clasei>

$ist_membrii B $ist_declaraii_date_membru, $ist_ declaraii _funcii_membru A

Uatele de tip private 2N3 pot fi accesate doar de func)iile membru sau func)ii prietene 2friend3. # func)ie membru a unei clase poate fi func)ie prieten a altei clase iar dac toate sunt prietene atunci se poate declara clas prieten 2friend3) 11

Vezi C>

Fiecare obiect al unei clase de)ine un set de date membru 2variabile de instan3. Func)iile membru publice pot fi utilizate din orice func)ie din pro"ram pe c1nd cele private doar din func)iile membru ale clasei. Uefinirea func)iilor membru 2metodelor3 se poate realiza: a3 imediat 2complet antet plus corp3 6n defini)ia clasei 2ca func)ie inline3 dac func)ia nu con)ine multe instruc)iuni (i nu con)ine structuri repetitive 2apelul nu se face prin salt cu revenire3 astfel: class !ume_clas B \ %ip"func'ie !ume_metod 9 ... : B . . . A> \ A> 77 antet$corp

b3

ulterior 2dac a fost declarat 6n defini)ia clasei doar prototipul func)iei3 utiliz1nd operatorul de rezolu)ie 2de scop3 astfel: %ip"func'ie ;ume"clas ;; !ume_metod 9 ... : 77 ;; operatorul de re*oluie B . . . A> 77 corpul funciei

?@.AA.AB

P-

!$

P#
.. .. 9la!a Ounct 66666666666666666666666666666 BB BB

E&emplu:
E include <conio.#> E include <io!tream.#>

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

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

pri1ate6

(!,y) e

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

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

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

Un obiect este o instan a unei clase 2o variabil de tipul clasei3. Fiecare obiect apar)ine unei sin"ure clase 2aceasta put1nd avea mai multe obiecte3. 4biectele unei clase se declar astfel: Clas E&emplu:
.. .. 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( ); /

?@.AA.AB

PP

!$

P#

Alocarea 2(i ini)ializarea3 obiectelor se face cu o func)ie membru specific numit constructor 2cu numele Clas3 iar dealocarea cu o func)ie destructor 2cu numele ]Clas3. E&emplu:
.. .. 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

?@.AA.AB

PQ

!$

P#
!omponentele claselor 2datele (i func)iile membru3 se refer prin operatorul

sau

Q ca (i 6n cazul unei structuri. Func)iile membru refer direct componentele clasei 2fr ace(ti operatori utiliz1nd poinetrul this declarat automat ca pointer la obiectul curent3. E&emplu:
.. .. E E E E E E include include include include include define T2eratorii (i Q BB 6666666666666666666666666666 BB

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

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

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

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

?@.AA.AB

P@

!$

P# 1E.2. Constructori (i !estructori

Un obiect este creat de un constructor al clasei (i este (ters 2distrus3 de ctre destructor. Constructorii permit ini)ializarea obiectelor cu 2mai multe3 func)ii membru omonime 2av1nd acela(i nume cu clasa (i care difer prin lista parametrilor formali3 fr a returna o valoare. 8onstructorul este apelat automat la crearea unui obiect. # clas trebuie s con)in cel pu)in doi constructori:

un constructor implicit 2fr parametri care ini)ializeaz obiectele cu o valoare implicit3 un constructor de copiere 2care ini)ializeaz cu valoarea unui obiect e&istent de acela(i tip3.

E&emplu:
77 8onstructori 0tring MM
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(); /

?@.AA.AB

P,

!$

P#

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

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

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

0etc#();

77 8onstructor implicit 331 4;0,0,0< 77 8onstructor pentru obiect 331 77 8onstructor 331 77 8onstructor 8erc 77 8onstructor de copiere

!estructorii realizeaz automat dealocarea obiectelor "lobale la sf1r(itul pro"ramului iar a celor locale la sf1r(itul func)iei. #biectele alocate dinamic 2cu ne(3 se vor dealoca cu operatorul delete. bumele destructorului este compus din caracterul ? urmat de numele clasei 2 ? Cl as 9 : 3. Uestructorii nu returneaz o valoare. E&emplu:
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 ateH


>locare ,,, 0(*,7,8) .ealocare,,,

?@.AA.AB

Q?

!$

P#

9n e&emplul urmtor se poate urmrii momentul 6n care ac)ioneaz constructorul (i destrucorul: 7 7 4biecte alocate dinamic ; operatorul d e l e t e <
Einclude <!trin0.#>; Einclude <io!tream.#>;

cla!!

Natural { 2u)lic:

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

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

77 .e*ultatele afi ateH

?@.AA.AB

QA

!$

P#

1F. Specificarea claselor @ /imbaAul +2/9Gnified &odeling $anguage:


KV, specific entit'ile 2clasele3 dintrEun pro"ram (i rela'iile dintre ele astfel: Specificarea entit'ilor : numele clasei date membru E protec'ie nume"dat ; tip func)ii membru E protec'ie nume"func'ie 9tip par)formali: ; tip"func'ie 2 protec'ie poate fi N 2private3 [ 2protected3 sau I 2public3 3. numele claseidate membrufunc'ii membru E&emplu: PunctE & : float E T : float$ Punct 2 3 $ Punct 2PunctV3 $\Punct 2 3

Specificarea rela'iilor dintre clase : rela)ia de asociere : rela)ia de derivare : 77 prietenie 77 mo tenire

3unctE & : float E T : float$ Punct 2 3 $ Punct 2PunctV3 $\Punct 2 3

3ersoanE bume : 0tring$ Persoan 2 3 $ Persoan 2Persoan V3 $\Persoan 2 3

SegmentE A : 3unct E % : 3unct$ Se"ment 2 3 $ Se"ment 2Se"mentV3


$\Se"ment 2 3

StudentE Facultate: 0tring E 'arst : int$ Student 23 $ Student 2Student V3 $\Student 2 3

?@.AA.AB

QC

!$

P#

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


# funcie este prieten cu o clas dac are acces la datele membru private ale acelei clase. # func)ie prieten poate fi o func)ie global sau c:iar o func)ie membru a altei clase. # clas este prieten cu o alt clas dac ea are acces la datele membru ale acesteia. # funcie< respectiv o clas prieten se declar utiliz1nd cuv1ntul friend astfel: friend %ip"func'ie ;ume"func'ie 9 $ist_parametri_formali :@ 77 uncie friend "lobal b3 friend %ip"func'ie ;ume"clas;;;ume"func'ie9$ist_par)_formali:@ 77 uncie friend membru c3 friend ;ume"clas@ 77 Clas friend
a3

Urmtorul e&emplu nu este corect deoarece elementul !.S nu este accesibil:


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

77 uncie friend membru

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

float !,y;

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

cla!! 0erc

2u)lic:

Punct 9;

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

float r;

/;

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

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

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

# solu)ie pentru a rezolva aceast problem ar putea fi declararea func)iei membru %aie0x ca func)ie prieten a clasei 3unct. Aceast modificare nu este suficient deoarece clasa Cerc nu a fost 6nc 2de0aL3 definit deci aceasta trebuie mai 6nt1i declarat iar pentru c aceasta refer clasa 3unct vom declara 2pur (i3 simplu clasa 3unct pentru a putea referi centrul cercului ca pointer la 3unct. Pentru c y nu este dat membru pentru cerc func)ia /aie-! nu poate fi definit imediat ci doar ulterior dup declararea complet a clasei 3unct.
E include <mat#.#> Einclude <io!tream.#>

88

uncie friend membru

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


/;

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

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

friend int Cerc 66/aie-!();

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


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

?@.AA.AB

QB

!$

P#
.. #unctie globala friend BB

E&emple:
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(:,>);/ 77;;Mi0loc Ounct :fin! (float t) { return >fin(:,>,t);/ 77;;Mi0loc /; 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:; /

?@.AA.AB

QD

!$

P#
.. #unctie membru friend BB

E E E E E E

include include include include include define

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

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

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

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

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

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

?@.AA.AB

Q-

!$

P#
..
E include <conio.#>

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

Clasa friend

E include <0ra2#ic!.#>

E include <io!tream.#>

BB

!truct 2alettetN2e 2al;

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

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

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

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

class Punct { int

/;

[Krafic( )

=, N;

N-,int

c)

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

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

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

.. 9a2etele 1e0m.

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

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

.. Warfuri

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

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

void
{

main (void)

r -, ,% -, 9f, /

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

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

?@.AA.AB

QP

!$

P#

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

11 ^ ;

Fiecare obiect dintrEo clas de)ine toate datele membru 2atributele3 acesteia. E&ist 6ns posibilitatea ca toate instan)ele unei clase s de)in anumite atribute comune tuturor obiectelor clasei respective. Ace(ti membri 2date func)ii3 statici au acela(i re"im de protec)ie ca (i ceilal)i membrii.

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

11 ^ ;

!atele membru statice care urmeaz s fie utilizate de ctre toate obiectele clasei se definesc prin specificatorul static astfel: class !ume_clas B A> !atele membru statice se declar 2se iniiali*ea*3 e.plicit 6n afara clasei: #ip_dat_membru !ume_clas ;; Dat_membru C L /alaore D> *eferirea 2utili*area3 datelor membru statice se poate face astfel: K ;ume"clas ;; !at"membru K 77 .eferire natural ;global< la clas b3 K 4biect Dat_membru K 77 .eferire particular la un obiect c3 K >ointer_4biect QDat_membru K 77 .eferire particular prin pointer
a3

\ static F

$ist_Declaraii_date_membru >

77 ^ ;

9n urmtorul e&emplu se numr c1te >uncte sunt utlizate la un moment dat 6n pro"ram utiliz1nd ca dat comun pentru toate punctele 26ntrea"a clas3 'r_-b: 77 Membru Static
E include <conio.#> E include <io!tream.#>

class Punct { 2u)lic:

float

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

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

?@.AA.AB

QQ

!$

P#
clr!cr();

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

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

0etc#e();

9n e&emplul urmtor sunt utiliza)i membri statici a,b,c,d pentru a memora domeniul minim care con)ine toate punctele curbei 2definite parametric3 care se deseneaz:
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);

77 Membri Statici

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

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

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

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

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

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

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

?@.AA.AB

Q@

!$

P#

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

11 ^ ;

2etodele D#unc'iile membruE statice ac)ioneaz doar asupra atributelor statice 2ale claselor3 deci nu pot ac)iona asupra atributelor obiectului curent 2deoarece nu li se transmite poinetrul t'is3. Ue asemenea ele pot apela doar metodele statice. Pot 6ns ac)iona asupra atributelor unui anumit obiect prin operatorii sau Q. 2etodele statice se definesc prin specificatorul static astfel: class !ume_clas B \ static %ip"func'ie ;ume"func'ie 9 $ist_par_formali : \ 77 ^ ; F A> *eferirea 2utili*area3 metodelor statice se face astfel: a3 K ;ume"clas ;; #unc'ie"membru 9$ist_par_actuali:K 77 .eferire natural la clas b3 K 4biect #unc'ie"membru 9$ist_par_actuali : K 77 .eferire la un obiect c3 K >ointer_4biect Q #unc'ie"membru 9$ist_par_actuali:K 77 .eferire prin pointer 9n urmtorul e&emplu se determin fereastra real 2definit prin cele dou puncte dia"onal opuse 2t_2us, .r_Oos3 utiliz1nd func)iile statice @inX, @a!X, @inP, @a!P pentru a determina domeniul minimal care include punctele din "rafic.
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=-; /

77 Func)ii Statice

E include <0ra2#ic!.#>

void

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

void void

/; Punct Punct662t_2us, Punct66.r_Oos;


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

static static static static static

Punct float float float float

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

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

} } } }

BB BB BB BB

@etodQ @etodQ @etodQ @etodQ

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


.. Gerea!tra Lcran

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

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

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

Krafic @od(DL?L9?);

GB) Pointeri la 2etode


# metod a unei clase poate fi referit 2apelat3 (i printrEun pointer la ea.

?@.AA.AB

Q,

!$

P#
!efinirea unui pointer la o metod se poate face astfel: %ip"func'ie 9;ume"clas ;; 8;ume"Pointer : 9 $ist_par_formali :

77 sau cu t6pedef

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

*eferirea unui pointer la o metod 2apelarea metodei3 :

\ 9;ume"0biect . 8;ume"Pointer : 9 $ist_par_actuali : \

Ue e&emplu pentru pro"ramul anterior modificrile necesare pentru a putea apela cele dou metode @uta (i /ra3 ale clase Punct pot fi urmtoarele:
\

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

cla!! Punct { float void

1oid 1oid

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

@uta () /ra3 ()

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

.. @etod^ 1tatic^

/; R void main (void) { \

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

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

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

?@.AA.AB

@?

!$

P#

Un alt e&emplu care utilizeaz pointeri la metode 2 %riun !rept (i *omb3 este urmtorul:
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);

77 Pointeri la 62etode

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

void void void void

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

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

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

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

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

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

?@.AA.AB

@A

!$

P#

GG) Supra8ncrcarea operatorilor


Anumite opera)ii se pot e&prima mult mai bine prin operatori. bu se pot defini operatori noi dar se pot supra6ncrca cei e&isten)i 2 I< M< II< IL< Q< C D< 9 :< new< delete< j mai pu)in operatorii
8

;;

4; 3 fr a modifica 6ns aritatea prioritatea sau

asociativitatea. Supra8ncrcarea se poate face cu: a3 func'ii membru E numrul parametrilor fiind e"al cu aritatea operatorului minus unu deoarece un operand este c:iar obiectul curent pentru care se apeleaz metoda 2acesta put1nd fi referit prin pointerul this3 b3 func'ii prietene E numrul parametrilor fiind e"al cu aritatea operatorului. *edefinirea unui operator se realizeaz printrEo func)ie 2prieten sau membru3 al crei nume este compus din cuv1ntul operator urmat de operatorul propriuzis 2I< M< \3 . E&emplu:
E include <9onio.#> E include <1trin0.#>

..

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

BB
E include <Mo!tream.#>

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

.. .. .. BB

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

im2licit de co2iere de conver!ie atribuire

friend

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

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


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

a: b:

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

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

0etc#e();

?@.AA.AB

@C

!$

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

0peratorul de atribuire 2L3 se poate utiliza (i pentru obiecte acesta fiind supra6ncrcat implicit (i realizeaz copierea datelor membru. Uac 6ns datele membru sunt referin)e 2pointeri3 la ni(te variabile dinamice atunci prin copiere se vor ob)ine dou obiecte care refer accea(i zon de memorie iar la dealocare se va elibera aceea(i zon de dou ori iar alta niciodat ceea ce ne obli" 6n aceast situa)ie la redefinirea 2supra6ncrcarea3 acestui operator. Prin aceasta con)inutul variabilelor dinamice sunt identice dar la adrese diferite astfel 6nc1t dac un obiect 6(i modific valorile cellalt obiect rm1ne nesc:imbat. Pentru o declara)ie de tipul Clas 0biectI se va apela constructorul implicit sau cel cu to)i parametrii implici)i iar pentru o declara)ie de forma Clas 0biect=0bI se va apela constructorul de copiere 2(i nu operatorul de atribuire3 ca (i la o declara)ie de forma Clas 0biectD0bEI . !onstructorul de copiere se mai poate apela dac parametrul unei func)ii este un obiect sau dac func)ia returneaz un obiect. E&emplu:
..
E include <9onio.#> E include <1trin0.#> E include <Mo!tream.#>

C l asa ;u m ar ;at u ral

(Op.

= ) BB

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

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

?@.AA.AB

@B

!$

P#

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();

?@.AA.AB

@D

!$

P#

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


Ace(ti operatori 2$J J 8J 7J3 nu sunt supra6ncrca)i automat deci dac dorim sEi utilizm va trebui s 6i redefinim 2a(a cum se poate vedea 6n e&emplul urmtor supra6ncrcarea operatorilor $J J3. E&emplu:
..
E include <9onio.#> E include <1trin0.#>

C l asa ;u m ar ;at u ral

(Op.

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

cla!! Natural { c#ar8 !;


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

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


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

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

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

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

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

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

?@.AA.AB

@-

!$

P# 22.3. Operatorii de incrementare 9II: 0i decrementare 9 :

!ontinu1nd cu e&emplul anterior dorim s supara6ncrcm operatorii de incrementare si decrementare mai 6nt1i cei prefi&a)i 2 IIx< x3 unde nu sunt probleme deosebite apoi ce postfi&a)i 2xII< x3. Pentru a supra6ncrca (i operatorii de incrementare postfi+ai vom adu"a c1te o func)ie membru av1nd un parametru de tip int 2care nu se va folosi (i care automat la un apel va lua valoarea zero3. E&emplu:
E include <9onio.#> E include <1trin0.#> 2u)lic:

..

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


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

cla!! Natural { c#ar8 !;


Natural Natural Natural Natural$ Natural Natural

'atural5 'atural 'atural5 'atural

operator operator operator operator

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

BB BB BB BB

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

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

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


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

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

/;

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

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

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

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

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

?@.AA.AB

@P

!$

P#

23. Con%ersii utili6ator


!onversiile sunt e&ecutate automat dac: a3 operanzii nu sunt de acela(i tip 2c'ar enum int double ... iar la atribuire se face conversia valoarii e&presiei 6n tipul variabilei3> b3 parametrul actual nu are tipul parametrului formal 2se face conversia primului3> c3 tipul valorii returnate de o func)ie difer de tipul acesteia 2se face conversia valorii3.

23.1. Con%ersii implicite


23.1.1. Con%ersia dintrPun tip predefint HntrPun tip abstract
!onversiile dintre un tip predefinit (i un tip abstract se pot realiza printrEun constructor care s con)in un parametru av1nd acel tip predefinit iar ceilal)i vor fi ini)ializa)i. E&emplu: 77 !umere raionaleH K
Einclude <!trin0.#>; Einclude <io!tream.#>; lon0 9mmdc(lon0, lon0); Einclude <conio.#>;

cla!! X { lon0 m, n; 77 m 7 n 2u)lic: C (lon3, lon3); 77 constructor implicit X$ o2erator [(); 77 operator de simplificare friend C operator *(C, C); 77 functie prieten void ?i2(con!t c#ar8 @e!=""); 77 tiparire 2mesa03 /; 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); / 77 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 H
! y I !*y + !*+ !*7 7*! 6 6 6 = 6 = = = 8B7 7BN 7B* *B8 7B* 8B* 8B* 8B*

?@.AA.AB

@Q

!$

P#

# alt variant 6n care se evit utilizarea unei func)ii prietene este de a defini o func)ie membru 2>rodus3 care se va apela de ctre func)ia de supra6ncrcare a operatorului de 6nmul)ire. E&emplu: 77 !umere raionaleH K
Einclude <!trin0.#>; lon0 9mmdc(lon0, lon0); Einclude <io!tream.#>; Einclude <conio.#>;

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


X$ o2erator [();

X void /;

Produs (X);

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

77 m 7 n 77 constr. implicit 77 operator de simplificare 77 Produs 77 tiparire 2mesa03

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); / 77 operator de inmultire
inline void X::?i2 (con!t c#ar8 @e!) { if (n) cout << @e! << m << "." << n << endl; el!e cerr << " Numitor nul " ;/; lon0 9mmdc(lon0 a, lon0 )) { if ()) return 9mmdc(),a4)); el!e return a; /;

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

clr!cr();

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

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

0etc#();

77 . e * u l t a t e H
! 6 y 6 I 6 !*y= !*I= !*7= 7*!= 8B7 7BN 9B7 *B8 8B* 8B* 8B*

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


# alt problem pe care o vom aborda 6n cele ce urmeaz este de a realiza o conversie dintrEun tip abstract 6n altul. Pentru aceasta vom defini un constructor pentru realizarea conversiei dorite. 9n pro"ramul urmtor am definit tipul comple& 6n cele dou forme: a3 algebric E clasa C b3 trigonometric 2polar3 E clasa '. !onversia realizat face trecerea din forma b3 6n forma a3. Pentru a putea verifica rezultatele se utilizeaz (i tipul complex predefinit.

?@.AA.AB

@@

!$

P#
77 !umere comple+eH %C
Einclude <io!tream.#> Einclude <conio.#> Einclude <mat#.#>

E&emplu:

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

float float float void

0 (/ I); 88 8onversie 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,%$(); } 77 8onversie prin constructor CMP' 9::@odul( ) { return !Drt(Re8Re Mm8Mm); / 9:::r0 ( ) { return atan2 (Mm,Re); / 9:::r0 ( ) { return atan2 (Mm,Re); / 9::?i2 ( con!t c#ar8 @e!aI) { cout << @e!aI << Re << " " << Mm << "i" << endl; / ?::? ( float @odul, float :r0) { Ro=@odul; Gi=:r0; / ?::? (9 ") { Ro=".@odul(); Gi=".:r0(); / .. 9onver!ie 96>? ?::Re ( ) { return Ro8co!(Gi); / ?::Mm ( ) { return Ro8!in(Gi); / ?::?i2(con!t c#ar8 @e!aI) { cout << @e!aI << Ro << "," << Gi << ";" << endl; /

.. float float void

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

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

?@.AA.AB

@,

!$

P#

23.2. Con%ersii e.plicite


23.2.1. Con%ersia dintrPun tip abstract HntrPun tip predefinit
!onversia dintrEun tip abstract de dat 6ntrEun tip predefinit se poate realiza prin supra8ncrcarea operatorului de con&ersie explicit corespunztor printrEo func)ie membru definit astfel: class 8las H ... publicH ... operator %ip"Predefinit 9 :@ ... I> Clas ;; operator %ip"Predefinit 9 : H ... return Expresie"de"%ip"Predefinit@ I 9n e&emplul urmtor se va realiza o conversie dintrEun numr ra)ional 6ntrEun numr real: 77 8onversie #ad-L double
Einclude <!trin0.#>; Einclude <io!tream.#>; Einclude <conio.#>;

cla!! X { 2u)lic:

void inline inline inline X

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

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

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

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

0etc#();

77 . e * u l t a t e H I = AB8F a = *,M b = *,M

?@.AA.AB

,?

!$

P#

23.2.2. Con%ersia dintrPun tip abstract HntrPun alt tip abstract 2prin operatori3
Acest tip de conversie se poate realiza (i prin oparatori 2dar nu simultan (i prin constructori3. 9n pro"ramul urmtor este realizat conversia 2prin operatorul de con&ersie3 din tri"onometric 2clasa ': 6n forma al"ebric 2clasa C3: 77 !umere comple+eH %C
Einclude <io!tream.#> Einclude <conio.#> Einclude <mat#.#>

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

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

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

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

?@.AA.AB

,A

!$

P#

2". Clase Lablon 9 %emplate :


!lasele %emplate 2parametri*ate sau generice3 permit descrierea unor cate"orii de clase care difer prin tipul unor atribute acesta fiind descris "eneric 2nu este precizat la descrierea clasei ci doar la instan)ierea obiectelor3. # astfel de clas abstract va fi particularizat 6ntrEo clas concret 6nlocuind tipul "eneral cu un anumit tip ales.

2".1.

uncii Lablon 9 %emplate :

Func)iile %emplate 2generice3 con)in (i parametri formali "enerici care vor fi 6nlocui)i cu parametri de un anumit tip concret. E&emplu:
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(); /
77!Md-2usorsgre e tiI

Se observ c putem folosi ca parametri actuali parametri de diverse tipuri pentru care 6ns este definit operatorul Q . Uac acest operator nu este definit pentru un tip de dat cu care dorim s lucrm sau nu corespunde cerin)elor noastre acesta va trebui redefinit sau c:iar func)ia va fi rescris conform cerin)elor. E&emplu:
Einclude <io!tream.#> Einclude <conio.#>

..

#unc'ii

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

Einclude <!trin0.#>

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

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

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

?@.AA.AB

,C

!$

P# 2".2. Clase %emplate

# clas %emplate este un model 2(ablon3 din care se vor "enera diverse clase concrete prin particularizarea atributelor cu tip ambi"uu 2 generic3. # astfel de cate"orie de clase care difer prin tipurile atributelor sunt specificate printrEo clas template pentru ca apoi s fie "enerate diverse clase specifice corespunztoare anumitor tipuri necesare aplica)iei. E&emplu:
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();

Se observ c 6n e&emplul anterior sEau utilizat nu numai clase template ci (i funcii membru template. Ar"umentele pot fi tipuri de date 2class !ume_>arametru3 de e&emplu:
te$plate <class /, int .i$;
!ume_#ip3

sau constante 2#ip

?@.AA.AB

,B

!$

P# 2".3. Implementarea elementelor %emplate

9n cele ce urmeaz ne vom referi la pozi)ia codului 2care se e&pandeaz conform cerin)elor utilizatorului3 corespunztor obiectelor template. !odul template 2corpul func)iilor membru3 trebuie s fie vizibil acolo unde sunt utilizate elemente template. E&ist dou metode 2posibilit)i3 de implementare: a3 template smart a tot codul unei clase template este scris 6n fi(ierul header 2defini)ii de clase func)ii precum (i implementarea func)iilor3 acest mod put1nd fi precizat fie prin op)iunea de compilare N_g fie prin meniul Options Compiler C II options op)iunea 'emplate Generation H 0mart programul urm1nd s includ acest fi(ier cu toate descrierile. b3 template manual a doar declara)iile elementelor template sunt scrise 6n fi(ierul header iar implemetarea fc1nduEse separat 6n alt fi(ier. Acest mod trebuie precizat prin directiva [pragma option utiliz1nd op)iunea de compilare N_gd 2urmeaz o definire public a instan)ierilor unor elemente template3 (i op)iunea N_g. 2urmeaz o declara)ie e.tern a instan)ierilor template3. Acest mod este ilustrat 6n urmtorul e&emplu simplu:
Einclude <conio.#> .. >rogram #emplate ))) &anual BB Einclude <io!tream.#>

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

void main ()
{ Wint1- F; F.9itW("F"); cout << " @a=imul e!te " << F.@a=W( ) << endl; Wflo1% Y; Y.9itW("Y"); cout << " @a=imul e!te " << Y.@a=W( ) << endl; /
Einclude <conio.#> .. 8pp #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=;

.. Ceader #emplate ))) &anual BB F;Dim<; n; 9itW (c#ar8); @a=W ( ); /;

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

?@.AA.AB

,D

!$

P#

2>. Relaii Hntre clase


/a elaborarea modelului obiectual al unei aplica)ii se distin" urmtoarele dou etape:
a3 identificarea claselor a corespunztoare conceptelor aplica)iei 2substanti&ele3 b3 stabilirea rela'iilor dintre clase a corespunztoare specifica'iilor aplica)iei 2&erbele3.

9n cele ce urmeaz ne vom referi la urmtoarele tipuri de rela)ii 6ntre clase: A3 ,socia'ie a rela)ie de cooperare 6ntre clase a corespunztoare unui verb oarecare din specifica)ie diferit de rela)ia parte-Fntreg 2de e&emplu rela)ia 0tudent a Facultate3. cela)ia corespunztoare dintre obiecte apar)in1nd unor clase asociate se nume(te legtur. # asocia)ie poate fi simpl sau multipl 2dac un obiect asociant este pus 6n le"tur de e&emplu prin pointeri cu mai multe obiecte asociate de acela(i tip3. Aceast rela)ie se reprezint "rafic 2dup metodolo"ia #MN3 6n plan orizontal astfel:
!A simpl !C !A multipl !C

C3 ,gregare a rela)ie de asociaie prin care obiectul agregat este inclus 6n obiectul agregant 2verbul caracteristic este a a&ea3 (i evident c poate fi simpl sau multipl;
!A simpl !C !A multipl !C

B3 Specializare Dgeneralizare5 mo<tenireE a rela)ie prin care sunt pstrate 2 mo tenite3 caracteristicile unei clase 2de ba*3 (i sunt adu"ate diferen)ele specifice form1nd o nou clas 2derivat3. &o tenirea permite reutili*area de cod definit 6n clasa de baz 2superclas3 (i 6n noua clas 2sublas3. Ueci o subclas este o specializare a unei superclase 2verbul caracteristic fiind a fi3 iar o superclas este o generalizare a unei subclase. Aceast rela)ie este tranziti& iar structura format de mul)imea claselor aflate 6n aceast rela)ie 2construit pe vertical3 se nume(te ierarhie de clase. At1t specializarea c1t (i mo(tenirea poate fi simpl sau multipl reprezentarea fc1nduEse 6n plan vertical astfel:
!A !A !A !C

!C 0peciali*are simpl

!C

!B

!B &o tenire multipl

0peciali*are multipl

Se pot ob)ine 6n felul acesta (i ierar:ii spa)iale de clase av1nd rela)ii at1t pe orizontal c1t (i pe vertical.

2>.1. Relaia de ,socia'ie


?@.AA.AB ,-

!$

P#

Prin aceast rela)ie dintre clase se modeleaz o legtur 6ntre obiectele instan)iate 2care depind unul de cellalt3. #raversarea unei asocia)ii se face printrEun rol 2nume dat e&tremitat)ii unei asocia)ii3. Implementarea unei asocia)ii se poate realiza astfel: a3 printrJun pointer a clasa asociant con)ine un atribut de tip pointer spre clasa asociat b3 printrJo clas a cu atribute (i comportare proprie fiecare le"tur fiind o instan) a acestei clase.

instaniere

!A !A rolA

asociaie rolC

!C !C
instaniere

#A

legtur

#C

Asocia)iile pot fi unidirecionale sau bidirecionale iar rela)iile de asocia)ie pot fi binare ternare sau nEare. Pe de alt parte asocia)iile pot fi simple sau multiplicative 2acestea din urm put1nd fi eventual (i cu restricii de ordonare sau de calificare3. Asociaiile multiplicative sunt caracterizate prin numrul de instan)e ale claselor care se afl 6n asocia)ie iar pentru a reprezenta direc)ia de asocia)ie se pot utiliza s"e)i. # asociaie multiplicativ poate s fie neordonat 2instan)ele formeaz o mulime3 sau poate s fie ordonat 2instan)ele formeaz o list ordonat3. 4 relaie multiplicati& cu restric'ie de calificare pune 6n rela)ie dou clase printrEun calificant 2atribut care reduce multiplicitatea asocia)iei printrEun criteriu pe care trebuie sEl 6ndeplineasc obiectele asociate pentru a intra 6n rela)ie3.
!A asociaia
MordonataN

!C

!A

asociaia
calificant

!C

/a implementarea rela)iilor de asocia)ie putem aplica cele dou metode amintite anterior: a3 prin pointeri spre clasa asociat 6ncuibri)i 6n clasa asociant 6n func)ie de tipul rela)iei de asociere astfel: a pentru rela)ia de asociaie simpl se adau" clasei asociante 6nc un atribut de tip pointer spre clasa asociat 6mpreun cu rela&area 6ncapsulrii pentru traversarea asocia)iei ale"1nd o metod convenabil dintre urmtoarele variante: modificarea protec)iei datelor membru implicate 6n public utilizarea de metode sau clase friend e&tinderea interfe)ei prin metode de acces la componente. a pentru rela)ia de asociaie multipl se adau" clasei asociante mai multe atribute de tip pointer 6n func)ie de tipul asocia)iei (i ordinul de multiplicitate astfel: dac este relativ mic se vor adu"a pointeri distinc'i iar 6n caz contrar se poate utiliza un <ir de pointeri> dac rela)ia este supus unor restric)ii de ordonare se pot utiliza liste ordonate. b3 prin clase distincte care realizeaz abstractizarea asocia)iilor dac le"turile au m n
!A !C

?@.AA.AB

Cas)

,P

!$

P#

propriet)i (i opera)ii proprii 2nemaifiind necesar adu"area de atribute claselor care se asociaz3 aceast metod utiliz1nduEse 6n special 6n cazul asocia)iilor bidirec)ionale de tip m-n3 sau o le"tur poate conecta obiecte de clase diferite. E&emplu:
..
Einclude <conio.#> Einclude <io!tream.#>

Clase asociate BB

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

clr!cr();

0etc#e();

asociant BB

<< )ect*aut+h >>

Clas asociat BB

<< )ectSort+h >>

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

?@.AA.AB

,Q

!$

P#
..

Clas asociant BB

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

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

Clas asociat BB

<< )ectSort+*'' >>

?@.AA.AB

,@

!$

P#

2>.2. Relaia de ,gregare


.elaia de agregare este cea mai puternic rela)ie de asocia)ie 6n care o clas este o component a altei clase deci rela)ia este binar unidirec)ional iar rela)iile multiplicative sunt de tip AEn. Prin aceast rela)ie dintre clase un obiect al clasei agregate este parte constituent atribut al clasei agregante deci verbul caracteristic este a avea 2conine3. #biectele constituente pot fi independente sau doar componente ale obiectului care le include.

instaniere

!A !A

8onine

!C !C
instaniere

#A

conine

#C

Aceast rela)ie 2notat cu simbolul av1nd semnifica)ia conine3 are urmtoarele dou propriet)i de baz: a3 tanziti&itate : Uac Cx C3 (i C3 Cz atunci Cx Cz
b3 antisimetrie : Uac Cx C3 atunci C3 8 Cx .

cela)ia de a"re"are poate fi: a3 fix a numrul (i tipul componentelor sunt fi&e b3 &ariabil a permite un numr variabil de obiecte de acela(i tip c3 recursi& a accept acela(i tip ca tip a"re"at (i a"re"ant ) E&emplu:
.. *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();

?@.AA.AB

,,

!$

P#
,gregant BB
<<

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

ect!Agr." >>

Clas ,gregant BB

<<

ect!Agr.Cpp >>

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

Clas ,gregat BB
..

<< ectSort." >> A fost descris la clase asociate. BB

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


\ ..

Clas ,gregat BB

<<

ectSort.Cpp >>

A fost de0a descris la clase asociate.

BB

?@.AA.AB

A??

!$

P#

9n urmtorul e&emplu se va folosi o clas Iterator pentru list simplu 6nln)uit care utilizeaz clasa Elem pentru un nod al listei (i clasa /ista:
.. Einclude <conio.#> Einclude <io!tream.#> E define ?el int cla!! #le$ { ?el Mnf; Llem8 Je0; 2u)lic: Llem (?el inf, Llem8 le0=-) { Mnf=inf; Je0=le0; / friend cla!! Ji!ta; friend cla!! Mterator;

Iterator /ist BB

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

{ { { {

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

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

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

clr!cr();

0etc#e();

?@.AA.AB

A?A

!$

P#

2>.3. Clase Tncuibate9imbricate:


E&ist posibilitatea definirii unei clase 2Fncuibate3 6n interiorul altei clase 2ca (i atribut al cesteia3. Aceast posibilitate e&ist de fapt (i la structuri 2struct3 (i uniuni 2union3. Ueclararea obiectelor din clasa Fncuibat se poate realiza utiliz1nd operatorul de scop 2;;3 a(a cum se poate vedea 6n e&emplul urmtor:
cla!! 9erc { C l as e Im bri ca t e BB .. 9erc(=,N,r) float r; .. cla!! Ounct { .. Ounct(=,N) float =,N; .8 ... 8. /; .8 ... 8. ..

Raza 9entrul

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

Utilizarea obiectelor din clasa Fncuibat se poate realiza utiliz1nd operatorul de apartenen 2.3 dup cum se vede 6n urmtorul e&emplul:
..
Einclude <conio.#> Einclude <io!tream.#>

C l as e In cu i b at e

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

cla!! 9erc {

float cla!!

r; Ounct {

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

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

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

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

?@.AA.AB

A?C

!$

P#

Evident c din clasa Fncuibat 2>unct3 nu avem acces la elementele clasei din care face parte 28erc3. Uac se dore(te acest lucru atunci se poate proceda ca (i 6n urmtorul e&emplu:
..
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 {

Se poate observa 6n e&emplul dat c referirea atributului r al clasei 8erc nu este permis din interiorul clasei 6ncuibate 2vezi func)ia >rint descris 6n ambele variante3 motiv pentru care clasa >unct a fost declarat prieten. 9n urmtorul e&emplu sunt imbricate clasele R R2 R3 :
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#();

?@.AA.AB

A?B

!$

P#

2>.". Relaia de deri%are


Prin aceast rela)ie putem modela similitudinile dintre clase dou sau mai multe clase. Pornind de la o clas de baz 2"eneral3 se pot deri&a noi clase 2prin diferen)ele specifice3. #biectele clasei derivate mo<tenesc atributele (i metodele clasei de baz la care se vor adu"a noile elemente caracteristice 2vor fi umflate3 ceea ce permite reutilizarea resurselor de0a pre"tite 6n clasele de baz 2pentru obiectele similare3. 'erbul caracteristic al acestei rela)ii de speciali*are este a fi 2 j este un fel de K <a -ind of=3. 2o<tenirea permite pstrarea elementelor 2date (i func)ii ale3 unei clase de ba* 2superclas3 cu definirea de noi elemente construind o nou clas derivat 2subclas3 form1nd 6n felul acesta ierar'ii de clase. &o tenirea poate fi (i multipl dac o clas mo(tene(te mai multe clase. Ueoarece aceast rela)ie este tranzitiv se utilizeaz (i termenii de strmo (i descendent.

generalizare

este o K

!b

!A

!A

!A

!C

!d
!C 0peciali*are simpl !C !B !B &o tenire multipl

2>.".1.

0peciali*are multipl

Clase deri%ate

cela)ia de derivare se poate descrie prin construc)ii speciale fr a mai fi nevoie de o rela&are a 6ncapsulrii a(a cum a fost necesar la rela)iile prezentate anterior. Uac 6ntrEo aplica)ie se poate utiliza rela)ia de derivare este de preferat 6n locul asociaiei sau agregrii pentru c avem instrumente specializate 6n limba0ul de pro"ramare. # clas derivat se declar astfel: class 8las_Derivat ; $ist_clase_de_ba* H Date i Funcii membru noi I>

?@.AA.AB

este un K

#b

#d

specializare

A?D

!$

P#

$ista claselor de ba* poate s con)in (i modificatorii de protec)ie 22od"Pr3 public protected sau private deci o derivare poate s fie public prote9at sau privat accesul rezultat fiind redat 6n urmtoarele tabele.
Accesul 6n clasa de baz2od"PrAccesul 6n clasa derivatprivate8>rivateprivateprotected sau public>rotectedprotected>ublicnesc:imbat 2protected sau public3

dRb[I I[I[[[

Ue e&emplu dac cele dou clase sunt descrise astfel:


class !lO%az H private: protected: public: I> publicO jaj jbj jcj !lOUerivat

&

bT

cz

a protectedO !lOUerivat &

class !lOUerivat : &od_>r !lO%az H private: jaj protected: jbj public: jcj I>

bcT

atunci protec)ia membrilor din pri&ateO clasa derivat este redat 6n sc:ema bc& T z alturat. !lOUerivat #rdinea de e&ecutare a constructorilor la instan)ierea obiectelor dintrEo clas derivat: prima dat se e+ecut constructorul clasei de ba*, apoi constructorul clasei derivate 2se construi(te cadrul apoi se adau" diferen)ele specifice3. #rdinea de e&ecutare a destructorilor la distru"erea obiectelor dintrEo clas derivat: prima dat se e+ecut destructorul clasei derivate, apoi destructorul clasei de ba*. !onstructorul clasei derivate transmite parametrii necesari constructorului clasei de baz prin apelul direct al acestuia astfel: 8las_Derivat 2 j 3 ; 8las_de_ba* 2 j 3 H K I> 77 inline sau 8las_Derivat :: 8las_Derivat 2 j 3 ; 8las_de_ba* 2 j 3 H K I> 77inline

?@.AA.AB

A?-

!$

P#

Ueoarece rela)ia de derivare este poate cea mai important rela)ie dintre clase sunt oferite facilit)i de implementare care permit urmtoarele facilit)i: economia de cod a reutili*area codului scris o sin"ur dat dup care se mo(tene(te e+tensibilitate a re-speciali*are prin derivarea de noi ramuri dintrEo ierar:ie polimorfism a 6ntrEo ierar'ie de clase se poate implementa o comportare polimorfic Fncapsularearela+are a rela)ia de derivare ofer posibilitatea Fnc'iderii resurselor simultan cu desc'iderea spre modificare (i e&tensie. cela)iile de derivare 2de fapt (i celelalte rela)ii dintre clase3 sunt stabilite la compilare deci nu se mai pot modifica pe parcursul e&ecu)iei. Mai trebuie cunoscut faptul c prin deri%are nu se pot mo0teni constructorii destructorii elementele prietene 2func)ii clase sau metode friend3 (i nici operatorii redefini)i. E&emplu:
..
Einclude <conio.#> Einclude <!trin0.#> Einclude <io!tream.#>

*elatia de deri&are BB

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

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

N(s:*)

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

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

0etc#e();

?@.AA.AB

A?P

!$

P#

!onversia unui obiect dintrEo clas derivat 6ntrEun obiect apar)in1nd clasei de baz este permis invers 6ns nu 2sursa trebuie s acopere destina)ia3: !ontraOE&emplu: .. 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 func)ie care are ca parametru formal un obiect al clasei de baz este permis apelul av1nd ca parametru un obiect al clasei derivate invers nu 2o func)ie care are ca parametru formal un obiect al clasei derivate nu poate fi apelat av1nd ca parametru actual un obiect al clasei de baz3. E&emplu: .. Con&ersie la deri&are BB
Einclude <conio.#> Einclude <!trin0.#> Einclude <io!tream.#>

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

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

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

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

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

/ / / /

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

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

0etc#e();

9n e&emplul urmtor se porne(te de la clasa de baz /ect,a*a (i se construie(te clasa derivat /ect_Der :

?@.AA.AB

A?Q

!$

P#
..

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

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

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

0etc#e();

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

de baz BB

<<

ect#a$a." >>

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

ect#a$a.Cpp >>

?@.AA.AB

A?@

!$

P#
!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 -; /

9n e&emplul care urmeaz datele !,y 2din clasa de baz >unct3 au fost declarate protected deoarece clasa derivat 28erc3 le refer. /a clasa derivat am utilizat modificatorul public pentru a putea utiliza (i pentru 8erc opera)ia 0ontine 2P!3.
.. Oro0ram GctHNeWirtuala; BB

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

cla!!

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

Punct { protected : float 2u)lic:

!,y;

77 . e * u l t a t e H 0ercul 0 nu contine punctul P,

0etc#();

Se observ 6n e&emplul de mai sus c rezultatul nu este cel dorit. Acest nea0uns 6l vom rezolva mai t1rziu declar1nd 1istan)a ca funcie virtual 2pentru legare dinamic3.

?@.AA.AB

A?,

!$

P#
!b Cb1

Fa) de mo(tenirea simpl 6n care dintrE o sin"ur clas de baz se deriveaz una sau mai multe clase derivate 2specializate3 mo(tenirea multipl presupune e&isten)a mai multor clase de baz din care un sau mai multe clase mo(tenesc diverse caracteristici.

Cb2

!dA

!dC

Cd
2o<tenire multipl

&o tenire simpl

Ueclararea unei clase derivate din mai multe clase de baz se face astfel: class 8las_de_ba*_A H K I> class 8las_de_ba*_C H j I> class 8las__derivat : 2od"Pr 8las_de_ba*_A 2od"Pr 8las_de_ba*_C H j I> unde 2od"Pr B public< protected< pri&ate A. Uatorit mo(tenirii multiple o clas de baz poate fi prezent 6n mai multe e&emplare 6ntrEo clas derivat a(a cum se poate vedea 6n e&emplul alturat unde datele membru ale clasei Animal vor fi mo(tenite 6n dou e&emplare de ctre clasa 8=ine 2unul prin clasa Domestic altul prin clasa &amifer3 (i pot fi referite prin operatorul de rezolu)ie 2 ;; 3 aplicat clasei prin care se face mo(tenirea 2!ume3. Aceast mo(tenire repetitiv a unei clase de baz este corect (i se poate utiliza astfel:

Anim al

Mam ife r

Do m e stic

Cine

Cl_Baz

Cl_Baz

Cl_Der1

Cl_De r2

Cla s _De riv a t

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@

?@.AA.AB

AA?

!$

P#

Uac dorim realizarea unei sin"ure copii a atributelor mo(tenite vom folosi mo(tenirea multipl &irtual:
Cl_Baz

Cl_Der1

Cl_De r2

Cla s _De riv a t

class class class class

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

?@.AA.AB

AAA

!$

P#

A(a cum se poate vedea 6n e&emplul urmtor vom avea un nume de mamifer (i un nume domestic. 77
Einclude <io!tream.#> Einclude <conio.#> Einclude <!trin0.#>

>rogram 8lase !e/irtuale;

JJ

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

clr!cr(); c.?i2(); 0etc#(); 77 .e*ultateH

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

9ane Nero 1% 1%-'

?@.AA.AB

AAC

!$

P#

Uac dorim ca datele membru s fie prezente 6ntrEun sin"ur e&emplar 6n clasele derivate atunci vom utiliza clase virtuale. # clas de baz devine virtual prin mo(tenire dac se declar aceasta prin cuv1ntul virtual plasat 6naintea clasei 2devenind astfel clas virtual fa) de clasa derivat3. Pro"ramul anterior modificat astfel 6nc1t numele s fie memorat 6ntrEun sin"ur e&emplar este urmtorul: 77
Einclude <io!tream.#> Einclude <conio.#> Einclude <!trin0.#>

>rogram 8lase /irtuale;

JJ

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 { 77 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 { 77 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*ultateH
Nume >ni$al Kreutate Oret Jant : : : : Ju2 1% 1%-'

?@.AA.AB

AAB

!$

P#

Pentru o ierar:ie ca cea din fi"ura alturat 6n care avem clase virtuale 23 (i nevirtuale 23 se e&ecut mai 6nt1i constructorii claselor de baz virtuale apoi cei ai claselor nevirtuale iar constructorul clasei de baz se va e&ecuta pentru o sin"ur dat toate e&emplarele virtuale (i c1te o dat pentru fiecare e&emplar nevirtual.

D G

E&emplul:
77 >rogram %erar'ie 8lase /irtuale7!evirtuale; JJ

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

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

77 .e*ultateH
> F J 0 > . # K 6 6 6 6 6 6 6 6 -b, -b, -b, -b, -b, -b, -b, -b,

?@.AA.AB

AAD

!$

P#

G-) Polimorfism
Supra8ncrcarea 2overloading3 prin redefinirea unor func)ii sau metode permite ale"erea la compilareElin-Oeditare a func)iei sau a metodei dorite prin semntura acesteia fr a mai putea ale"e la e&ecu)ie. Polimorfismul permite ca la e&ecu)ie s se decid ce metod s fie apelat oferind o facilitate a metodelor din clase aflate 6n rela)ie de derivare. Prin polimorfism se e&ecut ac)iuni diferite prin mesa0e cu semnturi identice asupra obiectelor de tip diferit 2obiecte din clase diferite rspund diferit la acela(i mesa03. Uou obiecte sunt compatibile dac apar)in acelea(i clase 2evident3 dar (i dou variabile
a3 de tip pointer la clasa de ba* respectiv pointer la clasa derivat b3 de tip referin 2pointer constant3 la clasa de ba* respectiv referin la clasa derivat .

Metodele unei clase pot fi:

Clasice @ metode legate static la compilareElin-Oeditare fiind fi&at adresa de apel a metodei fr posibilitatea de a o sc:imba la rularea aplica)iei Polimorifice @ metode legate dinamic care permit 6nt1rzierea deciziei referitoare la adresa de apel a metodei p1n la e&ecu)ie.

/egarea unei metode 2binding3 6n)ele"1nd prin aceasta cene&iunea lo"ic dintre o entitate (i o proprietate a acesteia 2coresponden)a dintre un mesa0 trimis unui obiect adic ordinul de apel (i metoda care se e&ecut ca rspuns la acesta3 poate fi:

%impurie Dstatic @ earl3JbindingE @ compilatorul (i editorul de le"turi vor fi&a adresa metodei care se e&ecut fr ca aceasta s mai poat fi modificat pe parcursul e&ecu)iei> %4rzie Ddinamic @ lateJbindingE @ compilatorul va construi un tablou de adrese ale metodelor posibile de apel iar determinarea adresei metodei dorite se va efectua doar la e&ecu)ie. 9n func)ie valoarea pointerului spre clasa de baz care poate con)ine (i adresa unui obiect al clasei derivate se va ale"e metoda corespunztoare.

?@.AA.AB

AA-

!$

P# 2?.1. uncii membru Vi r t u al e

Implicit o metod este le"at static 2 earl6 la compilare3 iar dac se dore(te o le"are dinamic 2late la e&ecu)ie3 se va declara virtual prin scrierea cuv1ntului &irtual 6naintea metodei. # metod virtual a unei clase de baz poate fi mo(tenit 6ntrEo clas derivat sau poate fi redefinit 26nlocuit E overriding3. # metod se declar vitual 6n clasa de baz 2nu se poate declara virtual doar 6ntrEo clas derivat. Se poate observa 6n e&emplul urmtor c dac dorim ca rezultatul s fie JaIaB.eri1ata (i la apelul func)iei 3 trebuie s declarm func)ia f virtual altfel rezultatul ar fi JaIaBJaIa.
E include <conio.#> E include <io!tream.#>

..

2et od &i r t u al

BB

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

" << endl; /

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

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

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


/

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

.. Je0are 1tatica .. Je0are Dinamica


0etc#e();

9n e&emplul urmtor vom utiliza variabile de tip referin) la clasa de baz respectiv la clasa derivat.
E include <conio.#> E include <io!tream.#>

..

2et od &i r t u al

BB

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

" << endl; /

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

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

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


/

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

.. Je0are 1tatica .. Je0are Dinamica

0etc#e();

?@.AA.AB

AAP

!$

P#

9n urmtorul e&emplu se poate deduce necesitatea le"rii dinamice pentru a putea calcula corect distan)a de la un punct la un cerc (i respectiv la un se"ment 2la o dreapt3. Uin pcate pentru c metoda 9ontine e&ist 6n dublu e&emplar 21tan0a (i Drea2ta3 apelul nu se poate efectua cum ar fi de doritL
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 << /

?@.AA.AB

AAQ

!$

P#

Aproape orice metod poate fi &irtual c:iar (i metodele inline metodele friend 2dar nu (i func)iile friend3 operatorii 2dac nu se redefinesc prin func)ii friend3 (i destructorii 6n sc:imb constructorii (i metodele statice nu pot fi virtuale. 9n e&emplul prezentat 6n continuare al doilea produs 2 7B8 * 9BF = MB*F3 nu va fi afi(at dac operatorul de 6nmul)ire a dou numere ra)ionale nu este declarat %irtual 2deoarece operatorul 8= va apela operatorul de 6nmul)ire pentru * 6n loc de cum ar trebui a (i b fiind din clasa 3. Se observ c la 6nmul)irea a dou obiecte din clasa * nu sunt tiprite frac)iile care se 6nmul)esc pe c1nd la 6nmul)irea a dou obiecte din clasa frac)iile care se 6nmul)esc sunt tiprite.
..
Einclude <conio.#>;

Oro0ram T2erator Wirtual;

BB
Einclude <io!tream.#>;

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

clr!cr();

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

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

77 . e * u l t a t e H
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

?@.AA.AB

AA@

!$

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

9n clasa de baz se poate declara o comportare "eneric av1nd un nume (i o semntur unic 2urm1nd ca fiecare specializare s ofere propria metod specific3 prin:
a3 metode nule care se declar astfel:

&irtual #ip_met !ume_met ;$ist_>ar_Formali< H I


b3 metode pure declarate 6n forma:

&irtual #ip_met !ume_met ;$ist_>ar_Formali< L -> Ambele variante permit 6nlocuirea acestei metode cu o metod proprie clasei specializate derivat din clasa de baz permi)1nd astfel solicitarea unui comportament "eneral dar propriu fiecrei specializri. &etodele pure nu pot fi apelate rolul lor fiind doar de a declara tipul numele (i parametrii unei metode abstracte care urmeaz s fie redefinit concret 6n fiecare clas specializat. # clas este abstract dac ea con)ine cel pu)in o funcie membru virtual pur. # funcie membru virtual este pur dac ea este declarat 2&irtual antet L -3 dar nu este definit 6n clasa din care face parte ci 6ntrEo clas derivat. Ueoarece clasele abstracte con)in func)ii membru nedefinite 2virtuale pure3 nu se pot crea obiecte apar)in1nd acestora 2nu pot fi instan)iate dar se pot defini variabile de tip pointer sau referin) la o clas abstract3 iar dac func)iile virtuale nu sunt definite nici 6n clasele derivate atunci (i aceste clase devin abstracte 2o clas derivat dintrEo clas abstract rm1ne abstract dac nu sEau redefinit toate metodele pure mo(tenite iar 6n caz contrar devine clas concret3. # clas abstract realizeaz implementarea unei no)iuni care nu poate fi concretizat 2(i atunci nu poate fi dec1t enun)at3 dar surprinde o caracteristic comun a claselor specializate din aceasta 2care vor con)ine implementrile efective3. Ueci o clas abstract va "eneraliza 2abstracti*a3 comportamentul subclaselor specializate. 9ntrEo ierar:ie clasa de baz poate avea ni(te propriet)i care nu se pot defini dec1t 6n clasele derivate 2anumite caracteristici depind de clasa derivat3. 9n e&emplul alturat cu toate c se cunoa(te "reutatea unui animal nu se poate spune c este slab sau gras dec1t pentru o clas derivat3.

Anim al

Porum ! e l

"rs

Cal

?@.AA.AB

AA,

!$

P#

9n e&emplul urmtor vom da trei caracterizri pentru un anumit animal 6n func)ie de "reutatea lui (i cea medie 2slab7gras3 v1rsta lui (i cea medie 2t=nr7btr=n3 (i viteza lui 2de deplasare3 (i cea medie 2lent7rapid3 acestea pentru un >orumbel Grs sau 8al. 77 8las e A bs tr ac te - &e to de >ur e JJ
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*ultateH
3ras, 3ras, slab, tanar, lent batran, rapid tanar, rapid

?@.AA.AB

AC?

!$

P#
Fi#ur

9n e&emplul urmtor vom apela o func)ie Dra( pentru a desena o fi"ur oarecare 2>unct >trat sau 8erc3 (i o func)ie Arie care va aplica formula caracteristic fiecrei fi"uri "eometrice: 77 8las A bs tr ac t - & et od e >ur e J J
E E E E include include include include <9onio.#> <Oroce!!.#> <Mo!tream.#> <Kra2#ic!.#>

Punct

P trat

Cerc

cla!! Fi3ura { { }

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

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

cla!! Punct

/; : 2u)lic

Gi0ura { int 9ul; 2u)lic:

Ounct

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

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

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

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

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

?@.AA.AB

ACA

!$

P#
0etc#e();

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


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

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

?@.AA.AB

ACC

!$

P#

2E. Ierarhii pentru Intrri1Ie<iri


Pentru c nu e&ist instruc)iuni de intrare7ie(ire sEau definit func)ii 26n C3 respectiv dou ierar:ii de clase 26n CII3. Aceste dou ierar:ii 2reprezentate 6n fi"urile de mai 0os (i declarate 6n fi(ierul iostream.'3 realizeaz opera)iile de intrare7ie(ire prin streamEuri 2flu& de date sursdestinaie3.
s t re m ! uf

file ! uf

strstream!uf

!lasa streambuf se folose(te pentru "estionarea zonelor tampon (i opera)ii de intrare7ie(ire simple. !lasa ios este clasa de baz vitual pentru clasa istream 2care face conversia dup un format specificat din caracterele unui obiect de tip streambuf3 clasa ostream 2care face conversia dup un format specificat 6n caractere ale unui obiect de tip streambuf3 (i clasa iostream 2care face conversii 6n ambele sensuri3. /e"tura dintre cele dou ierar:ii se realizeaz printrEo dat membru a clasei ios 2pointer la streambuf3.

io s is t re am io s t re am is t re am _$ it %as s i# n o s t re am _$ it %as s i# o s t re am

io s t re am _$ it %as s i#

!lasele derivate din clasa istream sau ostream se numesc clase stream iar obiectele claselor derivate din clasa ios se numesc streamuri. 9n fi(ierul iostream.' sunt definite streamurile cin 2 istreamO(it'assign pentru stdin3 cout 2 ostreamO(it'assign pentru stdout3 clog (i cerr 2 ostreamO(it'assign pentru stderr cu respectiv fr zone tampon3.

2E.1. 0peratorul de inserare MM


#pera)iile de scriere se pot efectua cu operatorul de inserare MM . #perandul st1n" trebuie s fie un obiect al clasei ostream 2sau al unei clase derivate3. Pentru scrierea pe dispozitivul standard se va folosi obiectul cout. #perandul drept este o e&presie pentru al crei tip a fost supra6ncrcat operatorul MM . Pentru tipurile standard a fost supra6ncrcat printrEo func)ie membru de forma: ostreamM operator MM 2 #ip_0tandard 3>

?@.AA.AB

ACB

!$

P#

Pentru tipurile abstracte pro"ramatorul poate supra6ncrca acest operator a(a cum se poate vedea 6n cele ce urmeaz. Pentru a putea tipri un obiect cout MM 4biect > vom supra6ncrcrca 26ntrEo prim variant3 operatorul de inserare 2<<3 printrEo func)ie prieten astfel: class 8las H ... friend ostreamM operator MM 2 ostreamV 8las 3> ... I> E&emplu: 7 7 >r ogr am 4 per a tor NN Fr ie nd ; J J
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*ultateH
r = *7B*8

Se observ c acest operator se poate aplica 6nln)uit pentru c func)ia prieten returneaz o referin) la streamEul curent. 9n cele ce urmeaz vom da o alt rezolvare fr a utiliza o func)ie prieten 2care mic(oreaz "radul de protec)ie a datelor3. Pentru o Clas vom scrie o func)ie membru de %iprire care va fi apelat de ctre func)ia de supra6ncrcare a operatorului MM astfel: class Clas H publicH ... ostreamM %iprire ... 2 ostreamM s 3>

I> ostreamM %iprire 2 ostreamM s 3 H s MM ... > return s; I ostreamM operator MM 2 ostreamV 8las c 3 H return c)%iprire2s3; I

?@.AA.AB

ACD

!$

P#
Pentru e&emplul anterior 2K3 pro"ramul va fi urmtorul: 77 >r ogr am 4 per at or PP JJ

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

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

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

77 .e*ultateH
r = *7B*8

2E.2. 0peratorul de extragere

QQ

#pera)iile de citire se pot efectua cu operatorul de e+tragere QQ . #perandul st1n" trebuie s fie un obiect al clasei istream 2sau al unei clase derivate3. Pentru citirea de la dispozitivul standard se va folosi obiectul cin. #perandul drept este o e&presie pentru al crei tip 2standard sau abstract3 a fost supra6ncrcat operatorul QQ . Pentru tipurile standard a fost supra6ncrcat printrEo func)ie membru de forma: istreamM operator QQ 2 #ip_0tandard ( 3> Pentru tipurile abstracte pro"ramatorul poate supra6ncrca acest operator a(a cum se poate vedea 6n cele ce urmeaz. Pentru a putea citi un obiect cin QQ 4biect > vom supra6ncrcrca 26ntrEo prim variant3 operatorul de e&tra"ere 2==3 printrEo func)ie prieten astfel: class 8las H ... friend istreamM operator QQ 2 istreamV 8las( 3> ...

I>

?@.AA.AB

AC-

!$

P#

E&emplu: 77
Einclude <io!tream.#> Einclude <conio.#>

>r ogr am 4 per a tor OO Fr ie nd ;

JJ

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

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

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

Se observ c acest operator se poate aplica 6nln)uit pentru c func)ia prieten returneaz o referin) la streamEul curent. 9n cele ce urmeaz vom da o alt rezolvare fr a utiliza o func)ie prieten 2func)ie care mic(oreaz "radul de protec)ie a datelor3. Pentru o Clas vom scrie o func)ie membru de Citire 2care va fi apelat de ctre func)ia de supra6ncrcare a operatorului QQ 3 astfel: class Clas
H

publicH

istreamM Citire
...

...

2 istreamM s 3>

istreamM Citire 2 istreamM s 3> H s QQ ... > return s;


I H I

I>

istreamM operator QQ 2 istreamV 8las( c 3> return c) Citire 2s3;

Pentru e&emplul anterior 2K3 pro"ramul va fi urmtorul: 77


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

>r ogr am 4 per at or QQ

JJ

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#();

?@.AA.AB

ACP

!$

P#

2E.3. Intrri8Ie0iri cu format


Niprirea 2afi(area3 datelor dup un anumit format 2(ablon3 precizat 2asemntor func)iilor scanf (i printf3 se poate realiza (i cu a0utorul ierar:iilor de clase definite 6n !$$ fie prin apelul func)iilor membru setf% &idt"% fill% precision fie cu a0utorul unor metode speciale numite manipulatori.

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


!lasa ios con)ine o dat membru x"flags care con)ine formatul opera)iilor de intrareE ie(ire. 9n aceea(i clas mai este definit un tip enumerare prin care se poate referi formatul corespunztor conversiei ata(ate opera)iilor de transfer:
cla!! ios { enum { !*i2"! left ri0#t internal dec oct #e= !#o")a!e !#o"2oint u22erca!e !#o"2o! !cientific fi=ed unit)uf !tdio /; /; = = = = = = = = = = = = = = = -=---1, -=---2, -=---+, -=---', -=--1-, -=--2-, -=--+-, -=--'-, -=-1--, -=-2--, -=-+--, -=-'--, -=1---, -=2---, -=+--.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. salt peste 2i"nor la citire3 caracterele albe cadrare la st1n"a cadrare la dreapta spa)iile dup semn sau baz conversie 6n zecimal conversie 6n octal conversie 6n :eza afi(area bazei afi(are punct zecimal cifre :e&a cu litere mari afi(are cu semn reale cu e&ponent reale fr e&ponent vidare zone tampon sup scriere vidare stdout (i stderr \ 2u)lic: \

Atributul +_flags are o valoare implicit pentru fiecare tip standard care se poate modifica utiliz1nd func)ia membru setf descris 6n continuare. Metoda setf are urmtoarele dou forme: A3 lon" setf 2lon" format3> C3 lon" setf 2lon" bit, lon" grup3> Func)ia modific atributul +_flags preciz1nd 6ntra"a valoare 2varianta a33 sau preciz1nd un "rup de bi)i (i bitul dorit din cadrul "rupului 2varianta b33. erupele 2(i valorile corespunztoare3 sunt ad9ustfield 2left, rig't, internal3 basefield 2dec, oct, 'e+3 (i floatfield 2scientific, fi+ed3 9n ambele variante func)ia returneaz valoarea anterioar a atributului +_flags) ceferirea "rupului (i bitului dorit se face prin numele clasei urmat de operatorul de rezolu)ie (i bitul dorit 2 ios;;b3. 'aloarea atributului +_flags se poate ob)ine (i prin apelul metodei flags 2cout.fla0!23 3. Atributul +_(idt' con)ine lun"imea minim a c1mpului de afi(are a unei date 2respectiv lun"imea ma&im a c1mpului din care se face citirea3 av1nd valoarea implicit ?@.AA.AB ACQ

!$

P#

nul 2afi(are pe lun"imea minim necesar3 care se poate modifica utiliz1nd func)ia membru &idt" descris 6n continuare 6n ambele forme: a3 int &idt" 2 3> b3 int &idt" 2int lungime3> Func)ia returneaz valoarea atributului +_flags 2varianta a33 sau modific atributul +_(idt' preciz1nd noua valoare 2lungime care poate fi o e&presie3 (i returneaz valoarea anterioar a atributului +_(idt' 2varianta b33) Uup fiecare transfer valoarea atributului +_flags devine nul. Atributul +_fill con)ine caracterul de umplere necesar completrii c1mpului de afi(are a datei 6n situa)ia 6n care lun"imea acestuia este mai mare dec1t lun"imea necesar av1nd valoarea implicit spa)iu 2F F3 care se poate modifica utiliz1nd func)ia membru fill : a3 c:ar fill 2 3> b3 c:ar fill 2c:ar car3> Func)ia returneaz valoarea atributului +_ fill 2varianta a33 sau modific atributul +_ fill preciz1nd noul caracter de umplere 2car3 (i returneaz valoarea anterioar 2varianta b33) Atributul +_precision con)ine precizia de afi(are 2numrul de zecimale3 a unei date de tip real av1nd valoarea implicit ? care se poate modifica utiliz1nd func)ia membru precision : a3 int precision 2 3> b3 int precision 2int n3> Func)ia returneaz valoarea atributului +_ precision 2varianta a33 sau modific atributul +_ precision preciz1nd noua precizie 2p3 (i returneaz valoarea anterioar 2varianta b33) 9n e&emplul urmtor se poate vedea apelul func)iilor prezentate anterior precum (i rezultatele ob)inute:
.. 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 a t BB

.. ' ); 4

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

?@.AA.AB

AC@

!$

P#

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*ultate:
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

Atributele +_flags, +_(idt', +_fill (i +_precision pot fi modificate (i cu a0utorul manipulatorilor ace(tia av1nd avanta0ul c pot fi apela)i 6nln)uit 2deoarece returneaz referin) la stream3. Primii (apte manipulatori prezenta)i 6n continuare sunt declara)i 6n fi(ierul iostream)', iar ultimii (ase 6n fi(ierul iomanip)' :
A. C. B. D. -. P. Q. A. C. B. D. -. P.

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 2s-ip(s3 conversie 6n zecimal conversie 6n octal conversie 6n :e&a vidarea zonei tampon a ob. stream inserare car. bul FM?G trece la r1nd nou (i vidarea zonei tampon define(te baza 6n care se face conversia setarea unor bi)i preciza)i (ter"erea unor bi)i preciza)i define(te lun"imea c1mpului define(te caracterul de umplere define(te numrul de zecimale

E&emplul urmtor utilizeaz manipulatorii pentru a realiza tiprirea rezultatelor dorite:

?@.AA.AB

AC,

!$

P#
.. 0p erat oru l d e i n serare

MM cu manipul atori BB
*ezultate :
n 6 *HH n = *HH n = A9 6 7HH* n = H!A9 n = ,,,*HH nB8= ____88,88

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


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

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

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

9n e&emplul urmtor se utilizeaz manipulatorii pentru a realiza citirea datelor utiliz1nd un format variabil 2&idt"(i 1)3:
Einclude <conio.#> Einclude <io!tream.#> Ginclude <io$anip,(; cla!! N { c#ar c;,<; 2u)lic: N ( i!tream$ 9it (i!tream$ o!tream$ ?i2 (o!tream$ /; i!tream$ o2erator >> (i!tream$ !, o!tream$ o2erator << (o!tream$ !, void main (void) {

..

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

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

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

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

?@.AA.AB

AB?

!$

P#

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


Uac o opera)ie de intrare7ie(ire nu sEa 6nc:eiat cu succes 2nu sEa desf(urat corect situa)ie 6n care vom spune c streamul a0un"e 6ntrEo stare de eroare3 pro"ramul poate lua o decizie 2control1nd 6n acest fel desf(urarea transferurilor de date 6n scopul corectitudinii desf(urrii lor3. 'ipul erorii 2un codul de retur3 poate fi aflat verific1nd bi)ii datei membru state 2de tip int3 prin tipul enumerare io"state definit 6n clasa ios astfel:
cla!! ios { enum { 2u)lic: = = = = = -=--, -=-1, -=-2, -=-+, -='-, .. .. .. .. .. opera)ie corect sf1r(it de fi(ier eroare intrare7ie(ire opera)ie invalid eroare fatal \ \

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

/;

A3 C3 B3 D3 -3

'alorile 2bi)ilor3 atributului state se pot determina utiliz1nd urmtoarele func)ii: int good 23> 77 bi)ii de eroare 2eofbit, failbit, badbit, 'ardfail3 nu sunt seta)i int eof 23> 77 este setat bitul eofbit int fail 23> 77 este setat bitul failbit sau badbit sau 'ardfail int bad 23> 77 este setat bitul badbit sau 'ardfail int rdstate 23> 77 returneaz toate valorile bi)ilor de stare 2valoarea datei state3.

'alorile bi)ilor datei state pot fi modificate cu func)ia: void clear 2int J ?3> /a un apel fr paramteru actual se vor anula bi)ii eofbit, failbit (i badbit iar pentru a preciza un anumit bit se poate folosi ca parametri actual o e&presie de forma: cin.clear 2ios::nume_bit3> 77 nume_bit restul anula)i E&emplu: cin.clear 2ios::bad_bit ^ cin.rdstate23 3> 77 bad_bit restul nesc:imba)i !itirea 2inclusiv a caracterelor albe3 se poate realiza cu func)ia membru getline definit astfel: istreamV getline 24un5si"ned c:ar8 * int n c:ar c J GMnG3> care cite(te cel mult nEA caractere sau 6nt1lne(te caracterul c. 9n e&emplul urmtor se citesc mai multe cuvinte separate prin spa)ii:
\

cla!! N { c#ar

c;'-<;

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

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

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

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

?@.AA.AB

ABA

!$

P#
9n e&emplul urmtor se repet citirea p1n c1nd numrul tastat este corect:

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

..

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


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

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

0etc#e();

'erificarea strii de eroare a unui stream se mai poate face prin operatorul 5 sau prin conversia 6ntrEun pointer fr tip 2void83 :
a3 operatorul 5 este supra6ncrcat cu metoda clasei ios:

int operator 5 2 3>

77 returneaz o valoare e"al cu a func)iei fail23>

Ue e&emplu 6n pro"ramul >ropo*iie)8pp prezentat anterior instruc)iunea if 2cin."ood233 cout << RJR << n << endl> se poate 6nlocui cu if 2L5cin3 cout << RJR << n << endl> sau mai simplu cu if 2cin3 cout << RJR << n << endl>
b3 conversia spre tipul void8 permite verificarea strii de eroare a streamEului (i poate fi

utilizat 6n construc)ii de forma if 2 s == dat3 j > rezultatul 2o referin) la obiectul stream clasei istream3 fiind '&"" 2?3 dac func)ia fail2 3 ?. !itirea caracterelor sau a datelor se poate realiza (i cu func)ia membru get definit astfel: a3 int get 2 3> 77 e+trage un caracter din streamEul curent 77 nu e+trage caracterul c.

b3 istreamV get 24un5si"ned c:ar8 * int n c:ar c J GMnG3>

?@.AA.AB

ABC

!$

P#

9n e&emplul urmtor se poate vedea at1t utilizarea conversiei spre tipul void8 precum (i a func)iei membru get 2 6n varianta b33:
.. 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 :
6 *78 = *78 6 a #rr, 6 9FA = 9FA 6 !y #rr, 6 Z[

?@.AA.AB

ABB

!$

P#

Cuprins
pag) 1. Redactarea programelor C.....................................................................2
A.A. eeneralit)i.................................................................................................C A.C. Structura unui pro"ram...............................................................................C A.B. Func)ii........................................................................................................B A.D. Elementele limba0ului................................................................................D

2. 2ariabile...................................................................................................>
C.A. 'ariabile "lobale........................................................................................C.C. 'ariabile locale..........................................................................................C.B. 'ariabile de tip re"istru..............................................................................P C.D. Ini)ializarea variabilelor.............................................................................Q

3. #.presii.....................................................................................................F
B.A. #peratori....................................................................................................@

". Operaii de intrare8ie0ire.......................................................................12


D.A. Func)ia Printf .........................................................................................AC D.C. Func)ia Scanf .........................................................................................AB D.B. Func)ia Put!:ar .....................................................................................AD D.D. Func)ia eet!:ar .....................................................................................AD D.-. Func)ia eet!:e ......................................................................................AD D.P. Func)ia eet!: .........................................................................................AD

>. Instruciuni.............................................................................................1>
-.A. Instruc)iunea 'id ..................................................................................A-.C. Instruc)iunea E&presie ............................................................................A-.B. Instruc)iunea !ompus ...........................................................................A-.D. Instruc)iunea If .......................................................................................AP -.-. Instruc)iunea S+itc: ...............................................................................AP -.P. Instruc)iunea *:ile ................................................................................AQ -.Q. Instruc)iunea UoO*:ile .........................................................................AQ -.@. Instruc)iunea For.....................................................................................A@ -.,. Instruc)iunea %rea` .................................................................................A@ -.A?. Instruc)iunea !ontinue ..........................................................................A@

?@.AA.AB

ABD

!$

P#

-.AA. Instruc)iunea eoNo ................................................................................A@ -.AC. Apelul unei func)ii ................................................................................A,

?. 3ointeri...................................................................................................21
P.A. Ueclararea unui Pointer ...........................................................................CA P.C. #pera)ii cu Pointeri .................................................................................CA P.B. Alocare dinamic a memoriei ..................................................................CB P.D. Pointeri la func)ii....................................................................................CB P.-. Utilizarea parametrilor din linia de comand...........................................CP.P. Ueclararea constantelor ..........................................................................CP.Q. Stiva ........................................................................................................C-

E. Recursi%iate ...........................................................................................2? F. 'ipuri de date.........................................................................................2E


@.A. Uefinirea unui tip de dat 2tTpedef3.......................................................CQ @.C. Nipul enumerare 2enum3...........................................................................CQ @.B. Uefinirea unei structuri 2struct3...............................................................C@ @.D. cedefinirea unei date 2union3...................................................................C, @.-. !1mpuri de biti........................................................................................C,

G. Structuri de date dinamice....................................................................3,.A. /ist simplu 6nln)uit ordonat...............................................................B? ,.C. Abori binari..............................................................................................BA

1-. Ktili6area fi0ierelor..............................................................................33


A?.A. bivelul inferior.......................................................................................BB A?.C. bivelul superior......................................................................................BP

11. uncii standard..................................................................................."1


AA.A. Macrouri de clasificare...........................................................................DA AA.C. Macrouri de transformare a simbolurilor................................................DA AA.B. !onversii................................................................................................DA AA.D. Func)ii de prelucrare a (irurilor de caractere..........................................DC AA.-. Func)ii de calcul.....................................................................................DC AA.P. Func)ii pentru controlul proceselor........................................................DC AA.Q. Func)ii pentru timp.................................................................................DB AA.@. Func)ii diverse .......................................................................................DB

?@.AA.AB

AB-

!$

P#

12. #cranul Hn mod te.t............................................................................."" 13. #cranul Hn mod grafic.........................................................................."" 1". aciliti CII......................................................................................."F
AD.A. E&tensii ale limba0ului !........................................................................D@ AD.C. #peratori...............................................................................................D, AD.B. Structur uniune (i enumerare...............................................................-C

1>. uncii CII...........................................................................................>"


A-.A. Func)ii Inline..........................................................................................-D A-.C. Func)ii de tip referin)............................................................................-A-.B. Supra6ncrcarea func)iilor......................................................................-Q A-.D. Ini)ializarea parametrilor formali............................................................-@ A-.-. Func)ii membru pentru Structuri............................................................-,

1?. 'ip !bstract de 1at...........................................................................?1E. 3rogramare orientat obiect 9OO3:.................................................?"


AQ.A. Uefinirea !laselor .................................................................................PAQ.C. !onstructori (i Uestructori .................................................................P,

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
C?.A. Atribute 2Uate membru3 Statice 77 k:......................................................QQ C?.C. Metode 2Func)ii membru3 Statice 77 k:....................................................Q,

21. 3ointeri la Vetode...............................................................................EG 22. SupraHncrcarea operatorilor ...........................................................F2


CC.A. #peratorul de asi"nare 2atribuire3 (i ini)ializare 2J3...............................@B CC.C. #peratorii de atribuire $J J 8J 7J................................................@CC.B. #peratorii de incrementare 2$$3 (i decrementare 23...........................@P

23. Con%ersii utili6ator..............................................................................FE


CB.A. !onversii implicite.................................................................................@Q CB.C. !onversii e&plicite.................................................................................,?

?@.AA.AB

ABP

!$

P#

2". Clase 7ablon 9'emplate:.....................................................................G2


CD.A. Func)ii dablon 2Nemplate3......................................................................,C CD.C. !lase Nemplate ......................................................................................,B CD.B. Implementarea elementelor Nemplate ....................................................,D

2>. Relaii Hntre clase.................................................................................G>


C-.A. cela)ia de Asocia)ie ...............................................................................,C-.C. cela)ia de A"re"are................................................................................,, C-.B. !lase 9ncuibate2imbricate3....................................................................A?C C-.D. cela)ia de derivare................................................................................A?D

2?. 3olimorfism........................................................................................11>
CP.A. Func)ii membru 'irtuale......................................................................AAP CP.C. !lase abstracte E func)ii membru virtuale pure.....................................AA,

2E. Ierar&ii pentru Intrri8Ie0iri............................................................123


CQ.A. #peratorul de inserare <<...................................................................ACB CQ.C. #peratorul de e&tra"ere ==...............................................................ACCQ.B. Intrri7Ie(iri cu format..........................................................................ACQ CQ.D. Nratarea erorilor la opera)iile de intrare7ie(ire......................................ABA

133 Cuprins....................................................................................................13" Wibliografie..............................................................................................13F

?@.AA.AB

ABQ

!$

P#

Wibliografie

A. 1an Roman %ngineria programrii obiectuale Editura Albastr !lu0Obapoca A,,P> C. 1orin = Ioan Vircea 3opo%ici< Iustin 'anase #e'nologia orientat pe obiecte) Aplicaii Editura Neora %ucure(ti A,,P> B. #llis HoroUit6< Sarta$ Sa&ni< 1ines& Vet&a Fundamentals of data structures in 8D
D

!omputer Science Press be+ Yor` A,,->

D. ,i%iu )egrescu $imba9ele 8 i 8DD pentru Fnceptori, Editura Albastr !lu0Obapoca A,,Q> -. '&omas !. Standis& Data 0tructures, Algorit'ms M 0oft(are >rinciples in 8 AddisonE*eslaT !alifornia A,,-> P. 2asile Cioban< (solt 1ar%aS &etode evoluate de programare U%%EMateOInfo A,,,>

?@.AA.AB

AB@

S-ar putea să vă placă și