Sunteți pe pagina 1din 50

1. Care din urmatoarele actiuni au loc la compilare?

(a) analiza lexicala b) includerea fisierelor header c) definirea constantelor simbolice (d) analiza sintactica (e) generarea codului obiect f) editarea de legaturi 2. Fisierele header, furnizate alaturi de biblioteci de module cod obiect, impreuna cu un compilator, contin: (a) definitiile functiilor de biblioteca b) macro-definitii (c) prototipurile functiilor de biblioteca 3. La preprocesarea unui fisier sursa C a) se includ functiile de biblioteca (b) se obtine o noua versiune a textului sursa c) se obtine codul obiect

4. In conditiile de mai jos


#define PI int r; 3.14

valoarea expresiei 2 * PI * r este de tip a) int b) float ((c)) double d) long


/* #include<stdio.h> #define PI 3.14 int main () {int r=1; int h; h=sizeof(2*PI*r); printf("sizeof(PI) = %d bytes\n", sizeof(PI)); printf("sizeof(2*PI*r) = %d bytes", h); printf("\nperimetru = %g", 2*PI*r); return 0; } */ // 3.14 este o constanta reala declarata implicit double; r este schimbat din int in double; rezultatul va fi double

5. Daca variabila r este declarata de tipul float, in conditiile definitiilor


#define PI 3.14 #define perimetru(raza) 2*PI*raza

valoarea expresiei perimetru(r) este de tip a) int b) float ((c)) double d) long
/* #include<stdio.h> #define PI 3.14 #define perimetru(raza) 2*PI*raza int main () {float r=1; int h; h=sizeof(perimetru(r)); printf("sizeof(PI) = %d bytes\n", sizeof(PI)); printf("sizeof(2*pi*raza) = %d bytes", h); printf("\nperimetru = %g", perimetru(r)); return 0; }*/ //3.14 este o constanta reala declarata implicit double; r este schimbat din float in double; rezultatul va fi double

6. Urmatoarea macrodefinitie
#define swap(a,b) {a=a^b; b=a^b; a=a^b;}

poate fi apelata ca swap(x, y); a) numai daca x si y sunt variabile de tip real ((b)) numai daca x si y sunt variabile de tip intreg c) daca x si y sunt constante intregi d) indiferent de ce tip numeric sunt variabilele x si y
/* #include<stdio.h> #define swap(a,b) int main () {int a=3, b=7; swap(a,b); printf("a=%d b=%d", a, b); return 0; } */ //operatorii logici pe biti nu functioneaza cu numere reale {a=a^b; b=a^b; a=a^b;}

7. Urmatoarea macrodefinitie
#define swap(a,b) {a=a+b; b=a-b; a=a-b;}

poate fi apelata ca swap(x, y); a) numai daca x si y sunt variabile de tip real b) numai daca x si y sunt variabile de tip intreg c) daca x si y sunt constante intregi ((d)) indiferent de ce tip numeric sunt variabilele x si y

8. In conditiile
#define swap(a,b) {int aux; aux=a; a=b; b=aux;} float x=10.5, y=3.75;

in urma apelului swap(x, y); valorile lui x, respectiv y vor fi a) x=3.75 si y=10.5 b) x=3.0 si y=10.5 ((c)) x=3.75 si y=10.0 d) x=3.0 si y=10.0
/* #include<stdio.h> #define swap(a,b) {int aux; aux=a; a=b; b=aux;} int main () {float x=10.5, y=3.75; swap(x,y); printf("a=%g b=%g", x, y); return 0; } */ //aux=a va fi 10 in loc de 10.5 deoarece aux este int

9. In conditiile
#define swap(a,b) {int aux; aux=a; a=b; b=aux;} float x,y;

in urma apelului swap(x, y); rezultatul (interschimbarea valorilor lui x si y!) a) este corect b) nu este corect c) depinde de valorile lui x si y ((d)) depinde doar de valoarea lui x
// daca x este numar intreg nu se va pierde partea zecimala

10. Ce este gresit in


#define cub(x) x*x*x

a) cu o directiva define nu se pot defini decat constante simbolice b) parametrului x nu i s-a declarat tipul ((c)) la apeluri de genul cub(a+b) rezultatul nu reprezinta, in general, cubul sumei (a+b)
/* #include<stdio.h> #define cub(x) x*x*x int main () {int a=3, b; b=cub(a+2); printf("cub(x)=%d", b); return 0; } */ // cub(x)=a+2*a+2*a+2, 17 in loc de 125; corect ar fi (x)*(x)*(x)

11. Care din variante defineste corect si complet ce anume se specifica prin tipul unei date? a) Numarul de octeti ocupati (b) Spatiul necesar reprezentarii si modul de reprezentare c) Operatiile permise 12. Care din urmatoarele cuvinte rezervate denumesc tipuri de date intregi predefinite in C? ((a)) char b) float ((c)) short ((d)) int ((e)) long f) long double
// 1, 2, 2 sau 4, 4 bytes

13. Cum se numeste modul de reprezentare al datelor reale? ((a)) virgula mobila b) complement fata de doi c) virgula fixa
// floating point

14. Ce este o variabila? a) litera care tine locul unor valori (de ex. a, b, c sau x, y, z) b) o valoare care se schimba (c) o zona de memorie identificabila in care se pot pastra valori 15. Ce caracteristica a unei variabile este precizata de clasa sa de memorare? a) locul unde poate fi folosita (b) locul unde se creaza c) locul unde se vede 16. Care din urmatoarele clase de memorare se specifica implicit? ((a)) static ((b)) auto c) register d) extern
// static sunt variabilele globale, auto sunt cele locale; register si extern trebuie declarate explicit

17. Ce reprezinta domeniul unei variabile: a) plaja de valori pe care le poate lua b) locul unde se creaza (c) locul din textul sursa unde poate fi folosita d) daca are semn sau nu

18. Care este atributul care precizeaza unde (intr-un text sursa C) poate fi utilizat legal identificatorul unei variabile? (a) domeniul b) durata de viata c) vizibilitatea d) clasa de memorare 19. Care din urmatoarele cuvinte rezervate denumesc tipuri de date reale predefinite in C? a) char ((b)) float c) short ((d)) double e) long ((f)) long double
// 4, 8, 12 bytes

20. Cum se numeste modul de reprezentare al datelor intregi? a) virgula mobila ((b)) complement fata de doi c) virgula fixa
// twos complement

21. Care atribut al unei variabile indica locul in care este creata varibila? a) domeniul b) durata (c) clasa de memorare d) vizibilitatea

22. Stiind ca valorile datelor de tip intreg sunt cu semn, care va fi valoarea variabilei c dupa secventa:
char c=130;

a) 130 ((b)) -126 c) \0 d) c


// char are 1 byte, adica 8 biti cu valori intre -128 si 127 (signed); // 130 trece peste limita de 7 biti (signed) 10000010 // in twos complement daca primul bit este 1 atunci numarul este negativ // -128 este 10000000, -127 este 10000001 si -126 este 10000010 (130)

23. Declaratia register int i; detrmina crearea variabilei i: a) intr-un registru b) pe stiva (c) depinde de context d) declaratia are ca efect inregistrarea variabilei! 24. Declaratia extern int val; (a) este o declaratie de referire b) determina crearea variabilei (c) anunta tipul variabilei val, declarata altundeva 25. O declaratie de referire a) creaza o variabila (b) se face cu cuvantul rezervat extern (c) anunta tipul unei variabile nedeclarate inca in respectivul fisier sursa d) precizeaza o referinta (adresa)

26. Domeniul identificatorilor de variabile globale tine din locul declaratiei pana la: a) sfarsitul blocului b) sfarsitul programului (c) sfarsitul textului sursa d) sfarsitul functiei 27. Domeniul identificatorilor de variabile locale tine din locul declaratiei pana la: a) sfarsitul programului b) sfarsitul textului sursa c) sfarsitul functiei (d) sfarsitul blocului

32. Care este ordinea de evaluare a expresiilor compuse, daca nu se folosesc paranteze? a) intotdeauna de la stanga spre dreapta b) intotdeauna de la dreapta spre stanga c) aleatoare (d) in functie de precedenta operatorilor 33. Cand au loc conversii implicite de tip? a) la citrea datelor de intrare si la afisarea rezultatelor (b) cand operanzii unei expresii au tipuri diferite (c) cand argumentul actual cu care se apeleaza o functie are alt tip decat argumentul formal corespunzator 34. Care din urmatorii operatori NU admit operanzi reali? a) operatorii de incrementare/decrementare b) operatorii logici (c) operatorii logici pe biti (d) operatorii de deplasare

10

35. Care din urmatorii operatori admit operanzi reali? a) operatorii logici pe biti b) operatorii de deplasare (c) operatorii de incrementare/decrementare (d) operatorii logici 36. Care este rezultatul numeric al evaluarii unei expresii relationale sau logice? a) FALSE sau TRUE ((b)) 0 sau 1 c) 0 sau diferit de 0

11

37. Care din urmatoarele valori sunt adevarate din punct de vedere logic? a) \0 ((b)) 0x80 ((c)) 0 ((d)) 280 e) 0.0 ((f)) 3.14F
/* #include<stdio.h> int main () { if('\0') printf("'\\0' is TRUE"); else printf("'\\0' is FALSE"); if(0x80) printf("\n0x80 is TRUE"); else printf("\n0x80 is FALSE"); if('0') printf("\n'0' is TRUE"); else printf("\n'0' is FALSE"); if(280) printf("\n280 is TRUE"); else printf("\n280 is FALSE"); if(0.0) printf("\n0.0 is TRUE"); else printf("\n0.0 is FALSE"); if(3.14F) printf("\n3.14F is TRUE"); else printf("\n3.14F is FALSE"); return 0; } */

12

38. Care din urmatoarele valori sunt false din punct de vedere logic? ((a)) \0 b) 0x1F c) 0 ((d)) NULL ((e)) 0.0 f) 1F
// 1F este ilegal... din moment ce programul nu mai merge banuiesc ca nu poate fi fals

39. Date declaratiile


int n=10, m=4; float x;

valoarea expresiei x = 1.5 + n/m este a) 4.0 ((b)) 3.5 c) de tip double ((d)) de tip float
/* #include<stdio.h> int main () { int n=10, m=4; float x; printf("1.5+n/m=%g\n", x = 1.5 + n/m); printf("\nsizeof(x)=%d\n", sizeof(x)); return 0; } */ // n si m sunt int, 10/4 este 2; 1.5 este double; 1.5 + 2 = 3.5 de tip double; // rezultatul 3.5 double este stocat in x si devine float

13

40. Date declaratiile


int n=10, m=4;

valoarea expresiei 1.5 + n/m este a) 4 ((b)) 3.5 ((c)) de tip double d) de tip float
/* #include<stdio.h> int main () { int n=10, m=4; printf("sizeof(1.5+n/m)=%d\n", sizeof(1.5 + n/m)); printf("\n1.5+n/m=%g\n", 1.5 + n/m); return 0; } */ // 1.5 este double; 10/4 este 2; inainte de a face adunarea 1.5 + 2, 2 este promovat de la int la double // valoarea expresiei este de tip double

14

41. Data declaratia


float x=2.5;

valoarea expresiei x=3.0*x + 10/4 este a) 10.0 ((b)) 9.5 c) de tip double ((d)) de tip float
/* #include<stdio.h> int main () { float x=2.5; printf("sizeof(x=3.0*x+10/4)=%d\n", sizeof(x=3.0*x+10/4)); printf("\n3.0*x+10/4=%g\n", x=3.0*x+10/4); return 0; } */ // 3.0 este double; 10/4 este int si egal cu 2; 7.5 + 2 = 9.5 // 9.5 (double) este stocat in x care are tipul float

15

42. Date declaratiile


float x=2.5;

valoarea expresiei 3.0*x + 10/4.0 este ((a)) 10.0 b) 9.5 ((c)) de tip double d) de tip float
/* #include<stdio.h> int main () { float x=2.5; printf("sizeof(x=3.0*x+10/4.0)=%d\n", sizeof(3.0*x+10/4.0)); printf("\n3.0*x+10/4.0=%g\n", x=3.0*x+10/4.0); return 0; } */ // 3.0 e double; 10 este int, 4.0 este double // 10 promovat la double pt impartire; 10/4.0=2.5; // 7.5+2.5=10; valoarea expresiei de tip double

16

43. Date declaratiile


int n=200, m=200; long r;

si presupunand ca sizeof(int) este 2 iar valorile tipurile intregi sunt implicit cu semn, valoarea expresiei r=n*m este: ((a)) 40000 b) -25536 ((c)) de tip long d) de tip int
/* #include<stdio.h> int main () { short n=200, m=200; long r; printf("sizeof(r=n*m)=%d\n", sizeof(r=n*m)); printf("\nn*m=%d\n", r=n*m); return 0; } */ // n si m sunt de tip short; 200*200=40000; // deoarece 40000 nu poate fi reprezentat in signed short (maxim 32767) este promovat la unsigned short (65535) // 40000 unsigned short este trecut in r si expresia va avea tipul long

17

44. Daca a este o variabila intreaga, care este valoarea expresiei


(a < 'a') && (a > 'z')

a) 1 ((b)) 0 c) depinde de valoarea lui a


/* #include<stdio.h> int main () {int a=100, b=5; printf("%d", (a < 'a') && (a > 'z') ); printf("\n%d", (b < 'a') && (b > 'z') ); return 0; } */ // // in // valoarea numerica a caracterelor este a=97; z=122 oricat ar fi a, nu poate fi mai mic decat 97 si mai mare decat 122 acelasi timp prima sau a doua evaluare va fi 0, valoarea expresiei va fi 0

45. Daca a este o variabila intreaga, care este valoarea expresiei


(a < 'a') || (a > 'z')

a) 1 b) 0 ((c)) depinde de valoarea lui a


/* #include<stdio.h> int main () {int a=100, b=5; printf("%d", (a < 'a') || (a > 'z') ); printf("\n%d", (b < 'a') || (b > 'z') ); return 0; } */ // a=97; z=122 // daca a este intre 97 si 122 rezultatul va fi 0 // pentru orice alte valori a va fi 1 deoarece cel putin una din expresii va fi adevarata

18

46. Date declaratiile:


int i, t[10];

valoarea expresiei
( i=0 ) && ( t[i]<0 )

a) este 1 ((b)) este 0 c) depinde de valoarea lui t[i]


/* #include<stdio.h> int main () {int i, t[10]; printf("%d", ( i=0 ) && ( t[i]<0 ) ); return 0; } */ // i=0 este de fapt (i=0)!=0 // conditia va fi totdeauna falsa, 0 nu poate fi diferit de 0

47. Date declaratiile:


static int i, t[10];

si presupunand ca atat i, cat si t nu sunt initializati explicit, valoarea expresiei


( i==0 ) || ( t[i]<0 )

((a)) este 1 b) este 0 c) depinde de context


/* #include<stdio.h> int main () {static int i, t[10]; printf("%d", ( i==0 ) || ( t[i]<0 ) ); return 0; } */ // variabilele static sunt initializate cu 0 // i==0 este totdeauna adevarat

19

48. Date declaratiile variabilelor locale:


int i, t[10];

si presupunand ca atat i, cat si t nu sunt initializati explicit, valoarea expresiei


( i==0 ) || ( t[i]<0 )

a) este 1 b) este 0 (c) depinde de context


// deoarece i si t[10] sunt variabile auto ele nu sunt initializate cu 0 // i va avea valoarea care este in acel moment in stack la acea adresa de memorie // exista posibilitatea ca i sa fie 0 sau t[i]<0 insa cel mai probabil programul nu va functiona

49. Date declaratiile variabilelor locale:


int i, t[10]={0};

si presupunand ca i nu este initializat explicit, valoarea expresiei


( i==0 ) || ( t[i]==0 )

a) este 1 b) este 0 ((c)) depinde de i


// i si t[10] sunt variabile auto // t[10] este initializat cu 0 pe toate pozitiile, t[i]==0 este totdeauna fals, 0 // doar daca i primeste din stack valoarea 0 va fi expresia adevarata, 1; programul nu merge

20

50. In conditiile in care c este declarat


char c:

valoarea expresiei
c = getchar() != EOF

a) este valoarea returnata de functia getchar b) este 0 c) este 1 ((d)) este 0 sau 1
/* #include<stdio.h> int main () {char c; printf("%d", c = getchar() != EOF ); return 0; } */ // != are precedenta mai mare decat =, (c = (getchar() != EOF)) mai bine zis ((c = (getchar() != EOF)) != 0) // daca tasta apasata este diferita de EOF c va lua valoarea 1; cum c=1 este diferit de 0 expresia va fi adevarata, 1 // daca getchar() returneaza EOF, EOF!=EOF este fals, 0; c va fi 0 si nu diferit de 0; toata expresia este 0

51. Presupunand ca adresele se reprezinta pe 4 octeti, cat spatiu de memorie se rezerva prin urmatoarele declaratii:
extern long count; struct node { long key; struct node *next; };

a) 12 octeti b) 8 octeti c) 4 octeti d) nici un octet

21

52. Care este rezultatul evaluarii expresiei


"0123456789"[i]

daca i=9? a) expresia este gresita sintactic ((b)) 9 c) 9 d) 8


/* #include<stdio.h> int main () {int i=9; printf("%c", "0123456789"[i] ); return 0; } */ // expresia va returna al 10-lea element din sirul de caractere, adica 57 care este 9

53. Care este rezultatul evaluarii expresiei


"0123456789"[i]

daca i=0? a) expresia este gresita sintactic b) 0 ((c)) 0 d) \0


// expresia va returna primul element din sirul de caractere, adica 48 care este 0

22

54. Care este rezultatul evaluarii expresiei


"0123456789"[i]

daca i=10? a) expresia este gresita sintactic ((b)) nedefinit c) \0 d) 9


// expresia va returna al 11-lea element din sirul de caractere, insa sirul nu are decat 10 elemente // valoarea stocata la urmatoarea adresa va fi returnata, valoare din stack, care poate fi oricat

55. Care este rezultatul evaluarii expresiei


"0123456789"[10]

a) expresia este gresita sintactic ((b)) expresia nu are sens c) 9 d) 0


// expresia va returna al 11-lea element din sirul de caractere, insa sirul nu are decat 10 elemente // valoarea stocata la urmatoarea adresa va fi returnata, valoare din stack, care poate fi oricat

23

56. Care este rezultatul numeric al evaluarii exprresiei


a < b < c

daca a=-2, b=-1, c=0? a) 1 b) TRUE ((c)) 0 d) FALSE


/* #include<stdio.h> int main () {int a=-2, b=-1, c=0; printf("%d", a < b < c ); return 0; } */ // deoarece expresia are operatori cu aceeasi prioritate, ea va fi evaluata de la stanga la dreapta // a < b este adevarat si rezultatul este 1; 1 < c este fals si rezultatul final este 0

57. Care este rezultatul numeric al evaluarii exprresiei


a < b < c

daca a=0, b=1, c=2? ((a)) 1 b) TRUE c) 0 d) FALSE


// expresia are operatori cu aceeasi prioritate si va fi evaluata de la stanga la dreapta // a < b este adevarat si rezultatul este 1; 1 < c este adevarat si rezultatul final este 1

24

58. Daca t este un tablou, ce reprezinta valoarea expresiei


sizeof t /sizeof t[0]

a) expresia este gresita sintactic b) expresia nu are sens ((c)) numarul de elemente ale tabloului t d) numarul de octeti ocupati de t respectiv t[0]
/* #include<stdio.h> int main () {int t[5]; printf("sizeof(t)=%d sizeof(t[0])=%d", sizeof t, sizeof t[0] ); printf("\n%d elements", sizeof t /sizeof t[0] ); return 0; } */ // sizeof t va returna numarul de bytes al tipului lui t inmultit cu numarul de elemente ale sirului // sizeof t[0] va returna numarul de bytes in care este reprezentat sirul, adica tipul sau // impartirea va rezulta numarul de elemente ale sirului

59. Presupunanad ca sizeof(int) este 2, valoarea lui c, in urma executiei secventei urmatoare
int a=100, b=400; long int c; c=a*b;

((a)) este corecta b) este eronata ((c)) este 40000 d) este -25536
// a*b este 40000 si nu poate fi reprezentat in tipul short, asa ca este promovat la unsigned short

25

60. Discutati (in functie de valorile lui a si b) rezultatul lui c dupa:


int a, c; long b; c=a*b;

a) rezultatul este intotdeauna corect b) rezultatul este intotdeauna eronat ((c)) rezultatul este corect daca a*b se incadreaza in plaja de valori a tipului int
// presupunem sizeof(int) = 2, a=200, b=200 // a*b este 40000 si de tipul long (a e promovat pt inmultirea cu b) // 40000 este trecut in c, insa c este signed int cu capacitate maxima 32767 // binar 40000 este 1001.1100.0100.0000 // deoarece tipul este signed primul bit 1 din reprezentare va face numarul negativ si egal cu -25536 // desigur daca sizeof(int) este 4 (la fel ca long) probleme vor fi doar peste 4 miliarde

61. Care este valoarea expresiei ~0? a) 1 ((b)) -1 c) 0xF


/* #include<stdio.h> int main () { printf("~0 = %d", ~0 ); return 0; } */ // ~0 va rezulta intr-un numar cu toti bitii 1, numarul care are toti bitii 1 este -1 // desigur daca tipul este unsigned rezultatul va fi valoarea maxima a tipului intreg

26

62. Care este valoarea expresiei ~1? a) 0 b) 0xE ((c)) -2


// ~1 va rezulta intr-un numar cu toti bitii 1 inafara de ultimul, numarul este -2

63. Ce se va afia n urma execuiei secvenei urmtoare:


#include <stdio.h> void main() { unsigned char x=10; x=~x; printf("%d",(int)x); }

((a)) 245 b) 0 c) 255


// unsigned char are capacitatea maxima 255 reprezentata pe 8 biti // 10 reprezentat binar pe 8 biti este 00001010 // dupa ones complement este 11110101, adica 255-8-2=245

85. Care din urmatoarele variante reprezinta modalitati de comunicare intre functii? a) apel b) prin variabile locale (c) prin argumentele actuale (d) prin valoarea returnata (e) prin variabile globale f) prin includere 86. Ce este contextul de apel al unei functii? a) lista argumentelor formale (b) o zona de memorie (de pe stiva) c) locul din textul sursa in care se apeleaza d) instructiunile (definitia functiei)

27

87. Ce se regaseste in contextul de apel al unei functii? a) definitii de constante simbolice b) valoarea returnata (c) adresa de revenire (d) valoarea argumentelor actuale (e) variabilele locale f) variabilele globale 88. Transmiterea argumentelor catre functia apelata (conventia de apel C) se face: a) prin variabile globale (b) prin valoare (c) in ordine inversa celei din lista de argumente d) prin referinta 89. Ce este o functie recursiva? a) o functie nu poate fi recursiva b) o functie care recurge la context c) o functie cu lista variabila de argumente (d) o functie care se autoapeleaza 90. Comparata cu varianta sa iterativa, din punct de vedere al spatiului de memorie necesar apelului, o functie recursiva este, in principiu: a) la fel de eficienta (b) mai putin eficienta c) mai eficienta
// la fiecare apel se creeaza un nou context de apel

91. Comparata cu varianta sa iterativa, din punct de vedere al timpului de executie, o functie recursiva este, in principiu: a) la fel de eficienta b) mai eficienta (c) mai putin eficienta 28

92. Efectul executiei urmatoarelor secvente:


for(exp_1; exp_2 ; exp_3) instructiune; | | | | exp_1; while(exp_2) {instructiune; exp_3;}

este ((a)) identic b) diferit c) dependent de context 93. In absenta prototipului functiei, contextul urmatorului apel
f('2', -1.5F, 2L);

va contine argumente de tip: (a) char, float, long b) int, double, long c) char, double, long d) int, float, long 94. Doua functii pot comunica in conditiile in care nici una nu o apeleaza pe cealalta? a) nu b) da, prin mesaje (c) eventual, prin variabile globale 95. O functie cu lista de argumente de lungime variabila a) poate fi apelata fara nici un argument (b) poate avea, la apeluri diferite, un numar diferit de argumente c) nu poate fi definita intr-un program C d) trebuie sa aiba cel putin un argument cu nume

29

96. Rezultatul apelului f(2, 1.5, 0.25) al unei functiei declarate ca


void f(int , ...);

si care asteapta argumente de tip float in lista variabila a) este corect b) nu este corect c) depinde de implementarea limbajului 97. Rezultatul apelului f(2, 1, 25) al unei functiei declarate ca
void f(int , ...);

si care asteapta argumente de tip long in lista variabila a) este corect b) nu este corect c) depinde de implementarea limbajului 98. Efectul executiei urmatoarelor secvente:
for(exp_1; exp_2 ; exp_3) instructiune; | | | | exp_1; while( exp_2) instructiune; exp_3;

este a) identic b) diferit (c) dependent de context


// lipsesc acoladele la while; din acest motiv secventele vor fi indentice doar daca exp_2 este adevarata o singura data

99. Care este efectul secventei:


for(i=0; i<N; i++); printf("\n %d",i);

a) se afiseaza, pe linii separate, valorile de la 1 la N b) se afiseaza pe linie noua valoarea N-1 c) se afiseaza, pe linii separate, valorile de la 0 la N-1 ((d)) se afiseaza pe linie noua valoarea N
// dupa for este ;// printf se va executa o singura data folosing ultima valoare a lui i care este N

30

100. Definitia:
void init(int tablou[ ]) { int n, i; n=sizeof tablou / sizeof(tablou[0]; for(i=0; i<n; i++) tablou[i]=0; }

a) este, formal, corecta ((b)) este, principial, gresita c) isi atinge scopul (initializarea cu 0 a elementelor tabloului)
/* #include <stdio.h> void init(int tablou[]); int main() {int i, t[10]; init(t); for(i=0;i<10;i++) printf("poz%d=%d\n", i, t[i]); return 0; } void init(int tablou[]) { int n, i; n = sizeof tablou / sizeof tablou[0]; printf("n=%d\n", n); for(i=0; i<n; i++) tablou[i]=0; } */ // int tablou[ ] din void init nu este un tablou, e de fapt un pointer la prima pozitie din acel tablou // n va fi sizeof pointer / sizeof tablou[0] // rezulatul este marimea in bytes a unei adrese de memorie din OS supra marimea in bytes a tipului tabloului (int) // tabloului nu va fi initializat cu 0

31

101. Data functia


float aria(float raza, float pi) {return pi*raza*raza;}

precizati contextul de apel (configuratia stivei) la apelul a=aria(10,3. 14) stiind ca nu s-a furnizat prototipul (declaratia) functiei: a) (float)10, (float)3.14, adresa de revenire b) adresa de revenire, (float)10, (float)3.14 (c) adresa de revenire, (int)10, (double)3.14 d) (int)10, (double)3.14, adresa de revenire 102. Secventa urmatoare
void f(int n) { int t[n], i; for(i=0; i<n; i++) t[i]=0; }

/*alte instructiuni*/

a) este gresita (b) este corecta c) este corecta daca n este diferit de 0 103. Daca n este o variabila de tip integral (char, short, int, long) care este efectul secventei:
n=n%2; if(n=0) printf("n - par"); else printf("n - impar");

((a)) se afiseaza intotdeauna: n - impar b) se afiseaza intotdeauna: n - par c) depinde de valoarea initiala a lui n
// if(n=0) este if((n=0)!=0) // conditia este totdeauna falsa si ramura else este executata

32

104. Ce este gresit in urmatoarea definitie a functiei itoa:


char *itoa(int n) /*converteste intregul n in sir de caractere */ {char buf[11]; sprintf(buf, "%d", n); return buf; }

a) dimensiunea tabloului buf este prea mica b) nu e nimic gresit! (c) integritatea rezultatului din buf nu este garantata in functia apelanta
// quote La revenirea din apelul functiei, tabloul buf, a carui adresa se returneaza, nu mai exista // e variabila locala in functia itoa!

119. Ce este un pointer? a) un indicator b) o adresa de memorie ((c)) o variabila a carei valoare se interpreteaza ca adresa 120. Care dintre urmatoarele operatii sunt ilegale: (a) inmultirea unui pointer cu un intreg (b) impartirea a doi pointeri c) compararea a doi pointeri d) scaderea unui pointer din alt pointer e) adunarea unui intreg la un pointer f) dereferentierea unui pointer 121. Ce operator se utilizeaza pentru dereferentierea unui pointer (adica pt. accesul la valoarea stocata la adresa care este pastrata in variabila pointer)? a) & b) . (c) *

33

122. Care este tipul expresiei n**pi, in conditiile de mai jos


long n=10, *pi=&n;

(a) long b) int c) long * 123. Care este valoare expresiei q-p, in conditiile de mai jos:
int t[10], *p=t,*q=&t[9];

(a) 9 b) 10 c) t[9]-t[0] d) 20
/* #include <stdio.h> int main() {int t[10], *p=t, *q=&t[9]; printf("%d", q-p); } */ // q-p=9-0

124. Pe cati octeti se reprezinta variabila p, declarata ca void *p? a) 0 b) 1 ((c)) atatia cati sunt necesari pentru stocarea unei adrese

34

125. Daca pointerul p indica spre un element al unui tablou, in urma evaluarii expresiei
p+5

(a) p nu se modifica b) p indica 5 elemente dincolo de elementul spre care indica initial (c) se obtine ca rezultat adresa celui de-al 5-lea element dincolo de elementul spre care indica p
/* #include <stdio.h> int main() {int t[10], *p=&t[2], *q; q=p+5; printf("%d %d", q-t, p-t); return 0; } */

126. Presupunand ca octetii unei variabile sunt memorati incepand cu octetul mai putin semnificativ, in conditiile
int t[ ] = { 0x0203, 0x1} *p=t;

valoarea expresiei
*p * *(p+1)

(a) este 0x203 b) este 0x6 c) este 0 d) depinde de valoarea lui p


/* #include <stdio.h> int main() {int t[ ] = { 0x0203, 0x1}, *p=t; printf("%x", *p * *(p+1)); return 0; } */ // *p=t este echivalent cu *p=&t[0] // din linia de declarare t[0]=0x203, t[1]=0x1 // *p * *(p+1) este echivalent cu t[0]*t[1]=0x203

35

127. In conditiile
int t[ ] = { 0x0203, 0x4}; char *p = t;

valoarea expresiei
*p * *(p+1)

a) este 0x203 b) este 0x6 c) este 0x8 (d) 0xC


/* error: cannot convert `int*' to `char*' in initialization */

128. In conditiile
int t[ ] = { 0x0203, 0x4}; char *p = t;

valoarea expresiei
*p * *(p+2) + 1

a) este 0x204 b) este 0x7 c) este 0xD d) 0x9 129. Care dintre urmatoarele operatii sunt legale: a) inmultirea unui pointer cu un intreg b) impartirea a doi pointeri (c) compararea a doi pointeri (d) scaderea unui pointer din alt pointer (e) decrementarea unui pointer (f) dereferentierea unui pointer

36

130. Care este tipul expresiei n**pi, in conditiile de mai jos


int n=10, *pi=&n;

a) long (b) int c) int * 131. Stiind ca numele unui tablou este sinonim cu adresa primului element al tabloului, ce diferenta exista intre urmatoarele declaratii:
char s[ ] = "Timisoara"; char*p = "Timisoara";

a) nici una (b) prima declara un tablou, a doua un pointer (c) expresia s==p este falsa d) expresia s==p este adevarata
/* #include <stdio.h> int main() {char s[] = "Timisoara"; char*p = "Timisoara"; printf("%d", s==p); printf("\n%s", s); printf("\n%s", p); return 0; } // expresia ar fi fost adevarata doar daca am fi avut si p=s

132. Presupunand ca adresele se reprezinta pe 4 octeti, cat spatiu de memorie se rezerva prin declaratiile urmatoare:
char *name, buffer[20]; short *pshort, t[20]; double *pdouble, PI;

In ordine, pt name, buffer, pshort, t, pdouble si PI: a) 1, 20, 2, 40, 8, 8 octeti ((b)) 4, 20, 4, 40, 4, 8 octeti c) nici un octet 37

133. Secventa urmatoare


char *p; strcpy(p, "Timisoara");

a) este corecta b) este, principial, gresita (c) va avea un rezultat imprevizibil


/* #include <stdio.h> #include <string.h> int main() {char *p; strcpy(p, "Timisoara"); printf("%s", p); return 0; } */

134. Secventa urmatoare


char *p=c:\\temp\\; strcat(p, lista.txt);

(a) este, principial, gresita b) este corecta c) va avea un rezultat imprevizibil

38

135. Presupunand ca se furnizeaza prototipurile functiilor apelate, ce este gresit in secventa


int *pi; char *pc; scanf("%d",pi); strcpy(pc,"timisoara");

a) argumentul pi din apelul lui scanf trebuie precedat de operatorul adresa (&) (b) pi trebuie initializat inainte de scanf (c) pc trebuie initializat inainte de strcpy
/* #include <stdio.h> #include <string.h> int main() {int a, *pi=&a; char b[20], *pc=b; scanf("%d",pi); strcpy(pc,"timisoara"); printf("%d", a); printf("\n%s", b); return 0; } */

136. Care este valoarea variabilei r dupa executia secventei urmatoare, parte a definitiei unei functii:
{ char *string, r; r = (string == "Timisoara"); }

(a) 0 b) 1 c) 0 sau 1, dependent de context

39

137. Care este valoarea variabilei r dupa executia secventei urmatoare daca, la compilare, constantele sir de caracter se genereaza indiferent daca mai exista o alta identica:
char *nume=Timisoara, r; main() { r = (nume == Timisoara); }

a) 0 sau 1, dependent de context b) 0 c) 1


/* #include <stdio.h> char *nume="Timisoara", r; int main() { printf("%d", r = (nume == "Timisoara")); } */

138. Care este valoarea variabilei r dupa executia secventei urmatoare daca, la compilare, constantele sir de caracter nu se duplica (se genereaza o singura data, indiferent de cate ori a fost specificata in textul sursa):
char *nume=Timisoara, r; main() { r = (nume == Timisoara); }

a) 0 sau 1, dependent de context b) 0 c) 1 139. Ce este gresit in secventa urmatoare, care ar trebui sa rezerve saptiu pentru 10 date de tip int si sa le initializeze cu 0:
void *malloc(int ); void *p; p=malloc(10*sizeof(int)); for(i=0;i<10;i++) *p=0;

a) secventa e corecta! b) p ar trebui incrementat la fiecare iteratie c) nu se poate dereferentia un pointer void 40

140. Care este valoarea lui n dupa executia secventei:


char t[ ]="timisoara", *p,*q,n; p=q=t; while(*q++); n=q-p;

a) n=0 b) n=9 ((c)) n=10 d) n=\0-t


/* #include <stdio.h> int main() {char t[ ]="timisoara", *p,*q,n; p=q=t; /* p = q = & t[0] */ while(*q++); printf("lenght 9 n=%d", q-p); /* same things as q-t */ t[1]='\0'; /* t="t" */ while(*p++); printf("\nlenght 1 n=%d", p-t); return 0; } */ // q va avea dupa while adresa lui t[10]; adica q-t este egal cu numarul de elemente din t + 1 // adresa lui t[10] minus adresa lui t[0] da 10

41

141. Care este valoarea lui n dupa executia secventei:


char t[ ]="timisoara", *p, *q, n; p=q=t; while(*q) q++; n=*q-*p;

a) 'a - t b) 10 ((c)) -t b) 9
/* #include <stdio.h> int main() {char t[ ]="timisoara", *p, *q, n; p=q=t; while(*q) q++; printf("value of *q-*p = %d", n=*q-*p); /* same as t[9]-t[0] */ printf("\nvalue of '\\0' = %d\nvalue of 't' = %d", '\0', 't'); return 0; } */ // dupa while q este egal cu adresa lui t[0]+9, t[9] (t-q este egal cu numarul de elemente din t) // n este diferenta dintre valoarea stocata in t[9] minus valoarea de la t[0] // insa pe pozitia t[9] se afla \0 care are valoarea 0 // 0 - t = -t

42

142. Ce este gresit in secventa:


int t[N], *low=t, *mid, *high=&t[N-1]; mid = ( low + high ) / 2;

a) un pointer nu se poate initializa cu un tablou b) initializarea lui low, respectiv high e gresita (c) adunarea a doi pointeri este ilegala d) mid nu poate fi initializat cu o valoare reala (daca low+high e impar!)
/* /*correct example*/ #include <stdio.h> int main() {int n=6, t[n], *low=t, *mid, *high=&t[n-1]; printf("size = %d\nlow = 0\n", n);

printf("high = %d\n", high-t); if((high-t) % 2 == 1) mid = (high-1) - (high-t)/2; else mid = high - (high-t)/2; printf("mid return 0; } */ = %d", mid-t);

143. Ce este gresit in secventa:


char *p; strcpy(p, "Timisoara");

a) nu se poate copia un sir de caractere intr-un pointer! b) secventa e corecta (c) pointerul p este neinitializat

43

144. Date declaratiile:


int t[10], *pi=t; char *pc=t;

de ce tip sunt valorile expresiilor *pi respectiv *pc? a) int * respectiv char * b) int / int c) int / char (d) pc nu poate fi initializat cu t! 145. Care va fi valoarea pointerului p dupa initializare, daca adresa de inceput a tabloului t este 0x1A2:
long t[100],*p; p=&t[6];

a) 0x1A8 ((b)) 0x1BA c) 0x1C6


// sizeof(long)=4 bytes // 0x1A2 + 6*4 = 0x1A2 + 0x18 = 0x1BA

146. Daca tab este numele unui tablou, despre expresia *(++tab) se poate afirma ca: a) un tablou nu poate fi dereferentiat b) expresia e corecta ((c)) numele unui tablou este o constanta, deci nu poate fi incrementat

44

147. Daca tab este numele unui tablou, despre expresia ++(*tab) se poate afirma ca: a) un tablou nu poate fi dereferentiat ((b)) expresia e corecta c) numele unui tablou este o constanta, deci nu poate fi incrementat
/* #include <stdio.h> int main() {int tab[5]={0}; printf("%d", ++(*tab)); return 0; } */ // ++(valoarea stocata la adresa tab[0])

148. In conditiile de mai jos, cum se poate obtine in p adresa urmatorului element al tabloului:
int t[N]; char *p=t;

(a) p++ ((b)) un char * nu poate fi initializat cu adresa unui int! c) p+sizeof(int) (d) p=p+sizeof(int) 149. Care este valoarea lui n dupa executia secventei:
char t[]="timisoara", *p,*q, n; p=&t[1]; q=&t[3]; n=*q-*p;

a) 2 b) secventa este gresita sintactic (c) 0 d) 0


// este t[3]-t[1], i-i = 0

45

150. Care este valoarea lui n dupa executia secventei:


char t[]="timisoara", *p,*q, n; p=&t[1]; q=&t[3]; n=*q-*p;

a) 2 b) secventa e gresita sintactic c) 0 d) \0

156. Cat spatiu de memorie ocupa o variabila structura a) cat spatiul ocupat de cel mai voluminos dintre membrii b) egal cu suma spatiilor necesare membrilor c) cel putin cat suma spatiilor necesare membrilor 157. Care din afirmatiile urmatoare, referitoare la structuri, sunt adevarate: a) sunt tipuri de date agregate b) sunt tipuri de date definite de programator c) sunt tipuri de date predefinite d) sunt tipuri de date scalare 158 Ce operator se utilizeaza pentru accesul la un membru al unei structuri? a) ^ b) * c) & d) . 159 Poate o structura sa contina ca membru o structura de acelasi tip? a) da b) nu c) depinde de context

46

160. Care din urmatoarele operatii sunt legale: a) compararea a doua structuri b) returnarea unei structuri ca valoare a unei functii c) adunarea a doua structuri d) copierea unei structuri 161. Data o variabila structura si o variabila uniune, ambele avand aceiasi membri, care dintre ele ocupa mai mult spatiu in memorie? a) variabila uniune b)variabila structura c) ambele ocupa acelasi spatiu 162. Declaratia int a:3; poate fi o declaratie de membru: a) al unei structuri b) al unei uniuni c) al unui bit-field d) al oricaruia din cele trei tipuri amintite 163. Expresia p->m este de acelasi tip cu: a) tipul lui p b) tipul lui m c) tipul void * 164. Poate o structura sa contina ca membru un pointer spre o structura de acelasi tip? a) da b) nu c) numai daca este primul membru d) numai daca este ultimul membru

47

165. Care din urmatoarele operatii sunt ilegale: a) compararea a doua structuri b) returnarea unei structuri ca valoare a unei functii c) adunarea a doua structuri d) copierea unei structuri 166. Date declaratiile de mai jos, precizati care din expresiile care urmeaza sunt corecte
struct point{ float x,y;}; struct circle { struct point center; int radius; } v, *p=&v;

a) p->center.x b) p.center.x c) *p->center.x d) (*p).center.x e) v->center.x f) v.center.x 167. Date declaratiile de mai jos si stiind ca i este o variabila intreaga, precizati care din expresiile care urmeaza sunt corecte
struct point {int x,y;}; struct rectangle {struct point p1.p2;} *r[N];

a) r[i].p1.x b) r[i]->p1.x c) *(r[i]).p1.x d) *r[i].p1.x

48

168. Date declaratiile de mai jos, precizati tipul expresiei *(r[i]).p1.x, i fiind o variabila intreaga.
struct point {int x,y;}; struct rectangle {struct point p1.p2;} *r[N];

a) struct rectangle b) struct rectangle * c) struct point d) int 169. Care din urmatoarele valori ale argumentului mode, pasat functiei fopen, permite deschiderea unui fisier text pt actualizare: a) "at" b) "rwt" c) "r+" d) "wt+" e) "a+" f) "rwt+" 170. Functia de pozitionare fseek poate fi folosita in cazul stream-urilor deschise a) pentru citire b) pentru scriere c) numai daca stream-ul e deschis pentru actualizare 171. Un stream binar deschis pentru citire (modul "rb") poate fi citit corect cu: a) fscanf b) gets c) getchar d) fread

49

172. Functia fscanf poate fi folosita pentru citirea a) numai a fisierelor text b) numai a fisierelor binare d) oricarui tip de fisier 173. Functia fputs poate fi folosita pentru scriere a) numai in fisiere binare b) numai in fisiere text d) in orice tip de fisiere 174. Functia printf este: (a) o functie standard de iesire b) o functie de tiparire la imprimanta (c) o functie de afisare formatata (d) o functie cu lista variabila de argumente 175. Functia fputc returneaza valoarea EOF: a) numai la sfarsit de fisier b) numai in caz de eroare c) in ambele situatii

50