Indrumar_C++

download Indrumar_C++

of 53

Transcript of Indrumar_C++

  • 8/19/2019 Indrumar_C++

    1/147

    INTRODUCERE

    Limbajul C++ se consideră atît un limbaj de programareintermediar – de nivel scăzut datorită apropierii sale de limbajele deasamblare cu posibilități de manipulare a bi ilor, apel de sistem dețoperare, opera ii cu memoria, etc., cît i un limbaj de nivel înalt cuț ș proprietăți caracteristice limbajelor din această categorie ce permitede a crea aplicații în baza principiilor programării orientate peobiect. Îndrumarul prezintă lucrările de laborator pe care studen iițtrebuie să le execute la disciplina “rogramarea în limbajul de

     programare C++!. entru "iecare lucrare de laborator este indicatătema iș   scopul lucrării, considera iile teoretice necesare, întrebț ări pentru veri"icarea cuno tin elor, temele pentru acasș ț ă i de laborator.ș#ceste compartimente împreună cu bibliogra"ia vor "i utilizate destuden i pentru executarea lucr ț ărilor de laborator.

    entru a "i admis la îndeplinirea lucrării de laborator,"iecare student trebuie să îndeplinească următoarele condi ii$ț –  să execute tema pentru acasă, care constă din descrierea

    algoritmului de rezolvare a problemelor lucrărilor de laborator, –  să răspundă la întrebările de control puse de către pro"esor.

    În perioada e"ectuării lucrărilor de laborator studentulcompilează i executș ă programele corespunzătoare problemelor indicate de către pro"esor în con"ormitate cu îndrumarul delaborator, e"ectuează analiza datelor de intrare i a rezultantelor șob inute, colecteazț ă datele pentru darea de seamă a lucrării.

    Lucrarea de laborator se consideră executată după cestudentul demonstrează pro"esorului "unc ionarea corectț ă a programelor la calculator.

    entru "iecare lucrare studentul pregăte te darea de seamș ă pe care o sus ine în "a a pro"esorului.ț ț

    %area de seamă pentru "iecare lucrare de laborator include$"oaia de titlu, tema, scopul lucrării, con inutul problemei propusețspre rezolvare, descrierea algoritmului de rezolvare a problemei

    &

  • 8/19/2019 Indrumar_C++

    2/147

     propuse, listingul programului, datele ob inute în urma executț ăriilucrării respective, bibliogra"ia utilizată.

    'emele de laborator pentru studen i se indicț ă încon"ormitate cu următorul tabel$

    1 2 3 4 5 6 71 & & & & & & &2 ( ( ( ( ( ( (3 ) ) ) ) ) ) )4 * * * * * * *5 6 7 - - - - - - -8 9 / / / / / / /

    10 &0 &0 &0 &0 &0 &0 &011 && && && && && && &&12 &( &( &( &( &( &( &(13 &) &) &) &) &) &) &)

    14 &* &* &* &* &* &* &*15 & & & & & & &

    e verticală este numărul de ordine al studentului în registru, iar peorizontală este numărul de ordine al lucrării de laborator propuse pentru executare.

    (

  • 8/19/2019 Indrumar_C++

    3/147

  • 8/19/2019 Indrumar_C++

    4/147

    Lucrarea de laborator nr. &Tema:  2eprezentarea tipurilor de date ale limbajului C++ înmemoria calculatorului. 7peratorii limbajului C++. Construc iilețelementare ale limbajului C++ 8instruc iunileț  for, while, do-while,

    if-else,  switch-break,   goto). 'ipuri de date recursive, opera iițasupra listelor, arborilor. Construirea i elaborarea programelor șrecursive. 9i ierele.ș

    Scopu uc!"!##$ "amiliarizarea studen ilor cu r ț eprezentareatipurilor de date ale limbajului C++ în memoria calculatorului,operatorii limbajului C++, construc iile elementare ale limbajuluițC++ 8instruc iunileț  for, while,  do-while, if-else,  switch-break, goto)$ tipuri de date recursive, opera ii asupra listelor, arborilor,țconstruirea i elaborarea programelor recursive, lucrul cu "i ierele.ș ș

    Co%'e!a ##e (eo!e(#ce %ece&a!e:țTipurile simple i structurate ș ale limbajului C++ .

     Identificatorii limbajului C++ sînt "orma i cu ajutorulțcaracterelor al"anumerice i caracterul de subliniereș   “:!. rimul

    caracter al unui identi"icator nu poate "i o ci"ră. Pi ;;legalmesaj ;;legalmaxx ;;legal x3  ;;legal3x ;;3Lc?eie ale limbajul C++sîntauto brea@casec?arclassconst

    continue

    deletedodoubleelseenumexport

    extern

    "loat"or"riendgoto?ugei"

    inline

    interruptlongnearneAoperator  private

     protected

    registerreturns?ortsignedsizeo"static

    struct

    templatet?istBpede"unionunsignedvirtual

    void*

  • 8/19/2019 Indrumar_C++

    5/147

    de"ault "ar int public sAitc? A?ileCuvintele>c?eie nu trebuie utiliza i ca nume de variabile.ț

     Declararea variabilelor trebuie e"ectuată înainte de a "i"olosite, la începutul programului sau c?iar în "unc ie de contextulț

     problemei în interiorul programului nemijlocit înainte de utilizare,cînd apare necesitarea introducerii variabilei. 0 declara ie speci"icț ăun tip i este urmatș ă de o listă de una sau mai multe variabile deacel tip, ca în exemplul de mai jos$

    int i,n;char c, linie[80]; Domeniu de ac iune a variabilelor.ț    ariabilele   pot "i

    ini ializate în momentul declara iei lor. %acț ț ă numele este urmat desemnul egal i de o constantș ă, aceasta serve te la ini ializare, ca înș țurmătoarele exemple$

    char backslash = '\\';int i = 0; float es = !"0e#$;%acă variabila este extern% sau static%, ini ializarea are locț

    o singură dată, înainte ca programul să> iș înceapă execu ia.ț

    ariabilele a&tomate, ini ializate explicit, sț înt ini ializate la "iecarețapel al "unc ieiț în care sînt con inute. ariabilele automate pentruțcare nu există o ini ializare explicitț ă au valoare nede"inită.ariabilele externe i statice se ini ializeazș ț ă implicit cu zero, dar este un bun stil de programare acela de a e"ectua ini ializarea lorț înorice caz.

    9iecare variabilă i constantș ă posedă un tip, care determinădimensiunea spa iului necesar memor ț ării lor. 'ipurile datelor se pot

    divide în două categorii$ tipuri "undamentale i tipuri derivate saușstructurate.

    Tipurile fundamentale ale limbajului C++ sîntchar  reprezentînd tipul caracter   pe & octet,int  întreg pe ( octe ițlon  întreg pe * octe iț float , însemnînd un număr real pe * octe ițdo&ble

    , ata at unui numș

    ăr real pe octe iț

  • 8/19/2019 Indrumar_C++

    6/147

    #ceste tipuri admit di"erite variante, numite tipuri de bazăde date.

    Tipurile enumerabile sînt introduse prin sintaxa n&me (membr&l,membr&), " " " * +arl,+ar), " " " ;

    %e exemplu,en&m -./I (/ -Ș  , 122, 4.5467- c&loarea9&nct, c&loare9linie;-./I c&loare9cerc, c&loare9fond;

    de"ine te tipul de datș ă -./I i declar ș ă variabilelec&loarea9&nct iș  c&loare9linie urmate de declarările a încă douăvariabile c&loare9cerc  iș  c&loare9fond  de tipul enumerabil.

    Dembrii unui tip enumerabil trebuie să "ie numai de tipîntreg. aloarea "iecăruia este ob inutț ă prin incrementarea cu & avalorii membrului anterior, primul membru avînd, implicit,valoarea 0. 3ni ializarea unui membru cu o valoare oarecare,țavîndu>se în vedere că doi membri ai aceluia i tip nu pot aveașaceea i valoare. alorile membrilor urmș ători se stabilesc con"ormregulilor men ionate.

  • 8/19/2019 Indrumar_C++

    7/147

    condi ie=

  • 8/19/2019 Indrumar_C++

    8/147

    2e"eriri prin pointeri pot apărea i în membrul stîng alșatribuirilor. %acă  i con ine adresa luiț i, atunci I i=0 îl pune pe ica 0,  iar I i=!  îl incrementează pe i, ca iș

  • 8/19/2019 Indrumar_C++

    9/147

    char FcE ;; pointer către un caracter +oid F+;  ;; pointer către +oid +=c;  ;; legal > pointerul la caracter depus în

    ;;pointerul către +oid

    c=+;  ;; 3L lipse te conversia de tipșc= pointerul către +oid depus în

     pointerul către caracter cu conversie de tip. eferin aț    prezintă o legătură cu o variabilă, con inț înd o

    adresă. 5pre deosebire de pointeri, în a căror declarare se utilizeazăsimbolul “I!, pentru a de"ini o re"erin ăț , vom "olosi simbolul “G!.

    int i;  ;; declararea unui întregint F=Gi;  ;; de"inirea unui pointer la iint Gr=iE ;; de"inirea unei re"erin e laț i

    #tît , cît iș r  ac ioneazț ă asupra lui i.i=$$E ;; ac iune asupra luiț iF=!3E ;; ac iune asupra luiț ir=)0;  ;; ac iune asupra luiț i.

    i poate sc?imba re"erin a,ș țacesta ne"iind altceva decît o redenumire a variabilei i. În ceea ce prive te utilizarea re"erin elor, va trebui sș ț ă inem cont dețurmătoarele restric ii$ț –  re"erin ele trebuie ini ializate c?iar în momentul declar ț ț ării lor, –  odată "iind ini ializate, re"erin elor nu li se pot sc?imba loca iileț ț ț

    la care se re"eră, –   nu sînt permise re"erin e la re"erin e i pointeri cț ț ș ătre re"erin e,ț

    dar putem avea o re"erin ăț  la un pointer.2e"erin ele pot "i utilizate drept constante, pot "i ini ializateț ț

    cu constante, "unc ii sau c?iar structuri.țTablourile$ din rîndul cărora "ac parte vectorii i matricele,ș

    sînt tipuri de date "oarte apropiate pointerilor i re"erin elor. omș țvedea că orice opera ie, care poate "i rezolvatț ă prin indexarea

    /

  • 8/19/2019 Indrumar_C++

    10/147

    tablourilor, poate "i rezolvată i cu ajutorulș    pointerilor. #st"el,declara iaț

    char linie[80];de"ine teș linie ca "iind un ir deș  0 de caractere i, în acela i timpș ș  ,

    linie va constitui un pointer la caracter. %acă  c este un pointer laun caracter, declarat prin

    char Fc;atunci atribuirea c=G!inie[0]; "ace ca c să indice primul elemental tabloului linie 8de indice zeroH. #ceasta înseamnă că  c con inețadresa lui linie[0]" #cum atribuirea

    c=Fc;va copia con inutul luiț linie[0]  în c. %acă  c indică un element allui linie, atunci, prin de"ini ie,ț  c! indică elementul următor i, înșgeneral, c#i indică cu i elemente înaintea elementului indicat de c, iar ci  cu i  elemente după acela i element. %acș ă  c indicăelementul linie[0], F

  • 8/19/2019 Indrumar_C++

    11/147

     c=linie; HH   iș c; 

    sînt opera ii permise. 4umele unui tablou este o constantț ă i nu oșvariabilă, construc ii de tipulț linie  "iind interzise. 5ingurele

    opera ii permise a "i e"ectuate asupra numelor tablourilor, în a"arațcelor de indexare, sînt cele care pot ac iona asupra constantelor ț

     !ritmetica adreselor   pentru pointeri i tablouri constituieșunul din punctele "orte ale limbajului C++. 5e garantează că nici un pointer care con ine adresa unei date nu va con ine valoarea zero,ț țvaloare rezervată semnalelor de eveniment anormal. #ceastăvaloare este atribuită constantei simbolice  :-.. pentru a indicamai clar că aceasta este o valoare specială pentru un pointer. Îngeneral, întregii nu pot "i asigna i pointerilor, zero "iind un cazțspecial.

  • 8/19/2019 Indrumar_C++

    12/147

    este posibilă omiterea testului explicit, ast"el de cicluri "iind deseoriscrise sub "orma

    Bhile

  • 8/19/2019 Indrumar_C++

    13/147

     pointeriH, sînt ilegale. 4u este permisă adunarea, împăr irea,țdeplasarea logică sau adunarea unui float sau do&ble la pointer.

    Tablourile multidimensionale  pot "i  de"inite cu ajutorultablourilor de tablouri, de exemplu.$

    char ecran [)$][80];excep ie " ț ăcînd tablourile de re"erin e, acestea din urmț ă ne"iind permise datorită "aptului că nu sînt permi i pointerii la re"erin e.ș ț

    %acă 2  este un tablou n#dimensional de dimensiuni i, j, """,k, atunci apari iile luiț  2  în expresii sînt convertite în pointer la untablou n#!>dimensional de dimensiuni  j, """, k . %acă la acesta seaplică explicit sau implicit 8prin indexareH operatorul I, rezultatuleste tabloul n#!>dimensional indicat de pointer, care, la rîndul său,este convertit imediat în pointer.

    'ablourile sînt memorate pe linii i, deci, ultimii indici, deșla stînga la dreapta, variază mai repede decît primii. rimadimensiune a unui tablou se "olose te numai pentru a determinașspa iul ocupat de acesta, ea ne"iind luatț ă în considera ie decț ît ladeterminarea unui element de indici da i.

  • 8/19/2019 Indrumar_C++

    14/147

    terminatorului de ir. În exemplulș mesaj)  avem litere pluscaracterul nul, "iind necesare loca ii în vederea memor ț ăriicuvîntului “6al&tE.

    %imensionarea tablourilor se realizează în concordan ăț   cu

    necesitățile aplica iei. un ir de caractere, atunciș"iecare linie poate "i accesată printr>un pointer la primul săucaracter. ointerii în i i pot "i memora i într>unș ș ț   tablou. %ouă linii pot "i comparate prin transmiterea pointerilor respectivi lui strcm

  • 8/19/2019 Indrumar_C++

    15/147

    trebui să numere liniile la intrare. #ceastă in"orma ie este necesar ț ă pentru sortare i tipș ărire. %eoarece "unc ia de intrare poate operațdoar cu un număr "init de linii, ea va returna o valoare, cum ar "i >&,în cazul în care se vor prezenta mai multe linii. 9unc ia de ie ireț ș

    trebuie doar să tipărească liniile în ordinea în care apar în tabloul de pointeri.

    Vincl&de Dstdio"hSVincl&de Dstrin"hSVincl&de Dconio"hSVdefine .I:II !00Vdefine 4W.2: !000int citeste9linii

  • 8/19/2019 Indrumar_C++

    16/147

      +[jk]=tem; +oid main

  • 8/19/2019 Indrumar_C++

    17/147

    Flinietr  adresează ini ial prima linie, iar, cu "iecare incrementare,țel avansează linia următoare pînă cînd nlinii se epuizează.

    5ortarea are loc în cadrul "unc ieiț   sortare9linii

  • 8/19/2019 Indrumar_C++

    18/147

    obiect9 de9 ti9 str&ct&r% este una sau o listă de variabile pentru care se alocă memorie. %e exemplu,

     str&ct &nct ( float x,R; ;5>a de"init o structură  ca "iind de tip  &nct $ punctul "iind compus

    din două elemente x  iș  R reale. #supra componentelor unei structuri putem ac iona prin intermediul operatorului de apartenenț ăț , “.!, deexemplu$

     "x=!0; "R=30;

  • 8/19/2019 Indrumar_C++

    19/147

    1nele elemente ale unei structuri pot "i cXm&ri de bi i. 1nțcXm  de bi i este o con"igura ie de bi i adiacen i, ce apar într>unț ț ț țelement de tip  int . Cîmpurile sînt declarate de tip  &nsined,  iar numele cîmpului este urmat de două puncte “$! i un numș ăr ce

    reprezintă numărul de bi i ocupa i de cîmpul respectiv$ț ț&nsined n&me9cXmYnr9bi i;ț 

    Cîmpurile pot "i accesate ca orice alt element de structură. 7ricecîmp trebuie să aibă to i bi ii în interiorul unei zone de tipț ț   int   8nu poate avea bi i în douț ă cuvinte di"eriteH. 7rdinea de alocare amemoriei pentru cîmpuri este dependentă de sistem. 1nele sisteme"ac alocarea de la stînga la dreapta, iar altele invers. 4u se potutiliza tablouri de cîmpuri. Cîmpurile nu au adresă i nu li se poateșaplica operatorul de adresare G.

    1n caz special de structuri îl constituie union. #cestea sîntstructuri alternative pentru care dimensiunea spa iului necesar țmemorării lor este egală cu cea mai mare dimensiune necesarămemorării unei componente a acelei structuri. %e exemplu,+ariabila este de tipul

    &nion &n9ti

    ( int ∫ float &float; char &char; &nct &&nct; HH &&nct  este de tipul structurii &nct   +ariabila;

    'oate componentele uniunii ocupă aceea i zonș ă în cadrulmemoriei. 5pre deosebire de structuri, în uniune este accesibilă osingură componentă a unei uniuni. 1niunea se de"ine te în aceea iș șmanieră ca i structurile, cuvîntul>c?eie utilizat "iindș  &nion"

    #peratorii 

    #peratori i e$presii. ș   #c iunile des" ț ășurate în cadruloricărui program, în marea lor majoritate, se e"ectuează prinexpresiile "ormate prin combina ii de date i operatori. Limbajulț șC++ posedă to i operatorii limbajului C i completeazț ș ă această listăcu operatori proprii. %in lista operatorilor disponibili ai limbajuluiC++ indicăm operatorii caracteristici lui neB  – pentru alocareamemoriei, delete  – pentru eliberarea memoriei alocate cu

    operatorulneB,

     $$ – operatorul de scop sau de rezoli ie.ț

     &/

  • 8/19/2019 Indrumar_C++

    20/147

    În "unc ie de numț ărul de operanzi, operatorii se pot clasi"icaîn trei categorii$ operatori unari, binari i ternari.ș

    #peratori unari " 9ormarea expresiilor în care intervinoperatorii unari se produce de la dreapta la stînga.

    #peratorul de indirectareY I se poate aplica unei expresiide tip pointer > decrementează cu &

    valoarea operandului.7peratorul ++, ca i operatorulș  > >, poate "i utilizat atît ca

     pre"ix, cît i ca su"ix. În cazul utilizș ării lor ca pre"ix, întîi seac ioneazț ă cu operatorul asupra valorii operandului i apoi seșutilizează noua valoare a acestuia. În cazul utilizării lor ca su"ix,

    întîi se utilizează valoarea acestuia, apoi se ac ioneazț ă cuoperatorul asupra valorii operandului.

    Conversia unei e$presii &t'pecast ):  este de tipul

  • 8/19/2019 Indrumar_C++

    21/147

    operandului, determinată din declara iile elementelor ce apar înțexpresie.

    #peratorul de alocare a memoriei(  new apare sub "orma ointer9la9n&me = neB n&me [ ini ialiAator]ț 

    i încearcș ă să creeze un obiect n&me prin alocarea unui număr egalcu  siAeof

  • 8/19/2019 Indrumar_C++

    22/147

     bi i egal cu valoarea operandului drept, bi ii elibera i ast"el "iindț ț țcompleta i cu valoareaț  0.

    #peratorul de deplasare la dreaptaY T ac ioneazț ă în modsimilar cu precedentul, singurul element care di"eră "a ăț   de

    operatorul anterior "iind sensul deplasării. %e exemplu, "unc iațde"inită mai jos 5iti 8x,*,)H returnează ) bi i din pozi iileț ț  *,) iș  (,alinia i la dreapta.ț

     5iti

  • 8/19/2019 Indrumar_C++

    23/147

    "orma un blanc i cu "iecare linie 8inclusiv ultimaHșterminată cu un singur caracter XYnZ– linie nouă$

     for

  • 8/19/2019 Indrumar_C++

    24/147

     *nstruc iunea de ciclu condi ionat ț ț  % anterior while esteBhile

  • 8/19/2019 Indrumar_C++

    25/147

      exr93; *7ricare dintre cele trei expresii poate lipsi, absen a expresieițexr9) "iind înlocuită, implicit, cu valoarea &. %e exemplu,

     for

  • 8/19/2019 Indrumar_C++

    26/147

     sBitch

  • 8/19/2019 Indrumar_C++

    27/147

    două variante.

     *nstruc iunea goto i eticheteț ș " Limbajul C++ o"eră

    instruc iuneaț  oto pentru rami"icare. 9ormal, instruc iuneaț  oto nueste necesară i u or se poate scrie programe " ș ș ără ea. Cu toateacestea, există cîteva situa ii în careț  oto î i poate gș ăsi locul. Ceamai obi nuitș ă "olosire este aceea de a abandona prelucrarea înanumite structuri puternic imbricate, de exemplu, de a ie i a"ar ș ă dindouă cicluri deodată, instruc iuneaț break   nu poate "i "olosită,deoarece ea părăse te numai ciclul cel mai din interior.ș #st"el$

     for

  • 8/19/2019 Indrumar_C++

    28/147

    Tipuri de date recursive, opera ii asupra listelor,ț 

    arborilor.

    Listele simplu i dublu lș ăn uite, arborii sț înt "ormate din elementede"inite de structuri cu autore"erire.

  • 8/19/2019 Indrumar_C++

    29/147

    entru organizarea elementelor în "ormă de listă simplulăn uitț ă, se utilizează structurile care sînt legate cîte o componentăîn lan ,ț începutul căreia 8prima structurăH este indicat de pointeruldl . 5tructura care de"ine te elementul listei con ineș ț în a"ară decomponenta in"orma ionalț ă i un pointer la urmș ătorul element dinlistă. %escrierea acestui tip de structură cu autore"erire i pointerulș

    în cauză se "ace în modul următor$tRedef str&ct nod   ;; structura cu autore"erire(float +al;  ;; valoarea componentei in"orma ionaleț

      str&ct nod F&rm ;  ;; pointerul la următorul element din lanț   .;

      . F; HH ointer&l la element&l c&rent . Frim;  ;; pointerul la începutul listei

    entru alocarea memoriei elementelor listei în C++, se utilizeazăoerator&l de alocare$ neB care apare sub "orma ointer9la9n&me = neB n&me [ ini ialiAator];ț 

    care încearcă să creeze un obiect  n&me prin alocarea unui număr egal cu  siAeof

  • 8/19/2019 Indrumar_C++

    30/147

    dl=neB

  • 8/19/2019 Indrumar_C++

    31/147

      ( =neB

  • 8/19/2019 Indrumar_C++

    32/147

    r=neB

  • 8/19/2019 Indrumar_C++

    33/147

      #Ss&ccesor=r;  #Ss&ccesor=are elemente, ea este vidă.#supra elementelor stivei pot "i e"ectuate următoarele

    opera ii$ț

    - veri"icarea dacă stiva este vidă,

    - includerea unui element nou în vîr"ul stiveiE

    - eliminarea elementului din vîr"ul stiveiE

    - accesarea elementului din vîr"ul stivei, dacă stiva nu este vidă.#st"el, opera ia de includere i eliminare a elementului, deț ș

    asemenea, accesarea elementului are loc numai asupra elementuluidin vîr"ul stivei.

    oada este o listă liniară în care elementele listei se eliminădin capul listei i elementele noi se includ prin coada listei.ș

    ))

  • 8/19/2019 Indrumar_C++

    34/147

    oad% de ti +aon este o listă liniară în care includerea ișeliminarea elementelor din listă se e"ectuează din ambele capete8vîr"ul i s" ș îr itulH ale listei.ș

    5tiva i coada se organizeazș ă atît static prin intermediultabloului, cît i dinamic – prin listș ă 8simplu sau dublu lăn uitț ăH.

    om cerceta cum se utilizează lista în "ormă de stivă pentruimplementarea calculării expresiei aritmetice în "ormă inversă poloneză. În ast"el de mod de prezentare a expresiei opera iile sețînregistrează în ordinea executării lor, iar operanzii se a"lănemijlocit în "a a opera iei. %e exemplu, expresiaț ț   8+HI>;( în"orma inversă poloneză are "orma$ U 8 $ F U ) H #

    1tilizînd no iunea de stivț ă, expresia aritmetică în "ormăinversă poloneză se execută print>o singură trecere de examinare aexpresiei. 9iecare număr se introduce în stivă, iar opera ia sețexecută asupra următoarelor două elemente din vîr"ul stivei,înlocuindu>le cu rezultatul opera iei e"ectuate. %inamicațsc?imbărilor din stivă va "i următoarea$

    6 = D S; DUS; DU,8S; D!QS; D!Q,$S; D0S;

      D0,US; D0,U,)S; D0,3S; DUS"Dai jos este descrisă "unc iaț   e+al,  care calculează valoareaexpresiei indicate în tabloul m  în "ormă de expresie inversă poloneză, m[i]S0 indică numărul nenegativ, iar valoarea m[i]D0 >opera ia.ț În calitate de coduri pentru opera iile de adunare, scț ădere,înmul ire iț ș împăr ire se aleg numerele$ț   >&, >(, >), >*. entruorganizarea stivei se utilizează tabloul interior  stack . arametrii

    "unc iei sț înt tabloul de intrare m  i lungimea saș l . float e+al

  • 8/19/2019 Indrumar_C++

    35/147

      ( case #!Y stack[]=c; break;  case #)Y stack[]#=c; break;  case #3Y stack[]F=c; break;  case #QY stack[]H=c;

      else stack[]=n;  ret&rnun arbore există noduri cărora nu le corespundsubarbori. #st"el de noduri se numesc terminale.

    În multe aplica ii se utilizeazț ă no iunea deț arbori binari.%acă mul imea de elemente a arborelui binar este vidț ă, seconsideră că arborele constă numai din rădăcină. %acă mul imea deț

    elemente este nevidă, arborele binar se divide în două submul imi$ț s&barborele dret   iș cel de stXna. #rborele binar este ordonat,deoarece în "iecare nod subarborele stîng se consideră că precedesubarborele drept. 1n nod al unui arbore binar poate să aibă numaiun descendent$ subarborele drept sau subarborele stîng. %eexemplu, un nod al unui arbore binar poate "i o structură care poate"i de"inită în "elul următor$

    tRedef str&ct tnod 

     ( int nr, int f; HH declarații str&ct tnod Fst; HH este pointerul spre subarborele stîng

    al ;;nodului curent str&ct tnod Fdr; HH este pointerul spre subarborele drept

    al ;;nodului curent  7:/;#supra arborilor binari pot "i de"inite următoarele opera ii$ț

     – a"i area componentelor in"orma ionale ale nodului,ș ț

    )

  • 8/19/2019 Indrumar_C++

    36/147

     – speci"icarea criteriului de determinare a pozi ieiț în care să seinserteze în arbore nodul curentE

     – determinarea ec?ivalen ei a doi arboriEț – insertarea unui nod terminal într>un arbore binarE

     – accesarea unui nod al arborelui, –  parcurgerea unui arboreE –  tergerea unui arbore.ș

    #"i area componentelor in"orma ionale ale nodului se poateș țde e"ectuat prin "unc ia$ț

    +oid rel&crare

  • 8/19/2019 Indrumar_C++

    37/147

    if

  • 8/19/2019 Indrumar_C++

    38/147

     arcurgerea Xn ostordine presupune parcurgerea mai întîi a

    subarborelui stîng, apoi a arborelui drept i,ș în "inal, accesul larădăcina arborelui.

    +oid ostord

  • 8/19/2019 Indrumar_C++

    39/147

  • 8/19/2019 Indrumar_C++

    40/147

     if

    int smacc< int,int*;  if

  • 8/19/2019 Indrumar_C++

    41/147

    i ierele inputoutput ale limbajul C++. ș  Deschiderea i  ș

    )nchiderea fi ierelor. ș Citirea i scrierea )n fi iere ș ș "Limbajul C++ include în sine "unc iile standard input;outputț

    ale limbajului C de prelucrare a "ișierelor la nivelul jos, in"erior iș

    superior.9unc iile de prelucrare a "i ierelor de nivel in"erior pot "iț ș

    utilizate prin includerea "i ierelorș io"h, fcntl"h iș  stat"h"entru desc?iderea unui "i ier se utilizeazș ă "unc iaț oen

    care are următoarea "ormă sintactică$df = oen

  • 8/19/2019 Indrumar_C++

    42/147

    unde df   este descriptor de "i ierEș b&f  – pointer spre zona dememorie în care se va păstra înregistrarea citită din "i ierEș l&n – lungimea în octe i aț înregistrării citite.

    Înregistrarea în "i ier se e"ectueazș ă prin "unc iaț Brite.

    #ceastă "unc ie are aceia i parametri ca i "unc iaț ș ș ț read .ozi ionareaț într>un "i ier se e"ectueazș ă prin "unc iaț

     fseeko constantț ă de tip ir ș

    de caractere, urmată de o listă de argumente.*(

  • 8/19/2019 Indrumar_C++

    43/147

    9unc ia de a"i areț ș  rintf  utilizează ca argumente nume devariabile, iar "unc ia de citireț  scanf   utilizează drept argumenteadrese de variabile. %e exemplu,

    Vincl&deDstdio"hS

    +oid main

  • 8/19/2019 Indrumar_C++

    44/147

    argumentul să "ie pointer la întregEKf  un număr în virgulă "lotantă este a teptatE argumentulș

    corespunzător trebuie să "ie un pointer la un cîmp float"Caracterul de conversie e este Ff" 9ormatul prezentat la

    intrare pentru un "loat este alcătuit dintr>un semnop ionalEț

    Ke un număr în virgulă "lotantă este a teptatE argumentulșcorespunzător trebuie să "ie un pointer la un cîmpdo&ble. Caracterul de conversie e este Fe. 9ormatul prezentat la intrare pentru un double este alcătuit dintr>un semn op ional, un ir de numere care pot sț ș ă con inț ă ișun punct zecimal i un cîmp de exponent care esteș"ormat din 2  sau e, urmat de un întreg cu semnE

    Kc un singur caracter este a teptat la intrareE argumentulșcorespunzător trebuie să "ie un pointer la caracter. În acestcaz, ignorarea caracterelor albe este suprimatăE pentru aciti următorul caracter, altul decît caracterele albe se vautiliza K!sE

    Ks un ir de caractere este a teptatE argumentul corespunzș ș ător 

    trebuie să "ie un pointer al unui tablou de caractere, destulde mare pentru a încăpea irul i un terminatorș ș \0Z, careva "i adăugat.

    Caracterele de conversie d, &, i ,o,  iș  x pot "i precedate delitera l , pentru a indica un pointer la lon , mai degrabă decît la int ,care apare în lista de argumente. 5imilar, litera l  înaintea lui e sau f indică un pointer la double în lista de argumente. %e exemplu$

    int i;

     float x;char n&me[$0]; scanf

  • 8/19/2019 Indrumar_C++

    45/147

    int i; float x;char n&me[$0]; scanf

  • 8/19/2019 Indrumar_C++

    46/147

    9unc iaț  scanf se  utilizează la ini ializarea unor variabile.ț9unc iileț  scanf   iș  rintf sînt utilizate împreună. rin "unc iaț  rintf se  a"i eazș ă un mesaj care adesea este un comentariu legat devaloarea care urmează să "ie introdusă. %e exemplu, în programul

    de mai jos am a"i at mesajul “ș n&m%r real !, după care urmeazăapelul "unc ieiț  scanf   care a teaptș ă introducerea unei valori de tipreal sau întreg$

    Vincl&deDstdio"hS+oid main

  • 8/19/2019 Indrumar_C++

    47/147

    con ine indica ii relativ la modul de utilizare al "i ierului. 1ltimulț ț ș parametru poate con ine caracterulț

       pentru "i iere desc?ise pentru citire,șg   pentru "i iere desc?ise pentru creare sau scriere,ș

    7   pentru "i iere de tip text sauș 5  pentru "i iere binareș

    În exemplul de mai jos am creat un "i ier prin intermediulșunui pointer de tipul  OI.2   i o ini ializare prin "unc iaș ț ț  foen

  • 8/19/2019 Indrumar_C++

    48/147

    . %e"ini i un tablou tridimensional, elementele cț ărora sînt de tip oint .

    /. %a i exemple de utilizare a operatorilor unari, binari i ternari.ț ș&0. rin ce se deosebe te operatorii de incrementare iș ș

    decrementare pre"ixate de cele su"ixate`

    - lista Oi este vidă,*

  • 8/19/2019 Indrumar_C++

    49/147

    - elementul se insertează la începutul listei,

    - elementul se insertează la s"îr itul listei.ș  

    &. Cerceta i programul de mai josț

      tRedef str&ct str!  ( float +al;  str&ct str! Fn;

      :/;  +oid main  */

  • 8/19/2019 Indrumar_C++

    50/147

      r#Sn=+;  #Sn=r;   ret&rna introdus consecutivitatea  45c2r#!, consecutivitateainversată va "i !#r2c54" 1tiliza i no iunea de listț ț ă simplulăn uitț ă.

    &-. Cerceta i opera iile e"ectuate asupra stiveiț ț în programul de mai jos$

    tRedef str&ct st HH declararea tipului 674

    ( char ch;  str&ct st Fs;  674;

      main

  • 8/19/2019 Indrumar_C++

    51/147

    cu zero. %in listă se terg mai întîi elementele negative, apoișnumerele pare.

    (0. 5crie i un program care din trei cozi se selecteazț ă o coadă nouămai întîi numerele negative, zerourile, apoi numerele pozitive.

    (&. #naliza i ce e"ectueazț ă programul de mai jos$

      tRedef str&ct nod   ( float +al;  str&ct nod Fn;

      :/;  int index

  • 8/19/2019 Indrumar_C++

    52/147

    Temee pe%(!u aca&":&. Care dintre exemplele de declara ie i;sau ini ializare sț ș ț întcorecte$

    int r;

    int )$;int =)$;int i;int r=i;r=)$;const int j=)$;int r=j;

    (. 5crie i o versiune de "unc ie cu pointeri pentruț ț  strcat

  • 8/19/2019 Indrumar_C++

    53/147

    &0. 5crie i un program care converte te întregii " ț ș ără semn n  într>oreprezentare binară s.

    &&. 5crie i un program care converte te un întreg într>un numț ș ăr ?exazecimal.

    &(. 5crie i un program de convertire a unui ir de caractere într>unț șîntreg.

    &). 5crie i un program care inverseazț ă un ir de caractere s.ș&*. 5crie i un program pentru a numț ăra bi ii de la dreapta spreț

    stînga pentru "iecare număr citit dintr>un "i ier.ș&. 5crie i un program care rote te un întregț ș n 8citit dintr>un "i ierHș

    la dreapta cu b pozi ii.ț b este un număr aleator de la & la &.&. 5crie i un program care în "iecare numț ăr citit dintr>un "i ier ș

    inversează cei n bi i ai sț ăi care încep de la pozi iaț  , lăsîndu>i pe ceilal i nesc?imba i,ț ț   ia valoare de la & la &0.

    &-. 5crie i un program care converte te literele mari în litere miciț șdintr>un "i ier textual.ș

    &. 5crie i un program care converte te numț ș ărul întreg n  în bazazecimală, citit dintr>un "i ier într>un ir de caractere.ș ș

    &/. 5crie i un program de convertire a "iecț ărui element dintr>o stivă

    într>un ir de caractere.ș

    Temee pe%(!u uc!"!# 'e a*o!a(o!:I.1. 5crie i un program care compar ț ă două stive date.2. 5crie i un program care genereazț ă o mie de seturi de cinci

    numere aleatoare cuprinse între & i *0,ș în "inal a"i îș nd "recven ațcu care a "ost generat "iecare număr.

    3. 5crie i un program pentru a numț ăra bi ii de la dreapta sprețstînga pentru un număr introdus de la tastatură.

    II.1. 5crie i un program care calculeazț ă numărul de elemente dintr>o

    listă simplu lăn uitț ă care sînt mai mici ca valoarea mediearitmetică a tuturor elementelor acestei liste.

    )

  • 8/19/2019 Indrumar_C++

    54/147

    2. 5crie i un program care e"ectueazț ă înmul irea ci"relor unuițnumăr dat.

    3. 5crie i un program care converte te numț ș ărul întreg n  în bazazecimală într>un ir de caractere.ș

    III.1. 5crie i un program care determinț ă un număr obi nuit dinș

    inversul ci"relor numărului dat.2. 5crie i un program care permite crearea unui arbore binar iț ș

    traversarea lui în inordine, preordine, postordine.3. 5crie i un program care converte te întregii " ț ș ără semn  dintr>o

    listă dublu lăn uitț ă în reprezentare binară.I-. &. 5crie i un program care din &00 de numere aleatoare seț

    determină numărul maximal i cel minimal. 5ș ă se determinedi"eren a dintre numț ărul maximal i cel minimal determinatș

    (. 5crie i un program care converte te întregii " ț ș ără semn n selecta ițdintr>un "i ier într>o reprezentare binar ș ă.

    ). 5crie iț   un program care converte te un întreg într>un numș ăr ?exazecimal.

    -.&. 5crie i un program care determinț ă numărul de ordine anumărului minimal dintr>o consecutivitate de numere aleatoare.Cantitatea de numere aleatoare ale consecutivității este aleatoare8 : = !,Z,!00*. alorile numerelor aleatoare ale consecutivitățiisînt din intervalul 0 Z!00000"

    (. 5crie i un program de convertire a unui întreg într>un ir deț șcaractere.

    ). 5crie i un program cu o "uncț ie recursivț ă care calculează cel maimare divizor comun al elementelor dintr>o consecutivitate.

    -I.&. 5crie i un program care determinț ă numărul maximal i celș

    minimal într>o listă circulară de &00 de numere aleatoare. 5ă sedetermine consecutivitatea de elemente ce se a"lă între numerelemaximal i cel minimal determinate.ș

    *

  • 8/19/2019 Indrumar_C++

    55/147

    (. 5crie i un program care calculeaț ză suma ci"relor pentru "iecarenumăr din consecutivitatea de !00 de numere aleatoare.

    ). 5crie i un program care inverseazț ă un ir de caractere s.ș-II.

    &. 5crie i un program care "ormeazț ă o listă nouă simplu lăn uitț ădupă următoarea legitate$ din trei liste simplu lăn uite mai întîițse selectează numerele divizibile la ), i -, apoi – celeș pozitive pare.

    (. 5crie i un program care genereazț ă un "i ier al cș ăror valori aleelementelor sînt cuprinse între & i &00. 5ș ă se determine"recven a cu care a "ost generat "iecare elementț în "i ierul creat.ș

    ). 5crie i un program care inverseazț ă cei n bi i ai elementelor uneițliste simplu lăn uitț ă care încep de pe pozi iaț  , lăsîndu>i peceilal i nesc?imba i.ț ț

    -III.&. 5crieti un program care atribuie unei liste simplu lantuite

    elementele altei liste în ordine inversa.(. 5crieti un program cu "unctie recursiva care calculeaza cel mai

    mare divizor comun dintr>un sir de numere date.

    ). 5crieti un program care din două "isiere ordonate descrescator seunesc in unul nou păstrîndu>i>se ordinea descrescătoare desortare.

    I.&. 5crie i un program care determinț ă cîte numere din

    consecutivitatea de &00 de numere aleatoare sînt mai mari ca“vecinii! săi.

    (. 5crie i un program care înlocuiesc numerele din baza &0 dinț

    consecutivitatea dată cu cele din baza (.). 5crie i un program care decide dacț ă o valoare x  apar ine uneiț

    liste dublu lăn uiteț +.

  • 8/19/2019 Indrumar_C++

    56/147

    &. 5crie i un program care va tipț ări în ordine inversăsubconsecutivitatea de numere dintre valoarea minimă ișmaximă ale unei liste simplu lăn uitț ă.

    (. 5crie i un program care determinț ă un număr obi nuit dinș

    inversul ci"relor numărului dat.). 1tilizînd "unc ia recursivț ă, scrie iț   un program care converte teș

    un întreg citit dintr>un "i ierș în numere ?exazecimale.I.&. 5crie i un program care "ormeazț ă o listă dublu lăn uitț ă nouă din

    cea dată după următoarea legitate$ elementele listei noi se ob inețdin inversul ci"relor numărului din lista dată.

    (. 5ă se scrie un program care ar con ine douț ă "unc ii$ una >țrecursivă, a doua > nerecursivă pentru numărarea elementelor unei liste.

    ). 5crie i un program care inverseazț ă "iecare element de tip ir deșcaractere dintr>o listă simplu lăn uitț ă.

    II.&. 5crie i un program care converte te literele mari în litere miciț ș

    utilizînd din elementele unei stive.

    (. 5ă se scrie un program care din lista  .!  ce con ine numerețîntregi să se extragă în lista .) elementele cu numere impare dinlista .!.

    ). 5crie i un program care converte te întregii " ț ș ără semn  dintr>olistă simplu lăn uitț ă n$ într>o reprezentare binară.

    III.1. 5crie i un program care calculeaț ză suma ci"relor pentru "iecare

    număr din consecutivitatea de &00 de numere aleatoare.

    (. 5crie i un program care rote te "iecare element al listei dubluț șlăn uiteț n la dreapta cu b pozi ii.ț). 5crie i un program care atribuie unui "i ier elementele altui "i ier ț ș ș

    în ordine inversă.I-.&. 5crie i un program care creeazț ă o listă circulară a căror valori ale

    elementelor sînt cuprinse între & i &00.ș 5ă se determine

    "recven a cu care a "ost generat "iecare element al listei create.ț

  • 8/19/2019 Indrumar_C++

    57/147

    (. 5crie i un program care calculeaț ză suma ci"relor pentru "iecarenumăr din consecutivitatea de !00 de numere aleatoare.

    ). 5crie iț   un program care converte te "iecare element al listeișdublu lăn uite într>un numț ăr ?exazecimal.

    -.&. 5crie i un program care determinț ă cîte numere ale unei cozi de

    &00 de numere aleatoare sînt mai mari ca “vecinii! săi.(. 5crie i un program care "ormeazț ă un "i ier nou din cel dat dupș ă

    următoarea legitate$ elementele "i ierului nou se ob ine dinș ținversul ci"relor numărului din "i ierul dat.ș

    ). #lcătui i un program care ar e"ectua urmț ătoarele opera ii asuprațlistei dublu lăn uite$ț

     –  ini ializarea listeiEț

     –  căutarea elementului după criteriul datE

     – insertarea unui element nou înainte sau după o componentăindicată a listeiE

     –  eliminarea unui element din listăE sortarea componentelor listei.

    -

  • 8/19/2019 Indrumar_C++

    58/147

    /uc!a!ea 'e a*o!a(o! %!. 2Tema: Clase 8constructori, destructoriH.9unc ii i clase prietene.ț ș

    Scopu uc!"!##:  "amiliarizarea studen ilor cu no iunea de clase,ț ț

    utilizarea constructorilor, destructorilor, cu "unc ii i clase prietene.ț ș

    Co%'e!a ##e (eo!e(#ce %ece&a!e:țClase

    5intaxa simpli"icată a declarării unei clase este următoarea$class 4umeClasăN...

    declara ii variabile membri...țdeclara ii "unc ii membri...ț țO

    %in de"inirea clasei se poate observa că clasa este asemănătoare cuo structură.

  • 8/19/2019 Indrumar_C++

    59/147

     rotected  – elementele clasei sînt accesate numai prin intermediul"unc iilor membri sau prieteneț  friend, &blic – toate elementele sîntdisponibile în exteriorul clasei. %e exemplu$

    Vincl&deDiostream"hS

    class mRclass HH se declară un nou tip de date mRclass(ri+ateY int a; HH componenta  int a se declară implicit

    în ;;zona ri+ate &blicY HH "unc iile membri declarate mai joc sț înt

    din ;;zona &blic+oid set9a   ob)"set9a

  • 8/19/2019 Indrumar_C++

    60/147

    TT9unc iileț  set9a  iș  et9a, pentru setarea i "urnizarea valorii pentrușcomponenta a, nu sînt necesare,dacă componenta a va "i inclusă înzona  &blic,. Componenta a  va "i explicit accesată i i se vaș

    ini ializa sau atribui valoare.

  • 8/19/2019 Indrumar_C++

    61/147

    membri, dar pot e"ectua i unele opera ii, cum ar "i, alocareaș țdinamică de memorie, desc?iderea unui "i ier .a. %e exemplu$ș ș

    class ersoana( ri+ateY

      char n&me[Q0];  lon int telefon; &blicY ersoana

  • 8/19/2019 Indrumar_C++

    62/147

    are acela i nume ca i constructorul, "iind precedat de semnul “Q!.ș ș%e exemplu$

    Vincl&deDiostream"hSVincl&deDstrin"hS

    Vincl&deDstdlib"hSVdefine 6iAe )$$class strtRe( ri+ateYchar F;int len; &blicY strtRe

     s!"set

  • 8/19/2019 Indrumar_C++

    63/147

    %estructorii obiectelor membri sînt apela i, dupț ă ce destructorulobiectului principal a "ost executat. %acă obiectul membru estecompus din alte obiecte, atunci se va proceda la executareadestructorilor obiectelor incluse. %estructorii obiectelor membri

    sînt apela i în ordine inversț ă, în care ace tea apar în declara iaș țclasei.

    %in punct de vedere cronologic, constructorul este apelatdupă alocarea memoriei necesare, deci în "aza "inală a creăriiobiectului, iar destructorul înaintea eliberării memoriei a"erente,deci în "aza ini ialț ă a distrugerii sale.

    Constructorii i destructorii se declar ș ă i se de"inesc similar șcu celelalte "unc ii membri, dar prezintț ă o serie de caracteristicispeci"ice$ – numele lor coincide cu numele clasei căreia ii apar inEț

    destructorii se disting de constructori prin "aptul că numele lor este precedat de caracterul

     – nu pot returna nici un rezultat – nu se pot utiliza pointeri către constructori sau destructori – constructorii pot avea parametri, destructorii insa nu. 1n

    constructor "ără parametri poartă denumirea de constr&ctor imlicit .în care o clasa nu dispune de constructori sau destructori,compilatorul de C++ generează automat un constructor, respectivdestructor, implicit.

     /embrii unei clase

    #ccesarea membrilor unei clase se "ace în "elul următor$obiect"1ariabi%embr& = +aloare;

     pentru acces&l  la o variabilă membru, ișobiect"O&nc ieembr&

  • 8/19/2019 Indrumar_C++

    64/147

    class Point (&nsined x, R;&nsined lon 4rie

  • 8/19/2019 Indrumar_C++

    65/147

    Crearea i distrugerea obiectelor. ș 5ă considerăm următorul program C++$

    +oid main

  • 8/19/2019 Indrumar_C++

    66/147

    5ă completăm în continuare clasa Point  cu un constructor ișun destructor$

     PointYYPoint

  • 8/19/2019 Indrumar_C++

    67/147

    """ ;&nsined lon alc&l

  • 8/19/2019 Indrumar_C++

    68/147

     friend class :&melas%Prieten%%e exemplu$class Primalas% ( """

     ;class 4o&alas% ( """ friend class Primalas%; ;Clasa rimaClasă are acces la membrii priva i ai claseiț

    #%ouaClasă. ela ia de rietenie n& este tranAiti+ț  %. %aca o clasa # este

     prietena a clasei 6, i clasa 6 este prietenș ă a unei clase C, aceastanu înseamnă ca # este prietenă clasei C. %e asemenea, rorietateade rietenie n& se mo tene te Xn clasele deri+ateș ș . lase rietenesînt utile în situa ia în care avem nevoie de clase, care sț ă comuniceîntre ele deseori, acestea a"lîndu>se pe acela i nivel ierar?ic. entrușexempli"icare, presupunem că vom implementa o stivă de caractereca o listă simplu înlăn uitț ă. om utiliza două clase, una ata atș ă

    nodurilor din listă i una – stivei propriu>zise.șVincl&deDconio"hSVincl&deDstdio"hSclass sti+a;class nod ( ri+ateY  friend sti+a;  nod

  • 8/19/2019 Indrumar_C++

    69/147

      sti+a

  • 8/19/2019 Indrumar_C++

    70/147

    ( ri+ateY  int x, R; &blicY &nct se însț ă la gradul de “prietenie!.

    else rintf

  • 8/19/2019 Indrumar_C++

    71/147

    2ezultatul îndeplinirii programului$  este mal aroiat de oriine

    %(!e*"!#e pe%(!u +e!#,#ca!ea cu%o (#% eo!:ș ț

    !" Ce se va a"i a la ecran`șVincl&de Diostream"hSint a=!,b=), c=Q3;class n&mere( &blicY  int a,b; +oid 4cti&ne

  • 8/19/2019 Indrumar_C++

    72/147

    #n&mere

    ( &blicY float memorie;calc&lator

  • 8/19/2019 Indrumar_C++

    73/147

    memorie=0 "0; calc&latorYYcalc&lator

  • 8/19/2019 Indrumar_C++

    74/147

    2. 5ă se scrie un program care ar evalua o "unc ie, a cț ărei expresieanalitică se introduce de la terminalul calculatorului ca un ir deșcaractere.

    3. 5ă se scrie un program în care se de"ine te o clasș ă  sti+%

    elementele căreia sînt de un tip abstract de date cu următoarele"unc ii$ț

     –   emtR

  • 8/19/2019 Indrumar_C++

    75/147

    7.  5crie i un program care determinț ă o clasă  sti+% în care sîntdeterminate următoarele "unc ii$ț

     –  emtR

    "i ierului de tip text > urmș ătoarele opera ii$ț –  tipăre te inversat con inutul "iecș ț ărui cuvînt al liniei "i ieruluiș fin, –  sortează lexicogra"ic atît cuvintele din "i ierulș  fin,  cît iș

    cuvintele inversate, –  determină cuvintele “simetrice! din "i ierulș  fin.9.  5crie i un program care determinț ă clasa arbore"  #supra

    elementelor arborelui să se determine următoarele opera ii$ț –  reeat

  • 8/19/2019 Indrumar_C++

    76/147

     –   s&mo "rac ieț ț

    supraunitară, –  adunarea numerelor "rac ionare,ț –  înmul irea numerelor "rac ionare,ț ț –  scăderea numerelor "rac ionare,ț –  împăr irea numerelor "rac ionare.ț ț13. 5crie i un program care e"ectueazț ă următoarele opera ii asupraț

    unităților de lungime 8de exemplu, metri, centimetri, milimetriH$ –  adunarea, –  înmul irea cu un coe"icient,ț –  scăderea, –  împăr irea la un coe"icient,ț –  valoarea numerică a unităților de lungime să se tipărească cu

    cuvinte.14. 5crie i un program care e"ectueazț ă următoarele opera ii asupraț

    unităților de greutate 8de exemplu, tone, @ilograme, grameH$ – 

    adunarea,-

  • 8/19/2019 Indrumar_C++

    77/147

     –  înmul irea cu un coe"icient,ț –  scăderea, –  împăr irea la un coe"icient,ț –  valoarea numerică a unităților de greutate să se tipărească cu

    cuvinte.15. 5crie i un program care e"ectueazț ă următoarele opera ii asupraț

    unităților de timp 8de exemplu, anul, luna, ziua, ceasul, minutul,secundaH$

     –  adunarea, –  înmul irea cu un coe"icient,ț –  scăderea, –  împăr irea la un coe"icient,ț –  valoarea numerică a unităților de timp să se tipărească cucuvinte.

    /uc!a!ea 'e a*o!a(o! %!. 3Tema: Clase derivate, "unc ii virtuale, supraț încărcarea "unc iilor iț șoperatorilor.

    Scopu uc!"!##$ "amiliarizarea studen ilor cu no iunile de claseț țderivate, "unc ii virtuale i rede"inite, operatori supraîncț ș ărca i,țobiecte

    Co%'e!a ##e (eo!e(#ce %ece&a!eț $Clase derivate.

    Do tenirea este o rela ieș ț între clase, caracterizată printrecerea atributelor de la o clasă, de bază, la alta, derivată. Claselederivate posedă toate caracteristicile clasei de bază.

  • 8/19/2019 Indrumar_C++

    78/147

    nivelelor rămînînd aceea i.ș 4o iunea deț deri+are este o abstractizare a no iunii deț

    mo tenire. 7 clasș ă care adaugă proprietăți noi la o clasă dejaexistentă vom spune ca este deri+ata clasei de baA%. Clasa derivată

    mo tene te toate datele i "unc iile membri ale clasei de bazș ș ș ț ăE ea poate adăuga noi date la cele existente i poate suprascrie saușadăuga "unc ii membri. Clasa de bazț ă nu este a"ectată în nici un "elîn urma acestui proces de derivare i, ca urmare, nu trebuieșrecompilată. %eclara ia i codul obiect sînt su"iciente pentruț șcrearea clasei derivate, ceea ce permite reutilizarea i adaptareașu oar  ș ă a codului deja existent, c?iar dacă "i ierul sursș ă nu estedisponibil. #st"el, nu este necesar ca programatorul unei clasederivate să cunoască modul de implementare a "unc iilor membrițdin componenta clasei de bază.

    În "unc ie de necesitț ăți, derivarea claselor va "i un proces cudurată variabilă. În acest sens, se pre"eră conceperea unor clase de bază simple, în locul unora dezvoltate.

    %intr>o clasă de bază pot "i derivate mai multe clase iș"iecare clasă derivată poate servi mai departe ca bază pentru alte

    clase derivate. 5e poate ast"el realiza o ierarhie de clase, care sămodeleze adecvat sisteme complexe. ornind de la clase simple ișgenerale, "iecare nivel al ierar?iei acumulează caracteristicileclaselor [părinte[ i le adaugș ă un anumit grad de specializare. 7clasă poate să mo teneascș ă simultan proprietățile mai multor clase, procedură numită mo tenire m&ltil ș %. Construirea ierar?iei de clasereprezintă activitatea "undamentală în realizarea unei aplica iițorientate obiect. 5intaxa simpli"icată a derivării este$

    class :&melas%eri+at% Y :&melasae5aA%În continuare vom deriva din clasa oint o clasă specializată,

    =rap?icoint, care va [ ti[ sș ă deseneze punctul pe ecran$class @rahicPoint Y &blic Point (&nsined color;@rahicPoint

  • 8/19/2019 Indrumar_C++

    79/147

    +oid 6etW

  • 8/19/2019 Indrumar_C++

    80/147

     – la instan ierea clasei derivate, se apeleazț ă mai întîi constructorulclasei de bază, apoi se apelează propriul constructor.

     – la distrugerea unui obiect al unei clase derivate, este apelat maiîntîi propriul destructor, i apoi destructorul clasei de bazș ă 8în

    ordine inversă creării obiectuluiH.Controlul accesului la clase

    Limbajul C++ permite controlul accesului la membriiclaselor. În acest scop s>au creat trei speci"icatori de control alaccesului$ –   &blic, membrul poate "i accesat de orice "unc ie din domeniulț

    declara iei claseiEț –  ri+ate, membrul este accesibil numai "unc iilor membri iț ș

     rietene ale claseiE –  rotected , similar cu  ri+ate, însă accesul se extinde i laș

    "unc iile membri i prietene ale claselor derivate.ț ș7 "unc ie membru a unei clase are acces la to i membriiț ț

    clasei, indi"erent de speci"icatorul de acces.# a dar, sintaxa declara iei unei clase derivate, incluzîndș ț

    controlul accesului, este$

    class :&melas%eri+at% Y 6ecificator4cces :&melasae5aA%unde 6ecificator4cces poate "i &blic sau ri+ate.

    #tributul dinclasa de bază

    Dodi"icatorde acces

    #ccesulmo tenit de clasașderivată

    #ccesul dinexterior 

     private protected

     public

     private private

     private

    inaccesibil private

     private

    inaccesibilinaccesibil

    inaccesibil private protected public

     public public public

    inaccesibil protected public

    inaccesibilinaccesibilaccesibil

    entru a o"eri clasei derivate acces la un membru al clasei de bază, acesta trebuie declarat  rotected   sau  &blic.

  • 8/19/2019 Indrumar_C++

    81/147

    speci"icatorul  ri+ate sa& rotected în clasa de bază nu sîntaccesibile în mod direct elementelor din clasa derivată, ele pot "iaccesate doar prin unele "unc ii declarate special 8care returneazț ăvalorile elementelor din clasa de bază descrise cu speci"icatorul

     ri+ate sau rotected H. entru respectarea principiului incapsulăriidatelor, datele membri pentru care se o"eră acces claselor derivatese declară în clasa de bază cu atributul  rotected . %e asemenea, pentru a conserva dreptul de acces în urma derivării, se utilizeazăderivarea &blic" #ccesul poate "i stopat pe orice nivel al ierar?ieide clase printr>o derivare cu speci"icatorul de acces ri+ate.

    5tabilirea atributelor de acces ale membrilor unei clase, precum i ale derivș ărilor, dezvoltarea ierar?iei de clase, trebuie săse "acă ast"el ca să nu a"ecteze incapsularea datelor.

    5ă cercetăm exemplul următor, completat cu speci"icatori deacces$

    class Point N rotectedY

    &nsined x, R; &blicY Point

  • 8/19/2019 Indrumar_C++

    82/147

    +oid 6et

  • 8/19/2019 Indrumar_C++

    83/147

    membru 4ria

  • 8/19/2019 Indrumar_C++

    84/147

    5ă vedem cum are loc rescrierea "unc iilor. aimpus reimplementarea acesteia.

     P&nct F;erc c; =Gc; float aria=#S4ria

  • 8/19/2019 Indrumar_C++

    85/147

     float ilindr&YY4ria

  • 8/19/2019 Indrumar_C++

    86/147

    int k=#Sexec&ta

  • 8/19/2019 Indrumar_C++

    87/147

    se "ace în cadrul clasei, întocmai ca o "unc ie membru 8veziț'abelul &.H

    oate "i supra>de"init i pentru oșclasă

    6inar >V I ; R + > G WGG WW

    >V

    6inar  UU VV U UF VVF FF PF

    >V

    6inar F +F >F IF ;FRF GF F WFUUF VVF

    U>5e de"inesc ca"unc ii membriț

    6inar , >Ventru exempli"icare, vom extinde clasa Point  cu utilizarea

    unor operatori. class Point  (HH """ PointG oerator =

  • 8/19/2019 Indrumar_C++

    88/147

    int oerator C=

  • 8/19/2019 Indrumar_C++

    89/147

    %e"inirea operatorilor ca "unc ii membri a unei clase prezintț ăo restric ie major ț ă$ primul operand este obligatoriu să "ie de tipulclasa respectiv.

    În limbajul C++ suprade"inirea operatorilor este supusă unui

    set de restric ii$ț – nu este permis introducerea de noi simboluri de operatoriE – patru operatori nu pot "i rede"ini i 8vezi mai susHEț – caracteristicile operatorilor nu pot "i sc?imbate$ pluralitatea 8nu

    se poate suprade"ini un operator unar ca operator binar sauinversH, preceden a i asociativitatea, prioritatea lorEț ș

     – "unc iaț oerator  trebuie sa aibă cel & inț  un parametru de tipulclasa căruia îi este asociat operatorul suprade"init.rogramatorul are libertatea de a alege natura opera ieiț

    realizate de un operator, însă este recomandat ca noua opera ie sț ă"ie apropiată de semni"ica ia ini ialț ț ă.

     edefinirea operatorului +0. #c iunea acestuia este aceea deța adăuga o valoare unui număr de tip char, int, float sau do&ble.utem rede"ini acest operator, pentru a opera asupra obiectelor, deexemplu, de tip ersoana"

    V incl&de Dstdio"hSV incl&de Dstrin"hSclass ersoana( ri+ateYchar n&me[Q0];lon int telefon;int +irsta; &blicY

     ersoana

  • 8/19/2019 Indrumar_C++

    90/147

    (rintf

  • 8/19/2019 Indrumar_C++

    91/147

    (x = "x; R ="R; ret&rn Fthis; edefinirea operatorului 12.7peratorul de indexare []  se

    de"ine te ast"el$șint Goerator[]

  • 8/19/2019 Indrumar_C++

    92/147

    create de programator. 2egulile ast"el de"inite sînt supuse unor restric ii$ț – într>un ir de conversii nu este admisș ă decît o singură conversie

    de"inită de programatorE

     – se recurge la aceste conversii numai după ce se veri"ică existen ațaltor solu ii 8de exemplu, pentru o atribuire, se veri"icț ă mai întîisupraîncărcarea operatorului de atribuire i în lipsa acestuia seș"ace conversiaH.

    un tip clasă într>un tip de bază sau un alt tip clasă.

    În cazul conversiei dintr>un tip clasă într>un alt tip clasă,"unc iaț oerator  trebuie să aibă acces la datele membri ale claseide la care se "ace conversia, deci trebuie declarată prietenă a clasei

    respective.Conversiile de tip folosind constructori   constă în de"inireaunui constructor ce prime te ca parametru tipul de la care se "aceșconversia. Constructorul întoarce întotdeauna ca rezultat un obiectde tipul clasei de care apar ine, ca urmare, "olosind aceastț ă metodăse pot realiza numai conversii dintr>un tip de bază sau un tip clasăîntr>un tip clasă.

    În cazul conversiei dintr>un tip clasă într>un alt tip clasă,

    constructorul trebuie să aibă acces la datele membri ale clasei de lacare se "ace conversia, deci trebuie declarată prietenă a claseirespective.

    Constructorul de copiere. 7 situa ie care poate apț ăreadeseori este ini ializarea unui obiect cu datele membri ale unuițobiect de acela i tip.

  • 8/19/2019 Indrumar_C++

    93/147

    cînd copierea membru cu membru nu este adecvată. entru arezolva aceste situa ii, în limbajul C++ a "ost introdus unțconstructor special, numit constr&ctor&l de coiere. 5intaxa este$

     :&melas%YY:&melas%

  • 8/19/2019 Indrumar_C++

    94/147

    9unc iile membri statice e"ectueazț ă, de asemenea, opera ii care nuțsînt asociate obiectelor individuale, ci întregii clase. 9unc iilețexterioare clasei pot accesa membrii statici ale acesteia ast"el$

     :&melas%YY:&meembr&

    /biectYY:&meembr&9unc iile membri statice nu primesc ca parametru implicitț

    adresa unui obiect, a adar,ș în cadrul lor cuvîntul>c?eie this nu poate"i utilizat. %e asemenea, membrii normali ai clasei nu pot "i re"eri ițdecît speci"icînd numele unui obiect.

    %(!e*"!#e pe%(!u +e!#,#ca!ea cu%o (#% eo!:ș ț1. Care dintre instruc iunile de mai jos sînt legale`ța(  class sir 

     (ri+ateY static char eos;char Fcontin&t;int dimensi≠ &blicY sir

  • 8/19/2019 Indrumar_C++

    95/147

    argumente trebuie să di"ere de la implementare laimplementare. %e ce acest lucru nu se impune atunci cîndrede"inim "unc iaț  4ria

  • 8/19/2019 Indrumar_C++

    96/147

    class esaje9b&ne( &blicY+irt&al +oid act!

  • 8/19/2019 Indrumar_C++

    97/147

    două clase derivate o&thex iș o&toct care mo tenescș n&m"9unc iaț  shoBn&m

  • 8/19/2019 Indrumar_C++

    98/147

    ce apar ine poligonului.ț6. 5crie i un program care ar de"ini clasa de bazț ă strin" În această

    clasă determina i "unc iaț ț  shoBstrin

  • 8/19/2019 Indrumar_C++

    99/147

     –  să se compare două mul imi,ț –  să se extragă o submul ime din mul imea datț ț ă, –  să se adauge un nou element la mul ime,ț –  să se teargș ă un element din mul ime,ț

     –  să se caute o submul ime din mul imea datț ț ă.9.  5crie i un program care ar de"ini clasa de bazț ă int"  În această

    clasă determina i valorile întregi i "unc iaț ș ț  shoBintun ir de caractere,ș –  să se e"ectueze opera iile algebrice asupra numerelor date.ț11. 5crie i un program care ar de"ini clasa de bazț ă int  în sistemul de

    numera ieț  . În această clasă determina i valorile întregi iț ș"unc iaț  shoBint

  • 8/19/2019 Indrumar_C++

    100/147

    rede"ini în clasa derivată, ast"el ca ea să a"i eze la displaBșvalorile unui număr de tip int" în sistemul de numera ieț  . 5ă see"ectueze următoarele opera ii asupra tipuluiț lonint   însistemul de numera ieț  $

     –  să se determine numărul de ci"re din numărul dat, –  să se compare două numere lonint , –  să se extragă numerele de tip int  din numărul lonint   8partea

    in"erioară i partea superioar ș ăH, –  să se e"ectueze opera iile algebrice asupra numerelor date,ț –  să se inverseze un număr de tip lonint 8partea in"erioară cu cea

    superioarăH.12. 5crie i un program care ar de"ini clasa de bazț ă real  în sistemul

    de numera ieț  . În această clasă determina i valorile reale înțsistemul de numera ieț    i "unc iaș ț  shoBreal

  • 8/19/2019 Indrumar_C++

    101/147

     –  adunarea numerelor "rac ionare,ț –  înmul irea numerelor "rac ionare,ț ț –  scăderea numerelor "rac ionare,ț –  împăr irea numerelor "rac ionare.ț ț

    14. 5crie i un program care ar de"ini clasa de bazț ă list . În aceastăclasă determina i valorile întregi ale listei i "unc iaț ș ț  shoBlist

  • 8/19/2019 Indrumar_C++

    102/147

    /uc!a!ea 'e a*o!a(o! %!. 4.Tema: Clase derivate cu mo tenire multiplș ă.

    Scopu uc!"!##$ "amiliarizarea studen ilor cu cț lasele derivate cu

    mo tenire multiplș ă.

    Co%'e!a ##e (eo!e(#ce %ece&a!e:ț   /o tenirea multipl  ș %

    Limbajul C++ permite crearea de clase care mo tenescș proprietățile mai multor clase de bază. %intr>o clasă de bază pot "iderivate mai multe clase i "iecare clasș ă derivată poate servi mai

    departe ca bază pentru alte clase derivate. 5e poate ast"el realiza oierarhie de clase, care să modeleze adecvat sisteme complexe.ornind de la clase simple i generale, "iecare nivel al ierar?ieișacumulează caracteristicile claselor [părinte[ i le adaugș ă unanumit grad de specializare. 7 clasă poate să mo teneascș ă simultan proprietățile mai multor clase, procedură numită mo tenireșm&ltil%. Construirea ierar?iei de clase reprezintă activitatea"undamentală de realizare a unei aplica ii orientate obiect.ț

    Do tenirea multiplș ă permite "ormarea unei ierar?iei declase. %acă derivarea normală duce la construirea unei ierar?ii detip arbore, derivarea multiplă va genera ierar?ii de tip gra". 5intaxacompletă pentru opera ia de derivare este urmț ătoarea$

    class :&melas%eri+at% Y .istalasee5aA%unde .istalasee5aA% este$

    6ecificator4cces :&melasae5aA%, """Clase virtuale. 1tilizarea mo tenirii multiple se poateș

    complica odată cu cre terea dimensiunii ierar?iei de clase. 7șsitua ie care poate apare este derivarea din douț ă clase de bază,lasa!  iș lasa), care la rîndul lor sînt derivate dintr>o clasăcomună, lasae5aA%. În acest caz, noua clasă, lasa:o&%, vacon ine datele membri ale claseiț lasae5aA% duplicate. %acă prezen a acestor date duplicate este utilț ă, ele pot "i distinse evidentcu ajutorul operatorului de rezolu ie,ț YY. 'otu i, în cele mai multeș

    cazuri, această duplicare nu este necesară i duce la consum inutilș&0(

  • 8/19/2019 Indrumar_C++

    103/147

    de memorie. %e aceea, în C++ a "ost creat un mecanism care vaevita această situa ie, prin intermediul conceptului deț clas%+irt&al%. 5intaxa este$

    class :&melasaeri+at% Y 6ecificator4cces +irt&al 

     :&melasae5aA%#ceastă declara ie nu a"ecteazț ă clasa în cauză, ci numai

    clasele derivate din aceasta. #st"el, clasele lasa!  iș lasa)considerate vor "i declarate virtuale. %eclararea +irt&al   a acestor clase va a"ecta de"inirea constructorului clasei lasa:o&%,deoarece compilatorul nu poate ?otărî care date vor "i trans"eratecătre constructorul lasae5aA%, speci"icate de constructoriilasa!  iș lasa). Constructorul lasa:o&% va trebui modi"icatast"el, încît să trimită datele pentru constructorul lasae5aA%.Într>o ierar?ie de clase derivate, constructorul clasei virtuale esteîntotdeauna apelat primul. %e exemplu,

    class 4( Z;class 5!Y +irt&al &blic 4(Z

    class 5)Y +irt&al &blic 4(Z;class !Y &blic 5!, &blic 5)( Z;

    =ra"ic acest exemplu se poate de prezentat în modul următor$class 4

      +irt&al +irt&al 

      class 5! class 5)

    class  

    %(!e*"!#e pe%(!u +e!#,#ca!ea cu%o (#% eo!:ș ț&. Ce se nume teș mo tenire m&ltil ș %` %a i exemple.ț

    (. Ce se nume te clasș

    ă virtuală` %a i exemple.ț

    &0)

  • 8/19/2019 Indrumar_C++

    104/147

    Temee pe%(!u aca&":&. Ce se va a"i a la ecran dupș ă rularea programului următor`

    Vincl&de Diostream"hS

    cass5l ( &blic Y 5l

  • 8/19/2019 Indrumar_C++

    105/147

     &blic Y 4l

  • 8/19/2019 Indrumar_C++

    106/147

     pentru ac?itarea măr"ii aduse. lata se e"ectuează în lei inîndțcont de cursul valutar (+al&ta, data, +XnAarea, c&m%rarea.

    2. 5ă se e"ectueze următoarele opera ii asupra "igurilor geometrice$țde rotire a "igurii, de mutare pe ecran, de colorare, de decupare a

    unei păr i din obiect, de a scrie text în "igur ț ă. 9igurilegeometrice au următoarele structuri$. tri&nhi = (+Xrfl, +Xrf),+Xrf3, dret&nhi =(+Xrfl, +Xrf), cerc = (centr&, raAa, elisa =un ora a "ost construit un centru de prestare a serviciilor ștele"onice. 3n"orma ia despre ora are urmț ș ătoarea structurăora = (den&mire, cod telefonic, cod o talș ș . La acest centru au"ost conecta i &00 de utilizatori cu adresa$ț (strada, n&m%r&l casei, scara, aartament&l"

     

    9iecare utilizator este abonat tele"onic, pentru care se indică  (n&mele, adresa, n&m%r&l telefon&l&i, data mont%rii"  3n"orma ia despre convorbireațtele"onică a utilizatorului are următoarea structură$ con+orbire

    telefonic% = (cod&l %ț  rii, n&m%r&l solicitat&l&i, ora &l, n&mș %r&l  solicitant&l&i, n&m%r&l de min&te

  • 8/19/2019 Indrumar_C++

    107/147

    structură ar ț  %= (den&mire, cod telefonic, cod o tal"ș   9iecare participant are  re&tatea = (kiloram, ram  i poate participașnumai la una din probele sportive propuse. 5ă se determine celemai bune rezultate sportive ob inute în di"erite probe sportive.ț

    2ezultatele sportive pot "i estimate în di"erite unități, cum ar "i(min&te, sec&nde, s&timi (kiloram, ram, (metri, centimetri,ș.a.

    8. 7 bibliotecă s>a completat cu &00 de căr i. 9iecare carte a "ostț pusă la eviden ăț   cu următoarea structură$ carte =(a&tor,den&mire, an&l de editare, loc&l de editare" 5ă se determine"recven a de utilizare a "iecț ărei căr i. Cititorul este înregistrat laț bibliotecă după următoarea structură$ (strada, n&m%r&l casei, scara, aartament&l, n&m%r&l de telefon"

    9. În municipiul C?i inș ău sunt multe cinematogra"e unde rulează"ilme. 9ilmele sunt înregistrate în baza de date cu următoareastructură$  film = (den&mire, ara, reiAor, en, an&l filmț  %rii"9iecare cinematogra" este înregistrat cu următoarea structură =(den&mire, telefon, adresa, n&m%r&l de loc&riO. 5ă se determinecare gen de "ilme este mai solicitat de vizitatorii cinematogra"ele

    din C?i inș ău.10.  otelurile din C?i inș ău prestează servicii pentru mai multe persoane din mai multe ăț ri. entru "iecare ?otel în baza dedate se va introduce următoarea structură (den&mirea, adresa,n&m%r&l de telefon, n&m%r&l de stele" 9iecare număr la ?otelare structura$ (n&m%r , n&mele locatar&l&i, data sosirii, data lec%rii, cost&l. 9iecare persoană este înregistrată la ?otel$( ara, strada, n&mț  %r&l casei, scara, aartament&l, n&m%r&l de

    telefon" 5ă se determine din ce ar ț ă ne vizitează mai mult.11. La depozitele unor "armacii a "ost adusă mar"ă de export F

    (den&mire, tara de exortare, cantitatea, re &l mț  %rfii, datali+r%rii. Dedicamentele sînt înregistrate în baza de date cuurmătoarea structură$ Ndenumire, tip, ambalaj, cantitate, costO.9iecare "armacie este pusă la eviden ăț   cu următoarea structură

     farmacie=Nn&m%r, telefon, adres%, deschiderea, Xnchiderea

     farmaciei8. Dedicul prescrie re etț

    ă pacientului. acientul este&0-

  • 8/19/2019 Indrumar_C++

    108/147

    înregistrat la policlinică după următoarea structură$ (n&me, adres%,dia'nostic%, data Xmboln%+irii8"  acientul dore te sș ă cumpereaceste leacuri. 5ă se a"le adresele "armaciilor unde sînt depozitatemedicamentele solicitate. 5ă se determine "recven a de solicitare aț

    medicamentelor.12. 5e se a"le ruta cea mai optimală 8din punct de vedere al costului, orei

    sosirii la destina ie, timpuluiH dintre douț ă ora e. Comunicareaș întreaceste două ora e are loc cu autocarele 8ș a&tocar =(model, data

     fabric%rii, &nct&l de destina ie, cost&l r&teiț  H, cu trenul 8mers&l tren&rilor =(n&m%r, destina ie, ora lecț  %rii , ora sosirii,

    cate'oriaOH, cu avionul 8r&ta de a+ion = (n&m%r, destina ia, oraț decol%rii, ora ateriA%rii8H.

    13. La 1niversitatea 'e?nică din Doldova sînt specialități la care seînva ăț   obiecte ce in de in"ormaticț ă$  secialitatea=(fac&ltatea,catedra, obiect&l8, obiect =(den&mire, an, ti&l lec iei, n&mț  %r ore*"

    5ă se determine din punct de vedere geogra"ic cîți studen i dințdi"erite jude e la "acultț ăți au ore de in"ormatică 8 st&dent&l =(n&mele, 'r&a, data i loc&l na terii, media 8"ș ș H

    14. În C?i inș ău sînt multe muzee. 3n"orma ia despre un muzeu poate "iț

    introdusă în următoarea structură$ m&Ae& =( den&mire, adresa,telefon, Xnce&t&l l&cr&l&i, sfXr it&l l&cr&l&i8ș . entru di"eritecategorii de vizitatori 8pensionari, studen i, oameni maturi, copiițmici, eleviH costul biletului de intrare este di"erit. 5ă se determine"recven a de vizitate a muzeului inț ț înd cont de numărul de bilete deintrare vîndute. 3n"orma ia despre bilet are urmț ătoarea structurăbilet9de9intrare=(m&Ae&, ti9bilet, cost&l8"

    15. La aeroportul din C?i inș ău, la depozitul de lucruri pierdute, se a"lă

     bagaje uitate de pasageri. 9iecare bagaj este etic?etat cu următoareain"orma ie$ț ba'aj = (n&m%r r&t%, st%Xn, data, 're&tate8" entrurecuperarea bagajului uitat pasagerul trebuie să prezinte pa aportulș8buletinul de identitateH. 5ă se determine persoanele a cărei ăț ri maides uită bagajul în aeroportul din C?i inș ău.

    16.  La o casă de vindere a imobilului se duce eviden a caselor ț8casa"=(adresa, telefon, n&m%r camere, cost, comodit%ț i8O i aș

    apartamentelor de vînzare 8aartament"=(adresa, telefon, n&m%r &0

  • 8/19/2019 Indrumar_C++

    109/147

    camere, etaj, cost8*" 5ă se determine cele mai solicitate tipuri devînzări e"ectuate de casa de vindere a imobilului.

    /uc!a!ea 'e a*o!a(o! %!. 5.Tema: 9luxurile 3nput i 7utput standard i de"inite de utilizatori.ș ș9ormatarea "luxurilor numerice i textuale. 9luxurile stringuri i deș șmemorie.

    Scopu uc!"!##$ "amiliarizarea studen ilor cu "luxurile input iț șoutput standard i de"inite de utilizatori, cu "ormatarea "luxurilor șnumerice i textuale, cu "luxurile stringuri i de memorie.ș ș  

    Co%'e!a ##e (eo!e(#ce %ece&a!e:ț 4o iune de lu$uri ț 

    Limbajul C++ "olose te conceptul abstract deș  stream  8 fl&xH pentru realizarea opera iilor input;output. %in punctulț  de vedere allimbajului C++, "luxul este o clasă în sens obi nuit.

  • 8/19/2019 Indrumar_C++

    110/147

    de memorie tampon, din care sînt descărcate către dispozitiv înmomentul umplerii acestei zone de memorie.

    3n limbajul C++ "luxurile au "ost implementate utilizîndclase, după cum urmează$

    clasa streamb&f  gestionează zonele tampon,clasa ios este clasa de bază pentru clasele de "luxuri de

    intrare i de ie ire. Clasaș ș ios  are ca variabilămembru un obiect de tip streamb&f,

    clasele istream  ișostream

    sînt derivate din ios,

    clasa iostream este derivată din istream  iș ostream  i o"er ș ămetode pentru lucrul cu terminalul,

    clasa fstream o"eră metode pentru opera ii cu "i iere.ț ș.#biecte standard. La lansarea în execu ie a unui programț

    C++, care include iostream"h, in mod automat compilatorullimbajului C++ creează i ini ializeazș ț ă patru obiecte$cin gestionează intrarea de la intrarea standard 8tastaturaH,co&t  gestionează ie irea cș ătre ie irea standard 8ecranulH,șcerr  gestionează ie irea cș ătre dispozitivul standard de eroare

    8ecranulH, neutilizînd zone tampon,clo  gestionează ie irea cș ătre dispozitivul standard de eroare8ecranulH, utilizînd zone tampon

  • 8/19/2019 Indrumar_C++

    111/147

    co&t DD Informatiee7rimis.aIesire;2espectiv pentru intrare, cin$

    cin SS :&me1ariabil%;%e "apt, cin  iș co&t   sînt ni te obiecte de"inite global, care auș

    supraîncărcat operatorul SS respectiv DD de mai multe ori, pentru"iecare tip de parametru în parte 8int , char F, etc.H$

    istream Goerator SS o "ără nici un parametru, caz în care returnează valoarea utilizată, sau ca re"erin ățla un caracter.

     et

  • 8/19/2019 Indrumar_C++

    112/147

    citi mai multe intrări, deoarece valoarea returnată este de tip întreg,nu un obiect istream. 1n exemplu de utilizare$

    Vincl&de Diostream"hS+oid main

  • 8/19/2019 Indrumar_C++

    113/147

    unc ia cin.ignore&5ț   se utilizează pentru a trece peste unnumăr de caractere pînă la întîlnirea unui anume caracter. 5intaxasa este$

    cin"inore

  • 8/19/2019 Indrumar_C++

    114/147

    dimensiuni mai mari decît cea necesară ie irii, cu "unc iaș țco&t"Bidth

  • 8/19/2019 Indrumar_C++

    115/147

     :&m%r = 83 :&m%r Xn sistem hexaAecimal = 0x30f  :&m%r Xn sistem&l octal, aliniat la sXina = 0!Q! 

     edefinirea operatorilor de intrare i ie ire pentru flu$ul  ș ș

    standard. 7peratorii de intrare i ie ire pentru "luxul standard pot "iș șrede"ini i pentru citirea i înregistrarea obiectului de tipul claseiț șde"inite de utilizator.

    7peratorul de intrare a "luxului standard pentru un obiectdin clasa obj se rede"ine te în modul urmș ător$

    istream G oerator SS

  • 8/19/2019 Indrumar_C++

    116/147

     +oid set

  • 8/19/2019 Indrumar_C++

    117/147

    respectiv ofstream pentru scriere. entru a utiliza "i iere, aplica iileș țtrebuie să includă  fstream"h. Clasele ofstream  iș ifstream  sîntderivate din clasa iostream, ca urmare to i operatorii i toateț ș"unc iile descrise mai sus sînt mo tenite i de aceastț ș ș ă clasă.

    %e"inirea "luxurilor se poate "ace numai prin includerea în program a "i ieruluiș  fstream"h. ifstream, ofstream  iș  fstream  sîntclase. %eclararea unui "lux al utilizatorului este o declarare a unuiobiect din clasa respectivă. Clasele pot con ine atît date, cît iț șmetode 8"unc iiH. 7pera iile input;output se "ac prin intermediulț țunor "unc ii membri ale claselor respective. 5intaxele pentruțconstructorii acestor două clase sînt$

    ofstream 1ariabilazisă se "ace cu operatorul 8supraîncărcatH S, iar citirea cu operatorul T, – la "el ca în cazul "luxurilor standardinput;output.

    &&-

  • 8/19/2019 Indrumar_C++

    118/147

    3deea de a utiliza no iunea abstractț ă de "lux s>a impus dindorin a de a asigura independen a opera iilor input;output "aț ț ț ăț   decalculator sau de sistemul de operare. roducătorii de compilatoarelivrează 8împreună cu compilatorulH biblioteci, care con in clase,ț

    "unc ii, variabile, care permit ca, în mare mț ăsură, aceastăindependen ăț  să "ie asigurată.

    9unc iaț  oen are primul parametru de tip ir de caractereșmodi"icată prin modi"icatorul const"  #cesta reprezintă numele"i ierului, care va "i asociat "luxului. #l doilea parametru speci"icș ămodul de acces la "i ierul asociat "luxului i poate avea urmș ș ătoarelevalori$iosYY aE accesul se "ace prin adăugare la s"îr itulș

    "i ierului,șiosYY ateE pozi ionarea se "ace la s"îr itul "i ierului,ț ș șiosYY binarR; "i ierul este interpretat ca "i ier binar,ș șiosYYinE se asociază unui "lux de intrare,iosYYo&t; se asociază unui "lux de ie ire,șiosYYnocreateE "i ierul trebuie sș ă existe deja,iosYYnorelaceE "i ierul trebuie sș ă nu existe,

    iosYYtr&nc; distruge un "i ier preexistent, avînd acela i nume.ș ș#ce ti constructori au rolul de a desc?ide "i ierul speci"icat caș ș parametru.

    alorile de mai sus sînt constante de"inite în clasa ios,de"inite în "i ierulș ifstream"h" #l treilea parametru este ignorat încazul în care parametrul al doilea este ios YY nocreate.

    Caracteristicile de tip text   iș binarR 8binarH trebuie privite înlegătură cu operatorii "olosi i în opera iile input;output.ț ț 7peratorii,

     pe care i>am "olosit pînă acum 8 iș   TH, utilizează codi"icarea#5C33 a datelor. %e exemplu$

    Vincl&deDfstream"hS+oid main

  • 8/19/2019 Indrumar_C++

    119/147

    ofstream s)

  • 8/19/2019 Indrumar_C++

    120/147

    9unc ia de conversieț l citim cu acelea i caracteristici i cu aceea i operatori.ș ș ș

    Cînd vrem să citim din "i ier, despre care nu tim cum a "ost creat,ș șeste bine să>l citim în mod binar, caracter cu caracter. %e exemplu$

    Vincl&deDfstream"hS+oid main

  • 8/19/2019 Indrumar_C++

    121/147

     s! !)) J\nJ !Q; s! J\n abcd\nJ T"3; s!"closea înscris urmș ătoarele

    !))!Q  abcd T"3

    În "i ierul binar s>a înscris urmș ătoarele$!0))35/3T 93"!38T0Te#Q)În alt exemplu$

    Vincl&deDfstreamS"hS+oid maino codi"icare #5C33,școn inutul acestuia se ia ca un ir de caractere. 3nstruc iuneaț ș ț read copie con inutul "i ierului în irul de caractereț ș ș  . 1ltimainstruc iune din programul de mai sus a"i eazț ș ă la ie irea standardșcon inutul vectoruluiț  . #tribuirea explicită  [!T]=:-..  esteobligatorie pentru a marca s"îr itul irului de caractere.ș ș

    &(&

  • 8/19/2019 Indrumar_C++

    122/147

    entru a înc?ide aceste "i iere, trebuie apelatș ă "unc iațmembru closeun cîmp de lungime "ixă,alinierea 8la stînga sau la dreaptaH i precizia, cu care se "aceșa"i area.ș

    9unc iaț Bidth stabile te dimensiunea cîmpului, calculatș ă în

    caractere, pe care se va "ace scrierea. 9unc ia are un singur ț parametru de tip întreg i trebuie apelatș ă prin intermediul unuiobiect de tip "lux. #st"el, obiectul de tip "lux în memorie, declarat prin simbolul a, va avea "unc ia asociatț ă a" Bidth, prin care amcerut ca "iecare dată, să "ie înregistrată într>un cîmp "ormat din caractere.

    9unc iaț  setf  are, de asemenea, un singur parametru în cazuldat iosYYriht , avînd semni"ica ia de aliniere la dreapta.ț

    9unc iaț  recision are un singur parametru de tip întreg, princare se speci"ică numărul de pozi ii, scrise dupț ă punctul zecimal.%e exemplu$

    Vincl&deDfstream"hSVincl&deDstrstream"hS+oid main

  • 8/19/2019 Indrumar_C++

    123/147

      for < i=0; iDQ; i*  for < j=0; jD$; j*  a[i][j]=

  • 8/19/2019 Indrumar_C++

    124/147

    %(!e*"!#e pe%(!u +e!#,#ca!ea cu%o (#% eo!:ș ț1. Care sînt tipurile de "luxuri standard de"inite de utilizator`2. 5crie i un exemplu de utilizare a "unc iilorț ț read   i Arite aș

    con inutului unei zone de memorie.ț3. %e"ini i parametrii "unc iei membruț ț oen ale unei clase "lux.4. Cum se de"inesc "luxurile de memorie`5. Care sînt "unc iile de "ormatare pentru "luxuri`ț

    Temee pe%(!u aca&":&. Corecta i gre elile i lansa i urmț ș ș ț ătoarele exemple la execu ie. Cețrezultate vor apărea pe ecran`

    &(*

  • 8/19/2019 Indrumar_C++

    125/147

    ( char c; cin"et;if

     f,read

  • 8/19/2019 Indrumar_C++

    126/147

    1. 5crie i un program care compar ț ă două "i iere date.ș2. 5crie i un program care calculeazț ă numărul de elemente ale unui

    "i ier care sș înt mai mici ca valoarea medie aritmetică a tuturor elementelor acestui "i ier.ș

    3.  5crie i un program care tipț ăre te toate cuvintele di"erite deșultimul cuvînt dintr>un "i ier. Cuvintele din "i ier sș ș înt separate prin virgulă, iar.după ultimul cuvînt se pune punct.

    4. 5crie i un program care determinț ă numărul maximal i celșminimal dintr>un ir de &00 de numere aleatoare dintr>un "i ier.ș ș5ubconsecutivitatea de elemente dintre numărul maximal i celșminimal determinat să se înregistreze într>un nou "i ier.ș

    5. 5crie i un program care "ormeazț ă un "i ier nou dupș ă următoarealegitate$ din trei "i iere date maiș întîi se selectează numereledivizibile la ), la i la -, apoi numerele pozitive pare de peșlocuri impare.

    6. 5crie i un program care "ormeazț ă un "i ier nou dupș ă următoarealegitate$ din trei "i iere date maiș întîi se selectează numerelenegative, zerourile, apoi numerele pozitive.

    7. 5crie i un program care ordoneazț ă lexicogra"ic o consecutivitate

    de înregistrări 8dintr>un "i ierH de tipulș   str&ct ( char n&me [30];int ani Xnreistrare;

    2ezultatul ordonării să se înscrie într>un nou "i ier.ș8. 5crie i un program care din douț ă "i iere ordonate descrescș ător se

    va "orma unul în care se va păstra ordinea descrescătoare desortare.

    9. 5crie i un program care sorteazț ă lexicogra"ic cuvintele dintr>un

    text. entru "iecare element sortat să se indice numărul derepetări ale cuvîntului în textul dat.

    10. 5crie i un program care calculeazț ă suma înmul irii numerelor țvecine pe pe locuri pare dintr>un "i ier dat.ș

    11.  5crie i un program care va tipț ări în ordine inversăsubconsecutivitatea de numere dintre valoarea minimă ișmaximă ale unei consecutivități de numere citite dintr>un "i ier.ș

    &(

  • 8/19/2019 Indrumar_C++

    127/147

    12. 5crie i un program care "ormeazț ă un "i ier nou din cel dat dupș ăurmătoarea legitate$ elementele "i ierului nou se ob ine dinș ținversul numerelor din "i ierul dat.ș

    13. 5crie i un program care determinț ă "recven a cu care a "ostț

    generat "iecare element în "i ierului creat.ș alorile elementelor sînt cuprinse între & i &00.ș

    14.  5crie i un program care determinț ă numărul maximal i celșminimal din numerele unui "i ier dat. 5ș ă se determineelementele mai mari ca cel minimal i mai mici ca numș ărulmaximal.

    15.  5crie i un program care e"ectueazț ă re"ormatarea unui "i ier ștextual în "elul următor. Lungimea rîndului de caractere în"i ierul nou are lungimea de 0 de caractere. %acș ă în rîndul datse depistează punctul, restul rîndului din "i ierul dat se scrie dinșrînd nou.

    16. 5crie i un program care din douț ă "i iere date ordonate crescș ător se va "orma unul nou, în care se va păstra ordinea crescătoarede sortare.

    /uc!a!ea 'e a*o!a(o! %!. 6.Tema:'emplates$ 'emplate pentru clase i "unc ii.ș ț  

    Scopu uc!"!##$ "amiliarizarea studen ilor cu cț lase i "unc iiș țgenerice.

    Co%'e!a ##e (eo!e(#ce %ece&a!e:ț

    Clase i func ii generice ș ț 7emlate#&l implementează a a>zisul concept de [ș ti

     arametriAat [ 8[ arametriAed tRe[H. 1n temlate  reprezintă o"amilie de tipuri sau "unc ii, cu alte cuvinte, un ablon sau model.ț ș#cest concept a "ost introdus, în primul rînd, pentru a cre te gradulșde reutilizare a codului. %e exemplu, pentru a implementa o listă denumere întregi este necesară realizarea unei clase speciale 8săspunem  .ist/fInteersH, iar pentru o listă de iruri altș ă clasă 8să

    &(-

  • 8/19/2019 Indrumar_C++

    128/147

    spunem  .ist/f6trinsH. Conceptul de temlate  permite realizareaunei clase generale 8să spunem .ist H, care să accepte orice tip deelement, inclusiv tipuri necunoscute la momentul implementăriiacesteia. 'ipul temlate  este stabilit în momentul instan ierii sale.ț

    'emplate>urile sînt "oarte utile pentru realizarea de biblioteci caretrebuie să o"ere metode generice de prelucrare a datelor. 5intaxagenerală de declarare a unui template este următoarea$

    temlate D .istaeParametri S eclara ieț unde eclara ieț   reprezintă declararea sau de"inirea unei clase sauunei "unc ii, de"inirea unui membru static al unei clase template,țde"inirea unei clase sau "unc ii membri al unei clase template, sauțde"inirea unui membru template al unei clase.

    Clasele parametrizate 8sau clasele templateH se declarăast"el$temlate Dclass :&meParametr&Sclass :&melasa( HH """ HH definirea clasei 

    5tabilirea tipului clasei temlate  se "ace prin intermediul uneiconstruc ii de genul$ț :&melasa D:&meParametr&S

    unde :&meParametr& reprezintă tipul obiectului.9unc iile template se declar ț ă ast"el$temlate Dclass :&meParametr&S HH"""

     HH declara ia f&nc ieiț ț 5ă considerăm în continuare ca exemplu implementarea unei stivegenerice "olosind template>uri.

    Vincl&de Diostream"hStemlate Dclass 7S class 6tackItem( &blicY  6tackItem F:ext;  7i Fata;

    &(

  • 8/19/2019 Indrumar_C++

    129/147

      6tackItem

  • 8/19/2019 Indrumar_C++

    130/147

     $În exemplul următor a "ost implementată o listă generică

    8 .ist H. Ca elemente a listei s>au "olosit obiecte de tip  Point" entru

     parcurgerea u oar ș ă a listei a "ost implementată o clasă de tip[iterator [, care poate "i considerată ca "iind un [cursor[ carestrăbate lista. 9unc iaț  .ist"bein

  • 8/19/2019 Indrumar_C++

    131/147

    7i o9front

  • 8/19/2019 Indrumar_C++

    132/147

     .ist DPointSYYIterator index, end;anPoint.ist"&sh9front

    Clasele template pot avea trei tipuri de rieteni 8 friendsH$ –o clasă sau "unc ie care nu este de tip templateEț –o clasă sau "unc ie templateEț –o clasă sau "unc ie template avînd tipul speci"icat.ț

    %acă este necesară particularizarea unei "unc ii template sau a uneiț"unc ii membri a unei clas