Laborator de Programare in C

download Laborator de Programare in C

of 87

Transcript of Laborator de Programare in C

  • 7/24/2019 Laborator de Programare in C

    1/87

    Cuprins

    Introducere 4

    Tema 1.Tipuri de date n C. Funcii de intrare, ieire 5

    Tema 2.Operatori, operanzi, expresii .. 13

    Tema 3.Instruciuni .. 18

    Tema 4.Pointeri .. 28

    Tema 5.Funcii de prelucrare a irurilor de caractere .. 35

    Tema 6.Tipuri de date definite de utilizator .................................... 43

    Tema 7.Argumente pentru funcia main().. 53

    Tema 8Prelucrarea fiierelor.. 56

    Tema 9.Recursii .. 64

    Tema 10.Sortarea datelor .. 68

    Probleme suplimentare. 74Anexa 1.

    Specificatori de format ...................................................................................... 77

    Anexa 2.Codul ASCII ...................................................................................................... 78Bibliografie 81

    3

  • 7/24/2019 Laborator de Programare in C

    2/87

    Introducere

    Disciplina Programarea calculatoarelor este studiatde studenii facultii Cibernetica,Statistica i Informatica Economic n semestrul 1, specializarea Cibernetica i InformaticaEconomic, Informatica, Informatica i limba englezaplicat. Pentru specializareaStatistica cursul este facultativ. Cursul prevede studierea unui limbaj de programare.

    Lucrarea dateste o culegere de probleme pentru lucrrile practice i de laborator ce in deLimbajul de programare C. Ea este structuratn mai multe lucrri de laborator care abordeaztoate temele din programa analiticrespectivi au scopul de a nlesni studierea instruciunilori facilitilor de programare ale limbajului C.

    Sunt propuse urmtoarele lucrri de laborator:

    Denumirea lucrrii Ore1 Tipuri de date n C. Funcii de intrare, ieire 62 Operatori, operanzi, expresii 63 Instruciuni 6

    4 Pointeri 65 Funcii de prelucrare a irurilor de caractere 46 Tipuri de date definite de utilizator, redenumirea tipurilor 47 Argumente pentru funcia main() 28 Prelucrarea fiierelor 69 Recursii 210 Sortarea datelor 2

    Fiecare temconine un set de indicaii i sugestii de lucru care au scopul de a oferi n modsuccint funciile i instruciunile limbajului referitor la tema respectiv. De asemenea, fiecarelucrare conine un set de probleme rezolvate, fiind prezentate prin codurile C respective, i un set

    de probleme de rezolvat. La fiecare lucrare sunt propuse i un ir de ntrebri de control pentrutestarea i verificarea cunotinelor acumulate la tema respectiv.

    Studentul efectueazfiecare lucrare de laborator, o salveazpe server i susine lucrarea.Susinerea lucrrii se face, de regul, n mod practic la calculator prin prezentarea lucrrii itestarea asistatde calculator pe ntrebrile de control respective.

    4

  • 7/24/2019 Laborator de Programare in C

    3/87

    Lucrarea 1

    Tema: Tipuri de date n C. Funcii de intrare, ieire

    Scopul lucrrii: nsuirea tipurilor de date de bazn C, a funciilor de intrare, ieire,utilizarea lor la introducerea i extragerea datelor sub controlul unor formate i fraceasta.

    Indicaii i sugestii de lucru:

    Orice program prelucreazcareva date i n rezultatul acestei prelucrri se obin alte date noi.

    Date variabile i date constante. Datele unui program pot fi constante sau variabile.Datele constante sunt constantele n sensul obinuit al cuvntului. Valoarea unei constanteeste definitde caracterele care intrn reprezentarea ei i nu poate fi schimbat. Aa sunt, deexemplu, numerele 3, -2, 2008, 1.2, 3.141592653, -123.456, caracterele a, S, %, irurile decaractere Informatica, CiBeR etc.

    Pentru a scrie o constantcaracter, scriem caracterul necesar ntre doucaractereapostrof: a, 4, &, ; etc. Altfel se scrie caracterul apostrof, care se reprezintcu un caracterbackslash n fa: \ . n acelai mod se reprezintcaracterul backslash i caracterulghilimele: \\ , \ .

    Pentru a scrie o constantir de caractere, scriem irul respectiv ntre doucaractereghilimele: Arborele Lumii.

    Constantele numerice se scriu n mod obinuit: 5, -12, 65432, 3.14,-123.456, 0.314E+1 etc.

    Datele variabile, spre deosebire de cele constante, i pot schimba valorile n timpulexecuiei programului. Atunci cnd lucreaz, programul pstreazdatele n memoria

    calculatorului. Datele variabile sunt pstrate n variabile. Variabila este numele unei locaii dememorie n care se poate pstra o valoare. Numele unei variabile este format din litere, cifre icaracterul de subliniere _ . Primul caracter al numelui nu poate fi o cifr.

    O variabileste de un tip careva. Tipul variabilei indicgenul de valori pe care variabila lepoate pstra i operaiile pe care programul le poate executa cu aceste valori. Tipul determinidimensiunea locaiei de memorie n care se vor pstra valorile variabilei. n timpul execuieiprogramului, valorile unei variabile se pot schimba, dar tipul variabilei nu se poate schimba. Oconstant, pe lngvaloare, are i ea tip. Dar tipul constantei, ca i valoarea ei, se determindecaracterele ce intrn reprezentarea ei i nu poate fi schimbat.

    Tipuri de bazn C. Tipurile de date se specificprin cuvinte cheie. n C tipurile de bazsunt: char, int, float, double. O variabilde tipul char pstreazun caracter, de exemplu o

    literdin alfabet. Caracterele se pstreazn memorie prin codul lor ASCII, care sunt numerentregi. Implicit, domeniul de valori pentru o variabilde tipul char sunt toate numerele ntregide la 128 pnla 127. O valoare de tipul char se pstreazn memorie pe un octet.

    Toate variabilele unui program trebuie sfie declarate. Pentru a declara o variabilsaumai multe, scriem numele tipului necesar i numele variabilei sau variabilelor de care avemnevoie: char car; char rac, arc; etc.

    Atribuirea unei valori pentru o variabilse poate face cu operatorul de atribuire =: car = C;rac = i; arc = b;

    Compilatorul, cnd vede declaraia char car; alocun octet de memorie pentru variabilachar i fixeaznumele variabilei i adresa locaiei alocate pentru ea. Iar atunci, cnd calculatorulexecutinstruciunea de atribuire car = C; el scrie n locaia de memorie, rezervatpentruvariabila car, valoarea constantei caracter C, adicscrie acolo numrul ntreg 67, codul ASCII

    al caracterului C.

    5

  • 7/24/2019 Laborator de Programare in C

    4/87

    O variabilde tipul int pstreazvalori ntregi. Diapazonul de valori i dimensiuneapentru tipul int pot varia de la un calculator la altul. De regul, la un sistem, unde cuvntulcalculator este de 2 octei, o valoare de tipul int se pstreazpe 2 octei i diapazonul devalori pentru acest tip de date sunt numerele ntregi de la 32768 pnla 32767. n general,dimensiunea tipului int coincide cu dimensiunea cuvntului calculator.

    Unei variabile i se poate atribui o valoare la declararea ei: int an = 2008, luna; Aici ladeclaraia variabilei an, ei i se atribuie valoarea 2008, iar despre valoarea variabilei luna nuse poate spune nimic, pnla prima atribuire a unei valori pentru ea.

    Tipul float se folosete pentru a pstra numere raionale. Numerele se pstreazcu o precizieordinar, adic7 cifre corecte. Compilatorul aloc 4 octei pentru o variabilde acest tip.Diapazonul de valori ( n valoareaabsolut) este de la 3.410-38 pnla 3.410+38.

    Pentru a pstra numere raionale cu mai multe cifre precise, se folosete tipul double. Ovaloare de acest tip se pstreazpe 8 octei. Numerele se pstreazcu o precizie dubl, adicpnla 15 cifre corecte. Diapazonul de valori ( n valoarea absolut) este de la 1.710-308 pnla1.7

    10+308.Pentru reprezentarea numerelor raionale, mai ales atunci cnd ele sunt destul de lungi, se

    folosete notaia E ( notaia tiinific). De exemplu, distana n kilometri a unui an lumineste9460800000000. n notaia tiinificacest numr poate fi scris n mai multe moduri:9.4608E12, 94.608e11, 0.94608E13 etc. Aici litera E mare, ca i litera e mic, semnificunfactor care exprimo putere a lui 10. Deci, 3.14E0, 0.314e1, 31.4E-1, 314.0e-2 reprezintunul i acelai numr 3.14 . Menionm, cforma unui numr n notaia tiinific, unde parteantreaga numrului este o cifrdiferitde 0, se numete forma normalizata numrului.

    Modificatori de tip. n limbajul C sunt tipuri de date rude cu cele de baz. Ele se obinprin modificarea tipurilor de baz. Modificatorii de tip sunt: short ( scurt ), long ( lung ),signed ( cu semn ), unsigned ( frsemn ). Astfel, rudele tipului int sunt short int, longint, signed int, unsigned int, long signed int, long unsigned int.

    Modificatorii signed i unsigned se referla valorile ntregi. Primul admite, iar al doilea nuadmite valori negative. Se tie, cn reprezentarea unui ntreg, pozitiv sau negativ, n memoria

    calculatorului, bitul cel mai superior este rezervat pentru semnul numrului. Pentru tipulunsigned, pe acest bit, ca i pe ceilali, se pstreazo cifrbinara numrului. Din aceastcauz, diapazonul pentru valorile respective creste de 2 ori.

    De obicei, tipurile char i signed char coincid. Prin urmare, diapazonul de valori pentrutipul unsigned char este de la 0 pnla 255. Dimensiunea tipului este ca i la char( 1 octet ).

    Ca regul, coincid i tipurile int i signed int. Diapazonul pentru unsigned int este de la0 pnla 65535. Dimensiunea tipului este ca i la int ( de obicei, 2 octei ).

    Modificatorul long poate fi aplicat la tipurile int, unsigned int i double. Pentru long inti unsigned long int cuvntul int poate fi omis: se scrie long i unsigned long respectiv.Ordinea scrierii modificatorilor ( long unsigned sau unsigned long) nu import. Dacdimensiunea pentru int este de 2 octei, atunci pentru long este de 4 octei. Iar n cazul, cint cere 4 octei, atunci i long ocup4 octei.

    Compilatoarele C mai recente admit tipul long double pentru numere flotante. O valoare deacest tip se pstreazpe 10 octei cu o precizie de pnla 18 cifre. Diapazonul ( n valoareaabsolut) este de la 3.4E-4932 pnla 1.1E+4932.

    Se tie ctipul unei constante este determinat de reprezentarea ei. Astfel, constanta 314 estede tipul int, iar constanta 45678 este de tipul long, deoarece valoarea ei depete limitelediapazonului de valori pentru tipul int. Se poate impune explicit tipul long pentru o constantca 314. Pentru aceasta, n reprezentarea constantei, dupultima cifr, se scrie litera l sau L:314l sau 314L. Acelai lucru se referi la modificatorul unsigned. Litera u sau U lasfritul constantei, determintipul unsigned pentru ea. Se admite i combinaia literelor lsau L cu u sau U( ordinea nu import).

    6

  • 7/24/2019 Laborator de Programare in C

    5/87

    Comentarii. ntr-un program se pot introduce comentarii. Un comentariu este o remarc, untext, care explicunele momente legate de program. O remarcpoate fi scrispe mai multernduri. Ea ncepe cu semnele /*, care semnificnceputul comentariului i se termin cusimbolurile */, care semnificsfritul lui. ntre caracterele / i * nu sunt admise altecaractere.

    Funcia clrscr( ) terge ecranul. Ea nu are parametri.Funcia are prototipul void clrscr( void ); n fiierul .

    Funcia getch( ) citete frecou un caracter de la intrarea standard direct n memorie, fracionarea tastei Enter. La citirea unui caracter al codului ASCII, funcia revine cu valoareacodului caracterului citit. La acionarea unei taste creia nu i corespunde un caracter ASCII,cum ar fi acionarea tastelor F1, F2 etc. sau la acionarea unor combinaii de taste, funcia seapeleazde douori: la primul apel ea revine cu valoarea 0, iar la cel de al doilea apel ea revinecu valoarea specifictastei acionate. Funcia nu are parametri.

    De obicei, funcia getch( ) se folosete i pentru a opri execuia unui program i a menineafiatfereastra utilizator pnla acionarea unei taste.

    Funcia are prototipul int getch( void ); n fiierul .

    Funcia getche( ) citete cu ecou un caracter de la intrarea standard. n rest este ca ifuncia getch( ). Funcia are prototipul int getche( void ); n fiierul .

    Funcia putch( e ) scrie un caracter la ieirea standard. Ea are un singur parametru.Valoarea expresiei e determinimaginea extras. Pentru o valoare a lui e din intervalul [ 32;126 ] funcia extrage caracterul imprimabil de codul respectiv. Pentru alte valori funcia extrage oimagine grafic, dacvaloarea lui e corespunde unui caracter grafic. Dacvaloarea lui e nucorespunde unui caracter grafic, atunci funcia sau nu are efect sau execut aciuneacorespunztoare caracterului de codul respectiv. De exemplu, putch( 10 ), ca i putch( \n ),trece cursorul pe linia urmtoare n aceiai coloan.

    Funcia revine cu valoarea codului imaginii extrase, adicvaloarea lui e.Funcia are prototipul int putch( int c ); n fiierul .

    Funcia getchar( ) citete cu ecou caractere ASCII de la intrarea standard ntr-un tamponspecial pnla acionarea tastei Enter. La acionarea tastei Enter, ea revine cu valoarea coduluicaracterului curent din tampon. La urmtorul apel, funcia revine cu valoarea coduluicaracterului urmtor din tampon. Dacn tampon nu mai sunt caractere, atunci apelul funcieiimpune citirea unui nou set de caractere de la intrarea standard n tampon. Citirea caracterelorprin intermediul unui tampon ne dposibilitatea de a corecta erorile fcute la tastare pnlaapsarea tastei Enter.

    Funcia are prototipul int getchar( void ); n fiierul .

    Funcia putchar( e ) scrie un caracter ASCII la ieirea standard. Ea revine cu valoare coduluicaracterului extras sau cu valoarea -1 n caz de eroare. Aici putchar( \n ), ca i putchar( 10 ),trece cursorul la nceputul liniei urmtoare.

    Funcia are prototipul int putchar( int e ); n fiierul .

    Funcia gets( s ) citete cu ecou de la intrarea standard un ir de caractere ASCII care setermincu . Ea are un parametru valoarea cruia este adresa de nceput a zonei dememorie unde se pstreazirul de caractere citit. De obicei, acest parametru este numele unuitablou unidimensional de tip char. La acionarea tastei Enter, funcia nu scrie caracterulnewline ( \n ) n memorie, ci scrie caracterul NUL ( \0 ), care semnificsfritul irului. Deci\n se substituie prin \0. Fiecare caracter ocupun octet n memorie. Rezult, cun ir de ncaractere ocupn+1 octei.

    7

  • 7/24/2019 Laborator de Programare in C

    6/87

    Funcia revine cu valoarea adresei de nceput a zonei de memorie unde se pstreazirul citit,adicadresa primului caracter. Dacntlnete caracterul EOF, funcia revine cu valoarea 0.

    Funcia are prototipul n fiierul .

    Funcia puts( s ) scrie la ieirea standard un ir de caractere ASCII, care n memorie setermincu caracterul NUL ( \0). Ea are un parametru, valoarea cruia este adresa de nceputa irului de extras. De obicei, acest parametru este numele unui tablou unidimensional de tipchar. La ntlnirea caracterului NUL, funcia nu scrie acest caracter, ci trece cursorul lanceputul liniei urmtoare, adicse substituie caracterul \0 prin \n.

    Funcia revine cu valoarea codului ultimului caracter extras, adicprecedent caracteruluiNUL, i cu valoarea -1 n caz de eroare.

    Funcia are prototipul n fiierul .

    Funcia printf( c, p1, p2, p3, ) scrie la ieirea standard date sub controlul unor formate.Are unul sau mai muli parametri. De obicei, parametrul c este un ir de caractere scris nghilimele, care conine textele eventuale de extras i specificatorii de format eventuali pentrudatele de extras. Textele din parametrul c sunt extrase frschimbare. Secvenele escape, cum

    ar fi \n, \t, \0 .a., nu sunt extrase, ci sunt executate. Parametrii p1, p2, p3, suntexpresii, valorile crora vor fi extrase. La fiecare din aceti parametri, n irul de caractere c, icorespunde un specificator de format, care indiccum se va extrage valoarea respectiv. Unspecificator de format ncepe cu % i se termincu una sau dou litere anumite (vezianexa 1). El determinconversia valorii de extras din formatul intern n formatul extern.Parametrii p1, p2, p3, pot lipsi. Atunci vor fi extrase numai textele din parametrul c.

    De menionat, cparametrii p1, p2, p3, sunt prelucrai de la dreapta spre stnga, adicultimul este evaluat p1.

    Un specificator de format, pe lngliterele speciale, ce corespund tipului valorii de extras, maipoate conine i alte caractere. Aceste caractere au semnificaia lor bine determinat. Un ir decifre zecimale determinlungimea cmpului, n care va fi extrasvaloarea. Implicit, valoareaextraseste aliniatn partea dreapta cmpului de extragere, iar poziiile rmase din partea

    stnga cmpului rmn necompletate. Daclungimea cerutpentru cmpul de extragere esteprea mic, atunci ea este ignorati valoarea este extraspe numrul necesar de poziii. Semnulminus determinalinierea valorii n stnga cmpului de extragere. n acest caz, poziiilenefolosite, din dreapta cmpului, rmn necompletate.

    Cifra 0 determincompletarea cu cifra 0 a poziiilor nefolosite din stnga cmpului.Funcia revine cu numrul de octei ( caractere ) extrai la ieirea standard sau cu valoarea -1

    n caz de eroare.De reinut, cla apelul funciei printf( ) expresiile p1, p2, , pn sunt evaluate n ordine

    invers, adicde la dreapta spre stnga.Funcia are prototipul n fiierul .

    Funcia scanf( c, p1, p2, p3, ) citete de la intrarea standard date sub controlul unor

    formate. Are mai muli parametri. De obicei, parametrul c este un ir de caractere scris nghilimele, care conine specificatorii de format pentru datele de la intrare. El poate conine icaractere albe care sunt neglijate. Parametrii p1, p2, p3, sunt adresele zonelor de memorieunde se vor pstra datele citite. De obicei, adresa unei zone de memorie se exprimprinoperatorul & n faa numelui unei variabile simple sau cu indice. La fiecare din aceti parametri,n irul de caractere c, i corespunde un specificator de format care indiccum se va citi datarespectivde la intrare. Un specificator de format ncepe cu % i se termincu una sau doulitere anumite (vezi anexa 1). El determinconversia datei de citit din formatul extern nformatul intern.

    Funcia citete toate datele ce corespund specificatorilor de format din parametrul c. Dacodatde la intrare nu corespunde specificatorului de format, atunci citirea se ntrerupe. Funciarevine cu numrul datelor citite corect.

    Funcia are prototipul n fiierul .

    8

  • 7/24/2019 Laborator de Programare in C

    7/87

    Funcia fflush( stdin ) terge coninutul buferului ( tamponului ) claviaturii ( curbuferul ). Ea are prototipul n fiierul .

    Funcia exit( c ) ntrerupe execuia programului. Parametrul c definete starea programuluin momentul apelului funciei. De obicei, valoarea 0 a parametrului c definete o stare normalde terminare a execuiei programului, iar o valoare diferitde 0 semnificprezena unei erori. Sefolosete pentru a termina execuia unui program.

    Funcia are prototipul n fiierul i n fiierul .

    sizeof este un operator care determindimensiunea n octei a unei date sau a unui tip dedate. De exemplu, sizeof( int ) determinnumrul de octei necesari pentru a pstra o valoarede tipul int, iar sizeof d determinnumrul de octei alocai datei cu numele d.

    Exemple de programe:

    Exemplul 1.1. Programul introduce cu getch( ) un caracter ASCII i apoi extrage acelai

    caracter cu putch( ).

    #include #include int main(void){ char a; system("cls"); a=getch(); putch(a); system("pause"); return 0; }

    Exemplul 1.2. Programul ilustreazapelul funciei getch( ) la acionarea unei taste ce nucorespunde unui caracter ASCII i apoi extrage cu printf( ) codul atribuit tastei respective.

    #include #include int main(void){ char a; system("cls"); getch(); // Primul apel printf("%d\n", getch()); // Al doilea apel getch(); // Primul apel a=getch(); // Al doilea apel printf("%d\n", a); getch(); // Primul apel

    printf("%d\n", a=getch()); // Al doilea apel system("pause"); return 0; }

    Exemplul 1.3. Programul citete o literminusculi extrage caracterul precedent acesteilitere din setul de caractere al calculatorului.

    #include #include int main(void){ char c; system("cls"); c=getchar();

    putchar(c-1);

    9

  • 7/24/2019 Laborator de Programare in C

    8/87

    system("pause"); return 0; }

    Exemplul 1.4. Programul citete un ir de caractere i extrage lungimea irului citit.

    #include #include

    #include int main(void){ char s[256]; system("cls"); gets(s); printf(Sirul are %d caractere, strlen(s)); system("pause"); return 0; }

    Exemplul 1.5. Programul citete trei numere ntregi i afieazmedia lor aritmeticrotunjitpnla doucifre zecimale.

    #include

    #include int main(void){ int a,b,c; system("cls"); scanf(%d %d %d, &a, &b, &c); printf(a=%d\tb=%d\tc=%d\nmedia=%.2f,

    a,b,c, (a+b+c)/3.0); //media cu 2 zecimale system("pause"); return 0; }

    Exemplul 1.6. Programul afieazntre doucaractere * constanta 123.456f ( definitprin directiva #define ) cu diferii specificatori de format pentru date de tip float.

    #include #include #define a 123.456fint main(void){ system("cls"); printf("*%f*\n", a); printf("*%2f*\n", a); printf("*%20f*\n", a); printf("*%-20f*\n", a); printf("*%020f*\n", a); printf("*%.2f*\n", a); printf("*%.10f*\n", a); printf("*%2.2f*\n", a); printf("*%2.10f*\n", a); printf("*%20.10f*\n", a); printf("*%-20.10f*\n", a); printf("*%020.10f*\n", a); system("pause"); return 0; }

    Coninutul lucrrii:

    Elaborai programe pentru sarcinile ce urmeaz. Salvai programele pe server i n caiet.

    1.0. Introducei i lansai la execuie programele din exemplele 1.1 - 1.6.

    10

  • 7/24/2019 Laborator de Programare in C

    9/87

    1.1. Programul citete cu ecou un caracter imprimabil ( cu getche( ) ) i apoi l afieazpeecran ( cu putch( ) ), trece cursorul pe linia urmtoare ( cu putch( \n ) ), afieazfereastrautilizator ( cu getch( ) ) i ateaptacionarea unei taste.

    Cercetai ce se ntmpldacla citire se acioneazo tastce nu corespunde unui caracterimprimabil sau la acionarea unei taste funcionale.

    1.2. Programul citete un caracter ASCII ( cu getchar( ) ) i apoi l afieazpe ecran ( cuputchar( ) ), trece cursorul pe linia urmtoare ( cu putchar( \n ) ), afieazfereastra utilizatori blocheazprogramul ( cu getch( ) ) pnla acionarea unei taste.

    Cercetai ce se ntmpldacla citire se acioneazo tastce nu corespunde unui caracterASCII.

    Care-i deosebirea dintre putch( \n ) i putchar( \n )?

    1.3. Programul citete ( separat ! ) numele i prenumele unei persoane ( cu gets( ) ), apoiafieaz( cu putchar( ) ) iniialele respective pe un rnd, fiecare iniialfiind urmatde unpunct, execut newline ( cu putchar( \n ) ), afieaz( cu puts( ) ) mesajul Pentru acontinua acionai o tastoarecare i ateapt( cu getch( ) ) acionarea unei taste.

    1.4. Programul citete ( cu getchar( ) ) un caracter, apoi l afieaz( cu printf( ) ) pe ecranntre doucaractere * , execut newline, afieazfereastra utilizator i ateaptacionareaunei taste oarecare.

    1.5. Programul citete ( cu getchar( ) ) un caracter, apoi l afieaz( cu printf( ) ) pe ecranntre doucaractere % , execut newline, afieazfereastra utilizator i blocheazprogramulpnla acionarea unei taste oarecare.

    1.6. Programul afieazpe ecran ntre doucaractere * textul Limbajul C++, folosindurmtorii specificatori de format: %s, %15s, %-15s, %10s, %15.10s, %-15.10s.

    Explicai rezultatele.

    1.7. Programul citete un caracter ASCII ( cu getchar( ) ) i apoi afieaz( cu printf( ) )caracterul citit i codul lui.

    1.8. Programul afieazn zecimal, octal i hexazecimal constanta 12345 definitprindirectiva #define.

    1.9. Programul afieazn zecimal, octal i hexazecimal constanta 123456789definitprin directiva #define.

    1.10. Programul afieazntre doucaractere * constanta 123 ( definitprindirectiva #define ) cu urmtorii specificatori de format: %d, %2d, %10d, %-10d, %010d, %ld,

    %u, %lu, %i, %hd, %o, %x, %X.Explicai rezultatele.

    1.11. Programul afieazntre doucaractere * constanta 123.456 ( definitprindirectiva #define ) cu diferii specificatori de format pentru date de tip double.

    Folosii literele f, e, E, g, G, lf, le, lE, lg, lG.Comparai cu exemplul 1.6.Explicai rezultatele.

    1.12. Programul afieazntre doucaractere * constanta 123.456L ( definitprindirectiva #define ) cu diferii specificatori de format pentru date de tip long double.

    Folosii literele Lf, Le, LE, Lg, LG. ncercai i alte litere.Comparai cu exemplul 1.6 i programul din punctul 1.11.

    11

  • 7/24/2019 Laborator de Programare in C

    10/87

    Explicai rezultatele.

    1.13. Programul citete ( cu scanf( ) ) un caracter ASCII i apoi afieaz( cu printf( ) )caracterul citit i codul lui.

    1.14. Programul citete ( cu scanf( ) ) numele i prenumele unei persoane separate prinspaii albe, apoi afieaz( cu puts( ) ) prenumele pe un rnd i numele pe altul.

    1.15. Programul citete ( cu gets( ) ) numele i prenumele unei persoane, apoi afieaz( cu printf( ) ) numele pe un rnd i prenumele pe altul. Ce se ntmpldacnumele iprenumele la intrare sunt separate prin spaii albe i nu prin acionarea tastei Enter?

    1.16. Programul citete ( cu scanf( ) ) un numr ntreg zecimal format din cel multpatru cifre i apoi afieaz( cu printf( ) ) numrul citit n zecimal, octal i hexazecimal.

    1.17. Programul citete ( cu scanf( ) ) un numr ntreg zecimal format din cel multnou cifre i apoi afieaz( cu printf( ) ) numrul citit n zecimal, octal i hexazecimal.

    1.18. Programul citete ( cu scanf( ) ) o datcalendaristicsub forma ddmmyy ( osuccesiune de 6 cifre ) i apoi o afieaz( cu printf() ) sub forma 20yy/mm/dd. Aici dd, mmi yy sunt numere din doucifre care reprezintrespectiv data, luna i anul ( ex.: 100408 laintrare i 2008/04/10 la ieire ).

    1.19. Programul citete ( cu scanf( ) ) o majusculi apoi afieaz( cu printf( ) )minuscula corespunztoare.

    1.20. Programul determincu operatorul sizeof i afieazctmemorie este rezervatpentru fiecare tip de date ( char, signed char, unsigned char, short, signed short,

    unsigned short, int, signed int, unsigned int, long int, long signed int, long unsigned

    int, float, double, long double ).

    ntrebri de control:

    1.1. Ce este o operaie de intrare ( citire )?1.2. Ce este o operaie de ieire ( scriere )?1.3. Care sunt funciile de citire cu ecou ( frecou )?1.4. Care funcii de intrare cer acionarea tastei Enter?1.5. Care funcii de intrare nu cer acionarea tastei Enter?1.6. Care sunt deosebirile dintre getche( ) i getchar( )?1.7. Care sunt deosebirile dintre putch( )i putchar( )?

    1.8. Cu ce valori revin funciile de intrare ( ieire )?1.9. Care funcii citesc datele direct n memorie?1.10. Care funcii citesc datele prin intermediul unui tampon ( buffer )?1.11. Cum reacioneaz funciile de intrare la acionarea tastelor Enter, ^z, ^c, F1, BS,

    Esc etc.?

    1.12. Cum reacioneaz funciile de ieire la caracterele \n, \t, \a, ^z, ^c, EOF,NUL etc.?

    1.13. Ce valoare de revenire are funcia cu antetul main( )?1.14. Ce valoare de revenire are funcia cu antetul void main( void )?1.15. Cum se poate extrage cu printf( ) un numr inclus ntre doucaractere % ?1.16. Ce este un comentariu, unde i cum poate fi scris el n program?1.17. Cum i pentru ce se utilizeazfuncia clrscr( )?

    1.18. Cum i pentru ce se utilizeazfuncia exit( )?

    12

  • 7/24/2019 Laborator de Programare in C

    11/87

    1.19. Ce reprezintnumele unui tablou?1.20. Care este valoare minimalpentru un indice n tablouri?1.21. Care este valoarea maximalpentru un indice n tablouri?1.22. Ce este un identificator i care este lungimea lui maximal?1.23. Ctmemorie ocupo valoare de tipul: char, int, float, double, long double?1.24. Examinai ntrebrile testului test_01 [5] i selectai rspunsurile corecte la fiecare

    ntrebare.

    13

  • 7/24/2019 Laborator de Programare in C

    12/87

    Lucrarea 2

    Tema: Operatori, operanzi, expresii

    Scopul lucrrii: Utilizarea corecta operatorilor, construcia corecta expresiilor curespectarea regulilor de conversie impliciti conversie forata datelor.

    Indicaii i sugestii de lucru:

    Funciile matematice, cum ar fi pow( x, y ), poly( x, n, c ), sin( x ) .a. au prototipul lor nfiierul .

    Funcia pow( x, y ) calculeaz xy i are prototipul double pow( double x, double y );

    Funcia poly( x, n, c ) calculeazvaloarea polinomului p = cnxn + cn-1xn-1 + ... + c2x2 + c1x +c0 i are prototipul double poly( double x, int n, double c[ ] ); c[ ] este vectorul format dincoeficienii polinomului.

    Funcia sin( x ) calculeazvaloarea funciei sinus de unghiul x exprimat n radiani. Eaare prototipul double sin( double x ); Toate funciile trigonometrice presupun argumentulexprimat n radiani. Pentru a transforma gradele n radiani se nmulesc gradele cu /180, undeconstanta 3.14159265358979.

    Media geometric a numerelor a1, a2, ... , an este (a1a2...an)(1/n).

    O expresie este formatdin unul sau mai muli operanzi legai ntre ei prin operatori. Un

    operator este o operaie care trebuie efectuatasupra unei sau mai multor date. Un operandeste o constant, un nume de variabil, un apel de funcie etc. La evaluarea unei expresii se ineseama de prioritatea operatorilor, asociativitatea lor i de regula conversiilor implicite. Ordineaefecturii operaiilor poate fi schimbatcu ajutorul parantezelor rotunde, care au cea mai mareprioritate. Regula conversiilor implicite este urmtoarea. Mai nti toi operanzii de tip char,short int i enum din expresie sunt convertii spre tipul int. Apoi, dacoperatorul este aplicat ladoi operanzi de acelai tip, atunci se executoperaia respectivi rezultatul va avea acelai tip.Dacoperatorul este aplicat la doi operanzi de tip diferit, atunci operandul de tip mai mic esteconvertit spre tipul mai mare al celuilalt operand i apoi este executatoperaia. Rezultatul vaavea tipul mai mare. n ordine descresctoare mrimea tipurilor este: long double, double,float, unsigned long, long, unsigned int, int ( n ordine descresctoare dupnumrul de octeinecesari pentru a pstra n memorie o valoare de tipul respectiv ).

    Conversii explicite, expresii cast. Pentru a converti n mod explicit un operand la tipulnecesar, se folosete construcia ( tip ) operand. De exemplu, ( int ) x convertete operandul xspre tipul int.

    Operatorii de relaie sunt: < - mai mic, - mai mare, >= - maimare sau egal.

    Operatorii de egalitate sunt: == - egal, != - diferit.

    Operatorii logici sunt: ! negarea logic, && - i logic, || - sau logic. Ei se definesc nfelul urmtor. !a are valoarea 0 ( false ), dac a are o valoare diferitde 0, i are valoarea 1

    ( true ), dac a are valoarea 0. a&&b are valoarea 1, atunci i numai atunci, cnd i a i b

    14

  • 7/24/2019 Laborator de Programare in C

    13/87

    au valori diferite de 0. a||b are valoarea 0 atunci i numai atunci, cnd i a i b au valoarea0.

    Rezultatul unui operator logic, operator de relaie sau operator de egalitate este 1( true ) sau0( false ) i are tipul int.

    Operatorii logici pe bii sunt: ~ - complement fade 1, > -deplasare la dreapta, & - i logic pe bii, ^ - sau exclusiv logic pe bii, | - sau logic pe bii.Aceti operatori se aplicla operanzi de tip int.

    Exemple de programe:

    Exemplul 2.1. Programul citete dounumere i apoi le afieazn ordine cresctoare.

    #include #include int main(void){ float a,b; system("cls"); scanf(%f %f,&a,&b); printf(Numerele citite: %f\t%f\n,a,b); printf(Numerele ordonate: %f\t%f, a>b ? b : a, a>b ? a: b ); system("pause"); return 0; }

    Exemplul 2.2. Programul citete trei cifre i apoi determindacnumrul format din acestetrei cifre este divizibil prin trei.

    #include #include

    int main(void){ unsigned a,b,c; scanf(%u %u %u,&a,&b,&c); (a+b+c)%3==0 ? printf(Da) : printf(Nu); system("pause"); return 0; }

    Exemplul 2.3. Programul evalueazexpresiile !a&&b, !c||d, !e&&f||!f&&e.

    #include #include int main(void)

    { int a,b; float c,d; double e,f; system("cls"); scanf(%d %d,&a,&b); printf(\na=%-d\tb=%-d\t!a&&b=%-d\n\n, a,b, !a&&b); scanf(%f %f,&c,&d); printf(\nc=%-f\td=%-f\t!c||d=%-d\n\n, c,d, !c||d); scanf(%lf %lf,&e,&f); printf(\ne=%-lf\tf=%-lf\t!e&&f||!f&&e=%-d, e,f, !e&&f||!f&&e); system("pause"); return 0; }

    15

  • 7/24/2019 Laborator de Programare in C

    14/87

    Exemplul 2.4. Programul determin n=max(a,b,c), calculnd d=max(a,b)i apoin=max(d,c)pentru trei numere date a, b, c. nsprogramul propus n continuare dun rezultatgreit, chiar imprevizibil. De ce?! Modificai programul pentru a obine rezultatul corect.

    #include #include

    int main(void){ unsigned a=5,b=2,c=3,d,n; system("cls"); printf(a=%-u\tb=%-u\tc=%-u\t max(a,b)=%-u\tmax(a,b,c)= %u, a,b,c,d=a>b?a:b,n=d>c?d:c); system("pause");}

    Exemplul 2.5. Programul citete dounumere ntregi i testeazoperatorii .Testai programul pentru x=1, u=4; x=2, u=8; x=3, u=5; x=216, u=214; x=-1, u=-1; x=-2,

    u=-2; x=-4, u=-4; x=-5, u=-5; Interpretai rezultatele.

    #include #include int main(void){ long x,y; int u,w; system("cls"); printf(Introdu x si u ); scanf(%ld %d,&x,&u); w=u2=%-ld\n,x,x,y); system("pause"); return 0; }

    Exemplul 2.6. Programul citete un numr ntreg s i determincel mai mic numr imparcare nu este mai mic dect s.

    #include #include int main(void){ int s; system("cls"); scanf(%d,&s); printf(s=%-d\ts|1=%-d, s, s|1 ); system("pause"); return 0; }

    Coninutul lucrrii:

    Elaborai programe pentru sarcinile ce urmeaz. Salvai programele pe server i n caiet.

    2.0. Introducei i verificai, lansnd la execuie, programele din exemplele 2.1 - 2.6.

    2.1. Programul citete un numr x de tip float, calculeaz y = 3.5x3- 3.5x2 + 3.5x - 3.5i afieazvalorile pentru x, y.

    2.2. Programul citete un numr x de tip int, calculeaz p = 3x2 + 7x + 17 i afieazvalorile pentru x, p.

    16

  • 7/24/2019 Laborator de Programare in C

    15/87

    ncercai pentru x = 1, 10, 100, 1000. Explicai de ce unele rezultate nu sunt corecte. Cumtrebuie modificat programul ca rezultatele sfie corecte?

    2.3. Programul citete un numr x de tip double, calculeaz a = x19 + x15 + x9 + x5 + 1 iafieazvalorile pentru x, a.

    Folosii funcia pow(x,y) pentru a calcula xy.ncercai pentru x=1, 10, 100, 1000. Explicai de ce unele rezultate nu sunt corecte.

    2.4. Programul citete argumentul x i coeficienii c0, c1, c2, c3, c4 de tip double aipolinomului q = c4x

    4 + c3x3 + c2x

    2 + c1x + c0, calculeazvaloarea polinomului q i afieazvalorile lui x i q.

    Folosii funcia poly( x, n, c ) i un tablou pentru coeficienii polinomului pentru a calculavaloarea polinomului q.

    2.5. Programul citete cu ecou o literminuscul( majuscul) i apoi o afieazca litermajuscul( minuscul).

    Ce se ntmpldactastai un caracter diferit de litera cerut?

    2.6. Programul citete dounumere ntregi i afieaznumerele citite i media lor geometricce are douzecimale.

    2.7. Programul citete valoarea unui unghi exprimatn grade, minute i secunde prin treinumere ntregi g, m, s i afieazvaloarea unghiului n radiani i valoarea funciei sinus deunghiul respectiv.

    Folosii funcia sin( x ).

    2.8. Programul citete un numr n de tip int i altul r de tip double i afieaz 0, dacr>n i -1 n caz contrar. Nu folosii instruciunea if.

    2.9. Programul citete un numr w i afieaz 2000, dac 1000 < = w < = 2000 i 1000n caz contrar. Nu folosii instruciunea if.

    2.10. Programul citete un numr ntreg din segmentul [1600;4900] care semnificun ancalendaristic i afieaz 1, dacanul e bisect i 0 n caz contrar. Nu folosii instruciunea if.

    Anul e bisect, dacse mparte frrest la 4 i nu se mparte la 100 sau, dacse mparte frrest la 400.

    2.11. Programul citete un numr ntreg din segmentul [1600;4900] ce semnificun ancalendaristic i afieazanul i numrul de zile din anul respectiv. Nu folosii instruciunea if.

    2.12. Programul citete un numr x, calculeaz 5x2 + 4.5x, 5x2 + 4.5x + 3.5 i (5x2 + 4.5x

    - 1.5) / (5x2

    + 4.5x + 1.5) i apoi afieazvalorile lui x i ale expresiilor respective.

    2.13. Programul citete un numr x, calculeazx15, x25, x35, x45i afieazrezultatele. Unelerezultate pot fi greite. Explicai de ce.

    2.14. Programul citete un numr x, afieaz x, [ x ] partea ntreag, { x } parteafracionari valorile expresiilor 8x2 - 2x + 4, 8[ x ]2 - 2[ x ] + 4, 8{ x }2 - 2{x} + 4.

    2.15. Programul citete un numr ntreg nenegativ i apoi afieaznumrul citit i rdcinaptratdin el.

    Folosii funcia sqrt( x ).

    17

  • 7/24/2019 Laborator de Programare in C

    16/87

    2.16. Programul citete un numr ntreg n i apoi afieazvaloarea fraciei (n - 1) / (n + 1)cu 13 semne zecimale.

    2.17. Programul citete dounumere i apoi l afieazpe cel mai mare.Folosii o expresie condiional.

    2.18. Programul citete dounumere i apoi afieazcel mai mare din modulele lor.Folosii o expresie condiionalcompus.

    2.19. Programul citete un numr x i apoi afieaz z = 4x2 + 9x - 2000, dac x < 0, z =2000, dac x = 0 i z = 4x2 - 2000, dac x > 0.

    Folosii oexpresie condiionalcompus.

    ntrebri de control:

    2.1. Ce este o expresie, un operand, un operator; ce operatori cunoatei?2.2. Ce este o expresie logic? Ce valori poate avea o expresie logici care este tipul lor?2.3. Explicai regula conversiilor implicite.2.4. Ce este o expresie cast? Explicai operatorul de conversie explicit.2.5. Explicai cum se utilizeazoperatorii sizeof i &.2.6. Explicai cum se utilizeazoperatorii condiionali ? i : .2.7. Ce specificatori de format se folosesc pentru a citi i a scrie date de tip caracter i iruri

    de caractere?2.8. Ce specificatori de format se folosesc pentru a citi i a scrie date ntregi?2.9. Ce specificatori de format se folosesc pentru a citi i a scrie date numerice flotante de

    precizie ordinar( tipul float )?2.10. Ce specificatori de format se folosesc pentru a citi i a scrie date numerice flotante de

    precizie dubl( tipul double )?2.11. Ce specificatori de format se folosesc pentru a citi i a scrie date numerice flotante de

    tipul long double?

    2.12. Ce tipau constantele: c, 3, 3.14, 3.14l, 3.14?2.13. Ce este prototipul unei funcii, unde i cum se folosete?2.14. n care fiier se aflprototipurile funciilor pow( x, y ), poly( x, n, c[ ] ), cos( x ),

    sqrt( x )?

    2.15. Care este diapazonul pentru valorile de tip: int, long, unsigned, long unsigned?

    2.16. Care este diapazonul pentru valorile de tip: float, double, long double?

    2.17. Care este diapazonul pentru valorile de tip: char, unsigned char?

    2.18. Cum se evalueazexpresia ( Pi < 2 )+3.4 i care este tipul valorii acestei expresii,

    dac Pi este de tipul float?2.19. Fie unsigned int x; long y; Cum se evalueazexpresia x + y?2.20. Fie char c; c=R + b - B; Care este tipul valorii calculate i ce va afia printf

    ( %d, c );?

    2.21. Fie int x = 2, y; y = x++; x = --y; Care este valoarea lui x?2.22. Fie const int x = 3.14, y = 2.72; x = y; Care sunt valorile lui x i y i ce tip au?2.23. Fie int x = 1; x = 5, x = 4, x = 3, x = 2; Care-i valoarea lui x?2.24. Fie int n = 1, m = 2, t = 3, z = 4; t = n/m; z = n%m; Care sunt valorile lui t i z?2.25. Explicai cum lucreazfunciile abs( ), ceil( ), floor( ). Utilizai help-ul.2.26. Construii n caiet un tabel cu prioritile tuturor operaiilor ( ( ), [ ], ., ->, + ( unar ),

    - ( unar ), ++, --, ( tip ), sizeof, ~, * ( binar ), /, %, + ( binar ), - ( binar ), , , ==, !=, & ( binar ), ^, |, &&, ||, ?, :, =, =, +=, -=, *=, /=, %=, &=, ^=,

    |=, , ).

    18

  • 7/24/2019 Laborator de Programare in C

    17/87

    2.27. Examinai ntrebrile testului test_02 [5] i selectai rspunsurile corecte la fiecarentrebare.

    19

  • 7/24/2019 Laborator de Programare in C

    18/87

    true falseexpr

    instruciune1

    true falseexpr

    instruciune1 instruciune2

    Lucrarea 3

    Tema: Instruciuni

    Scopul lucrrii: nsuirea instruciunilor limbajului

    Indicaii i sugestii de lucru:

    Instruciunea compus este un bloc de instruciuni cu formatul: { declaraii;instruciuni; }. La nceputul blocului prin declaraii se pot defini i iniializa date de diferitetipuri. Prin instruciuni se realizeazprelucrarea datelor.

    Instruciunea if este o instruciune de ramificare. Ea are douformate: incomplet i complet.Formatul incomplet este: if( expr ) instruciune1; Ea realizeazurmtoarea construcie deramificare:

    La ntlnirea acestei instruciuni se evalueazexpresia din paranteze. Dacexpresia arevaloarea true, adico valoare diferitde 0, atunci se execut instruciune1 i apoi se trece lainstruciunea imediat urmtoare dupinstruciunea if. n caz contrar se trece imediat lainstruciunea urmtoare.

    Formatul complet al instruciunii if este: if( expresie ) instruciune1; else instruciune2;Ea realizeazurmtoarea construcie de ramificare:

    20

  • 7/24/2019 Laborator de Programare in C

    19/87

    Aici se evalueazexpresia din paranteze i n caz de adevr se execut instruciune1, altfelse execut instruciune2. Dupaceasta se trece la instruciunea urmtoare dup if.Instruciunile instruciune1 i instruciune2 pot fi simple i compuse.

    Instruciunile if pot fi incluse una n alta.

    Instruciunea for este o instruciune de ciclu condiionat anterior i are formatul: for( e1;e2; e3 ) instruciune; Aici e1, e2, e3sunt expresii. e1 este expresia de iniializare a ciclului;e2 este expresia care determincondiia de repetare a ciclului; e3 este expresia de reiniializarea ciclului. Toate expresiile sunt poziionale i pot lipsi. instruciune este corpul ciclului i poatefi o instruciune simplsau compus. Corpul ciclului sunt acele instruciuni de prelucrare adatelor care trebuie repetate. Corpul ciclului poate lipsi. n acest caz ciclul constnumai din anteti instruciunea vid: for( e1; e2; e3 );

    Instruciunea for se executn felul urmtor: se efectueazoperaiile de iniializare aleciclului e1, apoi se evalueazexpresia e2. Dac e2 are o valoare diferitde 0, adicvaloarea

    adevr, atunci se execut instruciune, corpul ciclului. n caz contrar, atunci cnd e2 arevaloarea 0, adicvaloarea fals, se terminexecuia ciclului for i se trece la instruciuneaurmtoare dupciclu. Dupexecuia corpului, ciclul se reiniializeaz, se executoperaiiledefinite de e3 i se revine iari la verificarea condiiei de repetare a ciclului e2.

    Aadar, instruciunea for realizeazurmtoarea construcie ciclic:

    Instruciunea while este o instruciune de ciclu condiionat anterior i are formatul:while( e1 ) instruciune; antetul ciclului este while( e1 ) i conine n paranteze expresia e1care este condiia de repetare a ciclului. Corpul ciclului este instruciune i poate fi o

    21

    false

    e1

    e2

    e3

    corpul ciclului

    true

  • 7/24/2019 Laborator de Programare in C

    20/87

    instruciune simplsau compus. Ea conine acele operaii care trebuie repetate n ciclu. Corpulciclului poate lipsi. Ciclul se executastfel. Se evalueaz e1 i corpul ciclului se executdeattea ori de cte ori e1 are valoarea adevr. Deci, acest ciclu realizeazconstrucie ciclicurmtoare:

    Ciclul do-while este un ciclu condiionat posterior i are formatul:do instruciune while( e1 ); Aici instruciune este corpul ciclului i conine acele instruciunicare trebuie repetate n ciclu.

    Acest ciclu realizeazurmtoarea construcie ciclic:

    Instruciunea do-while se executn felul urmtor: mai nti se execut instruciune,adiccorpul ciclului, apoi se evalueazexpresia e1, care este condiia de repetare a ciclului.Dac e1 este adevr, atunci se repetexecuia corpului ciclului. n caz contrar, adicdac e1este 0, atunci se terminexecuia ciclului i se trece la instruciunea urmtoare dupciclu.

    22

    true

    e1

    false

    corpulciclului

    false

    corpulciclului

    true

    e1

  • 7/24/2019 Laborator de Programare in C

    21/87

    Instruciunea continue se folosete numai n corpul unui ciclu i are formatul: continue;Aceastinstruciune abandoneaziteraia curent( pasul curent ) a ciclului i trece la iteraiaurmtoare a lui.

    Instruciunea break se folosete numai n corpul unui ciclu sau n instruciunea switch.La ntlnirea instruciunii break n corpul unui ciclu se terminexecuia ciclului i se trece lainstruciunea urmtoare dupciclu. La ntlnirea instruciunii break n instruciunea switchse iese din instruciunea switch i se trece la instruciunea urmtoare dup switch.

    Instruciunea switch este o instruciune care realizeazo alternativdin mai multealternative posibile. Instruciunea are formatul:

    switch( expresie ) { case c1: ir1; break; case c2: ir2; break; case cn: irn; break; default: ir; }

    Aici c1, c2, , cn sunt constante de acelai tip ca i expresie din paranteze i definescalternativele instruciunii switch, iar ir1, ir2, ,irn i ir sunt iruri de instruciuni.Instruciunea switch se executn felul urmtor: se evalueaz expresie din paranteze ivaloarea acestei expresii se comparpe rnd cu valorile constantelor c1, c2, , cn. La primacoincidense executalternativa case respectiv, adicirul de instruciuni respectiv. Deexemplu, dacprima coincidenare loc la constanta c3, atunci se executalternativa case c3,adicirul de instruciuni ir3. Dupaceasta se executinstruciunea break, care urmeazdup ir3. Acest break terminexecuia lui switch, adicse trece la instruciunea urmtoaredup switch. Dacvaloarea expresiei din paranteze nu coincide nici cu o constant c1, c2, ,cn, atunci se executalternativa default, adicirul de instruciuni ir definit de instruciunea

    default. Instruciunea default poate lipsi. Atunci, dacvaloarea expresiei din paranteze nucoincide nici cu o constant c1, c2, , cn, instruciunea switch nu are nici un efect i setrece la instruciunea imediat urmtoare dup switch. Instruciunea default poate fi scrisoriunde printre alternativele instruciunii switch, nsn acest caz poate fi necesarprezenainstruciunii break dupirul de instruciuni ir. Instruciunile break nu sunt obligatorii. nacest caz, dupexecuia unei alternative se trece la execuia alternativei urmtoare .a.m.d. pnla ntlnirea unei instruciuni break, care va termina execuia instruciunii switch.Alternativele pot fi unite atunci cnd pentru diferite constante c1, c2, , cn se cere de executatacelai ir de instruciuni. De exemplu, dacse cere execuia aceluiai ir de instruciuni ir127pentru valorile c1, c2 i c7 ale expresiei din paranteze, atunci se scrie case c1: case c2: casec7: ir127; break;.

    Instruciunile case i default se folosesc numai n instruciunea switch ( veziinstruciunea switch).

    Instruciune goto este o instruciune de salt necondiionat. Ea are formatul goto nume;unde nume este numele unei etichete. Eticheta este un identificator ( un nume ) care se scrie nfaa unei instruciuni cu simbolul : dupel. De exemplu lab1: i++; Aici numele lab1 este oetichet. La ntlnirea instruciunii goto lab1; se trece imediat la execuia instruciunii cueticheta lab1 n fa, adicla instruciunea i++;

    Instruciunea return se folosete pentru a reveni dintr-o funcie. Ea are formatul return;sau return expresie; n primul caz funcia din care se revine nu ntoarce nici o valoare. Al doilea

    caz se folosete cnd funcia ntoarce o valoare i anume: expresie definete valoarea de revenire

    23

  • 7/24/2019 Laborator de Programare in C

    22/87

    a funciei. Tipul valorii pentru expresie trebuie scoincidcu tipul indicat n antetul funcieirespective pentru valoarea de revenire. Instruciunea return poate fi scrisn orice punct alcorpului unei funcii nsnu este obligatorie. n corpul aceleai funcii pot fi scrise mai multeinstruciuni return.

    Exemple de programe:

    Exemplul 3.1. Funcia calculeazcel mai mare divizor comun al dounumere ntregi frsemn.

    unsigned dc(unsigned a, unsigned b){ unsigned c, d=1; if (a==0||b==0) return a>b?a:b; else for(c=2; c

  • 7/24/2019 Laborator de Programare in C

    23/87

    while( x ) { p=p*x; scanf(%d, &x); } printf(p=%d, p); system("pause"); return 0; }

    Exemplul 3.5. Programul citete o cifri determindacnumrul format de aceastcifreste par sau impar.

    #include #include int main(void){ int n; system("cls"); printf("Introducei o cifr: "); while(3.14) { if (scanf("%d",&n)==1) break; system("cls");

    printf("\nN-ai introdus o cifr!\n"); printf("Introducei o cifr: "); fflush(stdin); } printf("\n\nAi introdus numrul "); switch(n) { case 0: case 2: case 4: case 6: case 8: printf("par %u", n); break; default: printf(" %d", n); break; case 1: case 3: case 5: case 7: case 9: printf("impar %u", n); } system("pause"); return 0; }

    Observai controlul corectitudinii introducerii unei cifre ( ciclul while, funcia fflush() ).

    Exemplul 3.6. Programul citete un ir de numere i determindacel formeazo progresiearitmetic.

    #include #include int main(void){ int n[100], d=1, i=0, j; system("cls"); printf("Introducei un ir numeric: "); while( scanf("%d",&n[i])==1 ) i++; for (j=--i; j>1; j--,i--)

    { if ( ( n[i] - n[i-1] ) != ( n[i-1] - n[i-2] ) ) d=0;} printf("\n\nirul introdus "); if( !d ) printf( "nu " ); printf( "formeazo progresie aritmetic." ); system("pause"); return 0; }

    Exemplul 3.7. Programul citete un ir de numere i l sorteazcresctor.

    #include #include int main(void){ double t, x[100]; int i=0, j=0, k;

    system("cls");

    25

  • 7/24/2019 Laborator de Programare in C

    24/87

    while( scanf( %lf, &x[i++] )==1 ); i-=2; printf( \nAi introdus irul:\n ); for( ; j

  • 7/24/2019 Laborator de Programare in C

    25/87

    3.5. Programul citete valorile a, b, cde tip long, rezolvecuaia ax2 + bx + c = 0 iafieazrezultatul.

    Examinai toate cazurile posibile pentru ecuaia ptrat, folosind n program o singurinstruciune if imbricat.

    3.6. Programul calculeazi afieazvalorile polinomului p = 3.3x2 + 7.7x - 10 pentrux = 1, 2, , 10.

    Folosii instruciunea while.

    3.7. Programul calculeazvalorile funciei sin( x ) pentru x din [ 0;360 ] ncepndcu x = 0 i pasul 1.

    Folosii instruciunea while. Funciile trigonometrice cer un argument de tipul double.

    3.8. Programul calculeazvalorile funciei sin( x ) pentru x din [ 0;360 ]ncepndcu x = 0 i pasul 1. Afieazpe ecran cte 23 valori, oprete i ateaptacionarea unei taste.

    Folosii instruciunea while.

    3.9. Programul citete un ir de numere ntregi separate prin caractere albe i afieazsuma lor. Numrul valorilor de citit este necunoscut, dupultimul numr se va tasta un caracteralb i un caracter ce nu este numeric.

    Folosii instruciunea while.

    3.10. Programul citete n ntreg frsemn, calculeazi afieaz n!( n factorial),dac 0

  • 7/24/2019 Laborator de Programare in C

    26/87

    Folosii instruciunea do-while, tipul doublei expresii cast.

    3.17. Programul citete un numr de tip long unsigned i stabilete dacacesta esteun numr prim sau nu.

    Folosii instruciunea for. Un numr natural se numete prim dacel n-are divizori diferiide 1 i el nsui.

    3.18. Programul citete trei numere a, b, c i afieazaria triunghiului cu laturile delungime a, b, c, dacel exist.

    n orice triunghi suma lungimilor a doulaturi este mai mare ca lungimea celei de-a treialaturi.

    3.19. Programul citete trei numere de tip unsigned i afieazcel mai mare divizorcomun al lor.

    3.20. Programul citete un numr ntreg din segmentul [ 1; 7 ]i afieazdenumireazilei din sptmnce corespunde acestei cifre ( 1 - luni, 2 mari, ..., 7 duminic).

    Folosii instruciunea switch.

    3.21. Programul citete construcii op1 op op2 , unde op1 i op2 sunt numere,iar op este un caracter ce reprezintun operator aritmetic ( +, -, *sau /) i afieazvaloareaexpresiei respective.

    Folosii instruciunea switch.

    3.22. Scriei o funcie care are doi parametri x i n, calculeazi revine cu valoareaxn fra folosi funcia pow( x, n ). Aici n este de tip int, iar x este de tip long double.

    3.23. Programul calculeazi afieazvalorile funciei xs pentru s de tip int dinsegmentul [ m; n ] cu pasul 1 i x de tip long double.

    Includei n program cu directiva #include funcia din sarcina precedent.

    3.24. Programul citete un ir de numere i determindacel formeazo progresiegeometric.

    Mai nti ordonai irul n ordine cresctoare sau descresctoare.

    3.25. Programul citete un ir de numere i determindacel este ordonat cresctorsau descresctor.

    ntrebri de control:3.1. Ce este o instruciune?3.2. Unde i cum se folosete instruciunea vid?3.3. Ce este o instruciune compus? Dai exemple.3.4. Care sunt formatele instruciunii if? Explicai cum lucreaz, dai exemple de instruciuni

    if imbricate.3.5. Ce este un ciclu condiionat anterior? Care instruciuni realizeazun aa ciclu?3.6. Ce este un ciclu condiionat posterior? Care instruciuni realizeazun aa ciclu?3.7. Care este formatul ciclului for, care este antetul i corpul ciclului? Explicai cum

    lucreazciclul for.3.8. Care este formatul ciclului while, care este antetul i corpul ciclului? Explicai cum

    lucreazciclul while.

    28

  • 7/24/2019 Laborator de Programare in C

    27/87

    3.9. Care este formatul ciclului do-while, care este corpul ciclului? Explicai cum lucreazciclul do-while.

    3.10. Care este deosebirea dintre ciclurile for,while i do-while?3.11. Care este formatul instruciunii switch? Explicai cum lucreazaceastinstruciune.3.12. Unde i cum se folosesc instruciunile continue i break?

    3.13. Unde i cum se folosesc instruciunile case i default?3.14. Unde poate fi scriso declaraie n program?3.15. De cte ori se vor executa ciclurile: for( ; ; ); for( ; ; ) continue;

    for( ; ; ) break;? Explicai.

    3.16. De cte ori se vor executa ciclurile: while( 3.14 ); while( 0 );while( -1 ) continue; while( 0 ) continue; while( 1 ) break;? Explicai.

    3.17. De cte ori se vor executa ciclurile: do { ; } while( 3.14 );do { continue; } while( -1 ); do { break; } while( 0 ); do { continue; }

    while( 0 ); do { break; } while( 1 ); Explicai.

    3.18. Fie char h; h=getch( ); puts( Ai introdus ); switch( h )

    {default: puts( greit ); case 1: printf( %d\n, 1 );

    case 2: printf( %d\n, 2 );

    case 3: printf( %d\n, 3 );

    case 4: printf( %d\n, 4 );

    }

    Ce se va extrage la ecran? Explicai.

    3.19. Fie int x; do { clrscr( ); puts( Introdu un numr ntreg! ) } while( !scanf( %d,&x ) ); De cte ori se va executa ciclul? Explicai.

    3.20. Fie float x, y, z; do { clrscr( ); puts( Introdu trei numere! ) } while( !(scanf( %f

    %f %f, &x, &y, &z) == 3 ) ); De cte ori se va executa ciclul? Explicai.

    3.21. Fie int a,b; printf( Introdu a i b ntregi: ); for( ; scanf( %d %d, &a, &b) != 2 ; ){ clrscr( ); printf( Introducere greit. Repetai!\n ); printf( Introdu a i b ntregi: );}. Decte ori se va executa ciclul? Explicai.

    3.22. Fie long double w; printf( \nw = ); while( scanf( %Lf, &w) != 1)

    { clrscr( ); printf( Greit! Repetai introducerea.\n ); printf( \nw = ); }. De cte ori se va

    executa ciclul? Explicai.

    3.23. Unde i cum se folosete instruciunea return? Dai exemple.

    3.24. Examinai ntrebrile testului test_03 [5] i selectai rspunsurile corecte la fiecarentrebare.

    29

  • 7/24/2019 Laborator de Programare in C

    28/87

    Lucrarea 4

    Tema: Pointeri

    Scopul lucrrii: Utilizarea pointerilor la prelucrarea datelor

    Indicaii i sugestii de lucru:

    Un pointer este o variabilvalorile creia sunt adrese de memorie. Pe adresele-valori ale unuipointer se pot pstra date de un anumit tip. Acest tip se indicn declaraia variabilei de tippointer i se numete tipul de bazal pointerului sau tipul spre care pointeazpointerul.

    Declaraia de pointer are formatul tip *nume, unde nume este numele pentru pointerulcare se declar, iar tip este un tip de date care aratce tip de date se vor pstra pe adresele-valori ale pointerului. De exemplu: int x; int *p; Aici x este o variabilsimplde tip int, iar peste un pointer ce pointeazspre tipul int, adicpe adresele-valori ale pointerului p se vorpstra date de tip int. Deci int * este tipul pointer spre tipul int sau care pointeazspre tipulint. La fel char *, float *, double *, long *, int **, long double *** etc. sunt respectiv tipul

    pointer spre char, float, double, long int, int *, long double **. Se pot declara i tablouri depointeri: char *s[ 234 ]; unsigned *r[ 25 ][ 25 ]; etc.

    Alocarea memoriei pentru pointeri. Unui pointer i se aloca, de obicei, un cuvnt alcalculatorului ( adic2 octei, n presupunerea clungimea cuvntului calculator este de 2octei). nsmodificatorii near, far, huge pentru tipul pointer modificmodul de alocare apointerilor n memorie. Modificatorii far i huge aloc2 cuvinte, adic4 octei de memoriepentru pointeri, iar near sau lipsa oricrui modificator semnific, de obicei, alocarea pointerului

    pe un cuvnt, adicpe 2 octei de memorie.

    Atribuirea de valori pentru pointeri se face cu operatorul adres &: int x=10; int *p;p=&x; Aici variabila simpl x de tip int se iniializeazcu valoarea 10, peste un pointer spreint i lui i se atribuie ca valoare adresa variabilei x. La declaraie pointerii se pot iniializa:float w; float *y=&w; sau char *ps=Cibernetica; Aici ps este un pointer de tipul char * ilui i se atribuie ca valoare adresa de nceput a irului de caractere Cibernetica, adicadresaprimului caracter din ir.

    Pointeri de tipul void * ( se mai numesc pointeri frtip sau pointeri generici ). Se potdeclara pointeri generici, adicpointeri la care nu se indictipul de baz. n acest caz nu se tien prealabil tipul datelor ce se vor pstra pe adresele-valori ale pointerului. De exemplu: int x;

    float y; double z; void *p; La atribuirea sau citirea datelor de pe adresele-valori ale unui pointerde tip void * trebuie explicit indicat tipul datelor respective.

    Accesul la date prin pointeri se face cu operatorul *. Dac p este un pointer, atunci *peste data stocatpe adresa-valoare a lui p. De exemplu, fie int x = 10, *p; i p = &x; Atuncip este un pointer spre int i are ca valoare adresa lui x, iar *p este chiar valoarea 10 a luix. Atribuirea *p = 20; scrie pe adresa alocatpentru x valoarea 20, adiceste echivalentcuatribuirea x = 20; De asemenea, dacavem float r, *q; q = &r; *q = 3.141593; atunci lui r ise atribuie valoarea 3.141593. La utilizarea unui pointer de tip void * se precizeaztipul dateide pe adresa-valoare a pointerului. Fie float x = 2.82; void *r; i r = &x; Atunci expresia *reste greit, deoarece n declaraia pointerului r nu s-a indicat tipul de baz. Corect trebuie scris

    *( float * )r. La fel expresia *r + 7.18; este greit. Corect este *( float * )r + 7.18;

    30

  • 7/24/2019 Laborator de Programare in C

    29/87

    Pentru a extrage valoarea unui pointer se folosete litera p n specificatorul de formatrespectiv. De exemplu, dacavem int x = 1, *px = &x; double z = 3.14, *pz = &z; atunciprintf( %p %d %p %lf, px, *px, pz, *pz); va extrage la ecran adresele i valorile pentru x iz. Adresa se extrage n hexazecimal.

    Operaii cu pointeri. Asupra pointerilor se pot aplica diferite operaii: incrementarea,decrementarea, adunarea la un pointer a unui numr ntreg, scderea dintr-un pointer a unuinumr ntreg, compararea pointerilor, scderea a doi pointeri.

    Operatorii de incrementare ( ++ ) i decrementare ( -- )pentru pointeri. Operatorul ++ ( --)aplicat la un pointer mrete ( micoreaz) adresa-valoare a pointerului cu numrul de octeinecesari pentru a pstra o valoare de tipul spre care pointeazpointerul. De exemplu, dacavemint *p;, atunci ++p ca i p++ mrete valoarea lui p cu 2 octei, deoarece o valoare de tipulint este alocatpe 2 octei. Analogic, dacavem double *w;, atunci w++ ca i ++w mretevaloarea lui w cu 8, deoarece tipul double cere 8 octei.

    Adunarea ( scderea) unui numr ntreg pozitiv la un ( dintr-un ) pointer. Fie p un

    pointer. Atunci p + n ( p - n) mrete ( micoreaz) valoarea pointerului p cu n * r octei,unde r este numrul de octei necesari pentru datele de tipul spre care pointeazpointerul p.De exemplu, dacavem char *c; float *f; long double *w; i unsigned n = 5;, atunci c + n,f + n, w + n; vor mri adresele-valori ale pointerilor c, f, w cu 5 * 1, 5 * 4 i 5 * 10 octeirespectiv, deoarece tipul char cere 1 octet, tipul float cere 4 octei i tipul long double cere10 octei.

    Compararea pointerilor este folositde obicei pentru pointerii care pointeazspreelementele aceluiai tablou. Fie p este un pointer ce pointeazspre elementul tab[ i ] altabloului tab ( adicvaloarea lui p este &tab[ i ] ) iar q este un pointer ce pointeazspreelementul tab[ j ] al aceluiai tablou tab ( adicvaloarea lui q este &tab[ j ] ). Atunci lapointerii p i q se pot aplica toi operatorii de relaie i egalitate. Astfel expresia p < q arevaloarea adevr atunci i numai atunci, cnd i < j. Un pointer poate fi comparat cu un pointernul, care are valoarea 0 i nu reprezintnici o adres. Pentru pointerul nul n estedefinito constantspecialcu numele NULL.

    Diferena a doi pointeri este folositde obicei pentru pointeri ce pointeazspre elementeleaceluiai tablou. Fie p i q doi pointeri ce pointeazspre elementele tab[ i ] i tab[ i + n ]respectiv, unde n este un numr ntreg pozitiv, atunci diferena q - p este chiar numrul n. Larndul su diferena p - q va avea valoarea n.

    Legtura dintre pointeri i tablouri. Fie tab[ n ] un tablou unidimensional cu n elemente.Atunci numele tab este un pointer care are ca valoare adresa primului element al tabloului,

    adicare valoarea &tab[ 0 ]. Deci tab + 1 este adresa elementului cu indicele 1, adic&tab[ 1 ], tab + 2 este adresa elementului cu indicele 2, adic &tab[ 2 ] .a.m.d. Respectiv*( tab + 0 ), adic *tab este elementul tab[ 0 ], *( tab + 1 ) este elementul tab[ 1 ], *( tab + 2 )este elementul tab[ 2 ] .a.m.d.

    n general, dac p este un pointer nenul, iar n un numr ntreg nenegativ, atuncip[ n ]=*( p + n ), iar &p[ n ] = p + n.

    Fie acum tab[ m ][ n ] un tablou bidimensional cu m linii i n coloane. Atunci tab[ 0 ]este un pointer care are ca valoare adresa de nceput a liniei 0 a tabloului tab[ m ][ n ], adic&tab[ 0 ][ 0 ], tab[ 1 ] este un pointer care are ca valoare adresa de nceput a liniei 1 a tablouluitab[ m ][ n ], adic &tab[ 1 ][ 0 ] .a.m.d. Deci tab[ 0 ], tab[ 1 ], tab[ 2 ], , tab[ m ] este untablou de pointeri. La rndul su, numele tab al tabloului tab[ m ][ n ] este un pointer cepointeazspre irul de pointeri tab[ 0 ], tab[ 1 ], , adicpointerul tab are ca valoare adresapointerului tab[ 0 ]. Din toate acestea rezultcexpresiile &tab[ i ][ j ], tab[ i ] + j,

    31

  • 7/24/2019 Laborator de Programare in C

    30/87

    *tab + i * n + j sunt echivalente. La fel expresiile tab[ i ][ j ], *( tab[ i ] + j ), *( *tab + i * n + j )

    sunt echivalente. Deci **tab este nu altceva dect elementul tab[ 0 ][ 0 ].

    Exemple de programe:

    Exemplul 4.1. Programul determincel mai mare numr dintr-un ir numeric.

    #include #include void main(){ int x[50] = { 1, 2, 3, 4, 5 }, *px, i, r, t; system("cls"); px=x; r=*px; for( i=0; i

  • 7/24/2019 Laborator de Programare in C

    31/87

    #include #include #include void main(){ char sir[256] = "Asem CSIE", c, i = -1; system("cls");

    c=*sir; for( ; ++i < strlen(sir) ; ) { if (c < *(sir+i) ) c = *(sir+i); } puts("Caracterul de cod maxim n irul"); printf("%s\neste %c", sir, c); system("pause"); return 0; }

    Exemplul 4.5. Programul ordoneazdescresctor un ir numeric ( vezi i exemplele 4.6,4.7 ).

    #include #include

    void main(){ short i, j, t, n = 12; double x[234] = { 2, 5, 6, 4, 2, 1, 7, 8, 2, 5, 4, 55}; system("cls"); puts("irul iniial:\n"); for( i=0; i

  • 7/24/2019 Laborator de Programare in C

    32/87

    int n=28, i, j, t; system("cls"); puts("irul iniial:\n"); puts(x); for( i=0; i

  • 7/24/2019 Laborator de Programare in C

    33/87

    mai mic numr, suma numerelor, produsul numerelor, media aritmeticcu 2 cifre zecimale,media geometriccu 3 cifre zecimale.

    4.2. Programul determincel mai mic numr dintre elementele de indice par ( 0, 2, )ale unui ir numeric.

    4.3. Programul schimbcu locul elementele de indice par cu elementele de indice imparale unui ir de caractere ( elementul cu indicele 0 se schimbcu locul cu elementul cu indicele 1,elementul cu indicele 2 se schimbcu locul cu elementul cu indicele 3 .a.m.d. ).

    4.4. Programul calculeazprodusul elementelor de indice impar ( 1, 3, ) ale unui irnumeric.

    4.5. Programul determinntr-un ir de caractere elementul care printre elementele decod par are codul minim.

    4.6. Programul schimbcu locul ntr-un ir numeric elementul maximal cu elementulminimal.

    4.7. Programul calculeazprodusul scalar p a doi vectori x , y(p = x1y1 + x2y2 + + xnyn) fra folosi tablouri.

    4.8. Programul calculeazelementele vectorului y = ( y1, y2, , ym ) care esteprodusul matricei A de ordin mx n cu elementele aij,i = 1, 2, 3, , m, j = 1, 2, 3, , n cu

    vectorul-coloan x = (x1, x2, , xn) ( yi = ai1x1 + ai2x2 + + ainxn, i = 1, 2, 3, , m ).

    4.9. Programul calculeazelementele matricei C de ordin mx n cu elementele cij, i= 1, 2, 3, , m, j = 1, 2, 3, , n care este produsul matricelor A de ordin mx p cu

    elementele aik, i = 1, 2, 3, , m, k = 1, 2, 3, , p i B de ordin px n cu elementelebkj, k =1, 2, 3, , p, j = 1, 2, 3, , n ( cij = ai1b1j + ai2b2j + ai3b3j + + aipbpj, i = 1, 2, 3, , m,

    j = 1, 2, 3, , n ).

    4.10. Programul formeazi extrage la ecran toate cuvintele ( cu sens ! ), care pot fiformate din literele cuvntului FARMACIA ( AC, AR, CAMARA etc. ). Formai cuvintele prinextragerea literelor necesare cu ajutorul pointerilor.

    ntrebri de control:

    4.1. Ce este un pointer?4.2. Ctmemorie se alocpentru o variabilde tip pointer?4.3. Cum se extrage la ecran valoarea unui pointer?

    4.4. Care este legtura dintre pointeri i operatorul &?4.5. Care este legtura dintre pointeri i operatorul *?4.6. Fie char tab[ 256 ]; int vec[ 33 ]; float mat[ 4 ][ 3 ]; double

    cub[ 2 ][ 3 ][ 4 ]; Ce reprezintnumele tab, vec, mat, cub, mat[ 2 ], cub[ 1 ], cub[ 2 ][ 3 ]?4.7. Ce este un pointer near, far, huge, care este deosebirea dintre ei, cum se alocn

    memorie?4.8. Ce este un pointer nul, ce reprezintconstanta NULL i unde este definit?4.9. Ctmemorie se alocpentru pointerii: int near *px; float far *py; double huge *pz;

    char *pa; long huge *pd; long double *pw;?

    4.10. Fie char a = a, *pa; int x = 10, *px; float y = 2.8, *py; double z = 12345.54321,

    *pz; long double w = 123456789.987654321, *pw; pa = &a; px = &x; py = &y; pz = &z;

    pw = &w; Ce va afia printf( %c\t%d\t%f\t%lf\t%Lf\n, *pa, *px, *py, *pz, *pw);?

    35

  • 7/24/2019 Laborator de Programare in C

    34/87

    4.11. Fie char a, *pa = &a; int x, *px = &x; float q, *pq = &q; double r, *pr = &r;

    long double w, *pw = *w; scanf( %c %d %f %lf %Lf, pa, px, pq, pr, pw ); Ce trebuie sintroducem de la tastaturpentru acest scanf( ) i ce va afiaprintf( %c\t%d\t%f\t%lf\t%Lf\n, *pa, *px, *pq, *pr, *pw );?

    4.12. Fie int x = 2007, *p = &x, **q = &p, ***w = &q; Ce va afiaprintf( %d %d %d %d, x, *p, **q, ***w );?

    4.13. Fie char s[ 22 ] = 0, 1, 2, 3, 4, 5 , *ps = s; int x[ 22 ] = { 0, 1, 2, 3, 4, 5 },*px = x; float y[ 22 ] = { 0, 1, 2, 3, 4, 5 }, *py = y; double z[ 22 ] = { 0, 1, 2, 3, 4, 5 }, *pz = z;

    long double w[ 22 ] = { 0, 1, 2, 3, 4, 5 }, *pw = w; Ce va afia printf( %c %d %f %lf %Lf,*(ps+1), *(px+2), *(py+3), *(pz+4), *(pw+5) );?

    4.14. Fie short i[ 22 ] = { 0, 1, 2, 3, 4, 5 }, *pi = i; Ce va afiaprintf( %d %d %d %d %d %d, *pi, *pi++, *pi++, *pi++, *pi++, *pi++ );?

    4.15. Fie int i[ 22 ] = { 0, 1, 2, 3, 4, 5 }, *pi = i; Ce va afiaprintf( %d %d %d %d %d %d, *pi, *++pi, *++pi, *++pi, *++pi, *++pi );?

    4.16. Fie float i[ 22 ]={ 0, 1, 2, 3, 4, 5 }, *pi = i + 5; Ce va afia printf( %f %f %f %f %f%f, *pi, *pi--, *pi--, *pi--, *pi--, *pi-- );?

    4.17. Fie double i[ 22 ] = { 0, 1, 2, 3, 4, 5}, *pi = i + 5; Ce va afiaprintf( %lf %lf %lf %lf %lf %lf, *pi, *--pi, *--pi, *--pi, *--pi, *--pi);?

    4.18. Examinai ntrebrile testului test_04 [5] i selectai rspunsurile corecte la fiecarentrebare.

    36

  • 7/24/2019 Laborator de Programare in C

    35/87

    Lucrarea 5

    Tema: Funcii de prelucrare a irurilor de caractere

    Scopul lucrrii: Utilizarea pointerilor i a funciilor standard la prelucrarea irurilor decaractere

    Indicaii i sugestii de lucru:

    n sarcinile ce urmeazprin text se nelege o succesiune din cel mult 100 cuvinte. Fiecarecuvnt este format din cel mult 30 caractere care nu sunt caractere albe. La ordonarea textelorschimbai cu locul pointerii spre cuvintele textului i nu cuvintele.

    Un an calendaristic este bisect, dacel se mparte frrest la 4 i nu se mparte la 100, sau,dacse mparte frrest la 400.

    Existo mulime de funcii de prelucrare a irurilor de caractere. De obicei aceste funciistandard au prototipul n fiierul i numele lor ncepe cu str.

    Funcia strcmp( ) are prototipul int strcmp( const char *s1, const char *s2 ); Eacomparirurile de caractere c1 i c2 spre care pointeazpointerii s1 i s2 respectiv.Funcia returneazo valoare pozitivdac c1 > c2, valoarea 0, dac c1 = c2, i o valoarenegativ, dac c1 < c2. ( Vezi definiia operatorilor de relaie: etc. pentru iruri ).

    Funcia stricmp( ) are prototipul int stricmp( const char *s1, const char *s2 ); Eacomparirurile de caractere c1 i c2 spre care pointeazpointerii s1 i s2 respectiv, fraface deosebire ntre majuscule i minuscule. Funcia returneazo valoare pozitivdac c1 > c2,

    valoarea 0, dac c1 = c2, i o valoare negativ, dac c1 < c2.

    Funcia strncmp( ) are prototipul int strncmp( const char *s1, const char *s2, unsignedn ); Ea comparprimele cel mult n caractere ale irurilor c1 i c2 spre care pointeazpointerii s1 i s2 respectiv. Funcia returneazo valoare pozitiv, dac c1 > c2, valoarea 0,dac c1 = c2, i o valoare negativ, dac c1 < c2.

    Funcia strnicmp( ) are prototipul int strnicmp( const char *s1, const char *s2,unsigned n ); Ea comparprimele cel mult n caractere ale irurilor c1 i c2 spre carepointeazpointerii s1 i s2 respectiv, fra face deosebire ntre majuscule i minuscule.Funcia returneazo valoare pozitiv, dac c1 > c2, valoarea 0, dac c1 = c2, i o valoarenegativ, dac c1 < c2.

    Funcia strlen( ) are prototipul unsigned strlen( const char *s ); Ea returneaznumrulde caractere ale irului de caractere c spre care pointeazpointerul s. Caracterul NUL de lasfritul irului c nu se ia n considerare.

    Funcia strcpy( ) are prototipul char *strcpy( char *d, const char *s ); Ea copiazconinutul irului spre care pointeazpointerul s n irul spre care pointeazpointerul d. Secopiazi caracterul \0. Funcia returneazvaloarea pointerului d.

    Funcia strncpy( ) are prototipul char *strncpy( char *d, const char *s, unsigned n ); Eacopiazprimele cel mult n caractere din coninutul irului spre care pointeazpointerul s nirul spre care pointeazpointerul d. Funcia returneazvaloarea pointerului d.

    37

  • 7/24/2019 Laborator de Programare in C

    36/87

    Funcia strcat( ) are prototipul char *strcat( char *d, const char *s ); Ea concateneazirurile spre care pointeazpointerii d i s: copiazconinutul irului spre care pointeazpointerul s n continuare dupultimul caracter al irului spre care pointeazpointerul d. Secopiazi caracterul \0. Funcia returneazvaloarea pointerului d.

    Funcia strncat( ) are prototipul char *strncat( char *d, const char *s, unsigned n ); Eaconcateneazla sfritul irului spre care pointeazpointerii d cel mult primele n caractere dinirul spre care pointeazpointerul s: copiazprimele cel mult n caractere dinconinutul iruluispre care pointeazpointerul s n continuare dupultimul caracter al irului spre carepointeazpointerul d. Funcia returneazvaloarea pointerului d.

    Funcia strchr( ) are prototipul char *strchr( const char *s, int c ); Ea cautprimaintrare a caracterului c n irul spre care pointeazpointerul s. Funcia returneazpointerulspre prima apariie a caracterului c n irul respectiv sau pointerul nul.

    Funcia strstr( ) are prototipul char *strstr( const char *s1, const char *s2 ); Ea cautprima intrare a irului c2 spre care pointeazpointerul s2 n irul c1 spre care pointeaz

    pointerul s1. Funcia returneazpointerul spre prima apariie a irului c2 n irul c1 saupointerul NULL.

    Funcia malloc( ) are prototipul void *malloc( unsigned n ); n . Ea alocnmemoria heap o zoncontinude n octei i returneazun pointer de tip void * care este adresade nceput a zonei alocate. Funcia returneazpointerul nul dacnu s-a alocat memorie. ( vezi ifunciile calloc( ), farmalloc( ), farcalloc( ) ).

    Funcia free( ) are prototipul void free( void *p ); n fiierul . Ea elibereazmemoria heap spre care indicpointerul p. ( Mai vezi funcia void farfree( void far *p ). )

    Exemple de programe:

    Exemplul 5.1. Funcia examineazun text din trei cuvinte i returneazpointerul spre celmai mare cuvnt.

    char *bw( char *c1, char *c2, char *c3 ){ char *p; p=( strcmp( c1, c2 ) > 0 ) ? c1 : c2; return ( strcmp( p, c3 ) > 0 ) ? p : c3; }

    Exemplul 5.2. Programul citete un text din patru cuvinte i afieazcuvntul cel mai mare.n program e folositfuncia din exemplul precedent care a fost salvatn fiieruld:\mydir\ex5_1.c.

    #include #include #include #include d:\mydir\ex5_1.cint main(void){ char c1[30], c2[30], c3[30], c4[30], *q; system("cls"); printf(Introdu un text din patru cuvinte: ); scanf(%s %s %s %s, c1, c2, c3, c4); printf(\nAi introdus textul:\n\n); printf(%s %s %s %s\n\n, c1, c2, c3, c4);

    38

  • 7/24/2019 Laborator de Programare in C

    37/87

    q=bw( c1, c2, c3 ); q=( strcmp( q, c4 ) > 0 ) ? q : c4; printf(Cel mai mare cuvnt este: ); puts( q ); system("pause"); return 0; }

    Exemplul 5.3. Funcia examineazun text din trei cuvinte i returneazpointerul spre celmai scurt cuvnt.

    char *sw( char *w1, char *w2, char *w3 ){ char *p; p=( strlen( w1 ) < strlen( w2 ) ) ? w1 : w2; return ( strlen( p ) < strlen( w3 ) ) ? p : w3; }

    Exemplul 5.4. Programul citete un text din cinci cuvinte i afieazcuvntul cel mai scurt.n program e folositfuncia din exemplul precedent care a fost salvatn fiieruld:\mydir\ex5_3.c.

    #include #include #include #include d:\mydir\ex5_3.cint main(void){ char z1[30], z2[30], z3[30], z4[30], z5[30], *w; system("cls"); printf(Introdu un text din cinci cuvinte: ); scanf( %s %s %s %s %s, z1, z2, z3, z4, z5 ); printf(\nAi introdus textul:\n\n); printf( %s %s %s %s %s\n\n, z1, z2, z3, z4, z5 ); w=sw( z1, z2, z3 );

    w=sw( w, z4, z5 ); printf(Cel mai scurt cuvnt este: ); puts( w ); system("pause"); return 0; }

    Exemplul 5.5. Funcia scrie un cuvnt n memoria heap. Ea returneazadresa de nceput azonei de memorie unde s-a pstrat cuvntul sau pointerul nul dacnu s-a alocat memorie.

    char *wh( char *w ){ char *p; p=( char * )malloc( strlen( w ) + 1 ); if( p ) strcpy( p, w ); return p; }

    Exemplul 5.6. Funcia sorteazn ordine descresctoare cuvintele unui text.

    void sd( char *wp[ ], unsigned n ){ char *t, i=0, j; while( i < n - 1 ) { j = i + 1; t = wp[ i ]; while( j < n ) { if( strcmp( t, wp[ j ] ) < 0 ) { t = wp[ j ]; wp[ j ] = wp[ i ]; wp[ i ] = t; } j++; } i++; } }

    39

  • 7/24/2019 Laborator de Programare in C

    38/87

    Exemplul 5.7. Funcia sorteazun text n ordinea cresctoare a lungimilor cuvintelor.

    void ld( char *wp[ ], unsigned n ){ char *t, i=0, j, d, r; while( i < n - 1 ) { j = i + 1; t = wp[ i ]; d = strlen( wp[ i ] );

    while( j < n ) { r = strlen( wp[ j ] ); if( r < d ) { d = r; t = wp[ j ];

    wp[ j ] = wp[ i ]; wp[ i ] = t; } j++; } i++; } }

    Exemplul 5.8. Funcia are ca parametru numrul unei luni din an i returneazpointerulspre denumirea lunii respective. Se presupune cnumrul lunii este corect.

    char *dl( unsigned nl ){ static char *mn[ 13 ] =

    {,Ianuarie, Februarie, Martie, Aprilie, Mai, Iunie, Iulie, August, Septembrie, Octombrie, Noiembrie, Decembrie}; return mn[ nl ]; }

    Exemplul 5.9. Funcia are ca parametru denumirea unei luni din an i returneaznumrullunii respective. Se presupune cdenumirea lunii este corect.

    unsigned nl( char *dl ){ static char *mn[ 13 ] =

    {,Ianuarie, Februarie, Martie,

    Aprilie, Mai, Iunie, Iulie, August, Septembrie, Octombrie, Noiembrie, Decembrie}; unsigned n; for( n=1; n 2 ) d += ( ( a%4 == 0) && ( a % 100 ) || ( a % 400 == 0 ) );

    return d;}

    40

  • 7/24/2019 Laborator de Programare in C

    39/87

    Exemplul 5.11. Funcia determindata calendaristicdupnumrul anului ( cu 4 cifre ) inumrul zilei din acest an.

    void daz( unsigned an, unsigned zi, int *d, char l[ ] ){ static char *dl[ ] =

    { , Ianuarie, Februarie, Martie, Aprilie, Mai, Iunie, Iulie, August, Septembrie, Octombrie, Noiembrie, Decembrie }; static unsigned nz[ ] =

    { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; unsigned nl = 0, s = 0; nz[ 2 ] += ( ( an % 4 == 0 ) && ( an % 100 ) || ( an % 400 == 0 ) ); while( s < zi ) s += nz[ ++nl ]; s -= nz[ nl ]; *d = zi - s; strcpy( l, dl[ nl ]); }

    Exemplul 5.12. Funcia determindenumirea zilei din sptmndupdata calendaristicdd luna yyyy. Se presupune cdata este corect, luna este denumirea lunii i anul yyyy esteexprimat prin 4 cifre. Se folosete funcia nz( ) din exemplul 5.10 care a fost salvatnd:\mydir\ex5_10.c.

    char *ziua( unsigned dd, char luna[ ], unsigned yyyy ){ unsigned b=0, d1, d2, a1, a2; char m1[30], m2[30]; unsigned nd1, nd2, nd1nd2, i, r, bi;

    /* Fie cunoscutdenumirea zilei pentru o dat reper, de exemplu 16 Noiembrie 1999 Mari */

    d1 = dd, strcpy( m1, luna ), a1 = yyyy, d2 = 16, strcpy( m2, "Noiembrie" ) , a2 = 1999; nd1 = nz( d1, m1, a1 ); nd2 = nz( d2, m2, a2 );

    if( yyyy < 1999 ) { if( a2 - a1 == 1 )

    { b = ( a1%4 == 0 ) && ( a1 % 100 ) || ( a1 % 400 == 0 ); nd1nd2 = nd2 + 365 + b - nd1; } else { for( b=0, i=a1; i 1999 ) { d2 = dd, strcpy( m2, luna ), a2 = yyyy, d1 = 16, strcpy( m1, "Noiembrie" ) , a1 = 1999; nd1 = nz( d1, m1, a1 ); nd2 = nz( d2, m2, a2 ); if( a2 - a1 == 1 )

    { b = ( a1 % 4 == 0) && ( a1 % 100 ) || ( a1 % 400 == 0 ); nd1nd2 = nd2 + 365 + b - nd1; } else { for( b = 0, i = a1; i < a2; i++ )

    b += ( i % 4 == 0 ) && ( i % 100 ) || ( i% 400 == 0 );

    bi = ( a1 % 4 == 0 ) && ( a1 % 100 ) || ( a1 % 400 == 0 );

    41

  • 7/24/2019 Laborator de Programare in C

    40/87

    nd1nd2 = 365 * ( a2 - a1 1 ) + b + nd2 +365 + bi - nd1; }

    r = nd1nd2 % 7; return zile[ r ]; }

    if( ( yyyy == 1999 ) && ( nd1 > nd2 ) ) { d2 = dd; strcpy( m2, luna ); a2 = yyyy;

    d1 = 16, strcpy( m1, "Noiembrie" ) , a1 = 1999; nd1 = nz( d1, m1, a1 ); nd2 = nz( d2, m2, a2 ); printf( "nd1 = %u nd2 = %u\n", nd1, nd2 ); system("pause"); nd1nd2 = nd2 - nd1; r = nd1nd2 % 7; return zile[ r ]; } else { nd1nd2 = nd2 - nd1; r = nd1nd2 % 7;

    return eliz[ r ]; } }

    Exemplul 5.13. Programul citete o datcalendaristic dd luna yyyy i determindenumirea zilei din sptmndupdata calendaristiccitit. Aici numrul dd este ziua, lunaeste denumirea lunii i numrul yyyy este anul exprimat cu 4 cifre pentru data respectiv. Sepresupune cdata calendaristiccititeste corect. n program se folosesc funciile dinexemplele 5.10 i 5.12 salvate n fiierele d:\mydir\ex5_10.c i d:\mydir\ex5_12.c

    respectiv.

    #include #include #include

    unsigned zl[ ] ={ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

    char *dl[ ] ={ "", "Ianuarie", "Februarie", "Martie",

    "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie" };

    char *zile[ ] ={ "Mari", "Miercuri", "Joi", "Vineri",

    "Smbt", "Duminic", "Luni" };char *eliz[ ] =

    { "Mari", "Luni", "Duminic", "Smbt", "Vineri", "Joi", "Miercuri" };

    #include "d:\mydir\ex5_10.c"#include "d:\mydir\ex5_12.c"

    int main(void){ unsigned d, y; char luna[30], *p; system("cls"); printf("Introdu o datcalendaristic dd luna yyyy: "); scanf("%2d %s %4d", &d, luna, &y); printf("\nAti introdus data: %2d %s %4d\n\n", d, luna, y); p=ziua( d, luna, y); printf("%s", p);

    system("pause"); return 0; }

    42

  • 7/24/2019 Laborator de Programare in C

    41/87

    Coninutul lucrrii:

    Scriei i realizai programe pentru sarcinile ce urmeaz. Salvai programele pe server i ncaiet.

    5.0. Introducei i lansai la execuie programele din exemplele 5.1 - 5.13.

    5.1. Programul citete doucuvinte i afieazcel mai mic ( cel mai mare ) cuvnt.Folosii funcia strcmp( ).

    5.2. Programul citete doucuvinte i afieazcel mai lung ( cel mai scurt ) cuvnt.Folosii funcia strlen( ).

    5.3. Programul citete un text i afieazcel mai mare ( cel mai mic ) cuvnt. Folosiifunciile strcmp( ), stpcpy( ).

    5.4. Programul citete un text i afieazcel mai scurt ( cel mai lung ) cuvnt. Folosiifunciile strlen( ), stpcpy( ).

    5.5. Programul citete doucuvinte i le afieazn ordine cresctoare( descresctoare ), fra face deosebire ntre majuscule i minuscule. Folosii funciilestricmp( ), strcpy( ).

    5.6. Programul citete doucuvinte i le afieazn ordinea descresctoare( cresctoare ) a lungimii cuvintelor. Folosii funciile strlen( ), strcpy( ).

    5.7. Programul citete un text care se termincu EOF, determincel mai mare ( mic )cuvnt care se pstreazn memoria heap i afieazacest cuvnt. Folosii funcia din

    exemplul 5.5.

    5.8. Programul citete un text care se termincu EOF, determincel mai scurt ( lung )cuvnt care se pstreazn memoria heap i afieazacest cuvnt. Folosii funcia dinexemplul 5.5.

    5.9. Programul citete un text care se termincu EOF i l pstreazn memoriaheap, apoi sorteaztextul n ordinea cresctoare ( descresctoare ) a cuvintelor i afieaztextulsortat. Folosii funcia din exemplul 5.6.

    5.10. Programul citete un text care se termincu EOF i l pstreazn memoriaheap, apoi sorteaztextul n ordinea descresctoare ( cresctoare ) a lungimii cuvintelor i

    afieaztextul sortat. Folosii funcia din exemplul 5.7.

    5.11. Programul citete o datcalendaristicn forma ddllyy, unde dd este ziua, lleste numrul lunii i yy sunt ultimele doucifre ale anului pentru data respectiv; verificdacaceastdateste corecti o afieazn forma dd luna yyyy, unde luna este denumirea luniii yyyy ( cu 4 cifre ) este anul pentru data citit. Folosii funcia din exemplul 5.8.

    5.12. Programul citete o datcalendaristicn forma dd luna yyyy, unde dd esteziua, luna este denumirea lunii i yyyy ( cu 4 cifre ) este anul pentru data respectiv; verificdacaceastdateste corecti o afieazn forma dd/ll/yy, unde ll este numrul lunii i yysunt ultimele doucifre ale anului pentru data citit. Folosii funcia din exemplul 5.9.

    43

  • 7/24/2019 Laborator de Programare in C

    42/87

    5.13. Programul citete dounumere ntregi care semnificun an calendaristic inumrul zilei din acest an, apoi determini afieazdata calendaristicce corespunde acesteizile. Folosii exemplul 5.11.

    5.14. Programul citete denumirea unei zile din sptmni determincte zile cuaceastdenumire au fost de la nceputul anului curent pnn ziua curentinclusiv.

    5.15. Programul citete doudate calendaristice i determincte zile au trecut de la odatcalendaristicpnla alta.

    5.16. Programul citete doudate calendaristice i denumirea unei zile din sptmni determincte zile cu aceastdenumire au fost de la o datcalendaristicpnla alta.

    ntrebri de control:

    5.1. Ce returneazfunciile: strcmp( asem, ASEM ), stricmp( ASEM, asem ),strncmp( Limbajul C, Limbajul C++, 10 ), strncmp( Limbajul C++, Limbajul C, 12 ),

    strncmp( Limbajul C++, Limbajul C, 14 ), strnicmp( ABRACADABRA, arbadacarba,1 )?

    5.2. Ce returneazfunciile: strlen( ASEM ), strlen( asem0 ), strlen( asem\0 ),strlen( ASEM\n ), strlen( ASEM\N ), strlen( ), strlen( \0 ), strlen( 0 ),

    strlen( Cibernetica\t )?

    5.3. Care va fi rezultatul returnat de funciile: strcat( Limbajul C, ++ ),strncat( Cibernetic, ,InformaticEconomic, Statistic, Previziune Economic, 21 )?

    5.4. Fie char s[ ] = abracadabra, *p; p = strchr( s, a ); Ce afieaz printf( %c\t%d\t%p\n, *p, p+1, p+6 );? Explicai.

    5.5. Fie char b[ ] = Cibernetica\n, *r, a = \n; r = strchr( b, a ); Ce afieazprintf( %c\n, *r );? Explicai.

    5.6. Ce afieaz puts( strstr( Contabilitate financiara, abil ) );? Explicai.

    5.7. Fie char *s = Informatica, *p = Cibernetica, *q = Statistica, *r =

    Economica; strcpy( s, p ); strcpy( p, q ); strcpy( q, r ); strcpy( r, s ); Ce afieazputs( s );?Explicai.

    5.8. Fie char *p, *q, *r; Ce vor afia puts( strncpy( p, Limbajul C++, 10 ));

    puts( strncpy( q, Limbajul C++, 12 ); puts( w, Limbajul C++, 14 ) );? Explicai.

    5.9. Fie int *x; float *y; double *z; long double *w; x = (int *)malloc( 5 * sizeof( int ) );

    y = (float *)malloc( 5 * sizeof( float ) ); z = (double *)malloc( 5 * sizeof( double ) );

    w = (long double *)malloc( 5 * sizeof( long double ) ); ci octei se alocla fiecare apel alfunciei malloc( ) i care sunt valorile pentru variabilele x, y, z, w? Explicai.

    5.10. Prin ce se deosebesc funciile malloc( ) i calloc( )? Care-i deosebirea dintre(int *)malloc( 5 * sizeof( int ) ); i (int *)calloc( 5, sizeof( int ) );? Explicai.

    5.11. Fie char *s = Costel, Vicu i Andrei merg la teatru, *q = Vicu;puts( strstr( s, q ) ); Cine merge la teatru? Explicai.

    44

  • 7/24/2019 Laborator de Programare in C

    43/87

    5.12. Examinai ntrebrile testului test_05 [5] i selectai rspunsurile corecte la fiecarentrebare.

    45

  • 7/24/2019 Laborator de Programare in C

    44/87

    Lucrarea 6

    Tema:Tipuri de date definite de utilizator

    Scopul lucrrii:Utilizarea tipurilor de date definite de utilizator ( structur, uniune,cmpuri de bii, enumerare ) i a facilitii typedef de redenumire a tipurilor.

    Indicaii i sugestii de lucru:

    Utilizatorul poate defini n program i alte tipuri de date, dect cele standard. Se pot definidate de tip structur, uniune, cmpuri de bii, enumerare etc.

    Un mod de grupare al datelor este tabloul. Tabloul este un set ordonat de date de acelai tip.Un alt mod de grupare al datelor este structura. Structura este un set de date care nu suntneaprat de acelai tip. Gruparea se face cu scopul de a prelucra datele nu numai separat,individual, ci i global.

    O declaraie de structur are forma:

    struct nume { lista de declaraii } nume1, nume2, , numen;

    Aici nume definete un tip nou de date, iar nume1, nume2, , numen sunt structuri,adicvariabile de tipul nume; lista de declaraii declarcomponentele structurii de tip nume.Printre nume1, nume2, , numen pot fi i nume de tablouri. Atunci elementele acestortablouri sunt structuri de tipul nume. n declaraia structurii numele tipului, adic nume, saugrupul de nume de variabile, adic nume1, nume2, , numen, pot lipsi, nsnu concomitent.

    Unele componente ale structurii, declarate n lista de declaraii, pot fi la rndul lor altestructuri.

    O altstructurde acelai tip nume ( tip definit ca mai sus ) poate fi declaratulterior astfel:

    struct nume nume_de_structur;

    Exemple de declaraie de structur:

    1) struct punct { int x; int y; } a, b, c, *w; Aceastdeclaraie definete tipul punct ideclar a, b, c ca structuri de tipul punct, adicstructuri cu doucomponente ntregi, i

    declarpointerul w spre tipul punct.

    2) n continuare se pot declara i alte structuri de tipul punct. De exemplu: struct punctd, e={ 10, 20 }, *q, f[11]; Aceastdeclaraie declarvariabilele d, e ca structuri de tipul punctdefinit mai sus ( pe lngaceasta, structura e este iniializat); declarpointerul q spre tipulpunct, i mai declartabloul f de acelai tip punct;

    3) struct dosar

    {

    char nume[25];

    char prenume[25];

    struct data_calenraristica

    { int zi;

    46

  • 7/24/2019 Laborator de Programare in C

    45/87

    char luna[11];

    int an;

    } data_nasterii, data_angajarii;

    } angajat, secie[100];

    Referirea la elementele unei structuri se face prin construcii de forma m.n sau p->n, undem este numele structurii, n este numele componentei la care se face referirea i p este unpointer spre structur. De exemplu, a.x semnificcomponenta x a structurii a de tipul punctdin exemplul 1), iar w->y reprezintcomponenta y a structurii de tip point spre care indicpointerul w.

    La alocarea memoriei pentru o structur, fiecrei componente a structurii i se alocnumrulnecesar de octei, n corespundere cu tipul componentei. Astfel, n exemplul 1), fiecare structurdeclaratva fi alocatpe 2+2=4 octei, deoarece sunt 2 componente i fiecare necesitcte 2octei.

    Un alt mod de grupare al datelor este uniunea. Gruparea se face cu scopul de a pstra n

    una i aceeai zonde memorie date de tipuri diferite n momente de timp diferite.O declaraie de uniune se face ca i o declaraie de structur. Diferena este doar aceea csesubstituie cuvntul struct prin cuvntul union. Deci,

    o declaraie de uniune are forma:

    union nume { lista de declaraii } nume1, nume2, , numen;

    Exemplu de declaraie de uniune:

    union aria { int x; // 2 octeifloat r;