Documente Academic
Documente Profesional
Documente Cultură
Manual C C Clasa 9
Manual C C Clasa 9
____________________________________________________Cuprins
Cap.1 Elemente de baz ale limbajului C..................................................................................1
1.1 Structura unui program C ______________________________________________________1 1.2 Vocabularul limbajului_________________________________________________________1 1.3 Tipuri de date________________________________________________________________1 1.4 Directive preprocesor__________________________________________________________2 1.5 !erci"ii #i teste gril$__________________________________________________________2
Cap.2 Tipuri fundamentale de date ...........................................................................................4 Tip.........................................................................................................................................4 Numr de bii........................................................................................................................4 Domeniu de valori................................................................................................................4
2.1 Constante___________________________________________________________________4 !emple % 123.4 12e& '111.2 ______________________________________________5 2.2 Variabile_____________________________________________________________________5 2.3 !erci"ii #i teste gril$__________________________________________________________5
Macro de verificare.............................................................................................................46
5.15 +unc"ii matematice u5uale___________________________________________________4&
Valoarea returnat...............................................................................................................47
5.1& !erci"ii #i teste gril$________________________________________________________4*
Cap.' Tabl"uri...........................................................................................................................$$
&.1 Declararea tablourilor________________________________________________________55
Exemple:.............................................................................................................................
&.2 6ni"iali5area tablourilor________________________________________________________55 &.3 0relucr$ri elementare ale vectorilor____________________________________________5& &.3.1 Citirea elementelor unui vector________________________________________________5& &.3.2 Determinarea elementului minim)ma!im________________________________________5& &.3.3 Determinarea primului element cu o anumit$ proprietate__________________________5& &.3.4 Determinarea ultimului element cu o anumit$ proprietate__________________________5* &.3.5 liminarea tuturor elementelor cu o anumit$ proprietate__________________________5* &.3.& liminarea elementului din po5i"ia 8 dat$ 31;<8;<n4______________________________5* &.3.* 6nserarea unui element : =n po5i"ia 8 dat$ 31;<8;<n4______________________________5* &.3.. 0ermutarea circular$ cu o po5i"ie spre st>nga___________________________________5. &.3./ 0ermutarea circular$ cu o po5i"ie spre dreapta__________________________________5. &.3.11 ?lgoritmul de c$utare binar$_________________________________________________5/ &.3.12 6nterclasarea vectorilor_____________________________________________________5/ &.4 0relucr$ri elementare ale matricilor_____________________________________________&2 &.4.1 Citirea elementelor unei matrici_______________________________________________&1 &.4.2 Tip$rirea elementelor unei matrici_____________________________________________&1
&.4.3 Determinarea elementului ma!im)minim________________________________________&1 &.4.4 6denti(icarea elementelor speci(ice unei matrici p$tratice__________________________&1 &.5 !erci"ii #i teste gril$_________________________________________________________&2
Cap.& *tructuri.........................................................................................................................&1
/.1 De(inirea tipurilor structur$____________________________________________________/1 /.2 6ni"iali5area structurilor_______________________________________________________/2 /.3 1pera"ii permise asupra structurilor_____________________________________________/3 /.4 !erci"ii #i teste gril$_________________________________________________________/4
Cap.1
n C se lucreaz cu $alori ce pot fi stocate n variabile sau constante. /alorile constante nu se modific pe parcursul rulrii programului. 0ac au asociat un nume, atunci se numesc constante simbolice i se declar printr)o directi$ de preprocesare numit macrode(ini"ie a$%nd sinta!a : Fde(ine nume valoare !emplu : #define '( 1 0ac nu au nume, constantele se autoreprezint prin nsi maniera lor de scriere. Variabilele sunt datele care i pot modifica $aloarea pe parcursul e!ecuiei programului. Orice $ariabil are asociat un nume i o zon de memorie care $a fi prelucrat binar conform unor reguli specifice de interpretare a tipurilor de date. 1bserva"ie : orice $ariabil trebuie declarat nainte de utilizarea sa. #ipurile de date pot fi prede(inite -puse la dispoziie de limba&. sau derivate -definite de utilizator .. O alt clasificare posibil este urmtoarea : simple -scalare., care conin o singur $aloare de un anumit tip compuse, care conin mai multe $alori de acelai tip sau de tipuri diferite pointeri, care conin adrese de memorie ale unor entiti
a. separare
a subprogramelor n interiorul unui program b) a delimita instruciunile care se execut cu prioritate c) a permite utilizatorului s introduc mesaje explicative d) nu au nici o semnificaie
7. Care din urmtoarele cu$inte nu reprezint un nume 8 a$ a)* b$ a1b2c+ c$ 1abc d$ ),-! 9. Care din urmtoarele instruciuni definete o constant -?HS6I cu $aloarea :; 8 a$ constant .,*/012345% b$ #define .,*/012 45 c$ #define .,*/012345 d$ constant .,*/012345 <. 0efinirea corect a unei constante simbolice numit TJK , care are $aloarea 2 este : a$ int 67231% b$ #define 67231% c$ #define 672 1% d$ #define 672 1
=. 0efinirea corect a unei constante numit LST cu $aloarea .24< este : a$ #define 8/ 5.129 b$ 8/ .129% c$ float 8/ 35.129% d$ #define 8/ .129 >. Care din numele de $ariabile de mai &os nu este $alid 8 a$ go:it b$ go)cart c$ :season d$ );hat :. 0efinii o constant simbolic "? cu $aloarea 7.29: a$ #define +.1: <0% b$ #define float <0 +.1:% c$ #define float <03+.1:% d$ #define <0 +.1: e$ #define <03+.1:
#ipul c,ar este folosit de obicei la prelucrarea caracterelor, dar poate fi folosit i ca ntreg de format scurt. Bodificatorii de tip signed i unsigned sunt folosii pentru datele de tip ntreg pentru a specifica utilizarea, respecti$ neutilizarea bitului de semn. #ipul logic nu este predefinit n C. "entru el, con$enia de utilizare este : fals se consider $aloarea ;, true se consider orice $aloare nenul.
2.1 Constante a. Constante =ntregi : pot fi e!primate n bazele :, 2; sau 2= . Constantele n baza : au ntotdeauna
prima cifr ;, iar cele n baza 2= au prefi!ul @2!A sau @2HA. !emple : 21*2 '( are ; n fa, este considerat n baza : (' 122 '( este considerat implicit n baza 2; (' 2!*. '( are ;!, este considerat n baza 2= (' Constantele de tip long au adugat la sf%rit litera l sau @ . !emplu : 1@ 1222222@ 5.1l "entru constantele unsigned se adaug la sf%rit u sau K . !emplu : 2u 12222u 22222lu b. Constante caracter : sunt reprezentate de unul sau mai multe caractere ncadrate ntre apostrofuri . !emple : MHN M1N MOnN MOtN MPN "entru a putea utiliza anumite caractere speciale se folosesc sec$enele de e$itare prezentate n tabelul de mai &os : Secven"a O2 Oa Ob O( On Or Ot Ov OO ON OR Valoare ,e!a5ecimal$ 2 2!2* 2!2. 2!2C 2!2? 2!2D 2!2/ 2!2Q 2!5C 2!2* 2!22 Caracter ?SC66 BK@@ Q @@ QS ++ @+ CJ 9T VT O M S Semni(ica"ia terminator de #ir generator de sunet bac8 space s(>r#it de linie linie nou$ salt la =nceputul r>ndului tab ori5ontal tab vertical bac8 slas, apostro( g,ilimele
c. Tiruri de caractere : se scriu ntre g3ilimele, iar la sf%ritul irului compilatorul adaug automat
2.2 Variabile
0eclaraia unei $ariabile are sinta!a : tip_ba5$ list$_variabile_declarateU 5ista poate fi format din una sau mai multe $ariabile separate ntre ele prin $irgul. O $ariabil poate s includ n declaraie i iniializarea sa. !emple : int n= (35% float media% char c3>9% unsigned long int f% double salar%
9. #ipul de date C9?J este reprezentat pe : a$ : bii b$ 4 bii c$ 1> bii d$ +2 bii <. Care este $aloarea ma!im a unui tip de date cu semn e!primat pe : bii 8 a$ (2 la puterea 4$ minus 1 b$ (2 la puterea ?$ minus 1 c$ 2 la puterea 1> d$ (2 la puterea 1>$ minus 1 =. Ce tip de constant este 2*K 8 a$ constant@ integer universal@ b$ constant@ short int
:. Care dintre urmtoarele $alori sunt constante flotante scrise corect8 1$ 2+5?.A4 2$ B9:.+ +$ C25.5? :$ C1A4. 9$ .1+ >$ 1.A 2: ?$ B2.?2B+ 4$ 2.eB: a) 1), $), %), +), -) b) c) d) e) toate mai puin ) toate toate mai puin b) primele cinci
29. Considerm $ariabilele a, b, c, d i e. Clegei $arianta corect a declaraiilor, astfel nc%t atribuirile urmtoare s nu fie nsoite de con$ersii care s modifice $alorile atribuite. a3+% b34% c32.1% d3D+.9% e3E-E% a$ float a=b=c.d% char e% b$ c$ d$ e$ int int int int a=b=c=d% char e% a=b=e% float c=d% a=b% float c=d% char e% c=d% float a=b% char e%
E. Care dintre $alorile de mai &os sunt constante ntregi scrise corect8 a$ 12+ b$ C1? c$ B4:+ d$ 519: e$ DD>? 2;. Care dintre construciile de mai &os reprezint constante tip caracter8 1$ # # 2$ EFE +$ EaE :$ E # E 9$ EFFE >$ EF1+E ?$ #a# 4$ E E a) $), %) ,.) b) toate c) toate mai puin ) si +) d) $), %), )), .) e) %), )), )! +), .) 22. Care dintre urmtoarele declaraii de $ariabile declar corect o $ariabil ! ce poate memora $alori reale8 a$ float G% b$ double G% c$ unsigned float G% d$ GHfloat% e$ GHdouble% 24. Care dintre liniile de program de mai &os realizeaz iniializarea corect a $ariabilei ! la declararea sa8 a$ int G332% b$ GHint32% c$ int G32% d$ int G 2% e$ G32Hint% 27. Care dintre $ariabile $or a$ea $alori ntregi dup e!ecuia sec$enei de program urmtoare8 int a3+= b= c% float G3D11.2+% char d% b3G% d3E,E% c3E.EDIJE% a. variabila G b) variabila c c) variabila d d$ variabila a e) variabila b
2<. O declaratie de genul : int i3?.+% $a a$ea urmatorul efect : a) semnalarea unei erori din partea compilatorului b. va atribui lui i valoarea ?.+ i va semnala un avertisment din partea compilatorului c. va modifica tipul variabilei i d. va atribui lui i valoarea ? 2=. 0eclaraia corect pentru definirea unui ntreg numit suma este : a$ sumaHinteger% b$ integer suma% c$ int suma% d$ suma int% 2>. 0eclaraia corect pentru definirea unei $ariabile caracter numit litera este : a$ literaH3char% b$ char litera% c$ literaH char% d$ character litera% 2:. 0efinirea corect a unei $ariabile numit bani care poate fi utilizat pentru a memora $alori reale simpl precizie este : a$ baniH real% b$ real bani% c$ float bani% d$ bani float% 2E. 0efinirea corect a unei $ariabile ntregi numit total iniializat cu zero este : a$ totalH integer35% b$ total35= int% c$ int total35% d$ int35 = total% 4;. Ce numr este ec3i$alent cu A4e3 8 a$ C:555 b$ C:55 c$ .55: d$ .555:
Funcia putc, afieaz caractere colorate n conformitate cu culoarea curent setat n modul text de funcionare al ecranului. 5a re$enirea din funcia putc, se returneaz $aloarea parametrului de apel, adic codul imaginii afiate. "rototipul funciei se afl n fiierul conio.,. !emplul 2: S se scrie un program care citete un caracter imprimabil i)l afieaz apoi pe ecran. #include<conio.h> void main($ { putch(getch($$% & !emplu 4 : Se citete de la tastatur un caracter fr ecou, se afieaz caracterul, apoi se trece cursorul pe linia urmtoare. #include<conio.h> void main($ { clrscr($% putch(getch($$% putch(IFnE$% getch($% &
Speci(icator Pe G P P( Pg G PL Pi Pd Po P! Pu Ps Pc
Semni(ica"ie Bum$r real de (orma iiii.zzzzzz G unde nr.5ecimale z este dat de preci5ie 3& implicit4 Bum$r real de (orma i.zzzzzz G unde nr. 5ecimale este dat de preci5ie 3& implicit4 #i pentru partea =ntreag$ este (olosit$ doar o ci(r$ Bum$r real care suprim$ caracterele terminale care nu in(luen"ea5$ valoarea G adic$ ci(rele 2 de la s(>r#it #i punctul 5ecimal G dac$ are partea (rac"ionar$ 2 Bum$r =ntreg =n ba5a .G 12G sau 1& =n (unc"ie de primul sau primele dou$ caractere Bum$r =ntreg =n ba5a 12 Bum$r =ntreg =n ba5a . U nu este necesar$ scrierea ci(rei 2 la =nceputul num$rului Bum$r =ntreg =n ba5a 1& U nu este necesar$ scrierea secven"ei 2! la =nceputul num$rului Bum$r =ntreg ($r$ semn Tir de caractere Kn singur caracter
!presiile afiate se pot alinia la st%nga sau la dreapta i se poate fora afiarea semnului astfel : semnul plus afieaz e!plicit semnul e!presiei semnul minus aliniaz e!presia afiat la st%nga absena oricrui semn semnific alinierea e!presiei afiate la dreapta "entru numerele ntregi i pentru irurile de caractere se poate specifica un numr care nseamn spaiul folosit pentru afiare. 0ac spaiul necesar este mai mic sau egal cu numrul specificat, atunci se $or afia suplimentar spaii -sau zerouri, dac numrul este precedat de cifra ;. p%n la completarea spaiului de afiare. "entru numerele reale se pot specifica, opional, semnul pentru aliniere i dou numere separate prin punct. "rimul precizeaz dimensiunea total de afiare, iar al doilea precizia, adic numrul de zecimale afiate. n cazul irurilor de caractere, specificarea a dou numere separate prin punct indic faptul c primul numr reprezint numrul de caractere din ir care se $or afia, iar al doilea reprezint limita superioar de tiprire, completarea fc%ndu)se cu spaii la dreapta sau st%nga, n funcie de modul de aliniere. "oate apare fenomenul de trunc3iere a irului afiat n cazul n care dimensiunea acestuia depete limita inferioar. n cazul unui numr ntreg, al doilea numr indic o completare la st%nga cu zerouri p%n se a&unge la dimensiunea de afiare specificat. !emple: Valoarea datei Speci(icator ?(i#are 7.292<E4=< O<f 7.292<E7 247.=>4 O>f 247.=>4;;; 7.292<E4=< O>.4f 7.29 247.=>4 O2;.2f 247.> )247.=>4 O2;.2f )247.> 7.292<E4=< O2;.;f 7 247.=>4 O2;.;f 249 Numrul zecimalelor se definete prin precizia indicat n specificatorul de format. 0ac ea este absent atunci se afieaz = zecimale. Iltima cifr afiat este rotun&it prin lips sau prin adaos. !emple: Valoarea datei Speci(icator ?(i#are 7.292<E4=< Oe 7.292<E7eL;; 247.=>4 Oe 2.47=>4;eL;4 247.=>4 O.2 2.4 L;4 ;.=>7 O =.>7;;; );2 247.=>4 O.; 2 L;4
Numrul zecimalelor se definete prin precizia indicat n specificatorul de format. 0ac ea este absent atunci se afieaz = zecimale. Iltima cifr afiat este rotun&it prin lips sau prin adaos. !ponentul ncepe cu litera e dac specificatorul de format se termin cu e i cu dac el se termin cu . Irmeaz un semn plus sau minus dac e!ponentul este negati$. 0up semn se afl un ntreg zecimal de cel puin dou cifre. !emplul 2: folosirea afirii cu format pentru numere ntregi #include<stdio.h> void main($ { int nr3:+21% printf(Fn nr3Md#=nr$% // nr0)%$1 printf(Fn nr3MDdN#=nr$% // nr0)%$11 printf(Fn nr3M>d#=nr$% // nr0 )%$1 printf(Fn nr3MD>dN#=nr$% // nr0)%$1 1 printf(Fn nr3M>.4d#=nr$% // nr0"""")%$1 printf(Fn nr3MD>.4dN#=nr$% // nr0"""")%$11 & !emplul 4 : folosirea afirii cu format pentru numere reale #include<stdio.h> #include<conio.h> void main($ { double G312+.512+:9>?% clrscr($% printf(Fn G3Mf#=G$% // x01$%!"1$%)+ printf(Fn G3MDfN#=G$% // x01$%!"1$%)+1 printf(Fn G3M1>f#=G$% // x0 1$%!"1$%)+ printf(Fn G3MD1>fN#=G$% // x01$%!"1$%)+ 1 printf(Fn G3M.15f#=G$% // x01$%!"1$%) +-"" printf(Fn G3MD.15fN#=G$% // x01$%!"1$%) +-""1 printf(Fn G3M12.:f#=G$% // x0 1$%!"1$% printf(Fn G3MD12.:fN#=G$% // x01$%!"1$% 1 getch($% & !emplul 7 : folosirea afirii cu format pentru irurile de caractere #include<stdio.h> #include<conio.h> void main($ { char sK::L3# estare comportament printf pentru siruri "#% clrscr($% printf(Fnsirul3Ms#=s$% printf(Fnsirul3MDsN#=s$% printf(Fnsirul3M95s#=s$% printf(Fnsirul3MD95sN#=s$% printf(Fnsirul3M95.>5s#=s$% printf(Fnsirul3MD95.>5sN#=s$% printf(Fnsirul3M25.+5s#=s$% printf(Fnsirul3MD25.+5sN#=s$% getch($% &
$alorile astfel construite sunt stocate la adresele $ariabilelor specificate ca argumente P Ordinea formatelor $ariabilelor trebuie s coincid cu ordinea listei adreselor $ariabilelor n care se face citirea. Fiecare $ariabil care se dorete a fi citit trebuie corelat cu un format specific. 1bserva"ie :?ndiferent de formatul folosit, la nt%lnirea unui spaiu n introducerea datelor, este terminat citirea $ariabilei. "entru funcia de citire scan( trebuie folosit operatorul adres S[R. "entru $ariabilele citite cu aceast funcie trebuie precizate adresele la care se stoc3eaz n memoria calculatorului $alorile $ariabilelor. Funcia $a introduce $alorile citite direct la acele adrese. Singurul caz n care nu este obligatorie folosirea operatorul adres pentru citirea $alorii unei $ariabile cu funcia scan( este citirea unui ir de caractere . 1bserva"ie : citirea cu a&utorul funciei scan( a irurilor de caractere care conin spaii este imposibil. n cazul n care formatul specificat este necorespunztor, rezultatul obinut poate fi nepre$zut. /aloarea ntoars de scan( n caz de succes, este numrul de $ariabile care au fost citite corect. 0ac nu a fost citit nici o $ariabil -de e!emplu s)a introdus un ir n loc de un numr . funcia ntoarce $aloarea ;. 0ac apare o eroare naintea oricrei citiri i asignri, funcia returneaz 1+ -constant de sistem a$%nd $aloarea ntreag 62.. Specificatorii de format ai funciei scan(34 sunt prezentai n tabelul urmtor: Cod Pc Pd Pi Pe P( Pg Po Ps P! Pp Pn Pu PY Z Semni(ica"ie Cite#te un caracter Cite#te un =ntreg 5ecimal Cite#te un =ntreg 5ecimal Cite#te un num$r (loat Cite#te un num$r (loat Cite#te un num$r (loat Cite#te un num$r octal ($r$ semn Cite#te un #ir de caractere Cite#te un num$r ,e!a5ecimal ($r$ semn Cite#te un pointer ?rgumentul asociat prime#te o valoare =ntreg$ egal$ cu num$rul de caractere deja citite Cite#te un num$r =ntreg ($r$ semn Scanare pentru un set de caractere
O caracteristic foarte interesant a funciei scan(34 este numit scanset. In specificator scanset se poate crea prin includerea unei liste de caractere n interiorul unor paranteze drepte. Spre e!emplu, iat un specificator scanset conin%nd literele *CDC, : PY?QCZ. C%nd scan(34 nt%lnete un specificator scanset, se ncepe citirea caracterelor i depozitarea lor ntr)un tablou punctat de argumentul corespunztor. Citirea $a continua c%t timp caracterul citit face parte din scanset. n momentul n care caracterul citit nu face parte din scanset, funcia scan(34 oprete citirea pentru acest specificator i a$anseaz la urmtorul specificator din irul de control. Folosind semnul A n scanset se specific un domeniu. 0e e!emplu, urmtorul specificator se refer la literele de la *C, la *M, : PY?'IZ. Ineori c%nd scansetul este mare, este mai uor s specificm ceea ce nu face parte din scanset. "entru a realiza acest lucru, setul trebuie precedat de semnul X. 0e e!emplu, YX212345&*./Z. C%nd scan(34 nt%lnete acest scanset, $a citi orice caracter e!cept%nd cifrele de la ; la E. Se poate suprima asignarea unui c%mp pun%nd un asterisc imediat dup semnul P. Cceast proprietate este foarte util c%nd introducem informaii care conin i caractere de care nu a$em ne$oie. 0e e!emplu, d%ndu)se : int O=(% scanf(MdMNcMd#=PO=P($% i datele de intrare sub forma : 555'2345, scan(34 $a asigna $aloarea <<< $ariabilei j, $a nltura semnul A i $a asigna $aloarea 479< $ariabilei 8. ?at un e!emplu de scanset care accept caractere litere mici i litere mari. ncercai s introducei c%te$a litere, apoi orice alt caracter i apoi din nou litere. 0up ce apsai tasta nter numai literele introduse naintea caracterelor care nu au fost litere $or fi coninute n str. #include<stdio.h> void main($ { char strK45L% printf(0ntroduceti litere si apoi orice altcevaFn#$%
scanf(MKaDQ,D1L#=str$% printf(Ms#=str$% & 0ac dorii s citii un ir conin%nd spaii folosind funcia scan(34G $a trebui s utilizai scansetul urmtor: #include<stdio.h> void main($ { char strK45L% printf(0ntroduceti litere si spatiiFn#$% scanf(MKaDQ,D1 L#=str$% printf(Ms#=str$% & Se pot specifica de asemenea semne de punctuaie, simboluri i cifre, astfel c, $irtual, se poate citi orice tip de ir. "rogramul urmtor ilustreaz efectul pe care l are prezena unor caractere non)spaiu n irul de control. l ne permite s introducem o $aloare zecimal, cifrele din st%nga punctului zecimal sunt asignate unei $ariabile ntregi, iar cele din dreapta punctului zecimal sunt asignate unei alte $ariabile ntregi. #include<stdio.h> void main($ { int O=(% printf(0ntroduceti un numar Qecimal H #$% scanf(Md.Md#=PO=P($% printf(stangaHMdFt dreaptaHMd#=O=($% & 1bserva"ie % 0ac este posibil apariia erorilor la introducerea datelor, este necesar ca imediat dup apariia unei erori s folosim una din funciile : ((lus,3stdin4U ) pentru golirea buffer)ului fiierului standard de intrare ((lus,all34U ) pentru golirea tuturor buffer)elor fiierelor !emple : char aK25L% int n% scanf(MK,D1Ls#=a$% '(citete un ir format numai din litere mari (' scanf(MKaDQ,D1Ls#=a$% '( citete un ir format din litere mari si mici (' scanf(M+d#=Pn$% '( citete un numr ntreg de cel mult trei cifre ('
e$
scanf(RMd MR=Pn=Ps=PG$%
9. Fie declaraia : char sK25L% Care din sec$enele de mai &os citesc corect un ir de caractere s 8 a$ scanf(RMcR=s$% b$ scanf(RMcR=Ps$% c$ scanf(RMsR=s$% d$ scanf(RMsR=Ps$% e$ scanf(RMR=s$% f$ scanf(RR=s$% <. Fie declaraia : char strK45L% Care din urmtoarele sec$ene $or face citirea unui ir de ma!im :; caractere care s nu conin caracterul @.A 8 a$ scanf(RMK.LsR=str$% b$ scanf(RMKT.LsR=str$% c$ scanf(RM45KT.LsR=str$% d$ scanf(RM45KT.LcR=str$% e$ scanf(RM45K.TLsR=str$% =. Fie declaraia : char sK155L% Care din urmtoarele sec$ene $a face citirea unui ir de caractere care s conin numai cifre8 a$ scanf(RMK512+:9>?4ALR=s$% b$ scanf(RMsR=s$% c$ scanf(RMKT5DALsR=s$% d$ scanf(RMK5ALsR=s$% e$ scanf(RMK5DALsR=s$% f$ scanf(RMKU5UDUAULR=s$% g$ scanf(RMKU5U...UAULR=s$% >. Cum putem introduce un numr ! ntreg de ma!im 9 cifre care s nu conin cifra ;8 a$ scanf(M:d#=PG$% b$ scanf(M:KT5Ls#=G$% c$ scanf(M5:d#=PG$% d$ scanf(Md5#=PG$% :. Fie declaraiile : int aG bG cU i apelul: scanf(RM2dM+dM:dR=Pa=Pb=Pc$% Care $a fi $aloarea $ariabilelor dup introducere, dac la intrare se tasteaz 12345&8 a$ a312+ = b3+:9 = c39> b$ a312 = b3+:9 = c3> c$ a312+:9> = b35 = c35 E. Ce se nt%mpl dac se folosete sec$ena urmtoare 8 int m= n% scanf(RMd=MdR=Pm=Pn$% a) obinem eroare la compilare pentru c n interiorul formatului s-a pus virgul
b) nu apar erori la compilare2 deoarece n interiorul formatului s-a pus virgul, nu se vor citi corect numerele c) nu apar erori la compilare2 deoarece s-a pus virgul, numerele introduse trebuie separate prin virgul d) nu apar erori la compilare2 pentru numerele introduse poate fi folosit orice secven delimitatoare 2;. Fie sec$ena urmtoare : int a% char strK25L% scanf(RMiR= Pa$% fflush(stdin$% gets(str$% 0atele de intrare se introduc astfel : 155 abcd Ce se ntampl dac scoatem funcia ((lus, din sec$ena anterioar 8 a) este semnalat eroare la compilare b. nu se mai citete de pe linia a doua irul 3abcd3, acesta lu4nd valoarea 33(ir vid) c. ambele date sunt citite corect, numrul lu4nd valoarea 155 iar irul valoarea 3abcd3 22. Fie urmtoarele declaraii de $ariabile: int a% float G% char m% Care dintre instruciunile de mai &os realizeaz citirea corect a $ariabilelor a,! i m8 a$ scanf(Md Mf Mc#=Pa=PG=Pm$% b. scanf(Md=Mf=Mc#=a=G=m$% c$ scanf(Mf.Md.Mc#=Pa=PG=Pm$% d$ scanf(a3Md=G3Mf=c3 Mc#=a=G=m$% e$ scanf(a3MdFnG3MfFnc3McFn#= Pa=PG=Pm$% 24. Fie declaraiile: int a3+:% float G3>.29% "recizai care dintre instruciunile de afiare urmtoare trebuie e!ecutat astfel nc%t s se afieze pe ecran r%ndul de mai &os: +:##H#>.295 unde prin @QA am simbolizat caracterul spaiu. a$ printf(FnM:dHMD15f#=a=G$% b$ printf(FnMD:dHM>.+f#=a=G$% c$ printf(FnM>dHM15f#=a=G$% d$ printf(FnMDdHMD.+f#=a=G$% e$ printf(FnMdHMf#=a=G$%
27. 0ac de la tastatur se introduce caracterul AaA, iar codurile literelor mici sunt succesi$e, ncep%nd cu E>, ce afieaz programul urmtor8 #include<stdio.h> #include<conio.h> void main($ { char c= p% p3getchar($H int n3pB29A% c3n% putchar(c$% & a) % + b) &a' c) &d' b. 1"" e) programul este greit 29. Care dintre sec$enele de mai &os nu conin erori i afieaz cu$intele R"rogramA i RsimpluA unul sub altul -fiecare pe c%te un r%nd. 8 a$ { printf(<rogram#$% printf(Fnsimplu#$% & b$ { printf(<rogramFn#$% printf(simplu#$% & c$ { printf(<rogramFnsimplu#$% printf(Fn#$% & d$ { printf(<rogram#$% printf(simpluFn#$% & e$ nici unul dintre programele anterioare 2<. Funciile getc,ar34, getc,34 i getc,e34 citesc de la tastatur un caracter. Ce deosebiri e!ist ntre cele trei funcii 8 a. funciile getchar i getche realizeaz citire cu ecou, iar getch citete caracterul fr ecou b. funcia getchar citete caracterul cu ecou, iar funciile getche i getch realizeaz citirea fr ecou c. funciile getchar i getch preiau caracterul numai dup apsarea tastei 56758
d. funciile
getchar i getche preiau caracterul de ndat ce a fost tastat, fr s mai atepte 9confirmarea* cu 56758 e) toate cele trei funcii au prototipul n (eader-ul conio!( 2=. char G3E,E% putchar(G$% putchar(GB1$% 1eferindu)ne la codul de mai sus i presupun%nd c funcia putc,ar ia ca argument un ntreg, ce $om a$ea la ieire dup e!ecuie 8 a) #A b) A++ c) A# d) :e va genera o avertizare la compilare i execuia nu este cea ateptat 2>. Inde scrie funcia print(34 8 a$ stdout b$ stdio c$ stdin d$ stderr 2:. !Es a fun# language" Selectai codul care $a produce ieirea de mai sus: a$ printf(!Es aF#funF# language"Fn#$% b. printf(!Es a F#funF#language"#$% c$ printf(!Es aFn fun# language"Fn#$% d$ printf(!Es aFn F#funF# language"Fn#$% 2E. short int G% '(presupunem c ! este pe 2= bii(' Care este numrul ma!im care poate fi tiprit folosind printf(MdFn#=G$, presupun%nd c ! este declarat aa cum am artat mai sus 8 a) 1$b) $ c) %$-+d) + %+ 4;. Fie sec$ena : printf(FnM15.5f#=G$% "entru G3+.1:19A2>9 se $a afia : a) % b) %!1) c) %!1)1 d) %!1)1 ;%
42. Fie sec$ena : printf(Fn.12#=G$% "entru G312+.>?2 se $a afia : a) 1!$5<"$ b) 1!$%+5<"$ c) 1$%5<"$ d) 15<"$
44. Fie sec$ena : printf(FnNM19.15/N#=G$% "entru G3#program cBB#, se $a afia : a. 1 program c<1 ( spaii n fa) b) 1program c<<1 c. 1program c1 d) 1 program c<<1 () spaii n fa) 47. Fie sec$ena : printf(FnNM5?dN#=G$% "entru G312+, se $a afia : a) 1""""1$%1 b) 11$%1 c) 1 1$%1 d) 11$% 1 49. Fie sec$ena : printf(FnM.:e#=G$% "entru G3D12+.9e25, se $a afia : a. =1!$% "e<$$ b) =1!$% e<$$ c) =1$!% ""e<$1 d) =1!$% "e<$" 4<. Care este efectul apelului funciei printf(MG#=a$, unde a este o $ariabil de tip ntreg de $aloare 2!?+5 : a) "xA> b) %+ c) A> d) valoarea binar a variabilei a 4=. Care este efectul urmtorului program : #include <stdio.h> #include <conio.h> void main(void$ { putchar(getche($DI,EBEaE$% printf(Fn#$% & a) citete i afieaz un caracter b) citete o liter mare i afieaz litera mic corespunztoare c) citete o liter mic i afieaz litera mare corespunztoare d) citete un caracter 4>. Se definete constanta simbolic S6J astfel: #define /06 2*,.2J ,V.0 262# fectul apelului lui printf(MD15.>s#=/064 este urmtorul : a) 5?A@56 AA@B7585 b) 5?A@56 () spaii in fa) c) 5?A@56 () spaii dup) d) 5?A@56 AA@ 4:. Care este efectul apelului funciei printf(Mo#=a$ unde a este o $ariabil de tip ntreg de $aloare 2!?+5 :
a) " %+ c) A> d) %+
b)
"xA>
4E. Se d urmtorul program : #include <stdio.h> void main($ { double G% scanf(Mlf#=PG$% printf(Me#=d$% & fectul acestui program este : a) citete i afieaz un numr real b) citete un numr cu exponent i l afieaz c) citete un numr real i afieaz valoarea sa cu exponenial d) afieaz un numr real 7;. Care este efectul instruciunii printf(Mu#=G$ unde ! este o $ariabil de tip ntreg de $aloare 2!?+25 : a) =$"++; b) A>$ c) )).%d) "xA>$ 72. Care este efectul apelului funciei printf(MG#=b$ unde b este o $ariabil de tip ntreg de $aloare 2!12?QC : a) 1$A# b) 1$A#C c) "x1$A#C d) $A#C 74. Care este efectul apelului functiei printf(MlG#=b$ unde b este o $ariabil de tip ntreg n dubl precizie de $aloarea 2!12?QC : a) "x1$A#C b) 1$A#C c) A#C d) "1$A#C
77. Fie urmtorul program : #include <stdio.h> main($ { int (% scanf(Md#=P($% printf(MG#=($% & n urma lansrii n e!ecuie a programului, $aloarea lui 8 introdus $a fi &5. Care $a fi rezultatul afiat 8 a) + b) )1 c) %$ d) +" 79. "recizai care sunt $alorile afiate, dac se $or citi n ordinea indicat $alorile numerice 5 2 '3: { int a= b%
scanf(MdMdMd#=Pa=Pb=Pa$% printf(Md#=a$% printf(MdFn#=b$% printf(Md#=aBb$% & a) $ b) =% $ -1 c) $ d) exist erori de sintax 7<. Care sunt $alorile tiprite de programul urmtor : void main(void$ { int a=b% a39% b31+% printf(MdBM2d3M2d#=a= b= aBb$% & a$ aBb3aBb b$ 9B1+314 c$ 9B1+H2314H2 d$ aBbH23aBbH2
7=. Scriei o instruciune care afieaz $aloarea $ariabilei ntregi total : a. printf(MsFn#=EtotalE$% b$ printf(MdFn#=total$% c$ printf(IMsFnE=#total#$% d$ printf total% 7>. Scriei o instruciune care citete un caracter i)l memoreaz n $ariabila litera : a$ scanf(IliteraE$% b$ scanf(litera#$% c$ scanf litera% d$ scanf(Mc#=Plitera$% 7:. Scriei o instruciune care afieaz $aloarea unei $ariabile de tip real small_value cu trei zecimale e!acte : a$ printf(Ismall)valueH+E$% b$ printf(M.+fFn#=small)value$% c$ printf(MsFn#=#small)valueH+# $% d$ printf M.+f#=small)value%
7. Operatori de multiplicare 9. Cdunare , scdere <. 0eplasri =. 1elaionali >. galitate :. E. 2;. 22. 24. 27. Op. condiional 29. Operatori de atribuire
2<. /irgula
Cei din prima categorie au prioritatea ma!im. "recedena descrete cu c%t crete numrul categoriei din care face parte operatorul. Operatorii din aceeai categorie au acelai grad de preceden. Ordinea de e$aluare a operaiilor este de la st%nga la dreapta, cu e!cepia operatorilor unari -categoria 4., a operatorului condiional -categoria 27. i a operatorilor de atribuire -categoria 29. care au ordinea de e$aluare de la dreapta la st%nga. #otui ordinea de efectuare a operaiilor nu este ntotdeauna perfect determinat. Se poate face o reorganizare a e!presiilor pentru a obine un cod mai eficient, dar ordinea de efectuare a
operaiilor nu este strict definit. n funcie de conte!t, acelai operator poate a$ea semnificaii diferite. Spre e!emplu operatorul [ -ampersand. poate fi considerat ca : ! operatorul binar S? pe bii -a [ b. ! operatorul unar, adresa unui operand -[a. Semnificaia depinde de numrul de argumente folosite, unul sau dou .
n concluzie, re5ultatul este convertit la tipul variabilei din membrul st>ng al atribuirii. !emplul 7: n operaiile cu constante conteaz dac ele sunt de tip ntreg sau real. int i=O% i39W2B?W2% '( rezultatele mpririi dintre dou numere ntregi sunt con$ertite tot la numere ntregi i iU4L7U< (' O39.W2B?W2.% '( rezultatele mpririi dintre un numr real i un numr ntreg sunt numere reale, 4.<L7.<U=.; , deci &U= (' Spre deosebire de ceilali operatori aritmetici, operatorii de incrementare i decrementare sunt specifici limba&elor de asamblare. i sunt mult mai rapizi, efectul lor const%nd n mrirea'micorarea $ariabilei cu 2 n modul urmtor : ! WWvar sau varWW : $ariabila var este mrit cu o unitate, n primul caz, nainte de utilizarea ei -preincrementare., iar n al doilea caz, dup utilizarea ei -postincrementare . ! ''var sau var'' : $ariabila var este micorat cu o unitate, n primul caz, nainte de utilizarea ei -predecrementare., iar n al doilea caz, dup utilizarea ei -postdecrementare. Cre importan dac operatorii de incrementare i decrementare se folosesc la st%nga sau la dreapta $ariabilei. !emplul 9: int i=O3?% i3OBB% '( iU> , &U: (' sau i3BBO% '( iU: , &U: (' !emplul <: int a32=b3+=c=d% c3d3(aBB B1$CbDD% '( aU7 , bU4 , dU; , cU; ('
!emplul 2: 0ou forme ec3i$alente pentru $erificarea egalitii lui ! cu ;. G335 sau "G !emplul 4 : Bai multe $ariante de $erificare a condiiei ca ! i V s fie ambii ;. a$ G335 PP X335 b$ "G PP "X
c$ "(G"35YYX"35$ d$ "(GYYX$
Operatorii ;;, respecti$ VV, sunt numii operatori de deplasare pe bii la st%nga, respecti$ la dreapta. i au sinta!a : a<<n '( ec3i$alent cu aD2n (' a>>n '( ec3i$alent cu a)2n (' !emplul 2: Fie declaraia int O% atunci e!presia OP1 are $aloarea ; dac j este par i $aloarea 2, dac j este impar. !emplul 4: int t31=O3>=(=n% t31<<O% '( tU2(4= (' (3t>>2% '( TU4='44U49 (' n3tP(% '( nU; pentru c t i T nu au nici un bit de pe aceeai poziie egal cu 2 (' !emplul 7: Fie constanta 2u, o constant ntreag de tip unsigned care se reprezint pe 2= bii, deci este practic reprezentat ca 2= de ;. Operaia ]32u4 neag cei 2= bii de ; care $or lua $aloarea 2, deci se $a obine $aloarea 42=)2U=<<7<. !emplul 9: #iprirea rezultatului operaiilor pe bii a dou numere. #include<stdio.h> void main($ { int a=b% printf(introduceti cele doua numere H $% scanf(Md Md#=Pa=Pb$% printf(aYb3MdFn#=aYb$% printf(aPb3MdFn#=aPb$% printf(aTb3MdFn#=aTb$% & !emplul <: Operatorii ^ i [ pot fi folosii pentru a seta sau terge anumite c%mpuri de bii. -(P1<<O$>>O % '( determin $aloarea bitului de pe poziia & (' (3(PZ(1<<O$% '( seteaz bitul de pe poziia & la ; (' (3(Y1<<O% '( seteaz bitul de pe poziia & la 2 (' (3(T1<<O% '( complementeaz bitul de pe poziia & (' !emplul =: "rogramul determin numrul format prin e!tragerea a n bii consecuti$i dintr)un numr dat ! ncep%nd cu poziia p. #include<stdio.h> void main($ { int n=p=G% printf(numarul H $% scanf(Md#=PG$% printf(numarul de biti H $% scanf(Md#=Pn$% printf(poQitia H $% scanf(Md#=Pp$% printf(numarul este H Md#= (G>>p$PZ(Z5<<n$$% &
n partea st%ng a operatorului [ se elimin primii p bii prin deplasarea la dreapta. "entru a e!trage cei n bii, se realizeaz n partea dreapt un filtru, set%nd primii n bii pe 2 i terg%ndu)i pe ceilali. !emplul >: In caz concret de utilizare a operaiilor la ni$el de bit este cel al reprezentrii mulimilor de $alori. Cstfel, s presupunem c dorim s inem e$idena literelor ma&uscule dintr)un ir de caractere introduse de la consol. n acest scop se poate folosi c%te un singur bit pentru a codifica absena -;. sau prezena -2. fiecrei litere. 0eoarece alfabetul latin este format din 4= litere, pentru a pstra e$idena tuturor ma&usculelor trebuie s folosim o $ariabil -m. de tip long -74 de bii.. 0intre cei 74 de bii din reprezentarea $ariabilei $om utiliza numai 4=, informaia referitoare la o liter oarecare ! fiind pstrat n bitul din poziia MIN'!. n absena ma&usculelor, toi biii fiind ;, condiia de mulime $id se e!prim sub forma \m. ?ncluderea n mulime a unei ma&uscule ! se realizeaz prin intermediul atribuirii: m3mY(1S<<I1EDG$ Se remarc utilizarea constantei 1@, de tip long. 0ac n locul ei s)ar fi utilizat constanta 2 -implicit de tipul int ., atunci informaiile referitoare la primele 2; litere din alfabet nu ar fi fost actualizate, deoarece rezultatul deplasrii la st%nga, cu mai mult de 2< bii, a unei $alori de tip int este nul. /erificarea prezenei n mulime a caracterului ! se poate realiza n urmtoarele dou $ariante : mP(1S<<I1EDG$ sau (m>>I1EDG$P1
'( se afieaz dac numrul T este sau nu diferit de ; (' !emplul 7 : 0eterminarea ma!imului a trei numere. maG3(a>b$\(a>c\aHc$H(b>c\bHc$% !emplul 9 : #iprete relaia dintre dou $alori ntregi. printf(Md Mc MdFn#=a=(a>b$\I>EH(a<b$\I<EHI3E=b$%
d$ e$ f$ g$
E. $aluai rezultatul i corectitudinea urmtoarelor sec$ene : int i31=O32=(3D?% double G35.5=X32.9% a$ DiD9NO>3(B1 b$ +<O<9 c$ iBOB(33D2NO d$ GW""X e$ GPPiYYOD+ 2;. Ce $aloare $or a$ea $ariabilele ! si : dup sec$ena de instruciuni 8 int G3?=X% X3G<<32% a) %$ b) $. c) +) 22. S se determine care din urmtoarele e!presii sunt corecte : a$ Q3GBB33:YYXDD<9% b$ a3G33X33Q% 24. 1ealizai cu a&utorul operatorului condiional `_` urmatoarele operaii : a. determinarea valorii absolute a unui numr G b) determinarea minimului n valoare absolut a dou numere c) determinarea maximului a trei numere 27. Ce face urmtorul program 8 #include<stdio.h> main($ { int i=O% scanf(RMdM dR =Pi =PO$% printf(RFn i3Md = O3MdR= i= O$% i3iDO = O3OBi = i3ODi% printf(RFn i3Md = O3MdR= i= O$% & a) realizeaz un calcul algebric oarecare b. adun valorile absolute ale lui i i O c. intersc(imb valorile variabilelor i i O 29. Care din cele trei e!presii sunt ec3i$alente ntre ele 8 a$ 1<<nB1% b$ 1<<(nB1$ c$ (1<<n$B1 2<. Fie e!presia : (int$ (s[rt(n$$ Cre importan folosirea perec3ii de paranteze rotunde pentru tipul int 8 0ar pentru sart3n4 8
2=. S se transcrie sub form de e!presii de atribuire e!presiile de mai &os : a$ X32G+D4G2B?GD1 b$ X3(aGBb$W(cGBd$ c$ a3maG(GBX=GDX$ d$ m3maG(+G2B1=>GD25$ e$ G31= 9a+D2= 4a2B+= ?aD1 f$ G3aNbNcD(aDb$(aDc$B(bDc$ g$ dac@ (GBX$"35 atunci Q3GW(GBX$ altfel Q35 2>. S se transcrie sub form de e!presie de atribuire : a) E0F$x<1"F b) a0max(x,E,z) c) dac xGE si xGz atunci u0v, altfel u0v/$ d) dac xGE sau xGz,atunci p0a<b,altfel p0a-b e) dac nici una din condiiile iGj, iGH, iGn nu are loc, atunci x0a, altfel x0b f) dac c are ca valoare codul A:CBB al unui caracter alb, atunci i se mrete cu 1, altfel se micoreaz cu 1 g) dac aGbG1 i aI1", atunci x0a/b, altfel x01"" () dac c are ca valoare un cod diferit de codul caracterelor albe, atunci i0x<E, altfel i0x-E i) dac valorile variabilelor a,b si c pot reprezenta lungimile laturilor unui triung(i, atunci x are ca valoare perimetrul acestui triung(i, altfel are valoarea "! 2:. Fie declaraia : int G=i=O% S se scrie o e!presie care are ca $aloare ntregul format cu j bii din ! , ncep%nd cu al i)lea bit. 2E. double G31W2.5B1W2% printf(G3M.2fFn#=G$% Ce se $a tipri dup e!ecuia codului de mai sus 8 a) x0"!"" b) x0"!$ c) x0"! " d) x0"!4;. Care $a fi $aloarea lui i dup e!ecuia urmtoarelor instruciuni : i3:% i3i\14H2% a) ) b) 1. c) $ d) ; 42. Se declar $ariabila unsigned int a35G+]] Care este $aloarea e!presiei a>>+ 8 a) %>> b) "x#> c) "x-> d) "x%>C
44. Se dau int a35=b31=c32!/aloarea $ariabilei cp din e!presia: cp3reQ3aBbBc>cPPbNc<aBbNc este : a) 1 b) " c) $ d) 1! 47. Se d $ariabila b35G]]15 de tip unsigned int i e!presia b>>+. fectul acestei e!presii este : a) 1>>$ b) valoarea binar a variabilei b c) "x>>1% d) "x1>5$ 49. Se dau $ariabilele de tip ntreg a35G129,b35:99=c32A+=d35G,],G=X i e!presia G3X3(a33bPa33c$Td. /ariabilele ! si : au $aloarea : a) A> b) "$ c) 1"1"1111 d) "xA> 4<. Fie e!presia de mai &os : (G>D1$ PP "(G>1$YY(G>39$ ?nter$alul selectat este : a. x (-1,1J K , L) b. x (-L ,-1) K1,L ) c. x (- L,-1) (1, ) d. x K-1,1J K ,L ) 4=. Care este inter$alul descris de e!presia logic de mai &os 8 (G<3D2$YY(G>D1$PP"(G>31$YY(G>9$ a. x (-L , -$J (-1,1J K , L ) b. x (-L ,-$J K-1,1J ( , L ) c. x(-L ,-$J (-1,1J K , L ) d. x (-L ,-$J (-1,1) ( , L ) 4>. Care din urmtorii operatori relaionali este in$alid 8 a$ 33 b$ <> c$ < d$ > 4:. Care din urmtorii operatori are prioritatea cea mai mic 8 a$ 33 b$ B c$ C d$ " 4E. 0up e!ecuia sec$enei de cod, ce $aloare $a a$ea $ariabila 5 8 int Q% int G39% int X3D15% QH3GDDX% a) =1" b) = c) d) 1 7;. Ce rezultat $a produce operaia : 5G- P 5G9
a) "x5 c) "x1
b) "x> d) "x.
72. Fie relaia :W9Y+B:M9P+. Care este rezultatul e$alurii ei 8 a) ) b) % c) 1 d) 1 74. Fie sec$ena de cod : int G31N2B:W:B+M9% /aloarea lui ! este : a) se va genera eroare c) +
b) % d)
77. "resupun%nd urmtoarea sec$en de cod : int a39=b32% float c3aWb% Care $a fi $aloarea lui c 8 a) $! b) $ c) % d) 1 79. C$em urmtorul program : int main($ { float G= X= Q% G31.+% X31.2% Q3GMX% return 5% & 5a sf%ritul programului $ariabila 5 $a a$ea $aloarea : a) "!1 b) " c) 1 d) programul genereaz eroare la compilare 7<. Fie sec$ena : double G=X% . G3A% X3+(GD15$% .. Care afirmaie este ade$arat : a) E0-% b) E0% c) eroare la compilare deoarece lipsete operator d) eroare la compilare deoarece nu se poate scdea un double 7=. Irmrii sec$ena de mai &os i precizai $aloarea $ariabilei :: int a= b3+% int G32% int Q32NbBG% a) $ b) % c) ) d) e) secvena este eronat 7>. Wtiind c n conformitate cu standardul CSC?? literele mari au codurile succesi$e ncep%nd cu =<, precizai care dintre $ariabilele !, :, 5 i u $or a$ea $aloarea 64 la finele e!ecuiei programului de mai &os. void main($ { int G3D+= X31= Q32= u% GBB%
//
radical
b$ c$ d$ e$
e) nici una
7:. Se consider $ariabilele ntregi !,: i 5, fiind cunoscute $alorile G3: i X32. Care dintre e!presiile de mai &os are $aloarea ; 8 a$ GBX>GMXB1 b$ Q3(GDX"35$ c$ GD2NX35 d$ "G e$ G PP X 7E. Wtiind c a, b, c, d, ! sunt $ariabile reale cu a<3b i c<3d, scriei sub form de e!presie : G Ka= bL sau G Kc= dL. a. (G>3aYYG<3b$PP(G>3cYYG<3d$ b$ ((G>3a$PP(G<3b$$YY((G>3c$PP(G<3d$$ c$ ("(G<a$PP"(G>b$$YY("(G<c$PP" (G>d$$ d$ ((G>3a$YY(G<3b$$PP((G>3c$YY (G<3d$$ e$ (G>3a PP G<3b$ YY (G>3c PP G<3d$ 9;. Fie declaraiile de $ariabile: int G3:= Q31+% float Q% Care dintre instruciunile de mai &os nu atribuie corect $aloarea :.< $ariabilei 5 8 a$ Q3(GBX$W2.% b$ Q3((float$GBX$W2H c$ Q3(GBX.$W2% d$ Q3(GBX$W(float$2% e$ Q3(float$(GBX$W2% 92. Ce afieaz programul urmtor, dac $aloarea citit de la tastatur este 4 8 #include<stdio.h> void main($ { int G=X=Q% scanf(Md#= PG$% X3DDG% XB3+% Q3GD2NXBB% printf(Md#= QBB$% & a) =; b) =. c) =d) =+ e) = 94. Fie trei $ariabile ntregi a, b, !. "recizai care dintre e!presiile condiionale de mai &os nu este o transcriere corect a enunului: Rdac numrul y este pozitiv, atunci x ia valoarea lui a, n caz contrar x ia valoarea lui bA. a$ G3(X>5$ \ a H b%
97. Ce $aloare afieaz programul urmtor 8 #include<stdio.h> void main($ { int G39= X% X3(siQeof(GD1$33siQeof(int$$ \ siQeof(IGE$ H siQeof(+$% printf(Md#= X$% & a) % b) 1 c) $ d) ) e) programul este eronat 99. Ce $alori $a afia programul urmtor 8 #include<stdio.h> void main($ { int a315= b3>= c3:= d% d3(c3aD>= a3bMc= bB3a= aW2$% printf(FnMd Md Md Md#=a=b=c=d$% & a) " 1+ =+ b) $ . ) 1 c) ) $ . 1 d) =+ " 1+ e) alte valori 9<. Ce $aloare afieaz programul de mai &os 8 #include<stdio.h> void main($ { int a3+= b32= n3:= G% G3(a<<n$ B (aPb$ B (nYb$% printf(Md#= G$% & a) $ b) . c) 1 d) + e) programul este greit 9=. Fie $ariabilele ntregi a31,b32,c3+,d3:. Care dintre construciile de mai &os sunt e!presii scrise corect, cu $aloarea ; 8 a$ "d b$ aBb<d c$ aNbBc d$ a3b<c e$ (a<b$"3(b<c$ 9>. "entru care dintre seturile de $alori ale $ariabilelor !G :G 5 de mai &os e!presia (G<X$<((Q"3G$<((QDX$<G$ are $aloarea 28 a) x0%2 E0 2 z0) b) x0)2 E0%2 z0) c) x0%2 E0)2 z0% d) x0 2 E0)2 z0% e) x0 2 E0 2 z0 9:. Care dintre urmtoarele e!presii au $aloarea 2 dac i numai dac $alorile $ariabilelor ntregi ! i : sunt numere pare 8 a$ GDX332 b$ GNXM:335 c$ (GBX$M2335 d$ XMG332 e$ (GM2335$PP(XM2335$
9E. Care dintre urmtoarele e!presii sunt ade$rate dac i numai dac $alorile $ariabilelor ! i : sunt numere naturale consecuti$e 8 a$ GDX331 b$ (G331$PP(X332$ b$ (GDX331$PP(XDG331$ c$ X33GB1 e$ (GDX331$YY(XDG331$ <;. Se consider urmtoarele declaraii de $ariabile : int a=b=e% float c=d%! Care dintre instruciunile de mai &os sunt incorecte 8 a$ a3aNb% b$ e3a<c% c$ Cb3aBaWb% d$ d3(aBb$W2% e$ cNd3aDb% <2. Fie $ariabilele !G:G5 de tipul int, fiind cunoscute $alorile iniiale G3+= X39. Care dintre instruciunile de mai &os trebuie e!ecutat astfel nc%t, dup e!ecuie, $aloarea $ariabilei 5 s fie 42 8 a$ Q32NGB+NXDD% b$ Q32NGB+NDDX% c$ Q32NGDDB+NX% d$ Q32NDDGB+NX% e$ Q32NGB+NX% <4. Fie trei $ariabile ntregi aGbG!. Scriei cu a&utorul unei e!presii condiionale enunul Rdac x nu aparine [a,b] , atunci x ia valoarea lui a, n caz contrar x ia valoarea lui bA. a$ G3((G<a$YY(G>b$$\ a H b% b$ G3(G<aYYG>b$\ a H b% c$ G3((G<a$PP(G>b$$\ a H b% d$ G3(G<a$YY(G>b$\ b H a% e$ (G<a$YY(G>b$$\ (G3a$ H (G3b$% <7. Wtiind c n standardele CSC?? caracterele liter mare au codurile succesi$e ncep%nd cu =<, deducei ce $aloare $a afia programul urmtor. #include<stdio.h> void main($ { int G=X=Q=p% char m=n% m3E!E% n3E,E% G3m% X32NmDn% Q3+% p3G<X\(X<Q \ QHX$H(Q<G\GHQ$% printf(FnMd#= p$% & a) 1 b) % c) +; d) +e) " <9. Wtiind c $alorile de tipul int se memoreaz pe 4 octei, iar cele de tipul (loat pe 9 octei, de c%te ori $a afia programul urmtor $aloarea 48 #include<stdio.h> void main($ { int G% char c%
G3E,E% printf(Md#= siQeof(G$$% c3E,E% printf(Md#=siQeof(c$$% printf(Md#=siQeof(float$D2$% G3siQeof(int$% G3BBGW2% printf(Md#= G332$% b) o data d) de % ori
<<. Ce $alori afieaz programul urmtor 8 #include<stdio.h> void main($ { int G315= X3>= m= n= p% n3(m3GBB= XBB= p3GBX$% printf(FnMd Md Md#=m n=p$% & a) 1" 1. 1+ b) 11 1. 1. c) 1" 1. 1. d) 11 1. 1e) 1" 1. 1<=. Ce $aloare putem introduce la citirea $ariabilei :, astfel nc%t programul de mai &os s tipreasc 2 8 #include<stdio.h> void main($ { int G32= X= Q% scanf(Md#= PX$% Q3XB+NGBB% printf(FnMd#=(QM2335PPG>31$\1H5$% & a) $ b) % c) ) d) orice valoare par e) orice valoare impar <>. Fie $ariabilele aGbGc de tipul int, cu $alorile a<11G b<5G c<*. Care dintre e!presiile de mai &os are $aloarea 28 a$ (aYZb$P1 b$ (ZaPb$Y1 c$ (aPZb$Y1 d$ (aPb$YZ1 e$ (ZaYb$P1 <:. "recizai $aloarea pe care o $a a$ea $ariabila c n urma e!ecuiei programului de mai &os: #include<stdio.h> void main($ { char c3EdE% int n3AA% c3nB13cD1% & a) &d' b)'c' c) &b' d) 6MNN e) atribuirea este greit
&
printf(d3#$% scanf(Mlf#=Pd$% printf(G3#$% scanf(Mlf#=PG$% X3aNGNG% Q3bNG% u3XNGBQBd% printf(eGp3MgFn#=u \(XBQBc$WuHu$% getch($%
5.4 6nstruc"iunea i(
Cre urmtoarele formate : format1 : i(3e!presie4 instruc"iuneU format2: i(3e!presie4 instruc"iune1U else instruc"iune2U 5a nt%lnirea instruciunii i( nt%i se e$alueaz e!presia din paranteze. Cpoi, n cazul formatului 2, dac e!presia are $aloarea diferit de zero -adic true. se e!ecut instruc"iune, altfel se trece n sec$en la instruciunea urmtoare instruciunii i(. n cazul formatului 4, dac e!presia are o $aloare diferit de zero, atunci se e!ecut instruc"iune1 i apoi se trece n sec$en la instruciunea aflat dup instruc"iune2, altfel -condiia este zero, adic (alse. se e!ecut instruc"iune2. n mod normal, n ambele formate, dup e!ecuia instruciunii i( se a&unge la instruciunea urmtoare ei. Cu toate acestea, este posibil i o alt situaie c%nd instruciunile din compunerea lui i( definesc ele nsele un alt mod de continuare a e!ecuiei programului. 0eoarece o instruciune compus este considerat ca fiind un caz particular de instruciune, rezult c instruciunile din compunerea lui i( pot fi instruciuni compuse. 0e asemenea, instruciunile respecti$e pot fi c3iar instruciuni i(. n acest caz se spune c instruciunile i( sunt imbricate. !emplul 2: Se d funcia : :<3!2W2!'12, pentru !V2 i :<5!W12, pentru !;<2. S se scrie un program care citete $aloarea lui ! i afieaz $aloarea lui :. #include<stdio.h> #include<conio.h>
void main($ { float G=X% clrscr($% scanf(RMfR=PG$% if(G>5$ X3+NGNGB2NGD15% else X39NGB15% printf(RG3MfFtX3MfFnR=G=X$% getch($% & !emplul 4: S se scrie un program care citete $aloarea lui !, calculeaz i afieaz $aloarea lui : definit ca mai &os : :<4!3W5!2'2!W1 G pentru !;2 :<122 G pentru !<2 :<2!2W.!'1 G pentru !V2 #include<stdio.h> #include<conio.h> void main($ { float G=X=a% clrscr($% scanf(RMfR=PG$% a3GNG% if(G<5$ X3:NGNaB9NaD2NGB1% else if("G$ X3155% else X32NaB4NGD1% printf(RG3MfFtX3MfFnR=G=X$% getch($% & !emplul 7: S se scrie un program care citete $alorile $ariabilelor nentregi a i b, calculeaz rdcina ecuaiei : a!Wb<2 i afieaz rezultatul. #include<stdio.h> #include<conio.h> void main($ { double a=b% clrscr($% if(scanf(RMlf MlfR=Pa=Pb$"32$ '( $alideaz numrul coeficienilor reali citii (' printf(Rcoeficienti eronatiFnR$% else if(a$ printf(Ra3MgFtb3MgFtG3MgFnR=a=b=DbWa$% else if("b$ printf(Recuatie nedeterminataFnR$% else printf(Recuatia nu are solutieFnR$% getch($% & "rogramul de mai sus conine o instruciune i( imbricat. "entru a mri claritatea programelor se obinuiete s se decaleze spre dreapta -cu un tabulator. instruciunile din compunerea instruciunii i(. n acest program s)a realizat test relati$ la $alorile tastate pentru a i b. 0ac funcia scan(34 nu returneaz $aloarea 4, nseamn c nu s)au tastat dou numere de la terminal. 0e aceea, n astfel de situaii se afieaz mesa&ul @coeficieni eronaiA.
!emplul 9: S se scrie un program care citete coeficienii aGbGcGdGeG( ai unui sistem de dou ecuaii lineare cu dou necunoscute, determin i afieaz soluia acestuia atunci c%nd are o soluie unic. #include<stdio.h> #include<conio.h> void main($ { double a=b=c=d=e=f=G=X=det1=det2=det% clrscr($% if(scanf(RMlfMlfMlfMlfMlfMlfR=Pa=Pb=Pc=Pd=Pe=Pf$"3>$ printf(Rcoeficienti eronatiFnR$% else if("(det3aNeDbNd$$ printf(Rsistemul nu este determinatFnR$% else { det13cNeDbNf% det23aNfDcNd% G3det1Wdet% X3det2Wdet% printf(RG3MgFtX3MgFnR=G=X$% & getch($% &
'( afieaz coeficienii citii (' printf(Ra3MgFtb3MgFtc3MgFnR=a=b=c$% if("a PP "b PP "c$ { printf(Recuatie nedeterminataFnR$% eGit(5$% '( terminare fr erori(' & if("aPP"b$ { printf(Recuatia nu are solutieFnR$% eGit(5$% & if("a$ { printf(Recuatie de gradul 1FnR$% printf(RG3MgFnR=DcWb$% eGit(5$% & delta3bNbD:NaNc% d32Na% if(delta>5$ { printf(Recuatia are doua radacini reale si distincteFnR$% delta3s[rt(delta$% printf(RG13MgFtG23MgFnR=(DbBdelta$Wd= (DbDdelta$Wd$% eGit(5$% & if("delta$ { printf(Recuatia are radacina dublaFnR$% printf(RG3MgFnR=DbWd$% eGit(5$% & printf(Rradacini compleGeFnR$% delta3s[rt(Ddelta$Wd% d3DbWd% printf(RG13MgBi(Mg$FnR=d=delta$% printf(RG23MgDi(Mg$FnR=d=delta$% getch($% &
ntrerupe c3iar e!ecuia programului. 0espre instruciunea 7,ile se spune c este o instruciune ciclic condiionat anterior. !emplul 2: S se scrie un program care calculeaz i afieaz $aloarea polinomului p3!4<3!2'*!'12 pentru !<1G2GE.G12. #include<stdio.h> #include<conio.h> void main($ { int G% clrscr($% G31% ;hile(G<315$ { printf(RG3MdFtp(G$3MdFnR=G=+NGNGD?NGD15$% GBB% & getch($% & !emplul 4: S se scrie un program care citete un ir de ntregi separai prin caractere albe i afieaz suma lor. 0up ultimul numr se $a tasta un caracter alb urmat de un caracter nenumeric -de e!emplu, caracterul sf%rit de fiier ;CtrlVWI, o liter, etc.., iar dup aceea se $a aciona tasta nter. #include<stdio.h> #include<conio.h> void main($ { int i=s35% clrscr($% ;hile(scanf(RMdR=Pi$331$ sB3i% printf(Rsuma3MdFnR=s$% getch($% & !emplul 7: S se scrie un program care citete un ntreg n Y2G1*2Z, calculeaz i afieaz pe n\. C$em: n\<1D2D3DE..Dn , pentru n V2 i 2\<1 , prin definiie. #include<stdio.h> #include<conio.h> #include<stdlib.h> void main($ { int n=i% double f% clrscr($% printf(Rn3R$% if(scanf(RMdR=Pn$"31$ { printf(Rnu sDa tastat un intregFnR$% eGit(1$% & if(n<5 YY n>1?5$ { printf(Rn nu apartine intervalului K5=1?5LFnR$% eGit(1$% & f31.5% i32% ;hile(i<3n$ fN3iBB% printf(Rn3MdFtn"3MgFnR=n=f$% getch($% &
instruc"iuneU '( corpul ciclului(' unde e!p1, e!p2 i e!p3 sunt e!presii. !presia e!p1 se numete partea de ini"iali5are a ciclului (or, iar e!p3 este partea de reini"iali5are a lui. !presia e!p2 este condiia de terminare a ciclului (or i ea &oac acelai rol cu e!presia din ciclul 7,ile. ?nstruciunea (or se e!ecut astfel : Se e!ecut sec$ena de iniializare definit de e!p1 Se e$alueaz e!p2. 0ac are o $aloare diferit de ; -este true., atunci se e!ecut instruciunea care formeaz corpul ciclului. Cltfel, -e!presia are $aloarea ; adic false. se termin e!ecuia instruciunii (or i se trece la instruciunea urmtoare. 0up e!ecutarea corpului ciclului se e!ecut sec$ena de reiniializare definit de e!p3. Cpoi se reia e!ecuia de la pasul 4 . Ca i n cazul instruciunii 7,ile, instruciunea din corpul ciclului (or nu se e!ecut niciodat dac e!p2 are $aloarea ; c3iar de la nceput. !presiile din antetul lui (or pot fi i $ide. Caracterele punct i $irgul $or fi ntotdeauna prezente. n general, instruciunea (or poate fi scris cu a&utorul unei sec$ene n care se utilizeaz instruciunea 7,ile astfel : e!p1U 7,ile3e!p24 b instruc"iuneU e!p3U c Cceast ec3i$alare nu are loc ntr)un singur caz i anume atunci c%nd, n corpul instruciunii se utilizeaz instruciunea continue. 1eciproc, orice instruciune 7,ile poate fi scris cu a&utorul unei instruciuni (or n care e!p1 i e!p3 sunt $ide. Cstfel, instruciunea 7,ile3e!p4 instruc"iuneU este ec3i$alent cu instruciunea (or3U e!p U4 instruc"iuneU . O instruciune (or de forma (or3U U4 instruc"iuneU este $alid i este ec3i$alent cu instruciunea : 7,ile314 instruc"iuneU. In astfel de ciclu se poate termina prin alte mi&loace dec%t cel obinuit, cum ar fi instruciunea de re$enire dintr)o funcie, un salt la o etic3et etc. 0in cele de mai sus rezult ec3i$alena celor dou cicluri 7,ile i (or. Se recomand folosirea instruciunii (or n ciclurile n care sunt prezente prile de iniializare i reiniializare, aa numitele cicluri cu pas. !emplul 2: S se scrie un program care citete ntregul n din inter$alul Y2G1*2Z, calculeaz i afieaz pe n\ . #include<stdio.h> #include<conio.h> #include<stdlib.h> void main($ { int n=i% double f% clrscr($% printf(Rn3R$% if(scanf(RMdR=Pn$"31$ { printf(Rnu sDa tastat un intregFnR$% eGit(1$% & if(n<5 YY n>1?5$ { printf(Rn nu apartine intervalului K5=1?5LFnR$% eGit(1$% & for(f31.5=i32%i<3n%iBB$ fN3i% printf(Rn3MdFtn"3MgFnR=n=f$% getch($% & !emplul 4: Irmtorul program continu s cicleze p%n c%nd este tastat litera a. n loc s $erifice $ariabila de control a ciclului, instruciunea (or $erific dac de la tastatur a fost introdus caracterul a. #include<stdio.h> #include<conio.h> void main($ { int i% char ch%
& n acest caz, testul de condiie care controleaz ciclul nu are nimic n comun cu $ariabila de control a ciclului. /ariabila c, a primit o $aloare iniial pentru a ne asigura c ea nu conine accidental c3iar litera a n momentul n care programul ncepe e!ecuia. !emplul 7: O alt $ariant a lui (or este aceea c scopul su poate fi gol ca n programul urmtor: #include<stdio.h> #include<conio.h> void main($ { char ch% clrscr($% for(ch3getche($%ch"3E[E%ch3getche($$% printf(Fn am gasit pe [#$% getch($% & ?nstruciunea care asigneaz lui c, o $aloare a fost mutat n interiorul ciclului. Cceasta nseamn c atunci c%nd ciclul pornete, este apelat funcia getc,e34. Cpoi $aloarea lui c, este testat mpreun cu a, se e!ecut ine!istentul corp al lui (or i apoi are loc o nou apelare a funciei getc,e34 n seciunea de incrementare a ciclului. Ccest proces se repet p%n c%nd utilizatorul introduce litera a. Scopul lui (or poate fi gol deoarece limba&ul C admite instruciunea $id.
& !emplul 4: Faptul c ciclul do e!ecut ntotdeauna corpul ciclului cel puin o dat face ca el s fie perfect pentru a $erifica intrarea ntr)un meniu. 0e e!emplu, urmtorul program $a repeta ciclul de citire a opiunii p%n c%nd utilizatorul $a introduce un rspuns $alid: #include<stdio.h> #include<conio.h> void main($ { float a=b% char ch% clrscr($% printf(Voriti H Fn#$% printf(,dunare=/cadere=.ultiplicare=0mpartire\ Fn#$% do{ printf(0ntroduceti prima litera H $% ch3getche($% printf(Fn#$% &;hile(ch"3E,E PP ch"3E/E PP ch"3E.E PP ch"3E0E$% printf(0ntroduceti primul numar H $% scanf(Mf#=Pa$% printf(0ntroduceti al doilea numar H $% scanf(Mf#=Pb$% if(ch33E,E$ printf(Mf#=aBb$% else if(ch33E/E$ printf(Mf#=aDb$% else if(ch33E.E$ printf(Mf#=aNb$% else if(b$ printf(Mf#=aWb$% getch($% & !emplul 7: Ciclul do este folositor n special c%nd programul ateapt s se produc un anumit e$eniment. 0e e!emplu, urmtorul program ateapt ca utilizatorul s tasteze litera a. "rogramul conine o singur apelare a funciei getc,e34. #include<stdio.h> #include<conio.h> void main($ { char ch% clrscr($% do{ ch3getche($% & ;hile(ch"3E[E$% printf(Fn am gasit pe [#$% getch($% & !emplul 9: Funcia 8b,it34 din 3eader)ul conio., este foarte folositoare c%nd dorim s permitem utilizatorului s ntrerup o rutin fr s l form s rspund la un mesa&. 0e e!emplu, programul urmtor afieaz o tabel cu procentul <O aplicat unor $alori care se incrementeaz cu 4;. "rogramul continu s afieze tabela p%n c%nd utilizatorul apas o tast sau p%n c%nd a fost atins $aloarea ma!im. #include<stdio.h> #include<conio.h> void main($
double amount% amount325.5% printf(,pasati o tasta pentru stop.Fn#$% do{ printf(valoareaHMlf=procentHMlfFn#=amount=amountN5.59$% if((bhit($$ brea(% amount3amountB25% &;hile(amount<15555$%
&
&
!emplul 7: ?nstruciunea brea8 poate fi folosit cu oricare din cele trei cicluri ale limba&ului. ntr)un ciclu pot e!ista oric%te instruciuni brea8. n general, se recomand ca instruciunea brea8 s fie utilizat pentru scopuri speciale i nu ca ieire normal din ciclu. ?nstruciunea brea8 este utilizat n cicluri n care o condiie special poate cauza oprirea imediat a ciclului. Spre e!emplu, n programul urmtor, apsarea unei taste poate opri e!ecuia programului: #include<stdio.h> #include<conio.h> void main($ { int i% char ch% clrscr($% for(i31%i<15555%iBB$ if("(iM>$$ { printf(Md .ai doriti \ (^WJ$H =i$% ch3getche($% if(ch33EJE$ brea(% printf(Fn#$% & getch($% &
de(ault % sir poate fi absent. n acest caz, dac $aloarea e!presiei nu coincide cu $aloarea nici uneia dintre constantele c1Gc2G.. ..cn, atunci instruciunea s7itc, nu are nici un efect i se trece la e!ecuia instruciunii urmtoare. ?nstruciunea s7itc, de mai sus este ec3i$alent cu urmtoarea instruciune i( imbricat : i(3e!presie<<c14 sir_1 else i(3e!presie<<c24 sir_2 else i(3e!presie<<c34 sir_3 else i( EEEE.. else i(3e!presie<<cn4 sir_n else sirU ?nstruciunea brea8 de la sf%ritul fiecrei alternati$e permite ca la nt%lnirea ei s se treac la e!ecuia instruciunii urmtoare instruciunii s7itc,. Se obinuiete s se spun c instruciunea brea8 permite ieirea din instruciunea s7itc,. ?nstruciunea brea8 poate fi utilizat numai n corpurile ciclurilor i n alternati$ele instruciunii s7itc,. "rezena ei la sf%ritul fiecrei alternati$e nu este obligatorie. n cazul n care instruciunea brea8 este absent la sf%ritul unei alternati$e, dup e!ecuia succesiunii de instruciuni din compunerea alternati$ei respecti$e se trece la e!ecuia succesiunii de instruciuni din alternati$a urmtoare a aceleai instruciuni s7itc,. Cdic, dac o instruciune s7itc, are formatul : s7itc,3e!presie4 b case c1% sir_1 case c2% sir_2 c atunci ea este ec3i$alent cu urmtoarea sec$en : i(3e!presie<<c14 b sir_1 sir_2 celse i(3e!presie<<c24 sir_2U !emplul 2: Irmtorul program recunoate numerele 2,4,7 i 9 i afieaz numele cifrei introduse. #include<stdio.h> void main($ { int i% printf(0ntroduceti un intreg intre 1 si : H $% scanf(Md#=Pi$% s;itch(i$ { case 1 H printf(unu#$% brea(% case 2 H printf(doi#$% brea(% case + H printf(trei#$% brea(% case : H printf(patru#$% brea(% defaultH printf(numar necunoscut#$% & & !emplul 4: ?nstruciunile s7itc, sunt deseori folosite pentru a procesa comenzi meniu. 0e e!emplu, programul urmtor: Finclude;stdio.,V
#include<conio.h> void main($ { float a=b% char ch% clrscr($% printf(Voriti HFn#$% printf(,dunare=/cadere=.ultiplicare= 0mpartire\Fn#$% do{ printf(0ntroduceti prima litera H $% ch3getche($% printf(Fn#$% &;hile(ch"3E,E PP ch"3E/E PP ch"3E.E PP ch"3E0E$% printf(0ntroduceti primul numar H $% scanf(Mf#=Pa$% printf(0ntroduceti al doilea numar H $% scanf(Mf#=Pb$% s;itch(ch$ { case I,EH printf(Mf#=aBb$%brea(% case I/EH printf(Mf#=aDb$%brea(% case I.EH printf(Mf#=aNb$%brea(% case I0EH if(b$ printf(Mf#=aWb$%brea(% & getch($% & !emplul 7: ?nstruciunile asociate unui case pot s lipseasc. Cceasta permite ca dou sau mai multe case s e!ecute aceleai instruciuni fr s fie ne$oie de duplicarea lor. ?at un program care clasific literele n $ocale i consoane: #include<stdio.h> #include<conio.h> void main($ { char ch% clrscr($% printf(0ntroduceti o litera H $% ch3getche($% s;itch(ch$ { case IaEH case IeEH case IiEH case IoEH case IuEH printf(Fn este o vocala#$%brea(% default H printf(Fn este o consoana#$% & &
aceleai funcii n care se afl etic3eta goto. 5a nt%lnirea instruciunii goto, se realizeaz salt la instruciunea prefi!at de etic3eta al crei nume se afl dup cu$%ntul c3eie goto. 0eoarece o etic3et este local n corpul unei funcii, rezult c ea este nedefinit n afara funciei respecti$e. n felul acesta, o instruciune goto poate realiza un salt numai la o instruciune din corpul aceleai funcii n care este utilizat. 0eci, o instruciune goto nu poate face salt din corpul unei funcii la o instruciune din corpul altei funcii. Nu se &ustific utilizarea abuzi$ a acestei instruciuni. Se recomand a fi utilizat pentru a simplifica ieirea din cicluri imbricate. !emplu : "resupunem c ntr)un punct al programului, aflat n interiorul mai multor cicluri, se depisteaz o eroare i se dorete s se continue e!ecuia programului cu o sec$en de tratare a erorii respecti$e. n acest caz $om folosi o instruciune goto ca mai &os. for($ {.. ;hile(.$ { .. do {. for(.$ {.. if((335$ goto divQero% else G3XW(% & .. &;hile(..$% . & . & '( sec$ena de tratare a erorii (' divQeroH printf(..$% .. n absena instruciunii goto se poate realiza acelai lucru folosind un indicator i o serie de teste realizate asupra lui.
int Qi=luna=an% char data)calendK11L% . sprintf(data)calend= M52dWM52dWM52d#=Qi=luna=an$% puts(data)calend$% . puts(data)calend$% Funcia sscan( realizeaz, ca i funcia scan(, con$ersii din formatul e!tern n format intern. 0eosebirea const c de data aceasta caracterele nu sunt citite din zona tampon corespunztoare tastaturii, ci ele pro$in dintr)un ir de caractere definit de primul parametru al funciei sscan(. Cceste caractere pot a&unge n irul respecti$ n urma apelului funciei gets. n felul acesta, apelul funciei scan( poate fi nlocuit prin apelul funciei gets urmat de apelul funciei sscan(. Cstfel de nlocuiri sunt utile c%nd dorim s eliminm e$entualele erori aprute la tastarea datelor. Funcia sscan(, ca i funcia scan(, returneaz numrul c%mpurilor con$ertite corect conform specificatorilor de format prezeni n sinta!. 5a nt%lnirea unei erori, ambele funcii i ntrerup e!ecuia i se re$ine din ele cu numrul de c%mpuri tratate corect. Cnaliz%nd $aloarea returnat, se poate stabili dac au fost prelucrate corect toate c%mpurile sau a sur$enit eroare. n caz de eroare se poate re$eni pentru a introduce corect datele respecti$e. n acest scop este necesar s se elimine caracterele ncep%nd cu cel din poziia eronat. n cazul n care se utilizeaz sec$ena : gets(....$% sscanf(....$% abandonarea caracterelor respecti$e se face automat reapel%nd funcia gets. n cazul utilizrii funciei scan( este necesar s se a$anseze p%n la caracterul @linie nouA aflat n zona tampon ataat tastaturii sau s se $ideze zona respecti$ prin funcii speciale. n e!erciiile urmtoare $om folosi sec$enele formate din apelurile funciei gets urmate de apelurile lui sscan(. O astfel de sec$en se apeleaz repetat n cazul n care se nt%lnesc erori n datele de intrare. !emplul : char tabK299L% int Qi=luna=an% .. gets(tab$% sscanf(tab=Md Md Md#=PQi=Pluna=Pan$% Cmintim c funcia gets returneaz $aloarea BK@@ la nt%lnirea sf%ritului de fiier. Funciile sscan( i sprint( au prototipurile n fiierul stdio.,. !emplul 2: S se scrie un program care citete un ntreg poziti$ de tip long, stabilete dac acesta este prim i afieaz un mesa& corespunztor. #include<stdio.h> #include<conio.h> #include<stdlib.h> void main($ { long n% long i% int O% char tabK299L% clrscr($% do { printf(Rtastati un intreg poQitiv HR$% if(gets(tab$33J7SS$ { printf(RsDa tastat 2']FnR$% eGit(1$% & if(sscanf(tab= RMldR= Pn$"31 YY n<35$ { printf(Rnu sDa tastat un intreg poQitivFnR$% O31%continue% '( se $a relua ciclul deoarece & este diferit de zero (' & O35% '( ciclul se ntrerupe deoarece s)a citit corect un ntreg poziti$ (' &;hile(O$%
for(O31=i32%iNi<3n PP O%iBB$ if("(nMi$$ O35% '( numrul nu este prim (' printf(Rnumarul H MldR=n$% if("O$ printf(R nuR$% printf(R este primFnR$% getch($% Itilizarea instruciunii continue se poate omite folosind o instruciune i( cu alternati$a
if(sscanf(.$"31 YY n<35$ { . O31% & else O35% Ciclul (or continu at%t timp c%t e!presia iDi;<n[[j este ade$rat. Cceast e!presie se e$alueaz de la st%nga spre dreapta i din aceast cauz iDi;<n se e$alueaz i atunci c%nd j<2. 0e aceea e!presia respecti$ este mai eficient sub forma : j[[iDi;<n. n acest caz pentru j<2 nu se mai e$alueaz restul e!presiei. !emplul 4: S se scrie un program care citete msurile a,b,c ale laturilor unui triung3i, calculeaz i afieaz aria triung3iului respecti$ folosind formula lui Xeron. #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<math.h> void main($ { double a=b=c=p% char tabK299L% clrscr($% do '( citete msurile laturilor triung3iului (' { do '( citete pe a (' { printf(Ra3R$% if(gets(tab$33J7SS$ { printf(RsDa tastat 2']FnR$% eGit(1$% & if(sscanf(tab=RMlfR=Pa$331 PP a>5$ brea(% '( se iese din ciclul pentru citirea lui a (' printf(Rnu sDa tastat un numar poQitivFnR$% printf(Rse reia citirea lui aFnR$% &;hile(1$% do '( citete pe b (' { printf(Rb3R$% if(gets(tab$33J7SS$ { printf(RsDa tastat 2']FnR$% eGit(1$% & if(sscanf(tab= RMlfR= Pb$331 PP b>5$ brea(% '( se iese din ciclul pentru citirea lui b (' printf(Rnu sDa tastat un numar poQitivFnR$% printf(Rse reia citirea lui aFnR$% &;hile(1$% do '( citete pe c (' { printf(Rc3R$% if(gets(tab$33J7SS$ { printf(RsDa tastat 2']FnR$% eGit(1$% & if(sscanf(tab=RMlfR=Pc$331 PP c>5$ brea(% '( se iese din ciclul pentru citirea lui c (' printf(Rnu sDa tastat un numar poQitivFnR$%
&
printf(Rse reia citirea lui aFnR$% &;hile(1$% p3(aBbBc$W2% if(pDa>5 PP pDb>5 PP pDc>5$ brea(% '( a,b,c pot fi laturile unui triung3i (' printf(Ra3MgFtb3MgFtc3MgFtR=a=b=c$% printf(Rnu pot fi laturile unui triunghiFnR$% &;hile(1$% printf(Raria3MgFnR=s[rt(pN(pDa$N(pDb$N(pDc$$$% getch($%
!emplul: #ransformarea literelor unui ir n litere mari. #include<stdio.h> #include<ctXpe.h> void main($ { int i% char tK299L% scanf(Ms#=t$% for(i35%sKiL%iBB$ sKiL3toupper(sKiL$% printf(MsFn#=t$% &
Funciile matematice sunt definite n 3eader)ul mat,.,. 0e obicei, marea lor ma&oritate sunt definite pentru $alori reale de tip double put%nd fi con$ertite fr probleme n alte tipuri. Sinta!a (unc"iei int abs3int !4U long int labs3long int !4U double (abs3double !4U double sart3double !4U double po73double !G double :4U double po7123int p4U double e!p3double !4U double log3double !4U double log123double !4U double lde!p3double !G int e!p4U double (mod3double !G double :4U double pol:3double !G int nG double coe(YZ4U Valoarea returnat$ Bacrouri care ntorc modulul unui numr ntreg de format normal, ntreg de format lung i real de tip double. Calculeaz rdcina ptrat Funcia putere !:. n cazul n care ! este ; i : este negati$ sau dac ! este negati$ i : nu este ntreg se semnaleaz eroare. Funcia putere c%nd baza este 2;. Funcia e! . Funcia logaritm natural, ln3!4 . 5ogaritmul n baza 2;. Calculeaz !D2e!p . Calculeaz ! modulo : . $alueaz o funcie polinomial, unde : ! 6 $aloarea argumentului funciei , n 6 gradul funciei polinomiale, coe( 6 tabloul de coeficieni ai funciei polinomiale, coe(Y2Z este termenul liber i coe(YnZ este termenul de rang ma!im 1otun&ire inferioar. ntoarce cel mai mare numr ntreg mai mic sau egal cu !. 1otun&ire superioar. ntoarce cel mai mic ntreg mai mare sau egal cu !.
!emplu: Calculul $alorii unui polinom. #include<stdio.h> #include<math.h> '( polinomul: !<)4!7)=!4L2<!)2 (' void main($ { double aKL3{D1.5=19=D>.5=D2.5=5=1.5&% '( coeficienii polinomului in ordinea cresctoare a puterilor (' double G=reQ% printf(G3#$% scanf(Mlf#=PG$% reQ3polX(G=9=a$% printf( val. polinomului pentru G3Mlg este MlgFn#=G=reQ$% & Funciile trigonometrice au argumente de tip real care trebuie specificate n radiani. Cele mai utilizate funcii implementate sunt : Sinta!a (unc"iei double sin3double !4U double cos3double !4U double tan3double !4U double asin3double !4U double acos3double !4U double atan/double !4U double atan23double :G double !4U double sin,3double !4U double cos,3double !4U double tan,3double !4U Bumele (unc"iei Sinus Cosinus #angent Crc sinus Crc cosinus Crc tangent Crc tangenta lui :)! Sinusul 3iperbolic Cosinusul 3iperbolic #angenta 3iperbolic Valoarea returnat$ 1eal ntre 62 i 2 1eal ntre 62 i 2 1eal 1eal ntre ) '4 i '4 1eal ntre ; i 1eal ntre ) '4 i '4 1eal ntre ; i 1eal 1eal real
2. Care dintre urmtoarele sec$ene de instruciuni atribuie $ariabilei reale ! cea mai mare dintre $alorile $ariabilelor reale a i b sau $aloarea lor comun, n cazul n care acestea sunt egale 8 a$ if(a<3b$ G3b% else G3a% b$ if(a<3b$ G3a% else G3b% c$ if(a33b$ G3a% else if(b>a$ G3b% d. G3a% if(G<b$ G3b% e. nici una dintre secvenele anterioare 4. Fie $ariabilele a i b, ambele de tipul int, ale cror $alori se presupun cunoscute. Scriei o sec$en de programul pentru enunul : Rdac numerele x i z sunt ambele impare, atunci tiprete valoarea 1A. a$ if((GM2"35$PP(XM2"35$$ puchar(E1E$% b$ if(GM2335YYXM2335$ putchar(I1E$% c$ if(GM2 PP XM2$ putchar(I1E$% d$ if("(GM2335YYXM2335$$ putchar(I1E$% e$ if("(GM2335$PP"(XM2335$$ putchar(I1E$% 7. Ce $a afia programul urmtor, dac de la tastatur se introduc n ordine numerele <, > i :8 #include<stdio.h> void main($ { int G=X=Q=m% scanf(Md Md Md#=PG=PX=PQ$% m3(GBXBQ$W+% s;itch(m$ { case 1=2=+=:H { printf(!origent#$% brea(% & case 9=>H { printf(.ediocru#$% brea(% & case ?=4=AH { printf(-ine#$% brea(% & case 15H { printf(]oarte bine#$% brea(% & defaultH printf(2roare#$% c c a) Corigent b) @ediocru c) :atisfctor d) >oarte bine e) 5roare 9. "recizai ce se $a afia n urma e!ecuiei sec$enei de program de mai &os pentru n39 -s,n i 8 sunt $ariabile ntregi..
s35% (31% ;hile((<3n$ { sB3(% (B32% & printf(_s3Md#= s$% a) s0) b) s01+ d) s01 e)s0"
c) s0;
<. Care dintre sec$enele de program de mai &os calculeaz corect factorialul numrului natural n 8 1$ p31% for(i31% i<3n% iBB$ p3pNi% 2$ p31% i31% ;hile(i<3n$ p3pNiBB% +$ p31% i31% do{ pN3i% i3iB1% &;hile(i<3n$% a) numai 1) b) numai $) c) numai %) d) 1) i %) e) toate =. Care trebuie s fie $aloarea $ariabilei ntregi m, astfel nc%t urmtoarea sec$en de program s afieze e!act un caracter *C, 8 G39% do{ putchar(I,E$% GBB% &;hile(G>m$% a) 1$ b) c)+ d) ) e)1 >. Se consider sec$ena de program de mai &os, n care toate $ariabilele sunt ntregi. "entru n3+, care $a fi $aloarea $ariabilei p dup e!ecuia sec$enei 8 p31% for(i31% i<3n% iBB$ { s35% for(O31% O<3i% OBB$ sB3O% pN3s% & a) 1." b) 1. c) ; d) $1+ e) 1 :. "recizai ce se $a afia n urma e!ecuiei programului urmtor pentru G31?A 8 #include<stdio.h> void main($ { int c=s% long d=G% scanf(_Mld#= PG$% d3G% s35% ;hile(d$ { c3dM15% sB3c% d3dW15% & printf(_Md#= s$% & a) 1+ b) 1. c)1d) " e) ;-1
E. Considerm programul urmtor : #include<stdio.h> void main($ { short int m=G% m3D1% ;hile((scanf(Md#=PG$331$PP G$ if(G>m$ m3G% printf(Md#= m$% & "recizai ce $aloare $a afia programul, dac irul de numere citit de la tastatur este 2= 9= D+2555= ++555= 5! a) =1 b) " c) %%""" d) $ e) 2;. "entru ce $aloare de program de mai infinit 8 int n315= m% do{ ;hile(n>5$ &;hile(n"3m$% a) 1" b) orice valoare c) " d) orice valoare e) orice valoare a $ariabilei m, sec$ena &os reprezint o bucl
a) va genera eroare la rulare b) j0) c) j0" d) j01" 29. ,$ for(eGp1%eGp2%eGp+$ instructiune% este ec3i$alent cu eGp1% ;hile(eGp2$ { instructiune% eGp+%& -$ for( %eGp% $ instructiune% este ec3i$alent cu ;hile(eGp$ instructiune% !$ for( % % $ instructiune% este ec3i$alent cu ;hile(1$ instructiune% Care din ec3i$alenele de mai sus sunt eronate: a) nici una b) A,# c) #,C d) A,C 2<. Fie sec$ena : do{ scanf(Mc#=Pc$% if (c>3EaE PP c<3EQE$ iBB% & ;hile(c"32']$% Care din urmtoarele afirmaii este ade$rat : a) se numr c4te caractere litere mici sunt citite b) se numr c4te caractere sunt citite c. se numr c4te caractere litere mari sunt citite d) nici una 2=. Se d o sec$en de program n care toate $ariabilele sunt de tip ntreg. n urma e!ecuiei programului ce conine aceast sec$en, ce $alori capt $ariabilele d i s 8 a34% b3c31% d3s35% i3+% do{ iBB% if(a>5$ if(b>1$ if(c>1$ d3a% else d3aBb% else d3aBbBc% sB3iBd% & ;hile(i>9$% a) d0. s01$ b) d0; s01$ c) d01" s01% d) d01" s01) 2>. Se consider sec$ena de program : void main(void$ { int G31% float Q= X35.A>% GB3X% Q3s[rt(G$% printf(Mf#=Q$%
22. Ce $aloare $a afia programul urmtor pentru n312 8 #include<stdio.h> void main($ { int i=n=s% scanf(_Md#= Pn$% for(s35=i32% i<nW2% "(nMi$\sB3iBBH iBB$% printf(#Md#=s$% & a) " b) ; c) 1$ d) -. e) programul conine erori 24. 0ac de la tastatur se introduc, n ordine, numerele 2=?=+=4=9=9, ce $aloare $a afia sec$ena urmtoare 8 int a= b= nr35% do{ scanf(Md Md#= Pa= Pb$% &;hile((b"3a$ \ BBnr H 5$% printf(Md#= nr$% a. " b) 1 c) $ d) % e) ) 27. int i35% int O3>% if(i"35$ PP (OWi"31$ O3i% iB3:% OB3i% "entru codul de mai comportamentul corect :
sus
alegei
2:. Fie sec$ena de cod prezentat mai &os : i31% ;hile(n$ i3iN(nDD$% atunci aceasta : a. calculeaz n" b. calculeaz in c) calculeaz ni d) se cicleaz la infinit 2E. Fie sec$ena de cod prezentat mai &os : i31% ;hile(nDD$ i3iN2% atunci aceasta : a. calculeaz 2n b) calculeaz i2 c) calculeaz n2 d) se cicleaz la infinit 4;. Scriei o bucl care afieaz sec$ena : 1 22 +++ :::: 99999 a$ for(loop331%loop<39%looopBB$ { for(loop1331%loop1<3loop%loop1BB$ printf(Md#=loop1$% printf(Fn#$% & b$ for(loop31%loop<39%loopBB$ { for(loop131%loop1<3loop%loop1B B$ printf(Md#=loop$% printf(Fn#$% & c$ for(loop31%loop<39%loopBB$ { for(loop131%loop1<3loop%loop1B B$ printf(Md#=loop1$% printf(Fn#$% & d$ for(loop39%loop>5%loopDD$ { for(loop131%loop1<3loop%loop1B B$ printf(Md#=loop1$% printf(Fn#$% & 42. 1eferitor la sec$ena de cod de mai &os, ce $aloare $a a$ea $ariabila contor dup e!ecuia ei 8 int G3+= contor35% ;hile((GD1$$ {
44. Ce realizeaz urmtoarea sec$en : scanf(Md#=PG=PX=PQ$% if(G<3X$% G3GBQ% X3XBQ% else Q3GBX% a) citete trei numere i calculeaz suma lor b) citete trei numere i calculeaz produsul lor c) este greit d) Q devine minimul dintre G si X 47. Care sec$en de program realizeaz o repetiie la infinit : 0$ do ;hile(1$% ??. do ;hile(5$% 000$ do ;hile(iM1<2$% a) doar B b) doar BB c) doar BBB d) doar B i BBB 49. Se d codul : int G3:= a32% int b3:= c34% if(G33b$ G3a% else G3b% if(G"3b$ c3cBb% else c3cBa% printf(c3MdFn#=c$% Ce se $a afia dup e!ecuia codului de mai sus 8 a) c0) b) c0. c) c01" d) c01$ 4<. Se d urmtoarea sec$en de cod : int i= O35% for(i31%i<11%iB32$ { OBB% if(i33?$ brea(% & Care $a fi $aloarea final a lui j 8 a) % b) ) c) d) 4=. Se d urmtoarea sec$en de cod : int i= O= (% i31% O31% (32% ;hile(i<>$ { (3(Bi%iBB% O3OB(% if((33+$ ODD% else if(O334$ brea(% & printf(MdDDMdDDMd#=i=O=($% Ce $a afia codul de mai sus 8 a) 1O1O$ b) $O%O% c) %O.O d) )O1+O. 4>. Se d codul : int a3+= b35%
;hile(a$ { b3bBB% a3b% & Ce $aloare $a a$ea b 8 a) 1 b) % d) nedefinit pentru bucl infinit
e) a0), b0$, c0% c) " va fi 74. Se consider programul urmtor: #include<stdio.h> void main($ { int a=b=c=d=i% scanf(Md Md#= Pa= Pb$% if(a>b$ { c3a% a3b% b3c% & d35% for(i3a%i<3b%iBB$ if(iM2335$ dBB% printf(Md#=d$% & Ce $aloare se afieaz pentru a3++ i b314 8 a) . b) c) " d) 1+ e) %% 77. Fie urmtorul program: #include<stdio.h> void main($ { int G=X=m=n=a=b% a3b32% WW(1$ m3(G3aB+=X3bD1=XBB=XBG$% WW(2$ if(aPPG>X$ printf(Md#=m$%WW(+$ if(GDX>aPPG>XYY"m$ WW(:$ putchar(I1E$% else putchar(I5E$% if((n3G>X$335$YY(DDG33:$$ WW(9$ printf(Md#=GDD$% Y n timpul e!ecuiei programului se pot spune urmtoarele: a) atribuirea din linia (1) este eronat b) instruciunea din linia ($) este eronat c) n urma execuiei liniei (%) nu se afieaz nici o valoare d) n urma execuiei liniei ()) se afieaz valoarea 1 e) n urma execuiei liniei ( ) se afieaz valoarea ) 79. 0ac de la tastatur se introduce numrul 44, c%te $alori distincte $a afia programul urmtor8 #include<stdio.h> #include<math.h> void main($ { int G=n=i% for(scanf(Md#=Pn$=i31%%G3s[rt(i$= printf(Md#=G$=iBB$ if(i>n$ brea(% & a) nici una b) 1 c) $ d) % e) )
4:. Fie sec$ena de cod : #include<stdio.h> void main(void$ { int i=X=G3>% X3G% ;hile(1$ { XDD% G3GNX% if(X335$ brea(% & printf(Md#=G$% & Ce numr $a fi afiat pe ecran la terminarea e!ecuiei acestui cod 8 a) -$" b) programul va rula la infinit c) " d) + 4E. Fie sec$ena de cod : int G% int X31% for(G35%G<3+5%GBB$ { X3XB1% if(G<9$ continue% if(G>9$ brea(% X3XBG% & 0up e!ecuia codului anterior, ce $aloare $a a$ea : 8 a) ).+ b) %1 c) 1% d) );+ 7;. Fie urmtorul program : int main($ { int i% for(i31%i<>99+9%iBB$% printf(i3MdFn#=i$% & a)valoarea afiat este i0+ % b)valoarea afiat este i0+ %) c)valoarea afiat este i0%$-++ d)programul nu este corect deoarece este depit domeniul de valori 72. n urma e!ecuiei sec$enei de program de mai &os, pentru care dintre tripletele de $alori ale $ariabilelor aG bG c, date mai &os, se $a afia $aloarea 28 G31% if("(a<3b$YY"(a<3c$$ { if(b>3c$ printf(MdFn#=DG$% & else if(b<c$ printf(MdFn#=G$% a) a0%, b0$, c0) b) a0$, b0%, c0) c) a0), b0%, c0$ d) a0$, b0), c0%
7<."recizai de c%te ori se $a afia $aloarea 2 n timpul e!ecuiei programului urmtor, dac a<3Gb<4 i !<5. #include<stdio.h> void main($ { int a=b=G% scanf(#MdMdMd#=?a=Pb=PG$% if("((G<3a$PP(G>3b$$$ putchar(E1E$% if("(G<3aYYG>3b$$ putchar(E1E$% if("(G<3a$PP"(G>3b$$ putchar(E1E$% if("(G<3a$YY"(G>3b$$ putchar(E1E$% & a) nici o dat b) o dat c) de dou ori d) de trei ori e) de patru ori 7=. 0ac n timpul e!ecuiei programului de mai &os n $a primi $aloarea 232213, care $or fi n final $alorile $ariabilelor (1, (2 i (3 8 #include<stdio.h> void main($ { long n% unsigned int f1=f2=f+=c% scanf(Mld#=Pn$% f13f23f+35% do{ c3nM15% n3nW15% s;itch(c$ { case 1H { f1BB% brea(% & case 2H { f2BB% brea(% & case +H { f+BB% brea(% & & &;hile(n"35$% printf(Mu Mu Mu#=f1=f2=f+$% & a) f101,f$01,f%01 b) f101,f$0$,f%0$ c) f101,f$0$,f%0% d) f10$,f$01,f%0% e) f10%,f$0$,f%01 7>."entru n<*, care dintre sec$enele de program de mai &os trebuie e!ecutat astfel nc%t, la finele e!ecuiei, $aloarea $ariabilei p s fie 9: 8 a$ p31% i32% ;hile(i<3n$ { pN3i%iB32%& b$ p31% i31% ;hile(i<nW2${iBB%p3pN(2NiB1$% & c$ p31% i31% ;hile(i<3nW2$ {p3pN(2Ni$%iBB% & d$ p31% i35% ;hile(i<n$ { iB32%pN3i% & e. nici una dintre secvenele anterioare
7:. "recizai care dintre urmtoarele sec$ene de instruciuni atribuie $ariabilei ntregi ! $aloarea n2, cu n numr natural. a$ G31% for(O31%O<+%OBB$ GN3n% b$ G31% for(O31%O<3n%OBB$ GN32% c$ G31% O35% ;hile(O<2$ GN3n% OBB% d$ G31% O35% do{ OBB% GN3n%&;hile(O<2$% e$ G3nNn% 7E. "recizai care dintre urmtoarele sec$ene de instruciuni atribuie $ariabilei ntregi ! $aloarea 12n, cu n numr natural. a$ G315% for(O31%O<3n%OBB$GN3i% b$ G31% for(O3n%O>5%ODD$ GN315% c$ G31% O31% do{ GN315% OBB% &;hile(O<n$% d$ G31% O35% ;hile(O<3n$ { OBB% GN3i%& e$ nici una dintre variantele anterioare 9;. 0educei ce $aloare se $a afia n urma e!ecuiei sec$enei de program de mai &os, dac $alorile $ariabilei ! citite de la tastatur sunt n ordine 3G2G4G3G5G12G22G2. scanf(Md#=PG$% nr35% do{ X3n% scanf(Md#=PG$% if(G332NX$ nrBB% &;hile(G"35$% printf(Md#=nr$% a) " b) 1 c) $ d) % e) ) 92. Care dintre urmtoarele sec$ene de nstruciuni atribuie $ariabilei ntregi u $aloarea primei cifre a numrului natural reprezentat de $ariabila ! 8 a$ u3G% ;hile(u>315$ u3uM15% b$ ;hile(G>315$ G3GW15% u3G% c$ u3GW15% d$ u3GM15% e$ nici una din variantele anterioare 94. Care dintre urmtoarele sec$ene de instruciuni atribuie $ariabilei ntregi u $aloarea ultimei cifre a numrului natural reprezentat de $ariabila ! 8 a$ ;hile(G>315$ G3GW15% u3G% b$ u3G% ;hile(u>315$ u3uM15%
c$ u3GM15% d$ u3GW15% e$ toate variantele anterioare 97. Fie sec$ena de program urmtoare, n care o8 este o $ariabil de tipul int, iar ! este un numr natural. o(35% for(O32%O<G%OBB$ if(GMO335$ o(31% printf(Md#=o($% Sec$ena afieaz 2 dac: a. numrul G are cel puin un divizor propriu b. numrul G nu are nici-un divizor propriu c. toate numerele naturale mai mici ca n, fr " i 1, sunt divizori proprii ai lui G d. numrul G are cel mult un divizor propriu e) nici una dintre variantele de mai sus 99. Se consider sec$enele de program de mai &os. "entru n<4, precizai care dintre sec$ene afieaz, n urma e!ecuiei, irul de numere: 1G2G2G3G3G3G4G4G4G4 . a$ for(O31%O<3n%OBB$ for((31%(<3n%(BB$ printf(M2d#=O$% b$ for(O31%O<3n%OBB$ for((31%(<3O%(BB$ printf(M2d#=O$% c$ for(O31%O<3n%OBB$ for((31%(<3n%(BB$ printf(M2d#=($% d$ for(O31%O<3n%OBB$ for((31%(<3O%(BB$ printf(M2d#=($% e$ for((31%(<3n% (BB$ for(O31%O<3n%OBB$ printf(M2d#=O$% 9<. Fie sec$ena de program urmtoare: s35% for(O3+%O<3n%OB3+$ sB3O% Se dau mai &os cinci triplete de numere, fiecare astfel de triplet reprezent%nd un set de $alori pentru $ariabila de intrare n. Care dintre aceste triplete au proprietatea c pentru toate cele trei $alori ale lui n din triplet se obine aceeai $aloare a lui s 8 a) (%, ,+) b) (+,-,.) c) (1",11,1$) d) (+,;,1$) e) (1 ,1+,1-)
9=. Consider%nd c toate $ariabilele sunt ntregi, ce $aloare se afieaz dup e!ecuia sec$enei de mai &os 8 s35%t35%G3+%i31%X31%Q31% do{ if(G>5$ if(X>1$ if(Q>2$ t3G% else t3GBX% else t3GBXBQ% sB3iBt% iBB% &;hile(i>?$% a) 1 b) c) + d) 1 e) +% 9>. Care dintre irurile de $alori date n $ariantele de rspuns trebuie introduse de la tastatur n timpul e!ecuiei programului urmtor, astfel nc%t s se declaneze un ciclu infinit 8 #include<stdio.h> void main($ { int G=X% ;hile(scanf(Md#=PG$331 PP scanf(Md#=PX$331 PP (GYYX$$ do{ XDD% printf(NMd NMd#=G=X$% &;hile(G"3X$% & a) $,-,%,.,"," b) $, ,),),"," c) 1,%,+,$,"," d) $,), ,.,"," e) "," 9:. "entru programul urmtor, care dintre afirmaiile de mai &os sunt ade$rate 8 #include<stdio.h> void main($ { int s=G% for(s35=G31%5%sB3G=scanf(Md#=G$ if("G$ brea(% printf(Md#=s$% & a) dac de la tastatur se introduc, n ordine, numerele $,%,) i , atunci programul va afia suma numerelor citite, adic 1) b) dac prima valoare introdus de la tastatur este ", atunci ciclul se nc(eie i se afieaz valoarea 1 c) ciclul este eronatD nu se poate face o citire n linia for d) instruciunea if este eronat e) din cauz c lipsete expresia care d condiia de continuare, ciclul for se va executa la infinit
9E. Care dintre sec$enele de mai &os afieaz corect irul cifrelor impare /*531 n aceast ordine 8 a$ for(O3A%O>31%ODD$ printf(Md#=ODD$% b$ for(O35%O<3A%OBB$ printf(Md#=ADOBB$% c$ for(O3A%ODD>31%$ printf(MdMd#=O=ODD$% d$ O315% ;hile(ODD$ printf(Md#=DDO$% e$ O31%
do{
printf(Md#=15DOBB$% &;hile(O<3A\OBBH5$%
Cap.& Tablouri
&.1 Declararea tablourilor
In tablou reprezint un tip structurat de date care ocup o zon de memorie continu,cu elemente componente de acelai tip. n cadrul tabloului un element este n mod unic identificat prin poziia ocupat n cadrul structurii. Cceast poziie este definit prin unul sau mai muli indici sau indec#i, din acest moti$ tablourile numindu)se variabile inde!ate. 0eclararea unui tabou se face cu sinta!a : tip numeYdim_1ZYdim_2ZEE..Ydim_nZU unde : ! tip este tipul elementelor componente ale tabloului. Ccesta poate fi un tip predefinit sau definit de utilizator ! nume este numele $ariabilei tablou ! dim_1G dim_2GE..Gdim_n sunt numere ntregi poziti$e care e!prim dimensiunile tabloului "entru a utiliza un element din tablou se folosete sinta!a : numeYinde!_1ZYinde!_2ZEEYinde!_nZ fiecare inde! respect%nd condiia inde!_i { 2GEEGdim_i'1}. In tablou unidimensional se numete vector, iar un tablou bidimensional se numete matrice . !emple: char sK155L% int GK29L% long double aK15LK19L% Obser$aii: ! primul element dintr)un $ector $a a$ea inde!ul 2, iar ultimul element stocat $a a$ea inde!ul dim'1 ! primul element dintr)o matrice $a a$ea inde!ul 32G24, iar ultimul $a a$ea inde!ul 3dim_1'1Gdim_2'14 ! dimensiunile tabloului trebuie s fie e!presii constante ! compilatorul nu face $erificri pentru depirea dimensiunii tabloului ! pentru alocarea unui tablou sunt necesari nr_elementeDsi5eo(3tip4 octei, unde tip este tipul de baz al tabloului ! atribuirea tablourilor nu poate fi fcut direct !emplu % int GK15L=XK15L% G3X% '(operaie ilegal('
ec3i$alent cu : int aKLK2L3{{1=2&={+=:&={9=>&&% sau c3iar cu: int aK+LK2L3{1=2=+=:=9=>&% iniializarea int mK2LK+L3{{1&={2&&% care este ec3i$alent cu : int mY2ZY3Z<bb1G2G2c G b2G2G2ccU
epuizm elementele $ectorului. 0e e!emplu, determinarea primului element nul dintr)un $ector se realizeaz cu sec$ena: f3D1% for(O35%O<n%OBB$ if("aKOL$ { f3O% brea(% & /erific%nd $aloarea $ariabilei ( decidem dac n $ectorul e!ist cel puin un element cu proprietatea cerut -(Uindicele acestuia. sau nici unul -( <'1..
for(O3n%O>3(%ODD$ aKOL3aKOD1L% '( deplasm elementele spre dreapta (' aK(D1L3X% '( inserm elementul V (' nBB% '( actualizm dimensiunea ('
for(i35% i<nD1% iBB$ '( elementul care se compar (' for(O3iB1%O<n%OBB$ '( elem. de dup el cu care se compar (' if(aKiL>aKOL$ '( pentru ordonare cresctoare (' { auG3aKiL% aKiL3aKOL% aKOL3auG2 '( intersc3imbm elementele (' &
O35% '( indicele elementului curent din D (' for((35% (<mBn% (BB$ '( T este indicele elementului curent din C (' if(aKiL<bKOL$ '( pentru ordonare cresctoare (' cK(L3aKiBBL% '( a$ansez n $ectorul C (' else cK(L3bKOBBL% '( a$ansez n $ectorul D ('
& a) nici unul b) unul c) dou d) trei e) toate =. Fie programul urmtor : void main($ { int i=O=m=n=p=aK15LK15L=bK>L% m32% n3+% p3>% i35% ;hile(i<p$ bKiBBL3i% for(i35%i<m%iBB$ for(O35%O<n%OBB$ aKiLKOL3bK+NiBOL% & n urma e!ecuiei sunt posibile urmtoarele situaii: a) programul nu funcioneaz din cauz c declaraia matricei este eronat b. valorile vectorului b sunt ",1,$,%,), c. valorile vectorului b sunt 1,$,%,), ,+ d. aK1LK5L are valoarea % e. aK5LK2L are valoarea $ >. Se consider o matrice a cu n linii(n coloane i un $ector v cu n elemente. "recizai care $or fi elementele $ectorului v, dup e!ecuia sec$enei urmtoare: int nr= n= i= O= G= bK25L% int aK+LK+L3{{?=1=?&={D?=?=5&= {2=:=11&&% n3+% G3?% for(i35%i<n%iBB$ { nr35% for(O35%O<n%OBB$ if(aKiLKOL33G$ nrBB% bKiL3nr% & a) nedefinite b) v0(",",") c) v0(1,$,%) d) v0($,",1) e) v0($,1,")
:. Se consider sec$ena de program urmtoare, n care a este o matrice cu n linii(n coloane i elemente numere ntregi, iar ! este o $ariabil de tip ntreg. G31% for(i31%i<3nD1%iBB$ for(O35%O<3iD1%OBB$ if(aKiLKOL"35$ G35% n urma e!ecuiei sec$enei, $aloarea $ariabilei ! $a fi 2 dac: a. deasupra diagonalei principale exist cel puin un element egal cu " b) toate elementele de deasupra diagonalei principale sunt " c) toate elementele de sub diagonala principal sunt diferite de " d) toate elementele de sub diagonala principal sunt " e) sub diagonala principal exist cel puin un element diferit de " E. Fie urmtorul program: #include<stdio.h> void main($ { int vK25L= i= n= 2% scanf(Md#= Pn$% for(i35%i<n%iBB$ vKiL3iM2 \iHDi% for(231=i35%i<n% 2N3vKiBBL$% 2BB% printf(Md#=2$% & n urma e!ecuiei sale sunt posibile urmtoarele situaii: a. expresia condiional din primul ciclu for este eronat din punct de vedere sintactic b. dac variabila n primete prin citire valoarea +, atunci elementele vectorului v vor fi, n ordine (",1,-$,%,-), ) c. prezena caracterului *2* dup al doilea ciclu for constituie o eroare d. dac variabila n primete prin citire valoarea , atunci programul afieaz %$ e. programul funcioneaz corect pentru orice valoare ntreag a lui n mai mic sau egal cu .,*0J 2;. Care dintre sec$enele de program de mai &os afieaz corect elementele vY2ZG ......vYn'1Z ale unui $ector de ntregi 8 a$ i35%
;hile(i<n$ { printf(Md#= vKiL$% iBB%& b$ i35% ;hile(i<n$ { iBB% printf(Md#= vKiL$% & c$ i35% do{ iBB% printf(Md#= vKiL$% &;hile(i<n$% d$ i35% do{ printf(Md#= vKiL$% iBB &;hile(i<n$% e$ nici una 22. Care dintre sec$enele de mai &os afieaz corect produsul elementelor pare ale unui $ector vY2ZG.......GvYn'1Z cu n elemente ntregi 8 a$ p31% for(O31%O<3n%OBB$ if(vKOLM233$ p3pNvKOL% b$ p31% for(O35%O<n%OBB$ if(vKOLW2335$ p3pNvKOL% c$ p35% for(O35%O<n%OBB$ if(vKOLM2"35$ p3pNvKOL% d$ p31% for(O35%O<n%OBB$ if(vKOLM2335$ pN3vKOL% e$ p35% for(O35%O<n%OBB$ if(vKOLM2335$ pN3vKOL% 24. Care dintre afirmaiile de mai &os sunt ade$rate pentru sec$ena de program urmtoare 8 p35% for((31%(<>%(BB$ if(vK(L>vKpL$ p3(% printf(Md#= p$% a) secvena este corect din punct de vedere sintactic b. ciclul for are cinci pai c) dac elementele vectorului sunt ,),-11,;,-1$,1,atunci programul afieaz valoarea ) d. dac elementele vectorului sunt %,-$,.,+,11,), atunci programul afieaz valoarea ) e) indiferent care ar fi elementele vectorului, secvena dat nu poate afia valoarea " 27. "entru sec$ena de program urmtoare, precizai care dintre afirmaiile de mai &os sunt ade$rate: int O35 = vK9L3{1=1=1=1=1&% ;hile(O<9PPvKOLPP"vKOL$ {vKOL35%OBB%&
c) % intr n bucl
2>. 0educei care $or fi, n ordine, de la st%nga la dreapta, elementele nenule ale $ectorului a la sf%ritul e!ecuiei sec$enei de program urmtoare: int (= O35% int vK?L3{5=2=?=+=:=4=9&% int aK?L3{5=5=5=5=5=5=5&% for((35%(<?%(BB$ if((vK(LM2335$PP((M2"35$$ { aKOL3vK(L% OBB% & a) $,),. b) -, c) $,. d) $,%,. e) -,%, 2:. Care parcurgere pe linii i coloane a unei matrici nDm este corect 8 0$ for(i35%i<n%iBB$ for(O35%O<m%OBB$ printf(Md#=aKiLKOL$% 00$ for(O31%O<m%OBB$ for(i31%i<m%iBB$ printf(Md#=aKiLKOL$% 000$ for(i35%i<n%iBB$ for(i35%O<m%iBB$ printf(Md#=aKiLKOL$% a) doar B b)doar BB c) doar B si BB d) doar B si BBB 2E. Care din sec$enele de calcul a mediei unui ir de n ntregi este corect 8 0$ int i=n=s% float med% s35% for(i35%i<n%iBB$ sB3aKiL% med3sWn% 00$ int i=n=s% float med% for(i35=s35%i<n%iBB$ sB3aKiL% med3(float$sWn% 000$ int i=n=% float med= s% s35% for(i35%i<n%iBB$ sB3aKiL% med3sWn% a) doar B b)doar BB c) doar BBB d) doar BB i BBB 4;. Calculul mediei geometrice a unui ir de n ntregi este: 0$ int i=n= pr% float med% for(pr31=i35%i<n%iBB$ prN3aKiL% med3s[rt(pr$%
00$
int i=n= pr% float med% for(pr31=i35%i<n%iBB$ prN3aKiL% med3po;(pr= 1Wn$% 000$ int i=n= pr% float med% for(pr31=i35%i<n%iBB$ prN3aKiL% med3po;(pr= 1.Wn$% a) doar B b) doar BB c) doar BBB d) doar BB i BBB 42. Ce sec$en calculeaz corect ma!imul unui ir cu n $alori8 0$ for(maG35= i35%i<n%iBB%$ if(aKiL>maG$ maG3aKiL% 00$ maG3aK5L% for(i35%i<n%iBB$ if(aKiL>aKiBBL$ maG3aKiL% 000$ maG3aK5L% for(i35%i<n%iBB$ if(aKiL>maG$ maG3aKiL% a) doar B b) doar BB c) doar BBB d) doar B i BB 44. Fie HY1..nZ si eY1..nZ $ectori de ntregi. Care $a fi $aloarea lui eYnZ dup e!ecuia sec$enei: ^K1L3GK1L% for (i32%i<n%iBB$ XKiL3XKiD1LBGKiL% a$ GKnLBGKnD1L b$ GKnL c$ GK1LBGK2LB..BGKnL d$ nici una din valorile indicate 47. Fie HY1..nZ si eY1..nZ $ectori de numere reale. 0up e!ecuia sec$enei de program : XK1L3DGK1L% for(i32%i<n%iBB$ XKiL3XKiD1LNGKiL% elementul eYnZ e!prim : a$ GK1LNGK2LNNGKnL b$ CGK1LNGK2LN.NGKnL c$ (D1$n GK1LN..NGKnL d$ nici una din valorile indicate 49. Fie VY1..nZ $ector de intregi . Sec$ena de program : i31% for(i31%i<3nW2%iBB$ { O3nDi% auG3vKiL% vKiL3vKOL% vKOL3auG% & are ca efect : a) inversarea ordinii elementelor n vector b. inversarea ordinii tuturor elementelor n vector numai c4nd n este impar
c. inversarea
ordinii tuturor elementelor n vector numai c4nd n este par d) nici una din variantele indicate 4<. Se consider matricea ptratic ?3m!m. . Fie sec$ena de program : G3aK5LKmD1L% for(i35%i<m%iBB$ if G<aKiLKmDiL G3aKiLKmDiL% /ariabila ! calculat e!prim : a) valoarea maxim de pe diagonala principal b) valoarea maxim de pe diagonala secundar c) valarea maxim din ntreaga matrice d) alt valoare decat cele indicate 4=. Fie matricea ptratic ?3m!m4 i sec$ena de program : G3aK5LK5L% for(i35%i<m%iBB$ { if(G<aKiLKiL$ G3aKiLKiL% if(G<aKiLKmDiD1L$ G3aKiLKmDiD1L% & /ariabila ! calculat reflect : a) valoarea cea mai mare de pe diagonale b) valoarea cea mai mare de pe diagonala principal c) valoarea cea mai mare de pe diagonala secundar d) alt valoare decat cele indicate 4>. Fie matricea ?3m!m4 i sec$ena de program: s31% for(i35%i<m%iBB$ for(O35%O<i%OBB$ sN3aKiLKOL% /aloarea calculat s reflect : a) produsul valorilor de sub diagonala principal b) produsul valorilor de pe diagonala secundar c) produsul valorilor din ntreaga matrice d) alt valoare dec4t cele indicate 4:. Fie o matrice ?3n!n4 citit de la tastatur . Ctunci sec$ena de cod : i35% m3aK5LK5L% ;hile(i<n$ { for(O35%O<n%OBB$ if(m<aKiLKOL$ m3aKiLKOL% iBB% & a. calculeaz elementul maxim m dintre elementele matricii
b. calculeaz
elementul minim m dintre elementele matricii c) se cicleaz la infinit d. numr elementele matricii care sunt mai mari ca m 4E. Fie sec$ena de cod de mai &os. 0ac considerm ca date de intrare tabloul V1 de dimensiune n, atunci tabloul V2 $a conine : for(i35%i<n%iBB$ v5KnDiD1L3v1KiL% a. elementele lui `1 n ordine invers b. o parte din elementele lui `1 c) numai elem! impare ale lui `1 d) algoritmul depune elementele lui `1 n ordine invers numai dac n este impar 7;. Fie urmtoarea sec$en de cod care primete o matrice - ptratic de dimensiune n la intrare : p31% for(i35%i<n%iBB$ p3pNmKiLKiLD2% atunci aceasta realizeaz : a) produsul elementelor din matrice b) produsul elementelor de pe diagonala principal a matricii m c) o prelucrare a elementelor de pe diagonala principal a matricii m d) se cicleaz la infinit 72. Care este $aloarea elementului tabY2ZY3Z dup e!ecuia sec$enei de cod : int i=O% int ctr35% int tabK:LK:L% for(i35%i<:%iBB$ for(O35%O<:%OBB$ { tabKiLKOLH3ctr% BBctr% & a) b) ; c) 11 d) 1) 74. Ce face urmtoarea sec$en 8 scanf(Md#=Pn$% for(i35%i<n%iBB$ scanf(Md#=PaKiL$% printf(FnMd#=aK5L$% for(i31%i<n%iBB$ { eG35% for(O35%O<i%OBB$ if(aKiL33aKOL$ eG31% if("eG$ printf(Md#=aKiL$% & a) afieaz numerele dintr-un ir care sunt n mai multe exemplare b) afieaz numerele cu apariie singular n ir c) afieaz numerele dintr-un ir d) afieaz numerele impare dintrun ir
77. Ce realizeaz urmtoarea sec$en de program8 i35% do { iBB% aKiL3nrM2% nrW32% &;hile(nr$% n3i% for(i3n%i>5%iDD$ printf(Md#=aKiL$% a) convertirea b1"-Gb$ a unui numr fracionar b) convertirea b1"-Gb$ a unui numr ntreg c) convertirea b1"-Gb% a unui numr ntreg d) convertirea b1"-Gb$ a unui numr ntreg pozitiv 79. Se d urmtoarea sec$en de cod : int XK9L3{+=:=9=>=5&% Ce $aloare conine XK+L 8 a) % b) c) + d) codul nu compileaz pentru c nu sunt destule valori 7<. Se d codul : short testarraXK:LK+L3 {{1&={2=+&={:=9=>&&% printf(MdFn#=siQeof(testarraX$$% "resupun%nd c tipul @s,ortA este de lungime 4 octei, ce $a afia codul de mai sus 8 a) nu va compila pentru c nu sunt dai destui iniializatori b) + c) 1$ d) $) 7=. Fie sec$ena de cod : int G=i=t% int XK15L3{+=>=A=9=?=2=4=15=5=+&% ;hile(1$ { G35% for(i35%i<A%iBB$ if (XKiL>XKiB1L$ { t3XKiL% XKiL3XKiB1L% XKiB1L3t% GBB% & if(G335$ brea(% & Cum $a arta $ectorul dup e!ecuia acestui cod 8 a) programul va rula la infinit b) P",$,%,%, ,+,-,.,;,1"Q b) P1",;,.,-,+, ,%,%,$,"Q c) P%,+,;, ,-,$,.,1",",%Q 7>. !ist greeli n sec$ena de calculare a mediei aritmetice8 #include<stdio.h>
#include<conio.h> void main(void$ { int aK+5L=i=n325% int s35% float ma% for(i35%i<n%iBB$ { printf(FnaKMdL3#=i$% scanf(Md#=PaKiL$% & for(i35%i<n%iBB$ s3sBaKiL% ma3sWn% printf(Fn6eQultatul3Mf#=ma$% getch($%
&
a) nu, secvena este corect b. da, deoarece nu au fost citite toate elementele tabloului c) da, deoarece va fi afiat doar partea ntreag a rezultatului d) da, deoarece nu au fost citite corect toate elementele vectorului
Cap.* 0ointeri
*.1 Variabile pointer
n memoria intern, $alorile $ariabilelor sunt stocate n locaii care sunt referite prin numere numite adrese. O locaie de memorie are asociat o adres unic. Cea mai mic entitate de memorie adresabil direct este bVtul sau octetul. S presupunem $ariabila de tip ntreg a cu $aloarea > ce ocup n memorie doi octei. /aloarea $ariabilei a, care este >, ocup o locaie de memorie care se poate referi direct prin numele $ariabilei sau indirect prin adresa ei, adr3a4. 1 variabil$ capabil$ s$ stoc,e5e adresa unei alte variabile se numeste pointer. 5imba&ul C pune la dispoziie doi operatori pentru lucru cu adrese : ! operatorul [ cu rol de e!tragere a adresei unei $ariabile ! operatorul D cu rol de e!tragere a coninutului zonei de memorie adresate de o $ariabil pointer /ariabila pointer se definete n concordan cu un tip de dat. 0e e!emplu, declaraia int Dp!U precizeaz c p! este un pointer spre ntreg, adic $ariabila p! este capabil s stoc3eze adresa unui ntreg. Operatorul D , n declaraie, are rolul de a e!prima faptul c nu p! este de tip ntreg ci coninutul de la adresa memorat n p! este de tip ntreg. 0eci p! este un pointer la ntreg. Fie programul : #include<stdio.h> void main($ { int G39=NpG% pG3PG% printf(FnG3Md#=G$% printf(FnG3Md#=NpG$% & n urma e!ecuiei lui se $a afia de dou ori $aloarea $ariabilei !, adic <. n primul caz s)a folosit adresarea direct a $ariabilei folosindu)se numele ei. n al doilea caz s)a folosit adresarea indirect a $ariabilei, mai precis, s)a e!tras coninutul de la adresa ei 3Dp!.. Se obser$ c, n prealabil, adresa $ariabilei ! a fost stocat n pointerul p!. "e l%ng definirea de pointeri spre tipurile fundamentale cum ar fi : float NpX% ) p: este un pointer la float char Npc% ) pc este un pointer la caracter e!ist posibilitatea definirii acestora i spre tipuri structurate de date. Cstfel, declaraiile : int (NpG$K15L% e!prim faptul c p! este un pointer la un $ector cu 2; elemente de tip ntreg int NptK15L% e!prim faptul c pt este un $ectori de pointeri la ntregi. ste important ca pointerul s stoc3eze adresa unei $ariabile ce are un tip bine definit, pentru ca e!presii de genul Dpointer s se poat e$alua corect Coninutul de la o adres poate fi de dimensiuni diferite, minim un octet. C$%nd bine precizat tipul de dat referit de pointer, coninutul de la acea adres este e!tras n mod corect n funcie de mrimea n octei a tipului de dat respecti$. n e!emplu, Dp! refer doi octei de la adresa stocat n p! consider%nd c un ntreg se memoreaz pe 4 octei. !ist i pointerul generic, adic un pointer fr tip de dat asociat -spre void. ce se declar sub forma void Dp. Ccest tip de pointer este folosit mai mult pentru transferul i stocarea adreselor n cadrul programelor. In alt aspect important ce ine de lucrul cu $ariabile pointer, care genereaz erori n munca de programare, se refer la faptul c se poate accesa coninutul unei $ariabile pointer numai dup ce pointerul refer o zon de memorie ce a fost alocat n prealabil. Se mai spune c, n acest caz, pointerul conine o adres $alid . "rezentm dou moduri de ncrcare a unui pointer : a. cu adresa unei $ariabile anterior definitP n acest caz alocarea s)a fcut la momentul definirii $ariabilei : int a3+5=Npa% pa3Pa% b. prin alocare dinamic de memorie ce se face n momentul e!ecuiei programului P pentru realizarea unei astfel de operaii se poate folosi operatorul ne7. Forma general este :
pointer<ne7 tipU unde : ) pointer 6 reprezint $ariabila pointer ce urmeaz a se ncrca ) tip 6 reprezint un tip de date pentru care se face alocarea zonei de memorieP se folosete pentru a determina mrimea n octei a zonei de memorie ce urmeaz a se aloca i care este egal cu si5eo(3tip4 . !emplu: int Npi% pi3ne; int% Npi39% printf(FnMd#=Npi$% n cazul n care se dorete a se aloca o zon de memorie care s stoc3eze mai muli ntregi -nr. atunci se $a folosi operatorul ne7 n forma : pointer<ne7 tipYnrZU unde : ) tip 6 este tipul de dat referit de pointer ) nr 6 reprezint numrul de elemente de tipul tip Brimea n octei ce se $a aloca se obine conform relaiei : nrDsi5eo(3tip4 . 5egat de acest operator, limba&ul C pune la dispoziie i operatorul delete pentru dealocarea unei zone de memorie alocat n prealabil cu operatorul ne7. Forma de utilizare a operatorului este : delete pointer sau delete YnrZpointer unde : ) pointer 6 reprezint $ariabila pointer ) nr 6 reprezint numrul de elemente cu tipul referit de $ariabila pointer !emplu: Se $a aloca dinamic o zon de memorie capabil s stoc3eze n $alori double, dup care spaiul $a fi dealocat. double Np% int n39% p3ne; doubleKnL% .. delete KnLp% Bemoria alocat dinamic i pstreaz coninutul p%n c%nd se dealoc n mod e!plicit n cadrul programului.
double aKL3{9.+=2.1&=Npa% pa3PaK5L% '( adresa de nceput a tabloului , adic adresa elementului aG;H (' printf(Fn <rimul element3Mlf#=Npa$% paBB% '( conine adresa urmtorului element din tablou , adic adresa lui aG2H (' printf(Fn ,l doilea element3Mlf#=Npa$% <. peraia de adunare a unui !ntreg la un pointer. 0ac se adun $ariabila 8 la un pointer spre tipul T60 se obine o dres mai mare cu 8Dsi5eo(3T604. !emplu : double aKL3{9.+=2.1=4.A=15&=Npa% int i% pa3PaK5L% i32% printf(Fn Mlf#=N(paBi$$% '( se $a afia al treilea element din $ector adic :.E (' i3+% print(Fn Mlf#=N(paBi$$% '( se $a afia al patrulea element din $ector adic 2; (' =. peraia de conversie !ntre pointeri. Cceast operaie se face cu a&utorul operatorului de con$ersie e!plicit -cast.. "entru e!emplificare $om prezenta o funcie ce are ca scop alocarea dinamic de memorie . a are prototipul : void Dmalloc3int4U care se afl n 3eader)ul alloc.,. "arametrul are ca scop dimensionarea zonei de memorie n octei i funcia returneaz adresa la care s)a alocat zona de memorie. Se obser$ c aceast funcie returneaz un pointer la void adic un pointer generic care nu poate fi folosit n cele mai multe operaii uzuale asupra pointerilor. 0e aceea, el trebuie con$ertit ntr)un pointer spre un tip de dat bine precizat. "entru dealocarea zonei de memorie ce a fost alocat anterior cu funcia malloc, biblioteca limba&ului pune la dispoziie funcia (ree care are prototipul : void (ree3void D4U "arametrul funciei reprezint pointerul ncrcat printr)un apel al funciei malloc. n sec$ena : int Npa=n39% pa3(intN$malloc(nNsiQeof(int$$% '( con$ersie n pointer spre ntreg (' free(pa$% s)a alocat o zon de memorie capabil s stoc3eze < $ariabile de tip ntreg. Cdresa zonei a fost stocat n $ariabila pointer spre ntreg pa. 0up ce s)au efectuat prelucrrile necesare asupra zonei de memorie i ea nu mai este necesar n program, atunci se elibereaz spaiul cu funcia (ree. >. peraia de scdere a doi pointeri necesit ca pointerii s fie spre acelai tip. 1ezultatul reprezint numrul de elemente de tipul referit de pointer ce se afl ntre cele dou adrese. n cazul n care tipul de dat referit de pointer este T60 atunci diferena dintre doi pointeri -p2 i p4. se calculeaz dup relaia (p1Dp2$WsiQeof( 0<$! Ca e!emplu, se $a scrie sec$ena de program care determin lungimea unui ir de caractere : char sirK95L=Npc% printf(Fn Vati sirul H $%gets(sir$% pc3PsirK5L% ;hile(NpcBB$% printf(Fn Sungimea sirului este Md#=pcDsirD1$% :. peraia de comparaie dintre pointeri se realizeaz folosind operatorii de egalitate i cei relaionali. Cstfel, ca e!emplu, se $a prezenta sec$ena de tra$ersare a unui $ector n scopul afirii elementelor sale: int aKL3{9=:=+=2=?&% int n3siQeof(a$WsiQeof(int$% '( numrul de elemente din $ector(' int Np1=Np2=Npc% for(p13pc3PaK5L=p23PaKnD1L%pc<3p2%pcBB$ printf(Fn elementul Md#=Npc$%
p3a% '( asigneaz lui p adresa de nceput a tabloului a (' '( afiarea primelor trei elemente ale tabloului a (' printf(Md Md Md#=Np=N(pB1$=N(pB2$$% '( afieaz acelai lucru (' printf(Md Md Md#=aK5L=aK1L=aK2L$% & n acest caz, ambele instruciuni print(34 afieaz acest lucru. "arantezele din e!presii ca D3pW24 sunt necesare, deoarece operatorul D referitor la pointeri are o preceden mai mare dec%t operatorul W. 0ac folosii un pointer pentru a accesa un tablou bidimensional, trebuie s e!ecutai manual ceea ce compilatorul face automat. 0e e!emplu, n tabloul float balanceK15LK9L%fiecare r%nd are < elemente. "entru a accesa balanceY3ZY1Z folosind un pointer de tip float, trebuie utilizat un fragment de forma: N(pB(+N9$B1$% n general, la tablourile multidimensionale este mai uoar folosirea inde!rii numelui dec%t folosirea pointerului aritmetic. !emplul 4: In pointer se poate inde!a ca i c%nd ar fi un tablou. Irmtorul program este $alid: #include<stdio.h> char strKL3#<ointerii sunt puternici#% void main($ { char Np% int O% p3str% for(O35%pKOL%OBB$ '( ciclare p%n la nt%lnirea caracterului NI55 (' printf(Mc#=pKOL$% & !emplul 7: In pointer poate fi inde!at numai dac el puncteaz un tablou. 0ei urmtorul program este corect din punct de $edere sintactic, e!ecutarea lui $a conduce probabil la blocarea calculatorului: char Np=ch% int i% p3Pch% for(i35%i<15%iBB$ pKiL3E,EBi% ntruc%t c, nu este un tablou, pointerul p nu poate fi inde!at. 0ei un pointer punct%nd un tablou poate fi inde!at ca i cum ar fi un tablou, rareori se $a proceda astfel, deoarece, n general, prin folosirea pointerilor aritmetici se obin programe mai rapide. !emplul 9: n biblioteca ct:pe., e!ist funciile toupper34 i tolo7er34 care transform literele mici n litere mari i in$ers. Irmtorul program cere utilizatorului s introduc un ir de caractere i apoi afieaz irul introdus mai nt%i cu litere mari i apoi cu litere mici. /ersiunea urmtoare, pentru a accesa caracterele din ir, inde!eaz numele tabloului. #include<stdio.h> #include<ctXpe.h> #include<conio.h> void main($ { char strK45L% int i% clrscr($% printf(0ntroduceti un sir H $% gets(sir$% for(i35%strKiL%iBB$ strKiL3toupper(strKiL$% puts(sir$% '( afiarea cu litere mari (' for(i35%sirKiL%iBB$ strKiL3tolo;er(strKiL$% puts(sir$% '( afisarea cu litere mici (' getch($% & !emplul <: n $arianta urmtoare este folosit un pointer pentru a accesa caracterele irului i este preferat de programatorii profesioniti deoarece incrementarea unui pointer este mai rapid dec#t indexarea unui vector. #include<stdio.h> #include<ctXpe.h> #include<conio.h> void main($
char strK45L= Np% int i% clrscr($% printf(introduceti sirulH $% gets(str$% p3str% ;hile(Np$ NpBB3toupper(Np$% puts(sir$% '( afiarea cu litere mari (' p3str% ;hile(Np$ NpBB3tolo;er(Np$% puts(str$% '( afiarea cu litere mici (' getch($%
& !emplul =: In pointer poate fi i decrementat. Irmtorul program folosete un pointer pentru a copia coninutul unui ir n alt ir, n ordine in$ers: #include<stdio.h> #include<string.h> char str1KL3#<ointerii sunt foarte utili#% void main($ { char str2K45L=Np1=Np2% '( p2 $a puncta sf%ritul irului str2 (' p13str1Bstrlen(str1$D1% p23str2% '( nceputul irului str4 (' 7,ile3p1V<str14 Dp2WW<Dp1''U Np23EF5E% '( caracterul null inc3eie sirul str4 (' printf(Ms Ms#=str1=str2$% getch($% & !emplul >: 5imba&ul C permite utilizarea irurilor constante -iruri de caractere scrise ntre g3ilimele.. C%nd compilatorul nt%lnete un astfel de ir, l depune n tabela de iruri a programului i genereaz un pointer ctre el. 0e e!emplu, programul urmtor citete iruri p%n c%nd este tastat irul stop : #include<stdio.h> #include<sting.h> char Np3#stop#% void main($ { char strK45L% do{ printf(introduceti un sir H $% gets(str$% &;hile(strcmp(p=str$$% & Folosirea pointerilor ctre irurile constante poate fi foarte util c%nd aceste constante sunt foarte lungi. 0e e!emplu, s presupunem c, n anumite puncte ale sale, un program afieaz un mesa&. "entru a tasta c%t mai puin, trebuie aleas $arianta de a iniializa un pointer ctre un ir constant i apoi, c%nd trebuie afiat mesa&ul, s fie folosit acest pointer. char Np3#0nsert dis( into drive , then press 2J 26#% .. printf(p$% printf(p$% . In alt a$anta& al acestei metode const n faptul c, dac mesa&ul trebuie modificat, sc3imbarea trebuie fcut o singur dat i toate referirile la mesa& $or reflecta modificarea fcut. !emplul :: Funcia gets34 citete caracterele introduse de la tastatur p%n c%nd este apsat tasta nter. 0ac operaia se termin cu succes, gets34 returneaz un pointer ctre nceputul irului. n cazul unei erori este returnat un pointer null. "rogramul urmtor arat cum poate fi folosit pointerul returnat de gets34 pentru a accesa un ir care conine informaii de intrare. nainte de a folosi irul, programul $erific dac nu au aprut erori de citire. #include<stdio.h> void main($ { char strK45L=Np%
& 0ac dorii s fii siguri c funcia gets34 nu a lucrat cu erori, o putei plasa direct n instruciunea i( ca n e!emplul urmtor : #include<stdio.h> void main($ { char strK45L% printf(0ntroduceti un sir H $% '( dac pointerul ctre nceputul irului nu este null se produce afiarea (,' if(gets(str$$ printf(Ms#=str$% &
printf(0ntroduceti un sir H#$% p3gets(str$% '( dac p nu este null se afieaz irul (' if(p$printf(Ms Ms#=p=str$%
>. Fie declaraia : int aK15LK15L% Care din e!presiile urmtoare sunt ec3i$alente8 a) 1aKiJ b) 11(a<i) c) 1(1a<i) d) aK"JKiJ e) aKiJK"J :. ste corect sec$ena charNs%gets(s$% 8 E. !plicai care din instruciuni sunt greite n sec$ena urmtoare : char Ns3# est !#% Ns3#,nsi !#% s3#,nsi !#% 2;. Care dintre urmtoarele $ariante reprezint o declaraie corect a unei $ariabile ! de tipul @adres a unei $ariabile ntregiA 8 a. int GN% b$ int NG% c$ int G% d$ int PG% e$ int GP% 22. Se consider declaraia de $ariabile: int m= NG=NX% Care dintre urmtoarele atribuiri sunt corecte 8 a$ G3m% b$ NG3Nm% c$ NX3NG% d$ X3Pm% e$ X3G% 24. Fie declaraiile de $ariabile: int a32=b% int NG=NX% "recizai ce $alori se $or afia, n ordine, n urma e!ecuiei sec$enei de program de mai &os: G3Pa% a39% printf(Md#= NG$% b3aD2% X3Pb% bB3(NX$B:% printf(Md#= b$% NX3NG% printf(Md#= NX$%
,-, ,"
27. Se consider urmtoarea sec$en de program: int N[=NNp=a39=b3+% Np3Pa% WW (1$ [3Np% WW (2$ bB3N(P(NNp$$% WW (+$ printf(Md Md#=N[=b$% Ce putei spune despre atribuirile -2., -4. i -7.8 a) nici una dintre atribuiri nu este corect b) numai atribuirea (1) este Rcorect c) numai atribuirile (1) i ($) sunt corecte d) toate sunt corecte i secvena afieaz de dou ori numrul e) toate atribuirile sunt corecte i secvena afieaz numerele i . 29. Fie atribuirea : 1X3P(N(PQ$$% Cum trebuie scrise corect declaraiile de $ariabile, astfel nc%t atribuirea s fie corect 8 a$ int NX=Q% b$ int X=NQ% c$ int X=NNQ d$ int NNX=Q% e$ int NNX=NQ% 2<. Care dintre instruciunile -?.,-??.,-???.,-?/. din programul urmtor sunt eronate8 "recizai $alorile obinute n cazul instruciunilor corecte. #include<stdio.h> void main($ { const int G3+% int u=v% G3:% WW (0$ N(intN$PG34% WW (00$ u3G% WW (000$ v3N(intN$PG% WW (0`$ & a) B b) BB c) BBB d) BS e) nici una 2=. Clegei atribuirea corect din programul de mai &os: void main($ { int a% void Np% p3(intN$Pa% WW (0$ p3Pa% WW (00$ p3(floatN$Pa% WW (000$ p3P(intN$a% WW (0`$ & a) B b) BB c) BBB d) BS e) nici una
2>. Fie declaraiile de $ariabile: int a32=b=c39% int NG=NX% "recizai ce $alori se $or afia, n ordine, n urma e!ecuiei sec$enei de program de mai &os: G3Pc% aB3NG% printf(Md#=a$% b3BBa% X3Pb% printf(Md#=NX$% G3X% printf(Md#=(NG$BB% a) -,-,b) -,.,; c) -,.,. d) -,-,. e) .,.,; 2:. Fie un pointer ! ctre ntreg. Care dintre instruciunile de ma &os realizeaz corect alocarea dinamic a memoriei 8 a$ G3(int$malloc(siQeof(intN$$% b$ G3(intN$malloc(siQeof(intN$$% c. G3(intN$malloc(siQeof(int$$% d$ NG3(intN$malloc(siQeof(int$$% e$ NG3(int$malloc(siQeof(intN$$% 2E. Fie urmtoarele declaraii de $ariabile: int NNa=Nb=c% Care dintre e!presiile de mai &os $or genera eroare la e!ecuie8 a$ a3P(Pc$% b$ b3P(NNa$% c$ Na3Pc% d$ NNa3Pb% e$ Nb3NNaBc% 4;. Considerm declaraia: int NNp% i atribuirea p3P[% Clegei $arianta potri$it astfel nc%t atribuirea s aib sens. a$ int [% b$ int N[% c$ int NNN[% d$ int P[% e$ nici una 42. "recizai $aloarea $ariabilei a ca urmare a e!ecuiei programului urmtor: void main($ { int a% char b31% a3N(intN$Pb% & a) 1 b) ;c) neprecizat d) nici una e) programul este greit 44. "recizai care dintre instruciunile de atribuire de mai &os face ca ! s primeasc $aloarea ;: void main($ { int a31=b32% float G% G3aW NPb% WW (0$ G3(float$ aWb% WW (00$ & a) B b) BB c) ambele d) nici una e) programul este gresit
47. Care dintre instruciunile de tiprire $or afia aceeai $aloare 8 #include<stdio.h> void main($ { int a32=Np3Pa% printf(MdFn#=NpB1$% printf(MdFn#=NPpB1$% printf(MdFn#=N(pB1$$% printf(MdFn#=N(PpB1$$% & a. prima i a doua b) a doua i a treia c) a doua i a patra d) nici una e) programul este eronat 49. n programul urmtor, care dintre cele patru instruciuni $a tipri $aloarea 228 #include<stdio.h> void main($ { const int G32=X3+% N(intN$PG34% N(intN$PX3A% printf(_MdFn#=GBX$% printf(_MdFn#=N(intN$PGBX% printf(_MdFn#=GBN(intN$PX% printf(_MdFn#=N(intN$PGB N(intN$PX% & a) prima b) a doua c) a treia d) a patra e) nici una 4<. Fie programul urmtor: #include<stdio.h> void main($ { int mKAL=i% for(i35%i<A%iBB$ mKiL3i% ;hile(i>5$ { iDD% N(mBi$3Di% & & Care dintre afirmaiile de mai &os sunt ade$rate 8 a) ambele cicluri sunt greite b) numai primul ciclu este corect c) numai al doilea ciclu este corect d) ambele cicluri sunt corecte e) n cele dou cicluri, elementele vectorului vor primi valori egale n modul, dar de semne opuse 4=. Se consider programul urmtor: #include<stdio.h> void main($ { int a39=b3D12=c3?=NvK+L% vK5L3Pa% WW(1$
& a) declaraia vectorului este eronat b) atribuirile (1), (%) i ( ) sunt toate corecte c) atribuirea (1) este corect, iar (%) i ( ) sunt eronate d) atribuirile (1) i (%) sunt corecte, iar ( ) este eronat e) programul este corect i afieaz valorile , -1$, 4>. Ce $a afia programul urmtor8 #include<stdio.h> void main($ { int (Nv$K+L% int uKL3{15=11=12&% v3Pu% printf(Md#=(Nv$K1L% & a) programul este eronat b) o adres de memorie oarecare, fr nici-o semnificaie c) valoarea ntreag 11 d) adresa de memorie la care se afl valoarea ntreag 11 e) adresa ncep4nd cu care se gsete vectorul v n memorie 4:. Se consider urmtoarea sec$en de program: int aKALK11L=i=O% for(i35%i<A%iBB$ for(O35%O<11%OBB$ if(i33O$ (N(aBi$$ KOL35% else N(N(aBi$BO$3iNO% "recizai care dintre afirmaiile de mai &os sunt false: a) aK9LK2L este 1" b) aK4LK5L este + c) N(N(aB+$B+$ este " d) programul conine erori de sintax e) matricea a este simetric fa de diagonala principal 4E. Se consider urmtoarele declaraii de $ariabile: int [3>=dK+LK:L=(eK+L$K:L=vK:L% int NaK+LK:L=(Nb$K+LK:L= (NcK+L$K:L% Care dintre atribuirile de mai &os sunt corecte8 a$ dK5LK2L3eK1LK+L% b$ aK2LK+L3P[% c$ b3Pd% d$ cK2L3Pv%
e$ toate atribuirile anterioare 7;. "recizai ce $aloare $a afia programul urmtor: #include<stdio.h> void main($ { int aK25LK25L=i=O=n3:% for(i35%i<n%iBB$ for(O35%O<n%OBB$ N(N(aBi$BO$3(i>O$\ (ODi$ H (OBi$% int m315% for(i35%i<n%iBB$ for(O35%O<n%OBB$ if(m>(N(aBi$$KOL$ m3aKiLKOL% printf(Md#=m$% & a) 1" b) + c) % d) =% e) programul este eronat 72. Fie $ectorul : cu patru elemente numere ntregi: int XK:L3{5=1=2=+&% Care dintre urmtoarele instruciuni declar i iniializeaz corect un pointer ptr ctre $ectorul :8 a$ int N(ptrK:L$3PX% b$ int (ptrN$K:L3PX% c$ int (Nptr$K:L3PX% d$ int ptrNK:L3PX% e$ int NptrK:L3PX% 74. Fie urmtorul program: #include<stdio.h> void main($ { int uK:L3{1=2=+=:&= vK:L3{9=>=?=4&= ;K:L3{5=5=5=5&= i% int (NG$K:L3Pu= (NX$K:L3Pv= (NQ$K:L3P;% for(i35%i<:%iBB$ printf(M+d#=(NQ$KiL3 (NG$KiLB(NX$KiL$% & Care dintre afirmaiile de mai &os sunt ade$rate8 a) programul va afia patru adrese de memorie b) programul va afia, n ordine, valorile +,.,1",1$ c. valoarea lui (NG$K2L este % d. valoarea lui (NX$K:L este . e. instruciunea de afiare din ciclu este eronat, din cauza folosirii operatorului de atribuire n funcia printf 77. Fie urmtorul program: #include<stdio.h> void main($ { int GK:L3{1=2=+&= XK:L3{:=9=>=?&=QK?L% int i=O% for(i35%i<:%iBB$ N(QBi$3N(XBi$% for(O35%O<+%OBB$ N(QBiBO$3N(GBO$% for(i35%i<?%iBB$ printf(Md#=N(QBi$$% c Care $or fi $alorile afiate n urma e!ecuiei sale8 a) 1,$,%,), ,+,b) -,+, ,),%,$,1 c) %,$,1,-,+, ,) d) ), ,+,-,1,$,% e) programul este eronat 79. Fie sec$ena de instruciuni: int GKL3{15=25=+5=:5=95&% intNptr3G% printf(MdFn#=N(ptrB2$$% printf(MdFn#=N(ptr$B2$% Ce se $a tipri dup e!ecutarea codului de mai sus8 a) %" %" b) %" 1$ c) 1$ 1$ d) 1$ %" 7<. Fie sec$ena de instruciuni: int NarraXK+L% int(Nptr$KL3arraX% int G32=X3+=Q3:% C$%nd n $edere codul de mai sus, cum $ei realiza atribuirea celui de al doilea pointer din irul @ptrA ca s pointeze la $aloarea lui : 8 a$ ptrK2L3PX% b$ (Nptr$K1L3X% c$ (Nptr$K1L3PX% d$ (Nptr$K2L3PX% 7=. Fie urmtoarea declaraie de $ariabile : int Np% int G=X% Ctribuirea X3GB155% este ec3i$alent sec$ena: a$ p3PG% X3NpB155% b. X3NpB155% p3PG% c$ p3PX% X3NpB155% d$ p3PG% X3PpB155%
cu
7>. Fie urmtoarea declaraie de $ariabile : int Np% int G=X% Ctribuirea G3X% este ec3i$alent cu sec$ena : a$ p3PG% Np3X% b$ p3PX% Np3G% c$ Np3G% p3PX% d$ Np3X% p3PG% 7:. Fie urmtoarea declaraie de $ariabile : int Np% int G=X%
este
ec3i$alent
cu
int Np% int G% Ctribuirea G3N(PtK5LB+$% este ec3i$alent cu : a$ G3tK+L% b$ G3tK:L% c$ G3N(PtK2L$% d$ G3N(tB:$% 99. Se consider sec$ena de program : void main(void$ { int Np= N[% p3(intN$malloc(siQeof(int$$% [3(intN$malloc(siQeof(int$$% Np39% N[3+% Np3N[% if(p33[$ NpB31% printf(Md#=Np$% & Care este $aloarea afiat pentru p : a) b) % c)+ d)) 9<. Se d urmtoarea sec$ent de cod : int aK9L3{1=2=+=:=9&% int Na<tr% a<tr3a% printf(element3MdFn#=N(a<trB2$$% Ce $a afia codul de mai sus dup e!ecuie 8 a) element01 b) element0$ c) element0% d) element0) 9=. Se d codul: int Nptr% int XK15L% int i% for(i35%i<15%iBB$ XKiL3i% ptr3X% ptrB34% printf(ptr3MdFn#= Nptr$% Ce se $a afia c%nd codul este e!ecutat 8 a) ptr0" b) ptr0; c) ptr0d) ptr0.
7E. Fie urmtoarea declaraie de $ariabile : int Np% int G=X% p3PG% Ctribuirea X3GN(GB1$% este ec3i$alent cu sec$ena : a. X3NpN((Np$BB$% b$ X3NpN(NpBB$% c$ X3NpNNpBB% d$ X3(Np$N(NpBB$% 9;. Fie urmtoarea declaraie de $ariabile : int Np% int G3155=X% p3PG% n urma atribuirii X3NpN((Np$BB$% : $a a$ea $aloarea : a) 1"1"" b) 11""" c) 1"""1 d) 1"""" 92. Fie urmtoarea declaraie de $ariabile : int Np% int G3155= X% p3PG% n urma atribuirii X3NpB((Np$BB$% : $a a$ea $aloarea : a) $"1 b) 1"$ c) $"" d) $"$ 94. Fie sec$ena : int tK9L3{25=+5=:5=95=15&% int Np% int G% Ctribuirea G3tK+L% este ec3i$alent cu : a. p3t% G3N(pB+$% b$ p3PtK5L% G3N(pB2$% c$ p3Nt% G3NpB+% d$ p3t% G3NpB+% 97. Fie sec$ena : int tK9L3{25=+5=:5=95=15&%
char tK155L% strcpX(t=#,cest sir se copiaQa#$% !emplul 7: char Np3#,cest sir se copiaQa#% char tK155L% char N[% [3strcpX(t=p$% Wirul pstrat n zona spre care pointeaz p se transfer n zona spre care pointeaz t. /aloarea lui t se atribuie lui a. "entru a copia cel mult n caractere ale unui ir dintr)o zon de memorie n alta, se $a folosi funcia de prototip : c,ar Dstrncp:3c,ar Ddest G const c,ar DsursaG unsigned n4U 0ac nVlungimea #irului spre care pointeaz sursa, atunci toate caracterele irului respecti$ se transfer n zona spre care pointeaz dest. Cltfel se copiaz numai primele n caractere ale irului. n rest, funcia strncp: are acelai efect ca i strcp:. !emplu: char Np3#,cest sir se copiaQa trunchiat#% char tK15L% strncpX(t=p=siQeof(t$$% '( se $or copia numai primele 2; caractere(' Funcia strdup copiaz un ir ntr)o locaie nou creat i are prototipul : c,ar Dstrdup3consr c,ar Ds4U Funcia strdup face copierea unui ir n spaiul obinut prin apelul funciilor calloc sau malloc. Nu este deci necesar o apelare e!plicit a funciei de alocare. 0imensiunea spaiului alocat este egal cu lungimea #iruluiW1 -caracterul *N;,.. Itilizatorul este responsabil pentru eliberarea spaiului atunci c%nd nu mai este ne$oie de ir. /aloarea ntoars este pointerul la ir n caz de succes sau pointerul BK@@ c%nd spaiul nu s)a putut aloca. !emplu : #include<stdio.h> #include<string.h> #include<malloc.h> void main($ { char Ndup)str = Nstring3#,cest sir se copie#% dup)str3strdup(string$% printf(MsFn#=dup)str$% free(dup)str$% & Obser$m c nu a fost necesar apelul unei funcii de alocare prealabil a memoriei. Cpelul funciei de eliberare, dup ce irul nu a mai fost utilizat, este necesar.
n acest caz se concateneaz, la sf%ritul irului spre care pointeaz dest, cel mult n caractere ale irului spre care pointeaz dest. 0ac n Vlungimea irului spre care pointeaz sursa, atunci se concateneaz ntregul ir, altfel numai primele n caractere. !emplu: char tab1K155L3#SimbaOul 2 este mai bun decat % char tab2KL3#limbaOul !BB care este un superset a lui !#% strncat(tab1=tab2=12$% 0up re$enirea din funcie, tabloul tab1 conine succesiunea de caractere @-imba.ul / este mai bun dec#t limba.ul +00A .
C%nd caracterul cutat nu se afl n ir este ntors pointerul BK@@, altfel se ntoarce un pointer la prima -strc,r., respecti$ ultima -strrc,r. apariie a caracterului n irul s. "entru a cuta prima apariie a unui subir !ntr-un ir se poate folosi funcia de prototip : c,ar Dstrstr3const c,ar Ds1G const c,ar Ds24U Funcia caut prima apariie a subirului s2 n irul s1 i ntoarce un pointer la irul gsit sau pointerul BK@@ c%nd nu s)a gsit nici o apariie. "entru a cuta o secven de caractere !ntr-un ir putem folosi funcia de prototip: c,ar Dstrpbr83const c,ar Ds1G const c,ar Ds24U Funcia caut n irul s1 prima apariie a unui caracter din irul s2. /aloarea ntoars este un pointer la prima apariie sau pointerul BK@@ n cazul n care nici un caracter din s2 nu apare n s1. "entru a verifica apariia caracterelor unui ir !n alt ir putem folosi funciile : int strcspn3const c,ar Ds1G const c,ar Ds24U int strspn3const c,ar Ds1G const c,ar Ds24U Funcia strcspn determin lungimea sec$enei de caractere de la nceputul irului s1 care nu conine nici un caracter din s2. Funcia strspn determin lungimea sec$enei de caractere de la nceputul irului s1 care conine numai caractere din s2. Funcia strto8 caut prima parte din irul s1 care este diferit de orice subir din s2. ste pus un caracter BK@@ la primul caracter din s1 comun irurilor i se ntoarce un pointer la subirul gsit. Se poziioneaz implicit adresa de cutare la adresa urmtoare caracterului gsit n s1. Irmtoarele apeluri cu primul parametru BK@@ $or continua cutarea de la adresa de cutare setat. "rototipul funciei este : c,ar Dstrto83c,ar Ds1G const c,ar Ds24U
9.
<.
=.
'( strtoT plaseaz terminatorul NI55 la nceputul sec$enei de cutare, la poziia gsit (' p3strto((in= R=."H%D\ R$% if(p$ printf(RMsFnR= p$% '( urmtoarele apeluri utilizeaz pointerul NI55 ca prim parametru (' ;hile(p$ { p3strto((J7SS=R=."H%D\ R$% if(p$ printf(RMsFnR= p$% & getch($% &
Cl doilea set de con$ersie ntre numere i iruri de caractere este mai performant n pri$ina detectrii erorilor dec%t primul. Funciile de con$ersie a unui numr real ntr)un ir de caractere au sinta!a: c,ar D(cvt3double valG int nr_ci(G int DdecG int Dsemn4U c,ar Decvt3double valG int nr_ci(G int DdecG int Dsemn4U c,ar Dgcvt3double valG int ndecG c,ar Dbu(4U "arametrul val i nr_ci( reprezint $aloarea iniial i numrul de cifre care se doresc a fi obinute. Funciile $or ntoarce $aloarea numrului n baza 2; stocat ca ir de caractere. Nu apare punctul zecimal. "entru a obine informaii suplimentare despre con$ersie, $ariabilele semn, care reprezint semnul numrului, i dec, care reprezint numrul de cifre zecimale, $or fi transmise printr)o referin la ntreg. "entru ecvt, $ariabila nr_ci( reprezint numrul total de cifre, n timp ce pentru (cvt $ariabila nr_ci( reprezint numrul de cifre ale prii zecimale. Funcia gcvt face suprimarea zerourilor inutile. /aloarea ntoars de ctre cele trei funcii este un pointer spre irul de caractere. Con$ersiile de la iruri de caractere la numere se fac cu funciile: double strtod3const c,ar DsG c,ar DDendptr4U long strtol3const c,ar DsG c,ar DDendptrG int ba5a4U long strtoul3const c,ar DsG c,ar DDendptrG int ba5a4U Funcia strtod con$ertete un ir ntr)un numr real dubl precizie. Wirul iniial s trebuie s aib urmtoarea form: Y7sZ YsZ YdddZ Y.Z YdddZ Y(mtYsZdddZ n care 7s reprezint spaii, s este semnul, ddd sunt cifre zecimale, iar (mt este e sau pentru forma e!ponenial. Cl doilea parametru endptr este un pointer la un ir de caractere i are rolul de a se poziiona la ultima poziie de citire corect din ir, pentru detectarea erorilor la con$ersie. !emplu: #include<stdio.h> #include<stdlib.h> void main($ { char sirK45L=Ns% double valoare% printf(numarul3#$% gets(sir$% valoare3strtod(sir= Ps$% printf(sirulHMs numarulHMlfFn#=sir=valoare$% & Funciile strtol i strtoul con$ertesc un ir s care e!prim un numr ntr)o baz precizat de al treilea argument, ba5a, ntr)un numr ntreg de tip long, respecti$ de tip unsigned long. ste folosit deasemenea un pointer dublu la caractere pentru detectarea erorilor.
7. Fie programul urmtor: #include<stdio.h> #include<string.h> void main($ { char s1K15L= s2K15L= s+K15L3#/-#% gets(s1$% gets(s2$% puts(s1Bs2$% WW (1$ if(strlen(s1$<strlen(s2$$ putchar(I1E$% WW (2$ if(s1>s+$ putchar(I1E$% else putchar(I5E$% WW (+$ & "resupunem c, n timpul e!ecuiei progra) mului, se introduc de la tastatur irurile s1<RQJR i s2<R122235R. "recizai dac sunt ade$rate situaiile de mai &os: a) citirea de la tastatur este eronat b) instruciunea (1) va afia textul *#81$$"% * c) instruciunea ($) va afia valoarea 1 d. n linia (%) se compar irurile s1 i s+ din punct de vedere alfabetic e) nici una dintre afirmaiile anterioare 9. "entru programul urmtor precizai care dintre afirmaiile de mai &os sunt ade$rate: #include<stdio.h> #include<string.h> void main($ { char sK15L3#D2-.2,9#% int O=nr35% for(O35%O<strlen(s$%OBB$ if("(sKOL>3E5EPP sKOL<3EAE$$ { sKOL3E5E% nrBB% & printf(MdMs#=nr=s$% & a) declararea irului este corect b) n ciclul for sunt parcurse corect caracterele irului s c) n ciclul for sunt nlocuite cu T"* cifrele din s d) condiia din linia if este eronat e) programul afieaz :5255259 <. Ne propunem s definim un $ector care s aib dou elemente, ambele de tip ir de caractere. Fiecare ir trebuie s conin dou caractere, primul AabA, iar al doilea AcdA. Scriei declaraia corect. a$ char aK2LK+L3{ab#=cd#&%
b$ c$ d$ e$
=. Care dintre $ariantele de mai &os reprezint o declaraie corect a unui ir de caractere8 a$ char sK2L% b$ char NsK25L% c$ char Ns% d$ char s% e$ char sKL% >. "entru programul urmtor, analizai corectitudinea afirmaiilor de mai &os: #include<stdlib.h> #include<stdio.h> void main($ { char s1K:L=s2K:L% long G% gets(s1$% gets(s2$% if(strcmp(s1=s2$<5$ G3atol(s1$% else if("strcmp(s1=s2$$ G35% else G3atol(s2$% printf(Mld#= G$% & a) condiiile din cele dou linii if sunt greite b. apelurile funciei atol sunt corecte c) dac de la tastatur se introduc irurile *;.* i *1$%*, atunci se va afia ;. d) dac de la tastatur se introduc irurile *1$%* i *1% *, atunci programul va afia irul *1$%* e) dac de la tastatur se introduc irurile *ab* i *ac*, atunci se va semnala un mesaj de eroare :. Wtiind c, n conformitate cu standardul CSC??, codurile literelor mari sunt succesi$e ncep%nd cu =<, ce $a afia programul de mai &os8 #include<stdlib.h> #include<string.h> #include<stdio.h> void main($ { int G325=e% char sK19L3#,-!#=tK19L=uK19L% e3sK1LBsK2L% itoa(e=t=15$% strcpX(u=t$% strcat(s=u$% puts(s$% & a. nimic, irul s fiind vid b) A#C1% c) A#1% d) A#C1%% e) A#C1%1
E. Ce ir de caractere $a afia sec$ena urmtoare8 char Ns3#abcdefg#=Nptr% ptr3s% ptrB3:% puts(ptr$% a) Tfg* b) Tefg* c) Tdefg* d) Tcdefg* e) secvena este eronat 2;. Ce $a afia programul urmtor8 #include<stdio.h> void main($ { char NaK+L3{abc#=def#= ghi#&% char Np3PaK5LK5L% printf(MsMcMc#=aK1L=aK2LK1L= N(pB9$$% & a) abc d 6MNN b) abc d e c) def ( 6MNN d) def ( e e) programul va semnala eroare de compilare 22. Ce $a afia cea de)a doua instruciune de tiprire din programul de mai &os: #include<stdio.h> void main($ { char aK12L3#abcdefghiO#% char Np3a% int O% for(O35%O<12%OBB$ N(pBO$3aKOLTO% printf(MsFn#=p$% for(O35%O<12%OBB$ N(aBO$3pKOLTO% printf(Ms#= p$% & a) nimic b) textul *abcdefg(ij* c) textul *ji(gfedcba* d) o succesiune de caractere imprevizibil e) programul conine erori 24. Care dintre instruciunile programului de mai &os sunt eronate8 #include<stdio.h> #include<string.h> void main($ { char aK15L=bK15L%int (% WW(1$ scanf(Ms Ms#=a=b$% WW(2$ (3strlen(a$W2% WW(+$ aK(L3ENE% WW(:$ printf(Md#=strlen(a$< strlen(b$$%WW(9$ b3a% WW(>$ & a) declaraia de variabile din linia (1)
b) citirea irurilor din linia ($) c) atribuirile din liniile (%) i ()) d) afiarea din linia ( ) e) atribuirea din linia (+) 27. "recizai ce ir de caractere se $a afia n urma e!ecuiei programului urmtor: #include<stdio.h> #include<string.h> void main($ { char sK25L3#-orSanV !BB +.1#% int O% for(O35%O<strlen(s$%OBB$ if((sKOL>3E,E$PP (sKOL<3E1E$$ sKOLD3(E,EDEaE$% puts(s$% & a) *#orNand C<< %!1* b) *bU8lA6A c<< %!1* d) *#U8NA6A C<< %!1* d) *borland c<< %!1* e) *#orland C<< %!1* 29. Care dintre cele trei instruciuni print( de mai &os tipresc irul AbdA8 #include<stdio.h> void main($ { char sK>LK+L3{ab#=ac#= ad#=bc#=bd#=cd#&% printf(McMc#=sK+LK5L= sK2LK1L$% printf(Ms#=sK+LK5LB sK2LK1L$% printf(Ms#=sK9L$% & a) toate b) numai prima c) numai primele dou d) numai prima i a treia e) nici una 2<. Ce $a afia programul de mai &os8 #include<stdio.h> void main($ { char sK15L3#,->*A2<+.#= bK15L% int O35=(35% ;hile(sKOL$ if(OM2$ bK(L3sKOBBL% bK(L35% puts(b$% & a) #?$% b) A+;V@ c) # d) % e) nimic 2=. Consider%nd declaraiile: char sK:L3#12+#=tK:L% int G312+=X%
Care din e!presiile de mai &os au $aloarea ;8 a$ atoi(s$"3G% b$ itoa(G=t=15$33s% c$ (X3 3atoi(s$$33G% d$ G3 3(atoi(itoa(G=t=15$$$% e. "strcmp(itoa(G=t=15$=s$% 2>. Ce $a afia programul urmtor8 #include<stdlib.h> #include<stdio.h> #include<string.h> void main($ { char sK12L3#>?4A#=tK12L3#>#= uK12L3#4A#% long G35% strcat(t=u$% if(strcmp(s=t$$ G3atol(t$% else G3atol(s$% if(strcmp(s=u$>5$ G3atol(u$% printf(Mld#= G$% & a) " b) + c) .; d) +.; e) +-.; 2:. Ce afieaz programul urmtor8 #include<stdio.h> void main($ { char Ns13#2*2.<S7 /0.<S7#= Ns23#/0.<S7#% printf(#FnM.4sM.>s#=s1=s2$% & a) T5?5@VNM* b) T5?5@VNM :B@VNM* c) T5?5@VNM :B@VNM :B@VNM* d) T5?5@VNM:B@VNM* e) T:B@VNM* 2E. Ce afieaz programul urmtor8 #include<stdio.h> void main($ { char Ns3#12+:9>?4A#=Nt=Nu% u3PsK:L=sB3+=t3PsK1L% printf(#MdMdMd#=u33s=u33t= s<<t4U c a) """ b) ""1 c) "1" d) 1"" e) 111 4;. Care dintre instruciunile -2.,.....-<. &os sunt eronate8 #include<stdio.h> #include<string.h> void main($ { char Ns1=Ns2=Ns+% int G% s13#test#% scanf(Ms#=s2$% s+3Ps1% de mai
WW(:$ WW(9$ c) ),
42. Fie programul: #include<stdio.h> void main($ { char Ns=Nt=Nu% int O=G% gets(s$% for(G35=O35%sKOL%t3PsKOL= u3tB1=uK5L33tK5L\ G31H5=OBB$% printf(_Md#= G$% & n urma e!ecuiei programului, se $a afia $aloarea ;, dac: a) toate caracterele irului s sunt identice b) n irul s exist cel puin dou caractere succesive diferite c) n irul s exist cel mult dou caractere succesive identice d) n irul s exist cel puin dou caractere succesive identice e) n irul s nu exist dou caractere succesive identice 44. Considerm urmtoarele noiuni: ,$vector de doi pointeri c@tre caracter -$pointer c@tre air de dou@ caractere i urmtoarele declaraii de $ariabile: 0$ char NaK2L% 00$ char (Nb$K2L% "recizai corespondenele corecte: a) A) cu B) i #) cu BB) b) A) cu BB) i #) cu B) c) nu exist corespondene d) #) nu are corespondent e) cele dou declaraii semnific acelai lucru 47. Ce afieaz programul de mai &os8 #include<stdio.h> void main($ { char NsK9L3{512#=+:9#= >?4#=A,-#=!V2#&% char Nt=Nu% int O% t3PsK1LK5L% printf(Md#=(N(tB9$33sK2LK1L$$% u3PsK+LK5LB1% O35% ;hile(uKOL$ printf(Mc#=uKOBBL$% & a) 1-. b) 1A# c) "-.
d) "A#
e) "+-
49. Ce afieaz programul de mai &os8 #include<stdio.h> #include<string.h> void main($ { char NsK15L3{#15#=#55#=#15#= #15#=#51#=#11#&% char Nt3#15#% int i35=O3iD1% ;hile(sKiL$ if("strcmp(sKiBBL=t$$ O3i% printf(_Md#= O$% & a) =1 b) " c) 1 d) % e) ) 4<. Se dau urmtoarele declaraii ,$char NaK:LK>L% -$char (NbK:L$K>L% !$char (Nc$K:LK>L% V$char ((Nd$K:L$K>L% i urmtoarele noiuni: B1. $ector de 9 elemente, fiecare element este un pointer ctre un $ector de = caractere
B2. pointer ctre matrice de caractere de 9 linii i = coloane B3. pointer ctre $ector cu 9 elemente, fiecare fiind $ector de = caractere B4. matrice de 9 linii i = coloane, fiecare element este pointer ctre caracter "recizai corespondena direct: a) (A,61), (#,6$), (C,6%), (A,6)) b) (A,6)), (#,61), (C,6$), (A,6%) c) (A,6)), (#,61), (C,6%), (A,6$) d) (A,6$), (#,6%), (C,6)), (A,61) 4=. C%te erori conine programul urmtor 8 void main($ { char N(aK:LK>L$% char b% aK2LK+L3N(bB2$% aK+LK2L3PbB+% N(:BaK2L$3PbB1% NaK1LK+L3bB+% & a) nici una b) una c) dou d) trei e) patru
Cap./ Structuri
/.1 De(inirea tipurilor structur$
5imba&ul C ofer programatorului posibilitatea de a grupa datele, date de tipuri diferite put%nd fi prelucrate at%t indi$idual c%t i mpreun. 0ac tabloul conine numai elemente de acelai tip, o structur$ este (ormat$ din mai multe elemente de tipuri di(erite. 5a r%ndul lor, structurile definite pot constitui elemente componente pentru formarea de noi tipuri de date -tablouri, structuri, uniuni. . lementele componente ale unei structuri se numesc membri sau c>mpuri . Sinta!a declarrii unei structuri este urmtoarea : struct Ynume_tip_structuraZ b tip_1 lista_campuri_tip_1U tip_2 lista_campuri_tip_2U EEEE. tip_n lista_campuri_tip_nU c Ylista_variabile_structuraZU n declaraie poate lipsi precizarea numelui pentru tipul structurii sau a listei de $ariabile ns nu ambele simultan. n cazul n care lipsete numele tipului, spunem c $ariabilele au un tip anonim. C%mpurile componente ale unei structuri pot fi oricare din tipurile : ! predefinite -ntreg, caracter, numr real. ! definite de utilizator : scalari -c%mpuri de bii , enumerare. sau compuse -tablouri, structuri, uniuni. !emplul 2: 0efinirea datelor de baz pentru o persoan specific%nd numele i $%rsta. struct pers { char numeK+9L% int an% &% S)a definit o structur de tip pers fr a fi folosit nici o $ariabil de tipul definit. !emplul 4: 0efinirea unei structuri de tip angajat specific%nd pe l%ng datele de baz -un c%mp de tip structur pers. adresa, salariul i $ec3imea n munc. struct angajat { struct pers p% '( structura pers a fost definit anterior (' char adresaK95L% long salariu% int vechime% & persoana = firmaK155L% struct angajat pK95L% Obser$m modul cum poate fi o structur folosit la r%ndul ei drept c%mp al altei structuri. n acest caz, s)a definit o structur de tip angajat i $ariabilele de tip angajat : ! $ariabila persoana ! $ariabila firma de tip tablou de nregistrri n a doua declaraie, s)a folosit tabloul p de <; de nregistrri de tipul angajat. "utem defini orice tip structur folosind t:pede(. Cstfel, e!emplul anterior se mai poate scrie : tXpedef struct { struct pers p% char adresaK95L% long salariu% int vechime% & ANGAJAT% ANGAJAT persoana = firmaK155L% Cm definit un tip de structur cu aceleai componente ca mai sus i $ariabilele persoana i firma cu aceeai semnificaie ca mai nainte. Se obser$ c nu mai este necesar precedarea tipului de structur de cu$%ntul c3eie struct. !emplul 7: Se definete o structur care grupeaz informaii, specific%nd datele necesare fiei medicale a unui bolna$. tXpedef struct { int an = luna = Qi& V, ,% struct
struct pers p% V, , data)internarii% char adresaK95L% char boliK15LK+5L% & pacientK255L% n ultimul caz, nu s)a mai definit numele tipului structurii, ci doar tabloul de nregistrri pacient care conine 4;; de nregistrri de tipul fielor medicale. !emplul 9: n cazul n care un tablou este definit ca ultim c%mp al unei structuri este acceptat omisiunea primei dimensiuni din tablou. Cstfel, este acceptat declaraia : struct vector { int n% int dimKL% &% !emplul <: n implementrile limba&ului C e!ist diferite structuri predefinite. Spre e!emplu, pentru utilizarea numerelor comple!e este definit n 3eader)ele mat,., i comple!., urmtoarea structur : struct compleG { double G% double X% &%
'( se aloc spaiul necesar structurii i adresa spaiului alocat se stoc3eaz n pointerul la structur (' a13(struct tablouN$malloc(siQeof(struct tablou$$% Na13a% b13(struct tablouN$malloc(siQeof(struct tablou$$% '( se copiaz coninutul structurii de la adresa indicat de pointerul a1 peste coninutul structurii indicate de pinterul b1 (' Nb13Na1% '( sau : N(struct tablou$b13N(struct tablou$a1 (' c Obser$m c s)au putut face atribuirile directe cu tablouri care sunt c%mpuri ale unei structuri, at%t ntre structuri, c%t i ntre pointeri la structuri. n acest e!emplu, toate structurile i coninutul pointerilor la structuri primesc $aloarea structurii a. !emplul 9: Se consider o grup de n studeni -n;<42., pentru fiecare dintre ei cunosc%ndu)se numele i media anual. Se cere s se afieze studenii n ordinea descresctoare a mediilor. #include<stdio.h> #include<conio.h> void main($ { struct { char numeK+5L% float media% & auG = grupaK:5L% int n=i=O% float media% clrscr($% '( citirea datelor (' printf(RJumarul studentilor H R$%scanf(RMdR=Pn$% puts(RFn 0ntroduceti datele studentilor HFnR$% for(i35%i<n%iBB$ { getchar($% printf(RJumele HR$%gets(grupaKiL.nume$% printf(R.edia H R$%scanf(RMfR=Pmedia$% grupaKiL.media3media% & '( sortarea tabloului grupa descrescator dupa medie (' for(i35%i<nD1%iBB$ for(O3iB1%O<n%OBB$ if(grupaKiL.media<grupaKOL.media$ { auG3grupaKiL% grupaKiL3grupaKOL% grupaKOL3auG% & '( afisarea rezultatelor (' clrscr($% puts(R/tudentii ordonati desc. dupa medii HFnR$% for(i35%i<n%iBB$ printf(RM+5sM9.2fFnR=grupaKiL.nume= grupaKiL.media$% getch($% &
4. Fie structura : struct data { int Qi= luna = an% &Nd% Care este e!presia logic a crei $aloare arat c anul este sau nu bisect 8 a$ anM:335 PP anM155"35 b$ d.anM:335 PP d.anM155"35 c$ d.anM:335 PP d.anM155"35 YY d.anM:55335 d$ dD>anM:335 PP dD>anM155"35 YY dD>anM:55335 7. 5inia de cod care declar o $ariabil structur numit total de tip sample este : a$ tXpe totalH sample% b$ struct total% c$ struct sample total% d$ declare total as tXpe sample% 9. 5inia de cod care asigneaz $aloarea 2; c%mpului loop din structura total -de tip sample., este : a$ loop315% b$ total.loop315% c$ sample.total.loop315% d$ sample.loop315% <. 5inia de cod care afieaz $aloarea c%mpului 7ord din structura total -de tip sample., este : a$ printf(Ms#=total$% b$ printf(Ms#=;ord$% c$ printf(#Ms#=totalD;ord$% d$ printf(Ms#=total.;ord$% =. Se d urmatoarea sec$en de cod : struct computer { int cpu/peed% char cpu XpeK15L% &% struct computer mX!omputer% 1eferindu)ne la codul de mai sus, cum accesai primul caracter din cpuT:pe 8
a$ b$ c$ d$
>. Fie sec$ena : tXpedef struct { long cust)id% char custJameK95L% double balance% & !7/ '.26)62!% !7/ '.26)62! customerK95L% int i% WNmai Oos in programNW for(i35%i<95%iBB$ { printf(MsFn#=\\\\\$% & Ce ar trebui pus in locul ____ pentru a afia fiecare element custBame n codul anterior : a$ customerKiLD>custJame% b$ customer.custJameKiL% c$ customerKiL.custJame% d$ customerD>custJameKiL% :. Fie declaraia: struct computer{ int cpu/peed% char cpu XpeK15L% & compKL3 { {:55=#<entium#& = {2>>=#<o;er<!#& = {+++=#/parc#&= &% Se d irul de structuri de mai sus. Care dintre urmtoarele e!presii $a e$alua numrul structurilor din ir -n cazul de fa este 7.8 a$ siQeof(Ncomp$WsiQeof(comp$ b$ siQeof(Ncomp$ c$ siQeof(comp$ d$ siQeof(comp$WsiQeof(Ncomp$
Cap.12
!ploatarea (i#ierelor
4. f3fopen(test2.out#=#;b#$% 7.
ste desc3is'creat fiierul Atest2.outA din directorul curent n mod binar pentru scriere. f3fopen(cHFFtcFFtest+.bin#=#abB#$% ste desc3is fiierul Atest3.binA din directorul Ac%OtcA n mod binar pentru citire'scriere fiind poziionat la sf%ritul fiierului.
]0S2 Nf% int l=c=g% char ch% l3c3g35% if((f3fopen(_in.tGt#=#r#$$33J7SS$ { printf(_nu se poate deschide fisierul pentru citire#$% eGit(1$% & do{ ch3fgetc(f$% if(isalpha(ch$$ lBB% if(isdigit(ch$$ cBB% if("isprint(ch$$ gBB% // caracterul nu este afisabil &;hile(ch"32']$% printf(#Fn numarul de litere este Md#=l$% printf(#Fn numarul de cifre este Md#=c$% printf(#Fn numarul de caractere neafisabil este Md#=g$% fclose(f$% &
!emplul 7: Fiind dat un fiier, s se determine numrul de linii, linia de lungime ma!im i lungimea fiierului -numrul de caractere utile.. #include<stdio.h> #include<string.h> #include<stdlib.h> void main($ { ]0S2 Nf% char linieK125L% int l=maG35% // lungimea celei mai lungi linii din fisier long nr35=n35% // nr-lungimea fisierului, n-numarul de linii f3fopen(#in.tGt#=#r#$% if(f33J7SS$ { printf(#fisierul nu eGista#$% eGit(1$% & ;hile("feof(f$$ { nBB% fgets(linie=125=f$% l3strlen(linie$% if(maG<l$ maG3l% nrB3l% & printf(#linia de lungime maGima HMdFn#=maG$% printf(#numarul de linii HMldFn#=n$% printf(#lungimea fisierului HMldFn#=nr$% fclose(f$% & !emplul 9: "rogramul urmtor numr apariiile unui cu$%nt ntr)un fiier te!t. Citirea acestuia se face linie cu linie. #include<stdio.h> #include<string.h> void main($ { tXpedef char / 60J8K29>L% / 60J8 cuv=linie= ]0S2 Nf% char Np% int nr35% f3fopen(in.tGt#=#r#$% printf(cuvantul cautat H $% scaf(Ms#=cuv$% ;hile("foef(f$$ { fgets(linie=29>=f$% p3linie% ;hile(p"3J7SS$ // mai sunt caractere in linie { p3strstr(p=cuv$% // cauta cuvantul in sirul curent de caractere if(p$ // cuvantul apare in sirul curent) { nrBB% // numarul aparitia cuvantului pBB% // avansez la urmatorul caracter din sir // pentru a repeta cautarea & & & printf(numarul de aparitiiH Md#=nr$% fclose(f$% &
! citete o sec$en de c%mpuri de intrare caractere cu caracter ! formateaz fiecare c%mp conform specificatorului de format corespunztor ! $aloarea obinut este stocat la adresa $ariabilei corespunztoare /aloarea ntoars, n caz de succes, este numrul de c%mpuri citite. 0ac nu a fost citit nici)un c%mp, funcia ntoarce $aloarea ;. 0ac funcia citete sf%ritul de fiier, atunci $aloarea ntoars este 1+. Specificatorii de format pentru funcia (scan( sunt aceeai cu cei ai funciei scan(. "entru scrierea cu format a datelor ntr)un fiier te!t se folosete funcia: int (print(3+6@ D(G Rspeci(icatori_de_(ormatRG e!presii4U Funcia (print( realizeaz urmtoarele: ! accept o serie de argumente de tip e!presie pe care le formateaz conform specificatorilor de format corespunztori ! scrie datele formatate n fiierul specificat Funcia (print( folosete aceleai formate ca i funcia print(.
#include<stdio.h> void main($ { ]0S2 Nf% f3fopen(in.tGt#=#r#$% fsee((f=5S=/22b)2JV$% // fseeH(f,"N,$)2 printf(fisierul are Mld octeti#=ftell(f$$% fclose(f$% &
fscanf(f=Md#=PvKOL$%OBB% &;hile("feof(f$$% n3OD1% a) toate b) nici una c) numai :1 i :$ d) numai :$ i :% e) numai :1 <. Ce numr se $a gsi pe al patrulea r%nd al fiierului A4.t!tA dup e!ecuia programului urmtor 8 #include<stdio.h> void main($ { ]0S2 Nf% f3fopen(#:.tGt#=#;#$% int n34=O35= vK4L3{1=+=4=9=5=>=?=:&% ;hile(vKOLM2$ OBB% ;hile(O<n$ if(vKOBBL$ fprintf(f=#MdFn#=vKOL$% fclose(f$% & a) b) " c) + d) e) ) =. Fie programul: #include<stdio.h> #include<math.h> void main($ { ]0S2 Nf=Ng% int e% char c1= c2% f3fopen(1.tGt#=r#$% g3fopen(2.tGt#=r#$% e31% do{ c13fgetc(f$% c23fgetc(g$% if(c1"3c2$ e35% &;hile("(feof(f$YYfeof(g$$ PPe$% if(e$ if("(feof(f$PPfeof(g$$$e35% fclose(f$% fclose(g$% printf(Md#=e$% & "rogramul de mai sus afieaz $aloarea 2 dac: a) cele dou fiiere difer prin cel puin un caracter b) cele dou fiiere sunt identice c) n cele dou fiiere exist i caractere identice d) cele dou fiiere au acelai numr de caractere e) nici unul dintre cazurile de mai sus
>. "recizai care $a fi coninutul fiierului g dup e!ecuia programului urmtor, dac fiierul ( conine pe fiecare linie o zi a sptm%nii -luni,Z..,duminica. : #include<stdio.h> #include<math.h> void main($ { ]0S2 Nf=Ng% int O31% char sK11L=c1=c2% f3fopen(?.tGt#=r#$% g3fopen(?)2.tGt#=;#$% ;hile(OBB<:$ fgets(s=15=f$% fprintf(g=Md #=OD1$% fputs(s=g$% fclose(f$% fclose(g$% & a) % @iercuri b) % Woi c) ) @iercuri d) ) Woi e) Woi :. Fie programul urmtor: #include<stdio.h> void main($ { ]0S2 Nf=Ng% int a=G=s% f3fopen(in.tGt#=r#$% g3fopen(out.tGt#=;#$% scanf(Md#=Pa$% ;hile("feof(f$$ { s35% ;hile(s<a PP "feof(f$$ { fscanf(f=Md#=PG$% sB3G% & fprintf(g=Md#=s$% & fclose(f$% fclose(g$% printf(Fn s3Md#=s$% & 0ac de la tastatur se introduce $aloarea 2;, iar coninutul fiierului Ain.t!tA este 4 & 3 2 & 15 1 -pe aceeai linie., c%te numere $a scrie programul n fiierul Aout.t!tA 8 a) nici unul b) unul c) dou d) trei e) patru E. C%te numere se $or gsi n fiierul Anr.t!tA dup e!ecuia programului urmtor 8 #include<stdio.h> void main($ { int vKAL3{5=1=5=5=2=+=5=:=9&= O% ]0S2 Nf% f3fopen(nr.tGt#=;#$% O35% ;hile(O<A$ { ;hile(vKOL$ fprintf(f=M+d#=vKOBBL% fprintf(f=M+d#=AA$% OBB%
3 1 4 *
3 2 3 5 & . /
2;. 0educei ce $aloare $a afia programul urmtor, tiind c n fiierul ( se gsesc pe un r%nd, separate prin spaii, numerele 1 3 2 2 2 '3 2 '4 '1 #include<stdio.h> #include<math.h> void main($ { ]0S2 Nf% int s31=O35=aK25L% f3fopen(#nr.tGt#=#r#$% ;hile("feof(f$$ { OBB% fscanf(f=#Md#=PaKOL$% if(aKOL$ sN3abs(aKOL$% & printf(#FnMd#=s$% fclose(f$% & a) 1 b) -$ c) =-$ d) programul conine erori de sintax e) nu se pot citi corect numerele din fiier 22. "resupun%nd c toate liniile fiierului g conin cel mult 2;; de caractere, care este aciunea programului urmtor 8 #include<stdio.h> void main($ { ]0S2 Nf=Ng% char sK151L% f3fopen(1.tGt#=a#$% g3fopen(2.tGt#=r#$% ;hile("feof(g$$ { fgets(s=155=g$% fputs(s=f$% & fclose(f$% fclose(g$% & a) nlocuiete coninutul fiierului g cu coninutul fiierului f b) nlocuiete coninutul fiierului f cu coninutul fiirului g c) concateneaz fiierul g la sf4ritul fiierului f d) concateneaz fiierul f la sf4ritul fiierului g e) nici unul dintre cazurile anterioare 24. 0educei ce $aloare $a afia programul de mai &os, dac fiierul te!t are urmtorul coninut:
#include<stdio.h> void main($ { ]0S2 Nf% int i=O=m=n=s35=aK25LK25L% f3fopen(c.tGt#=r#$% fscanf(f= Md Md#=Pm=Pn$% for(i35%i<m%iBB$ for(O35%O<n%OBB$ { fscanf(f=Md#=PaKiLKOL$% if((iBO$M2$ sB3aKiLKOL% & fclose(f$% printf(Md#=s$% & a) " b) . c) $" d) $ e) programul este eronat 27. Se d fiierul identificat prin descriptorul (, cu urmtorul coninut: 33 1 '45 1. & Ce instruciune trebuie scris n loc de @ZZ..A astfel nc%t programul urmtor s tipreasc :<8 #include<stdio.h> void main(($ { ]0S2 Nf% int G= X% f3fopen(v.tGt#=r#$% fsee((f=D>=2$% fscanf(f=Md#=PX$% fscanf(f=Md#=PG$% printf(FnMdMd#=G=X$% fclose(f$% & a) fseeH(f,11,")2 b)fseeH(f,-$,$)2 c) fseeH(f,%,1)2 d)fseeH(f,$,1)2 e) fseeH(f,-%,$)2 29. "recizai ce nume se $a gsi pe al cincilea r%nd din fiierul Ap.t!tA dup e!ecuia programului de mai &os: #include<stdio.h> #include<string.h> void main($ { ]0S2 Nf% int i35=O=(% char NauG% char NaKAL3{.arius#= !laudiu#=+reiD/udD2st#= Vaniel#=`asile#=Van#= /inacdu#=2<ac#&% ;hile(aKiL$ iBB% for(O35%O<iD1%OBB$
for((3OB1%(<i%(BB$ if(strcmp(aKOL=aK(L$>5$ { auG3aKOL%aKOL3aK(L% aK(L3auG%& (35% f3fopen(p.tGt#=;#$% ;hile(aK(L$ fprintf(f=MsFn#=aK(BBL$% fclose(f$% & a) $Vac d) Aaniel b) Claudiu e) @arius c) Aan
2<. "recizai care $a fi coninutul fiierului Ab.t!tA dup e!ecuia programului urmtor, tiind c fiierul @a.t!tA are urmtorul coninut: 11 2 13 4 15 & 1* . 1/ #include<stdio.h>
#include<math.h> void main($ { ]0S2 Nf=Ng% int vK15L% f3fopen(a.tGt#=r#$% g3fopen(b.tGt#=;#$% fread(v=4=1=f$% f;rite(v=>=1=g$% fclose(f$% fclose(g$% & a) 11 $ 1% ) 1 + b) 1 $ $ ) 1 + c) 11 $ 1% d) 11 $ 1 e. un alt coninut dec4t cel indicat
&.5 Tablouri
14c 24d 34aGb 44c 54d 134bGc 144d 154bGd 1&4b 1*4c 254d 2&4a 2*4a 2.4a 2/4a &4bGdGe *4e 1.4a 1/4d 324c 314c .4d 224c 324b /4b 214c 334d 124aGd 114d 124aGbGd 224c 234b 244d 344c 354d 3&4b 3*4c
*.4 0ointeri
*4 b cu eG c cu d 1.4c 1/4aGd 2.4aGcGe 2/4e 424a 414a 424a 124b 224b 324d 434a 114cGdGe 124d 134e 144d 154a 214c 224a 234d 244bGc 254dGe 314c 324bGc 334d 344b 354b 3&4a 444b 454c 4&4d 1&4aGbGc 2&4bGe 3*4a 3.4a 1*4c 2*4c 3/4a
/.4 Structuri
14d 24d 34c 44b 54d &4d *4c .4d
Qibliogra(ie
2. 2erbert *childt ! @C manual completA, ditura #eora, Ducureti, 2EE: 4. -iviu 3egrescu ) A5imba&ul C,$ol.?, ??A, ditura Clbastr, Clu&)Napoca, 2EE> 7. 4orian *toilescu ) ABanual de C'CLLA, ditura 1adial, \alai, 2EE: 9. 4amian +ostea ) A?niiere n limba&ul CA, ditura #eora, Ducureti, 2EE= <. 5eorge-4aniel 6ateescu" 7avel 8lorin 6oraru ) A5imba&ul CLL, probleme i teste gril pentru liceu i bacalaureatA, ditura Niculescu, Ducureti, 4;;2 =. +laudia 9otez" 4umitru ,linca ) A#este de informaticA, ditura Ini$ersitii #e3nice A\3e. Csac3iA, ?ai, 4;;2