46
1.1 Q: Fie Programul: Void main() {} A: a) correct, dar nu are nici un effect; (Pronu utilizaza nici o functie deci nu este necesara includerea vreunei librarii, functia returneaza void si are corpul vid) 1.2 Q:Programul: #include <iostream.h> Void main() { Cout<< “program C++!” ); } A:b)este eronat sintactic - literalul este incorrect redactat (un literal poate fi redactat pe mai multe randuri marcand continuarea sirului pe randul urmator cu caracterul backslash apelul: Count<< “program\ C++!” ); Este correct si afiseaza: program C++! Pe un singur rand 1.3 Q:Programul #include <iostream.h> Void main(); { Count<<”program\nC++!”; Este: A:c)incorrect, antetul unei functii nu poate fi separate de corpul sau prin puincte si virgule ( Antetul unei functii urmat de punct si virgule constituie un prototip el anunta compilatorul ca definitia functiei se face fie mai tarziu in cadrul fisierului fie intr-alt. eliminand acest separator programul ar fi correct si ar afisa Program C++! Pe 2 randuri

Test Grila c++

Embed Size (px)

DESCRIPTION

test grila c++ @rau

Citation preview

Page 1: Test Grila c++

1.1 Q: Fie Programul:

Void main() {}

A: a) correct, dar nu are nici un effect; (Pronu utilizaza nici o functie deci nu este necesara includerea

vreunei librarii, functia returneaza void si are corpul vid)

1.2 Q:Programul:

#include <iostream.h>

Void main() {

Cout<<

“program

C++!”

);

}

A:b)este eronat sintactic - literalul este incorrect redactat (un literal poate fi redactat pe mai multe

randuri marcand continuarea sirului pe randul urmator cu caracterul backslash apelul:

Count<<

“program\

C++!”

);

Este correct si afiseaza: program C++! Pe un singur rand

1.3 Q:Programul

#include <iostream.h>

Void main(); {

Count<<”program\nC++!”;

Este:

A:c)incorrect, antetul unei functii nu poate fi separate de corpul sau prin puincte si virgule ( Antetul

unei functii urmat de punct si virgule constituie un prototip el anunta compilatorul ca definitia

functiei se face fie mai tarziu in cadrul fisierului fie intr-alt. eliminand acest separator programul ar

fi correct si ar afisa Program C++! Pe 2 randuri

1.4 Q:Fie declaratia

Int For=1.;

A:a) corecta (for poate fi identificator el difera de cuvantul cheie for. Variabila intreaga va fi

initializata cu 1 in urma pierderii zecimalelor constantei double 1.(=1.0)

Page 2: Test Grila c++

1.5 Q:Fie aplicatia

Void main () {

Const int x; x=1;

}

A:c)incorecta, initializarea unei constant se face la declarative(constanta trebuie initializata la

declarative: const int x=1; si nu printr-o instructiune ulterioara

1.6 Q:Declaratia:

Double e3=e3

A:a)corecta (la fel si initializarea variabilei e3 cu ea insasi desi aceasta initializare nu are nici un

effect.)

1.7 Q:Aplicatia

#include <iostream.h>

Void main () {

Int i;

For(i=0; i<3; i++) {

……

A:b) 1 2 3 1 1 1 (diferenta dintre blocurile de instructiuni ale celor doua for-uri este data de

initializarea variabliei statice in primul caz initializarea insoteste declaratia si se efectueaza o

singura data atunci cand are loc alocarea variabilei)

1.8 Q:Aplicatia

#include <iostream.h>

Int x=5;

Void main () {

Int x=3

Count<<x<<’ ‘<<::x;

A:d) este correct si afiseaza 3 5. ( fiind permisa declararea a 2 bariabile cu acelasi nume una globala

si cealalta locala in acest caz implicit este referita cea locala iar variabila globala se va referi

explicit la folosind operatorul ::. Astfel se va afisa mai intai valoarea variabilei locale x(3) urmata

de valoarea celei globale (5) )

1.9 Q:in urma executarii secventei

Int x=-45, p;

P=printf(“%d”, x);

Page 3: Test Grila c++

A:c)3 (functia printf returneaza numarul caracterelor afisate valoarea variabilei x necesitand pentru

afisare 3 caractere variabila p va avea valoarea 3)

1.10 Q:secventa

Int x;

Printf(“%x”, &x);

A:d) este corecta si afiseaza adresa variabilei x (operatorul & extrage adresa unei variabile iar

descriptorul de format %x este utilizat pentru afisarea in baza 16 asadar se va afisa in hexazecimal

adresa variabilei x)

1.11 Q:secventa

Int x=60;

Printf(“%o %x”, x, x);

A:b) 74 3c (descriptorii de format %o si %x se folosesc pentru afisarea unei valori in octal si

respective in hexazecimal. Prin transformarea valorii 60 in cele doula baze de numeratie se vor

obtine valorile 74 si 3c)

1.12 Q:secventa

Intx=0x1e3;

Printf(“%d”, x)

A:d)60 3c (prefixul 0x asociat valorii 0x1e3 marcheaza faptul ca aceasta este o constanta intreaga

hexazecimala prin transformare in baza 10 se obtine pentu x valoarea 483 care se va si afisa)

1.13 Q: secventa

For(int i=1; i<=5; i++) {

Static int x=1;

Auto int y=1;

If (i==5) cout<<x<<y;

X++; y++;

}

A:a) 5 1 (secventa afiseaza valorile 5 si 1. Diferenta intre cele doua variabile este aceeea ca x este

static iar y este automatic astfel variabila x se initializeaza o singura data la alocare si isi

Page 4: Test Grila c++

pastreaza valoarea de la o iteratie la alta ajungand in final la valoarea 5 variabila y se

reinitializeaza la fiecare iteratie ramannand la momentul afisarii cu valoarea 1

1.14 Q:programul

#include <iostream.h>

Extern int x;

Void main() {

Cout<<x;

}

Int x=7;

A:d)este correct si afiseaza valoarea 7 (anuntarea variabilei x ca apartinand clasei de memorie

extern permite utilizarea ei inainte de declarare.desi declaratia lui x sa facut ulterior acesta va intra

in calculi cu valoarea primita la initializare)

1.15 Q:care va fi valoarea variabilei p in urma executarii secventei

Int p, x, y;

P=scanf (“%d%d ,&x, &y);

Daca se introduce de la tastatura datele 25 abc 37

A:b) 1 (functia scanf returneaza numarul valorilor citite si associate variabilelor sau -1 daca sa

tastat ^Z pentru datele introduce doar prima valoare 25 poate fi asignata variabilei x textul abc nu

corespunde tipului variabiley y deci nu I se poate asocial acesteia astfel numarul variabilelor citite

correct va fi 1)

2.1 Q:sizeof(3. -3)

A:c)8(operatorul sizeof evalueza marimea in octeti a argumentului primt in expresia aritmetica 3.-3

se scade dintun double 3. Un int 3 rezultatul 0 fiind de tipul cel mai puternic double reprezintat pe

8 octecte)

2.2 Q:sizeof(5-3.)

A:d)8(expresia aritmetica 5-3 ocupa in memorie 8 octeti constantei 5 ii este asociat tipul int

constantei 3 tipul double la scadere tipul mai slab este int este convetit implicit catre tipul mai

puternic double rezultatul fiind un double)

2.3 Q:instructiunea

Cout<<sizeof(3. -5f);

Page 5: Test Grila c++

A:a)este eronata, sufixul f nu poate fi aplicat unei constant intregi(sufixul f nu poate fi aplicat unei

constant intreci ci numai constantelor reale)

2.4 Q:aplicatia

#include <iostream.h>

Void main() {

Int a=5, b=3;

Cout<<(double) a/b;

}

A:d) raportul impartirii lui a la b(aplicatia va afisa raportul impartirii efectuat in urma conversiei

explicite de tip cu opecatorul cast)

2.5 Q:secventa

Double a; cin>>a’

Cout<<a-(int)a;

A:b) partea zecimala a unui numar real(secventa afiseazaza partea zecimala a numarului real a fara

sa foloseasca functii de biblioteca scazand din el partea lui intreaga extrasa cu operatorul cast)

2.6 Q: secventa

Int a;

Double r=sqrt((double)a);

Int x=r==(int)r;

A:b) variabila a nu este patrat perfect(variabila x va fi nula daca a nu este patrat perfect: variabila r

retine radacina patrata a numarului intrecg a expresia r==(int)r verifica daca r adica radacina

patrata a lui a este numar intreg daca da variabila x va fi 1 , altfel va fi 0)

2.7 Q:instructiunea

Cout<<sizeof(3<5. ?3:5.);

A:d)8, corespunzator tipului double cel mai puternic intre constantele 3 si 5(tipul unei expresii

conditionale E1?E2:E3 este tipul cel mai puternic intre tipurile lui e2 si e3 deci double pentru care

se rzerva 8 octeti)

2.8 Q: secventa

Int a=3, b=5;

Int t=a<b?a++;b++;

Cout<<a<<b<<t;

Page 6: Test Grila c++

A:a) 4 5 3(se evalueaza a<b rezulta valoarea logica de adevar prin urmare se evalueaza a++ insa

fiind vorba despre o postincrementare mai intai ia valoarea 3 a lui a apoi a este incrementat

devenind 4 variabila b ramane nemodificata)

2.9 Q:daca t este o variabila double atunci expresia

T=3,5;

A:b)initializeaza pe t cu 3(intradevar este vorba despre o expresie virgule insa datorita prioritatilor

atribuirii acesta asociaza expresiile: de atribuire t=3 si expresia constanta 5)

2.10 Q:fie secventa

Cout<<( x<7-2*x?”DA” : “NU”) ;

A:c)2(pentru a se afisa textul DA trebuie sa se verifice relatia x<7-2*x ceea ce inseamna 3*x<7 si

deci x<7/3 deci cea mai mare valoare intregaga pe care o poate lua x va fi 2)

2.11 Q: in urma executarii secventei

Y=x+1

Z=y-1

X=z+1

A:a)x si y sunt egale (in urma primelor doua atribuiri vom avea y=x+1 si z=y-1 deci z=x+1-1, asadar

y=x+1 si z=x cea dea treia atribuire va face x=z+1 adica x=x+1 deci final x si y vor avea aceeasi

valoare diferita de valoarea lui z)

2.12 Qin urma executarii secventei

X=x+y; y=x-y; x=x-y;

Cout<<x<<y;

A:d) x si y se interschimba(secventa interschimba cele doua variabile x si y astfel in urma primei

atribuiri x va fie gal cu suma celor 2 valori x +y daca din suma se scade valoarea initiala a lui y se

va obtine valoarea initiala a lui x care I se va atribui lui y mai departe aceeasi suma se scade y

obtinand valoarea initiala a lui y aceasta atribuinduse lui x.

2.13 Q: in urma executarii secventei:

Unsigned char x;

In>>x;

For(int i=0; i<8; i++) x>>=1;

Cout<<(int)x;;

A:se afiseaza valoarea 0 (variabila x de tip unsigned char se reprezinta pe un octet deci 8 biti in

plus bitul cel mai semnificativ nu va fi tratat ca bit de semn comportanuse ca un bit oarecare

Page 7: Test Grila c++

asadar la fiacre deplasare spre dreapta bitul ramas se vompleteaza cu 0 astfel ca in maxim 8

iteratii toti bitii lui x vor fi 0 deci x va avea valoarea 0 care se va afisa ca intreg)

2.14 Q: secventa

Int x; cin>>x;

For (int i=0; i<32;x<<=1, i++); cout<<x;

A:b) este corecta si afiseaza valoarea 0 (variabila intreaga x se reprezinta pe 4 octeti deci 32 biti la

fiacre iteratie deplasarea spre stanga cu un bit va duce completarea bitului lipsa cu 0 astfel ca

dupa cel mult 32 iteratii toti bitii lui x vor fi 0 deci x va avea valoarea 0 Afisarea valorii lui x se face

la iesirea din for deci se afiseaza valoarea 0 o singura data)

2.15 Q: in secventa

Int x; cin>>x;

Int y=x&1;

A:d) impar(ultimul bit al numarului determina partatea acestuia aftfel pentru valori pare ultimul bit

este 0 iar pentru valori impare ultimul bit este 1)

2.16 Q: daca x si n sunt 2 intregi expresia x>>n poate fi echivalenta cu

A:a) impartirea lui x la 2 la n (deplasarea spre dreapta x>>n este echivalenta cu o impartire intreaga

alui x la 2 la n atat pentru numere negative cat si pozitive)

2.17 Q:pentru x=5 care este valoarea expresiei 3<<x>>2 ?

A:a)24 (prima operatie efectuata va fi deplasarea spre stanga : 3<<x=3<<5=3*2 la 5 = 96, evaluarea

celei dea doua expresii deplasarea spre dreapta va duce la 96>>2=96/2 la 2= 24)

2.18 Q: declaratiile

Char c= ‘a’ , x;

A:b) x=c^32 (literele mari difera de cele mici prin al saselea bit la litere mari acesta este 0 iar la cele

mici este 1)

3.1 Q:secventa

For(int i=1; i<=5; i++) {

If (i==3) X;

Cout<<I;

}

A:b) continue (Instructiunea continue permite abandonarea iteratiei curente,]

corespunzatoare situatiei in care i este 3, in instructiunea repetitive for. Astfel valoarea 3 nu va

Page 8: Test Grila c++

mai fi afisata. Folosind break, valorile afisate,ar fi fost 1 §i 2, expresiile i=4 (testare egalitate) si i+1

nu au nici un efect. Efectul cerut se mai putea obtine §i cu: i=4 sau i++ sau i+=l.)

3.2 Q: instructiunea

For(int i=20l i>=15; i%5)

Cout<<I;

A:20 la infinit(Initial i este 20, condifia i>=15 se verifica, atunci i (=20) este afisat; se evalueaza expresia i%5 ce are valoarea 0, insa nu il modifica pe i, asadar i ramane 20, valoare cu care se reia ciclul de mai sus. Aplicatia afiseaza 20 la infinit. Daca am rescrie ultima expresie din instructiunea for astfel: i%=5atunci aplicatia ar afisa 20 o singura data)

3.3 Q: instructiunea

For(suma=0, i=10; i;i-=2)

Suma+=I;

A:a)suma numerelor intregi pare de la 2 la 10(Variabila suma va confine suma numerelor intregi pare

de la 2 la 10; contorul i va lua succesiv valorile 10, 8, 6,4,2, 0, valori care sunt pe rand adunate la

suma. Cand i atinge valoarea 0 (corespunzator valorii de adevar fals) instructiunea for se incheie)

3.4 Q:secventa

For(suma=0, i=0; i<=10; i+=2)

Suma+=I;

Cout<<suma<<I;

A:c) 30 si 12(Instructiunea for determina adunarea numerelor pare de la 2 la 10, astfel j variabila suma va avea valoarea 30. La ultima iteratie a instructiunii for, variabilai este 10, apoi ea este marita cu 2, devenind 12; aceasta este valoarea cu care ramane la

incheierea instructiunii for.)

3.5 Q:secventa

For(suma=0, i=0; i<=10; i+=2);

Suma+=I;

Cout<<suma<<I;

A:d) afiseaza 12 si 12(Pentru ca este urmata de punct §i virgula (;), instructiunea for determinij

executia instructiunii nule, astfel ca nu are ca efect decat initializarea variabilei suma cu 0 §i

cre§terea lui i pana la valoarea 12, cu care se incheie instructiunea for. Urmeaza instructiunea

suma+=i; in urma careia suma va fi §i ea tot 12. Astfel, cele doua valori afisate sunt 12 si 12.)

3.6 Q: secventa

Int i=2

Page 9: Test Grila c++

While (i--)

Cout<<I;

A:c ) 1 0(In cazul unei postdecrementari, se foloseste variabila cu valoarea initiala, apoi este

decrementata. In cazul nostru, in conditia instructiunii while se evalueaza i cu valoarea initiala,

apoi este decrementat. Astfel, la intrarea in instructiunea while i are valoarea 2, conditia i (i fund 2)

este adevarata, apoi i este decrementat devenind 1; este executata instructiunea: este afisata

valoarea 1, se reia while cu i=l (valoare logica de adevar), apoi i este decrementat §i devine 0, este

afisata valoarea 0; se reia while cu i=0, aceasta fund o valoare logica falsa instructiunea while se

incheie (dupa ce il decrementeaza inca odata pe i, insa nu il mai afiseaza).)

3.7 Q: Daca I este un intreg atunci instructiunea

While (cin>>i, i>10);

A:d) repeat citirea lui I pana se introduce o valoare mai mica sau egala cu 10(Expresia cin»i,i>10 din

instructiunea while este o expresie virgulS care alatura doua expresii: cin»i §i i>10. Prima citeste

pe i iar cea de-a doua verifica daca i este strict mai mare decat 10. Cele doua expresii sunt

evaluate in ordine: mai intai cea din stanga, apoi cea din dreapta, dar valoarea expresiei virgula

este data de valoarea celei de-a doua expresii: i>10. Astfel este citit de la terminal i, apoi este

comparat cu 10, daca se verifica i>10, atunci se repeta citirea.)

3.8 Q: secventa

Int i=-2;

If (i) {

If (i%2) cout<<”i impar”; }

Else cout<<”I negative”;

A:a) nu afiseaza nimic(in limbajul C/C++ orice valoare nenula este valoare logica de adevar, 0 este

valoare logica de fals. Instructiunea i/exterioara verifica daca i este nenul, ceea ce este adevarat

cata vreme i este -2, astfel se executa ramura true: instructiunea f/interioara. Aceasta verifica daca

i%2 este nenul; i fund -2, i%2 va fi 0, deci are valoare logica de fals, atunci s-ar executa ramura

else, numai ca aceasta nu exista: prin includerea instructiunii if interioare intr-un bloc ramura else

care urmeaza este asociata instructiunii if exterioare §i nu celei interioare.)

3.9 Q: secventa

Int i=2

Switch (i%2) {

……..

A:d) afiseaza par impar(Instructiunea switch se execute astfel: se evalueaza expresia i%2, rezulta

de aici valoarea 0; se compara valoarea ei, pe rand cu alternative^ 0, 2, 4, 1, 3, 5 si daca se

Page 10: Test Grila c++

gaseste o alternativa care sa coincide cu ea, atunci se executa pe rand toate instructiunile din

dreptul ei in jos, pana la terminare sau pfina cand se intalnefte o instructiune break. In cazul

nostru se intra pe alternativa case 0 fi, nefiind nici un break se executa toate instructiunile de

afisare; rezultat: „par impar")

3.10 Q:secventa

Int i=2

Switch (i) {

Case ………………

A:a) este eronata(Instructiunea este eronata pentru ca defineste alternativa 1 de doua ori: expresia

logica 0||2||4 are valoarea 1, la fel ca fi expresia 1||3||5.)

3.11 Q: secventa

If (0 <=n<=10)

Cout<<”n intrare 0 si 10”;

Else …..

A:b) afiseaza “nintre 0 si 10”;( Afifeaza "n intre 0 si 10"; expresia 0<=n<=10 se evalueaza astfel: (0<=n)<=10. Cum n este 15, rezulta:0<=n<=i0 <=> (0<=n)<=10 <=>(0<=15)<=10 <=> 1<=10 <=> 1 (adevar) Prin urmare conditia are valoare logica de adevar.Daca am rescrie-o: 0<=n && n<=10 atunci ar determina afi?area: "n mai mic decat 0 sau mai mare

decat 10".)

3.12 Q: considerand ca x este un numar real pozitiv

M=0;

While (++m<=x); m--;

Cout<<m;

A:d)este corecta si calculeaza partea intreaga a lui x(Fiind urmata de punct §i virgula (;), instructiunea

while va executa instructiunea vida, singurul efect fiind incrementarea variabilei m la fiecare

iteratie, pana cand acesta va deveni mai mare ca x. La iesirea din while m va avea cea mai mica

valoare intreaga mai mare ca x. Decrementarea ulterioara a lui m va duce la obtinerea celei mai

mari valori intregi mai mici sau egale cu x, deci a partii intregi a lui x)

3.13 Q: considerand ca x este un nr intreg secventa

C=x<0?-x:x;

While (c>=10) c%=10

A:c)afiseaza ultima cifra a lui x(Secventa afifeaza ultima cifra a numarului dat prin calcularea restului

impartirii la 10. In urma primei atribuiri c va lua valoarea modulului lui x. De§i inclusa intr-o

instructiune while, atribuirea compusa c%=10 se executa o singura data (pentru numere formate

Page 11: Test Grila c++

din mai multe cifre) sau nicio data (pentru numere formate dintr-o singura cifra). Astfel, in final,

variabila c va confine fie restul impartirii lui x la 10 (daca x are mai multe cifie), fie chiar valoarea

lui x (daca acesta are o singura cifra), deci ultima cifra a numarului dat.)

3.14 Q: executarea secventei

Int a=5, b=2, c=3

If (a<b) if (a<c) b=10

Else c= 10

A:d) nici una dintre variabile(else se va asocia ultimei instructiuni //activate, deci in acest caz celei

de-a doua. Astfel, cum a nu este mai mic decat b, nu se va executa nimic, deci nici una dintre

variabile nu if i va modifica valoarea.)

3.15 Q:daca in urma executari secventei

For(a=1; a<10; a+=2) b-=3;

A:b)26(Iefirea din instructiunea for se va face pentru a>=10. Cum initial a are valoarea 1 fi la fiecare

iteratie aceasta crefte cu 2, inseamna ca variabila a iese din for cu valoarea 11, moment in care s-

au executat 5 iteratii. Pentru ca variabila b sa aiba §i ea valoarea 11, in urma celor 5 atribuiri

compuse executate in for, ea ar fi trebuit s& piece initial cu valoarea 11+5*3 deci 26.)

3.16 Q:daca x si y sunt doua numere positive neule

Do {

X++; y--;

} while (y);

Cout<<x;

A:d) afiseaza suma valorilor x si y (Instructiunea repetitiva do...while se va executa auita timp cat y

este nenul, deci va avea un numar de iteratii egal cu valoarea lui y. Cum la fiecare iteratie x cre§te

cu 1, in final variabila x va avea valoarea x+1+l+....+l (de y ori), adica x+y, deci se va afisa suma

celor doua valori.)

3.17 Q: instructiunea

For (i=0, s=0;;i++) {

If (!(i%2)) continue;

……

A:d) calculeaza suma numerelor impare mai mici ca 100(Instructiunea continue duce la ignorarea

iteratiei curente daca i este par, adunand asadar numai valorile impare. Instructiunea break

Page 12: Test Grila c++

forteaza iesirea din for in momentul in care se ajunge la o valoare mai mare ca 100. Se va obtine

astfel suma numerelor impare mai mici decSt 100.)

3.18 Q: secventa

Int p=1

While (b)

If(b%2) p*a, b--;

Else b/=2, a*=2

……

A:c) a la puterea b(Secven{a de mai sus calculeaza ab, folosind un algoritm mai eficient decat eel

clasic. Astfel, daca exponentul este par se va aplica formula a °=(a )" , iar daca este impar se

vautiliza relatia a2n+1=aa2n . Se urmareste asadar reducerea numarului de inmultiri efectuate §i deci

optimizarea algoritmului de calcul.)

3.19 Q: in urma executarii secventei

X=y=z=5; s=6; k=0

……….

A:a)26(Secventa se va executa astfel:- se fac initializarile: x=y=z=5; s=6; k=0;- se testeaza conditia x>=s, cum nu este adevarata nu se va evalua expresia virgula din instructiunea if (anume y++, z+=2;)- se trece deci la urmatoarea instructiune dupS if §i anume x+=z; deci x va fi 10- fiecare iteratie a instructiunii while evalueaza numai expresia k++;- iesjrea din while se va face in momentul in care k>=x deci cslnd k va fi 10- se executa apoi atribuirea compusa s+=k+x; adica s+=20, deci valoarea variabilei s va fi 26.)

3.20 Q:secventa

Int a=0, b=1, c=1, d=1, e=1, f=1;

…….

A:c)1 1 2 2 1 2 (Operatorii && §i || se evalueaza de la stanga la dreapta §i se aplica optimizat, in sensul ca daca la un moment dat se cunoaste valoarea de adevar a intregii expresii, atunci restul nu se mai evalueaza.- prima expresie va fi a++ && b++ §i vom avea: se evalueaza a++; variabila a fiind 0, va fi echivalenta cu fals, dupa care a se incrementeaza; in acest moment putem §ti valoarea logica a expresiei (§i anume 0), motiv pentru care b++ nu se mai evalueaza - expresia finala este acum echivalenta cu 01[ C++ && d++1| e++.- a doua expresie va fi 0 || C++, iar valoarea ei depinde de variabila c; cum aceasta este 1, expresia va avea valoarea adevarat (deci 1), iar c se incrementeaza -expresia finala este acum echivalenta cu 1 && d++1| e++.- a treia expresie 1 && d++, depinde de valoarea lui d care este 1; astfel, expresia va avea valoarea adevarat (deci 1), iar d se incrementeaza - expresia finala este acum echivalenta cu 11| e++.- fn acest moment se poate cunoaste valoarea logica a intregii expresii (§i anume 1), motiv pentru care e++ nu se mai evalueaza; expresia fiind adevarata se va executa incrementarea din if a variabilei f.

Page 13: Test Grila c++

Astfel, din cele 6 variabile: se incrementeaza a,c,d,f §i raman nemodificate b,e. Deci secventa

afi§ata va fi: 1 1 2 2 1 2.)

4.1 Q: char* s[]={“ab”, “cd”, “ef”}

A:d)3 x 4 = 12 octeti(s este un vector de pointeri; neavand o dimensiune declarata el va fi

dimensionat dupa lista de initializatori: trei siruri de caractere. Cum un pointer ocupa 4 octeti,

rezulta: 3 elemente (pointeri) x 4 octeti (un pointer), deci 12 octeti.)

4.2 Q: declaratiile

Float a=2

Int *p=&a

A:d) eronate, p trebuie sa pointeze un int (Initializarea pointerului p cu adresa variabilei a de tip float

este incorecta, pointerul trebuind incarcat cu o adresa de int.)

4.3 Q: int * const p;

A:a)eronata, p fiind un pointer constant care nu a fost initializat (Declarata int * const p; defmeste intr-

adevar un pointer constant, ceea ce implica faptul ca acesta nu va putea fi modificat ulterior,

trebuind incarcat cu o adresa inca din momentul declararii. Declarafii de forma int *const p=new

int; sau int * const p=&a; (unde a ar fi o variabila de tip int), definesc corect un pointer constant

initializat.)

4.4 Q:Daca p si q sunt 2 pointeri de int (int *p, *q;) iar p contine …..

A:c)0x12FF84 (Este permisa adunarea unui pointer cu un intreg, rezultand obtinerea unei adrese

de memorie mai mare decat cea initials cu valoarea produsului dintre intregul respectiv si

dimensiunea tipului pointat. Astfel, pentru expresia q-p+2, q va confine o adresa de memorie mai

mare decat p cu 2*sizeof(int), adica 8 octeti. Asadar q va contine adresa 0xl2FF7C+8, deci

0xl2FF84.)

Page 14: Test Grila c++

4.5 Q: int *p=new int (3);

A:c) alocarea unei zone de memorie ce contine un element de tipul int initializat cu valoarea 3 (Declaratia

realizeaza alocarea unei zone de memorie ce confine un element de tipul int initializat cu valoarea

3 (adica *p are valoarea 3). Daca aveam int *p=new int [3]; ar fi insemnat alocarea unei zone de

memorie ce contine 3 elemente de tipul int.)

4.6 Q: int i=2, *p=&I;

Cout<<p [0]

A:b) corecta si afiseaza valoarea 2 (Secvenfa este corecta, expresia p[0] fiind echivalenta cu *p,

afisand astfel valoarea continuta la adresa data de pointerul p, adica valoarea variabilei i, deci 2.)

4.7 Q: int x=5, *p=&x

X=7; cout<<*p;

A:b)7 (Cum pointerul p contine adresa variabilei x, atribuirea lui x (x=7) va afecta valoarea

continuta la adresa de memorie respectiva, deci continutul pointerului p. Astfel se va afisa

valoarea 7.)

4.8 Q:int x=5, *p, *q;

P=&x; *p=2; q=&x

……

A:a) 2 2 2(Pointerii p si q contin adresa variabilei x. Astfel, prin atribuirea *p=2 va fi afectata

valoarea stocata la aceasta adresa, deci atat variabila x, cat §i continutul pointerului q. Se va afisa

deci 2 2 2.)

4.9 Q: int n=10, *pi, *pf, *p=new int[n];

…..

A:d)corecta (Secventa este corecta si va parcurge toate cele n elemente alocate prin pointerul p,

atribuindu-le valorile de la 0 la n-1.)

4.10 Q: double *p, *q;

….

A:c) de tip int(Dintre variantele de mai sus, singura operatie permisa este adunarea unui pointer cu

un intreg. Adunarea a doi pointeri sau adunarea unui pointer cu o valoare reala nu sunt permise

de aritmetica de pointeri.)

4.11 Q: double y;

Page 15: Test Grila c++

Const double *p, x=3.;

A:a) *p=x (Pointerul p adreseaza o zona de memorie constants §i deci continutul sau nu poate fi

modificat. Celelalte trei atribuiri sunt corecte.)

4.12 Q: int a[][3]=[1, 2,3, 4 ];

Cout<<sizeof(a);

A:c)24 (Variabila a este un masiv bidimensional care va avea 3 coloane. Cele 4 valori date la

initializare vor fi astfel dispuse pe 2 linii (1,2,3 in prima linie si 4,0,0 pe a doua linie). Vom avea deci

2 linii x 3 coloane = 6 elemente de tip int, deci in total 6 x 4 = 24 octeti.)

4.13 Q: int a[]={1,2,3};

Int *p={1,2,3}

A:b)declararea variabilei a este corecta (Prima declarafie int a[] = {l, 2, 3}; defmeste un vector cu 3

elemente, realizand si inijializarea componentelor sale. Cea de-a doua declaratie int *p= {1, 2, 3};

incearca sa defineasca un pointer, dar in cazul acestuia nu este permisa o astfel de initializare.

Asadar, doar variabila a este declarata si initializata corect.)

4.14 Q: int a[][]={{1,2,3},{4,5,6}}

A:d)eronata (Declaratia este eronata, in cazul masivelor multidimensionale cu initializare trebuind

specificat explicit numarul de elemente pe fiecare dimensiune (mai pu^in prima). Declaratii ca: int

a [2] [3] = { {1,2, 3}, {4, 5, 6}}; sau int a[] [3] = { {1,2,3}, {4,5,6}}; ar fi fost corecte.)

4.15 Q: int a[5], *p;

I II III IV

A:b) I, III (Numele masivului a este de fapt un pointer constant, asadar el nu poate fi 1-value. In

schimb, pointerul p este variabil, el putand fi astfel atribuit sau incrementat. Variantele corecte

sunt deci I si III.)

4.16 Q:int **p;

P=new int*[5]

……

A:a) alocarea unei matrici de intregi cu 5 linii si 3 coloane (Se vor aloca mai intai 5 pointeri

corespunzatori celor 5 linii ale unui masiv bidimensional, urmand ca pentru fiecare linie sa se

aloce cate 3 elemente. Este vorba deci de alocarea unei matrici cu 5 linii si 3 coloane.)

4.17 Q: care din urmatoarele expresii nu este corecta pentru referirea valorii unui element A[i][j] al unui

masiv bidimensional (int A[10][10];)

Page 16: Test Grila c++

A:b) *(A+i)[j]( Datorita prioritatii operatorilor din expresia *(A+i)[j], aceasta se va evalua astfel: se

calculeaza A+i, reprezentand adresa pointerului liniei i; se evalueaza (A+i)[j], care este echivalent

cu *(A+i+j), reprezentand pointerul liniei i+j a matricii; se calculeaza *(A+i)[j], echivalent cu

**(A+i+j) sau (*(A+i+j))[0], adica valoarea elementului A[i+j][0].)

4.18 Q: int (*p) [5];

A:c) un pointer la un vector de 5 int (Variabila p declarata astfel va fi un pointer la un vector de 5 int,

putand fi incarcat cu adresa numelui unui vector de 5 intregi (int v[5]; p=&v;). Daca doream

declararea unui vector de 5 int am fi avut: int p[5];, iar pentru un vector de 5 pointeri la tipul int: int

*p[5];.)

4.19 Q: double *p[5];

A:d)20 octeti (Variabila p este un vector de 5 pointeri, iar un pointer se reprezinta pe 4 octeti, deci p

ocupa 5 x 4 = 20 octeji.)

4.20 Q: double (*p) [5]

A:a)4 octeti (Variabila p este un pointer la un vector de 5 double, iar un pointer (indiferent de tipul

pointat) se reprezinta pe 4 octeti)

4.21 Q: double (*p)[2][3], A[2][3];

P=&A

A:c)(*p)[i][j] (Trebuie considerate prioritatea operatorilor [] si *. Astfel referirea corecta a valorii

elementului A[i][j] este (*p)[i][j].)

5.1 Q: char s[10]=”abcd”;

A:d)sizeof(s)=strlen(s)+6 (Pentru sirul s vom avea sizeof(s)=10, iar strlen(s)=4, deci relafia dintre

cele doua valori va fi: sizeofXs)=strlen(s)+6.)

5.2 Q: cout<<”abracadabra”+4;

A:c)printf(“%s\n”, s) (§irul de caractere constant "abracadabra" este o adresa, putand participa in

calcule specifice pointerilor constanti. Astfel o operatie de forma "abracadabra"+4 este corecta,

fund echivalenta cu adunarea unui pointer cu un intreg, rezultand o adresa mai mare cu 4 octeji

decat adresa initials. Ob^inem asadar sirul "cadabra".)

5.3 Q:daca s este un sir de caractere atunci apelul puts este echivalent cu

Page 17: Test Grila c++

A:c) afiseaza “cadabra” (Diferenta dintre apelurile puts(s) §i printfl^"%s",s) este aceea ca func|ia

puts dupa afi§are insereaza new-line. Apelul va fi deci echivalent cu printf("%s\n",s).)

5.4 Q: char s[] = {‘m’, ‘e’, ‘s’, ‘a’, ‘j’}

A:a) imprevizibil variabila s neputand fi manipulate ca un sir de caractere (Inifializat astfel, sirul s nu

confine terminatorul '\0', astfel ca nu va putea fi manipulat ca un sir de caractere, ci doar ca un

vector de char. Asadar, apelul strlen(s) va avea un rezultat imprevizibil.)

5.5 Q: char s[]=”un sir de caractere”;

S[6]=0

Puts(s)

A:b)corecta si afiseaza un sir (Secvenfa este corecta, atribuirea s[6]=0 fiind permisa si realizand

pozifionarea terminatorului de sir '\0' pe pozifia 6. Se va afisa astfel "un sir".)

5.6 Q: char s[]=”un sir de caractere”, *p=s

While (*p) p++

A:c) strlen(s) (Diferen{a celor doi pointeri p-s da numarul de caractere dintre cele doua adrese.

Pointerul p pleaca initial cu adresa sirului s, dar la iesirea din while, datorita incrementarii va

ajunge pe terminatorul "\0'. Astfel ca, diferen|a p-s va fi egala cu lungimea sirului, adica strlen(s).)

5.7 Q: char *x=”unu”, *y=”doi”

A:b) o valoare pozitiva unu fiind mai mare ca doi (Funcjia strcmp compara alfabetic doua siruri de

caractere. Din punct de vedere alfabetic sirul "unu" este mai mare decat sirul "doi", funcjia

returndnd o valoare pozitiva.)

5.8 Q:char s[]=”ABCdef”

A:d) nici una (Nici una din cele trei functii nu realizeaza conversia literelor mici in majuscule si a literelor mari in minuscule. Astfel:- strupr - converteste literele mici in majuscule (se ob^ine "ABCDEF')- strlwr - converteste literele mari in minuscule (se obtine "abcdef)- strrev - inverseaza (in oglinda) sirul de caractere (se obtine "fedCBA"))

5.9 Q:char s[]=”ana are mere.” ………..

A:a) eronata instructiunea while cicleaza la infinit (Pentru a extrage cuvintele unui §ir de caractere,

doar primul apel al functiei strtok va primi ca parametru sirul de analizat (strtok(s,d))s apelurile

ulterioare avand ca prim parametru pointerul NULL (strtok(NULL,d)).)

5.10 Q: p=strstr(s1,s2);

While (p!=NULL) {

Page 18: Test Grila c++

………..

A:d) stergerea tuturor aparitiilor subsirului s2 din sirul s1 (Secventa realizeaza cautarea si stergerea

tuturor aparitiilor subsirului s2 din sirul si, folosind un pointer p ce lucreaza direct asupra sirului

dat, modificS.ndu-1 astfel indirect.)

6.1 Q: int min (int V[], int n) {

Int m=v[0]

For(int i=1; i<n;i++)

……

A:b)este corecta si returneaza maximul unui vector (Functia este corecta, vectorul formal V se

dimensioneaza dupa marimea parametrului efectiv (de la apel); el poate fi transmis si ca pointer

dar nu este obligatoriu. Desj numele functiei indica altceva, ea returneaza maximul vectorului -

varialila locala m se actualizeaza la fiecare element curent din vector mai mare.)

6.2 Q: int min_max (int V[], int n) {

Int min=v(0), max=v[0];

For(int i=1;i<n;i++) {

If (min>V[i])

Min=V[i];

…….

A:c) este corecta si returneaza maximul unui vector (Functia returneaza, a§a cum rezulta din antetul

ei, o singura valoare: un intreg: eel rezultat In urma evaluarii expresiei virgula din instructiunea

return §i anume ce-a de-a doua variabila - max.)

6.3 Q: int min_max (int V[], int n) [2] {

Int min=V[0],max=v[0];

For(int i=1;i<n;i++)

If (min<V[i])

……

Return min

Return max

A:d) este incorecta: o functie nu poate return un masiv (Functia f este definita incorect: se incearca

returnarea unui masiv cu doua elemente intregi.)

6.4 Q:#include <iostream.h>

Int n=2;

Int& F() {

Page 19: Test Grila c++

Return n=3;

……

A:c)este corecta si afiseaza 13 (Apelul unei functii poate fi lvalue daca functia returneaza o referinta

catre o data care este fie statica (cum se intampla in exemplul nostra), fie a fost transmisa prin

referinta ca parametru functiei respective. F() se identifies cu variabila returnata (prin referinta) de

functia F, adica n, care este o variabila statica. La apelul F() (din F()+=10;) variabila statica n este

initializata cu 3, apoi i se adauga 10, devenind 13.)

6.5 Q: #include <iostream.h>

Int& F (int &n) {

Return n=3;

}

Int main() {

Int n=5

…….

A:b)este corecta si afiseaza 3 4 (Apelul unei functii poate fi lvalue daca functia returneaza o referinta

catre o data care este fie statica, fie a fost transmisa prin referinta ca parametru functiei

respective, cum se intampla in exemplul nostra: F(n) se identified cu variabila returnata (prin

referinta) de functia F, adica n, care la randul sau este transmisa prin referinta functiei F, deci se

identified cu variabila n-5 din functia main. La prima afisare avem o postincrementare, ceea ce

face ca valoarea afisata sa fie 3, apoi, in urma incrementarii, n devine 4.)

6.6 Q: #include <iostream.h>

Void f (int &x, int y) {

X=1; y=2;

}

Void main () {

Int z=0; ……….

A:b) 1 (Din cei doi parametri ai functiei f, primul este transmis prin referinta, iar eel de-al doilea

prin valoare. Modificarea primului parametru in corpul functiei f, va afecta valoarea parametralui

efectiv z, pe cand modificarea celui de-al doilea parametru nu va altera valoarea lui z. In

consecinta la iesirea din apelul functiei f, variabila z va avea valoarea 1, care se afi§eaza.)

6.7 Q: #include <iostream.h>

Int a=5;

Int f (int b) {

A-=b; return b++

Page 20: Test Grila c++

}

Void main() {

Cout<<f(a); cout<<a;

A:c)5 (in urma apelului f(a) vom avea: atribuirea a-=b va afecta variabila globala a care va primi

valoarea 0; continand o postincrementare, instructiunea return va intoarce valoarea

neincrementata pe care parametral b a avut-o la intrarea in functie (adica 5), abia dupa aceea

urmand sa se feci incrementarea lui b, fara nici un efect. Asadar, programul va afisa 5 (pentru f(a))

§i 0 (pentru a).)

6.8 Q: #include <iostream.h>

Int x=5

Void f (int &y) {

Y=2*x+3;

X+=2

Cout<<y;

}

Void main() {

F(x);

Cout<<’ ‘<<x

}

A:a) 15 15 (Parametral y al functiei f fiind transmis prin referinta, in momentul apelului f(x) cele

doua variabile x §i y vor utiliza aceeasi zona de memorie. Astfel, price modificare a valorii lui x il

va afecta pe y, §i reciproc, orice modificare a lui y il va afecta pe x. A§adar, in urma celor doua

atribuiri vom avea: y=2*x+3, adica Fl3, deci x=13 §i x+=2, adica x=15, deci y=15. Deci, programul

va afisa 15 15.)

6.9 Q: void f (char a) {

Unsigned char m=128;

While (m)

{

Cout<<(m&a?1:0);

m>>=1;

}}

A:b)afisarea pe biti a unui numar intreg mic (Functia realizeaza afisarea unui numar pe biti. Se

folose§te o masca (m) ce pleaca cu valoarea 128 (2 ), deci va avea primul bit 1 si restul bitilor 0. La

fiecare ileratie, folosind operatoral & (§i logic), se determina bitul de pe pozitia Wespunzatoare a

Page 21: Test Grila c++

numaralui dat, dupa care bitul nenul al mastii se deplaseaza •spre dreapta pentru a parcurge astfel

toti cei 8 biti ai valorii date.)

6.10 Q:void f (unsigned a, unsigned b) {

If(a && b)

If (a!=b)

………………….

A:a) cel mai mare divisor comun a doua numere (Functia foloseste algoritmul scaderilor repetate

pentru a calcula eel mai mare divizor comun a doua numere naturale. Daca una din cele doua

valori este 0, atunci functia o va afif a pe cealalta ca fiind valoarea divizorului comun.)

6.11 Q: unsigned f (unsigned a, unsigned b) {

Unsigned p;

For (p=1;a;a--) p*=b;

Return p

A:b) b la puterea a (Atribuirea compusa p*=b se va executa de un numar de ori egal cu valoarea lui

a, deci functia calculeaza produsul p=b*b*.. ..*b (de a ori), obtinand astfel valoarea ba.)

6.12 Q:int f(int x) {

If (x=0) return 1;

Return f(x-1) +2

A:d)7 (Functia f fiind recursiva, valoarea intoarsa in urma apelului f(3) se va calcula astfel: f(3)=f(2)+2Continuand, vom avea: f(2)=f(l)+2, f(l)=f(0)+2 fi f(0)=l. Deci: f(l)=f(0)+2=1+2=3f(2)=f(l)+2=3+2=5f(3)=f(2)+2=5+2=7 Asadar, valoarea intoarsa de functia f pentru apelul f(3) va fi 7.)

6.13 Q:int f (int x) {

If (!x) return 0;

Else return f(x-1)+x*x

A:a)30 (Functia recursiva f va calcula suma patratelor numerelor naturale consecutive mai mici

sau egale cu x. Astfel pentru apelul f(4) se obtine suma 4*4+3*3+2*2+1*1+0=30. Deci valoarea

returnata de functie pentru f(4) este 30.)

6.14 Q:int F (int n) {

If (n<=1) return 1

Else return F(n-1) + F(n-2)

A:d) de 9 ori (Pentru F(4) avem: F(4)=5 si 9 apeluri)

Page 22: Test Grila c++

6.15 Q: int f (int x) {

If (x>0) return f(x-1)+f(x-3)

Else return 1

A:c) de 18 ori (Mai intai pentru f(3) avem: f(3)=4 fi 7 apeluri Pentru f(4) vom avea: f(4)=6 f i 11 apeluriDeci in total vor fi 7+11, adica 18 apeluri.)

6.16 Q: #include <iostream.h>

#include<stdlib.h>

Void main (int argc, char *argv[]) {

Int s, I;

For (s=0, i=1; i<argc;i++)

S+=atoi(argv[i])

Cout<<s

A:d)correct si afiseaza 17 (Programul este corect, functia main putand primi argumente. Acestea

sunt gestionate printr-un vector de firuri de caractere (char *argv[]), iar numarul lor este indicat de

primul parametru (int argc). Primul argument (argvfO]) este un §ir de caractere ce contine adresa

completa a fifierului. In exemplul de mai sus, parametrii dati la executie au fost convertiti in valori

intregi fi insumati. Primul argument (pentru i=0) a fost omis intentionat, nefiind numeric.

Programul afifeaza asadar suma celor 4 valori, anume 17.)

6.17 Q: int prod (int a, int b=1, int c=1, int d=1) {

Return (a*b*c*d);

A:a) correct si returneaza valoarea 15 (Apelul este corect §i intoarce valoarea 15. Primii doi

parametri vor avea valorile fiirnizate la apel, respectiv 3 §i 5, iar ultimii doi, pentru care nu s-au

furnizat valori vor intra in calcul cu cele implicite, respectiv 1. Functia returneaza deci produsul

3*5*1*1=15.)

6.18 Q: int suma (int a=0, int b, int c=0, int d=0) {

Return a+b+c+d

A:b)eronat parametrii cu valori implicit trebuie sa se afle la sfarsitul listei de parametric (InsasJ definirea

functiei este eronata, parametrii formali ce primesc valori implicite trebuie sa se afle la sfarsitul

listei de parametri §i nu pot fi intercalati cu parametri fara valori implicite.)

6.19 Q: int m (int a, int b) {

Return a<b?a:b;

}

Double m (double a, double b) {

Return a>b?a:b;

Page 23: Test Grila c++

}

A:b) eronat apelul conduce la ambiguitate nestiind ce variant sa se utilizeaze (Apelul m(2,3.) primeste

ca parametri o constants int §i una double. Apelarea primei variante necesita o conversie double-

>int, iar cea de-a doua versiune o conversie int->double. Existand doua supraincarcari cu

conversii similare, va fi semnalata ambiguitate.)

6.20 Q: int suma (int a, int b) {

Return a+b

}

Int suma (int v[], int n)

Int I,s;

For (i=0, s=0; i<n; i++) s+=v[i]

Return s;

A:d) correct si apeleaza a doua functie calculand suma elementelor vectorului x (Prima versiune a

functiei suma primeste ca parametri doi intregi. Cum variabila x este un pointer, nu este permisa

conversia sa din int* in int §i deci nu poate fi aleasa pentru apel aceasta functie. Cea de-a doua

variants a functiei suma primeste ca parametri un vector si dimensiunea acestuia. Cum numele

unui masiv este un pointer constant, functia poate primi la apel pointerul x, calculand suma celor

5 elemente ale vectorului x.)

6.21 Q:care din prototipurile de mai jos declara correct o functie cu numar variabil de parametri

A:a) void g(int n,…); (Lista variabila din antetul unei astfel de functii, marcata de trebuie precedata

de lista parametrilor fic§i ai functiei si se aflS intotdeauna la sfar§itul listei de parametri. Deci

prototipul corect va fi void g (int n, ...);.)

6.22 Q: int suma (int n,…) {

Int s=0, I, x;

Va_list 12;

…………

A:b)correct si returneaza valoarea 29 (Apelul este corect fiind vorba de o functie cu numar variabil

de parametri. Pentru exemplul de mai sus, primul parametru fix al functiei va indica numarul

parametrilor variabili, deci numarul valorilor insumate. Astfel apelul suma(4,5,7,8,9) va calcula

suma 5+7+8+9=29.)

6.23 Q:template <class T> void schimb (T &a, T &b) {

T aux; aux=a; a=b; b=aux

Page 24: Test Grila c++

A:c) este corecta si interschimba 2 valori de tipul generic T (Functia schimb este un §ablon, putand sa

lucreze cu tipuri de date mndamentale sau definite de utilizator. Sintaxa template <class T> anunta

ca functia este definita pentru un tip de date generic T, putand fi apelatS pentru diferite tipuri de

date.)

6.24 Q: double (*F)(int, int)

A:c) definirea unui pointer de functie ce va fi incarcat cu adresa unei functii ce primeste 2 int si returneaza

un double (Declaratia double (*F) (int,int) anunta definirea unui pointer de functie, ce va fi incarcat

cu adresa unei functii ce corespunde prototipului: [double f (int, int);. O functie care primeste 2 int

si returneaza un double va avea prototipul double F (int, int) ;, iar una care primeste 2 int §i

returneaza un pointer de double va fi double *F (int, int) ;.)

7.1 Q: #include <iostream.h>

Int main() {

Enum zi {dum, luni=2, marti}

Zi z1=dum, z2=luni, z3=marti;

………

A:a) este corecta si afiseaza 0 2 3 (Intr-o enumerare, elementelor fara valoare explicita li se vor atribui valori form urmatoarelor doua reguli: -valoarea implicita pentru primul element (In exemplul nostru: dum) este 0; -valoarea implicita a celorlalte elemente este valoarea elementului precedent, incrementata cu o unitate. In cazul nostru, marti va fi luni+1, adica 3.)

7.2 Q: struct carte {

Char *titlu;

Char *autori[3]

Double cod;

A:c)24 (Un obiect Carte ocupa eel pu^in spatiul necesitat de memorarea tuturor campurilor sale:

Titlu ocupa 4 octeti (pointer), Autori ocupa 3x4 octeti=12 octefi, cod ocupa 8 octeti, in total 24

octeti.)

7.3 Q: struct carte {

Char *titlu;

Char *autori[3]

Carte bibliografie[30]

A:c) nu este valida autoreferirea se poate realize numai prin pointer (In general este permisa crearea de structuri imbricate (a unei structuri in interiorul altei structuri), dar de tipuri diferite, a§a cum demonstreaza exemplul de mai jos:struct Carte {

Page 25: Test Grila c++

char *Titlu; char *Autori[3]; struct Pret {int Vechi, Nou;};};)

7.4 Q:typedef double *(*pF) (int[10], int[10]

A:d) pentru un pointer la functie ce primeste doi vectori de cate 10 intregi si intoarce un pointer la double

(Tinand cont de prioritatea operatorilor: se citeste mai Intai perechea de paranteze rotunde din

stanga: pF este un tip pentru pointer la..., apoi se citeste restul: ...o functie ce prime§te doi vectori

de cate 10 intregi si intoarce un pointer la double.)

7.5 Q: typedef double *(pF())[10];

A:a)definit eronat (Tipul sinonim este definit eronat: tinand cont de prioritatea operatorilor, pF ar fi

o funcple ce nu primeste argumente fi returneaza un vector de 10 pointeri la double, insa in

limbajul C/C++ nu este permis unei functii sa returneze decat eel mult o valoare, ea poate returna

masive prin intermediul adresei acestora; Corect este, de exemplu:

typedef double *(*pF())[10];

In acest caz, pF este un tip pentru o functie ce nu primeste argumente si returneaza un pointer la

un vector de 10 pointeri la double, sau:

typedef double (*pF())[10];

cand pF ar fi un tip pentru o functie ce nu primefte argumente §i returneaza un pointer la un vector

de 10 double.)

7.6 Q: typedef int vector[10]

Vector a[20]

A:c)int a[20][10] (Conform declarator de mai sus variabila a va fi un tablou de 20 de elemente de tip

vector, fiecare vector avand 10 elemente de tip int. Deci declararea echivalenta a masivului a va fi:

int a [ 2 0 ] [10];)

Page 26: Test Grila c++

8.1 Q: #define INC(x) x++

Cout<<INC(3)

A:c) va genera eroare – left-value incorrect (Apelul cout«lNC(3) este incorect pentru c& in urma

expandarii textul sursS va fi: cout«3++;. Incercarea de a incrementa o constants este incorecta: 3+

+ este echivalent cu 3=3+1, left-value incorect. Daca definitia ar fi fost urmata de punct §i virgula

(;), atunci in urma expandarii am fi avut: cout«3++;; ceea ce nu ar rezolva lucrurile.)

8.2 Q: #define SQR(x) x*x

Cout<<SQR(3+5)

A:a)va afisa 23 (In urma expandarii apelului cout«SQR (3+5) ; se va obtine: cout<<3+5*3+5;. Datorita prioritatii operatorului inmultire (*) fata de adunare (+), vom avea: 3+5*3+5=3+15+5=23, deci valoarea afi?ata va fi 23. O idee de rezolvare a acestui inconvenient ar fi rescrierea macrodefinittei astfel:#define SQR(x) (x)*(x))

8.3 Q: #include <iostream.h>

#define SWAP (x,y) int temp=x; x=y; y=temp;

Void main() {

Int i1=3, i2=5

……

A:d)va genera eroare (Aplicatia va genera eroare, intrucat va duce la redeclararea variabilei auxiliare temp. In urma expandarii celor doua apeluri: SWAP(il,i2); §i SWAP (i2, il); seva obtine:void main() {

int il=3, i2=5; int temp=il; il=i2; i2=temp; int temp=i2; i2=il; il=temp; cout«il<<' '«i2;})

8.4 Q: #include <iostream.h>

#define SWAP (x,y) { int temp=x; x=y; y=temp; }

Void main() {

Double d1=3.5, d2=5.5

…………….

A:c) va afisa 5.5 3(Apelul SWAP (dl, d2) ; va fi expandat astfel:{ int temp=dl; dl=d2; d2=temp; }

Cum dl=3.5, d2=5.5, variabila auxiliara temp va fi 3 (in urma unei conversii implicite de tip

de la double la int, prin pierderea zecimalelor), apoi dl va lua valoarea 5.5 §i in cele din urma d2 va

deveni 3. A§adar, dl=5.5 §i d2=3.)

Page 27: Test Grila c++

8.5 Q: #define MACRODEF(x) (‘A’<=(x)&&(x)<=’Z’?(x)-‘A’+’a’:(x))

A:c)converteste o litera mare in litara mica (Macrodefinijia converte§te o litem mare in litem mica

astfel: verifica daca argumentul este o litem mare §i, daca da, il transforms in litem mica scazand

caracterul 'Af §i adunand % (conform listei de coduri ASCII, in general daca x este litem mica iar X

este corespondentjil majuscul al sau, atunci: x-'eC - X-'A').)

9.1.sa se precizeze care afirmatii sunt corecte:

R:b- I,IV -“metodele statice se asociaza cu clasa, nu cu un obiect,ele nu primesc pointerul this

|9.2.un atribut”private”al unei clase poate fi accesat

R:a-numai in interiorul clasei de baza-un atribut private poate fi accesat doar numai in clasa de baza

9.3. un atribut”private”al unei clase poate fi accesat

R:a-numai in interiorul clasei-atributele private nu pot fi accesate decat in interiorul clasei

9.4.fie clasa:..increment

R:b-metoda off-line-pentru ca nu se specifica explicit ca sunt in-line, ele vof fi off-line

9.5.fie clasa: constructor

R:c-este utilizat la instantierea C c(1,2);instantierea obiectelor se face numai specificand explicit toti parametrii

9.6.fie clasa :precizati afirmatia corecta

R: a-pointerul este constant-declaratia C* const pc=new C; corespunde instantierii unui pointer constant

9.7.fie clasa: precizati afirmatia corecta

R:c-constructorul standard este apelat de doua ori-C ob[2]; declara un vector ob cu doua obiecte de tipul C; in cazul masivelor se apeleaza constructorul standart pentru fiecare obiect in parte

Page 28: Test Grila c++

9.8.fie clasa :instantiere va aparea

R-c-constructorul 3-instantierea C c(3) va apela constructorul care are ca valoarea ultimul parametru ca valoare implicita,costructorul 3.

9.9.fie clasa: fie declaratiile

R:b-I,IV-atributele si metodele obiectelor simple se refera cu operatorul punct(.),in cazul pointerilor de obiecte se foloseste sageata(->)

9.10.fie clasa precizati afirmatia corecta

R:c-destructorul este apelat de doua ori-indiferent de modalitatea de creare,la parasirea functiei main, cele doua obiecte vor fi distruse cu ajutorul destructorului

9.11.fie clasa : atributul x este

R:c-private-in cazul claserlor, modificatorul de acces implicit este private.

9.12.un atribu al unei clase “student”care are rolulde a contoriza toti studentii instantiati terbuie declarat:

R:c-static-datele statice sunt associate clasei, in ansalmu si nu fiecarui obiect in parte, de aceea ele nu pot contoriza numarul de studenti

9.13.fie clasa: apelulf() va det utilizarea

R;d-constructorul de clasa si celui de copiere cate o data-functia C f () {static C c;return;return c;} creeaza o singura data un obiect static c, folosind constructorul de clasa,apoi, la fiecare apel il returneaza pe acesta, fol constructorul de copiere

9.14.fie clasa: functia void C(int-x=0) (x=_x;) poate constitui un constructor al clasei

R:d-nu pentru ca la definirea constructorului nu se specifica valoarae returnata-constructorul unei clase areanumite propietati: are numele clasei; nu returneaza nimic;poate avea parametri

9.15.fie clasa: instantierea c*=c=new C(3); apeleaza

Page 29: Test Grila c++

R:a-constructorul de clasa o data-instantierea C*c=new C(3) determina alocara dinamica a unui pointer c catre un singur obiect C si incarcarea obiectului pointat cu data 3, penrtu care se va utilize constructorul de clasa.

9.16.fie clasa: functia ~c(int_x) {cout<<_x} poate constitui un destructor al clasei

R:c-nu pentru ca are parametric-are numele clasei dar nu returneaza nimic

9.17.fie clasa: metoda SetX este:

R:c-eronata; intr-o metoda declarata const obiectul *this este constant-aceasta este constanta si atributele nu pot fi modificate(x=3,eronat)

9.18.fie clasa: precizati afirmatia corecta:

R:c –constructorul de clasa este apelat o data sic el de copier o data-declaratia C c1,c2=c1 determina crearea a doua obiecte, pentru primul se utilizeaza constructorul clasa,iar al 2 lea constr de copiere

9.19.aplicatia: …int Get_a() {return a;}…cout<<.Get_a();

R: d-este eronata; obiectul constant c nu poate invoca metoda Get-()-obiecte constant pot invoca decat metode constant,cum Get_a() nu a fost declarata constanta,aplicatia va genera eroare

9.20.clasa: …int Get_a() const {return a=5;}};

R:d-este eronata; metoda constanta Get_a() nu poate modifica obiectul *this-cuv const se refera la metoda constanta,adica nu este permisa modificarea atributului in corpul functiei

9.21.ce va afisa aplicatia: …cout<<”Nr. Obiecte: “<<C::n<<endl;

R:b-1-atributul static n este actualizat in momentul construirii unui obiect prin constructorul de clasa(adica c1) .Constructorul de copier nefiind definit, la crearea obiectului c2 se va apela constructorul implicit creat de compilator, care nu face si incrementearea lui n, acesta ramanand cu valoarae 1

9.22.ce va afisa aplicatia:…cout<<C::n;

R:c-121-se creeaza c1, se afiseaza 1,n devine 1; se creeaza obiectul c2,n devine 2 ,afiseaza 2,la iesire c2 se distruge,n va fi 1,se afiseaza1.deci afiseaza 1 2 1

Page 30: Test Grila c++

9.23.fie clasa: definirea clase C este:

R:a-corecta-clasa C a fost definite corect

9.24.se considera clasa: care este ordinea apelarii constructorilor pt cele doua obiecte create?

R:b-constructorul de clasa si apoi cel de copiere-pt c1 se apeleaza constructorul de clasa,care va face intializare celor 2 atribute ale sale cu valorile 2 si 0, iar pt obiectul c2 se apeleaza constructorul de copier, acesta preluand atributele obiectului c1

9.25.fie clasa: care din functiile poate constitui un constructor al clasei?

R:d-C(int_x=0, int_y=0): y(_y){x=_x;}initializarea nu se face prin prin atribuire,ea trebuie initializate prin lista de initializatori a constructorilor,iar pt atributele variabile nu sunt restrictii prinvind modalitatea de initializare.deci doar ultima varianta este corecta C(int_x=0,…{x=_x;}

9.26.fie clasa: definirea clasei C este:

R:a-corecta-este declarata correct,va avea un atribut variabil si unul constant

9.27.fie clasa: daca c este un obiect constant de clasa c declarat: const c; care din urm apeluri sunt valide?

R:c-c.h.(c);c.k(c)functia h declara obiectul current constant, apelarea functiei va fi permisa;functia k declara atat obiectul constant cat so parametrul,deci va putea fi apelata

9.28.pentru clasa: care din calificarile de mai jos refera data membra statica s?

R:-b-I,IV-atributele statice ale unei clase contin informatii referitoare la intreaga

9.29.consideram clasa:…int C::s=0 definirea clasei c este:

R:d-corecta-clasa C este definite correct, avand un atribut static(s),unul nestatic(x) si o metoda static (f)

9.30.fie clasa: de cate ori se apeleaza cei doi constructori

Page 31: Test Grila c++

R:c-contructorul d clasa este apelat de 3 ori sic el de copier nici o data-fiind un vector de 3 obiecte de clasa C, constructorul de clasa se apeleaza entru fiecare obiect in parte, deci de 3 ori

9.31.fie clasa: de cate ori se apeleaza constructoru clasei C?

R:-b-o functie prieten, definite corect-operatorul new folosit pt alocarea dinamica in cazul pointerului p, determina si apelul constructorului de clasa.

9.32.in clasa: functia f este:

R:-b-o functie prieten, definita correct-asa cum arata si declaratia friend, functia f va fi o functie prieten a clasei C

9.33.fie clasa: declaratia functiilor f este

R:d-corecta, prima functie fiind o metoda a clasei, iar cea de-a doua o functie indeoenedenta-prima functiei este o metoda a clasei,apelul sau pleaca de la un obiect, subt forma c.f(c).Cea de a 2 a fiind independent, va fi apelata independent sub forma f(c).

9.34.fie definitiile de clase : …C1::f(){cout<<x;}functia f este

R:c-o metoda a clasei C1 ce afiseaza valoarea atributului x al unui obiect de clasa C1 - dupa cum anunata operatorul de rezolutie(::) functia f este o metoda a clasei C1,astfel ca va lucre implicit cu un obiect de clasa C1,pe care l primeste prin pointerul this

10.1. fie clasa: … void main() { C c; cout <<++;}

R :b-afisarea valorii 1-Expresia cout«c++; apeleaza supraincarcarea operatorului de postincrementare, care insa returneaza valoarea incrementata a atributului x; x era initial 0 (prin constructorul de clasa), la afisare va fi 1. Pentru ca postincrementarea sa functioneze corect in corpul sau trebuia scris: return x++;

10.2. fie clasa :…int operator+(C c, int y){ return c.x+y;}.daca c este un obiect al clasei

C, atunci functia operator +:

R :a-permite efectuarea adunarii c+3-Dupa ordinea in care au fost declarate argumentele supraincarcarii operatorului +, rezulta ca operandul din stanga adunarii este obiect, iar eel din dreapta este intreg. Supraincarcarea va fi utila pentru adunarea c+3.

10.3.fie clasa:…int operator.() //supraicarcarea punct(.) {return c.x}{; Functia operator.:

Page 32: Test Grila c++

R :d-este eronata, operatorul . nu poate fi supraincarcat-Operatorii punct (.), de rezolutie(::), conditional (?:), dimensiune (sizeof) nu pot fi supraincarcafi.

10.4. fie clasa:…int operator/ () { return c.x;}}; Functia operator/:

R :b-este eronata operatorul / este binar-Prin supraincarcare nu se poate modifica arietatea unui operator: operatorul / este binar: daca se supraincarca prin metoda a clasei (cum s-a incercat in exemplul dat) el trebuie sa aiba un parametru, daca se supraincarca prin functie independenta, aceasta va trebui sa aiba doi parametri.

10.5.:fie clasa:…void main () {C c1, c2; c2=c1}; Expresia c2=cc1 determina apelul:

R :c-supraincarcarii operatorului = -Atribuirea c2=cl; apeleaza supraincarcarea operatorului de atribuire =. Nefiind vorba de o declaratie (o instantiere) nu se apeleaza nici un constructor. S-ar fi recurs la constructorul de copiere daca era o initializare insotita de declaratie: C c2=cl; diferit de: C c2; c2=cl.

10.6.fie clasa:…friend int operator~ (C c){return c.x;}{; Functia operator~:

R :b-permite extragerea datei private x-Functia operator~ semnifica supraincarcarea corecta a operatorului ~ pentru extragerea atributului privat x.

10.7.fie clasa:…void main() { C c; cout<<++c;}; Va determina:

R :d-semnalarea unei valori-Expresia cout«++c; confine o preincrementare; in clasa C este supraincarcat operatorul de postincrementare, semnalat prin prezenta parametrului artificial intreg.

10.8.fie clasa :…operator int (){retunr x ;} ;Functia operator int ():

R :d-este eronata, rep suprai op cast-Supraincarcarea operatorului cast prezinta particularitatea ca tipul returnat este plasat in declaratie dupa cuvantul cheie operator.

10.9 Operatorul sageata (->):

R :d-poate fi suprai numai prin functie independenta-Operatorul sageata este un operator special care se supraincarca numai prin metoda nestatica a clasei.

10.10 Fie definitiile: complex operator+ (double d, complex &c) { return c+d; }; Se doreste ca supraincarcrile operator+ sa asigure comutativitatea adunarii unui numar complex cu un double, atunci:

Page 33: Test Grila c++

R :d-suprai trebie sa fie declarate ca functii prietene ale clasei complex-Fiind definite ca functii independente, cele doua supraincarcari nu au acces la atributele private Re si Im ale clasei complex, de aceea nu pot fi utilizate ^ forma actuala ci trebuie fie definite ca metode ale clasei, fie li se poate pastra statutul independent fata de clasa, insa atunci trebuie declarate prietene ale acesteia.

10.11.Se considera clasa:..void main (){C c; cout<<(--c) ; } ;Expresia cout<<(--c) este :

R :d-eronata, functia operator - - are tip returnat void, deci rezultatul apelului nu poate intra in compunerea unei expresii-Desi supraincarcarea prin functie friend a operatorului — nu este eronata, functia putand avea tip returnat void, rezultatul apelului nu poate intra in compunere cu alti operatori, deci nici cu operatorul «. Supraincarcarea poate fi insa folosita in expresii de sine statatoare (~c;).

10.12.Se considera clasa :…void main () C a(3), b(5) ; a+=b ; cout<<a.x ;} ;Expresia a+=b este :

R :b-eroanta, operatorul x= nu a fost suprain -Desi operatorii + §i = au fost supraincarcati, acestia nu se compun automat. Astfel, pentru a putea evalua expresia a+=b va fi nevoie si de supraincarcarea operatorului +=.

10.13. Fie clasa :…{ in>>c.x ;return in ;} ; Functia operator>> este :

R :d-corecta, operatorul >> fiind folosit pt operatii de intrare cu obiecte (cin>>c)- Functia operator» este corecta, operatorul fund supraincarcat pentru a executa operatii de intrare (citire) pentru obiecte ala clasei C.

10.14 Fie clasa: C operator<<(int i) { return C{x<<i};Functia operator<< este:

R :a-corecta, operatorul << fiind supraincarcat pt deplasarea pe biti spre stanga a unui obiect (c>>2- In clasa data operatorul « a fost supraincarcat pentru a calcula rezultatul deplasarii pe biti spre stanga a atributului x al unui obiect (c«2). tn mod frecvent supraincarcarea operatorului « urmareste definirea operatiilor de iesire (afisare) cu obiecte, caz in care ar fi trebuit definit astfel:

friend ostreams operator<< (ostream &out, C &c)

{ out«c.x; return out; }

10.15. Se considera clasa:…{ return new char [n* sizeof( C) ]; }; Functia operator new este:

R :a-corecta, operatorul new este suprai prin functie membra statica- Supraincarcarea operatorului new este permisa atat prin functie membra statica, cat §i prin functie independents. Daca se supraincarca printr-o metoda a clasei, aceasta fiind o functie de interes general pentru clasa, ea va fi automat statica, chiar daca specificatorul static lipseste.

Page 34: Test Grila c++

10.16. Fie clasa:..C operator,(C c)( return c;}}; Functia operator, este:

R :d-corecta, evalueaza o lista de obiecte returnand valoarea ultimului obiect din lista-Operatorul virgula (,) poate fi supraincarcat in scopul evaluarii unei liste de obiecte, returnand valoarea ultimului obiect din lists.

10.17.In clasa:… C operator: ( C c) {return C(x/c.x;}{; Functia operator: a fost definite:

R :a-eronat. Simbolul doua puncte(   :) nu este un operator- Simbolul doua puncte (:) nu este un operator, iar crearea de noi operatori nu este permisa, putand fi supraincarcafi doar cei existenti in limbaj.

10.18.Fie clasa:…int operator ()() { return x*x }};Functia operator () este:

R :d-eronata, operatorul () este bianr. Functia trebuind sa aiba doi parametri-Operatorului functie 0 se

supraincarca numai prin functie membra si poate avea orice numar de parametri (deci §i 0). Functia a fost definita corect si calculeaza patratul valorii obiectului curent.

10.19. Se considera clasa:...void main () { C a (3), b(5); cout<< a==b;} ; Expresia cout<<a==b este :

R :a-eronata-Prioritatea operatorilor nu poate fi schimbata prin supraincarcare. Astfel, de§i operatorul = a fost supraincarcat corect, datorita prioritatii celor doi operatori («§i ==) prima expresie evaluata va fi cout«a, care va fi apoi comparata cu b, ceea ce genereaza eroare. Pentru o evaluare corecta putea fi folosita expresia: cout« (a==b).

10.20.fie clasa :…int operator ! { return ~x ;}{} ;Functia operator ! este:

R :c-corecta, si calculeaza negarea pe biti a valorii obiectului-De§i operatorul ! este definit in limbaj pentru a realiza negarea logica, in exemplul dat el a fost supraincarcat pentru a efectua negarea pe biti a valorii obiectului. Astfel, pentru tipurile fundamentale el va avea in continuare rolul implicit (negare logica), iar pentru obiectele clasei C va avea rolul care i-a fost asociat prin supraincarcare (negare pe biti).

10.21.Se considera clasa: void main() { V z(5); z[7]=3; cout<<z[7];} Expesia z[7] ;} ;

Expresia z[7]=3 :

R :d-corecta-Datorita supraincarcarii operatorului [], expresia z[7]=3 este corecta, operatorul folosindu-se pentru a adresa un element al vectorului x. De§i x este privat, poate fi accesat de operatorul [] (fund o metoda a clasei). In plus supraincarcarea permite scurtcircuitarea unui nivel de adresare, astfel ca o

Page 35: Test Grila c++

referire de forma z.x[i] va fi echivalenta cu z[i]. De asemenea, functia returnand o referinta a elementului intors, operatorul poate fi folosit in ambele parti ale unei atribuiri, deci z[i] este l-value.

11.1.Pentru a realiza conversia de la o clasa la alta se poat opta pentru:

R :b-I,III-Conversia de la o clasa la alta se realizeaza fie prin supraincarcarea operatorul cast in clasa sursa, fie prin definirea unui constructor adecvat in clasa destinatie.

11.2.Conversia unui obiect al unei clase inspre un tip primitiv, se poate face prin :

R :c-supraincarcarea operatorului cast in clasa respectiva- Conversia unui obiect al unei clase inspre un tip primitiv se realizeaza prin supraincarcarea operatorului cast in clasa respective.

11.3.Fie clasa :…void main () { C c(5) ; cout<<c+2} ; Expresia c+2 este :

R :b-corecta si foloseste supraincarcarea operatorului cast-Expresia c+2 este corecta, iar pentru evaluarea ei se va utiliza supraincarcarea operatorului cast al clasei C, care va face conversia obiectului c in tipul int, expresia reducandu-se la adunarea a doi intregi.. Operatorul cast definit se va folosi atat in conversii explicite (de exemplu (int)c+2), cat §i in conversii implicite daca este cazul (pentru c+2).

11.4.Fie clasa :…void main () { C c(5) ; cout<<c+2} ; Expresia c++ este :

R :d-eronata   ;valoarea intoarsa de op. cast nu este l-value- Expresia C++ este eronata. Desi operatorul cast definit in clasa poate face conversia obiectului c in tipul int, valoarea intoarsa de acesta nu este l-value, deci nu poate fi folosita in incrementare. Apelarea explicita a operatorului cast (sub forma ((int)c)++) nu rezolva aceasta problems, expresia fund in continuare eronata.

11.5.Se considera clasa :… void main () { C c(5) ; cout<<c+2} ; Expresia cout<<c este :

R :d-eronata   ; genereaza ambiguitate- Expresia cout«c genereaza ambiguitate: lipsa supraincarcarii operatorului « pentru afisarea obiectului c, va conduce la cSutarea unei modalitSti de conversie catre un tip primitiv pentru care afisarea este permisS. Datorita faptului ca exists doua cSi de a converti obiectul c intr-un tip fundamental, se va semnala eroare de ambiguitate.

11.6.Conversia unui tip de date primitiv inspre o clasa se poate face prin :

R :a-suprai. Construct. Clasei respective-Conversia dintr-un tip de date primitiv inspre o clasa se realizeaza prin supraincarcarea constructorului clasei respective. Pentru a actiona drept convertor, constructorul trebuie sa aiba un singur parametru de tipul primitiv (sau ceilalti parametri sa aiba valori implicite).

Page 36: Test Grila c++

11.7.Fie clasa :…void main () { C c(‘a ‘) ; c=65 ;} ; Expresia c=65. este :

R :a-corecta si atribuie valoarea 65 atrib x al obiectului c-Constructorul clasei C avand parametri cu valori implicite, va actiona drept convertor dinspre tipul primitiv char (corespunzStor primului parametru) inspre clasa C. Atribuirea se va evalua astfel: pentru constanta double 65. se efectueaza conversiile din double in char si apoi intr-un obiect de clasa C, care i se atribuie lui c. Astfel, atributul x al obiectului c va lua valoarea 65.

11.8.Fie clasa :…void main() { C c(‘a’,10.) ; c=(‘A’,20.) ;} ; Expresia C=(‘A’,20.) este :

R :c-eronata, nu exista un constructor care sa faca conversia dintr-un tip primitiv in tipul clasei C-Mai intai se va evalua rezultatul expresiei virgula ('A',20.) acesta fiind 20., dupa care se incearca atribuirea c=20, care este invalids (nu exista nici un constructor adecvat si nicio supraincSrcare adecvatS a operatorului =).

11.9.Fie clasele:…y=x ; y=CD(x) ; y=(CD)x; Care dintre cele trei atribuiri vor fi permise

R :b-y=CD(x)   ; y=(CD)x)   - Toate cele trei atribuiri implies conversia unui obiect de clasa CS intr-un obiect de clasa CD. In cazul de fata conversia se poate face pe doua cai: fie folosind constructorul clasei CD, fie folosind operatorul cast al clasei CS. In cazul atribuirilor y=CD(x) si y=(CD)x, nu pot sa aparS ambiguitSti, conversiile fiind explicite. Prima atribuire insa (y=x), necesitS o conversie implicitS, existenta simultana a celor doua modalitati de conversie generand ambiguitate.

11.10.Se considera clasele :…f(x) ; f(CD(x)) ; f((CD)x) ; Care din apelurile functiei f utilizeaza pentru conversie instructorul clasei CD ?

R :c-f(CD(x))   ; si f((CD)x)   - Specificatorul explicit al constructorului clasei CD, interzice conversiile implicite prin constructor (de§i sunt prioritare), acesta putandu-se folosi doar pentru conversiile explicite. In cazul in care este necesara o conversie implicita, ea se va realiza prin operatorul cast al clasei CS. Astfel apelul f(x) va utiliza pentru conversie (implicita) operatorul cast al clasei CS, iar apelurile f(CD(x)); §i f((CD)x) vor folosi pentru conversie (explicita) constructorul clasei CD.

11.11.Fie clasele :…void main () {CS a ; f(a) ;} ; Daca a este un obiect de clasa CS (CS,a ;), atunci apelul f(a) este :

R :d-eronat, genereaza ambiguitate-Apelul f(a) necesiti o conversie a obiectului a pentru adaptarea la prototiputl functiei f. Pentru un obiect de clasa CS exists doua eonversii, §i de asemenea, doua^suprauwarcari ale functiei f care pert lucra direct cu rezultatul ceior doua moduri de conversie, astfel ca se semnaleaza ambiguitate.

12.1. Aplicatia:..void main () { C c; cout<<c.x}}; Programul afiseaza:

A :a)0 (La instan|ierea obiectului clasei derivate este apelat explicit constructorul clasei de baza cu valoarea 0.)

Page 37: Test Grila c++

12.2 Fie aplicatia:… void main () {C c ;} ; Programul afiseaza

A :a)BCD (La instanjierea obiectului clasei derivate este apelat mai tntai constructorul clasei de baza (afiseaza B), apoi al clasei derivate (afiseaza C). La distrugere este apelat mai mtai destructorul clasei derivate (care nu este definit explicit), apoi al clasei de baza (afiseaza D).)

12.3 Consideram programul :…B *pb=new C ; pb-> f (); Programul afiseaza:

A:b)B (Pointerul pb este declarat ca pointer catre clasa B, deci funcjia f apelata va fi a clasei B (early binding = legare timpurie).)

12.4 Fie aplicatia:…void main () { B *pb=new B; pb->f(); };Programul:

A:a) este incorrect clasele abstracte nu pot avea instante (Functia f din clasa B este virtuala pura (nu are definite), ceea ce face ca B sa fie clasa abstracts, care nu accepts instante.)

12.5 Programul:… B *pb=new B; pb->f(); }:afiseaza:

A:c)C (Pointerul pb, desi este declarat ca pointer catre clasa B, este incarcat cu adresa unui obiect de clasa C. Cum funcfia f este virtuala, va fi apelata versiunea clasei C (late binding = legare tarzie).)

12.6. Fie aplicatia: …void main () {C c; cout<< c.x;};Programul afiseaza;

A :b)0 (La instanjierea obiectului clasei derivate este apelat mai intai constructorul clasei de baza care initializeaza atributul x cu 0, apoi al clasei derivate care nu modifica valoarea atributului x.)

12.7 FiE aplicatia :…D d ; cout<<d.x ;} ;Programul afiseaza :

A :c)2 (In cazul derivarii virtuale, clasa D va mosteni de la clasa de baza B atributul x intr-un singur exemplar, via clasa Bl (prima din lista de derivare). Totusi, la instantierea sa sunt apelati ambii constructori ai claselor Bl si B2 in ordinea din lista de derivare, astfel ca x ia succesiv valorile 1, respectiv 2 (ultima valoare).)

12.8 Fie clasa :…virtual coid f()=0 ;} ; Alegeti afirmatia corecta :

A :d) f este o functie virtuala pura c este o clasa abstracta (Initializarea cu 0 a prototipului functiei f, anunja faprul ca aceasta este o functie virtuala pura, fortand clasele derivate sa o redefineasca. O clasa ce confine o astfel de functie virtuala pura se numeste clasa abstracts, neputand avea obiecte concrete din moment ce definirea clasei nu este completa.)

Page 38: Test Grila c++

13.Declaratia : template< classT> class C{…};

A:b) anunta compilatorul ca in clasa c se va utilize tipul generic t (declaratia template <class T> class C{…}; anunta compilatorul ca in clasa C se va utilize tipul generic T)

13.2 fie functi template:…poate fi ea particularizata pe clasa student definite mai jos,pentru a compara doi studenti prin prisma notelor?

A:a) da(DA functia template max poate fi particularizata pe clasa student pentru a compara 2 studenti prin prisma noteleor, se va folosi supraincarcarea operatorului cast catre double care extrage dintrun obiect student nota sa)

13.3 fie functia template:…poate fi ea utilizata pentru a compara alphanumeric doua siruri de caractere: char *s1=”abc”, *s2=”def”;

A:c)nu, se vor compara adrese (de memorare ale celor 2 siruri adrese continute in pointerii s1 si s2 pentru a compara alphanumeric cele 2 siruri se poate opta pentru supraincarcarea functiei max

Char* max (char*a, char*b) {

Return strcmp (a,b)>0?a:b)