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 io!tream."#
Void main() {
$out
%&rogram
$''()
);
}
A:*)e!te eronat !intactic + literalul este incorrect redactat (un literal poate fi redactat pe mai multe
randuri marcand continuarea sirului pe randul urmator cu caracterul backslash apelul:
$ount
%&rogram,
$''()
);
-!te correct !i afi!ea.a: &rogram $''( Pe un !ingur rand
1./ Q:Programul
#include io!tream."#
Void main(); {
$ount)&rogram,n$''();
-!te:
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 " randuri
1.0 Q:Fie declaratia
1nt For21.;
A:a) corecta (for poate fi identificator el difera de cuvantul cheie for. #ariabila intreaga va fi
initializata cu $ in urma pierderii zecimalelor constantei double $.(%$.&)
1.3 Q:Fie a&licatia
Void main () {
$on!t int 4; 421;
}
A:c)incorecta, initializarea unei constant se face la declarative(constanta trebuie initializata la
declarative: const int '%$( si nu printr-o instructiune ulterioara
1.5 Q:6eclaratia:
6ou*le e/2e/
A:a)corecta (la fel si initializarea variabilei e) cu ea insasi desi aceasta initializare nu are nici un
effect.)
1.7 Q:A&licatia
#include io!tream."#
Void main () {
1nt i;
For(i28; i/; i'') {
99
A:*) 1 2 / 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.: Q:A&licatia
#include io!tream."#
1nt 423;
Void main () {
1nt 42/
$ount4; <::4;
A:d) e!te correct !i afi!ea.a / 3. ( fiind permisa declararea a " bariabile cu acelasi nume una globala
si cealalta locala in acest caz implicit este referita cea locala iar variabila globala se va referi
e'plicit la folosind operatorul ::. Astfel se va afisa mai intai valoarea variabilei locale '()) urmata
de valoarea celei globale (*) )
1.= Q:in urma e4ecutarii !ec>entei
1nt 42+03, &;
P2&rintf(%?d), 4);
A:c)/ (functia printf returneaza numarul caracterelor afisate valoarea variabilei ' necesitand
pentru afisare ) caractere variabila p va avea valoarea ))
1.18 Q:!ec>enta
1nt 4;
Printf(%?4), @4);
A:d) e!te corecta !i afi!ea.a adre!a >aria*ilei 4 (operatorul + e'trage adresa unei variabile iar
descriptorul de format ,' este utilizat pentru afisarea in baza $- asadar se va afisa in
he'azecimal adresa variabilei ')
1.11 Q:!ec>enta
1nt 4258;
Printf(%?o ?4), 4, 4);
A:*) 70 /c (descriptorii de format ,o si ,' se folosesc pentru afisarea unei valori in octal si
respective in he'azecimal. Prin transformarea valorii -& in cele doula baze de numeratie se vor
obtine valorile ./ si )c)
1.12 Q:!ec>enta
1nt42841e/;
Printf(%?d), 4)
A:d)58 /c (prefi'ul &' asociat valorii &'$e) marcheaza faptul ca aceasta este o constanta intreaga
he'azecimala prin transformare in baza $& se obtine pentu ' valoarea /0) care se va si afisa)
1.1/ Q: !ec>enta
For(int i21; i23; i'') {
Atatic int 421;
Auto int B21;
1f (i223) cout4B;
C''; B'';
}
A:a) 3 1 (secventa afiseaza valorile * si $. 1iferenta intre cele doua variabile este aceeea ca ' este
static iar 2 este automatic astfel variabila ' se initializeaza o singura data la alocare si isi
pastreaza valoarea de la o iteratie la alta a3ungand in final la valoarea * variabila 2 se
reinitializeaza la fiecare iteratie ramannand la momentul afisarii cu valoarea $
1.10 Q:&rogramul
#include io!tream."#
-4tern int 4;
Void main() {
$out4;
}
1nt 427;
A:d)e!te correct !i afi!ea.a >aloarea 7 (anuntarea variabilei ' ca apartinand clasei de memorie
e'tern permite utilizarea ei inainte de declarare.desi declaratia lui ' sa facut ulterior acesta va
intra in calculi cu valoarea primita la initializare)
1.13 Q:care >a fi >aloarea >aria*ilei & in urma e4ecutarii !ec>entei
1nt &, 4, B;
P2!canf (%?d?d ,@4, @B);
6aca !e introduce de la ta!tatura datele 23 a*c /7
A:*) 1 (functia scanf returneaza numarul valorilor citite si associate variabilelor sau -$ daca sa
tastat 45 pentru datele introduce doar prima valoare "* poate fi asignata variabilei ' te'tul abc nu
corespunde tipului variabile2 2 deci nu 6 se poate asocial acesteia astfel numarul variabilelor citite
correct va fi $)
2.1 Q:!i.eof(/. +/)
A:c):(operatorul sizeof evalueza marimea in octeti a argumentului primt in e'presia aritmetica ).-)
se scade dintun double ). 7n int ) rezultatul & fiind de tipul cel mai puternic double reprezintat pe
0 octecte)
2.2 Q:!i.eof(3+/.)
A:d):(e'presia aritmetica *-) ocupa in memorie 0 octeti constantei * ii este asociat tipul int
constantei ) tipul double la scadere tipul mai slab este int este convetit implicit catre tipul mai
puternic double rezultatul fiind un double)
2./ Q:in!tructiunea
$out!i.eof(/. +3f);
A:a)e!te eronata, !ufi4ul f nu &oate fi a&licat unei con!tant intregi(sufi'ul f nu poate fi aplicat unei
constant intreci ci numai constantelor reale)
2.0 Q:a&licatia
#include io!tream."#
Void main() {
1nt a23, *2/;
$out(dou*le) aD*;
}
A:d) ra&ortul im&artirii lui a la *(aplicatia va afisa raportul impartirii efectuat in urma conversiei
e'plicite de tip cu opecatorul cast)
2.3 Q:!ec>enta
6ou*le a; cin##a;
$outa+(int)a;
A:*) &artea .ecimala a unui numar real(secventa afiseazaza partea zecimala a numarului real a fara
sa foloseasca functii de biblioteca scazand din el partea lui intreaga e'trasa cu operatorul cast)
2.5 Q: !ec>enta
1nt a;
6ou*le r2!Ert((dou*le)a);
1nt 42r22(int)r;
A:*) >aria*ila a nu e!te &atrat &erfect(variabila ' va fi nula daca a nu este patrat perfect: variabila r
retine radacina patrata a numarului intrecg a e'presia r%%(int)r verifica daca r adica radacina
patrata a lui a este numar intreg daca da variabila ' va fi $ , altfel va fi &)
2.7 Q:in!tructiunea
$out!i.eof(/3. F/:3.);
A:d):, core!&un.ator ti&ului dou*le cel mai &uternic intre con!tantele / !i 3(tipul unei e'presii
conditionale 8$98":8) este tipul cel mai puternic intre tipurile lui e" si e) deci double pentru care
se rzerva 0 octeti)
2.: Q: !ec>enta
1nt a2/, *23;
1nt t2a*Fa'';*'';
$outa*t;
A:a) 0 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 ) a lui a apoi a este incrementat
devenind / variabila b ramane nemodificata)
2.= Q:daca t e!te o >aria*ila dou*le atunci e4&re!ia
G2/,3;
A:*)initiali.ea.a &e t cu /(intradevar este vorba despre o e'presie virgule insa datorita prioritatilor
atribuirii acesta asociaza e'presiile: de atribuire t%) si e'presia constanta *)
2.18 Q:fie !ec>enta
$out( 47+2H4F)6A) : %IJ)) ;
A:c)2(pentru a se afisa te'tul 1A trebuie sa se verifice relatia ':.-";' ceea ce inseamna );':. si
deci ':.<) deci cea mai mare valoare intregaga pe care o poate lua ' va fi ")
2.11 Q: in urma e4ecutarii !ec>entei
K24'1
L2B+1
C2.'1
A:a)4 !i B !unt egale (in urma primelor doua atribuiri vom avea 2%'$ si z%2-$ deci z%'$-$, asadar
2%'$ si z%' cea dea treia atribuire va face '%z$ adica '%'$ deci final ' si 2 vor avea aceeasi
valoare diferita de valoarea lui z)
2.12 Qin urma e4ecutarii !ec>entei
C24'B; B24+B; 424+B;
$out4B;
A:d) 4 !i B !e inter!c"im*a(secventa interschimba cele doua variabile ' si 2 astfel in urma primei
atribuiri ' va fie gal cu suma celor " valori ' 2 daca din suma se scade valoarea initiala a lui 2 se
va obtine valoarea initiala a lui ' care 6 se va atribui lui 2 mai departe aceeasi suma se scade 2
obtinand valoarea initiala a lui 2 aceasta atribuinduse lui '.
2.1/ Q: in urma e4ecutarii !ec>entei:
Jn!igned c"ar 4;
1n##4;
For(int i28; i:; i'') 4##21;
$out(int)4;;
A:!e afi!ea.a >aloarea 8 (variabila ' de tip unsigned char se reprezinta pe un octet deci 0 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 & astfel ca in ma'im 0
iteratii toti bitii lui ' vor fi & deci ' va avea valoarea & care se va afisa ca intreg)
2.10 Q: !ec>enta
1nt 4; cin##4;
For (int i28; i/2;421, i''); cout4;
A:*) e!te corecta !i afi!ea.a >aloarea 8 (variabila intreaga ' se reprezinta pe / octeti deci )" biti la
fiacre iteratie deplasarea spre stanga cu un bit va duce completarea bitului lipsa cu & astfel ca
dupa cel mult )" iteratii toti bitii lui ' vor fi & deci ' va avea valoarea & Afisarea valorii lui ' se face
la iesirea din for deci se afiseaza valoarea & o singura data)
2.13 Q: in !ec>enta
1nt 4; cin##4;
1nt B24@1;
A:d) im&ar(ultimul bit al numarului determina partatea acestuia aftfel pentru valori pare ultimul bit
este & iar pentru valori impare ultimul bit este $)
2.15 Q: daca 4 !i n !unt 2 intregi e4&re!ia 4##n &oate fi ec"i>alenta cu
A:a) im&artirea lui 4 la 2 la n (deplasarea spre dreapta '==n este echivalenta cu o impartire intreaga
alui ' la " la n atat pentru numere negative cat si pozitive)
2.17 Q:&entru 423 care e!te >aloarea e4&re!iei /4##2 F
A:a)20 (prima operatie efectuata va fi deplasarea spre stanga : )::'%)::*%);" la * % >-, evaluarea
celei dea doua e'presii deplasarea spre dreapta va duce la >-=="%>-<" la "% "/)
2.1: Q: declaratiile
$"ar c2 <a; , 4;
A:*) 42cM/2 (literele mari difera de cele mici prin al saselea bit la litere mari acesta este & iar la cele
mici este $)
/.1 Q:!ec>enta
For(int i21; i23; i'') {
1f (i22/) C;
$out1;
}
A:*) continue (6nstructiunea continue permite abandonarea iteratiei curente,?
corespunzatoare situatiei in care i este ), in instructiunea repetitive for. Astfel valoarea ) nu va
mai fi afisata. @olosind break, valorile afisate,ar fi fost $ Ai ", e'presiile i%/ (testare egalitate) si i$
nu au nici un efect. 8fectul cerut se mai putea obtine Ai cu: i%/ sau i sau i%l.)
/.2 Q: in!tructiunea
For(int i228l i#213; i?3)
$out1;
A:28 la infinit(6nitial i este "&, condifia i=%$* se verifica, atunci i (%"&) este afisat( se evalueaza
e'presia i,* ce are valoarea &, insa nu il modifica pe i, asadar i ramane "&, valoare cu care se reia
ciclul de mai sus. Aplicatia afiseaza "& la infinit. 1aca am rescrie ultima e'presie din instructiunea
for astfel: i,%*
atunci aplicatia ar afisa "& o singura data)
/./ Q: in!tructiunea
For(!uma28, i218; i;i+22)
Auma'21;
A:a)!uma numerelor intregi &are de la 2 la 18(#ariabila suma va confine suma numerelor intregi pare
de la " la $&( contorul i va lua succesiv valorile $&, 0, -,/,", &, valori care sunt pe rand adunate la
suma. Cand i atinge valoarea & (corespunzator valorii de adevar fals) instructiunea for se incheie)
/.0 Q:!ec>enta
For(!uma28, i28; i218; i'22)
Auma'21;
$out!uma1;
A:c) /8 !i 12(6nstructiunea for determina adunarea numerelor pare de la " la $&, astfel 3 variabila
suma va avea valoarea )&. Ba ultima iteratie a instructiunii for, variabila
i este $&, apoi ea este marita cu ", devenind $"( aceasta este valoarea cu care ramane la
incheierea instructiunii for.)
/.3 Q:!ec>enta
For(!uma28, i28; i218; i'22);
Auma'21;
$out!uma1;
A:d) afi!ea.a 12 !i 12(Pentru ca este urmata de punct Ai virgula ((), instructiunea for determini3
e'ecutia instructiunii nule, astfel ca nu are ca efect decat initializarea variabilei suma cu & Ai
creAterea lui i pana la valoarea $", cu care se incheie instructiunea for. 7rmeaza instructiunea
suma%i( in urma careia suma va fi Ai ea tot $". Astfel, cele doua valori afisate sunt $" si $".)
/.5 Q: !ec>enta
1nt i22
N"ile (i++)
$out1;
A:c ) 1 8(6n cazul unei postdecrementari, se foloseste variabila cu valoarea initiala, apoi este
decrementata. 6n cazul nostru, in conditia instructiunii Chile se evalueaza i cu valoarea initiala,
apoi este decrementat. Astfel, la intrarea in instructiunea Chile i are valoarea ", conditia i (i fund ")
este adevarata, apoi i este decrementat devenind $( este e'ecutata instructiunea: este afisata
valoarea $, se reia Chile cu i%l (valoare logica de adevar), apoi i este decrementat Ai devine &, este
afisata valoarea &( se reia Chile cu i%&, aceasta fund o valoare logica falsa instructiunea Chile se
incheie (dupa ce il decrementeaza inca odata pe i, insa nu il mai afiseaza).)
/.7 Q: 6aca 1 e!te un intreg atunci in!tructiunea
N"ile (cin##i, i#18);
A:d) re&eat citirea lui 1 &ana !e introduce o >aloare mai mica !au egala cu 18(8'presia cinDi,i=$& din
instructiunea Chile este o e'presie virgulE care alatura doua e'presii: cinDi Ai i=$&. Prima citeste
pe i iar cea de-a doua verifica daca i este strict mai mare decat $&. Cele doua e'presii sunt
evaluate in ordine: mai intai cea din stanga, apoi cea din dreapta, dar valoarea e'presiei virgula
este data de valoarea celei de-a doua e'presii: i=$&. Astfel este citit de la terminal i, apoi este
comparat cu $&, daca se verifica i=$&, atunci se repeta citirea.)
/.: Q: !ec>enta
1nt i2+2;
1f (i) {
1f (i?2) cout)i im&ar); }
-l!e cout)1 negati>e);
A:a) nu afi!ea.a nimic(in limba3ul C<C orice valoare nenula este valoare logica de adevar, & este
valoare logica de fals. 6nstructiunea i<e'terioara verifica daca i este nenul, ceea ce este adevarat
cata vreme i este -", astfel se e'ecuta ramura true: instructiunea f<interioara. Aceasta verifica daca
i," este nenul( i fund -", i," va fi &, deci are valoare logica de fals, atunci s-ar e'ecuta ramura
else, numai ca aceasta nu e'ista: prin includerea instructiunii if interioare intr-un bloc ramura else
care urmeaza este asociata instructiunii if e'terioare Ai nu celei interioare.)
/.= Q: !ec>enta
1nt i22
AOitc" (i?2) {
99..
A:d) afi!ea.a &ar im&ar(6nstructiunea sCitch se e'ecute astfel: se evalueaza e'presia i,", rezulta
de aici valoarea &( se compara valoarea ei, pe rand cu alternative4 &, ", /, $, ), * si daca se
gaseste o alternativa care sa coincide cu ea, atunci se e'ecuta pe rand toate instructiunile din
dreptul ei in 3os, pana la terminare sau pfina cand se intalnefte o instructiune break. 6n cazul
nostru se intra pe alternativa case & fi, nefiind nici un break se e'ecuta toate instructiunile de
afisare( rezultat: Fpar imparG)
/.18 Q:!ec>enta
1nt i22
AOitc" (i) {
$a!e 999999
A:a) e!te eronata(6nstructiunea este eronata pentru ca defineste alternativa $ de doua ori: e'presia
logica &HH"HH/ are valoarea $, la fel ca fi e'presia $HH)HH*.)
/.11 Q: !ec>enta
1f (8 2n218)
$out)n intrare 8 !i 18);
-l!e 9..
A:*) afi!ea.a %nintre 8 !i 18I(( Afifeaza Gn intre & si $&G( e'presia &:%n:%$& se evalueaza astfel:
(&:%n):%$&. Cum n este $*, rezulta:
&:%n:%i& :%= (&:%n):%$& :%=(&:%$*):%$& :%= $:%$& :%= $ (adevar) Prin urmare conditia are
valoare logica de adevar.
1aca am rescrie-o: &:%n ++ n:%$& atunci ar determina afi9area: Gn mai mic decat & sau mai mare
decat $&G.)
/.12 Q: con!iderand ca 4 e!te un numar real &o.iti>
P28;
N"ile (''m24); m++;
$outm;
A:d)e!te corecta !i calculea.a &artea intreaga a lui 4(@iind urmata de punct Ai virgula ((),
instructiunea Chile va e'ecuta instructiunea vida, singurul efect fiind incrementarea variabilei m
la fiecare iteratie, pana cand acesta va deveni mai mare ca '. Ba iesirea din Chile m va avea cea
mai mica valoare intreaga mai mare ca '. 1ecrementarea ulterioara a lui m va duce la obtinerea
celei mai mari valori intregi mai mici sau egale cu ', deci a partii intregi a lui ')
/.1/ Q: con!iderand ca 4 e!te un nr intreg !ec>enta
$248F+4:4;
N"ile (c#218) c?218
A:c)afi!ea.a ultima cifra a lui 4(Eecventa afifeaza ultima cifra a numarului dat prin calcularea
restului impartirii la $&. 6n urma primei atribuiri c va lua valoarea modulului lui '. 1eAi inclusa intr-
o instructiune Chile, atribuirea compusa c,%$& se e'ecuta 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 ' la $& (daca ' are mai multe cifie), fie chiar valoarea
lui ' (daca acesta are o singura cifra), deci ultima cifra a numarului dat.)
/.10 Q: e4ecutarea !ec>entei
1nt a23, *22, c2/
1f (a*) if (ac) *218
-l!e c2 18
A:d) nici una dintre >aria*ile(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 e'ecuta nimic, deci nici una dintre
variabile nu if i va modifica valoarea.)
/.13 Q:daca in urma e4ecutari !ec>entei
For(a21; a18; a'22) *+2/;
A:*)25(6efirea din instructiunea for se va face pentru a=%$&. Cum initial a are valoarea $ fi la fiecare
iteratie aceasta crefte cu ", inseamna ca variabila a iese din for cu valoarea $$, moment in care s-
au e'ecutat * iteratii. Pentru ca variabila b sa aiba Ai ea valoarea $$, in urma celor * atribuiri
compuse e'ecutate in for, ea ar fi trebuit s+ piece initial cu valoarea $$*;) deci "-.)
/.15 Q:daca 4 !i B !unt doua numere &o!iti>e neule
6o {
C''; B++;
} O"ile (B);
$out4;
A:d) afi!ea.a !uma >alorilor 4 !i B (6nstructiunea repetitiva do...Chile se va e'ecuta auita timp cat 2
este nenul, deci va avea un numar de iteratii egal cu valoarea lui 2. Cum la fiecare iteratie ' creAte
cu $, in final variabila ' va avea valoarea '$l....l (de 2 ori), adica '2, deci se va afisa suma
celor doua valori.)
/.17 Q: in!tructiunea
For (i28, !28;;i'') {
1f (((i?2)) continue;
99
A:d) calculea.a !uma numerelor im&are mai mici ca 188(6nstructiunea continue duce la ignorarea
iteratiei curente daca i este par, adunand asadar numai valorile impare. 6nstructiunea break
forteaza iesirea din for in momentul in care se a3unge la o valoare mai mare ca $&&. Ee va obtine
astfel suma numerelor impare mai mici decEt $&&.)
/.1: Q: !ec>enta
1nt &21
N"ile (*)
1f(*?2) &Ha, *++;
-l!e *D22, aH22
99
A:c) a la &uterea *(EecvenJa de mai sus calculeaza a
b
, folosind un algoritm mai eficient decat eel
clasic. Astfel, daca e'ponentul este par se va aplica formula a K%(a )G , iar daca este impar se
vautiliza relatia a
"n$
%aa
"n
. Ee urmareste asadar reducerea numarului de inmultiri efectuate Ai deci
optimizarea algoritmului de calcul.)
/.1= Q: in urma e4ecutarii !ec>entei
C2B2.23; !25; Q28
999.
A:a)25(Eecventa se va e'ecuta astfel:
- se fac initializarile: '%2%z%*( s%-( k%&(
- se testeaza conditia '=%s, cum nu este adevarata nu se va evalua e'presia virgula din
instructiunea if (anume 2, z%"()
- se trece deci la urmatoarea instructiune dupE if Ai anume '%z( deci ' va fi $&
- fiecare iteratie a instructiunii Chile evalueaza numai e'presia k(
- ies3rea din Chile se va face in momentul in care k=%' deci cslnd k va fi $&
- se e'ecuta apoi atribuirea compusa s%k'( adica s%"&, deci valoarea variabilei s va fi "-.)
/.28 Q:!ec>enta
1nt a28, *21, c21, d21, e21, f21;
99.
A:c)1 1 2 2 1 2 (Lperatorii ++ Ai HH se evalueaza de la stanga la dreapta Ai se aplica optimizat, in
sensul ca daca la un moment dat se cunoaste valoarea de adevar a intregii e'presii, atunci restul
nu se mai evalueaza.
- prima e'presie va fi a ++ b Ai vom avea: se evalueaza a( variabila a fiind &, va fi
echivalenta cu fals, dupa care a se incrementeaza( in acest moment putem Ati valoarea logica a
e'presiei (Ai anume &), motiv pentru care b nu se mai evalueaza - e'presia finala este acum
echivalenta cu &$M C ++ d$H e.
- a doua e'presie va fi & HH C, iar valoarea ei depinde de variabila c( cum aceasta este $, e'presia
va avea valoarea adevarat (deci $), iar c se incrementeaza -e'presia finala este acum echivalenta
cu $ ++ d$H e.
- a treia e'presie $ ++ d, depinde de valoarea lui d care este $( astfel, e'presia va avea valoarea
adevarat (deci $), iar d se incrementeaza - e'presia finala este acum echivalenta cu $$H e.
- fn acest moment se poate cunoaste valoarea logica a intregii e'presii (Ai anume $), motiv pentru
care e nu se mai evalueaza( e'presia fiind adevarata se va e'ecuta incrementarea din if a
variabilei f.
Astfel, din cele - variabile: se incrementeaza a,c,d,f Ai raman nemodificate b,e. 1eci secventa
afiAata va fi: $ $ " " $ ".)
0.1 Q: c"arH !RS2{%a*), %cd), %ef)}
A:d)/ 4 0 2 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 / octeti,
rezulta: ) elemente (pointeri) ' / octeti (un pointer), deci $" octeti.)
0.2 Q: declaratiile
Float a22
1nt H&2@a
A:d) eronate, & tre*uie !a &ointe.e un int (6nitializarea pointerului p cu adresa variabilei a de tip float
este incorecta, pointerul trebuind incarcat cu o adresa de int.)
0./ Q: int H con!t &;
A:a)eronata, & fiind un &ointer con!tant care nu a fo!t initiali.at (1eclarata 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. 1eclarafii de forma int ;const p%neC
int( sau int ; const p%+a( (unde a ar fi o variabila de tip int), definesc corect un pointer constant
initializat.)
0.0 Q:6aca & !i E !unt 2 &ointeri de int (int H&, HE;) iar & contine 9..
A:c)8412FF:0 (8ste 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 e'presia N-p", N va confine o adresa de memorie mai
mare decat p cu ";sizeof(int), adica 0 octeti. Asadar N va contine adresa &'l"@@.C0, deci
&'l"@@0/.)
0.3 Q: int H&2neO int (/);
A:c) alocarea unei .one de memorie ce contine un element de ti&ul int initiali.at cu >aloarea /
(1eclaratia realizeaza alocarea unei zone de memorie ce confine un element de tipul int initializat
cu valoarea ) (adica ;p are valoarea )). 1aca aveam int ;p%neC int M)?( ar fi insemnat alocarea unei
zone de memorie ce contine ) elemente de tipul int.)
0.5 Q: int i22, H&2@1;
$out& R8S
A:*) corecta !i afi!ea.a >aloarea 2 (Eecvenfa este corecta, e'presia pM&? fiind echivalenta cu ;p,
afisand astfel valoarea continuta la adresa data de pointerul p, adica valoarea variabilei i, deci ".)
0.7 Q: int 423, H&2@4
C27; coutH&;
A:*)7 (Cum pointerul p contine adresa variabilei ', atribuirea lui ' ('%.) va afecta valoarea
continuta la adresa de memorie respectiva, deci continutul pointerului p. Astfel se va afisa
valoarea ..)
0.: Q:int 423, H&, HE;
P2@4; H&22; E2@4
99
A:a) 2 2 2(Pointerii p si N contin adresa variabilei '. Astfel, prin atribuirea ;p%" va fi afectata
valoarea stocata la aceasta adresa, deci atat variabila ', cat Ai continutul pointerului N. Ee va afisa
deci " " ".)
0.= Q: int n218, H&i, H&f, H&2neO intRnS;
9..
A:d)corecta (Eecventa este corecta si va parcurge toate cele n elemente alocate prin pointerul p,
atribuindu-le valorile de la & la n-$.)
0.18 Q: dou*le H&, HE;
9.
A:c) de ti& int(1intre 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.)
0.11 Q: dou*le B;
$on!t dou*le H&, 42/.;
A:a) H&24 (Pointerul p adreseaza o zona de memorie constants Ai deci continutul sau nu poate fi
modificat. Celelalte trei atribuiri sunt corecte.)
0.12 Q: int aRSR/S2R1, 2,/, 0 S;
$out!i.eof(a);
A:c)20 (#ariabila a este un masiv bidimensional care va avea ) coloane. Cele / valori date la
initializare vor fi astfel dispuse pe " linii ($,",) in prima linie si /,&,& pe a doua linie). #om avea
deci " linii ' ) coloane % - elemente de tip int, deci in total - ' / % "/ octeti.)
0.1/ Q: int aRS2{1,2,/};
1nt H&2{1,2,/}
A:*)declararea >aria*ilei a e!te corecta (Prima declarafie int aM? % Jl, ", )O( defmeste un vector cu )
elemente, realizand si ini3ializarea componentelor sale. Cea de-a doua declaratie int ;p% J$, ", )O(
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.)
0.10 Q: int aRSRS2{{1,2,/},{0,3,5}}
A:d)eronata (1eclaratia este eronata, in cazul masivelor multidimensionale cu initializare trebuind
specificat e'plicit numarul de elemente pe fiecare dimensiune (mai pu4in prima). 1eclaratii ca: int
a M"? M)? % J J$,", )O, J/, *, -OO( sau int aM? M)? % J J$,",)O, J/,*,-OO( ar fi fost corecte.)
0.13 Q: int aR3S, H&;
1 11 111 1V
A:*) 1, 111 (Pumele masivului a este de fapt un pointer constant, asadar el nu poate fi $-value. 6n
schimb, pointerul p este variabil, el putand fi astfel atribuit sau incrementat. #ariantele corecte
sunt deci 6 si 666.)
0.15 Q:int HH&;
P2neO intHR3S
99
A:a) alocarea unei matrici de intregi cu 3 linii !i / coloane (Ee vor aloca mai intai * pointeri
corespunzatori celor * linii ale unui masiv bidimensional, urmand ca pentru fiecare linie sa se
aloce cate ) elemente. 8ste vorba deci de alocarea unei matrici cu * linii si ) coloane.)
0.17 Q: care din urmatoarele e4&re!ii nu e!te corecta &entru referirea >alorii unui element ARiSRTS al unui
ma!i> *idimen!ional (int AR18SR18S;)
A:*) H(A'i)RT?( 1atorita prioritatii operatorilor din e'presia ;(Ai)M3?, aceasta se va evalua astfel: se
calculeaza Ai, reprezentand adresa pointerului liniei i( se evalueaza (Ai)M3?, care este echivalent
cu ;(Ai3), reprezentand pointerul liniei i3 a matricii( se calculeaza ;(Ai)M3?, echivalent cu
;;(Ai3) sau (;(Ai3))M&?, adica valoarea elementului AMi3?M&?.)
0.1: Q: int (H&) R3S;
A:c) un &ointer la un >ector de 3 int (#ariabila p declarata astfel va fi un pointer la un vector de * int,
putand fi incarcat cu adresa numelui unui vector de * intregi (int vM*?( p%+v(). 1aca doream
declararea unui vector de * int am fi avut: int pM*?(, iar pentru un vector de * pointeri la tipul int: int
;pM*?(.)
0.1= Q: dou*le H&R3S;
A:d)28 octeti (#ariabila p este un vector de * pointeri, iar un pointer se reprezinta pe / octeti, deci p
ocupa * ' / % "& octe3i.)
0.28 Q: dou*le (H&) R3S
A:a)0 octeti (#ariabila p este un pointer la un vector de * double, iar un pointer (indiferent de tipul
pointat) se reprezinta pe / octeti)
0.21 Q: dou*le (H&)R2SR/S, AR2SR/S;
P2@A
A:c)(H&)RiSRTS (Qrebuie considerate prioritatea operatorilor M? si ;. Astfel referirea corecta a valorii
elementului AMi?M3? este (;p)Mi?M3?.)
3.1 Q: c"ar !R18S2)a*cd);
A:d)!i.eof(!)2!trlen(!)'5 (Pentru sirul s vom avea sizeof(s)%$&, iar strlen(s)%/, deci relafia dintre
cele doua valori va fi: sizeofRs)%strlen(s)-.)
3.2 Q: cout)a*racada*ra)'0;
A:c)&rintf(%?!,n), !) (Airul de caractere constant GabracadabraG este o adresa, putand participa in
calcule specifice pointerilor constanti. Astfel o operatie de forma GabracadabraG/ este corecta,
fund echivalenta cu adunarea unui pointer cu un intreg, rezultand o adresa mai mare cu / octe3i
decat adresa initials. Lb4inem asadar sirul GcadabraG.)
3./ Q:daca ! e!te un !ir de caractere atunci a&elul &ut! e!te ec"i>alent cu
A:c) afi!ea.a %cada*ra) (1iferenta dintre apelurile puts(s) Ai printfl4G,sG,s) este aceea ca funcHia
puts dupa afiAare insereaza neC-line. Apelul va fi deci echivalent cu printf(G,sSnG,s).)
3.0 Q: c"ar !RS 2 {<m;, <e;, <!;, <a;, <T;}
A:a) im&re>i.i*il >aria*ila ! ne&utand fi mani&ulate ca un !ir de caractere (6nifializat astfel, sirul s nu
confine terminatorul TS&T, 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.)
3.3 Q: c"ar !RS2)un !ir de caractere);
AR5S28
Put!(!)
A:*)corecta !i afi!ea.a un !ir (Eecvenfa este corecta, atribuirea sM-?%& fiind permisa si realizand
pozifionarea terminatorului de sir TS&T pe pozifia -. Ee va afisa astfel Gun sirG.)
3.5 Q: c"ar !RS2)un !ir de caractere), H&2!
N"ile (H&) &''
A:c) !trlen(!) (1iferenJa 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 Chile, datorita incrementarii va
a3unge pe terminatorul GS&T. Astfel ca, diferenHa p-s va fi egala cu lungimea sirului, adica strlen(s).)
3.7 Q: c"ar H42)unu), HB2)doi)
A:*) o >aloare &o.iti>a unu fiind mai mare ca doi (@unc3ia strcmp compara alfabetic doua siruri de
caractere. 1in punct de vedere alfabetic sirul GunuG este mai mare decat sirul GdoiG, func3ia
returndnd o valoare pozitiva.)
3.: Q:c"ar !RS2)AU$def)
A:d) nici una (Pici una din cele trei functii nu realizeaza conversia literelor mici in ma3uscule si a
literelor mari in minuscule. Astfel:
- strupr - converteste literele mici in ma3uscule (se ob4ine GAUC18@T)
- strlCr - converteste literele mari in minuscule (se obtine Gabcdef)
- strrev - inverseaza (in oglinda) sirul de caractere (se obtine GfedCUAG))
3.= Q:c"ar !RS2)ana are mere.) 999..
A:a) eronata in!tructiunea O"ile ciclea.a la infinit (Pentru a e'trage cuvintele unui Air 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 P7BB (strtok(P7BB,d)).)
3.18 Q: &2!tr!tr(!1,!2);
N"ile (&(2IJVV) {
999..
A:d) !tergerea tuturor a&aritiilor !u*!irului !2 din !irul !1 (Eecventa realizeaza cautarea si stergerea
tuturor aparitiilor subsirului s" din sirul si, folosind un pointer p ce lucreaza direct asupra sirului
dat, modificE.ndu-$ astfel indirect.)
5.1 Q: int min (int VRS, int n) {
1nt m2>R8S
For(int i21; in;i'')
99
A:*)e!te corecta !i returnea.a ma4imul unui >ector (@unctia este corecta, vectorul formal # se
dimensioneaza dupa marimea parametrului efectiv (de la apel)( el poate fi transmis si ca pointer
dar nu este obligatoriu. 1es3 numele functiei indica altceva, ea returneaza ma'imul vectorului
-varialila locala m se actualizeaza la fiecare element curent din vector mai mare.)
5.2 Q: int minWma4 (int VRS, int n) {
1nt min2>(8), ma42>R8S;
For(int i21;in;i'') {
1f (min#VRiS)
Pin2VRiS;
99.
A:c) e!te corecta !i returnea.a ma4imul unui >ector (@unctia returneaza, aAa cum rezulta din antetul
ei, o singura valoare: un intreg: eel rezultat 6n urma evaluarii e'presiei virgula din instructiunea
return Ai anume ce-a de-a doua variabila - ma'.)
5./ Q: int minWma4 (int VRS, int n) R2S {
1nt min2VR8S,ma42>R8S;
For(int i21;in;i'')
1f (minVRiS)
99
Xeturn min
Xeturn ma4
A:d) e!te incorecta: o functie nu &oate return un ma!i> (@unctia f este definita incorect: se incearca
returnarea unui masiv cu doua elemente intregi.)
5.0 Q:#include io!tream."#
1nt n22;
1nt@ F() {
Xeturn n2/;
99
A:c)e!te corecta !i afi!ea.a 1/ (Apelul unei functii poate fi lvalue daca functia returneaza o referinta
catre o data care este fie statica (cum se intampla in e'emplul nostra), fie a fost transmisa prin
referinta ca parametru functiei respective. @() se identifies cu variabila returnata (prin referinta) de
functia @, adica n, care este o variabila statica. Ba apelul @() (din @()%$&() variabila statica n este
initializata cu ), apoi i se adauga $&, devenind $).)
5.3 Q: #include io!tream."#
1nt@ F (int @n) {
Xeturn n2/;
}
1nt main() {
1nt n23
99.
A:*)e!te corecta !i afi!ea.a / 0 (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 e'emplul nostra: @(n) se identified cu variabila returnata (prin
referinta) de functia @, adica n, care la randul sau este transmisa prin referinta functiei @, deci se
identified cu variabila n-* din functia main. Ba prima afisare avem o postincrementare, ceea ce
face ca valoarea afisata sa fie ), apoi, in urma incrementarii, n devine /.)
5.5 Q: #include io!tream."#
Void f (int @4, int B) {
C21; B22;
}
Void main () {
1nt .28; 999.
A:*) 1 (1in cei doi parametri ai functiei f, primul este transmis prin referinta, iar eel de-al doilea
prin valoare. Vodificarea 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. 6n
consecinta la iesirea din apelul functiei f, variabila z va avea valoarea $, care se afiAeaza.)
5.7 Q: #include io!tream."#
1nt a23;
1nt f (int *) {
A+2*; return *''
}
Void main() {
$outf(a); couta;
A:c)3 (in urma apelului f(a) vom avea: atribuirea a-%b va afecta variabila globala a care va primi
valoarea &( continand o postincrementare, instructiunea return va intoarce valoarea
neincrementata pe care parametral b a avut-o la intrarea in functie (adica *), abia dupa aceea
urmand sa se feci incrementarea lui b, fara nici un efect. Asadar, programul va afisa * (pentru f(a))
Ai & (pentru a).)
5.: Q: #include io!tream."#
1nt 423
Void f (int @B) {
K22H4'/;
C'22
$outB;
}
Void main() {
F(4);
$out; <4
}
A:a) 13 13 (Parametral 2 al functiei f fiind transmis prin referinta, in momentul apelului f(') cele
doua variabile ' Ai 2 vor utiliza aceeasi zona de memorie. Astfel, price modificare a valorii lui ' il
va afecta pe 2, Ai reciproc, orice modificare a lui 2 il va afecta pe '. AAadar, in urma celor doua
atribuiri vom avea: 2%";'), adica @l), deci '%$) Ai '%", adica '%$*, deci 2%$*. 1eci, programul
va afisa $* $*.)
5.= Q: >oid f (c"ar a) {
Jn!igned c"ar m212:;
N"ile (m)
{
$out(m@aF1:8);
m##21;
}}
A:*)afi!area &e *iti a unui numar intreg mic (@unctia realizeaza afisarea unui numar pe biti. Ee
foloseAte o masca (m) ce pleaca cu valoarea $"0 (" ), deci va avea primul bit $ si restul bitilor &. Ba
fiecare ileratie, folosind operatoral + (Ai logic), se determina bitul de pe pozitia Wespunzatoare a
numaralui dat, dupa care bitul nenul al mastii se deplaseaza Xspre dreapta pentru a parcurge
astfel toti cei 0 biti ai valorii date.)
5.18 Q:>oid f (un!igned a, un!igned *) {
1f(a @@ *)
1f (a(2*)
9999999.
A:a) cel mai mare di>i!or comun a doua numere (@unctia foloseste algoritmul scaderilor repetate
pentru a calcula eel mai mare divizor comun a doua numere naturale. 1aca una din cele doua
valori este &, atunci functia o va afif a pe cealalta ca fiind valoarea divizorului comun.)
5.11 Q: un!igned f (un!igned a, un!igned *) {
Jn!igned &;
For (&21;a;a++) &H2*;
Xeturn &
A:*) * la &uterea a (Atribuirea compusa p;%b se va e'ecuta de un numar de ori egal cu valoarea lui
a, deci functia calculeaza produsul p%b;b;.. ..;b (de a ori), obtinand astfel valoarea b
a
.)
5.12 Q:int f(int 4) {
1f (428) return 1;
Xeturn f(4+1) '2
A:d)7 (@unctia f fiind recursiva, valoarea intoarsa in urma apelului f()) se va calcula astfel:
f())%f(")"
Continuand, vom avea: f(")%f(l)", f(l)%f(&)" fi f(&)%l. 1eci: f(l)%f(&)"%$"%)
f(")%f(l)"%)"%*
f())%f(")"%*"%. Asadar, valoarea intoarsa de functia f pentru apelul f()) va fi ..)
5.1/ Q:int f (int 4) {
1f ((4) return 8;
-l!e return f(4+1)'4H4
A:a)/8 (@unctia recursiva f va calcula suma patratelor numerelor naturale consecutive mai mici
sau egale cu '. Astfel pentru apelul f(/) se obtine suma /;/);)";"$;$&%)&. 1eci valoarea
returnata de functie pentru f(/) este )&.)
5.10 Q:int F (int n) {
1f (n21) return 1
-l!e return F(n+1) ' F(n+2)
A:d) de = ori (Pentru @(/) avem: @(/)%* si > apeluri)
5.13 Q: int f (int 4) {
1f (4#8) return f(4+1)'f(4+/)
-l!e return 1
A:c) de 1: ori (Vai intai pentru f()) avem: f())%/ fi . apeluri Pentru f(/) vom avea: f(/)%- f i $$ apeluri
1eci in total vor fi .$$, adica $0 apeluri.)
5.15 Q: #include io!tream."#
#include!tdli*."#
Void main (int argc, c"ar Harg>RS) {
1nt !, 1;
For (!28, i21; iargc;i'')
A'2atoi(arg>RiS)
$out!
A:d)correct !i afi!ea.a 17 (Programul este corect, functia main putand primi argumente. Acestea
sunt gestionate printr-un vector de firuri de caractere (char ;argvM?), iar numarul lor este indicat de
primul parametru (int argc). Primul argument (argvfL?) este un Air de caractere ce contine adresa
completa a fifierului. 6n e'emplul de mai sus, parametrii dati la e'ecutie au fost convertiti in valori
intregi fi insumati. Primul argument (pentru i%&) a fost omis intentionat, nefiind numeric.
Programul afifeaza asadar suma celor / valori, anume $..)
5.17 Q: int &rod (int a, int *21, int c21, int d21) {
Xeturn (aH*HcHd);
A:a) correct !i returnea.a >aloarea 13 (Apelul este corect Ai intoarce valoarea $*. Primii doi
parametri vor avea valorile fiirnizate la apel, respectiv ) Ai *, iar ultimii doi, pentru care nu s-au
furnizat valori vor intra in calcul cu cele implicite, respectiv $. @unctia returneaza deci produsul
);*;$;$%$*.)
5.1: Q: int !uma (int a28, int *, int c28, int d28) {
Xeturn a'*'c'd
A:*)eronat &arametrii cu >alori im&licit tre*uie !a !e afle la !far!itul li!tei de &arametric (6nsasY definirea
functiei este eronata, parametrii formali ce primesc valori implicite trebuie sa se afle la sfarsitul
listei de parametri Ai nu pot fi intercalati cu parametri fara valori implicite.)
5.1= Q: int m (int a, int *) {
Xeturn a*Fa:*;
}
6ou*le m (dou*le a, dou*le *) {
Xeturn a#*Fa:*;
}
A:*) eronat a&elul conduce la am*iguitate ne!tiind ce >ariant !a !e utili.ea.e (Apelul m(",).) primeste
ca parametri o constants int Ai una double. Apelarea primei variante necesita o conversie double-
=int, iar cea de-a doua versiune o conversie int-=double. 8'istand doua supraincarcari cu
conversii similare, va fi semnalata ambiguitate.)
5.28 Q: int !uma (int a, int *) {
Xeturn a'*
}
1nt !uma (int >RS, int n)
1nt 1,!;
For (i28, !28; in; i'') !'2>RiS
Xeturn !;
A:d) correct !i a&elea.a a doua functie calculand !uma elementelor >ectorului 4 (Prima versiune a
functiei suma primeste ca parametri doi intregi. Cum variabila ' este un pointer, nu este permisa
conversia sa din int; in int Ai 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 ', calculand suma celor
* elemente ale vectorului '.)
5.21 Q:care din &rototi&urile de mai To! declara correct o functie cu numar >aria*il de &arametri
A:a) >oid g(int n,9); (Bista variabila din antetul unei astfel de functii, marcata de trebuie precedata
de lista parametrilor ficAi ai functiei si se aflE intotdeauna la sfarAitul listei de parametri. 1eci
prototipul corect va fi void g (int n, ...)(.)
5.22 Q: int !uma (int n,9) {
1nt !28, 1, 4;
VaWli!t 12;
9999
A:*)correct !i returnea.a >aloarea 2= (Apelul este corect fiind vorba de o functie cu numar variabil
de parametri. Pentru e'emplul de mai sus, primul parametru fi' al functiei va indica numarul
parametrilor variabili, deci numarul valorilor insumate. Astfel apelul suma(/,*,.,0,>) va calcula
suma *.0>%">.)
5.2/ Q:tem&late cla!! G# >oid !c"im* (G @a, G @*) {
G au4; au42a; a2*; *2au4
A:c) e!te corecta !i inter!c"im*a 2 >alori de ti&ul generic G (@unctia schimb este un Aablon, putand sa
lucreze cu tipuri de date mndamentale sau definite de utilizator. Einta'a template :class Q=
anunta ca functia este definita pentru un tip de date generic Q, putand fi apelatE pentru diferite
tipuri de date.)
5.20 Q: dou*le (HF)(int, int)
A:c) definirea unui &ointer de functie ce >a fi incarcat cu adre!a unei functii ce &rime!te 2 int !i returnea.a
un dou*le (1eclaratia double (;@) (int,int) anunta definirea unui pointer de functie, ce va fi incarcat
cu adresa unei functii ce corespunde prototipului: Mdouble f (int, int)(. L functie care primeste " int
si returneaza un double va avea prototipul double @ (int, int) (, iar una care primeste " int Ai
returneaza un pointer de double va fi double ;@ (int, int) (.)
7.1 Q: #include io!tream."#
1nt main() {
-num .i {dum, luni22, marti}
Li .12dum, .22luni, ./2marti;
999
A:a) e!te corecta !i afi!ea.a 8 2 / (6ntr-o enumerare, elementelor fara valoare e'plicita li se vor
atribui valori form urmatoarelor doua reguli:
-valoarea implicita pentru primul element (6n e'emplul nostru: dum) este &(
-valoarea implicita a celorlalte elemente este valoarea elementului precedent,
incrementata cu o unitate. 6n cazul nostru, marti va fi luni$, adica ).)
7.2 Q: !truct carte {
$"ar Htitlu;
$"ar HautoriR/S
6ou*le cod;
A:c)20 (7n obiect Carte ocupa eel pu4in spatiul necesitat de memorarea tuturor campurilor sale:
Qitlu ocupa / octeti (pointer), Autori ocupa )'/ octeti%$" octefi, cod ocupa 0 octeti, in total "/
octeti.)
7./ Q: !truct carte {
$"ar Htitlu;
$"ar HautoriR/S
$arte *i*liografieR/8S
A:c) nu e!te >alida autoreferirea !e &oate reali.e numai &rin &ointer (6n general este permisa crearea
de structuri imbricate (a unei structuri in interiorul altei structuri), dar de tipuri diferite, aAa cum
demonstreaza e'emplul de mai 3os:
struct Carte J
char ;Qitlu( char ;AutoriM)?( struct Pret J
int #echi, Pou(
O(
O()
7.0 Q:tB&edef dou*le H(H&F) (intR18S, intR18S
A:d) &entru un &ointer la functie ce &rime!te doi >ectori de cate 18 intregi !i intoarce un &ointer la dou*le
(Qinand cont de prioritatea operatorilor: se citeste mai 6ntai perechea de paranteze rotunde din
stanga: p@ este un tip pentru pointer la..., apoi se citeste restul: ...o functie ce primeAte doi vectori
de cate $& intregi si intoarce un pointer la double.)
7.3 Q: tB&edef dou*le H(&F())R18S;
A:a)definit eronat (Qipul sinonim este definit eronat: tinand cont de prioritatea operatorilor, p@ ar fi
o funcple ce nu primeste argumente fi returneaza un vector de $& pointeri la double, insa in
limba3ul 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 e'emplu:
t2pedef double ;(;p@())M$&?(
6n acest caz, p@ este un tip pentru o functie ce nu primeste argumente si returneaza un pointer la
un vector de $& pointeri la double, sau:
t2pedef double (;p@())M$&?(
cand p@ ar fi un tip pentru o functie ce nu primefte argumente Ai returneaza un pointer la un
vector de $& double.)
7.5 Q: tB&edef int >ectorR18S
Vector aR28S
A:c)int aR28SR18S (Conform declarator de mai sus variabila a va fi un tablou de "& de elemente de tip
vector, fiecare vector avand $& elemente de tip int. 1eci declararea echivalenta a masivului a va fi:
int a M " & ? M$&?()
:.1 Q: #define 1I$(4) 4''
$out1I$(/)
A:c) >a genera eroare Y left+>alue incorrect (Apelul coutZlPC()) este incorect pentru c+ in urma
e'pandarii te'tul sursE va fi: coutZ)(. 6ncercarea de a incrementa o constants este incorecta: )
este echivalent cu )%)$, left-value incorect. 1aca definitia ar fi fost urmata de punct Ai virgula
((), atunci in urma e'pandarii am fi avut: coutZ)(( ceea ce nu ar rezolva lucrurile.)
:.2 Q: #define AQX(4) 4H4
$outAQX(/'3)
A:a)>a afi!a 2/ (6n urma e'pandarii apelului coutZE[\ ()*) ( se va obtine: cout::)*;)*(.
1atorita prioritatii operatorului inmultire (;) fata de adunare (), vom avea: )*;)*%)$**%"),
deci valoarea afi9ata va fi "). L idee de rezolvare a acestui inconvenient ar fi rescrierea
macrodefinittei astfel:
]define E[\(') (');('))
:./ Q: #include io!tream."#
#define ANAP (4,B) int tem&24; 42B; B2tem&;
Void main() {
1nt i12/, i223
99
A:d)>a genera eroare (Aplicatia va genera eroare, intrucat va duce la redeclararea variabilei
au'iliare temp. 6n urma e'pandarii celor doua apeluri: EWAP(il,i")( Ai EWAP (i", il)( seva obtine:
void main() J
int il%), i"%*(
int temp%il( il%i"( i"%temp(
int temp%i"( i"%il( il%temp(
coutZil::T TZi"(
O)
:.0 Q: #include io!tream."#
#define ANAP (4,B) { int tem&24; 42B; B2tem&; }
Void main() {
6ou*le d12/.3, d223.3
99999.
A:c) >a afi!a 3.3 /(Apelul EWAP (dl, d") ( va fi e'pandat astfel:
J int temp%dl( dl%d"( d"%temp( O
Cum dl%).*, d"%*.*, variabila au'iliara temp va fi ) (in urma unei conversii implicite de tip
de la double la int, prin pierderea zecimalelor), apoi dl va lua valoarea *.* Ai in cele din urma d" va
deveni ). AAadar, dl%*.* Ai d"%).)
:.3 Q: #define PA$XZ6-F(4) (<A;2(4)@@(4)2;L;F(4)+<A;';a;:(4))
A:c)con>erte!te o litera mare in litara mica (Vacrodefini3ia converteAte o litem mare in litem mica
astfel: verifica daca argumentul este o litem mare Ai, daca da, il transforms in litem mica scazand
caracterul TA
f
Ai adunand , (conform listei de coduri AEC66, in general daca ' este litem mica iar R
este corespondent3il ma3uscul al sau, atunci: '-TeC - R-TAT).)
=.1.!a !e &reci.e.e care afirmatii !unt corecte:
X:*-6,6#+metodele statice se asociaza cu clasa, nu cu un obiect,ele nu primesc pointerul this
[
=.2.un atri*ut)&ri>ate)al unei cla!e &oate fi acce!at
R:a-numai in interiorul clasei de baza-un atribut private poate fi accesat doar numai in clasa de
baza
=./. un atri*ut)&ri>ate)al unei cla!e &oate fi acce!at
R:a-numai in interiorul clasei-atributele private nu pot fi accesate decat in interiorul clasei
=.0.fie cla!a:..increment
R:b-metoda off-line-pentru ca nu se specifica explicit ca sunt in-line, ele vof fi off-line
=.3.fie cla!a: con!tructor
R:c-este utilizat la instantierea C c($,")(instantierea obiectelor se face numai specificand explicit
toti parametrii
=.5.fie cla!a :&reci.ati afirmatia corecta
R: a-pointerul este constant-declaratia C* const pc=new C; corespunde instantierii unui pointer
constant
=.7.fie cla!a: &reci.ati afirmatia corecta
R:c-constructorul standard este apelat de doua ori-C ob!"; declara un vector ob cu doua obiecte
de tipul C; in cazul masivelor se apeleaza constructorul standart pentru fiecare obiect in parte
=.:.fie cla!a :in!tantiere >a a&area
R-c-constructorul )-instantierea C c#$% va apela constructorul care are ca valoarea ultimul
parametru ca valoare implicita,costructorul $&
=.=.fie cla!a: fie declaratiile
R:b-6,6#-atributele si metodele obiectelor simple se refera cu operatorul punct#&%,in cazul
pointerilor de obiecte se foloseste sa'eata#-(%
=.18.fie cla!a &reci.ati 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 a)utorul destructorului
=.11.fie cla!a : atri*utul 4 e!te
R:c-private-in cazul claserlor, modificatorul de acces implicit este private&
=.12.un atri*u al unei cla!e %!tudent)care are rolulde a contori.a toti !tudentii in!tantiati ter*uie 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
=.1/.fie cla!a: a&elulf() >a det utili.area
R;d-constructorul de clasa si celui de copiere cate o data-functia C f #% *static C c;return;return c;+
creeaza o sin'ura data un obiect static c, folosind constructorul de clasa,apoi, la fiecare apel il
returneaza pe acesta, fol constructorul de copiere
=.10.fie cla!a: functia >oid $(int+428) (42W4;) &oate con!titui un con!tructor al cla!ei
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
=.13.fie cla!a: in!tantierea cH2c2neO $(/); a&elea.a
R:a-constructorul de clasa o data-instantierea C*c=new C#$% determina alocara dinamica a unui
pointer c catre un sin'ur obiect C si incarcarea obiectului pointat cu data $, penrtu care se va
utilize constructorul de clasa&
=.15.fie cla!a: functia \c(intW4) {coutW4} &oate con!titui un de!tructor al cla!ei
R:c-nu pentru ca are parametric-are numele clasei dar nu returneaza nimic
=.17.fie cla!a: metoda AetC e!te:
R:c-eronata( intr-o metoda declarata const obiectul ;this este constant-aceasta este constanta si
atributele nu pot fi modificate#x=$,eronat%
=.1:.fie cla!a: &reci.ati afirmatia corecta:
R:c ^constructorul de clasa este apelat o data sic el de copier o data-declaratia C c,,c!=c,
determina crearea a doua obiecte, pentru primul se utilizeaza constructorul clasa,iar al ! lea
constr de copiere
=.1=.a&licatia: 9int ]etWa() {return a;}9cout.]etWa();
R: d-este eronata( obiectul constant c nu poate invoca metoda _et-()-obiecte constant pot invoca
decat metode constant,cum -et.a#% nu a fost declarata constanta,aplicatia va 'enera eroare
=.28.cla!a: 9int ]etWa() con!t {return a23;}};
R:d-este eronata( metoda constanta _et`a() nu poate modifica obiectul ;this-cuv const se refera la
metoda constanta,adica nu este permisa modificarea atributului in corpul functiei
=.21.ce >a afi!a a&licatia: 9cout)Ir. Z*iecte: %$::nendl;
R:b-$-atributul static n este actualizat in momentul construirii unui obiect prin constructorul de
clasa#adica c,% &Constructorul de copier nefiind definit, la crearea obiectului c! se va apela
constructorul implicit creat de compilator, care nu face si incrementearea lui n, acesta ramanand
cu valoarae ,
=.22.ce >a afi!a a&licatia:9cout$::n;
R:c-$"$-se creeaza c,, se afiseaza ,,n devine ,; se creeaza obiectul c!,n devine ! ,afiseaza !,la
iesire c! se distru'e,n va fi ,,se afiseaza,&deci afiseaza , ! ,
=.2/.fie cla!a: definirea cla!e $ e!te:
R:a-corecta-clasa C a fost definite corect
=.20.!e con!idera cla!a: care e!te ordinea a&elarii con!tructorilor &t cele doua o*iecte createF
R:b-constructorul de clasa si apoi cel de copiere-pt c, se apeleaza constructorul de clasa,care va
face intializare celor ! atribute ale sale cu valorile ! si /, iar pt obiectul c! se apeleaza
constructorul de copier, acesta preluand atributele obiectului c,
=.23.fie cla!a: care din functiile &oate con!titui un con!tructor al cla!eiF
R:d-C(int`'%&, int`2%&): 2(`2)J'%`'(Oinitializarea 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;+
=.25.fie cla!a: definirea cla!ei $ e!te:
R:a-corecta-este declarata correct,va avea un atribut variabil si unul constant
=.27.fie cla!a: daca c e!te un o*iect con!tant de cla!a c declarat: con!t c; care din urm a&eluri !unt
>alideF
R:c-c.h.(c)(c.k(c)functia h declara obiectul current constant, apelarea functiei va fi permisa;functia
1 declara atat obiectul constant cat so parametrul,deci va putea fi apelata
=.2:.&entru cla!a: care din calificarile de mai To! refera data mem*ra !tatica !F
R:-b-6,6#-atributele statice ale unei clase contin informatii referitoare la intrea'a
=.2=.con!ideram cla!a:9int $::!28 definirea cla!ei c e!te:
R:d-corecta-clasa C este definite correct, avand un atribut static#s%,unul nestatic#x% si o metoda
static #f%
=./8.fie cla!a: de cate ori !e a&elea.a cei doi con!tructori
R:c-contructorul d clasa este apelat de ) ori sic el de copier nici o data-fiind un vector de $ obiecte
de clasa C, constructorul de clasa se apeleaza entru fiecare obiect in parte, deci de $ ori
=./1.fie cla!a: de cate ori !e a&elea.a con!tructoru cla!ei $F
R:-b-o functie prieten, definite corect-operatorul new folosit pt alocarea dinamica in cazul
pointerului p, determina si apelul constructorului de clasa&
=./2.in cla!a: functia f e!te:
R:-b-o functie prieten, definita correct-asa cum arata si declaratia friend, functia f va fi o functie
prieten a clasei C
=.//.fie cla!a: declaratia functiilor f e!te
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
! a fiind independent, va fi apelata independent sub forma f#c%&

=./0.fie definitiile de cla!e : 9$1::f(){cout4;}functia f e!te
R:c-o metoda a clasei C$ ce afiseaza valoarea atributului ' al unui obiect de clasa C$ - dupa cum
anunata operatorul de rezolutie#::% functia f este o metoda a clasei C,,astfel ca va lucre implicit cu
un obiect de clasa C,,pe care l primeste prin pointerul this
18.1. fie cla!a: 9 >oid main() { $ c; cout '';}
R :b-afisarea valorii $--4&re!ia cout^c''; a&elea.a !u&raincarcarea o&eratorului de &o!tincrementare,
care in!a returnea.a >aloarea incrementata a atri*utului 4; 4 era initial 8 (&rin con!tructorul de cla!a), la
afi!are >a fi 1. Pentru ca &o!tincrementarea !a functione.e corect in cor&ul !au tre*uia !cri!: return 4'';
18.2. fie cla!a :9int o&erator'($ c, int B){ return c.4'B;}.daca c e!te un o*iect al cla!ei
$, atunci functia o&erator ':
R :a-permite efectuarea adunarii c)-6u&a ordinea in care au fo!t declarate argumentele
!u&raincarcarii o&eratorului ', re.ulta ca o&erandul din !tanga adunarii e!te o*iect, iar eel din drea&ta
e!te intreg. Au&raincarcarea >a fi utila &entru adunarea c'/.
18./.fie cla!a:9int o&erator.() DD!u&raicarcarea &unct(.) {return c.4}{; Functia o&erator.:
R :d-este eronata, operatorul . nu poate fi supraincarcat-Z&eratorii &unct (.), de re.olutie(::),
conditional (F:), dimen!iune (!i.eof) nu &ot fi !u&raincarcafi.
18.0. fie cla!a:9int o&eratorD () { return c.4;}}; Functia o&eratorD:
R :b-este eronata operatorul < este binar-Prin !u&raincarcare nu !e &oate modifica arietatea unui
o&erator: o&eratorul D e!te *inar: daca !e !u&raincarca &rin metoda a cla!ei (cum !+a incercat in e4em&lul
dat) el tre*uie !a ai*a un &arametru, daca !e !u&raincarca &rin functie inde&endenta, acea!ta >a tre*ui
!a ai*a doi &arametri.
18.3.:fie cla!a:9>oid main () {$ c1, c2; c22c1}; -4&re!ia c22cc1 determina a&elul:
R :c-supraincarcarii operatorului % -Atri*uirea c22cl; a&elea.a !u&raincarcarea o&eratorului de atri*uire
2. Iefiind >or*a de o declaratie (o in!tantiere) nu !e a&elea.a nici un con!tructor. A+ar fi recur! la
con!tructorul de co&iere daca era o initiali.are in!otita de declaratie: $ c22cl; diferit de: $ c2; c22cl.
18.5.fie cla!a:9friend int o&erator\ ($ c){return c.4;}{; Functia o&erator\:
R :b-permite e'tragerea datei private '-Functia o&erator\ !emnifica !u&raincarcarea corecta a
o&eratorului \ &entru e4tragerea atri*utului &ri>at 4.
18.7.fie cla!a:9>oid main() { $ c; cout''c;}; Va determina:
R :d-semnalarea unei valori--4&re!ia cout^''c; confine o &reincrementare; in cla!a $ e!te
!u&raincarcat o&eratorul de &o!tincrementare, !emnalat &rin &re.enta &arametrului artificial intreg.
18.:.fie cla!a :9o&erator int (){retunr 4 ;} ;Functia o&erator int ():
R :d-este eronata, rep suprai op cast-Au&raincarcarea o&eratorului ca!t &re.inta &articularitatea ca ti&ul
returnat e!te &la!at in declaratie du&a cu>antul c"eie o&erator.
18.= Z&eratorul !ageata (+#):
R :d-poate fi suprai numai prin functie independenta-Z&eratorul !ageata e!te un o&erator !&ecial
care !e !u&raincarca numai &rin metoda ne!tatica a cla!ei.
18.18 Fie definitiile: com&le4 o&erator' (dou*le d, com&le4 @c) { return c'd; }; Ae dore!te ca
!u&raincarcrile o&erator' !a a!igure comutati>itatea adunarii unui numar com&le4 cu un dou*le, atunci:
R :d-suprai trebie sa fie declarate ca functii prietene ale clasei comple'-Fiind definite ca functii
inde&endente, cele doua !u&raincarcari nu au acce! la atri*utele &ri>ate Xe !i 1m ale cla!ei com&le4, de
aceea nu &ot fi utili.ate M forma actuala ci tre*uie fie definite ca metode ale cla!ei, fie li !e &oate &a!tra
!tatutul inde&endent fata de cla!a, in!a atunci tre*uie declarate &rietene ale ace!teia.
18.11.Ae con!idera cla!a:..>oid main (){$ c; cout(++c) ; } ;-4&re!ia cout(++c) e!te :
R :d-eronata, functia operator - - are tip returnat void, deci rezultatul apelului nu poate intra in
compunerea unei e'presii-6e!i !u&raincarcarea &rin functie friend a o&eratorului _ nu e!te eronata,
functia &utand a>ea ti& returnat void, re.ultatul a&elului nu &oate intra in com&unere cu alti o&eratori, deci
nici cu o&eratorul ^. Au&raincarcarea &oate fi in!a folo!ita in e4&re!ii de !ine !tatatoare (\c;).
18.12.Ae con!idera cla!a :9>oid main () $ a(/), *(3) ; a'2* ; couta.4 ;} ;-4&re!ia a'2* e!te :
R :b-eroanta, operatorul '% nu a fost suprain -6e!i o&eratorii ' `i 2 au fo!t !u&raincarcati, ace!tia nu
!e com&un automat. A!tfel, &entru a &utea e>alua e4&re!ia a'2* >a fi ne>oie !i de !u&raincarcarea
o&eratorului '2.
18.1/. Fie cla!a :9{ in##c.4 ;return in ;} ; Functia o&erator## e!te :
R :d-corecta, operatorul == fiind folosit pt operatii de intrare cu obiecte (cin==c)- Functia o&eratora
e!te corecta, o&eratorul fund !u&raincarcat &entru a e4ecuta o&eratii de intrare (citire) &entru o*iecte ala
cla!ei $.
18.10 Fie cla!a: $ o&erator(int i) { return ${4i};Functia o&erator e!te:
R :a-corecta, operatorul :: fiind supraincarcat pt deplasarea pe biti spre stanga a unui obiect
(c=="- 1n cla!a data o&eratorul ^ a fo!t !u&raincarcat &entru a calcula re.ultatul de&la!arii &e *iti !&re
!tanga a atri*utului 4 al unui o*iect (c^2). tn mod frec>ent !u&raincarcarea o&eratorului ^ urmare!te
definirea o&eratiilor de ie!ire (afi!are) cu o*iecte, ca. in care ar fi tre*uit definit a!tfel:
friend o!tream! o&erator (o!tream @out, $ @c)
{ out^c.4; return out; }
18.13. Ae con!idera cla!a:9{ return neO c"ar RnH !i.eof( $) S; }; Functia o&erator neO e!te:
R :a-corecta, operatorul neC este suprai prin functie membra statica- Au&raincarcarea o&eratorului
neC e!te &ermi!a atat &rin functie mem*ra !tatica, cat `i &rin functie inde&endent!. 6aca !e !u&raincarca
&rintr+o metoda a cla!ei, acea!ta fiind o functie de intere! general &entru cla!a, ea >a fi automat !tatica,
c"iar daca !&ecificatorul static li&!e!te.
18.15. Fie cla!a:..$ o&erator,($ c)( return c;}}; Functia o&erator, e!te:
R :d-corecta, evalueaza o lista de obiecte returnand valoarea ultimului obiect din lista-Z&eratorul
>irgula (,) &oate fi !u&raincarcat in !co&ul e>aluarii unei li!te de o*iecte, returnand >aloarea ultimului
o*iect din lists&
18.17.1n cla!a:9 $ o&erator: ( $ c) {return $(4Dc.4;}{; Functia o&erator: a fo!t definite:
R :a-eronat. Eimbolul doua puncte( :) nu este un operator-Aim*olul doua &uncte (:) nu e!te un
o&erator, iar crearea de noi o&eratori nu e!te &ermi!a, &utand fi !u&raincarcafi doar cei e4i!tenti in lim*aT.
18.1:.Fie cla!a:9int o&erator ()() { return 4H4 }};Functia o&erator () e!te:
R :d-eronata, operatorul () este bianr. @unctia trebuind sa aiba doi parametri-Z&eratorului functie 8
!e
!u&raincarca numai &rin functie mem*ra !i &oate a>ea orice numar de &arametri (deci `i 8). Functia a fo!t
definita corect !i calculea.a &atratul >alorii o*iectului curent.
18.1=. Ae con!idera cla!a:...>oid main () { $ a (/), *(3); cout a22*;} ; -4&re!ia couta22* e!te :
R :a-eronata-Prioritatea o&eratorilor nu &oate fi !c"im*ata &rin !u&raincarcare. A!tfel, de`i o&eratorul 2 a
fo!t !u&raincarcat corect, datorita &rioritatii celor doi o&eratori (^`i 22) &rima e4&re!ie e>aluata >a fi
cout^a, care >a fi a&oi com&arata cu *, ceea ce generea.a eroare. Pentru o e>aluare corecta &utea fi
folo!ita e4&re!ia: cout^ (a22*).
18.28.fie cla!a :9int o&erator ( { return \4 ;}{} ;Functia o&erator ( e!te:
R :c-corecta, si calculeaza negarea pe biti a valorii obiectului-6e`i o&eratorul ( e!te definit in lim*aT
&entru a reali.a negarea logica, in e4em&lul dat el a fo!t !u&raincarcat &entru a efectua negarea &e *iti a
>alorii o*iectului. A!tfel, &entru ti&urile fundamentale el >a a>ea in continuare rolul im&licit (negare logica),
iar &entru o*iectele cla!ei $ >a a>ea rolul care i+a fo!t a!ociat &rin !u&raincarcare (negare &e *iti).
18.21.Ae con!idera cla!a: >oid main() { V .(3); .R7S2/; cout.R7S;} -4&e!ia .R7S ;} ;
-4&re!ia .R7S2/ :
R :d-corecta-6atorita !u&raincarcarii o&eratorului RS, e4&re!ia .R7S2/ e!te corecta, o&eratorul folo!indu+!e
&entru a adre!a un element al >ectorului 4. 6e`i 4 e!te &ri>at, &oate fi acce!at de o&eratorul RS (fund o
metoda a cla!ei). 1n &lu! !u&raincarcarea &ermite !curtcircuitarea unui ni>el de adre!are, a!tfel ca o
referire de forma ..4RiS >a fi ec"i>alenta cu .RiS. 6e a!emenea, functia returnand o referinta a elementului
intor!, o&eratorul &oate fi folo!it in am*ele &arti ale unei atri*uiri, deci .RiS e!te l-value.
11.1.Pentru a reali.a con>er!ia de la o cla!a la alta !e &oat o&ta &entru:
R :b-6,666-$on>er!ia de la o cla!a la alta !e reali.ea.a fie &rin !u&raincarcarea o&eratorul ca!t in cla!a
!ur!a, fie &rin definirea unui con!tructor adec>at in cla!a de!tinatie.
11.2.$on>er!ia unui o*iect al unei cla!e in!&re un ti& &rimiti>, !e &oate face &rin :
R :c-supraincarcarea operatorului cast in clasa respectiva- $on>er!ia unui o*iect al unei cla!e in!&re
un ti& &rimiti> !e reali.ea.a &rin !u&raincarcarea o&eratorului ca!t in cla!a re!&ecti>e.
11./.Fie cla!a :9>oid main () { $ c(3) ; coutc'2} ; -4&re!ia c'2 e!te :
R :b-corecta si foloseste supraincarcarea operatorului cast--4&re!ia c'2 e!te corecta, iar &entru
e>aluarea ei !e >a utili.a !u&raincarcarea o&eratorului ca!t al cla!ei $, care >a face con>er!ia o*iectului c
in ti&ul int, e4&re!ia reducandu+!e la adunarea a doi intregi.. Z&eratorul ca!t definit !e >a folo!i atat in
con>er!ii e4&licite (de e4em&lu (int)c'2), cat `i in con>er!ii im&licite daca e!te ca.ul (&entru c'2).
11.0.Fie cla!a :9>oid main () { $ c(3) ; coutc'2} ; -4&re!ia c'' e!te :
R :d-eronata (valoarea intoarsa de op. cast nu este l-value--4&re!ia C22 e!te eronata. 6e!i
o&eratorul ca!t definit in cla!a &oate face con>er!ia o*iectului c in ti&ul int, >aloarea intoar!a de ace!ta nu
e!te l-value, deci nu &oate fi folo!ita in incrementare. A&elarea e4&licita a o&eratorului ca!t (!u* forma
((int)c)'') nu re.ol>a acea!ta &ro*lem!, e4&re!ia fund in continuare eronata.
11.3.Ae con!idera cla!a :9 >oid main () { $ c(3) ; coutc'2} ; -4&re!ia coutc e!te :
R :d-eronata ( genereaza ambiguitate--4&re!ia cout^c generea.a am*iguitate: li&!a !u&raincarcarii
o&eratorului ^ &entru afi!area o*iectului c, >a conduce la cAutarea unei modalitAti de con>er!ie catre un
ti& &rimiti> &entru care afi!area e!te &ermi!A. 6atorita fa&tului ca e4i!t! doua cAi de a con>erti o*iectul c
intr+un ti& fundamental, !e >a !emnala eroare de am*iguitate.
11.5.$on>er!ia unui ti& de date &rimiti> in!&re o cla!a !e &oate face &rin :
R :a-suprai. Construct. Clasei respective-$on>er!ia dintr+un ti& de date &rimiti> in!&re o cla!a !e
reali.ea.a &rin !u&raincarcarea con!tructorului cla!ei re!&ecti>e. Pentru a actiona dre&t con>ertor,
con!tructorul tre*uie !a ai*a un !ingur &arametru de ti&ul &rimiti> (!au ceilalti &arametri !a ai*a >alori
im&licite).
11.7.Fie cla!a :9>oid main () { $ c(<a <) ; c253 ;} ; -4&re!ia c253. e!te :
R :a-corecta si atribuie valoarea -* atrib ' al obiectului c-$on!tructorul cla!ei $ a>and &arametri cu
>alori im&licite, >a actiona dre&t con>ertor din!&re ti&ul &rimiti> char (core!&un.Ator &rimului &arametru)
in!&re cla!a $. Atri*uirea !e >a e>alua a!tfel: &entru con!tanta dou*le 53. !e efectuea.a con>er!iile din
dou*le in c"ar !i a&oi intr+un o*iect de cla!a $, care i !e atri*uie lui c. A!tfel, atri*utul 4 al o*iectului c >a
lua >aloarea 53.
11.:.Fie cla!a :9>oid main() { $ c(<a;,18.) ; c2(<A;,28.) ;} ; -4&re!ia $2(<A;,28.) e!te :
R :c-eronata, nu e'ista un constructor care sa faca conversia dintr-un tip primitiv in tipul clasei C-
Pai intai !e >a e>alua re.ultatul e4&re!iei >irgula (bAb,28.) ace!ta fiind 28., du&a care !e incearca
atri*uirea c228, care e!te in>alid! (nu e4i!ta nici un con!tructor adec>at !i nicio !u&raincArcare adec>atA
a o&eratorului 2).
11.=.Fie cla!ele:9B24 ; B2$6(4) ; B2($6)4; $are dintre cele trei atri*uiri >or fi &ermi!e
R :b-2%C1(') ( 2%(C1)') -Goate cele trei atri*uiri im&lie! con>er!ia unui o*iect de cla!a $A intr+un o*iect
de cla!a $6. 1n ca.ul de fata con>er!ia !e &oate face &e doua cai: fie folo!ind con!tructorul cla!ei $6, fie
folo!ind o&eratorul ca!t al cla!ei $A. 1n ca.ul atri*uirilor B2$6(4) !i B2($6)4, nu &ot !a a&arA am*iguitAti,
con>er!iile fiind e4&licite. Prima atri*uire in!a (B24), nece!itA o con>er!ie im&licitA, e4i!tenta !imultana a
celor doua modalitati de con>er!ie generand am*iguitate.
11.18.Ae con!idera cla!ele :9f(4) ; f($6(4)) ; f(($6)4) ; $are din a&elurile functiei f utili.ea.a &entru
con>er!ie in!tructorul cla!ei $6 F
R :c-f(C1(')) ( si f((C1)') -A&ecificatorul explicit al con!tructorului cla!ei $6, inter.ice con>er!iile
im&licite &rin con!tructor (de`i !unt &rioritare), ace!ta &utandu+!e folo!i doar &entru con>er!iile e4&licite.
1n ca.ul in care e!te nece!ara o con>er!ie im&licita, ea !e >a reali.a &rin o&eratorul ca!t al cla!ei $A.
A!tfel a&elul f(4) >a utili.a &entru con>er!ie (im&licita) o&eratorul ca!t al cla!ei $A, iar a&elurile f($6(4));
`i f(($6)4) >or folo!i &entru con>er!ie (e4&licita) con!tructorul cla!ei $6.
11.11.Fie cla!ele :9>oid main () {$A a ; f(a) ;} ; 6aca a e!te un o*iect de cla!a $A ($A,a ;), atunci a&elul
f(a) e!te :
R :d-eronat, genereaza ambiguitate-A&elul f(a) nece!iti o con>er!ie a o*iectului a &entru ada&tarea la
&rototi&utl functiei f. Pentru un o*iect de cla!a $A e4i!t! doua eon>er!ii, `i de a!emenea,
douaM!u&rauOarcari ale functiei f care &ert lucra direct cu re.ultatul ceior doua moduri de con>er!ie,
a!tfel ca !e !emnalea.a am*iguitate.
12.1. A&licatia:..>oid main () { $ c; coutc.4}}; Programul afi!ea.a:
A :a)8 (Ba instanHierea obiectului clasei derivate este apelat e'plicit constructorul clasei de baza
cu valoarea &.)
12.2 Fie a&licatia:9 >oid main () {$ c ;} ; Programul afi!ea.a
A :a)U$6 (Ba instan3ierea obiectului clasei derivate este apelat mai tntai constructorul clasei de
baza (afiseaza U), apoi al clasei derivate (afiseaza C). Ba distrugere este apelat mai mtai
destructorul clasei derivate (care nu este definit e'plicit), apoi al clasei de baza (afiseaza 1).)
12./ $on!ideram &rogramul :9U H&*2neO $ ; &*+# f (); Programul afi!ea.a:
A:*)U (Pointerul pb este declarat ca pointer catre clasa U, deci func3ia f apelata va fi a clasei U
(earl2 binding % legare timpurie).)
12.0 Fie a&licatia:9>oid main () { U H&*2neO U; &*+#f(); };Programul:
A:a) e!te incorrect cla!ele a*!tracte nu &ot a>ea in!tante (@unctia f din clasa U este virtuala pura (nu
are definite), ceea ce face ca U sa fie clasa abstracts, care nu accepts instante.)
12.3 Programul:9 U H&*2neO U; &*+#f(); }:afi!ea.a:
A:c)$ (Pointerul pb, desi este declarat ca pointer catre clasa U, 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.5. Fie a&licatia: 9>oid main () {$ c; cout c.4;};Programul afi!ea.a;
A :*)8 (Ba instan3ierea obiectului clasei derivate este apelat mai intai constructorul clasei de baza
care initializeaza atributul ' cu &, apoi al clasei derivate care nu modifica valoarea atributului '.)
12.7 Fi- a&licatia :96 d ; coutd.4 ;} ;Programul afi!ea.a :
A :c)2 (6n cazul derivarii virtuale, clasa 1 va mosteni de la clasa de baza U atributul ' intr-un singur
e'emplar, via clasa Ul (prima din lista de derivare). Qotusi, la instantierea sa sunt apelati ambii
constructori ai claselor Ul si U" in ordinea din lista de derivare, astfel ca ' ia succesiv valorile $,
respectiv " (ultima valoare).)
12.: Fie cla!a :9>irtual coid f()28 ;} ; Alegeti afirmatia corecta :
A :d) f e!te o functie >irtuala &ura c e!te o cla!a a*!tracta (6nitializarea cu & a prototipului functiei f,
anun3a faprul ca aceasta este o functie virtuala pura, fortand clasele derivate sa o redefineasca. L
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 utilie tipul !eneric t (declaratia
template <class T> class C{}; anunta compilatorul ca in clasa C se va
utilize tipul generic T)
13." #e $uncti template:poate # ea particulariata pe clasa stu%ent %e#nite mai
&os'pentru a compara %oi stu%enti prin prisma notelor(
A:a) %a(DA functia template ma poate ! particularizata pe clasa student
pentru a compara " studenti prin prisma noteleor# se va folosi
supraincarcarea operatorului cast catre dou$le care etrage dintrun
o$iect student nota sa)
13.3 #e $unctia template:poate # ea utiliata pentru a compara alp)anumeric
%oua siruri %e caractere: c)ar *s1+,abc,' *s"+,%e$,;
A:c)nu' se vor compara a%rese (de memorare ale celor " siruri adrese
continute in pointerii s% si s" pentru a compara alp&anumeric cele " siruri
se poate opta pentru supraincarcarea functiei ma
C&ar' ma (c&ar'a# c&ar'$) {
(eturn strcmp (a#$)>)*a+$)

S-ar putea să vă placă și