Sunteți pe pagina 1din 47

Expresii aritmetice, apeluri de

funcii i ieiri
Programarea calculatoarelor i
limbaje de programare I
Capitolul 3

Introducere

Vom vedea

cum se scriu expresiile aritmetice


cum se formateaz ieirile
cum putem folosi bibliotecile de funcii
funcii scrise anterior i care fac parte
din orice sistem C++

Programarea calculatoarelo
r i limbaje de programare

Sumar
1.
2.

3.

Expresii aritmetice
Apeluri de funcii i biblioteci de
funcii
Formatarea ieirilor

Programarea calculatoarelo
r i limbaje de programare

Expresii aritmetice
Reguli de preceden

Expresiile aritmetice sunt formate din


constante, variabile, operatori i paranteze
Ordinea n care sunt realizate operaiile
este stabilit conform regulilor de
preceden
Cele 5 operaii aritmetice de baz i
parantezele sunt ordonate n felul urmtor:

(
*
+

)
/
-

precedena cea mai ridicat


%
precedena cea mai sczut
Programarea calculatoarelo
r i limbaje de programare

Expresii aritmetice
Reguli de preceden

Exemplu
tempMedie = INGHET + FIERBERE / 2.0

Mai nti se efectueaz mprirea FIERBERE / 2.0

Apoi rezultatul este adunat cu INGHET

Exemplu
Folosind parantezele, se poate schimba
ordinea de evaluare a expresiei
tempMedie = (INGHET + FIERBERE) / 2.0

Programarea calculatoarelo
r i limbaje de programare

Expresii aritmetice
Reguli de preceden

Atunci cnd apar n aceeai expresie


mai muli operatori cu aceeai
preceden, ordinea de grupare sau
asociativitatea este de la stnga la
dreapta

Exemplu
int1 int2 + int3
este echivalent cu
(int1 int2) + int3
dar nu i cu
int1 (int2 + int3)
Programarea calculatoarelo
r i limbaje de programare

Expresii aritmetice
Conversii implicite i explicite

Valorile ntregi i cele reale sunt stocate n


mod diferit n memorie
Modelul din memorie al biilor care reprezint
constanta 2 nu arat ca modelul din memorie
al biilor care reprezint constanta 2.0
Problema este ce se ntmpl cnd folosim un
ntreg i un real n aceeai expresie sau ntr-o
asignare
Vom studia acest subiect vznd care este
mecanismul din spatele

instruciunilor de asignare
expresiilor aritmetice

Programarea calculatoarelo
r i limbaje de programare

Expresii aritmetice
Instruciuni de asignare

Dac facem declaraiile


int unInt;
float unFloat;

atunci variabila unInt poate pstra doar


valori ntregi, iar variabila unFloat doar
valori n virgul mobil
Instruciunea de asignare
unFloat = 12;

pare c ncarc valoarea ntreag 12 n


variabila unFloat
Programarea calculatoarelo
r i limbaje de programare

Expresii aritmetice
Instruciuni de asignare

Calculatorul nu poate s stocheze altceva


dect valori de tip float n variabila
unFloat
Compilatorul insereaz, n acest caz, dou
noi instruciuni care mai nti convertesc
valoarea 12 n 12.0 i apoi stocheaz 12.0
n variabila unFloat
Aceast transformare automat a unei
valori dintr-un tip de dat n alt tip de dat
se numete conversie implicit (type
coercion, forare de tip)
Programarea calculatoarelo
r i limbaje de programare

Expresii aritmetice
Instruciuni de asignare

Instruciunea
unInt = 4.8;

provoac de asemenea o forare de


tip
Cnd un numr real este asignat unei
variabile ntregi, partea fracionar
este trunchiat
Ca rezultat, lui unInt i se asigneaz
valoarea 4
Programarea calculatoarelo
r i limbaje de programare

10

Expresii aritmetice
Instruciuni de asignare

Adeseori, n conversiile implicite sunt


implicate expresii ntregi
Pstrarea rezultatului unei expresii cu
rezultat de tip ntreg ntr-o variabil
real (float) nu provoac pierderi de
informaie
Stocarea rezultatului unei expresii
reale ntr-o variabil ntreag conduce
la trunchierea prii fracionare
Programarea calculatoarelo
r i limbaje de programare

11

Expresii aritmetice
Instruciuni de asignare

Pentru a clarifica programul i pentru


a evita erorile putem folosi conversia
explicit (type casting)
n C++ o operaie de cast const din
precizarea tipului de dat pe care
dorim s l aib rezultatul urmat, ntre
paranteze, de expresia pe care dorim
s o convertim
Programarea calculatoarelo
r i limbaje de programare

12

Expresii aritmetice
Instruciuni de asignare

Exemplu
unFloat = float(3 * unInt + 2);
unInt = int(5.2 / unFloat altFloat);

Exemplu
Instruciunile de mai jos produc rezultate
identice

Diferena dintre ele const n claritatea


programului i eliminarea erorilor de la
compilare
unInt = unFloat + 8.2;
unInt = int(unFloat + 8.2);

Programarea calculatoarelo
r i limbaje de programare

13

Expresii aritmetice
Scrierea expresiilor aritmetice

Pe lng combinarea diferitelor tipuri de dat n


operaia de asignare, este posibil combinarea datelor
de diferite tipuri n expresii

Exemplu
unInt * unFloat
4.8 + unInt 3
ntotdeauna, cnd ntr-o expresie apar variabile de tip
ntreg i variabile de tip float apar conversii implicite
dup cum urmeaz:

ntregul este forat temporar la o valoare real

Se efectueaz operaia

Rezultatul este real


Programarea calculatoarelo
r i limbaje de programare

14

Expresii aritmetice
Scrierea expresiilor aritmetice

Vom analiza urmtoarea instruciune considernd c


unInt este o varaibil ntreag cu valoarea 2:
4.8 + unInt 3

Operatorul + are operanzi de tipuri diferite, de aceea


valoarea lui unInt este forat la 2.0
Aceast conversie este temporar i nu afecteaz
valoarea 2 stocat n unInt
Se efectueaz adunarea, iar rezultatul este 6.8
Scderea are de asemenea, doi operanzi de tipuri
diferite: 6.8 i 3
Valoarea 3 este forat la 3.0, se execut scderea i
rezultatul este numrul real 3.8
Programarea calculatoarelo
r i limbaje de programare

15

Expresii aritmetice
Scrierea expresiilor aritmetice

n interiorul expresiilor se pot folosi


conversiile explicite de tip pentru a
reduce riscul de apariie al erorilor i
pentru claritate:

Exemplu
float(unInt) * unFloat
4.8 + float(unInt 3)

Conversiile explicite de tip nu se fac,


ns, doar pentru claritate
Programarea calculatoarelo
r i limbaje de programare

16

Expresii aritmetice
Scrierea expresiilor aritmetice

Ne propunem s calculm media mai


multor numere. Suma lor este stocat n
sum si numrul lor este stocat n count
Avem urmtoarele declaraii:
int sum;
int count;
float average;

Valoarea medie se gsete astfel:


average = sum / count; //eroare

Dac sum este 60 i count este 80,


rezultatul va fi 0.0. De ce?
Programarea calculatoarelo
r i limbaje de programare

17

Expresii aritmetice
Scrierea expresiilor aritmetice

Expresia din dreapta operatorului = conine


doi operanzi ntregi
n aceast situaie, mprirea este de tip
ntreg, deci rezultatul este 0
Apoi, rezultatul este convertit la valoarea
real 0.0 nainte de a fi stocat n average.
Pentru a corecta rezultatul, modificm
ultima instruciune astfel:
average = float(sum) / float(count);

mprirea va fi real, iar rezultatul va fi


0.75
Programarea calculatoarelo
r i limbaje de programare

18

Sumar
1.
2.

3.

Expresii aritmetice
Apeluri de funcii i biblioteci de
funcii
Formatarea ieirilor

Programarea calculatoarelo
r i limbaje de programare

19

Apeluri de funcii i biblioteci de


funcii
Apeluri de funcii

Am prezentat n cursul trecut un program care coninea


trei funcii: main, Patrat i Cub
Toate trei returnau cate o valoare. Patrat si Cub
returneaz valori ctre funciile apelante, iar main
ntoarce o valoare ctre sistemul de operare.
n instruciunea
cout << si cubul lui 27 este << Cub(27) << endl;

secvena Cub(27) este un apel de funcie sau invocare


de funcie
Calculatorul oprete temporar execuia funciei main i
pornete funcia Cub. Cnd Cub i ncheie execuia
tuturor instruciunilor, calculatorul revine la main din
punctul n care a fost oprit
Programarea calculatoarelo
r i limbaje de programare

20

Apeluri de funcii i biblioteci de


funcii
Apeluri de funcii

n apelul funciei Cub, numrul 27 se


numete parametru sau argument
Parametrii creeaz posibilitatea unei funcii
s lucreze cu diferite valori
Putem scrie
cout << Cub(4);
cout << Cub(16);

Modelul sintactic al unui apel de funcie:


NumeleFunciei(ListDeParametri)

Lista de parametri este mecanismul prin


care funciile comunic una cu cealalt.
Programarea calculatoarelo
r i limbaje de programare

21

Apeluri de funcii i biblioteci de


funcii
Apeluri de funcii

Unele funcii, de exemplu Patrat sau


Cub, au un singur parametru n lista
de parametri
Alte funcii, de exemplu main, nu au
niciun parametru n list
Exist funcii cu doi, trei sau mai
muli parametri n list, separai prin
virgul
Programarea calculatoarelo
r i limbaje de programare

22

Apeluri de funcii i biblioteci de


funcii
Apeluri de funcii

Funciile care ntorc o valoare pot fi utilizate


n expresii n acelai fel n care se folosesc
constantele sau variabilele
Valoarea calculat de funcie nlocuiete
apelul funciei n expresie.

Exemplu
unInt = Cub(2) * 10;
//unInt va pastra valoarea 80

ntr-o expresie, un apel de funcie are cea


mai mare preceden
Programarea calculatoarelo
r i limbaje de programare

23

Apeluri de funcii i biblioteci de


funcii
Apeluri de funcii

63

Consideraii referitoare la apelurile de funcii:

Apelurile de funcii sunt folosite n expresii. Nu apar


ca instruciuni de sine-stttoare;
Funcia calculeaz o valoare (un rezultat) care poate
fi folosit apoi ntr-o expresie;
Funcia ntoarce exact un rezultat nu mai multe,
nici mai puine.

Funcia Cub ateapt s i se dea, s i se transmit


un parametru de tip int
Dac primete un parametru de tip float,
compilatorul realizeaz o forare implicit a tipului
de dat.

Exemplu

3
3
6
6
.
9
Cub(6.9) calculeaz i nu

Programarea calculatoarelo
r i limbaje de programare

24

Apeluri de funcii i biblioteci de


funcii
Apeluri de funcii

Parametrii unei funcii pot fi i variabile sau constante


simbolice i, n general, expresii avnd un tip potrivit cu
cel al parametrului
n instruciunea
alfa = Cub(int1 * int1 + int2 * int2);

expresia care reprezint lista de parametri este evaluat


prima, i numai dup aceea rezultatul este transmis
funciei
Dac int1 conine 3 i int2 conine 5, atunci
parametrul transmis funciei Cub este 34
O expresie din lista de parametri a funciei poate
include i apeluri de funcii
Putem rescrie apelul precedent folosind funcia Patrat:
alfa = Cub(Patrat(int1) + Patrat(int2));
Programarea calculatoarelo
r i limbaje de programare

25

Apeluri de funcii i biblioteci de


funcii
Biblioteci de funcii

Anumite calcule, cum ar fi rdcina ptrat,


sunt foarte des foloste n programme
Limbajul C++ include o bibliotec standard
care este o colecie de funcii prescrise care
realizeaz anumite operaii
Pentru a folosi o bibliotec de funcii,
trebuie s plasm directiva #include la
nceputul programului, specificnd fiierul
header dorit
Programarea calculatoarelo
r i limbaje de programare

26

Apeluri de funcii i biblioteci de


funcii
Biblioteci de funcii
Fiierul
header
<stdlib.h>

Funcia
abs(i)

Tipul
parametrilor
int

Tipul
Rezultatul
rezultatului
int
Valoarea
absolut a lui i
double
Cosinusul lui x (x
n radiani)

<math.h>

cos(x)

double

<math.h>

fabs(x)

double

double

Valoarea
absolut a lui x

<math.h>

pow(x, y)

double

double

Ridicarea la
putere. Dac
x=0.0, y trebuie
s fie pozitiv.
Dac x<0.0, y
trebuie s fie
ntreg

Programarea calculatoarelo
r i limbaje de programare

27

Apeluri de funcii i biblioteci de


funcii
Funcii void

Urmtoarea definiie de funcie ncepe cu


cuvntul void n loc de int sau double:
void Calcul(...)
{
...
}

Acesta este un exemplu de funcie care nu


ntoarce nicio valoare ctre funcia apelant
Ea realizeaz doar o aciune i apoi revine
Acestea sunt funcii care nu ntorc nicio
valoare sau funcii void
Programarea calculatoarelo
r i limbaje de programare

28

Apeluri de funcii i biblioteci de


funcii
Funcii void

Spre deosebire de funciile care ntorc


o valoare, acestea se apeleaz ntr-o
singur instruciune de sinestttoare

Exemplu
Calcul(plataPeOra, ore);

Din punctul de vedere al apelantului,


aceste funcii arat ca o comand:
ExecutaAsta(x, y, z);
FaAsta();
Programarea calculatoarelo
r i limbaje de programare

29

Sumar
1.
2.

3.

Expresii aritmetice
Apeluri de funcii i biblioteci de
funcii
Formatarea ieirilor

Programarea calculatoarelo
r i limbaje de programare

30

Formatarea ieirilor

Formatarea ieirilor unui program nseamn


modul n care se poate controla apariia pe
ecran sau la imprimant a rezultatelor
programelor
Dac variabilele i, j i k au valorile 15, 2 i
6, atunci instruciunea
cout << Rezultate: << i << j << k;

produce irul de caractere


Rezultate: 1526

Fr spaii ntre numere, rezultatul este


dificil de interpretat
Programarea calculatoarelo
r i limbaje de programare

31

Formatarea ieirilor
Spaierea vertical

Pentru spaierea vertical se folosete


manipulatorul endl
O secven de instruciuni de ieire
continu s scrie pe linia curent
pn cnd endl termin linia
Ce afieaz instruciunile urmtoare?
cout << Formatarea << endl;
cout << endl;
cout << iesirilor. << endl;
Programarea calculatoarelo
r i limbaje de programare

32

Formatarea ieirilor
Spaierea vertical

Prima instruciune produce afiarea pe ecran


a irului de caractere Formatarea, iar endl
provoac trecerea pe rndul urmtor
Urmtoarea instruciune produce o nou
trecere pe rndul urmtor a cursorului
A treia instruciune tiprete cuvntul
iesirilor i termin linia
Rezultatul este:
Formatarea
iesirilor.
Programarea calculatoarelo
r i limbaje de programare

33

Formatarea ieirilor
Spaierea vertical

Instruciunile de mai sus sunt echivalente cu:


cout << Formatarea << endl << endl;
cout << iesirilor. << endl;

sau cu
cout << Formatarea << endl << endl << iesirilor. << endl;

sau cu
cout << Formatarea << endl << endl
<< iesirilor. << endl;

Compilatorul urmrete apariia semnului ; i


nu sfritul fizic al liniei
Programarea calculatoarelo
r i limbaje de programare

34

Formatarea ieirilor
Inserarea spaiilor ntr-o linie

Pentru a controla spaierea orizontal se


obinuiete introducerea unor spaii
suplimentare
Pentru a preveni afiarea numerelor 15, 2 i 6
n forma
Rezultate: 1526

putem tipri cte un singur caracter (constant


tip char) ntre numere:
cout << Rezultate: << i << << j << << k;

Aceast instruciune va afia:


Rezultate: 15 2 6
Programarea calculatoarelo
r i limbaje de programare

35

Formatarea ieirilor
Inserarea spaiilor ntr-o linie

Dac dorim afiarea unor spaii mai mari,


putem opta pentru folosirea irurilor constante
care conin spaii:
cout << Rezultate: << i <<

<< k;

Aceast instruciune afieaz:


Rezultate: 15

<< j <<

Pentru a produce ieirea:


* * * * * * * * *

putem folosi urmtoarele instruciuni:


cout << * * * * ;
cout << * * * * * << endl;
Programarea calculatoarelo
r i limbaje de programare

36

Formatarea ieirilor
Inserarea spaiilor ntr-o linie

Pentru ca spaiile s fie tiprite pe ecran,


ele trebuie incluse ntre apostrafe sau
ghilimele
Remarcm c instruciunea:
cout << * <<

*;

are urmtorul efect:


**

pentru c spaiile care sunt n afara


apostroafelor nu sunt luare n considerare
la tiprire
Programarea calculatoarelo
r i limbaje de programare

37

Formatarea ieirilor
Manipulatori

n C++, un manipulator este o entitate care se


comport ca o funcie, dar se folosete ca o dat

ca funcie el produce o aciune

ca dat poate fi plasat ntr-o serie de operaii de


inserie

Exemplu
cout << unInt << endl << unFloat;

Manipulatorii se folosesc numai n instruciuni de


intrare sau de ieire
Bibliotecile standard C++ ofer o serie ntreag de
manipulatori, ntre care:

endl

setw

setprecision
Programarea calculatoarelo
r i limbaje de programare

38

Formatarea ieirilor
Manipulatori

Pentru a l folosi pe endl trebuie s includem


fiierul header iostream
Pentru ceilali manipulatori trebuie s
includem fiierul header iomanip

Exemplu

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int unInt = 2;
cout << setw(5) << unInt << endl;
}

Programarea calculatoarelo
r i limbaje de programare

39

Formatarea ieirilor
Manipulatori

Manipulatorul setw (set width) permite


stabilirea numrului de coloane folosite
pentru urmtoarea afiare
Se aplic doar numerelor i string-urilor, nu
i datelor de tip char
Parametrul lui setw este o expresie ntreag
numit specificaie a dimensiunii cmpului
Numrul de coloane stabilite pentru afiare
se numete cmp
Data afiat va fi aliniat la dreapta, iar
poziiile cmpului rmase astfel libere vor fi
umplute cu spaii
Programarea calculatoarelo
r i limbaje de programare

40

Formatarea ieirilor
Manipulatori

Exemplu

int a = 33;
int b = 7132;
cout << setw(4) << a
<< setw(5) << b
<< setw(7) << "Salut";
cout << setw(1) << a
<< setw(4) << b
<< setw(5) << "Salut";

337132Salut
cmpurile au fost
completate cu spaii;
acestea au fost marcate
prin
337132Salut
cmpurile au fost mrite
automat la dimensiunea
datei afiate

Programarea calculatoarelo
r i limbaje de programare

41

Formatarea ieirilor
Manipulatori

Stabilirea dimensiunii cmpului afecteaz


doar urmtorul element afiat
Dup aceea, dimensiunea este resetat la 0,
ceea ce nseamn c dimensiunea va fi
extins la attea coloane cte sunt necesare

Exemplu
int a = 33;
int b = 7132;
cout << "Salut" << setw(5) << a << b;

afieaz
Salut

337132

Programarea calculatoarelo
r i limbaje de programare

42

Formatarea ieirilor
Manipulatori

La specificarea dimensiunii cmpului pentru


numerele reale, trebuie s inem cont c
punctul zecimal ocup i el o poziie
Valoarea 4.85 ocup 4 coloane, nu 3

Exemplu

float x = 4.85;
cout << setw(4) << x << endl
<< setw(6) << x << endl
<< setw(3) << x << endl;

4.85
4.85
4.85

Programarea calculatoarelo
r i limbaje de programare

43

Formatarea ieirilor
Manipulatori

Observaii n legtur cu afiarea


numerelor reale

Numerele foarte mari sunt afiate


implicit n form tiinific

Exemplu
123456789.5 este afiat 1.23457+008

Dac numrul afiat este ntreg, nu se va


tipri ca numr real

Exemplu
95.0 este afiat 95
Programarea calculatoarelo
r i limbaje de programare

44

Formatarea ieirilor
Manipulatori

Pentru a evita aceste formate implicite, naintea


afirii oricrui numr real trebuie s includem
urmtoarele dou instruciuni:
cout.setf(ios::fixed, ios::floatfield);
cout.setf(ios::showpoint);

Prima instruciune ne asigur c numerele reale vor fi


tiprite n form zecimal i nu tiinific
Cea de-a doua instruciune specific faptul c punctul
zecimal va fi tiprit ntotdeauna, chiar i pentru
numere ntregi
Aceste setri rmn valabile pn la o nou
modificare a lor

Programarea calculatoarelo
r i limbaje de programare

45

Formatarea ieirilor
Manipulatori

Adeseori dorim s controlm numrul


de zecimale afiate, de exemplu pe
12.8 s l tiprim 12.80 sau pe
16.38753 s l tiprim 16.39
Pentru aceasta trebuie s folosim
manipulatorul setprecision

Exemplu
cout << setprecision(3) << x;

Programarea calculatoarelo
r i limbaje de programare

46

Formatarea ieirilor
Manipulatori

Parametrul lui setprecision stabilete numrul de


zecimale cu care va fi tiprit un numr real

Exemplu

float x = 310.0;
cout.setf(ios::fixed, ios::floatfield);
cout.setf(ios::showpoint);
cout << setw(10)
<< setprecision(2) << x;
cout << setw(7)
<< setprecision(5) << x;
x=4.827;
cout << setw(6)

310.00
310.00000

4.83

<< setprecision(2) << x;

Programarea calculatoarelo
r i limbaje de programare

47

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