Sunteți pe pagina 1din 10

Programarea Calculatoarelor

Laborator IV
Adrian Liţă / Ovidiu Grigore / Anamaria Rădoi
2015

1 Scopul laboratorului
Laboratorul III al materiei Programarea Calculatoarelor are ca scop introduce-
rea operatorilor şi exemplificarea acestora.
În acest laborator se parcurg următoarele puncte:
• operatorul de atribuire
• operatori aritmetici

• operatori logici pe biţi


• operatori logici
• operatori relaţionali

• operatori de egalitate
• operatori de incrementare/decrementare
• operatori de atribuire compusă
• operatorul sizeof()

• operatorul condiţional
• operatorul de transformare

2 Desfăşurarea lucrării
O expresie este compusă dintr-un operand sau mai mulţi, legaţi între ei prin
operatori. Operanzii asupra cărora se execută prelucrarea pot fi:
• constante
• variabile

1
• expresii sau apeluri de funcţii
Operatorii determină modul de prelucrare al datelor. În raport cu numărul de
operanzi asupra cărora acţionează, operatorii se pot clasifica în:
• operatori unari, atunci când se aplică unui singur operand

• operatori binari, atunci când prelucrează doi operanzi


• operatori ternari, atunci când se prelcurează trei operanzi

2.1 Operatorul de atribuire


Operatorul de atribuire este un operator binar folosit în atribuirea valorilor.
Sintaxa este de forma:
1 operand1 = operand2 ;

Operatorul de atribuire are rolul de a copia valoarea operandului drept (ope-


rand2) în primul operand (operand1).

2.2 Operatori aritmetici


Operatorii aritmetici au rolul efectuării operaţiilor aritmetice între două numere.
Aceştia sunt:
• operatorul de schimbare a semnului: - este un operator unar. Acesta are
rolul de a schimba semnul operandului asupra căruia acţionează.
1 r e z u l t a t = −operand

• operatorul de adunare: + este un operator binar care adună cei doi ope-
ratori asupra cărora acţionează.
1 r e z u l t a t = operand1 + operand2

• operatorul de scădere: - este un operator binar care execută scăderea


operandului 2 din operandul 1. A se diferenţia de operatorul de
schimbare a semnului.
1 r e z u l t a t = operand1 − operand2

• operatorul de înmulţire: * este un operator binar care înmulţeşte cei doi


operatori asupra cărora acţionează.
1 r e z u l t a t = operand1 ∗ operand2

• operatorul de împărţire: / este un operator binar care execută împărţirea


operandului 1 la operandul 2.
1 r e z u l t a t = operand1 / operand2

2
• operatorul de împărţire modulo: % este un operator binar care extrage
restul împărţirii operandului 1 la operandul 2. Acest operator are o par-
ticularitate, şi anume că ambii operanzi sunt numere întregi.
1 r e z u l t a t = operand1 % operand2

Exemple cu operatori aritmetici:


1 int a , b , r ;
2 a = 11;
3 b = 5;
4
5 r = −a ; // r = −11
6 r = a + b ; // r = 16
7 r = a − b ; // r = 6
8 r = a ∗ b ; // r = 55
9 r = a / b ; // r = 2
10 r = a % b ; // r = 1
11
12 /∗
13 de asemenea , f u n c t i o n e a z a i n c l u s i v cu numere
14 sau numere s i v a r i a b i l e
15 ∗/
16
17 r = −1;
18 r = a + 1; // r = 12
19 r = 2 + b; // r = 7
20 r = a % 2; // r = 1 . A c e a s t a metoda d e t e c t e a z a numere p a r e sau
impare

2.3 Operatori logici pe biţi


Orice număr se poate scrie în variantă binară. Spre exemplu 7 se poate scrie
0b111. Un bit reprezintă un 0 sau 1. Dacă discutăm în termeni logici, 0
reprezintă fals şi 1 reprezintă adevărat. Toţi operatorii logici pe biţi vor executa
operaţia bit cu bit.
• operatorul de inversare a valorii logice: este un operator unar. Acesta
are rolul de a inversa valoarea logică a unui bit. Dacă bitul respectiv era
1, acesta devine 0, iar dacă era 0, acesta devine 1
1 r e z u l t a t = ~operand

• operatorul ŞI: & este un operator binar care execută operaţia logică ŞI
între cei doi operatori asupra cărora acţionează.
1 r e z u l t a t = operand1 & operand2

• operatorul SAU: | este un operator binar care execută operaţia logică SAU
între cei doi operatori asupra cărora acţionează.
1 r e z u l t a t = operand1 | operand2

3
• operatorul SAU EXCLUSIV: ˆ este un operator binar care execută ope-
raţia logică SAU EXCLUSIV între cei doi operatori asupra cărora acţio-
nează.
1 r e z u l t a t = operand1 ^ operand2

• operatorul de deplasare la stânga: « este un operator binar care execută


operaţia de deplasare pe biţi la stânga a unui număr.
1 r e z u l t a t = operand1 << operand2

• operatorul de deplasare la stânga: » este un operator binar care execută


operaţia de deplasare pe biţi la dreapta a unui număr.
1 r e z u l t a t = operand1 >> operand2

Exemple cu operatori logici pe biţi:


1 unsigned char a , b , r ;
2
3 a = 203; // 203 = 1100 1011
4 b = 51; // 51 = 0011 0011
5
6 r = ~a ; // 52 = 0011 0100
7 r = a & b; // 3 = 0000 0011
8 r = a | b; // 251 = 1111 1011
9 r = a ^ b; // 248 = 1111 1000
10
11 r = b << 2 ; // 204 = 1100 1100
12 r = a >> 2 ; // 50 = 0011 0010

2.4 Operatori logici


Operatorii logici se adresează lucrului cu tipuri de date bool (boolean - tip de
date ce poate fi doar adevărat (true) sau fals (false)).
• operatorul de negare: ! este un operator unar. Acesta are rolul de a nega
valoarea operandului asupra căruia lucrează.
Notă. De cele mai multe ori tipul de date bool este înlocuit cu tipul întreg,
unde true este înlocuit de 1 şi false de 0. Operatorii logici funcţionează şi
asupra numerelor întregi care respectă această proprietate.

1 r e z u l t a t = ! operand

• operatorul ŞI: && este un operator binar care execută operaţia logică ŞI
între cei doi operatori asupra cărora acţionează.
1 r e z u l t a t = operand1 && operand2

• operatorul SAU: || este un operator binar care execută operaţia logică


SAU între cei doi operatori asupra cărora acţionează.

4
1 r e z u l t a t = operand1 | | operand2

Exemple cu operatori logici:


1 b o o l a , b , r ; // sau i n t a , b , r
2
3 a = true ;
4 b = false ;
5
6 r = ! a ; // r = 0 sau r = f a l s e
7 r = a && b ; // r = 0 sau r = f a l s e
8 r = a | | b ; // r = 1 sau r = t r u e

2.5 Operatori relaţionali şi de egalitate


Operatorii relaţionali şi de egalitate sunt operatori binari ce stabilesc în ce relaţie
se află operandul 1 faţă de operatorul 2. Rezultatul returnat de aceşti operatori
este întotdeauna adevărat sau fals.
Operatorii de egalitate sunt:
• operatorul de egalitate: == ce stabileşte dacă cei doi operanzi sunt egali
• operatorul de inegalitate: != ce stabileşte dacă cei doi operanzi sunt di-
feriţi
Operatorii relaţionali sunt:
• operatorul mai mic: <
• operatorul mai mic sau egal: <=
• operatorul mai mare: >
• operatorul mai mare sau egal: >=
Notă. A nu se confunda operatorul de egalitate cu operatorul de atribuire! Dacă
scriem a = b acest lucru înseamna a primeşte valoarea lui b. Pe când dacă
scriem a == b ne referm la comparaţia dintre a şi b. Niciodată altfel!
Exemple cu operatori relaţionali şi de egalitate:
1 (7 == 5 ) // fals
2 (5 > 4) // adevarat
3 (3 != 2 ) // adevarat
4 (6 >= 6 ) // adevarat
5 (5 < 5) // fals
6
7 // d e c l a r a m v a r i a b i l e l e a , b s i c s i l e i n i t i a l i z a m l a d e c l a r a r e
8 int a = 2 , b = 3 , c = 6;
9
10 ( a == 5 ) // f a l s a , d e o a r e c e a nu e s t e e g a l a cu 5
11 ( a ∗b >= c ) // a d e v a r a t a , d e o a r e c e 2∗3 e s t e mai mare sau e g a l cu 6
12 ( b+4 > a ∗ c ) // f a l s a , d e o a r e c e 3+4 nu e s t e mai mare d e c a t 2∗6

5
2.6 Operatori de incrementare/decrementare
Operatorii de incrementare/decrementare sunt scurtături ale lui C/C++ pentru
a realiza incrementarea sau decrementarea unei variabile întregi cu o unitate (1).
Aceştia arată în felul următor:
1 int a = 3 , b = 16;
2
3 a++; // a d e v i n e 4
4 b−−; //b d e v i n e 15
5
6 // f u n c t i o n e a z a s i ca p r e f i x :
7 ++a ; // a d e v i n e 5
8 −−b ; //b d e v i n e 14

Partea interesantă a acestor doi operatori o reprezintă faptul că pot fi folosiţi


într-o expresie fie înainte fie după operand, comportamentul fiind diferit. În
momentul în care aceştia sunt folosiţi într-o expresie, execută două operaţii. Să
luăm cazul în care avem o variabilă a de tip int, ce are valoarea 10, şi o variabilă
b tot de tip int:
• folosind operatorii după: b = a++; are ca rezultat: a = 11 şi b = 10
• folosind ca prefix: b = ++a; are ca rezultat: a = 11 şi b = 11

Incrementarea cu prefix (++x) se traduce prin: incrementează pe x, apoi


evaluează pe x.
Incrementarea cu postfix (x++) se traduce prin: evaluează pe x, apoi incre-
mentează pe x.
Analog se execută şi decrementarea.
Câteva exemple mai concludente în codul următor:
1 i n t a = 10 , b = 5 , r ;
2
3 a++; // a d e v i n e 11
4 −−b ; //b d e v i n e 4
5
6 r = a++; // a d e v i n e 1 2 , r d e v i n e 11
7 r = ++b ; //b d e v i n e 5 , r d e v i n e 5
8
9 r = ( a++) − (−−b ) + ( a++ + b−−) ; // r d e v i n e 2 4 , a d e v i n e 1 4 , b
devine 3

2.7 Operatori de atribuire compusă


Operatorii de atribuire compusă reprezintă scurtături ale lui C şi C++ pentru
ca programatorul să poată scrie codul mai rapid. Operatorii de atribuire com-
pusă, după cum le spune numele sunt compuşi din operatorul de atribuire şi un
operator aritmetic sau de logică pe biţi.
Aceştia sunt:

• +=

6
• -=
• *=
• /=
• %=

• »=
• «=
• &=

• ˆ=
• |=
Operatorii de atribuire compusă sunt operatori unari, precum operatorul de
atribuire, şi execută operaţia aritmetică sau de logică pe biţi între rezultat şi
operand.
Exemplu:
1 int a = 5 , b = 3;
2
3 a += 2 ; // a c e l a s i l u c r u cu a = a + 2
4 a ∗= 5 ; // a c e l a s i l u c r u ca a = a ∗ 5 ;
5
6 b ∗= a + 1 ; // a c e l a s i l u c r u ca b = b ∗ ( a + 1 )

2.8 Operatorul special sizeof()


Deşi la prima vedere sizeof() pare o funcţie, acesta este de fapt un operator.
Operatorul sizeof poate fi aplicat oricărei variabile sau tip de date, şi returnează
dimensiunea în BYTES a operandului.
Exemplu:
1 int a = 5;
2 float f = 0.0;
3 double d = 0 . 0 ;
4
5 c o u t << s i z e o f ( a ) << e n d l ; // 4
6 c o u t << s i z e o f ( f ) << e n d l ; // 4
7 c o u t << s i z e o f ( d ) << e n d l ; // 8

Notă. În general tipul de date int ocupă 4 bytes (sau 32 de biţi). Acest lucru
poate să fie diferit în funcţie de calculatorul sau sistemul de calcul folosit (smar-
tphone, tabletă, etc). Tipul de date real double oferă precizie dublă de calcul în
comparaţie cu tipul de date real float şi din acest motiv double ocupă în general
dublu faţă de float.

7
2.9 Operatorul condiţional
Operatorul condiţional este singurul operator ternar în C++, adică acţionează
asupra a 3 operanzi în loc de 2. Sintaxa operatorului condiţional este condiţie
? rezultat1 : rezultat2, şi se traduce în felul următor: dacă condiţia este
adevarată, atunci va returna rezultatul 1, iar dacă este falsă atunci va returna
rezultatul 2.
Cel mai uşor mod de înţeles acest operator este prin exemple:
1 int a = 5 , b = 3 , r = 0;
2
3 // u r m a t o r u l cod a f i s e a z a "3 nu e s t e mai mic d e c a t 2"
4 ( 3 < 2 ) ? ( c o u t << " 3 e s t e mai mic d e c a t 2 " << e n d l ) : ( c o u t << " 3
nu e s t e mai mic d e c a t 2 " << e n d l ) ;
5
6 // g a s e s t e maximul d i n t r e a s i b s i i l memoreaza i n r
7 r = (a > b) ? a : b ;
8 c o u t << r << e n d l ; // 5
9
10 // u r m a t o r u l cod e x e c u t a mai multe l u c r u r i , s e p a r a t e p r i n v i r g u l a
11 ( a > 3 ) ? ( c o u t << " a e s t e mai mare ca 3 " << e n d l , r = 1 ) : ( c o u t
<< " a e s t e mai mic d e c a t 3 " << e n d l , r = 0 ) ;
12 c o u t << r << e n d l ; // r = 1

2.10 Operatorul de transformare


Operatorul de cast (casting operatator) se foloseşte pentru a transforma un tip
de date în altul, atunci când acest lucru este posibil.
În exemplul următor observăm cum putem converti un număr real într-unul
întreg, şi invers, cu consecinţele de rigoare.
1 #i n c l u d e <i o s t r e a m >
2 u s i n g namespace s t d ;
3
4 i n t main ( )
5 {
6 int i ;
7 double d ;
8
9 i = 3;
10 d = 10.578;
11 c o u t << " i = " << i << " s i " << "d = " << d << e n d l ; // i = 3
s i d = 10.578
12
13 i = ( i n t ) d ; // a i c i facem c a s t d i n d o u b l e i n i n t
14 c o u t << " i = " << i << " s i " << "d = " << d << e n d l ; // i = 10
s i d = 10.578
15
16 i = 3;
17 d = ( double ) i ; // a i c i facem c a s t d i n i n t i n d o u b l e
18 c o u t << " i = " << i << " s i " << "d = " << d << e n d l ; // i = 3
s i d = 3.00
19
20 system ( " pause " ) ;
21 return 0;

8
22 }

Operatorul de cast se foloseşte şi în momentul în care vrem să transformăm


un număr întreg de un anumit tip în alt număr tot întreg, dar de alt tip (spre
exemplu: int în unsigned int sau char în long int, etc). Dacă numărul pe care
dorim să-l transformăm are mai mulţi biţi decât cel în care va fi transformat,
aceşti biţi se vor pierde. De asemenea, dacă transformăm un număr cu semn
în altul fără semn, este posibil ca rezultatul să nu fie ceea ce dorim. Explicaţia
pentru acest lucru o să vină într-un laborator ulterior.
1 #i n c l u d e <i o s t r e a m >
2 u s i n g namespace s t d ;
3
4 i n t main ( )
5 {
6 unsigned i n t u ;
7 u n s i g n e d c h a r uc ;
8
9 int i ;
10 char c ;
11
12 i = −100;
13 c = −1;
14
15 u = ( unsigned i n t ) i ;
16 uc = ( u n s i g n e d c h a r ) c ;
17
18 c o u t << u << e n d l ; // 4294967196
19 c o u t << ( u n s i g n e d i n t ) uc << e n d l ; // 255
20
21 uc = ( u n s i g n e d c h a r ) u ;
22 c o u t << ( u n s i g n e d i n t ) uc << e n d l ; // 156
23
24 system ( " pause " ) ;
25 return 0;
26 }

3 Probleme
1. Demonstraţi că operatorul « întotdeauna înmulţeşte un număr cu 2.
2. Dacă a, b şi r sunt trei variabile de tip int, cu valorile 5, 12 respectiv 0,
ce valoare au cele trei variable după rularea următorului cod: r = (a++)
+ (b++) - (a–) + (–b)*(a++); ?
3. Realizaţi un program C++ care pe baza unei ecuaţii de gradul 1 (ax + b
= 0) citite de la tastatură (citirea coeficienţilor a şi b) determină în mod
corect, dacă se poate, pe x.
4. Realizaţi un program C++ care pe baza unei ecuaţii de gradul 2 (axx +
bx + c = 0) citite de la tastatură (citirea coeficienţilor a, b şi c) determină
în mod corect, dacă se poate, toate valorile lui x.

9
5. Citiţi vârsta unui om de la tastatură şi stabiliţi dacă omul respectiv are
voie sau nu să deţină carnet de conducere.
6. Citiţi un număr de 16 biţi de la tastatură. Afişaţi, pe rând, octetul (byte-
ul) cel mai semnificativ şi apoi pe cel mai puţin semnificativ.

10

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