Sunteți pe pagina 1din 38

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)

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);

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

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);

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;

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

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

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%=5 atunci 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, variabila i 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 creterea 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

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 cini,i>10 din instructiunea while este o expresie virgulS care alatura doua expresii: cini 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

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. Dei inclusa intro instructiune while, atribuirea compusa c%=10 se executa o singura data (pentru numere formate

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 sau 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 crete 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

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; . 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. k=0

Astfel, din cele 6 variabile: se incrementeaza a,c,d,f i raman nemodificate b,e. Deci secventa afiata 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 intradevar 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.)

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;

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];)

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

A:c) afiseaza cadabra (Diferenta dintre apelurile puts(s) i printfl^"%s",s) este aceea ca func|ia puts dupa afiare 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) {

.. 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, aa 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() {

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 afieaza.) 6.7 Q: #include <iostream.h> Int a=5; Int f (int b) { A-=b; return b++

} 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. Aadar, 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 folosete 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

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)+2 Continuand, vom avea: f(2)=f(l)+2, f(l)=f(0)+2 fi f(0)=l. Deci: f(l)=f(0)+2=1+2=3 f(2)=f(l)+2=3+2=5 f(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)

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 apeluri Deci 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; } 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 fici ai functiei si se aflS intotdeauna la sfaritul 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

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, aa cum demonstreaza exemplul de mai jos: struct Carte {

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 primete 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];)

8.1 Q: #define INC(x) x++ Cout<<INC(3) A:c) va genera eroare left-value incorrect (Apelul coutlNC(3) este incorect pentru c& in urma expandarii textul sursS va fi: cout3++;. 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: cout3++;; 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 coutSQR (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; coutil<<' '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. Aadar, dl=5.5 i d2=3.)

8.5 Q: #define MACRODEF(x) (A<=(x)&&(x)<=Z?(x)-A+a:(x)) A:c)converteste o litera mare in litara mica (Macrodefinijia convertete 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 atributprivateal 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 atributprivateal 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

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 studentcare 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

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

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

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 indeoenedentaprima 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 coutc++; 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.:

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:

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 (c2). 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) { outc.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.

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, dei operatorul = a fost supraincarcat corect, datorita prioritatii celor doi operatori (i ==) prima expresie evaluata va fi couta, 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-Dei 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. Dei 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

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 coutc 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).

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 CMai 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 (dei 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.)

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.)

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)