Upload
kerli-meow
View
266
Download
10
Embed Size (px)
DESCRIPTION
test grila c++ @rau
Citation preview
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%=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
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
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
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
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.
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.)
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 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) {
………..
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() {
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++
}
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
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)
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;
}
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
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 {
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];)
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.)
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
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
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 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.:
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 (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.
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
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).
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.)
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)