Sunteți pe pagina 1din 137

c c

++
C
POO

c cc c

 cc

2004
+ O
C+ PO

— c ©     

——c   
Mediul Borland C a fost extins la Visual C şi C++ Builder, adaptate programării
orientate obiect şi interfeţei grafice Windows 95. Limbajul C a fost extins la C++ permiţând
aplicarea conceptelor programării prin abstractizarea datelor şi programării orientate spre
obiecte.
Fişierele sursă pot avea extensia C, CP, sau CPP.

—  c º   
Un program C este conţine o funcţie principală (  ) şi eventual alte funcţii
secundare, apelate de către funcţia principală, situate la acelaşi nivel (fară imbricare).
Structura unui program este următoarea:
c   ccc
c   ccc  c
  cc   sau doar [ cc  (   ) ]
  c   c ·
[  c   (   ) ]
Se observă că descrierea funcţiilor se poate face fie în întregime înaintea funcţiei
V fie doar prototipul înainte,iar corpul după aceasta.
   se scriu între caracterele /* şi */ ( ... /*  c */ ... ), sau la
nivelul unui rând după caracterele // ( ... //  cc).
Înainte de compilare, un program este    , de către un preprocesor, care
permite includerea unor fişier sursă, definirea şi apelul unror macrouri, precum şi o
compilare condiţionată.
    unui fişier sursă (*.h sau *.c) se realizează prin directiva    astfel:
#    ³   ´ // pentru fişiere utilizator
sau
#    Ë   â // pentru fişiere standard

Exemplu:
#include Ëstdio.hâ // ºanard nput utput eader
#include Ëiostream.hâ // onsole  put, onsole put

23.02.12 1
+ O
C+ PO

      se definesc cu ajutorul directivei   astfel:


#define  ccc! 
Exemplu:
#define Pi 3.141592 // Înlocuieşte Pi cu 3.141592
O constantă simbolică poate fi redefinită sau anulată (#undef  ).

—  c  
O funcţie este formată dintr-un antet şi un bloc (corp). Ea poate fi apelată dacă a
fost definită în întregime sau doar antetul său.
[   unei funcţii are următorul format:
> cc c("   )
unde:
Uc > ceste tipul valorilor funcţiei (codomeniul)
Uc  ceste un identificator (literă urmată eventual de alte litere sau cifre)
Uc "   conţine parametrii formali separaţi prin µ,¶.

Exemplu: int Min (int a, int b)


{ if (aËb) return a else return b }

Observaţie. Prototipul unei funcţii este antetul acesteia urmat de µ ¶ .


 unei funcţii are următoarea structură:
{
cccc   c
cccccccc #   c
}

Exemple: int (int a, int b) // Cmmdc(a,b)


{
if (b= =0) return a
else return Cmmdc(b,a % b) // Cmmdc(b,a Jccb)
}

int  (int a, int b) // cmmdc(a,b)


{ int rest
do { rest=a%b
a=b
b=rest }
while (rest!=0) // rest ± 0
return a
}

23.02.12 2
+ O
C+ PO

—c ù     


[   limbajului C este format din litere mari şi mici, cifre şi caractere speciale
(\n=CrLf, \t=Tab).
  sunt formaţi din literă_ urmată eventual de litere_ sau cifre
(caracterul µ_¶ poate fi utilizat pe post de literă).
Există     care pot fi utilizate doar în contextul definit (de exemplu c
 c c c c$c c  c% $c  c  c ).
>     sunt următoarele:
Uc c(;R [-215,215-1]),
Uc $c(;R [-215,215-1]),
Uc c(;R [-231,231-1]),
Uc  c(R [0,216-1]),
Uc  c(€ R [-3.4 10-38, 3.4 1038]),
Uc   c(€ R [-1.7 10-308, 1.7 10308]),
Uc $c(cod ASCII)i

       pot fi u  c (123, 123Gong, 111 ong),  c(@77), $&c
(@ abba, @fac), sau  c(2.71828, 6.023 23, 6.023ù23).
    de tip   pot fi    ('A', '0', '"') sau    
('\b'='(, '\r'=) , '\n'=% , '\''=, '\\'='( $, '\v'=  ,
'\f'=* cc , '\0'= .
   de tip    se scriu între ghilimele ("Mesaj").

      se face astfel:


> ccc"       c
Exemplu:
int i, j float x,y char c

      se realizează astfel:


> ccc >  c[1] [ 2] ... [ ] ... [] // indicele ( : 0p ( Ë
Exemple:
float x[100] x[0]=1 ... x[99]=100 // x este pointer la primul element
int a[2,2] a[0][0]=1 a[0][1]=2 // cconţine adresa tabloului
a[1][0]=3 a[1][1]=4

23.02.12 3
+ O
C+ PO

 c › 
Variabilele pot fi statice sau dinamice, locale sau globale.

 — c ›   
-eclararea unei variabile globale se face la începutul unui fişier sursă (în afara
tuturor funcţiilor) şi poate fi referită până la sfârşitul programului (în orice funcţie).
Utilizarea lor în alte fişiere sursă se poate face doar dacă acestea sunt declarate ca variabile
externe:
      
Exemplu:
›ù   :
#include Ëstdio.hâ
#include " "
float =3.14 // variabilă globală
void main (void)
{ float r
printf(" -ati raza cercului : ") scanf("%f",&r)
printf(" Lungimea cercului = %f \n",LungC(r))
scanf ("\n")
}

  : 
float LungC (float r)
{
  float  // variabilă externă
return 2**r
}

  c ›   
O variabilă locală este utilizabilă (vizibilă) doar în modulul sau în funcţia în care a
fost definită, putând fi alocată dinamic (   , alocată pe stivă) sau static
(  , alocată în zona de memorie a programului). Implicit o variabilă locală
este automatică, iar dacă dorim ca aceasta să fie statică, declaraţia ei trebuie să fie precedată
de cuvântul cheie :
     
Funcţiile au implicit atributul extern, 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
cuvântului cheie înaintea antetului acesteia (    ) w .

23.02.12 4
+ O
C+ PO

Exemplu:
›G :
#include Ëstdio.hâ
#include "Sursa.h"
void main (void)
{ int n
printf(" -ati un numar Ë 256 : ") scanf("%d",&n)
printf(" Valoarea in Hexa este ")
Print_Hexa(n)
// Print_Byte(n/256) Print_Byte(n%256) w
scanf ("\n")
}

 º : 
int Cifra_Hexa (int s)
{
int c
if (sË10) c=s+'0'
else c=s+'A'-10 // c=s+'0'+7
return c
}
void Print_Byte(int b)
{
int H = b / 16
int h = b % 16
printf("%c%c",Cifra_Hexa(H),Cifra_Hexa(h))
}
void Print_Hexa(int z)
{
int HH = z / 256 Print_Byte(HH)
int hh = z % 256 Print_Byte(hh)
}

  c ›   


Există posibilitatea ca într-un registru liber să fie alocată o variabilă care este
utilizată frecvent, penntru a mări viteza de execuţie. În registrii se pot memora parametri
funcţiilor sau variabile automatice de tip , $csau  . Pentru ca o variabilă să fie
memorată într-un registru, declaraţia ei trebuie să fie precedată de cuvântul cheie   :
       
Exemplu:
float f (   int i )
{   int n   char c ... }

23.02.12 5
+ O
C+ PO

  c     

›   se iniţializează printr-o declaraţie de forma:


 > ccc#    cc+cc,& c

Exemple:

float f ( int n )
{ int i=1
int m=n/2
...
}

>  se iniţializează printr-o declaraţie de forma:


 > ccc#  c[] +cc{,& 1, ,& 2,...,c,& }
unde p, iar dacă ceste omis, atunci =.
Exemple:

int X [13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}


int Y [ ] = {1,2,3,4,5,6,7}
int A[3][ ] = { {1,2,3},{4,5},{6} } // {{1,2,3},{4,5,?},{6,?,?}}


    se iniţializează astfel:
 2 # c[] +cc-! _"
iar cpoate fi este omis.
Exemple:

char Mesaj [100] = "Zarurile vor fi aruncate ..."


char Alt_Mesaj [] = {"Zarurile au fost aruncate !"}

23.02.12 6
+ O
C+ PO

 c ù  
O   este formată din   ,  şi    pentru prioritate, şi
are o   şi un . [  operatorilor se face de la stânga la dreapta, cu excepţia
operatorilor unari şi de atribuire, care se asociază de la dreapta la stânga.
  pot fi: constante, constante simbolice, variabile simple sau structurate
(tablouri, structuri, sau elemente ale acestora), funcţii sau apeluri de funcţii.

 — c  

 , în ordinea descrescătoare a priorităţii sunt următorii:

Úc ( ) [ ]
Úc U ( ) + ( ) * ( ) & ( ) ! ~ ++ U U ( )  u c
Úc * / %
Úc + U
Úc ËË ââ
Úc Ë Ë= â= â
Úc == !=
Úc &
Úc ^
Úc |
Úc &&
Úc ||
Úc ?: ()
Úc = *= /= %= += U= ËË= ââ= &= ^= |=
Úc ,

  sunt următorii:

+ , U , * , / , % (), pentru adunare, scădere, înmulţire, cât (împărţire), rest.


Exemple:
int i, j
int cat = i / j // 13 / 5 = 2
int rest = i % j // 13%5 = 3

23.02.12 7
+ O
C+ PO

    sunt următorii:

Ë , Ë= , â , â= , == , != , pentru Ë , p , â , , = , ± , rezultatul (valoarea


expresiei relaţionale) fiind —pentru , iar @pentru  .
Exemple:
int i=1 int j=2
... iË=j ... // == 1
... i==j ... // == 0

   sunt:
! () , && () , | | (.).
Exemplu:
/c= !&&&0c|| &&&!0c 11cc&c/c0c+cc&cc0c.c&ccc0

-eoarece nu există tipul  , valoarea   este reprezentată prin @, iarc
prin orice valoare diferită de @.

  se pot realizautilizând următorii operatori:


~ (  faţă decFFFF, schimbă fiecare bit), ËË ( cla stânga),
ââ ( cla dreapta), & (cbit cu bit), ^ (/cbit cu bit), | (.cbit cu bit).

Exemplu:
// ASCII
#include Ëstdio.hâ
#include Ëconio.hâ
int Cifra(int c) // cifra hexa: 01...9AB...F
{
if (cË10) return c | '0'
else return (c-9) | '@'
}
int c
void main (void)
{ textbackground(BLUE) textcolor(WHITE) clrscr()
do { printf(" -ati un caracter #Esc : ") c=getch()
printf(" ... Hexa = %c%c \n",Cifra(cââ4),Cifra(c&0xF)) }
while (c!=0x1B)
}

23.02.12 8
+ O
C+ PO

   se realizează astfel:


c= ,&  // & cc   cu tipul 
Există posibilitatea realizării de atribuiri multiple prin expresii de forma:
c= iiicc= 2c= 1c= ,& 
Mai există o facilitate utilizând o operaţie de atribuire de forma:
c c = ,&  // unde !{+, U, *, /,%, &, ^, | , ËË, ââ}
având semnificaţia:
c= c ,& 
Exemple:
v = e = 2.7181828 // v = (e = 2.7181828)
x += dx y U = dy // x = x+dx y = y U dy
n ËË= k // n = n*2k

         sunt µ++¶ respectiv µUU¶ prin care se


măreşte, respectiv se micşorează, valoarea  ccu unu.
Aceştia pot fi utilizaţi:
Úc în forma prefixată:
++ c respectiv UU c // valoarea expresiei, după aplicarea lor
Úc în forma postfixată:
c++ respectiv cUU // valoarea expresiei, înainte de aplicare

Exemple:
a = ++b // b=b+1 a=b
a = bcUU // a=b b=bU1

           !expresie ÿ realizează conversia unui


operand într-un  ccprecizat astfel:
(> ) c
Exemplu:
int a=12 int b=5
float c=a/b printf(" a -iv b = %5.2f \n", c) // a -iv b = 2.00
c=(float)a/b printf(" a / b = %5.2f \n", c) // a / b = 2.40

23.02.12 9
+ O
C+ PO

      !realizate automatÿse fac astfel:


a)c $u ,
b)c  u  ,
c)c (  ,*)u(  ,  )=  ,
d)c ( , *)u( , )= ,
e)c (  ,*)u(  ,  )=  .

        !àÿ determină lungimea în octeţi a unei


variabile simple sau structurate, precum şi a unui tip de dată:
à ()c
Exemplu:
int a
printf(" SizeOf int = %d \n", sizeof(a)) // * u.c ccc= 2
printf(" SizeOf short = %d \n", sizeof(short)) // * u.c$c=2

    w"sunt utilizaţi în construcţii de forma:

,& 1 wc,& 2 "c,& 3

Valoarea expresiei rezultat este ,& 2 dacă ,& 1 este nenulă, altfel este ,& 3 .
Exemplu:
Max = aâb w a " b // -acă aâb Atunci Max=a Altfel Max=b

    permite gruparea mai multor expresii într-una singură, aceasta
având valoarea ultimei expresii:

,& 1 ½c,& 2 ½c...½,& c


Exemplu:
float x0,y0,r, x, y
printf(" -ati C(x0,y0,r) = ") scanf("%f %f %f",&x0,&y0,&r) // Cercul C
printf(" -ati P(x,y) = ") scanf("%f %f", &x, &y ) // Punctul P
printf(" %s",((x-=x0½y-=y0½x*=x½y*=y½x+y)==r*r) w "P e pe C" " "P nu e pe C")

23.02.12 10
+ O
C+ PO

c       

În limbajul C nu există instrucţiuni de intrare/ieşire, aceste operaţii ralizându-se prin


funcţii aflate în bibliotecile standard. Implicit, unui program i se ataşează fişierele à 
(intrare standard), à   (ieşire standard), à  (ieşire standard pentru erori), à  (ieşire
pentru imprimantă), à  (intrare/ieşire serială).

 — c  Ê 
Această funcţie realizează afişarea după un şablon, având următorul format:

int  (  c[, " ,& ])


unde  c este şablonul (formatul) scris sub forma unui şir de caractere care conţine
c şi    c c  corespunzători valorile expresiilor din listă. Un
specificator de format se descrie astfel:

% [±] [[.] ] [l] [ c]


unde:
Úc [±] - determină alinierea la stânga, implicită fiind la dreapta,
Úc [] - precizează lungimea câmpului,
Úc [ ] - precizează lungimea părţii zecimale, respectiv numărul de caractere,
Úc [ l ] - conversia se va efectua din format intern ,
Úc [ c] - determină tipul conversiei precizat prin unul din următoarele caractere:
Uc  - cu zecimal extern,
Uc  - cu octal extern,
Uc & - cu hexa extern (0...9,a...f),
Uc / - cu Hexa extern (0...9,A...F),
Uc -  cu zecimal extern (fără semn),
Uc  -  c cu caracter ($),
Uc  -  c(şir de coduri ASCII terminat cu \0=NUL) u şir de caractere,
Uc  -  csau   cu zecimal extern [[.] ], implicit =6,
Uc  -  csau   cu zecimal extern forma exponenţială (*10),
Uc , -  csau   cu zecimal extern forma exponenţială (*10,),
Uc  - se alege dintre variantele csau  reprezentarea minimă,
Uc  - se alege dintre variantele csau , reprezentarea minimă.

Funcţia   returnează numărul de octeţi afişaţi dacă operaţia a decurs corect, iar
în caz contrar -1 (EOF):
if (EOF = =  (  c, " ,& )) ... c...

23.02.12 11
+ O
C+ PO

Exemplu:
short Zi=1 char Luna[]="Ianuarie" unsigned An=2003
float Ina=1.8
printf(" Zi:%d, Luna:%3.3s., An:%u \n",Zi,Luna,An) // Zi:1, Luna:Ian., An:2003
printf(" Inaltime(m):%4.2f \n",Ina) // Inaltime(m):1.80

  c  º2 
Această funcţie realizează citirea datelor după un şablon, având următorul format:
int à2 (  c, "   c)
unde  c este şablonul (formatul) scris sub forma unui şir de caractere care conţine
eventual &c 2obligatorii la intrare3c şi    c c  corespunzători tipurilor
variabilelor din listă. Specificatorii de format sunt asemănători celor prezentaţi la funcţia
 , realizând însă conversiile inverse: % [*] [] [l] [ c] , unde:
Úc [*] - un caracter opţional,
Úc [] - precizează lungimea maximă a câmpului,
Úc [ l] - conversia se va efectua din format intern ,
Úc [ c] - determină tipul conversiei precizat prin unul din următoarele caractere:
Uc  - c„ zecimal extern,
Uc  - c„ octal extern,
Uc & - c„ hexa extern (0...9,a...f),
Uc / - c„ Hexa extern (0...9,A...F),
Uc -  c„ zecimal extern (fără semn),
Uc  -  c c„ caracter ($),
Uc  -  c „ şir de caractere terminat la spaţiu sau dimensiunea m,
Uc  -  c„ flotant extern.
Adresele variabilelor de intrare sunt date prin operatorul de adrese ë plasat înaintea
identificatorului fiecărei variabile (simple!): [&]c   (nu este necesar pentru tablouri)i
Exemplu:
short Zi char Luna[13] unsigned An float Ina
scanf(" %d %s %u %f ", &Zi, Luna, &An, &Ina) // 1 Ianuarie 2003 1.80

Funcţia à2  returnează numărul de câmpuri citite corect. Sfârşitul de fişier


(Ctrl/Z) poate fi verificat prin valoarea returnată EOF:
if (EOF = = à2 (  c, " ,& )) ... *4 c...
Exemplu:
if (EOF==scanf(" %d %s %u %f", &Zi, Luna, &An, &Ina)) printf("Ctrl/Z")
else { printf(" Zi:%d, Luna:%3.3s., An:%u \n",Zi,Luna,An) printf(" Inaltime(m):%4.2f \n",Ina) }

23.02.12 12
+ O
C+ PO

  c  Ê  
Această funcţie realizează tipărirea unui caracter al cărui cod ASCII este precizat
printr-o expresie:
 2 (,& )

  c    
Aceasta, returnează codul ASCII al caracterului citit (pentru Ctrl/Z u EOF=-1):
î 2 ( )
Exemplu:
char c
do putchar (((c=getchar())â'Z')? c^' ' : c) // Litere mici u LITERE MARI
while (c!='.') // se termină cu .

·
Litere mici in Litere MARI ! u getchar
LITERE MICI IN LITERE MARI ! putchar „
Se termina la . (Punct) u getchar
SE TERMINA LA . putchar „

  c     
Funcţia returnează codul caracterului citit  cşi îl afişează (în  ):
int î 2 ( )
Exemplu:

do putchar (((c=getche())â'Z')? c^' ' : c) while (c!='.') // se termină cu .

·
LLiIt TeErReE mMiIcCiI iInN LLiIt TeErReE MMAARRII..

  c    
Această funcţie returnează codul caracterului citit ( ) fără ca acesta să mai fie
afişat:
int î 2 ( )
Exemplu:

do putchar (((c=getch())â'Z')? c^' ' : c) while (c!='.') // se termină cu .

·
LITERE MICI IN LITERE MARI. // S-a tastat: Litere mici in Litere MARI.

23.02.12 13
+ O
C+ PO

c   

În limbajul C instrucţiunile se termină cu ‰ mai puţin cele care se termină cu .

 — c   ›
Această instrucţiune se utilizează în situaţia în care este nescerară prezenţa unei
instrucţiuni şi care nu trebuie să execute nimic:

 ‰

  c   ù à


Instrucţiunea are formatul general:

c ,& c‰
Exemple:
y = (x+1)*(x-1) // Atribuire: =,& 
f(x,y) // Apel de funcţie: 21, 2,iii c3
c++ --c // Incrementări/-ecrementări ( / cfixate)

  c   V à


Aceasta este formată dintr-o succesiune de declaraţii (proprii) şi instrucţiuni, incluse
între acolade:
±
   cc
c #   

Exemplu:
{
int i // Variabilă  ccinstrucţiunii

f (i) //  se poate utiliza doar în această instrucţiune compusă


}£ // -upă nu se pune

23.02.12 14
+ O
C+ PO

  c   A
Structura alternativă cu una sau două ramuri poate fi scrisă astfel:
c 2& 3c   1 c
 #  àc   2  $
Exemplu:
{ P(&,0) u I-ul Cadran (-acă &csau 0ceste negativ se schimbă semnul)
float x, y
printf(" -ati P(x,y) = ") scanf("%f %f", &x,&y) // Punctul P
if (xâ0) if (yË0) y=-y // C4   (   c )
else { x=-x // C2 sau C3 (&)
if (yË0) y=-y // C3 (0)
}
printf(" x=%5.2f, y=%5.2f \n", x,y)
} // trebuie pus pentru C1   c ă:  

  c   º  2 
Pentru structura alternativă cu mai multe ramuri c 2* 3c se utilizează
instrucţiunea *% $:
à  2  (& )
{ 2 à1 : c   c1 #Ô $
2 à2 : c   c2 #Ô $
 iii
2 àc: c   c#Ô $
# : c   cc+1 $
}

Instrucţiunea Ô realizează saltul la sfârşitul instrucţiunii à  2 , iar în absenţa ei


se vor executa şi următoarele secvenţe de instrucţiuni.
Exemplu:
while (scanf("%d %c %d",&o1,&o,&o2)!=EOF) { // O1 o O2
switch (o & 0XFF) {
case '+' : v=o1+o2 break
case '-' : v=o1-o2 break
case '*' : v=o1*o2 break
case '/' : v=o1/o2 break
default : printf (" Op. necunoscut!%c\n",o) }
printf ("%d%c%d = %d\n",o1,o,o2,v) } // Ctrl/Z

23.02.12 15
+ O
C+ PO

Exemplu:
// Nr.Zile / lună \\
#include Ëiostream.hâ
#include Ëconio.hâ
£ £ 
   
      
    
       
    
  !  
  "#$%& '( 
)
*
&
  #+ '( 
   #  ,,'( 
-   
-
 . ! 
-

  c   ë  


Structura repetitivă cpoate fi scrisă astfel:
 c 2& 3c    c
Exemplu:
// c,& cë  
#include Ëstdio.hâ
int i,n long f // f:=n!
void main (void)
{ printf("\n -ati n : ") scanf ("%d", &n)
i=(f=1)+1 while (iË=n) f*=i++ printf(" %d! = %u \n",n,f)
i=(f=1) while (iË n) f*=++i printf(" %d! = %u \n",n,f)
scanf("\n")
}

  c   - ë  


Structura repetitivă cpoate fi scrisă astfel:
     c 2& 3 c
Exemplu:
do { r=a%b a=b b=r } while (c) // c!=0
cmmdc=a

23.02.12 16
+ O
C+ PO

 c   Œ
Structura repetitivă  c( ) poate fi descrisă astfel:
 (& 1 & 2 & 3)    c
Instrucţiunea are acelaşi efect ca şi:
& 1  (& 2) {c    & 3 }c
Şi invers (vezi  ):
( &  )    c
Exemplu:
int i,n long f // f:=n!
printf("\n -ati n : ") scanf ("%d", &n)
f=1 for ( i=1 iË=n i++) f*=i printf(" %d! = %u \n",n,f)
f=1 for ( i=1 iË=n ++i) f*=i printf(" %d! = %u \n",n,f)
f=i=1 for ( iË=n i+=1) f*=i printf(" %d! = %u \n",n,f)
for (f=i=1 iË=n ) f*=i++ printf(" %d! = %u \n",n,f)

 c   a 
Această instrucţiune se foloseşte pentru a termina o structură repetitivă:
Ô c
Exemplu:
for ( ) { ...
if (&) Ô
... }

 —@ c     


Această instrucţiune realizează saltul la sfârşitul unei structuri repetitive (pentru
%$ csau _%$ cla reevaluarea expresiei, iar pentru cla & 3 ), având formatul:

2   c
Exemplu:
for (... ... &3) { ...
if (&) 2  
... }

 —— c   
Această instrucţiune realizează saltul necondiţionat şi fără revenire la instrucţiunea
ce poartă eticheta specificată, având formatul:
î  $c c

Exemplu:

while (&1) { ...

23.02.12 17
+ O
C+ PO

if (&2) î 
... }
...
: ... // instrucţiune

 — c [    
Instrucţiunea de apel a unei funcţii este un caz particular al instrucţiunii expresie:
   c2"    3 c

O funcţie poate fi apelată şi în cadrul unei expresii dintr-o instrucţiune:


iiic   c2"  c  3ciiic c

O funcţie poate fi utilizată doar dacă a fost definită sau cel puţin a fost declarat
   ei într-una din următoarele moduri:
a)c > c  cc c c  c("    )
b)c > c  cc c c  c("      )
c)c > c  ccc c  c( ) // nu sunt parametri formali
d)c > c  cc c c  c(cc) // nu se fac verificările de tip

[   implicit pentru variabile simple (de bază) este    , iar pentru
   cprin . [   se obţine prin intermediul variabilelor de tip
 şi a operatorului de adresă 
 dintr-o funcţie se poate realiza fie prin instrucţiunea  , fie automat
după ultima instrucţiune a funcţiei (situaţie în care nu se returnează nici o valoare):

 c#& $ c
fiind returnată valoarea expresiei (dacă există).
Ex. 1:
#include Ëgraphics.hâ #include Ëmath.hâ
int u1,v1, u2,v2 float a, b, c, d
int u (float x) { return ((x-a)/(b-a)*(u2-u1)+u1) }
int v (float y) { return ((y-d)/(c-d)*(v2-v1)+v1) }
void InitGraf(void) { int Gd = -ETECT, Gm initgraph(&Gd, &Gm, "c:\\Bc\\Bgi") }
void ViewPort(int x1,int y1,int x2,int y2) {u1=x1 v1=y1 u2=x2 v2=y2 /*rectangle(u1,v1,u2,v2) */ }
void Window(float x1,float y1,float x2,float y2) { a=x1 d=y1 b=x2 c=y2 }
void Rectangle(float x1,float y1,float x2,float y2) { rectangle(u(x1),v(y1),u(x2),v(y2)) }
void Bar(float x1,float y1,float x2,float y2) { bar(u(x1),v(y1),u(x2),v(y2)) }
void Linie(float x1,float y1,float x2,float y2) { line(u(x1),v(y1),u(x2),v(y2)) }
void Muta(float x,float y) { moveto(u(x),v(y)) }
void Trag(float x,float y) { lineto(u(x),v(y)) }
void Rot(float &x,float &y, float x0, float y0, float Alfa) { float xp
xp=(x-x0)*cos(Alfa)-(y-y0)*sin(Alfa)+x0
y =(x-x0)*sin(Alfa)+(y-y0)*cos(Alfa)+y0 x = xp }
Ex. 2:
// Ult ima cifră nenulă a lui n! \\
#include Ëiostream.hâ
#include Ëconio.hâ
 / "  (

23.02.12 18
+ O
C+ PO

 0+ 
 ! 12( ,( 0 -
 0 
-
      +  3 
    
       
/  4/ 5 3362+ -
  336"#  $6)#2+ 
. ! 
-

Ex. 3:
// Calc. A}B, ARB \\
#include Ëiostream.hâ
#include Ëconio.hâ
 7 89:

 89+: 
-
 80  ;  89:

   78 ;89:   + 
-
£  89:  <9:  79:

79+:+ 
      78    80 89: <
7979+::89:
- 
£  89:  <9:  79:
  
 + 7< 79:<9: 
  78 180 89: <7979+::89: 
-
£ =0!6>  89:
    > ? ? 
  78   89:  
  @'- 
-
£ £ 
   
 89: 5  # 5 A &- =08 8 
 <9: 5   # ) 5- =0< < 
 8<9+: 8 < 8< =08< 8< 
 8<9+: 8 < 8< =08< 8< 
 . ! 
-

23.02.12 19
+ O
C+ PO

 c   

O variabilă c de tip  conţine adresa unei variabile a cărei valoare se obţine
utilizând operatorul * (*c= valoarea variabilei de la adresa conţinută în ).
Adresa unei variabile cse poate obţine prin operatorul & (&c= adresa variabilei ),
deci putem atribui unui pointer  adresa unei variabile castfel:
c= &

 — c     Ê 

-efinirea unei variabile de referinţă (  de un > ) se face astfel:


> cc*_) c
-eci, tipul referinţă se obţine prin următoarea construcţie:
> cc*
-eclararea unui pointer (care conţine o adresă nefiind însă legat de un anumit tip) se
face astfel:
*_  c
Exemplu:
#include Ëstdio.hâ
#include Ëconio.hâ
#include "Crt.Cpp"
int Cifra(int c) { if (cË10) return c | '0' else return (c-9)|'@' }
void Cifre(int b) { printf("%c%c",Cifra(bââ4),Cifra(b&0xF)) }
void main (void)
{ int *Pointer_Int void *p unsigned *Pointer_Word int x
printf(" -ati x : ") scanf("%d",&x)
p=Pointer_Int=&x Pointer_Word=(unsigned *) p
printf(" x =%u \n",*Pointer_Word)
printf(" |x|=%d \n",sizeof *Pointer_Word)
printf(" |&x|=%d \n",sizeof Pointer_Word)
printf("*(&x)=")
Cifre(*Pointer_Wordââ8) Cifre(*Pointer_Word&0xFF)
printf("\n")
getch()
}
: -ati x : 43962 : -ati x : -1
)u : x =43962 )u : x = 65535
|x| =2 |x| =2
|&x|=2 |&x|=2
*(&x)=ABBA *(&x)=FFFF

  c  Ê 
Aceste operaţii sunt operaţii cu  cconţinute în variabilele de tip  .

23.02.12 20
+ O
C+ PO

—c        


Aceste operaţii măresc/miocşorează valoarea de adresă spre următorul element (cu o
valoare egală cu lungimea tipului referit):
_  c+ + ccccc_  c ± ±
Exemplu:
int Zile[]={31,28,31,30,31,30,31,31,30,31,30,31} int *Pointer_Int int Luna // 0,1,...,11
printf(" -ati luna (1-12):") scanf("%d",&Luna)
Pointer_Int=&Zile[Luna] Pointer_Int-- // &Zile[Luna-1]
printf(" Nr.Zile =%d \n",*Pointer_Int)

c [   º     %  


Aceste operaţii măresc/miocşorează valoarea de adresă spre alt element (cu o
valoare egală cu c·  ctipului referit).
_  c+ 
Exemplu:
int Zile[]={0,31,28,31,30,31,30,31,31,30,31,30,31} int *Pointer_Int int Luna
printf(" Luna (1-12) : ") scanf("%d",&Luna)
Pointer_Int=; &G  printf(" Nr.Zile=%d \n",*Pointer_Int)
Pointer_Int=Zile printf(" Nr.Zile=%d \n",*(  ' &G ))

c   
-oi pointeri ale elementului aceluiaşi tablou pot fi comparaţi utilizând operatorii
relaţionali. Valoarea GGmarchează faptul că un pointer nu referă nici un element.
... 1 Ë 2 ... ... 1 = = 2 ... ... 1 != 2 ... ...  = = GG...
Exemplu:
int Zile[]={0,31,29,31,30,31,30,31,31,30,31,30,31} int *luna int Zi,Luna,An, NrZile
printf(" Zi, Luna, An : ") scanf("%d %d %d",&Zi,&Luna,&An)
if (An&3) Zile[2]=28 if ((ZiâZile[Luna]) || (Lunaâ12)) luna=NULL else luna=Zile
if (   GG) { NrZile=Zi do NrZile+=*(luna++) while (  (; &G )
printf(" A %d zi a anului \n",NrZile) }
else printf(" -ata calendaristica incorecta! \n")

c   


-iferenţa a doi pointeri ai aceluiaşi tablou dă ca rezultat diferenţa indicilor.
Exemplu:
int Zile[]={0,31,29,31,30,31,30,31,31,30,31,30,31} int *luna int Zi,Luna,An, Ziua
printf(" An, A câta zi din an:") scanf("%d %d",&An,&Ziua) if (An&3) Zile[2]=28
for (luna=Zile+1 Ziuaâ*luna luna++) Ziua8=*luna
printf(" Zi:%d, Luna:%d, An:%d \n",Ziua,  8; ,An)

23.02.12 21
+ O
C+ PO

Exemplu:
// Operaţii cu   c\\
#include Ëiostream.hâ
#include Ëconio.hâ
£ =0 6;  
 60; 
 ! 04;  60    
-
£ £ 
   
 ;9:   ## )) 55 ** AA-  60 6B 
0; B";9A: 
 ! B40  60    
 ";9A: 0";9+: B" 
 ! B0  60    
0; 
 ! 04;A  60    
0;   ;,   
 ! 04;  60    
0; 
      604    
=0;   . ! 
-

  c [      


Pentru  c/  c    sunt utilizate următoarele două
funcţii definite în fişierele  .$cşi  .$:
Úc V 2, care returnează adresa zonei alocate de lungime dată c sau NULL dacă nu se
poate efectua alocarea:
 c5V 2(  c)
Úc , care eliberează o zonă alocată, precizată prin adresa (  ) ei :
 c5( c5)
Exemplu:
#include Ëstdio.hâ
#include Ë  .hâ
#include Ëconio.hâ #include "Crt.Cpp"
int Cifra(int c) { if (cË10) return c | '0' else return (c-9)|'@' }
void Cifre(int b) { printf("%c%c",Cifra(bââ4),Cifra(b&0xF)) }
void main (void)
{ unsigned *Pointer_Word
Pointer_Word=(unsigned *)  (sizeof (unsigned))
printf(" -ati x : ") scanf("%d",Pointer_Word)
printf(" x =%u \n",*Pointer_Word)
printf(" |x|=%d \n",sizeof *Pointer_Word)
printf(" |&x|=%d \n",sizeof Pointer_Word)
printf("*(&x)=") Cifre(*Pointer_Wordââ8) Cifre(*Pointer_Word&0xFF) printf("\n")
 (Pointer_Word) getch()
}

  c Ê   

23.02.12 22
+ O
C+ PO

Numele unei funcţii fiind un pointer la acea funcţie, ea poate fi parametru actual, şi
evident trebuie descrisă ca parametru formal:
c...c cc(5) ( ), iii
Exemplu:
//   c c  c(1) \\
#include Ëgraphics.hâ #include Ëstdlib.hâ #include Ëstdio.hâ
#include Ëconio.hâ #include Ëmath.hâ #include ".$" #define Pi 3.1415926
float º (float x) { return sin (x) } float (float x) { return cos (x) }
float º(float x) { return pow (x,2) } float º(float x) { return sqrt(x) }
void Grafic( ! ÿ! ÿ,float a,float b,int u1,int v1,int u2,int v2)
{ float x, p, c,d, y  % c(u1,v1,u2,v2) rectangle (u1,v1,u2,v2) p=(b-a)/(u2-u1)*5
x=a c=d=! ÿ! ÿ do { x+=p y=! ÿ! ÿ if (yËc) c=y else if (yâd) d=y } while (xËb)
ë %(a,d,b,c) x=a J>(x,! ÿ! ÿ) do { x+=p " >(x,! ÿ! ÿ) } while (xËb)
}
void main(void)
{ # $c()
Grafic (º , -Pi,Pi,10,10, (int) getmaxx()/2-5, (int) getmaxy()/2-5)
Grafic ( , -Pi,Pi,(int) getmaxx()/2+5,10,getmaxx()-10, (int) getmaxy()/2-5)
Grafic (º, -Pi,Pi,10,(int) getmaxy()/2+5, (int) getmaxx()/2-5, getmaxy()-10)
Grafic (º, 0,Pi,(int) getmaxx()/2+5,(int) getmaxy()/2+5,getmaxx()-10, getmaxy()-10)
getch() closegraph()
}

Următorul exemplu construieşte un tabel cu valorile a patru funcţii dintr-un interval


dat [,] pentru o diviziune precizată ():

//   c c  c(2) \\


o   !
o   !
o   !
o  !!
 ' C ' ;  ; -
×    × ×   
 × × ×  ×
!6D  ;/7 =.- 
 ED # 
£ £ 
  
 '  ; '   
    '  '   
  D   
  +   
;'4,6 
  F+ FED  F
0 2A ×   
   
-. ! 
-

23.02.12 23
+ O
C+ PO

  c Ñ            


Apelul unui program poate fi însoţit de o listă de parametri:
â   cc"   c

care se poate accesa scriind antetul funcţiei principale astfel:


 cc( c[î, $c*[î›[ ] )
unde:
Úc [î este o variabilă întreagă care conţine numărul de parametri plus unu (!),

Úc [î› este un tablou care conţine adresele parametrilor din listă:

c [î›[0] - pointer la   c(!),


c [î›[1] - pointer la primul parametru,
c ...
c [î›[[îÔ1] - pointer la ultimul parametru
Exemplu:
#include Ëstdio.hâ #include Ë .$â // Calendar 2003
void main (int ArgC, char *ArgV[])
{ char *Sapt[]={"Luni","Marti","Miercuri","Joi","Vineri","Sambata","-uminica"}
int Zile[]={31,28,31,30,31,30,31,31,30,31,30,31} int Zi,Luna,luna
if (ArgC==3) { Zi= (ArgV[1]) Luna= (ArgV[2])
for (luna=1 lunaËLuna luna++) Zi+=Zile[luna-1]
printf(" %s \n",Sapt[(Zi+1)%7])
}
else printf (" -ati in linia de comada ziua si luna (din 2003) ! \n")
} // â  —

  c    2  à   


O altă modalitate de a defini o constantă este    cà astfel:

c[ > c]cc2à  cc[ +cc c]c sau 2à [ > c]c cc[ +cc c]c
Unui parametru formal declarat cu    cà nu i se mai poate schimba
valoarea în subprogramul respectiv.
Exemplu:
#include Ëstdio.hâ #include Ëconio.hâ
int Cifra( int c)
{  char ;='0' int   678=0x40
if (cË10) return c | ; else return (c-9)| 678
}
void main (void)
{  ' =BLUE  ë$ =WHITE   7=0xF  ,=0x1B int c
textbackground(' ) textcolor(ë$ ) clrscr()
do { printf(" -ati un caracter #Esc : ") c=getch()
printf(" ... Hexa = %c%c \n",Cifra(cââ4),Cifra(c& 7)) }
while (c!=,)
}

  c º   

23.02.12 24
+ O
C+ PO

Prin à  înţelegem o listă cu disciplina cAcŒ c cpentru care vom defini
următoarele trei funcţii:
Úc Ê à  - adaugă un element în stivă,

Úc Ê - extrage un element din stivă,


Úc    - iniţializarea stivei (stivă vidă),

Úc ›  - verifică dacă stiva este vidă:

Œ 2 $$ º   $$


#include Ëstdio.hâ #define -imMax 13
#include Ëconio.hâ static int * [-imMax] static Next=0
#include "º  . " void Ê à (int x)
{
void main(void)
{ if (NextË-imMax) * [Next++]=x
int n unsigned long f else printf(" -epasire stiva \n")
}
printf(" -ati n : ") scanf("%d",&n) int Ê()
  () while (n) Ê à (n--) { if (Nextâ0) return * [--Next]
f=1 while (!› ()) f*=Ê() else { printf(" Stiva vida \n") return 0 }
printf(" n! = %15lu \n",f) }
getch() void   () { Next=0 }
} int › () { return (Next= =0) }

 c ©  
Există posibilitatea de a defini o funcţie prin ea însăşi (recursiv).
Exemplu:
#include Ëconio.hâ #include Ëiostream.hâ
#define J&c(x,y) (xây ? x : y)
int a[100]
int J V(int n)
{
if (n= =1) return a[1]
else return J&c(J V(n-1),a[n])
}
void main(void)
{ int i,n clrscr()
cout ËË " -ati n : " cin ââ n
cout ËË " -ati A : "
for (i=1 iË=n i++) cin ââ a[i]
cout ËË " Max.= " ËË J V(n)
getch()
}

23.02.12 25
+ O
C+ PO

c >  
Există posibilitatea de a defini noi tipuri de date şi chiar de a le denumi.

— c       ! ÿ


Asignarea unei    cunui  cde dată se realizează astfel:
 ccc  > c
Exemplu:
 cccA î  ccc 
A îi,j  X[10]

 c >  V ! Vÿ


-efinirea acestui tip se face astfel:
 V#  $cc±#0 #=,&0$,c#1#=,&1$,...,c##=,&$ #" $

Implicit ,&0=0, iar ,& +,& -191, iar dacă se declară o listă de variabile
având acest tip atunci denumirea tipului enumerare definit poate lipsi.
Exemplu:
#include Ëstdio.hâ // 2003 \\
#include Ëconio.hâ
 V{  , > c} Zi_Lucratoare
 V; *cc{ "  , J , J   , : ,   , *,    c}
 Vcc; *ccZi_Sapt //  cc; *ccZi_Sapt
void main (void)
{
int Zile[]={31,28,31,30,31,30,31,31,30,31,30,31}
int Zi,Luna,luna
printf(" Zi, Luna : ") scanf("%d %d",&Zi,&Luna)
for (luna=1 lunaËLuna luna++) Zi+=Zile[luna-1]
Zi_Sapt="  Zi=(Zi+1)%7 while (Zi--) Zi_Sapt++ //  ccZiSapt=Zi_Sapt+1
if (Zi_SaptË*) Zi_Lucratoare=> 
else Zi_Lucratoare= 
if (Zi_Lucratoare) printf(" Este o zi lucratoare \n")
else printf(" Este o zi libera \n")
getch()
}

23.02.12 26
+ O
C+ PO

 c     à  2 !à  2 ÿ


-efinirea unei à  2 (Î  ) se face astfel:
à  2 #  $cc±"    4  #" $

-acă se declară o listă de variabile având acest tip atunci denumirea structurii poate
lipsi.
Referirea componentelor unei à  2 se face astfel:
    
Exemplu:
#include Ëstdio.hâ
#include Ëconio.hâ
typedef float Real
à  2  cc{ Real x, y }
à  2  ccc{ Punct Centru
Real Raza }
Real Sqr(Real x)
{ return x*x }
void main (void)
{
cO = { 0, 0 } cC
printf(" \n Cerc : ") scanf("%f %f %f",&C.Centru.x,&C.Centru.y,&C.Raza)
printf(" \n C(x0,y0,r)= %5.2f %5.2f %5.2f",C.Centru.x,C.Centru.y,C.Raza)
if (Sqr(C.Centru.x-O.x)+Sqr(C.Centru.y-O.y)Ë=Sqr(C.Raza)) printf(" \n C contine O")
else printf(" \n C nu cont.O")
getch()
}

Referirea componentelor unei à  2  definită printr-o variabilă de tip referinţă


( ) se efectuează:
! )cÿ    c )cUâ 
Exemplu:
...
à  2  c{ float x, y float Raza }
void TipCerc( c )
{ printf(" \n C(x,y,r)= %5.2f %5.2f %5.2f",! ÿ ½! ÿ ½ Uâ ©ÿ }
void main (void)
{ cC={1,2,3} TipCerc(&C) }

23.02.12 27
+ O
C+ PO

 c    ! ÿ


)  cunei zone de memorie se poate face în cadrul unei  astfel:
#  $cc±"   #" $
Toate componentele aflate în "   ocumă aceeaşi zonă de memorie (se
suprapun), lungimea   cfiind dată de maximul lungimilor declaraţiilor .
Referirea componentelor unei  se face astfel:
    
sau pentru o variabilă de tip referinţă:
! )cÿ    c )cUâ 
Exemplu:
...
Ñc{ float Real
long unsigned Hexa } x
int Cifra(int c) { if (cË10) return c|'0' else return (c-9)|'@' }
void Cifre(int b) { printf("%c%c",Cifra(bââ4),Cifra(b&0xF)) }
void Print(unsigned x) { Cifre(xââ8) Cifre(x&0xFF) }
void main (void)
{ do { printf(" -ati un numar : ") scanf("%f",& ©  ) printf(" ... Hexa = ")
Print (  ââ16) Print(  &0xFFFF) printf(" ... \n") }
while (  !=0) getch()
}

 c V  Ô 


Există posibilitatea definirii unei à  2  ale cărei câmpuri să fie formate dintr-o
secvenţă de biţi consecutivi (ai unui cuvânt). Aceste câmpuri au tipul  c având
fiecare o  cprecizată (în număr de biţi):
à  2 #  $cc± 40 c 41 ... c 4 c #" $
unde 4  c 4 sunt de forma:
àî#  4 c$: "  
Exemplu:
#include Ëstdio.hâ
struct  V'a c{ àîB__0__3 " àîB__4__7 "
àîB__8_11 " àîB_12_15 " }
union { int Intreg  V a  8& } x
void Cifra(int c) { if (cË10) printf ("%c",c|'0') else printf ("%c",(c-9)|'@') }
void main (void)
{ do { printf(" -ati un numar : ") scanf("%d",&x.Intreg) printf("Hexa=")
Cifra(x  '  B__0__3) Cifra(x  '  B__4__7)
Cifra(x  '  B__8_11) Cifra(x  '  B_12_15) printf(" \n") }
while (x.Intreg!=0)
}

23.02.12 28
+ O
C+ PO

c º   V2


Pentru a implementa structura liniară (lista simplu înlănţuită) şi structura de tip
arbore binar vom apela la structuri definite recursiv.

— c G  %   


Considerăm o listă nevidă fiind formată din primul element şi sublista aflată la adresa
de legătură memorată în fiecare element pe lângă informaţia propriuzsă.
În exemplul următor vom crea o listă care va conţine monoamele unui polinom în
ordinea descrescătoare a gradelor. Un element din listă va conţine pe lângă informaţia
propriuzisă (coeficientul şi gradul monomului) şi adresa următorului monom (adresa
sublistei). -e exemplu, pentru polinomul P(&)=120&12+77&7+130&3+22&2 lista va conţine
patru elemente având informaţiile (20,12) (77,7) (130,3) (22,2), indiferent de ordinea
introducerii monoamelor. -eoarece coeficienţii sunt nenuli, introducerea datelor se termină
la primul coeficient nul.

o   ! 


o  !
o   ! 
o 3GG
  J    7  H - 
  I  J  J I 6G. - 
K0I 6    // Listă de monoame ordonate decrescător după grad
 7  >  ">
>7  >7 >H  >7  
-
£ 8 L  "L >  >
  . I  L    
L ML4JH>H  L    . 
 4J>  4G.L L  -
 8 L4G. > 
-
£ 7L  "L
>  > L 
 ! 7  >8 L > 
-
£ =0L  L
L1    L4J7 CNL4JH 
L4G.1    =0L4G. -
-
£ £ 
L  L 
  L7  H 7L 
  L   LC =0L 
. ! 
-
cc; L7  H+AAA#+#+ 
c)u c; L   LC+CNAACNA#+CN#CN


23.02.12 29
+ O
C+ PO

Exemplu:
,,G ă0 ă   ăă @@
o   ! o 7 700
K0 J 
  I  
K0I 6G × 
×× !""G ×#!
 7  J "
   -
£ 8 G "G J 
G""G4J8 G43  
,,  G   I   4J  43G G  - //sau
  I    G- G   I   G  -
-
£ 7G "G
J I G3GG  ! 7  I 8 G I  -
£ =0G G
G   G4J? ? =0G43 -  @' -
£ £ 
 7 / 
G G 
  G  7G 
  G  =0G  O  
-

 c [ 
Considerăm că un arbore binar ne este format din 2, à Ô Ôà î şi
à Ô Ô .
Exemplu:
,,8'     £ P @@
o   ! o 7 700
K0 J 
    K06[     J " 8'G  G  - 
 7  J "
   -
£ 8 8'"8 J 
884J8 84G./   8 84G.  
  8   84J 84G./ 3GG 84G.3GG -
-
£ 8 8'"8 J 
884J8 84G./  
 8 84G.  
,,  8   84J 84G./ 3GG 84G.3GG - //sau
     + +- 8   -
-
£ 78'"8
J I 83GG  ! 7  I 8 8 I  -
£ J 8'8
8 J 84G./    84J? ? J 84G. --
£ £ 
[ 8  7 / 
  8' 78   8' J 8  O  
-

23.02.12 30
+ O
C+ PO

În exemplul următor se citeste un arbore genealogic ascendent (dând pentru fiecare


persoană nume părinţilor), apoi se va reprezenta grafic arborele construit într-o fereastră
ecran precizată (u1,v1,u2,v2). -istanţa dintre două nivele se calculează ţinând cont de
adâncimea arborelui.
o   !
o  !
o  .!
o   !
o .0!! 
o   !
K0!=J9#: 
     =JA  ,,Oă@@
  6G   6G  ,,/'/ /'
 - 
K0 6[  
 7  =J"J
J  J9+:1?? -
£ H8'"8
=JJ  G.   
7  J 88' G. 
 0K84J J  ,,84JJ 
  > J H84G 
  =   J H84G -
 83GG 
-
£ O0EH8'8    £    £  0
  
813GG , 
£+   £4# 
 0 £ + #*+ # # 
  ; ;K £ 84J 
 £ 4 £# 
O0EH84G  £0  £ 0  ,,/ 
 £  £# 
O0EH84G  £0  £ 0 - ,,
-
 >;   '
 '$' -
 88'8
83GG 4   >;884G 884G -
£ £ 
[ 8 
  8' . . 0  H8 
 HI=I7= H  .0!"H "H @@<@@<. 
 ; F K7I=IOE=IC= 7I=IOE=IC= 
O0EH8 5+ + . ;;45+ . ;K4+ . ;K4)+,88 
. !  .0! 
-


23.02.12 31
+ O
C+ PO

—@ c    


Prelucrarea fişierelor se poate efectua la două nivele:
Úc   c  c- face apel direct la sistemul de operare
Úc   c  c- utilizează proceduri speciale pentru operaţii de intrare/ieşire.

—@ — c    
Prelucrările la acest nivel permit următoarele cinci operaţii:

—@ — — c      !   ÿ

cc( c$c* c a le , ccacces )


unde:
Úc c a le - este specificatorul de fişier,
Úc acces - poate fi o combinaţie (utilizând operatorul µ|¶) a următoarelor valori:
O_R-ONLY (fişier deschis numai pentru citire), O_WRONLY sau O_CREAT (numai
pentru scriere - creare), O_R-WR (citire/scriere), O_APPEN- (deschis pentru
adăugare la sfârşit), O_BINARY (pentru prelucrare binară), O_TEXT (pentru fişier de
tip text).

-acă deschiderea fişierului s-a realizat corect, atunci funcţia returnează o valoare
întreagă reprezentând   cc  (LUN, care va fi utilizat în continuare la celelelte
operaţii efectuate asupra acestui fişier), iar în caz de nereuşită se va returna valoarea -1.
Pentru a putea utiliza funcţia .ctrebuie incluse fişierele header .$cşi  .$.
Exemplu:
...
int Lun
Lun = open (³Fisier.-at´,OR-ONLY)
...

Pentru crearea unui fişier se va apela funcţia :


cc2 ( c$c* c a le , ccmod )
unde:
Úc mod - poate lua una dintre valorile: S_IREA- (fişierul se poate citi), S_IWRITE
(scriere în fişier), S_IEXEC (execuţia programului din fişierul specificat).
Pentru a putea utiliza funcţia ctrebuie incluse fişierele .$cşi .$.
Fişierele text sunt implicite.

23.02.12 32
+ O
C+ PO
—@ —  c    Ô  ! ÿ

cc ( cL u n ,  cc*buffer,  cclung )


unde:
Úc L u n - este descriptorul definit la deschidere (0=ST-IN, 1=ST-OUT, 2=ST-ERR,
3=ST-PRN, 4=ST-AUX),
Úc buffer - este zona de memorie în care se citeşte,
Úc l u n g - este lungimea (în octeţi) a înregistrării citite.
Funcţia returnează numărul de octeţi citiţi (cel mult l u n g ), 0 la sfărşit, sau -1 în caz
de eroare. Automat, după o citire (a articolului curent) se trece la următorul articol, implicit
prima poziţionare fiind la început de fişier (acces secvenţial).
Pentru a utiliza funcţiile ), ë , "*(csau ctrebuie inclus fişierul .$.

—@ —  c º  % Ô  !ë ÿ

cc  ( cL u n ,  cc*buffer,  cclung )

Funcţia returnează numărul de octeţi scrişi în fişier, reprezentând lungimea


articolului = l u n g , sau -1 în caz de eroare.

—@ —  c   % Ô  !º ÿ


Această funcţie permite accesul aleator printr-un apel de forma:
cc à ( cL u n , cc*deplasament , ccorigine )
unde:
Úc deplasament - reprezintă numărul de octeţi peste care se deplasează capul de
citire/scriere,
Úc origine - reprezintă punctul din care se măsoară deplasament-ul (0=începutul
fişierului, 1=poziţia curentă, 2=sfârşitul fişierului).
Funcţia returnează poziţia curentă faţă de începutul fişierului, sau -1 la eroare.

—@ —  c )     ! àÿ

cc2 à( cL u n )


Funcţia returnează 0 la o închidere corectă, sau -1 la eroare.

—@ —  c º     !Ñ ÿ

cc   (c$c* c a le)


Funcţia returnează 0 la o ştergere corectă, sau -1 la eroare.

23.02.12 33
+ O
C+ PO

Exemple:
,,7@@
o  $
o × $
o   !
o   !
o   !

£ £ 

 G 
  
GD=;  QE7OI8=MQE=IC= 
G1%&
 
  Q0 
' ×G L @ + 
' ×G 8   @ + 
-
   Q0J  1 
 G 
. ! 
-

,,7 @@
o  ($
o × ($
o   !
o   !
o   !

£ £ 

 G 
!O9+: 
 ;    ; '(. <G3I 
 ;  RSJ=I   
GD=;  QE=IC= 
G1%&
 
G O +   O 
G O +   O 
-
   Q0J  1 
 G 
. ! 
-

23.02.12 34
+ O
C+ PO

—@  c   


La acest nivel sunt posibile următoarele operaţii:

—@  — c      !Œ ÿ

#",ccc*c( c$c* c a le , c$c* mod )


unde:
Úc mod - poate fi ³´ pentru deschidere în citire, ³*´ pentru scriere, ³´ pentru
adăugare, ³&´ pentru modificare (citire/scriere), ³´ pentru citire binară, ³*´
pentru scriere binară, sau ³&´ pentru citire/scriere binară.
-acă la deschiderea fişierului s-a ales modul ³*´ sau ³´, fişierul va fi creat (recreat).
Funcţia returnează un pointer spre tipul #",cdefinit în fişierul  .$, iar în caz de
nereuşită se va returna valoarea NULL ( ,  c c  &c şi c sunt pointeri
spre tipul #",cpermiţând transferuri fără a fi necesară deschiderea sau închiderea lor).
Exemplu:
...
FILE * Pf
Pf =  (³Fisier.-at´,´w´)
...

—@   c        !Ê  ÿ

cccc 2( ccc , FILE * Pf )


unde:
Úc c - este codul caracterului scris,
Úc Pf - este valoarea returnată la deschidere sau  ,  , ,  &, .
Funcţia returnează valoarea lui c sau -1 la eroare.

ccccî 2(FILE * Pf )

Funcţia returnează codul caracterului citit, sau valoarea EOF la sfârşitul fişierului,
sau -1 la eroare.

Exemplu:
#include Ë .$â
void main (void)
{ int c
while ((c= ( ))!=EOF) (c, )
}

23.02.12 35
+ O
C+ PO
—@   c  )     !Œ àÿ

cccc2 à( FILE * Pf )

Funcţia returnează 0 la închiderea corectă a fişierului sau 1 la eroare.

—@   c    º   !Œº2 ŒŒÊ Œÿ

ccccà2 ( FILE * Pf , control, listă_variabile)

Parametrii control şi listă_variabile au aceeaşi semnificaţie ca şi pentru funcţia .


Funcţia returnează numărul de câmpuri citite sau EOF.

cccc ( FILE * Pf , control, listă_expresii)

Funcţia returnează numărul de caractere scrise în fişier sau -1 la eroare.


Ex.1:
// Creare fişier text cu Nume, Prenume \\
o   !
o   !
 7  !6; !6K
0 0  22 ; K1IQD -
£ £ 
!!95:  !95:    
"G 6LDE=;   ' 
 ! 7   L ×L 22@ ! ! 
 L  . ! 
-

Ex.2:
// Creare fişier text cu format (articole : (-en, Cant, Preţ)) \\
o   !
o   !
£ £ 
"G 6   +    
!9+:  ;   
 7  ; '(. <G3I 
  L  ;  RSJ=I 
   
 DED =;  ' 
  
0 8   2@  
0 4  2  ) 1  
0 47  2 "7  
0 4L  2 "L  
 ×  24+2)2A@  7 L  --
 ! 1     -
 0 Q0    . ! 
-

// Listare fişier text \\

23.02.12 36
+ O
C+ PO
o   !
o   !
£ £ 
"G 6   + 
!9+:  ;   
 7  ; '(. <G3I 
  L  ;  RSJ=I 
   
 DED =;   
 ! L  222  "7 "L 1 ) 
0 8   2@  
0 424+@  
0 47 2)@ 7  
0 4L 2A@ L  -
   -
 0 D8'   . ! 
-

—@   c        !Œ ºŒÊ ºÿ

$cc*cî à( $c*s, cn, FILE * Pf )


unde:
Úc s - zona receptoare (tablou de tip char de dimensiune p n, terminat cu NUL=¶\0¶),
Úc n-1 - număr maxim de caractere (n-1),
Funcţia returnează adresa şirului s, sau la EOF returnează NULL.
cccc à( $c*s, FILE * Pf )
Funcţia returnează codul ultimului caracter scris sau -1 la eroare.

Următorul program înlocuieşte cuvintele din fişierul  *i  aflate în partea
stângă a dicţionarului   i>& cu cele corespunzătoare din partea dreaptă, rezultatul fiind
depus în fişierul  *i , aşa cum se poate vedea în schema de mai jos.

Œ  º -2 

  2

Œ  ºÊ à

23.02.12 37
+ O
C+ PO

//   2Fişier text - String \\


o   ! o   !
o   ! o 0 !
o  .!
 G. !!6
    -
,6
 L !6 !6/
  + G. !/   Q( 
  F+ FG. ! F
/9F:19F: Q(+ '( -
Q(  - 4 
-6,
 L !6 !6/

!60  /   0$04/4 
-
,6
£   !6  0  
 !  44   0 G. ! 9:9: -
-6,
£   !6  0  

  0 G. ! 9:9: 
-
,6
£ J !6 !6/  0
   +  G. !   
  G. !/ 0 44/9:/9: /90 :9 : -
-6,
£ J !6 !6/  0
 G. !  G. !/ 
00  0+0+ 
   0 44/9:/9: 
!60/0  ! 6606 
-
£ /' !6; !6K !6/
 0L ; / 
0+   / 0 G. !; J K / 0 -
-
£ £ 
   
  +  K0!7£9:   L 7£/  - 
L  9+:  7£ 
"G 6*  * * × +×  
3GG     $ . ! ;  -
'$  )1*  22 * × 9,-:.× * × 9,-:*
  7£  97£:/ 
4  9,-: 
 *  7£44  . ! 
"G 6 " 6DI 
 " -.(,     -.(  ' 
DJ3GG   D$ . ! ;  -
  ++ !O9: 
'$ /×0 *!  "  ,,13GG
   7£ 
 ! L   9:/ O+
º   9:/   9:  
×0      O -
  "      . ! 
-


—@   c   % Ô  !Œº Œ ÿ

cccà (FILE * Pf, cdeplasamnet, corigine )

23.02.12 38
+ O
C+ PO
unde deplasamnet şi origine au aceeaşi semnificaţie ca şi la funcţia (.
Funcţia (creturnează 0 la poziţionare corectă sau o valoare ±0 la eroare.

ccc  ( FILE * Pf )


Funcţia  creturnează poziţia curentă (faţă de începutul fişierului, în octeţi).

—@   c       !Œ Œë ÿ


Acest tip de prelucrare permite transferul mai multor articole aflate într-o zonă
tampon astfel:
 ccc ( c*Pzt,  cdim,  cnrart , FILE * Pf)
unde:
Úc Pzt - este adresa zonei tampon,
Úc dim - reprezintă lungimea unui articol,
Úc nrart - reprezintă numărul de articole care se transferă (citesc),

 cc  (c c*Pzt,  cdim,  cnrart , FILE * Pf)


Ambele funcţii returnează numărul de articole transferate sau -1 la eroare.
Exemple:
o   !
K0   !9+: 
 7 
  L 
-8  
£ £ 
DJGI6L 8  8    
L 0DE=0   '3GG0 Q0   
0 @    2 " 
    
0 8   2@  
0 4 2 8  
0 47  2 "8 7  
0 4L  2 "8 L  
' ×"8  8    L -
 L . ! 
-


L 0DE=0  '3GG0 Q0   

    
"8  8    L 
0 8   2@   0 42@ 8  
0 47 2@ 8 7   0 4L 2@ 8 L  - L 
-

23.02.12 39
+ O
C+ PO

—— c  

—— — c    
Macrourile din această categorie (aflate în fişierul 2 . ) verifică dacă un caracter
este de un anumit tip:

cccà à2 ( ccar ) car ! [0,127] ?


cccà   ( ccar ) car este codul unui caracter alfanumeric ?
cccà  V ( ccar ) car este codul unei litere ?
cccà  ( ccar ) car este codul unei litere mari ?
cccà   ( ccar ) car este codul unei litere mici ?
cccàî  ( ccar ) car este codul unei cifre zecimale ?
cccà î  ( ccar ) car este codul unei cifre hexa ?
cccàî   ( ccar ) car este codul unui caracter afişabil ?
cccà  ( ccar ) car este codul unui caracter imprimabil ?
cccàà 2 ( ccar ) car este spaţiu, tab, Cr, Lf, Vt sau Np ?

——  c        


Macrourile din această clasă (aflate în fişierul 2 . ) transformă un caracter astfel:

ccc  à2 ( ccar ) car u [0,127] (returnează ultimii 7 biţi)


ccc   ( ccar ) car u literă mare (transformă din l în L)
ccc    ( ccar ) car u literă mică (transformă din L în l)

——  c   
Funcţiile care urmează (aflate în fişierul à  Ô. ) realizează conversii fară format.

c  c  c „c c2u  3 c& c


 (c$c*pt r )
ccccc  c2 3 c„cu  c&
ccc   (c$c *pt r )  c2  3 „cu  c&
   c  (c$c *pt r )   c c2  c u 3c„cu  c&

c  c&cc„c c  c


$c * ( cv,$c*s, c cb) sc„cv b (valoarea v de tip , scrisă în baza b)
$c *  ( cv,$c*s, c cb) sc„cv b (valoarea v de tip cscrisă în baza b)

23.02.12 40
+ O
C+ PO

——  c        


Funcţiile din această categorie se află în fişierul à î. .

——  — c    !º #$ÿ


$cc*cà #$2($c*dest inaţie, c$c*sursa #,  cn $)
unde sursa este copiată în dest inaţie, eventual doar primii n octeţi (cel mult n).

——   c     !º #$ ÿ


$cc*cà #$2 ($c*dest inaţie, c$c*sursa #,  cn $)
unde sursa este copiată la sfârşitul dest inaţiei, eventual doar primii n octeţi ai sursei.

——   c    !º #$#$Vÿ


ccà #$#$2V($c*şir 1 , c$c*şir 2 #,  cn $)
unde şir 1 este comparat cu şir2 (eventual doar primii octeţi, şi eventual gnorând diferenţa
dintre literele mari şi cele mici), iar rezultatul comparării este un număr negativ dacă
şir1Ëşir2, este un număr pozitiv dacă şir1âşir2 sau zero dacă şir1=şir2.

——   c G   !º ÿ


 ccà  ($c*şir)
returnează lungimea şirului (de caractere, fără caracterul NUL care îl termină).

——  c    


Aceste funcţii se află în fişierul V . (cşi cşi în à  Ô. ):
Ê   ºV2  c   c î(  c& ) 2&3
  cà (  c& )  2&3 c   c î—@(  c& ) 2&3
  c2à(  c& ) 2&3 c   c2 (  c& ) [&]
  c à(  c & )  2&3 c   c (  c& )  (&)
  c 2à(  c & ) 2&3 c   c Ôà(  c& ) |&|
  c (  c& ) 2&3 c ccccccc Ôà( c& )  |&|
  cà (  c & ) $2&3 c cccc Ôà( cc& )  |&|
  c2à  (  c& ) $2&3 c   c (  c0   c& ) 201&3
  c   (  c& ) $2&3 c   c (  c&   c0 ) &c0
  cà   (  c& ) ðc& c   c2 Ôà( c &cu ) |u|
&
  c (  c & )  c   c  (  c & c c    c  [ ] ) c 2&3c

——  c       


Următoarele funcţii se află în fişierele à  Ô. şi2àà. .


23.02.12 41
+ O
C+ PO
 Ê    ºV2 
 cc Ô ( ) Uc  c cc c
 cc   ( c  ) Uc  c cc 4c ccc 
cccàà V(c$c5) Uc & ccc c uc c(0+.().

——  c   


Aceste funcţii se referă la dată şi oră, şi sunt definite în fişierul à. împreună cu
următoarele două tipuri:

     


        
     
  
     
        
 

 ºV2   Ê  


Uc  cc c;  ccî  ( cc5)
Uc J  cc c;  ccà  (c  cc5)
Uc  c.c,&c;  ccî V( c c5.,&)
Uc J  c.c,&c;  ccà V(c  c c5.,&)

Exemplu:
o   ! ,,=0  Q@@
o  ! 
£ £ 
    7 .  " 7 
   QI; . "QI; 
0  222)@  7EK  7E   7EK 
0 Q222@ QI; E!  QI; E QI; E 
-

—— c   
Aceste funcţii sunt definite în fişierul 2. :

Ê   ºV2  u


3.c (  c )
 cà ë c23
1.c à2(  c& )
 c2 c* O 4.c  cà  (  c8u ) * c23
2.c  c (  c ) ë c23 u 5.c  cà  ( c ) * 

23.02.12 42
+ O
C+ PO

— cù  %   
Există posibilitatea de a defini următoarele moduri de lucru:
 cc  V( cccmod )

unde mod poate fi @(=1 pentru 40 coloane), @(=3 pentru 80 coloane), @
(=64 pentru 43/50 linii), şi altele.
-efinirea unei cc(implicit este tot ecranul) se realizează astfel:
 cc% ( cu 1 ,c cv 1 ,ccc cu 2 ,c cv 2 )
Ştergerea unei c:
 cc2 à2( )
Poziţionarea   :
 ccî  ( cx,c cy) //  , 
Poziţia   :
ccc  (   ) // 

ccc (  ) // 

Un caracter poate fi afişat pe ecran clipitor (aG=1), pe o culoare de c(0-7)


şi într-o anumită culoare de  c(0-15), culorile posibile fiind următoarele:

 2 à  à2 à


@aG[  [©©[
—aGù G>aGù
©ùù —@G>©ùù
 [ ——G> [
©ù —G>©ù
 [ù>[ —G> [ù>[
a©+ —ùGG+
G>©[ —+>ù

Culoarea de cse poate stabili prin funcţia:


 cc  Ô 2 î ( cculf ) // cul f ! {0,...,7}
Culoarea de  cse poate schimba printr-un apel de forma:
 cc  2 ( ccul s ) // cul s ! {0,...,15}

— cù  %   


>cîn modul grafic:

23.02.12 43
+ O
C+ PO
 ccc î  ( cccc* graphdriver,c cccc* graphmode,c$cccc* path)

# cdin modul grafic:


 c2 àî  ( )
*c  cculorii de :
 ccà Ô 2 (  cul f c) cccî Ô 2 ( c)
*c  cculorii de  :
 ccà 2 (  cul s c) cccî 2 ( c)
Alte funcţii:
 ºV2   Œ 2
Uc  cc & c2c. ui1i3 &&c() &0c()
Uc  c" )cc2Ñ   c c) 3 &c() 0c()
Uc J c" )cc2i1) i3 c(&,0)  c(&,0)
Uc >ucc c" )c c(&,0)  c(&,0) c
Uc >ucc c(&1,01,c&2,02) c
Uc uc $ c  c(&1,01,c&2,02) c
Uc ucc   c(&0) c
Uc * ccc# c" )c$c  &#&0$ (#&,0,$ ) c
Uc  c c1c  c u  c   ()     () c
Exemple:
#include Ëî  2à â //  2  à   \\
#include "î  "
# inclu d e Ës t d lib . hâ # in cl ud e Ës t d io. hâ # in cl ud e Ëconi o. h â #i nclu de Ë ma t h. hâ

float Sqr (float x) { return x*x }


float (float x, float y) { return sin(Sqr(x)+Sqr(y)) } // z=f(x,y)
void main(void)
{ float x float y float px float py int i int j int n=40 int m=40
A  () › Ê (10,10,getmaxx()-10,getmaxy()-10)
float l=3 float x1=-l float x2=l float y1=-l float y2=l // -om (x,y)
-Ê(1./2,1) // -efPr (r,a)
a=PrX(x1,z(x1,y1)) b=a c=PrY(y1,z(x1,y1)) d=c
for (i=0 iË=m i++) for (j=0 jË=n j++) {
x=x1+(x2-x1)*i/m y=y1+(y2-y1)*j/n
px=PrX(x,z(x,y)) py=PrY(y,z(x,y))
if (pxËa) a=px else if (pxâb) b=px
if (pyËc) c=py else if (pyâd) d=py
}

23.02.12 44
+ O
C+ PO
ë (a,d,b,c) setbkcolor(BLUE)
for (i=0 iË=m i++) {
x=x1+(x2-x1)*i/m y=y1
J (PrX(x,z(x,y)),PrY(y,z(x,y)))
for (j=1 jË=n j++) {
y=y1+(y2-y1)*j/n
 î(PrX(x,z(x,y)),PrY(y,z(x,y)))
} } setcolor(YELLOW)
for (j=0 jË=n j++) {
y=y1+(y2-y1)*j/n x=x1
J (PrX(x,z(x,y)),PrY(y,z(x,y)))
for (i=1 iË=m i++) {
x=x1+(x2-x1)*i/n
 î(PrX(x,z(x,y)),PrY(y,z(x,y)))
} }
getch() closegraph()
}

#include Ëî  2à â //  2  2 Ô \\


#include Ëconio.hâ
#include Ëmath.hâ
#include "î  "
float x (float t) { return cos(t) }
float y (float t) { return sin(t) }
float z (float t) { return t / 10 }
void main(void)
{ float t, px,py float t1=-50 float t2=50 float p=0.1 float Raza=0.5 float Alfa=1
InitGraf () setgraphmode(1) ViewPort (20,20,getmaxx()-20,getmaxy()-20)
-efPr(Raza,Alfa) // Pr.||(Raza,Alfa)
t=t1 a=PrX(x(t),z(t)) b=a c=PrY(y(t),z(t)) d=c
for (t=t1+p tË=t2 t+=p*2) {
px=PrX(x(t),z(t)) py=PrY(y(t),z(t))
if (pxËa) a=px else if (pxâb) b=px
if (pyËc) c=py else if (pyâd) d=py
}
Window(a,d,b,c) int Pag=0 setbkcolor(BLUE)
enum { Rosu, Verde } Sem = Verde
do { clearviewport() outtextxy(10,10,"Q OP") outtextxy(10,20,"A")
t=t1 Muta(PrX(x(t),z(t)),PrY(y(t),z(t)))
for (t=t1+p tË=t2 t+=p)
{Trag(PrX(x(t),z(t)),PrY(y(t),z(t))) }
setvisualpage(Pag) Pag=1-Pag setactivepage(Pag)
char Rasp=getch()
switch (Rasp&0x5F) {
case 'A' : Raza-=0.01 break case 'Q' : Raza+=0.01 break
case 'P' : Alfa-=0.01 break case 'O' : Alfa+=0.01 break
default : closegraph() Sem=Rosu }
-efPr(Raza,Alfa)
} while (Sem==Verde)
}

  $$
#include Ëgraphics.hâ
#include Ëmath.hâ

23.02.12 45
+ O
C+ PO
int u1,v1, u2,v2 // ViewPort
float a, b, c, d // Window
float Raza, Alfa // Pr (r,ù)
int (float x) { return ((x-a)/(b-a)*(u2-u1)+u1) }
int (float y) { return ((y-d)/(c-d)*(v2-v1)+v1) }
void A  (void)
{ int Gd = -ETECT, Gm initgraph(&Gd, &Gm, "c:\\Bc\\Bgi") }
void › Ê (int x1,int y1,int x2,int y2)
{ u1=x1 v1=y1 u2=x2 v2=y2 /* rectangle(u1,v1,u2,v2) */ }
void ë (float x1,float y1,float x2,float y2)
{ a=x1 d=y1 b=x2 c=y2 }
void J (float x,float y)
{ moveto(u(x),v(y)) }
void  î(float x,float y)
{ lineto(u(x),v(y)) }
void -Ê(float r, float a)
{ Raza=r Alfa=a }
float Ê(float x, float z)
{ return x+Raza*z*cos(Alfa) }
float Ê(float y, float z)
{ return y+Raza*z*sin(Alfa) }

23.02.12 46
+ O
C+ PO

— c  &&


Limbajul C++ oferă în plus faţă de limbajul C unele facilităţi noi. Un avantaj
important îl constituie noţiunea de   (prin care se defineşte un >), iar acestea pot
forma o $ , deci putem vorbi de o c c .

— — cù       


În C++ există un nou tip de  c(deja utilizat în exemplele anterioare):
V 
-acă în limbajul  declaraţiile erau scrise înainte de instrucţiuni, în && ele pot fi
scrise oriunde.
-ispozitivelor standard de intrare-ieşire li s-au ataşat   c standard 2
(pentru  ) şi respectiv 2 (pentru stdout), care permit efectuarea operaţiilor de intrare-
ieşire aplicând operatorul ââ  c 2, respectiv ((  c 2 . Ierarhiile
necesare sunt în fişierul à  V. .
Exemplu:
o   !  o   ! 
o  ×!$ 
£ £ 
 × ×    
×T   //  =Ë â
 ; × ; ; 
×;; 
$9+: ×   
×/  . ! 
-

-acă în conversia explicită se poate efectua prin ( ) & , în && se poate


realiza şi prin   (& ).
Exemplu:
o   !  o   ! 
o  ×!$ 
£ £ 
! 
×    
×7 
×T   
×T   
£ 60 0" 
×T 6 60 
 K0 6L 
×T 6L 0  // Conţinutul adresei 
. !  // la care se află un întreg
-

23.02.12 47
+ O
C+ PO

—  c   

—  — c       !""ÿ


Acest operator ("") se utilizează când dorim să referim o variabilă globală redefinită
într-o funcţie, astfel:
""›  Ô 
Exemplu:
o   ! 
o   ! 
.; ,,T' H ' 
!K9+:  
 && 
£ £ 
   
.; ,,T' G  
 K 
     ;; 
  7  ;??; 
  7  ;??44; 
  7  ;??; 

    £  
KK 
   £ K? ?K 


    4   


 . ! 
-

—   c     !ëÿ


Acest operator (ë) se poate utiliza şi pentru a defini un tip   printr-
declaraţie de forma c  c ë (asemănător cu o construcţie de forma  c , pentru  ).
Cu ajutorul acestui operator putem redenumi o variabilă, putem realiza un apel prin referinţă
sau putem să declarăm o variabilă de referinţă astfel:
 ccc  c 11cicic23
 ccc c c 11cicc c 

23.02.12 48
+ O
C+ PO

Exemple:
o   !        Ô  
o   ! 
£ £ 
 9:  6'  9+: 
    9+: 
   ' 9+:6' 
 ;  6K";  6K   ; 
   ; ; 
  ; K  ;6K   . ! 
-

o   !       2


o   ! 
o  !! 
K0 ' ×  '  
£ £ 
×   ' ; 
   ; ; 
  /;;  . ! 
-

o   !  [    


o   ! 
£  ;  K     u
  ;6K -
£  ;  K    u
 ;6K -
£ £ 
 ; K  
   ; K ;K 
; K ë   ;6K 
; K    ;6K    c  <
. ! 
-

—   c        ! -  ÿ


Operatorul de alocare  se poate folosi în oricare dintre următoarele trei variante:
  c
  c (c     u     c)
  cc[c       c]
-ealocarea se realizează astfel:
     c
sau
  [c     c]    c
Exemplu:
o   !  o   !  o   ! 
£ £ 

23.02.12 49
+ O
C+ PO

 6' 
   £ 6 
  £6 
 6F 
F' 6 
  66F6F 
 × 
 ×F 
 6 ' 9: 
   £ 6 
   £ 6 
  £6 
  £6 
 ×  . ! 
-

În exemplul următor se va utiliza o  c A cu număr variabil de coloane şi o


matrice B utilizând adresele liniilor:
o   !  o 7 700
K0 =0 
  ) 
£ 
 7 / 
=0689: 60   F 
    
089:'=09: 
 F F F606+F 
-
    089:    
 F F F  60?? 
   
-
       
 F F F  668F??  ,,8F
   
-
 <9:9: 
   
 F F F<9:9F:6+F 
       
 F F F  66<F??  ,,<F
   
- O  
- 11c)  u  ;
&1&&
212&22
313&3233
414&424344
&1&&
212&22
313&3233
414&424344
&1&&&2&3&4
212&222324
313&323334
414&424344

23.02.12 50
+ O
C+ PO

—  cº½     


Referirea acestor tipuri se poate face în && fără a mai fi nevoie de cuvântul
corespunzător à  2 , , respectiv  V. -e asemenea, parametrii şi valoarea unei
funcţii pot fi    ,   c c    sau  c c    . Sunt permise şi
atribuiri de structuri.
Referirea componentelor unei uniuni anonime din interiorul unei structuri se face la
fel ca şi referirea componentelor structurii, iar prima componentă se poate iniţializa.
În &&, variabilelor de tip enumerare nu se mai pot atribui decât valori ale acestui
tip (nu şi numerele asociate acestor elemente).
Exemple:
o   !  o   !  o   ! 
K0  O 
D. 0 - 
  L  O ; K - 
  7 L 7  
O O - 
  Q'  D.DJH 
  L L37= 
77IO7 
- - 
) ×+ ××) ×  ×=
 L37=; L37=;=; 
 L37=K L37=K=K 
  
-
£ £ 
L L # A- 
Q' Q 0   -- 
Q' 7 7DJH 77IO77 QL37= 77IO7O+ 
Q'  + ××7 L 
  7IO77 ; 
7IO77 K 
7IO7O . ! 
-

23.02.12 51
+ O
C+ PO

 ,,/  0 0 0   .@@


o   !
o  !
  L    ; K 
 ×ë, ×  
- +   
 ×*2 × 5 
 ×ë. !) % % × ×$ 
- 
×ë ×11, ×   6666 × ×$ 
-  ×11+   ×77778877 77 


L "80 0QL "L L "U  LU$LU -


£ £ 

7 / 
  L L L ,,L7 L 
  U L U ,,U7 L 
  > 80 0QL7 L U7 L/Q=0L 
  L L=0L 
  U U=0L 

O  
-

 ,,/  0 0 0   .@@


o   !
o  !
  L    ; K 
 × ;K -
£ =0L   ;??K -
    ;6;K6K -
L "/Q 
- 
L "L /Q ;4; K4K  6 ! -
L "80 0QL "L L "U  LU$LU -
£ £ 

7 / 
  L L LL  
  U L UL  
  > 80 0QL U/Q=0L 
  L L=0L 
  U U=0L 

O  
-

23.02.12 52
+ O
C+ PO

— c  &&

— — c A 


Aceste   cse pot defini astfel:
o VV!à    V  V ÿ 2  2 
Apelurile   c se vor înlocui cu  c c  precizat, fără a face
verificări de tipuri, ceea ce poate conduce la erori.
Aceste erori pot fi eliminate dacă utilizăm funcţiile  , caz în care se vor face
conversiile de tip necesare. Aceste funcţii se declară prin scrierea cuvântului   la
începutul antetului, aşa cum se pate vedea în exemplele următoare:
Ex. 1:
o   ! o   ! 
o8'EH;;+$;4; // Gresit !
o8'E.;;+$;4; // gresit !
o8'E;;+$;4; // Macro corect
  .[ .; // Functie Inline

 ;+$;4; 
-
£ £ 
 .; 
  ; ;  .K4; 
  M;M8'EH;    
  M;M8'E.; 
  M;M8'E; 
  M;M[; 
  M+4KM8'EH+4;    
  M+4KM8'E.+4; 
  M+4KM8'E+4; 
  M+4KM[+4; . ! 
-

Ex. 2:
o   ! 
o!; K;K$;K ,,H 1
  >; ;  K ,,DJ 
 ;K$;K -
£ £ 
 ; K  
;5 K !; K   !;? ?K 
;5 K >;; K   >;;? ?K 
-
c 11c)u  c
! 939 
: ;3;

23.02.12 53
+ O
C+ PO

—  c     


Antetul unei funcţii cu valoare de tip referinţă este:

 V!à    V  V ÿ


Exemplu:
o  ! o   '! o   ! o   ! 

×ë[ / ×ë[   ×ë/ 11c)ic cc


  [   11c)ic cc[ Ô
  /  11c)ic ccî
-
£ £ 
 8 '+  .+      
     
   [ E/[  /55  11c#( 1)
  8 '8 ' 
  .. 
. ! 
-

În următorul exemplu se doreşte modificarea coordonatelor celui mai apropiat punct


(dintre P şi Q) faţă de origine (nu doar coordonatele simetricului lui P sau Q):

 <<*  uuc c c c ccc  


o   !
o  !
×× × × 
 ×*2  × × ( (5 ( ( 
×. !)  ×ë  (% ( ( % ( × 
×ë[)  ×ë  ×ë=×*2 7*2 => 1=
×, ×   ×  66 (66 ( × 
- +    × ×77 (778877 ( 77 

- !  - 

, ×77?
.  1? × , ×  
×77?=1? ×=, ×  
×77?:?+   . !) [) =
×77? ?+   
×77?=?+   =

0
  

23.02.12 54
+ O
C+ PO

11c,&ic)  c==
o   !  o 7 700
£  ;  K  6
 6;6K -
£ / ;  K  "
 ;6K -
 6; ";  "K
 ;K$";"K -
 ">; ";  "K
 ;K$;K -
  L   ; K - 
L 8 ' ;  K
L L L;; LKK  L -
L L L
L;4L; LK4LK  L -
L "/L "L
L;4L; LK4LK  L -
L 6LL L
L;4L; LK4LK  "L -
£ =0L L
  LL;? ?LK?? -
£ £ 
 ; K   7 / 
   ; K ;K 
; K "   ;6K 
/; K    ;6K 
  ; K;??K 
  ;; K55 !   
  ; K;??K 
  >;; K55:   
  ; K;??K 
L L8 '; K =0L 
=0L =0L 
=0/L =0L 
  L; K ! (? ?. ! ( ?? 
  L; K  ! (? ?  ! %6 ?? 
 O  
- 11c)  u ;
*×  1&@
 5& 5&&2
 5& 5&&2
 &@
!  5&;
 &;
:  5&9
 &9
 &9
 %&%9
 &9
 %&%9
 %&%9
   &9
   %&%9

23.02.12 55
+ O
C+ PO

—  cº%    


Această proprietate dă posibilitatea utilizării unor funcţii având acelaşi nume, dar
diferite (înrudite, cu antete diferite).
Exemple:
o  !! o  0 ;! o   ! o   ! 
 ' [+/ ' ;   ; -
 ' [+/ ' K  ' ;   K ; -
 ' [+/ 0 ;     -
£ £ 
 0 ;  + 
  L)6[+/+ 
  L6[+/ + 
  L)6[+/  . ! 
-

,,O  =.!F L @@


o .!
o   !
  L    ; K - 
  =.! L 8 < 7 - 
L A   ;   K 
=.!A L 8 L < L 7 
£ + ×L "L L U 
£ + ×=.!"= L U 
£ © L "L   8  L U 
£ © =.!"=   8  L U 
L A   ;   K L L ; K-  L -
=.!A L 8 L < L 7 =.!= =88 =<< =77  = -
£ + ×L "L L U L;U; LKUK -
£ + ×=.!"= L U =  =8 U =  =< U =  =7 U -

£ © L "L L U   8  O L; LK U; UK 8  O L; LK U; UK 8  
-
£ © =.!"= L U   8  O =8 U 8  O =< U 8  O =7 U 8  -

£ :×L L :×L; LK -


£ >L L >L; LK -
£  L L  L; £LK # -
£  =.!= > =8 =.=< =.=7 =.=8 -
£ £ 

L LJ + + 
=.!8<7J J 5 5 J + A J %  
J H T L  + + . ;;4+ . ;K4+ 
 '( <G3I    CQOEL3= 
R 4+ + #+ 4+ 
G4+ + + + 
G+ + + 4+ 
!I+;'   8  !O0? ? 

 L 
   8<7 O0? ?8 +  8 4+ 

© 8<7 L 8  -


 ! O0. !1I 
 .0! 
-

23.02.12 56
+ O
C+ PO

—  c       


Parametrii formali pot avea o valoare implicită, dacă aceştia lipsesc din lista
parametrilor actuali, valoare dată de o  à. În lista parametrilor formali, cei cu valoare
implicită (iniţializaţi) se vor scrie ultimii astfel:

 V à


Exemplu:
o   ! o   ! o   ! 
  Q'    ; K    - 
 IG0  4 -
 I EL Q'     IG0 -
Q' " ×  ;++   K++   IG0
Q'  
 ;;+  KK+   
  
-
=0Q'  
I EL    L     7 
   ;  K 
I EL         
   
-


Q' Q" × =0Q ,,Q.+ +
Q' 8" ×A =08 ,,8!Q;A +
Q' L" ×  =0L ,,L!O 
Q' 7" ×# ) 5 =07 ,,7# ) 5
. ! 
-

În exemplul care urmează se poate vedea cum se pot folosi parametrii impliciţi
pentru a declara punctul O(0,0), un punct A pe axa Ox, un punct P în plan (!02), un cerc C
(în plan), extremităţile unui segment din spaţiu (Q,R!0 3), precum şi segmentele QR şi RO:
o   ! 
o   ! 
o   ! 
  L    ; K  - 
L J   ;++   K++   ++
L L 
L;;+ LKK+ L+ 
 L 
-
£ =0L L

  LL;? ?LK? ?L?? 
-

23.02.12 57
+ O
C+ PO
  /.  L 8 < - 
/. J L 8 L <J 

/. 8< 8; 8K 8- <; <K <-- 
 8< 
-
£ =0/. 8<

  /. @ =08<8 =08<< 
-
£ 
  
L QJ  =0Q ,,Q.
+ + +
L 8J A =08 ,,8Q;
A + +
L LJ   =0L ,,LO
  +
L  7J # ) 5    =07                         ,, 7
# ) 5
L UJ   # ,,UO#
L OJ ) 5 * ,,OO#
/. UOJ U O ,,UOO#
=0UO 
/. OQJ O 
=0OQ 
. ! 
-

—  c    º


Acestea se declară în cadrul structurii ca fincţii inline sau prototipuri (urmând
în acest caz descrierea lor cu ajutorul operatorului de rezoluţie (::).
 ,,/  0 0 0   .@@
o   !
o  !
  L    ; K 
 ×ë, ×  
- +   
 ×*2 × 5 
 ×ë. !) % % × ×$ 
- 
×ë ×11, ×   6666 × ×$ 
-  ×11+   ×77778877 77 


L "80 0QL "L L "U  LU$LU -


£ £ 

7 / 
  L L L ,,L7 L 
  U L U ,,U7 L 
  > 80 0QL7 L U7 L/Q=0L 
  L L=0L 
  U U=0L 

O  
-

 ,,/  0 0 0   .@@

23.02.12 58
+ O
C+ PO
o   !
o  !
  L    ; K 
 × ;K -
£ =0L   ;??K -
    ;6;K6K -
L "/Q 
- 
L "L /Q ;4; K4K  6 ! -
L "80 0QL "L L "U  LU$LU -
£ £ 

7 / 
  L L LL  
  U L UL  
  > 80 0QL U/Q=0L 
  L L=0L 
  U U=0L 

O  
-

— c>   [               
c  permite protejarea datelor prin  c , (accesul la
date se poate efectua doar din locul declarării până la sfârşitul  , nu şi în afara lui).
Un  c c c c 2 c . 3c conţine o    (³>i$´) şi o
V V (³>i ´). Programul (³ i ´) care utilizează acest  cc
c c va avea acces doar la modulul de interfaţă, aşa cum se poate vedea în schema de
mai jos:

 
     

" (  
>    ù

 
>    

În proiect (meniul  ) vor fi incluse fişierele   şi > .

23.02.12 59
+ O
C+ PO
În exemplul următor, pentru >c J  , fişierele vor fi    ½    şi
  :
,,   @@
o   !
o   !
o  ?: ×($?
£ £ 
   
> 8 < 7  
J 8 J < J 7 J  
  8 7 >8 
  8 =0>8 
,,  M8M84  ,,01
  M8M78  ,,/01
  < 7 >< 
  < =0>< 
J 7 J 8 < 7   8< =0>7 
J  O8 <    8< =0> 
  J 8 <$8<18< 
  I. 8 <$8<8< 
 . ! 
-

,,    @@
o  ? : ×($? // Sunt definite elementele mulţimii
  ,× 
K07 6: × ! 
£ J > "8 
 7> 8 
 IET> 8 
£ T> 8 
£ 8I =I ; > 8 
£ 7 >> 8 
£ =0>> 8 
 80 =I ; > 8 
£ J > 8 > < > 7 
£ > 8 > < > 7 
£ O> 8 > < > 7 
 J > 8 > < 
 I. > 8 > < 
> I > 8 =I  
> > 8 > < 

,,   @@
o   !
o   !
o  ? : ×($?
o  ?: ×($?
×   ,×   
=I I 97: 
- 

23.02.12 60
+ O
C+ PO
 7> 8
 84 -
£ 7 >> 8
84 
7874  7871  
   78 84I 9: 
   
-
£ =0>> 8
   78   84I 9:  
  @'@ 
-
 80 =I ; > 8
   78 ;84I 9:  
 + 
-
£ J > 8 > < > 7
T7 
   78 80 84I 9: <8I 84I 9: 7 
-
£ > 8 > < > 7
  
T7 
  78 180 84I 9: <8I 84I 9: 7 
-
> I > 8 =I 

80  8 >  J  8I   8     -
  8 
-
> > 8 > <

>  J  8 <    
-
> > 8 > <

>  J  8 <    
-
£ O> 8 > < > 7
  
6768 > <E8 J <E8 < 8 <E8 
  7<E8 8I <E84I 9: 7 
,,  K<E8 
-
 J > 8 > <
  
  78 180 84I 9: < +   
-
 I. > 8 > <

 J 8 <""J < 8 
-
 I. > 8 > <

 J 8 <""J < 8 
-

23.02.12 61
+ O
C+ PO
£ 8I =I ; > 8

180 ; 8
7874   7871 . ! - 
84I 984:; 
-
£ T> 8

84+ 
-
£ J > "8

8 7 T8 
-
 IET> 8

 84+ 
-

,,ù    @@
o755
×  ×+  // Tipul elementelor mulţimii


Un  c c c  realizează o unificare (printr-o grupare de tip  ) între
date (c ) şi operaţiile (  c ) lor caracteristice.   c sunt
considerate de tip  c iar definirea lor în afara structurii se face prin operatorul de
u  c (""). În acest mod însă nu se realizează o protecţie a datelor (accesul la date se
poate face şi prin alte funcţii, nu numai prin cele  ), această protecţie putând fi
realizată (aşa cum vom vedea în cele ce urmează) cu ajutorul   .
Exemplu:
o   !  o   !  o   ! 
oL#)5&
  7   ; K 
   
£ J   ;+   K+   
 ;;+ KK+  -
  G. 
  8 
- 
  ,G/  6L6 -
  ,[   L66 -
£ £ 
77 7" ×  # 
  7,( ,(  ,( 
  87[  
  G.7G/  . ! 
-

23.02.12 62
+ O
C+ PO

— c          !    ÿ

 este o metodă de implementare în care:


a)c .   sunt elementele de bază,
b)c Orice obiect este o instanţă a unei  ,
c)c Clasele sunt legate (asociate) unele cu altele prin   .
Un limbaj este orientat obiect dacă:
a)c Utilizează  ,
b)c Obligă obiectele să aparţină unei  ,
c)c Permite   .
Limbajul C++ oferă noţiunea de  , prin care se pot forma $ , deci putem
vorbi de o î V  Ô2 ().
 înseamnă realizarea unor programe alcătuite dintr-o mulţime de   care
interacţionează pentru a rezolva problema propusă, şi permite reutilizarea elementelor
descrise (a interfeţei şi a codului).
Un  are o  şi un  (operaţii descrise în interfaţa obiectului)
aceste două componente fiind definite prin  c  (  c c ) şi
respectiv prin   c ().
 utilizează ormătoarele concepte:
? c2 à  ccimplementarea unui TA-,
? c Ô   2  cc  unei clase,
? cV     prin care se asigură interfaţa (operaţiile).

 are următoarele caracteristici (proprietăţi) de bază:

?c 2 à   cgruparea datelor şi a operaţiilor definite pentru acestea, precum şi protecţia


 acestor date (ele neputând fi accesate decât prin funcţiile membru).
?c V   cpăstrarea elementelor (date şi funcţii ale) unei clase (cu), cu definirea
 de noi elemente construind o nouă clasă ( ), formând în felul acesta
$ de clase. J   poate fi şi     dacă o clasă moşteneşte
mai multe clase.
?c  VàV c    ( Î) operaţiilor (funcţiilor). Într-o ierarhie pot fi
 mai multe funcţii cu acelaşi nume, deci va fi efectuată operaţia
corespunzătoare obiectului care o apelează. -eterminarea operaţiei se
poate face la compilare ( c  ) sau la execuţie ( c  ,
prin   c   ).

23.02.12 63
+ O
C+ PO

— — c    à 
O   se declară ca şi o   , înlocuind cuvântul à  2  cu 2 àà. Protecţia
datelor se defineşte scriind modificatorul dorit ( , csau   ) urmat de µ:¶.
-escrierea unei   conţine atât datele membru (variabilele de instanţă) cât şi
funcţiile membru (metodele), precizând pentru acestea gradul de protecţie, astfel:
2 àà  c ±
c ±#J   "$" 

unde:ccc
?c J   c! ±c, ,     ½  fiind implicit,
?c   nu permite accesul din afara clasei, 8
?c cpermite accesul din clasele derivate, o
?c   cpermite accesul din afara clasei &
?c "  c! ± "    c" c  c   

-atele de tip   (8) pot fi accesate doar de funcţiile  csau funcţii  c
(). O funcţie  ca unei clase poate fi funcţie  ca altei clase, iar dacă toate
sunt  , atunci se poate declara clasă  ()ic  › 

Fiecare obiect al unei clase deţine un set de date membru (  cc ).
Funcţiile membru    pot fi utilizate din orice funcţie din program, pe când cele
  doar din funcţiile membru ale clasei.
-efinirea funcţiilor membru ( ) se poate realiza:
a)c imediat (complet,  plus ) în definiţia clasei (ca funcţie  ) dacă funcţia nu
conţine multe instrucţiuni şi nu conţine structuri repetitive (apelul nu se face prin salt cu
revenire), astfel:
2 àà  c ± ,
   2 c!... ÿ ±. . . c 11c+cc
c ,

b)c ulterior (dacă a fost declarat în definiţia clasei doar prototipul funcţiei), utilizând
operatorul de rezoluţie (de scop) astfel:
  2 V 2 àc"" c!... ÿc 11cc""  ccu  c
 ±. . . 11c c   c

23.02.12 64
+ O
C+ PO
Exemplu:
 ,,7 L @@
 ,,44444444444444444444444444444@@
o   !
o   !
  × × << -×1  02

 1
 × A A
 ×  ×A × AA  A
 × ×ë  (  ( 
- , ×  $ :
- +   $ :
 ×ë. !  

-  ×11, ×  $ :×77: 6666 
-  ×11+   $ :×77:77778877 77 
×ë ×11. !   ×B  B× ×$ 
£ £ 

 
-

Un  este o c a unei   (o   cc  c  ). Fiecare obiect
aparţine unei singure clase (aceasta putând avea mai multe obiecte).
.  cunei  cse declară astfel:
 àà  Ô2 ‰
Exemplu:
 ,,Q' L @@
 ,,44444444444444444444444444444@@
o   !
o   !
 L  
 
- 

£ £ 
  

 ×)[ &2


Q=0LQ 
8=0L8 

 ×C&<7 L< 
 ×C2</L' 
<=0L< 
. ! 

-

23.02.12 65
+ O
C+ PO

Alocarea (şi iniţializarea) obiectelor se face cu o funcţie membru specifică numită


  (cu numele  à) iar dealocarea cu o funcţie  c(cu numele ! à).
Exemplu:
,,7   4  @@
,,4444444444444444444444444444@@
o  !
o  !!
o   !
o .0!!
o   !
o7 @@<  7@@<.

    H H 
0'   . H.  .0!"H "H 7  -
D   .0! -
- 

  ×   ; K  ,,0£ ; KO
0' 
L  ;+ K+ -
L   ;+   K+ ;;+ KK+ -
L L "L ;L; KLK -
 ×    
D × 

 C+   ; -
 V+   K -
L "= L " 
- 

L  × ;+  K+   ;;+ KK+     ; K 5 -
L D ×   <G87W  ; K 5 -

L "L = L "= ;=; K=K  6 ! -
£ £ 

 > I=I7= 
L 7. ;;, . ;K, RSJ=I . !  ,,7 
   8 45A 8 )A 8 ++
   O++ 
L >O6 8  O68  
L L>= 7 
 ×LC+ LV+ VIGGQR  K5 
-. ! 
-

23.02.12 66
+ O
C+ PO

Componentele claselor (datele şi funcţiile membru) se referă prin operatorul  sau


ca şi în cazul unei structuri. Funcţiile membru referă direct componentele clasei (fără aceşti
operatori, utilizând poinetrul àdeclarat automat ca pointer la obiectul curent).
Exemplu:
,,Q0  şi Uâ @@
,,4444444444444444444444444444@@
o  !
o  !!
o   !
o .0!!
o   !
o7 @@<  7@@<.

    H H 
0'   . H.  .0!"H "H 7  -
D   .0! -
- 

 L    ; K 
0' 
L  ;+ K+ -
L   ;+   K+ ;;+ KK+ -
L   L "L ;L; KLK -

L     
XL  
L 6J   ;+   K+ ;;+ KK+  ×$  -
 C+   ; -
 V+   K -
L 6=   L 6 
- 

L L  ;+  K+   ;;+ KK+     ; K 5 -

L XL    <G87W  ; K 5 -


L 6L =   L 6= ;=Uâ; K=UâK  ×$  -

£ £ 

H> I=I7= 
L 67 L . ;;, . ;K, RSJ=I . ! 
  O++ 
L 6> L  ,,:!,
   8 45A 8 )A 8 ++ 
>>UâJ O6 8  O68 Uâ= 7 
L 6L L >Uâ C+ >Uâ V+ VIGGQR  K#  ,,*( 
  L - ,,.×/ 
  > . ! 
  7 . ! 
-

23.02.12 67
+ O
C+ PO

—  cà  2 şi -à  2 

Un obiect este creat de un 2à  2  al clasei şi este şters (distrus) de către


à  2 .
à  2 permit iniţializarea obiectelor cu (mai multe) funcţii membru omonime
(având acelaşi nume cu clasa şi care diferă prin lista parametrilor formali), fără a returna o
valoare.   este apelat automat la crearea unui obiect. O clasă trebuie să
conţină cel puţin doi constructori:
?c un 2à  2  V 2 c (fără parametri, care iniţializează obiectele cu o valoare
implicită),
?c un 2à  2 2c(care iniţializează cu valoarea unui obiect existent, de acelaşi
tip).

Exemplu:
//   *  \\
o 7  !
o / .!
o J  !


 / . !6 


0' 
/ .  ,,7   0  
/ .  / ."  ,,7    0
/ .  !6  ,,7    £
/ ." 0   / ."  ,,Q0  '
X/ .  ,,  
 G. !  ,,G. 
£ L   ,,=0  
- 
/ ./ .  ! 9+:+ -
/ ./ .  / ."/  !9/G. !:  0K / -
/ ./ .  !6/  !9  /:  0K / -
/ ."/ . 0   / ."/
1/   9:  !9/G. !:  0K / -
 6 ! -
/ .X/ .   9: -
 / .G. !     -
£ / .L     -


£ 
   
/ .T 
TL  
/ .L 07   0  / . 
L 0L  
/ .OL 0 
OL  
/ .OO 
OL  
 . ! 
-
c

23.02.12 68
+ O
C+ PO
 c unui  c al unei clase ce conţine ca date membru   alte altor
clase este de forma:
 à!à    V ÿ" Ô2 —!à   V —ÿ½ ½ Ô2 !à   V ÿ
Exemplu:
o   ! o   ! o   ! 
 L#   ; K  
0' 
L# ;+ K+ + -
L#  ;+   K+   + ;;+ KK+ + -
£ =0   L; K  -
- 
 7 L#;EKE 
0' 
7 - 
,  ×A × A ×BA1  A ABA
7L#7 ;EKE7 -
7  7"7+ ;EKE7+;EKE -
£ =0   7 ;EKE=0 -
- 
£ £ 
7Q Q=0  11c  cV 2 .27773
,, 4@;7=0  11c  c cÔ2 
L#L  # L=0  11c  c
7L =0  11c  c 
7I I=0 . !  11c  cc2
-

-à  2  realizează automat dealocarea obiectelor globale la sfârşitul


programului, iar a celor locale la sfârşitul funcţiei. Obiectele alocate dinamic (cu %) se
vor dealoca cu operatorul  . Numele destructorului este compus din caracterul !
urmat de numele clasei ( !  à!  ÿ ). -estructorii nu returnează o valoare.
Exemplu:
o   ! 
 7   ; K  
0' 
7  ;+   K+   +
   8  ;;+ KK+ + -
D, 
     -
£ =0
   7; K  -
- 
£ £ 

77  # 7=0 
- c

11c)u  c ;c


[ (((
, &23
* (((

23.02.12 69
+ O
C+ PO
În exemplul următor se poate urmării momentul în care acţionează constructorul şi
destrucorul:
1 1 c . c c  c 2 c      3 

o  .! 


o   ! 

    !6 


0' 
  !6 
X   
- 

    !6


'!9  : 
 0K   
  7  Q' 
-

  X  


    Q' 
 × 
-

£   ;


  ; -

  ;# 

£ £ 
  6/  6 
  K)5* A%& 
  6/ 06 
-

11c)u  c ;c


,×()((((&23
.×× 
,×()((((4@;
,×()((((9EF
((( (((
(((* ×()(9EF
.× 
(((* ×()(4@;
(((* ×()(&23

23.02.12 70
+ O
C+ PO

— c º22  2 à  VÔ   ÑJ!Ñ  cJ c" ÿ

 G specifică     (clasele) dintr-un program şi    dintre ele astfel:


?c º22     :

Lc numele clasei,
Lc date membru -  2 V  " c
Lc funcţii membru -  2 V  2!  V ÿ"   2
(  2poate fi 8 (private), o (protected) sau & (public) ).

Punct
 V 2 à
- x : float
 VVÔ Exemplu: - y : float
+ Punct ( )
 2VVÔ + Punct (Punct&)
+~Punct ( )

?c º22     2 à :

Lc relaţia de asociere : //   

Lc relaţia de derivare : //   

    
- x :   - Nume : * 
- y :   + Persoană ( )
+ Punct ( ) + Persoană (Persoană &)
+ Punct (Punct&) +~Persoană ( )
+~Punct ( )

º  º 
- A :   - Facultate: * 
- B :   - Varstă : 
+ Segment ( ) + Student ( )
+ Segment (Segment&) + Student (Student &)
+~Segment ( ) +~Student ( )

23.02.12 71
+ O
C+ PO

— cŒ  2         à   Ê          Œ     
O   este    cu o clasă dacă are acces la datele membru private ale acelei
clase. O funcţie prietenă poate fi o funcţie  sau chiar o funcţie  a altei clase.
O   este    cu o altă clasă dacă ea are acces la datele membru ale
acesteia.
O   ½respectiv o      se declară utilizând cuvântul  astfel:
a)c   2 V  2!"   ÿ‰ //    globală
b)c   2 V 2 à"" V  2!" i ÿ‰ //    membru
c)c   V 2 à‰ //  
Următorul exemplu, nu este corect, deoarece elementul C. nu este accesibil:
//    membru
o  !!o   !
  ×     << -×1
0' L  ;+ K+ -
L   ;+   K+ ;;+ KK+ -
- 
 ,  ×7    
0' 7L Q    7Q  -
 ×+ ) × ,( 7 << 
- 
£ 
L 7+ + 77 ) 
(+ )  7   ;Q; 
   7   ;Q; 
- ,, 

O soluţie pentru a rezolva această problemă, ar putea fi declararea funcţiei membru


  ca funcţie prietenă a clasei  . Această modificare nu este suficientă deoarece
clasa 2 nu a fost încă (deja!) definită, deci aceasta trebuie mai întâi declarată, iar pentru
că aceasta referă clasa   vom declara (pur şi) simplu clasa   pentru a putea referi
 c  ca pointer la  . Pentru că  nu este dată membru pentru cerc,
funcţia + ) nu poate fi definită  , ci doar , după declararea completă a
clasei  .
             
o  !!o   !
  × 
 ,  × ,    
0' 7L Q     ,Q  -
 ×+ ) 
- 
  ×   ; K 
0' L  ;+ K+ -
L   ;+   K+ ;;+ KK+ -
   × 11+ ) 
- 
× 11+ ) × ,%6 7
£ 
L 7+ + 77 ) 
=Q;  7   ;Q; 
   7   ;Q; 
-

23.02.12 72
+ O
C+ PO
Exemple:
,,Œ 2 î Ô @@
o  !
o   !
o .0!!
o   !
o7 @@<  7@@<.
 H  H H 
0' H . H.  .0!"H "H 7  -
XH  .0! -
- 
     ; K 
0' L  ;++  K++ ;;+ KK+ 
0 0; ; K ;K -
L L "L ;L; KLK -
£ >   £ ; K -
£ =.   ; K -
XL  -
 L :  L L   <<× /  
 L [ L L     <<     
- 
L :  L 8 L < L > 8;<;, 
 8K<K, 
 > -
L [ L 8 L <     L > 4 68; 6<;+5 
 4 68K 6<K+5 
 > -
 º L 8 < ,,70  /.
0' 
/. 8 < -
/. L L L U 8L <U 
8>  <=. -
/. /. "8< 88<8 <8<< -
X/.  8>  <=. -
L >F   :  8 < - //""Mijloc
L 8     [ 8 <  - //""Mijloc
- 
£ £ 

H> I=I7=    CQOEL3=  '( <G3I 
L 68 L #++ ++ ,,8
L 6< L ++ #++ ,,<
L 67 L 5++ #++ ,,7
/. 68< /. 68 6< ,,8<
/. 6<7 /. 6< 67 ,,<7
/. 678 /. 67 68 ,,78
   8 + 8  8 ++
 L 6L L 8<488  
L 6U L 78488  
/. 6LU /. 6L 6U 
LU4>F   K ,,9L >:
  LU   L   U 
-  8<   8   < . ! 
  <7   78 
-

23.02.12 73
+ O
C+ PO

,,Œ 2 VV Ô @@


o  !
o  !!
o   !
o .0!!
o   !
o7 @@<  7@@<.
  /B ;    ;6; -
 /B   ;   B ;+5 -
 H  H H 
0' H . H.  .0!"H "H 7  
 '( <G3I -
XH . !  .0! -
- 
  ×
 ./!× × [ C,,70  /.
0' 
/. 8 < -
/. L 6 L 6 
/. /. " 
X/.  
 ×:   

  ×  ; K 
0' L  ;++  K++ ;;+ KK+ 
0 0; ; K ;K -
L L "L ;L; KLK -
£ >   £ ; K -
£ =.   ; K -
XL  -
  ×./!×11:   
- 
/. /. L 6L L 6U 8L <U 84>  <4=. -
/. /. /. "8< 88<8 <8<< -
/. X/.  84>  <4=. -
×./!×11:    ×:  × [%65C%6<2
 × [%6 5C%6 <2
×:
£ £ 
H> I=I7=    CQOEL3=  G.)++ 
L 6Q L ,,Q.
L 6C L G. 
L 6V L + G. 
/. 6QC /. Q C ,,8;Q; 
/. 6QV /. Q V ,,8;Q; 
  ; ;G. ;
 L 6L L ; 
L 6U L + /B /BG.4/B; 
/. 6LU /. L U 
 =%6:    K& 
  LU   L   U 
-. ! 
  QC   QV   Q   C   V 
-

23.02.12 74
+ O
C+ PO
,, à @@
o  !o  !!o   !o .0!!o   !
o7 @@<  7@@<.
  0   K00   L#)* 8  
 H  H H 
0' H . H.  .0!"H "H 7  . 0  "0  -

XH . !  .0! -


- 
  ×  ; K 
0' L   ;++   K++ ; ;+ K K+ -
L   ;+   K+   ; ;++5 K K++5 0 0; ; K  -
L L "L ;L; KLK -
£ >   £ ; K -
£ =.   ; K -
XL  -
 ./!×
 ,
 + /$ 
- 
 ./!× ×8 <  7 ,,70  /.
0' /. 8 < -
/. L L L U 7 .     7  
 8L <U 8>  <=. -
/. /. "8< 88<8 <8<< -
X/.    7  8>  <=. -
L >F  
 + /$ 
- 
×./!×11:    ×: × [(5C(<2 × [( 5C( <2×:
 ,  ; K  
0' 7 ;++  K++  + ;;+ KK+ +  ; K  -
7L L  + ;L; KLK +  ; K  -
77"7 ;7; K7K 7 -
L L7   L >;6  K46  > -
X7 ,6 ; K  6,-
- 
 + /$  L 8 < 7 ,,T
0' 
=.!8 < 7 -
=.!L L L  
=.!=.!"8<7 88<78 <8<7< 78<77 -
 ×,×  × [(5C(5,(<3 [( 5C( 5,( <3&@
×
X=.! -
- 
=.!=.!L L L U L O 8L <U 7O 
  VIGGQR /. 8<8 < /. <7< 7 /. 787 8 
  GJHS=<G3I /. 88L8 <7>F  
/. <<L< 78>F  /. 77L7 8<>F  
 7 L4'8 4L,L6*# ,,.'
 .'0  0  9<G3I: + + 7 
 .'0  0  9VIGGQR: *# *#47 + 
 .'0  0  9GJHS=<G3I: + 7 *# 
 .'0  0  9RSJ=I: 7 7 7 
 K 0 '8 4L+#6L  -
£ £ 
H> I=I7=    CQOEL3=  '( <G3I 
L Q#++ 5+ 7Q ++ ,,  
  8L, <LL,* 74L,) 
 8 + 8 6L 8 ++ 
=.!8<7L78 8 L78 < L78 7 
8<77 H -
-

23.02.12 75
+ O
C+ PO

 @ c J  VÔ    à 2º 2   Ö " 


Fiecare obiect dintr-o clasă deţine toate datele membru (atributele) acesteia. Există
însă posibilitatea ca toate instanţele unei clase să deţină anumite    tuturor
obiectelor clasei respective. Aceşti membri (date, funcţii)  au acelaşi regim de
protecţie ca şi ceilalţi membrii.

@ — c [ Ô  - VVÔ  º 2  Ö " 


-  VVÔ à 2, care urmează să fie utilizate de către toate obiectele clasei,
àà2prin specificatorul à 2astfel:
2 àà  c ± ,
c à 2"    c c 11c Ö "
 

-  VVÔ à 2, à2  (c    uu)   în afara clasei:


c >  ccc  "" c# c$ c

 (  u)   VVÔ à 2 se poate face astfel:


a)c 5 V 2 à""-  VVÔ c5 // ) c  c2  3c c 
b)c 5. c  c5 // ) cc  cc c c 
c)c 5  . cUâ c5 // ) cc  cc c 

În următorul exemplu, se numără câte  sunt utlizate la un moment dat în


program, utilizând ca dată comună pentru toate punctele (întreaga clasă) ):


// Membruº 2
o   !
o   !

  ×  ; K 
0' 
L  ;+ K+ )55-
L   ;   K  !4;; 
 !4KK )55-
L L "L ;L; KLK )55-
XL  )%%-


××  ×) Ö"




× ×11)A cc    uu




23.02.12 76
+ O
C+ PO
£ £ 
     L  8 < 
  J   ×11) 
 
   5  
L >  L U> 
   ×11) 
2+ 
L 6 L   L O6 
   ×11)  ,,7 /  
  OEQ'  ,,Q'/  1
  4EQ'  ,,Q'4/  1
   
-
   ×11) -
    D   ×11)   
. -
! 

În exemplul următor, sunt utilizaţi  c  c pentru a memora domeniul
minim care conţine toate punctele curbei (definite parametric) care se desenează:


// Membriº 2
o  !!o   ! o .0!!
o7 @@<  7@@<.
 H  H H 
0' H . H.  .0!"H "H 7   '( <G3I -
XH . !  .0! -- 
    
 £   
 L    ; K 
0' L  ;+ K+ -
£ 8 '  ;   K  !4;; ;;  
;; 
 !4KK KK  
KK -
L L "L ;L; KLK -
£ >   £ ; £K -
£ =.   ; £K -
XL  -
××  × Œ à  
- 
 × ×11 ×11 ×11 ×11 Œ à  
 + £+ 5++ £)#+  11cc,
   ;  ;4 ×11, ×11% ×1164 -
 £  K  K4 ×11, ×11% ×116£4££ -
  ;      6 6   - üü 
  K      )6 6  - üü 
£ £ 
  +++   L#)5# H> I=I7= 
L L9++: 
 ×11 ×11 A
 ×11 ×11 A
 +     8 6L6, L9:8 ';8  K8  -
L9+:>    RSJ=I 
   L9:=. 
-

23.02.12 77
+ O
C+ PO

@  c J  Œ 2VVÔ  º 2  Ö " 


J   Œ 2  VVÔ  à 2, acţionează doar asupra atributelor à 2
(ale   ), deci nu pot acţiona asupra atributelor obiectului curent (deoarece nu li se
transmite poinetrul $ ). -e asemenea ele pot apela doar metodele statice. Pot însă acţiona
asupra atributelor unui anumit obiect prin operatorii  sau Uâ. J  à 2, àà2
prin specificatorul à 2astfel:
2 àà  c ± ,
c à 2  2 V  2!"  ÿ, c 11c Ö "
  

 (  u) V  à 2 se face astfel:


a)c 5 V 2 à""Œ 2 VVÔ c!"   ÿ5 // ) c   2 à
b)c 5. c Œ 2 VVÔ c!"   ÿ 5 // ) ccc c c 
c)c 5  . cU⌠2 VVÔ c !"   ÿ5 // ) ccc c 
În următorul exemplu, se determină fereastra reală (definită prin cele două puncte
diagonal opuse .×. *G) utilizând funcţiile statice :  : : H :H pentru a
determina domeniul minimal care include punctele din grafic.
/ / F u n c ţ ii º 2
o  !!o   ! o .0!!
o7 @@<  7@@<.
 H  H H 
 0' H . H.  .0!"H "H 7   '( <G3I -
  XH . !  .0! -- 
     £   
 L    ; K 
 0' L  ;+ K+ -
  £ 8 '  ;   K ×$ %6  7:  .×.( 
         6: *G(
    ×$ %6    7: H *G(   
         6:H .×.(  -
   L L "L ;L; KLK -
  £ >   £ ; £K -
  £ =.   ; £K -
   XL  -
 ××  ×.×.*G <<×0 
  ××  ×:  ×.×.(<<:×I.×× I
  ××  ×: ×*G(<<:×I.×× I
  ××  ×: H ×*G( <<:×I.×× I
  ××  ×:H ×.×.( <<:×I.×× I
 - 
× ×11.×. ×11*G <<×0 
 + £+ 5++ £)#+  ,,D I
   ;  ;4 ×11:  < ×11: % ×11:  64 -
 £  K  K4 ×11:H < ×11: H % ×11:H  £4££ -
  ;      6 6   - ,,; 
  K      )6 6  - ,,K 
£ £ 
  +++   L#)5# H> I=I7= 
L L9++: L9+:8 ';+ K+ 
 ×11.×. ×11*G A
      8 6L6, L9:8 ';8  K8  -
L9+:>    RSJ=I    L9:=. 
-

— cÊ  J 

O  a unei clase poate fi referită (apelată) şi printr-un   la ea.

23.02.12 78
+ O
C+ PO
?c - unui   V  se poate face astfel:
c    2! V 2 à""* V Ê ÿ!"  ÿ c11c c c0c

?c A   unui   V  se poate realiza astfel:


c   V Ê  V 2 à"" V J ‰c 11ccc uc c c  c

?c  unui   V  ( c ) :


c  ,! V Ô2  * V Ê ÿ!"   ÿ,
c

-e exemplu, pentru programul anterior, modificările necesare pentru a putea apela


cele două metode :׺i +/ale clase Ê 2 pot fi următoarele:


/ / P o int er i V  
Y
  ×   ; K 
 0' L  Y-
  £ 8 'Y
   L L "L Y-
  - :× !-×  - 
  - +/  ×  - 
   XL  -
   L / E/ EZ   
      >C  / E/; -,,> [/  [
Y
 - 
J

£ £ 
Y
 × -  ×11 :×  üü   
 :× !2ë ×11:×ë ×11+/ üü A   

üü  
üü -  ×11 !2 ë ×11:×ë ×11+/ üü  A 

 A( !A ×  KL"+  üü !" # 
  & 7 55  ( !&  üü !" >
-

23.02.12 79
+ O
C+ PO

Un alt exemplu, care utilizează pointeri la metode ( , - şi VÔ) este
următorul:


/ / P o int er i J 


o  !!
o   !
o .0!!
o7 @@<  7@@<.
 H  H H 
 0' H . H.  .0!"H "H 7   '( <G3I -
  XH . !  .0! -- 
    
 £   
 L    ; K 
 0' L  ;+ K+ -
  £ 8 '  ;   K  !4;; ;>C/ E/;;  
       ;>;CEZ ;; 
       !4KK K>VEZ KK  
       K>;V/ E/KK -
  L L "L ;L; KLK -
  £ >   £ ; £K -
  £ +    RSJ=I >  
       £ + 4#   4 5 
       ) +   4 45 -
  £ *×   GJHS=OI >  
       £ 4 4   + ) 
       ) +   + 4)  4) + -
  £ 0!   VIGGQR >  
       £ + 4#   4 # 
        #    4#  4 4# -
  XL  -
    L / E/ EZ    ,,D O 
      >C  / E/; -
      >;C  EZ ; -
      >V  EZ K -
      >;V  / E/K -
 - 
L L / E/ L EZ     ,,D O 
 + £+ 5++ £)#+  ,,D I
   ;  ;4L >C,L >;C4L >C64 -
 £  K  K4L >;V,L >V4L >;V6£4££ -
  ;+      )6 6   - ,,; 
  K+      6 6  - ,,K 
  ;      6 6   - ,,; 
  K      )6 6  - ,,K 
  ;        - ,,; 
  K       - ,,K 

£ £ 
  F #++   L#)5# H> I=I7= 
L L9#:9#+: 
 K0  6D    
D ;9#: ";+ "; ";- K9#: "K+ "K "K- 
 F+ F FL9F:9+:8 '6;9F:+ 6K9F:+ 
L / E/L EZ L9+:9+: 
 F+ F F +   
  8 6L6, L9F:9:8 '6;9F:8  6K9F:8  -
-  ×11 *3 ë ×11+ ë ×11*×ë ×110!
 F+ F F +    ( * 
- ,,>

23.02.12 80
+ O
C+ PO

 c º  22      


Anumite operaţii se pot exprima mult mai bine prin  . Nu se pot defini
operatori noi, dar se pot supraîncărca cei existenţi ( &½(½&&½&½ Uâ½ #$½!ÿ½ ½  ½
5, mai puţin operatorii *, "" , w" ), fără a modifica însă aritatea, prioritatea sau
asociativitatea.
º  22  se poate face cu:
a)c  2 VVÔ  - numărul parametrilor fiind egal cu aritatea operatorului minus unu,
deoarece un operand este chiar obiectul curent pentru care se apelează metoda (acesta
putând fi referit prin pointerul à),
b)c  2  - numărul parametrilor fiind egal cu aritatea operatorului.

 unui   se realizează printr-o funcţie (  sau VVÔ ) al
cărei   este compus din cuvântul   urmat de operatorul propriuzis (&½(½,) .

Exemplu:
,,      2 2    @@
o 7  !
o / .! o J  !
 / . !6 
0' 
/ .  ,,7   0  
/ .  / ."  ,,7    0
/ .  !6  ,,7    £
.× /ë× ×.× /ë

<<)××  
.× /×5 .× /ë <<)×5 × ÿ
  .× /×ë .× /ë.× /ë

<<)×ë × ÿ
X/ .  ,,  
 G. !  ,,G. 
£ L   ,,=0  
- 
/ ./ .  ! 9+:+ -
/ ./ .  / ."/  !9/G. !:  0K / -
/ ./ .  !6/  !9  /:  0K / -
.× /ë.× /11× ×.× /ë.
1/   9:  !9/G. !:  0K / - 6 ! -
.× /.× /11×5 .× /ë. << 2VVÔ ÿ
!6/ !9 !4G. !/G. !: 
 0K/   0K/ !4G. ! / / .O/   /  O -

/ .X/ .   9: -


 / .G. !     -


.× /×ë .× /ë.× /ë. << 2 ÿ


!6/ !9G. !/G. !: 
 0K/   0K/G. ! / / .O/   /  O -


£ / .L     -



£ 
   
/ .L 0 LJ   
/ .ELL 
ELL  
/ .LEL"" 
LEL   . ! 
-

23.02.12 81
+ O
C+ PO

 — c     àî ! Ô ÿ  !ÿ

    Ô  () se poate utiliza şi pentru obiecte, acesta fiind
supraîncărcat implicit şi realizează   datelor membru. -acă însă datele membru
sunt referinţe (pointeri) 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 obligă, în această situaţie, la redefinirea
(supraîncărcarea) acestui operator. Prin aceasta, conţinutul variabilelor dinamice sunt
identice, dar la adrese diferite, astfel încât dacă un obiect îşi modifică valorile, celălalt obiect
rămâne neschimbat.

Pentru o declaraţie de tipul  à Ô2 ccse va apela constructorul implicit, sau
cel cu toţi parametrii impliciţi, iar pentru o declaraţie de forma  à Ô2  Ô c se va
apela constructorul de copiere (şi nu operatorul de atribuire) ca şi la o declaraţie de forma
 à Ô2  Ô . Constructorul de copiere se mai poate apela dacă parametrul unei
funcţii este un obiect sau dacă funcţia returnează un obiect.

Exemplu:

,, à   V     @@


o 7  !
o / .! 
o J  !

    !6 
 G.. . 
0' 
    ,,7   0  
      "  ,, 0
  . .  ,, £

× ë× ×× ë <<)××  
× ×5 ×× ë <<)×
× ×% ×× ë <<)×

  0     "  ,,    
  0     "  ,,
  0     "  ,,
  0     "  ,,
  0     "  ,,
  0 1    "  ,,

X    ,,  
 G. !  ,, 
£ J0   ,,7  
£ L   ,,=0 
- 


23.02.12 82
+ O
C+ PO
      !9: 9+:?+? 9:+ -
        "/
 !9  /:  0K / -
    . ./
 G./  !9: 9:+ 
  4 + 44 9:/2+)% /,+ --
× ë× 11× ×× ë.
  M.( ×'$×  .(5&× .(
× ×$ 
!6/  !6   !6 
× × 11×5 ×× ë.
× .!.!(.! .(×.!
!6  !6   !6 
× × 11×% ×× ë.
× **(*  .(×*
    0     "/
    /   
    / +    0 /+ -
    0     "/  16 !/ -
    0     "/  /6 ! -
    0     "/  /6 ! -
    0     "/   0 /+ -
    0 1    "/   0 /1+ -
   G. !     -
£   L     -
£   J0  !6; !9++: ; 
  9:  !9  ;: 
 0K ;   ; -
  X     9: -
   G.. .
+    G.,+ -
!6/  !6   !6'
      ' 4 F4  +  /'  
!6 !9: 9:+ 
  + 44 
F+9:9:'9F: 4)%  9:9: 
9:?&? 9:4+   -  + F44 -
1   
!6 !9:  + 9+:??  9:9: 
  9:   
-
!6  !6   !6'
      ' 4 F4  + 
!6 !9: 9:+ 
  + 44 
F+9:9:4'9F:4 )%  9:9:4 
9:?+? 9:+   -  + F44 -
!6  ! 6?+?""6 
 0K    
-

£ 
   
   ' 
   J0  
  ' 'J0  

  ' 'L   
  M4'M '4'L   
'4L   . ! 
-

23.02.12 83
+ O
C+ PO

  c    Ô  & ½ U ½  ½  


Aceşti operatori (+=, U=, *=, /=) nu sunt supraîncărcaţi automat, deci dacă dorim
să-i utilizăm va trebui să îi redefinim (aşa cum se poate vedea în exemplul următor
supraîncărcarea operatorilor +=, U=).

Exemplu:
,, à   V     5%@@
o 7  !
o / .! o J  !


    !6 


 G.. . 
0' 
    ,,7   0  
      "  ,, 0
  . .  ,, £
  " 0     "  ,,Q0  '
   0     "  ,,Q0 
   0 4    "  ,,Q0 
× ë×5 × ë <<((((ë(×(
× ë×% × ë <<((((ë(×(
  0     "  ,,    
  0     "  ,,
  0     "  ,,
  0     "  ,,
  0     "  ,,
  0 1    "  ,,
X    ,,  
 G. !  ,, 
£ L   ,,=0 
- 
     Y-
        "/ Y-
    . ./ Y-
  "   0     "/ Y-
!6/  !6   !6' Y-
!6  !6   !6' Y-
     0     "/   / // /  / -

     0 4    "/     /   -


× ë× 11×5 × ë.× ×$  ×$ 5.


× ë× 11×% × ë.× ×$  ×$ %.


    0     "/ Y-


    0     "/ Y-
    0     "/ Y-
    0     "/ Y-
    0     "/ Y-
    0 1    "/ Y-
   G. ! Y-
£   L  Y-
  X   Y-
   G.. . Y-


£ 
  5 'A5    
 ! 1''%'  '% 
  L   
    7 L  - . ! 
-í 
ùùùíùí ù íUí í  í  í

23.02.12 84
+ O
C+ PO

  c   2V !&&ÿ2V ! UUÿ


Continuând cu exemplul anterior, dorim să suparaîncărcăm operatorii de
incrementare si decrementare, mai întâi cei prefixaţi (&& ½ UU ), unde nu sunt probleme
deosebite, apoi ce postfixaţi ( &&½ UU). Pentru a supraîncărca şi operatorii de
incrementare  & c vom adăuga câte o funcţie membru având un parametru de tip 
(care nu se va folosi, şi care automat la un apel va lua valoarea zero).

Exemplu:
,, à   V           @@
o 7  !
o / .! o J  !
    !6 
 G.. . 
0' 
    ,,7   0  
      "  ,, 0
  . . 

,, £
  " 0     "  ,,Q0  '
   0     "  ,,Q0 
   0 4    " 

,,Q0 
× ë×55  <<((( × 
× ×55 × <<(((× ×(((
× ë×%%  <<((( ×
×

×%% × <<(((× ×(((
  0     " 

,,    
X    ,,  
 G. !  ,, 
  "=0  "/  ,,  ;Y
 "7  "/  ,,;Y
- 
     Y-
        "/ Y-
    . ./ Y-
  "   0     "/ Y-
Y
     0     "/ Y-
     0 4    "/ Y-
    0     "/ Y-


 X   Y-
× ë× 11×55 × ×$  ×$ 5& <<55
× ë× 11×%% × ×$  ×$ %& <<%%
× × 11×55 ××  ×$  ×$  ×$ 5&× <<55
×

× 11×%% ××  ×$  ×$  ×$ %&× <<%%


 "  =0  "/ /  / - ,,  


 "  7  "/ !6; !95*: /;   9: 
 !9  ;:  0K ;   ;  / -

,,
 " 0   "/     =0/ - ,,
 " 0  "/   "  7 / -

,,


£ 
   ++ (    
  G  ( 
 +  (    . ! 
-

23.02.12 85
+ O
C+ PO

 c    
Conversiile sunt executate automat dacă:
a)c operanzii nu sunt de acelaşi tip ($,  cu cu   , ..., iar la atribuire se face
conversia valoarii expresiei în tipul variabilei)
b)c parametrul actual nu are tipul parametrului formal (se face conversia primului)
c)c tipul valorii returnate de o funcţie diferă de tipul acesteia (se face conversia valorii).

 — c      
 — — c    Ô   % Ô   Ôà  2 
Conversiile dintre un tip predefinit şi un tip abstract se pot realiza printr-un
2à  2  care să conţină un parametru având acel tip predefinit, iar ceilalţi vor fi
iniţializaţi.
Exemplu:
11c c   ; c €
o  .! o   ! o   ! 
.7 .  . 
 U  .   // m / n
0' = / / // 2à  2 V 2 
U" 0 X  // operator de simplificare
 =× == // functie prietenă
£ =0  !6>  // tiparire (mesaj)
- 
 =11= /A /N&!N
U"U 0 X
  .7  , ,  6 ! -
=× ==  XU6 6 - //  
 £ U=0  !6>
  >, 
    - 
.7 .  .'
 ' 7' 2' 
   - 
£ 
   
U;#  ;=0; 
UK & K=0K 
U =0 ;6K =0;6K 
U    =0  ;6 =0;6  
B 2=0;6 B2 =06;  . ! 
- 11c)  u ;
13<2
 12<F
B12<&
 &<3
'12<&
 '3<&
 23<&
2 3<&

23.02.12 86
+ O
C+ PO
O altă variantă în care se evită utilizarea unei funcţii prietene este de a defini o funcţie
membru (  ) care se va apela de către funcţia de supraîncărcare a  c de
înmulţire.
Exemplu:
11c c   ; c €
o  .! o   ! o   ! 
.7 .  . 
 U  .  .  // m / n
0' U .  .  // constr. implicit
U" 0 X  // operator de simplificare
U U  //Ê à
£ =0  !6>  // tiparire (mesaj)
- 
 UU .0+  .B 0 B -
U"U 0 X
  .7  , ,  6 ! -
 UU U  XU6 6 -
=× ==N  0 B - // V 
 £ U=0  !6>
  >,     - 
.7 .  .' ' 7' 2'    - 
£ 
   
U;#  ;=0; 
UK & K=0K 
U)  =0 
U 
 ;6K  =0;6K 
 ;6  =0;6 
' 2 =0;6 
'2  =06;  . ! 
- 11c)  u ;
13<2
 12<F
B14<2
 &<3
 B3<&
 23<&
2 3<&

 —  c    Ô   Ôà  2 % Ô    Ôà  2 


O altă problemă pe care o vom aborda în cele ce urmează este de a realiza o
conversie dintr-un tip abstract în altul. Pentru aceasta vom defini un 2à  2 c pentru
realizarea conversiei dorite.
În programul următor am definit tipul complex în cele două forme:
a)c    - clasa ,
b)c    ( ) - clasa >.
Conversia realizată face trecerea din forma b) în forma a).
Pentru a putea verifica rezultatele, se utilizează şi tipul 2V  predefinit.

23.02.12 87
+ O
C+ PO
Exemplu:
1 1 c      c      &  ; c  u
o   !o   !o  !!

#include Ëcomplex.hâ
,, 7 
 +   O D  üü  "
0' =  >  +   8.+ 
,,=7   ,,7 £74=
  O 
  J 
£ =0  !6>F 
- 
 ,   O J  üü   
0' 7  +   '+ 
, +B   c c  (Ô>
  >   
  8. 
£ =0  !6>F 
- 
77     ' O J' -
,11, +B0B(0 "!B("!  //  c c  (Ô>
  7>    B O6OJ6J -
  78.   J O -
  78.   J O -
£ 7=0  !6>F
   >FOJ -

==  >    8. O >  D8. -
,,==7  O  >   D 8. - ,,7 £74=
  =O  O 6 D -
  =J  O 6D -
£ ==0  !6>F
   >FO  D  -


£ 
   
+K # K=0  
,; 
 ;=0 ' 
 0 ;KO KJ 
   
  ; K . 
  ; KB   .  
 . ! 
- 11c)  u ;
23
%&(F9FFE@5A(2E224 
B %&(F9FFE@A(2E224
 %&(F9FFE@5A(2E224 
23

23.02.12 88
+ O
C+ PO

  c      

  — c    Ô   Ôà  2 % Ô   


Conversia dintr-un  c c c  într-un  c    se poate realiza prin
à  22       2à   2  corespunzător, printr-o funcţie
membru definită astfel:
 cc c { ...
  ;c ...
  Ê !ÿ‰
...
}
 à""  Ê !ÿ
{ ...
 ù à   Ê ‰
}

În exemplul următor se va realiza o conversie dintr-un număr raţional într-un număr


real:
11c  c> >cu   
o  .! o   ! o   ! 

 U  .  . V


0' U .  . 2à V 2 
×  €u Ô 
U 0 6U V 
£ =0  !6>   
- 
 UU .0  .B 0 B -
 =11×  ×  !<
 UU 0 6U  U6 6 -
 £ U=0  !6>   >, -
£ 
   
U; 5 UK# A 
U;6K =0 
 '  ' 
 4(@   
4(@   ''  . ! 

- 11c)  u
;
B;<3@
&(E
&(E

23.02.12 89
+ O
C+ PO

   c    Ô   Ôà  2 % Ô    Ôà  2 (prin operatori)


Acest tip de conversie se poate realiza şi prin oparatori (dar nu simultan şi prin
constructori). În programul următor este realizată conversia (prin    
2à) din trigonometrică (clasa >ÿîn forma algebrică (clasa ):
1 1 c      c      &  ; c  u
o   !o   !o  !!

#include Ëcomplex.hâ
 ,   O J  V  îÔ2
0' 7  +   '+ 
  >   
  8. 
£ =0  !6>F 
- 
77     ' O J' -
  7>    B O6OJ6J -
  78.   J O -
£ 7=0  !6>F
   >FOJ -

 +   O D  V  
0' =  >  +   8.+ 
×,     2à
  O 
  J 
£ =0  !6>F 
- 
==  >    8. O >  D8. -
+11×, ×, 0 "!   
  =O  O 6 D -
  =J  O 6D -
£ ==0  !6>F
   >FO  D  -
£ 
   
=K # K=0  
7; 
 ;=0 ' 
 0 ;KO KJ 
   
  ; K . 
   B   .   . ! 
- 11c)  u ; 
23
%&(F9FFE@5A(2E224 
B %&(F9FFE@A(2E224
 %&(F9FFE@5A(2E224 
23

23.02.12 90
+ O
C+ PO

 c  ' Ô !V ÿ

Clasele V  ( u sau  ) permit descrierea unor categorii de
clase, care diferă prin tipul unor atribute, acesta fiind descris generic (nu este precizat la
descrierea clasei ci doar la instanţierea obiectelor). O astfel de clasă abstractă va fi
particularizată într-o clasă concretă înlocuind tipul general cu un anumit tip ales.

 — c ' Ô !V ÿ


Funcţiile V  ( ) conţin şi parametri formali generici care vor fi
înlocuiţi cu parametri de un anumit tip concret.

Exemplu:
,,Π2   V   @@
o   !
o   !


×! ×7 +6




+J +; +K  ;K$;K -




£ 
   
  ' 
    ' ' 
  >; J  ' 


  ; K 
   ; K ;K 
  >; J ; K 
 . ! 
- 
1?cc,c cc<

Se observă că putem folosi ca parametri actuali parametri de diverse tipuri, pentru


care însă este definit operatorul â. -acă acest operator nu este definit pentru un tip de
dată cu care dorim să lucrăm, sau nu corespunde cerinţelor noastre, acesta va trebui
redefinit sau chiar funcţia va fi rescrisă conform cerinţelor.
Exemplu:
,,Π2  V   @@
o   ! o  .!
o   !



0   =


=>;=; =K  ;K$;K -


$ : $ $  × ×!  6A>1 




£ 
!6 !9+:    
!6' !9+: 
    ' ' 
  >; >; '  . ! 
-

23.02.12 91
+ O
C+ PO

  c  V 
O clasă V  este un model (şablon) din care se vor genera diverse clase
concrete prin particularizarea atributelor cu tip ambiguu ( ). O astfel de categorie de
clase care diferă prin tipurile atributelor sunt specificate printr-o clasă V  pentru ca
apoi să fie generate diverse clase specifice corespunzătoare anumitor    necesare
aplicaţiei.

Exemplu:
,, à  V    @@
o   !
o   !


×! ×7 +6


 O× =6C 
  
0' T   C =9: -
XT    9:C -
£ 7 T 
=>;T 
- 


×! ×7 +6


- O×7+611, ×O 

  +  C9: 
-


×! ×7 +6


+O×7+611:O 
=;C9+: 
    
C9:;;C9: 
 ; 
-


£ 
   
  
    C  
O×7 ×6 !
    C C7 T 
  >;  C>;T 
  
    V  
O×7 ×6H 
    V V7 T 
  >;  V>;T  . ! 
-

Se observă că în exemplul anterior s-au utilizat nu numai  c  ci şi   c


 c .
Argumentele pot fi tipuri de date (   > ) sau constante (> c
   ), de exemplu:
×! ×7 + ×* !6

23.02.12 92
+ O
C+ PO

  c     V 


În cele ce urmează ne vom referi la poziţia codului (care se expandează conform
cerinţelor utilizatorului) corespunzător obiectelor V . Codul V  (corpul
funcţiilor membru) trebuie să fie vizibil acolo unde sunt utilizate elemente V .
Există două metode (posibilităţi) de implementare:
a)c V  àV  ± tot codul unei clase V  este scris în fişierul   (definiţii de
clase, funcţii precum şi implementarea funcţiilor), acest mod putând fi precizat fie prin
opţiunea de compilare 8 , fie prin meniul    ,      ,   &&   ,
opţiunea >      ;c*c , î V urmând să includă acest fişier cu
toate descrierile.
b)c V  V  ± doar declaraţiile elementelor V  sunt scrise în fişierul  
iar implemetarea făcându-se separat, în alt fişier. Acest mod trebuie precizat prin
directiva o   , utilizând opţiunea de compilare 8  (urmează o efinire
publică a instanţierilor unor elemente  ) şi opţiunea 8 (urmează o declaraţie
e ternă a instanţierilor  ). Acest mod este ilustrat în următorul exemplu simplu:
,, c> ciiicJ  @@
o   !

o   !
o 7E=0 )!
o/!× %G/


£ 
   
T +C C7 TC   >;  C>;T 
T #V V7 TV   >;  V>;T  . ! 
-


,, c> ciiicJ  @@


o   !

o   !
o 7E=0 )!


0   =  


£ T = 7 T!6>
      
    > 
  +  C9: 
-


0   =  


=T = >;T
=;C9+: 
    C9:;;C9:  ; 
-


,,8c> ciiicJ  @@


0   =  
 T  =C9: 
  
0' £ 7 T!6 
=>;T - 


o/!× PG/
K0T  +T + 
K0T   +T # 

23.02.12 93
+ O
C+ PO

 c© %    

La  c  c    al unei aplicaţii se disting următoarele două


 :
a)c  2  2 à  ± corespunzătoare 22   aplicaţiei (à Ôà   ),
b)c à Ô     2 à ± corespunzătoare à22   aplicaţiei (Ô ).

În cele ce urmează ne vom referi la următoarele tipuri de relaţii între clase:


1)c [à2  ± relaţie de cooperare între clase ± corespunzătoare unui verb oarecare din
specificaţie, diferită de relaţia  Î (de exemplu relaţia *  ±  ).
Relaţia corespunzătoare dintre obiecte aparţinând unor clase asociate se numeşte
î . O asociaţie poate fi    sau    (dacă un obiect   este pus în
legătură, de exemplu prin pointeri, cu mai multe obiecte  , de acelaşi tip).
Această relaţie se reprezintă grafic (după metodologia OMT) în plan orizontal astfel:
   c    c (c
C1 C2 C1 C2

2)c [îî  ± relaţie de    prin care obiectul  este 2 à în obiectul
 (verbul caracteristic este   ), şi evident că poate fi    sau   "

  c    c (c
 C1 C2 C1 C2

3)c º2   î   V  ± relaţie prin care sunt păstrate (  )
caracteristicile unei clase (c u) şi sunt adăugate diferenţele specifice, formând o
nouă clasă ( ). J  c permite   ucc definit în clasa de bază
(à 2 à) şi în noua clasă (à Ô à). -eci, o    este o à2   a unei
   (verbul caracteristic fiind  ), iar o    este o î   a unei
  . Această relaţie este   , iar    formată de mulţimea claselor
aflate în această relaţie (construită pe verticală) se numeşte     2 à. Atât
specializarea cât şi moştenirea poate fi simplă sau multiplă, reprezentarea făcându-se în
plan vertical astfel:

C1 C1 C1 C2

 C2 C2 C3 C3

 *  uc *  uc J  c


  c    c    c
Se pot obţine în felul acesta şi ierarhii spaţiale de clase, având relaţii atât pe
orizontală cât şi pe verticală.

23.02.12 94
+ O
C+ PO

 — c ©  [à2 

Prin această relaţie dintre clase se


  c
modelează o î  între obiectele instanţiate C1 C2
 1  2
(care depind unul de celălalt). > unei
asociaţii se face printr-un  (nume dat

 c

 c
extremitatăţii unei asociaţii). Implementarea unei
asociaţii se poate realiza astfel:
a)c     ± clasa à2   conţine un
atribut de tip   spre clasa à2 ,  c
b)c    2 à ± cu atribute şi comportare O1 O2
proprie, fiecare legătură fiind o instanţă a
acestei clase.
Asociaţiile pot fi      sau     , iar relaţiile de asociaţie pot fi
 ,  sau -are. Pe de altă parte, asociaţiile pot fi    sau     
(acestea din urmă putând fi eventual şi  c  cc sau c  ).
  c      sunt caracterizate prin numărul de instanţe ale claselor
care se află în asociaţie, iar pentru a reprezenta direcţia de asociaţie se pot utiliza săgeţi.
Oc   c      poate să fie
  c ± !
  (instanţele formează o   ), sau C1 C2
poate să fie   (instanţele formează o c
).
.c   c V  2  2  à 2 
2 2  pune în relaţie două clase printr-un
  c
   (atribut care reduce multiplicitatea C1 2 2   C2
asociaţiei printr-un 2  pe care trebuie să-l
îndeplinească obiectele asociate pentru a intra în
relaţie).
La   relaţiilor de asociaţie putem aplica cele două metode amintite
anterior:
a)c   spre clasa à2  încuibăriţi în clasa à2   în funcţie de tipul relaţiei
de asociere astfel:
±c pentru relaţia de   c    se adaugă clasei asociante încă un atribut de tip
pointer spre clasa asociată, împreună cu relaxarea încapsulării pentru traversarea
asociaţiei alegând o metodă convenabilă dintre următoarele variante:
?c modificarea protecţiei datelor membru implicate în  Ô 2,
?c utilizarea de metode sau clase ,
?c extinderea interfeţei prin metode de 22à 2V .

±c pentru relaţia de   c    se adaugă clasei asociante mai multe atribute de tip
pointer în funcţie de tipul asociaţiei şi ordinul de multiplicitate astfel:
?c dacă este relativ mic, se vor adăuga  à 2,
?c iar în caz contrar se poate utiliza un  

23.02.12 95
+ O
C+ PO
?c dacă relaţia este supusă unor restricţii de ordonare, se pot utiliza à  .
b)c  2 à distincte care realizează
abstractizarea asociaţiilor dacă legăturile au V 
proprietăţi şi operaţii proprii (nemaifiind C1 C2
necesară adăugarea de atribute claselor care se
à
asociază), această metodă utilizându-se în
special în cazul asociaţiilor bidirecţionale de tip
 ), sau o legătură poate conecta obiecte de
clase diferite.

Exemplu:
,, à à2 @@
o   !
o   !
o  ?O×,×($?
£ £ 
    
     
O×.× ,,C/   
O×,× ë(  × 
  0 
       
0(,×.  L0 0 
   J;  1 -
 !  


     


O×.× H'O×.× H%6.× 
O×,×  'O×,× HH%6  × 
     '  
0 %6,×C   L0 0 
   J;  1 -
 !  . ! 
-

 ,, à à2  @@ › $ %


o  ?O×.×($?
 O×,× O×.× - 
0' T 7 O×.×  
 7 /  
 7 <  
-

 ,, à à2 @@ › º%



 O×.×  6£  
0' T /   + 
£ /   
£ L  
 68 
  
XT /   
-

23.02.12 96
+ O
C+ PO

 ,, à à2  @@ › $ %$""


o T 7 !


T 7 T 7 T /  60



£0 
-
 T 7 7 / 
  £4 6;£48 
 ! "";9:4 
 2 
-
 T 7 7 < 
 /  £4 6;£48 
 ! /   / , 
;9:4;9:/   4 
   -
 + 
-

 ,, à à2 @@ › º%$""


o   !
o T /  !


T /  T /   (



( £  9(: 
    £9: 
-


£ T /  /  


 (   -/   
  /    
   4( 
£9:£9:  =0£9: £9:£9: 
£9:=0 /    
-( -
 ! 1/    
-


£ T /  L 



      £9:? ?    
-


 6T /  8

 £ 
-

 T /  

  
-


T /  XT /  



  9:£ 
-

23.02.12 97
+ O
C+ PO

  c ©  [îî 

)  cc este cea mai puternică


relaţie de asociaţie, în care o clasă este o  c
C1 C2
componentă a altei clase, deci relaţia este binară,
unidirecţională, iar relaţiile multiplicative sunt de

 c

 c
tip 1-. Prin această relaţie dintre clase, un obiect
al clasei  este parte constituentă,   ,
al clasei , deci verbul caracteristic este c
 ( ). Obiectele constituente pot fi  c
independente sau doar componente ale obiectului O1 O2
care le include.

Această relaţie (notată cu simbolul  având semnificaţia  ) are următoarele
două proprietăţi de bază:
a)c    : -acă    şi   , atunci   ,
b)c  àV  : -acă    atunci   .

Relaţia de agregare poate fi:


a)c   ± numărul şi tipul componentelor sunt fixe,
b)c   Ô  ± permite un număr variabil de obiecte de acelaşi tip,
c)c 2 à ± acceptă acelaşi tip ca tip agregat şi agregant

Exemplu:
,,   îî @@
o   !
o   !
o  ?O×[/($?


£ £ 
    
     
O×,× (  × 
  0 
       
0(,×.  L0 0 
   J;  1 -
 !  


     


O×,× H'O×,× H%6.× H%6  × 
     '  
0H%6,×C   L0 0 
   J;  1 -
 !  . ! 
-

23.02.12 98
+ O
C+ PO

 ,, à[îî  @@ ›  [ 


o  ?O×.×($?
 O×,×O×.×O
0' T 7  + 
£ /   
£ L  
 7 /  
 7 <  
-

 ,, à[îî  @@ ›  [  




o T E8.!




T 7 T 7  T



-


£ T 7 /  



T/   
-


£ T 7 L 



TL  
-


 T 7 7 / 


  T 6;T8 
 ! "";9:4 
 2 
-


 T 7 7 < 


 /  T 6;T8 
 ! /   / , 
;9:4;9:/   4 
   -
 + 
-

 ,, à[îî @@



›  
 O×.×  6£   ,,A fost descrisă la  c .@@
0' T /   + 
£ /   
£ L  
 68 
  
XT /   
-

 ,, à[îî @@ ›   


o   !
o T /  !


Y ,,A fost deja descrisă la  c .@@




23.02.12 99
+ O
C+ PO
În următorul exemplu se va folosi o clasă A  pentru listă simplu înlănţuită care
utilizează clasa ù V pentru un nod al listei şi clasa à :

,,A  à @@


o   !
o   !

o=  

  ! = J 


I 6G. 
0' I =  I 6 .+ J G. . -
 G  
 J   
-

 G × I 670 
0' G  70+ -
£ 8=  
 J   
-

£ G 8=  
70 I 6070  ! 04G.004G. 04G. I   + -
 70 I   + 
-

 "×× I 60 
0' 
J  G "G 0G70 -
=  0   04J -,,    
£  0  004G. -,,£  
  0 1  01+ -,,;   
-

£ £ 
  
G G G8 G8 G8## 
J   G 
 ! 1 
 
      
-
. ! 
-

23.02.12 100
+ O
C+ PO

  c  )  !  ÿ

Există posibilitatea definirii unei clase (Î ) în interiorul altei clase (ca şi
atribut al cesteia). Această posibilitate există de fapt şi la structuri ( ) şi uniuni (  ).
-eclararea obiectelor din clasa Î c se poate realiza utilizând  c c
 ("") aşa cum se poate vedea în exemplul următor:
,, à AVÔ 2 @@
 7 ,,7; K 
   ,,O
 L  ,,L ; K7  
  ; K ,6
6,
- ,6
6,
- 

£ 

77 
7L L 
,,
-

Utilizarea obiectelor din clasa Î c se poate realiza utilizând  c c
 ( ) după cum se vede în următorul exemplul:

,, à A2  Ô @@


o   !
o   !
 7 ,,7; K 
   
 L  ,,L ; K
  ; K 
0' L   ;++   K++ ;;+ KK+ -
£ L    ??;??K?? -
- 
L 7  
0' 7L L    7 L  -
£ L  7 L     -
- 

£ 
  
7L Q  QL     
77Q # 7L     
. ! 
-

23.02.12 101
+ O
C+ PO
Evident că din clasa Î c ( ) nu avem acces la elementele clasei din care
face parte ( ). -acă se doreşte acest lucru, atunci se poate proceda ca şi în următorul
exemplu:

,, à A2  Ô @@


o   !
o   !
 7 ,,7; K 
   
0' 7    -
  ×
  ×
 L  ,,L ; K
  ; K 
0' L   ;+   K+ ;;+ KK+ -
£ L 7   ??;??K??( -
- - 

,,£ 7L L 7   ??;??K??( -

£ 
  
7# 
7L Q  QL  
. ! 
-

Se poate observa în exemplul dat că referirea atributului  al clasei  nu este


permisă din interiorul clasei încuibate (vezi funcţia   descrisă în ambele variante), motiv
pentru care clasa  a fost declarată prietenă.
În următorul exemplu sunt imbricate clasele © ©  ©:
,, à A2  Ô @@
o   !
o   !
 0 
 ' ; 
0' O ' ;  !4;; -
 O O 
 02 
 ' K 
0' O ' K  !4KK -
 O# O# 
 03 
 '  
0' O# '   !4 -
£ L O O 
- 
£ L O 
- - 
£ OOL O   ??; -
£ OOO#L O O' 'L    ??'K?? -
£ 
  
OQC 
OOCQV 
OOO#CV\# CV\L QC CQV 
. ! 
-

23.02.12 102
+ O
C+ PO

  c ©    

Prin această relaţie putem modela       dintre clase două sau mai multe
clase. Pornind de la o clasă de bază (generală) se pot  noi clase (prin diferenţele
specifice). Obiectele clasei derivate V à2 atributele şi metodele clasei de bază la care
se vor adăuga noile elemente caracteristice (vor fi  ), ceea ce permite reutilizarea
resurselor deja pregătite în clasele de bază (pentru obiectele similare). Verbul caracteristic
al acestei relaţii de   u este c ( 5 c c cc5 Ëc( câ).
J  permite păstrarea elementelor (date şi
funcţii ale) unei clase c u (  ), cu definirea de Ob
noi elemente construind o nouă clasă   (  ),
formând în felul acesta $ de clase. J   poate

c c5c
Cb
fi şi     dacă o clasă moşteneşte mai multe clase.
-eoarece această relaţie este tranzitivă se utilizează şi
termenii de  şi .

cc5c
Od
C1 C1 C1 C2
à2  

î  

C2 C2 C3 C3 Cd

*  uc *  uc J  c


  c    c    c

  — c    

Relaţia de derivare se poate descrie prin construcţii speciale fără a mai fi nevoie de o
relaxare a încapsulării, aşa cum a fost necesară la relaţiile prezentate anterior. -acă într-o
aplicaţie se poate utiliza relaţia de  , este de preferat în locul    sau 
pentru că avem instrumente specializate în limbajul de programare.
O clasă derivată se declară astfel:

 cc   " "  uc c


{
c c  c c c
}

23.02.12 103
+ O
C+ PO

" c   c c u poate să conţină şi modificatorii de protecţie (J Ê)
  , c sau  , deci o derivare poate să fie   ,  sau  ,
accesul rezultat fiind redat în următoarele tabele.

$ &
Accesul în clasa de bază J Ê Accesul în clasa derivată U o
  * l
& £ o &
   

csau     


o £ o o
  neschimbat (csau  ) U £ U U

-e exemplu, dacă cele două


clase sunt descrise astfel: a b c
Cl_Bază
class Cl_Bază  Ô 2
{
x by cz
private: 5a5 Cl_-erivată
protected: 5b5
public: 5c5
}
a b c
Cl_Bază
class Cl_-erivată : J c Cl_Bază  2 
{
x bcy z
private: 5a5 Cl_-erivată
protected: 5b5
public: 5c5
} a b c
Cl_Bază
atunci protecţia membrilor din clasa  
derivată este redată în schema bcx y z
alăturată. Cl_-erivată

Ordinea de executare a 2à  2   la instanţierea obiectelor dintr-o clasă


derivată:
 ccc& c  c  ccuc c  c  c  (se
construişte cadrul, apoi se adaugă diferenţele specifice).
Ordinea de executare a à  2   la distrugerea obiectelor dintr-o clasă
derivată:
 ccc& c  c  c c c  c  ccu.
Constructorul clasei derivate transmite parametrii necesari constructorului clasei de
bază prin apelul direct al acestuia astfel:
  ( 5 ) " uc( 5 ) { 5cc} //  
sau
  ::   ( 5 ) " uc( 5 ) { 5cc} //  

23.02.12 104
+ O
C+ PO
-eoarece relaţia de derivare este poate cea mai importantă relaţie dintre clase, sunt
oferite facilităţi de implementare, care permit următoarele facilităţi:
?c  cc ±   uc scris o singură dată după care se moşteneşte,
?c &   ±    ucprin derivarea de noi ramuri dintr-o ierarhie,

?c    ± într-oc $ cc  se poate implementa o comportare   ,

?c Î ± & ± relaţia de derivare oferă posibilitatea Î$  resurselor
simultan cu $  spre modificare şi extensie.

Relaţiile de derivare (de fapt şi celelalte relaţii dintre clase) sunt stabilite la
compilare, deci nu se mai pot modifica pe parcursul execuţiei. Mai trebuie cunoscut faptul
că prin        constructorii, destructorii, elementele prietene (funcţii,
clase sau metode  ) şi nici operatorii redefiniţi.

Exemplu:
,,    @@
o   !
o  .!
o   !


  
××1!6 
0' !6  !9  :  0K  -
    9: -
!6>     -
- 

£ L    >   -

 ;1 
 
0£ !/ 
0' ;!6 5& /9+: -
 ; -
!/   / -
- 

£ L ;   / >   -

£ £ 
   
#) L  
;(4# L ( 
6 5*A L 6 
;6F ;4%& L 6F  . ! 
- 

23.02.12 105
+ O
C+ PO
Conversia unui obiect dintr-o clasă derivată într-un obiect aparţinând clasei de bază
este permisă, invers însă nu (sursa trebuie să acopere destinaţia):
Contra_Exemplu:

,,à  w @@


Y
£ £ 
   
#) L  
\( L (  ù ›  a  "     -;"";!ÿ-
6 ( L 6 
\6F \ L 6F ù ›  a @"      -;"";! ÿ-
- . ! 

Pentru o funcţie care are ca parametru formal un obiect al clasei de bază este permis
apelul având ca parametru un obiect al clasei derivate, invers nu (o funcţie care are ca
parametru formal un obiect al clasei derivate, nu poate fi apelată având ca parametru actual
un obiect al clasei de bază).
Exemplu:
,,à   @@
o   !
o  .!
o   !


  
0  !6 
0'   !9: 9+:?+? 9:+ -
!6  !9  :  0K  -
"  !9  :  0K  -
X   9: -
!6>     -
- 


£ L    >   -




 \0' 
 
0£ !/ 
0' \ /?? -
\!6 /9+: -
X\ -
!/   / -
- 


£ L \   / >   -




£ R 8' L  -


£ R 8'E6 L 6 -


£ £ 
   
\(# L ( 
( L  
R 8' 
R 8'm 
\60 \4)5* L 60 
6B N L 6B 
R 8'60 R 8'E0 
R 8'6B R 8'EB  . ! 
-

În exemplul următor se porneşte de la clasa de bază 'u şi se construieşte


clasa derivată c:

23.02.12 106
+ O
C+ PO
,,   @@
o   !
o   !
o  ?O×*($?


£ £ 
    
     
T EC CL  
  0 
       
0C7 /  L0 0 
   J;  1 -
 !  


     


T E6V T E V4/   V4L  
     '  
0V47 <  L0 0 
   J;  1 -
 !  . ! 
-

 ,, àÔ
@@ ›   
 O×CB 
0   6£  
0' T < + 
£ /   
£ L  
XT < 
-

 ,, àÔ @@ ›    


o   !
o T <!
T <T < (

( £  9(: 
    £9: 
-
£ T </  
 (   -/   
  /    
   4( 
£9:£9:  =0£9: £9:£9: 
£9:=0 /    
-( -
 ! 1/    
-
£ T <L 

      £9:? ?    
-
T <XT <

  9:£ 
-

23.02.12 107
+ O
C+ PO

 ,, à- @@ ›   


o T <!
 T E0' T < 
0' T E + 
 7 /  
 7 <  
- 

 ,, à- @@ ›    




o T E!


T ET E T < -
 T E7 / 
   ! ""£9:4  2 -
 T E7 < 
 /   
 ! /   / , 
£9:4£9:/   4 
   -
 + 
-

În exemplul care urmează, datele  c (din clasa de bază ) au fost declarate
 2 c deoarece clasa derivată ( ) le referă. La clasa derivată am utilizat
modificatorul  cpentru a putea utiliza şi pentru coperaţia ,×  (P!C).

,,L .D ET   @@


o   ! o   ! o   ! o  !! 
  /B  ;  ;6; -
  × 
××
   
0' 
L   ;++   K++ 
  * ×L L 
 7  L L 
- 
L L   ;+   K+ ;;+ KK+ -
  L * ×L L  B /B;4L;/BK4LK -
 L ,× L L  * ×L+ -
 ,  ×
    
0' 
7  ;++   K++   +
 ;;+ KK+  -
  * ×L L
 L 7   7 L4 -
- 
£ £ 
L L# ) 77+ + 5 
7,× L  7 7  0  L 
   7 7  0  L  . ! 
-c 11c)  u     ; 
, ,× ×  (

Se observă în exemplul de mai sus că rezultatul  este cel dorit. Acest neajuns îl
vom rezolva mai târziu declarând anţa ca   c    (pentru c  ).

23.02.12 108
+ O
C+ PO
Faţă de moştenirea simplă, în care dintr-
o singură clasă de bază se derivează una sau Cb  —  
mai multe clase derivate (specializate),
moştenirea multiplă presupune existenţa mai
Cd1 Cd2 
multor clase de bază din care un sau mai multe
clase moştenesc diverse caracteristici. J  c  c J V  

-eclararea unei clase derivate din mai multe clase de bază se face astfel:
 cc u1c { 5cc}
 cc u2c { 5}
 cc   cc : J Ê u1,ccJ Ê u2
 { 5 }

undeJ Ê!± Ô 2½ 2 ½  .

-atorită moştenirii multiple o clasă de bază poate fi


[V
prezentă în mai multe exemplare într-o clasă derivată, aşa
cum se poate vedea în exemplul alăturat, unde datele
membru ale clasei   c vor fi moştenite în două J V -Và 2
exemplare de către clasa 4 c(unul prin clasa  ,
altul prin clasa J ) şi pot fi referite prin operatorul

de rezoluţie ( "") aplicat clasei prin care se face moştenirea
( ).

Această moştenire repetitivă a unei clase de bază


este corectă şi se poate utiliza astfel:  a   a 
  a ±  "5[ Ô 5 ‰
  -—"  a ±, ‰  - —  - 
  -"  a ±, ‰
  à - "  -—½ -
 à - 
 ±, -—""[ Ô , -""[ Ô  ‰

-acă dorim realizarea unei singure copii a


atributelor moştenite, vom folosi moştenirea multiplă  a 
 :
  a ±  "[ Ô  ‰
 - —  - 
  -—"   a ±, ‰
  -"   a ±, ‰
  à - "  -—½ -  à - 

 ±,[ Ô , ‰

23.02.12 109
+ O
C+ PO
Aşa cum se poate vedea în exemplul următor, vom avea un nume de  cşi un
nume  .

11cc c c c c     c c c==


o   !
o   !
o  .!
 [ !  0  !6 
0' 8 !6  0K  -
- 
 :! 0' [ !  
0   H 
0' >!6  .8  H. -
- 
 *!× 0' [ !  
0   L 
0'   !6  08  L 0 -
- 
 , 0' :!  0' *!×  
0   G 
0' 7!6!: !6!*  .  0   
>!: .   !* 0 G  -
£ =0   >:! ! 
  *!× ! 
H  H 
L L  
G G   -

- 
£ £ 
   
, 7   # #++ % =0 
 . ! 
- 11c)u ;
:! 7
*!×  
H  #
L #++
G %

23.02.12 110
+ O
C+ PO

-acă dorim ca datele membru să fie prezente într-un singur exemplar în clasele
derivate, atunci vom utiliza  c   . O clasă de bază devine     prin moştenire
dacă se declară aceasta prin cuvântul    c plasat înaintea clasei (devenind astfel clasă
virtuală faţă de clasa derivată).

Programul anterior modificat astfel încât   c să fie memorat într-un singur


exemplar este următorul:

11cc c c c c     c c c==


o   !
o   !
o  .!
 [ !  0  !6! 
0' 8 !6  0K  -
- 
 :! - × 0' [ !   //   ceste  c    pentru J 
0   H 
0' >!6  .8  H. -
- 
 *!× - × 0' [ !   //   ceste  c    pentru  
0   L 
0'   !6  08  L 0 -
- 
 , 0' > 0'    
0   G 
0' 7!6  .  0   
[ !  :!  . *!×  0 G  -
£ =0   ![ ! ! 
H  H 
L L  
G G   -
- 
£ £ 
   
, G0 # #++ % =0 
 . ! 

-  1 1 c ) u ;
[ ! G0
H  #
L #++
G %

23.02.12 111
+ O
C+ PO

Pentru o ierarhie ca cea din figura alăturată,


în care avem clase virtuale (O) şi nevirtuale (), se [
execută mai întâi constructorii claselor de bază
virtuale apoi cei ai claselor nevirtuale, iar
constructorul clasei de bază se va executa pentru o a  ù 
singură dată toate exemplarele virtuale şi câte o dată
pentru fiecare exemplar nevirtual. 

Exemplul:
11ccc  c#$ c c    1     c c c ==c

o   !


o   !
 8 0' 8!6   8 -
 <£  0' 8 
0' <!6'8'   <' -
 7£  0' 8 
0' 7!68   7 -
 0' 8 
0' !68    -
 I 0' I!6   I -
 D 0' D!6   D -
 H0' < 0' 7 0'  0' I £  0' D 
0' H!6.8. <. 7. . I. D.
   H. -
£ £ 
   
HQ'Q'  . ! 

-  1 1 c ) u    ;
[1)(
1)(
C1)(
,1)(
[1)(
*1)(
 1)(
1)(

23.02.12 112
+ O
C+ PO

  cÊ   V     à V 

º  22  (  ), prin redefinirea unor funcţii sau metode, permite
alegerea la  - (_  a funcţiei sau a metodei dorite prin   acesteia,
fără a mai putea alege la execuţie.

Ê VàV permite ca la execuţie să se decidă ce metodă să fie apelată, oferind


o facilitate a metodelor din clase aflate în relaţie de derivare. Prin polimorfism se execută
acţiuni diferite prin mesaje cu semnături identice asupra obiectelor de tip diferit (obiecte din
clase diferite răspund diferit la acelaşi mesaj).

-ouă obiecte sunt    dacă aparţin aceleaşi clase (evident) dar şi două
variabile
a)c de tip  c c ccu, respectiv  c c c ,
b)c de tip   ( c) c ccu, respectiv   c c  .

Metodele unei clase pot fi:


?c  à2metode î à 2, la  - (_  fiind fixată adresa de apel a
metodei, fără posibilitatea de a o schimba la rularea aplicaţiei,
?c Ê V2metode î  V2, care permit întârzierea deciziei referitoare la adresa
de apel a metodei, până la execuţie.

î  unei metode (  ), înţelegând prin aceasta cenexiunea logică dintre o
entitate şi o proprietate a acesteia (corespondenţa dintre un mesaj trimis unui obiect, adică
ordinul de apel, şi metoda care se execută ca răspuns la acesta) poate fi:
?c V à 2   Ôî compilatorul şi editorul de legături vor fixa adresa
metodei care se execută, fără ca aceasta să mai
poată fi modificată pe parcursul execuţiei 
?c   V2   Ôî   compilatorul va construi un tablou de adrese ale
metodelor posibile de apel, iar determinarea
adresei metodei dorite se va efectua doar la
execuţie. În funcţie valoarea pointerului spre clasa
de bază, care poate conţine şi adresa unui obiect al
clasei derivate, se va alege metoda
corespunzătoare.

23.02.12 113
+ O
C+ PO

 — c  ›  


Implicit, o metodă este legată static ( 0, la compilare), iar dacă se doreşte o
legare dinamică ( , la execuţie) se va declara     prin scrierea cuvântului 
înaintea metodei. O metodă virtuală a unei clase de bază, poate fi moştenită într-o clasă
derivată sau poate fi redefinită (înlocuită -   ). O metodă se declară vituală în clasa
de bază (nu se poate declara virtuală doar într-o clasă derivată.
Se poate observa în exemplul următor că dacă dorim ca rezultatul să fie
³CB<* -×´ şi la apelul funcţiei /, trebuie să declarăm funcţia  virtuală, altfel
rezultatul ar fi ³CB<CB´.

,,J        @@
o   !
o   !


 7' 0' 


- × £    < -
- 


 70' 7'
 0' £    £  -
- 


£ .7'60 04 -




£ 
   
7'6L' 7' 76L 7 
L'4 L4 ,,G./  
.L' .L ,,G.
  L'   L 
 . ! 
- 

În exemplul următor vom utiliza variabile de tip referinţă la clasa de bază, respectiv
la clasa derivată.
,,J        @@
o   !
o   !


 7' 0' 


- × £    < -
- 


 70' 7'
 0' £    £  -
- 


£ .7'ë  -




£ 
   
7'Q' 7Q 
Q' Q ,,G./  
.Q' .Q ,,G.
 . ! 
-

23.02.12 114
+ O
C+ PO
În următorul exemplu se poate deduce necesitatea legării dinamice, pentru a putea
calcula corect distanţa de la un punct la un cerc şi respectiv la un segment (la o dreaptă).
-in păcate pentru că metoda 7   există în dublu exemplar (/ . şi 0 ) apelul
nu se poate efectua cum ar fi de dorit!
,,J        @@
o   ! 
o   ! 
o  !! 
  /B  ;  ;6; -


 L  0    ; K 


0' L   ;+   K+ ;;+ KK+ -
L L "L ;L; KLK -
£     L L  B /B;4L;/BK4LK 
 7  L L   L+ - 
- 
 70' L     
0' 7  ;+   K+   OL ;+ K+ O -
   L L L 7; K  7 L4 -
- 

 / .0' L 
 0' / .  ;+   K+L ;+ K+ -
/ .L "LL L -
- 
 0 0' L 
 0' 0   ;+   K+L ;+ K+ -
0 L "LL L -
- 

 /.0' / . 0  
0' /.L / L / ./  0  -
   L 7 L 8/ .; / .K 
L <0 ; 0 K 
  < 7 
  '8 7 
  8 < 
  0', 
  /B 0604604'604 
 6/, -
- 

£ £ 
   
L L# ) 
77+ + 5 
77  L  7 7  0  L 
   7 7  0  L 
L 8+ + <* % 
/.8<8 < 
8</ .7  L  /.8<  0  L 
   /.8<  0  L 
 . ! 
-

23.02.12 115
+ O
C+ PO
Aproape orice V      , chiar şi metodelec  , metodele  
(dar nu şi funcţiile  )  (dacă nu se redefinesc prin funcţii  ) şi
  , în schimb   şi  c   fi virtuale.

În exemplul prezentat în continuare, al doilea produs (2<3 4<@E<&@) nu va fi


afişat dacă operatorul de înmulţire a două numere raţionale nu este declarat  ,
(deoarece operatorul 6 va apela operatorul de înmulţire pentru € în loc de  cum ar
trebui, cşi c fiind din clasa ). Se observă că la înmulţirea a două obiecte din clasa €nu
sunt tipărite fracţiile care se înmulţesc, pe când la înmulţirea a două obiecte din clasa 
fracţiile care se înmulţesc sunt tipărite.

,,L .Q0 T  @@


o   !  o   ! 
 = 0   0 B 
0' U +   0 B -
- × =×  =ë  U060 B6B -
U" 0 6U"  6 !6 !  -
£ =0!6>   >0,B -
- 
 0' U 
0' D +  U  -
U 0 6U"
 UU6 !6  !4=0 =06 
=0      -
- 

£ £ 
   
=0 # B) 5  
0=00    B=0B    
06B 
0=00    =0    
 # ) 5 = 
=0    =0'    
6 =0    
 =0     
 . ! 
-c 11c)  u ;
2<3
N4<@
E<&@
E<&@
2<3
4<@
2<3 4<@E<&@
E<&@
2<3 4<@E<&@
E<&@

23.02.12 116
+ O
C+ PO

  c   Ôà  2 Ô 2VVÔ      

În clasa de bază se poate declara o comportare generică având un nume şi o


semnătură unică (urmând ca fiecare specializare să ofere propria metodă specifică) prin:
a)c metodec  care se declară astfel:

 cc> cc cc2"   3cc{ }


b)c metodec  declarate în forma:

 cc> cc cc2"   3c@


Ambele variante permit înlocuirea acestei metode cu o metodă proprie clasei
specializate derivată din clasa de bază, permiţând astfel solicitarea unui comportament
general, dar propriu fiecărei specializări.
J c        , rolul lor fiind doar de a declara tipul, numele şi
parametrii unei metode abstracte care urmează să fie redefinită concret în fiecare clasă
specializată.

O 2 à este Ôà  2  dacă ea conţine cel puţin o   c c   c . O


  c  c    c este   dacă ea este declarată (  c  @) dar nu este
definită în clasa din care face parte ci într-o clasă derivată. -eoarece clasele abstracte
conţin funcţii membru nedefinite (   c ), nu se pot crea obiecte aparţinând acestora
(nu pot fi instanţiate, dar se pot defini variabile de tip pointer sau referinţă la o clasă
abstractă), iar dacă funcţiile virtuale nu sunt definite nici în clasele derivate, atunci şi aceste
clase devin  (o clasă derivată dintr-o clasă abstractă rămâne  dacă nu s-au
redefinit toate metodele pure moştenite, iar în caz contrar devine clasă ).

O clasă abstractă realizează implementarea unei noţiuni care nu poate fi concretizată


(şi atunci nu poate fi decât enunţată), dar surprinde o caracteristică comună a claselor
specializate din aceasta (care vor conţine implementările efective). -eci, o clasă abstractă
va generaliza ( u) comportamentul subclaselor specializate.

Într-o ierarhie, clasa de bază poate avea nişte


proprietăţi care nu se pot defini decât în clasele [V

derivate (anumite caracteristici depind de clasa


derivată). În exemplul alăturat, cu toate că se
Ê VÔ Ñ à 
cunoaşte greutatea unui animal, nu se poate spune că
este  csau cdecât pentru o clasă derivată).

23.02.12 117
+ O
C+ PO
În exemplul următor vom da trei caracterizări pentru un anumit animal în funcţie de
greutatea lui şi cea medie ( /), vârsta lui şi cea medie (4/4), şi viteza lui (de
deplasare) şi cea medie ( / ), acestea pentru un   , Ñcsau  .

11c  c       c J   c  c = = c


o   !
o   !
 [ !  0   ' H T  T  
0' 8  ' W.  ' 8  ' WES
 H W. T 8 T WES -
- ×  ' H EE>A 
- ×  ' T E>A 
- ×  ' T E>A 
 / '  H H EE> -
 =  T T E>, -
 G   T T E> -
£ =0   / '$ ' . 
=$  '  
G $  @0@ -
- 
  ! 0' [ !  
0' L '  ' W.  ' 8  ' WES
8 W. 8 WES -
 ' H EE>  +5 -
 ' T E>  *+ -
 ' T E>  &++ -
- 
 #0' [ !  
0' 3 ' W.  ' 8  ' WES
8 W. 8 WES -
 ' H EE>  )5+ -
 ' T E>  )# -
 ' T E>  )+ -
- 
 , 0' [ !  
0' 7  ' W.  ' 8  ' WES
8 W. 8 WES -
 ' H EE>  +++ -
 ' T E>  #* -
 ' T E>  *+ -
- 
£ £ 
   
 ! +*  %+ =0 
#5++ )+ )* =0 
, &++ % A+ =0  . ! 

-    1 1 c ) u ;
/× ×
/× 
 × 

23.02.12 118
+ O
C+ PO

În exemplul următor vom apela o funcţie % pentru a Œî 


desena o figură oarecare ( ,  sau ) şi o funcţie  
care va aplica formula caracteristică fiecărei figuri geometrice: Ê 2 Ê   2

11c  c       c J   c  c = = c


o 7  !
o L !
o J  !
o H0!!


  / 0   ; K 


0' D. +  £+ ; K£ -
- × - *' A<<  

- ×  ×[  A


    [ 6++ -
- 
  ×0' D. 
 7 
0' L    £  RSJ=ID. £

 7  -

- *' ×   , 


 ×[  ×A
- 
  ××0' D. 
 G 
0' L     £  GD. £

 G G -

- *' !-×  


  A5G×  5G×A
  A%G×  %G×A

 ×[  ×G× G×


- 
 ,0' D. 
 O 
0' 7   £  OD. £
 OO -
- *'     0B
 ×[  ×3 0B 0B
- 


£ J H£   HI=I7= H  .0!"H "H 7@@<  7@@<. -


£ £ 
   
D.6D.9: 
        
 +     ; K  
   . ; K   ;K 

  !  D.9: L ; K  '( 


D.9: L  ; K  '( 
#D.9: 7; K  '( 
 ;  
- 
  L  / %6   
- 
. !  J H 

23.02.12 119
+ O
C+ PO
 +     54  / %6*'  -
 . !  .0! 
-

23.02.12 120
+ O
C+ PO

 cA         A A

Pentru că nu există instrucţiuni de intrare/ieşire, s-au definit funcţii (în ), respectiv


două ierarhii de clase (în &&). Aceste două ierarhii (reprezentate în figurile de mai jos şi
declarate în fişierul .$) realizează operaţiile de intrare/ieşire prin -uri (flux de
date  u  ).

Clasa  c se foloseşte pentru gestio- à VÔ 

narea zonelor tampon şi operaţii de intrare/ieşire


simple.  Ô  à  à  VÔ 

Clasa c este clasa de bază vituală pentru


clasa c (care face conversia după un format
à
specificat, din caracterele unui obiect de tip
 ), clasa c (care face conversia à  V à  V
după un format specificat, în caractere ale unui
à  V
obiect de tip  ) şi clasa c(care face
conversii în ambele sensuri). Legătura dintre cele à  V  ààî à  V  ààî
două ierarhii se realizează printr-o dată membru a à  V  ààî
clasei c(pointer la  ).
Clasele derivate din clasa csau cse numesc clase ciar obiectele
claselor derivate din clasa c se numesc uri. În fişierul .$c sunt definite
urile 2 (! _% $ , pentru  ), 2  (! _% $ , pentru
 ),2 îşi2(! _% $ , pentru , cu respectiv fără zone tampon).

  — c   à  ((


Operaţiile de scriere se pot efectua cu  cc  ((. Operandul stâng
trebuie să fie un obiect al clasei c (sau al unei clase derivate). Pentru scrierea pe
dispozitivul standard se va folosi obiectul 2 . Operandul drept este o expresie pentru al
cărei tip a fost supraîncărcat operatorul ((. Pentru tipurile standard a fost supraîncărcat
printr-o funcţie membru de forma:

?cccc (( ( > *c)

23.02.12 121
+ O
C+ PO

Pentru tipurile abstracte programatorul poate supraîncărca acest operator, aşa cum
se poate vedea în cele ce urmează.
Pentru a putea tipări un obiect
2 (( . c
vom supraîncărcărca (într-o primă variantă) operatorul de inserare (ËË) printr-o funcţie
prieten astfel:
 cc cc { ...
  ccà  V?cccc(( ( à  V&, c)
...
}c
Exemplu:
1 1 c c c    c c.    c @ @c    c c c = = c
o   !o   !
 U 0   0 B 
0' U +   0 B -
 ×!ë×77 ×!ë=
77(77?<?77(N×
- 
£ £ 
U #    
×77??7777  . ! 
-  1 1 c ) u    ; 
&2<&3

Se observă că acest operator se poate aplica înlănţuit pentru că funcţia prieten


returnează o referinţă la -ul curent.
În cele ce urmează vom da o altă rezolvare fără a utiliza o funcţie prieten (care
micşorează gradul de protecţie a datelor). Pentru o  à vom scrie o funcţie membru de
 , care va fi apelată de către funcţia de supraîncărcare a operatorului (( astfel:

 cc àcc { ...


   ;c à  V?cc cc ( à  V? c)
...
}
à  V?cc cc ( à  V? c)
{ s (( ...
return 
}
à  V?cccc(( ( à  V&, cc)
{
return i ()
}

23.02.12 122
+ O
C+ PO
Pentru exemplul anterior (€) programul va fi următorul:

1 1 c c c    c c.    c ËË  c = =c


o   !
o   !
 U 0   0 B 
0' U +   0 B -
×!ë+  ×!ë
7777?<?77N×
- 
×!ë×77 ×!ë=×(+  
£ £ 
U #    
×77??7777  . ! 
-  1 1 c ) u ;
&2<&3

  c     î ââ


Operaţiile de citire se pot efectua cu  cc& ââ. Operandul stâng
trebuie să fie un obiect al clasei c (sau al unei clase derivate). Pentru citirea de la
dispozitivul standard se va folosi obiectul 2. Operandul drept este o expresie pentru al
cărei tip (standard sau abstract) a fost supraîncărcat operatorul ââ . Pentru tipurile
standard a fost supraîncărcat printr-o funcţie membru de forma:

?cccc ââ ( > *c)

Pentru tipurile abstracte programatorul poate supraîncărca acest operator, aşa cum
se poate vedea în cele ce urmează. Pentru a putea citi un obiect

2ââ . c

vom supraîncărcărca (într-o primă variantă) operatorul de extragere (ââ) printr-o funcţie
prieten astfel:

 cc cc { ...


  ccà  V?ccccââ ( à  V&, c)
...
}c

23.02.12 123
+ O
C+ PO
Exemplu:

1 1 c c c    c c.    c A Ac    c c c = = c


o   !
o   !
 U 0   0 B 
0' U +   0 B -
  " 0   " U
 0,B   -
  ×!ë×66  ×!ë=ë
66(66(N×
- 
£ £ 
U    
 66
    . ! 
- 

Se observă că acest operator se poate aplica înlănţuit pentru că funcţia prieten


returnează o referinţă la -ul curent.
În cele ce urmează vom da o altă rezolvare fără a utiliza o funcţie prieten (funcţie
care micşorează gradul de protecţie a datelor). Pentru o  à vom scrie o funcţie membru
de  , (care va fi apelată de către funcţia de supraîncărcare a operatorului ââ) astfel:
 cc àcc { ...
   ;c à  V?cc cc ( à  V? c)
...
}
à  V?c  ( à  V? c)
{ s ââ ...
return 
}
à  V?ccccââ ( à  V&, cc)
{
return i c()
}

Pentru exemplul anterior (€) programul va fi următorul:

1 1 c c c    c c.    c ââ  c = =c


o   !
o   !
 U 0   0 B 
0' U +   0 B -
  "=0  " 0,B   -
 ×!ë, × ×!ë6666N×
- 
 " 0   " U  =0 -
×!ë×66  ×!ë=ë×(, × 
£ £ 
U    
 66
    . ! 

23.02.12 124
+ O
C+ PO

  c     

Tipărirea (afişarea) datelor după un anumit format (şablon) precizat (asemănător


funcţiilor  şi  ) se poate realiza şi cu ajutorul ierarhiilor de clase definite în C++,
fie prin apelul funcţiilor membru        , fie cu ajutorul unor
metode speciale numite V  .
  — c    ×' ×$ 
  
Clasa à conţine o dată membru  îà care conţine  operaţiilor de intrare-
ieşire. În aceeaşi clasă mai este definit un tip enumerare prin care se poate referi formatul
corespunzător conversiei ataşate operaţiilor de transfer:
    0' Y
  
 (0  +;+++  ,,salt peste (ignoră la citire) caracterele  
   +;+++  ,,cadrare la stânga
 .!  +;+++)  ,,cadrare la dreapta
    +;+++%  ,,spaţiile după semn sau bază
  +;+++  ,,conversie în zecimal
   +;+++  ,,conversie în octal
 !; +;++)+  ,,conversie în heza
 ! ' +;++%+  ,,afişarea bazei
 ! 0   +;+++  ,,afişare punct zecimal
 00 +;+++  ,,cifre hexa cu litere mari
 ! 0  +;+)++  ,,afişare cu semn
   +;+%++  ,,reale cu exponent
 ; +;+++  ,,reale fără exponent
  ' +;+++  ,,vidare zone tampon supă scriere
    +;)+++ ,,vidare   şi 
 - 
 Y
- 

Atributul &  are o valoare implicită pentru fiecare tip standard, care se poate
modifica utilizând funcţia membru   descrisă în continuare.
Metoda   are următoarele două forme:
1)c long  (long )
2)c long  (long  clong c )

Funcţia modifică atributul &  precizând întraga valoare (varianta a)) sau
precizând un grup de biţi şi bitul dorit din cadrul grupului (varianta b)). Grupele (şi valorile
corespunzătoare) sunt     ( c $c  ),    (cc$&) şi    
(   c  &) În ambele variante funcţia returnează valoarea anterioară a atributului
& ic Referirea grupului şi bitului dorit se face prin numele clasei urmat de operatorul de
rezoluţie şi bitul dorit ( ""). Valoarea atributului c &  se poate obţine şi prin apelul
metodei   (   .() ).

23.02.12 125
+ O
C+ PO
Atributul &% $ conţine lungimea minimă a câmpului de afişare a unei date
(respectiv lungimea maximă a câmpului din care se face citirea), având valoarea implicită
nulă (afişare pe lungimea minimă necesară), care se poate modifica utilizând funcţia membru
 descrisă în continuare în ambele forme:
a)c int  ( )
b)c int  (int c  )

Funcţia returnează valoarea atributului &  (varianta a)) sau modifică atributul
&% $ precizând noua valoare (   care poate fi o expresie) şi returnează valoarea
anterioară a atributului &% $ (varianta b))ic -upă fiecare transfer valoarea atributului
&  devine nulă.

Atributul & conţine caracterul de umplere necesar completării câmpului de afişare


a datei în situaţia în care lungimea acestuia este mai mare decât lungimea necesară, având
valoarea implicită spaţiu (µ µ), care se poate modifica utilizând funcţia membru :
a)c char ( )
b)c char (char c)

Funcţia returnează valoarea atributului &c  (varianta a)) sau modifică atributul &c
 precizând noul caracter de umplere () şi returnează valoarea anterioară (varianta b))icc

Atributul &   conţine precizia de afişare (numărul de zecimale) a unei date de


tip real, având valoarea implicită 0, care se poate modifica utilizând funcţia membru
 :
a)c int   ( )
b)c int   (int c)

Funcţia returnează valoarea atributului &c    (varianta a)) sau modifică
atributul &c   precizând noua precizie () şi returnează valoarea anterioară (varianta
b))ic

În exemplul următor se poate vedea apelul funcţiilor prezentate anterior precum şi


rezultatele obţinute:

,,       à   ((  2    V @@


o   !
o   !
    
0'  ;+ ; -
 "7  "    -
  "=0  "    -
 0  '    !4 - ,,%60
- 
 " 0  " "7  77  -
 " 0   " 7  7=0 -

23.02.12 126
+ O
C+ PO

£ £ 
  
 
       
       
  × 11$ 11   
       
  × 11$' 
       
       
  × 11 11   
  ' ×$*    ?? 
   
 ' ;    ,#)5&  
  × 11  11 ×   
  ' ×$&    ?E?      
  ;,#)5& 
. ! 
-
)u :
   ++
    ++
    *)
    +;*)
    ++
 ,#)5& EEEE#%#

   c   
Atributele & c &% $c & c şic &   pot fi modificate şi cu ajutorul
   , aceştia având avantajul că pot fi apelaţi înlănţuit (deoarece returnează
referinţă la ). Primii şapte    prezentaţi în continuare sunt declaraţi în
fişierul i$ciar ultimii şase în fişierul  i$c:
1.c * setarea bitului de salt (( %)
2.c   conversie în zecimal
3.c  conversie în octal
4.c   conversie în hexa
5.c   vidarea zonei tampon a ob.! 
6.c  inserare car. Nul µ\0¶
7.c  trece la rând nou şi vidarea zonei tampon
1.c   ! Ôÿ defineşte baza în care se face conversia
2.c    ! ÿ setarea unor biţi precizaţi
3.c     !  ÿ ştergerea unor biţi precizaţi
4.c  *!  ÿ defineşte lungimea câmpului
5.c   ! 2ÿ defineşte caracterul de umplere
6.c    ! ÿ defineşte numărul de zecimale

Exemplul următor utilizează    pentru a realiza tipărirea rezultatelor


dorite:

23.02.12 127
+ O
C+ PO

,,       à   ((  2  V    @@


o   !
o   !
o  7 ! ($6  :
1&AA
     &AA
0'  ;+ ; -
 "7  "    - ;412AA&
  "=0  "    - A;4
 0  '    !4 - (((&AA
-  <333(33
 " 0  " "7  77  -
 " 0   " 7  7=0 -

£ £ 
  
 
    
   
  $   
  ×  /  & 
  ×'*× ?? 
  ,#×' F77× 8877×   277,# 
. ! 
-

În exemplul următor se utilizează    pentru a realiza citirea datelor


utilizând un format variabil ( ):

,,        î   ââ  2  V    @@


o   !
o   !  :
o  7 ! ($6
&1&234@;9EFA
  !9*:  &
0'  9+:+ - 2123
 "7  "    - 314@;
  "=0  "    - 419EFA
- 
@1&234@;9EFA
 " 0  " "7  77  - &234@
 " 0   " 7  7=0 -
£ £ 
   
 
   5     
 ×' ,,' ×$ 
  EEEEEEEEEEEEEEE 
-
 . ! 
-

23.02.12 128
+ O
C+ PO

  c >           

-acă o operaţie de intrare/ieşire nu s-a încheiat cu succes (nu s-a desfăşurat corect,
situaţie în care vom spune că  ajunge într-o à  ), programul poate lua o
decizie (controlând în acest fel desfăşurarea transferurilor de date în scopul corectitudinii
desfăşurării lor). >   (un  cc ) poate fi aflat verificând biţii datei membru
à  (de tip ) prin tipul enumerare  à  definit în clasa à astfel:
    0' Y
  
 . '  +;++  ,,operaţie corectă
  '  +;+  ,,sfârşit de fişier
  '  +;+  ,,eroare intrare/ieşire
 ''  +;+)  ,,operaţie invalidă
 !  +;%+  ,,eroare fatală
 - 
 Y
- 

Valorile (biţilor) atributului state se pot determina utilizând următoarele funcţii:


1)c int   () // biţii de eroare ( c  c c$ ) nu sunt setaţi,
2)c int  () // este setat bitul  ,
3)c int  () // este setat bitul   csauc  sauc$ ,
4)c int  () // este setat bitul   sauc$ ,
5)c int   () // returnează toate valorile biţilor de stare (valoarea datei ).

Valorile biţilor datei state pot fi modificate cu funcţia:


void   (int = 0)
La un apel fără paramteru actual se vor anula biţii  c  cşic  iar pentru a
preciza un anumit bit se poate folosi ca parametri actual o expresie de forma:
cin.   (ios::  ) //    restul anulaţi
Exemplu:
cin.   (ios:: c| cin.() ) //  crestul neschimbaţi

Citirea (inclusiv a caracterelor  ) se poate realiza cu funcţia membru  


definită astfel:
istream&   ([un]signed char* u, int , char  = ¶\n¶)
care citeşte cel mult -1 caractere sau întâlneşte caracterul .
În exemplul următor se citesc mai multe cuvinte separate prin spaţii:
Y
  !9%+: Y  :
 "7  " /×  %+   - 1, ××× (
Y- Y , ××× (
£ £  1QR
 
    ??  /  ?? - ! 1 
-

23.02.12 129
+ O
C+ PO
În exemplul următor se repetă citirea până când numărul tastat este corect:
,,            A ù  @@
o   !
o   !
      :
0'  + - 1
 "7  "    - .××12
  "=0  "    - 1QR
-  .××13
 " 0  " "7  77  - 1&23
 " 0   " 7  7=0 - .××1A
£ £  &23

   
  H 
  
    
  /  !;   
. H +   
H  
  ,, ' 
! 955: ,,  0 
.  55 ,,£ 
--
 ! H  
   
 . ! 
-

Verificarea stării de eroare a unui  se mai poate face prin operatorul sau prin
conversia într-un pointer fără tip (void*) :
a)c operatorul este supraîncărcat cu metoda clasei :
int operator ( ) // returnează o valoare egală cu a funcţiei  ()
-e exemplu, în programul u  i  prezentat anterior instrucţiunea
if (cin.good()) cout ËË '=' ËË n ËË endl
se poate înlocui cu
if (! cin) cout ËË '=' ËË n ËË endl
sau mai simplu cu
if (cin) cout ËË '=' ËË n ËË endl
b)c conversia spre tipul void* permite verificarea stării de eroare a stream-ului, şi poate fi
utilizată în construcţii de forma
if ( s ââ dată) 5
rezultatul (o referinţă la obiectul  ! clasei ) fiind #GG(0) dacă funcţia  ( )
± 0.

Citirea caracterelor sau a datelor se poate realiza şi cu funcţia membru  definită
astfel:
a)c int  ( ) // & un caracter din -ul curent,
b)c istream&  ([un]signed char* u, int , char  = ¶\n¶) // nu & caracterul .

23.02.12 130
+ O
C+ PO

În exemplul următor se poate vedea atât utilizarea conversiei spre tipul void*,
precum şi a funcţiei membru  ( în varianta b)):
,,            A ù  @@
o   !
o  .!

    
!6> 
!6> 
!6> 
0'  + !6 
!6I@ 
!6  
 "7  " 
  "=0  " >    -
- 

  !6 !6 !6 
 !4 
> !9  :  0K>  
> !9  :  0K>  
>  !9   :  0K>   
-

 "7  "

  > 
 ! 1 ! 955: 
  .  55 
. IQD  
  >> 
-
  
-

 " 0  " "7  77  -
 " 0   " 7  7=0 -  :
 1&23
£ £  &23
 1
   (
14@;
   4@;
  1 
     (
- 1QR
 ! 1  
-



23.02.12 131
+ O
C+ PO

 
 î
— ©      —
1.1. Generalităţi ......................................................................................... 1
1.2. Structura unui program....................................................................... 1
1.3. Funcţii ................................................................................................ 2
1.4. Elementele limbajului .......................................................................... 3

 ›  
2.1. Variabile globale ................................................................................. 4
2.2. Variabile locale ................................................................................... 4
2.3. Variabile de tip registru ....................................................................... 5
2.4. Iniţializarea variabilelor ....................................................................... 6

 ù   
3.1. Operatori ............................................................................................ 7

        ——


4.1. Funcţia   .................................................................................. 11
4.2. Funcţia * ................................................................................... 12
4.3. Funcţia  $ .............................................................................. 13
4.4. Funcţia  $ .............................................................................. 13
4.5. Funcţia  $ ................................................................................ 13
4.6. Funcţia  $................................................................................... 13

    —
5.1. Instrucţiunea  ............................................................................ 14
5.2. Instrucţiunea ,&  ...................................................................... 14
5.3. Instrucţiunea  ..................................................................... 14
5.4. Instrucţiunea # ................................................................................ 15
5.5. Instrucţiunea *% $ ......................................................................... 15
5.6. Instrucţiunea ë$  .......................................................................... 16
5.7. Instrucţiunea ë$  ................................................................... 16
5.8. Instrucţiunea  ............................................................................. 17
5.9. Instrucţiunea '( ........................................................................... 17
5.10. Instrucţiunea    ...................................................................... 17

23.02.12 132
+ O
C+ PO
5.11. Instrucţiunea > ........................................................................... 17
5.12. Apelul unei funcţii............................................................................. 18

    @


6.1. -eclararea unui   .................................................................... 20
6.2. Operaţii cu   .......................................................................... 20
6.3. Alocare dinamică a memoriei............................................................. 22
Bi6i   ccla funcţii ............................................................................ 22
Bi i Ñ ucparametrilor din linia de comandă...................................... 24
6.6. -eclararea       ................................................................. 24
Bii *    ............................................................................................... 24

 ©   

>   


8.1. -efinirea unui  ccde dată (0).................................................. 26
8.2. Tipul  c( ) ................................................................... 26
8.3. -efinirea unei    c( ) ........................................................ 27
Ci6i )  cunei date (  ) ............................................................ 28
Ci i 4  de   ................................................................................ 28

º   V2  


9.1. Listă simplu înlănţuită ordonată......................................................... 29
9.2. Abori binari ...................................................................................... 30

—@       


10.1. Nivelul inferior.................................................................................. 32
10.2. Nivelul superior ................................................................................ 35

——     @


11.1. Macrouri de clasificare ...................................................................... 40
11.2. Macrouri de transformare a simbolurilor ............................................ 40
11.3. Conversii .......................................................................................... 40
11.4. Funcţii de prelucrare a şirurilor de caractere....................................... 41
11.5. Funcţii de calcul ................................................................................ 41
11.6. Funcţii pentru controlul proceselor .................................................... 41
11.7. Funcţii pentru timp............................................................................ 42
11.8. Funcţii diverse .................................................................................. 42

23.02.12 133
+ O
C+ PO

—  ù  %    

—  ù  %    

—    && 


14.1. Extensii ale limbajului C .................................................................... 47
14.2. Operatori .......................................................................................... 48
14.3. Structură, uniune şi enumerare .......................................................... 51

—    && 


15.1. Funcţii #  .................................................................................... 53
15.2. Funcţii de tip referinţă ....................................................................... 54
15.3. Supraîncărcarea funcţiilor .................................................................. 56
15.4. Iniţializarea parametrilor formali ........................................................ 57
15.5. Funcţii membru pentru Structuri........................................................ 58

—  >[   

—       !ÿ 


17.1. -efinirea   ............................................................................. 64
Dii   cci   ............................................................. 68

—  º22  2 à VÔ  ÑJ!Ñ  cJ c" ÿ—


— Œ 2   à Ê Œ  

JV Ôà 2º  2   Ö "  


7iDi   c2c 3c* c11c $ : ................................................. 76
7ii Jc2  c 3c* c11c $ : .............................................. 78

— Ê  J   

 º  22      —


22.1. Operatorul de   (  ) şi    u (=) ......................... 82
22.2. Operatorii de    +=, U=, *=, /= .......................................... 84
22.3. Operatorii de  (++) şi  (UU) ....................... 85

       
23.1. Conversii implicite ............................................................................ 86
23.2. Conversii explicite ............................................................................ 89

23.02.12 134
+ O
C+ PO

   ' Ô !V ÿ  —


24.1. Funcţii !  (> ) ................................................................. 91
24.2. Clase >  ................................................................................. 92
24.3. Implementarea elementelor > ................................................. 93

  © %      
25.1. Relaţia de    .......................................................................... 95
25.2. Relaţia de  .......................................................................... 98
25.3. Clase Încuibate(imbricate) ............................................................... 101
25.4. Relaţia de derivare .......................................................................... 103

   Ê   V     à V  ——
26.1. Funcţii membru      .............................................................. 114
26.2. Clase  -   c c   c   .............................. 117

A       A       A       ——


iDi . cc cccËË............................................................. 121
ii . cc&ccccââ.......................................................... 123
27.3. Intrări/Ieşiri cu format ..................................................................... 125
27.4. Tratarea erorilor la operaţiile de intrare/ieşire................................... 129

  —
a    —

23.02.12 135
+ O
C+ PO

a   


1.c  ©  , #  c c   , Editura Albastră, Cluj_Napoca, 1996
2.c   ë     ½   >  , >$  c  c c  ic
  , Editura Teora, Bucureşti, 1996
3.c ù  *½ º º ½   ,   c c c   c c
99, Computer Science Press, New York, 1995
4.c G  , "  c c c 99c cÎ  Editura Albastră, Cluj_Napoca,
1997
5.c >  [  º , c *  c   $c ?c *%c    c c ,
Addison-Weslay, California, 1995
6.c ›   ½ ;   , Jc  c c , UBB-Mate_Info,
1999

23.02.12 136

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