+ All Categories
Home > Documents > PCLP1_Capitolul3

PCLP1_Capitolul3

Date post: 17-Nov-2015
Category:
Upload: gheorghe-gigi
View: 215 times
Download: 1 times
Share this document with a friend
47
Expresii aritmetice, apeluri de funcţii şi ieşiri Programarea calculatoarelor şi limbaje de programare I Capitolul 3
Transcript
  • Expresii aritmetice, apeluri de funcii i ieiriProgramarea calculatoarelor i limbaje de programare I

    Capitolul 3

    Programarea calculatoarelor i limbaje de programare I

  • IntroducereVom vedea cum se scriu expresiile aritmetice cum se formateaz ieirilecum putem folosi bibliotecile de funcii funcii scrise anterior i care fac parte din orice sistem C++

    Programarea calculatoarelor i limbaje de programare I

  • SumarExpresii aritmeticeApeluri de funcii i biblioteci de funcii Formatarea ieirilor

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeReguli de precedenExpresiile aritmetice sunt formate din constante, variabile, operatori i parantezeOrdinea n care sunt realizate operaiile este stabilit conform regulilor de precedenCele 5 operaii aritmetice de baz i parantezele sunt ordonate n felul urmtor: ( ) precedena cea mai ridicat* / % + - precedena cea mai sczut

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeReguli de precedenExemplu

    tempMedie = INGHET + FIERBERE / 2.0Mai nti se efectueaz mprirea FIERBERE / 2.0Apoi rezultatul este adunat cu INGHET ExempluFolosind parantezele, se poate schimba ordinea de evaluare a expresiei

    tempMedie = (INGHET + FIERBERE) / 2.0

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeReguli de precedenAtunci cnd apar n aceeai expresie mai muli operatori cu aceeai preceden, ordinea de grupare sau asociativitatea este de la stnga la dreaptaExemplu

    int1 int2 + int3 este echivalent cu(int1 int2) + int3 dar nu i cu int1 (int2 + int3)

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeConversii implicite i expliciteValorile ntregi i cele reale sunt stocate n mod diferit n memorieModelul din memorie al biilor care reprezint constanta 2 nu arat ca modelul din memorie al biilor care reprezint constanta 2.0Problema 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 spateleinstruciunilor de asignareexpresiilor aritmetice

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeInstruciuni de asignareDac facem declaraiile

    int unInt;float unFloat;atunci variabila unInt poate pstra doar valori ntregi, iar variabila unFloat doar valori n virgul mobilInstruciunea de asignare

    unFloat = 12;pare c ncarc valoarea ntreag 12 n variabila unFloat

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeInstruciuni de asignareCalculatorul nu poate s stocheze altceva dect valori de tip float n variabila unFloatCompilatorul insereaz, n acest caz, dou noi instruciuni care mai nti convertesc valoarea 12 n 12.0 i apoi stocheaz 12.0 n variabila unFloatAceast 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 calculatoarelor i limbaje de programare I

  • Expresii aritmeticeInstruciuni de asignareInstruciunea

    unInt = 4.8;provoac de asemenea o forare de tipCnd un numr real este asignat unei variabile ntregi, partea fracionar este trunchiatCa rezultat, lui unInt i se asigneaz valoarea 4

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeInstruciuni de asignareAdeseori, n conversiile implicite sunt implicate expresii ntregiPstrarea rezultatului unei expresii cu rezultat de tip ntreg ntr-o variabil real (float) nu provoac pierderi de informaieStocarea rezultatului unei expresii reale ntr-o variabil ntreag conduce la trunchierea prii fracionare

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeInstruciuni de asignarePentru 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 calculatoarelor i limbaje de programare I

  • Expresii aritmeticeInstruciuni de asignareExemplu

    unFloat = float(3 * unInt + 2);unInt = int(5.2 / unFloat altFloat);ExempluInstruciunile de mai jos produc rezultate identiceDiferena dintre ele const n claritatea programului i eliminarea erorilor de la compilare

    unInt = unFloat + 8.2;unInt = int(unFloat + 8.2);

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeScrierea expresiilor aritmeticePe lng combinarea diferitelor tipuri de dat n operaia de asignare, este posibil combinarea datelor de diferite tipuri n expresiiExemplu

    unInt * unFloat4.8 + unInt 3ntotdeauna, 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 realSe efectueaz operaiaRezultatul este real

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeScrierea expresiilor aritmeticeVom analiza urmtoarea instruciune considernd c unInt este o varaibil ntreag cu valoarea 2:

    4.8 + unInt 3Operatorul + are operanzi de tipuri diferite, de aceea valoarea lui unInt este forat la 2.0Aceast conversie este temporar i nu afecteaz valoarea 2 stocat n unIntSe efectueaz adunarea, iar rezultatul este 6.8Scderea are de asemenea, doi operanzi de tipuri diferite: 6.8 i 3Valoarea 3 este forat la 3.0, se execut scderea i rezultatul este numrul real 3.8

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeScrierea expresiilor aritmeticen interiorul expresiilor se pot folosi conversiile explicite de tip pentru a reduce riscul de apariie al erorilor i pentru claritate:Exemplu

    float(unInt) * unFloat4.8 + float(unInt 3)Conversiile explicite de tip nu se fac, ns, doar pentru claritate

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeScrierea expresiilor aritmeticeNe propunem s calculm media mai multor numere. Suma lor este stocat n sum si numrul lor este stocat n countAvem urmtoarele declaraii:

    int sum;int count;float average;Valoarea medie se gsete astfel:

    average = sum / count; //eroareDac sum este 60 i count este 80, rezultatul va fi 0.0. De ce?

    Programarea calculatoarelor i limbaje de programare I

  • Expresii aritmeticeScrierea expresiilor aritmeticeExpresia din dreapta operatorului = conine doi operanzi ntregin aceast situaie, mprirea este de tip ntreg, deci rezultatul este 0Apoi, 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 calculatoarelor i limbaje de programare I

  • SumarExpresii aritmeticeApeluri de funcii i biblioteci de funcii Formatarea ieirilor

    Programarea calculatoarelor i limbaje de programare I

  • Apeluri de funcii i biblioteci de funciiApeluri de funciiAm prezentat n cursul trecut un program care coninea trei funcii: main, Patrat i CubToate 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

  • Apeluri de funcii i biblioteci de funciiApeluri de funciin apelul funciei Cub, numrul 27 se numete parametru sau argumentParametrii creeaz posibilitatea unei funcii s lucreze cu diferite valoriPutem scrie

    cout

  • Apeluri de funcii i biblioteci de funciiApeluri de funciiUnele funcii, de exemplu Patrat sau Cub, au un singur parametru n lista de parametriAlte funcii, de exemplu main, nu au niciun parametru n listExist funcii cu doi, trei sau mai muli parametri n list, separai prin virgul

    Programarea calculatoarelor i limbaje de programare I

  • Apeluri de funcii i biblioteci de funciiApeluri de funciiFunciile care ntorc o valoare pot fi utilizate n expresii n acelai fel n care se folosesc constantele sau variabileleValoarea calculat de funcie nlocuiete apelul funciei n expresie.Exemplu

    unInt = Cub(2) * 10; //unInt va pastra valoarea 80ntr-o expresie, un apel de funcie are cea mai mare preceden

    Programarea calculatoarelor i limbaje de programare I

  • Apeluri de funcii i biblioteci de funciiApeluri de funciiConsideraii 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 intDac primete un parametru de tip float, compilatorul realizeaz o forare implicit a tipului de dat.Exemplu

    Cub(6.9) calculeaz i nu

    Programarea calculatoarelor i limbaje de programare I

  • Apeluri de funcii i biblioteci de funciiApeluri de funciiParametrii 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 funcieiDac int1 conine 3 i int2 conine 5, atunci parametrul transmis funciei Cub este 34O expresie din lista de parametri a funciei poate include i apeluri de funciiPutem rescrie apelul precedent folosind funcia Patrat:

    alfa = Cub(Patrat(int1) + Patrat(int2));

    Programarea calculatoarelor i limbaje de programare I

  • Apeluri de funcii i biblioteci de funciiBiblioteci de funciiAnumite calcule, cum ar fi rdcina ptrat, sunt foarte des foloste n programmeLimbajul C++ include o bibliotec standard care este o colecie de funcii prescrise care realizeaz anumite operaiiPentru a folosi o bibliotec de funcii, trebuie s plasm directiva #include la nceputul programului, specificnd fiierul header dorit

    Programarea calculatoarelor i limbaje de programare I

  • Apeluri de funcii i biblioteci de funciiBiblioteci de funcii

    Fiierul header Funcia Tipul parametrilor Tipul rezultatului Rezultatul abs(i) int int Valoarea absolut a lui i cos(x) double double Cosinusul lui x (x n radiani) fabs(x) double double Valoarea absolut a lui x pow(x, y) double double Ridicarea la putere. Dac x=0.0, y trebuie s fie pozitiv. Dac x

  • Apeluri de funcii i biblioteci de funciiFuncii voidUrmtoarea 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 apelantEa realizeaz doar o aciune i apoi revineAcestea sunt funcii care nu ntorc nicio valoare sau funcii void

    Programarea calculatoarelor i limbaje de programare I

  • Apeluri de funcii i biblioteci de funciiFuncii voidSpre deosebire de funciile care ntorc o valoare, acestea se apeleaz ntr-o singur instruciune de sine-stttoareExemplu

    Calcul(plataPeOra, ore);Din punctul de vedere al apelantului, aceste funcii arat ca o comand:

    ExecutaAsta(x, y, z);FaAsta();

    Programarea calculatoarelor i limbaje de programare I

  • SumarExpresii aritmeticeApeluri de funcii i biblioteci de funcii Formatarea ieirilor

    Programarea calculatoarelor i limbaje de programare I

  • Formatarea ieirilorFormatarea ieirilor unui program nseamn modul n care se poate controla apariia pe ecran sau la imprimant a rezultatelor programelorDac variabilele i, j i k au valorile 15, 2 i 6, atunci instruciunea

    cout

  • Formatarea ieirilorSpaierea verticalPentru spaierea vertical se folosete manipulatorul endlO secven de instruciuni de ieire continu s scrie pe linia curent pn cnd endl termin liniaCe afieaz instruciunile urmtoare?

    cout

  • Formatarea ieirilorSpaierea verticalPrima instruciune produce afiarea pe ecran a irului de caractere Formatarea, iar endl provoac trecerea pe rndul urmtorUrmtoarea instruciune produce o nou trecere pe rndul urmtor a cursoruluiA treia instruciune tiprete cuvntul iesirilor i termin liniaRezultatul este:

    Formatarea

    iesirilor.

    Programarea calculatoarelor i limbaje de programare I

  • Formatarea ieirilorSpaierea verticalInstruciunile de mai sus sunt echivalente cu:

    cout

  • Formatarea ieirilorInserarea spaiilor ntr-o liniePentru a controla spaierea orizontal se obinuiete introducerea unor spaii suplimentarePentru a preveni afiarea numerelor 15, 2 i 6 n forma

    Rezultate: 1526putem tipri cte un singur caracter (constant tip char) ntre numere:cout

  • Formatarea ieirilorInserarea spaiilor ntr-o linieDac dorim afiarea unor spaii mai mari, putem opta pentru folosirea irurilor constante care conin spaii:

    cout

  • Formatarea ieirilorInserarea spaiilor ntr-o liniePentru ca spaiile s fie tiprite pe ecran, ele trebuie incluse ntre apostrafe sau ghilimeleRemarcm c instruciunea:

    cout

  • Formatarea ieirilorManipulatorin C++, un manipulator este o entitate care se comport ca o funcie, dar se folosete ca o datca funcie el produce o aciuneca dat poate fi plasat ntr-o serie de operaii de inserieExemplu

    cout

  • Formatarea ieirilorManipulatoriPentru a l folosi pe endl trebuie s includem fiierul header iostreamPentru ceilali manipulatori trebuie s includem fiierul header iomanipExemplu

    #include #include using namespace std;

    int main(){int unInt = 2;cout

  • Formatarea ieirilorManipulatoriManipulatorul setw (set width) permite stabilirea numrului de coloane folosite pentru urmtoarea afiareSe aplic doar numerelor i string-urilor, nu i datelor de tip charParametrul lui setw este o expresie ntreag numit specificaie a dimensiunii cmpuluiNumrul de coloane stabilite pentru afiare se numete cmpData afiat va fi aliniat la dreapta, iar poziiile cmpului rmase astfel libere vor fi umplute cu spaii

    Programarea calculatoarelor i limbaje de programare I

  • Formatarea ieirilorManipulatoriExemplu

    int a = 33;int b = 7132;

    cout

  • Formatarea ieirilorManipulatoriStabilirea dimensiunii cmpului afecteaz doar urmtorul element afiatDup 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

  • Formatarea ieirilorManipulatoriLa specificarea dimensiunii cmpului pentru numerele reale, trebuie s inem cont c punctul zecimal ocup i el o poziieValoarea 4.85 ocup 4 coloane, nu 3Exemplu

    float x = 4.85;cout

  • Formatarea ieirilorManipulatoriObservaii n legtur cu afiarea numerelor realeNumerele foarte mari sunt afiate implicit n form tiinificExemplu

    123456789.5 este afiat 1.23457+008Dac numrul afiat este ntreg, nu se va tipri ca numr realExemplu

    95.0 este afiat 95

    Programarea calculatoarelor i limbaje de programare I

  • Formatarea ieirilorManipulatoriPentru 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 tiinificCea de-a doua instruciune specific faptul c punctul zecimal va fi tiprit ntotdeauna, chiar i pentru numere ntregiAceste setri rmn valabile pn la o nou modificare a lor

    Programarea calculatoarelor i limbaje de programare I

  • Formatarea ieirilorManipulatoriAdeseori 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.39Pentru aceasta trebuie s folosim manipulatorul setprecisionExemplu

    cout

  • Formatarea ieirilorManipulatoriParametrul lui setprecision stabilete numrul de zecimale cu care va fi tiprit un numr realExemplu

    float x = 310.0;cout.setf(ios::fixed, ios::floatfield);cout.setf(ios::showpoint);cout