+ All Categories
Home > Documents > Partea II- IDD Programarea in Limbajul C

Partea II- IDD Programarea in Limbajul C

Date post: 21-Feb-2018
Category:
Upload: reva0912
View: 228 times
Download: 0 times
Share this document with a friend

of 192

Transcript
  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    1/192

    71

    10. INTRODUCERE }N LIMBAJUL

    DE PROGRAMARE C

    Limbajul Ca fost inventat =i implementat prima dat[ ]n anii 70 de c[treDennis Ritchie, programator de sistem la Bell Laboratories. El ]=i are originea ]n

    limbajul BCPL (Basic Computer Programming Language) care, prin

    perfec\ion[ri =i dezvolt[ri succesive a devenit limbajul B =i ]n final limbajul C.

    R[sp ndirea ini\ial[ a limbajului C se datoreaz[ folosirii sale ]n scrierea

    sistemului de operare UNIX, sistem care cunoa=te ast[zi o ascensiune constant[

    printre sistemele de operare existente.

    Una din versiunile remarcabile ale limbajului C este cea furnizat[]mpreun[ cu versiunea a 5 a sistemului de operare UNIX. Aceast[ versiune este

    descris[ prima oar[ ]n cartea lui Brian Kernighan =i Dennis Ritchie intitulat[ The

    C Programming Language. Cartea este cunoscut[ ca un punct de referin\[ ]n

    evolu\ia limbajului, fiind asimilat[ cu un adev[rat standard.

    Apari\ia microcalculatoarelor a contribuit la r[sp ndirea spectaculoas[ a

    limbajului C ]n diverse variante. De=i diferen\a dintre ele nu a fost niciodat[

    semnificativ[, totu=i, pentru eliminarea anumitor neconcordan\e, ]n anul 1983 o

    comisie special[ ]ncepe lucrul pentru elaborarea standardului ANSI (American

    National Standards Institute) al limbajului C, care apare 6 ani mai t rziu, ]n anul

    1989. La ora actual[ majoritatea compilatoarelor C sunt compatibile cu acest

    standard.

    }n primele 12 capitole ale lucr[rii se prezint[ limbajul C standard.

    Datorit[ importan\ei domeniului s-a considerat util[ =i o ini\iere, ]n capitolul al

    13-lea, ]n grafica pe calculator, folosind func\iile video Borland C++.

    10.1. LOCUL LIMBAJULUI C }N FAMILIA

    LIMBAJELOR DE PROGRAMARE

    Familia limbajelor de programare se poate clasifica ]n: limbaje de nivel

    cobor t, limbaje de nivel ]nalt=i limbaje de nivel mediu.

    Prima categorie cuprinde limbajul cod-ma=in[=ilimbajul de

    asamblare. Ambele sunt specifice tipului de ma=in[ de calcul pe care sunt

    implementate. Limbajul cod ma=in[ este limbajul alc[tuit din acele instruc\iuni

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    2/192

    72

    elementare care sunt ]n\elese =i executate de un anumit tip de calculator.

    Limbajul de asamblare folose=te ]n locul codurilor numerice reprezent[ri

    simbolice, numite =i mnemonice, care u=ureaz[ munca de programare.

    Opera\iile limbajului de asamblare sunt opera\ii de baz[ ale calculatorului. El nu

    accept[ structuri de control =i date structurate, dar permite adresarea simbolic[ aloca\iilor de memorie. Din aceste motive programele ]n limbaj de asamblare sunt

    lungi =i se scriu anevoios, dar sunt performante din punct de vedere al vitezei de

    execu\ie =i al posibilit[\ilor de acces la resursele hardware.

    A doua categorie, cea alimbajelor de nivel ]nalt, include nume

    binecunoscute: Fortran, Cobol, Basic, Pascal etc.. O parte din tr[s[turile lor

    comune se refer[ la posibilitatea de a folosi structuri de control, date structurate,

    de a elabora cu u=urin\[ programe portabile (care se pot adapta u=or la

    implementarea pe diverse categorii de sisteme de calcul). Limbajele din aceast[

    categorie pierd ]ns[ calitatea esen\ial[ a limbajelor de nivel cobor t, aceea de a

    exploata eficient resursele ma=inii de calcul pe care sunt implementate.

    Categoria limbajelor de nivel mediu]mbin[ tr[s[turile principale ale

    limbajelor de nivel ]nalt cu cele ale limbajelor de nivel cobor t. Limbajul C este

    un limbaj de nivel mediu.

    10.2. C~TEVA TRAS{TURI ALE

    LIMBAJULUI C

    Limbajul C ofer[ posibilitatea organiz[rii programelor ]n module =i

    permite implementarea unor structuri de control =i tipuri de date care faciliteaz[

    programarea structurat[. Ca =i limbajele de nivel ]nalt este u=or de ]nv[\at =i de

    folosit, iar ]n plus are un num[r foarte mic de cuvinte cheie (32

    cuvinte dup[

    standardul ANSI C). Portabilitatea specific[ limbajelor de nivel ]nalt este

    accentuat[ ]n C prin folosirea func\iilor de bibliotec[ ]n realizarea opera\iilor de

    intrare/ie=ire =i de prelucrare a fi=ierelor. Num[rul mic de cuvinte cheie =i

    prezen\a unei bogate familii de operatori permit realizarea unor programe

    concise, cu un cod surs[ relativ mic. Compilatorul C este mai pu\in sever ]n

    compara\ie cu majoritatea compilatoarelor limbajelor de nivel ]nalt. Dac[ la

    aceste tr[s[turi ad[ug[m =i posibilitatea de a oferi facilit[\i ale limbajelor de nivel

    cobor t (lucru cu adrese de memorie, accesarea regi=trilor, increment[ri,

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    3/192

    73

    decrement[ri, apelul unor func\ii ale sistemului de operare) ob\inem imaginea

    unui limbaj puternic =i flexibil preferat ]n special de programatorii profesioni=ti.

    10.3. STRUCTURA GENERAL{A UNUI PROGRAM C

    Structura general[ a unui program Ceste urm[toarea:

    directive preprocesordeclaratii globale

    tip main(lista de parametri){declaratii locale

    instructiuni}

    tip f1(lista de parametri){declaratii localeinstructiuni}

    tip f2(lista de parametri){declaratii locale

    instructiuni}. . . . .

    tip fn(lista de parametri){declaratii localeinstructiuni}

    Preciz[ ri \i az[ uzual o f unc\i e

    pr i nci pal [ =i ma i mu l t e f unc\i i secundare al e acest ei a. Rezul t at ul acest ei f aze ] l

    const i t ui e o reprezent are modul ar [ , care ref l ect [ i nt erdependen\a di nt re f unc\i i le

    pr obl emei . }n pr i nci pi u, or i ce program C este o secven\[ de f unc\i i af l ate l a

    acel a=i ni vel .

    Cuv i ntel emain, f1,f2,,fnsunt nume de f unc\ii C. Or i ce f unc\i e

    di nt r -un progr am poat e apel a or i care al t [ f unc\i e di n program. Excep\i e face

    f unc\i amain()care poat e apel a al t e f unc\i i , dar nu poat e f i apel at [ di nt r -o

    f unc\i e a pr ogr amu l ui . La execu\i a unui pr ogr am C p rima f unc\i e apel at [ est emain(): execu\i a progr amu l ui ] ncepe =i se termi n[ cu i nst ruc\i uni di nmain(). Ea

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    4/192

    74

    este obl i gat ori e =i poate f i gura or i unde ] n pr ogr am. De obi cei est e pl asat [ l a

    ] nceput ul pr ogramu l ui , pent ru a -i m[ri l i zi bi l i tatea.

    Directivele preprocesorsunt i nstruc\i uni dest i nat e

    compilatorului, care f ace t ransf orm[ r i prel i mi nare asupra t extul ui ] nai nt e de a

    ] ncepe comp i l area. Faza preproces[ r i i are drept rezul t at ob\i nerea unei unit[ \i

    de compilare. Un i t at ea de comp i l are est e anal i zat [ si nt act i c (comp i l at [ ), i ar

    rezul t at ul este depus ]nmodule obiect. Modul el e obi ect rezul t at e, ]mpr eun[ cu

    modul el e obi ect corespunz[ t oare f unc\ii l or de bi bl i ot ec[ f ol osi t e sunt >l egat e>

    cu aj ut or ul pr ogramu l ui linkeditor(editor de leg[ tur i) ob\i n`ndu-se progr amu l

    execut abi l . Di rect i vel e se const i t ui e ca un l i mbaj ]n i nteri orul l imbaj ul ui C =i

    of er [ anumite faci l i t[ \i : comp i l ar ea condi\i onat [ a unor por\i uni de cod,

    ] nl ocui rea ] n t ext a unui i dent i f i cat or l a f i ecare apar i\i e cu un set de caractere,

    i ncl uderea unui f i =i er surs[ ] n program etc..

    O func\ie Ceste alc[tuit[ din antet =i un bloc de declara\ii =i instruc\iuni

    delimitat de acoladele{ =i }, numit =i corpul func\iei. Antetul con\ine numele

    func\iei, tipul valorii returnate (]ntreg, real etc.) =i o list[ de parametri formali care

    poate fi eventual vid[.

    O func\ie estedefinit[dac[ este prezentat[ complet, adic[ are forma:

    antetcorpul func\iei

    Dac[ se prezint[ doar antetul func\iei, se spune c[ func\ia estedeclarat[.

    Declara\ia modern[ a unei func\ii poart[ numele deprototip.

    Apelul func\iei se face sub forma

    nume_functie(lista de parametri actuali)

    =i presupune transferul controlului execu\iei programului c[tre instruc\iunile din

    corpul func\iei, execu\ia acestora =i revenirea ]n func\ia apelant[ ]n punctul unde

    se execut[ opera\ia care urmeaz[. Schema de apel este urm[toarea:

    func\ie func\ie

    apelant[ apelat[

    apel functie

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    5/192

    75

    Figura 10.1 -Schema de apel a unei f unc\ii .

    O func\ie C nu poate fi declarat[ sau definit[ ]n interiorul altei func\ii.

    Declaratiile globalese refer[ la entit[\i (tipuri de date,

    variabileetc.) care sunt recunoscute de toate func\iile.Declaratiile

    localelimiteaz[ valabilitatea acestor entit[\i doar la nivelul func\iei unde se

    fac. Prezen\a prototipului unei func\ii ]n zona declara\iilor globale face posibil[

    recuno=terea sa ]n toate func\iile care o apeleaz[ =i permite evitarea unor erori de

    apelare, ]nc[ din faza de compilare.

    }n construc\ia unui program C se pot folosi dou[ categorii de func\ii:

    func\ii utilizator, elaborate de programator;

    func\ii standard(predefinite), care pot fi preluate dinbiblioteca

    standarda limbajului C.

    Func\iile standard ale limbajului se pot clasifica ]n: func\ii de

    intrare/ie=ire, func\ii pentru prelucrarea caracterelor, func\ii pentru prelucrarea

    =irurilor de caractere etc.. }n mod corespunz[tor prototipurile acestor func\ii suntgrupate ]n fi=iere speciale numitefi=iereantetsauheader(au extensia ). De

    exemplu, func\iile matematice sunt grupate ]n fi=ierul antetmath.h,

    func\iile de manipulare a =irurilor de caractere ]nstring.hetc.. Pentru a

    utiliza o func\ie standard ]n program trebuie cunoscut prototipul ei. Acest lucru

    este posibil prin includerea fi=ierului antet ]n program utiliz nd directiva

    #include.

    Un program C poate avea func\iile editate ]ntr-un singur fi=ier(programemonofi=ier) sau ]n mai multe fi=iere (programe multifi=ier). Un

    exemplu simplu de program C este urm[torul:

    Exemplul 10.1

    Pr i mu l program C

    #include stdio.h

    void main(void)

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    6/192

    76

    {printf(\nPrimul program C!);}

    Se observ[ c[ programul este alc[tuit dintr-o singur[ func\ie, func\ia

    main()=i folose=te func\ia standardprintf()cu prototipul ]nstdio.h.

    TESTE DE CONTROL

    10.1Limbajul C a fost inventat de:

    a) Niklaus Wirth

    b) Dennis Ritchie

    c) Brian Kernighan

    10.2Limbajul C este:

    a) un limbaj de nivel cobor t

    b) un limbaj de nivel mediu

    c) un limbaj de nivel ]nalt

    10.3}n C, o func\ie:

    a) nu se poate declara sau defini ]n interiorul alteia

    b) poate apela o alt[ func\ie

    c)

    este alc[tuit[ din antet =i un bloc de declara\ii =i instruc\iuni delimitat

    de cuvintelebegin=i end

    10.4Func\iamain()

    a) poate s[ lipseasc[ dintr-un program C

    b) este obligatorie =i figureaz[ prima ]n program

    c) este obligatorie =i poate figura oriunde ]n program

    10.5}n C, o func\ie:a) poate include declara\ia sau defini\ia altei func\ii

    b) poate fi declarat[ sau definit[ ]n interiorul altei func\ii

    c) se poate apela numai dinmain()

    d) se poate apela din orice alt[ func\ie

    R{ SPUNSURI

    10.1-b 10.2-b 10.3-a, b 10.4-c 10.5-d

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    7/192

    77

    11. ELEMENTE DE BAZ{

    ALE LIMBAJULUI C

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    8/192

    78

    A=a cum se ]nt mpl[ cu orice limbaj artificial, temelia pe care se cl[desc

    programele C este alcatuit[ dinalfabet=i vocabular(atomi lexicali).

    Combin nd atomii lexicali dup[ regulile specifice de sintax[ se construiesc linii

    valide de program =i, ]n final, programul.

    11.1. ALFABETUL LIMBAJULUI

    Alfabetul limbajului este alc[tuit dintr-o mul\ime de simboluri care se pot

    clasifica ]nsimboluriafi=abile=i neafi=abile.

    Setul minim desimboluriafi=abile(care pot fi reprezentate grafic) este

    alc[tuit din:

    litere mari ale alfabetului englez:A B C D E F G H I J K L M N O P Q R S TU V W X Y Z

    litere mici ale alfabetului englez:

    a b c d e f g h i j k l m n o p q r s tu v w x y z

    cifre zecimale:0 1 2 3 4 5 6 7 8 9

    liniu\[ de subliniere: _

    semne de punctua\ie =i semne speciale:

    , . ; : ? ( ) [ ] < > ! | \ / ~ # &

    ^ * - = + { } %

    Prezent[m ]n Tabelul 11.1 denumirea unora din semnele enumerate.

    Tabelu l 11.1 C` t eva semne fol osi te ]n C =i denumi rea l or

    Semn Nume Semn Nume

    | bar[ vertical[ / slash

    \ backslash ~ tilda

    # diez _ liniu\[ de subliniere (underscore)

    & ampersand ^ s[geat[ sus

    Simbolurile neafi=abile(f[r[ echivalent grafic) sunt reprezentate prin

    secven\eescape(de evitare) sau coduribackslash-caracter. Aceste simboluri

    reprezint[ coduri ASCII care nu pot fi citite de la tastatur[. Folosirea lor ]n

    programe ]n locul echivalentelor ASCII este recomandat[ din ra\iuni de

    portabilitate.

    Codurile backslash ale limbajului C sunt prezentate ]n Tabelul 11.2.

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    9/192

    79

    Tabelu l 11.2 \ i a l or

    Coduri backslash Semnifica\ie

    \a Alarm[

    \b backspace (recul cu o pozi\ie)

    \f form feed (salt pagin[ nou[)

    \n newline (salt la r nd nou =i de la cap[t)

    \r carriage return (retur car)

    \t horizontal tab (tab orizontal)

    \v vertical tab (tab vertical)

    \ apostrof

    \ ghilimele

    \0 caracter nul

    \\ backslash

    \ddd caracter ASCII ]n nota\ie octal[

    \xdd caracter ASCII ]n nota\ie hexazecimal[

    Observa\ii:

    Tab or i zont al ] nseamn[ sal t ul cursorul ui cu un num[ r de col oane, i ar t ab

    ver t i cal sal t ul cursorul ui cu un num[ r de l ini i .

    Nota\i a octal [ f ol ose=t e ci f re ] n baza8( adi c[ 0,1,2,3,4,5,6,7), iar

    nota \i a hexazeci ma l [ ci f r e ] n baza16( adi c[ 0,1,2,3,4,5,

    6,7,8,9,A,B,C,D,E,F). Se observ[ c[ l i t erel eA,B,C,D,E,F

    corespund respect i v numerel or 10,11,12,13,14,15. Secven\el e\ddd

    permi t scr i erea or i c[ rui caract er di n set ul ASCI I ca un num[ r oct al forma t di n

    t rei ci f re, i ar secven\el e\xddca un num[ r hexazeci ma l forma t di n dou[

    ci fre. De exemp l u, caract erul backspacepoat e f i scri s ca\010sau

    \x08.

    11.2. VOCABULARUL LIMBAJULUI

    Vocabularul limbajului este alc[tuit din atomi lexicali. Ace=tia reprezint[

    grupuri de simboluri afi=abile care primesc ]n timpul procesului de compilare oanumit[ semnifica\ie. Prezent[m mai jos urm[torii atomi lexicali:

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    10/192

    80

    identificatori (nume)

    constante

    operatori

    semne de punctua\ie

    simboluri speciale

    11.2.1. IDENTIFICATORI

    Un identificatorreprezint[ o secven\[ de litere, cifre, liniu\e de

    subliniere, primul caracter din secven\[ fiind obligatoriu o liter[ sau liniu\[ de

    subliniere.

    De exemplu,Cod_mat,cod_mat,y_1,ax,_olsunt identificatori,

    ]n timp cex...1, a&b, 3xynu sunt. }n leg[tur[ cu identificatorii facem

    urm[toarele preciz[ri:

    }n C se face deosebirea ]ntre literele mari =i mici ale alfabetului. De exemplu,

    Cod_mat=i cod_matreprezint[ nume diferite;

    De=i sunt permi=i, este recomandabil ca identificatorii care ]ncep cu liniu\[ de

    subliniere s[ fie evita\i. Ei pot coincide cu nume rezervate, invizibile

    programatorului, provoc nd erori;

    Standardul ANSI C nu limiteaz[ num[rul de caractere (lungimea) unui

    identificator. Un compilator C va ignora ]ns[ caracterele aflate pe pozi\ii mai

    mari dec t un num[r prestabilit.

    Cuvintele cheiesunt cuvinte rezervate C care au o destina\ie prestabilit[

    (nu pot fi folosite ca nume de func\ie sau variabil[). Standardul ANSI C are32

    de cuvinte cheie, din care27au fost definite de varianta original[ a limbajului C

    (standardul Kernighan/Ritchie).

    Tabelu l 11.3 Cuv i nt e chei e dup[ st andardul Kerni ghan / Ri t chi e

    auto break case char continue

    default do double else extern

    float for goto if int

    long register return short sizeof

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    11/192

    81

    static struct switch typedef union

    unsigned while

    Tabelu l 11.4 Cuv i nt e chei e ad[ ugat e de st andar dul ANSI C

    const enum signed void volatile

    Dup[ cum se poate observa cuvintele cheie din C se scriu cu litere mici.

    Pe l ng[ cuvintele cheie rezervate de standardul ANSI C, diverse tipuri de

    compilatoare C includ =i cuvinte cheie folosite ]n exploatarea eficient[ a mediului

    de operare specific (facilit[\i privind programarea interlimbaje, accesarea

    ]ntreruperilor etc.), numite cuvinte cheie extinse.

    Cuvintele cheie extinse folosite cel mai des sunt:

    asm cdecl far huge interrupt near

    pascal _cs _ds _es _ss

    11.2.2. CONSTANTE

    Constantelepot fi numere, caractere, =iruri de caractere; valoarea lor nu

    se schimb[ ]n timpul execu\iei unui program. }n C exist[ patru tipuri deconstante:]ntreg, real, caracter, =ir.

    O constant[ ]ntreag[este un num[r zecimal, octal sau hexazecimal care

    reprezint[ o valoare ]ntreag[ pozitiv[. Dac[ se doresc =i reprezent[ri ale unor

    numere ]ntregi negative se adaug[ semnul minus ]n fa\a constantei respective.

    Constantele ]ntregi zecimalesunt numere ]ntregi scrise ]n baza10(de

    exemplu:759,+38,6496),constantele octalesunt numere ]n baza8care

    ]ncep, pentru identificare, cu cifra zero (de exemplu: 012,0765), iar

    constantele hexazecimalesunt numere ]n baza16care ]ncep pentru identificare

    cu caracterele0x(de exemplu:0xA3,0xBC1,0x7E31).

    Constantele realesunt numere reale pozitive. Pentru a reprezenta valori

    reale negative se plaseaz[ semnul minus ]n fa\a constantei. Semnul minus este

    tratat ca operator aritmetic. Exist[ dou[ modalit[\i de reprezentare o constantelor

    reale: ]nformatF(cu punct zecimal) =i ]nformat exponen\ial (form[

    =tiin\ific[).

    Reprezentarea ]n format F estereprezentarea uzual[pentru numere

    reale. De exemplu, constantele32.753,0.591,-4296.823, .69sunt

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    12/192

    82

    valori reale reprezentate ]n format F. Se observ[ c[ partea ]ntreag[ a reprezent[rii

    poate s[ lipseasc[ atunci c nd este egal[ cu zero (.69este tot una cu0.69).

    O constant[ real[ ]n format exponen\ial are forma general[:

    numar simbexp valexpunde:

    numareste o constant[ ]ntreag[ sau o constant[ real[ ]n formatF

    simbexpesteEsaue

    valexpeste o constant[ ]ntreag[ pozitiv[ precedat[ sau nu de

    semnele+sau-

    grupulsimbexp valexpse interpreteaz[ ca fiind egal cu

    10valexp.

    Remarc[ .}n real i t ate ]nt renumar, simbexp, valexpnu aparspa\ii . De exemp l u, numerel e real e: 1.6*103, -2.6*10-4, 0.32*106,

    423*104se scr i u, respecti v:1.6E+3,-2.6E-4,

    0.32e+6,423E+04.

    O constant[ caractereste o liter[, cifr[, semn de punctua\ie sau

    secven\[ escape cuprinse ]ntre dou[ apostrofuri. Exemplu de constante caracter:

    a,\n,\,7reprezent nd respectiva,newline,

    apostrof,7.

    O constant[ =ireste o secven\[ de litere, cifre =i simboluri incluse ]ntre

    ghilimele. Exemple de constante =ir: \n Acesta e un sir, Str.

    Cameliei, nr.3etc.. Constantele =ir se memoreaz[ ]n octe\i consecutivi

    (un octet pentru fiecare caracter). Sf r=itul =irului este marcat de un octetnul

    (care con\ine\0) ce se adaug[ automat. Din acest motiv un =ir cun

    caractere ocup[ n+1octe\i consecutivi.

    11.2.3. OPERATORI

    Operatoriireprezint[ combina\ii de semne speciale care arat[

    modalitatea de prelucrare sau atribuire a valorilor. Limbajul C posed[ o bogat[

    familie de operatori, fapt ce permite elaborarea unor programe compacte.

    }n Tabelul 11.5 prezent[m lista operatorilor C =i semnifica\ia lor.

    Tabelu l 11.5 Li st a operat or i l or C =i semn i fi ca\i a l or

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    13/192

    83

    Operator Semnifica\ie

    [] paranteze drepte (st ng[ si dreapt[)

    () paranteze rotunde (st ng[ si dreapt[)

    . membru structur[

    referin\[ indirect[ la membru de structur[++ incrementare (prefix sau postfix)

    -- decrementare (prefix sau postfix)

    sizeof dimensiunea unei variabile sau unui tip ]n octe\i

    ~ NOT pe bit

    ! NOT logic

    & adres[, +I pe bit

    * indirectare, ]nmul\ire/ ]mp[r\ire

    + adunare

    - sc[dere, nega\ie aritmetic[

    > deplasare logic[ pe bit la dreapta

    == egalitate

    != neegalitate< mai mic

    > mai mare

    = mai mare sau egal cu

    ^ SAU exclusiv pe bit

    SAU pe bit

    && +I logic

    || SAU logic

    ?: operator condi\ional

    = atribuire simpl[

    op= atribuire compus[

    % modul

    , virgula (operator de secven\iere)

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    14/192

    84

    Observa\ie. Caract er ul opde l a at r i bui rea compus[ poat e f i unul di n semne l e*

    / % + - >> >= = . De la

    regula de mai sus face excep\ie operatorul condi\ional (?:) care are alt[

    interpretare.

    11.2.4. SEMNE DE PUNCTUA| IE

    Semnele de punctua\ie folosite ]n C sunt:... # : {}

    Utilizarea lor va fi exemplificat[ pe parcursul lucr[rii.

    11.2.5. SIMBOLURI SPECIALE

    Orice simbol care nu apar\ine alfabetului C este considerat atom lexical.

    Astfel de semne sunt:@=i $.Ele pot fi folosite ]n construc\ia constantelor

    caracter =i a =irurilor. Ca exemplu, consider[m constanta =irAm folosit

    semnul @ in FoxPro.

    Atomii lexicali sunt separa\i ]n cadrul programului prin simboluri ale

    alfabetului cu rol de separator.Separatoriisunt: spa\iul, tabul (orizontal =i

    vertical), sf r=it de linie, sf r=it de pagin[, comentariu. Princomentariuse

    ]n\elege orice succesiune de simboluri cuprinse ]ntre /*=i */. Comentariile nu

    sunt luate ]n considerare de compilator, ele servesc la documentarea programului

    u=ur nd ]n\elegerea =i depanarea lui. Un comentariu poate fi plasat oriunde ]n

    program =i se poate ]ntinde pe unul sau mai multe r nduri.

    Exemplu:

    /*Acest program calculeaza produsul a doua

    matrici. Matricile de intrare A(4x3) si B(3x2) se

    citesc de la tastatura, iar matricea produs

    rezultata este C(4x2).

    */

    Comentariile nu pot fi imbricate (incluse unul ]n altul). De exemplu,

    urm[toarea construc\ie este eronat[:

    /* Un comentariu care include

    /* un comentariu inclus */

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    15/192

    85

    */

    Modul ]n care sunt aranja\i atomii lexicali ]ntr-un program este impus de

    specificul problemei =i de regulile de sintax[ ale limbajului.

    TESTE DE CONTROL

    11.1Un identificator este:

    a) o secven\[ de cifre, liniu\e de subliniere =i litere

    b) o secven\[ de cifre, liniu\e de subliniere =i litere, primul caracter din

    secven\[ fiind obligatoriu liniu\[ de subliniere sau liter[

    c) o secven\[ de cifre, litere, spa\ii, liniu\e de subliniere

    11.2}n C un identificator poate fi scris:a) numai cu litere mici

    b) numai cu litere mari

    c) combinat, cu litere mici =i litere mari

    11.3Dac[ ]ntr-un identificator C se ]nlocuie=te o liter[ mic[ (mare) cu litera sa

    omoloag[ mare (mic[) atunci:

    a) identificatorul ob\inut este considerat identic cu primul

    b) se ob\ine un identificator diferit

    11.4}n C exist[:

    a) patru tipuri de constante: ]ntregi, reale, caracter, =ir

    b) patru tipuri de constante: naturale, reale, complexe, caracter

    c) cinci tipuri de constante: ]ntregi, reale, complexe, caracter, =ir

    11.5}n C secven\a de cifre0631este interpretat[ ca:

    a) o constant[ ]n baz[ 10

    b) o constant[ ]n baz[ 8

    c)

    o constant[ ]n baz[ 16

    11.6Secven\a de caractere0xABCpoate fi:

    a) un identificator

    b) o constant[ hexazecimal[

    c) =i una =i alta

    11.7Cuvintele cheie:

    a) au semnifica\ii date de programator

    b)

    au semnifica\ii prestabilitec) au semnifica\ii date de contextul ]n care sunt utilizate

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    16/192

    86

    11.8Despre constantele reale3.0E-2=i .03se poate afirma c[:

    a) sunt gre=ite deoarece con\in punct ]n loc de virgul[

    b) sunt corecte =i reprezint[ valori diferite

    c) sunt corecte =i reprezint[ aceea=i valoare

    d)

    sunt gre=ite deoarece prima con\ine literaE, iar a doua nu are parte]ntreag[

    11.9Secven\aareprezint[:

    a) un =ir

    b) un caracter

    11.10Secven\a

    Citirea matricii A

    reprezint[:

    a) un =ir

    b) un comentariu

    c) nici una, nici alta

    11.11Construc\iile

    a

    =i

    a:

    a)

    reprezint[ acela=i lucru

    b) reprezint[ un =ir, respectiv un caracter

    c) reprezint[ un caracter, respectiv un =ir

    R{ SPUNSURI

    11.1-b 11.2-c 11.3-b 11.4-a 11.5-b

    11.6-b 11.7-b 11.8-c 11.9-b 11.10-c

    11.11-c

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    17/192

    87

    12. EXPRESII }N C. FUNC| II DEINTRARE/IE+IRE UZUALE

    PENTRU CONSOL{

    Expresiilesunt combina\ii valide sintactic de date =i operatori. Aici, prin

    date, ]n\elegem deopotriv[ constante =i variabile. Spre deosebire de constante

    care sunt valori fixe, variabilele semnific[ valori care se pot modifica prin

    program.

    }n C, ca =i ]n alte limbaje, datele sunt clasificate ]n tipuri de date. Exist[

    tipuri de date fundamentale(numite =i predefinite, simplesaude baz[) =i

    tipuri de date derivate. Tipurile derivate (tablouri, pointeri, structuri, uniuni,

    enumer[ri =i orice tip definit de programator) se bazeaz[ pe tipurile

    fundamentale.

    12.1. TIPURILE FUNDAMENTALE DE DATE }N

    C

    Tipurile de date fundamentale din C se ]mpart ]n cinci categorii:char,

    int, float, double=i void. Primele patru tipuri se mai numesc =i tipuri aritmetice

    =i se refer[ respectiv la valori caracter, ]ntregi, reale ]n simpl[ precizie =i reale ]ndubl[ precizie. Tipul de datevoidindic[ absen\a oric[rei valori =i este utilizat, de

    exemplu, la descrierea func\iilor care nu returneaz[ nici o valoare.

    Dimensiunea zonei de memorie alocate =i domeniul de valori asociate

    tipurilor aritmetice pot s[ difere func\ie de varianta de implementare a limbajului

    =i de tipul de procesor folosit.

    Standardul ANSI C nu precizeaz[ dec t domeniul minimal de valori al

    fiec[rui tip de date, nu =i dimensiunea sa. }n majoritatea implement[rilor ]ns[,

    tipulcharocup[ un octet, intocup[ doi octe\i, iar floatpatru octe\i. Domeniul

    de valori poate fi modificat utiliz ndmodificatorii de tip. Ace=tia sunt:signed,

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    18/192

    88

    unsigned, short=i long. Modificatorii signed, unsigned, short=i longse pot

    aplica tipului int, signed=i unsigned, tipuluichar, iar long, tipuluidouble.

    Efectul aplic[rii modificatorilor signedsauunsignedasupra tipurilor de date

    ]ntregi const[ ]n interpretarea diferit[, din punct de vedere al semnului, a

    informa\iei memorate. S[ consider[m o configura\ie binar[ de lungime N, bi\iifiind numerota\i ca mai jos:

    N - 1 N - 2 1 0

    Figura 12.1 Conf i gura\i e bi nar [ de N bi \i

    Dac[ aceast[ zon[ o destin[m memor[rii doar a ]ntregilor pozitivi, printr-

    un calcul simplu se poate vedea c[ plaja de reprezentare este[0, 2N-1]. Dac[

    zona este destinat[ memor[rii at t a ]ntregilor cu semn c t =i f[r[ semn, bitul N-1

    va fi folosit pentru reprezentarea semnului (0 pentru numere pozitive, 1 pentru

    numere negative), iar plaja de reprezentare va fi[-2N-1, 2N-1-1].

    Av nd ]n vedere aceste considera\ii , de exemplu, o variabil[ de tip

    signedintva avea un domeniu de valori cuprins ]ntre -32768 =i 32767, iar una

    de tipunsignedintva lua valori ]ntre 0 =i 65535.

    Observa\ii:

    Pent ru t i pul ] nt reg de dat e (char, int, short, long) reprezent area i mp l i ci t[

    estesigned.

    Speci f i carea unui modi f i cat or f [ r[ t i p ] nseamn[ consi derarea i mp l i ci t [ a

    t i pul ui int.

    }n C nu exi st [ t i pul de dat e bool ean. Di n acest mo t i v f unc\i oneaz[

    urm[ t oar ea conven\i e: or i ce expresi e di f er i t [ de zero are val oareaadev[ rat, i ar

    dac[ e egal [ cu zer o, val oar eafals.

    12.2. VARIABILE +I TIPURI DE DATE

    Asocierea dintre numele unei variabile =i un anumit tip de date se face

    folosind declara\iile. Forma general[ adeclara\ieiuneivariabileeste:

    tip lista_de_variabile;

    unde:

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    19/192

    89

    tippoate fi orice tip de date recunoscut ]n C, iar

    lista_de_variabilecon\ine unul sau mai mul\i identificatori desp[r\i\i

    prin virgul[. }n exemplele de mai jos vom folosi doar tipurile fundamentale.

    Exemplede decl ara\i i de vari abi l e:

    float x,y;

    int a,b1;

    short a_x,b_y;

    double z;

    Orice variabil[ folosit[ ]n program trebuie mai ]nt i declarat[. Dac[ pe

    linia de declarare variabila este ini\ializat[ se spune c[ are loc o definirea

    variabilei.

    Exemplede decl ara\i i =i def i ni\i i de vari abi l e:float x=38.981,I;

    int ab=-453;

    char ch=A,z;

    Orice variabil[ definit[ (adic[ declarat[ =i ini\ializat[) p[streaz[ ]n

    continuare atributul de baz[ al variabilei, adic[ poate fi modificat[. Dac[ se

    dore=te asocierii dintre o variabil[ =i o anumit[ valoare se utilizeaz[

    modificatorul de acces(saucalificatorul) const. Practic, efectul unei declara\ii

    de genul

    const tip nume_variabila;

    este crearea constantei simbolicenumecare poate fi utilizat[, dar nu poate fi

    modificat[ prin program. Dac[ tiplipse=te se consider[ implicit c[ tipul este

    int. }n exemplul de mai jos se definesc dou[ constante, constantapi=i constanta

    de tip int, ore_zi.

    Exemplu:

    const double pi=3.1415926536;

    const ore_zi=24;

    12.3. CONSTANTE +I TIPURI DE DATE

    }nCapitolul 11(vezi paragraful Vocabularul limbajului), am prezentat

    o clasificare a constantelor ]n: ]ntregi, reale, caracter, =ir. Se pune problema, c[rui

    tip de date ]i apar\ine o constant[ numeric[? C nd constanta este caracter,

    r[spunsul este simplu: tipuluichar. De asemenea, constanta ]n virgul[ mobil[ (]n

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    20/192

    90

    nota\ie uzual[ cu punct sau ]n nota\ie =tiin\ific[) va apar\ine tipului double.

    Pentru celelalte constante numerice compilatorul va considera implicit ]ncadrarea

    ]n cel mai mic tip de date compatibil. De exemplu, 23este de tipint, 65000de

    tipunsigned, 2000002de tip longint. }ncadrarea ]ntr-un tip de date se poate

    face =i explicit ad[ug nd constantei unul din sufixurileLsauU, dac[ e ]ntreag[sauFsauL, dac[ e real[. Constanta ]ntreag[ cu sufixul Leste de tiplong, iar cu

    sufixulU, de tipunsigned. Constanta real[ cu sufixul Fare tipulfloat, iar dac[ e

    urmat[ de sufixul Lare tipul longdouble.

    12.4. FUNC| II UZUALE DE INTRARE/IE+IRE

    PENTRU CONSOL{.

    DESCRIPTORI DE FORMAT

    Prezent[m ]n continuare func\iile folosite frecvent pentru transferul de

    date de la tastatur[ ]n memoria calculatorului (func\ii de intrare) =i din memoria

    calculatorului pe ecran (func\ii de ie=ire); cu aceast[ ocazie introducem =i

    descriptorii de formatcei mai folosi\i. Deosebim trei categorii de func\ii de

    intrare/ie=ire pentru consol[:

    func\ii generale de intrare/ie=ire (scanf()=i printf());

    func\ii speciale de intrare/ie=ire:

    func\ii pentru citirea =i scrierea caracterelor;

    func\ii pentru citirea =i scrierea =irurilor de caractere.

    12.4.1. FUNC| IILE PRINTF() +I SCANF()

    Aceste func\ii reprezint[ echivalentele pentru consol[ a func\iilor de

    intrare/ie=ire pentru fi=iere,fprintf()=i fscanf().

    Forma general[ a func\iei de afi=areprintf()este:

    int

    printf(sir_format,lista_de_argumente);

    unde:

    sir_formatpoate con\ine: mesaje pentru utilizator, secvente escape

    =i descriptori de format pentru valorile care se afi=eaz[;

    lista_de_argumentereprezint[ variabile sau expresii al c[ror

    con\inut se va afi=a.

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    21/192

    91

    Func\ia ]ntoarce num[rul de caractere scrise efectiv sau o valoare

    negativ[ ]n caz de insucces.

    Preciz[ ri:

    Descri pt ori i de f ormat servesc l a ef ectuarea conversi i l or di nt rereprezent area ext ern[ =i i nt ern[ ( l a ci t i re) =i ] nt re reprezent area i nt ern[ =i

    ext ern[ ( l a scr i ere); f orma t ul extern presupune succesi uni de caractere, i ar cel

    i nt ern succesi uni de ci f re bi nare;

    At `t l a scri ere c t =i l a ci t i re, descri pt ori i de forma t sunt pu=i ] n

    coresponden\[ de l a st ` nga spre dreapta cu el ement el e l i st ei de argumente.

    Ar gument ul t rebui e s[ f i e compat i bi l cu t i pul anun\at ] n descr i pt orul de f orma t

    cor espunz[ t or ;

    Dac[ num[ r ul de ar gument e est e ma i mi c dec`t num[ r ul descr i pt or i l or de

    forma t , dat el e de i e=i re sunt nedef i ni t e; dac[ num[ r ul ar gument el or est e ma i

    mar e dec` t num[ r ul descr i pt or i l or de forma t , argument el e ] n pl us sunt i gnorat e.

    }n Tabelul 12.1 prezent[m lista celor mai utiliza\i descriptori folosi\i de

    func\ia printf()=i semnifica\ia lor.

    Tabelu l 12.1Descri pt or i de f ormat

    Descriptori Utilizare

    %u numere ]ntregi zecimale f[r[ semn

    %d sau%i numere ]ntregi zecimale cu semn

    %c caracter

    %f numere reale ]n nota\ie uzual[

    %e sau% E numere reale ]n nota\ie =tiin\ific[ (e sau E)

    %x sau%X hexazecimal f[r[ semn (litere mici sau

    majuscule)

    %o octal f[r[ semn

    %s =ir de caractere

    %g sau%G se alege reprezentarea cu num[rul cel mai

    mic de caractere dintre cea ]n nota\ie uzual[

    =i cea ]n nota\ie =tiin\ific[ (de tip e sau E)

    %p valoare pointer

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    22/192

    92

    Descriptorul%xare ca efect afi=area cifrelor hexazecimale

    A,B,C,D,E,Fcu liter[ mic[; dac[ se folose=te%Xse afi=eaz[ cu litere mari.

    Dac[ se folose=te%eliteraedin nota\ia =tiin\ific[ apare cae, iar dac[

    se folose=te %E, apare ca majuscul[ (literaE).Valorile de tip long intse afi=eaz[ utiliz nd%ld,%li,%lu,%lo

    sau%lx.

    Valorile de tipshort intse afi=eaz[ utiliz nd%hd,%hi,%hu,%ho

    sau%hx.

    Pentru a afi=a valori doublese va alege una din variantele:

    %lf,%le,%lE,%lg,%lG, iar pentru valori long doubleuna din variantele:

    %Lf,%Le,%LE,%Lg,%LG.Tabelul 3.1 prezint[ descriptori de format f[r[ caracteristici de lungime,

    precizie =i aliniere. Folosi\i astfel, ei aliniaz[ implicit valorile la st nga =i folosesc

    spa\iu de afi=are necesar reprezent[rii acestor valori dup[ cum urmeaz[:

    %f afi=eaz[ implicit partea ]ntreag[, punctul =i 6 cifre la partea subunitar[;

    %esau%E afi=eaz[ implicit o cifr[ la partea ]ntreag[, 6 cifre la partea

    subunitar[, caracterul esauE=i exponentul precedat de+sau-;

    %gsau%G alege reprezentarea cu cel mai mic num[r de caractere dintre

    cea uzual[ =i cea =tiin\ific[.

    %d,%i,%c,%o,%x,%X,%s,%p folosesc un num[r de coloane egal cu

    num[rul de caractere ce trebuie afi=ate.

    Exemplific[m folosirea descriptorilor prezenta\i =i a secven\elor de

    evitare cu ajutorul urm[toarelor programe:

    Exemplul 12.1

    Af i =area val or i l or =i sumei a dou[ numere ] nt regi , sub f orma:

    x=valoare y=valoaresuma=valoare

    # include "stdio.h"

    void main(void){int x=10, y=-43;

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    23/192

    93

    printf ("\n\tx=%d\t\y=%d\n\t suma=%i", x,y,x+y);

    }

    Exemplul 12.2

    Af i =area unei constant e ] nt regi =i a val or i l or sal e ] n octal =i hexazeci ma l pe c`t e

    un r ` nd.

    #include "stdio.h"

    void main(void){const x=4529;printf("\n numarul este=%d\n",x);printf("\n valoarea in octal este=%o",x);

    printf("\n valoarea in hexazecimal este=%x",x);}

    Exemplul 12.3

    Af i =ar ea unui caract er =i a codul ui s[ u ASCI I ; af i =area se va t ermi na cu un

    semnal sonor .

    #include "stdio.h"

    void main(void){char a='Q';printf("\n caracterul %c are codul

    ASCII=%i\a",a,a);}

    Exemplul 12.4

    Af i =area unor val or i f ol osi nd di ver=i descr i pt or i de f orma t ; coment ar i i l e arat [

    ef ectul execu\i ei f unc\i ei printf().

    #include "stdio.h"

    void main(void){char ch;short k;int i;long int j;

    float x;clrscr();ch='A';

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    24/192

    94

    printf("\n Caracterul %c are codul ASCII =%i",ch,ch);

    /* Caracterul A are codul ASCII = 65 */

    k=250;printf("\n k=%hu",k); /* k=250 */

    i=4567;printf("\n i=%i",i); /* i=4567 */printf("\n i=%u",i); /* i=4567 */printf("\n -i=%i",-i); /* -i=-4567 */printf("\n i=%i",i); /* i=4567 */printf(" are valoarea hexazecimala %x",i);/* are valoarea hexazecimala 11d7 */printf(" sau echivalent, %X",i);/* sau echivalent, 11D7 */printf("\n i=%i",i); /* i=4567 */printf(" are valoarea octala %o",i);

    /* are valoarea octala 10727 */j=123456;printf("\n j=%li",j); /* j=123456 */

    x=76.5432;printf("\n x=%f",x); /* x=76.543198 */printf("\n x=%e",x); /* x=7.65320e+01 */printf("\n x=%E",x); /* x=7.65320E+01 */printf("\n x=%g",x); /* x=76.543200 */printf("\n x=%G",x); /* x=76.543200 */

    x=-0.123456789;

    printf("\n x=%f",x); /* x=-0.123457 */printf("\n x=%e",x); /* x=-1.234568e-01 */printf("\n x=%E",x); /* x=-1.234568E-01 */printf("\n x=%g",x); /* x=-0.123457 */printf("\n x=%G",x); /* x=-0.123457 */

    printf("\n %s","testare");}

    Dimensiunea c mpului de afi=are, precizia=i modul de alinierepot fi

    stabilite prin simboluri plasate ]ntre semnul%=i specificatorul descriptorului de

    format (i,d,u,fetc.).

    Astfel, un ]ntreg pozitiv aflat ]ntre%=i specificatorul descriptorului de

    format indic[ dimensiunea minim[ a c mpului de afi=are. Dac[ =irul sau

    num[rul care se afi=eaz[ are mai multe caractere dec t dimensiunea minim[

    precizat[, atunci afi=area va fi integral[, ]n caz contrar se completeaz[ cu spa\ii

    p n[ la realizarea dimensiunii minime. Dac[ dorim ca aceast[ completare s[ fie

    f[cut[ cu cifra0]n loc de spa\ii, atunci, ]nainte de ]ntregul care specific[dimensiunea de afi=are, se pune cifra0.

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    25/192

    95

    De exemplu, descriptorul%7fsemnific[ afi=area unui num[r real pe

    minim7coloane =i, completarea eventualelor coloane libere cu spa\ii, iar%07f

    impune acela=i num[r minim de coloane pentru afi=are, ]ns[ completarea

    coloanelor libere se va face cu cifra0.

    Utilitatea preciz[rii dimensiunii minime de afi=are apare mai ales la

    afi=area tablourilor ]n care alinierea se face pe coloane.

    Programul urm[tor ilustreaz[ efectul preciz[rii dimensiunii c mpului de

    afi=are:

    Exemplul 12.5

    Af i =area unor val or i f ol osi nd descr i pt or i de f orma t cu preci zarea di mensi uni ic` mpul ui de af i =are

    #include "stdio.h"

    void main(void){int i;float x;

    i=4567;

    printf("\n i=%4i",i); /* i=4567 */printf("\n i=%6i",i); /* i= 4567 */printf("\n i=%3i",i); /* i=4567 */printf("\n i=%06i",i); /* i=004567 */

    x=76.123001;printf("\n x=%10f",x); /* x= 76.123001 */printf("\n x=%010f",x); /* x=076.123001 */

    printf("\n %3s","testare"); /* testare */printf("\n %10s","testare"); /* testare */}

    Precizia de afi=arese specific[ printr-un punct urmat de un ]ntreg

    pozitiv. Specificatorul de precizie astfel ob\inut se plaseaz[ imediat dup[

    dimensiunea c mpului de afi=are (c nd este precizat[). Interpretarea lui depinde

    de tipul de date avut ]n vedere.

    De exemplu, descriptorul%7.3findic[ afi=area unui num[r real pe

    minim7coloane =i cu3cifre zecimale dup[ virgul[. Lucrurile se petrec

    asem[n[tor dac[ ]n loc de%fse folose=te%esau%E. Dac[ se folose=te unul din

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    26/192

    96

    descriptorii %gsau%Gspecificatorul de precizie arat[ minimul de cifre

    semnificative.

    Aplicat unui ]ntreg, specificatorul de precizie arat[ num[rul minim de

    cifre cu care va apare afi=at ]ntregul respectiv (dac[ ]ntregul nu are suficiente

    cifre atunci se completeaz[ la ]nceput cu num[rul necesar de cifre0).Un descriptor de format prev[zut cu specificator de dimensiune =i

    specificator de precizie poate fi aplicat unui =ir cu lungimea cuprins[ ]ntre

    valoarea specificatorului de dimensiune =i cea a specificatorului de precizie.

    Dac[ se dep[=e=te valoarea specificatorului de precizie, =irul se trunchiaz[.

    Se poate impune alinierea la st nga a datelor plas nd semnul (minus)

    imediat dup[ semnul %]n cadrul descriptorului.

    Programul urm[tor ilustreaz[ toate cazurile prezentate:

    Exemplul 12.6

    Af i =area unor val ori f ol osi nd di verse faci l i t [ \i al e descr i pt ori l or prezent a \i

    #include "stdio.h"

    void main(void){int i;

    double x;

    i=4567;printf("\n i=%3.7i",i); /* i=0004567

    */printf("\n i=%7.3i",i); /* i= 4567

    */printf("\n i=%-7.3i",i); /* i=4567

    */x=76.123401;printf("\n x=%10.3f",x); /* x= 76.123

    */

    printf("\n x=%-10.3f",x); /* x=76.123*/

    printf("\n x=%3.7f",x); /* x=76.1234010*/

    printf("\n x=%10.2e",x); /* x= 7.61e+01*/

    printf("\n x=%-10.1E",x); /* x=7.6E+01*/

    printf("\n x=%10.3g",x); /* x= 76.1*/

    printf("\n x=%-10.4G",x); /* x=76.12*/

    printf("\n %.4s","testare"); /* test*/

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    27/192

    97

    printf("\n %10.4s","testare"); /* test*/

    printf("\n %-10.4s","testare");/* test*/

    printf("\n %-1.10s","testare");/* testare*/

    }

    Func\ia de citirescanf()are forma general[:

    int scanf(sir_format,lista_de_argumente);

    unde:

    sir_formatpoate con\ine descriptori de format, caractere de spa\iere

    albe, alte caractere;

    lista_de_argumenteeste de forma:&var1,&var2,...,&varn.

    Prin&vse ]n\elege adresa variabileiv.

    Func\ia ]ntoarce num[rul de argumente c[rora li s-a atribuit o valoare sau

    constanta EOF (egal[ de obicei cu 1) ]n caz de insucces.

    Preciz[ ri:

    }n mar ea l or ma j ori t at e descri pt ori i de forma t fol osi\i l a f unc\i ascanf()sunt

    i dent i ci cu cei de l a f unc\i aprintf(); pract i c, di n t abel ul prezent at ant er i or

    ob\i nem o l i st [ val i d[ pent ruscanf(), ] ndep[ r t ` nd%E,%X,%G. Fol osi\i cuscanf(), descri ptori i %f,%e,%gsunt echi val en\i.

    Li st a de argument e est e ci t i t [ de l a st `nga l a dreapt a =i asoci at [ ] n aceast [

    ordi ne cu l i sta de descr i pt or i . Fi ecare descr i pt or arat [ f unc\iei scanf()t i pul

    val or i i care se va ci t i : ]nt reg, real , =i r, poi nter etc. . S[ observ[ m c[ aceste val or i

    sunt t ransf erat e vari abi l el or v1,v2,...vnpri n i nt ermedi ul adresel or

    &v1,&v2,...&vn.

    Est e de men\i onat f apt ul c[ ] n cazul ci t i r i i unui =i r , deoarece ] nsu=i numel e

    =i rul ui reprezi nt [ o adres[ , operat orul de l uare a adresei &nu va ma i preceda

    obl i gat or i u numel e =i rul ui . Un exempl u de progr am care ci t e=te =i ruri de

    caractere este prezent at ] nCapitolul 14(vezi paragraf ul Func\ii pentru

    prelucrarea =ir ur ilor de caractere).

    Ca =i ] n cazul f unc\iei printf()descr i pt or i i de f orma t pot avea =i un

    modi f i cat or de l ungi me max im[ a =i rul ui de caract ere care va f i ci t i t . De

    exemp l u, apel ul :

    scanf(%15s,sir);

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    28/192

    98

    are drept conseci n \[ ci t i rea a max imum15caractere di n =i rul de i nt rare =i

    atri bui rea =i rul ui f orma t vari abi l ei sir. Dac[ =i rul de i nt rare are ma i mu l t de

    15caractere, caract erel e ] n pl us se i gnor [ ; l a un nou apel al f unc\iei scanf()

    expl orarea =i rul ui de i nt rare ] ncepe cu aceste caractere ant er i or i gnorat e.

    Caract er el e al be de spa\iere ]n =i ruri l e de i nt rare pot f i blankurile

    (spa\i i l e al be), taburile( spa\ii tab) , sau caracterul l i ni e nou[ ( t asta

    enter). Acest e caract er e al be de spa\i ere sunt i gnorat e dac[ ] n =i rul forma t

    avem corespunz[ t or ] nt re descr i pt or i cel pu\i n un spa\i u. De asemenea, or i ce al t

    caract er poat e f i f ol osi t ca separat or ] n f l uxul de i nt rare, cu condi\i a ca el s[ f i e

    pl asat corespunz[ t or =i ] nt re descr i pt or i i de f orma t di nsir_format. Dac[

    aceast [ condi\i e nu e ] ndepl i ni t [ , l a pri ma neconcor dan\[ (de l a st `nga l a

    dreapt a) ] nt re separat or i i di n f l uxul de i nt rare =i cei di nsir_formatexecu\i af unc\iei scanf()se ] nchei e. De exemp l u, apel ul f unc\iei scanf():

    scanf(%d,%f,%s,&x,&y,sir);

    real i zeaz[ o at r i bui re corect [ a dat el or de i nt rare dac[ el e sunt desp[ r\i t e pri n

    vi rgul [ . Pent ru a at r i bui var i abi l ei xval oar ea32, l ui yval oar ea10.75=i

    vari abi l ei sirval oar eaanI, ] n f l uxul de i nt rare t rebui e s[ avem

    32,10.75,anI.

    Exemplul 12.7

    Ci t i rea numerel or r eal e x=i Xde l a t ast at ur [ , cal cul ul produsul ui x*X=i

    af i =area l ui ]n forma t exponen\ial .

    #include "stdio.h"

    void main(void){float x,X;printf("\n Tastati doua numere separate

    prin spatiu ");scanf("%f %f",&x,&X);X=X*x;printf("\n Produsul X*x este = %e", X);}

    Observa\ii:

    X =i xsunt vari abi l e di f eri t e;

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    29/192

    99

    X=X*x;este o expresi e de at r i bui re care se poat e scr i e ma i scurt sub

    forma X*=x;cu aj ut orul operat orul ui compus *=.

    Func\iile scanf()=i printf()sunt func\ii de intrare/ie=ire standard cu

    destina\ie general[. Din considerente de eficien\[ (cod mai mic, vitez[ de

    execu\ie sporit[, comoditate ]n programare etc.) limbajul C pune la dispozi\iautilizatorului =i func\ii cu destina\ie special[.

    12.4.2. FUNC| II SPECIALE PENTRU

    CITIREA/SCRIEREA CARACTERELOR LA

    NIVELUL CONSOLEI

    Standardul ANSI C prevede dou[ func\ii simetrice pentru transferul

    caracterelor la nivelul consolei: func\iilegetchar()=i putchar(). Ele ]=i au

    prototipurile ]nstdio.h.

    Func\ia pentru citiregetchar()are forma general[

    int getchar(void);

    =i ]ntoarce urm[torul caracter care va fi citit. Dac[ s-a atins sf[r=itul =irului sau seproduce o eroare se ]ntoarce EOF.

    De=i nu apar\in standardului ANSI C, totu=i, func\iilegetch(), getche(),

    putch()sunt incluse frecvent ]n biblioteca standard a compilatoarelor compatibile

    DOS. Prototipurile acestor func\ii sunt ]n fi=ierul headerconio.h.

    Func\iile getch()=i getche()sunt echivalente func\ional cu func\ia

    getchar(). Forma general[ este:

    int getch(void);int getche(void);

    Spre deosebire de func\iagetchar()unde caracterul tastat este citit numai

    dac[ se apas[ ]n continuare tastaEnter, func\iilegetch()=i getche()preiau

    caracterul imediat dup[ ce a fost tastat (f[r[ a mai ap[saEnter). De asemenea,

    func\ia getch()preia caracterul de la tastatur[ f[r[ a-l afi=a pe ecran, ]n timp ce

    getche()afi=eaz[ pe ecran caracterul citit (citire cu ecou).

    Func\ia pentru afi=areputchar()are forma general[

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    30/192

    100

    int putchar(int ch);

    undecheste caracterul care se afi=eaz[.

    Func\ia ]ntoarce ]n caz de succes caracterul scris, iar ]n caz contrar EOF.

    Func\iaputch()este echivalent[ func\ional cuputchar()=i are forma

    general[

    int putch(int ch);

    undecheste caracterul care se afi=eaz[.

    Ea este de asemenea o func\ie nestandard (nu e definit[ de standardul

    ANSI C) frecvent utilizat[.

    Exemplul 12.8

    Ci t i rea si af i =area unui caracter f ol osi nd f unc\i i l e speci al egetche() =i

    putch()

    #include "stdio.h"#include "conio.h"

    void main(void){char x;

    printf("\n Tastati o litera! ");x=getche();printf("\n Multumesc! Ati tastat litera ");putch(x);getch();}

    12.4.3. FUNC| II SPECIALE PENTRUCITIREA/SCRIEREA +IRURILOR

    DE CARACTERE LA NIVELUL CONSOLEI

    Func\ii speciale pentru citirea/scrierea =irurilor de caractere la nivelul

    consolei suntgets()=i puts(). Ambele func\ii ]=i au prototipurile ]n fi=ierul header

    stdio.h. Aceste prototipuri sunt prezentate ]nCapitolul 18al lucr[rii.

    Deoarece ]n construc\ia acestor prototipuri intervine no\iunea depointer,prezentat[ ]n detaliu ]nCapitolul 15, ne limit[m aici la a spune c[ prin apelul

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    31/192

    101

    gets(sir_destinatie);

    se cite=te un =ir de la tastatur[ ]nsir_destinatie, iar apelul

    puts(sir);

    are ca efect afi=area =irului sirpe ecran.

    D[m ca exemplu secven\a de program:. . . . . . .

    gets(x);

    . . . . . . .

    printf(\n Sirul citit este =);

    puts(x);

    . . . . . . .

    Un program complet care utilizeaz[ func\iilegets()=i puts()este

    prezentat ]nCapitolul 14(vezi paragrafulFunc\ii pentru prelucrarea =irurilor

    de caractere).

    12.5. OPERATORI. CLASIFICARE

    Operatoriisunt elemente de baz[ ale limbajului care arat[ ce opera\ii

    trebuie executate asupra unoroperanzi. }n C, operanzi pot fi constantele, numelede variabile, numele de func\ii, expresiile.

    Bogata familie de operatori confer[ limbajului C o tr[s[tur[ aparte.

    Clasificarea operatorilor C se poate face dup[ mai multe criterii:

    dup[ num[rul de operanzi prelucra\i (unari, binari, ternari);

    dup[ prioritatea avut[ ]n evaluarea expresiilor (clase de preceden\[);

    dup[ tipul operanzilor (aritmetici, rela\ionali, logici =i la nivel de

    bit).

    12.5.1. OPERATORI UNARI, BINARI, TERNARI

    | in nd cont de num[rul de operanzi prelucra\i, ]n C exist[ operatori

    unari, binari =iternari. Clasele rezultate nu sunt disjuncte, ]n sensul c[, de

    exemplu, un operator unar poate fi =i binar. Astfel, ]n expresia-3operatorul-

    (minus) este unar, iar ]n expresiaa-3, este binar.

    Singurul operator ternar este operatorul condi\ional?:.Operanzii s[i

    sunt plasa\i dup[ schemaoperand1 ? operand2 : operand 3.

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    32/192

    102

    12.5.2. CLASE DE PRECEDEN| {

    Priorit[\ile operatorilor impun ordinea de evaluare a expresiilor. Ca =i ]n

    calculele algebrice obi=nuite ordinea de evaluare poate fi modificat[ cu ajutorul

    parantezelor rotunde.

    Operatorii care au priorit[\i egale, apar\in aceleia=i clase de preceden\[.

    Lista operatorilor grupa\i dup[ clase de preceden\[ este dat[ ]n Tabelul 12.2.

    Tabelu l 12.2 Cl ase de preceden\[

    Clasa Operatori

    1 (paranteze, op. de selec\ie) () [] -> .

    2 (op.unari) ++ -- ! ~ - + &

    *

    sizeof cast

    3 (op. multiplicativi) % / *

    4 (op. aditivi) + -

    5 (op. shift) >

    6 (op. rela\ionali) < >=

    7 (op. rela\ionali) == !=

    8 (SI pe bit) &

    9 (SAU exclusiv bit cu bit) ^

    10 (SAU bit cu bit) |

    11 (SI logic) &&

    12 (SAU logic) ||

    13 (operator condi\ional) ?:

    14 (atribuire) = += -= *= etc.

    15 (secven\iere) ,

    Func\ioneaz[, de asemenea, reguli de asociere de la st nga la dreapta sau

    de la dreapta la st nga. Singurii operatori care se asociaz[ de la dreapta la st nga

    sunt operatorii unari =i operatorul ?:, restul se asociaz[ de la st nga la dreapta.

    Operatorul de atribuire=ocup[ un loc aparte ]n familia operatorilor.

    Cu ajutorul lui putem s[ atribuim unei variabile o anumit[ valoare. Forma sa

    general[ este:

    v=e;

    undeveste un nume de variabil[, iareeste o expresie. }n C, membrul st ng =i

    membrul drept al unei atribuiri se mai numesc valoare st ng[ (lvalue), respectiv

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    33/192

    103

    valoare dreapt[ (rvalue). Spre deosebire de alte limbaje (Fortran, Pascal etc.) ]n

    C, operatorul de atribuire poate apare =i ]n interiorul unei expresii, fapt ce permite

    o compactare a codului surs[. De exemplu, dou[ atribuiri succesive de genul:

    A=pi*r*r;

    V=A*h;pot fi scrise compact sub forma:

    V=(A=pi*r*r)*h;

    Practic, ce am scris mai sus este o instruc\iune expresie. Rezultatul

    evalu[rii expresiei (A=pi*r*r)estepi*r*r; dup[ cum se vede, acest

    rezultat se poate folosi mai departe ]n calcule. Atribuirea valorii pi*r*r

    variabileiAapare ca un efect secundar al instruc\iunii expresie A=pi*r*r;.

    Compilatorul C permite ca ]n expresii de genul

    v=e;

    v=i es[ aib[ tipuri diferite. }n aceast[ situa\ie au locconversii de tip. Regula de

    conversie este urm[toarea: valoarea membrului drept (valoarea lui e) se

    converte=te la tipul membrului st ng (tipul lui v). Deoarecesizeof(int)dec t float,

    care este la r ndul s[u mai >slab>dec tdouble. Dac[ membrul st ng este de un

    tip mai >slab>dec t tipul membrului drept pot avea loc pierderi de informa\ie

    (prin trunchiere) sau dep[=irea posibilit[\ilor de reprezentare. De exemplu, ]n

    secven\a:

    int x,y;

    float a,b;

    .........

    x=a;

    b=y;

    variabilaxva primi partea f[r[ frac\ie a valorii asau un rezultat imprevizibil

    dac[ se dep[=esc posibilit[\ile de reprezentare, iar valoarea ]ntreag[ yva fi

    convertit[ la o valoare reprezentat[ ]n virgul[ mobil[.

    Considera\iile de mai sus referitore la conversia tipurilor sunt valabile =i

    ]n situa\ia ]n care cel pu\in unul dintre cei doi operanzi ai operatorului de

    atribuire sunt variante ale tipului int(char, signed, unsigned, short,long) sau

    ale tipuluidouble(longdouble).

    }n C este posibil[ atribuirea multipl[, ca ]n exemplul de mai jos:x=y=z=s=0;

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    34/192

    104

    Efectul este atribuirea valorii0variabilelorx,y,z,s.

    De asemenea, ]n anumite situa\ii se pot folosi operatorii deatribuire

    compus[. Practic, orice atribuire de genul:

    variabila=variabila operator expresie;

    undeoperatorpoate fi ales din lista de operatori *, /, %, +, -, >>,

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    35/192

    105

    . . . . .

    int x=7,y=3,z,w;

    . . . . .

    z=(w=x

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    36/192

    106

    operatorul%aplicat unor operanzi ]ntregi furnizeaz[ restul ]mp[r\irii

    acelor ]ntregi; de exemplu, secven\a:

    . . .

    int x,y

    x=7;

    y=x%2;

    . . .

    produce pentruyvaloareay=1, adic[ restul ]mp[r\irii lui7la2.

    12.5.4. OPERATORI RELA| IONALI +I LOGICI

    Operatorii rela\ionalidin limbajul C sunt:, =, ==,

    !=. Semnifica\ia lor rezult[ din Tabelul 11.5. }n urma evalu[rii unei expresii ]n

    care intervin operatori rela\ionali rezult[ valoarea0pentrufals=i 1pentru

    adevarat. Programul de mai jos afi=eaz[ valorile anun\ate ]n comentariile

    al[turate:

    Exemplul 12.9

    Af i =area val or i l or unor expresi i ] n care i nt ervi n operat or i rel a \i onal i

    #include "stdio.h"#include "conio.h"

    void main(void){float x=0, y=2.3;printf("\n x=y are valoarea %d",x>=y); /*0*/printf("\n x==y are valoarea %d",x==y); /*0*/printf("\n x!=y are valoarea %d",x!=y); /*1*/getch();}

    Operatorii logicidin C sunt:

    ! NU logic

    && SI logic|| SAU logic

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    37/192

    107

    Modul de ac\iune al acestor operatori este prezentat ]n Tabelul 12.3.

    Tabelu l 12.3 Tabl a val or i l or de adev[ r pent ru operat or i l ogi ci

    a b a && b a || b !a

    0 0 0 0 1

    0 1 0 1 1

    1 0 0 1 0

    1 1 1 1 0

    Observa\ii:

    Di n Tabel ul 12.3 rezul t [ c[ operat or i i l ogi ci &&=i ||au o pr i or i t at e

    ma i mi c[ dec` t operat or i i rel a \i onal i . D i n acest mo t i v:

    expresi a ad e echi val ent [ cu(ad)

    expresi a a>b&&cb)&&(c3vom scri e!(a>3)=i nu!a>3.

    Expr esi a !(a>3)va ret urna corect val oar ea0sau1f unc\ie de m[ r i mea l ui

    a, ]n timp ce expresi a!a>3ar e t ot deauna val oar ea0(datori t [ pri ori t [ \ii ma i

    mar i a operat or ul ui !fa\[ de>se eval ueaz[ ma i ]nt`i !acare poat e f i 0sau1;

    or i care ar f i val oarea l ui a, rezul t [ ] n f i nal val oarea0).

    Dac [ ]ntr -o expresie forma t [ di n operanzi l ega\i pr i n operat orul ||, i ar

    val oarea pr i mu l ui operand este1, val oarea expresi ei este1(vezi Tabel ul 12.3)

    =i cei l al\i operanzi nu se ma i eval ueaz[ . Dac [ ]ntr -o expresi e f orma t [ di n

    operanzi l ega\i pr i n operat orul &&, pri mu l operand i a val oar ea0, val oarea

    expresi ei este0i ar cei l al\i operanzi nu se ma i eval ueaz[ .

    Deoarece prezen\a parant ezel or nu reduce vi t eza de execu\i e a

    expresi i l or, el e pot f i f ol osi t e, al [ t uri de spa\i i , l a cre=terea gradul ui de l i zi bi l i t ate

    a unui progr am. I at [ dou[ expresi i echi val ent e:

    a=c=c&&a

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    38/192

    108

    12.5.5. OPERATORI LA NIVEL DE BIT

    Operatorii la nivel de bitdin C permit programatorului s[ manevreze

    bi\ii apar\in nd unor valori de tipcharsauint(ei nu se aplic[ tipurilor de date

    float, doublesaulongdouble). Aceasta este una din acele facilit[\i care apropie

    limbajul C de nivelul limbajelor de asamblare.

    Operatorii la nivel de bit sunt:

    & SI pe bit

    | SAU pe bit

    ^ SAU exclusiv pe bit

    ~ NU pe bit (complement fa\[ de1)

    >> deplasare dreapta (shiftdreapta)

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    39/192

    109

    Observa\ii:

    Oper atorul &reprezi nt [ o modal i tate de a el i mi na un bi t (de a -l f ace egal cu

    0) sau de a re\i ne bi\i i care ne i nt ereseaz[ (opera\ie de mascare).

    }n opera\i i l e de t ransmi t ere a dat el or, bi t ul superi or (cel ma i di n st`nga) al

    unui octet este consi derat de cel e ma i mu l te ori bit de pari tate. Pri nt r -o oper a\i e

    de set are l a1a acest ui bi t sau de anul are a sa, se poat e ob\i ne un num[ r par

    sau i mpar de bi\i ] n oct et ul respect i v f unc\i e de conven\i a de par i t at e accept at [

    (par i t at ea poat e f i par [ sau i mpar [ ) . Ut i l i zarea par i t [ \i i , permi t e veri f i carea

    corect i t udi ni i oct et ul ui t ransmis. Ar [ t [ m ma i j os cum se poat e modi f i ca bi tul de

    par i t at e:

    Exemplu:

    1. Anul area bi t ul ui de pari t at e al unui oct et .

    1000 0101 &0111 11110000 0101

    2. Set area l a val oar ea1a bi t ul ui de par i t at e a unui oct et .

    0000 0101 |

    1000 00001000 0101

    Observ[ m c[ anul area bi t ul ui de par i t at e s-a f [ cut pr i n ] nmul \i r e cu

    num[ r ul 127(0111 1111] n baza2) , i ar set area l a val oarea1a acel ui a=i

    bi t pr i n adunar e cu num[ r ul 128(1000 0000] n baza2).

    Dat ori t [ posi bi l i t [ \i i de a modi f i ca val or i l e bi\i l or, operat ori i pe bi t se

    f ol osesc ma i al es ]n proi ect ar ea programel or de i nterf a \[ cu di spozi t i ve

    peri f er i ce.

    O a l t [ apl i ca\i e i nt eresant [ se ref er [ l a codi f i carea =i decodi f i carea unui

    fi =ier. O modal i tate simp l [ est e f ol osi rea operat orul ui ~, porni nd de l a

    obser va\i a c[ ~(~x)=x, pent rux]nt reg arbi t rar. Deci , dac[ exi st [ un

    progr am de codi f i care, l a pri ma sa rul are t o \i bi\i i nul i devi n1, i ar to\i bi\i i de1

    devi n nul i ( codificarea). La o nou[ rul are est e evi dent c[ se ob\i ne f i =i erul

    i ni\i al (decodificarea).

    O pos ibi l i tate ma i put erni c[ de codi f i care =i decodi f i care est e operat orul ^.

    }n acest caz pent ru acest e opera\i i se f ol ose=t e o chei e.

    Rel u` nd exemp l ul cu val ori l e

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    40/192

    110

    x=0000 0101 y=0010 0100

    0000 01010010 0100

    x^y=0010 0001

    s[ pr esupunem c[ yest e chei a. Dac [ ] nt re codi f i carea ob\i nut [ (x^y)=i chei a

    yef ect u[m d i n nou oper a\i a^se ob\i ne rezul t at ul i ni\i al x(decodi f i carea) .

    0010 00010010 0100

    (x^y)^y=0000 0101

    Forma general[ aoperatorilor de deplasareeste:

    variabila > numar intreg, pentru deplasare la dreapta.

    Aici, numar_intregse refer[ la num[rul de pozi\ii cu care vor fi

    deplasa\i spre st nga, respectiv spre dreapta bi\ii variabilelor.

    Deplasarea bi\ilor spre un cap[t sau altul poate produce pierderea unui

    num[r de bi\i de la respectiva extremitate. Cu ce se completeaz[ bi\ii r[ma=i

    liberi?

    Dac[ deplasarea este spre st nga, bi\ii liberi din dreapta se completeaz[

    cu0.

    Exemplu. S[ consider[m declara\ia

    unsigned char x=7;

    Num[rul 7este reprezentat ]n baza2ca0000 0111. Atunci, x

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    41/192

    111

    9 se reprezint[ prin 0000 1001

    ~9 este 1111 0110

    ~9+1 este 1111 0111

    -9 se reprezint[ prin 1111 0111

    }n consecin\[, \in nd cont de precizarea f[cut[ mai sus

    x>>2 va produce 1111 1101

    Observa\ii.Depl asar ea spre st ` nga cunpozi \i i echi val eaz[ cu o

    ]nmul \i re a var i abi l ei cu2n, i ar depl asarea spre dreapt a cu n pozi\i i echi val eaz[

    cu ]mp[ r \i r e a var i abi l ei cu2n. Aceste depl as[ r i (opera\ii shift) sunt ma i r api de

    dec` t opera\i i l e corespunz[ t oare de ] nmul \i re sau ]mp[ r \i re

    cu2n

    .

    Exemplu:

    Dac[x=7atunci:

    x2va produce 1111 1110 adic[,-2=-8/22.

    12.6. CONVERSII DE TIP IMPLICITE

    Limbajul C ofer[ posibilitatea de a construi expresii cu date de tipuri

    diferite. Din acest motiv exist[ un set de reguli de conversie a operanzilor la tipul

    operandului cel mai >tare>. Aceste reguli sunt cunoscute sub numele de

    avansare de tip(type promotion). Iat[ setul de reguli:

    Variabile de tipchar=i shortse convertesc la tipul int.

    Dac[un operand estelongdouble

    At uncial doilea este convertit la longdouble;

    Al tf eldac[un operand estedouble

    At uncial doilea e convertit ladouble;

    Al t fel dac[un operand estefloat

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    42/192

    112

    At uncial doilea e convertit la float;

    Al tf eldac[un operand esteunsignedlong

    At uncial doilea e convertit launsigned long;

    Al t fel dac[un operand estelong

    At uncial doilea e convertit la long;Al t fel dac[un operand esteunsigned

    At uncial doilea este convertit launsigned.

    12.7. CONVERSII DE TIP EXPLICITE

    (OPERATORUL CAST)

    Operatorul de conversie explicit[(cast) ac\ioneaz[ temporar, for\ nd

    schimbarea tipului expresiei la care se refer[. Forma general[ a operatorului este:

    (tip)expresie;

    undetipeste tipul la care dorim s[ se fac[ conversia expresiei.

    De exemplu, rezultatul evalu[rii expresiei

    (float)i/2;

    undeia fost definit prin

    int i=3;

    este1.5. Dac[ ]n acelea=i condi\ii se evalua expresiai/2; rezultatul ar fi fost

    trunchiat la1(se ]mp[r\eau doi ]ntregi).

    TESTE DE CONTROL

    12.1}n C exist[ tipurile fundamentale de date:

    a) char, int, float, double, void

    b) char, integer, real, double, void

    c) char, int, float, double, nul, boolean

    d) character, string, real, void

    12.2Modificatorii de semn

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    43/192

    113

    a) schimb[ semnul unei expresii

    b) schimb[ semnul numai pentru valori ]ntregi

    c) au ca efect interpretarea diferit[ din punct de vedere al semnului, a

    informa\iei memorate ]ntr-o anumit[ zon[

    12.3Declara\iilechar x;

    =i

    signed char x;

    a) sunt echivalente

    b) sunt gre=ite

    c) sunt corecte

    12.4Declara\iile

    short int x;

    =i

    int x;

    a) sunt echivalente

    b) sunt gre=ite

    c) sunt corecte

    12.5Declara\ia

    float x,y;

    a) este echivalent[ cufloat x;float y;

    b) este gre=it[

    c) este echivalent[ cux,y:float;

    d) este echivalent[ cureal x,y;

    12.6Linia de programchar ch=A,Z;

    are semnifica\ia:

    a) variabilachia valori de laAlaZ

    b) variabilacheste de tipchar=i este ini\ializat[ cu valoareaA, iar

    variabilaZeste de tipchar

    c) tipul de datecharia valori de laAlaZ

    12.7.Liniile de programconst ore_zi=24;

    int ore_zi=24;

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    44/192

    114

    a) sunt echivalente

    b) sunt corecte =i compatibile

    c) sunt corecte =i incompatibile

    12.8Secven\a de program

    int x=10,y=20,z=5,w=7;printf(\n x=%i y=%i z=%d,x,y);

    afi=eaz[:

    a) x=10 y=20 z=5

    b) date de ie=ire nedefinite

    c) x=10 y=20

    12.9Secven\a de program:

    int x=10,y=20,z=5,w=7;

    printf(\n x=%d y=%i,x,y,z);

    a) afi=eaz[ x=10 y=20

    b) afi=eaz[ x=10 y=20 z=5

    c) este gre=it[

    12.10Instruc\iuneaprintf()de mai jos

    printf(\nuu!\taurul \n-are importanta!);

    afi=eaz[

    a)

    \nuu!\taurul\n-are importanta!

    b)taurul n-are importanta!

    c)uu!aurul -are importanta!

    d)uu! aurul

    -are importanta!

    12.11Secven\a de program

    int i=10,j=20;

    printf(\n i=%i,j=%i,j,i);afi=eaz[

    a)i=10, j=20

    b)i=20, j=10

    c)i=10% j=20%

    12.12Secven\a de program

    int i=10,j=20;

    printf(\n i=%i,j=%j,i,j);

    a)afi=eaz[i=10,j=20

    b) este gre=it[

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    45/192

    115

    c)afi=eaz[i=%10,j=%20

    12.13Secven\a de program

    char a=q;

    printf(\n a=%d,a);

    a)

    este gre=it[ deoarece%deste descriptor pentru tipul int, nu pentrutipul char

    b) este corect[ =i afi=eaz[ codul ASCII al caracterului q

    c) este corect[ =i afi=eaz[ codul ASCII al caracterului a

    d) este corect[ =i afi=eaz[ caracterul q

    12.14Secven\a de program

    float x=32.75;

    printf(\n x=%e,x=%f,x,x);

    a) este gre=it[ deoarece argumentul xse repet[

    b) este corect[ =i va afi=ax=32.75,x=32.75

    c) este corect[ =i va afi=a x=3.275000e+01,x=32.750000

    12.15Secven\a de program

    int x=439;

    printf(\n %o,x);

    afi=eaz[:

    a) 439

    b) num[rul 439scris ]n baza8

    c) num[rul 439scris ]n baza16

    12.16Secven\a de program

    int x=1011;

    printf(\n %x,x);

    afi=eaz[:

    a)

    valoarea luix]n binar

    b) valoarea luix]n hexazecimal

    c) valoarea luix]n octal

    12.17Secven\a de program

    int x=12;

    float y=31.42;

    printf(\n x=%f y=%d,x,y);

    a)

    afi=eaz[ x=12 y=31.42b) afi=eaz[ x=12.0 y=31

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    46/192

    116

    c) este gre=it[

    12.18Secven\a de program

    float x=10.5;

    printf(\n x=%-10.5f,x);

    a)

    afi=eaz[ x=-10.5b) afi=eaz[ x=10.50000

    c) este gre=it[

    12.19Secven\a de program

    float x=10.5;

    printf(\n x=%10.5,x);

    a) afi=eaz[ x=10.5

    b) afi=eaz[ x= 10.50000

    c) afi=eaz[ x=10.50000

    12.20Despre secven\ele de program

    float x;

    scanf(%f,x);

    =i

    float x;

    scanf(%f,&x);

    se poate afirma c[:

    a) sunt corecte =i au acela=i efect

    b) prima secven\[ este corect[ =i a doua incorect[

    c) prima secven\[ este incorect[ =i a doua corect[

    12.21Secven\a de program

    printf(%.3s,abcde);

    a) afi=eaz[ abc

    b)

    afi=eaz[ abcdec) este gre=it[

    12.22Dac[ =irul care trebuie citit de la tastatur[ esteabcdefatunci secven\a

    scanf(%3s,sir);

    a) este gre=it[, deoarece variabilasirnu e precedat[ de operatorul &

    b) este gre=it[, deoarece =irul de intrare are6caractere, iar descriptorul

    %sprevede doar3caractere

    c)

    este corect[, dar se citesc doar caractereleabc12.23Secven\a de program

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    47/192

    117

    scanf(%d;%f;%s,&x,&y,sir);

    a) este gre=it[, deoarece descriptorii de format sunt desp[r\i\i prin

    semnul ;

    b) este gre=it[, deoarece variabilasirnu e precedat[ de operatorul &

    c)

    este corect[ =i realizeaz[ corect citirea dac[ datele din fluxul deintrare sunt desp[r\ite prin semnul ;

    12.24Operatorii ]n C pot fi:

    a) unari, binari

    b) unari, binari, ternari

    c) unari, binali, termali

    12.25Operatorii+=i -pot fi:

    a) numai unari

    b) numai binari

    c) unari sau binari

    12.26Secven\a de program:

    float x;

    int i;

    x=34.21;

    i=x;

    a) este gre=it[ deoarece se atribuie valoarea real[ dinxvariabilei ]ntregi

    i

    b) este corect[

    c) este corect[, iariva primi valoarea34

    12.27Secven\a de programint i;

    float x;

    i=34;

    x=i;

    a) este gre=it[, deoarece se atribuie valoarea ]ntreag[ dinivariabilei

    realex

    b) este corect[

    c) este corect[, iarxva primi valoarea34convertit[ ]n virgul[ mobil[.

    12.28Linia de program

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    48/192

    118

    V=(A=B*b)*h;

    a) este eronat[ deoarece con\ine operatorul de atribuire=de dou[ ori

    b) este corect[

    c) este corect[ =i este echivalent[ cu secven\a de program

    A=B*b;V=A*h;

    12.29Linia de program

    a=b=c=1;

    a) este corect[ =i e echivalent[ cu secven\a

    a=1;

    b=1;

    c=1;

    b) este corect[ =i e echivalent[ cu secven\a

    1=a=b=c;

    c) este gre=it[ deoarece operatorul de atribuire apare de mai multe ori

    12.30Expresia

    x+=1;

    a) este gre=it[

    b) este corect[ =i echivalent[ cux=x+1;

    c)

    este corect[ =i echivalent[ cux++;

    d) este corect[ =i echivalent[ cu++x;

    12.31Expresia

    y=--x;

    a) este gre=it[

    b) este corect[ =i echivalent[ cu secven\a

    x=x-1;

    y=x;c) este corect[ =i echivalent[ cu secven\a

    y=x;

    y=x-1;

    12.32Expresia

    y=x--;

    a) este gre=it[

    b) este corect[ =i echivalent[ cu secven\a

    x=x-1;

    y=x;

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    49/192

    119

    c) este corect[ =i echivalent[ cu secven\a

    y=x;

    x=x-1;

    12.33}n urma execu\iei secven\ei de program:

    int i,j;i=19;

    j=i/4;

    a) jia valoarea4

    b) jia valoarea4.75

    c) jia valoarea5

    12.34}n urma execu\iei secven\ei de program:

    int i,j;

    i=19;

    j=i%4;

    a) jia valoarea3

    b) jia valoarea4

    c) jia valoarea4.75

    12.35Dac[a,b,c,dsunt variabile numerice atunci expresia

    (ad)se poate scrie:

    a) ad

    b) ad

    c) c>d||ax)||(a

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    50/192

    120

    z=(x>y)&&(a

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    51/192

    121

    12.44Complementul fa\[ de2al num[rului ]ntregise ob\ine ca:

    a)~i+1

    b)~i-1

    c) 2-i

    12.45Opera\iax2echivaleaz[ cu:

    a) o ]nmul\ire a luixcu2

    b)

    o ]mp[r\ire a lui xla2c) o ]nmul\ire a luixcu22

    d)o imp[r\ire a luixcu22

    12.47Secven\a de program

    int i=7;

    float x;

    x=(float)i/4;

    printf(\n x=%f,x);

    . . . . .

    a) este gre=it[

    b) este corect[ =i afi=eaz[ x=1.750000

    c) este corect[ =i afi=eaz[ x=1

    R{ SPUNSURI

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    52/192

    122

    12.1-a 12.2-c 12.3-a, c 12.4-c 12.5-a

    12.6-b 12.7-c 12.8-b 12.9-a 12.10-d

    12.11-b 12.12-a 12.13-b 12.14-c 12.15-b

    12.16-b 12.17-c 12.18-b 12.19-b 12.20-c

    12.21-a 12.22-c 12.23-c 12.24-b 12.25-c12.26-b, c 12.27-b, c 12.28-b, c 12.29-a 12.30-b, c, d

    12.31-b 12.32-c 12.33-a 12.34-a 12.35-a, c

    12.36-b 12.37-b 12.38-a, b, c 12.39-b 12.40-a, b, c, d

    12.41-a, b, c, d 12.42-c 12.43-a 12.44-a 12.45-c

    12.46-d 12.47b

    13. INSTRUC| IUNI DE CONTROL

    ALE PROGRAMULUI

    }n acest capitol se prezint[ instruc\iunile de control ale unui program C:

    instruc\iunea expresie, instruc\iunile decizie (sau de selec\ie), instruc\iunile

    iterative (repetitive sau de ciclare) =i instruc\iunile se salt. }n situa\ia ]n care

    sintaxa limbajului impune utilizarea unei singure instruc\iuni, dar logica

    programului cere folosirea unei secven\e de instruc\iuni, secven\a de instruc\iuni

    se organizeaz[ ca o instruc\iune bloc (sau instruc\iune compus[).

    O instruc\iune bloc ]ncepe cu{=i se termin[ cu}.

    13.1. INSTRUC| IUNI EXPRESIE

    Instruc\iuneaexpresieare forma general[:

    expresie;

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    53/192

    123

    undeexpresieare efect lateral (con\ine o atribuire sau reprezint[ un apel de

    func\ie).

    Secven\a de program urm[toare con\ine exemple de instruc\iuni

    expresie:

    . . . . . . .

    x=(a+b)*c;

    x+=2;

    p++;

    getch();

    13.2. INSTRUC| IUNI DE DECIZIE13.2.1. INSTRUC| IUNEA IF

    Forma general[ a instruc\iunii ifeste:

    if(expresie)

    instructiune_1;

    else

    instructiune_2;

    Efectul instruc\iunii este urm[torul: dac[ expresieeste adev[rat[

    (diferit[ de zero) se execut[ instructiune_1]n caz contrar (expresie

    este egala cu zero) se execut[ instructiune_2. Figura 13.1 ilustreaz[

    modul de execu\ie al instruc\iunii if.

    Expresie

    Instruc\iune_1Instruc\iune_2

    Fals Adev[rat

    F igura 13.1.Modul de execu\i e al i nst ruc\i uni iif

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    54/192

    124

    Exemplul 13.1

    Pr ogr amu l cal cul eaz[ =i af i =eaz[ radi cal ul di nt r -un num[ r .

    #include "stdio.h"#include "conio.h"#include "math.h"

    void main(void){float x,y;printf("\n Introduceti x=");scanf("%f",&x);if (x

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    55/192

    125

    f orm[ cunoscut [ sub numel e de ifcu ramur[ vid[. I nst ruc\i unea

    instructiunese execut [ numa i dac[ expresi a este adev[ rat [ , adi c[ se

    execut [ condi\i onat . Modul de execu\i e al i nst ruc\i unii ifcu r amur [ vi d[ est e

    i l ust rat ]n Fi gura 13. 2.

    Exemplul 13.2.

    Pr ogr amu l cal cul eaz[ max imu l di nt r e dou[ numere.

    #include "stdio.h"#include "conio.h"

    void main(void){float x,y,max;printf("\n x=");scanf("%f",&x);printf("\n y=");scanf("%f",&y);;max=x;if (max

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    56/192

    126

    if(expr1)

    instr1;

    else

    if(expr2)

    instr2;else

    . . . . . .

    if(exprn)

    instrn;

    else

    instrn+1

    Ef ectul execu\i ei unei i nst ruc\i uni ifimbr i cat e este urm[ t or ul : dac[ nu

    exi st [ i, i=1,...,n ast f el ] nc`t expresi aexpris[ f i e adev[ rat [ , se

    execut [ instrn+1, ] n caz cont rar se execut [ pr i ma i nst ruc\i une ( consi der ` nd

    eval uarea de sus ]n j os), instripent r u careexpriest e adev[ rat [ , i ar rest ul

    i nst ruc\i uni l or se i gnor [ .

    Pent run>mar e>, f ol osi nd o al i ni ere st r i ct [ , se aj unge l a o st ruct ur[ cu

    ad nci me mare (mul t depl asat [ spre dreapt a) . Di n acest mo t i v se fol ose=t e de

    obi cei f orma:

    if(expr1)

    instructiune1;

    else if(expr2)

    instructiune2;

    else if(expr3)

    instructiune3;

    . . . . . .

    else

    instructiunen+1;

    numi t [ =i scaraif-else-if.

    Exemplul 13.3

    Pr ogr amu l ci t e=t e coordonat el e unui num[ r =i stabi l e=t e ] n ce cadran se af l [

    acest a.

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    57/192

    127

    #include "stdio.h"#include "conio.h"

    void main(void){float x,y;printf("\n abscisa x=");

    scanf("%f",&x);printf("\n ordonata y=");scanf("%f",&y);if (x>=0 && y>=0)printf("\n Numarul apartine cadranului I");else if (x=0)printf("\n Numarul apartine cadranului II");else if(x

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    58/192

    128

    printf(\n x nul);

    Dac [ t ot u=i vrem s[ punem ]n pract i c[ pr i ma i nt en\i e putem fol osi una

    di n f ormel e echi val ent e:

    a) if(x)

    {if(y)

    printf(\n x si y nenuli);

    }

    else

    printf(\n x nul);

    b) if(x)

    if(y)

    printf(\n x si y nenuli);

    else;

    else

    printf(\n x nul);

    c) if(x&&y)

    printf(\n x si y nenuli);

    else

    if(!x)

    printf(\n x nul);

    }n i deea creer i i unor programe >dense> se pot scr i e const r uc\i i de genul

    if( (c=getch() ) == a)

    putch(a);

    else

    printf(\n caracter diferit de a);

    unde expresi a condi\i onal [ con\i ne o at r i bui re. Const ruc\i i le dense t rebui e f acut e ] ns[ cu gr i j [ , deoarece este posi bi l s[

    avem surpr i ze nepl [ cut e. Secven\a de ma i j os

    x=y=7;

    a=5;b=6;

    if((x=a)(y=b))

    printf(\nx=%i si y=%i,x,y);

    va producex=5,y=7=i nux=5, y=6cum ne-am f i a=teptat . Pent ru ca

    expresi a

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    59/192

    129

    (x=a)(y=b)

    s[ f i adev[ rat [ est e suf i ci ent ca numa i una di n expresi i l e (x=a) sau (y=b) s[ f i e

    adev[ rat [ . Cu al t e cuvi nt e, se execut [ at r i bui reax=5, expresi a (x=5) ia

    val oarea adev[ rat , val oarea expresi ei (y=b) nu ma i are i mpor t an\[ =i deci

    at r i bui reay=6nu mai are l oc.

    13.2.2. OPERATORUL CONDI| IONAL ? :

    Operatorul condi\ional?:este un operator ternar, iar forma sa general[

    este:

    expr1?expr2:expr3;

    Efectul execu\iei unei astfel de secven\e este echivalent cu efectul

    execu\iei secven\ei:

    if expr1

    expr2;

    else

    expr3;

    }n plus, expresiaexpr1?expr2:expr3va lua valoareaexpr2sau

    expr3dup[ cumexpr1este adev[rat[ sau nu.

    Exemplul 13.4

    Pr ogr amu l af i =eaz[ max imu l di nt r e dou[ numerea=i bci t i t e de l a tast at ur[ .

    #include "stdio.h"#include "conio.h"

    void main(void){int a,b;

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    60/192

    130

    printf("\n a=");scanf("%i",&a);printf("\n b=");scanf("%i",&b);printf("\n Maximul dintre a=%i si b=%i este

    %i",a,b,a=ip n[ la primul break]nt lnit sau p n[ la

    sf r=itul instruc\iunii switch.

    Dac[ pentru oricei=1,...,nconstantelecisunt diferite de expresia

    selectoare se execut[ instructiunen+1, dac[ exist[ op\iuneadefaultsau se

    iese direct dinswitch,dac[ aceasta lipse=te.

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    61/192

    131

    Exemplul 13.5.

    Pr ogramu l ci t e=te una di n l i t erel ea,A,m,M,p,Pde l a t ast at ur [ =i af i =eaz[ o

    l i st [ de nume care ] ncep cu una di n acest e l i t ere, f [ r [ s[ \i n[ cont dac[ l i t era

    este mar e sau mi c[ . Dac[ se t ast eaz[ al t caract er se af i =eaz[ un mesaj de

    er oare.

    #include "stdio.h"#include "conio.h"

    void main(void){printf("\n Tastati una din literele:a,A,m,M,p,P

    ");

    switch(getch()){

    case 'a':case 'A':printf("\n Aurel,Ana,Andrei"); break;case 'm':case 'M':printf("\n Maria,Mihai,Marin"); break;case 'p':case 'P':printf("\n Paula,Petre,Pavel"); break;default :printf("\n Ati tastat gresit !");

    }getch();}

    Observa\ie.} n pr ogr amu l de ma i sus, i ndi f erent dac[ s-a tast at asauA

    se af i =eaz[ aceea=i l i st [ de nume: Aurel, Ana, Andrei. Expl i ca\i a este

    urm[ t oarea. Dac[ se t ast eaz[ ase >i nt r [ > ] nswitch, pri ncase 'a'.

    Secven\a de prel ucr[ r i corespunz[ t oare f i i nd vi d[ =i ne nt ` l ni ndu-se ni ci o

    i nstruc\i une breakse t rece =i se execut [ secven\a de prel ucr [ r i cor espunz[ t oar e

    constant ei case 'A'(adi c[ af i =area l i st ei ). Deoar ece secven\a se ]nchei e cu

    breakse >i ese> di nswitch. Anal og se ] nt `mp l [ =i cu grupuri l e de l i t erem,M=i

    p,P.

    13.3. INSTRUC| IUNI ITERATIVE

    Instruc\iunile iterative(repetitivesau deciclare) permit ca una sau mai

    multe instruc\iuni s[ fie repetate. Num[rul de itera\ii depinde de ]ndeplinirea unei

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    62/192

    132

    condi\ii. Dac[ testul asupra condi\iei se face ]naintea instruc\iunilor care se

    repet[, se spune c[ itera\ia e cu test ini\ial; ]n caz contrar itera\ia e cu test final.

    }n limbajul C exist[ dou[ instruc\iuni cu test ini\ial,while=i for=i o

    instruc\iune cu test final,do- while.

    13.3.1. INSTRUC| IUNEA WHILE

    Forma general[ a instruc\iunii whileeste:

    while(conditie)

    instructiune;

    unde:

    conditiepoate fi orice expresie;

    instructiunepoate fi o instruc\iune simpl[, vid[ sau o

    instruc\iune compus[ (numit[ =i corpul ciclului).

    Efectul instruc\iunii este urm[torul: se execut[ instructiunec t

    timpconditiee adev[rat[ (diferit[ de zero). Atunci c ndconditiedevine

    fals[ (egal[ cu zero), execu\ia programului continu[ cu instruc\iunea imediat

    urm[toare. Organigrama de mai jos ilustreaz[ sugestiv modul de lucru al

    instruc\iuniiwhile.

    Observa\ii:

    Dac[ di n star t condi\i a este fal s[ instructiunenu se execut [

    ni ci odat [ .

    I e=i rea di n ci cl u se poat e f ace norma l (ca ef ect al prel ucr[ r i l or di n

    instructiune, dup[ un num[ r de pa=i , conditiedevi ne f al s[ ) , anorma l

    (pri nt r -o i nst ruc\i une de sal t care t ransfer [ execu\ia pr ogr amu l ui di n i nteri orul

    Fals

    Instruc\iune

    Adev[rat

    Condi\ie

    Figura 13.3.Modul de l ucru al i nst ruc\i uni i while

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    63/192

    133

    ci cl ul ui ] n af ara l ui ) sau >ni ci odat [ > (conditier [ m ne mereu adev[ r at [ -

    se ob\i ne a=a zi sabucl[ etern[).

    Pr ezent [ m ma i j os un exemp l u de progr am unde apar e f oar t e nat ural [

    pr ezen\a test ul ui i ni\i al ] n bucl [ =i deci f ol osi rea i nst ruc\i uni i while.

    Exemplul 13.6

    Cal cul ul l ungi mi i unui =i r de caract ere ci t i t de l a tast at ur[ ; sf `r=i t ul =i rul ui este

    mar cat de t ast aEnter(caract erul \r).

    #include "stdio.h"#include "conio.h"

    void main(void){int i=0;printf("\n Tastati un sir:\n");while (getche()!='\r')

    i++;printf("\n Lungimea sirului =%d",i);getch();}

    13.3.2. INSTRUC| IUNEA FOR

    }n C, instruc\iunea forprezent[ =i ]n alte limbaje, are implementarea cea

    mai flexibil[. Ea dep[=e=te cadrul tradi\ional ]n care este plasat[ de obicei:

    instruc\iune cu contor(variabil[ de control) recomandat[ spre a fi folosit[ ori

    de c te ori se cunoa=te num[rul de itera\ii.

    Forma general[ a instruc\iunii foreste:

    for(initializare;conditie;actualizare)

    instructiune;Semnifica\ia tradi\ional[ a celor trei componente este urm[toarea:

    initializareeste de regul[ o instruc\iune de atribuire folosit[ pentru

    ini\ializarea contorului ciclului;

    conditieeste o expresie care determin[ sf r=itul ciclului;

    actualizarese refer[ la felul ]n care se modific[ variabila contor.

    Instruc\iuneaforeste echivalent[ cu secven\a de instruc\iuni

    initializare

    while(conditie)

    {

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    64/192

    134

    instructiune

    actualizare

    }

    De aici rezult[ =i efectul execu\iei sale: se execut[ blocul instructiune

    actualizarec t timpconditiaeste ]ndeplinit[.

    Exemplul 13.7

    Pr ogramu l real i zeaz[ suma a nnumere real e.

    #include "stdio.h"#include "conio.h"

    void main(void){float s=0,x;int i,n;printf("\n n=");scanf("%i",&n);for (i=0;i

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    65/192

    135

    Exemplul 13.8

    Af i =area termeni l or =i rul ui l ui Fi bonacci ma i mar i ca1=i ma i mi ci ca un num[ r

    dat m. +i rul are f orma 1, 1, 2, 3, 5, 8, , adi c[ pr i mi i doi termeni sunt egal i cu

    1, i ar ori ce al t termen se ob\i ne ca sum[ a cel or doi t ermeni care-l pr eced.

    #include "stdio.h"#include "conio.h"

    void main(void){int a,b,c,m,i;printf("\n Limita de afisare =");scanf("%i",&m);printf("\n Termenii sirului Fibonacci < %i\n",m);

    printf("\n 1 1 ");for (i=3,a=b=1,c=2;c

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    66/192

    136

    Oricare din componenteleinitializare,conditie,

    actualizareale instruc\iunii forpoate s[ lipseasc[, ]ns[ delimitatorii ;

    trebuie s[ fie prezen\i. Lipsa componentei conditieeste interpretat[ ca fiind

    echivalent[ cu prezen\a unei expresii condi\ionale adev[rate. Din acest motiv,

    secven\afor(;;);

    creeaz[ un ciclu infinit sau o bucl[ etern[.

    13.3.3. INSTRUC| IUNEA DO-WHILE

    Este recomandabil s[ se foloseasc[ instruc\iuneado-whilec nd

    instruc\iunea care reprezint[ corpul ciclului trebuie executat[ cel pu\in o dat[.

    Forma general[ a acestei instruc\iuni este:

    do

    {

    instructiuni

    }

    while(conditie);

    C nd corpul ciclului este format dintr-o singur[ instructiuneacoladele pot s[ lipseasc[. Totu=i, este recomandabil s[ se p[streze chiar =i ]n

    aceast[ situa\ie pentru a distinge mai u=or o instruc\iunewhilecare ]ncepe, de o

    instruc\iunedo-whilecare se termin[.

    Efectul instruc\iunii este urm[torul: se execut[ secven\a de

    instructiunic t timp expresia condi\ional[ conditieeste adev[rat[.

    Organigrama de mai jos ilustreaz[ cu claritate modul de execu\ie al ciclului do-

    while.

  • 7/24/2019 Partea II- IDD Programarea in Limbajul C

    67/192

    137

    Observa\ii:

    Dat or i t [ a=ez[ r i i t est ul ui de condi\i e dup[ corpul ci cl ul ui , este evi dent c[

    gr upul deinstructiunise execut [ cel pu\i n o dat [ .

    Dac [ ] n corpul ci cl ul ui nu se af l [ i nst ruc\i uni car e s[ conduc[ l a o condi\ie

    f al s[ dup[ un num[ r f i ni t de ci cl [ r i ( i e=i re norma l [ di n ci cl u) sau i nst ruc\i uni de

    sal t di n i nt eri orul ci cl ul ui ( i e=i re anorma l [ ) se ob\i ne un ci cl u i nf i ni t (bucl [

    et ern[ ) .

    Exemplul 13.9

    Pr ogramu l ci t e=t e dou[ numere a=i bde l a t ast at ur [ =i af i =eaz[ suma l or.

    Procesul cont i nu[


Recommended