Sunteți pe pagina 1din 30

1

CURS 4
OPERATII DE INTRARE/IESIRE
OPERTORI MATEMATICI, LOGICI
2

Operaţii de intrare/ieşire
• Limbajele C/C++ nu posedă instrucţiuni de intrare/ieşire, deci de
citire/scriere (ca limbajul PASCAL, de exemplu). În limbajul C aceste
operaţii se realizează cu ajutorul unor funcţii (de exemplu, printf şi
scanf), iar în limbajul C++ prin supraîncărcarea operatorilor (definirea
unor noi proprietăţi ale unor operatori existenţi, fără ca proprietăţile
anterioare să dispară), mai precis a operatorilor >> şi << .
• În limbajul C++ sunt predefinite următoarele dispozitive logice de
intrare/ieşire:
• cin - console input - dispozitivul de intrare (tastatura);
• cout - console output - dispozitivul de ieşire (monitorul).
• Transferul informaţiei se realizează cu operatorul >> pentru intrare şi
operatorul << pentru ieşire.
• Utilizarea dispozitivelor de intrare/ieşire cu operatorii corespunzători
determină deschiderea unui canal de comunicaţie a datelor către
dispozitivul respectiv. După operator se specifică informaţiile care vor
fi citite sau afişate.
3

• Operatorul >> se numeşte operator extractor (extrage valori din fluxul datelor de
intrare, conform tipului acestora), iar operatorul << se numeşte operator insertor
(inserează valori în fluxul datelor de ieşire, conform tipului acestora).
• Tipurile de date citite de la tastatură pot fi toate tipurile numerice, caracter sau şir de
caractere. Tipurile de date transferate către ieşire pot fi: toate tipurile numerice,
caracter sau şir de caractere. Operanzii operatorului extractor (>>) pot fi doar nume
de variabile. Operanzii operatorului insertor (<<) pot fi nume de variabile (caz în care
se afişează valoarea variabilei), constante sau expresii. Utilizarea dispozitivelor şi
operatorilor de intrare/ieşire în C++ impune includerea fişierului iostream.h.

Exemple:
char c;
cout<<"Astept un caracter:"; //afişarea constantei şir de caractere, deci a
mesajului
cin>>c; //citirea valorii variabilei c, de tip caracter
int a, b, e; double d;
cin>>a>>b>>e>>d; //citirea valorilor variabilelor a, b, e, d de tip
int, int, int, double
cout<<"a="<<a<<"Valoarea expresiei a+b este:"<<a+b<<'\n';
4

Structura unui program in C/C++

Componentele
unui program
C/C++
5

Operatorii matematici
• Operatorii matematici sunt:
+ Plus unar
- Minus unar
+ Adunare
- Scădere
* Multiplicare
/ Împărţire reală (rezultat real) sau Împărţire întreagă (rezultat
întreg)
% Modulo (restul împărţirii)

• Exemple
-54 +259.65 -rate

• Constantele numerice fără semn sunt pozitive


6

• Împărţirea întreagă (/) este câtul obţinut la împărţirea a două numere


întregi;
• Operaţia modulo (%) reprezintă restul acestei împărţiri şi se aplică doar
numerelor întregi.
• Exemple
6/2 → 3
7/2 → 3
6%2 → 0
7%2 → 1
• Împărţirea în virgulă mobilă (reală) generează rezultat real, iar operanzii
trebuie să fie reali.
• Exemplu
7.0/2.0 → 3.5
• În expresii pot apărea şi variabile:
• Exemple
alpha = num + 6;
num = alpha * 2;
num = num + alpha;
num = 6 % alpha;
7

În instrucţiunea
num = num + alpha;
valorile lui num şi alpha sunt adunate, iar rezultatul este păstrat
în num, înlocuind vechea valoare păstrată aici.

Incrementarea şi decrementarea

++ este operatorul de incrementare;


Incrementarea înseamnă adaugarea valorii 1 din operand;
-- este operatorul de decrementare;
Decrementarea înseamnă scăderea valorii 1 din operand.
Exemplu
int num = 8;
num++; //num va avea valoarea 9
echivalent cu
num = num + 1;
8

Operatorii de incrementare şi decrementare poti fi postfix sau


prefix
Exemple
++num;
num++;
Aceşti operatori se pot folosi şi în expresii
Exemplu
alpha = num++ * 3;
9

Operatori aritmetici binari


Operator Semnificaţie Exemple

+ Adunarea celor doi a+b


operanzi

- Scăderea celor doi a-b


operanzi
* Înmulţirea celor doi a*b
operanzi
/ Împărţirea celor doi a/b
operanzi
% Operatorul modulo a%b
(operatorul rest) (furnizează restul
împărţirii operatorului
stâng la operatorul
drept).
10

Operatorii prezentaţi respectă o serie de reguli de precedenţă


(prioritate) şi asociativitate, care determină precis modul în care
va fi evaluată expresia în care aceştia apar.

Clasă de operatori Operatori Asociativitate


Unari - (unar) ++ -- de la dreapta la
stânga
Multiplicativi * / % de la stânga la
dreapta
Aditivi + - de la stânga la
dreapta
Atribuire = de la dreapta la
stânga
11

Operatori aritmetici binari compuşi


Operator Semnificaţie Exemple

+= a=a+b a+=b
-= a=a-b a-=b
*= a=a*b a*=b
/= a=a/b a/=b
%= a=a%b a%=b

Sintaxa : expresie1 operator= expresie2;


Rezultatul obţinut este acelaşi cu rezultatul obţinut prin:
expresie1 = expresie1 operator expresie2;

Toţi aceşti operatorii modifică valoarea operandului stâng prin adunarea,


scăderea, înmulţirea sau împărţirea acestuia prin valoarea operandului drept.
12

Operatorii aritmetici binari compuşi au aceeaşi prioritate şi


asociativitate ca şi operatorul de atribuire.

Exerciţiu: Să se scrie următorul program şi să se urmărească


rezultatele execuţiei acestuia.

#include <iostream.h>
void main()
{
int a,b; float c=9.3; a=3; b=8;
cout<<”a=”<<a<<’\n’;
a+=b; cout<<”a=”<<a<<’\n’;
a-=b; cout<<”a=”<<a<<’\n’;
a*=b; cout<<”a=”<<a<<’\n’;
a/=b; cout<<”a=”<<a<<’\n’;
a%=b; cout<<”a=”<<a<<’\n’;
13

Operatori relaţionali binari


Operator Semnificaţie Exemple
== Egal cu a==b
!= Diferit de a!=b
< Mai mic decât a<b
<= Mai mic sau egal a<=b
> Mai mare decât a>b
>= Mai mare sau egal a>=b

 Primii doi operatori mai sunt numiţi operatori de egalitate.


 Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi
nu modifică valorile operanzilor.
 Rezultatul unei expresii în care apare unul din operatorii relaţionali binari
este întreg şi are valoarea zero (0) dacă relaţia este falsă, sau valoarea
unu (1) (sau diferită de 0 în cazul compilatoarelor sub UNIX), dacă relaţia
este adevărată.
 Aceşti operatorii pot fi aplicaţi datelor de tip întreg, real sau char.
14

Observaţie: Deosebirea dintre operatorii == (relaţional, de egalitate) şi = (de


atribuire) constă în faptul că primul nu modifică valoarea nici unuia dintre operanzii
săi, pe când cel de-al doilea modifică valoarea operandului stâng (vezi exemplul ).
#include <iostream.h>
void main()
{
int a=1, b=20, lim=100; int rezult; rezult=a<b;
cout<<”a<b=”<<rezult<<’\n’; // Afişare: a<b=1 (sau o altă valoare diferită de
zero pentru alte compilatoare)
rezult=a<=b; //operatorul realţional <= are prioritate mai mare
decât cel de atribuire
cout<<”a<=b=”<<rezult<<’\n’; // Afisare: a<b=1 (sau o alta valoare diferită de
zero pentru alte compilatoare)
rezult=a>b; cout<<”a>b=”<<rezult<<’\n’; // Afişare: a<b=0
rezult=a+10>=lim;
cout<<”a+10>=lim=”<<rezult<<’\n’; /* Operatorul + are prioritate mai mare decât
operatorul >= . Afişare: a+10>=lim=0 */
rezult=a+(10>=lim); cout<<”a+(10>=lim)=”<<rezult<<’\n’;
15

/* Schimbarea prioritatii operatorilor prin folosirea parantezelor;


Afişare: a+(10>=lim)=1 */
rezult=a==b;
cout<<”a==b=”<<rezult<<’\n’; // Afişare: a==b=0
cout<<”a=”<<a<<’\n’; // Afişare: a=1
cout<<”b=”<<b<<’\n’; // Afişare: b=20
rezult=a=b;
cout<<”a=b=”<<rezult<<’\n’; // Afişare: a=b=20
cout<<”a=”<<a<<’\n’; // Afişare: a=20
cout<<”b=”<<b<<’\n’; // Afişare: b=20
rezult=5>b>10;
cout<<”b=”<<b<<’\n’; // Afişare: b=20
cout<<”5>b>10=”<<rezult<<’\n’; //Echivalent cu (5>b)>10
Afişare: 5>b>10=0
}
16

Date booleene (logice)


Nu exista un tip special pentru date logice;
Domeniul de valori: {false, true}
false = 0
true = orice întreg nenul
Operaţii:
! && || == !=

O declaraţie posibilă:
typedef enum {false = 0, true = 1} bool;
bool x, y;
17

Expresii logice
expresie_relationala ::=
expr < expr | expr > expr
| expr <= expr | expr >= expr
| expr == expr | expr != expr
expresie_logica ::= ! expr
| expr || expr
| expr && expr
18

Valoarea expresiilor relaţionale

a-b a<b a>b a<=b a>=b a==b a!=b

pozitiv 0 1 0 1 0 1

zero 0 0 1 1 1 0

negativ 1 0 1 0 0 1
19

Valoarea expresiilor logice || (disjunctie/sau logic)

exp1 exp2 exp1 || exp2

Nu se
0 1
evaluează
1 dacă exp2  0
=0 Se evaluează
0 dacă exp2 = 0
20

Valoarea expresiilor logice && (conjunctie/si


logic)

exp1 exp2 exp1 && exp2

Nu se
=0 0
evaluează
1 dacă exp2  0
0 Se evaluează
0 dacă exp2 = 0
21

Exemple
 O condiţie de forma a  x  b se scrie în limbajul C++:
(x >= a) && (x <= b) sau a <= x && x <= b
 O condiţie de forma a > x sau x > b se scrie în limbajul C++:
x < a || x > b sau !(x >= a && x <= b)
Exerciţiu: Să se scrie un program care citeşte un număr real şi afişează 1
dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de
la tastatură, sau 0 în caz contrar.

#include <iostream.h>
void main()
{
double lmin, lmax, nr;cout<<"Numar=";cin>>nr;
cout<<”Limita inferioară a intervalului:”; cin>>lmin;
cout<<”Limita superioară a intervalului:”; cin>>lmax;
cout<<(nr>=lmin && nr<=lmax); }
22

Operatorul condiţional ?:
exp1 ? exp2 : exp3

 Se evaluează exp1
 Dacă exp1 are valoare nenulă (true) atunci valoarea
expresiei este valoarea lui exp2; exp3 nu se evaluează
 Dacă exp1 are valoare nulă (false) atunci valoarea expresiei
este valoarea lui exp3; exp2 nu se evaluează
 Operatorul ?: este drept asociativ
23

Operatorul condiţional ?: Exemple

x >= 0 ? x : y
x>y?x:y
x>y ? x>z ? x :z : y>z ? y : z

Ex. : int semn=(x<0)?-1:1


Evaluare: Dacă x<0, atunci semn=-1, altfel semn=1
24

Operatorul “=“ (Expresia de atribuire)


Expresia de atribuire:
exp1 = exp2

 exp1 este o “L-value” (obiect din memorie: variabilă, variabilă


tablou cu indici, etc.)
 Tipul expresiei este tipul lui exp1
 Se evaluează exp2 apoi exp1 capătă valoarea lui exp2,
eventual convertită.
 Aşadar, operatorul = modifică valoarea operandului stâng
 Valoarea expresiei este valoarea lui exp1 după evaluare
 Operatorul = este drept asociativ
25

Operatorul “=“ (Expresia de atribuire)


Exemple:
x = sqrt(9)
a = ( b = 2) + ( c = 3)
a = b = c = 0 echivalenta cu a = (b = (c = 0))
while((c = getchar()) != EOF) putchar(c);

Nu confundaţi e1 = e2 cu e1 == e2
26

Operatori de atribuire compusă


O expresie de atribuire compusă are forma:
exp1 op= exp2
unde op= este unul din:
+= -= *= /= %= &= |= ^= >>= <<=
 Expresia este echivalentă cu
exp1 = exp1 op (exp2)
cu precizarea că exp1 se evaluează o singură dată.

j*= k + 3 echivalentă cu: j = j*(k+3)


j*= k = m + 5 echivalentă cu: j = (j*(k =(m + 5)))
27

Operatorul virgulă ,
expresia_virgula ::= expresie, expresie

 Se evaluează prima expresie apoi cea de-a doua.


 Valoarea şi tipul întregii expresiii este valoarea şi tipul
operandului drept.
 Operatorul virgulă are cea mai mică precedenţă.
Exemple:
a = 1, b = 2
i = 1, j = 2, ++k + 1
k != 1, ++x * 2.0 + 1
for(suma = 0, i = 1; i <= n; suma += i, ++i);
28

Operatorul sizeof()
• Operator unar ce permite găsirea numărului de octeţi pe care se
reprezintă un obiect (tip, expresie):

sizeof(int), sizeof(double)
sizeof(b*b-4*a*c), sizeof(i)

sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)
sizeof(signed)=sizeof(unsigned) = sizeof(int)
sizeof(float)<=sizeof(double)<=sizeof(long double)
29

Operatorul sizeof()

#include<iostream>
int main(void)
{
int x=1; double y=9; long z=0;
cout<<sizeof(int); // afişează numărul de octeţi pe care
este memorat un întreg (2)
cout<<sizeof(”ab6*”); // afişează 5, nr. de octeţi pe care este
memorată constanta şir ”ab6*”
}
30

Precedenţa operatorilor
OPERATORI ASOCIERE

() ++ -- (postfix) stânga
++ -- (prefix) ! & (adresa) dreapta
* (deref ) + - (unari) sizeof()
* / % stânga
+ - stânga
< <= > >= stânga
== != stânga
&& stânga
|| stânga
?: dreapta
= += -= *= /= %= dreapta
, (operatorul virgulă) stânga

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