Sunteți pe pagina 1din 110

Limbajul C pentru clasa a IX-a

____________________________________________________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
Cap.3 Funcii de intrare/ieire standard ....................................................................................
3.1 Clasi(icarea (unc"iilor de intrare)ie#ire ____________________________________________ *
3.2 +unc"iile getc, #i getc,e _______________________________________________________ *
3.3 +unc"ia putc, ________________________________________________________________ *
3.4 -acrourile getc,ar #i putc,ar ___________________________________________________ .
3.5 +unc"iile gets #i puts __________________________________________________________ /
3.& +unc"ia print( _________________________________________________________________ /
3.* +unc"ia scan( ________________________________________________________________ 11
3.. !erci"ii #i teste gril$ _________________________________________________________ 13
Cap.4 !perat"rii limbajului C .................................................................................................. 1#
4.1 0receden"a operatorilor _______________________________________________________ 1.
4.2 1peratorul de atribuire simpl$ __________________________________________________ 1/
4.3 1peratori aritmetici ___________________________________________________________ 1/
4.4 1peratorii rela"ionali __________________________________________________________ 22
4.5 1peratori logici ______________________________________________________________ 22
4.& 1peratorii la nivel de bit _______________________________________________________ 21
4.* 1peratori compu#i de atribuire _________________________________________________ 22
4.. 1peratorul de conversie e!plicit$ 3cast4 __________________________________________ 23
4./ 1peratorul si5eo( _____________________________________________________________ 23
4.12 1peratorii de adresare _______________________________________________________ 23
4.11 1peratorul condi"ional _______________________________________________________ 23
4.12 1peratorul virgul$ ___________________________________________________________ 24
1
Limbajul C pentru clasa a IX-a
4.13 !erci"ii #i teste gril$ ________________________________________________________ 24
Cap.$ %nstruciunile limbajului C ............................................................................................ 2&
5.1 6nstruc"iunea vid$ ___________________________________________________________ 2/
5.2 6nstruc"iunea e!presie ________________________________________________________ 2/
5.3 6nstruc"iunea compus$ _______________________________________________________ 32
5.4 6nstruc"iunea i( ______________________________________________________________ 32
5.5 +unc"ia standard e!it _________________________________________________________ 32
5.& 6nstruc"iunea 7,ile ___________________________________________________________ 33
5.* 6nstruc"iunea (or _____________________________________________________________ 34
5.. 6nstruc"iunea do'7,ile ________________________________________________________ 3&
5./ 6nstruc"iunea continue ________________________________________________________ 3.
5.12 6nstruc"iunea brea8 _________________________________________________________ 3/
5.11 6nstruc"iunea s7itc, ________________________________________________________ 42
5.12 6nstruc"iunea goto __________________________________________________________ 42
5.13 +unc"iile standard sscan( #i sprint( _____________________________________________ 43
5.14 9eader'ul ct:pe., ___________________________________________________________ 4&
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
2
Limbajul C pentru clasa a IX-a
&.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. ("interi ........................................................................................................................... '#
*.1 Variabile pointer _____________________________________________________________ &.
*.2 ?ritmetica pointerilor _________________________________________________________ &/
*.3 @eg$tura pointer A tablou _____________________________________________________ *1
*.4 !erci"ii #i teste gril$ _________________________________________________________ *4
Cap.# )iruri de caractere ......................................................................................................... &
..1 +olosirea #irurilor ____________________________________________________________ */
..2 Tablouri de #iruri _____________________________________________________________ */
..3 +unc"ii standard pentru prelucrarea #irurilor de caractere ___________________________ .2
..3.1 @ungimea unui #ir de caractere _______________________________________________ .2
..3.2 Copierea unui #ir de caractere ________________________________________________ .2
..3.3 Concatenarea #irurilor de caractere ____________________________________________ .1
..3.4 Compararea #irurilor de caractere _____________________________________________ .2
..3.5 C$utarea =n #iruri de caractere ________________________________________________ .2
..4 !emple de utili5are a (unc"iilor standard ________________________________________ .3
..5 +unc"ii pentru conversii de date ________________________________________________ .5
..& !erci"ii #i teste gril$ _________________________________________________________ .&
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+ E,pl"atarea fiierel"r ................................................................................................. &'
12.1 Bo"iunea de (i#ier ___________________________________________________________ /&
12.2 Desc,iderea unui (i#ier _______________________________________________________ /&
12.3 Cnc,iderea unui (i#ier ________________________________________________________ /*
12.4 +unc"ia de veri(icare a s(>r#itului unui (i#ier _____________________________________ /*
12.5 +unc"ii de citire)scriere caractere ______________________________________________ /*
12.& +unc"ii de citire)scriere pe #iruri de caractere ____________________________________ /.
12.. +unc"ii de citire)scriere a (i#ierelor pe blocuri de octe"i ___________________________ 122
12.12 !erci"ii #i te!te gril$ ______________________________________________________ 121
-spunsuri la testele .ril ....................................................................................................... 1+$
/ibli".rafie .............................................................................................................................. 1+
3
Cap.1 lemente de ba5$ ale limbajului C
1.1 Structura unui program C
n C, elementul de baz al unui program este (unc"ia. O funcie este o seciune de program
construit conform anumitor regului pentru declaraii i instruciuni de prelucrare a datelor problemelor.
Nu este permis definirea unei funcii n interiorul altei funcii. Structura cea mai general a unui
program C este urmtoarea :
directive preprocesare
declaraii globale
funcie1
funcie2
..
main
Orice program conine funcia main care este funcia principal a unui program. !ecuia programului
ncepe cu e!ecuia acestei funcii.
"entru specificarea e!plicaiilor necesare unei mai bune nelegeri i utilizri a programelor se
folosete comentariul, care are sinta!a : )DEEEEte!t comentariuEE.D)
#e!tul din comentariu poate a$ea mai multe linii . Se poate folosi i forma: )) ..............te!t comentariu
caz n care comentariul se refer la te!tul scris p%n la sf%ritul liniei respecti$e.
!emplu : "rogramul urmtor $a realiza doar afiarea unui mesa& cu a&utorul funciei print(.
#include<stdio.h>
'( includerea bibliotecii standard pentru citirea i scrierea datelor ('
void main() '( funcia principal ('
{
printf(est ! primul program "#$% '( afiare mesa& ('
&
1.2 Vocabularul limbajului
lementele de baz ale limba&ului, numite i entiti sintactice sau atomi le!icali, fac parte din
urmtoarele categorii :
cuvinte re5ervate : sunt nume rezer$ate instruciunilor, tipurilor fundamentale i sinta!ei de
definire a funciilor i a tipurilor de date
identi(icatori : sunt nume de date, constante sau $ariabile. Sunt formate dintr)un ir de
caractere care ncepe cu o liter sau cu *+, , urmtoarele caractere put%nd fi litere, cifre sau *+,
constante : sunt $alori fi!e reprezent%nd caractere, iruri de caractere, numere ntregi sau
raionale
delimitatori : reprezint simboluri care separ entitile -spaiu, tab etc. .
1bserva"ie : limba&ul C face distincie ntre literele mici i mari.
1.3 Tipuri de date
"rin tip de dat$ nelegem necesitatea definirii urmtoarelor aspecte :
dimensiunea zonei de memorie asociate
mulimea $alorilor corespunztoare tipului
timpul de $ia asociat datei
mulimea operaiilor prin care $alorile tipului pot fi prelucrate -modificate sau testate. i semnificaia
acestor operaii
operatorii utilizai i restricii n folosirea acestora
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
1.4 Directive preprocesor
1eprezint operaii care $or fi efectuate naintea compilrii i anume :
includerea altor fiiere
$erificarea anumitor condiii, a parametrilor de mediu sau a definiiilor
realizarea macrodefiniiilor
0irecti$ele de preprocesare ncep cu caracterul F .
!emplul 2 :
#include<stdio.h>
'(este inclus 3eader)ul standard pentru intrri'ieiri ('
!emplul 4 :
#include file1.h# '' sunt incluse fiierele utilizatorului cu numele
#include file1.c# '' specificat
5imba&ul C conine un mare numr de funcii pentru prelucrarea datelor. le sunt organizate, n
funcie de scopul urmrit, n biblioteci numite fiiere ,eader a$%nd e!tensia ,. !emple de biblioteci
uzuale :
stdio., G io., 6 pentru operaii de citire'scriere de la dispoziti$ele standard
stdlib., G mat,., 6 pentru prelucrri numerice
ct:pe., 6 pentru prelucrarea sau $erificarea caracterelor
mem., G string., 6 pentru prelucrarea zonelor de memorie i a irurilor de caractere
alloc., G malloc., G stdlib., ) pentru alocarea memoriei
conio., ) pentru interfaa cu consola
grap,ics., ) pentru interfaa grafic
dos., ) pentru interfaa cu sistemul de operare
1.5 !erci"ii #i teste gril$
2. 5a compilare se sesizeaz :
a) erorile de sintax i semantice
b) erorile de calcul
c) nerespectarea ordinii opera-
iilor din modelul matematic
d) furnizarea unor date eronate la
operaia de citire
4. 0elimitarea unui te!t ntre )D D) are rol de :
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:
Cap.2 Tipuri (undamentale de date
5imba&ul C lucreaz cu cinci tipuri de baz : int, c,ar, (loat, double i void. #ipul void are
semnificaia de @nimicA sau @orice tipA n funcie de conte!t. O prezentare a acestor tipuri apare n
tabelul urmtor :
Tip Bum$r de
bi"i
Domeniu de valori
c,ar . '12.E.12*
unsigned c,ar . 2E.255
signed c,ar . '12.E12*
int 1& '2
15
EE.2
15
'1
unsigned int 1& 2E..2
1&
'1
s,ort int 1& '2
15
EE.2
15
'1
long int 32 '2
31
E.2
31
'1
unsigned long int 32 2E.2
32
'1
(loat 32 valoarea absolut${3.4D12
'3.
E.3.4D12
3.
}
double &4 valoarea absolut${1.*D12
'32.
E.1.*D12
32.
}
long double .2 valoarea absolut${3.4D12
'4/32
E1.1D12
4/32
}
#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 Valoare ,e!a5ecimal$ Caracter ?SC66 Semni(ica"ia
O2 2 BK@@ terminator de #ir
Oa 2!2* Q@@ generator de sunet
Ob 2!2. QS bac8 space
O( 2!2C ++ s(>r#it de linie
On 2!2? @+ linie nou$
Or 2!2D CJ salt la =nceputul r>ndului
Ot 2!2/ 9T tab ori5ontal
Ov 2!2Q VT tab vertical
OO 2!5C O bac8 slas,
ON 2!2* M apostro(
OR 2!22 S g,ilimele
b. Constante reale : sunt n $irgul mobil i au n reprezentarea lor urmtoarele componente :
partea ntreag
punctul zecimal
partea fracionar
e sau i un e!ponent
!emple : 123.4 12e& '111.2
c. Tiruri de caractere : se scriu ntre g3ilimele, iar la sf%ritul irului compilatorul adaug automat
terminatorul de ir MO2N.
!emplu : STestare siruriR
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%
2.3 !erci"ii #i teste gril$
2. Care din urmtoarele nu este un tip de date
n C 8
a$ int b$ numeric
c$ float d$ double
4. #ipul de date 6BT n C este reprezentat pe :
a$ 2 octei b$ 4 octei
c$ 1> octei d$ +2 octei
7. #ipul de date D1KQ@ este reprezentat pe :
a$ 4 bii b$ 1> bii
c$ +2 bii d$ >: bii
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
c$ constant@ unsigned integer
d$ constant@ caracter
>. "entru fiecare dintre constantele aflate n
coloana C. alegei din coloana D. tipul su:
Coloana ?4 Coloana Q4
A1) !" #1) constant ntreag
A$) #$) constant real
A%) &' #%) const! (exazecimal
A)) " #)) constant octal
A) ** #) constant caracter
A+) "x #+) constant ir de
caractere
a. ,1-2= ,2-1= ,+-9= ,:-1=
,9->= ,>-+
b. ,1-2= ,2-1= ,+-9= ,:-:=
,9-9= ,>-+
c. ,1-2= ,2-1= ,+-9= ,:-:=
,9->= ,>-+
d. ,1-2= ,2-1= ,+-9= ,:-:=
,9->= ,>eronat@
e. ,1-2= ,2-1= ,+-9= ,:-1=
,9->= ,>eronat@
:. 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) toate mai puin )
c) toate
d) toate mai puin b)
e) primele cinci
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
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$ int a=b=c=d% char e%
c$ int a=b=e% float c=d%
d$ int a=b% float c=d% char e%
e$ int c=d% float a=b% char e%
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:
Cap.3 +unc"ii de intrare)ie#ire standard
3.1 Clasi(icarea (unc"iilor de intrare)ie#ire
"rin intr$ri)ie#iri nelegem un set de operaii care permit sc3imbul de date ntre un program i
un periferic. n general, operaia de introducere a datelor de la un periferic se numete operaie de
citire, iar cea de ieire pe un periferic scriere. Numim terminal standard terminalul de la care s)a
lansat programul.
Funciile de citire'scriere se pot clasifica, dup tipul datelor mane$rate, n urmtoarele categorii:
pentru caractere
pentru iruri de caractere
cu format
n funcie de locul de efectuare a operaiilor de citire'scriere, funciile se mpart n :
funcii de citire'scriere la consol
funcii de citire'scriere ntr)o zon de memorie
funcii de citire'scriere ntr)un fiier oarecare
Funciile utilizate mai frec$ent pentru realizarea operaiilor de intrare'ieire folosind terminalul
standard sunt :
pentru intrri : getc,, getc,e, gets i scan(
pentru ieiri : putc,, puts i print(
5a acestea se adaug macrourile getc,ar pentru intrri i putc,ar pentru ieiri. Cceste
macrouri sunt definite n 3eader)ul stdio., i folosirea lor implic includerea acestui fiier.
3.2 +unc"iile getc, #i getc,e
Funciile getc, i getc,e sunt independente de implementare. Cmbele permit citirea direct de
la tastatur a unui caracter. Funcia getc,34 citete de la tastatur fr ecou, deci caracterul tastat nu
se afieaz pe ecanul monitorului. a permite citirea de la tastatur at%t a caracterelor corespunztoare
codului CSC??, c%t i a celor corespunztoare unor funcii speciale cum ar fi tastele F2, F4 etc. sau
combinaii de taste speciale. 5a citirea unui caracter al codului CSC??, funcia returneaz codul CSC?? al
caracterului respecti$.
n cazul n care se acioneaz o tast care nu corespunde unui caracter CSC??, funcia getc,34
se apelea5$ de dou$ ori : la primul apel funcia returneaz $aloarea zero, iar la cel de)al doilea apel se
returneaz o $aloare specific tastei acionate.
Funcia getc,e34 este analog cu funcia getc,, cu singura diferen c ea realizeaz citirea cu
ecou a caracterului tastat. Cceasta nseamn c se afieaz automat pe ecran caracterul tastat.
Cmbele funcii nu au parametri i se pot apela ca operanzi n e!presii. 5a apelarea lor se $izualizeaz
fereastra utilizator i se ateapt tastarea unui caracter. "rogramul continu dup tastarea caracterului.
Funciile getc, i getc,e au prototipurile n fiierul conio.,, deci utilizarea lor implic
includerea acestui fiier.
3.3 +unc"ia putc,
Funcia putc, afieaz un caracter pe ecranul monitorului. a are un parametru care
determin imaginea afiat la terminal. Funcia poate fi apelat astfel : putc,3e!presie4U
"rin acest apel se fieaz imaginea definit de $aloarea parametrului e!presie. /aloarea
parametrului se interpreteaz ca fiind codul CSC?? al caracterului care se afieaz. 0ac $aloarea se
afl n inter$alul G74,24=H, atunci se afieaz un caracter imprimabil al codului CSC??. 0ac $aloarea
respecti$ este n afara acestui inter$al, atunci se afieaz diferite imagini care pot fi folosite n di$erse
scopuri, cum ar fi de e!emplu trasarea de c3enare.
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($%
&
3.4 -acrourile getc,ar #i putc,ar
Cceste macrouri sunt definite n fiierul stdio.,. le se apeleaz la fel ca funciile. Bacroul
getc,ar permite citirea cu ecou a caracterelor de la terminalul standard. Se pot citi numai caractere ale
codului CSC??, nu i caractere corespunztoare tastelor speciale. "rin intermediul macroului getc,ar
caracterele nu se citesc direct de la tastatur. Caracterele tastate la terminal se introduc ntr)o zon
tampon p%n la acionarea tastei nter. n acest moment, n zona tampon, se introduce caracterul de
r%nd nou -newline. i se continu e!ecuia lui getc,ar. Se re$ine din funcie return%ndu)se codul CSC??
al caracterului curent din zona tampon. 5a un nou apel al lui getc,ar se re$ine cu codul CSC?? al
caracterului urmtor din zona tampon. 5a epuizarea tuturor caracterelor din zona tampon, apelul lui
getc,ar implic tastarea la terminal a unui nou set de caractere care se rencarc n zona tampon.
In astfel de mod de desfurare a operaiei de citire implic o anumit organizare a memoriei
i accesului la caractere, organizare care conduce la noiunea de (i#ier.
n general, prin (i#ier se nelege o mulime ordonat de elemente pstrate pe suporturi de
memorie e!tern. lementele unui fiier se numesc =nregistr$ri. Cu toate c fiierele sunt n general
pstrate pe discuri, este util s se considere organizate n fiiere c3iar i datele care se tasteaz sau se
afieaz la terminal. n acest caz =nregistrarea este un r%nd afiat la terminal sau succesiunea de
caractere tastat la terminal i terminat la apsarea tastei nter.
Fiierele conin o nregistrare special care marc3eaz s(>r#itul de (i#ier. Cceast nregistrare
se realizeaz la tastatur prin sec$ene speciale, spre e!emplu tast%nd ;CtrlVWI al crui ecou este XI.
Bacroul getc,ar returneaz $aloarea constantei simbolice 1+ -nd of File. la nt%lnirea
sf%ritului de fiier. Cceast constant este definit n fiierul stdio., i n general are $aloarea A1.
Bacroul getc,ar se apeleaz fr parametri i de obicei este un operand al unei e!presii : getc,ar34U.
Bacroul puc,ar afieaz un caracter al codului CSC??. l returneaz codul caracterului afiat
sau 62 la eroare. Se poate apela cu : putc,ar3e!presie4U /aloarea e!presiei reprezint codul CSC??
al caracterului care se afieaz.
!emplu : S se scrie un program care citete un caracter folosind macroul getc,ar, l afieaz
folosind macroul putc,ar i trece cursorul pe linia urmtoare.
#include<stdio.h>
#include<conio.h>
void main($
{ clrscr($%
putchar(getchar($$%
putchar(IFnE$%
getch($%
&
3.5 +unc"iile gets #i puts
Funcia gets poate fi folosit pentru a introduce de la terminalul standard o succesiune de
caractere terminat prin acionarea tastei nter. Citirea se face cu ecou i se pot citi numai caracterele
codului CSC??. Funcia are ca parametru adresa de nceput a zonei de memorie n care se pstreaz
caracterele citite. 0e obcei, acest zon de memorie este alocat unui tablou unidimensional de tip
c,ar. 0eoarece numele unui tablou are ca $aloare adresa de nceput a zonei de memorie alocat,
rezult c numele unui tablou poate fi utilizat ca parametru al funciei gets. n felul acesta, caracterele
citite se $or pstra n tabloul respecti$.
Funcia gets returneaz adresa de nceput a zonei de memorie n care s)au pstrat
caracterele. 5a nt%lnirea sf%ritului de fiier -JCtrlKLM. se returneaz $aloarea zero. Mero nu reprezint
o $aloare posibil pentru gets i de aceea, ea poate fi folosit pentru a semnala sf%ritul de fiier. 0e
obicei, $aloarea returnat de gets nu se testeaz fa de zero, ci fa de constanta simbolic BK@@
definit n fiierul stdio.,.
1ezult c dac tab este declarat prin % c,ar tabY255ZU atunci apelul : gets3tab4U pstreaz
n tab succesiunea de caractere tastat de la terminal n linia curent. #otodat, caracterul ne7line se
nlocuiete cu BK@ -*N;,..
Funcia puts afieaz la terminalul standard un ir de caractere ale codului CSC??. 0up
afiarea irului respecti$, cursorul trece automat pe o linie nou -deci caracterul BK@ se nlocuiete cu
ne7line.. Funcia are ca parametru adresa de nceput a zonei de memorie care conine caracterele de
afiat. n cazul n care irul de caractere care se afieaz se pstreaz ntr)un tablou unidimensional de
tip c,ar, drept parametru se poate folosi numele acestui tablou.
Funcia puts returneaz codul ultimului caracter al irului de caractere afiat -caracterul care
precede BK@. sau 62 la eroare. 0ac tab are declaraia de mai sus i el pstreaz un ir de caractere,
atunci apelul : puts3tab4U afieaz la terminalul standard irul respecti$ de caractere i apoi trece
cursorul pe linia urmtoare. Funciile gets i puts au prototipurile n fiierul stdio.,.
!emplul : S se scrie un program care citete de la intrarea standard numele i prenumele unei
persoane, afieaz iniialele personei respecti$e pe c%te un r%nd, fiecare iniial fiind urmat de un
punct.
#include<stdio.h>
#include<conio.h>
void main($
{ char numeK+5L%
char prenumeK+5L%
clrscr($%
gets(nume$% gets(prenume$%
putchar(numeK5L$%
putchar(I.E$%
putchar(prenumeK5L$%
putchar(I.E$%
puts(Fn<entru a termina programul actionati o
tasta $%
getch($%
&
3.& +unc"ia print(
"entru scrierea cu format a datelor se folosete funcia print( care face scrierea datelor n
fiierul standard de ieire -stdout.. Sinta!a de utilizare este :
int print(3Smesaje si lista de (ormateRG e!pr_1G e!pr_2G E.Ge!pr_n4U
Funcia print( realizeaz urmtoarele :
accept o serie de argumente de tip e!presie pe care, dup ce le e$alueaz, le transform n iruri
de caractere conform formatului specificat
scrie irurile n fiierul standard de ieire -sunt acceptate sec$enele de e$itare.
0ac numrul de argumente specificate n format nu corespunde cu numrul argumentelor din
lista de e!presii, atunci apar rezultate neateptate care pot a$ea efecte duntoare. 1ezultatul ntors de
funcie, n caz de succes, este numrul de octei scrii, iar n caz de eroare, $aloarea ntoars este
OF. Speci(icatorii de (ormat folosii pentru print( sunt prezentai n tabelul urmtor :
Speci(icator Semni(ica"ie
Pe G P Bum$r real de (orma iiii.zzzzzz G unde nr.5ecimale z este dat de preci5ie
3& implicit4
P( 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$
Pg G PL 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
Pi Bum$r =ntreg =n ba5a .G 12G sau 1& =n (unc"ie de primul sau primele dou$
caractere
Pd Bum$r =ntreg =n ba5a 12
Po Bum$r =ntreg =n ba5a . U nu este necesar$ scrierea ci(rei 2 la =nceputul
num$rului
P! Bum$r =ntreg =n ba5a 1& U nu este necesar$ scrierea secven"ei 2! la
=nceputul num$rului
Pu Bum$r =ntreg ($r$ semn
Ps Tir de caractere
Pc 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.4L;4
;.=>7 O =.>7;;;);2
247.=>4 O.; 2L;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($%
&
3.* +unc"ia scan(
Funcia de citire cu format scan( are sinta!a :
scan(3Slista de (ormateR G adresa_var1 G adresa_var2GE..4U
Cceast funcie realizeaz urmtoarele operaii :
citete din fiierul standard de intrare stdio o sec$en de c%mpuri de intrare, caracter cu caracter,
p%n la terminarea introducerii c%mpurilor i apsarea tastei JnterK P
formateaz fiecare c%mp conform formatului specificat n lista de formate. 0in caracterele citite se
calculeaz $alori numerice sau literale, conform tipului fiecrei $ariabile, dimensiunilor de format
specificate i a separatorilor de c%mpuri predefinii -spaiu, tab i enter. sau impui e!plicit P
$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 Semni(ica"ie
Pc Cite#te un caracter
Pd Cite#te un =ntreg 5ecimal
Pi Cite#te un =ntreg 5ecimal
Pe Cite#te un num$r (loat
P( Cite#te un num$r (loat
Pg Cite#te un num$r (loat
Po Cite#te un num$r octal ($r$ semn
Ps Cite#te un #ir de caractere
P! Cite#te un num$r ,e!a5ecimal ($r$ semn
Pp Cite#te un pointer
Pn ?rgumentul asociat prime#te o valoare =ntreg$ egal$ cu num$rul
de caractere deja citite
Pu Cite#te un num$r =ntreg ($r$ semn
PY Z 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 ('
3.. !erci"ii #i teste gril$
2. S se determine ce tiprete urmtoarea
instruciune :
unsigned n3155%
printf(RM5:GR=n$%
a) "1"" b) 1""
c) ""+) c) A1"
4. Ce face sec$ena 8
float n31>%
printf(RMGR=nB1$%
a) afieaz numrul n baza 1+
b) d eroare de compilare deoarece
nu am folosit o variabil la
scriere
c) c(iar dac nu este semnalat
nici o eroare la compilare, nu
se afieaz valoarea dorit,
deoarece nu am folosit un
specificator de format adecvat
7. Fie declaraiile :
int n%long double G%char sK155L%
Care din sec$enele urmtoare sunt corecte
pentru citirea $ariabilelor 8
a$ scanf(RMi Ms MlgR=Pn=Ps=PG$%
b$ scanf(RMd Ms MSgR=Pn=Ps=PG$%
c$ scanf(RMd Ms MSgR=Pn=s=PG$%
d$ scanf(RMd Mc MlfR=Pn=Ps=PG$%
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 cores-
punztoare
c) citete o liter mic i
afieaz litera mare cores-
punztoare
d) citete un caracter
4>. Se definete constanta simbolic S6J
astfel:
#define /06 2*,.2J ,V.0262#
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) "%+ b) "xA>
c) A> d) %+
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%
Cap.4 1peratorii limbajului C
5imba&ul C dispune de o gam e!tins de operatori. "e l%ng setul de operatori uzuali, limba&ul
are definii operatori care ofer faciliti asemntoare limba&elor de asamblare. !ist astfel operatori
aritmetici, operatori de atribuire simpl sau compus, operatori logici, operatori de prelucrare pe bii etc.
4.1 0receden"a operatorilor
"recedena operatorilor determin ordinea de e$aluare a operaiilor dintr)o e!presie. n funcie
de preceden, operatorii C sunt mprii n 2< categorii prezentate n tabelul urmtor :
Categorie 1peratori Semni(ica"ie
2. "rioritate ma!im 3 4
Y Z
.
Cpel de funcie
!presie cu indici
Selectori de membru la structuri
4. Operatori unari \
]
W '
WW ''
[ D
si5eo(
3tip4
Negare logic
Negare bit cu bit -complementare cu 2.
"lus i minus unari
?ncrementare'decrementare -pre i post.
Obinerea adresei'indirectare
0imensiune operand -n octei.
Con$ersie e!plicit de tip ) cast
7. Operatori de
multiplicare
D )
P
nmulire'mprire
1estul mpririi ntregi
9. Cdunare , scdere W ' "lus i minus binari
<. 0eplasri ;; VV 0eplasare st%nga'dreapta pe bii
=. 1elaionali ; ;<
V V<
Bai mic'mai mic sau egal
Bai mare'mai mare sau egal
>. galitate <<
\<
gal
0iferit
:. [ S? logic bit cu bit
E. X SCI SC5IS?/ bit cu bit
2;. ^ SCI logic bit cu bit
22. [[ S? logic
24. ^^ SCI logic
27. Op. condiional _% Operatorul condiional -ternar.
29. Operatori de
atribuire
<
D< )<
P<
W< ' <
[< X<
\<
;;<
VV<
Ctribuire simpl
Ctribuire produs , c%t , rest
Ctribuire sum , diferen
Ctribuire S? , SCI SC5IS?/ , SCI -bit.
Ctribuire cu deplasare st%nga'dreapta
2<. /irgula G $aluare e!presie2 , e!presie4 . /aloarea
rezultatului este e!presie4.
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 .
4.2 1peratorul de atribuire simpl$
Ccest operator -<. realizeaz memorarea $alorii unei e!presii ntr)o $ariabil. Cre sinta!a :
variabila<e!presieU
fectul este stocarea $alorii e!presiei din membrul drept la adresa $ariabilei scrise n membrul st%ng.
!emplul 2:
char c%
int i=(%
float G%
c3EaE%
i3+%
(3EdE%
'( TU2;; P *d, de tip caracter este con$ertit la un tip ntreg ('
G3cBi%
'( !U2;; P se face con$ersie la un tip ntreg : E>L7U2;; ('
n plus, atribuirea nsi are o $aloare, i anume $aloarea $ariabilei din st%nga dup memorarea
coninutului $alorii e!presiei. 0atorit acestui efect, rezult n final o $aloare a e!presiei de atribuire
care poate fi folosit direct ntr)o alt atribuire. 0e aceea este permis atribuirea multipl$.
!emplul 4 :
int i=O=( %
i3O3(31%
care este ec3i$alent cu sec$ena :
(31% O3(% i3O%
Se obser$ o mai bun compactare a codului surs n primul caz, de folosire a atribuirii multiple. #oate
cele trei $ariabile au dup atribuire $aloarea 2.
!emplul 7:
int i=O=(%
OB13i%
i31BO3(%
Cmbele instruciuni de atribuire sunt incorecte, pentru c jW1 nu este o $ariabil.
4.3 1peratori aritmetici
Operatorii aritmetici din C pot folosi, mai puin operatorul modulo care poate lucra numai cu
numere ntregi, at%t numere ntregi c%t i numere reale.
!emplul 2 : Folosirea operatorilor aritmetici .
int i=O=n%
float G%
n315N:D?% '( nU77 ('
i3AW2% '( iU9 ca rezultatul mpririi a dou numere ntregi ('
j3nMi% '( &U2 ca restul mpririi a dou numere ntregi ('
G3n% '( !U77.;; ) ca numr real('
G3GMi%
'( se obine eroare operatorul O fiind definit numai pentru numere ntregi('
!emplul 4 : 5a acelai rezultat conteaz tipul $ariabilei din st%nga .
int i%
float G%
i3?.W2%
'( iU7 pentru c 7.< real este con$ertit la tipul ntreg al lui i ('
*3?.W2% '( !U7.< pentru c ! este de tip real ('
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; ('
4.4 1peratorii rela"ionali
Operatorii relaionali -categoriile = i >. pot fi folosii pentru date de tip aritmetic i pointeri.
1ezultatul este ; dac relaia nu este ndeplinit i 2 dac este ndeplinit.
!emplu :
int egal=G=X%
G31?%
X32NGD1%
egal3G33X% '( egalU; ('
4.5 1peratori logici
Cum n limba&ul C nu e!ist tipul boolean, operatorii logici admit operanzi de orice tip scalar
-simplu. pe care i interpreteaz conform comparaiei cu ;. 0ac $aloarea este ;, e!presia este
considerat fals, iar dac $aloarea este nenul, e!presia se consider ade$rat. 1ezultatul unei
e!presii logice este de tip ntreg i se bazeaz pe con$eniile : ade$ratU2 , falsU;.
Tabela de adev$r a operatorilor logici
! : ! [[ : ! ^^ : \!
2 2 2 2 1
2 \<2 2 1 1
\<2 2 2 1 2
\<2 \<2 1 1 2
!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$
4.& 1peratorii la nivel de bit
"osibilitatea utilizrii operatorilor pe bii ofer limba&ului C faciliti asemntoare cu cele ale
limba&elor de asamblare. 1peran5ii pot (i numai tipuri =ntregi .
Fie biii b2 i b4. 1ezultatul aplicrii operatorilor pe bii este :
1peratori pe bi"i
b1 b2 b1 [ b2 b1 X b2 b1 ^ b2 ] b1
2 2 2 2 2 1
2 1 2 1 1 1
1 2 2 1 1 2
1 1 1 2 1 2
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 aD2
n
('
a>>n '( ec3i$alent cu a)2
n
('
!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
=
'4
4
U4
9
('
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 4
2=
)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
4.* 1peratori compu#i de atribuire
Operatorul de atribuire poate fi combinat cu o serie de operatori aritmetici i operatori la ni$el
de bit rezult%nd enunuri prescurtate i uneori optimizri ale timpului de e!ecuie.
!presia var< var operator e!presieU mai poate fi scris i var operator < e!presieU
!ist 2; combinaii posibile permise operatorilor de atribuire compus i anume :
! < combinaii cu operatori aritmetici : W< G ' < G D< G )< G P<
! < combinaii cu operatori pe bii : ^< G [< G X< G ;;< G VV<
!ecutarea unei instruciuni care folosete operatori compui de atribuire este mult mai rapid
deoarece compilatorul, cunosc%nd c primul operand i rezultatul au aceeai locaie de memorie,
folosete un numr mai mic de operaii, a$%nd ne$oie de un timp de e!ecuie mai mic dec%t atribuirea
n cazul general.
!emplul 2: Folosirea operatorului de aflare a restului .
int (3>=O39%
(M3O% '( TU=O<U2 ('
!emplul 4: Folosirea operatorului de deplasare pe bii .
int (3?=O3+%
(<<3O% '( TUT(4
7
U>(:U<= ('
!emplul 7 : Folosirea operatorului de deplasare la dreapta pe bii i apoi a operatorului aritmetic de
adunare.
int a3+=b39=c%
aB3b>>3c32% '( cU4 , bU<'4
4
U2 , aU7L2U9 ('
!emplul 9 : Folosirea operatorului SCI SC5IS?/ pentru intersc3imbarea $alorilor a dou $ariabile.
unsigned int (3>=O3A%
(T3OT3(T3O%
!emplul < : Folosirea operatorului W? pe bii .
long (%
(P3Z(% '( TU; , indiferent de $aloarea sa iniial ('
!emplul = :
unsigned short (%
short O%
(Y3Z(% '( TU4
2=
)2U=<<7< , indiferent de $aloarea sa anterioar ('
OY3ZO% '( dac & este cu semn, atunci $aloarea sa de$ine 62 ('
!emplul >:
int (%
(T3(% '( TU; , indiferent de $aloarea sa anterioar ('
!emplul ::
int 8<'25U
8;;<2U '( TU )4<(4
4
U )2;; ('
4.. 1peratorul de conversie e!plicit$ 3cast4
"entru a modifica ordinea de e$aluare a operaiilor n mod e!plicit, se folosete perec3ea de
paranteze rotunde. 0ar perec,ea de parante5e rotunde poate (i (olosit$ #i ca operator. Ccesta se
numete operator de conversie explicit, n limba englez @castA. l este utilizat pentru ca operatorul s
poat alege e!plicit tipul dorit, preciz%nd ntre paranteze con$ersia cerut. Sinta!a de utilizare este:
3tip_conversie4 e!presieU
ste necesar utilizarea cast)ului c%nd se dorete folosirea unui alt tip dec%t cel implicit.
!emplul 2:
float a=n%
a3(int$s[rt(n$% '( se determin partea ntreag a lui radical din n ('
!emplul 4:
int aG bU
c<3double4 a)bU '( rezultatul real al mpririi a dou numere ntregi ('
4./ 1peratorul si5eo(
fectul aplicrii operatorului si5eo( este aflarea dimensiunii n octei a unui tip de date sau a
rezultatului unei e!presii. Sinta!a de utilizare este si5eo(3e!presie4U
"erec3ea de paranteze rotunde este obligatorie. 0eoarece tipul operanzilor este determinat
nc de la compilare, e$aluarea se poate face i n etapa de preprocesare.
!emplu :
siQeof(double$% '( are $aloarea : ('
long aK155L% '( tablou cu 2;; elemente de tip long ('
siQeof(a$% '( are $aloarea 2;;(9U9;; ('
4.12 1peratorii de adresare
Se utilizeaz pentru obinerea adresei unui element sau pentru obinerea coninutului de la o
anumit adres. Cazurile tipice n care sunt folosii sunt :
) accesul la c%mpurile unei structuri sau ale unei uniuni
! memorarea adresei unui element
! accesul indirect la un element
! accesul la un element al unui tablou
Operatorii de adresare sunt :
Y Z inde!are
. selecie direct
selecie indirect
[ determinare adres
D adresare indirect
4.11 1peratorul condi"ional
ste un operator cu trei operanzi. Se folosete pentru situaiile n care e!ist dou $ariante de
obinere a rezultatului, n funcie de ndeplinirea unei condiii. Cre sinta!a :
e!pr_cond _ re5ultat_1 % re5ultat_2U
Semnificaia este :
daca e!pr_cond atunci re5ultat<re5ultat_1
alt(el re5ultat<re5ultat_2
!emplul 2:
double maG=a=b%
maG3(a>b$\aHb% '( se determin ma!imul a dou numere ('
!emplul 4:
unsigned (%
printf(Ms#=(\diferit de 5 Hegal cu 5#$%
'( 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$%
4.12 1peratorul virgul$
0e obicei, $irgula este folosit ca delimitator pentru declaratori, $ariabile sau parametri ai unei
funcii. O alt semnificaie este aceea c reprezint o e!presie care e$alueaz componentele sale n
ordine de la st%nga la dreapta.
!emplul 2 :
int i3?=a=O3+%
a3i=iB3O% '( aU> , iU2; ('
sau
iB3O=a3i% '( iU2; , aU2; ('
!emplul 4:
double G= X= temp%
(G>X$\(temp3G= G3X= X3temp$HX %
'( are ca efect ordonarea cresctoare a $ariabilelor ! i V P ca rezultat se
obine cea mai mare dintre $alorile ! i V ('
4.13 !erci"ii #i teste gril$
2. Fie e!presia a<bPPa<c. S se $erifice
afirmaiile urmtoare :
a) expresia este incorect
sintactic
b. este corect i este ec(ivalent
cu D (a<b$PP(a<c$
c. este corect i este ec(ivalent
cu expresia D a<(bPPa$<c
4. S se $erifice utilizarea cror operaii este
permis :
a$ aD3b% b$ Da3b%
c$ Da3Db% d$ a<<32%
7. Fie o e!presie care conine operatori
aritmetici, relaionali i de atribuire i nu conine
paranteze. S se precizeze, care $a fi ordinea
de e$aluare a operatorilor 8
a) de atribuire, relaionali, arit-
metici
b) aritmetici,relaionali, de atri-
buire
c) de atribuire, aritmetici, rela-
ionali
9. Care din urmtoarele afirmaii sunt
ade$rate 8
a) operatorii pe bii au ordinea de
evaluare naintea operatorilor
logici
b) operatorii de atribuire compus
au o precedena mai mic dec4t
operatorul de atribuire simpl
c) operatorii relaionali au o
preceden mai mare dec4t
operatorii logici
d) toi operatorii relaionali au
acelai nivel de prioritate
<. Fie declaraia : int i=G=X% S se $erifice
care e!presii sunt corecte :
a$ (iB1$BB b$ iBBB 1 c$ DDGBX
d$ BBiBB e$ PGB1 f$ P(GB1$
g$ DGP1
=. "recizai efectul operaiilor :
int G=X=Q%
scanf(RMdR = PG$% XD3(Q3G=G<5$%
"entru obinerea rezultatului erau necesare
parantezele rotunde 8
>. Fie declaraia : unsigned n%
Care din e!presiile urmtoare determin octetul
inferior al $ariabilei n 8
a$ nM29> b$ n>>: c$ n P 5G]]
d$ (n<<:$>>: e$ n>>4
f$ (n<<4$>>4
:. Fie definiiile :
unsigned m35G]5]=n35G]5]5%
char formatKL3RFn n3M:GR%
S se gseasc care $or fi $alorile afiate dup
urmtoarele operaii :
a$ printf(format=m$%
b$ printf(format=n$%
c. printf(format=Zm$%
d$ printf(format=Zn$%
e$ printf(format mYn$%
f$ printf(format=mPn$%
g$ printf(format=mTn$%
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 varia-
bilelor 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
+
D4G
2
B?GD1
b$ X3(aGBb$W(cGBd$
c$ a3maG(GBX=GDX$
d$ m3maG(+G
2
B1=>GD25$
e$ G31= 9a
+
D2= 4a
2
B+= ?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 b) "x>
c) "x1 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 b) %
c) + 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%
XB32%
QD31Bs[rt(XB2$% // radical
de ordin doi
u3E,EDI!E%
&
a) x b) E c) z d) u 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 :
GKa= bL sau GKc= 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%
b$ G3X>5 \ bH a%
c$ G3"X>5 \ b H a%
d$ X>5 \ G3a HG3b%
e$ "(X>5$ \ G3b H G3a%
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 E02 z0) b) x0)2 E0%2 z0)
c) x0%2 E0)2 z0% d) x02 E0)2 z0%
e) x02 E02 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$%
&
a) nici o data b) o data
c) de $ ori d) de % ori
e) 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. 1-
e) 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
Cap.5 6nstruc"iunile limbajului C
5imba&ul C a fost pre$zut cu instruciuni menite s permit realizarea simpl a structurilor
proprii programrii structurate. Structura sec$enial se realizeaz cu a&utorul instruciunii compuse,
structura alternati$ cu a&utorul instruciunii i(, structura repetiti$ condiionat anterior, prin intermediul
instruciunilor 7,ile i (or, structura selecti$ cu a&utorul instruciunii s7itc,, iar structura repetiti$
condiionat posterior cu a&utorul instruciunii do'7,ile.
5imba&ul C are i alte instruciuni care reprezint elemente de baz n construirea structurilor
amintite mai sus. Cstfel de instruciuni sunt : instruciunea e!presie i instruciunea vid$. Clte
instruciuni prezente n limba& asigur o fle!ibilitate mai mare n programare. Ccestea sunt instruciunile:
return, brea8, continue i goto .
5.1 6nstruc"iunea vid$
Se reduce la punct i $irgul -U.. a nu are nici un efect. ?nstruciunea $id se utilizeaz n
construcii care cer prezena unei instruciuni, dar nu trebuie s se e!ecute nimic n punctul respecti$.
Cstfel de situaii apar frec$ent n cadrul structurii alternati$e i repetiti$e, aa cum se $a $edea n
continuare.
5.2 6nstruc"iunea e!presie
Se obine scriind punct i $irgul dup o e!presie. 0eci, instruciunea e!presie are sinta!a :
e!presie U
n cazul n care e!presia din compunerea unei instruciuni e!presie este o e!presie de atribuire, se
spune c instruciunea respecti$ este o instruciune de atribuire. In alt caz frec$ent utilizat este acela
c%nd e!presia este un operand ce reprezint apelul unei funcii. n acest caz, instruciunea e!presie
este o instruciune de apel a funciei respecti$e.
!emplul 2:
int G% G315%
ste o instruciune de atribuire, $ariabilei ! i se atribuie $aloarea 2;.
!emplul 4:
double X% X3XB:% sau XB3:%
ste o instruciune de atribuire, care mrete $aloarea lui : cu 9.
!emplul 7:
putch(cDIaEBE,E$%
ste o instruciune de apel a funciei putc,.
!emplul 9:
double a% aBB%
ste o instruciune e!presie, care mrete $aloarea lui a cu unu.
!emplul <:
double a% BBa%
Cre acelai efect ca i instruciunea e!presie din e!emplul precedent.
1bserva"ie : Nu orice e!presie urmat de punct i $irgul formeaz o instruciune e!presie efecti$.
0e e!emplu construcia aU dei este o instruciune e!presie, ea nu are nici un efect.
!emplul = : S se scrie un program care citete $alorile $ariabilelor aG bG cG dG ! de tip double i
afieaz $aloarea e!presiei 3aD!
2
WbD!Wc4)3aD!
2
WbD!Wd4 dac numitorul este diferit de ; i ; n caz
contrar.
#include<stdio.h>
#include<conio.h>
void main($
{ double a=b=c=d=G%
doube X=Q=u%
clrscr($%
printf(a3#$% scanf(Mlf#=Pa$%
printf(b3#$% scanf(Mlf#=Pb$%
printf(c3#$% scanf(Mlf#=Pc$%
printf(d3#$% scanf(Mlf#=Pd$%
printf(G3#$% scanf(Mlf#=PG$%
X3aNGNG%
Q3bNG%
u3XNGBQBd%
printf(eGp3MgFn#=u \(XBQBc$WuHu$%
getch($%
&
5.3 6nstruc"iunea compus$
?nstruciunea compus este o succesiune de instruciuni incluse ntre acolade, succesiune care
poate fi precedat i de declaraii :
b
declara"ii
instruc"iuni
c
0ac declaraiile sunt prezente, atunci ele definesc $ariabile care sunt definite at%t timp c%t controlul
programului se afl la o instruciune din compunerea instruciunii compuse.
!emplu : "resupunem c ntr)un anumit punct al programului este necesar s se permute $alorile
$ariabilelor ntregi a i b. Cceasta se poate realiza astfel :
{ int t%
t3a%a3b%b3t%
&
/ariabila t este definit din momentul n care controlul programului a&unge la prima instruciune din
instruciunea compus -t<aU.. 0up e!ecuia ultimei instruciuni a instruciunii compuse, $ariabila t nu
mai este definit -nu mai ocup memorie..
?nstruciunea compus se utilizeaz unde este necesar prezena unei instruciuni, dar
procesul de calcul din punctul respecti$ este mai comple! i se e!prim prin mai multe instruciuni. n
acest caz instruciunile respecti$e se includ ntre acolade pentru a forma o instruciune compus. Ccest
procedeu de a forma o instruciune compus din mai multe instruciuni se utilizeaz frec$ent n
construirea structurilor alternati$e i ciclice.
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!
2
W2!'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!
3
W5!
2
'2!W1 G pentru !;2
:<122 G pentru !<2
:<2!
2
W.!'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($%
&
5.5 +unc"ia standard e!it
Funcia e!it are prototipul : void e!it3int cod4U
i el se afl n fiierele 3eader stdlib., i process.,. 5a apelul acestei funcii au loc urmtoarele
aciuni:
se $ideaz zonele tampon -bufferele. ale fiierele desc3ise n scriere
se nc3id toate fiierele desc3ise
se ntrerupe e!ecuia programului
"arametrul acestei funcii definete starea programului la momentul apelului. /aloarea ; definete o
terminare normal a e!ecuiei programului, iar o $aloare diferit de ; semnaleaz prezena unei erori
-terminarea anormal a e!ecuiei programului..
n concluzie, putem apela funcia e!it pentru a termina e!ecuia unui program, indiferent de
faptul c acesta se termin normal sau din cauza unei erori.
!emplu : S se scrie un program care citete $alorile $ariabilelor aGbGc, calculeaz i afieaz
rdcinile ecuaiei de gradul 4 : a!
2
Wb!Wc<2.
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
void main($
{ double a=b=c=d=delta%
clrscr($%
printf(Rcoeficientul lui G patrat H R$%
if(scanf(RMlfR=Pa$"31$
{ printf(Rcoeficientul lui G patrat eronatFnR$%
eGit(1$% '( terminare la eroare('
&
printf(Rcoeficientul lui G H R$%
if(scanf(RMlfR=Pb$"31$
{ printf(Rcoeficientul lui G eronatFnR$%
eGit(1$%
&
printf(Rtermenul liber H R$%
if(scanf(RMlfR=Pc$"31$
{ printf(Rtermenul liber eronatFnR$%
eGit(1$%
&
'( 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($%
&
5.& 6nstruc"iunea 7,ile
Cre sinta!a : 7,ile3e!presie4 instruc"iuneU
"rima parte din acest format constituie antetul instruciunii 7,ile, iar instruc"iune este corpul
ei. 5a nt%lnirea acestei instruciuni nt%i se e$alueaz e!presia din paranteze. 0ac ea are $aloarea
true -este diferit de ;., atunci se e!ecut instruc"iune. Cpoi se re$ine la punctul n care se e$alueaz
din nou $aloarea e!presiei din paranteze. n felul acesta, corpul ciclului se e!ecut at%t timp c%t
e!presia din antetul ei este diferit de ;. n momentul n care e!presie are $aloarea ;, se trece la
instruciunea urmtoare instruciunii 7,ile.
Corpul instruciunii 7,ile poate s nu se e!ecute niciodat. ntr)ade$r dac e!presie are
$aloarea ; de la nceput, atunci se trece la instruciunea urmtoare instruciunii 7,ile fr a e!ecuta
niciodat corpul instruciunii respecti$e.
Corpul instruciunii 7,ile este o singur instruciune care poate fi compus. n felul acesta
a$em posibilitatea s e!ecutm repetat mai multe instruciuni grupate ntr)o instruciune compus.
Corpul instruciunii 7,ile poate fi o alt instruciune 7,ile sau s fie o instruciune compus care s
conin instruciunea 7,ile. n acest caz se spune c instruciunile 7,ile respecti$e sunt imbricate.
?nstruciunile din corpul unei instruciuni 7,ile pot s defineasc un alt mod de e!ecuie a
instruciunii 7,ile dec%t cel indicat mai sus. Cstfel, se poate realiza terminarea e!ecuiei instruciunii
7,ile fr a se mai a&unge la e$aluarea e!presiei din antetul ei. 0e e!emplu, dac n corpul unei
instruciuni 7,ile se apeleaz funcia e!it, atunci se $a termina e!ecuia ciclului 7,ile, deoarece se
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 nY2G1*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($%
&
5.* 6nstruc"iunea (or
?nstruciunea (or, ca i instruciunea 7,ile, se utilizeaz pentru a realiza o structur repetitiv
condiionat anterior. Cre sinta!a :
(or3e!p1 U e!p2 U e!p34 '( antet ('
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%
clrscr($%
ch3EaE%
for(i35%ch"3E[E%iBB$
{ printf(pasH MdFn#=i$%
ch3getche($%
&
getch($%
&
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.
5.. 6nstruc"iunea do'7,ile
1ealizeaz structura ciclic condiionat posterior. Cceast instruciune poate fi realizat cu
a&utorul celorlalte instruciuni definite p%n n prezent. Cu toate acestea, prezena ei n limba& mrete
fle!ibilitatea n programare. Sinta!a ei este :
do
instruc"iune '( corpul ciclului ('
7,ile3e!presie4U
?nstruciunea se e!ecut n felul urmtor : se e!ecut instruc"iune, se e$alueaz e!presieP
dac aceasta are o $aloare diferit de ; -true. atunci se re$ine la e!ecuia instruciunii, altfel -e!presia
are $aloarea ;. se trece n sec$en, la instruciunea urmtoare instruciunii do'7,ile.
Se obser$ c n cazul acestei instruciuni nt%i se e!ecut instruc"iune i apoi se testeaz condiia de
repetare a e!ecuiei ei. ?nstruciunea do'7,ile este ec3i$alent cu sec$ena :
instructiuneU
7,ile3e!presie4 instruc"iuneU
n cazul instruciunii do'7,ile corpul ciclului se e!ecut cel puin o dat, spre deosebire de cazul
instruciunii 7,ile i (or, c%nd este posibil s nu e!ecute niciodat.
!emplul 2: S se scrie un program care afieaz factorii primi ai unui numr ntreg nenegati$
introdus de la tastatur.
#include<stdio.h>
#include<conio.h>
void main($
{ unsigned n=d32=e%
clrscr($%
printf(RFn0ntroduceti numarul H R$%
scanf(RMuR=Pn$%
printf(R Vesc. in factori primi este HFnR$%
do
{ e35%
;hile("(nMd$$
{ n3nWd%
eBB%
c
if(e$ printf(RMd T MdFnR=d=e$%
d3dB((d332$ \1H2$%
&;hile(n>1$%
getch($%
&
!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$%
&
5./ 6nstruc"iunea continue
Cceast instruciune se poate utiliza numai n corpul unui ciclu. a permite abandonarea
iteraiei curente. Sinta!a ei este : continueU. fectul instruciunii este urmtorul :
a) n corpul instruciunilor while i do-while
5a nt%lnirea instruciunii continue se abandoneaz iteraia curent i se trece la e$aluarea
e!presiei care stabilete continuarea sau terminarea ciclului respecti$ -e!presia inclus ntre paranteze
rotunde i care urmeaz dup cu$%ntul c3eie 7,ile..
b) n corpul instruciunii for
5a nt%lnirea instruciunii continue se abandoneaz iteraia curent i se trece la e!ecuia
pasului de reiniializare.
?nstruciunea continue nu este obligatorie. "rezena ei mrete fle!ibilitatea n scrierea
programelor C. a conduce adesea la diminuarea ni$elurilor de imbricare ale instruciunilor i( utilizate n
corpul ciclurilor.
!emplul 2: ?nstruciunea continue este opus instruciunii brea8. a foreaz ca urmtoarea iteraie
a ciclului s aib loc trec%nd peste instruciunile dintre ea i testul de condiie. 0e e!emplu, urmtorul
program nu $a afia nimic niciodat:
#include<stdio.h>
void main($
{
int G%
for(G35%G<155%GBB$
{ continue%
printf(Md#=G$%
&
&
?nstruciunea continue este folosit rareori, nu pentru c folosirea ei nu ar fi o practic bun, ci pentru
c aplicaiile n care ar putea fi utilizat sunt mai rare.
!emplul 4: O bun utilizare a lui continue este aceea de a porni din nou o sec$en de instruciuni
atunci c%nd apare o eroare. 0e e!emplu, programul urmtor calculeaz suma total a numerelor
introduse de utilizator. nainte de a aduna o $aloare la suma total, el $erific dac numrul a fost
introdus corect. 0ac numrul nu a fost introdus corect, pornete din nou ciclul, folosind instruciunea
continue.
#include<stdio.h>
#include<conio.h>
void main($
{
int i= total%
char ch%
clrscr($%
total35%
do{
printf(numarul urmator(5 pentru stop$H $%
scanf(Md#=Pi$%
printf(2ste Md corect \ (^WJ$ =i$%
ch3getche($%
printf(Fn#$%
if(ch33EJE$ continue%
totalB3i%
&;hile(i$%
printf(otalul este MdFn#=total$%
getch($%
&
5.12 6nstruc"iunea brea8
ste nrudit cu instruciunea continue. a are formatul : brea8U
"oate fi utilizat n corpul unui ciclu. n acest caz, la nt%lnirea instruciunii brea8 se termin e!ecuia
ciclului n al crui corp este inclus i e!ecuia continu cu instruciunea urmtoare instruciunii ciclice
respecti$e. Cceast instruciune, la fel ca i instruciunea continue, mrete fle!ibilitatea la scrierea
programelor n limba&ele C i CLL .
!emplul2: S se scrie un program care citete dou numere naturale i poziti$e, calculeaz i
afieaz cel mai mare di$izor comun al lor.
#include<stdio.h>
#include<conio.h>
#include<math.h>
void main($
{ long m=n%
long a=b%
long r%
clrscr($%
do
{ printf(Rprimul numar3R$%
if(scanf(RMldR=Pm$331 PP m>5$ brea(%
printf(Rnu sDa tastat un intreg poQitivFnR$%
& ;hile(1$%
do
{ printf(Ral doilea numar3R$%
if(scanf(RMldR=Pn$331 PP n>5$
brea(%
printf(Rnu sDa tastat un intreg poQitivFnR$%
& ;hile(1$%
a3m% b3n%
do '( algoritmul lui uclid ('
{ r3aMb%
if(r$
{ a3b% b3r%&
&;hile(r$%
printf(R(Mld=Mld$3MldFnR=m=n=b$%
getch($%
&
!emplul 4: ?nstruciunea brea8 permite ieirea dintr)un ciclu, din oricare punct din interiorul su.
C%nd instruciunea brea8 este nt%lnit n interiorul unui ciclu, acesta se $a termina imediat, iar
controlul $a trece la instruciunea ce urmeaz dup ciclu. 0e e!emplu, programul urmtor afieaz
numai numerele de la 2 la 2;.
#include<stdio.h>
#include<conio.h>
void main($
{
int i%
clrscr($%
for(i31%i<155%iBB$
{ printf(Md#=i$%
if(i3315$ brea(%
&
getch($%
&
!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($%
&
5.11 6nstruc"iunea s7itc,
"ermite realizarea structurii selecti$e. Cceasta este o generalizare a structurii alternati$e i a
fost introdus de Xoare. a poate fi realizat prin instruciuni i( imbricate. Itilizarea instruciunii s7itc,
face ca programul s fie mai clar dec%t dac se utilizeaz $arianta cu instruciuni i( imbricate. Structura
selectiv, n forma n care a fost ea acceptat de ctre adepii programrii structurate, se realizeaz n
limba&ul C cu a&utorul urmtorui format al instruciunii s7itc, :
s7itc,3e!presie4
b case c1%
sir_1
brea8U
case c2%
sir_2
brea8U
EEE.
case cn%
sir_n
brea8U
de(ault%
sir
c
unde :
c1Gc2GEGcn sunt constante
sir_1Gsir_2GE..sir_nGsir sunt succesiuni de instruciuni
?nstruciunea s7itc, cu formatul de mai sus se e!ecut astfel :
Se e$alueaz e!presia dintre parantezele rotunde
Se compar pe r%nd $aloarea e!presiei cu $alorile constantelor c1Gc2GEGcn. 0ac $aloarea
e!presiei coincide cu una din constante, s zicem cu ci, atunci se e!ecut sec$ena sir_i, apoi se
trece la instruciunea urmtoare instruciunii s7itc,, adic la instruciunea aflat dup acolada
nc3is care termin instruciunea. 0ac $aloarea respecti$ nu coincide cu nici una din
constantele c1Gc2GE.cn, atunci se e!ecut succesiunea de instruciuni sir din de(ault i apoi se
trece la instruciunea urmtoare instruciunii s7itc,.
Benionm c este posibil s nu se a&ung la instruciunea urmtoare instruciunii s7itc, n
cazul n care succesiunea de instruciuni selectat pentru e!ecuie -sir_i sau sir. $a defini ea nsi un
alt mod de continuare a e!ecuiei programului -de e!emplu, e!ecuia instruciunii de re$enire dintr)o
funcie, saltul la o instruciune etic3etat etc... Succesiunile sir_1Gsir_2GE..Gsir_n se numesc
alternativele instruciunii s7itc,. Clternati$a sir este opional, deci ntr)o instruciune s7itc, sec$ena
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#$%
&
&
5.12 6nstruc"iunea goto
Nu este o instruciune absolut necesar la scrierea programelor n limba&ul C. Cu toate
acestea, ea se do$edete util n anumite cazuri, spre e!emplu la ieirea din mai multe cicluri
imbricate. Cstfel de situaii apar adesea la nt%lnirea unei erori. n astfel de situaii, de obicei, se dorete
s se fac un salt n afara ciclurilor n care a inter$enit eroarea, pentru a se a&unge la o sec$en
e!tern lor de tratare a erorii respecti$e. nainte de a indica formatul instruciunii goto s precizm
noiunea de etichet.
"rin etichet se nelege un nume urmat de dou puncte nume% unde nume este numele
etic3etei respecti$e. 0up etic3et urmeaz o instruciune. Se obinuiete s se spun c etic3eta
prefixeaz instruciunea care urmeaz dup ea. tic3etele sunt locale n corpul funciei n care sunt
definite. ?nstruciunea goto are formatul : goto numeU unde nume este o etic3et definit n corpul
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.
5.13 +unc"iile standard sscan( #i sprint(
Diblioteca standard a limba&elor C i CLL conine funciile sscan( i sprint( care sunt analoge
funciilor scan( i print(. le au un parametru n plus n apel i anume primul lor parametru este adresa
unei zone de memorie -ir de caractere. n care se pot pstra caractere ale codului CSC??. Ceilali
parametri sunt identici cu cei nt%lnii n corespondentele lor, print( i scan(. "rimul parametru al
acestor funcii poate fi numele unui ir de caractere, deoarece un astfel de nume are ca $aloare c3iar
adresa de nceput a zonei de memorie care i este alocat.
Funcia sprint( se folosete, ca i funcia print(, pentru a realiza con$ersii ale datelor de diferite
tipuri din formatele lor interne, n formate e!terne reprezentate prin succesiuni de caractere. 0iferena
const n aceea c, de data aceasta caracterele citite nu se afieaz la terminal, ci se pstreaz n irul
de caractere definit ca prim parametru al funciei sprint(. le se pstreaz sub forma unui ir de
caractere i pot fi afiate ulterior din zona respecti$ cu funcia puts. 0e aceea un apel al funciei print(
poate fi ntotdeauna nlocuit cu un apel al funciei sprint(, urmat de un apel al funciei puts. O astfel de
nlocuire este util c%nd dorim s afim de mai multe ori aceleai date. n acest caz se apeleaz
funcia sprint( o singur dat pentru a face con$ersiile necesare din format intern n format e!tern,
rezultatul con$ersiilor pstr%ndu)se ntr)un ir de caractere. n continuare, se pot afia datele respecti$e
apel%nd funcia puts ori de c%te ori este necesar afiarea lor. Funcia sprint(, ca i funcia print(
returneaz numrul octeilor irului de caractere rezultat n urma con$ersiilor efectuate.
!emplu :
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($%
&
1bserva"ii: Itilizarea instruciunii continue se poate omite folosind o instruciune i( cu alternati$a
else:
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($%
&
5.14 9eader'ul ct:pe.,
Xeader)ul ct:pe., este specializat pentru prelucrarea datelor de tip caracter. l conine numai
funcii i macrouri -sec$ene de cod asemntoare funciilor, la apelul crora se face substituia numelui
funciei cu codul asociat. de $erificare i prelucrare a caracterelor. Cstfel, pentru clasificarea
caracterelor, a$em urmtoarele macrodefiniii :
-acro de veri(icare Valoarea 1 c>nd caracterul este %
isalnum3c4 o liter sau cifr
isalp,a3c4 o liter
isdigit3c4 o cifr n baza 2;
iscntrl3c4 un caracter de control
isascii3c4 un caracter $alid CSC??
isprint3c4 un caracter tipribil
isgrap,3c4 un caracter tipribil mai puin spaiul
islo7er3c4 o liter mic
isupper3c4 o liter mare
ispunct3c4 un caracter de punctuaie
isspace3c4 spaiu,tab,C1,5F,tab $ertical,form)feed
is!digit3c4 o cifr n baza 2=
+unc"ii conversie caractere +ace conversia unui caracter %
int toupper3int c,4 n liter mare. Spre deosebire de macroul
_toupper care modific orice caracter, dac
caracterul c, nu este liter mic, funcia l
ntoarce nemodificat
int tolo7er3int c,4 n liter mic. Spre deosebire de macroul
_tolo7er care modific orice caracter, funcia
ntoarce caracter nemodificat dac nu este liter
mare.
!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$%
&
5.15 +unc"ii matematice u5uale
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 Valoarea returnat$
int abs3int !4U Bacrouri care ntorc modulul unui numr
ntreg de format normal, ntreg de format lung
i real de tip double.
long int labs3long int !4U
double (abs3double !4U
double sart3double !4U Calculeaz rdcina ptrat
double po73double !G double :4U Funcia putere !
:
. n cazul n care ! este ; i :
este negati$ sau dac ! este negati$ i : nu
este ntreg se semnaleaz eroare.
double po7123int p4U Funcia putere c%nd baza este 2;.
double e!p3double !4U Funcia e
!
.
double log3double !4U Funcia logaritm natural, ln3!4 .
double log123double !4U 5ogaritmul n baza 2;.
double lde!p3double !G int e!p4U Calculeaz !D2
e!p
.
double (mod3double !G double :4U Calculeaz ! modulo : .
double pol:3double !G int nG double
coe(YZ4U
$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
double (loor3double !4U 1otun&ire inferioar. ntoarce cel mai mare
numr ntreg mai mic sau egal cu !.
double ceil3double !4U 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
)=!
4
L2<!)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 Bumele (unc"iei Valoarea returnat$
double sin3double !4U Sinus 1eal ntre 62 i 2
double cos3double !4U Cosinus 1eal ntre 62 i 2
double tan3double !4U #angent 1eal
double asin3double !4U Crc sinus 1eal ntre ) '4 i '4
double acos3double !4U Crc cosinus 1eal ntre ; i
double atan/double !4U Crc tangent 1eal ntre ) '4 i '4
double atan23double :G double !4U Crc tangenta lui :)! 1eal ntre ; i
double sin,3double !4U Sinusul 3iperbolic 1eal
double cos,3double !4U Cosinusul 3iperbolic 1eal
double tan,3double !4U #angenta 3iperbolic real
5.1& !erci"ii #i teste gril$
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+ c) s0;
d) s01 e)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)1-
d) " 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 a $ariabilei m, sec$ena
de program de mai &os reprezint o bucl
infinit 8
int n315= m%
do{
;hile(n>5$ nDD%
&;hile(n"3m$%
a) 1"
b) orice valoare diferit de 1"
c) "
d) orice valoare diferit de "
e) orice valoare ntreag
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 sus alegei
comportamentul corect :
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$%
&
/aloarea afiat este :
a) 1!)+ b) 1!"""""" c) 1
d) programul conine erori de
sintax
2:. Fie sec$ena de cod prezentat mai &os :
i31%
;hile(n$ i3iN(nDD$%
atunci aceasta :
a. calculeaz n"
b. calculeaz i
n
c) calculeaz n
i

d) se cicleaz la infinit
2E. Fie sec$ena de cod prezentat mai &os :
i31%
;hile(nDD$ i3iN2%
atunci aceasta :
a. calculeaz 2
n
b) calculeaz i
2
c)

calculeaz n
2

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$$ {
BB contor%
GDD%
&
a) " b) 1 c) $ d) %
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) % c) "
d) nedefinit pentru c va fi o
bucl infinit
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%
e) a0), b0$, c0%
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) )
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 n
2
, 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 12
n
, 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$a ii:
! 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('
&.2 6ni"iali5area tablourilor
0eclaraia unui tablou poate fi urmat de o sec$en de iniializare format din una sau mai
multe perec3i de acolade ntre care se pun $alori ale tipului de baz, separate prin $irgul.
"entru tablourile unidimensionale este permis omiterea numrului de elemente. l $a fi egal
cu numrul de $alori folosite la iniializare.
n cazul n care la iniializarea tablourilor de tip numeric sunt folosite mai puine elemente dec%t
dimensiunea tabloului, restul elementelor sunt iniializate cu ;.
!emple %
float GK9L3{1.2=+.:e+=D2=A5.?2D4=D44.9eD?&%
char sK155L3#test tablou#%
short XKL3{5=1=2=+=:&% '( V are < elemente ('
char sKL3{ItE=IeE=IsE=ItE=IF5E&% '( c3ar sGHUAtestAP ('
int GK9L3{1=2&% '( !U-2, 4, ;, ;, ;. ('
?niializarea unui tablou multidimensional se face asemntor cu cea a unui $ector. Se poate
face specificarea complet sau parial a datelor, cele nedefinite fiind iniializate cu ;. ste permis
doar omiterea primei dimensiuni -cea din st%nga..
!emple %
int aK+LK2L3{{1=2&={+=:&={9=>&&%
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
&.3 0relucr$ri elementare ale vectorilor
0eoarece limba&ul C nu $erific depirea dimensiunilor ma!ime declarate pentru tablourile
utilizate n aplicaii, pentru a e$ita scrierea accidental a unor zone de memorie, programatorul trebuie
s asigure $alidarea dimensiunilor reale -implicit a numrului de elemente. citite de la intrare. Izual, un
$ector se declar n urmtoarea manier:
#define .,* 155 '( dimensiunea ma!im admis ('
ZZZZZZZZZZ
int aK.,*L%
int n% '( dimensiunea real citit la intrare ('
Sec$ena tipic de $alidare a dimensiunii unui $ector este urmtoarea:
do{
printf(n3#$%
scanf(Md#=Pn$%
if(n<35YYn>.,*$ printf(dimensiune incorectaFn#$%
&;hile(n<35YYn>.,*$%
&.3.1 Citirea elementelor unui vector
0up $alidarea dimensiunii, citirea elementelor unui $ector se face n ordinea cresctoare a
indicilor, uzual cu o instruciune for :
for(int i35% i<n% iBB$
{ printf(aKMd#L3#=i$%
scanf(Md#=PaKiL$%
&
Obser$a ie: 0ei tablourile sunt inde!ate n C ncep%nd de la ;, se pot utiliza elementele numai de la
inde!ul 2 -ca n "ascal., elementul aY2Z rm%n%nd liber. n aceast situaie sec$ena de citire -i toate
celelalte sec$ene de prelucrare. se $or modifica corespunztor, conform modelului de mai &os:
for(int i31%i<3n%iBB$
{ printf(aKMdL3#=i$%
scanf(Md#=PaKiL$%
&
&.3.2 Determinarea elementului minim)ma!im
Betoda tipic de determinare a elementului minim'ma!im dintr)un $ector este urmtoarea : se
iniializeaz minimul'ma!imul cu primul element din $ector apoi se compar cu celelalte elemente din
$ector rein%ndu)se, pe r%nd, $alorile mai mici'mai mari.
minim3aK5L% '( ma!imUaG;HP ('
for(i31% i<n% iBB$
if(minim>aKiL$ '( -ma!imJaGiH. ('
minim3aKiL% '( ma!imUaGiHP ('
&.3.3 Determinarea primului element cu o anumit$ proprietate
"entru a determina primul element -de indice minim. cu o anumit proprietate, se parcurge
$ectorul de la st%nga la dreapta p%n c%nd gsim primul element cu proprietatea cerut sau p%n c%nd
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..
&.3.4 Determinarea ultimului element cu o anumit$ proprietate
"entru a determina ultimul element -de indice ma!im. cu o anumit proprietate, se parcurge
$ectorul de la dreapta spre st%nga -n ordinea descresctoare a indicilor. p%n c%nd gsim primul
element cu proprietatea cerut sau p%n c%nd epuizm elementele $ectorului. 0e e!emplu,
determinarea ultimului element par dintr)un $ector se realizeaz cu sec$ena:
f3D1%
for(O3nD1%O>35%ODD$
if("(aKOLM2$$
{ f3O% brea(% &
&.3.5 liminarea tuturor elementelor cu o anumit$ proprietate
Cea mai simpl metod de a elimina dintr)un $ector toate elementele cu o anumit proprietate
este s crem un nou $ector n care se pstreaz elementele care nu au proprietatea respecti$. 0e
e!emplu, pentru a elimina dintr)un $ector toate elementele negati$e, putem utiliza sec$ena:
O3D1%
for(i35%i<n%iBB$
if(aKiL>35$ '( nu are proprietatea cerut ('
bKBBOL3aKiL% '( pstram elementul n $ectorul b ('
n3O% '( actualizm dimensiunea $ectorului ('
Betoda este ineficient datorit consumului de memorie necesar pentru $ectorul b. O metod mult
mai eficient este s folosim acelai $ector n care $om RngrmdiA pe primele poziii elementele care
trebuie pstrate. "rin actualizarea dimensiunii $ectorului, elementele de prisos nu $or mai fi luate n
consideraie n prelucrrile ulterioare. Sec$ena care realizeaz aceast operaie este urmtoarea:
O3D1%
for(i35%i<n%iBB$
if(aKiL>354 '( nu are proprietatea cerut ('
aKBBOL3aKiL% '( mutm elementul la nceputul $ectorului ('
n3O% '( actualizm dimensiunea $ectorului ('
&.3.& liminarea elementului din po5i"ia 8 dat$ 31;<8;<n4
"rin eliminarea elementului din poziia 8 dat -elementul de indice 8'1., se obser$ c primele
8'1 elemente rm%n nesc3imbate, n timp ce elementele din poziiile 8W1, 8W2,ZZ.,n se deplaseaz
cu o poziie spre st%nga pentru a @umpleA golul rmas prin eliminarea elementului din poziia 8.
$ident, dimensiunea $ectorului scade cu o unitate :
for(O3(D1%O<3nD2%OBB$ aKOL3aKOB1L% '( deplasm elementele spre st%nga ('
nDD% '( corectm dimensiunea ('
&.3.* 6nserarea unui element : =n po5i"ia 8 dat$ 31;<8;<n4
Cum inserarea unui element se face fr a pierde $reun element din $ectorul iniial, elementele
din poziiile 8, 8W1,.......n trebuie s se deplaseze cu o poziie spre dreapta pentru a face loc noii $alori
: introdus n poziia 8 -indice 8'1.. 0imensiunea $ectorului crete cu o unitate:
for(O3n%O>3(%ODD$ aKOL3aKOD1L% '( deplasm elementele spre dreapta ('
aK(D1L3X% '( inserm elementul V ('
nBB% '( actualizm dimensiunea ('
&.3.. 0ermutarea circular$ cu o po5i"ie spre st>nga
"rin acest operaie, elementele din poziiile 2G3GEE..Gn se deplaseaz cu o poziie spre
st%nga i elementul din prima poziie a&unge n poziia n. /ectorul nu i modific dimensiunea:
auG3aK5L% '(sal$m temporar primul element ('
for(O35%O<3nD2%OBB$ aKOL3aKOB1L% '( deplasm elementele spre st%nga ('
aKnD1L3auG% '( mutm elementul n ultima poziie ('
&.3./ 0ermutarea circular$ cu o po5i"ie spre dreapta
"rin aceast operaie, elementele din poziiile 1G2GEEGn'1 se deplaseaz cu o poziie spre
dreapta, iar elementul din poziia n a&unge n poziia 1. /ectorul nu i modific dimensiunea:
auG3aKnD1L% '( sal$m temporar ultimul element ('
for(O3nD1%O>31%ODD$ aKOL3aKOD1L% '(deplasm elementele spre dreapta ('
aK5L3auG% '( mutm elementul n prima poziie ('
&.3.12 Sortarea vectorilor
"rin sortare se nelege aran&area elementelor unui $ector n ordine cresctoare sau
descresctoare. "entru rezol$area acestei probleme au fost concepui di$eri algoritmi, mai mult sau
mai puin rapizi, mai simpli sau e!trem de complicai. n acest moment $om aborda dou dintre cele mai
simple metode de sortare de comple!itate n
2
.
?4 -etoda bulelor 3bubblesort4
Conform acestei metode, $ectorul este parcurs de la st%nga spre dreapta compar%ndu)se
perec3i de elemente succesi$e -aYjZ cu aYjW1Z.. 0ac cele dou elemente nu sunt n ordinea cerut, se
intersc3imb i, o $ariabil iniial egal cu ;, se incrementeaz. n acest fel, la prima parcurgere a
$ectorului, elementul ma!im din ir -dac se face ordonare cresctoare. se deplaseaz spre dreapta
p%n c%nd a&unge n ultima poziie. 5a a doua parcurgere a $ectorului , al doilea cel mai mare element
a&unge n penultima poziie etc. "arcurgerea $ectorului se reia p%n c%nd nu mai gsim nici)o perec3e
de elemente consecuti$e neordonate. 5a fiecare parcurgere, lungimea sec$enei care se $erific scade
cu o unitate:
(3n% '( iniial $erificm tot $ectorul ('
do{
f35% '( numr perec3ile neordonate ('
for(O35%O<(D1%OBB$
if(aKOL>aKOB1L$ '( pentru ordonare cresctoare ('
{ auG3aKOL% aKOL3aKOB1L%
aKOB1L3auG% '( intersc3imbm elementele ('
fBB% '( numrm in f ('
&
(DD% '( lungimea sec$enei care se $erific scade ('
&;hile(f$% '( repet c%t timp mai sunt perec3i neordonate ('

Q4Sortarea prin selec"ie direct$
Conform acestei metode primul element -aY2Z. se compar pe r%nd cu toate elementele de
dup el i dac ordinea de sortare nu este respectat, cele dou elemente se intersc3imb. 0up
efectuarea tuturor comparaiilor, n prima poziie a&unge cel mai mic element din $ector -n cazul
ordonrii cresctoare.. Se compar apoi al doilea element cu toate elementele de dup el etc. 5a
ultimul pas se compar numai ultimele dou elemente. Sec$ena corespunztoare de program este :
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 ('
&
&.3.11 ?lgoritmul de c$utare binar$
Se consider un $ector oarecare ? cu n elemente i o $aloare !. Se cere s se $erifice dac !
apare printre elementele $ectorului sau nu. 0ac lucrm cu un $ector oarecare, se $or compara pe
r%nd elementele acestuia cu $aloarea cutat !. Sunt necesare cel mult n comparaii n caz de succes
-! apare n $ector. i e!act n comparaii n caz de eec -! nu apare n $ector.. n cazul n care $ectorul
este ordonat cresctor sau descresctor se poate folosi un algoritm de cutare mult mai eficient a$%nd
comple!itatea log2n. Ccest algoritm se numete @algoritmul de cutare binarA i poate fi descris astfel :
iniial se consider tot $ectorul ? i se compar ! cu elementul din mi&locul acestuia -fie el aYmijZ.. 0ac
!<aYmijZ, algoritmul se nc3eie cu succesP dac !;aYmijZ, $ectorul fiind ordonat, cutarea $a continua n
prima &umtate, iar dac !VaYmijZ cutarea $a continua n a doua &umtate. "rocedeul se repet p%n
c%nd fie gsim $aloarea !, fie nu mai a$em sec$en $alid de cutare, adic elemente ne$erificate.
Sec$ena curent n care se face cutarea elementului ! este identificat prin indicele elementului din
e!trema st%ng, respecti$ indicele elementului din e!trema dreapt. Sec$ena de program este
urmtoarea :
f3D1% '( ! nu a fost gsit n $ectorul C ('
st35% dr3nD1% '( sec$ena iniial de cutare este ntregul $ector C ('
;hile(st<3dr$ '( sec$ena curent de cutare conine cel puin un element ('
b miO3(stBdr$W2% '( indicele elementului din mi&locul sec$enei de cutare ('
if(aKmiOL33G$
{ f3miO% '( memorm poziia n care apare ('
brea(% '( cutare nc3eiat cu succes ('
&
if(G<aKmiOL$
dr3miOD1% '( cutarea continu n prima &umtate ('
else
st3miOB1% '( cutarea continu n a doua &umtate ('
&
&.3.12 6nterclasarea vectorilor
Se consider doi $ectori, ? cu m elemente i Q cu n elemente, ambii ordonai cresctor sau
descresctor. C interclasa cei doi $ectori nseamn a obine un $ector C cu mWn elemente, care
conine toate elementele din ? i din Q, ordonate n acelai mod. Betoda de creare a $ectorului rezultat
C este foarte simpl: se compar elementul curent din ? cu elementul curent din Q, n C se introduce
spre e!emplu cel mai mic dintre ele -la ordonare cresctoare.. 0ac elementul introdus a fost din
$ectorul ? atunci se a$anseaz la urmtorul element din ?, altfel se a$anseaz la urmtorul element
din $ectorul Q. n momentul n care elementele unui $ector sunt epuizate, elementele rmase n cellalt
$ector sunt copiate direct n $ectorul C. Ccest algoritm se simplific dac folosim dou @santineleA care
$or face ca cei doi $ectori s se epuizeze simultan. O santinel este un element care nu influeneaz
$aloarea unui rezultat, scopul utilizrii lui fiind numai obinerea unui algoritm mai simplu i mai eficient.
n cazul algoritmului de interclasare, $om aduga la sf%ritul $ectorului ? o santinel mai mare dec%t
cel mai mare element din Q, iar la sf%ritul $ectorului Q o santinel mai mare dec%t cel mai mare
element din ?. n acest caz, dac presupunem c toate elementele utile din $ectorul ? au fost de&a
introduse n $ectorul rezultat CG atunci, toate elementele utile din Q care nu au fost nc $erificate sunt
mai mici dec%t santinela rmas n ? i $or fi copiate automat, fr nici)o $erificare suplimentar, n
$ectorul rezultat C. Sec$ena care realizeaz interclasarea cu santinele este:
aKmL3bKnD1LB1% '( santinela din C mai mare dec%t cel mai mare element din D ('
bKnL3aKmD1LB1% '( santinela din D mai mare dec%t cel mai mare element din C ('
i35% '( indicele elementului curent din C ('
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 ('
&.4 0relucr$ri elementare ale matricilor
Ca i n cazul tablourilor unidimensionale, se pune problema depirii dimensiunilor ma!ime
specificate n declaraia unui tablou bidimensional -matrice.. Batricile sunt de dou tipuri:
dreptung3iulare -numrul de linii diferit de numrul de coloane. i ptratice -numrul de linii egal cu
numrul de coloane..
"entru matricile dreptung3iulare maniera uzual de declarare i $alidare a dimensiunilor este
urmtoarea :
#define .,*S0J ? '( numrul ma!im de linii ('
#define .,*!'S 9 '( numrul ma!im de coloane ('
int aK.,*S0JLK.,*!'SL%
int m=n% '( numrul real de linii, respecti$ coloane ('
EEEEEEEEEEEE
do{
printf(numarul de linii3#$%
scanf(Md#=Pm$%
if(m<35 YY m>.,*S0J$ printf(dimensiune eronataFn#$%
&;hile(m<35 YY m>.,*S0J$%
do{
printf(numarul de coloane3#$%
scanf(Md#=Pn$%
if(n<35 YY n>.,*!'S$ printf(dimensiune eronataFn#$%
&;hile(n<35 YY n>.,*!'S$%
"entru o matrice ptratic maniera uzual de declarare i $alidare a dimensiunii este
urmtoarea:
#define V0. 4
int aKV0.LKV0.L%
int n% '( dimensiunea real a matricii ('
..
do{
printf(dimensiunea matricii3#$%
scanf(Md#=Pn$%
if(n<35 YY n>V0.$ printf(dimensiune eronataFn#$%
&;hile(n<35 YY n>V0.$%
ste bine de tiut c memorarea matricilor se face pe linii -ordine le!icografic., adic
compilatorul rezer$ pentru matrice o zon contigu de memorie de dimensiune
-?H@6BD-?HC1@Dsi5eo(3tip4, unde tip este tipul de baz al matricii, adic tipul elementelor
componente. "rimele -?HC1@ locaii din aceast zon sunt pentru elementele din prima linie -de
indice ;., c3iar dac nu toate sunt folosite, urmtoarele -?HC1@ locaii sunt rezer$ate pentru
elementele din a doua linie -de indice 2. etc. "ractic, n memorie, matricea este liniarizat sub forma
unui $ector cu -?H@6BD-?HC1@ elemente, unele din aceste elemente put%nd fi neutilizate.
1aionamentul se aplic identic pentru matricile ptratice, numrul de elemente fiind D6-DD6-
-dimensiunea matricii..
n continuare, $om considera cazul general al matricilor dreptung3iulare, sec$enele de
instruciuni trebuind modificate corespunztor pentru a lucra corect cu matricile ptratice
-m<n<dimensiunea matricii..
&.4.1 Citirea elementelor unei matrici
0eoarece memorarea matricilor se face pe linii, elementele se citesc pe linii, adic indicele de
coloan se modific mai rapid dec%t indicele de linie. Sec$ena corespunztoare de program este
urmtoarea:
for(i35%i<m%iBB$ '( indicele de linie ('
for(O35%O<n%OBB$ '( indicele de coloan ('
{ printf(aKMd=MdL3#=i=O$%
scanf(Md#=PaKiLKOL$%
&
&.4.2 Tip$rirea elementelor unei matrici
0ac dorim s tiprim matricea cu $alorile de pe aceeai coloan aliniate spre e!emplu la
dreapta, $om folosi facilitile de aliniere i de specificare a numrului de zecimale -pentru $alori reale.
ale funciei print(. Spre e!emplu, tiprirea unei matrici de numere reale cu $alorile aliniate la dreapta i
trei zecimale e!acte se poate realiza cu sec$ena:
for(i35%i<m%iBB$
{ for(O35%O<n%OBB$
printf(M4.+f#=aKiLKOL$% '( tiprete elementele de pe o linie ('
printf(Fn#$% '( trece la o linie nou ('
&
&.4.3 Determinarea elementului ma!im)minim
Betoda uzual este urmtoarea: se iniializeaz ma!imul'minimul cu primul element din matrice
-aY2ZY2Z., se compar apoi pe r%nd cu toate elementele din matrice i se reine $aloarea mai mare'mai
mic. Sec$ena de instruciuni care realizeaz acest lucru este urmtoarea:
maGim3aK5LK5L% '( minimUaG;HG;H ('
for(i35%i<m%iBB$
for(O35%O<n%OBB$
if(maGim<aKiLKOL$ '( minimKaGiHG&H ('
maGim3aKiLKOL% '( minimUaGiHG&H ('
&.4.4 6denti(icarea elementelor speci(ice unei matrici p$tratice
n cazul matricilor ptratice se identific urmtoarele elemente specifice: diagonala principal
-D0., diagonala secundar -DS., &umtatea superioar -dS. i &umtatea inferioar -d6.. 0iagonalele
corespund -geometric. diagonalelor unui ptrat.
0iagonala principal cuprinde elementele din colul st%nga sus p%n n colul dreapta &os, adic
mulimea:
D0<baij^ i<jG i<2GE..n'1c<ba22G a11G a22G EEEEEE.Gan'1n'1c unde n este dimensiunea real a
matricii.
0iagonala secundar cuprinde elementele din colul dreapta sus p%n n colul st%nga &os,
adic mulimea:
DS<baij^i<2G1GEn'1 G j<n'1Gn'2GE2G iWj<n'1c<ba2n'1G a1n'2GEE..Gan'12c
[umtatea superioar cuprinde elementele de deasupra diagonalei principale -fr cele de pe D0.,
adic mulimea:
dS<baij ^ i<2G1GEEEn'2 G j<iW1GEEEEEEEGn'1c
[umtatea inferioar cuprinde elementele de sub diagonala principal -fr elementele de pe D0.,
adic mulimea:
d6<baij ^ i<1G2GEEE.n'1 G j<2G1GEEEi'1c
In element aYiZYjZ din dS are drept simetric elementul aYjZYiZ din d6. Cstfel, transpusa unei matrici
ptratice -matricea care are liniile drept coloane i reciproc. se poate genera uor intersc3imb%nd toate
elementele din dS cu simetricele lor din d6 aa cum se $ede n sec$ena de mai &os:
for(i35% i<nD1% iBB$
for(O3iB1% O<n% OBB$
{ auG3aKiLKOL%
aKiLKOL3aKOLKiL%
aKOLKiL3auG%
&
&.5 !erci"ii #i teste gril$
2. Care dintre $ariantele de mai &os reprezint o
declaraie corect a unui $ector v cu 4; de
elemente numere ntregi 8
a$ vK25LHinteger% b$ vK25L int%
c$ int vK25L% d$ int HvK25L%
e$ integer vK25L%
4. C%te erori conine programul de mai &os8
void main($
{
int n=(%
int vKnL%
n3:
for((35%(<n%(BB$ vK(L3 35%
&
a) " b) 1 c) $
d) % e) )
7. Care dintre sec$enele de program de mai
&os calculeaz corect suma primelor n
elemente ale unui $ector s 8
a$ s35%
for(i35%i<n%iBB$ sB3vKiL%
b$ s35% i35%
;hile(i<n$
{ sB3vKiL% iBB%&
c$ s35% i35%
do{
sB3vKiL% iBB%
&;hile(i<nD1$%
d$ toate e$ nici una
9. 0educei care $or fi elementele $ectorului v
dup e!ecuia sec$enei de program
urmtoare:
int n=(=G=vK?L3{9=1:=D+=4=D1&%
n39% G3vK5L%
for((31%(<n%(BB$ vK(D1L3vK(L%
vKnD1L3G%
a) (-1,,1),-%,.,",")
b) (1),-%,.,-1,",",)
c) (1),-%,.,-1,,",")
d) (",",,-%,1),-1,.)
e) (",",-1,1),-%,.,)
<. C%te elemente ale $ectorului v $or a$ea
$aloarea E dup e!ecuia programului de mai
&os8
#include<stdio.h>
void main($
{
int vKL3{5=1=2=5=:=9=>&%
int i35=G3A%
do{
vKiBBL3G%
&;hile(i<> PP vKiL$%
&
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%&
a. expresia din ;hile este eronat
sintactic
b) declaraia i iniializarea
vectorului sunt corecte
c) dup execuia secvenei toate
elementele vectorului vor fi 1
d) dup execuia secvenei toate
elementele vectorului vor fi "
e. execuia secvenei va produce un
ciclu infinit
29. "recizai care $a fi efectul sec$enei de
program urmtoare, n care vY2ZG.....GvYn'1Z este
un $ector cu n elemente ntregi.
G3vKnD1L%
for((3nD1%(>5%(DD$ vK(L3vK(D1L%
vK5L3G%
a. deplaseaz toate elementele
vectorului cu o poziie la
dreapta
b) deplaseaz toate elementele
vectorului cu o poziie la
st4nga
c) terge un element din vector
prin deplasarea celor aflate
naintea lui
d) rotete circular vectorul cu o
poziie
e) nici una din variantele
anterioare
2<. Fie sec$ena de program urmtoare, n
care v este un $ector cu n elemente ntregi, iar
p este o $ariabil ntreag:
for(p31=(31%(<n%(BB$
if(vK(L33vK(D1L$ p35%
printf(Md#= p$%
Sec$ena afieaz ; dac:
a) toate elementele sunt distincte
dou c4te dou
b) toate elementele sunt egale
c. exist dou elemente consecutive
distincte
d) exist dou elemente consecutive
egale
e) nici una din variantele de mai
sus
2=. Ce $aloare $a fi afiat n urma e!ecuiei
programului urmtor8
#include<stdio.h>
void main($
{
int vKL3{5=1=2=5=:=9=>&%
int O35=nr35%
do{
if(O33vKOL$ nrBB%
&;hile(O<>PPvKOBBL$%
printf(Md#=nr$%
&
a) " b) 1 c) %
d)
e) programul intr n bucl
infinit
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 dintr-
un 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 definit P 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.
*.2 ?ritmetica pointerilor
?ritmetica pointerilor repre5int$ ansamblul opera"iilor care se pot e(ectua cu o variabil$
pointer. Ccestea sunt :
2. peraia de extragere a coninutului unei variabile pointer care a fost e!emplificat anterior
3Dpointer.
4. peraia de extragere a adresei unei variabile pointer . C$%nd n $edere c pointerul este la r%ndul
lui tot o $ariabil i acesteia i se poate e!trage adresa. /ariabila care memoreaz adresa unei alte
$ariabile pointer se numete pointer la pointer.
!emplu :
int a319=Npa=NNppa%
'( ppa este un pointer la pointer la ntreg ('
pa3Pa%
ppa3Ppa%
printf(Fna3Md#=NNppa$%
/ariabila a a fost afiat folosindu)se o dubl indirectare .
7. peraia de atribuire !ntre pointeri este permis doar dac pointerii refer acelai tip. Fie sec$ena :
int a3?=Npa1=Npa2%
pa13Pa%
pa23pa1%
'( ambele $ariabile pointer conin adresa lui a ('
printf(Fn a3Md a3Md#=Npa1=Npa2$%
Se $a afia de dou ori $aloarea > indirect, prin intermediul celor doi pointeri care conin aceeai
adres.
9. peraia de incrementare" respectiv decrementare a unui pointer , presupune obinerea unei adrese
mai mari, respecti$ mai mici, n funcie de dimensiunea tipului de dat referit de pointer.
!emplu :
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; ('
=. p eraia 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$%
*.3 @eg$tura pointer A tablou
#abloul, prin definiie, este o structur de date omogen cu un numr finit i cunoscut de
elemente. Fiind definit tabloul int aY52Z, numele lui reprezint adresa primului element din tablou
-a<[aY2Z.. C$%nd stabilit aceast legtur se pot defini mai multe modaliti ec3i$alente de accesare a
unui element din tablou. Cstfel, elementul de rang i se acceseaz folosind una din relaiile :
aKiL% (1$
N(aBi$% (2$
N(PaK5LBi$% (+$
iKaL% (:$
c. relaia -2. este forma obinuit de accesare a elementului de rang i numit i adresare inde!at$
d. relaia -4. este forma de adresare a elementului de rang i indirect, pornind de la adresa acestuia
e. relaia -7. este deri$at din relaia 4, doar c se pune n e$iden n mod e!plicit c numele
tabloului este adresa primului element din $ector
f. relaia -9. deri$ din faptul c e!presia aYbZ este e$aluat de compilator n forma D3aWb4. 0eoarece
adunarea este comutati$, pentru e!emplul nostru aKiL N(aBi$ N(iBa$ iKaL!
Ccelai concept se aplic tablourilor cu dou sau mai multe dimensiuni. 0e e!emplu,
presupun%nd c a este un tablou de ntregi cu 2; linii i 2; coloane -aY12ZY12Z., urmtoarele dou
e!presii sunt ec3i$alente: a #i [aY2ZY2Z. n continuare, elementul din linia ; i coloana 9 poate fi
referit n dou moduri: fie prin aplicarea de indeci, aY2ZY4Z, fie prin intermediul unui pointer D3aW44. n
general, pentru orice tablou bidimensional, aYjZY8Z este ec3i$alent cu una din formele :
D3aW3jDnumar_coloane4W84
D3aYjZW84
D3D3aWj4W84
Ca obser$aie, numele unui $ector este un pointer constant. O consecin este c aritmetica de
pointeri ce se aplic acestui tip de pointer este mai restr%ns n sensul c, acest pointer nu)i poate
modifica $aloarea. O alt particularitate const n faptul c operatorul si5eo( aplicat unui $ector ntoarce
numrul de octei al ntregii zone ocupat de $ector.
"%n acum s)a e$ideniat legtura dintre pointer i tablou n sensul c s)a definit un tablou i a
fost e!ploatat prin intermediul pointerilor. Sensul este i reciproc, adic definind un pointer, zona de
memorie alocat poate fi utilizat ca i cum ar fi numele unui tablou. Ca e!emplu, se $a defini o zon
de memorie capabil a stoca n ntregi, apoi se $a ncrca zona de memorie prin citire de la tastatur i
se $a calcula suma elementelor introduse.
int Npa=n=s%
printf(Fn Jr. de elemente3#$%
scanf(Md#=Pn$%
pa3(intN$malloc(nNsiQeof(int$$%
for(int i35%i<n%iBB$
{ printf(Fn elemKMdL3#=iB1$%
scanf(Md#=PpaKiL$%
&
for(i3s35%i<n%iBB$ sB3paKiL%
printf(Fn suma3Md#=s$%
Se obser$ c elementele zonei de memorie referite de pointerul pa au fost accesate folosindu)se
adresarea inde!at paYiZ care este specific lucrului cu tablouri.
n limba&ul C, pointerii i tablourile sunt n str%ns legtur ei fiind de fapt intersc3imbabili. 0ac
folosii numele unui tablou fr inde!, generai de fapt un pointer ctre primul element al tabloului. ?at
de ce nu este necesar nici un inde! atunci c%nd are loc citirea unui ir folosind funcia gets34. Ceea ce
este transferat funciei gets34 nu este un tablou, ci un pointer. 0e fapt, n C nu se poate transfera un
tablou unei funcii, ci numai un pointer ctre tablou. Funcia gets34 folosete un pointer pentru a ncrca
tabloul de caractere introdus de la tastatur.
!emplul 2: 0eoarece numele unui tablou fr inde! este un pointer ctre primul element al tabloului,
aceast $aloare poate fi asignat unui alt pointer i prin aceasta de$ine posibil accesarea elementelor
tabloului folosind pointerul aritmetic. S considerm urmtorul program:
#include<stdio.h>
int aK15L3{1=2=+=:=9=>=?=4=A=15&%
void main($
{ int Np%
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 2J26#%
..
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%
printf(0ntroduceti un sir H#$%
p3gets(str$%
'( dac p nu este null se afieaz irul ('
if(p$printf(Ms Ms#=p=str$%
&
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$%
&
*.4 !erci"ii #i teste gril$
2. Fie declaraia: int var=Npointer%.
/erificai dac e!presia: (Ppointer$ are
aceeai semnificaie cu pointer i P(var$
are aceeai semnificaie cu var. Cum e!plicai
aceasta 8
4. Fie declaraia: double d=Npd%! S se
decid dac $ariabilele d i pd au aceeai
dimensiune.
7. Considerm declaraiile :
int n= const int a315 = Npci3Pa%
S se determine care dintre instruciuni sunt
corecte :
n3a% a32%
n3Npci% Npci31%
pciBB%
9. Fie declaraiile :
int n315% const Ncpi3Pn%
S se determine corectitudinea instruciunilor
urmtoare :
Ncpi31% cpi3Pn%
cpiBB% n3cpi%
<. "recizai ce tiprete programul urmtor :
#include<stdio.h>
long
aK15L3{15=11=12=1+=1:=19=1>=1?=
14=1A&%
void main($
{ long Npi%
for(pi3PaK5L% pi<PaK15L% piBB$
printf(FnMpHMld#= pi= Npi$%
&
=. "recizai ce face programul urmtor:
#include<stdio.h>
int aK15L3{15=11=12=1+=1:=19=1>=1?=
14=1A&%
void main($
{ int Npi%
for(pi3a%pi<aB15%$
printf(FnMpHMd#=pi=BBNpiBB$%
&
>. 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$%
if(G33X$ putchar(I1E$%
else putchar(I5E$%
a) $,1",$,1 b) $,1",$," c) ,-,,"
d) ,1",," e) ,1",,1
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$
printf(MdFn#=NvK5L$% WW(2$
N(vB1$3Pb% WW(+$
printf(MdFn#=N(N(vB1$$$% WW(:$
2KvL3Pc% WW(9$
printf(MdFn#=NvK2L$% WW(>$
&
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 cu
sec$ena:
a$ p3PG% X3NpB155%
b. X3NpB155% p3PG%
c$ p3PX% X3NpB155%
d$ p3PG% X3PpB155%
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%
?nstruciunea GBB% este ec3i$alent cu
sec$ena :
a$ p3PG% (Np$BB% b$ p3NG% (Pp$BB%
c$ p3PG% N(pBB$% d$ p3PG% NpBB%
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&%
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) ptr0- d) ptr0.
Cap.. Tiruri de caractere
..1 +olosirea #irurilor
Cea mai comun utilizare a tabloului unidimensional n limba&ul C este irul -de caractere..
Spre deosebire de multe alte limba&e de programare, C nu conine tipul de dat string. n sc3imb, C
permite utilizarea irurilor folosind tablouri unidimensionale de tip c,ar. Wirul este definit ca fiind un
tablou de caractere terminat prin caracterul null $%&'(" codul )*+,, '). Faptul c irul trebuie terminat prin
caracterul null nseamn c tabloul trebuie astfel definit nc%t s poat conine un ir cu un octet mai
lung dec%t cel mai lung ir ce $a fi reprezentat $reodat n acest tablou, pentru a face loc caracterului
null. Kn #ir constant este automat terminat prin caracterul null de c$tre compilator.
"entru a citi un ir de la tastatur, trebuie apelat funcia gets34, care reclam includerea
3eader)ului stdio.,. Funcia gets34 trebuie apelat folosind numele tabloului de caractere fr nici un
inde!. Funcia gets34 citete caractere p%n c%nd este apsat tasta BTJ. #asta BTJ este
nlocuit de compilator cu caracterul null care termin irul. 0e e!emplu, programul urmtor citete i
afieaz un ir introdus de la tastatur :
#include<stdio.h>
void main($
{ char strK45L%
int O%
printf(0ntroduceti un sir(<de 45 de caractere$HFn#$%
gets(str$%
for(O35%strKOL%OBB$
printf(Mc#=strKOL$%
&
S remarcm c programul, pentru a controla ciclul care afieaz irul, utilizeaz faptul c null este
false-;.. Funcia gets34 nu efectueaz $erificri asupra limitelor n care $ariaz inde!ul tabloului, aa c
este posibil ca utilizatorul s introduc mai multe caractere dec%t poate conine irul. 0eci trebuie s fii
siguri c ai apelat funcia gets34 cu un tablou suficient de mare, care s poat conine i caracterele
neateptate. !ist un mod mult mai simplu de a afia irurile, folosind funcia print(34 sau puts34 .
"rogramul anterior, rescris cu a&utorul acestei funcii este :
#include<stdio.h>
void main($
{ char strK45L%
int O%
printf(0ntroduceti un sir (< de 45 de caractere$HFn#$%
gets(str$%
printf(Ms#=str$% '( puts-sir.P ('
&
0ac dup afiarea irului se dorete trecerea la o linie nou, se poate afia str dup cum urmeaz :
printf(MsFn#=str$%
Cceast metod folosete specificatorul de format Ps urmat de caracterul linie nou i utilizeaz
tabloul de caractere ca al doilea argument al funciei print(34.
..2 Tablouri de #iruri
#ablourile de iruri, numite deseori i tabele de iruri, sunt foarte des folosite n C. O tabel
bidimensional de iruri se poate crea ca oricare alt tablou bidimensional. #otui modul n care trebuie
g%ndit un tablou de iruri este puin diferit. Fie urmtoarea declaraie : char namesK15LK:5L%
Cceast declaraie specific o tabel care conine 2; iruri, fiecare a$%nd lungimea de p%n la 9; de
caractere. "entru a accesa un ir din tabel, trebuie specificat numai primul inde!. 0e e!emplu, pentru
a citi de la tastatur al treilea ir al tabelei, trebuie folosit instruciunea : gets3namesY2Z4U. "entru a
afia primul ir al tabelei trebuie folosit instruciunea : print(3nameY2Z4U .
..3 +unc"ii standard pentru prelucrarea #irurilor de caractere
n legtur cu irurile de caractere se au n $edere operaii de felul urmtor:
calculul lungimii irurilor de caractere
copierea irurilor de caractere
concatenarea irurilor de caractere
compararea irurilor de caractere
cutarea n iruri de caractere
Funciile standard prin care se realizeaz aceste operaii au fiecare un nume care ncepe cu
prefi!ul str i au prototipul n fiierul 3eader string.,.
..3.1 @ungimea unui #ir de caractere
5ungimea unui ir de caractere se definete prin numrul de caractere proprii care intr n
compunerea irului respecti$. Caracterul BK@ este un caracter impropriu i el nu este considerat la
determinarea lungimii unui ir de caractere. "rezena lui este ns necesar, deoarece la determinarea
lungimii unui ir se numr caracterele acestuia p%n la nt%lnirea caracterului BK@. Funcia pentru
determinarea lungimii unui ir de caractere are prototipul : unsigned strlen3const c,ar Ds4U
!emplul 2:
char Nconst p3#,cesta este un sir#%
unsigned n%
..
n3strlen(p$%
5ui n i se atribuie $aloarea 2:, numrul caracterelor proprii ale irului spre care pointeaz p.
!emplul 4:
char tabKL3#,cesta este un sir#%
int n%
n3strlen(tab$%
/ariabila n primeste aceeai $aloare ca n e!emplul precedent.
!emplul 7:
int n%
n3strlen(,cesta este un sir#$%
Obser$aie : "arametrul funciei strlen este un pointer spre un ir constant deoarece funcia strlen nu
are $oie s modifice caracterele irului pentru care determin lungimea.
..3.2 Copierea unui #ir de caractere
Cdesea este ne$oie s se copie un ir de caractere din zona de memorie n care se afl, n alt
zon. n acest scop se poate folosi funcia : c,ar Dstrcp:3c,ar DdestG const c,ar Dsursa4U
Funcia copiaz irul de caractere spre care pointeaz sursa n zona de memorie a crei
adres de nceput este $aloarea lui dest. Funcia copiaz at%t caracterele proprii irului, c%t i
caracterul BK@ de la sf%ritul irului respecti$. Se presupune c zona de memorie n care se face
copierea este destul de mare pentru a putea pstra caracterele copiate. n caz contrar se altereaz
datele pstrate imediat dup zona rezer$at la adresa definit de parametrul dest. 5a re$enire, funcia
returneaz adresa de nceput a zonei n care s)a transferat irul, adic c3iar $aloarea lui dest. Cceast
$aloare este pointer spre caractere, deci tipul returnat de funcie este : c,arD. Se obser$ c
parametrul sursa, care definete zona n care se afl irul ce se copiaz, este declarat prin
modificatorul const. Cceasta deoarece funcia strcp: nu are $oie s modifice irul care se copiaz. n
sc3imb, parametrul dest nu este declarat cu parametrul const deoarece funcia strcp: modific zona
spre care pointeaz dest -n ea se copiaz caracterele irului..
!emplul 2:
char tabKL3#,cest sir se copiaQa#%
char tKsiQeof(tab$L% '( are acelai numr de elemente ca i tab ('
E..
strcpX(t=tab$% '( irul din tab se copiaz n zona alocat lui t ('
!emplul 4:
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.
..3.3 Concatenarea #irurilor de caractere
Dibliotecile limba&elor C i CLL conin mai multe funcii care permit concatenarea unui ir de
caractere la sf%ritul unui alt ir de caractere. Ina dintre ele are prototipul :
c,ar Dstrcat3c,ar DdestG const c,ar Dsursa4U
Cceast funcie copiaz irul de caractere din zona spre care pointeaz sursa, n zona de memorie
spre care pointeaz dest, imediat dup ultimul caracter propriu al acestui ir. Se presupune c zona
spre care pointeaz dest este suficient pentru a pstra caracterele proprii celor dou iruri care se
concateneaz, plus caracterul BK@ care termin irul rezultat n urma concatenrii. Funcia returneaz
$aloarea lui dest.
!emplu:
char tab1K155L3#SimbaOul !BB#%
char tab2KL3#este ! incrementat#%
strcat(tab1=# $% '( se adaug spaiu dup ultimul caracter L ('
strcat(tab1=tab2$%
Obser$a ie : Funcia strcat, la fel ca funcia strcp:, nu trebuie s modifice irul de caractere spre care
pointeaz sursa.
O alt funcie de bibliotec utilizat la concatenarea de iruri este funcia strncat care are
prototipul : c,ar Dstrncat3c,ar DdestG const c,ar DsursaG unsigned n4U
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 .
..3.4 Compararea #irurilor de caractere
Wirurile de caractere se pot compara folosind codurile CSC?? ale caracterelor din compunerea
lor. Fie s1 i s2 dou tablouri unidimensionale de tip caracter folosite pentru a pstra, fiecare, c%te un
ir de caractere.
Wirurile pstrate n aceste tablouri sunt egale dac au lungimi egale i s1YjZ<s2YjZ pentru toate
$alorile lui j.
Wirul s1 este mai mic dec%t s2, dac e!ist un indice j astfel nc%t s1YjZ;s2YjZ i s1Y8Z<s2Y8Z
pentru 8<2G1GEGj'1.
Wirul s1 este mai mare dec%t s2, dac e!ist un indice j astfel nc%t s1YjZVs2YjZ i s1Y8Z<s2Y8Z
pentru 8<2G1GEGj'1.
Compararea irurilor de caractere se poate realiza folosind funcii standard de felul celor de
mai &os. O funcie utilizat frec$ent n compararea irurilor este cea de prototip :
int strcmp3const c,ar Ds1G const c,ar Ds24U
Notm cu sir1 irul de caractere spre care pointeaz s1 i cu #ir2 irul de caractere spre care
pointeaz s2. Funcia strcmp returneaz :
$aloare negati$ dac sir1;sir2
zero dac sir1<sir2
$aloare poziti$ dac sir1Vsir2
O alt funcie pentru compararea irurilor este funcia de prototip :
int strncmp3const c,ar Ds1G const c,ar Ds2G unsigned n4U
Cceast funcie compar cele dou iruri spre care pointeaz s1 i s2 utiliz%nd cel mult primele n
caractere din fiecare ir. n cazul n care minimul dintre lungimile celor dou iruri este mai mic dec%t n,
funcia strncmp realizeaz aceeai comparaie ca i strcmp.
Cdesea, la compararea irurilor de caractere dorim s nu se fac distincie ntre literele mici i
mari. Ccest lucru este posibil dac folosim funcia de prototip :
int stricmp3const c,ar Ds1G const c,ar Ds24U
Cceast funcie returneaz aceleai $alori ca i funcia strcmp, cu deosebirea c la compararea
literelor nu se face disticie ntre literele mari i mici.
!emple:
char Nsir13#,-!#%
char Nsir23#abc#%
int O%
Cpelul : j<strcmp3sir1G sir24U returneaz o $aloare negati$, deoarece literele mari au codurile CSC??
mai mici dec%t literele mici.
Cplelul : j<stricmp3sir1G sir24U returneaz $aloarea ;, deoarece ignor%ndu)se diferena dintre literele
mari i mici, cele dou iruri de$in egale.
"entru a limita compararea a dou iruri de caractere la primele cel mult n caractere ale lor, la
comparare ignor%ndu)se diferena dintre literele mici i mari, se $a folosi funcia de prototip :
int strincmp3const c,ar Ds1G const c,ar Ds2G unsigned n4U
..3.5 C$utarea =n #iruri de caractere
"entru cutarea unui caracter !ntr-un ir de caractere sunt folosite funciile de prototip :
c,ar Dstrc,r3const c,ar DsG int c4U
c,ar Dstrrc,r3const c,ar DsG int c4U
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
..4 !emple de utili5are a (unc"iilor standard
2. Fiind dat un cu$%nt s se afieze toate sufi!ele acestuia. 5iterele fiecrui sufi! $or fi separate prin
dou spaii.
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main($
{ int n=i=O%
char siK155L%
clrscr($%
printf(R0ntroduceti cuvantul H R$% gets(si$%
n3strlen(si$%
for(i35%i<n%iBB$
{ for(O3i%O<n%OBB$
printf(RMc R=N(siBO$$%
puts(RFnR$%
&
getch($%
&
4. S se determine prima i ultima apariie a unui caracter ntr)un ir de caractere.
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main($
{ char sK155L=Nptr=c3UeU%
clrscr($%
strcpX(s=Rest sir de caractere.R$%
ptr3strchr(s=c$%
if(ptr$
{ printf(R<rima aparitie a car. Mc este in poQitia
MdFnR=c= ptrDs$%
printf(R7ltima aparitie a car.Mc este pe poQitia
MdFnR=c= strrchr(s=c$Ds$%
&
else printf(R!aracterul Mc nu se afla in sirFnR=c$%
getch($%
&
7. "rogramul urmtor ilustreaz modul de folosire a funciei strstr :
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main($
{ char Nstr13RcHFFtcFFinclude R=Nstr23RFFincludeR%
char Nptr%
clrscr($%
ptr3strstr(str1=str2$%
Nptr3UF5U%
printf(RVirectorul de baQa este H MsFnR=str1$%
getch($%
&
9. !emplu de folosire a funciei strpbr8 .
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main($
{ char Nstring13RabcdefghiO(lmnop[rstuv;GXQR%
char Nstring23R12fmcdR%
char Nptr%
clrscr($%
ptr3strpbr((string1=string2$%
if(ptr$
printf(Rstrpbr( a gasit primul caracter H McFnR=
Nptr$%
else
printf(Rstrpbr( nu a gasit nici un caracter in
sirFnR$%
getch($%
&
<. "rogramul urmtor citete o sec$en de caractere i determin prima fraz prin cutarea n irul
te!t a caracterelor din irul eop .
#include<stdio.h>
#include<string.h>
#include<conio.h>
void main($
{ char teGtK124L%
char Neop3R."\R%
int length%
clrscr($%
printf(R0ntroduceti un teGt H R$% gets(teGt$%
length3strcspn(teGt=eop$%
teGtKlengthL3UF5U%
printf(R<rima fraQa este H MsFnR=teGt$%
getch($%
&
=. "rogramul urmtor gsete toate cu$intele dintr)o linie. "resupunem c un cu$%nt este delimitat de
unul din caracterele : @\G.%U_'\ @ .
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main($
{ char inK155L = Np%
clrscr($%
puts(R0ntroduceti linia H R$% gets(in$%
'( 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($%
&
..5 +unc"ii pentru conversii de date
"entru con$ersia datelor din format numeric n format ir de caractere i in$ers se folosesc
dou seturi de funcii i macrouri. "rimul set pentru con$ersii conine funcii i macrouri care con$ertesc
din format ir de caractere n format numeric -atoi, ato(, atol. i funciile in$erse acestora de con$ersie
i macrouri din format numeric n ir de caractere -itoa, ltoa, ultoa.."rimele trei macrouri au sinta!a:
int atoi3const c,ar Ds4U
long atol3const c,ar Ds4U
double ato(3const c,ar Ds4U
"rimul macrou con$ertete un ir ntr)un numr ntreg. l ntoarce $aloarea obinut n urma
con$ersiei sau $aloarea ; dac irul nu poate fi con$ertit.Cnalog, macroul atol con$ertete un ir ntr)un
numr ntreg de tip long, iar ato( ntr)un numr real de tip (loat. n cazul apariiei caracterelor
nepermise, con$ersia se $a opri la primul caracter incorect i se $a returna $aloarea citit p%n atunci.
!emplu: Ca e!emplu de utilizare a funciei atoi, se consider un ir care conine caractere neadmise
i $alori depind dimensiunea tipului ntreg.
#include<stdlib.h>
#include<stdio.h>
void main($
{
int O=n%
char NsKL3{12+:9#=12+:9.>?#=12+:9>.?4#=
12+a:9.>?#=a12+:9.>?#= 12+:9.a>?#&%
for(O35% O<>% OBB$
{ n3atoi(sKOL$%
printf(sir3MsFn val3Md#=sKOL=n$%
&
&
/alorile numerice tiprite sunt, n ordine:
2479< ) a fost transformat ntregul ir
2479< ) partea zecimal nu a fost luat n consideraie
)>=2= ) numrul obinut a fost ntreg, dar nu s)a ncadrat n limitele impuse de tipul int
247 ) s)a citit p%n la primul caracter care nu era semn sau cifr
; ) primul caracter nu a fost cifr i con$ersia s)a oprit aici
2479< ) caracterul @aA nu a a$ut nici o influen fiind dup punctul zecimal
Funciile de con$ersie in$ers, din numr n ir de caractere , au sinta!ele:
c,ar Ditoa3int valoareG c,ar DsirG int ba5a4U
c,ar Dltoa4long valoareG c,ar DsirG int ba5a4U
c,ar Dultoa3unsigned long valoareG c,ar DsirG int ba5a4U
Funciile ntorc $aloarea obinut ntr)un ir terminat cu *N;, i stoc3eaz rezultatul n ir.
"arametrul valoare reprezint numrul ntreg care urmeaz a fi con$ertit. l poate a$ea at%t $alori
poziti$e c%t i negati$e n cazul funciilor itoa sau ltoa i numai $alori poziti$e pentru funcia ultoa.
"arametrul sir reprezint adresa irului de caractere n care se $a obine rezultatul con$ersiei.
"arametrul ba5a reprezint baza aleas pentru con$ersie. Funcia itoa poate ntoarce un ir de p%n la
2> caractere, iar ltoa un ir de p%n la 77 de caractere -dac baza are $aloarea 4.. n caz de succes,
funciile ntorc un pointer la irul obinut, n caz de eroare, este ntors irul $id.
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.
..& !erci"ii #i teste gril$
2. n programul urmtor, care dintre sec$enele
de instruciuni -?., -??. realizeaz corect citirea
unui ir de caractere de la tastatur i afiarea
acestuia 8
#include<stdio.h>
void main($
{
char s1K15L=s2K15L%
scanf(Ms#=s1$%
printf(s13Ms#=s1$% WW(0$
scanf(Ms#=Ps2$%
printf(Ms#=s2K15L$% WW(00$
&
a) numai (B) b) numai (BB)
c) (B) i (BB) d) nici una
4. Cnalizai programul urmtor i alegei
rspunsul corect:
#include<stdio.h>
void main($
{
char bK11L=
aK11L3#abcdefghiO#%
int i35%
;hile(aKiLM2$ bKiBBL3aKiL%
bKiL35%
&
a) programul are erori
b) irul b conine numai caracterul
*a*
c) n urma execuiei irurile a i
b concid
d) irul b conine numai
caracterele din irul a ale cror
coduri A:CBB sunt numere pare
e) irul b conine numai
caracterele de rang par din a (al
doilea, al patrulea etc!)
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$ char aK2LK2L3{ab#=cd#&%
c$ char aK+LK2L3{ab#=cd#&%
d$ char aK+LK+L3{ab#=cd#&%
e$ char aKLK+L3{ab#=cd#&%
=. 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.,.....-<. de mai
&os sunt eronate8
#include<stdio.h>
#include<string.h>
void main($
{
char Ns1=Ns2=Ns+%
int G%
s13#test#% WW(1$
scanf(Ms#=s2$% WW(2$
s+3Ps1% WW(+$
printf(Ms#=s1Bs2$% WW(:$
G3strlen(Ns2$% WW(9$
&
a) $,% ,) b) $,%,), c) ),
d) %, e) %,),
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%
&%
/.2 6ni"iali5area structurilor
0atele componente ale unei structuri se pot iniializa. n acest scop, la sf%ritul declaraiei sau
definiiei structurii se pune caracterul egal i se scriu ntre acolade, n ordine, $alorile componentelor,
delimitate prin $irgul. ?niializarea unei structuri se face enumer%nd $alorile, pentru fiecare din membrii
si.
!emplul 2: O iniializare corect este urmtoarea :
struct pers{ char numeK+L%int varsta%&s3{.arcel Vima#= +9&%
Se obser$ c $alorile c%mpurilor trebuie date n ordinea de definiie a acestora n cadrul structurii.
!emplul 4:
struct pers s3{+5=,ndronic `irgil#&%
Structura este incorect iniializat deoarece $alorile nu sunt date n ordinea declarrii c%mpurilor din
structur.
!emplul 7: Iltimile $alori ale componentelor pot lipsi. 0e e!emplu, este corect urmtoarea
iniializare, c3iar dac nu au fost iniializate toate componentele :
struct s
{ int inf%
char nK25L%
float G%
&%
struct s s13{1&%
"entru $ariabila structurat s1 de tip s, se $a iniializa doar primul c%mp in( cu $aloarea 2. Celelalte
dou c%mpuri $or fi iniializate automat astfel :
! c%mpul n cu $aloarea irului $id @A
! c%mpul numeric ! cu $aloarea ;
!emplul 9: n e!emplul urmtor se iniializeaz o $ariabil de tipul struct persoana, precum i a unui
tablou cu elemente de acest tip.
struct persoana
{ char numeK+2L%
int varsta%
float salariu%
&%
struct persoana pers3{,leG#=24=1255555.5&%
struct persoana grupKL3
{ {8igi# = +2= +555555.5& =
{.imi# = 1A = 1955555.5& =
{]red#= ++ = 2A95555.5&
&%
/.3 1pera"ii permise asupra structurilor
Operaia principal care poate fi efectuat asupra unei $ariabile de tip structur este selectarea
unui c%mp, utiliz%nd operatorul de selecie @.R conform sinta!ei :
variabila_structura.camp_selectat
C%mpul selectat se comport ca o $ariabil i i se pot aplica toate operaiile care se pot aplica
$ariabilelor de acel tip. 0eoarece structurile se prelucreaz frec$ent prin intermediul pointerilor, a fost
introdus un operator special, care combin operaiile de indirectare i selectare a unui c%mp, anume
SR. !presia pcamp_selectat este interpretat de compilator la fel ca e!presia
3Dp4.camp_selectat. ntotdeauna, unei $ariabile de tip structur i se pot aplica operatorii [ -calculul
adresei. i si5eo( -calculul mrimii zonei de memorie ocupate de $ariabil..
n plus sunt permise urmtoarele operaii :
a. unei $ariabile de tip structur i se poate atribui $aloarea altei $ariabile de tip structur
b. $ariabilele de tip structur pot fi transmise ca parametri funciilor
c. o funcie poate a$ea ca rezultat o $aloare de tip structur
!emplul 2: Fie structura :
struct pers
{ int ani%
char numeK+5L%
& G=X=Nps%
#iprirea $alorilor elementelor componente se face astfel :
a. n cazul accesrii c%mpurilor pentru structura x care este de tip pers, se $a folosi selec"ia
direct$. O tiprire corect se poate face astfel :
printf(FnJumeleHMsFn`arstaHMdFn#=G.nume=G.ani$%
b. n cazul accesrii c%mpurilor structurii indicate de pointerul la pers numit ps, se $a folosi
selec"ia indirect$. O sec$en corect de tiprire este :
printf(FnJumeleHMsFn`arstaHMdFn#=psD>nume=psD>ani$%
"entru atribuirea coninutului structurii x la structura se poate folosi una din sec$enele :
a. atribuirea c%mp cu c%mp : X.ani3G.ani % strcpX(X=nume=G.nume$%
b. atribuirea direct ntre dou structuri de acelai tip : X3G%
!emplul 4: "entru structura de tip pers i $ariabilele definite anterior sunt corecte atribuirile :
a. se atribuie unui pointer adresa structurii
b. se atribuie unei structuri coninutul indicat de un pointer la o structur de acelai tip
ps3PG% '( adresa indicat de ps este egal cu adresa lui ! ('
X3Nps% '( coninutul lui V de$ine egal cu coninutul structurii de la adresa pointat de ps ('
Ctribuirea coninutului unui pointer la o structur cu o structur de acelai tip se poate face astfel :
Nps3X%
Cceast atribuire este ec3i$alent cu sec$ena :
(Nps$.inf3X.inf %
strcpX((Nps$.nume=X.nume$%
Irmtoarele dou atribuiri sunt ec3i$alente cu cele dou de dinainte :
psD>inf3X.inf%
strcpX(psD>nume=X.nume$%
Folosirea e!presiei de tipul 3Dps4.in( este corect dar greoaie i neuzual. n locul ei este recomandat
forma ps'Vin( .
!emplul 7: #ablourile nu pot fi atribuite direct. #otui, dac tabloul este membru al unei structuri,
atunci atribuirea poate a$ea loc .
#include<stdio.h>
#include<stdlib.h>
struct tablou {int GK15L&%
void main($
{ struct tablou a3{{1=1=1=1=1=1=1=1=1=1&& =
b3{{2=2=2=2=2=2=2=2=2=2&&%
struct tablou Na1 = Nb1%
'( copierea direct a structurilorP are loc copierea direct a tabloului folosindu)l drept
c%mp al unei structuri ('
b3a%
'( 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 !erci"ii #i teste gril$
2. Fie structura :
struct data {
int Qi= luna = an%
& d= Ndl%
Cum se acceseaz membrul @5iA 8
a$ d.Qi respectiv dl.Qi
b$ dD>Qi respectiv dlD>Qi
c$ dD>Qi respectiv dl.Qi
d$ d.Qi respectiv dlD>Qi
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 cpuXpeK15L%
&%
struct computer mX!omputer%
1eferindu)ne la codul de mai sus, cum accesai
primul caracter din cpuT:pe 8
a$ char c3mX!omputer.cpuXpe(5$%
b$ char c3mX!omputer.cpuXpe%
c$ char c3mX!omputerK5L.cpuXpe%
d$ char c3mX!omputer.cpuXpeK5L%
>. 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 cpuXpeK15L%
& 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
12.1 Bo"iunea de (i#ier
"rin (i#ier se nelege o structur de date, cu componente numite =nregistr$ri, ce pot a$ea o
dimensiune fi! sau $ariabil, cel de)al doilea caz impun%nd e!istena unor marca&e speciale numite
separatori de !nregistrri. Fiierele pot fi clasificate dup mai multe criterii. 0in punct de $edere al
accesului la componente se mpart n:
! (i#ere cu acces secven"ial ale cror nregistrri pot fi prelucrate numai n ordinea n care sunt
stocate n fiier
! (i#iere cu acces direct ale cror componente pot fi prelucrate n orice ordine. n cazul n care
prelucrarea nu se face sec$enial, nainte de fiecare operaie de citire'scriere trebuie furnizat
informaia necesar selectrii componentei ce urmeaz a fi prelucrat
0in punct de $edere al coninutului, fiierele se mpart n dou categorii:
! (i#iere te!t care conin numai caractere structurate pe linii
! (i#iere binare n care informaia este $zut ca o colecie de octei
Diblioteca de funcii stdio., ofer posibilitatea operrii cu fiiere printr)o structur numit +6@.
Orice operaie cu fiiere necesit o asemenea structur, care se iniializeaz la desc3iderea unui fiier
i al crei coninut de$ine nefolositor dup nc3iderea sa.\estionarea fiierelor se face printr)un pointer
la structura predefinit +6@. 0eclararea unui astfel de pointer se face conform sinta!ei:
+6@ Didenti(icator_(isierU
12.2 Desc,iderea unui (i#ier
Se realizeaz cu a&utorul funciei (open care are sinta!a de mai &os:
+6@ D(open3Rnume_(isierRG Rmod_desc,idereR4U
n care : nume1fier este numele complet -calea pe disc. a fiierului care se desc3ide, iar
mod1deschidere precizeaz modul n care se desc3ide fiierul i poate a$ea urmtoarele $alori:
! ArA pentru citirea unui fiier e!istentP se produce o eroare dac fiierul nu e!ist
! A7A desc3ide un fiier pentru scriereP dac fiierul e!ist, i distruge coninutul
! AaA se adaug informaie n fiier, la sf%ritul acestuia
! ArWA n acelai timp citeste, respecti$ scrie n fiierP acesta trebuie s e!iste
! A7WA desc3ide un fiier pentru citire i scriereP dac acesta e!ist, coninutul este distrus
! AaWA adugareP dac fiierul e!ist, coninutul este distrus
! AtA fiierul este de tip te!t
! AbA fiierul este binar
Se pot face combinaii cu opiunile de mai sus. 0e e!emplu, desc3iderea unui fiier te!t pentru
citire se face cu opiunea ArtA. Crearea unui fiier binar pentru scriere este posibil prin A7bA. Nu
conteaz ordinea n care sunt date literele n irul mod1deschidere.
n caz de succes, funcia (open returneaz un pointer la noul flu! de comunicare desc3isP altfel
ntoarce pointerul BK@@. Operaia de desc3idere a unui fiier trebuie nsoit de $erificarea reuitei
respecti$ei operaii conform modelului de mai &os:
i(3identi(icator_(isier4
instructiuni_operatie_reusita
else
instructiune_eroare_la_desc,idereU
!emple: Fie declaraia ]0S2 Nf 2 $om ncerca urmtoarele desc3ideri de fiiere:
2. f3fopen(#test1.in#=#rt#$% Cm desc3is fiierul Atest1.inA din directorul curent
pentru citire n mod te!t. 5itera AtA nu era necesar, modul te!t fiind modul de desc3idere
implicit al fiierelor n C. 0ac fiierul nu e!ist, atunci funcia ntoarce BK@@. O desc3idere
mai riguroas ar fi:
if((f3fopen (#test1.in#=#rt#$$33J7SS$
{ printf(2roare la deschiderea fisierului "#$% eGit(1$% &
4. f3fopen(test2.out#=#;b#$% ste desc3is'creat fiierul Atest2.outA din directorul
curent n mod binar pentru scriere.
7. 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.
12.3 Cnc,iderea unui (i#ier
Se poate face cu a&utorul funciilor:
! int (close3+6@ D(4U care nc3ide fiierul specificat i returneaz ; n caz de succes sau 1+ n
cazul apariiei unei erori
! int (closeall3void4U care nc3ide toate fiierele desc3ise i returneaz numrul total de fiiere pe
care le)a nc3is sau 1+ la apariia unei erori
12.4 +unc"ia de veri(icare a s(>r#itului unui (i#ier
"entru a $erifica dac poziia curent de citire'scriere a a&uns la sf%ritul unui fiier se folosete
funcia int (eo(3+6@ D(4U care ntoarce $aloarea ; dac poziia curent nu este la sf%ritul fiierului i o
$aloarea diferit de ; dac poziia actual indic sf%ritul de fiier.
12.5 +unc"ii de citire)scriere caractere
"entru citirea unui caracter dintr)un fiier te!t se folosete funcia
int (getc3+6@ D(4U
0ac citirea a a$ut loc cu succes, se ntoarce $aloarea caracterului citit, iar n caz de eroare este
ntoars $aloarea 1+.
"entru scrierea unui caracter ntr)un fiier te!t se folosete funcia
int (putc3int cG+6@ D(4U
Funcia ntoarce caracterul care s)a scris n caz de succes, respecti$ 1+ n caz de eroare.
!emplul 2: Copierea unui fiier caracter cu caracter.
#include<stdio.h>
#include<stdlib.h>
void main($
{
]0S2 Nin=Nout%
// se incearca desc(iderea fisierului sursa
if((in3fopen(test.c#=#r#$$33J7SS$
{ printf(fisierul nu poate fi deschis pentru citire#$%
eGit(1$%
&
// se incearca desc(iderea fisierului destinatie
if((out3fopen(test2.ba(#=#;#$$33J7SS$
{ printf(fisierul nu poate fi deschis pentru scriere#$%
eGit(1$%
&
// se copie un caracter din sursa si se scrie in destinatie
;hile("feof(in$$ fputc(fgetc(in$=out$%
fclose(in$% fclose(out$%
&
!emplul 4: Se numr c%te caractere de fiecare tip -litere, cifre i neafiabile. sunt ntr)un fiier te!t.
#include<stdio.h>
#include<ctXpe.h>
#include<stdlib.h>
void main($
{
]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$%
&
12.& +unc"ii de citire)scriere pe #iruri de caractere
Funcia c,ar D(gets3c,ar DsG int nG +6@ D(4U citete un ir de caractere dintr)un fiier oarecare.
"rimul parametru, s, reprezint zona de memorie n care se stoc3eaz irul citit. "arametrul n indic
numrul ma!im de caractere care se $or citi din fiier. 0ac se detecteaz mai puine caractere rmase
pe linia curent din fiier, citirea se oprete la nt%lnirea caracterului sf%rit de linie MOnN. n cazul unei
citiri reuite, funcia ntoarce un pointer la irul citit, n caz de sf%rit de fiier sau de eroare se ntoarce
pointerul BK@@.
1bserva"ie: Funcia (gets insereaz n linia citit i caracterul MOnN generat la apsarea tastei nter.
"entru o prelucrare corect a irului de caractere citit din fiier, acest caracter trebuie eliminat utiliz%nd
spre e!emplu instruciunea linieYstrlen3linie4'1Z<2 care scrie terminatorul de ir MO2N peste caracterul
MOnN -am considerat c irul citit din fiier s)a depus n $ariabila linie..
Funcia int (puts3const c,ar DsG +6@ D(4U scrie irul de caractere s -care nu se modific. n
fiierul (. n caz de eroare, funcia ntoarce $aloarea 1+.
!emplul 2: Copierea a dou fiiere te!t, linie cu linie.
#include<stdio.h>
void main($
{
]0S2 Nf1=Nf2% char linieK45L%
f13fopen(in.tGt#=#r#$%
f23fopen(out.tGt#=#;#$%
do{
if(feof(f1$$ brea(%
fgets(linie=45=f1$% fputs(linie=f2$%
&;hile(1$%
fcloseall($%
&
!emplul 4: Cfiarea unui fiier te!t pe ecran. 5a fiecare afiare a 44 de linii se $a face o pauz,
afiarea continu%nd la apsarea unei taste.
#include<stdio.h>
void main($
{
]0S2 Nf% char linieK45L%
long n35% // numara cate linii au fost citite
f3fopen(in.tGt#=#r#$%
;hile("feof(f$$
{ fgets(linie=45=f$% printf(Ms#=linie$%
if(BBnM22335$ getch($%
&
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$%
&
2;.> Funcii de citire'scriere cu format
"entru citirea $alorilor unor $ariabile dintr)un fiier te!t se folosete funcia
int (scan(3+6@ D(G Rspeci(icatori_de_(ormatRG adrese_variabile4U
Funcia (scan( realizeaz urmtoarele:
! 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(.
12.. +unc"ii de citire)scriere a (i#ierelor pe blocuri de octe"i
Cceste funcii realizeaz citirea i scrierea datelor fr a face o interpretare sau con$ersie a
acestora. Se folosesc doar n modul de acces binar i sunt orientate pe zone compacte de octei.
Funciile pot fi folosite i pentru citirea'scrierea nregistrrilor.
Funcia (read citete n nregistrri dintr)un fiier, fiecare nregistrare a$%nd dim octei. Funcia
ntoarce numrul nregistrrilor citite i are sinta!a:
int (read3void DpointerG int dimG int nG +6@ D(4U
Funcia (7rite scrie ntr)un fiier n nregistrri a c%te dim octei fiecare i ntoarce numrul total
de nregistrri scrise. Funcia are sinta!a:
int (7rite3void DpointerG int dimG int nG +6@ D(4U
!emplul : Se arat modul n care trebuie scris o nregistrare ntr)un fiier binar.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct pers
{ int ani%
char numeK25L%
&%
void main($
{
]0S2 Nf% struct pers s%
f3fopen(test.bin#=#;b#$%
if("f$
{ printf(fisierul nu se poate deschide#$% eGit(1$% &
s.ani3:5%
strcpX(s.nume=#.ihai <opescu#$%
f;rite(Ps=siQeof(s$=1=f$% // scrie structura s in fisier
fclose(f$%
&
2;.E Funcii pentru aflarea poziiei curente i sc3imbarea ei
Funcia cea mai folosit pentru determinarea poziiei curente de citire'scriere este
long (tell3+6@ D(4U
"entru poziionarea n fiier se utilizeaz funciile :
! int (see83+6@ D(G long nrG int origine4U care mut indicatorul de fiier cu un numr de nr octei
fa de punctul origine. Originea arat punctul fa de care este msurat deplasarea : ; -sau
S]+S#. fa de nceputul fiierului, 2 -sau S]+CI1. fa de poziia curent, 4 -sau
S]+N0. fa de sf%ritul fiierului.
! void re7ind3+6@ D(4U mut poziia curent a fiierului la nceputul su
!emplu: 0eterminarea lungimii unui fiier.
#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$%
&
12.12 !erci"ii #i te!te gril$
2. Care dintre afirmaiile de mai &os sunt
ade$rate 8
a) instruciunea care desc(ide
fiierul *nr!txt* pentru citire i
returneaz un pointer ctre
fiierul desc(is este f3fopen(#r#=
#nr.tGt#$%
b) pentru a putea citi din fiier
folosim atribut *r* la desc(idere,
iar pentru a scrie n fiier l
desc(idem cu atributul *;*
c) pentru a testa dac nu s-a ajuns
la sf4ritul fiierului referit de
pointerul f, vom scrie "feof(f$
d) pentru a nc(ide fiierul
referit de pointerul f vom scrie
close(f$
e) nici una dintre afirmaiile de
mai sus nu este adevrat
4. Se consider un fiier definit prin pointerul (,
i care conine urmtoarele $alori pe primele
dou r%nduri :
: ? 2.9 D>.2+
# 4
Fie urmtoarele declaraii de $ariabile:
]0S2 Nf%
int G=X% float a=b=d% char c%
Care dintre sec$enele de instruciuni de mai
&os trebuie e!ecutate astfel nc%t toate
$ariabilele declarate s primeasc $alori citite
din fiierul ( 8
a$ fscanf(f=Md Mf Md MfFn#=PG=
Pa=PX=Pb$%
fscanf(f=Mc Mf#=Pc=Pd$%
b$ fscanf(f=Md Md Mf MfFn#=PG=
PX=Pa=Pb$%
fscanf(f=Mc Mf#=Pc=Pd$%
c$ fscanf(f=Md Md Mf MfFn#=PG=
PX=Pb=Pa$%
fscanf(f=Mf Mc#=Pd=Pc$%
d$ fscanf(Mf Mf Md MdFn#=Pb=Pa=
PX=PG=f$%
fsacnf(Mc Mf#=Pc=Pd=f$%
e$ fscanf(Md Mf Md MfFn#=PG=Pa=
PX=Pd=f$%
fscanf(Mf Mc#=Pd=Pc=f$%
7. n timpul e!ecuiei programului urmtor sunt
posibile urmtoarele situaii :
#include<stdio.h>
void main($
{
]0S2 Nf% int G31=s35%
f3fopen(suma.tGt#=r#$%
;hile("feof(f$ PP G$
{ fscanf(f=Md#=PG$%
if(GM2$ sB3G%
&
fclose(f$%
printf(Fns3Md#=s$%
&
a) programul este corect sintactic
b) pentru a funciona citirea din
fiier, acesta trebuie desc(is n
alt mod
c) programul va intra ntr-un ciclu
infinit
d) dac n fiier se gsesc, pe
acelai r4nd separate prin c4te
un spaiu, numerele $ ) %
+ 1 " -, atunci programul va
afia s01+
e) modul n care este nc(is
fiierul nu corespunde cu modul
n care a fost desc(is
9. Fie fiierul identificat prin descriptorul (,
a$%nd urmtorul coninut:
9
2 + : > ? 4
Care dintre sec$enele urmtoare de program
S2, S4, S7 poate fi e!ecutat, astfel nc%t, n
$ectorul v s se citesc corect toate numerele
din fiier 8
//secventa :1
fscanf(f=Md#=Pn$%
for(i35%i<n%iBB$
fscanf(f=Md#=PvKiL$%
//secventa :$
O35%
;hile("feof(f$$
{ fscanf(f=Md#=PvKOL$% OBB% &
n3O%
//secventa :%
O35%
do{
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%
&
fclose(f$%
c
a) ) b) c) .
d) ; e) 1"
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:
3 3
1 2 3
4 5 &
* . /
#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 b) Claudiu c) Aan
d) Aaniel e) @arius

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
J$spunsuri la testele gril$
1.5 lemente de ba5$ ale limbajului C
14a 24c 34c 44b 54d &4a *4c .4d
2.3 Tipuri (undamentale de date
14b 24a 34d 44b 54b &4c *4c .4c /4aGbGcGd 124e 114aGb
124c 134bGcGdGe 144aGcGd 154d 1&4c 1*4b 1.4c 1/4c 224a
3.. +unc"ii de intrare)ie#ire standard
14c 24c 34c 44c 54c &4e *4b .4b /4c 124b 114aGc 124b
134c 144bGc 154a 1&4c 1*4a 1.4d 1/4c 224a 214a 224a 234a 244a
254c 2&4b 2*4c 2.4d 2/4c 324c 314d 324b 334b 344b 354b 3&4b
3*4d 3.4b
4.13 1peratorii limbajului C
14b 24aGd 34b 44aGcGd 54bGcGeGg *4aGcG( 124b 114aGb 134c
144aGb 1/4c 224b 214d 224b 234d 244d 254a 2&4d 2*4b 2.4a 2/4b
324c 314b 324c 334b 344d 354c 3&4c 3*4aGd 3.4d 3/4bGcGe 424c
414c 424bGc 434b 444b 454d 4&4aGe 4*4bGe 4.4e 4/4e 524cGe 514aGcGe
524aGe 534c 544c 554c 5&4aGcGd 5*4aGe 5.4e
5.1& 6nstruc"iunile limbajului C
14aGd 24aGcGdGe 34b 44c 54e &4aGc *4b .4c /4e 124d 114b
124c 134d 144a 154a 1&4d 1*4b 1.4a 1/4a 224b 214c 224c 234d
244d 254b 2&4c 2*4d 2.4c 2/4c 324d 314b 324a 334dGe 344e 354c
3&4c 3*4aGc 3.4aGdGe 3/4b 424d 414b 424bGc 434a 444b 454bGe 4&4c
4*4bGc 4.4b 4/4aGbGe
&.5 Tablouri
14c 24d 34aGb 44c 54d &4bGdGe *4e .4d /4b 124aGd 114d 124aGbGd
134bGc 144d 154bGd 1&4b 1*4c 1.4a 1/4d 224c 214c 224c 234b 244d
254d 2&4a 2*4a 2.4a 2/4a 324c 314c 324b 334d 344c 354d 3&4b 3*4c
*.4 0ointeri
*4 b cu eG c cu d 124b 114cGdGe 124d 134e 144d 154a 1&4aGbGc 1*4c
1.4c 1/4aGd 224b 214c 224a 234d 244bGc 254dGe 2&4bGe 2*4c
2.4aGcGe 2/4e 324d 314c 324bGc 334d 344b 354b 3&4a 3*4a 3.4a 3/4a
424a 414a 424a 434a 444b 454c 4&4d
..& Tiruri de caractere
14c 24b 34c 44aGbGe 54aGdGe &4a *4b .4d /4b 124d 114b
124e 134d 144b 154e 1&4aGb 1*4d 1.4b 1/4c 224e 214d 224a 234b
244d 254bGc 2&4b
/.4 Structuri
14d 24d 34c 44b 54d &4d *4c .4d
12.12 !ploatarea (i#ierelor
14bGc 24b 34a 44d 54d &4b *4c .4e /4e 124b 114c 124c
134dGe 144d 154d
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

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