Sunteți pe pagina 1din 6

PROGRAMAREA CALCULATOARELOR

ȘI LIMBAJE DE PROGRAMARE

CURS 3

1.7. Expresii aritmetice


Expresiile aritmetice sunt formate din constante, variabile şi funcţii. Operatorii sunt + - * şi /
pentru operanzi reali, iar în cazul operanzilor de tip întreg, şi % (restul împărţirii a două numere
întregi). Restul împărţirii a două numere întregi, a şi b, se defineşte astfel
a % b = a – [a / b] * b
De exemplu
19 % 4 = 3 19 / 4 = 4
19 % (-4) = 3 19 / (-4) = -4
-19 % 4 = -3 -19 / 4 = -4
-19%(-4) = -3 -19 / (-4) = 4
La schimbarea semnului unui operand, se poate schimba doar semnul câtului şi restului, şi nu
valoarea lor absolută.
Pentru gruparea termenilor se folosesc paranteze rotunde, ( şi ). De exemplu, expresia
a−b
a+b
se scrie ca
(a – b) / (a + b)
iar expresia
a + b * x + c * x2
2 + m2
se scrie ca
(a + b * x + c * x * x) / (2 + m*m)
Expresia
a
b c
+
c b
se scrie ca
a / (b / c + c / b)
Funcţiile matematice standard uzuale ale limbajelor C şi C++ sunt cele de mai jos

acos cos exp ceil fabs pow


asin sin log floor sqrt
atan tan log10

Funcţia floor(x) calculează valoarea  x  (cel mai mare număr întreg cuprins în x), iar funcţia
ceil(x) calculează valoarea  x  (cel mai mic număr întreg mai mare ca x). Toate funcţiile de
mai sus au argumente de tip double şi rezultatul de tip double. Funcţia pow are prototipul
double pow(double a, double b)
şi calculează expresia ab. Apelarea unei funcţii se face scriind numele funcţiei ca termen
într-o expresie urmat în paranteze de parametrii actuali. Exemple de expresii aritmetice şi
scrierea lor sunt prezentate mai jos. Vom presupune că variabilele din aceste expresii au fost
declarate în prealabil de tip double şi au primit valori.

1
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

a  cos 2 ( x ) + b  sin ( x )
(a*cos(x)*cos(x)+b*sin(x))/(2.75+fabs(x))
2.75 + x
e x + e−2 x
(exp(x)+exp(-2*x))/5
5
log ( x + 2 ) + ln 1 + cos ( x ) log10(fabs(x)+2)+log(fabs(1+cos(x)))

( x + y )a+3.5 pow(x+y, a+3.5)


Menţionăm că, în expresii putem folosi orice fel de constante întregi, reale sau caracter. De
exemplu, expresia a + 27 se poate scrie
a + 27
sau
a + 0x1b
sau
a + 033
Constantele hexazecimală 0x1b şi octală 033 reprezintă valoarea zecimală 27. Expresia
x + 100 se poate scrie
x + 100
sau
x + 0x64
sau
x + ‘d’
Codul ASCII al caracterului d este 0x64. La evaluarea unei expresii constantele hexazecimale,
octale sau caracter sunt convertite în numărul întreg corespunzător. Evaluarea expresiilor
aritmetice se face ţinând cont de priorităţile operatorilor şi de asociativitatea lor.

Prioritatea operatorilor Asociativitate


+ unar, - unar la dreapta
*/% la stânga
+- la stânga

Conform tabelei de mai sus operatorii *, / şi % au o prioritate mai mare decât + şi - .


Asociativitatea la stânga a operatorilor înseamnă următorul mod de execuţie. Expresia
a/b/c
este interpretată ca
(a / b) / c
De exemplu, expresia 8 / 4 / 2 este interpretată ca (8 / 4) / 2 şi are rezultatul 1. Expresia
x/y*z
este interpretată ca
(x / y ) * z
adică operatorii / şi * ce au aceeaşi prioritate se execută de la stânga la dreapta.
Reamintim că, pentru a modifica ordinea de execuţie o operaţiilor, se utilizează paranteze
rotunde.
Deoarece în expresii intervin operanzi de diverse tipuri, se fac conversii. Regulile după care
compilatorul face aceste conversii sunt următoarele:
• tipul float se converteşte la double,
• tipurile char şi short int se convertesc la int,
• tipurile unsigned char şi unsigned short int se convertesc la unsigned int,

2
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

• dacă în expresie există un operand de tipul long int, tipul int şi unsigned int se
convertesc la long int. Tipul expresiei se determină conform tabelei de mai jos

int long double


int int long double
long long long double
double double double double

Menţionăm în final că, tipurile char, short int şi variantele lor unsigned char, unsigned short int
şi float sunt doar pentru memorare. Calculele se efectuează doar cu variabile de tip int, long int
şi double.
Valoarea unei expresii poate fi convertită într-un tip diferit dacă este nevoie. Există două
forme ale expresiilor de conversie a tipurilor.
Prima formă a expresiei de conversie de tip este
(tip) expresie
De exemplu, dacă i este o variabilă întreagă cu valoarea 7 şi f este o variabilă de tip double cu
valoarea 3.47
int i = 7 ;
double f = 3.47 ;
expresia
(i + f) % 2
nu este corectă deoarece expresia in parantezele rotunde are tipul double. Expresia
(int)(i + f) % 2
are tipul int şi este corectă, iar rezultatul ei este 0.
In limbajul C++ este posibilă încă o formă de convertire a expresiilor, cu forma
tip(expresie)
De exemplu, expresia anterioară se poate scrie
int(i + f) % 2
Menţionăm că se pot face conversii între toate tipurile standard existente în limbaje. Conversia
de la un tip real la un tip întreg se face prin trunchiere, valoarea 3.71 convertită la int este 3, iar
valoarea -3.4 convertită la int este -3.

1.8. Tablouri
Un tablou este o mulţime de elemente de acelaşi tip. Tablourile sunt tipuri structurate simple.
Instrucţiunea de declarare a unui tablou cu o dimensiune este următoarea
tip nume [ număr întreg] ;
unde număr întreg reprezintă numărul de elemente ale tabloului. Elementele tabloului sunt
nume[0], nume[1], …, nume[număr întreg – 1]
De exemplu instrucţiunea
int a[10];
declară un vector cu zece elemente de tip int. Elementele vectorului sunt
a[0], a[1], …, a[9].
Dimensiunea unui tablou este fixată la declararea sa şi nu se poate schimba.
Un tablou poate fi iniţializat la declararea sa scriind valorile elementelor între acolade, {}, şi
separate de virgule. Exemple de instrucţiuni ce declară tablouri şi le atribuie valori
double x[3] = {1.32, -2.15, 4.45};
char c[4] = {‘a’, ‘b’, ‘c’, ‘x’};
Ultimul tablou este reprezentat în memorie astfel

a b c x

3
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

In cazul în care lista de valori este mai scurtă decât numărul de elemente declarate, ultimele
elemente sunt iniţializate cu zero. In cazul iniţializării unui tablou, la declararea lui putem omite
numărul de elemente al tabloului. De exemplu, putem scrie
char x[] = {‘#’, ‘>’, ‘m’};
Compilatorul calculează dimensiunea tabloului din numărul de valori utilizate pentru
iniţializare. Instrucţiunea precedentă este echivalentă cu instrucţiunea
char x[3] = {‘#’, ‘>’, ‘m’};
Menţionăm că un vector de caractere poate fi iniţializat cu o constantă tip şir de caractere. De
exemplu, putem scrie
char s[] = “abc”;
Reamintim că o constantă şir de caractere este terminată printr-un octet 0, deci vectorul declarat
are 4 componente, ‘a’, ‘b’, ‘c’ şi ‘\0’ si este reprezentat în memorie ca

‘a’ ‘b’ ‘c’ ‘\0’

Instrucţiunea precedentă este echivalentă cu oricare dintre instrucţiunile următoare:


char s[4] = “abc”;
char s[4] = {‘a’, ‘b’, ‘c’ , ‘\0’};
char s[4] = {0x61, 0x62, 0x63, 0};
char s[4] = {97, 98, 99, 0} ;
Un tablou poate avea oricâte dimensiuni. Diagrama sintactică a declaraţiei unui tablou este
următoarea

De exemplu, instrucţiunea
float b[7][3]
declară o matrice cu şapte linii şi trei coloane. Elementele matricei sunt :

b[0][0] b[0][1] b[0][2]


… … …
b[6][0] b[6][1] b[6][2]

Elementele tablourilor sunt memorate pe linii. Un tablou cu mai multe dimensiuni poate fi de
asemenea iniţializat la declararea sa. Fie de definit matricea m cu elemente întregi, pozitive și
negative:
1 2 5 
m= 
3 7 −3
Instrucţiunea corespunzătoare este
int m[2][3] = {{1, 2, 5},{3, 7, -3}};
La utilizarea într-o expresie, indicii elementelor tablourilor pot fi orice expresii întregi.
Presupunem următoarele declaraţii de tablouri

double a[10], b;
int i, j, y[3][4];

Următoarele expresii ce conţin elemente de tablouri se introduc în program astfel (coloana


dreaptă):

4
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

ai + b  yij
(a[i]+b*y[i][j])/(cos(b)-sin(b))
cos ( b ) − sin ( b )
e ( ) + yi , j +1
cos b
exp(cos(b)) + y[i][j + 1]
a jk + b22n −3 a[j][k] + b[2 * n – 3] * b[2 * n – 3]
x12  y23 x[1][2] * y[2][3]

La utilizarea elementelor unui tablou, [] este un operator de selecţie, ce are doi operanzi:
un nume de tablou şi un indice. El se aplică asupra unui nume de tablou şi selectează un
element al acelui tablou. De exemplu, a[0] selectează primul element al tabloului a, iar
b[0] selectează prima linie a tabloului b. Aplicând încă o dată operatorul de selecţie asupra
lui b[0], de exemplu b[0][0], selectează primul element din prima linie a lui b. Operatorul
[] este asociativ la stânga.
In acelaşi mod, operatorul de apelare a unei funcţii (), aplicat asupra unui nume de
funcţie, returnează valoarea calculată de funcţie. De exemplu cos(1.2) reprezintă
aplicarea operatorului () asupra numelui funcţiei cos.

Priorităţile şi asociativitatea operatorilor

Operator Asociativitate
[] () la stânga
+ unar, - unar, (tip) la dreapta
*/% la stânga
+- la stânga

1.9. Instrucţiunea de atribuire


O operaţie definită pentru toate tipurile fundamentale este atribuirea. Operatorul de
atribuire „=” atribuie o valoare unei variabile. Forma instrucţiunii de atribuire este
variabilă = expresie;
De exemplu, următoarele instrucţiuni atribuie valori variabilelor x , y şi z .
float x, y, z;
x = -1.34;
y = sin(x) + cos(x * x);
z = (x + y) / (y + cos(x) * cos(x));
Menţionăm că, la atribuire, expresia din partea dreaptă este convertită în tipul variabilei din
stânga. Fie de exemplu instrucţiunile
int a;
double x = 2.7;
a = x;
Variabila întreagă a primeste valoarea 2.
Fie instrucţiunile
int m = 12, n ;
double x = 3.25, y ;
n=m+x;
y=m+x;
Variabila n primeşte valoarea 15, iar y valoarea 15.25. Expresia m + x are valoarea 15.25 în
ambele instrucţiuni de atribuire. Când este atribuită variabilei n expresia m + x este convertită
la întreg, deci la valoarea 15.

5
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

Limbajele C şi C++ au operatori speciali pentru scrierea prescurtată a instrucţiunilor de


atribuire, +=, -=, *=, /= şi %=. Aceşti operatori se definesc astfel:
Considerăm o variabilă x şi o expresie e. Instrucţiunea
x op= e;
este echivalentă cu
x = x op e;
De exemplu, instrucţiunea
x = x + cos(y) ;
se scrie prescurtat
x += cos(y) ;
Tabelul următor prezintă aceşti operatori

Forma prescurtată a operatorilor de atribuire

Instrucţiune Forma prescurtată


x=x+e x += e
x=x–e x -= e
x=x*e x *= e
x=x/e x /= e
x=x%e x %= e

Alţi operatori de acest tip vor fi prezentaţi ulterior. Menţionăm, în final, că un operator de
atribuire are doi operanzi şi ca rezultat valoarea operandului din stânga. Operanzii de atribuire
sunt asociativi la dreapta (se execută de la dreapta la stânga). Fie de exemplu instrucţiunea
int x, y, z = 1;
Instrucţiunea
x = y = z;
atribuie variabilelor x şi y valoarea 1. Instrucţiunea
x += y += z;
atribuie variabilei y valoarea 2 şi variabilei x valoarea 3. De ce?

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