programamrea in limbajul calculatorului

Embed Size (px)

DESCRIPTION

aa

Citation preview

  • TESTE DE CONTROL

    1.1 Limbajul C a fost inventat de:

    a) Niklaus Wirth b) Dennis Ritchie c) Brian Kernighan

    1.2 Limbajul C este:

    a) un limbaj de nivel cobort b) un limbaj de nivel mediu c) un limbaj de nivel nalt

    1.3 n C, o functie:

    a) nu se poate declara sau defini n interiorul alteia b) poate apela o alta functie c) este alcatuita din antet si un bloc de declaratii si instructiuni delimitat de

    cuvintele begin si end 1.4 Functia main()

    a) poate sa lipseasca dintr-un program C b) este obligatorie si figureaza prima n program c) este obligatorie si poate figura oriunde n program

    1.5 n C, o functie:

    a) poate include declaratia sau definitia altei functii b) poate fi declarata sau definita n interiorul altei functii c) se poate apela numai din main() d) se poate apela din orice alta functie

    RASPUNSURI

    1.1-b 1.2-b 1.3-a, b 1.4-c 1.5-d

  • TESTE DE CONTROL

    2.1 Un identificator este:

    a) o secventa de cifre, liniute de subliniere si litere b) o secventa de cifre, liniute de subliniere si litere, primul caracter din

    secventa fiind obligatoriu liniuta de subliniere sau litera c) o secventa de cifre, litere, spatii, liniute de subliniere

    2.2 n C un identificator poate fi scris:

    a) numai cu litere mici b) numai cu litere mari c) combinat, cu litere mici si litere mari

    2.3 Daca ntr-un identificator C se nlocuieste o litera mica (mare) cu litera sa omoloaga mare (mica) atunci:

    a) identificatorul obtinut este considerat identic cu primul b) se obtine un identificator diferit

    2.4 n C exista:

    a) patru tipuri de constante: ntregi, reale, caracter, sir b) patru tipuri de constante: naturale, reale, complexe, caracter c) cinci tipuri de constante: ntregi, reale, complexe, caracter, sir

    2.5 n C secventa de cifre 0631 este interpretata ca:

    a) o constanta n baza 10 b) o constanta n baza 8 c) o constanta n baza 16

    2.6 Secventa de caractere 0xABC poate fi:

    a) un identificator b) o constanta hexazecimala c) si una si alta

    2.7 Cuvintele cheie:

    a) au semnificatii date de programator b) au semnificatii prestabilite c) au semnificatii date de contextul n care sunt utilizate

    2.8 Despre constantele reale 3.0E-2 si .03 se poate afirma ca:

    a) sunt gresite deoarece contin punct n loc de virgula b) sunt corecte si reprezinta valori diferite c) sunt corecte si reprezinta aceeasi valoare

  • d) sunt gresite deoarece prima contine litera E, iar a doua nu are parte ntreaga

    2.9 Secventa a reprezinta:

    a) un sir b) un caracter

    2.10 Secventa

    Citirea matricii A reprezinta:

    a) un sir b) un comentariu c) nici una, nici alta

    2.11 Constructiile

    a si

    a: a) reprezinta acelasi lucru b) reprezinta un sir, respectiv un caracter c) reprezinta un caracter, respectiv un sir

    RASPUNSURI

    2.1-b 2.2-c 2.3-b 2.4-a 2.5-b 2.6-b 2.7-b 2.8-c 2.9-b 2.10-c 2.11-c

  • TESTE DE CONTROL

    3.1 n C exista tipurile fundamentale de date:

    a) char, int, float, double, void b) char, integer, real, double, void c) char, int, float, double, nul, boolean d) character, string, real, void

    3.2 Modificatorii de semn

    a) schimba semnul unei expresii b) schimba semnul numai pentru valori ntregi c) au ca efect interpretarea diferita din punct de vedere al semnului, a informatiei

    memorate ntr-o anumita zona

    3.3 Declaratiile

    char x; si

    signed char x; a) sunt echivalente b) sunt gresite c) sunt corecte

    3.4 Declaratiile

    short int x; si

    int x; a) sunt echivalente b) sunt gresite c) sunt corecte

    3.5 Declaratia

    float x,y; a) este echivalenta cu float x;float y; b) este gresita c) este echivalenta cu x,y:float; d) este echivalenta cu real x,y;

    3.6 Linia de program

    char ch=A,Z; are semnificatia: a) variabila ch ia valori de la A la Z b) variabila ch este de tip char si este initializata cu valoarea A, iar variabila Z este

    de tip char c) tipul de date char ia valori de la A la Z

    3.7. Liniile de program

    const ore_zi=24; int ore_zi=24;

    a) sunt echivalente b) sunt corecte si compatibile c) sunt corecte si incompatibile

    3.8 Secventa de program

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

  • afiseaza: a) x=10 y=20 z=5 b) date de iesire nedefinite c) x=10 y=20

    3.9 Secventa de program:

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

    a) afseaza x=10 y=20 b) afiseaza x=10 y=20 z=5 c) este gresita

    3.10 Instructiunea printf() de mai jos

    printf(\nuu!\taurul \n-are importanta!); afiseaza a) \nuu!\taurul\n-are importanta! b) taurul n-are importanta! c) uu!aurul -are importanta! d) uu! aurul

    -are importanta!

    3.11 Secventa de program

    int i=10,j=20; printf(\n i=%i,j=%i,j,i);

    afiseaza a) i=10, j=20 b) i=20, j=10 c) i=10% j=20%

    3.12 Secventa de program

    int i=10,j=20; printf(\n i=%i,j=%j,i,j);

    a) afiseaza i=10,j=20 b) este gresita c) afiseaza i=%10,j=%20

    3.13 Secventa de program

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

    a) este gresita deoarece %d este descriptor pentru tipul int, nu pentru tipul char b) este corecta si afiseaza codul ASCII al caracterului q c) este corecta si afiseaza codul ASCII al caracterului a d) este corecta si afiseaza caracterul q

    3.14 Secventa de program

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

    a) este gresita deoarece argumentul x se repeta b) este corecta si va afisa x=32.75,x=32.75 c) este corecta si va afisa x=3.275000e+01,x=32.750000

    3.15 Secventa de program

    int x=439; printf(\n %o,x);

    afiseaza: a) 439 b) numarul 439 scris n baza 8

  • c) numarul 439 scris n baza 16

    3.16 Secventa de program

    int x=1011; printf(\n %x,x);

    afiseaza: a) valoarea lui x n binar b) valoarea lui x n hexazecimal c) valoarea lui x n octal

    3.17 Secventa de program

    int x=12; float y=31.42; printf(\n x=%f y=%d,x,y);

    a) afiseaza x=12 y=31.42 b) afiseaza x=12.0 y=31 c) este gresita

    3.18 Secventa de program

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

    a) afiseaza x=-10.5 b) afiseaza x=10.50000 c) este gresita

    3.19 Secventa de program

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

    a) afiseaza x=10.5 b) afiseaza x= 10.50000 c) afiseaza x=10.50000

    3.20 Despre secventele de program

    float x; scanf(%f,x);

    =i float x; scanf(%f,&x);

    se poate afirma ca: a) sunt corecte si au acelasi efect b) prima secventa este corecta si a doua incorecta c) prima secventa este incorecta si a doua corecta

    3.21 Secventa de program

    printf(%.3s,abcde); a) afiseaza abc b) afiseaza abcde c) este gresita

    3.22 Daca sirul care trebuie citit de la tastatura este abcdef atunci secventa

    scanf(%3s,sir); a) este gresita, deoarece variabila sir nu e precedata de operatorul & b) este gresita, deoarece sirul de intrare are 6 caractere, iar descriptorul %s

    prevede doar 3 caractere

  • c) este corecta, dar se citesc doar caracterele abc

    3.23 Secventa de program

    scanf(%d;%f;%s,&x,&y,sir); a) este gresita, deoarece descriptorii de format sunt despartiti prin semnul ; b) este gresita, deoarece variabila sir nu e precedata de operatorul & c) este corecta si realizeaza corect citirea daca datele din fluxul de intrare sunt

    despartite prin semnul ;

    3.24 Operatorii n C pot fi:

    a) unari, binari b) unari, binari, ternari c) unari, binali, termali

    3.25 Operatorii + si - pot fi:

    a) numai unari b) numai binari c) unari sau binari

    3.26 Secventa de program:

    float x; int i; x=34.21; i=x;

    a) este gresita deoarece se atribuie valoarea reala din x variabilei ntregi i b) este corecta c) este corecta, iar i va primi valoarea 34

    3.27 Secventa de program

    int i; float x; i=34; x=i;

    a) este gresita, deoarece se atribuie valoarea ntreaga din i variabilei reale x b) este corecta c) este corecta, iar x va primi valoarea 34 convertita n virgula mobila.

    3.28 Linia de program

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

    a) este eronata deoarece contine operatorul de atribuire = de doua ori b) este corecta c) este corecta si este echivalenta cu secventa de program

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

    3.29 Linia de program

    a=b=c=1;

    a) este corecta si e echivalenta cu secventa

    a=1; b=1; c=1;

    b) este corecta si e echivalenta cu secventa

    1=a=b=c;

  • c) este gresita deoarece operatorul de atribuire apare de mai multe ori

    3.30 Expresia

    x+=1;

    a) este gresita b) este corecta si echivalenta cu x=x+1; c) este corecta si echivalenta cu x++; d) este corecta si echivalenta cu ++x;

    3.31 Expresia

    y=--x;

    a) este gresita b) este corecta si echivalenta cu secventa

    x=x-1; y=x;

    c) este corecta si echivalenta cu secventa y=x; y=x-1;

    3.32 Expresia

    y=x--;

    a) este gresita b) este corecta si echivalenta cu secventa

    x=x-1; y=x;

    c) este corecta si echivalenta cu secventa y=x; x=x-1;

    3.33 n urma executiei secventei de program:

    int i,j; i=19; j=i/4;

    a) j ia valoarea 4 b) j ia valoarea 4.75 c) j ia valoarea 5

    3.34 n urma executiei secventei de program:

    int i,j; i=19; j=i%4;

    a) j ia valoarea 3 b) j ia valoarea 4 c) j ia valoarea 4.75

    3.35 Daca a,b,c,d sunt variabile numerice atunci expresia (ad) se poate scrie:

    a) ad b) ad c) c>d||a

  • 3.36 n secventa de program

    int x=3,y=4,a,b,z; scanf(%i %i,&a,&b); z=(y>x)||(ay)&&(a

  • a) ~i+1 b) ~i-1 c) 2-i

    3.45 Operatia x2 echivaleaza cu:

    a) o nmultire a lui x cu 2 b) o mpartire a lui x la 2 c) o nmultire a lui x cu 22 d) o mpartire a lui x cu 22

    3.47 Secventa de program

    int i=7; float x; x=(float)i/4; printf(\n x=%f,x); . . . . .

    a) este gresita b) este corecta si afiseaza x=1.750000 c) este corecta si afiseaza x=1

    RASPUNSURI

    3.1-a 3.2-c 3.3-a, c 3.4-c 3.5-a 3.6-b 3.7-c 3.8-b 3.9-a 3.10-d 3.11-b 3.12-a 3.13-b 3.14-c 3.15-b 3.16-b 3.17-c 3.18-b 3.19-b 3.20-c 3.21-a 3.22-c 3.23-c 3.24-b 3.25-c 3.26-b, c 3.27-b, c 3.28-b, c 3.29-a 3.30-b, c, d 3.31-b 3.32-c 3.33-a 3.34-a 3.35-a, c 3.36-b 3.37-b 3.38-a, b, c 3.39-b 3.40-a, b, c, d 3.41-a, b, c, d 3.42-c 3.43-a 3.44-a 3.45-c 3.46-d 3.47b

  • TESTE DE CONTROL

    4.1 Secventa de program

    int x=-3,y=7; if (x>0) printf(\n x=%i,x);

    else if (y)

    printf(\n y=%i,y); else

    printf(\n y=0); a) afiseaza y=7 b) este gresita deoarece o instructiune if contine o alta instructiune if c) afiseaza x=-3

    4.2 Secventa de program

    if(x) if(y)

    y=3; else

    y=5; este echivalenta cu a) if(x)

    if(y) y=3;

    else; else

    y=5; b) if(x&&y)

    y=3; else

    y=5; c) if(x)

    { if(y)

    y=3; }

    else y=5;

    d) nici una din secventele a), b), c)

    4.3 Secventa de program

    int x=1,y=2; if ((x=0)&&(y=4))

    printf(\n x=%i y=%i,x,y); a) afiseaza x=1 y=2 b) afiseaza x=0 y=4 c) nu afiseaza nimic deoarece printf() nu se executa

  • 4.4 Secventa de program

    if(x) y=1/x;

    a) este gresita b) este echivalenta cu

    if (x!=0) y=1/x;

    c) este chivalenta cu if x!=0 y=1/x;

    4.5 Secventa de program

    if (x>=3) y=sqrt(x-3);

    else; a) este gresita deoarece contine semnul ; nainte de else b) este gresita deoarece dupa else lipseste o instructiune C c) este corecta si este echivalenta cu secventa

    if(x>=3) y=sqrt(x-3);

    4.6 Secventa de program

    int x=3,y=6; if (x>0)

    printf(\n x=%i,x); else

    y=x+3; printf(\n y=%i,y);

    afiseaza a) x=3 b) y=6 c) x=3 y=6

    4.7 Secventa de program

    int x=3,y=4; printf(\n %i,x>y?x:y);

    a) afiseaza 3 b) afiseaza 4 c) este gresita deoarece argumentul functiei printf() este o expresie,

    nu o variabila. 4.8 Secventa de program

    char x=a; switch(x)

    { case a:printf(\n amic); case A:printf(\n Amare);

    } afiseaza

  • a) amic b) Amare c) amic

    Amare 4.9 Secventa de program

    int x=3; if (x=4) printf(\n x=%i,x);

    a) este gresita b) este corecta, dar nu afiseaza nimic c) este corecta si afiseaza valoarea 4 d) este corecta si afiseaza valoarea 3

    4.10 Secventa de program

    char x=a; switch(x) { case a:printf(\n amic);break; case A:printf(\n Amare); }

    a) afiseaza amic b) afiseaza Amare c) afiseaza

    amic Amare

    d) este gresita deoarece al doilea case nu se termina cu break 4.11 Secventa de program

    int i=3; while(i) i--; printf(%3i,i);

    a) afiseaza 2 1 0 b) contine o bucla eterna c) afiseaza 0

    4.12 Secventa de program

    int i=3; while(i) printf(%3i,i); i--;

    a) afiseaza valoarea 3 de 3 ori b) afiseaza valoarea 3 de o infinitate de ori (bucla eterna) c) afiseaza 3 2 1

    4.13 Secventa de program

    int i=3; while(i); printf(%3i,i);

  • i--; a) afiseaza valoarea 3 de 3 ori b) afiseaza valoarea 3 de o infinitate de ori (bucla eterna) c) contine o bucla eterna si nu afiseaza nimic d) afiseaza 3 2 1

    4.14 Secventa de program

    int i=3; while(i) { printf(%3i,i); i--; }

    a) afiseaza 3 2 1 0 b) afiseaza 3 2 1 c) contine o bucla eterna

    4.15 Secventa de program

    int i=0; while(i) printf(%3i,i);

    a) afiseaza valoarea 0 b) afiseaza valoarea 0 de o infinitate de ori (bucla eterna) c) nu afiseaza nimic

    4.16 Secventa de program

    int i=0; for (;i

  • c) este corecta si afiseaza 1 10 2 9 3 8 4 7 5 6

    4.18 Secventa de program

    int i; for (i=1;-3

  • while (x>0); a) citeste x pna cnd x>0 b) citeste x ct timp x>0 c) este gresita deoarece functia scanf() nu este pusa ntre acolade d) nu executa nici o citire a lui x

    4.24 Secventa de program

    int j; do

    j=3; while (j

  • 4.27 Secventa de program

    int i,j; for(i=1;i

  • if(i-5)continue; }

    a) calculeaza suma s=10+9+8+7+6+4+3+2+1 b) calculeaza suma s=10+9+8+7+6+5+4+3+2+1 c) calculeaza suma s=5

    4.31 Secventa de program

    int s,i; for(s=0;i=10;i;i--) { if(i-5)continue; s+=i; }

    a) calculeaza suma s=10+9+8+7+6+4+3+2+1 b) calculeaza suma s=10+9+8+7+6+5+4+3+2+1 c) calculeaza suma s=5

    4.32 Secventa de program

    int s,i; for(s=0;i=10;i;i--) { if(i==5)continue; s+=i; }

    a) calculeaza suma s=10+9+8+7+6+4+3+2+1 b) calculeaza suma s=10+9+8+7+6+5+4+3+2+1 c) calculeaza suma s=5

    4.33 Secventa de program

    int i=1; while(i10)

    goto et2; s+=i; i++; goto et1;

    et2:printf(\n s=%d,s); a) este gresita deoarece contine salturi napoi

  • b) este corecta si realizeaza o iteratie pentru calculul primelor 10 numere naturale

    c) este corecta si este echivalenta cu secventa d) este corecta si echivalenta cu secventa

    int i=1,s=0; while(i

  • TESTE DE CONTROL

    5.1 Declaratia float x[100];

    nseamna a) rezervarea n memorie a 100 locatii la adrese consecutive b) rezervarea n memorie a 100 locatii la adrese ntmplatoare c) rezervarea a 100 de octeti pentru variabila reala x

    5.2 Secventa de program

    int x[m][n],m=3,n=2;

    a) este corecta deoarece dimensiunile m si n ale matricii sunt cunoscute b) este gresita deoarece m si n trebuia sa fie declarati nainte de x c) este gresita deoarece la declarare n main(), dimensiunile unui tablou trebuie sa

    fie constante si nu variabile 5.3 Secventa de program

    int y[10]; y[10]=7;

    a) atribuie componentei y[10] a tabloului y valoarea 7 b) este gresita deoarece componentele tabloului sunt

    y[0],y[1],y[2],...,y[9] c) este corecta deoarece componentele tabloului sunt y[1],y[2],...,y[10]

    5.4 n secventa de program

    int x[3][2]; x[1,2]=5;

    a) atribuirea x[1,2]=5 este echivalenta cu x[1][2]=5 b) atribuirea x[1,2]=5 este corecta sintactic si nseamna x[2]

    5.5 Urmatoarele trei declaratii ale tabloului x,

    int x[6]; int x[3][2]; int x[2][3];

    a) sunt echivalente b) nu sunt echivalente

    5.6 n urma initializarii tabloului a

    int a[3][2]={1,2,3,4,5,6};

    componenta a[1][0] are valoarea a) 2 b) 3 c) alta valoare dect 2 sau 3

  • 5.7 Initializarea

    int a[3][2]={1,2,3,4,5,6};

    este echivalenta cu: a) int a[3][2]={

    {1,2}, {3,4}, {5,6}, };

    b) int a[3][2]={ {1,4}, {2,5}, {3,6}, }; 5.8 Initializarea

    float x[2][3]={1,2,3,4,5,6};

    este echivalenta cu a) float x[][]={1,2,3,4,5,6}; b) float x[][3]={1,2,3,4,5,6}; c) float x[2][]={1,2,3,4,5,6};

    5.9 Secventa de program

    int x[10],i; for(i=1;i

  • printf(\n Lungimea sirului=%i,strlen(x));

    afiseaza mesajul

    a) Lungimea sirului=20 b) Lungimea sirului=4 c) Lungimea sirului=5

    5.13 Secventa de program

    char x[]= rac; char y[]= arc; printf(%d,strcmp(x,y));

    afiseaza o valoare a) egala cu zero b) mai mica strict dect zero c) mai mare strict dect zero

    5.14 Secventa de program

    char x[]=ac; char y[]=ar; strcat(x,y); printf(\n %s,x);

    afiseaza a) acar b) arac

    5.15 n secventa de program

    char x[20]; x=Ploiesti;

    atribuirea x=Ploiesti;

    a) este gresita b) este gresita, iar copierea sirului Ploiesti n variabila x se realizeaza prin

    strcpy(x,Ploiesti);

    c) este corecta 5.16 Secventa de program

    char x[20]; gets(x); puts(x);

    afiseaza acelasi sir daca nlocuim gets(x); cu: a) gets(&x); b) scanf(%s,&x); c) scanf(%s,x);

  • 5.17 n secventa de program

    int i; char x[20]=xyzw; puts(x);

    apelul puts(x);

    poate fi nlocuit cu: a) printf(\n %s,x); b) for(i=0;i

  • TESTE DE CONTROL 6.1 Un pointer este:

    a) o adresa de memorie b) o variabila care poate memora adrese de memorie c) o zona de memorie dinamica

    6.2 n secventa de program

    int x,*p; p=&x;

    atribuirea este:

    a) corecta, deoarece se atribuie unui pointer o adresa de memorie b) incorecta, deoarece trebuia precedata de o atribuire pentru variabila x

    6.3 n secventa de program

    int x=10,*p; p=x;

    atribuirea este: a) corecta, deoarece se atribuie lui p o variabila alocata static b) corecta, deoarece variabila x a fost initializata c) incorecta, deoarece pointerului p trebuie sa i se atribuie adrese de memorie

    6.4 n secventa de program

    int *p,x; x=31; *p=x;

    atribuirea este:

    a) corecta b) incorecta, deoarece pointerul p nu indica nici o locatie c) este corecta si echivalenta cu p=p*x;

    6.5 Secventa de program

    int x,*p,*q; x=11; p=q=&x; printf(%d,*p);

    a) afiseaza valoarea 11 b) este gresita, deoarece n expresia

    p=q=&x; semnul = apare de doua ori c) este gresita, deoarece descriptorul de format pentru pointeri este %p si nu %d

  • 6.6 Secventa de program

    int x,y,*p; x=5; y=10; p=&x; &y=p; printf(%d,y);

    a) este corecta si afiseaza valoarea 5 b) este incorecta, deoarece atribuirea &y=p; este incorecta c) este corecta si afiseaza valoarea 10

    6.7 Secventa de program

    int *x[10],y=10; x[1]=&y; printf(%d,*x[1]);

    a) este gresita, deoarece componenta x[1] nu poate primi drept valoare o adresa b) este corecta si afiseaza valoarea 10 c) este gresita deoarece expresia *x[1] este gresita

    6.8 Secventa de program

    char *s=Imi place limbajul C!; int i; for(i=0;s[i];i++)

    printf(\n %c,s[i]);

    a) este gresita, deoarece s este declarat ca pointer catre char si este folosit ca un tablou

    b) este corecta deoarece un pointer catre char poate fi interpretat ca si un tablou de caractere

    c) este corecta si afiseaza mesajul Imi place limbajul C! pe verticala

    6.9 O declaratie de forma:

    char *p;

    poate avea interpretarea:

    a) variabila p este pointer catre char b) variabila p poate contine adresa unui sir de caractere c) variabila p este numele unui vector de caractere alocate dinamic

    6.10 Secventa de program

    int x[10],*p=x;

    a) este echivalenta cu secventa

    int x[10]; *p=x;

    b) este incorecta, deoarece n locatia indicata de p se memoreaza o valoare nedefinita x

  • c) este corecta si este echivalenta cu

    int x[10],*p=&x[0];

    d) este corecta si este echivalenta cu

    int x[10],*p=x[0];

    e) este corecta si este echivalenta cu

    int x[10],*p=&x;

    6.11 n secventa de program

    float x[10],y[10],*p; x=y; p=x;

    a) prima atribuire este corecta b) a doua atribuire e corecta c) ambele atribuiri sunt corecte

    6.12 Declaratia

    int (*x)[10];

    a) este gresita b) este echivalenta cu

    int *x[10];

    c) este corecta si reprezinta declaratia unui pointer catre un tablou unidimensional de 10 componente

    6.13 n secventa de program

    int x[3]; int(*p)[3]; p=x; p++;

    pointerul p:

    a) indica componenta x[1] a vectorului x[10] b) indica locatia cu adresa x+10*sizeof(int)

    6.14 Secventa de program

    int *p,x[]={1,2,3}; p=x; p+=2; printf(%d,*p);

    a) afiseaza valoarea 3 b) afiseaza valoarea 2 c) este gresita, deoarece n expresia p=x; se atribuie un nume de tablou unui pointer d) este gresita, deoarece adunarea unui ntreg la un pointer (expresia p+=2;) este

    interzisa

    6.15 Componenta i a unui tablou x[10],0

  • a) x[i] b) x+i c) &x[i] d) *(x+i)

    6.17 Secventa de program

    int *p,**q,x=10; p=&x; q=&p; printf(\n %d,**q);

    a) este gresita, deoarece n declaratie q e precedat de doua semne * si nu doar de unul

    b) este gresita, deoarece intentia de a memora adresa unui pointer (expresia q=&p;) tot ntr-un pointer este o eroare

    c) este corecta, deoarece operatiile cu pointerul p si pointerul dublu q sunt corecte d) este corecta si afiseaza valoarea 10

    RASPUNSURI

    6.1-b 6.2-a 6.3-c 6.4-b 6.5-a 6.6-b 6.7-b 6.8-b, c 6.9-a, b, c 6.10-c, e 6.11-b 6.12-c 6.13-b 6.14-a 6.15-b, c 6.16-a, d 6.17-c, d

  • TESTE DE CONTROL

    7.1 Secventa de program struct {

    int x; float y;

    }z; scanf(%d,&x);

    este gresita, deoarece: a) la structura din secventa lipseste numele structurii b) n apelul functiei scanf(), cmpul x este tratat ca o variabila

    7.2 Selectarea unui cmp din structura se face utiliznd simbolul: a) . b) ; c) ? d) : e) %

    7.3 Daca p este un pointer catre structura struct numere {

    int x; float y;

    };

    atunci expresia p? x este echivalenta cu:

    a) *p.x b) (*p).x c) *p.(x)

    7.4 Atribuirea informatiei dintr-o variabila structura x unei alte variabile structura y de acelasi tip se poate face:

    a) scriind y=x; b) atribuind valorile cmpurilor structurii x cmpurilor corespunzatoare din y

    7.5 Secventa de program

    int y; struct num

    { char *x; int y; }a,*p;

    y=10; a? y=y; p.x= Eroare;

    este gresita deoarece: a) y este n acelasi timp nume de variabila si de cmp b) cmpul x nu este selectat cu ? ci cu ajutorul operatorului punct c) cmpul y nu este selectat cu operatorul punct, ci cu ajutorul operatorului ?

    7.6 Structura

  • struct persoana { int salariu; struct persoana *p; struct inform

    { long int telefon; char *adresa; }inf;

    }pers;

    este: a) gresita, deoarece cmpul pointer p indica catre structura din care face parte b) corecta c) gresita, deoarece structura persoana include o alta structura (structura inform)

    7.7 Secventa de program

    struct a {

    int x; float z;

    }w; struct b {

    int x; float y;

    }z; w.x=1; z.x=2;

    a) este gresita, deoarece structurile a si b contin un cmp cu nume comun (cmpul x) b) este corecta, deoarece doua structuri diferite pot avea cmpuri cu nume comune

    7.8 Structura

    struct a {

    int x; float y[3][2];

    }a;

    a) este incorecta, deoarece contine un cmp care este tablou b) este corecta, iar referirea la elementul y[0][1] se poate face sub forma a.y[0][1].

    7.9 Secventa de program

    struct material {

    int cant; float pu,valoare;

    }maga[3]; maga[0].cant=100;

    este: a) incorecta deoarece componentele tabloului maga[5] sunt de tip struct b) incorecta deoarece cmpurile pu si valoare nu sunt declarate sub forma

    float pu; float valoare;

    c) este corecta

  • 7.10 Lungimea unei structuri se afla

    a) adunnd lungimile truturor cmpurilor care compun structura b) utiliznd operatorul sizeof

    7.11 Structura

    struct a {

    unsigned adm:1; int nota;

    }elev;

    a) este gresita deoarece contine un cmp de biti de lungime 1 bit b) este corecta, deoarece o structura poate contine att cmpuri obisnuite ct si

    cmpuri de biti

    7.12 Structura

    struct a {

    unsigned:4; unsigned x:2; float y:3;

    }; este gresita deoarece a) primul cmp de biti nu are nume b) al treilea cmp de biti nu este de tip unsigned sau signed

    7.13 Membrii unei uniuni

    a) mpart aceeasi zona de memorie b) au rezervate zone de memorie diferite

    7.14 Operatorii de selectare . si ? se pot folosi pentru selectia cmpurilor

    a) numai la structuri b) la structuri si la uniuni c) numai la uniuni

    7.15 Secventa de program

    union {

    float a; int b;

    }z={10};

    a) este gresita deoarece nu are nume b) este corecta iar cmpului a i se atribuie valoarea 10 c) este corecta iar cmpului b i se atribuie valoare 10

    7.16 Lungimea unei uniuni se afla

    a) calculnd maximul dintre lungimile membrilor uniunii b) utiliznd operatorul sizeof

    7.17 Secventa de program

    enum masini{Trabant,Dacia,Audi,Marcedes}masina_ta; masina_ta=Dacia; printf(\n Masina ta este %s,masina_ta);

    a) este incorecta deoarece constanta simbolica Dacia este tratata ca un sir

  • b) este corecta si afiseaza cuvntul Dacia c) este incorecta deoarece este ilegala atribuirea masina_ta=Dacia;

    7.18 Numele simbolice dintr-o lista de enumerare

    a) se pot atribui unei variabile de tip corespunzator b) se pot citi de la tastatura c) se pot scrie nemijlocit d) pot figura ca o constanta case ntr-o instructiune switch

    7.19 n secventa de program

    enum luna_an{ianuarie,martie=3,mai};

    valoarea atasata numelui simbolic mai este:

    a) 3 b) 4 c) 5

    7.20 Declaratia

    typedef enum{false,true}boolean;

    a) este incorecta deoarece lipseste numele tipului enumerare b) este corecta si asociaza enumerarii un nume nou (boolean) c) este corecta si defineste n C tipul boolean pe care standardul ANSI C nu-l prevede.

    RASPUNSURI

    7.1-b 7.2-a, c 7.3-b 7.4-a, b 7.5-b, c 7.6-b 7.7-b 7.8-b 7.9-c 7.10-b 7.11-b 7.12-b 7.13-a 7.14-b 7.15-b 7.16-b 7.17-a 7.18-a, d 7.19-b 7.20-b

  • TESTE DE CONTROL

    8.1 Definitia unei functii C se poate face

    a) numai n forma moderna b) att n forma clasica ct si n forma moderna

    8.2 Definitia moderna

    float min(int a,int b) { instructiuni }

    este echivalenta n forma clasica cu secventa:

    a) float min(int a,b) { instructiuni }

    b) float min(a,b) int a,b; { instructiuni }

    c) float min() { int a,b instructiuni }

    d) float min(a,b) { int a,b; instructiuni }

    8.3 O functie declarata fara tip ntoarce

    a) o valoare de tip int b) o valoare de tip float c) o valoare de tip void

    8.4 O functie C nu poate sa ntoarca

    a) o valoare de tip tablou b) o valoare de tip struct c) un pointer de tip void

    8.5 Lista declaratii parametrii din prototipul unei functii

    a) poate sa lipseasca complet, dar trebuie pastrate parantezele rotunde b) poate sa lipseasca si acest lucru sa fie semnalizat prin cuvntul void c) poate sa contina doar numele tipurilor de date ale parametrilor d) poate sa contina doar numele parametrilor

  • 8.6 Functia

    float f(int x) { if(x)

    return -1; else

    return 1; }

    a) este incorect scrisa deoarece are doua instructiuni return b) este corect scrisa si ntoarce la apel valorile -1 sau 1 convertite la tipul float c) este incorect scrisa deoarece nu are semnul ; dupa declaratorul float f(int x)

    8.7 Pentru a lucra corect, functia

    f(float x) {

    float y; y=x;

    }

    a) nu trebuie sa contina o instructiune return, deoarece este implicit de tip void b) trebuie sa contina o instructiune return c) trebuie sa contina o instructiune de forma return expresie

    8.8 Functia

    void f(int x,int *y) {

    *y=x; }

    a) este scrisa incorect deoarece corpul functiei nu contine o instructiune return de ntorcere n functia apelanta

    b) este scrisa corect iar ntorcerea n functia apelanta este determinata de ntlnirea acoladei }

    8.9 Functia

    void f(float x) {

    float y=x; return y*y;

    }

    a) este gresit scrisa, deoarece fiind de tip void nu este necesar sa contina o instructiune return

    b) este corect scrisa, deoarece instructiunea return este obligatorie

    8.10 Declaratia unei functii nainte de apelare este obligatorie daca functia este:

    a) de tip int b) de tip float c) de orice tip diferit de tipul int

    8.11 n declaratia unei functii

    a) prezenta listei de declaratii parametrii este optionala

  • b) daca lista declaratii parametrii este vida trebuie scris obligatoriu cuvntul void ntre parantezele rotunde

    c) daca lista declaratii parametrii este vida este recomandabil sa se scrie cuvntul void ntre parantezele rotunde

    d) numele de parametri pot lipsi, dar tipurile de date la care apartin parametrii trebuie sa existe obligatoriu

    8.12 O declaratie de forma

    tip nume_functie();

    reprezinta

    a) forma traditionala de declaratie a unei functii b) forma moderna de declaratie a unei functii (prototipul functiei)

    8.13 Secventa de program

    float f(int a,float b)

    poate fi considerata

    a) declaratia (prototipul) unei functiei f() b) antetul din definitia functiei f() c) att prototip ct si antet de functie

    8.14 Numarul parametrilor din lista de parametri actuali ai unei functii

    a) trebuie sa fie obligatoriu fix b) este totdeauna variabil c) poate fi att fix ct si variabil

    8.15 Prototipurile sunt importante deoarece

    a) permit compilatorului sa verifice corectitudinea apelului unei functii b) contribuie la cresterea lizibilitatii codului sursa

    8.16 Corespondenta dintre parametri actuali si formali se poate face

    a) la ntmplare b) pozitional

    8.17 Parametrii actuali si formali care au aceeasi pozitie n lista de parametri trebuie sa aiba obligatoriu

    a) acelasi tip b) tipuri compatibile

    8.18 Transferul informatiei ntre functia apelanta si functia apelata se poate face

    a) numai prin valoare b) numai prin referinta c) si prin valoare si prin referinta

    8.19 Transferul prin valoare consta n

    a) copierea valorii parametrului actual n zona de memorie a parametrului formal corespunzator, n momentul efectuarii apelului

    b) transmiterea adresei parametrului actual parametrului formal corespunzator care trebuie sa fie un pointer

  • 8.20 Secventa de program

    void f(int x);

    void main(void) {

    int x=7; f(x); printf(\nx= %d,x);

    }

    void f(int x) {

    x=10; }

    a) este gresita, deoarece parametrul formal si actual au acelasi nume b) este corecta si afiseaza x=10 c) este corecta si afiseaza x=7

    8.21 Secventa de program

    void f(int *x);

    void main(void) {

    int x=7; f(&x); printf(\n x=%d,x);

    } void f(int *x) { *x=10; }

    a) este gresita, deoarece parametrului formal i se transmite o adresa si nu o valoare b) este corecta si afiseaza x=7 c) este corecta si afiseaza x=10

    8.22 Secventa de program

    s(int x[2][3]);

    void main(void) {

    int y[2][4]={1,2,3,4,5,6,7,8},sum; sum=s(y); printf(\n Suma=%d,sum);

    }

    s(int x[2][3]) {

    int i,sum=0; for(i=0;i

  • return sum; }

    a) este corecta si afiseaza suma=24 b) este corecta si afiseaza suma=21 c) este incorecta, deoarece parametrul formal x si parametrul formal y trebuie sa aiba

    aceeasi dimensiune

    8.23 Secventa de program

    s(int x[],int m);

    void main(void) {

    int y[3]={1,2,3},m=3,suma; suma=s(y,m); printf(\n Suma=%d,sum);

    }

    s(int x[],int m) {

    int i,sum=0; for(i=0;i

  • void main(void) {

    int y[10]; . . . . . . f(y[2]);

    }

    void f(int x) {

    int z; z=x; . . . . . .

    }

    a) este corecta b) este gresita, deoarece parametrul actual al functiei f() este o componenta de tablou

    8.26 Secventa de program

    void f(int y[2]);

    void main(void) {

    int x[2]={3,4}; f(x); printf(\n x[0]=%d,x[1]=%d,x[0],x[1]);

    }

    void f(int y[2]) {

    y[0]=y[1]; }

    a) afiseaza x[0]=3,x[1]=4 b) afiseaza x[0]=4,x[1]=4 c) este gresita

    8.27 n limbajul C tablourile pot fi transmise unei functii

    a) numai prin referinta b) numai prin valoare c) si prin valoare si prin referinta

    8.28 Structurile pot fi transmise unei functii

    a) numai prin referinta b) numai prin valoare c) si prin valoare si prin referinta

    8.29 Un membru al unei structuri poate fi transmis unei functii

    a) numai prin referinta b) numai prin valoare c) si prin valoare si prin referinta d) numai o data cu ntreaga structura

  • 8.30 Declaratiile

    float (*p)(float,int); si

    float *p (float,int);

    a) sunt echivalente b) nu sunt echivalente: prima reprezinta un pointer catre o functie de tip float, care

    are un parametru de tip float si unul de tip int, iar a doua reprezinta prototipul functiei p() de tip pointer catre float, care are un parametru de tip float si unul de tip int

    c) sunt corecte

    8.31 Secventa de program

    void f(int x);

    void main(void) {

    int x=7; f(x);

    }

    void f(int x) {

    printf(%3i,x); if(x)

    f(x-1); }

    afiseaza

    a) 7 6 5 4 3 2 1 0 b) 0 1 2 3 4 5 6 7

    8.32 Secventa de program

    void f(int x);

    void main(void) { int x=7; f(x); }

    void f(int x) { if(x)

    f(x-1); printf(%3i,x); }

    afiseaza

    a) 7 6 5 4 3 2 1 0 b) 0 1 2 3 4 5 6 7 8.33 Secventa de program

  • void f(int x);

    void main(void) {

    int x=7; f(x);

    }

    void f(int x) {

    f(x-1); printf(%3i,x);

    }

    a) afiseaza 7 6 5 4 3 2 1 0 b) afiseaza 0 1 2 3 4 5 6 7 c) apeleaza de o infinitate de ori functia f()

    8.34 Secventa de program

    void f(void) {

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

    }

    void main(void) {

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

    }

    a) afiseaza x=23.500000 b) afiseaza x=23.500000

    x=23.500000 c) este gresita, deoarece n main() se utilizeaza variabila x care nu este declarata aici

    RASPUNSURI

    8.1-b 8.2-b 8.3-a 8.4-a 8.5-a, b, c 8.6-b 8.7-c 8.8-b 8.9-a 8.10-b, c 8.11-a, c, d 8.12-a 8.13-b 8.14-c 8.15-a, b 8.16-b 8.17-b 8.18-c 8.19-a 8.20-c 8.21-c 8.22-c 8.23-b 8.24-b 8.25-a 8.26-b 8.27-a 8.28-c 8.29-c 8.30-b, c 8.31-a 8.32-b 8.33-c 8.34-c

  • TESTE DE CONTROL

    9.1 Locul de memorare al variabilei auto este:

    a) stiva b) memoria heap 9.2 Clasa de memorare auto

    a) trebuie declarata explicit ntotdeauna b) este considerata implicit pentru variabilele care sunt declarate n interiorul

    unei functii si care nu au specificata clasa de memorare 9.3 Apelul functiei

    void f(void) { float i=1; { int i=2; printf(\n %d,i);

    } }

    a) produce eroare, deoarece variabila i este declarata att de tip float ct si de tip int

    b) are ca efect afisarea valorii 2 c) are ca efect afisarea valorii 1 9.4 Secventa de program

    register int x=10; int *p; p=&x;

    a) este corecta, deoarece atribuie unui pointer de tip int adresa unei variabile de tip int

    b) este incorecta, deoarece variabilelor care au clasa de memorare register nu li se poate aplica operatorul &

    9.5 Care din afirmatiile urmatoare sunt adevarate?

    a) initializarea unei variabile din clasa auto sau register se face de fiecare data cnd se executa blocul n care sunt declarate

    b) initializarea unei variabile din clasa static se face o singura data si anume la compilare

    c) afirmatiile a) si b) sunt adevarate 9.6 O variabila din clasa de memorare static

    a) este memorata n stiva b) este memorata n locatii cu adrese fixe

  • c) este recunoscuta doar n interiorul functiei unde a fost declarata d) si pastreaza valoarea de la un apel la altul al functiei 9.7 O variabila este numita globala atunci cnd

    a) este declarata n afara functiei main() b) este declarata n afara oricarei functii

    9.8 Variabilele globale fac parte implicit din clasa

    a) register b) auto c) extern

    9.9 Care din afirmatiile urmatoare sunt adevarate?

    a) o variabila globala declarata ntr-un fisier al unui program multifisier este recunoscuta automat si n functiile celorlalte fisiere

    b) ntr-un program multifisier, o variabila globala trebuie declarata identic n toate fisierele programului

    c) pentru a fi recunoscuta de toate functiile programului multifisier, o variabila globala trebuie declarata obisnuit ntr-unul din fisiere, iar n celelalte declaratii trebuie sa fie precedata de specificatorul extern

    d) precedata de specificatorul static, o variabila globala este recunoscuta doar de functiile fisierului n care este declarata

    RASPUNSURI

    9.1-a 9.2-b 9.3-b 9.4-b 9.5-a, b, c 9.6-b, c, d 9.7-b 9.8-c 9.9-c, d

  • TESTE DE CONTROL

    10.1 Sunt initializate ntotdeauna cu valoarea 0

    a) variabilele locale si globale declarate static si neinitializate explicit b) variabilele locale neinitializate explicit

    10.2 n C operatiile de intrare/iesire se realizeaza cu ajutorul

    a) unor instructiuni speciale b) unor functii speciale din biblioteca standard

    10.3 Fluxul (streamul)

    a) este un dispozitiv logic de interfata, care asigura generalitatea functiilor de intrare/iesire fata de diversitatea dispozitivelor fizice specifice acestor operatii

    b) se reprezinta printr-o entitate de tip FILE c) poate fi de doua tipuri: text sau binar

    10.4 Fisierul deschis n mod w

    a) va fi creat daca nu exista b) va pierde informatiile daca exista deja c) va putea fi completat cu noi informatii daca exista deja

    10.5 Fisierul deschis n mod a

    a) se creeaza daca nu exista b) permite adaugarea de date la sfrsitul sau daca exista deja c) va pierde informatiile daca exista deja

    10.6 Pentru citirea unui caracter dintr-un fisier de pe disc se poate folosi functia

    a) fgetc() b) getch() c) getc() 10.7 Apelurile de functii

    fgetc(stdin); si

    getch();

    a) au acelasi efect: ambele citesc un caracter de la tastatura b) au efecte diferite

    10.8 Pentru scrierea unui caracter ntr-un fisier pe disc se poate folosi functia

    a) fputc() b) putc() c) putch()

  • 10.9 Apelurile de functii

    fputc(stdout,nume_caracter); si

    putch(nume_caracter);

    a) au acelasi efect: ambele afiseaza un caracter pe monitor b) au efecte diferite

    10.10 Pentru citirea unui sir de caractere dintr-un fisier creat pe disc se poate folosi functia

    a) fgets() b) gets()

    10.11 Pentru scrierea unui sir de caractere ntr-un fisier creat pe disc se poate folosi functia

    a) puts() b) fputs()

    10.12 Apelurile de functii

    fgets(nume_sir,nr_caractere,stdin); si

    gets(nume_sir);

    a) au acelasi efect: ambele citesc un sir de caractere de la tastatura b) au efecte diferite

    10.13 Functiile fprintf() si fscanf()

    a) transfera blocuri de date b) transfera date formatate

    10.14 Care afirmatie de mai jos este adevarata?

    a) apelul fscanf(stdin, ...) are acelasi efect cu apelul scanf() b) apelul fprintf(stdout, ...) are acelasi efect cu apelul printf()

    10.15 Pentru transferul unui volum mare de date este recomandabila folosirea functiilor

    a) fread() si fwrite() b) fscanf() si fprintf()

    10.16 Functia feof()

    a) ntoarce valoarea adevarat daca nu s-a atins sfrsitul fisierului si fals n caz contrar b) ntorce valoarea fals daca nu s-a atins sfrsitul fisierului si adevarat n caz contrar

    10.17 Functia rewind() pozitioneaza indicatorul de pozitie al fisierului

    a) la nceputul sau b) la sfrsitul sau

    10.18 Functia fseek()

    a) pozitioneaza indicatorul de pozitie al fisierului la o valoare calculata relativ fata de una din valorile de referinta: nceputul fisierului, sfrsitul fisierului, pozitia curenta n fisier

    b) seteaza valoarea indicatorului de pozitie la o valoare data c) memoreaza valoarea indicatorului de pozitie ntr-un obiect din memorie

    10.19 Care afirmatii sunt adevarate?

    a) functia fgetpos() seteaza valoarea indicatorului de pozitie la o valoare data b) functia fsetpos() memoreaza valoarea indicatorului de pozitie ntr-un obiect din memorie c) afirmatiile 1 si 2 sunt false

  • d) functia ftell() ntoarce valoarea curenta a indicatorului de pozitie

    RASPUNSURI

    10.1-a 10.2-b 10.3-a, b, c 10.4-a, b 10.5-a, b 10.6-a, c 10.7-a 10.8-a, b 10.9-a 10.10-a 10.11-b 10.12-a 10.13-b 10.14-a, b 10.15-a 10.16-b 10.17-a 10.18-a 10.19-c, d

  • TESTE DE CONTROL

    11.1 Directiva

    #define N 10

    a) este gresita, deoarece nu se termina cu semnul ; b) este corecta si are ca efect atribuirea valorii 10 identificatorului N c) este corecta si are ca efect nlocuirea, oriunde apare n program, a identificatorului N cu 10

    11.2 Secventa de program

    #define A 10 #define B A+20

    a) este gresita deoarece cea de-a doua directiva #define contine macroul A din prima directiva #define

    b) este corecta si are ca efect nlocuirea n textul programului a identificatorului B cu textul 10+20

    11.3 Secventa de program

    #define X 10 #define Y X+5 . . . . . . int v; v=X+3*Y; . . . . . .

    a) este gresita deoarece cea de-a doua directiva #define contine macroul X din prima directiva #define

    b) este corecta, iar variabilei v i se atribuie valoarea 45 c) este corecta, iar variabilei v i se atribuie valoarea 55

    11.4 Pentru a anula efectul directivei

    #define M 20

    se foloseste

    a) #define b) #define M c) #undef

    11.5 Directiva

    #define f(x) 3*x . . . . . . int y; y=f(4-1);

    are ca efect

    a) atribuirea valorii 9 variabilei y b) atribuirea valorii 11 variabilei y c) semnalarea unei erori, deoarece f(x) este folosita ca o functie

    11.6 Folosirea unei macrodefinitii n locul unei functii

    a) reduce timpul de executie al programului b) micsoreaza codul programului

  • 11.7 Directiva #include permite

    a) includerea unui fisier C ntr-alt fisier C b) includerea unui fisier antet ntr-un fisier C c) includerea unui fisier antet ntr-un fisier antet

    11.8 Directiva #include se poate folosi

    a) numai sub forma #include b) numai sub forma #include nume_fisier c) att sub forma 1 ct si sub forma 2

    11.9 Un fisier antet

    a) poate contine prototipuri de functii b) poate contine definitii de functii c) poate contine definitii de constante d) poate contine definitii de date sau constante structurate e) poate contine directive #define si #include

    11.10 Directiva #if

    a) permite executia conditionata a unei sectiuni de program b) permite compilarea conditionata a unei sectiuni de program c) permite compilarea unei sectiuni de program functie de valoarea unei expresii constante

    11.11 Directiva #ifdef

    a) permite compilarea conditionata a unei sectiuni de program daca o expresie e adevarata b) permite compilarea unei sectiuni de program conditionata de definirea unui macro c) este echivalenta cu

    #if defined nume si cu

    #if defined(nume) unde nume reprezinta numele unui macro.

    RASPUNSURI

    11.1-c 11.2-b 11.3-b 11.4-c 11.5-b 11.6-a 11.7-b, c 11.8-c 11.9-a, c, e 11.10-b, c 11.11-b, c

  • 1. Generalitati despre C Limbajul C a fost inventat si implementat prima data n anii 70 de catre Dennis Ritchie,

    programator de sistem la Bell Laboratories. El si are originea n limbajul BCPL (Basic Computer Programming Language) care, prin perfectionari si dezvoltari succesive a devenit limbajul B si n final limbajul C.

    Raspndirea initiala a limbajului C se datoreaza folosirii sale n scrierea sistemului de operare UNIX, sistem care cunoaste astazi o ascensiune constanta printre sistemele de operare existente.

    Una din versiunile remarcabile ale limbajului C este cea furnizata mpreuna cu versiunea a 5 a sistemului de operare UNIX. Aceasta versiune este descrisa prima oara n cartea lui Brian Kernighan si Dennis Ritchie intitulata The C Programming Language. Cartea este cunoscuta ca un punct de referinta n evolutia limbajului, fiind asimilata cu un adevarat standard.

    Aparitia microcalculatoarelor a contribuit la raspndirea spectaculoasa a limbajului C n diverse variante. Desi diferenta dintre ele nu a fost niciodata semnificativa, totusi, pentru eliminarea anumitor neconcordante, n anul 1983 o comisie speciala ncepe lucrul pentru elaborarea standardului ANSI (American National Standards Institute) al limbajului C, care apare 6 ani mai trziu, n anul 1989. La ora actuala majoritatea compilatoarelor C sunt compatibile cu acest standard.

    n primele 12 capitole ale lucrarii se prezinta limbajul C standard. Datorita importantei domeniului s-a considerat utila si o initiere, n capitolul al 13-lea, n grafica pe calculator, folosind functiile video Borland C++.

    LOCUL LIMBAJULUI C N FAMILIA LIMBAJELOR DE PROGRAMARE

    Familia limbajelor de programare se poate clasifica n: limbaje de nivel cobort, limbaje de nivel nalt si limbaje de nivel mediu.

    Prima categorie cuprinde limbajul cod-masina si limbajul de asamblare. Ambele sunt specifice tipului de masina de calcul pe care sunt implementate. Limbajul cod masina este limbajul alcatuit din acele instructiuni elementare care sunt ntelese si executate de un anumit tip de calculator. Limbajul de asamblare foloseste n locul codurilor numerice reprezentari simbolice, numite si mnemonice, care usureaza munca de programare. Operatiile limbajului de asamblare sunt operatii de baza ale calculatorului. El nu accepta structuri de control si date structurate, dar permite adresarea simbolica a locatiilor de memorie. Din aceste motive programele n limbaj de asamblare sunt lungi si se scriu anevoios, dar sunt performante din punct de vedere al vitezei de executie si al posibilitatilor de acces la resursele hardware.

    A doua categorie, cea a limbajelor de nivel nalt , include nume binecunoscute: Fortran, Cobol, Basic, Pascal etc.. O parte din trasaturile lor comune se refera la posibilitatea de a folosi structuri de control, date structurate, de a elabora cu usurinta programe portabile (care se pot adapta usor la implementarea pe diverse categorii de sisteme de calcul). Limbajele din aceasta categorie pierd nsa calitatea esentiala a limbajelor de nivel cobort, aceea de a exploata eficient resursele masinii de calcul pe care sunt implementate.

    Categoria limbajelor de nivel mediu mbina trasaturile principale ale limbajelor de nivel nalt cu cele ale limbajelor de nivel cobort. Limbajul C este un limbaj de nivel mediu.

    CTEVA TRASATURI ALE LIMBAJULUI C

    Limbajul C ofera posibilitatea organizarii programelor n module si permite implementarea unor structuri de control si tipuri de date care faciliteaza programarea structurata. Ca si limbajele de nivel nalt este usor de nvatat si de folosit, iar n plus are un numar foarte mic de cuvinte cheie

  • 2

    (32 cuvinte dupa standardul ANSI C). Portabilitatea specifica limbajelor de nivel nalt este accentuata n C prin folosirea functiilor de biblioteca n realizarea operatiilor de intrare/iesire si de prelucrare a fisierelor. Numarul mic de cuvinte cheie si prezenta unei bogate familii de operatori permit realizarea unor programe concise, cu un cod sursa relativ mic. Compilatorul C este mai putin sever n comparatie cu majoritatea compilatoarelor limbajelor de nivel nalt. Daca la aceste trasaturi adaugam si posibilitatea de a oferi facilitati ale limbajelor de nivel cobort (lucru cu adrese de memorie, accesarea registrilor, incrementari, decrementari, apelul unor functii ale sistemului de operare) obtinem imaginea unui limbaj puternic si flexibil preferat n special de programatorii profesionisti.

    STRUCTURA GENERALA A UNUI PROGRAM C

    Structura generala a unui program C este urmatoarea:

    directive preprocesor declaratii globale

    tip main(lista de parametri) { declaratii locale instructiuni }

    tip f1(lista de parametri) { declaratii locale instructiuni }

    tip f2(lista de parametri) { declaratii locale instructiuni } . . . . .

    tip fn(lista de parametri) { declaratii locale instructiuni }

    Precizari: ?? Faza de analiza a unei probleme evidentiaza uzual o functie principala si mai multe functii secundare ale acesteia. Rezultatul acestei faze l constituie o reprezentare modulara, care reflecta interdependenta dintre functiile problemei. n principiu, orice program C este o secventa de functii aflate la acelasi nivel. ?? Cuvintele main, f1,f2,,fn sunt nume de functii C. Orice functie dintr-un program poate apela oricare alta functie din program. Exceptie face functia main() care poate apela alte functii, dar nu poate fi apelata dintr-o functie a programului. La executia unui program C prima functie apelata este main(): executia programului ncepe si se termina cu instructiuni din main(). Ea este obligatorie si poate figura oriunde n program. De obicei este plasata la nceputul programului, pentru a-i mari lizibilitatea.

  • 3

    ?? Directivele preprocesor sunt instructiuni destinate compilatorului, care face transformari preliminare asupra textului nainte de a ncepe compilarea. Faza preprocesarii are drept rezultat obtinerea unei unitati de compilare. Unitatea de compilare este analizata sintactic (compilata), iar rezultatul este depus n module obiect. Modulele obiect rezultate, mpreuna cu modulele obiect corespunzatoare functiilor de biblioteca folosite sunt >legate> cu ajutorul programului linkeditor (editor de legaturi) obtinndu-se programul executabil. Directivele se constituie ca un limbaj n interiorul limbajului C si ofera anumite facilitati: compilarea conditionata a unor portiuni de cod, nlocuirea n text a unui identificator la fiecare aparitie cu un set de caractere, includerea unui fisier sursa n program etc..

    O functie C este alcatuita din antet si un bloc de declaratii si instructiuni delimitat de acoladele A si , numit si corpul functiei. Antetul contine numele functiei, tipul valorii returnate (ntreg, real etc.) si o lista de parametri formali care poate fi eventual vida.

    O functie este definita daca este prezentata complet, adica are forma: antet { corpul functiei }

    Daca se prezinta doar antetul functiei, se spune ca functia este declarata. Declaratia moderna a unei functii poarta numele de prototip.

    Apelul functiei se face sub forma

    nume_functie(lista de parametri actuali)

    si presupune transferul controlului executiei programului catre instructiunile din corpul functiei, executia acestora si revenirea n functia apelanta n punctul unde se executa operatia care urmeaza. Schema de apel este urmatoarea:

    Functie Functie apelanta apelata

    Figura 1.1 - Schema de apel a unei functii

    O functie C nu poate fi declarata sau definita n interiorul altei functii. Declaratiile globale se refera la entitati (tipuri de date, variabile etc.) care sunt

    recunoscute de toate functiile. Declaratiile locale limiteaza valabilitatea acestor entitati doar la nivelul functiei unde se fac. Prezenta prototipului unei functii n zona declaratiilor globale face posibila recunosterea sa n toate functiile care o apeleaza si permite evitarea unor erori de apelare, nca din faza de compilare.

    n constructia unui program C se pot folosi doua categorii de functii: ?? functii utilizator, elaborate de programator; ?? functii standard (predefinite), care pot fi preluate din biblioteca standard a

    limbajului C.

    Apel functie

  • 4

    Functiile standard ale limbajului se pot clasifica n: functii de intrare/iesire, functii pentru prelucrarea caracterelor, functii pentru prelucrarea sirurilor de caractere etc.. n mod corespunzator prototipurile acestor functii sunt grupate n fisiere speciale numite fisiere antet sau header (au extensia ). De exemplu, functiile matematice sunt grupate n fisierul antet math.h, functiile de manipulare a sirurilor de caractere n string.h etc.. Pentru a utiliza o functie standard n program trebuie cunoscut prototipul ei. Acest lucru este posibil prin includerea fisierului antet n program utiliznd directiva #include.

    Un program C poate avea functiile editate ntr-un singur fisier (programe monofisier) sau n mai multe fisiere (programe multifisier). Modul de construire a programelor multifisier este abordat n Capitolul 9. Un exemplu simplu de program C este urmatorul:

    Se observa ca programul este alcatuit dintr-o singura functie, functia main() si foloseste

    functia standard printf() cu prototipul n stdio.h.

    Primul program C

    #include stdio.h

    void main(void) {

    printf(\nPrimul program C!); }

  • 2. Elemente de baza ale limbajului C Asa cum se ntmpla cu orice limbaj artificial, temelia pe care se cladesc programele C

    este alcatuita din alfabet si vocabular (atomi lexicali). Combinnd atomii lexicali dupa regulile specifice de sintaxa se construiesc linii valide de program si, n final, programul.

    ALFABETUL LIMBAJULUI

    Alfabetul limbajului este alcatuit dintr-o multime de simboluri care se pot clasifica n simboluri afisabile si neafisabile.

    Setul minim de simboluri afisabile (care pot fi reprezentate grafic) este alcatuit din:

    ?? litere mari ale alfabetului englez:

    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

    ?? litere mici ale alfabetului englez:

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

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

    ?? liniuta de subliniere: _

    ?? semne de punctuatie si semne speciale:

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

    ^ * - = + { } %

    Prezentam n Tabelul 2.1 denumirea unora din semnele enumerate.

    Tabelul 2.1 Cteva semne folosite n C si denumirea lor

    Semn Nume Semn Nume | bara verticala / slash \ backslash ~ tilda # diez _ liniuta de subliniere (underscore) & ampersand ^ sageata sus

    Simbolurile neafisabile (fara echivalent grafic) sunt reprezentate prin secvente escape (de evitare) sau coduri backslash-caracter. Aceste simboluri reprezint[ coduri ASCII care nu pot fi citite de la tastatura. Folosirea lor n programe n locul echivalentelor ASCII este recomandata din ratiuni de portabilitate.

    Codurile backslash ale limbajului C sunt prezentate n Tabelul 2.2.

  • 6

    Tabelul 2.2 Codurile backslash din C =i semnifica\ia lor

    Coduri backslash Semnificatie \a Alarma \b backspace (recul cu o pozitie) \f form feed (salt pagina noua) \n newline (salt la rnd nou si de la capat) \r carriage return (retur car) \t horizontal tab (tab orizontal) \v vertical tab (tab vertical) \ apostrof \ ghilimele \0 caracter nul \\ backslash

    \ddd caracter ASCII n notatie octala \xdd caracter ASCII n notatie hexazecimala

    Observatii:

    ?? Tab orizontal nseamna saltul cursorului cu un numar de coloane, iar tab vertical saltul cursorului cu un numar de linii.

    ?? Notatia octala foloseste cifre n baza 8 (adica 0,1,2,3,4,5,6,7), iar notatia hexazecimala cifre n baza 16 (adica 0,1,2,3,4,5, 6,7,8,9,A,B,C,D,E,F). Se observa ca literele A,B,C,D,E,F corespund respectiv numerelor 10,11,12,13,14,15. Secventele \ddd permit scrierea oricarui caracter din setul ASCII ca un numar octal format din trei cifre, iar secven\ele \xdd ca un numar hexazecimal format din doua cifre. De exemplu, caracterul backspace poate fi scris ca \010 sau \x08. ??

    VOCABULARUL LIMBAJULUI

    Vocabularul limbajului este alcatuit din atomi lexicali. Acestia reprezinta grupuri de simboluri afisabile care primesc n timpul procesului de compilare o anumita semnificatie. Prezentam mai jos urmatorii atomi lexicali:

    ?? identificatori (nume) ?? constante ?? operatori ?? semne de punctuatie ?? simboluri speciale

    IDENTIFICATORI

    Un identificator reprezinta o secventa de litere, cifre, liniute de subliniere, primul caracter din secventa fiind obligatoriu o litera sau liniuta de subliniere.

    De exemplu, Cod_mat,cod_mat,y_1,ax,_ol sunt identificatori, n timp ce x...1, a&b, 3xy nu sunt. n legatura cu identificatorii facem urmatoarele precizari: ?? n C se face deosebirea ntre literele mari si mici ale alfabetului. De exemplu, Cod_mat si

    cod_mat reprezinta nume diferite; ?? Desi sunt permisi, este recomandabil ca identificatorii care ncep cu liniuta de subliniere sa fie

    evitati. Ei pot coincide cu nume rezervate, invizibile programatorului, provocnd erori; ?? Standardul ANSI C nu limiteaza numarul de caractere (lungimea) unui identificator. Un

    compilator C va ignora nsa caracterele aflate pe pozitii mai mari dect un numar prestabilit.

  • 7

    Cuvintele cheie sunt cuvinte rezervate C care au o destinatie prestabilita (nu pot fi folosite ca nume de functie sau variabila). Standardul ANSI C are 32 de cuvinte cheie, din care 27 au fost definite de varianta originala a limbajului C (standardul Kernighan/Ritchie).

    Tabelul 2.3 Cuvinte cheie dupa standardul Kernighan / Ritchie

    auto break case char continue default do double else extern

    float for goto if Int long register return short Sizeof

    static struct switch typedef Union unsigned while

    Tabelul 2.4 Cuvinte cheie adaugate de standardul ANSI C

    const enum signed Void volatile

    Dupa cum se poate observa cuvintele cheie din C se scriu cu litere mici. Pe lnga cuvintele cheie rezervate de standardul ANSI C, diverse tipuri de compilatoare C includ si cuvinte cheie folosite n exploatarea eficienta a mediului de operare specific (facilitati privind programarea interlimbaje, accesarea ntreruperilor etc.), numite cuvinte cheie extinse.

    Cuvintele cheie extinse folosite cel mai des sunt:

    asm cdecl far huge interrupt Near

    pascal _cs _ds _es _ss

    CONSTANTE

    Constantele pot fi numere, caractere, siruri de caractere; valoarea lor nu se schimba n timpul executiei unui program. n C exista patru tipuri de constante: ntreg, real, caracter, sir.

    O constanta ntreaga este un numar zecimal, octal sau hexazecimal care reprezinta o valoare ntreaga pozitiva. Daca se doresc si reprezentari ale unor numere ntregi negative se adauga semnul minus n fata constantei respective.

    Constantele ntregi zecimale sunt numere ntregi scrise n baza 10 (de exemplu: 759,+38,6496), constantele octale sunt numere n baza 8 care ncep, pentru identificare, cu cifra zero (de exemplu: 012,0765), iar constantele hexazecimale sunt numere n baza 16 care ncep pentru identificare cu caracterele 0x (de exemplu: 0xA3,0xBC1,0x7E31).

    Constantele reale sunt numere reale pozitive. Pentru a reprezenta valori reale negative se plaseaza semnul minus n fata constantei. Semnul minus este tratat ca operator aritmetic. Exista doua modalitati de reprezentare o constantelor reale: n format F (cu punct zecimal) si n format exponential (forma stiintifica).

    Reprezentarea n format F este reprezentarea uzuala pentru numere reale. De exemplu, constantele 32.753,0.591,-4296.823, .69 sunt valori reale reprezentate n format F. Se observa ca partea ntreaga a reprezentarii poate sa lipseasca atunci cnd este egala cu zero (.69 este tot una cu 0.69).

    O constanta reala n format exponential are forma generala: numar simbexp valexp

    unde: ?? numar este o constanta ntreaga sau o constanta reala n format F ?? simbexp este E sau e ?? valexp este o constanta ntreaga pozitiva precedata sau nu de semnele + sau- ?? grupul simbexp valexp se interpreteaza ca fiind egal cu 10valexp.

  • 8

    Remarca. n realitate ntre numar, simbexp, valexp nu apar spatii. De exemplu, numerele reale: 1.6*103, -2.6*10-4, 0.32*106, 423*104 se scriu, respectiv: 1.6E+3,-2.6E-4, 0.32e+6,423E+04.

    O constanta caracter este o litera, cifra, semn de punctuatie sau secventa escape cuprinse ntre doua apostrofuri. Exemplu de constante caracter: a,\n,\,7 reprezentnd respectiv a,newline, apostrof,7.

    O constanta sir este o secventa de litere, cifre si simboluri incluse ntre ghilimele. Exemple de constante sir: \n Acesta e un sir, Str. Cameliei, nr.3 etc.. Constantele sir se memoreaza n octeti consecutivi (un octet pentru fiecare caracter). Sfrsitul sirului este marcat de un octet nul (care contine \0) ce se adauga automat. Din acest motiv un sir cu n caractere ocupa n+1 octeti consecutivi.

    OPERATORI

    Operatorii reprezinta combinatii de semne speciale care arata modalitatea de prelucrare sau atribuire a valorilor. Limbajul C poseda o bogata familie de operatori, fapt ce permite elaborarea unor programe compacte.

    n Tabelul 2.5 prezentam lista operatorilor C si semnificatia lor.

    Tabelul 2.5 Lista operatorilor C si semnificatia lor

    Operator Semnificatie [] paranteze drepte (stnga si dreapta) () paranteze rotunde (stnga si dreapta) . membru structura

    ? referinta indirecta la membru de structura ++ incrementare (prefix sau postfix) -- Decrementare (prefix sau postfix)

    sizeof dimensiunea unei variabile sau unui tip n octeti ~ NOT pe bit ! NOT logic & adresa, SI pe bit * indirectare, nmultire / mpartire + Adunare - scadere, negatie aritmetica

    > deplasare logica pe bit la dreapta == Egalitate != Neegalitate < mai mic > mai mare

    = mai mare sau egal cu ^ SAU exclusiv pe bit ? SAU pe bit

    && SI logic || SAU logic ?: operator conditional = atribuire simpla

    op= atribuire compusa % modul , virgula (operator de secventiere)

  • 9

    Observatie. Caracterul op de la atribuirea compusa poate fi unul din semnele * / % + - >> >= = . De la regula de mai sus face exceptie operatorul conditional (?:) care are alta interpretare.

    SEMNE DE PUNCTUATIE

    Semnele de punctuatie folosite n C sunt: ... # : {} Utilizarea lor va fi exemplificata pe parcursul lucrarii.

    SIMBOLURI SPECIALE

    Orice simbol care nu apartine alfabetului C este considerat atom lexical. Astfel de semne sunt: @ =i $. Ele pot fi folosite n constructia constantelor caracter si a sirurilor. Ca exemplu, consideram constanta sir Am folosit semnul @ in FoxPro.

    Atomii lexicali sunt separati n cadrul programului prin simboluri ale alfabetului cu rol de separator. Separatorii sunt: spatiul, tabul (orizontal si vertical), sfrsit de linie, sfrsit de pagina, comentariu. Prin comentariu se ntelege orice succesiune de simboluri cuprinse ntre /* si */. Comentariile nu sunt luate n considerare de compilator, ele servesc la documentarea programului usurnd ntelegerea si depanarea lui. Un comentariu poate fi plasat oriunde n program si se poate ntinde pe unul sau mai multe rnduri.

    Exemplu:

    /*

    Acest program calculeaza produsul a doua matrici. Matricile de intrare A(4x3) si B(3x2) se citesc de la tastatura, iar matricea produs rezultata este C(4x2).

    */

    Comentariile nu pot fi imbricate (incluse unul n altul). De exemplu, urmatoarea constructie este eronata:

    /* Un comentariu care include /* un comentariu inclus */ */

    Modul n care sunt aranjati atomii lexicali ntr-un program este impus de specificul problemei si de regulile de sintaxa ale limbajului.

  • 3. Expresii n C. Functii de intrare/iesire uzuale pentru consola Expresiile sunt combinatii valide sintactic de date si operatori. Aici, prin date, ntelegem

    deopotriva constante si variabile. Spre deosebire de constante care sunt valori fixe, variabilele semnifica valori care se pot modifica prin program.

    n C, ca si n alte limbaje, datele sunt clasificate n tipuri de date. Exista tipuri de date fundamentale (numite si predefinite, simple sau de baza) si tipuri de date derivate. Tipurile derivate (tablouri, pointeri, structuri, uniuni, enumerari si orice tip definit de programator) se bazeaza pe tipurile fundamentale.

    TIPURILE FUNDAMENTALE DE DATE IN C

    Tipurile de date fundamentale din C se mpart n cinci categorii: char, int, float, double si void. Primele patru tipuri se mai numesc si tipuri aritmetice si se refera respectiv la valori caracter, ntregi, reale n simpla precizie si reale n dubla precizie. Tipul de date void indica absenta oricarei valori si este utilizat, de exemplu, la descrierea functiilor care nu returneaza nici o valoare.

    Dimensiunea zonei de memorie alocate si domeniul de valori asociate tipurilor aritmetice pot sa difere functie de varianta de implementare a limbajului si de tipul de procesor folosit.

    Standardul ANSI C nu precizeaza dect domeniul minimal de valori al fiecarui tip de date, nu si dimensiunea sa. n majoritatea implementarilor nsa, tipul char ocupa un octet, int ocupa doi octeti, iar float patru octeti. Domeniul de valori poate fi modificat utiliznd modificatorii de tip. Acestia sunt: signed, unsigned, short si long. Modificatorii signed, unsigned, short si long se pot aplica tipului int, signed si unsigned, tipului char, iar long, tipului double. Efectul aplicarii modificatorilor signed sau unsigned asupra tipurilor de date ntregi consta n interpretarea diferita, din punct de vedere al semnului, a informatiei memorate. Sa consideram o configuratie binara de lungime N, bitii fiind numerotati ca mai jos:

    N - 1 N - 2 ^ 1 0

    Figura 3.1 Configuratie binara de N biti

    Daca aceasta zona o destinam memorarii doar a ntregilor pozitivi, printr-un calcul simplu se poate vedea ca plaja de reprezentare este [0, 2N-1]. Daca zona este destinata memorarii att a ntregilor cu semn ct si fara semn, bitul N-1 va fi folosit pentru reprezentarea semnului (0 pentru numere pozitive, 1 pentru numere negative), iar plaja de reprezentare va fi [-2N-1, 2N-1-1].

    Avnd n vedere aceste consideratii , de exemplu, o variabila de tip signed int va avea un domeniu de valori cuprins ntre -32768 =i 32767, iar una de tip unsigned int va lua valori ntre 0 =i 65535.

    Observatii:

    ?? Pentru tipul ntreg de date (char, int, short, long) reprezentarea implicita este signed. ?? Specificarea unui modificator fara tip nseamna considerarea implicita a tipului int. ?? n C nu exista tipul de date boolean. Din acest motiv functioneaza urmatoarea conventie: orice expresie diferita de zero are valoarea adevarat, iar daca e egala cu zero, valoarea fals.

  • 11

    VARIABILE SI TIPURI DE DATE

    Asocierea dintre numele unei variabile si un anumit tip de date se face folosind declaratiile. Forma generala a declaratiei unei variabile este:

    tip lista_de_variabile; unde: tip poate fi orice tip de date recunoscut n C, iar lista_de_variabile contine unul sau mai multi identificatori despartiti prin virgula. n exemplele de mai jos vom folosi doar tipurile fundamentale.

    Exemple de declaratii de variabile:

    float x,y; int a,b1; short a_x,b_y; double z;

    Orice variabila folosita n program trebuie mai nti declarata. Daca pe linia de declarare variabila este initializata se spune ca are loc o definire a variabilei.

    Exemple de declaratii si definitii de variabile:

    float x=38.981,I; int ab=-453; char ch=A,z;

    Orice variabila definita (adica declarata si initializata) pastreaza n continuare atributul de baza al variabilei, adica poate fi modificata. Daca se doreste asocierii dintre o variabila si o anumita valoare se utilizeaza modificatorul de acces (sau calificatorul) const. Practic, efectul unei declaratii de genul

    const tip nume_variabila;

    este crearea constantei simbolice nume care poate fi utilizata, dar nu poate fi modificata prin program. Daca tip lipseste se considera implicit ca tipul este int. n exemplul de mai jos se definesc doua constante, constanta pi si constanta de tip int, ore_zi.

    Exemplu: const double pi=3.1415926536; const ore_zi=24;

    CONSTANTE SI TIPURI DE DATE

    n Capitolul 2 (vezi paragraful Vocabularul limbajului), am prezentat o clasificare a constantelor n: ntregi, reale, caracter, sir. Se pune problema, carui tip de date i apartine o constanta numerica? Cnd constanta este caracter, raspunsul este simplu: tipului char. De asemenea, constanta n virgula mobila (n notatie uzuala cu punct sau n notatie stiintifica) va apartine tipului double. Pentru celelalte constante numerice compilatorul va considera implicit ncadrarea ]n cel mai mic tip de date compatibil. De exemplu, 23 este de tip int, 65000 de tip unsigned, 2000002 de tip long int. ncadrarea ntr-un tip de date se poate face si explicit adaugnd constantei unul din sufixurile L sau U, daca e ntreaga sau F sau L, daca e reala. Constanta ntreaga cu sufixul L este de tip long, iar cu sufixul U, de tip unsigned. Constanta reala cu sufixul F are tipul float, iar daca e urmata de sufixul L are tipul long double.

  • 12

    FUNCTII UZUALE DE INTRARE/IESIRE PENTRU CONSOLA. DESCRIPTORI DE FORMAT

    Prezentam n continuare functiile folosite frecvent pentru transferul de date de la tastatura n memoria calculatorului (functii de intrare) si din memoria calculatorului pe ecran (functii de iesire); cu aceasta ocazie introducem si descriptorii de format cei mai folositi. Deosebim trei categorii de functii de intrare/iesire pentru consola:

    ?? functii generale de intrare/iesire (scanf() =i printf()); ?? functii speciale de intrare/iesire:

    ?? functii pentru citirea si scrierea caracterelor; ?? functii pentru citirea si scrierea sirurilor de caractere.

    FUNCTIILE PRINTF() SI SCANF()

    Aceste functii reprezinta echivalentele pentru consola a functiilor de intrare/iesire pentru fisiere, fprintf() si fscanf(), functii care vor fi prezentate n detaliu n Capitolul 10.

    Forma generala a functiei de afisare printf() este:

    int printf(sir_format,lista_de_argumente);

    unde: ?? sir_format poate contine: mesaje pentru utilizator, secvente escape si descriptori de

    format pentru valorile care se afiseaza; ?? lista_de_argumente reprezinta variabile sau expresii al caror continut se va afisa.

    Functia ntoarce numarul de caractere scrise efectiv sau o valoare negativa n caz de insucces.

    Precizari:

    ?? Descriptorii de format servesc la efectuarea conversiilor dintre reprezentarea externa si interna (la citire) si ntre reprezentarea interna si externa (la scriere); formatul extern presupune succesiuni de caractere, iar cel intern succesiuni de cifre binare;

    ?? Att la scriere ct si la citire, descriptorii de format sunt pusi n corespondenta de la stnga spre dreapta cu elementele listei de argumente. Argumentul trebuie sa fie compatibil cu tipul anuntat n descriptorul de format corespunzator;

    ?? Daca numarul de argumente este mai mic dect numarul descriptorilor de format, datele de iesire sunt nedefinite; daca numarul argumentelor este mai mare dect numarul descriptorilor de format, argumentele n plus sunt ignorate. n Tabelul 3.1 prezentam lista celor mai utilizati descriptori folositi de functia printf() si

    semnificatia lor.

    Tabelul 3.1 Descriptori de format Descriptori Utilizare %u numere ntregi zecimale fara semn %d sau %i numere ntregi zecimale cu semn %c caracter %f numere reale n notatie uzuala %e sau % E numere reale n notatie stiintifica (e sau E) %x sau %X hexazecimal fara semn (litere mici sau majuscule) %o octal fara semn %s sir de caractere %g sau %G se alege reprezentarea cu numarul cel mai mic de

    caractere dintre cea n notatie uzuala si cea n notatie stiintifica (de tip e sau E)

    %p valoare pointer

  • 13

    Descriptorul %x are ca efect afisarea cifrelor hexazecimale A,B,C,D,E,F cu litera mica; daca se foloseste %X se afiseaza cu litere mari.

    Daca se foloseste %e litera e din notatia stiintifica apare ca e, iar daca se foloseste %E, apare ca majuscula (litera E).

    Valorile de tip long int se afiseaza utiliznd %ld,%li,%lu,%lo sau %lx. Valorile de tip short int se afiseaza utiliznd %hd,%hi,%hu,%ho sau %hx. Pentru a afisa valori double se va alege una din variantele: %lf,%le,%lE,%lg,%lG, iar

    pentru valori long double una din variantele: %Lf,%Le,%LE,%Lg,%LG. Tabelul 3.1 prezinta descriptori de format fara caracteristici de lungime, precizie si

    aliniere. Folositi astfel, ei aliniaza implicit valorile la stnga si folosesc spatiu de afisare necesar reprezentarii acestor valori dupa cum urmeaza:

    %f afiseaza implicit partea ntreaga, punctul si 6 cifre la partea subunitara; %e sau %E afiseaza implicit o cifra la partea ntreaga, 6 cifre la partea subunitara, caracterul

    e sau E si exponentul precedat de + sau -; %g sau %G alege reprezentarea cu cel mai mic numar de caractere dintre cea uzuala si cea

    stiintifica. %d,%i,%c,%o,%x,%X,%s,%p folosesc un numar de coloane egal cu numarul de caractere

    ce trebuie afisate. Exemplificam folosirea descriptorilor prezentati si a secventelor de evitare cu ajutorul

    urmatoarelor programe:

    Afisarea valorilor si sumei a doua numere ntregi, sub forma:

    x=valoare y=valoare suma=valoare

    # include "stdio.h" void main(void) { int x=10, y=-43; printf ("\n\tx=%d\t\y=%d\n\t suma=%i", x,y, x+y); }

    Afisarea unei constante ntregi si a valorilor sale n octal si hexazecimal pe cte un rnd.

    #include "stdio.h" void main(void) { const x=4529; printf("\n numarul este=%d\n",x); printf("\n valoarea in octal este=%o",x); printf("\n valoarea in hexazecimal este=%x",x); }

  • 14

    Afisarea unui caracter si a codului sau ASCII; afisarea se va termina cu un semnal sonor.

    #include "stdio.h" void main(void) { char a='Q'; printf("\n caracterul %c are codul ASCII=%i\a",a,a); }

    Afisarea unor valori folosind diversi descriptori de format; comentariile arata efectul executiei functiei printf().

    #include "stdio.h" void main(void) { char ch; short k; int i; long int j; float x; clrscr(); ch='A'; printf("\n Caracterul %c are codul ASCII = %i",ch,ch); /* Caracterul A are codul ASCII = 65 */ k=250; printf("\n k=%hu",k); /* k=250 */ i=4567; printf("\n i=%i",i); /* i=4567 */ printf("\n i=%u",i); /* i=4567 */ printf("\n -i=%i",-i); /* -i=-4567 */ printf("\n i=%i",i); /* i=4567 */ printf(" are valoarea hexazecimala %x",i); /* are valoarea hexazecimala 11d7 */ printf(" sau echivalent, %X",i); /* sau echivalent, 11D7 */ printf("\n i=%i",i); /* i=4567 */ printf(" are valoarea octala %o",i); /* are valoarea octala 10727 */ j=123456; printf("\n j=%li",j); /* j=123456 */

  • 15

    Dimensiunea cmpului de afisare, precizia si modul de aliniere pot fi stabilite prin

    simboluri plasate ntre semnul % si specificatorul descriptorului de format (i,d,u,f etc.). Astfel, un ntreg pozitiv aflat ntre % si specificatorul descriptorului de format indica

    dimensiunea minima a cmpului de afisare. Daca sirul sau numarul care se afiseaza are mai multe caractere dect dimensiunea minima precizata, atunci afisarea va fi integrala, n caz contrar se completeaza cu spatii pna la realizarea dimensiunii minime. Daca dorim ca aceasta completare sa fie facuta cu cifra 0 n loc de spatii, atunci, nainte de ntregul care specifica dimensiunea de afisare, se pune cifra 0.

    De exemplu, descriptorul %7f semnifica afisarea unui numar real pe minim 7 coloane si, completarea eventualelor coloane libere cu spatii, iar %07f impune acelasi numar minim de coloane pentru afisare, nsa completarea coloanelor libere se va face cu cifra 0.

    Utilitatea precizarii dimensiunii minime de afisare apare mai ales la afisarea tablourilor n care alinierea se face pe coloane.

    Programul urmator ilustreaza efectul precizarii dimensiunii cmpului de afisare:

    x=76.5432; printf("\n x=%f",x); /* x=76.543198 */ printf("\n x=%e",x); /* x=7.65320e+01 */ printf("\n x=%E",x); /* x=7.65320E+01 */ printf("\n x=%g",x); /* x=76.543200 */ printf("\n x=%G",x); /* x=76.543200 */ x=-0.123456789; printf("\n x=%f",x); /* x=-0.123457 */ printf("\n x=%e",x); /* x=-1.234568e-01 */ printf("\n x=%E",x); /* x=-1.234568E-01 */ printf("\n x=%g",x); /* x=-0.123457 */ printf("\n x=%G",x); /* x=-0.123457 */ printf("\n %s","testare"); }

  • 16

    Precizia de afisare se specifica printr-un punct urmat de un ntreg pozitiv. Specificatorul de precizie astfel obtinut se plaseaza imediat dupa dimensiunea cmpului de afisare (cnd este precizata). Interpretarea lui depinde de tipul de date avut n vedere.

    De exemplu, descriptorul %7.3f indica afisarea unui numar real pe minim 7 coloane si cu 3 cifre zecimale dupa virgula. Lucrurile se petrec asemanator daca n loc de %f se foloseste %e sau %E. Daca se foloseste unul din descriptorii %g sau %G specificatorul de precizie arata minimul de cifre semnificative.

    Aplicat unui ntreg, specificatorul de precizie arata numarul minim de cifre cu care va apare afisat ntregul respectiv (daca ntregul nu are suficiente cifre atunci se completeaza la nceput cu numarul necesar de cifre 0).

    Un descriptor de format prevazut cu specificator de dimensiune si specificator de precizie poate fi aplicat unui sir cu lungimea cuprinsa ntre valoarea specificatorului de dimensiune si cea a specificatorului de precizie. Daca se depaseste valoarea specificatorului de precizie, sirul se trunchiaza.

    Se poate impune alinierea la stnga a datelor plasnd semnul (minus) imediat dupa semnul % n cadrul descriptorului.

    Afisarea unor valori folosind descriptori de format cu precizarea dimensiunii cmpului de afisare

    #include "stdio.h" void main(void) { int i; float x; i=4567; printf("\n i=%4i",i); /* i=4567 */ printf("\n i=%6i",i); /* i= 4567 */ printf("\n i=%3i",i); /* i=4567 */ printf("\n i=%06i",i); /* i=004567 */ x=76.123001; printf("\n x=%10f",x); /* x= 76.123001 */ printf("\n x=%010f",x); /* x=076.123001 */ printf("\n %3s","testare"); /* testare */ printf("\n %10s","testare"); /* testare */ }

  • 17

    Programul urmator ilustreaza toate cazurile prezentate:

    Functia de citire scanf() are forma generala:

    int scanf(sir_format,lista_de_argumente); unde: ?? sir_format poate contine descriptori de format, caractere de spatiere albe, alte caractere;

    ?? lista_de_argumente este de forma: &var1,&var2,...,&varn. Prin &v se ntelege adresa variabilei v.

    Functia ntoarce numarul de argumente carora li s-a atribuit o valoare sau constanta EOF (egala de obicei cu 1) n caz de insucces.

    Precizari:

    ?? n marea lor majoritate descriptorii de format folositi la functia scanf() sunt identici cu cei de la functia printf(); practic, din tabelul prezentat anterior obtinem o lista valida pentru scanf(), ndepartnd %E,%X,%G. Folositi cu scanf(), descriptorii %f,%e,%g sunt echivalenti. ?? Lista de argumente este citita de la stnga la dreapta si asociata n aceasta ordine cu lista de descriptori. Fiecare descriptor arata functiei scanf() tipul valorii care se va citi: ntreg, real, sir, pointer etc.. Sa observam ca aceste valori sunt transferate variabilelor v1,v2,...vn prin intermediul adreselor &v1,&v2,...&vn.

    Afisarea unor valori folosind diverse facilitati ale descriptorilor prezentati

    #include "stdio.h" void main(void) { int i; double x; i=4567; printf("\n i=%3.7i",i); /* i=0004567 */ printf("\n i=%7.3i",i); /* i= 4567 */ printf("\n i=%-7.3i",i); /* i=4567 */ x=76.123401; printf("\n x=%10.3f",x); /* x= 76.123 */ printf("\n x=%-10.3f",x); /* x=76.123 */ printf("\n x=%3.7f",x); /* x=76.1234010 */ printf("\n x=%10.2e",x); /* x= 7.61e+01 */ printf("\n x=%-10.1E",x); /* x=7.6E+01 */ printf("\n x=%10.3g",x); /* x= 76.1 */ printf("\n x=%-10.4G",x); /* x=76.12 */ printf("\n %.4s","testare"); /* test */ printf("\n %10.4s","testare"); /* test */ printf("\n %-10.4s","testare");/* test */ printf("\n %-1.10s","testare");/* testare */ }

    Exemplu 3.6

  • 18

    ?? Este de mentionat faptul ca n cazul citirii unui sir, deoarece nsusi numele sirului reprezinta o adresa, operatorul de luare a adresei & nu va mai preceda obligatoriu numele sirului. Un exemplu de program care citeste siruri de caractere este prezentat n Capitolul 5 (vezi paragraful Functii pentru prelucrarea sirurilor de caractere). ?? Ca si n cazul functiei printf() descriptorii de format pot avea si un modificator de lungime maxima a sirului de caractere care va fi citit. De exemplu, apelul:

    scanf(%15s,sir);

    are drept consecinta citirea a maximum 15 caractere din sirul de intrare si atribuirea sirului format variabilei sir. Daca sirul de intrare are mai mult de 15 caractere, caracterele n plus se ignora; la un nou apel al functiei scanf() explorarea sirului de intrare ncepe cu aceste caractere anterior ignorate. ?? Caracterele albe de spatiere n sirurile de intrare pot fi blankurile (spatiile albe), taburile (spatii tab), sau caracterul linie noua (tasta enter). Aceste caractere albe de spatiere sunt ignorate dacp n sirul format avem corespunzator ntre descriptori cel putin un spatiu. De asemenea, orice alt caracter poate fi folosit ca separator n fluxul de intrare, cu conditia ca el sa fie plasat corespunzator si ntre descriptorii de format din sir_format. Daca aceasta conditie nu e ndeplinita, la prima neconcordanta (de la stnga la dreapta) ntre separatorii din fluxul de intrare si cei din sir_format executia functiei scanf() se ncheie. De exemplu, apelul functiei scanf():

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

    realizeaza o atribuire corectaa datelor de intrare daca ele sunt despartite prin virgula. Pentru a atribui variabilei x valoarea 32, lui y valoarea 10.75 =i variabilei sir valoarea anI, n fluxul de intrare trebuie sa avem 32,10.75,anI.

    Observatii:

    ?? X =i x sunt variabile diferite;

    ?? X=X*x; este o expresie de atribuire care se poate scrie mai scurt sub forma X*=x; cu ajutorul operatorului compus *=.

    Functiile scanf() si printf() sunt functii de intrare/iesire standard cu destinatie generala. Din considerente de eficienta (cod mai mic, viteza de executie sporita, comoditate n programare etc.) limbajul C pune la dispozitia utilizatorului si functii cu destinatie speciala.

    Citirea numerelor reale x =i X de la tastatura, calculul produsului x*X si afisarea lui n format exponential.

    #include "stdio.h" void main(void) { float x,X; printf("\n Tastati doua numere separate prin spatiu "); scanf("%f %f",&x,&X); X=X*x; printf("\n Produsul X*x este = %e", X); }

  • 19

    FUNCTII SPECIALE PENTRU CITIREA/SCRIEREA CARACTERELOR LA NIVELUL CONSOLEI

    Standardul ANSI C prevede doua functii simetrice pentru transferul caracterelor la nivelul consolei: functiile getchar() si putchar(). Ele si au prototipurile n stdio.h.

    Functia pentru citire getchar() are forma generala

    int getchar(void);

    si ntoarce urmatorul caracter care va fi citit. Daca s-a atins sfrsitul sirului sau se produce o eroare se ntoarce EOF.

    Desi nu apartin standardului ANSI C, totusi, functiile getch(), getche(), putch() sunt incluse frecvent n biblioteca standard a compilatoarelor compatibile DOS. Prototipurile acestor functii sunt n fisierul header conio.h.

    Functiile getch() si getche() sunt echivalente functional cu functia getchar(). Forma generala este:

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

    Spre deosebire de functia getchar() unde caracterul tastat este citit numai daca se apasa n continuare tasta Enter, functiile getch() si getche() preiau caracterul imediat dupa ce a fost tastat (fara a mai apasa Enter). De asemenea, functia getch() preia caracterul de la tastatura fara a-l afisa pe ecran, n timp ce getche() afiseaza pe ecran caracterul citit (citire cu ecou).

    Functia pentru afisare putchar() are forma generala

    int putchar(int ch);

    unde ch este caracterul care se afiseaza. Functia ntoarce n caz de succes caracterul scris, iar n caz contrar EOF. Functia putch() este echivalenta functional cu putchar() si are forma generala

    int putch(int ch); unde ch este caracterul care se afiseaza.

    Ea este de asemenea o functie nestandard (nu e definita de standardul ANSI C) frecvent utilizata.

    FUNCTII SPECIALE PENTRU CITIREA/SCRIEREA SIRURILOR DE CARACTERE LA NIVELUL CONSOLEI

    Functii speciale pentru citirea/scrierea sirurilor de caractere la nivelul consolei sunt gets() si puts(). Ambele functii si au prototipurile n fisierul header stdio.h. Aceste prototipuri sunt

    Citirea si afisarea unui caracter folosind functiile speciale getche() si putch() #include "stdio.h" #include "conio.h" void main(void) { char x; printf("\n Tastati o litera! "); x=getche(); printf("\n Multumesc! Ati tastat litera "); putch(x); getch(); }

  • 20

    prezentate n Capitolul 12 al lucrarii. Deoarece n constructia acestor prototipuri intervine notiunea de pointer, prezentata n detaliu n Capitolul 6, ne limitam aici la a spune ca prin apelul

    gets(sir_destinatie);

    se citeste un sir de la tastatura n sir_destinatie, iar apelul

    puts(sir);

    are ca efect afisarea sirului sir pe ecran. Dam ca exemplu secventa de program:

    . . . . . . . gets(x); . . . . . . . printf(\n Sirul citit este =); puts(x); . . . . . . .

    Un program complet care utilizeaza functiile gets() si puts() este prezentat n Capitolul 5 (vezi paragraful Functii pentru prelucrarea sirurilor de caractere).

    OPERATORI. CLASIFICARE

    Operatorii sunt elemente de baza ale limbajului care arata ce operatii trebuie executate asupra unor operanzi. n C, operanzi pot fi constantele, numele de variabile, numele de functii, expresiile.

    Bogata familie de operatori confera limbajului C o trasatura aparte. Clasificarea operatorilor C se poate face dupa mai multe criterii: ?? dupa numarul de operanzi prelucrati (unari, binari, ternari); ?? dupa prioritatea avuta n evaluarea expresiilor (clase de precedenta); ?? dupa tipul operanzilor (aritmetici, relationali, logici si la nivel de bit ).

    OPERATORI UNARI, BINARI, TERNARI

    Tinnd cont de numarul de operanzi prelucrati, n C exista operatori unari, binari si ternari. Clasele rezultate nu sunt disjuncte, n sensul ca, de exemplu, un operator unar poate fi si binar. Astfel, n expresia -3 operatorul - (minus) este unar, iar n expresia a-3, este binar.

    Singurul operator ternar este operatorul conditional ?:. Operanzii sai sunt plasati dupa schema operand1 ? operand2 : operand 3.

    CLASE DE PRECEDENTA

    Prioritatile operatorilor impun ordinea de evaluare a expresiilor. Ca si n calculele algebrice obisnuite ordinea de evaluare poate fi modificata cu ajutorul parantezelor rotunde.

    Operatorii care au prioritati egale, apartin aceleiati clase de precedenta. Lista operatorilor grupati dupa clase de precedenta este data n Tabelul 3.2.

    Tabelul 3.2 Clase de precedenta

    Clasa Operatori 1 (paranteze, op. de selectie) () [] -> . 2 (op.unari) ++ -- ! ~ - + & * sizeof cast 3 (op. multiplicativi) % / * 4 (op. aditivi) + - 5 (op. shift) > 6 (op. relationali) < >=

  • 21

    7 (op. relationali) == != 8 (SI pe bit) & 9 (SAU exclusiv bit cu bit) ^ 10 (SAU bit cu bit) | 11 (SI logic) && 12 (SAU logic) || 13 (operator conditional) ?: 14 (atribuire) = += -= *= etc. 15 (secventiere) ,

    Func