Documente Academic
Documente Profesional
Documente Cultură
++
C
POO
c cc c
cc
2004
+ O
C+ PO
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
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 µ,¶.
23.02.12 2
+ O
C+ PO
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").
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)
}
23.02.12 5
+ O
C+ PO
Exemple:
float f ( int n )
{ int i=1
int m=n/2
...
}
se iniţializează astfel:
2 # c[] +cc-! _"
iar cpoate fi este omis.
Exemple:
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
Úc ( ) [ ]
Úc U ( ) + ( ) * ( ) & ( ) ! ~ ++ U U ( ) u c
Úc * / %
Úc + U
Úc ËË ââ
Úc Ë Ë= â= â
Úc == !=
Úc &
Úc ^
Úc |
Úc &&
Úc ||
Úc ?: ()
Úc = *= /= %= += U= ËË= ââ= &= ^= |=
Úc ,
23.02.12 7
+ O
C+ PO
-eoarece nu există tipul , valoarea este reprezentată prin @, iarc
prin orice valoare diferită de @.
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
Exemple:
a = ++b // b=b+1 a=b
a = bcUU // a=b b=bU1
23.02.12 9
+ O
C+ PO
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:
23.02.12 10
+ O
C+ PO
c Ê
Această funcţie realizează afişarea după un şablon, având următorul format:
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
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:
·
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:
·
LITERE MICI IN LITERE MARI. // S-a tastat: Litere mici in Litere MARI.
23.02.12 13
+ O
C+ PO
c
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 ,& 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)
Exemplu:
{
int i // Variabilă ccinstrucţiunii
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 $
}
23.02.12 15
+ O
C+ PO
Exemplu:
// Nr.Zile / lună \\
#include Ëiostream.hâ
#include Ëconio.hâ
£ £
!
"#$%& '(
)
*
&
#+ '(
# ,,'(
-
-
. !
-
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 (&) Ô
... }
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:
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 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 Ê
Aceste operaţii sunt operaţii cu cconţinute în variabilele de tip .
23.02.12 20
+ O
C+ PO
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")
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; . !
-
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()
}
23.02.12 23
+ O
C+ PO
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 ©
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.
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
-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()
}
23.02.12 27
+ O
C+ PO
23.02.12 28
+ O
C+ PO
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
23.02.12 31
+ O
C+ PO
@ c
Prelucrările la acest nivel permit următoarele cinci operaţii:
-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)
...
23.02.12 32
+ O
C+ PO
@ c Ô ! ÿ
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
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 ) ! àÿ
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 . !
-
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' . !
-
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
23.02.12 37
+ O
C+ PO
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.
23.02.12 39
+ O
C+ PO
c
Macrourile din această categorie (aflate în fişierul 2 . ) verifică dacă un caracter
este de un anumit tip:
c
Funcţiile care urmează (aflate în fişierul à Ô. ) realizează conversii fară format.
23.02.12 40
+ O
C+ PO
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+.().
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. :
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 ( ) //
23.02.12 43
+ O
C+ PO
ccc î ( cccc* graphdriver,c cccc* graphmode,c$cccc* path)
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 Ë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
23.02.12 47
+ O
C+ PO
c
23.02.12 48
+ O
C+ PO
Exemple:
o ! Ô
o !
£ £
9: 6' 9+:
9+:
' 9+:6'
; 6K"; 6K ;
; ;
; K ;6K . !
-
23.02.12 49
+ O
C+ PO
6'
£ 6
£6
6F
F' 6
66F6F
×
×F
6 ' 9:
£ 6
£ 6
£6
£6
× . !
-
23.02.12 50
+ O
C+ PO
23.02.12 51
+ O
C+ PO
23.02.12 52
+ O
C+ PO
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
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
£ © 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
8<7 O0? ?8 + 8 4+
23.02.12 56
+ O
C+ PO
Î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
. !
-
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 ! ÿ
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
-
£ £
-
23.02.12 65
+ O
C+ PO
23.02.12 66
+ O
C+ PO
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
Exemplu:
// * \\
o 7 !
o / .!
o J !
£
/ .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
-
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
;#
£ £
6/ 6
K)5* A%&
6/ 06
-
23.02.12 70
+ O
C+ PO
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 ( )
- 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;
- ,,
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
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 -
23.02.12 75
+ O
C+ PO
// Membruº 2
o !
o !
× ; K
0'
L ;+ K+ )55-
L ; K !4;;
!4KK )55-
L L "L ;L; KLK )55-
XL )%%-
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
23.02.12 78
+ O
C+ PO
?c - unui V se poate face astfel:
c 2! V 2 à""* V Ê ÿ!" ÿ c11c c c0c
/ / 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:
£ £
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
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 -
23.02.12 81
+ O
C+ PO
Ô () 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:
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
Exemplu:
,, à V 5%@@
o 7 !
o / .! o J !
0 4 "/ / -
£
5 'A5
! 1''%' '%
L
7 L - . !
-í
ùùùíùí ù íUí í í í
23.02.12 84
+ O
C+ PO
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×%% ×× ×$ ×$ ×$ %&× <<%%
£
++ (
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<&
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
- 11c) u
;
B;<3@
&(E
&(E
23.02.12 89
+ O
C+ PO
#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
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.
Exemplu:
,, 2 V @@
o !
o !
£
'
' '
>; J '
; K
; K ;K
>; J ; K
. !
-
1?cc,c cc<
£
!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 !
£
C
O×7 ×6 !
C C7 T
>; C>;T
V
O×7 ×6H
V V7 T
>; V>;T . !
-
23.02.12 92
+ O
C+ PO
£
T +C C7 TC >; C>;T
T #V V7 TV >; V>;T . !
-
o/!× PG/
K0T +T +
K0T +T #
23.02.12 93
+ O
C+ PO
c© %
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
23.02.12 94
+ O
C+ PO
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 -
!
23.02.12 96
+ O
C+ PO
6T / 8
£
-
T /
-
23.02.12 97
+ O
C+ PO
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 .
Exemplu:
,, îî @@
o !
o !
o ?O×[/($?
£ £
O×,× ( ×
0
0(,×. L0 0
J; 1 -
!
23.02.12 98
+ O
C+ PO
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 à :
o=
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:
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:
£
7#
7L Q QL
. !
-
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
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:
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 &
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:
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> -
-
\0'
0£ !/
0' \ /?? -
\!6 /9+: -
X\ -
!/ / -
-
£ £
\(# 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 . !
-
23.02.12 106
+ O
C+ PO
,, @@
o !
o !
o ?O×*($?
£ £
T EC CL
0
0C7 / L0 0
J; 1 -
!
,, àÔ
@@
O×CB
0 6£
0' T < +
£ /
£ L
XT <
-
23.02.12 107
+ O
C+ PO
Î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).
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 }
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 .
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ă).
- 1 1 c ) u ;
[ ! G0
H #
L #++
G %
23.02.12 111
+ O
C+ PO
Exemplul:
11ccc c#$ c c 1 c c c ==c
- 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.
-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 .
î 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
,,J @@
o !
o !
70' 7'
0' £ £ -
-
£
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 !
70' 7'
0' £ £ -
-
£
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; -
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.
£ £
=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
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 .
- 1 1 c ) u ;
/× ×
/×
×
23.02.12 118
+ O
C+ PO
£ J H£ HI=I7= H .0!"H "H 7@@< 7@@<. -
£ £
D.6D.9:
+ ; K
. ; K ;K
23.02.12 119
+ O
C+ PO
+ 54 / %6*' -
. ! .0!
-
23.02.12 120
+ O
C+ PO
cA A A
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
23.02.12 122
+ O
C+ PO
Pentru exemplul anterior () programul va fi următorul:
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:
23.02.12 123
+ O
C+ PO
Exemplu:
23.02.12 124
+ O
C+ PO
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ă.
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
Funcţia returnează valoarea atributului &c (varianta a)) sau modifică
atributul &c precizând noua precizie () şi returnează valoarea anterioară (varianta
b))ic
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
23.02.12 127
+ O
C+ PO
£ £
$
× / &
×'*× ??
,#×' F77× 8877× 277,#
. !
-
23.02.12 128
+ O
C+ PO
-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
-
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
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
©
23.02.12 133
+ O
C+ PO
>[
23.1. Conversii implicite ............................................................................ 86
23.2. Conversii explicite ............................................................................ 89
23.02.12 134
+ O
C+ PO
© %
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
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