pp c++

Upload: vintilescu-bogdan-ion

Post on 25-Feb-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/25/2019 PP C++

    1/116

    BAZELE PROGRAMRII N

    LIMBAJUL C/C + +

    I.1. Prezentarea lima!"l"i C# $%&a"lar' ti("ri )e)ate' &%n*tante' $ariaile' %(erat%ri i e,(re*ii

    Un program este un text ce specific aciuni care vor fi executate de un

    procesor. Scrierea unui program se face ntr-un limbaj de programare.Un limbaj de programareare vocabular i reguli de sintax.Vocabularul este format din uniti lexicale: cele mai simple elemente cu

    semnificaie lingvistic.Sintaxa: ansamblu de reguli pe baza crora se combin elementele

    vocabularului unitile lexicale! pentru a obine fraze corecte instruciuni"secvene de instruciuni" declarare de variabile etc!.

    #lementele vocabularului sunt alctuite din caractere.$rice caracter este reprezentat n calculator n codul %S&'' %merican

    Standard &ode for 'nformation 'nterc(ange!" printr-un numr natural unic" cuprinsntre ) i *++ .

    Caracterelesunt simboluri grupate n litere" cifre i semne speciale" astfel: - literele mari ale alfabetului englez cu codurile ,+"..."): %" " ..." /" 0" 1 - literele mici ale alfabetului englez cu codurile 2"..."3**: a" b" ..." x" 4" z - cifrele bazei zece" care au codurile in 56"..."+2: )" 3" *" ... " - liniua de subliniere 7 - semne de punctuaie i semne speciale : " . : 8 9 ! ; < = > ? @ A B C D E F

    G H - I JUnitile lexicale ale limbajului &C&HH sunt: identificatori" cuvinte c(eie"

    constante" iruri" operatori i separatori. Ka scrierea lor se folosesc reguli precisedate de sintaxa limbajului prin utilizarea setului de caractere al codului %S&''.

    I.1.1. Identificatori i cuvinte cheie

    Un identificatorreprezint o succesiune de litere litera mic este tratat cadistinct de litera mare!" cifre" liniue de subliniere" primul caracter din secvenfiind obligatoriu o liter sau o liniu de subliniere.

    'dentificatorii sunt nume simbolice date de utilizator constantelor"variabilelor" tipurilor de date" funciilor etc" pentru a descrie datele de prelucrat deexemplu nume de variabile! i procesele de prelucrare de exemplu nume defuncii!. Ln general numai primele M* de caractere se consider semnificative n &.

  • 7/25/2019 PP C++

    2/116

    &a identificatori se prefer folosirea unor nume sau simboluri care ssugereze semnificaia mrimilor pe care le desemneaz" contribuind la cretereaclaritii programului.

    Cuvintele cheieNe4Oords! sunt cuvinte rezervate pentru limbaj n sine" auneles predefinit i nu pot avea alt utilizare. %ceste cuvinte se scriu cu litere mici.

    %PS' %merican Pational Standards 'nstitute!& are M* de cuvinte c(eie:auto const double float int shortstruct unsigned break continue else forlong signed switch void case defaultenum goto register sizeof typedef volatilechar do extern if return staticunion while

    I.1.2. Comentariu

    Ln redactarea programelor se folosesc o serie de texte care dau explicaii cuprivire la program" la prile sale la variabilele utilizate etc. %ceste texte explicativese adreseaz utilizatorilorQ se numesc comentarii i sunt ignorate de compilator.

    Ln limbajul & un comentariu ncepe prin /*i se termin prin */.Ln &HH un comentariu care ncape pe un rRnd poate fi scris dup //.

    I.1.3. Tipuri de date, constante, variabile

    ipul unei date determin: - spaiul de memorie ocupatQ - modul de reprezentare internQ - domeniul de valoriQ - timpul de via asociat dateiQ - operatori utilizai i restricii n folosirea acestora.Kimbajul & lucreaz cu valori care pot fi stocate n constante sau variabile.Constantele stoc(eaz valori nemodificabile pe parcursul execuiei

    programului.Variabilele sunt mrimi care i modific valoarea n timpul execuiei

    programului.Tipurile de date utilizatede limbajul & se clasific astfel:

    - tipuri fundamentale- caracter - ntregi - reale - tip void - tipuri derivate - tablouri - pointeri - structuri - uniuni - enumerri

  • 7/25/2019 PP C++

    3/116

    - tip definit de utilizatoripurile fundamentale se mai numesc scalare" predefinite" simple sau de

    baz.

    I.1.4. Tipuri de date standard

    Tatele reprezint informaii care fac obiectul prelucrrilor. iecare dat estememorat ntr-un anumit format. Ve de alt parte" interpretarea valorilor memoratese face diferit" n funcie de semnificaia datelor respective. Vrin urmare" esteimportant atRt modul de memorare a datelor formatul fizic de reprezentare! princare se stabilete domeniul valorilor datelor" cRt i semnificaia lor prin care sestabilesc operaiile care se pot efectua cu aceste date. %ceste caracteristici ale unei

    date sunt precizate prin tipul su.ipurile de date standard predefinite! ale limbajului & sunt:

    Specificator %breviaiaKungime n

    biiTomeniu de valori

    signed char char 6&aracter reprezentat prin cod %S&''sau ntreg binar din intervalul W3*6 ... 3*2.

    unsigned char 6&aracter reprezentat prin cod %S&''sau ntreg binar fr semn dinintervalul ) ... *++.

    signed int int

    dependent

    de calculator3, sau M*

    Lntreg binar reprezentat n cod

    complementar fa de *

    short int short 3,Lntreg binar reprezentat n codcomplementar fa de *" dinintervalul -M*2,6 ... M*2,2.

    long int long M*

    Lntreg binar reprezentat n codcomplementar fa de * dinintervalul-*35256M,56 ... *35256M,52

    unsigned int unsigned

    dependentde calculator

    3, sau M*Lntreg binar fr semn

    unsigned short int unsignedshort

    3, Lntreg binar fr semn din intervalul ) ... ,++M+.

    unsigned long intunsignedlong

    M*Lntreg binar fr semn din intervalul) ... 5*5,2*+

    float M*

    Pumr reprezentat n virgul mobil3bit pentru semn" 2b exponent" *5bmantisa" precizie 2 zecimale.Tomeniu M.5#-M6" M.5#M6;

    long float double ,5 Pumr reprezentat n virgul mobil3 bit ptr. semn" 33b exponent" +*b

  • 7/25/2019 PP C++

    4/116

    mantisa" precizie 3+ zecimale.Tomeniu 3.2#-M)6" 3.2#M)6;

    long double 6)Pumr reprezentat n virgul mobilprecizie 3 zecimale.Tomeniu M.5#-5M*" 3.3#5M*;

    Ve lRng aceste tipuri de date" limbajul & mai dispune de tipul pointer itipul void. ipul voidindic absena oricrei valori.

    Vointerii se utilizeaz pentru a face referire la date cunoscute prin adreselelor. Un pointer este o variabil care are ca valori adrese.

    ipul pointer are formatul: * ;

    ceea ce nseamn c >nume? este un pointer ctre o zon de memorie ce

    conine o dat de tipul >tip>.

    I.1.5. Constante

    $ constant este o valoare fix care apare literalmente n codul surs al unuiprogram. ipul i valoarea constantei sunt determinate de modul n care constantaeste scris. &onstantele pot fi de mai multe tipuri: ntreg" flotantreal!" caracter" irde caractere. %ceste constante sunt folosite" de exemplu" pentru a iniializareavariabilelor.

    Constante ntregi

    $ constant ntreag este un numr ntreg reprezentat n cod complementarfa de * pe 3, bii sau pe M* bii dac nu ncape pe 3, bii. #xemple: 2" -M" ).

    Ln cazul n care dorim ca o constant ntreag din intervalul -M*2,6 ...HM*2,2 s fie reprezentat pe M* bii implicit astfel de constante se reprezint pe3, bii!" vom termina constanta respectiv prin K sau l" adic i impunem tipul long.#xemplu -10L.

    Tac" la o constant ntreag" adugm sufixul U sau u" atunci form tipulconstantei la unsigned int sau unsigned long. Tac adugm sufixul UK sau ul sauUl sau uK constanta va fi de tipul unsigned long.

    $ constant ntreag" precedat de un zero nesemnificativ se consider scrisn sistemul de numeraie cu baza 6.

    $ constant ntreag care ncepe cu 0X sau 0x se consider scris nsistemul de numeraie cu baza 3, cifrele (exazecimale sunt 0...9" a...f sauA...F!. Ln rest se consider c baza de numeraie este 3).

    #xemple:Constanta Tip Constanta Tip!"# int !"#$%&'() long!"!! int /* octal */ !"#+ unsigned int

    x#,! -nt /* hexazecimal */ !"#$%&'(+) unsigned long int

  • 7/25/2019 PP C++

    5/116

    Constante flotante

    %tunci cRnd ncercm s reprezentm n memoria calculatorului un numrreal" cutm de fapt cel mai apropiat numr real reprezentabil n calculator iaproximm numrul iniial cu acesta din urm. &a rezultat" putem efectua calculecomplexe cu o precizie rezonabil.

    &onstantele reale sunt reprezentate n virgul mobil prin notaia clasic cumantis i exponent.

    Sintaxa: Xpartea ntreag . partea fracionar

  • 7/25/2019 PP C++

    6/116

    Te exemplu codul %S&'' de valoare zero definete caracterul PUKK. %cestaeste un caracter impropriu i spre deosebire de alte caractere el nu poate fi generatde la tastatur i nu are efect nici la ieire. Ln & este folosit ca terminator pentruiruri de caractere i are notaia B).

    Setul de caractere de control:\aloarecod%S&''

    ]eprezentare ]ol

    ) B) &aracterul PUKK zero binar!2 Ba %larm bell!6 Bb Spaiu napoi bacNspace!Q S Bt abulator orizontalQ %

    3) Bn Salt la linie nou neO line!33 Bv abulator vertical3* Bf Salt de pagin la imprimant formfeed!Q 3M Br Teplasarea cursorului n coloana 3 pe aceeai linieQ &]

    $ constant caracter cu notaie special" se va scrie incluzRnd notaia ntrecaractere apostrof. #xemple: ZBnZ" ZBtZ" ZBrZ

    &onstanta apostrofse reprezint prin '\''.&onstanta bacslashse reprezint prin '\\'.&onstrucia '\ddd'" unde d este o cifr octal" reprezint caracterul al

    crui cod %S&'' are valoarea egal cu numrul octal ddd. Ln particular caracterulimpropriu PUKK se poate reprezenta prin constanta caracter '\0'.

    &aracterul T#K al crui cod %S&'' are valoarea 3*2 se reprezint prin'\177'. &aracterul spaiu al crui cod %S&'' are valoarea M* se poate reprezentaprin ' 'sau '\40'.

    &onstrucia '\xdd'" unde d reprezint o cifr (exazecimal reprezintcaracterul al crui cod %S&'' are valoarea egal cu numrul zecimal dd.

    #xemplu: '\x20'reprezint caracterul spaiu.Tac \este urmat de un alt caracter decRt cele artate" atunci \este ignorat

    de compilator.&aracterele spa!iu cod %S&'' M*!" tab cod %S&'' ! i linie nou" cod

    %S&'' 3)! formeaz categoria de separatori spa!ii albe_. Ln afar de locurile undesunt necesare spaiile albe pentru separarea identificatorilor" a cuvintelor c(eie etc.aceste spaii albe sunt ignorate de compilator i pot fi folosite oriunde n program.

    Constante #ir de caractere

    $ constant #ir de caractere este o succesiune de zero sau mai multecaractere delimitate prin g(ilimele. `(ilimelele nu fac parte din irul de caractere.Tac dorim s folosim caractere negrafice n compunerea unui ir de caractere"atunci putem folosi convenia de utilizare a caracterului \. Tac dorim sreprezentm c(iar caracterul g(ilimele" atunci vom scrie \"" de asemenea pentru

    bacNslas( scriem \\.

  • 7/25/2019 PP C++

    7/116

    #xemple:3*M3B* -reprezint succesiunea 3*aBBb -reprezint succesiunea aBbc:BBtcBBbgi -reprezint succesiunea c:BtcBbgi

    Un ir de caractere poate fi continuat de pe un rRnd pe altul" dac nainte dea aciona tasta >enter? se va tasta \.

    &onstanta ir de caractere se reprezint printr-o succesiune de octei n carese pstreaz codurile %S&'' ale caracterelor irului" iar ultimul octet coninetotdeauna caracterul PUKK pentru a marca sfRritul irului. Te aici rezult c" deexemplu" 'A'i "A"sunt construcii diferite. Vrima reprezint o constant caractercare se pstreaz pe un singur octet n memorie. % doua" reprezint un ir de

    caractere i se pstreaz pe doi octei" primul octet conine valoarea codului%S&'' al lui %" iar cel de-al doilea conine caracterul PUKK" adic valoarea ).

    I.1.6. ariabile

    Vrin variabil nelegem o zon temporar de stocare a datelor a creivaloare se poate sc(imba n timpul execuiei programului. Unei variabile i seasociaz un nume prin intermediul cruia putem avea acces la valoarea ei i un tipde date care stabilete valorile pe care le poate lua variabila. &orespondena ntrenumele i tipul unei variabile se realizeaz printr-o construcie special numitdeclara!ie. oate variabilele utilizate ntr-un program trebuie declarate nainteautilizrii lor.

    $ declaraie de variabil are urmtoarea sintax: > tip ? > lista de variabile ?unde lista conine unul sau mai multe nume de variabile desprite prin

    virgule.

    #xemple:int i,j,X;unsigned long k;float a,b;char c;

    Sunt situaii n care variabilele trebuie s fie grupate din punct de vederelogic. ablourile reprezint grupuri unidimensionale sau multidimensionale devariabile de acelai tip. Teclaraia de tablou conine tipul comun al elementelorsale" numele tabloului i numrul de elemente pentru fiecare dimensiune inclusentre paranteze drepte. ;

    #lementele se separ prin virgule.Un element din lista de tip tablou are formatul:

    nume3dim43dim!4...3dimn4

    unde dim1,dim2,...,dimnsunt expresii constante care au valori ntregi.#xemple:

    int v34;float a343"4;

  • 7/25/2019 PP C++

    8/116

    Ka elementele unui tablou ne referim prin variabile cu indici. $ astfel devariabil se compune din numele tabloului urmat de unul sau mai muli indici"fiecare indice fiind inclus ntre paranteze drepte. 'ndicii au limita inferioar zero.

    #xemple: ablourile vi adeclarate mai sus se compun din variabilelev345 v345 ... 5 v3(4

    respectiv"a34345 a34345 a343!45

    a34345 a34345 a343!45 ...a3((434 a3((4345 a3((43!4.

    ablourile unidimensionale de tip caracter se utilizeaz pentru a pstra iruride caractere. #xemplu:char tab3#4;

    tabpoate pstra un ir de maxim M caractere" al patrulea octet fiind necesarpentru caracterul PUKK - marcatorul sfRrituli irului.

    Pumele unui tablou are ca valoare adresa primului su element.

    I.1.!. "peratori i e#presii

    $peratorii sunt simboluri care specific operaiile ce se aplic unor variabilesau constante numite operanzi.

    $ expresie este o construcie aritmetic sau algebric care definete uncalcul prin aplicarea unor operatori asupra unor termeni care pot fi: constante"variabile" funcii.

    #xpresiile se evalueaz pe baza unui set de reguli care precizeaz prioritateai modul de asociere a operatorilor precum i conversiile aplicate operanzilor:

    Y prioritatea determin ordinea de efectuare a operaiilor ntr-o expresie cudiveri operatori.

    Y modul de asociere indic ordinea de efectuare a operaiilor ntr-o secvende operaii care au aceeai prioritate.

    Ln tabela de mai jos se indic operatorii &HH n ordinea descresctoare aprioritii lor. $peratorii din aceeai categorie au aceeai prioritate.$peratorii deaceeai prioritate sunt prelucrati n ordinea de la stRnga la dreapta sau la dreapta lastRnga n direcia indicat de sageat.

    &ategoria de operatori $peratori

    Vrio-

    ritate

    od de

    asociereVrimari:%pel de funcie'ndice de tablou$perator rezoluie]eferin la membru de structur]eferin indirect la membrustructur

    ! ;::.-?

    3+

    Unari:Stabilirea tipului tip! 35

  • 7/25/2019 PP C++

    9/116

    &ategoria de operatori $peratoriVrio-ritate

    od deasociere

    Timensiune n octei%locare memorieTezalocare memorie%dres&oninut adresSemn

    Pegaie'ncrementare" decrementare

    sizeofneOdeleteFIH -@ DHH --

    Tereferenierea pointerilor spremembrii claselor

    .I -?I 3M

    ultiplicativi I C J 3* %ditivi H - 33 Teplasare >> ?? 3) ]elaionali > > ? ? #galitate @ 6 ' la nivel de bit F 2 S%U #/&KUS'\ la nivel de bit G , S%U la nivel de bit A + ' logic FF 5 S%U logic AA M &ondiional 8: *

    %tribuire

    H -I CJ F AG>> ??

    3

    $peratorul virgul " )

    $peratori aritmetici

    $peratorii H i W unari se aplic unui singur operand i se folosesc lastabilrea semnului operandului: pozitiv sau negativ.

    $peratorul I reprezint operatorul de nmulire al operanzilor la care seaplic.

    $peratorul C reprezint operatorul de mprire. Tac ambii operanzi suntntregi c(ar" int" unsigned" long!" se realizeaz o mprire ntreag" adic nefurnizeaz cRtul mpririi.

    $peratorul J are ca rezultat restul mpririi dintre doi operanzi ntregi.$peratorii binari H i W reprezint operaiile obinuite de adunare i scdere.#xemple:int a" bQfloat x" 4Q

  • 7/25/2019 PP C++

    10/116

    Tac aM i b2 atunci bCa are valoarea * iar bJa are valoarea 3.Tac x i 4* atunci xC4 are valoarea 5.+.#xpresia xIW4 are sens" aici W este operatorul unar.

    $peratori de incrementare % decrementare

    Sunt operatori unari. $perandul asupra cruia se aplic trebuie s fie ovariabil ntreag sau flotant. $peratorul de incrementare se noteaz prin HH" imrete valoarea operandului cu 3" iar cel de decrementare se noteaz cu --" imicoreaz valoarea operandului cu 3.

    $peratorii pot fi folosii prefixai:11operand//operand

    sau postfixai:operand11operand//

    Ln cazul n care sunt folosii postfixai" ei produc ca rezultat valoareaoperandului i apoi incrementeazCdecrementeaz operandul. &Rnd se folosesc

    prefixai se incrementeazCdecrementeaz operandul dup care produc ca rezultatvaloarea incrementatCdecrementat.

    #xemple:#xpresie #fect

    jiHH jiQ iiH3Q

    4--x xx-3Q 4xQxvM;-- xvM;Q vM;vM;-3QxHHvHHj; jjH3Q vj;vj;H3Q xvj;Q4HHi-j iiH3Q 4i-jQ4iHH-j 4i-jQ iiH3Q4i-j!HH construcie eronat

    $peratori rela!ionali

    $peratorii relaionali sunt 65 665 76.]ezultatul aplicrii unui operator relaional este 3 sau ) dup cum operanzii

    se afl n relaia definit de operatorul respectiv sau nu.

    Te exemplu" dac a+ i b, atunci expresia a>b are valoarea 3" iarexpresia aH3?b are valoarea ).

    $peratorul egal! furnizeaz 3 dac operanzii sunt egali i zero n cazcontrar. $peratorul @ diferit! furnizeaz 3 dac operanzii nu sunt egali i zero ncaz contrar.

    #xemple:Tac x* i 4 -3 atunci expresia x4 are valoarea )" expresia x@4 are

    valoarea 3" expresia xH43 are valoarea 3.

  • 7/25/2019 PP C++

    11/116

    $peratori logici

    @ W nega!ie logic""operator unar.FF W &' logic.AA W S() logic.

    Ln limbajul & nu exist valori logice speciale. \aloarea fals este reprezentatprin ). $rice valoare diferit de ) reprezint valoarea adevrat. $peratorii logiciadmit operanzi de orice tip scalar. ]ezultatul evalurii unei expresii logice este detip ntreg: zero pentu fals i 3 pentru adevrat.

    Tac la evaluarea unei expresii logice se ajunge ntr-un punct n care secunoate valoarea ntregii expresii" atunci restul expresiei nu se mai evalueaz.

    #xemple:Tac a i b sunt ambii diferii de zero expresia aFFb are valoarea 3" altfel ).Tac a este negativ" expresia @a>)! are valoarea )" altfel 3.#xpresia @aFFbAAaFF@b realizeaz S%U #/&KUS'\. Tac a) i b3"

    deoarece @aFFb are valoarea 3 i deci rezultatul ntregii expresii este 3"subexpresia aFF@b nu se mai evalueaz.

    $peratori logici pe bi!i

    &onstituie una din extensiile limbajului & spre limbajele de asamblare. Seaplic operanzilor de tip ntreg" execuia fcndu-se bit cu bit" cu ajutorul celor

    patru operaii logice i dou operaii de deplasare la stnga i la dreapta.

    Se utilizeaz urmtoarele simboluri:F pentru 'A pentru S%UG pentru S%U #/&KUS'\

    D pentru P#`%]#complement fa de unu" sc(imb fiecare bit 3 aloperandului n ) i fiecare bit ) n 3!

    >> pentru deplasare stRnga?? pentru deplasare dreapta

    &u excepia operatorului negare care este unar" ceilali sunt operatoribinari.

    $peraiile logice pentru o perec(e oarecare de bii x i 4 se prezint astfel:x 4 xF4 x A 4 xG 4 D x

    ) ) ) ) ) 3) 3 ) 3 3 33 ) ) 3 3 )3 3 3 3 ) )

    #xemple:Pumerele x+" 4M, se reprezint n binar astfel: x)))))3)3" 4))3))3))

    )))))3)3 )))))3)3 ))3))3)) ))3))3)) xF4 ------------- " x A 4 ------------

  • 7/25/2019 PP C++

    12/116

  • 7/25/2019 PP C++

    13/116

    v 6 :v 6 expresie

    este legal.Teoarece operatorii de atribuire se evalueaz de la dreapta la stRnga expresia

    de mai sus se poate scrie fr paranteze.Ln general" putem realiza atribuiri multiple de forma

    vn6vn/6...6v6expresie.

    Ln cazul unei expresii de atribuire" dac expresia din dreapta semnului egalare un tip diferit de cel al variabilei v" atunci ntRi se convertete valoarea ei spretipul variabilei v i pe urm se realizeaz atribuirea.

    Ventru operaia de atribuire putem folosi operatorii de atribuire combinat:op6

    Unde prin op se nelege unul din operatorii binari aritmetici sau logici pebii" adic: I" C" J" H" -" F" A" G" >>" ??.

    #xpresia:v op=expresie

    este ec(ivalent cuv 6 v op:expresie

    Se pot realiza maximum zece combinaii:16 5/65 *65 65 =65 8 65 965 65 6

    #xemple:#xpresia: x6x1$este ec(ivalent cu x16$.#xpresia x6xyeste ec(ivalent cu x6y.#xpresia x6x

  • 7/25/2019 PP C++

    14/116

    &onstrucia: unsigned char(x)este eronat deoarece tipul conversieieste format din dou cuvinte.

    $peratori condi!ionali

    $peratorii condiionali se utilizeaz n evaluri de expresii care prezintalternative. #i sunt ?:_.

    $ astfel de expresie are formatul:exp @ exp! A exp"

    i are urmtoarea interpretare: dac exp este diferit de zero" atuncivaloarea i tipul expresiei condiionale sunt date de valoarea i tipul expresieiexp!altfel de valoarea i tipul lui exp".

    #xemplu:y@xyAx*xaximul dintre dou numere se poate determina astfel:

    max6a>b@aAb;

    $peratorul virgul"

    #xist cazuri n care este util s grupm mai multe expresii ntr-una singur"expresii care s se evalueze succesiv. Ln acest scop se folosete operatorul virgulcare separ secvena de expresii" acestea grupRndu-se ntr-o singur expresie.

    #xpresia:exp5 exp!5 ... 5 expn

    va avea ca valoare i tip valoarea i tipul lui expn" deci cu a ultimei expresii.#xemple:k6:x65 y6!*i/$5 z6"*?5 x1y1z;

    Se execut pe rRnd cele trei atribuiri" apoi se efectueaz suma xH4Hz care seatribuie lui N.11i5 //?

    i se mrete cu o unitate" j se micoreaz cu o unitate" valoarea i tipulntregii expresii coincid cu valoarea i tipul lui j.

    $peratorul dimensiune +sizeof,

    Kungimea n octei a unei date se poate afla cu o construcie de forma

    sizeof:dataunde data este numele unei variabile" al unui tablou" al unui tip etc.#xemple:int i;float x;char c;double d;int tab[10];

    sizeof(i) -furnizeaz !aloarea "sizeof(x) -furnizeaz !aloarea #sizeof(float) -furnizeaz !aloarea #

  • 7/25/2019 PP C++

    15/116

    sizeof(c) -furnizeaz !aloarea 1

    sizeof(tab) -furnizeaz !aloarea "0sizeof(tab[i]) -furnizeaz !aloarea "

    $peratori parantez"

    $peratorul parantez rotund :_ se utilizeaz pentru a impune o altordine n efectuarea operaiilor. $ expresie inclus ntre paranteze rotundeformeaz un operand.

    Varantezele rotunde se utilizeaz i la apelul funciilor.Varantezele ptrate 34_ includ expresii care reprezint indici. #le formeaz

    operatorul de indexare.

    $peratori de adres"

    $peratorul F returneaz adresa unei variabile. %stfel" dac x este ovariabil" Fx va fi adresa variabilei x.

    $peratorul I returneaz valoarea de la o anumit adres. %stfel" dac p estepointer la tipul c(ar" Ip va fi caracterul referit de p.

    -egula conversiilor implicite

    Tac operanzii unui operator binar nu sunt de acelai tip" sunt necesareconversii care se execut automat astfel:

    3. iecare operand de tip c(ar" unsigned c(ar sau s(ort se convertete spretipul int i orice operand de tip float se convertete spre tipul double. *. Tac unul dintre operanzi este de tip long double" atunci i cellalt se

    convertete la tipul long double i rezultatul va fi de tip long double. M. Tac unul dintre operanzi este de tip double" atunci i cellalt se

    convertete la tipul double i rezultatul va fi de tip double. 5. Tac unul dintre operanzi este de tip unsigned long" atunci i cellalt

    se convertete la tipul unsigned long i rezultatul va fi de tip unsigned long. +. Tac unul dintre operanzi este de tip long" atunci i cellalt se

    convertete la tipul long i rezultatul va fi de tip long. ,. Tac unul dintre operanzi este de tip unsigned" atunci i cellalt se

    convertete la tipul unsigned i rezultatul va fi de tip unsigned.

    I.-. tr"&t"ra (r%ramel%r C

    Vrinprogramnelegem un text ce specific aciuni ce vor fi executate de unprocesor. Kimajul & este un limbaj procedural ceea ce nseamn c structuraprogramelor scrise n & se bazeaz pe subprograme.

    Unsubprogrameste o secven de declaraii i instruciuni care formeaz ostructur unitar" ce rezolv o problem de complexitate redus" putRnd fi innclusntr-un program sau stocat n biblioteci" compilat separat i utilizat ori de cRte orieste nevoie.

  • 7/25/2019 PP C++

    16/116

    %ciunile sunt descrise cu ajutorul instruciunilor.'nlimbajul & subprogramele sunt realizate sub form de funcii.

    Un program & se compune din una sau mai multe funcii. iecare funcie areun nume. $rice program scris n limbajul &" indiferent de complexitate" trebuie sconin o funcie" numit funcie principal" al crui nume este main.

    %ceast funcie preia controlul de la sistemul de operare n momentul n careprogramul este lansat n execuie i l red la terminarea execuiei.

    #xecuia unui program & nseamn execuia instruciunilor din funciamain.

    Structura unei funcii este urmtoarea: : //antetB

    //corpul funciei E

    Structura general a unui program & este urmtoarea:

    : B

    E ...

    : B

    E

    main : B

    E

    Un program & parcurge urmtoarele etape:- editarea fi#ierului surs" care const n scrierea programului folosindregulile de sintax ale editorului de texte corespunztorQ

    - compilarea fi#ierului surs" un program specializat numit compilator"transform instruciunile programului surs n instruciuni main. Tac nudetecteaz erori sintactice" el va genera un fiier numit fiier obiect" careare numele fiierului surs i extensia .obj.

    - editarea leg"turilor un program specializat numit linNeditor" asambleazmai multe module obiect i genereaz programul executabil sub forma unuifiier cu extensia .exe. Vot s apar erori generate de incompatibilitateamodulelor obiect asamblate.

  • 7/25/2019 PP C++

    17/116

    - lansarea n execu!ieW programul se afl sub form executabil i poate filansat n execuie. Ln aceast etap pot s apar erori fie datorit dateloreronate introduse n calculator" fie conceperii greite a programului.

    Ln limbajul & exist dou categorii de funcii:Y funcii care produc returneaz! un rezultat direct ce poate fi utilizat n

    diverse expresii. ipul acestui rezultat se definete prin >tip? din antetul funciei.Tac >tip? este absent" se presupune c funcia returneaz o valoare de tip int.

    Y funcii care nu produc un rezultat direct. Ventru aceste funcii se va folosicuvRntul c(eie void n calitate de tip. #l semnific lipsa valorii returnate larevenirea din funcie.

    $ funcie poate avea zero sau mai muli parametri separai prin virgule.Tac o funcie are lista parametrilor formali vid" antetul su se reduce la:

    :

    %bsena parametrilor formali poate fi indicat explicit folosind cuvRntulc(eie !oid. %stfel" antetul de mai sus poate fi scris i sub forma: :void

    Exemple/int g:float x5 long n B ... E

    void f:void B ...

    E

    void main: B...E

    I.2.1. $reprocesare

    Un program & poate suporta anumite prelucrri nainte de compilare. $astfel de prelucrare se numete preprocesare. #a se realizeaz printr-un programspecial numit preprocesor. Vreprocesorul este apelat automat nainte de a ncepecompilarea.

    Vrin intermediul preprocesorului se pot realiza:Y includeri de fiiere standard i utilizatorQY definirea de macrodefiniiiQY compilare condiionat.

    I.2.2. Includeri de fiiere

    iierele se includ cu ajutorul construciei Einclude folosindu-se formatele:GincludeGinclude IspecificatorHdeHfiDierI

  • 7/25/2019 PP C++

    18/116

    Vreprocesorul localizeaz fiierul i nlocuie construcia include cu textulfiierului localizat. Ln felul acesta compilatorul & nu va mai ntRlni linia#include" ci textul fiierului inclus de preprocesor.

    Vrima variant se folosete pentru ncorporarea fiierelor standard ce segsesc n bibliotecile ataate mediului de programare. % doua variant se foloseteuzual pentru ncorporarea fiierelor create de utilizatorQ dac nu este specificatcalea atunci fiierul este cutat n directorul curent i n bibliotecile ataatemediului de programare.

    'ncluderile de fiiere se fac" de obicei" la nceputul fiierului surs. extulunui fiier inclus poate s conin construcia #includen vederea includerii altorfiiere.

    #xemple:

    GincludeGincludeIgeo.cppI

    I.2.3. %acrodefini&ii

    $ alt construcie tratat de preprocesor este construcia define cuformatul:Gdefine

    olosind aceast construcie" preprocesorul substituie cupeste tot n textul surs care urmeaz" exceptRndcazul n care apare ntr-un ir de caractere sau ntr-un comentariu. Tacsuccesiunea de caractere nu ncape pe un rRnd ea poate fi continuat terminRndrRndul cu B.

    Se recomand ca s se scrie cu litere mariQ >succesiune decaractere? poate conine alte macrodefiniii care trebuie s fie n prealabil definite.

    $ macrodefiniie este definit din punctul construciei Gdefinei pRn lasfRritul fiierului surs respectiv sau pRn la redefinirea ei sau pRn la ani(ilarea ei

    prin intermediul construciei: Gundef

    #xemple:Gdefine J- ".#$(Gdefine ,-K Gdefine L !"Gdefine M L1!...

    x6"*M // se substituie prin x#%*&2%'&20Gdefine L !"Gdefine M :L1!...

    x6"*M // se substituie prin x#%*(&2%'&20)

    %acrodefini&ii cu ar'umente

    Tirectiva #definepoate fi folosit i n sintaxa:Gdefine :

  • 7/25/2019 PP C++

    19/116

    ntre >nume? i nu exist spaii.Exemplu/

    Gdefine KLN:a5b ::a>:b@:aA:b...x6max:k1$5m

    I.2.4. Compilare condi&ionat(

    &ompilarea condiionat se realizeaz folosind construciile:3.

    Gif expresieConstantF //dac expresie este diferit de zerotext

    Gendif*.Gif expresieConstantF textGelse text!Gendif

    M.Gifdef identificator //dac identificator a aprut ntr"o directiv define textGendif

    5.Gifdef identificator // dac identificator a aprut ntr"o directiv define

    textGelse text!Gendif

    +.Gifndef identificator //dac identificator nu a aprut ntr"o directiv define

    textGendif

    ,.Gifndef identificator //dac identificator nu a aprut ntr"o directiv define

    textGelse text!Gendif

    Ventru toate directivele ifliniile care urmeaz pRn la o directiv Gendifsau Gelse sunt supuse preprocesrii dac condiia testat este satisfcut i suntignorate dac condiia nu este satisfcut. Kiniile dintre Gelse i Gendif suntsupuse preprocesrii dac condiia testat de directiva Eif nu este satisfcut.

    #xemplu:Gifndef tip,ata Gdefine tip,ata longGendiftip,ata x;

  • 7/25/2019 PP C++

    20/116

    I.0. O(eraii )e intrare2ieire$peraiile de intrareCieire asigur instrumentul necesar pentru comunicarea

    dintre utilizator i calculator. K'%UK &C&HH asigur posibilitatea de a folosiorice ec(ipamente periferice: consola tastatura i ecranul!" imprimanta" uniti demagnetice diverse etc.

    Ventru uniformizarea modului de lucru cu dispozitivele de intrareCieire" seintroduce un nivel intermediar ntre program i ec(ipamentul periferic folosit.orma intermediar a informaiilor corespunde unui ec(ipament logic i senumete flux sau ir de informaii stream" n limba englez! i nu depinde deec(ipamentul periferic folosit. Un flux de informaii const dintr-o succesiuneordonat de octei i poate s fie privit ca un tablou unidimensional de caractere de

    lungime neprecizat. &itirea sau scrierea la un ec(ipament periferic const ncitirea datelor dintr-un flux" sau scrierea datelor ntr-un flux.

    I.3.1. "pera&ii de intrare ) ieire, utili*+nd consola, nC--

    Kimbajul &HH nu dispune de instruciuni specifice pentru operaiile deintrareCieire. %cestea se efectueaz cu ajutorul unor funcii de bibliotec cefolosesc conceptele generale ale limbajului &HH: programare orientat pe obiecte"cu ierar(ii de clase" moteniri multiple" suprancrcarea operatorilor.

    iierul iostream.h5care trebuie inclus n orice program pentru a apela

    operaiile de 'C# specifice &HH" conine cele mai importante funcii de lucru cutastatura i ecranul.Te asemenea n acest fiier sunt definite fluxurile:cin folosit pentru intrare" dispoziiv implicit tastatura console input!Qcout folosit pentru ieire" dispoziiv implicit ecranul console output!Qcerr folosit pentru afiarea erorilor" dispoziiv implicit ecranulQclog folosit pentru afiarea erorilor" dispozitiv implicit ecranulQ clog

    reprezint versiunea cu tampon a lui cerr.Teoarece conceptele programrii orientate pe obiecte nu au fost prezentate"

    vom explica numai modul de utilizare a funciilor de 'C#.\om accepta c n fiierul iostream.h sunt definite noi tipuri de date

    printre care istreamiostream. $biectele de tipul istreamsunt dispozitivelogice de intrare cineste un astfel de obiect!.

    $biectele de tipul ostreamreprezint dispozitive logice de ieire cout5cerr5 clogsunt astfel de obiecte!.

    Se prevd dou nivele de interfa ntre programator i dipozitivele logicede intrareCieire" prin dou seturi de funcii:

    a! funcii pentru operaii de 'C# la nivel naltb! funcii pentru operaii la nivel de caracter.

  • 7/25/2019 PP C++

    21/116

    I.3.2. unc&ii pentru opera&ii de I)/ la nivel naltVentru operaiile de 'C# la nivel nalt" au fost suprancrcai operatorii >>

    pentru fluxul cini " redefinit" se numete operator de extrac!ie sau extractor.

    %ceast denumire provine de la faptul c la citire se extrag date dintr-un stream.$peratorul !" deci ei pot fi nlnuii.

    #xemplu:Gincludevoid main: B float v5t5d; coutd; coutt; v6dt; cout>c;

    atribuie variabilei c" primul caracter nespaiu aflat n streamul de intrare.

  • 7/25/2019 PP C++

    22/116

    Tac se dorete extragerea unui ir de caractere" se vor citi toate caracterelentRlnite consecutiv n streamul de intrare" ncepRnd cu primul caracter nespaiu dinstream" pRn se va ajunge la un caracter spaiu. Stringului astfel obinut i se vaaduga la sfRrit caracterul PUKK B)!.

    S presupunem c" la o operaie de citire" primul caracter nespaiu dinstreamul de intrare va fi invalid pentru tipul de dat citit. Ln acest caz valoareavariabilei destinaie va rmRne nesc(imbat. Ln plus se va seta un indicator"indicatorul fail eec! al streamului de intrare" fapt ce va duce la imposibilitateade a mai citi din acest stream pRn la resetarea indicatorului.

    'ndicatorul de eroare se anuleaz cu ajutorul metodei funciei! clear:.Sintaxa de apel pentru streamul cineste:

    cin.clear:;

    etoda fail!" returneaz o valoare non-zero true! dac streamul de citire seafl n ^stare de eroare_ i ) dac citirea s-a efectuat cu succes.Sintaxa de apel pentru streamul cineste:

    cin.fail:

    etoda eof:" returneaz o valoare 3 true! dac s-a atins sfRritulstreamului din care citim i ) n caz contrar.

    Sintaxa de apel pentru streamul cineste:cin.eof:

    ipurile de date predefinite pe care le accept implicit un stream de ieiresunt: char5 short5 int5 long cu sau fr unsigned5 float5double5 long double" pointeri la aceste tipuri i tipul void*.

    Vointerul la caracter :char*este utilizat la tiprirea irurilor de caractere

    iar void*la cea a variabilelor de tip pointer afiarea se face n (exa!.#xemple:1.

    Ginclude void main: B char c; long n; float x; double t;

    cin>>c; cout

  • 7/25/2019 PP C++

    23/116

    0.Ginclude void main: B char* a6IxyzwI; cout

  • 7/25/2019 PP C++

    24/116

    Exemplu/GincludeGincludevoid main: B cout

  • 7/25/2019 PP C++

    25/116

    uncia se apeleaz utilizRnd formatul: .flags: i returneazo valoare de tip long ce conine" codificat" indicatorii de stare ai streamuluiasociat.

    #xemplu: 'ndicatorii streamului cin se pot afia astfel:cout

  • 7/25/2019 PP C++

    26/116

    %l treilea argument indic aa-zisul caracter de sfRrit. &aracterul de sfRritnu va fi citit i nici nu va fi eliminat din stream.

    #xemple de apel:char c34;cin.get:c5;

    //se extrag 1 caractere sau p!n la nt!lnirea caracterului de sf!rit implicit ,-n,cin.get:c555;

    //se extrag 1 caractere sau p!n la nt!lnirea caracterului care nu va fi extras din ir

    & istream8 getline:unsigned char *c5 int n5 char62n;' istream8 getline:signed char *c5 int n5 char62n;

    Sunt ec(ivalente cu get dar extrag fr a fi depus n c!" eventual" idelimitatorul dac este ntRlnit nainte de a citi toate cele nW3 caractere propriu-zise

    ale irului.Exemple de apel/

    char c34;cin.getline:c5$;

    - se extrag i se depun n c" 5 caractere sau pRn la ntRlnirea caracteruluiZBnZ >enter?!" care va fi extras din stream.

    cin.getline:c5$5.;

    - se extrag 5 caractere sau pRn la ntRlnirea caracterului Z.Z care va fi extrasdin stream.

    ( istream8 ignore:int n65 int 60UV;

    Peglijeaz un numr maxim de caractere" dat de primul argument valoareimplicit 3! sau pRn la ntRlnirea delimitatorului dat de al doilea argument.]eturneaz o referin ctre streamul de intrare.

    #xemple de apel:cin.ignore:'5G; // ignor urmtoarele 30 de caractere sau p!n nt!lnete

    cin.ignore:; //ignor urmtorul caracter.

    #xemplu de utilizare combinat a metodelor eof!" fail!" ignore!:Ginclude void main:Bint x5i; i 6 ;

    while :// ciclu infinit4 se iese din el la tastarea combinatiei 5678'9

    Bi11; cout

  • 7/25/2019 PP C++

    27/116

    &0) int gcount:;

    ]eturneaz numrul de caractere citite din stream la ultima operaie decitire.

    #xemplu de apel:void main:

    B int x; char y3!$4; cin>>x>>y;cout

  • 7/25/2019 PP C++

    28/116

    Ln mod curent ecranul este format din *+ linii i 6) coloane. &olul stRngasus al ecranului are coordonatele 3"3!. &olul dreapta jos al ecranului are n modcurent coordonatele 6)"*+!.

    Vrezentm cRteva funcii" uzuale" pentru gestiunea ecranului:

    $ void window:int x5int y5int x!5int y!;

    - Tefinete o fereastr pe ecran" unde x3"43! reprezint colul stRnga sus alferestrei" x*"4*! reprezint colul dreapta jos al ferestrei.

    unciile de gestiune ale ecranului acioneaz numai asupra ferestrei active.Tac parametrii de apel sunt eronai" funcia nu are efect.

    Exemplu/Ginclude Ginclude void main: B clrscr:; window:#55%5!; cout

  • 7/25/2019 PP C++

    29/116

    I.3. In*tr"&i"ni C/C++Tescrierea aciunilor ce vor fi executate de calculator se face cu ajutorul

    instruciuilor.

    I.4.1. Instruc&iunea de atribuire

    Se obine scriind punct i virgul dup o expresie de atribuire sau dup oexpresie n care se aplic la o variabil unul din operatorii de incrementare saudecrementare. Teci o instruciune de atribuire are una din urmtoarele formate:;11;

    11;//;//;

    I.4.2. Instruc&iunea compus( blocul

    'nstruciunea compus este o succesiune de instruciuni incluse ntreacolade" succesiune care eventual poate conine declaraii. Sintaxa:B E

    Tac sunt prezente" declaraiile definesc variabile care sunt valabile numain instruciunea compus respectiv. Tup paranteza nc(is a unei instruciunicompuse nu se pune Q

    Structura unei funcii poate fi considerat ca fiind:

    I.4.3. Instruc&iunea if

    'nstruciunea if implementeaz structura alternativ.#a are unul din formatele:

    ormatul 3:if: else

    Tac >expresie>este diferit de zero se execut >instruc!iune0?" altfel seexecut >instruc!iune1?.

  • 7/25/2019 PP C++

    30/116

    ormatul *:if:

    Tac >expresie> este diferit de zero se execut >instruc!iune?" altfelinstruciunea if nu are niciun efect.

    $ selecie multipl se poate programa cu mai multe instruciuni if W else ncascad.

    Sintaxa:

    if : ;else if: ;

    . . .else if: ;

    else ;

    rebuie inut seama de faptul c elseeste asociat celui mai apropiat if.Ventru a determina un alt mod de asociere se pot utiliza delimitatorii de bloc.

    if : B if : E

    else

    Ln acest mod elsese asociaz primului ifi nu celui deWal doilea care estemai apropiat.

    #xemplu de utilizare a instruciunii if:

    2rogramul urm"tor calculeaz" valoarea func!iei

    >++

    =

  • 7/25/2019 PP C++

    31/116

    I.4.4. Instruc&iunea hile'nstruciunea whileimplementeaz structura repetitiv cu test iniial i are

    sintaxa:while:

    Se execut >instruciune? cRt timp >expresie? este adevrat.

    #xemple de utilizare a instruciunii O(ile:

    0, 4ie x un vector cu n elemente flotante ce se introduc de la tastatur".)rm"torul program inverseaz" ordinea elementelor n vector.

    Gincludevoid main:Bfloat x345aux; int n5i5?;

    // 5itirea vectorului coutn; i6; while:i

  • 7/25/2019 PP C++

    32/116

    1, S" se calculeze valoarea num"rului

    utiliz*nd formula lui 5adhava din

    Sangamagrama+anul 60788,

    = +

    =)

    3*

    M

    3

    3*

    GincludeGinclude

    Ginclude // pentru fabsl#valoarea absolutalong double Ji:B long double eps6.e/!; long double pi6.5 pia65t6;

    /* pi#valoarea la pasul curent 4 pia#valoarea de la pasul anterior4 t#("&/%)= 4

    */ unsigned long k6; while:fabsl:pi/pia>eps B pia6pi; t*6/.".; pi16t:!*k1; k11; E cout

  • 7/25/2019 PP C++

    33/116

    expresie devine fals. Tac >exp1? lipsete" se consider c expresia de test esteadevrat tot timpul" iar ciclul se execut fr ntrerupere.

    >exp9? specific reiniializrile ce se efectueaz dup fiecare iteraieQformeaz corpul ciclului" care se execut repetat.

    #xpresiile ,,pot fi i vide. otui caracterele Qvor fi totdeauna prezente.

    'nstruciunea for este ec(ivalent cu:;while:

  • 7/25/2019 PP C++

    34/116

    1, 4ie x0 x1: xn numere ntregi ce se introduc de la tastatur". S" sedetermine suma numerelor pozitive #i suma p"tratelor numerelor negative.

    Gincludevoid main:B int n5x5X5X!5i; X6; X!6; coutn; for:i6;i

  • 7/25/2019 PP C++

    35/116

    I.4.6. Instruc&iunea do hile%ceast instruciune are formatul:

    do while:;

    i implementeaz structura repetitiv cu test final.#fect: #xecut n mod repetat >instruc!iune? simpl sau compus! cRt timp

    >expresie? este adevrat diferit de zero!.

    #xemplu de utilizare a instruciunii do O(ile:

    2rogramul urm"tor calculeaz" suma unor produse de perechi de numereintroduse de la tastatur" c*t timp suma rezultat" este mai mica dec*t 0888.

    Gincludevoid main:Blong x5y5X; X6; do B coutx>>y; //se vor tasta dou numere ntregi separate prin spaiu X16x*y;

    E while :X

  • 7/25/2019 PP C++

    36/116

    #xemple de utilizare a instruciunii brea/

    0, )rm"torul program implementeaz" jocul ;

  • 7/25/2019 PP C++

    37/116

    while(expr)

    {

    ..

    if()continue;

    ...}

    do

    { .. if() continue;

    ..

    }

    while(expr);for(expr1; expr2; expr3)

    {

    .

    if() continue;

    .

    }

    9, )rm"torul program verific" dac" un vector format din n elemente numerereale este ordonat cresc"tor.

    'n program se folosete variabila semafor pentru a indica dac vectorul esteordonat cresctor semafor3! sau nu semafor)!.Gincludevoid main:Bfloat a34; int n5i;

    coutn; cout

  • 7/25/2019 PP C++

    38/116

    %stfel" programulGincludevoid main:B int i; for :i 6 ; i < $; i11 B if :i 66 " continue; printf:Ii 6 =d2nI5i; E cout

  • 7/25/2019 PP C++

    39/116

    >c0?">c1?"...">cn? sunt expresii constante de tip ntreg">expresie? este o expresie de tip ntreg orice tip ntreg!">sir0?"...">sirn? sunt iruri de instruciuni un astfel de ir poate fi i vid!.#fect: 3! Se evalueaz >expresie?. *! Se compar valoarea expresiei >expresie?" succesiv" cu valorile

    ,,...,.

    M! Tac valoarea >expresie? coincide cu sir?. %lternativa default nu este obligatorie" n lipsa ei" dac valoarea>expresie? nu coincide cu niciuna din constantele ,,...,instruciunea switchnu are niciun efect.

    #xemplu de utilizare a instruciunii switch:

    2rogramul urm"tor calculeaz" func!ia

    grade.ndatestexunde

    =5"M"*"3

  • 7/25/2019 PP C++

    40/116

    break;

    case #A f6tan:r; break; defaultA f6sWrt:$1!*sin:r1"*cos:r; E cout

  • 7/25/2019 PP C++

    41/116

    returneaz codul %S&'' al caracterului citit de la tastatur!" este apelat n ambelevariante.GincludeGincludevoid main:Bchar c; coutexpresie? convertit" daceste cazul" la tipul funciei!.

    #xemplu:

    'n urm"torul program func!ia int $ri(long n) returneaz" 0 dac"argumentul este num"r prim #i 8 n caz contrar.

    Ginclude

    Ginclude //pentru funcia s@rt() " radical de ordin 2

    int prim:long n // verifica daca n A& este prim

    B if:n66 return ;//& nu este prim

    if:n66!99n66" return ; // 2 si % sunt nr. prime

    if:n=!66 return ; // n nu este prim pentru ca se divide cu 2 long r6sWrt:n; for: long d6"; d

  • 7/25/2019 PP C++

    42/116

    else cout

  • 7/25/2019 PP C++

    43/116

    adres pe toat durata programului" adres pe care o primete la nceputulexecutrii programului. \ariabilei ki se aloc spaiu pe stiv de fiecare dat cRndse execut funcia f:" la adrese care pot fi diferite.

    Teclaraia informativ externVentru ca o variabil global s poat fi folosit de funcii situate n alt fiier

    surs" sau n cadrul aceluiai fiier n funcii anterioare declarrii variabilei" trebuieca acea variabil s fie descris printr-o declaraie extern n funciilerespective sau n afara oricrei funcii ale noului fiier. %cum fiierele pot ficompilate separat i linNeditate mpreun.

    #xemplu:iierul 3.&VV

    ...int x5y;...

    iierul *.&VV...extern int x5y;int suma:Breturn x1y;E

    iierele se pot compila separat.Ventru obinerea executabilului vom include n fiierul *.&VV" fiierul

    3.&VV cu ajutorul directivei Einclude3.&VV sau vom crea un proiect. Ventru

    crearea proiectului vom selecta" din meniul turbo &" Upen pro?ect. %legempentru proiect" de exemplu" numele V]3. 'ncludem fiierele 3.&VV i *.&VVutilizRnd tasta funcional >'nsert?. &ompilarea proiectului se face cu Muildalldin Compile. tergerea unui fiier din proiect se face prin poziionarea pefiierul respectiv cu ajutorul sgeilor i apoi acionarea tastei .

    #xemplificare:

    2rogram pentru ordonarea cresc"toare a unui vector de numere ntregi/

    GincludeGinclude

    long x34;int n; // variabile globale

    void citeste: // funcie pentru citirea vectorului

    B int i; //variabil local coutn; cout

  • 7/25/2019 PP C++

    44/116

    B int i5?; //variabile locale

    for:i6;i

  • 7/25/2019 PP C++

    45/116

    void incrementare:

    B int i6; static int k6; i11; k11; cout

  • 7/25/2019 PP C++

    46/116

    static 346B5 dim?al elementelor acestuia nu mai este obligatoriu n declaraia tabloului respectiv.Teci putem scrie: 346B5dim0?. Ln aceste situaii restul elementelor tabloului vor fi iniializate cu ). Tac neste egal cu >dim0?" atunci >dim0? poate fi omis" dar >dim1? este obligatoriu.Lntr-o modalitate asemntoare se pot iniializa i tablouri cu mai multe

    dimensiuni.#xemplu

    int a3!43"46B B5!5"E5 B#5$5%E E;

    Un tablou multidimensional se poate iniializa i astfel:int t3!43"46B5!5"5#5$5%E;

    sauint t343"46B5!5"5#5$5%E;

    ablourile de tip caracter pot fi iniializate astfel:char 346;

    saustatic char 346;

    &ompilatorul adaug automat caracterul PUKK B)! dup ultimul caracter alirului utilizat n iniializare. Pumrul >dim? poate fi omis.

    Teci declaraia:char t3#46Ba5b5c52E;

    este ec(ivalent cu:char t3#46IabcI;

    i cu:

  • 7/25/2019 PP C++

    47/116

    char t346IabcI;

  • 7/25/2019 PP C++

    48/116

    I.8. 9ran*5er"l (arametril%r la a(el"l 5"n&iil%r

    Ka apelul unei funcii" fiecrui parametru formal i corespunde un parametruefectiv. 'n &HH sunt implementate dou metode de transmitere a parametrilor lafuncii:

    prin valoare W cRnd o eventual modificare a parametrului n funcie nuafecteaz valoarea parametrului efectiv n funcia apelant. Ln cazul apelului prinvaloare" se transfer funciei apelate valoarea parametrului efectiv care poate fi oconstant" o variabil sau o expresie.

    prin referin!"W n care variabila transmis funciei ca parametru efectiv esteafectat de eventualele modificri aduse n funcie. Ventru aceasta funcia apelat

    trebuie s dispun de adresa parametrului efectiv pentru ca s-l poat modifica.Sunt trei modaliti de a realiza transferul prin referin:- prin utilizarea ca parametru a numelui unui tablou Q- prin utilizarea ca parametru a unei variabile de tip pointer Q- prin utilizarea ca parametru a unei variabile de tip referin.

    Pumele unui tablou are ca valoare c(iar adresa primului su element" nconsecin" dac un parametru formal este numele unui tablou atunci la apel se vatransmite funciei adresa de nceput a tabloului ce se utilizeaz efectiv" i prinurmare i pot fi modificate elementele.

    Teoarece compilatorul nu folosete dimensiunea tabloului transmis caparametru" ci doar adresa lui de nceput" pentru parametrul formal de tip tablouputem folosi sintaxa de declarare urmtoare:

    34

    I.!.1. $robleme re*olvate.

    0, $pera!ii cu matrice

    Citirea si afi#area matricelor suma #i produsul a dou" matrice

    GincludeGinclude

    Ginclude

    void citire:int a34345int m5int n B int i5?; for:i6;i

  • 7/25/2019 PP C++

    49/116

    void suma:int a34345int b34345int c34345

    int m5int n B int i5?; for:i6;i

  • 7/25/2019 PP C++

    50/116

  • 7/25/2019 PP C++

    51/116

    9, 2roblema celor 7 triunghiuri

    $ matrice p"tratic" este mp"r!it" de cele dou" diagonale n patrutriunghiuri. S" se determine suma elementelor din cele patru triunghiuri.

    Elementele de pe diagonale fac parte din triunghiurile respective.

    Gincludelong sumaTrXus:long a3!43!45int n B long X6; int p5W5k;

    p6;W6n/; while:p

  • 7/25/2019 PP C++

    52/116

    void main:

    Blong a3!43!46BB5!5"5#5$E5 B5!5"5#5$E5 B5!5"5#5$E5 B5!5"5#5$E5 B5!5"5#5$EE; cout

  • 7/25/2019 PP C++

    53/116

    for:int i6;i>a3i4; if:a3i4

  • 7/25/2019 PP C++

    54/116

    @eterminarea primei pozi!ii de unde ncepe un sub#ir ntr3un #ir de caractere.

    int cauta:char sir345 char subsir34 B int k5?5lgXubsir5pozKax; lgXubsir6lungime:subsir; pozKax6lungime:sir/lgXubsir; for:k6; k

  • 7/25/2019 PP C++

    55/116

    for:i6;i

    B if:a3i476printf:I)itera =c apare de =d ori 2nI5:char:i1(&5a3i4;

    if:b3i476printf:I)itera =c apare de =d ori 2nI5:char:i1%$5b3i4;

    EE

    F, $pera!ii cu numere naturale mari/ suma diferen!a aritmetic" compararea#i produsul a dou" numere mariG mp"r!irea unui num"r mare la un num"r ntreg.(lgoritmi clasici.

    Vom considera numerele reprezentate n baza 08. Cifrele numerelor mari

    completate cu zerouri nesmnificative vor fi memorate n vectori cu acela#i num"rde elemente. @imensiunea comun" a vectorilor este aleas" astfel nc"t s" fiesuficient" #i pentru memorarea numerelor rezultate in urma opera!iilor aplicatelor.

    Ginclude Ginclude Ginclude

    int dim6; // dimensiunea comuna a vectorilor(nr maxim de cifre)4 valoare implicita &00

    int suma: int u345int v345int w34 w6u1v

    Bint t65c; // t " cifra de transport

    for:int i6dim/; i>6;i// B c6u3i41v3i41t; if:c>6 B w3i46c/; t6;E else Bw3i46c; t6;E E

    return /t; // & adunare cu succes 0 " depasireE

    int diferenta:int u345int v345 int w34 // #u"v unde uCvBint t65c; for:int i6dim/;i>6;i// B c6u3i4/v3i41t; if:c

  • 7/25/2019 PP C++

    56/116

    /* Irodusul a doua numere mari se calculeaza inmultind fiecare cifra a inmultitorului cu f iecare cifra adeinmultitului si adunind rezultatul la ordinul de marime corespunztor. */

    int produs:int u345int v345int w34 w6uvBint i5?5t65s; for :i6;i6;?// for:i6dim/;i>6;i// B int k6i1?1/dim; s6u3i4*v3?41t; if:k>6 B w3k416s; t6w3k4;

    w3k4=6; E

    else if:s76return ;// esecJ dimensiune prea mica E

    return t66@A; //& succes4 0 esecE

    void impartire:int u345long W5int w345long 8r w6uW1rB int i; long p; r6; for:i6;i6;?//v3?46;

    return ; //citire cu succesE

  • 7/25/2019 PP C++

    57/116

    void main:

    B int u345 v345s345d345p345r34;dim6; cout

  • 7/25/2019 PP C++

    58/116

    cout

  • 7/25/2019 PP C++

    59/116

    1, Ce rezultat furnizeaz" programiul urmatorI

    Gincludevoid interschimba:int x5int yB int aux; aux6x; x6y; y6aux;Evoid main:B int a65b6!; interschimba:a5b; cout

  • 7/25/2019 PP C++

    60/116

    7, 2rogramul urm"tor calculeaz"

    nC

    n #i se introduc de la tastatur".

    =

    +=

    +

    =

    i

    ni

    in

    nnnC

    3

    33

    *

    3

    3

    Gincludevoid main:B long C5n5k5i;

    // 5itirea lui n si coutn;

    coutk; // 5alculul combinarilor C6; i6; while:i

  • 7/25/2019 PP C++

    61/116

    &a orice tip de variabil" nainte de a fi utilizat" variabila de tip pointertrebuie declarat.

    Vointerii ofer posibilitatea de a aloca dinamic memoria" ceea ce nseamnc pe parcursul execuiei unui program se pot aloca i dealoca zone de memorieasociate lor.

    $ variabil de tip pointer se declar utilizRnd formatul:* ;

    ceea ce nseamn c >nume? este un pointer ctre o zon de memorie ceconine o dat de tipul >tip?.

    &aracterul I poate fi alturat de >tip? sau de >nume? sau poate fi separatprin caractere spaiu i de >tip? i de >nume?. #l indic compilatorului c a fostdeclarat o variabil pointer i nu una obinuit.

    &onstrucia >tip?I se spune ca reprezint tipulpointer.

    #xemplul 3:int *p;

    %ici se stabilete faptul c pva conine adrese de zone de memorie alocatedatelor de tip int.

    #xemplul *:float *p5 t5 *W;

    %ici p i Wsunt pointeri ctre date de tip float" iar t este o variabil de tipfloat.

    Utilizarea pointerilor se face cu doi operatori unari:8-operatorul adresa +de referentiere, - pentru aflarea adresei din memorie

    a unei variabileQ*- operatorul de indirectare +de deferentiere, - care furnizeaz valoarea dinzona de memorie spre care pointeaz pointerul operand.

    Tac x este o variabil atunci operatorul unar 8 aplicat lui x5 8x" nefurnizeaz adresa lui x. Tac dorim ca pointerul ps indice pe x" putem utilizaatribuirea:p68x;

    Tac p este o variabil de tip pointer atunci operatorul unar I aplicat lui p5*p5ne furnizeaz variabila a crei adres este memorat n p.

    Exemplu/int a5*adr;

    adr68a; // acum a i *adr reprezint aceeai dat.

    a6; // este echivalent cu *adr#&004

    *adr6!; // este echivalent cu a#2004

    #xist cazuri n care dorim ca un pointer s fie utilizat cu mai multe tipuri dedate. Ln acest caz" la declararea lui nu dorim s precizm un tip anume. %ceasta serealizeaz astfel:

    void *;

  • 7/25/2019 PP C++

    62/116

    Utilizarea tipului void*implic conversii explicite de tip.#xemplu:

    void *p;int x;

    p68x; // ;tribuire neacceptat deoarece tipul pointerului p este nedeterminat

    (int*)p=&x; //;tribuire corect tipul void* este convertit spre int*

    *p6; // ;tribuire neacceptat deoarece tipul pointerului p este nedeterminat

    *:int*p6; // ;tribuire corect tipul void* este convertit spre int*

    Teoarece pointerii reprezint adrese" ei se folosesc la transferul prinreferin al parametrilor.

    Exemplu/Gincludevoid interschimba:int *x5int *y B int aux6*x; *x6*y; *y6aux; E

    void main:

    B int a5b; couta; coutb; interschimba :8a58b; cout

  • 7/25/2019 PP C++

    63/116

    atunci p1nfurnizeaz valoarea lui pmrit cu n*sizeof:" iarpn valoarea lui pmicorat cu n*sizeof:.

    %supra pointerilor se pot face operaii de incrementare i decrementare:p11i 11pmresc adresa coninut de pcu sizeof:p//5 //pmicoreaz valoarea pointerului pcu sizeof:.

    #xemple: char *c; int *k; float *f5*f!; double *d;

    c11; //c# (adresa memorat n c) ' &

    k16$; // #(adresa memorat n ) ' $*2

    f!6f/$; // f2#(adresa memorat n f&) K $*L

    d/6"; //d#(adresa memorat n d) K %*3

    d//; //d#(adresa memorat n d) K &*3

    $peraiile de incrementare i decrementare se pot aplica pointerului nsuisau obiectului pe care-l puncteaz memoreaz!.

    'nstruciunea IaHH obine mai ntRi valoarea pe care o puncteaz a i apoi aeste incrementat pentru a puncta elementul urmtor.

    'nstruciunea Ia!HH incrementeaz obiectul pe care-l puncteaz a.

    Keg"tura dintre pointeri #i tablouri

    Pumele unui tablou este un pointer i el are ca valoare adresa primului suelement.

    ieint t3$4;int *p;

    p6t; // ;tribuire corectJ

    pva pointa spre primul element al tabloului t. Lntre pi texist o difereni anume: valoarea lui ppoate fi modificat dar a lui tnu poate fi modificat teste un pointer constant!" deci este interzis o atribuire de forma t6pQ

    Un nume de tablou poate fi utilizat ca i cum ar fi un pointer i" reciproc" unpointer poate fi indexat ca i cum ar fi un tablou.

    Tac xeste un tablou: x34;atunci expresia x1n este corect i reprezint un pointer ctre al n-lea

    element al tabloului xHnFxn;!" deci x3n4este ec(ivalent cu *:x1n.Tac peste un pointer:

    *p;

    atunci *:p1ieste ec(ivalent cu p3i4.$ diferen ntre pointer i tablou const n alocarea de memorie. Ln cazul

    tabloului" se rezerv automat spaiul necesar. Ln cazul pointerilor" spaiul trebuiecreat explicit de utilizator sau trebuie atribuit pointerului o adres a unui spaiudeja alocat.

  • 7/25/2019 PP C++

    64/116

    ie declaraiaint t3$4;

    #lementele tabloului t sunt memorate n celule succesive de memorie isunt numerotate ncepRnd cu zero.

    Ln exemplul nostru vom avea:t345 t345 t3!45 t3"45 t3#4.

    Teoarece t); este o variabil simpl" adresa sa este Ft);" deci vom avea:t668t34.

    #lementele unui tablou multidimensional sunt memorate n ordineacresctoare a liniilor.

    Te exemplu" elementele tabloului descris prin:int a3!43"4;

    vor fi memorate n ordineaa34345 a34345 a343!45 a34345 a34345 a343!4.

    a reprezint adresa primului element din tablou. abloul a" avRnd doulinii" este considerat ca un tablou cu dou elemente tablouri unidimensionale!:elementele a[0]i a[1]. aeste adresa elementului a[0]" adic avem a==&a[0].&um a[0]este i el un tablou" nseamn ca a[0]este adresa primului su element"deci a[0]==&a[0][0]. Tar" cele dou tablouri" tabloul bidimensional a[][]" itabloul liniar a[0]ncep de la aceeai adres" astfel c:a668a3466a34668a3434

    Tac privim tabloul a ca o variabil structurat" atunci adresa acesteivariabile se poate afla cu Fa" deci avem lanul de egalitai:8a66a66a34668a34668a3434.

    Compararea a doi pointeri

    Tac doi pointeri pointeaz spre elementele aceluiai tablou" pot ficomparai folosind operatorii de relaie i egalitate.

    %stfel t3dim4; *p5*W;

    Tac ppointeaz spre t[i]i qspre t[j]" atuncip> dac i>j"p@ dac ihj.Un pointer mai poate fi comparat cu constanta PUKK zero binar! utilizRnd

    operatorii 66 i 76. %stfel stabilim dac o variabil pointer conine sau nu oadres.@oi pointericare pointeaz elementele aceluiai tabloupot fi sc"zu!i" astfel

    dac ppointeaz pe t3i; i Wpe t3i1n;" atunci Wpare valoarea n.$bserva!ie. Pu se admite adunarea a doi pointeri.

    Tablouri de pointeri

    Tatele de tip pointer pot fi organizate n tablouri la fel ca i alte tipuri dedate. Ventru a descrie un tablou de pointeri se folosete o construcie de forma: *34;

  • 7/25/2019 PP C++

    65/116

    unde >nume? este un tablou avRnd >dim? elemente de tip pointer cememoreaz adrese ale unor date de tipul >tip?.

    #xemplu:Gincludeint ,enumire\i:int m B static char *zi3&46BIluniI5ImartiI5ImiercuriI5 I?oiI5IvineriI5IsambataI5IduminicaIE; if :m& return ; else Bcout>n; p\i6zi:n; cout

  • 7/25/2019 PP C++

    66/116

    B while:*dest116*sursa11; E

    Gincludevoid main: B char a3!$45b3!$4; couta; copiaza:a5b; cout

  • 7/25/2019 PP C++

    67/116

    1ona de memorie n care se face alocarea dinamic a variabilelor se numete(eap.

    %locarea dinamic se poate face pentru tipurile de date:-fundamentale-structurate: tablouri" liste" arbori etc.

    Vrogramele scrise n limbajul & standard" utilizeaz pentru alocareadinamic a memoriei o familie de funcii malloc i free" destul de greoaie nfolosire. #le au fost pstrate n &HH doar pentru meninerea compatibilitii. Lnlocul lor se folosesc operatorii newi delete.

    $peratorul newservete la alocarea dinamic a memoriei. #l va returna unpointer la zona de memorie alocat dinamic. Ln cazul n care nu exist memorie

    suficient" alocarea nu va avea loc. %cest fapt se semnaleaz prin returnarea unuipointer Q+))zero binar!. Te aceea se recomand ca" n cazul utilizrii intensive aalocrii dinamice" dup fiecare utilizare a lui neO s se testeze valoarea returnat.

    ie p un pointer ctre un tip de date" adic avRnd o declaraie de forma: *p;

    $peratorul newpoate fi folosit utilizRnd urmtoarele formate:

    p6new ;p6new :;p6new 34;

    Ln varianta 3. operatorul newaloc" dac este posibil" spaiul necesar tipului

    >tip?" i returneaz adresa zonei de memorie alocate.Ln varianta *. variabila dinamic creat cu newse iniializeaz cu valoareaexpresiei >expresie?.

    \arianta M. se folosete pentru alocarea a >dim? variabile dinamice de tipul>tip? un tablou liniar cu >dim? elemente!. 'niializarea tablourilor nu este

    posibil.#xemple:

    int *p5 *W5*r;

    p6new int; // se aloc memorie pentru un ntreg

    W6new int:&; // se aloc memorie pentru un ntreg i se iniializeaz variabila cu G

    r6new long34; // se aloc un tablou de &0 ntregi

    Tezalocarea zonei de memorie alocat cu new" se face cu ajutoruloperatorului delete" cu sintaxa:delete ;

    #xemple:delete p;delete r;

    Vrezentm mai jos trei variante de utilizare a unui vector alocat dinamic:3.

    Ginclude void main:

  • 7/25/2019 PP C++

    68/116

    B int *a5n;

    coutn;

    a6new int3n4; // alocare vector for:int i6;i

  • 7/25/2019 PP C++

    69/116

    Tac avem tipul de dat T" prin T8sau T 8cu spaiu dup T! sau T 8cuspaiu dup Ti dup 8! vom nelege o referin o trimitere! la un obiect de tipulT.

    #xemplu:int x6;

    int8 r6x; // r i x refer acum acelai obiect

    r6!; // echivalent cu x#204

    x=30; // echivalent cu r#%04

    \ariabila rde mai sus" este o referin la variabila xde tip int. %cest lucrunseamn c identificatorii ri xpermit accesul la aceeai zon de memorie. Vrinurmare" xi rsunt sinonime. 'niializarea unei referin e trimiteri! n declaraia saeste obligatorie dac nu este folosit ca argument al unei func ii!" dar aceast

    iniializare nu trebuie confundat cu atribuireaQ ea definete pur i simplu un altnume un alias! al obiectului cu care a fost iniializat. Ln exemplul de mai sus reste un nou nume pentru x. $ referin nu mai poate fi modificat dup iniializare.#a refer ntotdeauna acelai obiect stabilit prin iniializare s-l desemneze. Ventrua obine un pointer la obiectul desemnat de referina r" se poate folosi 8r.

    -eferin!ele sunt utile i cRnd sunt folosite ca argumente pentru funcii.

    Exemplu/Gincludevoid interschimba:int8 a5int8 b Bint aux6a; a6b; b6c; E

    void main: B int x65y6!; interschimba :x5y; cout

  • 7/25/2019 PP C++

    70/116

    int8 g:

    B int8 x6 *new int; //;m dat un nume variabilei anonime *ne int ... return x;E

    uncia g()ntoarce variabila de tipul int alocat dinamic.

    I.11.1. $robleme re*olvate

    0, 'ntersec!ia reuniunea #i diferen!a a dou" mul!imi

    GincludeGincludevoid citire:int a345int8 n B coutn; int i; cout

  • 7/25/2019 PP C++

    71/116

    B semafor 6;

    for:?6;?

  • 7/25/2019 PP C++

    72/116

    %lgoritmul extinsal lui #uclid rezolv urmtoarea problem: iind dai doi ntregi a i b care nu sunt simultan )" s se determine cel mai mare

    divizor comun al lor di doi ntregi mi nastfel ncRtdbnam =+

    'dentitatealui zout!.

    Ventru obinerea identitiidbnam =+

    " se pleac de la relaiile:

    !*3)!3)3

    bbaaba

    =+ =+

    " dac)a

    i)b

    .

    Tac)b scdem din relaia 3!relaia *! multiplicat cu .

    long euclid:long a5long b5long 8m5 long 8n

    B long m65n65u5v; m6; n6; long W6ab5 r6a=b; while:r B u6m5v6n; m6m5n6n; m6u/W*m; n6v/W*n; a6b; b6r; W6ab; r6a=b; E return b; E

    )

  • 7/25/2019 PP C++

    73/116

    'n limbajul &"!"J bbrba =

    " de exemplu pentru a-*+, b10avemab-*, ab-+. %lgoritmul euclid0genereaz rezultate corecte i pentru a>)sauCi b>).

    9, S" se determine o progresie aritmetic" format" din termeni to!i numereprime0.

    Soluie.

    ie3+M* n3. p... irul format din primele n-3 numere prime n ordinea lor

    cresctoare. Tac n acest ir nu exist o progresie aritmetic format din N

    termeni" generm urmtorul numr primnp

    i testm dac acesta este ultimultermen al progresiei cutate. ]aia progresiei aritmetice" dac exist" este egal cu

    3= nn pprsau

    *= nn ppr" etc. $dat fixat raia r" testm dac numerele

    ""..."""!3 *33*3 nn paraaraarpa =+=+== sunt toate numere

    prime. $ condiie iniial este caM3a

    .Vutem optimiza procesul de cutare dac inem cont de proprietatea lui

    &antor ^Tacaaa ...""" *3

    este o progresie aritmetic format din numere prime"

    atunci raia ei se divide la produsul numerelor prime mai mici decRt

    _.ustificarea acestei proprieti se bazeaz pe urmtoarele observaii:ie un numr prim" 3>>N"

    - cel mult a3"

    - termenii progresieirOaaraaraa O +=+=+= + 333M3* ..."""

    prinmrire la vor furniza valori n mulimea

  • 7/25/2019 PP C++

    74/116

    Ginclude

    int prim:long m // returneaza & daca m este prim si 0 in caz contrarB if:m66 return ; // & nu este prim

    if:m66!99m66" return ; // 2 si % sunt nr. prime if:m=!66 return ; long r6sWrt:m; for: long d6"; d

  • 7/25/2019 PP C++

    75/116

  • 7/25/2019 PP C++

    76/116

    long a6"5 a!6$5r6a!/a5an;

    //aprimul termen al posibilei progresii de ratie r

    int k6!; while:a!

  • 7/25/2019 PP C++

    77/116

    void cit:int **a5int n

    B int i5?; for:i6;ia3i43?4; E

    void scr:int **a5int n B int i5?; for:i6;i

  • 7/25/2019 PP C++

    78/116

    *! Un set de constante ntregi se poate defini ca o enumerareQM! $rice nume de vector sau de funcie este o constant.

    &omentarii:Ventru c nu poate fi modificat o constant trebuie s fie iniializat.

    Exemple/const int h6&%;

    const int v346B5!5"5#E; //vector constant

    Tac tipul unei constante simbolice nu este precizat" se consider c aceaconstant are tipul int.&Rnd se folosete un pointer" sunt implicate dou obiecte:

    pointerul nsui i obiectul spre care el indic. Tac se prefixeaz declaraia unuipointer cu const" obiectul i nu pointerul este constant.

    @e exemplu/const char *p 6IabcdI; // p este un pointer la o constant

    p3"46a; // eroare J

    p6IefghI; // p indic spre alt obiect

    Ventru a declara c nsui pointerul i nu obiectul spre care el indic este oconstant" se folosete construcia *const.

    @e exemplu/char * const p 6IabcdI; // p este un pointer constant.

    p346x; // oJ irul nu este constant

    p6IefghI; // eroare

    Ventru a face ambele obiecte constante" le declarm pe amRndou cuconst" astfel:

    const char * const p6IabcdI; // p este pointer constant la o constantp346x; // eroare J

    p6IefghI; // eroare J

    %dresa unei constante nu poate fi atribuit unui pointer" pentru a nu sepermite ca valoarea obiectului s fie modificat.

    I.12.1. $arametri constan&i pentru securitatea codului

    float raport:int num5int denB if:den6 return num; return :floatnumden ;E

    uncia de mai sus conine o eroare de programare pe care compilatorul nu odetecteaz. Lntr-adevr" den ) este o atribuire i nu un test de egalitate.Varametrul den este adus sistematic la valoarea ). &um putem preveni astfel deerori8 Vutem utiliza modificatorul const pentru parametrii de intrare care nutrebuie s evolueze n funcie.

    float raport:const int num5const int den

    B if:den6 return num; // error 5annon modif? a const obDect else return :floatnumden ;E

  • 7/25/2019 PP C++

    79/116

    Ln acest caz compilatorul indic faptul c a detectat o eroare: un obiectconstant care nu poate fi modificat! este utilizat n partea stRnga a unei atribuiri.

    I.10. 9i("l en"merare

    %cest tip permite folosirea unor nume sugestive pentru valori numericentregi.

    $ enumerare reprezint o list de constante ntregi" pus n coresponden cuo list de identificatori.

    &onstantele ntregi sunt adesea definite mai convenabil cu enum.#xemplu:

    enumB -LQ5 V0M5 KL^5 LJ^5 KL-E;definete patru constante ntregi numite enumeratori i le atribuie valori.Teoarece valorile de enumerare sunt atribuite implicit ncepRnd de la zero"

    declaraia de mai sus este ec(ivalent cu:const int -LQ65 V0M65 KL^6!5 LJ^6"5 KL-6#;

    Tac o enumerare poart un nume" ca n exemplul de mai jos" acel numedevine sinonim cu int5nu este un nou tip.

    #numeratorii pot primi valori explicite care nu trebuie s fie distinctecresctoare sau pozitive.

    #xemple:enum taste Bstanga6#5dreapta6%5sus6'5?os6!E;taste t;

    ...t6dreapta;...

    enum culori Bgalben5albastru6$5rosu5verde6/$5albE C+)UL^0;

    Ln acest caz avem ec(ivalena cu:const galben65 albastru6$5 rosu6%5 verde6/$5 alb6/#;

    Ln acest exemplu &UK$%]#este o variabil de tip asumat int5deci putemscrie:

    C+)UL^06rosu;

    sauC+)UL^06%;sau

    C+)UL^06;

    I.13. Pr%t%ti("l "nei 5"n&ii

    Ln principiu" o funcie poate fi apelat dac este definit n fiierul sursnainte de a fi apelat. %cest lucru nu este ntotdeauna posibil i n astfel de cazuriapelul funciei trebuie s fie precedat de prototipul ei.

  • 7/25/2019 PP C++

    80/116

    Vrototipul unei funcii are ca scop s informeze compilatorul despre:Y tipul valorii returnate de funcieY tipurile parametrilor.

    Ln felul acesta" la apelul unei funcii" compilatorul poate face teste cu privirela tipul expresiilor parametrilor efectivi precum i unele conversii necesare legatede valoarea returnat de funcie.

    Vrototipul unei funcii poate fi evideniat utilizRnd formatele:

    :;

    :;

    #xemple:

    . int f:float x5double a;

    sau int f:float5double;

    !. void f!:int a345int b34;

    sauvoid f!:int 345int 34;

    ". long f":int x3#43#4;

    sau long f":int 3434;

    #.Ginclude void f:int 3434;

    void main: B int a343!46B555!E; f:a; E

    void f:int x343!4 B cout

  • 7/25/2019 PP C++

    81/116

    . typedef unsigned long natural;

    Teclaraia:natural a;

    este ec(ivalent cu:unsigned long a ;

    !. typedef char* ptrchr;

    Teclaraia: ptrchr s6IabcI5t6IzxcI;

    este ec(ivalent cu: char *s6IabcI5*t6IzxcI;

    0. ipul tablou unidimensional cu 3) elemente poate fi declarat astfel:

    typedef int vector34;Teclaraia:

    vector y6B5!5"5#E;

    este ec(ivalent cu:int y346B5!5"5#E;

    3. ipul tablou bidimensional poate fi declarat ca n exemplul urmtor:typedef int matr3434;

    Teclaraia:matr x6BB5E5B5!EE;

    este ec(ivalent cu:int x34346BB5E5B5!EE;

    I.17. P%interi &are mem%reaz6 a)re*e )e 5"n&ii

    Ln declaraiaint f:;

    identificatorul f este un pointer care indic adresa funciei f. #l este unpointer constant" deci nu poate fi modificat prin instruciuni de program. Vutemdeclara variabile pointer care s memoreze adrese de funcii n felul urmator: :*:;

    Exemplu/int :*adrV:;

    &onform acestei declaraii" variabila adrVpoate s memoreze o adres a

    unei funcii care calculeaz un rezultat de tip ntreg i are lista parametrilor formalivid. S observm c parantezele care delimiteaz *adrV sunt absolut necesaren declaraia anterioar. Ln lipsa lor" declaraia int *adrV:;descrie o funciecare calculeaz un pointer la o valoare de tip int.

    %tunci cRnd se menioneaz numai numele unei funcii" fr listaparametrilor asociai i far paranteze se obine adresa de nceput a funciei. Vrinurmare" variabilei pointer din exemplul de mai sus i se poate atribui o valoare

    printr-o atribuire de forma:adrV6f;

  • 7/25/2019 PP C++

    82/116

    unde f este numele unei funcii ce returneaz un ntreg i are listaparametrilor formali vid.

    #ste greit s se scrie:adrV6f:;

    sauadrV68f:;

    deoarece f()reprezint valoarea returnat de funcia f! iar Ff! este adresarezultatului furnizat de funcie" dac acest rezultat este o referin. %pelareafunciei a crei adres este memorat ntr-o variabil pointer se poate face" pentruexemplul de mai sus" n una din variantele:a adrV:b :*adrV:

    UtilizRnd construcia typedef putem s asignm un nume i tipului

    pointer la funcii ca n exemplul urmtor:typedef double :*fct:double;

    fct este identificatorul tipului de date pointer la funcii care ntorc ovaloare de tip double i au un argument de tipul double. %cum are sens" deexemplu:fct f6sin;

    uncia sort din programul urmtor folosete parametrul ord de tippointer la funcii" pentru stabilirea criteriului de ordonare cresctoare saudescresctoare a elementelor unui vector

    Gincludeint cresc:int a5int b Breturn a6b;E

    typedef int :*criteriuUrdonare:int5int;enum booleanBfalse5trueE;

    void sort:int x345int n5criteriuUrdonare ordB boolean sortat6false;

    int aux; while:7sortat B sortat 6true; for:int i6;i

  • 7/25/2019 PP C++

    83/116

    E

    I.18. Ar"mente im(li&ite (entr" 5"n&ii

    &HH ofer posibilitatea declarrii funciilor cu valori implicite pentru uneleargumente. Ka apelarea unei astfel de funcii" se pot omite parametrii efectivi

    pentru acei parametri formali care au declarate valori implicite. Un argumentimplicit poate fi iniializat numai cu o expresie constant. Se pot specifica oricRteargumente cu valori implicite. %rgumentele implicite trebuie s fie ultimele n listade argumente. Pu sunt permise alternri ntre argumente normale i argumente cuvalori implicite. &HH permite specificarea argumentelor implicite fie n definiiafunciei fie n prototip" dar nu n ambele. Ka apelare" lista parametrilor efectivi"

    corespunde primilor parametri formali.

    Exemplu/

    Ginclude

    void conv:long n5int baza6!/* afiseaz numrul n in baza de numeraRie specificat

    prin parametrul baza:cu valoarea implicit 2) */ B if :n

  • 7/25/2019 PP C++

    84/116

    Gincludelong produs:int a345int n B long J6; for:int i6;i

  • 7/25/2019 PP C++

    85/116

    ipul unei astfel de date se spune c este definit de utilizator i se numetetipstructurat.

    Ln &HH o structur se poate declara utilizRnd sintaxa:struct BE ;

    poate s lipseasc.#xemplu:

    struct complexBfloat re5im;E c5c!5c"34;

    \ariabilele c3 i c* sunt structuri cu cRte dou cRmpuri de tip float" iar cMeste un tablou de asemenea structuri.

    Ln &HH putem declara variabile de tip structurat prin: ;

    #xemplu:complex z5z!5*p;

    ie declaraia:complex x5y5*p;

    &Rmpurile componente ale unui date structurate pot fi referite n dou feluri:Y direct" prin numele structurii urmat de . i de numele cRmpului

    Exemple/ x.re" x.im" 4.re" 4.imY indirect" prin adresa structurii urmat de ^W?_ i de numele cRmpului

    Exemple/p>re5 p>im

    %ceast scriere este forma simplificat a scrierii(*p).re, (*p).im$peratorul ">" are aceeai prioritate ca i .. %mbii operatori sunt de

    prioritate maxim.&omponentele unei date structurate pot fi ele nsele date structurate.#lementele unei date de tip structurat pot fi iniializate astfel: n declaraie"

    dup numele variabilei structurate se scrie " iar dup acesta" ntre acolade seiniializeaz componentele structurii.

    #xemple:complex x6B5E5y6B!5E;

    struct studentB char nume3!4;int note34;

    E;

    student s6B IJopa ,anI5B555(5EE;

    I.27.1. $robleme re*olvate

    0, An urm"torul program este definit" structura student #i se exemplific"utilizarea ei.

    GincludeGincludestruct student

  • 7/25/2019 PP C++

    86/116

    B char nume3!4;

    char adresa3#4; long telefon; E;

    void main:

    Bstudent s34; // vector cu componente structurate int n; coutn; for:int i6;i

  • 7/25/2019 PP C++

    87/116

    return fabs:s!;

    E

    punct centruYr:punct J345int n

    // ne arat c o funcie poate returna o dat structurat B punct Y6B5E; for:int i6;i

  • 7/25/2019 PP C++

    88/116

    Ginclude

    void main: B const dim6%; int a3dim45b3dim4; for:int i6;i

  • 7/25/2019 PP C++

    89/116

    Tatele din variabila x vor fi privite ca ntregi dac selectm x.i sau realedac selectm x.t.

    &Rmpurile i i t se refer la aceeai adres:n x.i se memoreaz sizeofint! octei la aceast adresQn x.t se memoreaz sizeoffloat! octei care ncep la aceast adres.

    I.-1. Re&"r*i$itatea ;n lima!"l C

    Spunem despre o funcie & c este recursiv dac se autoapeleaz. unciarecursiv se poate reapela fie direct" fie indirect prin apelul altor funcii.

    unciile recursive se definesc prin punerea n eviden a dou seturi deinstruciuni i anume:

    Y un set care descrie modul n care funcioneaz funcia pentru anumitevalori iniiale! ale unora dintre argumenteQ

    Y un set care descrie procesul recursiv de calcul.

    \alorile unei funcii recursive se calculeaz din aproape n aproape" pe bazavalorilor cunoscute ale funciei pentru anumite argumente iniiale. Ventru a calculanoile valori ale unei funcii recursive" trebuie memorate valorile deja calculate" caresunt strict necesare. %cest fapt face ca implementarea n program a calculului unorfuncii recursive s necesite un consum mai mare de memorie" rezultRnd timpi maimari de execuie.

    ]ecursivitatea poate fi transformat n iteraie.'n general" forma iterativ a unei funcii este mai eficient decRt cea

    recursiv n ceea ce privete timpul de execuie i memoria consumat.Ln alegerea cii interativ sau recursiv! de rezolvare a unei probleme"

    trebuie considerai o serie de factori: uurina programrii" testrii i ntreineriiprogramului" eficiena" complexitatea etc.

    Tac o problem are o complexitate redus este preferat varianta iterativ.orma recursiv este preferat acolo unde transformarea recursivitii n

    iteraie cere un efort de programare deosebit" algoritmul pierzRndu-i claritatea"testarea i ntreinerea devenind astfel foarte dificile.

    Ka fiecare apel al funciei recursive" parametrii i variabilele ei localeautomatice se aloc pe stiv ntr-o zon nou" independent. Te asemenea n stivse trece adresa de revenire n subprogramul c(emtor" adic adresa instruciunii

    urmtoare apelului. Ka revenire" se realizeaz curarea stivei" adic zona de pestiv afectat la apel parametrilor i variabilelor automatice" se elibereaz.$bservaii:Ln general" recursivitatea permite o scriere mai compact i mai clar a

    programelor care conin procese de calcul recursiv.Te obicei" recursivitatea nu conduce nici la economie de memorie i nici la

    execuia mai rapid a programelor. Ln mod frecvent sunt variante nerecursive mairapide decRt variantele recursive i conduc adesea i la economie de memorie.

    %pelurile recursive pot conduce la depirea stivei.

  • 7/25/2019 PP C++

    90/116

    I.21.1. $obleme re*olvate90. 4unc!ia factorial/ fact /

    ==

    3!3

    ")3!

    ndac"nfactn

    ndac"nfact

    Ginclude int fact:int nB if:n66 return ; return n*fact:n/;

    Evoid main:B int n; clrscr:; printf :Zn 6 Z ; scanf :Z=dO5 8n ; printf : Z=d76=dZ5n5 fact:n;E

    %pelul lui fact5! declaneaz un lan de apeluri ale lui fact pentru M" *" 3")dup care urmeaz revenirea din apeluri i evaluarea lui fact pentru )"3"*"M"5.

    fact5!

    5 factM!

    M fact*!

    * fact3!

    3 fact)!

    3Starea stivei in timpul execuiei succesive a autoapelrii:

  • 7/25/2019 PP C++

    91/116

    )3 3

    * * *

    M M M M

    StivaBida

    5 5 5 5 5

    ;pelfact(L)

    ;pelfact(%)

    ;pelfact(2)

    ;pelfact(&)

    ;pelfact(0)

    Ventru fiecare din aceste apeluri" n stiv se vor depune parametrii actuali:5"M"*"3"). Strile stivei dup ieirea din autoapel sunt urmatoarele:

    )

    3 3

    * * *

    M M M M

    5 5 5 5 5Stivavida

    fact(0)

    #&

    fact(&)

    #&*&

    fact(2)

    #&*&*2

    fact(%)

    #&*&*2*%

    fact(L)

    #&*&*2*%*L

    ]ezolvarea fiecrui autoapel nseamn deplasarea pe un nivel inferior.

    1. 4unc!ia lui 4ibonacci/": SSfib

    +

    ===

    *!"*!3

    "3)"3!

    nnfibnfib

    nsaunnfib

  • 7/25/2019 PP C++

    92/116

    b(4)

    b(3) b(2)

    b(2) b(1) b(1) b(0)

    b(1) b(0)

    1 1

    1 1 1

    long fib:int nB if :n6699n66 return ; return fib:n/ 1 fib:n/ !;E

    \arianta iterativa:long fib:int n B long f65f!65f; if:n6699n66return ; for:k6!;k>==+

    =)")!!"3""3

    )!"3"3

    )"3

    !"

    nmdac"nmacmac

    ndac"mac

    mdac"n

    nmac

    int ac:int m5 int nB if:m66return n1; if:n66 return ac:m/5; return ac:m/5ac:m5n/;E

    7, 4ie v un vector cu n elemente de tip long. Elabora!i func!ii C recursivepentru citirea afi#area determinarea sumei #i determinarea minimuluielementelor vectorului.

    ]ezolvare:

  • 7/25/2019 PP C++

    93/116

    Ginclude

    long suma:long v345int nB if:n66 return ; return v3n/41suma:v5n/;E

    long min:long v345int nB if:n66 return v34; long min!6min:v5n/; return min!>v3n/4;E

    void afisare:long v345int nB if:n66 return; afisare:v5n/; cout

  • 7/25/2019 PP C++

    94/116

    3333)3

    33333)

    3))3))

    ...

    ....

    ...

    ...

    !det

    =

    nnnn

    n

    n

    aaa

    aaa

    aaa

    (

    " prin utilizarea urmatoarei formule derecurendezvoltarea dup prima linie!:

    >=

    =

    =

    = **

    "!3

    "

    3"

    !det3

    )))

    3))333))

    ))

    n

    n

    5a

    aaaa

    na

    (n

    jjj

    j

    "

    undej5) este minorul lui

    ja) determinantul obinut din cel iniial" prinsuprimarea liniei )" coloana j!.

    Tac det%!h) putem calcula inversa matricei % dup formulaI3

    !det

    3(

    (( =

    "

    atricea3"..."3")"!"

    I == njib( ji se numete adjuncta matricei %" unde

    ij

    ji

    ji 5b += !3

    iarij5

    este minorul corespunztor elementuluiija

    al matricei(

    .

    Vrogramul conine i o funcie pentru determinarea adjunctei

    I

    ( .

    GincludeGincludeGincludeGinclude

    float ** alocare:int n

    // alocare dinamica pentru o matrice patratica de ordin n B float **m6new float*3n4; for:int i6;i

  • 7/25/2019 PP C++

    95/116

    ??6;

    for :? 6 ; ? < n ; ?11 B if:?66k continue; ii6; for :i 6 ; i < n; i11 B if:i66l continue; m3ii43??4 6 L3i43?4; ii11; E ??11; E return m;E

    float det:float **L5 int nB int i5 ?5 p5k; float d; if :n66return L3434; if :n 66 ! return L3434*L3434 / L3434*L3434;

    //altfel dezvoltare dupa linia 0 d 6 ; for :p 6 ; p < n ; p11 B float **m6minor:L5n55p; d 16 pow:/.5 p * L343p4 * det:m5 n/; dezalocare:m5n/; E

    return d;E

    float ** ad?uncta:float **L5int nB float **M6alocare:n; float **m; int i5?5l5k; for:i6;i

  • 7/25/2019 PP C++

    96/116

    void main:

    B float L3#43#46BB!55/5"E5 B5/5!5!E5 B#5/!5"5E5 B/!5!55/EE; float **m6alocare:#; clrscr:;

    //copierea matricei ; in zona alocata dinamic for:int i6;i

  • 7/25/2019 PP C++

    97/116

    int a3n1!43n1!4;

    int fig:int i5int ? B if:a3i43?466 B a3i43?46/; return 1fig:i/5?/1fig:i/5?1fig:i/5?11 fig:i5?/1fig:i5?11 fig:i15?/1fig:i15?1fig:i15?1; E return ; Eint figQ^:int i5int ?Bint *x6new int3n45 *y6new int3n45 k65 nr6; x3k46i; y3k46?; a3i43?46/;

    while:k>6 Bi6x3k4; ?6y3k4; k//; nr11; if:a3i/43?/466 B k11; x3k46i/; y3k46?/; a3i/43?/46/;E; if:a3i/43?466 B k11; x3k46i/; y3k46?; a3i/43?46/; E; if:a3i/43?1466 B k11; x3k46i/; y3k46?1; a3i/43?146/;E; if:a3i43?/466 B k11; x3k46i; y3k46?/; a3i43?/46/; E; if:a3i43?1466 B k11; x3k46i; y3k46?1; a3i43?146/; E;

    if:a3i143?/466 B k11; x3k46i1; y3k46?/; a3i143?/46/;E; if:a3i143?466 B k11; x3k46i1; y3k46?; a3i143?46/; E; if:a3i143?1466 B k11; x3k46i1; y3k46?1; a3i143?146/;E; E delete x; delete y; return nr; Evoid generare: B int i5?5k5m; randomize:;

    m61random:n*n; for:k6;k

  • 7/25/2019 PP C++

    98/116

    E

    Evoid main:B int i5?5k6; generare:; afisare:;

    cout

  • 7/25/2019 PP C++

    99/116

    /*;" ..." /n;" n ). %ccesul la elementele listei se face prin intermediul uneivariabile de indexare N" 3 N n.

    b!emorarea nlnuit presupune c fiecare element al listei este nlocuitcu o celul nod! format din dou pri: o parte de informaie corespunztoareelementului i o parte de legtur ce conine adresa corespunztoare urmtoruluielement. &a i la memorarea secvenial mai trebuie memorat adresa de bazQ n

    plus partea de legtur a ultimei celule primete o valoare ce nu poate desemna olegatur de obicei valoarea )!.

    &elulele vor fi reprezentate sub formainforma&ie leg'tur'

    cu semnificaii evidente.

    Kegturile sunt precizate" de obicei" cu ajutorul sgeilor:Kist

    'nserare

    tergere

    $ list poate fi transformat ntr-o list circular" dac n partea de legtur aultimului element vom pune adresa primului element. %locarea nlnuit cere maimult memorie decRt cea secvenial. rebuie menionat c n aplicaii partea deinformaie este mult mai mare decRt cea de legtur. Ve de alt parte memorareanlnuit elimin necesitatea deplasrii de elemente pentru operaiile deintroducere i scoatere din list aa cum rezult din figura de mai sus.

    'mplementarea listelor n limbajul & este posibil deoarece limbajul &permite definirea de tipuri de date care se autorefer definite recursiv!.

    #xemplu:struct nod B int inf; nod* leg; E;

    &rearea unei liste cu elemente de tipul nod" presupune utilizarea variabilelorcu alocare dinamic utilizRnd funciile neL i delete!" care se nasc i dispar ncursul execuiei programului" la cererea programatorului.

    void main:

  • 7/25/2019 PP C++

    100/116

    cap

    B nod *p5*W;

    p6new nod; // alocare p/>inf6$; p/>leg6;

    W6p; // @ va indica aceeai celul ca i p

    W6new nod;

    W/>inf6p/>inf;/* copiaz informaia din celula indicat de p n celula indicat de @. */

    *q=*p; // copiaz coninutul celulei pointate de p n celula pointat de @.

    p/>leg6W; /* face ca n partea de legtur a variabilei desemnate de p

    s se treac adresa variabilei desemnate de @. */

    W/>leg6; /* face ca partea de legtur a variabilei desemnate de @

    s pointeze ctre o zon de memorie nul */E

    Kistele liniare n care inserrile" tergerile i accesul la valori au loc aproapetotdeauna la primul sau la ultimul nod sunt frecvent ntRlnite i poart denumirispeciale.

    I.-0. Im(lementarea "n%r li*te (arti&"lare ;n lima!"l

    C

    I.23.1. :tiva

    Vrin stiv nelegem o list liniar pentru care operaiile de introducere iextragere a unui element se efectueaz la acelai capt al listei" numit vRrful stivei.&ellalt capt al stivei se numete baza stivei.

    Ln alocarea nlnuit" n cazul stivei" legturile merg de la ultimul element alstivei ctre primul element" ca n figura urmtoare:

    Urmtorul program implementeaz funcii de lucru cu stiva:Structura nodcuprinde cRmpurile unei celule: infW partea de informaie i

    legW partea de legtur.

  • 7/25/2019 PP C++

    101/116

    uncia int inserare:nod *8cap5 int xQ realizeaz inserareaelementului x n stiv. Tac nu este spaiu suficient funcia va returna ) desemnRndeecul operaiei de inserare" altfel va returna 3 - inserare cu succes.

    uncia void extragere:nod *8cap5int 8xQ extrage n xelementul din varful stivei. %pelul are sens dac stiva este nevid.

    uncia void listare:nod *capQ afieaz elementele stivei.uncia void stergere:nod *8capQ terge stiva.uncia int virf:nod *capQ returneaz valoarea elementului din

    vRrful stivei.

    GincludeGinclude

    struct nodBint inf; nod *leg; E;

    int inserare:nod *8cap5int xB nod *p6cap;

    cap6new nod; // variabila cap va fi nenul daca alocarea s"a fcut cu succes

    if :7cap return ;// spatiu in