Book Basics of Programming in C++ Tudor 2010
Book Basics of Programming in C++ Tudor 2010
discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/256780425
CITATION
READS
1,489
1 author:
Nicoleta Liviana Tudor
Petroleum - Gas University of Ploiesti
29 PUBLICATIONS 20 CITATIONS
SEE PROFILE
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
LIVIANA TUDOR
BAZELE PROGRAMRII
N LIMBAJUL C++
MATRIX ROM
Bucureti 2010
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
LIVIANA TUDOR
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Referent tiinific
prof. dr. ing. Mircea Petrescu
Universitatea POLITEHNICA Bucureti
Tehnoredactare computerizat
lect. dr. Tudor Nicoleta Liviana
Universitatea Petrol-Gaze din Ploiesti
ltudor@upg-ploiesti.ro
tudorlivia@yahoo.com
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
1.
2.
3.
4.
Componenta hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.
Componenta software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
1.3.
17
21
22
23
2.3. Aplicaii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
33
33
35
47
47
50
52
6.
57
59
59
64
5.3. Operatorul ?: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
71
71
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
7.
8.
9.
10.
76
81
84
89
90
96
99
102
105
109
Structuri i uniuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
117
8.1. Structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
117
8.2. Uniuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
126
Funcii C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
129
129
132
133
136
138
142
145
146
148
150
155
159
159
165
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
11.
12.
166
Liste i arbori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
169
169
188
11.3. Arbori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
191
192
202
207
12.1. Clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.2. Motenire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.3. Suprancrcare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.4. Polimorfism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Bibliografie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
207
211
216
229
239
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Capitolul 1
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
are capacitate foarte mic (64B), permite operaii de citire i scriere a datelor
i este nevolatil.
memorie extern constituit din suporturi electromagnetice sau optice
reutilizabile, pe care se pstreaz datele codificate n form binar. Memoria
extern este mai lent dect memoria intern, dar conine cantiti mari de date.
Memoria extern utilizeaz:
- suporturi electromagnetice (floppy-disk, hard-disk HDD) suprafaa
discului este mprit n piste (cercuri concentrice), care sunt mprite n
sectoare egale. Pistele care au aceeai raz formeaz un cilindru. Locaia de
memorare de pe disc este sectorul, care are o capacitate de 512 octei
- suporturi optice discurile optice (discuri compact-CD si discuri DVDdisc video digital). Suprafaa discului este mprit n piste continue, n
form de spiral. Spaiul de memorare este divizat n blocuri pentru
adresarea unei locaii.
- suporturi electronice cardurile de memorie flash. Celulele binare (biii)
utilizai corespund strii anumitor circuite (nchis-deschis, prezena sau
absena curentului electric n circuite).
Hard Disk-ul ( disc dur, rigid) conine un strat magnetic pe un suport
rigid. Disk-ul hard este construit dintr-un metal dur i uor, de obicei din
aluminiu, fiind singura component a unui PC care nu este 100% electronic. Din
aceast cauz, ea este i mai nceat, n comparaie cu restul componentelor
calculatorului personal.
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Programele S. O.
Componentele majore ale unui S.O. sunt:
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
co
ro
f0
c1
r1
f1
cn = 0
rn
fn
co = 13 c1 = 6
r0 = 1 r1 = 1
1
1
c2 = 3
r2 = 0
0
c3 =1
r3 = 1
1
c4 = 0
r4 = 1
1
co = 3
r0 = 0
0
c1 = 1
r1 = 1
1
c2 = 0
r2 = 1
1
co = 1 c1 = 0
r0 = 11 r1 = 1
B
1
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
x1
x2
xn
r -1
r -2
r -n
f 1
f 2
f -n
Exemplu: S se reprezinte x = 27.513 cu 4 cifre zecimale n baza 16
x = 27.513 = 27 + 0.513 = [x] + {x}
[x] = 27
1
11
B
0
1
1
[x] 16 = [ 27 ]16 = 1B
{x} = 0.513
0513*16 = 8.228
8
8
0.228*16 = 3.648
3
3
0.648*16 = 10.368
10
A
5.888
5
5
{ x } 16 = { 0.513 } 16 = 0.83A5
x 16 = [x] 16 + { x } 16 = 1B + 0.83A5 = 1B.83A5
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
y=
x, daca 0 x 31 1
2
- 231 x 231 1
0, daca x 0
00000000
0
0
00011011
1
B
11111111
F
F
11111111
F
F
11111111
F
F
00000000
0
0
00000000
0
0
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Capitolul 2
Numele unei variabile este format din unul sau mai multe caractere: litere,
cifre, caracterul underscore (de subliniere), primul caracter fiind liter. Referirea
unei variabile se realizeaz prin intermediul numelui su. Exemple: a, b, S, min,
maxim, x1, etc.
Tipul variabilei indic mulimea de valori posibile ( ntreg, real, caracter,
boolean, etc.), operaiile ce pot fi aplicate acesteia, precum i modul de
reprezentare n memoria calculatorului. Fiecare limbaj de programare permite
folosirea unor tipuri elementare de date, specifice acestuia. Pentru fiecare
variabil folosit trebuie declarat n mod explicit tipul de date.
Valoarea unei variabile este valoarea efectiv memorat la un moment dat. O
variabil are n orice moment o singur valoare, care se poate modifica printr-o
instruciune de atribuie sau de citire.
Adresa de memorie a unei variabile este adresa fizic la care se afl valoarea
variabilei n memoria calculatorului.
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Exemple: write x
write (suma este , s)
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Exemple: read n
instruciuni de atribuire
variabila expresie
Exemple: S 0
S=0
instruciuni decizionale
if condiie then instructiune_1
else instructiune_2
endif
endor
sau:
for contor = valoare_initiala, valoare_finala
instructiune_1
instructiune_2
repeat
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
repeat
until conditie
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Observaii:
- apelarea unei proceduri se realizeaz prin instruciunea
call nume [ (lista de valori)]
- o apelare corect are loc dac ntre lista parametrilor i cea a
valorilor exist o bijecie ( coresponden de numr, tip i
ordine)
- o procedur poate apela o alt procedur
- terminarea execuiei unei proceduri se face la ntlnirea unei
instruciuni return sau end, care determin ntoarcerea n
programul apelant, la instruciunea imediat urmtoare
instruciunii call, care a apelat-o.
Exemplu: S se calculeze suma a 2 numere a i b reale
procedure suma
integer a, b, s
read a, b
sa+b
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
write ( suma = , s)
return
end
Apelul procedurii ntr-o aplicaie se realizeaz asfel:
call suma
f(x) = 10, 5 x 10
9 x + 1, x > 10
function f ( x )
if x < 5 then f = 3 * x 5
else if x <= 10 then f = 10
else f = 9 * x +1
endif
endif
end
Apelul functiei se poate realiza asfel:
write f(x)
sau
call f(x)
sau se pot utiliza alte variante de apel, n funcie de aplicaie.
instruciunea
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
GOTO etichet
unde eticheta indic o instruciune din aceeai procedur
Este indicat s evitm folosirea instruciunii goto deoarece ngreuneaz
nelegerea algoritmului
2.3. Aplicaii
x + y, z < 0
x * y, z = 0
0, z > 0
procedure expresie
integer x, y, z, e
read x, y, z
if z < 0 then e x + y
else if z = 0 then e x * y
else e 0
endif
endif
write (expresia E = , e)
return
end
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
procedure calcul
read n
s0
i=1
while i <= n
read x
ss+x
i i+1
repeat
write (suma s =,s)
end
Metoda 3: folosnd o structur repetitiv do-until
procedure calcul
read n
s0
i=0
do
i i +1
read x
ss+x
until i >= n
write (suma s =,s)
end
procedure divizori
read n
sw 0
for i = 2 , int ( n/2)
if n /i = int ( n/i)
write ( i, divizor)
sw 1
endif
repeat
if sw = 0 then write (nu exista divizori)
endif
end
Fie vectorul A = ( a[1], a[2], ..., a[n]), unde n este numr natural dat. Numrai
elementele pare.
procedure divizori
array a[n]
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
read n
sw 0
for i = 1 , n
read ( a[i])
if a[i] mod 2 = 0 { restul impartirii la 2 }
write ( a[i], numar par)
sw 1
endif
repeat
for i = 1 to n
write { a[i] )
repeat
if sw = 0 then write (nu exista numare pare)
endif
end
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
procedure diagonala
array a[n, n]
read n
for i = 1 , n
for j = 1 to n
read ( a[i, j])
repeat
repeat
write (matricea A:)
for i = 1 to n
for j = 1 to n
write ( a[i, j])
repeat
writeln
repeat
s0
for i = 1 to n
for j = 1 to n
if i + j = n + 1 then s s + a[i, j]
endif
repeat
repeat
write (s =, s)
end
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Probleme propuse
1. Fie o matrice A(m, n), cu m linii i n coloane, cu elemente numere ntregi. S
se formeze un ir cu elementele pare, respectiv un ir cu elementele impare.
2. Se d o matrice ptratic A(n, n), cu n linii i n coloane, cu elemente numere
ntregi. S se ordoneze cresctor elementele de pe diagonala principal, prin
permutri de linii i coloane.
3. Fie un vector A( n), cu elemente numere reale. S se inverseze elementele
vectorului ( primul ultimul, al doilea penultimul, etc.). Exemplu: pentru
A = ( 1.5, 5.7, -2.3, 25.2), rezult A = ( 25.2, -2.3, 5.7, 1.5).
4. Pentru dou matrice A(m,n) i B(m, n), s se determine matricea sum C(m,n),
C = A + B.
5. Fie o matrice A ( m, n), cu elemente de tip char. S se ordoneze cresctor
elementele de pe fiecare linie a matricei.
6. Fie un vector A ( n), cu numere ntregi. S se transforme vectorul A n
mulimea B ( elementele unei mulimi sunt unice).
7. Fie un numr n ntreg dat. S se calculeze suma cifrelor sale.
8. Se citete n mod repetat un numr n natural pn la introducerea unui numr
n = 0. S se determine cifra maxim a fiecrui numr n.
De exemplu, n = 48 ( max = 8 )
n = 731 ( max = 7)
n=0
9. S se citeasc n mod repetat un numr pn la introducerea rspunsului N
sau n la ntrebarea Mai citii date? ( d/ n). Care este cel mai mare numr?
10. Se citesc n numere naturale. S se numere cte cifre are irul de numere.
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Capitolul 3
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
semnificaie
diez
&
ampersand
slash
backslash
tilda
Tabelul 1. simboluri C++
secvene escape
semnificaie
\n
new line
\b
\f
\r
\t
horizontal tab
\v
vertical tab
\ddd
\xdd
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Observaii:
limbajul C++ extinde definiia constantelor la clase i funcii
membru
o constant poate fi modificat indirect prin intermediul unui
pointer, ca n exemplul urmtor:
const x = 41;
*(int *)&x = 32;
Semne de punctuaie ( separatori)
# (pentru directiva include) este utilizat numai de preprocesor
: ( dou puncte)
[ ] paranteze drepte
( ) paranteze rotunde
{ } acolade pentru blocuri
spaiul, tab
; punct i virgul
Simboluri speciale
comentarii
// comentariu pe o linie
/*
comentariu pe linii
multiple
*/
sfrit de linie, de pagin
Operatori combinaii de semne speciale care arat modalitatea de
prelucrare sau atribuire a valorilor ( tabelul 3):
++
incrementare
||
sau logic
--
decrementare
not pe bit
adunare
sau pe bit
scdere
&
i pe bit
*, /
nmulire, mprire
==
egalitate
modulo
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
!=
diferit
not logic
virgul ( operator de
secveniere)
&
adres
<<, >>
i logic
sizeof
deplasare pe bii la
stnga i dreapta
dimensiunea n octei
a unei variabile sau
tip de dat
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Categoria
1. operatori cu cea
mai mare prioritate
Operator
()
apel de funcie
[]
indice n tablouri
selecie indirect de
componente ( n C++)
operatorul de rezoluie ( n
C++)
selecie direct de componente
( n C++)
NOT ( negaie logic)
NOT pe bii
plus unar
minus unar
::
.
2. operatori unari
3. operatori
multiplicativi
4. operatori aditivi
Descriere
++
incrementare
--
decrementare
&
adres
indirectare
sizeof
new
delete
*
/
nmulire
restul modulo
plus binar
mprire
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
minus binar
<<
shift stnga
>>
shift dreapta
<
<=
mai mic
mai mic sau egal
>
mai mare
>=
7. operatori pentru
verificarea egalitii
==
egal
!=
diferit
8.
&
AND pe bii
9.
10.
OR ( sau) pe bii
11.
&&
12.
||
OR (sau) logic
13. operator
condiional
?:
a ? x : y nseamn
14. operatori de
atribuire
atribuire
*=
atribuire cu nmulire
/=
atribuire cu mprire
%=
+=
atribuire cu adunare
-=
atribuire cu scdere
&=
atribuire cu i pe bii
5. operatori shift
6. operatori
relaionali
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
15. operatorul
virgul
^=
|=
<<=
>>=
operator de secveniere
unde expresiile pot avea tipuri de date diferite. n limbajul C++ se fac conversii
implicite de tip, existnd relaia:
sizeof ( int) <= sizeof ( float) <= sizeof ( double)
De exemplu, n expresia E1 = E2, E1 trebuie s fie o valoare-stng
modificabil. Valoarea lui E2 ( dup conversia de tip), este memorat n obiectul
E1. Pentru ambele tipuri de atribuire ( simpl i compus), operanzii E1 i E2
trebuie s respecte una dintre urmtoarele reguli:
1. E1 i E2 sunt de tip aritmetic
2. E1 i E2 sunt de tip structur sau uniune
3. E1 i E2 sunt de tip pointer
4. unul dintre E1 sau E2 este de tip pointer la un obiect, iar cellalt este
pointer de tip void
5. E1 este un pointer i E2 este un pointer null constant.
O valoare-stng este un identificator sau o expresie care desemneaz un
obiect care poate fi accesat sau modificat n memorie. Exemple de valori-stngi:
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
E1 = 1
E1 = E1 + E2
sau *p ( un pointer), ns expresia E1 + E2 nu este o valoare-stng
(exemplu: E1 + E2 =7).
Exemplu de atribuire cu conversie de tip:
int a, b;
float m, n;
a = m; // a [ m ]
// sau variabilei a i se atribuie o valoare aleatoare, dac se
//depesc posibilitile de memorare
n = b; // b va fi reprezentat n virgul mobil
Atribuirea multipl poate fi evideniat astfel:
a = b = c = d = 10;
Operatorul de atribuire compus are forma general operator=, unde
operator poate fi unul dintre operatorii de mai jos:
*
- << >>
&
^ |
unde operandul trebuie s fie de tip scalar ( aritmetic sau pointer) i s fie o
valoare-stng modificabil
Pentru incrementare prefixat, valoarea operandului crete cu 1, iar
valoarea expresiei este valoarea obinut dup incrementare.
Pentru incrementare postfix, valoarea expresiei este valoarea dinainte de
aplicarea incrementrii. Dup incrementarea postfix, valoarea operandului crete
cu 1.
Exemplu :
int x = 10, y, z ;
y = x++ ; // y = x =10 i x =x + 1 =11
z = ++x ; // x =x + 1 = 11 + 1 = 12 i z = x = 12
-
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
sintaxa :
- - operand ( prefix)
sau
operand - - ( postfix)
unde operandul trebuie s fie de tip scalar ( aritmetic sau pointer) i s fie o
valoare-stng modificabil.
Pentru decrementare prefixat, valoarea operandului scade cu 1, iar
valoarea expresiei este valoarea obinut dup decrementare.
Pentru decrementare postfix, valoarea expresiei este valoarea dinainte de
aplicarea decrementrii. Dup decrementarea postfix, valoarea operandului
scade cu 1.
Exemplu :
int x = 10, y, z ;
y = x - - ; // y = x =10 i x = x - 1 = 9
z = - -x ; // x =x - 1 = 9 - 1 = 8 i z = x = 8
Operatorul de secveniere ( virgula)
permite construirea de expresii, ca liste de alte expresii
sintaxa: expresie_1, expresie_2, . . . , expresie_n
expresiile se evalueaz de la stnga la dreapta
tipul i valoarea ntregii expresii sunt date de ultima expresie din list
pentru evitarea ambiguitii n utilizarea operatorului virgul ntr-o list cu
argumente ale unei funcii sau n liste de iniializri, se recomand folosirea
parantezelor.
Exemplu :
int x = 10, y, z ;
z = suma ( x, ( y = 3, y*2 + 1), z) ; // funcia suma este apelat cu 3
argumente : 10, 7, z.
Operatorii aritmetici
-
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
operatorii multiplicativi: *, /, %
Sintaxa operatorilor multiplicativi:
operand1 * operand2 ( nmulirea a dou numere)
operand1 / operand2 ( mprirea a dou numere, al doilea fiind nenul)
operand1 % operand2 ( restul mpririi a dou numere, al doilea fiind nenul)
unde operanzii trebuie s fie de tip aritmetic, iar conversiile de tip sunt cele
uzuale. Operatorul / aplicat unor operanzi ntregi furnizeaz un rezultat ntreg
i aplicat unor operanzi reali produce un rezultat real.
Exemplu :
int x = 10, y = 7, z ;
z = x * y ; // z = 70
z = x / y ; //z =1
z = x % y ; // z = 3
Operatorii relaionali <, >, <=, >=, ==, !=
Sintaxa operatorilor relaionali :
operand1 < operand2 respectiv operand1 > operand2
operand1 <= operand2 respectiv operand1 >= operand2
n expresiile relaionale operanzii trebuie s ndeplineasc una dintre
urmtoarele condiii:
- ambii operanzi sunt aritmetici, caz n care se efectueaz conversiile uzuale, iar
rezultatul expresiei relaioanale este de tip int ( 1 adevrat i 0 fals)
- operanzii pot fi pointeri ctre obiecte de tip compatibil, caz n care rezultatul
depinde de adresele relative ale celor dou obiecte la care se refer pointerii
Operatorii de egalitate ==, != testeaz egalitatea sau inegalitatea ntre
valori aritmetice sau pointeri, utiliznd reguli similare cu ale celorlali operatori
relaionali. Operatorii de egalitate sunt ntr-o categorie de preceden inferioar
(prioritate mai mic) dect ceilali operatori relaionali.
Sintaxa operatorilor relaionali :
operand1 == operand2 ( egalitate) respectiv operand1 != operand2 ( diferit)
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
!x
x && y
x || y
Operatorii pe bii
operatorii pe bii sunt:
- negaie pe bii ( ~ operand)
- i pe bii (operand1 & operand2)
- sau pe bii (operand1 | operand2)
- sau exclusiv pe bii (operand1 ^ operand2)
se aplic operanzilor de tip int sau char, nu se aplic valorilor de tip float,
double, long double
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
~x
x&y
x|y
x^y
y = 27
~x
x&y
x|y
x^y
0000 0110
0001 1011
1111 1001
0000 0010
0001 1111
0001 1101
Operatorii shift
operatorul shift stnga (variabil << numr) deplaseaz biii variabilei cu un
numr de poziii la stnga; la deplasarea spre stnga, biii liberi din dreapta
se completeaz cu 0 ( zero)
operatorul shift dreapta (variabil >> numr) deplaseaz biii variabilei cu
un numr de poziii la dreapta; la deplasarea spre dreapta, biii liberi din
stnga se completeaz cu:
- 0 ( zero), dac numrul este fr semn
- 1 ( unu), dac numrul este negativ
operaiile de deplasare pe bii la stnga i dreapta sunt echivalente cu
nmulirea, respectiv mprirea cu 2 la o putere egal cu numrul de bii
deplasai:
x << n este echivalent cu x * 2n
x >> n este echivalent cu x / 2n
exemplu: pentru x = 5, n =2
x << n = 5 << 2 = 0000 0101 << 2 = 0001 0100
0001 0100 = 0*20+ 0*21 + 1*22 + 0* 23+ 1*24 = 0 + 0 + 4 + 0 + 16 = 20
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
x * 2n = 5 * 22 = 20
Deci 5 << 2 = 0001 0100 = 20 = 5 * 22
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Capitolul 14
14.1. Clase
Un obiect este o variabil, reprezentnd un ansamblu alctuit din:
- date membre;
- funcii membre, numite metode. Obiectele sunt variabile declarate de tip
class, un tip de date abstract, asemntor tipurilor de date structurate struct i
union.
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
p
, unde p, q
q
Z ( clasa conine date private i metode publice pentru iniializarea i afiarea
numrtorului i numitorului unei fracii).
Exemplu: S se defineasc o clas pentru numere raionale
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
#include<stdio.h>
#include<conio.h>
class rational
{
int p, q;
public:
void fractie( int x, int y)
{
p = x;
q = y;
}
int numarator()
{
return p;
}
int numitor()
{
return q;
}
}a;
void main(void)
{
clrscr();
a.fractie(7,8);
printf("\n fractia: %d / %d ", a.numarator(), a.numitor());
getche();
}
Operatorul de rezoluie :: permite accesul la variabile globale ale
programului. Un exemplu de afiare difereniat a unei variabile declarate
global, respectiv local este programul urmtor:
#include<stdio.h>
#include<conio.h>
int i = 10;
void main()
{
int i = 15;
clrscr();
printf("\n variabila globala ( din exteriorul functiei main) i = %i",::i);
printf("\n variabila locala (din main) i = %i",i);
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
getch();
}
Operatorul de rezoluie se poate folosi pentru funcii declarate n
exteriorul unei clase, al cror prototip este definit n interiorul clasei. Un exemplu
este problema definirii unei clase pentru numere raionale, rezolvat astfel:
#include<stdio.h>
#include<conio.h>
class rational
{
int p, q;
public:
void fractie( int, int);
int numarator();
int numitor();
}a;
void main(void)
{
clrscr();
a.fractie(20,42);
printf("\n fractia: %d / %d ", a.numarator(), a.numitor());
getche();
}
void rational::fractie( int x, int y)
{ p = x;
q = y;
}
int rational::numarator()
{ return p;
}
int rational::numitor()
{ return q;
}
Funcii inline sunt funciile declarate i definite n interiorul unei clase.
La fiecare apel al funciei, aceasta este nlocuit cu codul ei, mrind viteza de
execuie a programului.
Constructori i destructori
Constructorul generat implicit este o metod special ataat n mod
implicit unei clase, pentru declararea obiectelor. Astfel, se aloc spaiul de
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
memorie necesar obiectelor declarate. O clas poate avea mai muli constructori,
cu restricia ca metodele constructor s difere prin numrul i tipul parametrilor
formali. Exist un tip special de constructor numit constructor de copiere care
atribuie datele unui obiect altui obiect.
Destructorul este o metod special ataat unei clase, ce realizeaz
operatia invers alocrii obiectelor, adic eliberarea memoriei. Numele
destructorului este acelai cu numele clasei, dar este precedat de caracterul ~. O
clas are un singur destructor. Destructorul nu are parametri formali, el fiind
apelat implicit atunci cnd existena unui obiect nceteaz.
Funciile prieten sunt funciile care nu aparin unei clase, dar pot accesa
datele private ale acesteia. Pentru a ataa unei clase o funcie prieten, se
introduce n interiorul definiiei clasei prototipul funciei prieten, precedat de
cuvntul cheie friend, iar definiia funciei se efectueaz n exteriorul clasei.
14.2. Motenire
Motenirea este o tehnic de baz n programarea orientat pe obiecte,
prin care se pot reutiliza i extinde clasele existente. Mecanismul motenirii este
urmtorul:
avnd o clas oarecare B, se poate defini o alt clas D care s preia toate
caracteristicile clasei B, la care s-i poat aduga alte proprieti proprii;
clasa B se numete clas de baz, iar clasa D se numete clas derivat;
mecanismul de derivare poate fi aplicat numai claselor definite prin
specificatorii class i struct;
se poate forma o ierarhie de clase.
Pentru derivarea claselor, se folosete sintaxa:
class | struct clasa_derivat : { specificator_acces_1} clas_baz_1
{, specificator_acces_2} clas_baz_2,
.................................
{
.........
}
Controlul accesului la membrii:
- specificatorul de acces poate lipsi; dac lipsete, se consider private
pentru class i public pentru struct.
Motenirea de tip privat este modul de motenire implicit pentru class.
Membrii protected i public prin motenire private devin private.
Motenirea de tip protected:
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
mostenire protected
- membrii private private
mostenire protected
- membrii protected i public protected
}a;
void graf::citire()
{
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
a[i][j] = e[i][j] = 0;
printf("\n Dati muchiile grafului: ");
for(i = 1; i <= m; i++)
{
printf("\n muchia %d \n",i);
scanf("%d %d",&x, &y);
e[x][y] = e[y][x] = 1;
a[x][y] = a[y][x] = 1;
}
}
void graf::tiparire()
{
printf("\n Matricea de adiacenta\n");
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
printf(" %d ",a[i][j]);
printf("\n");
}
printf("\n Matricea de existenta a lanturilor\n");
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
printf(" %d ", e[i][j]);
printf("\n");
}
}
void graf::Roy_Warshall()
{
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if(e[i][j] == 1)
for(k = 1; k <= n; k++)
if(e[i][k] < e[j][k])
e[i][k] = e[k][i] = e[j][k];
// matrice simetrica fata de diagonala principala
}
int graf1::conex()
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
{
sw = 1;
for(i =1; i <=n; i++)
for(j=1; j <= n; j++)
if (e[i][j] == 0)
sw = 0;
return sw;
}
int graf1::vf_izolate()
{
for(i = 1; i<=n; i++)
{
sw = 1;
for(j = 1; j <= n; j++)
if (e[i][j] == 1)
sw = 0;
if (sw == 1)
{ printf("\n %d varf izolat", i);
return sw;
}
}
return 0;
}
void graf1::vf_gr_max()
{
int max, poz;
for(i = 1; i<=n; i++)
{
a[i][n+1] = 0;
for(j = 1; j <= n; j++)
if (a[i][j]) a[i][n+1]++;
}
max = a[1][n+1]; poz = 1;
for ( i = 2; i <= n; i++)
if(a[i][n+1] > max)
{ poz = i;
max = a[i][n+1];
}
printf("\n varful de grad maxim este %d si are gradul %d",poz, max);
}
void main(void)
{
clrscr();
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Test 1:
Pentru graful din figura 8.1., se
pot introduce datele:
- numrul de vrfuri n = 5
- numrul de muchii m = 3
- muchia 1: 1 2
- muchia 2: 1 4
- muchia 3: 3 5
Test 2:
Pentru graful din figura 8.2., se
pot introduce datele:
- numrul de vrfuri n = 3
- numrul de muchii m = 3
- muchia 1: 1 2
- muchia 2: 1 3
- muchia 3: 2 3
Test 3:
Pentru graful din figura 8.3., se
pot introduce datele:
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
- numrul de vrfuri n = 5
- numrul de muchii m = 4
- muchia 1: 1 2
- muchia 2: 1 3
- muchia 3: 1 4
- muchia 4: 2 4
Test 4:
Pentru graful din figura 8.4., se
pot introduce datele:
- numrul de vrfuri n = 6
- numrul de muchii m = 6
- muchia 1: 1 2
- muchia 2: 1 4
- muchia 3: 2 5
- muchia 4: 3 5
- muchia 5: 3 6
- muchia 6: 5 6
14.3. Suprancrcare
Suprancrcarea permite atribuirea mai multor semnificaii anumitor
operatori sau funcii. De exemplu, operatorii binari precum +, -, * sunt folosii,
de obicei, n construcia expresiilor aritmetice, ntre operanzi ntregi, reali sau de
diverse tipuri aritmetice combinate. ns, prin suprancrcarea acestor operatori,
se pot construi expresii cu operatori i operanzi definii de tip class.
Suprancrcarea operatorilor se poate realiza utiliznd urmtoarea
sintax:
operator <identificator>( <parametrii> )
{
<instruciuni>;
}
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
printf(" %d ",inf[i][j]);
printf("\n ");
}
}
matrice2 matrice2::operator+(matrice2 a)
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
c.inf[i][j] = inf[i][j] + a.inf[i][j];
return(c);
}
matrice2 matrice2::operator*( matrice2 a)
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
s = 0;
for(k = 0; k < n; k++)
s += inf[i][k] * a.inf[k][j];
c.inf[i][j] = s;
}
return(c);
}
void main(void)
{
clrscr();
printf("\n nr de linii/coloane n = "); scanf("%d", &n);
printf("\n dati matricea A:\n "); a.citire();
printf("\n dati matricea B:\n "); b.citire();
printf("\n matricea A este:\n "); a.tiparire();
printf("\n matricea B este:\n "); b.tiparire();
printf("\n matricea suma A + B:\n ");
c = a + b;
c.tiparire();
printf("\n matricea produs A * B:\n ");
c = a * b;
c.tiparire();
getche();
}
Observaie: La execuia programului, se pot folosi urmtoarele teste:
1 2
5 2
, B =
Test 1: n = 2, A =
3 4
7 1
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
19 4
43
10
1 0 2
1 2 1
Test 2: n = 3, A = 3 4 1 , B = 7 0 3
5 1 2
4 1 5
matricea suma A + B = 10 4 4 ,
9 2 7
9 4 11
matricea produs A * B = 35 7 20 .
20 12 18
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
cout<<"multime vida";
for(i=1; i<=n;i++)
cout<<inf[i]<<" ";
}
void multime::citire()
{
if (n <= 0 )
return;
cout<<endl<<"elementele multimii: ";
cout<<"\n inf[1]= ";
cin>>inf[1];
i = 1;
while( i < n)
{
cout<<"\n inf["<<i+1<<"]= ";
cin>>x;
sw = 1;
for(j = 1; j <= i; j++)
if(inf[j] == x)
sw = 0;
if(sw)
{
i++;
inf[i] = x;
}
}
}
multime1 multime1::operator*(multime1 b)
{
sw = 0;
for(i = 1; i <= n;i++)
for(j = 1; j <= b.n;j++)
if(inf[i] == b.inf[j])
{
sw++;
c.inf[sw] = inf[i];
}
if(sw == 0)
cout<<"\n multime vida";
c.n = sw;
return(c);
}
void multime1::operator=(multime1 b)
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
{
for(i = 1; i <= b.n;i++)
inf[i] = b.inf[i];
n = b.n;
}
multime1 multime1::operator-(multime1 a)
{
x = 0;
for(i = 1; i <= n;i++)
{
sw = 0;
for(j = 1; j <= a.n;j++)
if(inf[i] == a.inf[j])
sw = 1;
if(!sw)
c.inf[++x] = inf[i];
}
c.n = x;
return(c);
}
multime1 multime1::operator+(multime1 a)
{
x = 0;
for(i = 1; i <= n;i++)
{
sw = 0;
for(j = 1; j <= a.n;j++)
if(inf[i] == a.inf[j])
sw = 1;
if(sw == 0) c.inf[++x] = inf[i];
}
for(i = 1; i <= a.n;i++)
c.inf[++x] = a.inf[i];
c.n = x;
return(c);
}
void main(void)
{
clrscr();
cout<<endl<<"dati numarul de elemente ale multimii A: ";
cin>>a.n;
a.citire();
cout<<endl<<"dati numarul de elemente ale multimii B: ";
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
cin>>b.n;
b.citire();
cout<<endl<<"\n multimea A: ";
a.afisare();
cout<<endl<<"\n multimea B: ";
b.afisare();
c = a;
cout<<endl<<"\n atribuire: C = A = ";
c.afisare();
c = a - b;
cout<<endl<<"\n diferenta: C = A - B = ";
c.afisare();
c = a * b;
cout<<endl<<"\n intersectia: A * B = ";
c.afisare();
c = a + b;
cout<<endl<<"\n reuniune: A + B = ";
c.afisare();
getche();
}
Suprancrcarea operatorilor [ ], ( ) i =
a) operatorul [ ] asigur accesul la datele unui obiect
De exemplu, prin suprancrcarea operatorului [ ], un element a[i] al unui
vector se poate scrie n mod echivalent astfel:
a[i] a.operator[ ] (i)
unde a este un obiect aparinnd unei clase, n care funcia operator[ ] este o
metod:
class vector
{
int nr[100];
public:
int& operator[](int);
} a;
n programul urmtor, se propune calcularea sumei elementelor unui
vector, folosind suprancrcarea operatorului [ ].
#include<stdio.h>
#include<conio.h>
int i, n, s, p;
class vector
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
{
int nr[100];
public:
int& operator[](int);
void citire();
void tiparire();
};
int& vector::operator[](int i)
{ return nr[i];
}
void vector::citire()
{
for(i = 0; i < n; i++)
{
printf("\n nr[%d] = ",i);
scanf("%d",&nr[i]);
}
}
void vector::tiparire()
{
printf("\n Vectorul\n");
for(i = 0; i < n; i++)
printf("%d ",nr[i]);
}
void main(void)
{
vector a;
clrscr();
printf("\n ne elemente ale vectorului n = ");
scanf("%d", &n);
printf("\n dati vectorul: ");
a.citire();
a.tiparire();
s = 0;
for(i = 0; i < n; i++)
s+= a.operator[](i);
printf("\n suma elementelor = %d", s);
p = 1;
for(i = 0; i < n; i++)
p *= a.operator[](i);
printf("\n produsul elementelor (metoda 1) = %d", p);
p = 1;
for(i = 0; i < n; i++)
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
p *= a[i];
printf("\n produsul elementelor (metoda 2) = %d", p);
getche();
}
Observaii:
n program, s-au utilizat notaiile echivalente:
a.operator[ ] (i) a[i]
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
}
void matrice::citire()
{
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
{
printf("\n inf[%d][%d]= ",i,j);
scanf("%d",&inf[i][j]);
}
}
void main(void)
{
clrscr();
printf("\n nr de varfuri n = "); scanf("%d", &n);
a.citire();
printf("\n Matricea\n");
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
printf(" %d ",a.operator()(i,j));
printf("\n");
}
printf("\n Matricea transpusa\n");
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
printf(" %d ",a(j,i));
printf("\n");
}
getche();
}
Observaie: n program, se pot utiliza notaiile echivalente:
a.operator( ) (i, j) a(i, j) a.inf[i][j]
c) operatorul = poate fi folosit pentru verificarea egalitii a dou obiecte
De exemplu, suprancrcarea operatorului = permite ca verificarea
egalittii elementelor a dou matrice a i b s se scrie n mod echivalent astfel:
a = b a.operator= (b)
unde a i b sunt obiecte din clasa matrice, iar funcia operator= este o metod:
class matrice
{
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
int nr[10][10];
public:
int operator=(matrice);
} a, b;
n programul urmtor, se propune verificarea egalitii a dou matrice,
folosind suprancrcarea operatorului =.
#include<stdio.h>
#include<conio.h>
int i, j, n;
class vector
{
public:
int inf[10], n;
int operator=(vector);
void citire();
void afisare();
}a, b;
int vector::operator=(vector b)
{
int sw;
sw = 1;
if(b.n != n)
sw = 0;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if (inf[i] != b.inf[i])
sw = 0;
return sw;
}
void vector::citire()
{
for(i = 1; i <= n; i++)
{
printf("\n inf[%d]= ",i);
scanf("%d",&inf[i]);
}
}
void vector::afisare()
{
for(i = 1; i <= n; i++)
printf(" %d ",inf[i]);
}
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
void main(void)
{
clrscr();
printf("\n nr de elemente ale vectorului A: n = ");
scanf("%d", &a.n);
a.citire();
printf("\n nr de elemente ale vectorului B: n = ");
scanf("%d", &b.n);
b.citire();
printf("\n Vectorul A\n");
a.afisare();
printf("\n Vectorul B\n");
b.afisare();
if( a = b) printf("\n vectorii au elementele egale");
if(!a.operator=(b)) printf("\n nu exista egalitate");
getche();
}
Observaie: n program, s-au utilizat notaiile echivalente:
a.operator= (b) a = b
Suprancrcarea funciilor
Funciile pot fi suprancrcate, adic pot exista dou sau mai multe funcii
cu acelai nume n clase derivate. Exist o restricie, n sensul c funciile trebuie
s difere prin numrul i tipul parametrilor formali.
Suprancrcarea funciilor n clase derivate: se poate nzestra o clas
derivat cu o metod cu acelai nume i aceeai list de parametri formali, ca una
existent n clasa de baz. Exemplu: o funcie de afiare definit att n clasa de
baz, ct i n clasa derivat.
#include<stdio.h>
#include<conio.h>
class A
{
public:
int i;
void afisare()
{
printf("\n clasa de baza A: i = %d",i);
}
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
};
class B : public A
{
public:
int i;
void afisare()
{
printf("\n clasa derivata B: i = %d",i);
}
}y;
void main(void)
{
clrscr();
y.A::i = 99;
y.A::afisare();
y.i = 10;
y.afisare();
getche();
}
Suprancrcarea funciilor standard presupune redefinirea funciilor
standard n interiorul unei clase.
Exemplu: Calculai radicalul unui numr n n mod repetat pn la
introducerea caracterului n sau N, ca rspuns la ntrebarea mai dai un
numr? (d/n). S se foloseasc redefinirea funciei standard sqrt.
#include<iostream.h>
#include<math.h>
#include<conio.h>
class radical
{
public:
float sqrt(int);
}x;
float radical::sqrt(int a)
{
return(::sqrt(a));
}
int n;
char c;
void main(void)
{
clrscr();
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
do
{
do
{
cout<<endl<<"dati numarul n:";
cin>>n;
}
while(n<=0);
cout<<endl<<x.sqrt(n);
cout<<endl<<"mai dati un numar? (d/n)";
cin>>c;
}
while(c!='n' && c!='N');
}
14.4. Polimorfism
Polimorfismul se realizeaz prin redefinirea funciilor i a operatorilor.
Un aspect al polimorfismului este capacitatea utilizrii unei funcii n mai multe
obiecte diferite, ceea ce nseamn c o funcie poate avea mai multe definiii.
Compilatorul determin funcia care trebuie apelat n funcie de lista de
parametri [ M. Williams, 1997]. De exemplu, n programul urmtor sunt definite
dou versiuni diferite ale funciei de afiare:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void afisare (int);
void afisare(char[]);
void main(void)
{
int nr;
char sir[20];
clrscr();
cout<<"\n dati un numar: ";
cin>>nr;
cout<<"\n dati un sir de caractere ";
gets(sir);
afisare(nr);
afisare(sir);
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
getche();
}
void afisare (int nr)
{
cout<<"\n Numarul este: "<<nr;
}
void afisare( char sir[])
{
puts("\n Sirul este: ");
puts(sir);
}
Legtura static
Dac decizia asupra versiunii care se execut la apelul unei funcii
suprancrcate este luat n momentul compilrii, atunci spunem c funcia
realizeaz o legtur static.
#include<iostream.h>
#include<conio.h>
class punct
{
public:
float aria()
{
return 0;
}
}ob1;
class patrat: public punct
{
float l;
public:
setare(float x)
{
if(x>=0)
l = x;
else l =x;
}
float aria()
{
return l * l;
}
}ob2;
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
void main(void)
{
punct *p;
patrat *q;
int nr;
clrscr();
cout<<"\n dati latura patratului: ";
cin>>nr;
ob2.setare(nr);
cout<<"\n obiectul 1: "<<ob1.aria();
cout<<"\n obiectul 2: "<<ob2.aria();
p = &ob1;
cout<<"\n pointerul p la ob1 (din clasa punct): "<<p->aria();
q = &ob2;
cout<<"\n pointerul q la ob2 (din clasa patrat): "<<q->aria() ;
getche();
}
Observaie: La redefinirea funciilor, n mod implicit se realizeaz legtura
static. Versiunea de funcie executat se stabilete n momentul compilrii, fiind
o metod ineficient n proiectarea unei ierarhii de clase, deoarece varianta
funciei din clasele derivate nu poate fi folosit.
Funcii virtuale. Funcii virtuale pure. Clase abstracte
Legtura dinamic realizeaz detectarea versiunii funciei executate n
momentul execuiei programului.
Funciile virtuale sunt metodele pentru care se efectueaz legtura
dinamic. Cteva proprietti ale funciilor virtuale ar fi:
funciile virtuale trebuie s aparin unei clase;
nu pot fi statice i nici inline;
redefinirea unei funcii virtuale este posibil la orice nivel al ierarhiei de clase.
n acest caz, funciile redefinite rmn virtuale, fr a mai fi necesar specificarea
cuvntului virtual.
constructorii nu pot fi funcii virtuale, ns destructorii pot fi funcii virtuale;
cnd se folosete o funcie virtual, compilatorul construiete tabelul de
functii virtuale pentru pstrarea evidenei functiilor ce trebuie apelate, pentru
fiecare obiect din clasa respectiv.
Apelul unei funcii virtuale presupune:
determinarea adresei funciei virtuale ale clasei din care face parte
obiectul;
citirea adresei funciei virtuale din tabelul de functii virtuale;
executarea funciei apelate.
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
return l*l;
}
float patrat::perimetrul()
{
return(4*l);
}
void main(void)
{
float x;
clrscr();
do
{
printf("\n dati latura patratului: ");
scanf("%f",&x);
}
while(x<=0);
patrat p(x);
a = &p;
printf("\n aria = %.2f",a->aria());
printf("\n perimetrul = %.2f", a->perimetrul());
getche();
}
Exemplul 2): S se defineasc dou clase, prima clas de baz, iar a doua
clas, derivat din clasa de baz, care s redefineasc o funcie virtual pentru afiarea
unui mesaj. S se dfineasc pointeri ctre cele dou clase i s se evidenieze
legtura dinamic.
#include<iostream.h>
#include<conio.h>
class B
{
public:
virtual void afisare();
};
class D : public B
{
public:
virtual void afisare();
};
void B::afisare()
{
cout<<"\n apel functie din clasa de baza B";
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
}
void D::afisare()
{
cout<<"\n apel functie din clasa derivata D";
}
void main(void)
{
clrscr();
B *p = new B;
p->afisare();
delete p;
D *q = new D;
q->afisare();
delete q;
//legatura dinamica
B *p1;
D p2;
p1 = (B*) &p2;
cout<<"\n legatura dinamica";
p1->afisare();
getche();
}
Observaie: Instruciunea p1->afisare(); evideniaz legtura dinamic - se
apeleaz funcia afisare() din clasa derivat, deoarece funcia este declarat virtual.
Exemplul 3): S se defineasc o clas de baz tablou care s conin
funcii virtuale pure pentru citire, scriere i calculul sumei elementelor unui
tablou. S se declare o clas derivat pentru operaii cu vectori.
#include<iostream.h>
#include<conio.h>
int i, j, n, s, nr;
char ch;
class tablou
{
public:
virtual void citire() = 0;
virtual void scriere() = 0;
virtual int suma() = 0;
};
class vector: public tablou
{
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
int n, inf[12];
public:
vector(int);
void citire();
void scriere();
int suma();
};
vector::vector( int nr)
{
n = nr;
}
void vector::citire()
{
for(i=1;i<=n;i++)
{
cout<<"\n inf["<<i<<"]=";
cin>>inf[i];
}
}
void vector::scriere()
{
for(i=1; i<=n; i++)
cout<<inf[i]<<" ";
}
int vector::suma()
{
s = 0;
for(i=1; i<=n; i++)
s+=inf[i];
return s;
}
void main(void)
{
clrscr();
do
{
cout<<endl<<"numarul de elemente ale vectorului: ";
cin>>n;
}
while(n<=0);
vector v(n);
cout<<endl<<"dati elementele vectorului: ";
v.citire();
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
cout<<endl<<"vectorul: ";
v.scriere();
cout<<endl<<"suma elementelor vectorului: "<<v.suma();
getche();
}
Exemplul 4): S se defineasc o clas de baz tablou care s conin
funcii virtuale pure pentru citire, scriere i calculul sumei elementelor unui
tablou. S se declare o clas derivat pentru operaii cu liste simplu nlnuite
(citire, afiare elemente i concatenarea a dou liste).
#include<iostream.h>
#include<conio.h>
#include<ctype.h>
class lista
{
public:
int nr;
lista* urm;
}*p, *pr, *ul;
int s, nr;
char ch;
class tablou
{
public:
virtual void citire() = 0;
virtual void scriere() = 0;
virtual int suma() = 0;
};
class lista1: public tablou
{
lista *prim, *ultim;
public:
void citire();
void scriere();
int suma();
lista1 operator+(lista1);
}l1, l2, l3;
void lista1::citire()
{
ultim = prim = NULL;
do
{
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
if(ultim ==NULL)
{
ultim = new lista;
cout<<endl<<"Dati nr: ";
cin>>nr;
ultim->nr = nr;
ultim->urm = NULL;
prim = ultim;
}
else
{
p = new lista;
cout<<endl<<"Dati urmatorul element: ";
cin>>nr;
p->nr = nr;
p->urm = NULL;
ultim->urm = p;
ultim = p;
}
cout<<"mai introduceti elemente?(d/n)";
ch = getche();
}while(toupper(ch)!='N');
}
void lista1::scriere()
{
if(prim == NULL)
cout<<"\n lista vida";
else
for(p = prim; p; p = p->urm)
cout<<" "<<p->nr;
}
lista1 lista1::operator+(lista1 l2)
{
pr = prim;
ul = ultim;
ul->urm = l2.prim;
ul= l2.ultim;
l3.prim = pr;
l3.ultim = ul;
return(l3);
}
int lista1::suma()
{
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
s=0;
for(p=prim;p;p=p->urm)
s+=p->nr;
return s;
}
void main(void)
{
clrscr();
lista1 l1, l2;
cout<<endl<<" dati lista l1: ";
l1.citire();
cout<<"\n\n lista 1: ";
l1.scriere();
cout<<"\n\n suma elementelor listei l1 = "<<l1.suma();
cout<<"\n\ndati lista l2: ";
l2.citire();
cout<<"\n\n lista l2: ";
l2.scriere();
cout<<"\n\n l1 + l2 = ";
l3 = l1 + l2;
l3.scriere();
getche();
}
Probleme propuse
9. S se scrie un program C++ care s redefineasc operatorii de atribuire simpl
i compus, ca funcii membru pentru urmtoarele clase:
a. numere complexe
b. iruri de caractere
= ( atribuire)
+= ( concatenarea irurilor, cu pstrarea rezultatului n irul curent)
-= ( tergerea unui subir dintr-un ir)
c. liste dublu nlnuite
= atribuire simpl ( copierea unei liste n alt list)
+= atribuire compus ( adugarea unui element la o list i
concatenarea cu o alt list)
d. arbori binari
+= inserarea unui element
-+ tergerea unui element.
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
BIBLIOGRAFIE
1.
2.
3.
4.
Jamsa Dr. K., Klander L., Totul despre C i C++, Manualul fundamental
de programare n C i C++, Editura Teora, 1999-2006
5.
6.
7.
Kruse R. L., Data Structures and Program Design, Prentice Hall, 1984
8.
Litwin W., Linear Hashing: A new tool for file and table addressing, Proc.
6th Conference on Very Large Databases, 1980
9.
10.
11.
12.
Smeureanu I., Ivan I., Drdala M., Limbajul C/C++ prin exemple, Editura
Cison, Bucuresti, 1995
13.
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010
14.
15.
16.
17.
18.
19.
Tudor L., Bazele programrii n limbajul C++, Editura MATRIX ROM, Bucureti, ISBN 978-973-755-644-8, 2010