Sunteți pe pagina 1din 8

3.

Expresii aritmetice, apeluri de funcii i ieiri


n acest curs vom discuta n detaliu despre scrierea expresiilor aritmetice i despre formatarea ieirilor. Vom vedea, de asememea, cum putem folosi bibliotecile de funcii funcii scrise anterior i care fac parte din orice sistem C++.

3.1

Expresii aritmetice

Vom studia modul n care pot fi scrise expresii care conin mai mult de un operator i care folosesc operanzi care au diferite tipuri de dat.

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: Cea mai nalt preceden ( ) * / % + Cea mai sczut preceden Exemplu tempMedie = INGHET + FIERBERE / 2.0 n acest exemplu, mai nti se efectueaz mprirea FIERBERE / 2.0, iar apoi rezultatul este adunat cu INGHET. Folosind parantezele, se poate schimba ordinea de evaluare a expresiei. Exemplu tempMedie = (INGHET + FIERBERE) / 2.0 Mai nti sunt evaluate subexpresiile din paranteze, iar apoi urmm precedena operatorilor. Atunci cnd apar n aceeai expresie mai muli operatori cu aceeai preceden, ordinea de grupare sau asociativitatea este de la stnga la dreapta. Expresia int1 int2 + int3 este echivalent cu (int1 int2) + int3 i nu cu int1 (int2 + int3). Un alt exemplu: (float1 + float2) / float1 * 3.0 Se evalueaz mai nti parantezele, apoi rezultatul se mparte la float1, iar n final se realizeaz multiplicarea cu 3.0.

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.

Programarea calculatoarelor i limbaje de programare I

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. ns calculatorul refuz 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). 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. 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. 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. Exemplu unFloat = float(3 * unInt + 2); unInt = int(5.2 / unFloat altFloat); Urmtoarele dou instruciuni produc rezultate identice: unInt = unFloat + 8.2; unInt = int(unFloat + 8.2); Diferena constnd n claritatea programului i eliminarea erorilor de la compilare.

Scrierea expresiilor aritmetice


Pn acum am vorbit doar despre combinarea diferitelor tipuri de dat n operaia de asignare. Este, de asemenea, 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: 1. ntregul este forat temporar la o valoare real 2. Se efectueaz operaia 3. Rezultatul este real S analizm a doua instruciune din exemplul anterior, n care varianta unInt conine valoarea 2. Operatorul + are operanzi de tipuri diferite, de aceea valoarea lui unInt este forat la 2.0. Aceast conversie este temporar i nu afecteaz

Programarea calculatoarelor i limbaje de programare I

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. 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. 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 6.0 i count este 80, rezultatul va fi 0.0. De ce? 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. Pn acum ne-am referit doar la tipurile int i float. Conversiile se pot aplica i valorilor char, short sau double.

3.2

Apeluri de funcii i biblioteci de funcii

Apeluri de funcii
n capitolul anterior am vzut 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. n apelul funciei Cub, numrul 27 se numete parametru sau argument. Parametrii creeaz posibilitatea unei funcii s lucreze cu diferite valori. Astfel, putem scrie cout << Cub(4); cout << Cub(16); Modelul sintactic al unui apel de funcie este NumeleFunciei(ListDeParametri) Lista de parametri este mecanismul prin care funciile comunic una cu cealalt.

Programarea calculatoarelor i limbaje de programare I

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. 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. 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 Cub(6.9) calculeaz 63 i nu 6.93 Pn acum am folosit doar constante literale ca i parametri ai funciei Cub. Acetia, ns, 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. De exemplu, 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));

Biblioteci de funcii
Anumite calcule, cum ar fi rdcina ptrat, sunt foarte des foloste n programe. De aceea, limbajul C++ include o bibliotec standard care este o colecie de funcii prescrise care realizeaz anumite operaii. Fiierul Funcia Tipul Tipul Rezultatul header parametrilor rezultatului <stdlib.h> abs(i) int Int Valoarea absolut a lui i <math.h> cos(x) double double Cosinusul lui x (x n radiani) <math.h> fabs(x) double double Valoarea absolut a lui x <math.h> pow(x, y) double double x y . Dac x=0.0, y trebuie s fie pozitiv. Dac x<0.0, y trebuie s fie ntreg

Programarea calculatoarelor i limbaje de programare I

Pentru a folosi o bibliotec de funcii, trebuie s plasm directiva #include la nceputul programului, specificnd fiierul header dorit. Exemplu

Funcii void
Pn acum am discutat despre funcii care ntorc o valoare. Dac studiem urmtoarea definiie de funcie, observm c ea ncepe cu cuvntul void n loc de int sau double: void Calcul(...) { ... } Acesta este un exemplu de funcie care nu ntorcea nicio valoare ctre funcia apelant. Ea realizeaz doar o aciune i apoi revine- Acestea sunt funcii care nu ntorc nicio valoare sau funcii void. n multe limbaje de programare aceste funcii se mai numesc i proceduri. Spre deosebire de funciile care ntorc o valoare, acestea se apeleaz ntr-o singur instruciune de sine-stttoare: Exemplu Calcul(plataPeOra, ore); Din punctul de vedere al apelantului, aceste funcii arat ca o comand: ExecutaAsta(x, y, z); FaAsta();

3.3

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.

Spaierea vertical
Am vzut deja c pentru aceasta se folosete manipulatorul endl. O secven de instruciuni de instruciuni de ieire continu s scrie pe linia curent pn cnd endl termin linia. S vedem ce afieaz urmtoarele instruciuni: cout << Formatarea << endl; cout << endl; cout << iesirilor. << endl; 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 calculatoarelor i limbaje de programare I

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; Ultimul exemplu arat c o instruciune C++ poate fi scris pe mai multe linii. Compilatorul urmrete apariia semnului ; i nu sfritul fizic al liniei.

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 Dac dorim afiarea unor spaii mai mari, putem opta pentru folosirea irurilot constante care conin spaii: cout << Rezultate: << i << << j << << k; Aceast instruciune afieaz: Rezultate: 15 2 6 Pentru a produce ieirea: * * * * * * * * * putem folosi urmtoarele instruciuni: cout << * * * * endl; cout << * * * * * << endl; 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.

Manipulatori
Am folosit de multe ori pn acum manipulatorul endl pentru a termina o linie afiat pe ecran. 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, iar ca dat poate fi plasat ntr-o serie de operaii de inserie: cout << unInt << endl << unFloat; Manipulatorii se folosesc numai n instruciuni de intrare sau de ieire. Bibliotecile standard C++ ofer o serie ntreag de manipulatori, iar noi vom studia trei dintre ei: endl, setw i setprecision. Pentru a l folosi pe endl trebuie s includem fiierul header iostream. Pentru ceilali manipulatori trebuie s includem, n plus, i fiierul header iomanip. Exemplu 6

Programarea calculatoarelor i limbaje de programare I

#include <iostream> #include <iomanip> using namespace std; int main() { int unInt = 2; cout << setw(5) << unInt; } Manipulatorul setw (set width) permite stabilirea numrului de coloane folosite pentru urmtoarea afiare. El 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. Exemplu int a = 33; int b = 7132; cout << setw(4) << a << setw(5) << b << setw(7) << "Salut";
cmpurile au fost completate cu spaii; acestea au fost marcate prin

33 7132

Salut

337132Salut cout << setw(1) << a cmpurile au fost mrite automat << setw(4) << b la dimensiunea datei afiate << setw(5) << "Salut"; 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 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 4.85 << setw(6) << x << endl 4.85 << setw(3) << x << endl; 4.85 Exist cteva observaii care trebuie fcute n legtur cu afiarea numerelor reale. 1. Numerele foarte mari sunt afiate implicit n form tiinific. Exemplu

Programarea calculatoarelor i limbaje de programare I

123456789.5 este afiat 1.23457+008 2. Dac numrul afiat este ntreg, nu se va tipri ca numr real. Exemplu 95.0 este afiat 95 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); Aceste instruciuni folosesc noiuni mai avansate de C++ care nu pot fi explicate acum n detaliu. setf este o funcie void asociat stream-ului cout (punctul dintre cout i setf este strict necesar). 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. Momentan vom utiliza aceste instruciuni n aceast form. Aceste setri rmn valabile pn la o nou modificare a lor. 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; 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) 310.00 << setprecision(2) << x; cout << setw(7) 310.00000 << setprecision(5) << x; x=4.827; 4.83 cout << setw(6) << setprecision(2) << x;

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

  • Curs de C++
    Curs de C++
    Document13 pagini
    Curs de C++
    Huluta Mihai
    Încă nu există evaluări
  • Cir
    Cir
    Document85 pagini
    Cir
    gigigigel01
    Încă nu există evaluări
  • Cir
    Cir
    Document85 pagini
    Cir
    gigigigel01
    Încă nu există evaluări
  • Cir
    Cir
    Document85 pagini
    Cir
    gigigigel01
    Încă nu există evaluări
  • Cir
    Cir
    Document85 pagini
    Cir
    gigigigel01
    Încă nu există evaluări
  • Cir
    Cir
    Document85 pagini
    Cir
    gigigigel01
    Încă nu există evaluări
  • Cir
    Cir
    Document85 pagini
    Cir
    gigigigel01
    Încă nu există evaluări
  • Cir
    Cir
    Document85 pagini
    Cir
    gigigigel01
    Încă nu există evaluări
  • Cir
    Cir
    Document85 pagini
    Cir
    gigigigel01
    Încă nu există evaluări
  • PCLP1 Capitolul4
    PCLP1 Capitolul4
    Document11 pagini
    PCLP1 Capitolul4
    gigigigel01
    Încă nu există evaluări
  • PCLP1 Capitolul2
    PCLP1 Capitolul2
    Document65 pagini
    PCLP1 Capitolul2
    gigigigel01
    Încă nu există evaluări
  • PCLP1 Capitolul5
    PCLP1 Capitolul5
    Document11 pagini
    PCLP1 Capitolul5
    gigigigel01
    Încă nu există evaluări
  • PCLP1 - Capitolul1, Programare Si Rezolvarea Problemelor.
    PCLP1 - Capitolul1, Programare Si Rezolvarea Problemelor.
    Document38 pagini
    PCLP1 - Capitolul1, Programare Si Rezolvarea Problemelor.
    sandu405
    Încă nu există evaluări
  • PCLP1 Capitolul1
    PCLP1 Capitolul1
    Document9 pagini
    PCLP1 Capitolul1
    Mario Marius
    Încă nu există evaluări