RO-Limbajul de Programare C 70 Pag (1)

  • Upload
    0esmon0

  • View
    87

  • Download
    5

Embed Size (px)

DESCRIPTION

RO-Limbajul de Programare C 70 Pag (1)

Citation preview

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    1/140

    1. Cum se scrie un program in C? 1.1. Un prim program 1.2. Variabile, expresii si asignari 1.3. Un exemplu de utilizare a variabilelor de tip float 1.4. nitializarea variabilelor 1.!. "olosirea directivei #define

    1.$. "olosirea functiilor printf%& si scanf%& 1.'. nstructiunea ()*ile( 1.+. tilul de redactare al programelor 1.-. rori de programare frecvente 1.1/. 0edirectarea intrarii si iesirii 1.11. xercitii propuse spre implementare

    Capitolul 1

    Cum se scrie un program (in C) ?

    rogramele sunt scrise pentru a instrui masinile sa lucreze cu tasuri specifice sau sa rezolveprobleme specifice. procedura %descrisa pas cu pas& asociata unui tas se numeste algoritm.rogramarea este activitatea de comunicare %codificare& a algoritmilor in calculatoare. rocesul de

    programare are %in general& patru pasi5 1. pecificarea tas6ului7 2. 8escoperirea unui algoritm pentru solutia sa7 3. Codificarea algoritmului in C7 4. 9estarea codului.

    Un calculator este o masina electronica digitala compusa din trei componente51. procesor %central processing unit sau CU&7

    2. memorie7 3. dispozitive de intrare:iesire.rocesorul lucreaza cu instructiuni care sunt inregistrate in memorie. e langa aceste instructiuni, inmemorie sunt pastrate si date. 8ispozitivele de intrare:iesire iau informatii de la agenti externi catremasina si produc informatii pentru acesti agenti.8ispozitivele de intrare sunt %de obicei&5 1. tastatura7 2. disc*eta7 3. banda7

    4. C860;.8ispozitivele de iesire sunt %de obicei&5 1. ecranul terminalului7 2. imprimanta7 3. disc*eta7 4. banda7 !. C860;.

    istemul de operare consta intr6o colectie de programe speciale si are doua scopuri principale5 1. coordoneaza resursele %memoria, procesorul, imprimanta& masinii. 8e exemplu, daca un fisiereste creat pe disc sistemul de operare are gri

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    2/140

    Un cod C se numeste cod sursa, iar un fisier ce contine un cod sursa se numeste fisier sursa. 8upace a fost creat un fisier sursa, atunci se invoca un compilator de C. 8e exemplu, pentru sistemele;68 se poate da comanda5 bc ex1.c sau tcc ex1.ciar pentru unele sisteme U=>5 cc ex1.c

    8aca nu sunt erori in ex1.c, atunci aceasta comanda produce fisierul executabil asociat %ex1.exe&.cum acesta poate fi rulat %executat& cu numele sau %ex1 sau ex1.exe&.n continuare, vom preciza trei dintre trasaturile procesului de compilare %mentionam ca asupraacestor notiuni, vom reveni cu detalii interesante intr6un capitol viitor&5 1. invocarea preprocesorului7

    2. invocarea compilatorului7 3. invocarea incarcatorului.reprocesorul modifica o copie a codului sursa prin includerea altor fisiere si facand alte sc*imbari.Compilatorul traduce aceasta in cod obiect folosit de incarcator pentru producerea fisieruluiexecutabil final. "isierul care contine codul obiect se numeste fisier obiect. "isierele obiect, spredeosebire de fisierele sursa, nu se pot intelege asa usor. Cand spunem deci compilare, de fapt

    invocam preprocesorul, compilatorul si apoi incarcatorul.8upa ce scriem un program, acesta trebuie compilat si testat. 8aca sunt necesare modificari, atuncicodul sursa trebuie editat din nou. sadar, partea proceselor de programare consta din ciclul5

    editare 666@ compilare 666@ executie AA B B B B B B BB

    66666666666666666666666Un prim program

    66666666666666666666666 sa incepem cu un exemplu de program C necesar pentru tiparirea unui sir pe ecran.

    #include Dstdio.*@

    main%&E printf%(azi am inceput laboratoarele de CFn(&7G

    "olosind un editor de texte, presupunem ca am scris si salvat acest fisier numit (ex1.c(. Cand

    programul este compilat si rulat atunci va apare pe ecran sirul5

    azi am inceput laboratoarele de C

    6666666666666Explicatii:

    66666666666661. #include Dstdio.*@Hiniile care incep cu (#( se numesc directive de preprocesare %precompilare&. cestea comunica cu

    preprocesorul. ceasta directiva (#include( determina preprocesorul sa includa o copie a fisierului*eader (stdio.*( in acest punct al codului. arantezele ung*iulare din (Dstdio.*@( indica ca acest

    fisier se gaseste in biblioteca C %pentru compilatorul Iorland 3.1 pentru ;68, acesta se gasestein subdirectorul IC31:=CHU8&. m inclus acest fisier deoarece acesta contine informatii desprefunctia (printf%&(.

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    3/140

    2. main%&"iecare program are o functie numita (main(, care se executa intai. arantezele ce urmeaza dupa(main( indica compilatorului ca aceasta este o functie.

    3. E

    colada stanga incepe corpul fiecarei functii. acolada dreapta corespunzatoare trebuie sa fie lasfarsitul functiei.

    4.printf%&istemul C contine o biblioteca standard de functii care poate fi utilizata in programe. (printf%&( esteo functie din biblioteca care tipareste pe ecran. ceasta este o functie descrisa in biblioteca(stdio.*( %care se numeste prototipul functiei (printf%&(&.

    !.(azi am inceput laboratoarele de CFn(Un sir constant in C consta dintr6un numar de caractere incadrate intre g*ilimele. cest sir este unargument al functiei (printf%&(. Caracterele Fn de la sfarsitul sirului %se citesc (bacslas* n(&

    reprezinta, de fapt, un singur caracter numit (ne)line(.

    forma ec*ivalenta a programului de mai sus5

    #include Dstdio.*@main%&E printf%(azi am inceput (&7 printf%(laboratoarele de CFn(&7G

    66666666666666bservatii5666666666666661. rimul (printf( contine la sfarsit un spatiu.

    66666666666666666666666666666666666666Variabile, expresii si asignari

    66666666666666666666666666666666666666n urmatorul exemplu vom ilustra folosirea variabilelor pentru manipularea valorilor intregi.Variabilele sunt folosite sa memoreze valori. 8in moment ce diferite tipuri de variabile sunt folositesa memoreze diferite tipuri de date, tipul fiecarei variabile trebuie specificat.

    entru a ilustra aceasta idee vom calcula cate ore si minute contin un anumit numar de zile.lgoritmul ar fi5 1. asigneaza un numar de zile unei variabile7 2. calculeaza numarul de ore si memoreaza6l intr6o variabila7 3. calculeaza numarul de minute si memoreaza6l intr6o variabila7 4. afiseaza numarul de zile, ore si minute pe ecran.Urmatorul program scris in C reprezinta implementarea algoritmului precedent5

    #include Dstdio.*@main%&E int zile, ore, minute7 zile'7 ore24Jzile7

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    4/140

    minute$/Jore7 printf%( saptamana are Kd ore, Kd minute.Fn(,ore, minute&7GCand compilam si rulam acest program, pe ecran va apare mesa

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    5/140

    zero.

    6666666666666666666666666666666666666666666666666666666666666666Un exemplu de utilizare a variabilelor de tip float

    6666666666666666666666666666666666666666666666666666666666666666#include Dstdio.*@

    main%&E float x, M7

    x 1./7 M 2./7 printf%(uma dintre x si M este Kf.Fn(, xLM&7Ge ecran se va afisa

    uma dintre x si M este 3.//////.

    66666666666666Observatii:

    666666666666661. Hinia

    float x, M7semnifica declararea variabilelor x si M de tip (float( %deci de tip real&. n realitate sunt numererationale din intervalul N61/AE3/+G,61/AE63/+GO U N1/AE63/+G,1/AE3/+GO2. Hinia

    printf%(uma dintre x si M este Kf.Fn(, xLM&7are doua argumente si reprezinta o tiparire la ecran. 8e remarcat, ca spre deosebire de exemplele

    precedente %unde foloseam formatul Kd&, aici folosim formatul pentru numere reale, care este (Kf(.3. recizarea tipului variabilelor este esential. 8e exemplu, daca, sa zicem, ca x'./ si M2./, suntdeclarati ca fiind de tip float, atunci x:M se evalueaza la 3.!. 8aca, insa x' si M2, sunt declarati cafiind de tip int, atunci x:M se evalueaza la 3 %ramane doar partea intreaga&.

    6666666666666666Initializarea

    6666666666666666nitializarea variabilelor se poate face si cand se declara acestea. 8e exemplu, putem scrie5

    c*ar cPP7 int i17utem astfel modifica programul precedent, inlocuind liniile

    int zile, ore, minute7 zile'7cu

    int zile', ore, minute7

    66666666666666Observatii:

    66666666666666

    1. 8e obicei, pentru initializarea unei variabile se folosesc constante sau expresii constante. e potinsa folosi si variabile care au de

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    6/140

    666666666666666666666666666666666666Folosirea directivei #define

    6666666666666666666666666666666666660eamintim ca in procesul de compilare a programelor C, intai este invocat preprocesorul. 8eexemplu, pot fi incluse fisiere, sau anumite siruri de caractere specificate pot fi modificate in altesiruri. 8irectivele de preprocesare incep cu caracterul # %in C traditional, acesta trebuie pus pe

    prima coloana, pe cand in = C poate fi precedat de spatii&. e recomanda scrierea # pe primacoloana, iar a directivelor de precompilare la inceputul programului. ata cateva exemple de folosirea directivei (#define(5

    #define H;9 1// #define 3.141!-

    66666666666666Observatii:

    666666666666661. 8aca aceste directive de preprocesare apar la inceputul fisierului, atunci in momentul compilarii

    preprocesorul sc*imba toate aparitiile identificatorului H;9 la 1// si a lui cu 3.141!-.ingurele care raman nesc*imbate sunt sirurile constante. 8e exemplu, preprocesorul va sc*imbaprintf%( KfFn(, &7 in printf%( KfFn(, 3.141!-&78eoarece identificatorul se va inlocui peste tot %cu exceptia sirurilor constante& in 3.141!-, atunciacesta se va numi constanta simbolica.2. 8irectiva #define poate aparea oriunde in program, dar ea afecteaza numai liniile care urmeazaacesteia.3. rin conventie, identificatorii care trebuie sc*imbati de preprocesor se scriu cu ma

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    7/140

    6 Ks este folosit pentru tiparirea unui sir de caractere

    66666666666Exemplu::"ie instructiunea566666666666printf%(;ultime de argumente5 Ks Kd Kf KcKcFn(,(one(,2,2.33,PQP,PP&7rgumentele lui (printf%&( sunt separate de virgula, deci avem sase argumente. rimul argumenteste sirul de control. btinem corespondenta5 Ks D666@ (one( Kd D666@ 2 Kf D666@ 2.33 Kc D666@ PQP Kc D666@ PPCand se executa programul ce contine aceasta instructiune, obtinem5 ;ultime de argumente5 one 2 2.33//// Q

    66666666666666Observatii:666666666666661. 8aca instructiunea (printf%&( contine prea multe caractere, atunci se poate scrie aceasta pe maimulte linii, separate prin virgula. 8e exemplu, putem scrie5 printf%(KsKsFn(, (ceasta instructiune se va scrie (, (pe o linie de text foarte lunga.Fn(&79abelul de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    8/140

    vor avea ca efect afisarea5 =umere15 1./ 2.// 3./// =umere25 4./ !.// $.///

    66666666666666666666666666Folosirea lui scanf!"

    66666666666666666666666666"unctia (scanf%&( este asemanatoare cu (printf%&(, dar este folosita pentru intrari in loc de iesiri.rimul sau argument este un sir de control care are formatele corespunzatoare cu variatele moduride interpretare a sirurilor de intrare. 8upa sirul de control urmeaza adresele variabilelor. dresaunei variabile este locul din memorie unde este memorata variabila %vom reveni in capitoleleviitoare&. imbolul (R( reprezinta operatorul de adresa. 8e exemplu, scanf%(Kd(, Rx&7formatul Kd implica interpretarea caracterelor tiparite la intrare ca un intreg zecimal, si apoimemorarea valorii variabilei la adresa lui x.9abelul de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    9/140

    cest program calculeaza aria cercului

    8ati raza5 2.333

    ria J raza J raza 3.14 J 2.33 J 2.33

    1'./--348aca am calcula separat %pe *artie&, am obtine ria 3.14 J 2.33 J 2.33 1'./4$'4$, numar carenu coincide cu cel furnizat de calculator. Tustificarea este aceea ca si raza sunt tiparite doar cudoua zecimale, pe cand valorile lor sunt pastrate in memorie cu precizie mai mare.

    66666666666666666666666666666Instructiunea $%ile

    66666666666666666666666666666nstructiunea )*ile face parte din categoria actiunilor repetitive. entru a intelege aceastainstructiune, vom face un exemplu de adunare a numerelor de la 1 la 1/.

    6666666666666Exemplu::6666666666666#include Dstdio.*@

    main%&E int i1, suma/7

    )*ile %iD1/&E

    suma suma L i7 i i L 17 G printf%(uma primelor 1/ numere este KdFn(,suma&7G6666666666666

    Explicatii:

    66666666666661. Ha linia

    int i1, suma/7se declara variabilele i si sum de tip int si sunt initializate cu 1 si /, respectiv.

    2. Constructia)*ile %iD1/&

    E suma suma L i7 i i L 17 Greprezinta o instructiune )*ile %sau iteratie )*ile&. ;ai intai, se evalueaza expresia iD1/. Cumvaloarea initiala a lui i este egala cu 1, rezulta ca se vor executa instructiunile dintre acolade. stfel,variabila suma va fi asignata cu vec*ea valoare a lui suma la care se adauga valoarea lui i. 8eci,suma se evalueaza la 1. poi, variabila se evalueaza la suma dintre vec*ea valoare a lui i %i1& si1, deci este egala cu 2. n acest moment, executia revine la inceput adica evaluam expresia iD1/.Cum valoarea lui i este 2, rezulta ca se va executa iar corpul lui )*ile. Ha sfarsitul acestei iteratii,suma este evaluata la 1L2, iar i la 3. e observa usor ca iD1/ este tot adevarata, deci se va executadin nou corpul lui )*ile. Ha sfarsitul celei de6a treia iteratii, sum este evaluata la 1L2L3, iar i la 4.

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    10/140

    rocesul continua pana cand valoarea lui i este 11, care implica falsitatea expresiei iD1/. stfel seiese din bucla )*ile.3. nstructiunea printf%(uma primelor 1/ numere este KdFn(, suma&7va afisa mesa&,atunci scanf%& va intoarce valoarea 61 %deci tot false&.

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    11/140

    2. )*ile %scanf%(Kf(, Rx&1& E contor contor L17 suma suma Lx7 G8upa cum am vazut mai sus, bucla )*ile se executa atata timp cat scanf%(Kf(, Rx&1 se evalueaza

    la true. teratia se inc*eie cand tastam ControlAz sau ceva ce nu se poate converti la float, deexemplu PaP sau C0. Ha fiecare executie a buclei se incrementeza variabila contor, iar valoareavariabilei suma creste cu valoarea lui x %citita de la tastatura&.3.printf%(FnKsK!dFnKsK12fFnFn(, (=umarul de numere5 (, contor, (uma lor5 (, suma&7resupunem ca executam acest program pentru numerele 1.1 2./2 3.//3 4.///4 !.////!e ecran va apare rezultatul5 =umarul de numere5 ! uma lor5 1!.12344-

    666666666666666Observatii:

    6666666666666661. 8aca numaram spatiile, observam ca valoarea lui contor a fost tiparita pe un camp de ! caractere,iar suma pe 12 caractere. ceasta este cauzata de formatele (K!d( si (K12f(. 0etineti ca tiparireazecimalelor pentru suma este gresita de la a treia zecimala.

    666666666666666666666666666666666666666666666'tilul de redactare al programelor

    666666666666666666666666666666666666666666666Un stil bun de scriere a codului este esential pentru arta programarii. ceasta faciliteaza citirea,

    scrierea si intretinerea programelor. Un stil bun foloseste51. spatii goale si comentarii, astfel incat codul este usor de citit si de inteles72. utilizarea indentarii este cruciala, care indica cu precizie structurile de control. 8e exemplu, in constructia )*ile %expresie& instructiuneindentarea instructiunii indica ca executia acesteia este sub controlul iteratiei )*ile73. alegerea de nume sugestive pentru variabile74. corespondenta dintre acolade. 8e exemplu, urmatorul program este scris in stilul (Iell Habsindustrial programming stMle( %#,E,G,m pe prima coloana&.

    #include Dstdio.*@#include Dstdlib.*@

    #define Q (tart(

    main%&E

    G

    666666666666666

    Observatii:6666666666666661. rogramatorii incepatori uneori cred ca vor (sparge( piata cu stilul lor propriu de redactare a

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    12/140

    programelor. tentie S Utilizati strategia care este de

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    13/140

    GG

    66666666666666666666666666666666666666666666666Exercitii propuse spre implementare

    666666666666666666666666666666666666666666666661. resupunem ca dispunem de rezultatele din anul curent relative la cursul de sc*imb valutar dintreleu, dolar, marca si franc. a se scrie un program C care deseneaza %cu caractere C& graficulevolutiei raportului leu:valuta, unde valutaEdolar, marca, francG. poi, desenati graficul raportuluidolar:marca si marca:franc.2. crieti un program C care primeste la intrare un numar de secunde, si intoarce numar maxim deore, de minute, de secunde care este ec*ivalent ca timp. 8e exemplu, '3+4 secunde este ec*ivalentcu 2 ore, 3 minute si 4 secunde.3. "olosind o bucla )*ile, scrieti un program C care calculeaza al n6lea termen din sirul din"ibonacci. 0eamintim ca sirul lui "ibonacci este dat de recurenta liniara de ordin 25

    a1a217 aEnL2GaEnL1GLan, n@1

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    14/140

    tomi lexicali, operatori, sistemul C 2.1. Caractere si atomi lexicali 2.2. vanta

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    15/140

    666666666666666Comentarii666666666666666Comentariile sunt siruri de caractere cuprinse intre :J si J:. Comentariile nu reprezinta atomilexicali. Compilatorul va traduce comentariile intr6un singur caracter spatiu, de aceea comentariile

    nu fac parte din codul executabil.66666666666

    tentie S entru a verifica aceasta, puteti citi lungimea unui cod executabil %fara comentarii& si66666666666 apoi sa comparati lungimea codului executabil obtinut dupa o noua compilare %cu

    comentarii&.

    6666666666666666666666666666666xemple5 de comentarii5 66666666666666666666666666666661. :J un comentariu J:

    2. :JJ al doilea comentariu JJ:3. :JJJJJ:4. :J J l patrulea J comentariu J:!. :JJJJJJJJJJJJJJ

    J l cincilea J J comentariu J JJJJJJJJJJJJJJ:

    66666666666666666666666666666666666666666666vanta

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    16/140

    numite implementari pot contine si alte cuvinte rezervate5

    asm cdecl far *uge interrupt near pascalComparativ cu alte limba

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    17/140

    1234!$'+-//////////// nu poate fi memorat ca fiind un intreg.

    666666666666666666666iruri constante666666666666666666666

    secventa de caractere incadrate intre g*ilimele, de exemplu (abc(, este un sir constant. steinteles de compilator ca fiind un singur atom lexical. n capitolele ulterioare, vom vedea ca de faptsirurile constante se memoreaza ca siruri de caractere. irurile constante sunt tratate mereu diferitfata de constantele de tip caracter. 8e exemplu, (a( nu este totuna cu PaP.8e mentionat ca g*ilimeaua ( reprezinta un singur caracter, nu doua. 8e aceea, daca dorim sa apara

    intr6un sir constant, atunci ea trebuie precedata de F %bacslas*&. 8aca dorim ca intr6un sir sa apara F,atunci trebuie sa6l precedam tot cu F %devenind astfel FF&.

    666666666666xemple55

    6666666666661. (sir text(2. (( :J sirul vid J:3. ( ( :J sir de spatii J:4. ( a b L c ( :J nu se executa nimic J:!. ( :J acesta nu este un comantariu J: ($. ( un sir ce contine g*ilimea F( ('. ( un sir ce contine bacslas* FF (+. :J (gresit( J: :J nu este un sir J:-. (gresit doi( :J nici asta nu este sir J:8oua siruri constante care sunt separate doar printr6un spatiu vor fi concatenate de compilator intr6unul singur. 8e exemplu, (abc( (def( este ec*ivalent cu (abcdef(ceasta este o trasatura a limba

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    18/140

    int a, b 2, c 37 a 1' J %b L c&7 ... Gnumite caractere speciale sunt folosite in multe contexte. "ie espresiile a L b LLa a L b

    le folosesc caracterul L, dar LL este un singur operator, la fel ca si L.

    666666666666666666666666666666666666666666666666666666peratorii de precedenta si asociativitate 666666666666666666666666666666666666666666666666666666peratorii au reguli de precedenta si asociativitate care implica evaluarea expresiilor. 8in momentce expresiile din interiorul parantezelor se evalueaza mai intai, este clar ca parantezele sunt folosite

    pentru a preciza care operatii se fac mai intai. Consideram expresia1 L 2 J 3

    n C, operatorul J are prioritate %precedenta& mai mare decat L, deci se va face intai inmultirea apoi

    adunarea. 8eci valoarea expresiei este '. expresie ec*ivalenta este 1 L %2 J 3&e de alta parte, expresia %1 L 2& J3 este diferita7 ea are valoarea -.Consideram acum expresia 1 L 2 6 3 L 4 6 !. peratorii L si 6 au aceeasi precedenta, deci se va

    folosi regula de asociativitate la stanga. stfel %%%1 L 2& 6 3& L 4& 6! este o expresie ec*ivalenta.n continuare vom prezenta un tabel in care precizam regulile de precedenta si asociativitate pentrucativa operatori din C. B6666666666666666666666666666666666666666666666B6666666666666666666666666666BB peratori B sociativitate B B6666666666666666666666666666666666666666666666B6666666666666666666666666666BB %& LL %postfix& 66 %postfix& B de la stanga la dreapta B B6666666666666666666666666666666666666666666666B6666666666666666666666666666BB L%unar& 6%unar& LL%prefix& 66%prefix& B de la dreapta la stanga B B6666666666666666666666666666666666666666666666B6666666666666666666666666666BB J : K B de la stanga la dreapta B B6666666666666666666666666666666666666666666666B6666666666666666666666666666BB L 6 B de la stanga la dreapta B B6666666666666666666666666666666666666666666666B6666666666666666666666666666BB L 6 J : etc. B de la dreapta la stanga B B6666666666666666666666666666666666666666666666B6666666666666666666666666666B9oti operatorii de pe o linie %de exemplu, J, :, K& au aceeasi prioritate intre ei, dar au prioritate mai

    mare decat cei ce apar in liniile de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    19/140

    dreapta. peratorii LL si 66 se pot aplica variabilelor, dar nu si constantelor. ;ai mult, ei pot apareca notatie prefixata, cat si postfixata. 8e exemplu, putem avea LLi si contorLL, dar nu putem avea1$'LL sau LL%a J b 6 1&."iecare din expresiile LLi si iLL au o valoare7 mai mult fiecare cauzeaza incrementarea valoriivariabilei i cu o unitate. 8iferenta este5

    1. expresia LLi va implica intai incrementarea lui i, dupa care

    expresia va fi evaluata la noua valoare a lui i7 2. expresia iLL va implica evaluarea sa la valoarea lui i, dupa care se va incrementa i.

    666666666666xemplu55666666666666int a, b, c /7a LLc7b cLL7

    printf%(aKd bKd cKd LLcKdFn(, a, b, c, LLc&7ntrebare5 Ce se va tipari la ecran ?

    ntr6un mod similar, 66i va implica decrementarea valorii lui i cu 1, dupa care expresia 66i va aveanoua valoare a lui i, pe cand i66 se va evalua la valoarea lui i, dupa care i se va decrementa cu 1.0etineti deci ca, spre deosebire de L si 6, operatorii LL si 66 vor determina sc*imbarea valoriivariabilei i din memorie. e mai spune ca operatorii LL si 66 au efect lateral %side effect&.8aca nu folosim valoarea lui LLi sau a lui iLL, atunci acestea sunt ec*ivalente. ;ai precis,

    LLi7 si iLL7sunt ec*ivalente cu

    i i L 17

    666666666666xemple55666666666666resupunem ca avem declaratiile int a 1, b 2, c 3, d 47tunci avem5 xpresie xpresie ec*ivalenta parantetizata Valoare

    a J b : c %a J b& : c /

    a J b K c L 1 %%a J b& K c& L 1 3LL a J b 6 c 66 %%LL a& J b& 6 %c 66& 1' 6 6 b J LL d ' 6 %%6 b& J %LL d&& 1'

    66666666666666666666666666666peratori de asignare6666666666666666666666666666entru sc*imbarea valorii unei variabile, am utilizat de

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    20/140

    variabila partedreaptaunde (partedreapta( este o expresie. 8aca punem 7 la sfarsitul expresiei de asignare, atunci vomobtine instructiune de asignare. peratorul are doua argumente, (variabila( si (partedreapta(.Valoarea expresiei (partedreapta( este asignata pentru (variabila( si aceasta valoare se returneazade catre expresia de asignare %ca un tot unitar&.

    666666666666xemplu55 Consideram instructiunile666666666666 b 27 c 37 a b L c7unde toate variabilele sunt de tipul int. "olosind faptul ca este un operator, putem condensaaceasta la a %b 2& L %c 3&7xplicatia este ca expresia de asignare b 2 atribuie valoarea 2 atat variabilei b, cat si instructiunii

    intregi.8aca exemplul de mai sus pare artificial, atunci o situatie frecvent intalnita este asignarea multipla.

    8e exemplu, instructiunea a b c /7este ec*ivalenta cu %folosind asociativitatea de la dreapta la stanga& a %b %c /&&70elativ la , mai exista inca doi operatori. ste vorba de L si 6. xpresia

    L 2va aduna 2 la vec*ea valoare a lui si va asigna rezultatul lui si intregii expresii. xpresia L 2face acelasi lucru.

    6666666666666666666666666666666666666666Hista operatorilor de asignare5 L 6 J : K @@ DD R A B 66666666666666666666666666666666666666669oti acesti operatori au aceeasi precedenta si se asociaza de la dreapta la stanga. emantica lor estespecificata de

    variabila op expresiecare este ec*ivalent cu variabila variabila op %expresie&

    cu exceptia faptului ca variabila sa nu fie o expresie.

    666666666666xemplu55666666666666xpresia de asignare

    < J L 3este ec*ivalenta cu

    < < J % L 3&si nu cu

    < < J L 3"ie declaratia

    int i 1, < 2, 3, m 47

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    21/140

    Consideram urmatoarele exemple de evaluari ale expresiilor xpresie xpresie ec*ivalenta xpresie ec*ivalenta Valoarei L < L i L %< L & i %i L %< L && $< J m L ! < J % %m L !&& < %< J % %m L !&&& 1+

    666666666666xemple55 Calculul puterilor lui 266666666666#include Dstdio.*@main%&

    Eint i /, po)er 17

    )*ile %LLi D 1/&

    printf%(K$d(, po)er J2&7

    printf%(Fn(&7G

    esirea acestui program va fi5 2 4 + 1$ 32 $4 12+ 2!$ !12 1/24

    666666666666666istemul C

    666666666666666n capitolele precedente am prezentat directiva de preprocesare #include si #define. 8irectiva#include avea forma generala5 #include Dnumefisier@si insemna includerea in acest loc a fisierului *eader specificat din directoarele specifice C %;68 FbcFinclude sau FtcFinclude, U=> :usr:include&. alta forma este

    #include (numefisier(ce are drept scop inlocuirea acestei linii cu o copie a fisierului (numefisier( din directorul curent.8eci, atunci cand utilizam o functie C, trebuie sa specificam prototipul ei %scanf%& si printf%& au

    prototipul Dstdio.*@, rand%& are prototipul Dstdlib.*@&.

    666666666666

    xemplu55666666666666#include Dstdio.*@#include Dstdlib.*@main%&

    E int i, n7printf%(FnKsFnKs(,

    (Vom afisa niste intregi aleatori.(,

    (Cati doriti sa vedeti ? (&7 scanf%(Kd(, Rn&7 for %i /7 i D n7 LLi&

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    22/140

    E if %i K $ /& printf%(Fn(&7 printf%(K12d(, rand%&&7

    Gprintf%(Fn(&7

    G8aca de exemplu, tastam numarul 11, atunci pe ecran vor apare 11 numere intregi aleatoare.

    66666666666666bservatii5666666666666661. tentie S LLi D n este diferit de iLL D n72. peratorul este operatorul de egalitate %test&, adica a b va fi evaluata la true daca si numaidaca valoarea lui a este egala cu valoarea lui b %in caz contrar va fi evaluata la false&.3. "unctia rand%& intoarce un intreg cuprins intre / si n, unde n este dependent de sistem. n =C, n este dat de constanta 0=8;>.

    66666666666666666666666666666666666666666666666xercitii propuse spre implementare 666666666666666666666666666666666666666666666661. nvestigati comportarea operatorilor : si K pentru numere intregi negative. ;entionam ca inunele sisteme C, ':62 da rezultatul 63, in altele 64. Verificati daca se pastreaza identitatea dinmatematica %prevazuta a fi adevarata de =&5 %a : b& J b L a K b augestie5 crieti un program C care sa contina liniile de cod int a, b7 printf%(dati doi intregi nenuli5 (&7 scanf%(KdKd(, Ra, Rb&7 printf%(KsK4dFnKsK4dFnKsK4dFnKsK4dFnKsK4dFn(, ( a (,a, ( b (,b, ( a : b (, a : b, ( a K b (, a K b, (Verif. =(, %a : b& J b L a K b 6 a&72. crieti un program C care sa calculeze cel mai mare divizor comun dintre a si b, unde a, b suntnumere intregi, folosind algoritmul lui uclid.

    3. 8in moment ce L si LL sunt operatori, rezulta ca expresia aLLLb poate fi interpretata fie ca aLL L b fie a L LLbdepinzand de modul de grupare semnului L. crieti un program scurt pentru a vedea ce interpretareface compilatorul C.4. nlocuiti LLi cu iLL in programul de calcul a puterilor lui 2.!. Un patrat magic %de latura n& are proprietatea ca include in locatiile sale toate numerele intregidin intervalul 1, ..., nA2 si sumele numerelor de pe fiecare linie, fiecare coloana sau fiecarediagonala sunt egale. 8e exemplu5 $ 1 + ' ! 3 2 - 4

    este un patrat magic de dimensiune 3. a se scrie un program C care testeaza daca un patrat estemagic sau nu. 8e asemenea, incercati sa generati toate patratele magice de ordin n.$. a se scrie un program C care sa calculeze nS, unde n@/ este un numar natural %iar nS 1 J 2 J

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    23/140

    ... J n&.

    3. Controlul instructiunilor 3.1. peratori relationali, de egalitate si logici 3.2. peratori si expresii relationale 3.3. peratori si expresii de egalitate

    3.4. peratori logici si expresii logice 3.!. valuare rapida %s*ort6circuit& 3.$. nstructiunea compusa 3.'. nstructiunea vida 3.+. nstructiunile (if( si (if6else( 3.-. nstructiunea ()*ile( 3.1/. nstructiunea (for( 3.11. peratorul (,( 3.12. nstructiunea (do( 3.13. nstructiunea (goto( 3.14. nstructiunile (brea( si (continue(

    3.1!. nstructiunea (s)itc*( 3.1$. peratorul conditional 3.1'. xercitii propuse spre implementareCapitolul 3Controlul instructiunilor666666666666666666666666666666666666666666666666666666peratori relationali, de egalitate si logici666666666666666666666666666666666666666666666666666666peratori relationali 5 D, @, D, @peratori de egalitate5 , Speratori logici 5 S, RR, BBCa si ceilalti operatori, acesti operatori au reguli de precedenta si asociativitate care determina

    precis modul de evaluare a acestorexpresii.66666666666666666666666666666666666666666666666666666666666666666666666666666666B peratori B sociativitate B66666666666666666666666666666666666666666666666666666666666666666666666666666666

    %& LL %postfix& 66 %postfix& B de la stanga la dreapta BL %unar& 6 %unar& LL %prefix& 66 %prefix& B de la dreapta la stanga BJ : K B de la stanga la dreapta B

    L 6 B de la stanga la dreapta BD D @ @ B de la stanga la dreapta B

    S B de la stanga la dreapta B RR B de la stanga la dreapta B BB B de la stanga la dreapta B ?5 B de la dreapta la stanga B L 6 J : etc B de la dreapta la stanga B , %operatorul virgula& B de la stanga la dreapta B

    6666666666666666666666666666666666666666666666666666666666666666666666666666666peratorul S este unar, spre deosebire de toti operatori %relationali, de egalitate si logici& care sunt

    binari. 9oti operatorii vor fi prezenti in expresii ce pot lua valoarea intreaga 1 sau /. ;otivul este ca

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    24/140

    C reprezinta (false( orice expresie egala cu zero, si (true( orice expresie diferita de zero.666666666666

    Exemple:n continuare, dam o lista de expresii ce se evaluaza la false6666666666661. expresie de tip int ce are valoarea /72. expresie de tip float ce are valoarea /./7

    3. Caracterul null PF/P74. ointerul =UHH.66666666666666666666666666666666666666666peratori si expresii relationale66666666666666666666666666666666666666666m vazut ca operatorii D, @, D, @ sunt toti binari. xpresiile ce contin acesti operatori pot luavaloarea / sau 1.66666666666xemple. rimele patru exemple sunt corecte, restul sunt gresite5666666666661. a D 3

    2. a @ b3. 61.1 @ %2.2 J x L 3.3&4. a D b D c %corecta, dar confuza&!. a D b$. a D b'. a @@ b"ie expresia relationala (a D b(. 8aca valoarea lui a este mai mica decat valoarea lui b, atunciexpresia va avea valoarea 1, pe care o gandim ca fiind (true(. 8aca valoarea lui a este mai maredecat valoarea lui b, atunci expresia va avea valoarea /, pe care o gandim ca fiind (false(.bservam ca valoarea lui (a D b( este aceeasi cu valoarea lui (a 6 b D /(. "olosind precedentaoperatorilor aritmetici, aceasta este deci ec*ivalenta cu (%a 6 b& D /(. 8e altfel, pe multe masini,expresii cum sunt (a D b( sunt implementate ca fiind (a 6 b D /(.66666666666

    Exemple:Vom considera urmatorul tabel cu declaratii si initializari.66666666666resupunem ca avem declaratiile5 int i 1, < 2, 37 double x !.!, M '.'76666666666666666666666666666666666666666666666666666666666666666666666B xpresie B xpresie ec*ivalenta B Valoare B6666666666666666666666666666666666666666666666666666666666666666666666

    i D < 6 i D %< 6 & /6 i L ! J < @ L 1 %%6 i& L %! J

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    25/140

    3. x L M 2 J x 6 !4. a b!. a b 6 1$. %x L M& S 44ntuitiv, o expresie de egalitate cum ar fi a b este sau (true( sau (false(. ;ai precis, daca a esteegal cu b, atunci a b intoarce valoarea 1 %true&7 altfel, aceasta intoarce valoarea / %false&.

    expresie ec*ivalenta este a 6 b / %aceasta este ceea ce se implementeaza la nivel masina&.xpresia (a S b( ilustreaza folosirea operatorului (diferit de( %sau (nu este egal cu(&.66666666666

    Exemple:Vom considera urmatorul tabel cu declaratii si initializari.66666666666resupunem ca avem declaratiile5 int i 1, < 2, 376666666666666666666666666666666666666666666666666666666666666666666666666B xpresie B xpresie ec*ivalenta B Valoare B6666666666666666666666666666666666666666666666666666666666666666666666666 i < < i /

    i S < < S i 1i L < L 6 2 J 6 %%i L

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    26/140

    6666666666666666666666B666666666666666666666666666666B6666666666666Bperatorii logici binari RR si BB pot fi folositi in expresii care intorc / sau 1.66666666666xemple. rimele patru exemple sunt corecte, restul sunt gresite5666666666661. a RR b

    2. a BB b3. S%a D b& RR c4. 3 RR %62 J a L '&!. a RR$. a B B b'. a R b %corecta, dar se refera la operatii peste biti&+. Rb %corecta, dar se refera la adresa lui b&66666666666

    Exemple:Vom considera urmatorul tabel cu declaratii si initializari.66666666666resupunem ca avem declaratiile5 int i 3, < 3, 37

    double x /./, M 2.3766666666666666666666666666666666666666666666666666666666666666666666B xpresie B xpresie ec*ivalenta B Valoare B66666666666666666666666666666666666666666666666666666666666666666666 i RR < RR %i RR

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    27/140

    G G6666666666666666666666666nstructiunea vida6666666666666666666666666nstructiunea vida se reprezinta cu semnul 7 %punct si virgula&. a se foloseste cand se doreste

    folosirea ei sintactica, si nu neaparat folosire semantica. 8upa cum vom vedea, aceasta se folosestein constructii (if6else( si (for(. expresie urmata de 7 se numeste (instructiune expresie(.66666666666

    Exemplu:

    66666666666 a b7 a L b L c7 7 printf%(KdFn(, a&766666666666666666666666666666666666666nstructiunile (if( si (if6else(

    66666666666666666666666666666666666666"orma generala a instructiunii (if( este if %expresie& instructiuneemantica intuitiva este simpla. stfel, daca valoarea expresiei este true %diferita de zero&, atunci seexecuta instructiunea, altfel nu.66666666666

    Exemplu:

    66666666666nstructiunea (if( de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    28/140

    666666666666Urmatorul subprogram C de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    29/140

    for %i 17 i D n7 iLL& factorial J i7rice sau toate expresiile dintr6o instructiune (for( pot lipsi, dar nu poate lipsi 7.66666666666

    Exemple:

    66666666666

    xemplul de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    30/140

    .....666666666666666666666666nstructiunea (do(66666666666666666666666nstructiunea (do( poate fi considerata o varianta a instructiunii ()*ile(. 8eosebirea consta in faptulca pentru instructiunea ()*ile( testul se face la inceputul ciclului, iar pentru (do( la sfarsit.

    Consideram constructia de forma do instructiune )*ile %expresie&7 instructiuneurmatoareHa inceput se executa instructiune, apoi se evalueaza expresie. 8aca valoarea lui expresie estediferita de / %(true(&, atunci controlul se paseaza la inceputul instructiunii (do(, si procesul serepeta. 8aca expresie se evalueaza la / %false&, atunci controlul se paseaza lainstructiuneurmatoare.66666666666

    Exemplu:uma unor numere intregi diferite de /

    66666666666 suma i /7 do E suma L i7 scanf%(Kd(, Ri&7

    G )*ile %i @ /&766666666666666666666666666nstructiunea (goto(6666666666666666666666666nstructiunea (goto( %salt neconditionat& este considerata opusa programarii structurate. fatulgeneral valabil este evitarea acestei instructiuni. 9otusi, in unele cazuri se poate folosi %candsimplifica controlul, cand face codul mai eficient&. instructiune de etic*etare are forma5

    etic*eta 5 instructiuneunde etic*eta este un identificator.666666666666

    Exemple:

    666666666666 bMe5 exit%1&7 etic*eta15 a b L c7

    3335 a b L c7 %exemplu gresit, de ce ?&Controlul programului poate fi transferat neconditionat catre o instructiune de etic*etare astfel goto etic*eta76666666666666666666666666666666666666666666666nstructiunile (brea( si (continue(6666666666666666666666666666666666666666666666Cele doua instructiuni brea7 si continue7intrerup controlul normal al programelor. nstructiunea (brea( va cauza iesirea din bucla in care seafla sau din instructiunea (s)itc*(. nstructiunea (continue( se poate afla numai in instructiuni

    (for(, ()*ile( si (do(. a are rolul de a trasmite controlul catre sfarsitul buclei respective.

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    31/140

    66666666666

    Exemple:

    66666666666 )*ile %1& E scanf%(Klf(, Rx&7 if %x D /./&

    brea7 :J iesim cand x este negativ J: printf%(KlfFn(, sZrt%x&&7 G )*ile %contor D n& E scanf%(Klf(, Rx&7 if %x @ 6/./1 RR x D /./1& continue7 :J valorile mici nu se iau in considerare J: LLcontor7

    suma L x7 G666666666666666666666666666666nstructiunea (s)itc*(66666666666666666666666666666(s)itc*( este o instructiune conditionala ce generalizeaza o instructiune (if6else(.66666666666

    Exemplu:

    66666666666 s)itc* %val& E

    case 15LLcontora7

    brea7 case 25 case 35 LLcontorb7 brea7 default5 LLcontorc7

    GCorpul unei instructiuni (s)itc*( este un exemplu de instructiune compusa. xpresia de control

    dintre paranteze %ce urmeaza cuvantului s)itc*& trebuie sa fie de tip integral %vom reveni intr6un altcapitol&. 8upa evaluarea lui val, controlul sare la etic*eta corespunzatoare valorii lui val. 8e obicei,ultima instructiune dintr6un (case( este de obicei (brea(. 8aca nu exista (brea(, atunci se vorexecuta si instructiunile din urmatoarele (case(6uri.tentie S miterea scrierii lui (brea( este foarte frecventa SSoate apare cel mult un (default( %in general pe ultima pozitie&. Cuvintele rezervate (case( si(default( pot apare numai in interiorulunui (s)itc*(.666666666666666666666666666666peratorul conditional666666666666666666666666666666peratorul (?5( este mai putin obisnuit deoarece este ternar %cu trei argumente&. "orma generala este

    expresie1 ? expresie2 5 expresie3

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    32/140

    ;ai intai, se evalueaza expresie1. 8aca aceasta este diferita de / %true&, atunci se evalueazaexpresie2, si aceasta va fi valoarea returnata de intreaga expresie conditionala. 8aca expresie1 este/ %false&, atunci se evalueaza expresie3, si aceasta va fi valoarea intregii expresii conditionale.666666666666

    Exemplu:nstructiunea66666666666

    if %M D z& x M7 else x z7este ec*ivalenta cu x %M D z& ? M 5 z7peratorul ?5 are aceeasi prioritate cu operatorul de asignare si se asociaza de la dreapta la stanga.66666666666666666666666666666666666666666666666xercitii propuse spre implementare666666666666666666666666666666666666666666666661. a se scrie un program care sa calculeze minimul a trei numere %folosind o instructiune (if6t*en(

    si una (if( sau doua (if6t*en( %fara variabila suplimentara&&. Qeneralizare5 a se gaseasca primeledoua numere %cele mai mici& dintr6un vector de n elemente %cu numar minim de comparatii&.2. Cititi n numere de la tastatura si afisati maximul lor. ncercati sa cititi un numar arbitrar denumere %deci fara a citi acest n&.3. "olosind structura for, scrieti un program care calculeaza urmatoarele formule logice %sub formaunei tabele de adevar&5 b1 BB b3 BB b! si b1 RR b2 BB b4 RR b!4. "ie functia lui Collatz5

    E n:2 daca n este par f%n& E 3JnL1 daca n este impara se scrie un program C care determina natural minim astfel incat

    %f o f o ... o f&%n&1. de ori!. crieti un program C care calculeaza suma divizorilor naturali ai unui numar natural n. Un numareste perfect daca este egal cu suma divizorilor proprii pozitivi %ex5 2+ 1 L 2 L 4 L ' L 14&. a segenereze primele numere perfecte % D ! S&.$. peratia matematica min%x,M& se poate reprezenta ca o expresie conditionala5

    %x D M& ? x 5 Mntr6un mod similar, descrieti operatiile aritmetice min%x, M, z& si max%x, M, z, t&

    '. e stie ca un procedeu de intersc*imbare a valorii a doua variabile %a si b& se poate face folosindo variabila auxiliara %se foloseste in metodele de sortare, arbori, sisteme de ecuatii, etc&5 aux a 7 a b 7 b aux7a se arate ca in limba

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    33/140

    b a 6 b7 a a 6 b7

    "unctii si programare structurata 4.1. pelul functiilor

    4.2. nstructiunea (return(4.3. rototipurile functiilor

    4.4. 8escriere (top6do)n( 4.!. nvocare si apel prin valoare 4.$. 8eosebirea dintre (return( si (exit( 4.'. xercitii propuse spre implementare

    Capitolul 4

    "unctii si programare structuratarogramarea structurata este o problema ce rezolva strategia si metodologia programarii si areurmatoarele principii51. tructurile de control trebuie sa fie cat se poate de simple72. Constructia unui program trebuie sa fie descrisa top6do)n.8escrierea top6do)n se refera la descompunerea problemei noastre in subprobleme. 8e obicei,aceste subprobleme sunt usor de descris.

    666666666666666666666pelul functiilor666666666666666666666Un program este compus din una sau mai multe functii, printre care si (main%&(. ntotdeaunaexecutia unui program incepe cu (main%&(. Cand o functie este apelata %sau invocata& atuncicontrolul programului este pasat functiei apelate. 8upa ce aceasta isi termina executia, atunci se

    paseaza inapoi controlul catre program.Codul C care descrie ce face o functie se numeste (definitia functiei(. ceasta are urmatoareaforma generala5 tip numefunctie %listaparametri&

    E declaratii instructiuni Grimul rand se numeste (*eader6ul( %antetul& functiei, iar ceea ce este inclus intre acolade senumeste corpul functiei. 8aca in antetnu precizam parametri, atunci se va scrie (void( %cuvant rezervat pentru lista vida&. 8aca functia nuintoarce nici o valoare, atunci se va scrie ca tip intors tot (void(. 9ipul intors de functie este cel

    precizat in (return( %ce va fi indata explicat&. arametrii din antetul functiei sunt dati printr6o listacu argumente separate prin virgula. ceste argumente sunt date de tipul argumentului urmat de unidentificator ce apartine acelui tip. e mai spune ca acel identificator este (parametru formal(.

    66666666666xemplu566666666666

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    34/140

    #include Dstdio.*@void tiparestemesa

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    35/140

    666666666666666666666666666666rototipurile functiilor666666666666666666666666666666n C, apelul unei functii poate apare inaintea declararii ei. "unctia poate fi definita mai tarziu inacelasi fisier, sau in alt fisier sau dintr6o biblioteca standard. n = C, prototipul functieiremediaza problema punand la dispozitie numarul si tipul argumentelor functiei. rototipul

    specifica, de asemenea, si tipul returnat de functie. intaxa prototipului unei functii este5 tip numefunctie %listatipuriparametri&7n lista de parametri putem specifica c*iar si parametrul, dar asta este optional. 8aca functia nu are

    parametri, atunci se foloseste (void(.66666666666

    xemplu5 0eluam un exemplu precedent.66666666666#include Dstdio.*@main%& E int n7

    void tiparestemesa

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    36/140

    E void tiparesteantet%void&7 void scriecampurile%void&7 void citestescriecoloanele%void&7

    tiparesteantet%&7

    scriecampurile%&7 citestescriecoloanele%&7 Gceasta reprezinta intr6un mod foarte simplu descrierea (top6do)n(. 8aca o problema este prea

    grea, atunci o descompunem in subprobleme, si apoi le rezolvam pe acestea. Ieneficiul suplimentaral acestei metode este claritatea sa.

    void tiparesteantet%void& E

    printf%(FnKsKsKsFn(, (JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFn(, (J Calculul sumelor, minimului si maximului JFn(,

    (JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFn(&7G

    "unctia ce foloseste la scrierea campurilor este la fel usor de scris5

    void scriecampurile%void& E printf%(K!sK12sK12sK12sK12sFnFn(, (=umar(, (rticol(, (uma(, (;inimul(, (;aximul(&7 G

    Urmeaza apoi functia ce serveste la scrierea inregistrarilor referitoare la campurile discutate maisus5

    void citestescriecoloanele%void& E int contor /, articol, suma, minim, maxim7

    int min%int, int&, max%int, int&7if %scanf%(Kd(, Rarticol& 1&

    E LLcontor7 suma minim maxim articol7 printf%(K!dK12dK12dK12dK12dFnFn(, contor, articol, suma, minim, maxim&7 )*ile %scanf%(Kd(, Rarticol& 1& E LLcontor7

    suma L articol7 minim min%articol, minim&7 maxim max%articol, maxim&7

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    37/140

    printf%(K!dK12dK12dK12dK12dFnFn(, contor, articol, suma, minim, maxim&7 G

    G else printf%(=ici o data nu a fost citita.FnFn(&7

    G

    8aca datele se introduc de la tastatura, atunci tabelul se va afisa (intrerupt( de citirile ce au loc de latastatura. stfel, se prefera citirea dintr6un fisier extern. resupunem ca fisierul nostru executabil%asociat fisierului sursa scris in C& se numeste (numere.exe( si am creat un fisier numit (fisier.int(ce contine urmatoarele numere5

    1- 23 6' 2- 611 1'8and comanda

    numere D fisier.intvom obtine un tabel ce contine toate datele dorite.

    6666666666666666666666666666666666666nvocare si apel prin valoare 6666666666666666666666666666666666666 functie este invocata prin scrierea numelui sau impreuna cu lista sa de argumente intre paranteze.8e obicei, numarul si tipul acestor argumente se (potriveste( cu parametrii din lista de parametri

    prezenti in definitia functiei. 9oate argumentele sunt apelate prin valoare %(call6bM6value(&. stainseamna ca fiecare argument este evaluat si valoarea sa este folosita ca valoare pentru parametrulformal corespunzator. 8e aceea, daca o variabila %argument& este folosita la transmiterea uneivalori, atunci valoarea ei nu se sc*imba.

    66666666666xemplu566666666666#include Dstdio.*@main%& E int n3, suma, calculeazasuma%int&7

    printf%(KdFn(, n&7 :J se va scrie 3 J: suma calculeazasuma%n&7 printf%(KdFn(, n&7 :J se va scrie 3 J: printf%(KdFn(, suma&7 :J se va scrie $ J: Gint calculeazasuma%int n& :J suma numerelor de la 1 la n J:

    E int suma /7 for % 7 n @ /7 66n& :J n se sc*imba aici, dar nu si in main%& J: sum L n7

    printf%(KdFn(, n&7 :J se va scrie / J: return suma7 G

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    38/140

    C*iar daca n este trimis ca argument in functia (calculeazasuma%&( si valoarea lui n se modifica inaceasta functie, valoarea sa dinmediul apelant ramane nesc*imbata. Vom vedea mai tarziu cum se poate simula apelul prin adresa%(call6bM6reference(&.

    66666666666666666666666666666666666666666666668eosebirea dintre (return( si (exit( 6666666666666666666666666666666666666666666666xista doua procedee de a returna o valoare. return expresie si exit%expresie&8aca se folosesc in (main%&(, atunci acestea sunt ec*ivalente, dar in orice alta functie efectul loreste diferit %in = C, functia (main%&( intoarce o valoare de tip int&. Un apel al lui exit%& in oricealta functie va implica terminarea executiei programului si returnarea valorii catre mediul apelant%sistemul de operare sau mediul de programare C&. Valoarea returnata se numeste stare de iesire

    %(exit status(&. rin conventie, starea de iesire zero indica terminare cu succes, pe cand iesire cu unnumar diferit de zero indica o situatie anormala.

    66666666666666666666666666666666666666666666666xercitii propuse spre implementare 666666666666666666666666666666666666666666666661. "olosind functiile (rand%&(, (min%,&( si (max%,&(, sa se genereze n numere naturale si sa seafiseze minimul si maximul dintre acestea.2. %Tocul cap6pa

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    39/140

    rocesarea caracterelor !.1. 9ipul de data (c*ar(

    !.2. Utilizarea lui (getc*ar%&( si (putc*ar%&( !.3. Iiblioteca DctMpe.*@ !.4. Un exemplu util5 =umararea cuvintelor !.!. xercitii propuse spre implementare

    Capitolul !rocesarea caracterelor6666666666666666666666666669ipul de data (c*ar(666666666666666666666666666

    ste unul dintre tipurile fundamentale din limba

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    40/140

    alert Fa ' bacslas* FF -2 bacspace Fb + carriage return Fr 13 g*ilimea F( 34 formfeed Ff 12

    tab orizontal Ft - ne)line Fn 1/ caracterul nul F/ / apostrof FP 3- tab vertical Fv 1166666666666

    xemple5 Ce va fi afisat in cazul urmatoarelor instructiuni ?666666666661. printf%(F(ICF((&72. printf%(PICP(&7

    Un alt mod de a scrie o constanta caracter este folosind una, doua sau trei cifre octale ca secventeescape, cum ar fi PF//'P. cestPF//'P este de fapt caracterul (alert( %sau clopotel&. l mai poate fi scris PF/'P sau PF'P sau Fa.6666666666666666666666666666666666666666666666666666

    Utilizarea lui (getc*ar%&( si (putc*ar%&( 6666666666666666666666666666666666666666666666666666ceste functii sunt folosite pentru citirea si scrierea caracterelor si sunt definite in Dstdio.*@. stfel

    pentru citirea unui caracter dela tastatura se foloseste (getc*ar%&(, iar pentru scrierea unui caracter pe ecran (putc*ar%&(.Iineinteles ca daca dorim sa afisam un sir de caractere mai mare, este mai elegant cu functia

    (printf%&(.66666666666

    xemplu566666666666Urmatorul program citeste un caracter din intrare %tastatura& si il atribuie unei varibile de tip c*ar,apoi il afiseaza pe ecran.#include Dstdio.*@main%& E

    c*ar c7)*ile %1&

    E cgetc*ar%&7 putc*ar%c&7 G

    Gingurul mod de a opri acest program este sa apasam C90HAC. utem reface acest program

    folosind constanta ".

    #include Dstdio.*@main%& E

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    41/140

    int c7

    )*ile %%c getc*ar%&& S "&E

    putc*ar%c&7 G

    G66666666666666

    Comentarii5666666666666661. n biblioteca Dstdio.*@, exista o linie in care se declara #define " %61&8enumirea lui " provine de la (end6of6file(.2. Variabila c trebuie sa fie declarata de tip int si nu de tip c*ar. m vazut ca sfarsitul unui fisiereste codificat cu 61, si nu cu uncaracter.

    3. ubexpresiacgetc*ar%&

    citeste o valoare de la tastatura si o asigneaza variabilei c.

    66666666666666666666666666Iiblioteca DctMpe.*@66666666666666666666666666istemul C pune la dispozitie fisierul *eader DctMpe.*@ care contine o multime de macro6uri%definitii& folosite pentru testareacaracterelor si o multime de prototipuri de functii ce sunt folosite pentru conversia caracterelor.n tabelul de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    42/140

    toascii%c& sc*imba c cu codul C6666666666666666

    Un exemplu %util&5 =umararea cuvintelor6666666666666666Vrem sa numaram cate cuvinte sunt introduse de la tastatura. le sunt separate prin spatiu. entru

    scrierea programului vom utiliza tot strategia (top6do)n(.#include Dstdio.*@

    #include DctMpe.*@main%& E int numarcuvinte /7 int gasesteurmatorulcuvant%void&7

    )*ile %gasesteurmatorulcuvant%& 1& LL numarcuvinte7

    printf%(=umarul de cuvinte KdFnFn(, numarcuvinte&7G

    int gasesteurmatorulcuvant%void&

    E int c7

    )*ile %isspace%c getc*ar%&&& 7 :J sarim peste spatii J:

    if %c S "& E )*ile %%c getc*ar%&& S " RR Sisspace%c&& 7 :J sarim peste orice diferit de " si spatii J: if %c S "& return 17

    else return /7 G return /7

    G

    66666666666666666666666666666666666666666666666xercitii propuse spre implementare

    666666666666666666666666666666666666666666666661. "olosind functiile (getc*ar%&( si (putc*ar%&(, sa se scrie un program C care transforma literelemici in litere mari. ncercati si o varianta de program care foloseste functiile (islo)er%&( si(toupper%&(.2. Utilizand functiile (getc*ar%&( si (putc*ar%&( creati un program C care sa copie un fisier in alt

    fisier %comanda voastra proprie decopiere&. Utilizati redirectarea S 8e asemeni, precizati si cazul cand dorim sa copiem un fisier lasfarsitul unui fisier existent.3. crieti in C un analizor lexical care sa recunoasca cat mai multi atomi lexicali din C. 8e

    exemplu, cuvintele rezervate %)*ile, do, for, ...&, identificatori, operatori %relationali, logici,artimetici, ...& si eventual alte structuri. poi, tipariti acelasi fisier de intrare cu exceptia spatiilor

    multiple si a comentariilor.4. crieti un program C care citeste caractere de la tastatura si le scrie la ecran. crieti toate

    vocalele cu litere ma

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    43/140

    caractere de la tastatura si sterge vocalele din ele %afisand doar consoanele&. %cest mod de scriereera folosit in scrisul *ieroglific al Qreciei ntice&.!. %(rettM printing(&

    crieti un program C care are la intrare un fisier sursa C si il transforma intr6un program C scrisfrumos %eventual in stilul Iell Haboratoires&.

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    44/140

    9ipuri fundamentale de date $.1. 8eclaratii si expresii $.2. 9ipuri fundamentale de date $.3. Caractere si tipul (c*ar( $.4. 9ipul de date (int( $.!. 9ipurile integrale (s*ort(, (long( si (unsigned(

    $.$. 9ipuri reale $.'. peratorul (sizeof%&( $.+. "unctii matematice $.-. Conversii implicite si explicite $.1/. Conversia la intreg $.11. Conversiile aritmetice uzuale $.12. Conversii explicite $.13. rori de programare frecvente $.14. xercitii propuse spre implementare

    Capitolul $9ipuri fundamentale de date666666666666666666666666666

    8eclaratii si expresii666666666666666666666666666Variabilele si constantele sunt obiecte cu care se lucreaza intr6un program. n C, toate variabileletrebuie declarate inainte de a fifolosite. 8eclaratiile au doua scopuri51. spun compilatorului cat spatiu de memorie trebuie rezervat pentru memorarea acelor variabile72. permit compilatorului sa instruiasca masina pentru a face operatiile specifice corect.8e exemplu, in expresia a L b, operatorul L este aplicat pentru doua variabile. ;asina executa inmod diferit adunarea pentru variabile de tip (int( si pentru variabile de tip (float(. Iineinteles,

    pentru programator aceste conventii sunt transparente %se mai spune ca (L( este operator desupraincarcare&. xpresiile sunt combinatii %cu inteles& de constante, variabile si apeluri de functii.;a

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    45/140

    (s*ort(, (long( si (unsigned(. Cu aceste conventii, tabelul de mai sus se mai poate scrie5 c*ar signed c*ar unsigned c*ar s*ort int long unsigned s*ort unsigned unsigned long float double long double9ipurile fundamentale se pot grupa dupa functionalitate5

    1. tipurile integrale sunt cele care sunt folosite pentru reprezentarea valorilor intregi72. tipurile reale sunt cele care sunt folosite pentru reprezentarea valorilor reale73. tipurile aritmetice sunt tipuri integrale sau reale.cestea sunt59ipuri integrale5 c*ar signed c*ar unsigned c*ar s*ort int long unsigned s*ort unsigned unsigned long9ipuri reale5

    float double long double

    666666666666666666666666666666666Caractere si tipul (c*ar( 666666666666666666666666666666666n C, variabilele de orice tip integral pot fi folosite pentru reprezentarea caracterelor. n particular,variabilele de tip (c*ar( si (int( se folosesc pentru acest scop. m vazut in capitolul precedent caatunci cand dorim sa comparam o variabila cu ", atunci trebuie sa declaram acea variabila de tip(int(, si nu de tip (c*ar(. Constante cum ar fi PaP, PLP pe care le gandim ca fiind caracteresunt de tip (int(, si nu de tip (c*ar(. 0etineti ca nu exista constante de tip (c*ar( SSS0eamintim ca toate caracterele sunt tratate ca (intregi mici(, si reciproc, intregii mici sunt tratati caniste caractere. n particular, orice expresie integrala poate fi afisata in format intreg sau caracter.66666666666

    xemplu5 resupunem ca avem o (bucata( de cod C566666666666 c*ar c PaP7 :J PaP are codul C -' J: int i $!7 :J $! este codul C pentru PP J:

    printf%(Kc(, c L 1&7 :J este afisat b J: printf%(Kd(, c L 2&7 :J este afisat -- J: printf%(Kc(, i L 3&7 :J este afisat 8 J:n C, fiecare caracter este memorat pe un octet de memorie. e aproape toate masinile, un octet este

    compus din + biti. "ie declaratiac*ar c PaP7utem gandi ca (c( este memorat pe un octet astfel 666666666666666666666666666666 B / B 1 B 1 B / B / B / B / B 1 B 666666666666666666666666666666 ' $ ! 4 3 2 1 /"iecare celula reprezinta un bit si fiecare bit este numerotat %incepand cu cel mai putinsemnificativ&. Iitii care formeaza un octet sunt fie (on(, fie (off(, aceste stari fiind reprezentate prin1 si / respectiv. cesta ne conduce sa gandim fiecare octet din memorie ca un sir de + cifre binare%se mai numesc siruri de biti&.

    stfel variabila (c( poate fi gandita ca sirul de biti/11////1

    ;ai general, fiecare cuvant masina poate fi gandit ca un sir de cifre binare grupate in octeti.

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    46/140

    Un sir de cifre binare poate fi deci gandit ca un numar binar %adica in baza 2&. "ara a intra in detaliimatematice %teorema bazei de numeratie& vom face doar un exemplu5

    66666666666xemplu566666666666

    Valoarea lui (c( este numarul /11////1 %in baza 2& 1 x 2A$ L 1 x 2A! L / x 2A4 L / x 2A3 L / x 2A2 L / x 2A1 L 1 x 2A/care inseamna $4 L 32 L 1 -' in notatia zecimala %in baza 1/&.= C pune la dispozitie trei tipuri referitoare la caractere5 c*ar signed c*ar unsigned c*ar8e obicei, tipul (c*ar( este ec*ivalent cu (signed c*ar( sau (unsigned c*ar(, depinzand decompilator. "iecare din aceste trei tipuri se memoreaza pe un octet %deci poate (tine( 2!$ valoridistincte&. entru (signed c*ar(, valorile sunt intre 612+ si 12', iar pentru (unsigned c*ar( intre / si2!!.6666666666666666666666666

    9ipul de date (int(66666666666666666666666669ipul de date (int( este cel mai folosit tip din limba=961.8aca se incearca, de exemplu, adunarea a doua numere %si se depaseste aceasta valoare&, atunci se

    va primi un mesa< (integer overflo)(.

    66666666666666666666666666666666666666666666666666666666666669ipurile integrale (s*ort(, (long( si (unsigned(

    66666666666666666666666666666666666666666666666666666666666668e obicei, tipul (s*ort( se memoreaza pe doi octeti si tipul (long( pe patru octeti. stfel, pemasinile in care cuvintele au patru octeti, lungimea tipului (int( este aceeasi cu lungimea tipului

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    47/140

    (long(, iar pe masinile in care cuvintele au doi octeti, lungimea tipului (int( este egala cu lungimeatipului (s*ort(. Constantele predefinite ;>[09 si ;>H=Q %in unele implementariH=Q;>& caracterizeaza lungimea acestor tipuri. 8e obicei, ;>[092AE1!G si;>H=Q2AE31G. stfel, daca (s( este o variabila de tip (s*ort(, atunci 6 ;>[09 D s D ;>[09618aca (l( este o variabila de tip (long(, atunci

    6 ;>H=Q D s D ;>H=Q61n ceea ce priveste tipul (unsigned(, acesta este memorat pe acelasi numar de octeti ca si tipul (int(.8aca (u( este o variabila de tip(unsigned(, atunci

    / D u D 2J;>=9616666666666666666

    9ipuri reale6666666666666666= C contine trei tipuri reale5 (float(, (double( si (long double(. Variabilele de acest tip vor

    putea tine valori reale, cum ar fi5

    /.//1 2./ 3.141!-ceasta notatie se numeste notatie zecimala, deoarece contine punctul zecimal. ;ai exista sinotatia exponentiala. 8e exemplu, 1.234!$'e! corespunde cu 1.234!$' x 1/A!1234!$.'e ma

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    48/140

    main%& E printf%(Hungimea catorva tipuri fundamentale.FnFn(&7 printf%( c*ar5K3d octeti Fn(, sizeof%c*ar&&7 printf%( s*ort5K3d octeti Fn(, sizeof%s*ort&&7 printf%( int5K3d octeti Fn(, sizeof%int&&7

    printf%( long5K3d octeti Fn(, sizeof%long&&7 printf%( unsigned5K3d octeti Fn(, sizeof%unsigned&&7 printf%( float5K3d octeti Fn(, sizeof%float&&7 printf%( double5K3d octeti Fn(, sizeof%double&&7 printf%(long double5K3d octeti Fn(, sizeof%long double&&7

    G8in moment ce limba

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    49/140

    c*ar c PP7 printf%(KcFn(, c&7Variabila (c( apare ca argument al functiei (printf%&(. Cu toate acestea, deoarece are loc conversiala intreg, tipul expresiei (c( este (int(, si nu (c*ar(.66666666666666666666666666666666666666

    Conversiile aritmetice uzuale 66666666666666666666666666666666666666Conversiile aritmetice pot apare cand sunt evaluati operanzii unui operator binar.666666666666

    xemplu5666666666666resupunem ca (i( este (int( si (f( este un (float(. n expresia (i L f(, operandul (i( se convertestela (float( si deci expresia (i L f(va intoarce tipul (float(.ceste reguli se numesc (conversii aritmetice uzuale(. ata urmatorul (algoritm(5 daca un operand este de tip (long double( atunci

    si celalalt operand va fi convertit la tipul (long double( altfel

    daca un operand este de tip (double( atunci si celalalt operand va fi convertit la tipul (double( altfel

    daca un operand este de tip (float( atunci si celalalt operand va fi convertit la tipul (float( altfel

    :JJJJJ au loc conversiile la intreg JJJJJ: daca un operand este de tip (unsigned long( atunci si celalalt operand va fi convertit la tipul (unsigned long( altfel

    daca un operand are tipul (long( si celalalt (unsigned( atunci 6 daca un (long( poate reprezenta toate valorile (unsigned( atunci operandul de tip (unsigned( se va converti la (long( 6 daca un (long( nu poate reprezenta toate valorile (unsigned( atunci ambii operanzi se vor converti la (unsigned long( altfel daca un operand are tipul (long( atunci celalalt operand se converteste la (long( altfel

    daca un operator are tipul (unsigned( atunci celalalt operand va fi convertit la (unsigned( altfel ambii operanzi vor avea tipul (int(66666666666

    xemplu5 resupunem ca avem declaratiile566666666666

    c*ar c7 s*ort s7 int i7

    unsigned u7 unsigned long ul7 float f7

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    50/140

    double d7 long double ld7tunci avem urmatoarele valori pentru tipurile expresiilor de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    51/140

    66666666666666666666666666666666666666666666666xercitii propuse spre implementare 666666666666666666666666666666666666666666666661. resupunem ca depunem o suma %depozit la termen& intr6o banca care ofera o dobanda de 3+ K%de exemplu& pe an. a se calculeze suma finala dupa un anumit numar de ani %se va tine cont de(dobanda la dobanda(&.

    2. crieti o functie C utilizator care sa simuleze functia (po)er%m, n&( pentru m intreg si n natural.Cate inmultiri are functia ?3. a se verifice care din urmatoarele numere este mai mare5

    piAe sau eAEpiGunde (pi(3.141!-2$!3!+-'-324 si (e(2.'1+2+1+2+4!-/4!24.4. a se scrie un program C care aproximeaza (pi( si (e( cu un anumit numar de zecimale.dei5 entru calculul lui (e(, puteti folosi convergenta sirului

    1LFsum 1:nS 6@ e entru calculul lui (pi(, puteti folosi convergenta sirului Fsum 1:A2 6@ piA2:$

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    52/140

    9ipurile enumerare, (tMpedef(, si operatori pentru biti '.1. 9ipurile enumerare '.2. "olosirea lui (tMpedef( '.3. xpresii si operatori pe biti '.4. Complement pe bit '.!. Complement fata de doi

    '.$. peratori logici binari pe biti'.'. peratori de deplasare stanga si dreapta

    '.+. ;asti '.-. Un program de impac*etare si despac*etare a cuvintelor '.1/. Hitere mari 6@ litere mici '.11. 0ecapitulare '.12. xercitii propuse spre implementare

    Capitolul '

    9ipurile enumerare, (tMpedef(, si operatori pentru biti 66666666666666666666666666

    9ipurile enumerare6666666666666666666666666entru declararea tipurilor enumerare se foloseste cuvantul rezervat (enum(. cesta va implica

    denumirea multimii, enumerarea elementelor %numite enumeratori&, ca elemente ale multimii.

    66666666666xemplu566666666666

    enum zile Eluni, marti, miercuri,

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    53/140

    xemplu566666666666

    enum carti Etrefla 1, caro, frunza, inimaG a, b, c78in moment ce (trefla( este initializata cu 1, rezulta ca (caro(, (frunza( si (inima( sunt initializatecu 2, 3, respectiv 4.

    66666666666xemplu566666666666 enum fructe Emere ', pere, portocale 3, lamaiG nrfrct7ste clar ca (pere( va fi initializat cu +, iar (lamai( cu 4.=umele tipului enumerare poate lipsi, insa atunci nu mai putem declara alte variabile de acel tip.66666666666

    xemplu566666666666 enum Eplop, molid, bradG copaci7

    ingura variabila de tip (enum Eplop, molid, bradG( este copaci %nu se mai poate declara alta&.66666666666666666666666666666

    "olosirea lui (tMpedef(66666666666666666666666666666C pune la dispozitie facilitatea (tMpedef( pentru redenumirea tipurilor de

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    54/140

    ziuaurmatoare duminica7 brea7

    G return ziuaurmatoare7 G

    alta versiune %mai succinta& folosind (cast( este5enum zile Eduminica, luni, marti, miercuri,

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    55/140

    6666666666666666666666666666666Complement fata de doi 66666666666666666666666666666660eprezentarea complementului fata de doi a unui numar natural este un sir de biti obtinut princomplementarierea scrierii lui n in baza 2. Considerand complementul pe biti al lui n la careadunam 1, obtinem reprezentarea complementului fata de doi a lui 6n.

    masina care utilizeaza reprezentarea complementului fata de doi ca reprezentare binara inmemorie pentru valori integrale se numeste masina complement fata de doi. 0eprezentarilecomplement fata de doi ale lui / si 61 sunt speciale. stfel valoarea / are toti bitii (off(, pe candvaloarea 61 are toti bitii (on(. =umerele negative sunt caracterizate prin aceea ca au bitul cel maisemnificativ 1. e masinile care utilizeaza complementul fata de doi, *ard6ul permite implementareascaderii ca o adunare si un complement pe biti. peratia a 6 b este aceeasi cu a L %6b&, unde 6b seobtine considerand complementul pe biti al lui b la care adunam 1.

    666666666666666666666666666666666666666peratori logici binari pe biti66666666666666666666666666666666666666

    Cei trei operatori R %si&, A %sau exclusiv& si B %sau inclusiv& sunt binari si au operanzi integrali.peranzii sunt operati bit cu bit. 9abelul de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    56/140

    xemplu5 c*ar c PP766666666666 666666666666666666666666666666666666666666666666666666666666666666666666 xpresie 0eprezentare ctiune 666666666666666666666666666666666666666666666666666666666666666666666666 c /1/11/1/ nedeplasat

    c DD 1 1/11/1// deplasare la stanga cu 1 c DD 4 1/1///// deplasare la stanga cu 4 c DD 1! //////// deplasare la stanga cu 1! 666666666666666666666666666666666666666666666666666666666666666666666666C*iar daca valoarea lui (c( se memoreaza pe un octet, intr6o expresie aceasta ia tipul (int(. 8ecivaloarea expresiilor (c DD 1(, (c DD 4( si (c DD 1!( se memoreaza pe doi octeti.peratorul de deplasare la dreapta (@@( nu este c*iar simetric cu (DD(. entru expresiile integrale

    fara semn, din stanga se va deplasa /, iar pentru cele cu semn 1.

    66666666666xemplu5

    66666666666resupunem ca avem declaratiile5 int a 1 DD 1!7 unsigned b 1 DD 1!7 666666666666666666666666666666666666666666666666666666666666666666666666666 xpresie 0eprezentare ctiune 666666666666666666666666666666666666666666666666666666666666666666666666666 a 1/////// //////// nedeplasat a @@ 3 1111//// //////// deplasare la dreapta cu 3 b 1/////// //////// nedeplasat b @@ 3 ///1//// //////// deplasare la dreapta cu 3 66666666666666666666666666666666666666666666666666666666666666666666666666Ca valoare intreaga, a @@ 3 este 64/-$, iar b @@ 3 este 4/-$, lucru care este in concordanta cunotiunea de numar negativ si pozitiv din matematica.8aca operandul din dreapta a operatorului de deplasare este negativ sau are o valoare care este

    egala sau depaseste numarul de biti folositi pentru reprezentarea operandului din stanga, atuncicomportarea este nedefinita.9abelul de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    57/140

    variabila sau expresie. 8in moment ce constanta (int( 1 are reprezentarea pe biti5 //////// ///////1aceasta poate fi folosita pentru determinarea bitului cel mai nesemnificativ dintr6o expresie (int(.Codul de mai

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    58/140

    p %p DD C[0I9& B b7 return p7 Gc*ar unpac%int p, int & :J /, 1 J:

    E

    int n J C[0I97 :J n /, + J: unsigned masca 2!!7

    masca DD n7 return%%p R masca& @@ n&7 Gvoid main%&

    E clrscr%&7 bitprint%$!&7

    printf%(Fnab (&7 bitprint%pac%PaP, PbP&&7 putc*ar%PFnP&7 getc*%&7 printf%(=umarul 24-3/ este impac*etarea caracterelor Kc si Kc(, unpac%24-3/,1&, unpac%24-3/,/&&7 getc*%&7 G66666666666666666666666666666666

    Hitere mari 6@ litere mici 666666666666666666666666666666660eluam un exemplu dintr6un capitol precedent si anume transformarea literelor mari in micifolosind operatori de deplasare.#include Dstdio.*@

    #include Dconio.*@#include DctMpe.*@void main%&

    E

    clrscr%&7 int c7 )*ile %%c getc*ar%&& S "& E if %isupper%c&& :: sau %c@PP RR cDPP& putc*ar%c B %1 DD !&&7 else putc*ar%c&7 G G

    666666666666666660ecapitulare66666666666666666

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    59/140

    n cele ce urmeaza, vom preciza cum se calculeaza valoarea unui numar pozitiv, respectiv negativ%in memoria calculatorului&."ie declaratia

    int a7Consideram reprezentarea sa in baza 2

    BBBBB BBBBB bE1$G bE1!G . . . . . . . b- b+ b' . . . . . . . b18aca bE1$G / atunci

    a sumaE

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    60/140

    "unctia trebuie sa aiba la intrare ziua, luna si anul ca intregi si trebuie sa returneze data(impac*etata( pe un (intreg( pe 1$ biti. crieti inca o functie care face (despac*etarea(.!. "olosind operatori pe biti, scrieti programe C care5 a& testeaza daca un numar de tip (int( sau (long( este divizibil cu +. Qeneralizare %divizibilitate cu2An&7 b& testeaza daca un numar este pozitiv sau negativ7

    c& calculeaza pentru un n dat, multiplii de 2, 4, ... Qeneralizare7 d& calculeaza pentru un n dat, Nn:2O, Nn:4O, ... Qeneralizare7 e& calculeaza mAn, folosind reprezentarea in baza 2 a lui n si metoda (divide et impera( %veziexercitiul 2 din capitolul $&.$. a se calculeze suma cifrelor unui numar cu n cifre.

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    61/140

    "unctii, pointeri si clase de memorare +.1. 8eclararea si atribuirea pointerilor +.2. dresare si indirectare +.3. ointeri catre (void( +.4. pel prin adresa %referinta& +.!. 0eguli pentru stabilirea domeniului

    +.$. Clase de memorare +.'. Clasa de memorare (auto( +.+. Clasa de memorare (extern( +.-. Clasa de memorare (register( +.1/. Clasa de memorare (static( +.11. Variabile externe statice +.12. nitializari implicite +.13. 8efinitii si declaratii de functii +.14. Calificatorii de tip (const( si (volatile( +.1!. xercitii propuse spre implementare

    Capitolul +"unctii, pointeri si clase de memorareVa amintiti ca daca o expresie este transmisa ca argument pentru o functie, atunci se creeaza ocopie a valorii expresiei care se transmite. cest mecanism este cunoscut sub numele de apel prinvaloare %(call6bM6value(& si se foloseste in limba

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    62/140

    masina ale sistemului C. 8e obicei, constanta simbolica =UHH este / %definita in Dstdio.*@&.66666666666

    xemple5666666666661. p Ri7 :J valoarea lui p este adresa lui i J:

    2. p /7 :J valoarea lui p este adresa speciala / J:3. p =UHH7 :J ec*ivalent cu p /7 J:4. p %int J& 13/'7 :J o adresa absoluta din memorie J:666666666666666666666666666666

    dresare si indirectare666666666666666666666666666666m vazut ca operatorul de adresa R se aplica unei variabile si intoarce valoarea adresei sale dinmemorie. peratorul de indirectare %sau de dereferentiere& se aplica unui pointer si returneazavaloarea scrisa in memorie la adresa data de pointer. ntr6un anumit sens, acesti doi operatori suntinversi unul altuia. entru a intelege mai bine aceste notiuni, sa vedem pe un exemplu ce se

    intampla in memorie566666666666xemplu566666666666resupunem ca avem declaratiile5

    int i ''', Jp Ri7tunci, in memorie avem5

    =ume 9ip Valoare dresa 666666666666666666666666666666666666666 B i B int B ''' B 33+5/"" B 666666666666666666666666666666666666666 :F B B B %Jp i& J B 66666666 %p Ri& B B R B F:

    666666666666666666666666666666666666666666666666 B p B int J B 33+5/"" B 33+5/"" B 666666666666666666666666666666666666666666666666

    =ume 9ip Valoare dresa

    ;entionam ca adresa unei variabile este dependenta de sistem %C aloca memorie acolo unde poate&.

    66666666666xemplu566666666666 float x, M, Jp7 p Rx7 M Jp7

    ;ai intai (p( se asigneaza cu adresa lui (x(. poi, (M( se asigneaza cu valoarea unui obiect la carepointeaza p %adica Jp&. ceste doua instructiuni de asignare se pot scrie M JRx7

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    63/140

    care este ec*ivalent cu M x7m vazut mai sus ca un pointer se poate initializa in timpul declararii sale. 9rebuie sa avem totusigri

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    64/140

    Jp& va afisa valoarea scrisa la adresa care este egala cu valoarea lui p. dresa lui i %valoarea lui p&va fi afisata ca fiind ceva de genul 33+5/""care reprezinta un numar scris in baza 1$ %in care cifrele sunt /, 1, ..., -, , I, C, 8, , "& si arevaloarea 3J1$A'L1/J1$A$L3J1$A!L+J1$A4L 1!J1$A2L1!J1$L14 -'$'!2$3+

    8e observat ca un pointer se memoreaza intotdeauna pe patru octeti indiferent de tipul variabileicatre care se face referirea. xplicati de ce ?666666666666666666666666666

    ointeri catre (void(666666666666666666666666666n C traditional, pointerii de tipuri diferite sunt considerati compatibili ca asignare. n = C,totusi, un pointer poate fi asignat altuia doar daca au acelasi tip, sau cand unul dintre ei este de tipul(void(. 8e aceea, putem gandi (void J( ca un tip pointer generic.

    6666666666

    xemple5 resupunem ca avem declaratiile6666666666 int Jp7 float JZ7 void Jv7 6666666666666666666666666666666666666666666666666666666666 B signari legale B signari ilegale B 6666666666666666666666666666666666666666666666666666666666 B p /7 p 17 B B p %int J& 17 v 17 B B p v Z7 p Z7 B B p %int J& Z7 B 666666666666666666666666666666666666666666666666666666666Vom discuta in capitolele ulterioare despre functiile (calloc%&( si (malloc%&(, care produc alocaredinamica a memoriei pentru vectori si structuri. le returneaza un pointer catre (void(, de aceea

    putem scrie5int Ja7

    a calloc%...&7n C traditional, trebuie sa facem conversie explicita5 a %int J& calloc%...&7

    66666666666666666666666666666666666pel prin adresa %referinta& 66666666666666666666666666666666666m vazut ca C foloseste mecanismul apelului prin valoare %(call6bM6value(& in cazul apelurilorfunctiilor si anume se fac copii ale parametrilor actuali care se transmit functiilor. n cele ceurmeaza, vom descrie mecanismul apelului prin adresa si astfel se va asigura modificarea valoriivariabilei transmise. entru aceasta, vom utiliza pointeri.66666666666xemplu566666666666#include Dstdio.*@

    void intersc*imba%int J, int J&7

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    65/140

    void main%&E

    int a 3, b '7printf%(Kd KdFn(, a, b&7

    intersc*imba%Ra, Rb&7

    printf%(Kd KdFn(, a, b&7 Gvoid intersc*imba%int Jp, int JZ&

    E int tmp7

    tmp Jp7 Jp JZ7 JZ tmp7 G

    fectul apelului prin adresa este realizat prin51. 8eclararea parametrului functiei ca fiind un pointer72. "olosirea unui pointer de indirectare in corpul functiei73. 9ransmiterea adresei unui argument cand functia este apelata.6666666666666666666666666666666666666666666666

    0eguli pentru stabilirea domeniului 66666666666666666666666666666666666666666666668omeniul unui identificator este partea din textul unui program unde identificatorul este cunoscutsau accesibil. ceasta idee depinde de notiunea de (bloc(, care este o instructiune compusa cudeclaratii.0egula de baza in stabilirea domeniului este aceea ca identificatorii sunt accesibili numai in blocul

    unde sunt declarati si necunoscuti in afara granitelor blocului. Unii programatori folosesc acelasinume de identificatori prezenti in anumite blocuri.66666666666xemplu566666666666 E int a 27 printf%(KdFn(, a&7 E

    int a '7printf%(KdFn(, a&7 G printf%(KdFn(, LLa&7

    GUn program ec*ivalent ar fi5 E int aafara 27 printf%(KdFn(, aafara&7 E int ainauntru '7

    printf%(KdFn(, ainauntru&7 G printf%(KdFn(, LLaafara&7

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    66/140

    G6666666666666666666666666

    Clase de memorare6666666666666666666666666rice variabila si functie are doua atribute5

    tipul si clasa de memorarexista patru clase de memorare in C, automata, externa, registru si statica si sunt date deurmatoarele cuvinte rezervate5 auto extern register staticCea mai cunoscuta clasa de memorare este (auto(.

    6666666666666666666666666666666666

    Clasa de memorare (auto( 6666666666666666666666666666666666Variabilele declarate in interiorul functiilor sunt implicit automate. 8e aceea, clasa (auto( este ceamai cunoscuta dintre toate. 8aca o instructiune compusa %bloc& incepe cu declararea unor variabile,

    atunci aceste variabile sunt in domeniu in timpul acestei instructiuni compuse %pana la intalnireasemnului G&.

    66666666666xemplu566666666666auto int a, b, c7auto float f78eclaratiile variabilelor in blocuri sunt implicit automate.Ha executie, cand se intra intr6un bloc, se aloca memorie pentru variabilele automate. Variabilele

    sunt considerate locale acestui bloc. Cand se iese din acest bloc, sistemul elibereaza zona dememorie ocupata de acestea si deci valorile acestor variabile se pierd. 8aca intram din nou in acest

    bloc, atunci se aloca din nou memorie pentru aceste variabile, dar vec*ile valori sunt necunoscute.6666666666666666666666666666666666666

    Clasa de memorare (extern( 6666666666666666666666666666666666666 metoda de transmitere a informatiei in blocuri si functii este folosirea variabilelor externe. 8acao variabila este declarata inafara functiei, atunci acesteia i se aloca permanent memorie si spunemca ea apartine clasei de memorare (extern(. variabila externa este considerata globala tuturorfunctiilor declarate dupa ea, si c*iar dupa iesirea din blocuri sau functii, ea ramane permanent in

    memorie.66666666666xemplu566666666666#include Dstdio.*@int a 1, b 2, c 37

    int f%void&7void main%&

    E

    printf%(K3dFn(, f%&&7 printf%(K3dK3dK3dFn(, a, b, c&7 G

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    67/140

    int f%void&

    E int b, c7 :J b si c sunt locale, deci b, c globale sunt mascate J:

    a b c 47 :J valoarea lui a se modifica J: return%a L b Lc&7 Gxplicatia este foarte simpla. Ha inceput se memoreaza cate 2 octeti pentru (a(, (b(, (c(. Cand

    a

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    68/140

    666666666666666666666666666666666666668eci, cuvantul rezervat (extern( spune compilatorului (cauta peste tot, c*iar si in alte fisiere S(.stfel, programul precedent se poate rescrie5in fisierul (fisier1.c(5#include Dstdio.*@

    int a 1, b 2, c 37 :J variabile externe J:

    int f%void&7void main%&

    E printf%(K3dFn(, f%&&7 printf%(K3dK3dK3dFn(, a, b, c&7 Gin fisierul (fisier2.c(5

    int f%void& E extern int a7 :J cauta6l peste tot J:

    int b, c7

    a b c 47 :J valoarea lui a se modifica J: return%a L b Lc&7 G8eci, putem conc*ide ca informatiile se pot transmite prin variabile globale %declarate cu extern&

    sau folosind transmiterea parametrilor. 8e obicei se prefera al doilea procedeu.9oate functiile au clasa de memorare externa. 8e xemplu,

    extern double sin%double&7este un prototip de functie valid pentru functia (sin%&(, iar pentru definitia functiei, putem scrie5 extern double sin%double x& E .. G66666666666666666666666666666666666666

    Clasa de memorare (register(

    66666666666666666666666666666666666666Clasa de memorare (register( spune compilatorului ca variabilele asociate trebuie sa fie memoratein registri de memorie de viteza mare, cu conditia ca aceasta este fizic si semantic posibil. 8acalimitarile resurselor si restrictiile semantice %cateodata& fac aceasta imposibila, clasa de memorareregister va fi inlocuita cu clasa de memorare implicita (auto(. 8e obicei, compilatorul are doarcativa astfel de registri disponibili. ;ulti sunt folositi de sistem si deci nu pot fi alocati."olosirea clasei de memorare (register( este o incercare de a mari viteza de executie a programelor.8e regula, variabilele dintr6obucla sau parametrii functiilor se declara de tip (register(.66666666666

    xemplu5

    66666666666 E register int i7

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    69/140

    for %i /7 i D H;97 LLi& E . . . . . G G :J la iesirea din bloc, se va elibera registrul i J:8eclaratia

    register i7este ec*ivalenta cu register int i78aca lipseste tipul variabilei declarata intr6o clasa de memorare de tip (register(, atunci tipul seconsidera implicit (int(.66666666666666666666666666666666666

    Clasa de memorare (static( 666666666666666666666666666666666668eclaratiile (static( au doua utilizari distincte si importante5

    a& permite unei variabile locale sa retina vec*ea valoare cand se reintra in bloc %sau functie&

    %caracteristica ce este in contrast cu variabilele (auto( obisnuite&7 b& folosita in declaratii externe are alta comportare %vom discuta in sectiunea urmatoare&7entru a ilustra a&, consideram xemplul566666666666xemplu566666666666void f%void& E static int contor /7

    LLcontor7 if %contor K 2 /& . . . . . else . . . . . Grima data cand functia este apelata, (contor( se initializeaza cu /. Cand se paraseste functia,

    valoarea lui (contor( se pastreaza in memorie. Cand se va apela din nou functia (f%&(, (contor( nu seva mai initializa, ba mai mult, va avea valoarea care s6a pastrat in memorie la precedentul apel.8eclararea lui (contor( ca un (static int( in functia (f%&( il pastreaza privat in (f%&( %adica numai aici

    i se poate modifica valoarea&. 8aca ar fi fost declarat in afara acestei functii, atunci si alte il puteauaccesa.6666666666666666666666666666666

    Variabile externe statice 6666666666666666666666666666666=e vom referi acum la folosirea lui (static( ca declaratie externa. ceasta pune la dispozitie unmecanism de (izolare( foarte important pentru modularitatea programelor. rin (izolare( intelegemvizibilitatea sau restrictiile de domeniu.8eosebirea dintre variabile externe si cele externe static este ca acestea din urma sunt variabileexterne cu restrictii de domeniu. 8omeniul este fisierul sursa in care ele sunt declarate. stfel,

    acestea sunt inaccesibile pentru functiile definite anterior in fisier sau definite in alte fisiere, c*iardaca functiile folosesc clasa de memorare (extern(.66666666666

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    70/140

    xemplu566666666666 void f%void& E . . . . . :J v nu este accesibil aici J: G

    static int v7 :J variabila externa statica J:

    void g%void&

    E . . . . . :J v poate fi folosit aici J: GVom mai prezenta un xemplu de generare a numerelor aleatoare bazata pe metode de congruente

    liniara %\nut*, 8., .5 (9*e rt of Computer rogramming(, 2nd ed., vol. 2, (eminumericallgorit*ms(, 0eading ;ass. ddison6YesleM, 1-+1&.

    66666666666xemplu566666666666#define =9H8 1' :J 8 6 samanta J:#define ;UH9H0 2!2'3#define =C0;=9 13+4-#define ;8UHU $!!3$#define "H9=Q;8UHU $!!3$./static unsigned seed =9H87 :J externa, dar locala acestui fisier J:

    unsigned random%void& E seed %;UH9H0 J seed L =C0;=9& K ;8UHU7 return seed7 G

    double probabilitM%void& E seed %;UH9H0 J seed L =C0;=9& K ;8UHU7 return %seed : "H9=Q;8UHU&7 G

    "unctia (random%&( produce o secventa aleatoare %aparenta& de numere intregi situate intre / si;8UHU. "unctia (probabilitM%&( produce o secventa aleatoare %aparenta& de valori reale intre /si 1.bservam ca un apel al functiei (random%&( sau (probabilitM%&( produce o noua valoare a variabilei(seed( care depinde de cea vec*e. 8in moment ce (seed( este o variabila externa statica, aceastaeste locala acestui fisier si valoarea sa se pastreaza de la un apel la altul. utem acum crea functii inalte fisiere care apeleaza aceste numere aleatoare fara sa avem gri

  • 5/26/2018 RO-Limbajul de Programare C 70 Pag (1)

    71/140

    void f%int a& E . . . . . :J g%& este disponibil aici, dar nu si in alte fisiere J: G

    static int g%void&

    E . . . . . G66666666666666666666666666

    nitializari implicite66666666666666666666666666n C, variabilele externe si statice care