Documente Academic
Documente Profesional
Documente Cultură
b)
k) 2.2 Constante........................................................................................13
l) 2.3 Variabile.........................................................................................15
e) f)
a)
b) Limbajul C/C++ pentru nceptori
c)
d)
s) 3.5 Funciile gets i puts......................................................................20
e) f)
a)
b) Limbajul C/C++ pentru nceptori
c)
d)
ak) CAP.5 STRUCTURI DE CONTROL N LIMBAJUL C..............56
e) f)
a)
b) Limbajul C/C++ pentru nceptori
c)
d)
bb) CAP.6 TABLOURI.......................................................................92
bf)
e) f)
a)
b) Limbajul C/C++ pentru nceptori
c)
d)
bt) 6.4.2 Tiprirea elementelor unei matrici.........................................101
bz)
e) f)
a)
b) Limbajul C/C++ pentru nceptori
c)
d)
dc) 10.8 Funcii de citire/scriere a fiierelor pe blocuri de octei.........161
dg) BIBLIOGRAFIE........................................................................170
dh)
e) f)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
identificatori : sunt nume de date, constante sau variabile. Sunt formate
dintr-un ir de caractere care ncepe cu o liter sau cu _ , urmtoarele
caractere putnd fi litere, cifre sau _
constante : sunt valori fixe reprezentnd caractere, iruri de caractere,
numere ntregi sau raionale
delimitatori : reprezint simboluri care separ entitile (spaiu, tab etc) .
ef) Observaie : limbajul C face distincie ntre literele mici i mari, deci
identificatorul n este diferit de identificatorul N.
eg)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gg) d) #define GST . gl) 8. Definii o constant
125 simbolic PI cu valoarea 3.14:
gh) a) #define 3.14 PI;
gi) 7. Care din numele de gm) b) #define float
variabile de mai jos nu este PI 3.14;
valid ? gn) c) #define float
a) go4it b) go_cart PI=3.14;
gj) c) 4season go) d) #define PI
d) _what 3.14
gk) e) #define PI=3.14
gp)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
jb) 0,d1d2......d15*10n, unde 308<=n<=308
jc) Astfel, instruciunea
jd) x=123.45123451234512345; // 20 de cifre semnificative
je) va implica atribuirea lui x a valorii
jf) 0.123451234512345*103 // 15 cifre semnificative
jg) Uzual, pentru variabilele de tip long double se aloc mai mult memorie (10
octei), sunt ns compilatoare care trateaz acest tip exact ca i double.
jh) Observaie: Limbajul C pune la dispoziie operatorul sizeof pentru
determinarea
ji) numrului de octei necesari memorrii unui obiect. Cu ajutorul lui putei afla
ct memorie aloc compilatorul cu care lucrai pentru fiecare din tipurile de
date prezentate.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
me) tip_baz list_variabile_declarate;
mf) Lista poate fi format din una sau mai multe variabile separate ntre ele prin
virgul. O variabil poate s includ n declaraie i iniializarea sa.
mg) Exemple :
mh) int n, k=0;
mi) float media;
mj) char c=65;
mk) unsigned long int f;
ml) double salar;
mm)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
nm) A2) 5 od) 3) 20.07
B2)constant 4) 198.
nn) r oe) 5) .13
eal 6) 1.9 E4
no) A3)5 of) 7) +2.7E+3
B3)const. 8) 2.e+4
np) h a) 1), 2), 3), 6), 7)
exazecimal og) b) toate mai
nq) A4) 05 puin 5)
B4)constant oh) c) toate
nr) o
ctal oi) d) toate mai
ns) A5) 5 puin b)
B5)constant oj) e) primele cinci
nt) c ok)
aracter ol) 9. Care dintre valorile de mai
nu) A6) 0x5 jos sunt constante ntregi
B6)constant ir scrise corect?
nv) d a) 123 b) 17 c) +843
e caractere om) d) 0154 e)
a) A1B2, A2B1, A3B5, --67
nw) A4B1, A5B6, on)
A6B3 oo) 10. Care dintre construciile de
b) A1B2, A2B1, A3B5, mai jos reprezint constante
nx) A4B4, A5B5, tip caracter?
A6B3 op) 1) 2) \
c) A1B2, A2B1, A3B5, 3) a
ny) A4B4, A5B6, oq) 4) 5)
A6B3 \\ 6) \13
or) 7) a 8)
d) A1B2, A2B1, A3B5,
a) 2), 3) ,8) b) toate
nz) A4B4, A5B6, os) c) toate mai
A6eronat puin 5) si 6)
e) A1B2, A2B1, A3B5, ot) d) 2), 3), 4),
A4B1, A5B6, 8)
A6eronat ou) e) 3), 4), 5).
oa) 6), 8)
ob) 8. Care dintre urmtoarele ov)
valori sunt constante flotante ow) 11. Care dintre urmtoarele
scrise corect? declaraii de variabile declar
oc) 1) 2307.98 corect o variabil x ce poate
2) +54.3 memora valori reale?
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
a) float x; b) double x; pq) c) int a,b,e;
ox) c) unsigned float c,d;
float x; pr) d) int a,b;
oy) d) x:float; e) float c,d;
x:double; ps) char e;
oz) pt) e) int c,d;
pa) 12. Care dintre liniile de float a,b;
program de mai jos realizeaz pu) char e;
iniializarea corect a variabilei pv)
x la declararea sa? pw) 15. O declaratie de genul :
a) int x==2; b) x:int=2; px) int i=7.3;
pb) c) int x=2; py) va avea urmatorul efect :
d) int x 2; a) semnalarea unei erori din
pc) e) x=2:int; partea compilatorului
pd) b) va atribui lui i valoarea
pe) 13. Care dintre variabile vor 7.3 i va semnala un
avea valori ntregi dup avertisment din partea
execuia secven de program compilatorului
urmtoare? c) va modifica tipul
pf) int a=3, b, c; variabilei i
pg) float x=-11.23; d) va atribui lui i valoarea
ph) char d; 7
pi) b=x; d=A; pz)
c=M-N; qa) 16. Declaraia corect pentru
a) variabila x definirea unui ntreg numit
b) variabila c suma este :
pj) c) variabila d a) suma:integer;
pk) d) variabila a b) integer suma;
pl) e) variabila b c) int suma;
pm) d) suma int;
pn) 14. Considerm variabilele a, qb)
b, c, d i e. Alegei varianta qc) 17. Declaraia corect pentru
corect a declaraiilor, astfel definirea unei variabile
nct atribuirile urmtoare s caracter numit litera este :
nu fie nsoite de conversii a) litera:=char;
care s modifice valorile b) char litera;
atribuite. qd) c) litera: char;
po) a=3; b=8; c=2.1;
d=-3.5; e=B; qe) d) character
a) float a,b,c.d; char e; litera;
pp) b) int a,b,c,d; qf)
char e;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
qg) 18. Definirea corect a unei qi) 19. Definirea corect a unei
variabile numit bani care variabile ntregi numit total
poate fi utilizat pentru a iniializat cu zero este :
memora valori reale simpl a) total: integer=0;
precizie este : b) total=0, int;
a) bani: real; qj) c) int total=0;
b) real bani; qk) d) int=0 , total;
c) float bani; ql)
d) bani float; qm)20. Ce numr este echivalent
qh) cu 4e3:
a) 4000 b) 400
qn) c) .004
d) .0004
qo)
qp)
qq)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
qr) Cap.3 Funcii de intrare/ieire standard
qs) 3.1 Clasificarea funciilor de intrare/ieire
qt)
qu) Prin intrri/ieiri nelegem un set de operaii care permit schimbul 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.
qv)Funciile de citire/scriere se pot clasifica, dup tipul datelor manevrate, n
urmtoarele categorii:
pentru caractere
pentru iruri de caractere
cu format
qw) 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
qx)Funciile utilizate mai frecvent pentru realizarea operaiilor de intrare/ieire
folosind terminalul standard sunt :
pentru intrri : getch, getche, gets i scanf
pentru ieiri : putch, puts i printf
qy)La acestea se adaug macrourile getchar pentru intrri i putchar pentru
ieiri. Aceste macrouri sunt definite n header-ul stdio.h i folosirea lor implic
includerea acestui fiier.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
rd)Funcia getche() este analog cu funcia getch, cu singura diferen c ea
realizeaz citirea cu ecou a caracterului tastat. Aceasta nseamn c se afieaz
automat pe ecran caracterul tastat. Ambele funcii nu au parametri i se pot apela ca
operanzi n expresii. La apelarea lor se vizualizeaz fereastra utilizator i se ateapt
tastarea unui caracter. Programul continu dup tastarea caracterului.
re)Funciile getch i getche au prototipurile n fiierul conio.h, deci utilizarea
lor implic includerea acestui fiier.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
rz) 3.4 Macrourile getchar i putchar
sa)
sb)Aceste macrouri sunt definite n fiierul stdio.h. Ele se apeleaz la fel ca
funciile. Macroul getchar permite citirea cu ecou a caracterelor de la terminalul
standard. Se pot citi numai caractere ale codului ASCII, nu i caractere
corespunztoare tastelor speciale. Prin intermediul macroului getchar caracterele nu
se citesc direct de la tastatur. Caracterele tastate la terminal se introduc ntr-o zon
tampon pn la acionarea tastei Enter. n acest moment, n zona tampon, se
introduce caracterul de rnd nou (newline) i se continu execuia lui getchar. Se
revine din funcie returnndu-se codul ASCII al caracterului curent din zona tampon.
La un nou apel al lui getchar se revine cu codul ASCII al caracterului urmtor din
zona tampon. La epuizarea tuturor caracterelor din zona tampon, apelul lui getchar
implic tastarea la terminal a unui nou set de caractere care se rencarc n zona
tampon.
sc) Un 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 fiier.
sd)n general, prin fiier se nelege o mulime ordonat de elemente pstrate
pe suporturi de memorie extern. Elementele unui fiier se numesc nregistrri. Cu
toate c fiierele sunt n general pstrate pe discuri, este util s se considere
organizate n fiiere chiar i datele care se tasteaz sau se afieaz la terminal. n
acest caz nregistrarea este un rnd afiat la terminal sau succesiunea de caractere
tastat la terminal i terminat la apsarea tastei Enter.
se)Fiierele conin o nregistrare special care marcheaz sfritul de fiier.
Aceast nregistrare se realizeaz la tastatur prin secvene speciale, spre exemplu
tastnd <Ctrl>+Z al crui ecou este ^Z.
sf) Macroul getchar returneaz valoarea constantei simbolice EOF (End of
File) la ntlnirea sfritului de fiier. Aceast constant este definit n fiierul stdio.h
i n general are valoarea 1. Macroul getchar se apeleaz fr parametri i de obicei
este un operand al unei expresii : getchar();.
sg) Macroul putchar afieaz un caracter al codului ASCII. El returneaz
codul caracterului afiat sau 1 la eroare. Se poate apela cu : putchar(expresie);
sh) Valoarea expresiei reprezint codul ASCII al caracterului care se afieaz.
si) Exemplu : S se scrie un program care citete un caracter folosind macroul
getchar, l afieaz folosind macroul putchar i trece cursorul pe linia
urmtoare.
sj) #include<stdio.h>
sk) #include<conio.h>
sl) void main()
sm) { clrscr();
sn) putchar(getchar());
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
so) putchar(\n);
sp) getch();
sq) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
td) {
char nume[30];
te) char prenume[30];
tf) clrscr();
tg) gets(nume); gets(prenume);
th) putchar(nume[0]);
ti) putchar(.);
tj) putchar(prenume[0]);
tk) putchar(.);
tl) puts(\nPentru a termina programul actionati o
tm) tasta );
tn) getch();
to) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
yh) // zecimale
yi) printf(\n x=%-.10f*,x);
yj) // x=123.0123456700* ,analog, alinierea nu are
efect
yk) printf(\n x=%12.4f,x);
yl) // x= 123.0123 , rotunjire prin lips la 4
ym) // zecimale si completare cu spaii la stnga
pn
yn) // la 12 caractere
yo) printf(\n x=%-12.4f*,x);
yp) // x=123.0123 * ,analog,alinierea se face
la
yq) // dreapta
yr) getch();
ys) }
yt) Exemplul 3 : Folosirea afirii cu format pentru irurile de caractere
yu) #include<stdio.h>
yv) void main()
yw) {
yx) char s[]="Luna rosie!";
yy) printf("%s\n",s);
yz) // Luna rosie!,lungimea campului 11 implicit
za) printf("%-s*\n",s);
zb) // Luna rosie!*,analog,alinierea nu are efect
zc) printf("%3s*\n",s);
zd) // Luna rosie!*, analog,dimensiunea 3 se ignora
ze) printf("%.6s*\n",s);
zf) // Luna r* ,se afiseaza conform preciziei doar 6
zg) // caractere
zh) printf("%11.8s*\n",s);
zi) // Luna ros*,se afiseaza conform preciziei 6
zj) // caractere si se completeaza la stanga cu 3
spatii
zk) // pana la dimensiunea 11
zl) printf("%-11.8s*\n",s);
zm) // Luna ros *,analog,dar alinierea fiind la
zn) // stanga,completarea cu 3 spatii se face la
dreapta
zo) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
zp)3.7 Funcia scanf
zq)
zr) Funcia de citire cu format scanf are sintaxa :
zs) scanf(lista de formate , adresa_var1 , adresa_var2,..);
zt) Aceast funcie realizeaz urmtoarele operaii :
citete din fiierul standard de intrare stdio o secven de cmpuri de intrare,
caracter cu caracter, pn la terminarea introducerii cmpurilor i apsarea tastei
<Enter> ;
formateaz fiecare cmp conform formatului specificat n lista de formate. Din
caracterele citite se calculeaz valori numerice sau literale, conform tipului fiecrei
variabile, dimensiunilor de format specificate i a separatorilor de cmpuri
predefinii (spaiu, tab i enter) sau impui explicit ;
valorile astfel construite sunt stocate la adresele variabilelor specificate ca
argumente ;
zu) Ordinea formatelor variabilelor trebuie s coincid cu ordinea listei
adreselor variabilelor n care se face citirea. Fiecare variabil care se dorete a fi citit
trebuie corelat cu un format specific.
zv) Observaie :Indiferent de formatul folosit, la ntlnirea unui spaiu n
introducerea datelor, este terminat citirea variabilei.
zw)Pentru funcia de citire scanf trebuie folosit operatorul adres &. Pentru
variabilele citite cu aceast funcie trebuie precizate adresele la care se stocheaz n
memoria calculatorului valorile variabilelor. Funcia va introduce valorile citite direct la
acele adrese. Singurul caz n care nu este obligatorie folosirea operatorul adres
pentru citirea valorii unei variabile cu funcia scanf este citirea unui ir de caractere .
zx) Observaie : citirea cu ajutorul funciei scanf a irurilor de caractere care
conin spaii este imposibil.
zy) n cazul n care formatul specificat este necorespunztor, rezultatul
obinut poate fi neprevzut. Valoarea ntoars de scanf n caz de succes,
este numrul de variabile care au fost citite corect. Dac nu a fost citit nici o
variabil (de exemplu s-a introdus un ir n loc de un numr ) funcia ntoarce
valoarea 0. Dac apare o eroare naintea oricrei citiri i asignri, funcia
returneaz EOF (constant de sistem avnd valoarea ntreag 1).
Specificatorii de format ai funciei scanf() sunt prezentai n tabelul urmtor:
zz)
aaa) aab) Semnificaie
C
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
aae) aaf)Citete un ntreg zecimal
%
abc)
abd)
abe) n specificatorul de format pot s apar i modificatori de tip.
Modificatorul h, care poate precede caracterele de conversie d,i,o,u,x sau X,
precizeaz c valoarea convertit trebuie memorat ca un short int sau unsigned
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
short int. Modificatorul l, poate precede caracterele de conversie d,i,o,u,x,X, caz n
care valoarea trebuie memorat ca un long int sau unsigned long int, sau poate
precede caracterele e,E,f,g,G, caz n care valoarea trebuie memorat ca un double.
Modificatorul L poate precede numai caracterele e,E,f,g,G i precizeaz c valoarea
convertit trebuie memorat ca un long double.
abf) O caracteristic foarte interesant a funciei scanf() este numit
scanset. Un specificator scanset se poate crea prin includerea unei liste de caractere
n interiorul unor paranteze drepte. Spre exemplu, iat un specificator scanset
coninnd literele ABC : %[ABC]. Cnd scanf() ntlnete un specificator scanset,
se ncepe citirea caracterelor i depozitarea lor ntr-un tablou punctat de argumentul
corespunztor. Citirea va continua ct timp caracterul citit face parte din scanset. n
momentul n care caracterul citit nu face parte din scanset, funcia scanf() oprete
citirea pentru acest specificator i avanseaz la urmtorul specificator din irul de
control. Folosind semnul n scanset se specific un domeniu. De exemplu, urmtorul
specificator se refer la literele de la A la Z : %[A-Z].
abg) Uneori cnd scansetul este mare, este mai uor s specificm ceea
ce nu face parte din scanset. Pentru a realiza acest lucru, setul trebuie
precedat de semnul ^. De exemplu, [^0123456789]. Cnd scanf() ntlnete
acest scanset, va citi orice caracter exceptnd cifrele de la 0 la 9. Se poate
suprima asignarea unui cmp punnd un asterisc imediat dup semnul %.
Aceast proprietate este foarte util cnd introducem informaii care conin i
caractere de care nu avem nevoie. De exemplu, dndu-se :
abh) int j,k;
abi) scanf(%d%*c%d,&j,&k);
abj) i datele de intrare sub forma : 555-2345, scanf() va asigna valoarea 555
variabilei j, va nltura semnul i va asigna valoarea 2345 variabilei k.
abk) Iat un exemplu de scanset care accept caractere litere mici i litere
mari. ncercai s introducei cteva litere, apoi orice alt caracter i apoi din nou litere.
Dup ce apsai tasta Enter numai literele introduse naintea caracterelor care nu au
fost litere vor fi coninute n str.
abl) #include<stdio.h>
abm) void main()
abn) {
abo) char str[80];
abp) printf(Introduceti litere si apoi orice
abq) altceva\n);
abr) scanf(%[a-zA-Z],str);
abs) printf(%s,str);
abt) }
abu) Dac dorii s citii un ir coninnd spaii folosind funcia scanf(), va
trebui s utilizai scansetul urmtor:
abv) #include<stdio.h>
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
abw) void main()
abx) {
aby) char str[80];
abz) printf(Introduceti litere si spatii\n);
aca) scanf(%[a-zA-Z ],str);
acb) printf(%s,str);
acc) }
acd) Se pot specifica de asemenea semne de punctuaie, simboluri i cifre,
astfel c, virtual, se poate citi orice tip de ir.
ace) Programul urmtor ilustreaz efectul pe care l are prezena unor
caractere non-spaiu n irul de control. El ne permite s introducem o valoare
zecimal, cifrele din stnga punctului zecimal sunt asignate unei variabile ntregi, iar
cele din dreapta punctului zecimal sunt asignate unei alte variabile ntregi.
acf) #include<stdio.h>
acg) void main()
ach) {
aci) int j,k;
acj) printf(Introduceti un numar zecimal :
);
ack) scanf(%d.%d,&j,&k);
acl) printf(stanga:%d\t dreapta:%d,j,k);
acm) }
acn)
aco) Observaie : Dac este posibil apariia erorilor la introducerea datelor, este
necesar ca imediat dup apariia unei erori s folosim una din funciile :
fflush(stdin); - pentru golirea buffer-ului fiierului standard de intrare
fflushall(); - pentru golirea tuturor buffer-elor fiierelor
acp) Exemple :
acq) char a[20];
acr) int n;
acs) scanf(%[A-Z]s,a);
act) /*citete un ir format numai din litere mari */
acu) scanf(%[a-zA-Z]s,a);
acv) /* citete un ir format din litere mari si mici */
acw) scanf(%3d,&n);
acx) /* citete un numr ntreg de cel mult trei cifre */
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ada) 1. S se determine ce adr) c)
tiprete urmtoarea ads) scanf("%d %s
instruciune : %Lg",&n,s,&x);
adb) unsigned adt) d)
n=100; adu) scanf("%d %c
adc) printf("%04x %lf",&n,&s,&x);
",n); adv) e)
add) a) 0100 adw) scanf("%d
b) 100 %",&n,&s,&x);
ade) c) 0064 adx)
c) A10 ady) 4. Fie declaraia :
adf) char s[20];
adg) 2. Ce face secvena ? adz) Care din secvenele
adh) float de mai jos citesc corect un ir
n=16; de caractere s ?
adi) a) scanf("%c",s);
printf("%x",n+1); b) scanf("%c",&s);
a) afieaz numrul n baza c) scanf("%s",s);
16 d) scanf("%s",&s);
b) d eroare de compilare e) scanf("%",s);
deoarece nu am folosit o f) scanf("",s);
variabil la scriere aea)
c) chiar dac nu este aeb) 5. Fie declaraia :
semnalat nici o eroare char str[80];
la compilare, nu se aec) Care din urmtoarele
afieaz valoarea dorit, secvene vor face citirea unui
deoarece nu am folosit un ir de maxim 80 caractere care
specificator de format s nu conin caracterul . ?
adecvat a) scanf("%[.]s",str);
adj) b) scanf("%[^.]s",str);
adk) 3. Fie declaraiile : c) scanf("%80[^.]s",str);
adl) int n;long d) scanf("%80[^.]c",str);
double x; e) scanf("%80[.^]s",str);
adm) char s[100]; aed)
adn) Care din secvenele aee) 6. Fie declaraia :
urmtoare sunt corecte pentru char s[100];
citirea variabilelor ? aef)Care din urmtoarele secvene
ado) a) scanf("%i%s va face citirea unui ir de
%lg",&n,&s,&x); caractere care s conin
adp) b) numai cifre?
adq) scanf("%d %s a) scanf("%[0123456789]",s);
%Lg",&n,&s,&x); b) scanf("%s",s);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
c) scanf("%[^0-9]s",s); a) obinem eroare la
d) scanf("%[09]s",s); compilare pentru c n
e) scanf("%[0-9]s",s); interiorul formatului s-a
f) scanf("%['0'-'9']",s); pus virgul
aeg) g) scanf("% b) nu apar erori la
['0'...'9']",s); compilare; deoarece n
aeh) interiorul formatului s-a
aei) 7. Cum putem introduce un pus virgul, nu se vor
numr x ntreg de maxim 4 citi corect numerele
cifre care s nu conin cifra c) nu apar erori la
0? compilare; deoarece s-a
aej) a) pus virgul, numerele
scanf(%4d,&x); introduse trebuie
aek) b) separate prin virgul
scanf(%4[^0]s,x); d) nu apar erori la
ael) c) compilare; pentru
scanf(%04d,&x); numerele introduse poate
fi folosit orice
aem) d) secven delimitatoare
scanf(%d0,&x); aez)
aen) afa)10. Fie secvena urmtoare :
aeo) 8. Fie declaraiile : int afb) int a;
a, b, c; char str[20];
aep) i apelul: afc)
aeq) scanf("%2d%3d scanf("%i", &a);
%4d",&a,&b,&c); afd)
aer)Care va fi valoarea variabilelor fflush(stdin);
dup introducere, dac la afe) gets(str);
intrare se tasteaz 123456? aff) Datele de intrare se introduc
aes) a) a=123 , astfel :
b=345 , c=56 afg) 100
aet) b) a=12 , afh) abcd
b=345 , c=6 afi) Ce se ntampl dac scoatem
aeu) c) a=123456 , funcia fflush din secvena
b=0 , c=0 anterioar ?
aev) a) este semnalat eroare la
aew) 9. Ce se ntmpl compilare
dac se folosete secvena b) nu se mai citete de pe
urmtoare ? linia a doua irul
aex) int m, n; "abcd", acesta lund
aey) scanf("%d, valoarea ""(ir vid)
%d",&m,&n);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
c) ambele date sunt citite aga) 34##:#6.250
corect, numrul lund agb) unde prin # am
valoarea 100 iar irul simbolizat caracterul spaiu.
valoarea "abcd" a)
afj) agc) printf(\n%4d:%-
afk) 11. Fie urmtoarele declaraii 10f,a,x);
de variabile: b)
afl) int a; float x; agd) printf(\n%-4d:
char m; %6.3f,a,x);
afm) Care dintre c)
instruciunile de mai jos age) printf(\n%6d:
realizeaz citirea corect a %10f,a,x);
variabilelor d)
afn) agf) printf(\n%-d:
afo)a,x i m? %-.3f,a,x);
a) agg) e)
afp) scanf(%d %f agh) printf(\n%d:
%c,&a,&x,&m); %f,a,x);
b) agi)
afq) scanf(%d,%f, agj) 13. Dac de la tastatur se
%c,a,x,m); introduce caracterul a, iar
c) codurile literelor mici sunt
afr) scanf(%f.%d. succesive, ncepnd cu 97, ce
%c,&a,&x,&m); afieaz programul urmtor?
d) agk) #include<stdio.h
afs) scanf(a=%d,x= >
%f,c=%c, agl) #include<conio.h
aft) >
a,x,m); agm) void main()
afu) e) scanf(a= agn) {
%d\nx=%f\nc=%c\n, ago) char c, p;
afv) agp)
&a,&x,&m); p=getchar():
afw) agq) int
afx) 12. Fie declaraiile: n=p+259;
afy) int a=34; float agr) c=n;
x=6.25; ags)
afz) Precizai care dintre putchar(c);
instruciunile de afiare agt) }
urmtoare trebuie executat a) 356 b) a c) d
astfel nct s se afieze pe agu) d) 100
ecran rndul de mai jos:
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
agv) e) programul citesc de la tastatur un
este greit caracter. Ce deosebiri exist
agw) ntre cele trei funcii ?
agx) 14. Care dintre a) funciile getchar i
secvenele de mai jos nu getche realizeaz citire
conin erori i afieaz cu ecou, iar getch
cuvintele Program i simplu citete caracterul fr
unul sub altul (fiecare pe cte ecou
un rnd) ? b) funcia getchar citete
agy) a) ahv) caracterul cu
agz) { ecou, iar funciile
aha) getche i getch
printf(Program); realizeaz citirea fr
ahb) printf(\n ecou
simplu); c) funciile getchar i
ahc) } getch preiau caracterul
ahd) b) numai dup apsarea
ahe) { tastei ENTER
ahf) d) funciile getchar i
printf(Program\n); getche preiau caracterul
ahg) printf(si de ndat ce a fost
mplu); tastat, fr s mai
ahh) } atepte confirmarea cu
ahi) c) ENTER
ahj) { e) toate cele trei funcii
ahk) printf(Progra au prototipul n header-
m\nsimplu); ul conio.h
ahl) printf(\n); ahw)
ahm) } ahx) 16. char x=A;
ahn) d) ahy) putchar(x);
aho) { ahz) putchar(x+1);
ahp) aia) Referindu-ne la codul de mai
printf(Program); sus i presupunnd c funcia
ahq) printf(si putchar ia ca argument un
mplu\n); ntreg, ce vom avea la ieire
ahr) } dup execuie ?
ahs) e) nici unul a) BA b) A66 c) AB
dintre progra-mele aib) d) Se va genera
anterioare o avertizare la
aht) compilare i execuia
ahu) 15. Funciile nu este cea ateptat
getchar(), getch() i getche() aic)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
aid) 17. Unde scrie funcia aiu) Pentru x=3.14159265 se va
printf() ? afia :
a) stdout b) stdio a) 3 b) 3.14
aie) c) stdin aiv) c) 3.1415 d)
d) stderr 3.141593
aif) aiw)
aig) 18. Cs a aix) 21. Fie secvena :
aih) fun aiy) printf(\n.1E,x
language! );
aii) Selectai codul care va aiz) Pentru x=123.672 se va afia
produce ieirea de mai sus: :
a) printf(Cs a\fun\ a) 1.2E+02 b) 1.236E+02
aij) la aja) c) 123E+02
nguage!\n); d) 1E+02
b) printf(Cs a ajb)
aik) \fun\lan ajc) 22. Fie secvena :
guage!); ajd) printf(\n*
c) printf(Cs a\n fun %15.10S*,x);
ail) aje) Pentru x=program c++,
language!\n); se va afia :
d) printf(Cs a\n \fun\ a) * program c+*
aim) la ajf) (5 spaii n
nguage!\n); fa)
ain) b) *program c++*
aio) 19. short int x; c) *program c*
/*presupunem c x este pe 16 d) * program c++*
bii*/ ajg) (4 spaii n
aip) Care este numrul maxim care fa)
poate fi tiprit folosind ajh)
printf(%d\n,x), aji) 23. Fie secvena :
presupunnd c x este ajj) printf(\n*
declarat aa cum am artat %07d*,x);
mai sus ? ajk) Pentru x=123, se va afia :
a) 127 b) 255 a) *0000123* b) *123*
aiq) c) 32767 ajl) c) * 123* d)
d) 65536 *123 *
air) ajm)
ais) 20. Fie secvena : ajn) 24. Fie secvena :
ait) printf(\n ajo) printf(\n
%10.0f,x); %.4e,x);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ajp) Pentru x=-123.5e20, se va akh) 27. Se definete
afia : constanta simbolic SIR astfel:
a) 1.2350e+22 aki) #define SIR
b) 1.235e+22 akj) EXAMEN
ajq) c) 12.3500e+21 ADMITERE
ajr) d) 1.2350e+20 akk) Efectul apelului lui
ajs) printf(%-10.6s,SIR)
ajt) 25. Care este efectul apelului este urmtorul :
funciei printf(%x,a), a) EXAMEN ADMITERE
unde a este o variabil de tip b) EXAMEN (4 spaii in
ntreg de valoare 0xAF5 : fa)
a) 0xAF5 b) 5365 c) AF5 c) EXAMEN (4 spaii dup)
aju) d) valoarea d) EXAMEN ADM
binar a akl)
ajv) variabilei a akm) 28. Care este efectul
ajw) apelului funciei
ajx) 26. Care este efectul printf(%o,a) unde a
urmtorului program : este o variabil de tip ntreg de
ajy) #include valoare 0xAF5 :
<stdio.h> a) 05365 b) 0xAF5
ajz) #include akn) c) AF5
<conio.h> d) 5365
aka) void main(void) ako)
akb) { akp) 29. Se d urmtorul
akc) putchar(get program :
che()- akq) #include
akd) <stdio.h>
A+a); akr) void main()
ake) printf(\n aks) {
); akt) double
akf) } x;
a) citete i afieaz un aku) scanf(%
caracter lf,&x);
b) citete o liter mare i akv) printf(
afieaz litera mic %e,d);
cores-punztoare akw) }
c) citete o liter mic i akx) Efectul acestui
afieaz litera mare program este :
cores-punztoare a) citete i afieaz un
d) citete un caracter numr real
akg) b) citete un numr cu
exponent i l afieaz
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
c) citete un numr real i alq) n urma lansrii n execuie a
afieaz valoarea sa cu programului, valoarea lui k
exponenial introdus va fi 65. Care va fi
d) afieaz un numr real rezultatul afiat ?
aky) a) 65 b) 41 c) 32 d) 60
akz) 30. Care este efectul alr)
instruciunii printf(%u,x) als) 34. Precizai care sunt valorile
unde x este o variabil de tip afiate, dac se vor citi n
ntreg de valoare 0xAF25 : ordinea indicat valorile
a) 20669 b) AF25 numerice 5 2 -3:
ala) c) 44837 alt) { int a, b;
d) 0xAF25 alu) scanf(%d%d
alb) %d,&a,&b,&a);
alc) 31. Care este efectul apelului alv) printf(%d,
funciei printf(%x,b) a);
unde b este o variabil de tip alw) printf(%d\n
ntreg de valoare 0x12ABC : ,b);
a) 12AB b) 12ABC alx) printf(%d,
ald) c) 0x12ABC a+b);
d) 2ABC aly) }
ale) alz) a) 5 2
alf) 32. Care este efectul apelului ama) 7
functiei printf(%lx,b) amb) b) 3 2
unde b este o variabil de tip amc) -1
ntreg n dubl precizie de amd) c) 5 2 7
valoarea 0x12ABC :
a) 0x12ABC b) 12ABC ame) d) exist erori
alg) c) ABC de sintax
d) 012ABC amf)
alh) amg) 35. Care sunt valorile
ali) 33. Fie urmtorul program : tiprite de programul urmtor :
alj) #include amh) void main(void)
<stdio.h> ami) { int a,b;
alk) main() amj) a=5; b=13;
all) { amk) printf(%d+
alm) int k; %2d=%2d,a,b,
aln) scanf(%d, aml)
&k); a+b);
alo) printf(%x amm) }
,k); a) a+b=a+b b)5+13=18
alp) } amn) c)5+13:2=18:2 d)
a+b:2=a+b:2
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
amo) a) scanf(litera);
amp) 36. Scriei o b) scanf(litera);
instruciune care afieaz c) scanf litera;
valoarea variabilei ntregi total d) scanf(%c,&litera);
: ams)
a) printf(%s\n,total); amt) 38. Scriei o
b) printf(%d\n,total); instruciune care afieaz
c) printf(%s\n,total); valoarea unei variabile de tip
d) printf total; real value cu trei zecimale
amq) exacte :
amr) 37. Scriei o a) printf(value:3);
instruciune care citete un b) printf(%.3f\n,value);
caracter i-l memoreaz n c) printf(%s\n,value:3);
variabila litera : d) printf %.3f,value;
amu)
amv)
amw)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
amx) Cap.4 Operatorii limbajului C
amy)
amz) Limbajul C dispune de o gam extins de operatori. Pe lng
setul de operatori uzuali, limbajul are definii operatori care ofer faciliti
asemntoare limbajelor de asamblare. Exist astfel operatori aritmetici,
operatori de atribuire simpl sau compus, operatori logici, operatori de
prelucrare pe bii etc.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
aoj) 4. Adunare , aok) aol) Plus i minus binari
scdere + -
aom) 5. aon) aoo) Deplasare
Deplasri << stnga/dreapta pe bii
>>
aop) 6. aoq) aos) Mai mic/mai mic sau
Relaionali < egal
<= aot)Mai mare/mai mare sau egal
aor)
>
>=
aou) 7. aov) aox) Egal
Egalitate == aoy) Diferit
aow)
!=
aoz) 8. apa) apb) SI logic bit cu bit
&
apc) 9. apd) ape) SAU EXCLUSIV bit cu
^ bit
apf)10. apg) aph) SAU logic bit cu bit
|
api) 11. apj)&& apk) SI logic
apl) 12. apm) apn) SAU logic
||
apo) 13. app) apq) Operatorul condiional
Op. ?: (ternar)
condiional
apr)14. Operatori apt) apy) Atribuire simpl
de = apz) Atribuire produs , ct ,
aps) atribu apu) rest
ire *= / aqa)
= aqb) Atribuire sum ,
%= diferen
apv) aqc) Atribuire SI , SAU
+= EXCLUSIV , SAU (bit)
-= aqd)
apw) aqe) Atribuire cu deplasare
&= stnga/dreapta
^=
!=
apx)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
<<=
>>
=
aqf)15. Virgula aqg) aqh) Evaluare expresie1 ,
, expresie2 . Valoarea rezultatului
este expresie2.
aqi)
aqj) Cei din prima categorie au prioritatea maxim. Precedena descrete
cu ct crete numrul categoriei din care face parte operatorul. Operatorii din aceeai
categorie au acelai grad de preceden. Ordinea de evaluare a operaiilor este de la
stnga la dreapta, cu excepia operatorilor unari (categoria 2), a operatorului
condiional (categoria 13) i a operatorilor de atribuire (categoria 14) care au ordinea
de evaluare de la dreapta la stnga.
aqk) Totui ordinea de efectuare a operaiilor nu este ntotdeauna perfect
determinat. Se poate face o reorganizare a expresiilor pentru a obine un cod mai
eficient, dar ordinea de efectuare a operaiilor nu este strict definit. n funcie de
context, acelai operator poate avea semnificaii diferite. Spre exemplu operatorul &
(ampersand) poate fi considerat ca :
- operatorul binar SI pe bii (a & b)
- operatorul unar, adresa unui operand (&a)
aql) Semnificaia depinde de numrul de argumente folosite, unul sau dou .
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
arc) /* x=100 ;se face conversie la un tip ntreg :
97+3=100 */
ard)n plus, atribuirea nsi are o valoare, i anume valoarea variabilei din stnga
dup memorarea coninutului valorii expresiei. Datorit acestui efect, rezult
n final o valoare a expresiei de atribuire care poate fi folosit direct ntr-o alt
atribuire. De aceea este permis atribuirea multipl.
are) Exemplul 2 :
arf) int i,j,k ;
arg) i=j=k=1;
arh)care este echivalent cu secvena :
ari) k=1; j=k; i=j;
arj) Se observ o mai bun compactare a codului surs n primul caz, de folosire
a atribuirii multiple. Toate cele trei variabile au dup atribuire valoarea 1.
ark) Exemplul 3:
arl) int i,j,k;
arm) j+1=i;
arn) i=1+j=k;
aro)Ambele instruciuni de atribuire sunt incorecte, pentru c j+1 nu este o
variabil.
arp) Exemplul 4:
arq)Considerm instruciunile:
arr) b=2;
ars) c=3;
art) a=b+c;
aru)unde toate variabilele sunt de tipul int. Folosind faptul c = este un operator,
putem condensa la:
arv) a=(b=2)+(c=3);
arw) Explicaia este c expresia de asignare b=2 atribuie valoarea 2 att
variabilei c, ct i instruciunii ntregi.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
asg) j=n%i;
ash) /* j=1 ca restul mpririi a dou numere
ntregi */
asi) x=n; /* x=33.00 - ca numr real*/
asj) x=x%i;
ask) /* se obine eroare operatorul % fiind
definit numai
asl) pentru numere ntregi*/
asm) Exemplul 2 : La acelai rezultat conteaz tipul variabilei din stnga .
asn) int i;
aso) float x;
asp) i=7./2;
asq) /* i=3 pentru c 3.5 real este convertit la
tipul ntreg
asr) al lui i */
ass) X=7./2; /* x=3.5 pentru c x este de tip
real */
ast)n concluzie, rezultatul este convertit la tipul variabilei din membrul stng
al atribuirii.
asu) Exemplul 3: n operaiile cu constante conteaz dac ele sunt de tip
ntreg sau real.
asv) int i,j;
asw) i=5/2+7/2;
asx) /* rezultatele mpririi dintre dou numere
ntregi sunt
asy) convertite tot la numere ntregi i
i=2+3=5 */
asz) j=5./2+7/2.;
ata) /* rezultatele mpririi dintre un numr
real i un
atb) numr ntreg sunt numere
reale,2.5+3.5=6.0 ,deci j=6 */
atc) Spre deosebire de ceilali operatori aritmetici, operatorii de incrementare i
decrementare sunt specifici limbajelor de asamblare. Ei sunt mult mai rapizi,
efectul lor constnd n mrirea/micorarea variabilei cu 1 n modul urmtor :
- ++var sau var++ : variabila 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-- : variabila var este micorat cu o unitate, n primul caz,
nainte de utilizarea ei (predecrementare), iar n al doilea caz, dup
utilizarea ei (postdecrementare)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
atd)Are importan dac operatorii de incrementare i decrementare se folosesc
la stnga sau la dreapta variabilei.
ate)Exemplul 4:
atf) int i,j=7;
atg) i=j++; /* i=7 , j=8 */
ath) sau i=++j; /* i=8 , j=8 */
ati) Exemplul 5:
atj) int a=2,b=3,c,d;
atk) c=d=(a++ +1)b--; /* a=3 , b=2 , d=0 , c=0
*/
atl) Exemplul 6: Fie declaraiile i iniializrile:
atm) int a=1,b=2,c=3,d=4;
atn)Atunci avem:
ato) atp) Expresie echivalenta atq)
Expresie parantezata Valoa
re
atr) ats) (a*b)/c att)
a*b/c 0
atu) atv) ((a*b)%c)+1 atw)
a*b%c+1 3
atx) aty) ((++a)*b)-(c--) atz)
++a*b- 1
c--
aua) aub) 7-((-b)*(++d)) auc)
7 - -b*+ 17
+d
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
|i&&j-3 0
ayr) i< ays) (i<j)&&(x<y) ayt)
j&&x<y 0
ayu) i< ayv) (i<j)||(x<y) ayw)
j||x<y 1
ayx)
bbr)
bbs) Dac b15=0 (numr pozitiv), atunci valoarea lui a se calculeaz cu
formula:
14
a bj 2 j
j 0
bbt)
bbu) Dac b15=1, considerm reprezentarea n baza 2 a complementului lui
a (~a):
bbv)
bbw)bbx) bby) bbz) bca) bcb) bcc) bcd) bce) bcf)
bcg) bch) bci) bcj) bck)bcl) bcm)bcn)bco) bcp)
t15 t14 t1 t0
bcq)
bcr)
bcs) unde tj=1-bj (bitul complementat). n acest caz, regulile de calcul
sunt:
14
~ a bj 2 j
j 0
bct)
bcu) -a=~a+1
bcv) a=-(~a+1)
bcw) Complementul fa de 2 ale lui 0 i 1 sunt speciale. Astfel valoarea 0
are toi biii 0, pe cnd valoarea 1 are toi biii 1.
bcx) Observaie:
bcy) Dac maina pe care lucrai reprezint tipul int ca long int pe
4 octei, raionamentul se aplic identic pe 32 de bii.
bcz) Operatorii <<, respectiv >>, sunt numii operatori de deplasare pe bii
la stnga, respectiv la dreapta. Ei au sintaxa :
bda) a<<n /* echivalent cu a*2n */
bdb) a>>n /* echivalent cu a/2n */
bdc) Exemplul 1:
bdd) int t=1,j=6,k,n;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bde) t=1<<j; /* t=1*26 */
bdf) k=t>>2; /* k=2 /2 =24 */
6 2
bdg) n=t&k;
bdh) /* n=0 pentru c t i k nu au nici un bit de pe aceeai poziie
egal cu 1 */
bdi) Exemplul 2:
bdj) Fie declaraia char c=Z;
bdk)
bdl) bdm) Repre bdn) Actiune
Expresie zentare
bdo) bdp) 01011 bdq) nedeplasat
c 010
bdr) bds) 10110 bdt)deplasare la stanga cu 1
c<<1 100
bdu) bdv) 10100 bdw) deplasare la stanga cu
c<<4 000 4
bdx) bdy) 00000 bdz) deplasare la stanga cu
c<<15 000 15
bea)
beb) Chiar dac valoarea lui c se memoreaz pe un octet, ntr-o expresie
aceasta ia tipul int. Deci valoarea expresiilor c<<1, c<<4 i c<<15 se
memoreaz pe 2 octei. Operatorul de deplasare la dreapta >> nu este chiar
simetric cu <<. Pentru expresiile integrale fr semn, din stnga se va
deplasa 0, iar pentru cele cu semn 1. Presupunem c avem declaraiile:
bec) int a=1<<15; //intreg cu semn
bed) unsigned b=1<<15; //intreg fara semn
bee)
bef) beg) Reprezenta beh) Actiune
Expresie re
bei)a bej)10000000 00000000 bek) nedeplasat
bel)a>>3 bem) 11110000 ben) deplasare la
00000000 dreapta cu 3
beo) bep) 10000000 beq) nedeplasat
b 00000000
ber) bes) 00010000 bet)deplasare la dreapta cu 3
b>>3 00000000
beu)
bev) Ca valoare zecimal, a>>3 este 4096, iar b>>3 este 4096, lucru care
este n concordan cu noiunea de numr negativ i pozitiv din matematic.
bew) Observaie:
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bex) Dac operandul din dreapta a operatorului de deplasare este negativ
sau are o valoare care este egal sau depete numrul de bii folosii pentru
reprezentarea intern a operandului din stnga, atunci comportarea este nedefinit.
bey) Exemplul 3:
bez) Tabelul de mai jos ilustreaz regulile de preceden (+ este mai
prioritar) i asociativitatea (de la stnga la dreapta) referitoare la operatorii de
deplasare.
bfa) Presupunem c avem declaraiile unsigned a=1,b=2;
bfb)
bfc) E bfd) Expresi bfe) Repre bff) V
xpresie e echivalent zentare a
l
o
a
r
e
bfg) a bfh) (a<<b)> bfi) 00000000 bfj) 2
<<b>>1 >1 00000010
bfk) a bfl) (a<<(1+2))<<3 bfm) 00000 bfn)
<<1+2<< 000 01000000 64
3
bfo) a bfp) ((a+b)<< bfq) 000011 bfr) 3
+b<<12* (12*a))>>b 00 00000000 0
a>>b 7
2
bfs)
bft) Exemplul 4: Fie constanta 0u, o constant ntreag de tip unsigned care se
reprezint pe 16 bii, deci este practic reprezentat ca 16 de 0. Operaia ~(0u)
neag cei 16 bii de 0 care vor lua valoarea 1, deci se va obine valoarea 216-
1=65535.
bfu)Exemplul 5: Presupunem c avem declaraiile i iniializrile:
bfv) int a=3333,b=7777;
bfw)
bfx) Expr bfy) Reprezentare bfz) V
esie aloare
bga) a bgb) 00001101 00000101 bgc) 3
333
bgd) b bge) 00011110 01100001 bgf) 7
777
bgg) a & bgh) 00001100 00000001 bgi) 3
b 073
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bgj) a ^ bgk) 00010011 01100100 bgl) 4
b 964
bgm) a | bgn) 00011111 01100101 bgo) 8
b 037
bgp) ~(a bgq) 11100000 10011010 bgr) -
| b) 8038
bgs) (~a bgt) 11100000 10011010 bgu) -
& ~b) 8038
bgv)
bgw) Exemplul 6: Operatorii | i & pot fi folosii pentru a seta(face 1) sau
terge (face 0) anumite cmpuri de bii.
bgx) (k&1<<j)>>j ; /* determin valoarea bitului de pe poziia j */
bgy) k=k&~(1<<j); /* seteaz bitul de pe poziia j la 0 */
bgz) k=k|1<<j; /* seteaz bitul de pe poziia j la 1 */
bha) k=k^1<<j; /* complementeaz bitul de pe poziia j */
bhb) Exemplul 7: Programul determin numrul format prin extragerea a
n bii consecutivi dintr-un numr dat x ncepnd cu poziia p.
bhc) #include<stdio.h>
bhd) void main()
bhe) { int n,p,x;
bhf) printf(numarul : ); scanf(%d,&x);
bhg) printf(numarul de biti : );
scanf(%d,&n);
bhh) printf(pozitia : ); scanf(%d,&p);
bhi) printf(numarul este : %d,
(x>>p)&~(~0<<n));
bhj) }
bhk) n partea stng a operatorului & se elimin primii p bii prin
deplasarea la dreapta. Pentru a extrage cei n bii, se realizeaz n partea
dreapt un filtru, setnd primii n bii pe 1 i tergndu-i pe ceilali.
bhl) Exemplul 8:
bhm) O masc este o constant sau o variabil folosit pentru
extragerea biilor dorii dintr-o alt variabil sau expresie. Din moment ce
constanta int 1 are reprezentarea pe bii 000000000 00000001, aceasta
poate fi folosit pentru determinarea bitului cel mai nesemnificativ dintr-o
expresie int folosind o construcie de forma expresie & 1. Fie declaraia
bhn) int j;
bho) atunci expresia j&1 are valoarea 0 dac j este par i valoarea 1, dac
j este impar.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bhp) Dac dorim s gsim valoarea unui anume bit dintr-o
expresie, putem folosi o masc care are 1 n acea poziie i 0 n rest. De
exemplu, putem folosi expresia 1<<2 pentru a vedea al treilea bit (numrnd
de la dreapta). Expresia
bhq) (v&(1<<2))
bhr)are valoarea 1 sau 0 dup cum este al treilea bit din v.
bhs) Alt exemplu de masc este valoarea constant 255 (adic 28-
1). Ea are reprezentarea 00000000 11111111. Deoarece doar octetul din
dreapta este 1, atunci expresia v &255 va ntoarce o valoare egal cu octetul
din dreapta al variabilei v. Spunem c 255 este o masc pentru octetul din
dreapta.
bht)Exemplul 9: Un caz concret de utilizare a operaiilor la nivel de bit este cel al
reprezentrii mulimilor de valori. Astfel, s presupunem c dorim s inem
evidena literelor majuscule dintr-un ir de caractere introduse de la consol.
n acest scop se poate folosi cte un singur bit pentru a codifica absena (0)
sau prezena (1) fiecrei litere. Deoarece alfabetul latin este format din 26
litere, pentru a pstra evidena tuturor majusculelor trebuie s folosim o
variabil (m) de tip long (32 de bii). Dintre cei 32 de bii din reprezentarea
variabilei vom utiliza numai 26, informaia referitoare la o liter oarecare x fiind
pstrat n bitul din poziia Z-x. n absena majusculelor, toi biii fiind 0,
condiia de mulime vid se exprim sub forma !m. Includerea n mulime a
unei majuscule x se realizeaz prin intermediul atribuirii:
bhu) m=m|(1L<<Z-x)
bhv) Se remarc utilizarea constantei 1L, de tip long. Dac n locul ei s-ar
fi utilizat constanta 1 (implicit de tipul int ), atunci informaiile referitoare la
primele 10 litere din alfabet nu ar fi fost actualizate, deoarece rezultatul
deplasrii la stnga, cu mai mult de 15 bii, a unei valori de tip int este nul.
Verificarea prezenei n mulime a caracterului x se poate realiza n
urmtoarele dou variante :
bhw) m&(1L<<Z-x) sau (m>>Z-x)&1
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bjg) Expresia de asignare
bjh) j*=k+
bji) este echivalent cu
bjj) j=j*(k+3);
bjk) i nu cu
bjl) j=j*k+3;
bjm) Exemplul 10:
bjn) Fie declaraiile:
bjo) int i=1,j=2,k=3,m=4;
bjp)
bjq) bjr) Expresie bjs) Expresie bjt)V
Expre echivalenta echivalenta a
si l
e o
a
r
e
bju) bjv) i+=(j+k) bjw) i=(i+(j+k)) bjx)6
i+=j+
k
bjy) bjz) j*=(k=(m+5)) bka) j=(j*(k=(m+5) bkb)1
j*=k= )) 8
m+
5
bkc)
bkd)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bkm)/* se determin partea ntreag a lui radical din n
*/
bkn) Exemplul 2:
bko) int a, b;
bkp) c=(double) a/b;
bkq) /* rezultatul real al mpririi a 2 numere ntregi
*/
bkr)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bll) 4.11 Operatorul condiional
blm)
bln) Este un operator cu trei operanzi. Se folosete pentru situaiile n care
exist dou variante de obinere a rezultatului, n funcie de ndeplinirea unei
condiii. Are sintaxa :
blo) expr_cond ? rezultat_1 : rezultat_
blp) Semnificaia este :
blq) daca expr_cond atun
rezultat=rezultat_1
blr) altfel rezultat=rezultat_2
bls)Exemplul 1:
blt) double max,a,b;
blu)max=(a>b)?a:b; /* se determin maximul a dou numere
*/
blv)Exemplul 2:
blw) unsigned k;
blx) printf(%s,k?diferit de 0 :egal cu 0);
bly)/* se afieaz dac numrul k este sau nu diferit de
0 */
blz) Exemplul 3 : Determinarea maximului a trei numere.
bma) max=(a>b)?(a>c?a:c):(b>c?b:c);
bmb) Exemplul 4 : Tiprete relaia dintre dou valori ntregi.
bmc)printf(%d %c %d\n,a,(a>b)?>:(a<b)?<:=,b);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bnq) 7. Fie declaraia : boi) 10. Ce valoare vor avea
unsigned n; variabilele x si y dup
bnr)Care din expresiile urmtoare secvena de instruciuni ?
determin octetul inferior al boj) int x=7,y;
variabilei n ? bok) y=x<<=2;
bns) a) n%256 bol) a) 32 b) 28
b) n>>4 c) 64
bnt) c) n & 0xFF bom)
d) (n<<4)>>4 bon) 11. S se determine
bnu) e) n>>8 care din urmtoarele expresii
f) (n<<8)>>8 sunt corecte :
bnv) a) z=x++==4||y--<5;
bnw) 8. Fie definiiile : b) a=x==y==z;
bnx) unsigned boo)
m=0xF0F,n=0xF0F0; bop) 12. Realizai cu
bny) char ajutorul operatorului
format[]="\n n=%4x"; condiional "?" urmatoarele
bnz) S se gseasc care operaii :
vor fi valorile afiate dup a) determinarea valorii
urmtoarele operaii : absolute a unui numr x
a) printf(format,m); b) determinarea minimului n
b) printf(format,n); valoare absolut a dou
c) printf(format,~m); numere
d) printf(format,~n); c) determinarea maximului a
e) printf(format m|n); trei numere
f) printf(format,m&n); boq)
boa) g) bor)13. Ce face urmtorul program
printf(format,m^n); ?
bob) bos) #include<stdio.h
boc) 9. Evaluai rezultatul i >
corectitudinea urmtoarelor bot) main()
secvene : bou) { int i,j;
bod) int bov) scanf("%d% d"
i=1,j=2,k=-7; ,&i ,&j);
boe) double bow) printf("\n i=
x=0.0,y=2.5; %d , j=%d",
a) -i-5*j>=k+1 b) 3<j<5 box) i,
bof) c) i+j+k==-2*j j);
d) x/!!y boy) i=i-j , j=j+i
bog) e) x&&i||j-3 , i=j-i;
boh) boz) printf("\n i=
%d , j=%d",
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bpa) i, j); bpr) z=x/(x+y)
bpb) } altfel z=0
a) realizeaz un calcul bps)
algebric oarecare bpt)17. S se transcrie sub form
b) adun valorile absolute de expresie de atribuire :
ale lui i i j a) y=|2x+10|
c) interschimb valorile b) a=max(x,y,z)
varia-bilelor i i j c) dac x>y si x>z atunci
bpc) u=v, altfel u=v/2
bpd) 14. Care din cele trei d) dac x>y sau x>z,atunci
expresii sunt echivalente ntre p=a+b,altfel p=a-b
ele ? e) dac nici una din
a) 1<<n+1; condiiile i>j, i>k, i>n
b) 1<<(n+1) nu are loc, atunci x=a,
bpe) c) (1<<n)+1 altfel x=b
bpf) f) dac c are ca valoare
bpg) 15. Fie expresia : codul ASCII al unui
caracter alb, atunci i se
bph) (int) mrete cu 1, altfel se
(sqrt(n)) micoreaz cu 1
bpi) Are importan folosirea g) dac a>b>1 i a<10,
atunci x=a/b, altfel
perechii de paranteze rotunde
x=100
pentru tipul int ? Dar pentru
h) dac c are ca valoare un
sqrt(n) ?
cod diferit de codul
bpj)
caracterelor albe, atunci
bpk) 16. S se transcrie
i=x+y, altfel i=x-y
sub form de expresii de
i) dac valorile variabi-
atribuire expresiile de mai jos :
lelor a,b si c pot repre-
bpl) a) y=2x3-8x2+7x-1
zenta lungimile laturilor
unui triunghi, atunci x
bpm) b) y=(ax+b)/ are ca valoare perimetrul
(cx+d) acestui triunghi, altfel
bpn) c) a=max(x+y,x- are valoarea 0.
y) bpu)
bpo) d) bpv) 18. Fie declaraia :
m=max(3x2+1,6x-20)
int x,i,j; S se scrie o
bpp) e) x=1, 5a3-2,
2
8a +3, 7a-1 expresie care are ca valoare
bpq) f) x=a*b*c-(a-b) ntregul format cu j bii din x ,
(a-c)+(b-c) ncepnd cu al i-lea bit.
bpw)
g) dac (x+y)!=0 atunci
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bpx) 19. double expresia b>>3. Efectul acestei
x=1/2.0+1/2; expresii este :
bpy) printf(x= a) 1FF2
%.2f\n,x); b) valoarea binar a varia-
bpz) Ce se va tipri dup bilei b
execuia codului de mai sus ? bqs) c) 0xFF13 d)
a) x=0.00 b) x=0.25 0x1FE2
bqa) c) x=0.50 bqt)
d) x=0.75 bqu) 24. Se dau variabilele
bqb) de tip ntreg
bqc) 20. Care va fi valoarea bqv) a=0x125,b=0455,c
lui i dup execuia =293,d=0xAF,x,y i
urmtoarelor instruciuni : expresia
bqd) i=4; i=i?18:2; bqw) x=y=(a==b&a==c)^
a) 4 b) 18 d.
bqe) c) 2 bqx) Variabilele x si y au
d) 9 valoarea :
bqf) a) AF b) 0257
bqg) 21. Se declar bqy) c) 10101111
variabila d) 0xAF
bqh) unsigned bqz)
int a=0x3FF bra)25. Fie expresia de mai jos :
bqi) Care este valoarea expresiei brb) (x>-1) && !
a>>3 ? (x>1)||(x>=5)
a) 3FF b) 0xBF brc)Intervalul selectat este :
bqj) c) 0x7F a) x (-1,1] [5, )
d) 0x3FC
b) x (- ,-1) [1, )
bqk)
c) x (- ,-1) (1,5)
bql) 22. Se dau
bqm) int d) x [-1,1] [5, )
a=0,b=1,c=2; brd)
bqn) Valoarea variabilei cp bre)26. Care este intervalul descris
din expresia: de expresia logic de mai jos ?
bqo) cp=rez=a+b+c> brf) (x<=-2)||
c&&b*c<a+b*c este : brg) (x>-1)&&!
a) 1 b) 0 (x>=1)||(x>5)
bqp) c) 2 d) a) x (- , -2] (-1,1]
1.5 [5, )
bqq) b) x (- ,-2] [-1,1]
bqr)23. Se d variabila b=0xFF10 (5, )
de tip unsigned int i
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
c) x(- ,-2] (-1,1] [5, bsb) int
) x=1*2+4/4+3%5;
d) x (- ,-2] (-1,1) bsc) Valoarea lui x este :
(5, ) bsd) a) se va genera
brh) eroare
bri) 27. Care din urmtorii bse) b) 3 c) 6
operatori relaionali este d) 5
invalid ? bsf)
a) == b) <> c) < d) > bsg) 33. Presupunnd
brj) urmtoarea secven de cod :
brk)28. Care din urmtorii bsh) int a=5,b=2;
operatori are prioritatea cea bsi) float c=a/b;
mai mic ? bsj) Care va fi valoarea lui c ?
a) == b) + c) d) ! bsk) a) 2.5 b) 2
c) 3 d) 1
brl)
brm) 29. Dup execuia bsl)
secvenei de cod, ce valoare bsm) 34. Avem urmtorul
va avea variabila z ? program :
brn) int z; bsn) int main()
bro) int x=5; bso) { float x, y,
brp) int y=-10; z;
brq) z:=x--y; bsp) x=1.3;
a) 10 b) 5 c) 5 d) 15 bsq) y=1.2; z=x
%y;
brr)
bsr) return 0;
brs)30. Ce rezultat va produce
bss) }
operaia :
brt) 0xB & 0x5 bst) La sfritul programului
bru) a) 0xE variabila z va avea valoarea :
b) 0xF bsu) a) 0.1 b) 0
brv) c) 0x1 c) 1
d) 0x8 bsv) d) programul
genereaz
brw)
bsw) eroare la
brx)31. Fie relaia 4/5|3+4%5&3.
compilare
Care este rezultatul evalurii ei
bsx)
?
bry) a) 4 b) 3 c) bsy) 35. Fie secvena :
bsz) double
1 d) 1
x,y;
brz) bta) .
bsa) 32. Fie secvena de btb) x=9;
cod : y=3(x-10);
btc) ..
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
btd)Care afirmaie este a) x b) y c) z d) u
adevarat : bty) e) nici una
bte) a) y=-3 btz)
b) y=3 bua) 38. Se consider
btf) c) eroare la variabilele ntregi x,y i z, fiind
compilare deoarece cunoscute valorile x=4 i
lipsete operator y=2. Care dintre expresiile de
btg) d) eroare la mai jos are valoarea 0 ?
compilare deoarece nu a) x+y>x%y+1
se poate scdea un b) z=(x-y!=0)
double bub) c) x-2*y=0
bth)
bti) 36. Urmrii secvena de mai buc) d) !x
jos i precizai valoarea bud) e) x && y
variabilei y: bue)
btj) int a, b=3;
buf)39. tiind c a, b, c, d, x sunt
btk) int x=2;
variabile reale cu a<=b i
btl) int z=2*b+x;
a) 2 b) 3 c) 4 d) 5 c<=d, scriei sub form de
btm) e) secvena este expresie : x[a, b] sau
eronat x[c, d].
btn) a)
bto)37. tiind c n conformitate cu bug) (x>=a||
standardul ASCII literele mari x<=b)&&(x>=c||x<=d)
au codurile succesive b)
ncepnd cu 65, precizai care buh) ((x>=a)&&(x<=b))
dintre variabilele x, y, z i u ||((x>=c)&&
vor avea valoarea 2 la finele bui) (x<=d))
execuiei programului de mai buj) c) (!(x<a)&&!
jos. (x>b))||(!(x<c)&&
btp) void main() buk) !(x>d))
btq) { bul) d) ((x>=a)||
btr) int x=-3, (x<=b))&&((x>=c)||
y=1, z=2, u; bum) (x<=d))
bts) x++; e)
btt) y+=2; bun) (x>=a && x<=b)
btu) z- || (x>=c && x<=d)
=1+sqrt(y+2); buo)
btv) // radical bup) 40. Fie declaraiile de
de ordin doi variabile:
btw) u=A-C; buq) int x=4,
btx) } z=13;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bur) float z; dac numrul y este
bus) Care dintre pozitiv, atunci x ia
instruciunile de mai jos nu valoarea lui a, n caz
atribuie corect valoarea 8.5 contrar x ia valoarea
variabilei z? lui b.
but) a) z=(x+y)/2.; bvo) a) x=(y>0) ? a :
b;
buu) b) bvp) b) x=y>0 ? b: a;
z=((float)x+y)/2:
buv) c) z=(x+y.)/2; bvq) c) x=!y>0 ? b :
a;
buw) d) z=(x+y)/ bvr) d) y>0 ? x=a
(float)2; :x=b;
bux) e) z=(float) bvs) e) !(y>0) ?
(x+y)/2; x=b : x=a;
buy) bvt)
buz) 41. Ce afieaz bvu) 43. Ce valoare
programul urmtor, dac afieaz programul urmtor ?
valoarea citit de la tastatur bvv) #include<stdio.h
este 2 ? >
bva) #include<stdio.h bvw) void main()
> bvx) {
bvb) void main() bvy) int x=5, y;
bvc) { bvz) y=(sizeof(x
bvd) int x,y,z; -1)==
bve) bwa) sizeof(int)
scanf(%d, &x); ) ?
bvf) y=--x; bwb) sizeof(
bvg) y+=3; x) :
bvh) z=x-2*y++; bwc) sizeof(
bvi) 3);
printf(%d, z++); bwd) printf(%d
bvj) } , y);
bvk) a) 9 b) 8 bwe) }
c) 7 bwf) a) 3 b) 1 c)
bvl) d) 6 e) 5 2 d) 4
bvm) bwg) e) programul
bvn) 42. Fie trei variabile este eronat
ntregi a, b, x. Precizai care bwh)
dintre expresiile condiionale bwi) 44. Ce valori va afia
de mai jos nu este o programul urmtor ?
transcriere corect a enunului:
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
bwj) #include<stdio.h bxi) 46. Fie variabilele ntregi
> a=1,b=2,c=3,d=4. Care
bwk) void main() dintre construciile de mai jos
bwl) { sunt expresii scrise corect, cu
bwm) int a=10, b=6, valoarea 0 ?
c=4, d; bxj) a) !d b) a+b<d
bwn) d=(c=a-6, a=b c) a*b+c
%c, b+=a, bxk) d) a=b<c e)
bwo) a/2); (a<b)!=(b<c)
bwp) printf(\n%d bxl)
%d %d %d, bxm) 47. Pentru care dintre
bwq) seturile de valori ale
a,b,c,d); variabilelor x, y, z de mai jos
bwr) } expresia
bws) a) 0 16 6 5 bxn) (x<y)<((z!
b) 2 8 4 1 =x)<((z-y)<x)) are
bwt) c) 4 2 8 1
valoarea 1?
d) 6 0 16 5 bxo) a) x=3; y=5; z=4
bwu) e) alte valori
bwv)
bxp) b) x=4; y=3; z=4
bww) 45. Ce valoare
bxq) c) x=3; y=4; z=3
afieaz programul de mai
jos ?
bwx) #include<stdio.h bxr) d) x=5; y=4; z=3
> bxs) e) x=5; y=5; z=5
bwy) void main() bxt)
bwz) { bxu) 48. Care dintre
bxa) int a=3, urmtoarele expresii au
b=2, n=4, x; valoarea 1 dac i numai dac
bxb) x=(a<<n) + valorile variabilelor ntregi x i
(a&b) + y sunt numere pare ?
bxc) bxv) a) x-y==2
(n|b); b) x*y%4==0
bxd) bxw) c) (x+y)%2==0
printf(%d, x); d) y%x==2
bxe) } bxx) e) (x%2==0)&&(y
bxf) a) 2 b) 8 c) %2==0)
51 d) 56 bxy)
bxg) e) programul bxz) 49. Care dintre
este greit urmtoarele expresii sunt
bxh) adevrate dac i numai dac
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
valorile variabilelor x i y sunt dac x nu aparine
numere naturale consecutive ? [a,b] , atunci x ia
bya) a) x-y==1 valoarea lui a, n caz
byb) b) contrar x ia valoarea
(x==1)&&(y==2) lui b.
byc) c) (x-y==1)&&(y- a) x=((x<a)||(x>b))? a : b;
x==1) b) x=(x<a||x>b)? a : b;
byd) d) y==x+1 c) x=((x<a)&&(x>b))? a : b;
bye) e) (x-y==1)||(y- d) x=(x<a)||(x>b)? b : a;
x==1) e) (x<a)||(x>b))? (x=a) :
byf) bys)
byg) 50. Se consider (x=b);
urmtoarele declaraii de byt)
variabile : int a,b,e; byu) 53. tiind c n
float c,d;. Care dintre standardele ASCII caracterele
instruciunile de mai jos sunt liter mare au codurile
incorecte? succesive ncepnd cu 65,
byh) a) a=a*b; b) deducei ce valoare va afia
e=a<c; programul urmtor.
byi) c) b=a+a/b; d) byv) #include<stdio.h
d=(a+b)/2; >
byj) e) c*d=a-b; byw) void main()
byk) 51. Fie variabilele byx) {
x,y,z de tipul int, fiind byy) int
cunoscute valorile iniiale x,y,z,p;
x=3, y=5. Care dintre byz) char m,n;
instruciunile de mai jos trebuie bza) m=C;
executat astfel nct, dup n=A;
execuie, valoarea variabilei z bzb) x=m;
s fie 21? y=2*m-n; z=3;
byl) a) z=2*x+3*y--; bzc) p=x<y?(y<z
? z:y):
bym) b) z=2*x+3*--y; bzd)
byn) c) z=2*x--+3*y; (z<x?x:z);
bze) printf(\n
%d, p);
byo) d) z=2*--x+3*y; bzf) }
byp) e) z=2*x+3*y; bzg) a) 1 b) 3 c)
byq) 69 d) 67 e) 0
byr)52. Fie trei variabile ntregi bzh)
a,b,x. Scriei cu ajutorul unei bzi) 54. tiind c valorile de tipul
expresii condiionale enunul int se memoreaz pe 2 octei,
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
iar cele de tipul float pe 4 cah) m
octei, de cte ori va afia ,n,p);
programul urmtor valoarea 2? cai) }
bzj) #include<stdio.h caj) a) 10 18 16
> b) 11 18 18
bzk) void main() cak) c) 10 18 18
bzl) { d) 11 18 17
bzm) int x; char c; cal) e) 10 18 17
bzn) x=A; cam)
bzo) printf(%d, can) 56. Ce valoare putem
sizeof(x)); introduce la citirea variabilei y,
bzp) c=A; astfel nct programul de mai
bzq) printf(%d,size jos s tipreasc 1 ?
of(c)); cao) #include<stdio.h
bzr) printf(%d,size >
of(float)- cap) void main()
bzs) caq) {
2); car) int x=2, y,
bzt) x=sizeof(int); z;
x=++x/2; cas) scanf(%d,
bzu) printf(%d, &y);
x==2); cat) z=y+3*x++;
bzv) } cau) printf(\n%d,
bzw) a) nici o data cav) (z
b) o data %2==0&&x>=1)?1:0);
bzx) c) de 2 ori caw) }
d) de 3 ori cax) a) 2 b) 3
bzy) e) de 4 ori c) 4
bzz) cay) d) orice valoare
caa) 55. Ce valori afieaz par
programul urmtor ? caz) e) orice valoare
cab) #include<stdio.h impar
> cba)
cac) void main() cbb) 57. Fie variabilele
cad) { a,b,c de tipul int, cu valorile
cae) int a=11, b=5, c=7. Care dintre
x=10,y=6, m, n, p; expresiile de mai jos are
caf) n=(m=x++, valoarea 1?
y++, p=x+y); cbc) a) (a|~b)&1 b)
cag) printf(\n (~a&b)|1
%d %d %d, cbd) c) (a&~b)|1 d)
(a&b)|~1
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
f) (~a|b)&1 cbj) char
cbe) c=d;
cbf) 58. Precizai valoarea pe care cbk) int n=99;
o va avea variabila c n urma cbl) c=n+1=c-1;
execuiei programului de mai cbm) }
jos: cbn) a) d b)c
cbg) #include<stdio.h c) b
> cbo) d) NULL
cbh) void main() cbp) e) atribuirea
cbi) { este greit
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cdt) Dac declaraiile sunt prezente, atunci ele definesc variabile care sunt definite
att timp ct controlul programului se afl la o instruciune din compunerea
instruciunii compuse.
cdu) Exemplu : Presupunem c ntr-un anumit punct al programului este
necesar s se permute valorile variabilelor ntregi a i b. Aceasta se poate
realiza astfel :
cdv) { int t;
cdw) t=a;a=b;b=t;
cdx) }
cdy) Variabila t este definit din momentul n care controlul programului
ajunge la prima instruciune din instruciunea compus (t=a;). Dup execuia
ultimei instruciuni a instruciunii compuse, variabila t nu mai este definit (nu
mai ocup memorie).
cdz) Instruciunea compus se utilizeaz unde este necesar
prezena unei instruciuni, dar procesul de calcul din punctul respectiv este
mai complex i se exprim prin mai multe instruciuni. n acest caz
instruciunile respective se includ ntre acolade pentru a forma o instruciune
compus. Acest procedeu de a forma o instruciune compus din mai multe
instruciuni se utilizeaz frecvent n construirea structurilor alternative i
ciclice.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
situaie cnd instruciunile din compunerea lui if definesc ele nsele un alt
mod de continuare a execuiei programului.
cem) Deoarece o instruciune compus este considerat ca fiind un
caz particular de instruciune, rezult c instruciunile din compunerea lui if
pot fi instruciuni compuse. De asemenea, instruciunile respective pot fi chiar
instruciuni if. n acest caz se spune c instruciunile if sunt imbricate.
cen) Exemplul 1: Se d funcia : y=3x2+2x-10, pentru x>0 i
y=5x+10, pentru x<=0. S se scrie un program care citete valoarea lui x i
afieaz valoarea lui y.
ceo) #include<stdio.h>
cep) #include<conio.h>
ceq) void main()
cer) { float x,y;
ces) clrscr();
cet) scanf("%f",&x);
ceu) if(x>0)
cev) y=3*x*x+2*x-10;
cew) else
cex) y=5*x+10;
cey) printf("x=%f\ty=%f\n",x,y);
cez) getch();
cfa) }
cfb) Exemplul 2: S se scrie un program care citete valoarea lui x, calculeaz
i afieaz valoarea lui y definit ca mai jos :
cfc) y=4x3+5x2-2x+1 , pentru x<0
cfd) y=100 , pentru x=0
cfe) y=2x2+8x-1 , pentru x>0
cff)
cfg) #include<stdio.h>
cfh) #include<conio.h>
cfi) void main()
cfj) { float x,y,a;
cfk) clrscr();
cfl) scanf("%f",&x);
cfm) a=x*x;
cfn) if(x<0)
cfo) y=4*x*a+5*a-2*x+1;
cfp) else
cfq) if(!x)
cfr) y=100;
cfs) else
cft) y=2*a+8*x-1;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cfu) printf("x=%f\ty=%f\n",x,y);
cfv) getch();
cfw) }
cfx) Exemplul 3: S se scrie un program care citete valorile variabilelor
nentregi a i b, calculeaz rdcina ecuaiei : ax+b=0 i afieaz rezultatul.
cfy) #include<stdio.h>
cfz) #include<conio.h>
cga) void main()
cgb) { double a,b;
cgc) clrscr();
cgd) if(scanf("%lf %lf",&a,&b)!=2)
cge) /* valideaz numrul coeficienilor reali citii
*/
cgf) printf("coeficienti eronati\n");
cgg) else
cgh) if(a)
cgi) printf("a=%g\tb=%g\tx=%g\n",a,b,-b/a);
cgj) else
cgk) if(!b)
cgl) printf("ecuatie nedeterminata\n");
cgm) else
cgn) printf("ecuatia nu are solutie\n");
cgo) getch();
cgp) }
cgq) Programul de mai sus conine o instruciune if imbricat. Pentru a
mri claritatea programelor se obinuiete s se decaleze spre dreapta (cu un
tabulator) instruciunile din compunerea instruciunii if. n acest program s-a
realizat test relativ la valorile tastate pentru a i b. Reamintim c funcia
scanf() returneaz numrul argumentelor citite corect de la tastatur. Acest
numr se folosete uzual pentru a valida corectitudinea citirii datelor de
intrare. Astfel, dac funcia scanf() nu returneaz valoarea 2, nseamn c nu
s-au tastat dou numere de la terminal. De aceea, n astfel de situaii se
afieaz mesajul coeficieni eronai.
cgr)Exemplul 4: S se scrie un program care citete coeficienii a,b,c,d,e,f ai
unui sistem de dou ecuaii lineare cu dou necunoscute, determin i
afieaz soluia acestuia atunci cnd are o soluie unic.
cgs) #include<stdio.h>
cgt) #include<conio.h>
cgu) void main()
cgv) { double a,b,c,d,e,f,x,y,det1,det2,det;
cgw) clrscr();
cgx) //validarea citirii datelor de intrare
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cgy) if(scanf("%lf%lf%lf%lf%lf
%lf",&a,&b,&c,&d,&e,&f)!=6)
cgz) printf("coeficienti eronati\n");
cha) else
chb) if(!(det=a*e-b*d))
chc) printf("sistemul nu este determinat\n");
chd) else
che) { det1=c*e-b*f;
chf) det2=a*f-c*d;
chg) x=det1/det;
chh) y=det2/det;
chi) printf("x=%g\ty=%g\n",x,y);
chj) }
chk) getch();
chl) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cib) if(scanf("%lf",&a)!=1)
cic) { printf("coeficientul lui x patrat eronat\n");
cid) exit(1); /* terminare la eroare*/
cie) }
cif) printf("coeficientul lui x : ");
cig) if(scanf("%lf",&b)!=1)
cih) { printf("coeficientul lui x eronat\n");
cii) exit(1);
cij) }
cik) printf("termenul liber : ");
cil) if(scanf("%lf",&c)!=1)
cim) { printf("termenul liber eronat\n");
cin) exit(1);
cio) }
cip) // afieaz coeficienii citii
ciq) printf("a=%g\tb=%g\tc=%g\n",a,b,c);
cir) if(!a && !b && !c)
cis) { printf("ecuatie nedeterminata\n");
cit) exit(0); /* terminare fr erori*/
ciu) }
civ) if(!a&&!b)
ciw) { printf("ecuatia nu are solutie\n");
cix) exit(0);
ciy) }
ciz) if(!a)
cja) { printf("ecuatie de gradul 1\n");
cjb) printf("x=%g\n",-c/b);
cjc) exit(0);
cjd) }
cje) delta=b*b-4*a*c;
cjf) d=2*a;
cjg) if(delta>0)
cjh) { printf("ecuatia are doua radacini reale si
cji) distincte\n");
cjj) delta=sqrt(delta);
cjk) printf("x1=%g\tx2=%g\n",(-b+delta)/d,
cjl) (-b-delta)/d);
cjm) exit(0);
cjn) }
cjo) if(!delta)
cjp) { printf("ecuatia are radacina dubla\n");
cjq) printf("x=%g\n",-b/d);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cjr) exit(0);
cjs) }
cjt) printf("radacini complexe\n");
cju) delta=sqrt(-delta)/d;
cjv) d=-b/d;
cjw) printf("x1=%g+i(%g)\n",d,delta);
cjx) printf("x2=%g-i(%g)\n",d,delta);
cjy) getch();
cjz) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ckj) #include<conio.h>
ckk) void main()
ckl) { int x;
ckm) clrscr();
ckn) x=1;
cko) while(x<=10)
ckp) { printf("x=%d\tp(x)=%d\n",x,3*x*x-7*x-10);
ckq) x++;
ckr) }
cks) getch();
ckt) }
cku) Exemplul 2: S se scrie un program care citete un ir de ntregi separai
prin caractere albe i afieaz suma lor. Dup ultimul numr se va tasta un
caracter alb urmat de un caracter nenumeric (de exemplu, caracterul sfrit
de fiier <Ctrl>+Z, o liter, etc.), iar dup aceea se va aciona tasta Enter.
ckv) #include<stdio.h>
ckw) #include<conio.h>
ckx) void main()
cky) { int i,s=0;
ckz) clrscr();
cla) while(scanf("%d",&i)==1) s+=i;
clb) printf("suma=%d\n",s);
clc) getch(); }
cld) Exemplul 3: S se scrie un program care citete un ntreg n[0,170],
calculeaz i afieaz pe n!. Avem: n!=1*2*3*..*n , pentru n >0 i 0!=1 , prin
definiie.
cle) #include<stdio.h>
clf) #include<conio.h>
clg) #include<stdlib.h>
clh) void main()
cli) { int n,i;
clj) double f;
clk) //n! este o valoare f.mare care nu poate fi
memorat
cll) //ntr-un ntreg
clm) clrscr(); printf("n=");
cln) //validarea datelor de intrare
clo) if(scanf("%d",&n)!=1)
clp) { printf("nu s-a tastat un intreg\n");
clq) exit(1);
clr) }
cls) if(n<0 || n>170)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
clt) { printf("n nu apartine intervalului
[0,170]\n");
clu) exit(1);
clv) }
clw) f=1.0; i=2;
clx) while(i<=n) f*=i++;
cly) printf("n=%d\tn!=%g\n",n,f);
clz) //formatul %g va tipri f fr zecimalele
cma) //nesemnificative, deci ca un ntreg
cmb) getch();
cmc) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cox)Realizeaz structura ciclic condiionat posterior. Aceast instruciune
poate fi realizat cu ajutorul celorlalte instruciuni definite pn n prezent. Cu toate
acestea, prezena ei n limbaj mrete flexibilitatea n programare. Sintaxa ei este :
coy) do
coz) instruciune /* corpul ciclului */
cpa) while(expresie);
cpb)Instruciunea se execut n felul urmtor : se execut instruciune, se
evalueaz expresie; dac aceasta are o valoare diferit de 0 (true) atunci se revine la
execuia instruciunii, altfel (expresia are valoarea 0) se trece n secven, la
instruciunea urmtoare instruciunii do-while.
cpc) Se observ c n cazul aces
instruciuni nti se execut instruciune i apoi se testeaz condiia de
repetare a execuiei ei. Instruciunea do-while este echivalent cu secvena :
cpd) instructiune;
cpe) while(expresie) instruciune;
cpf) n cazul instruciunii do-while corpul ciclului se execut cel puin o dat, spre
deosebire de cazul instruciunii while i for, cnd este posibil s nu execute
niciodat.
cpg) Exemplul 1: S se scrie un program care afieaz factorii primi ai unui
numr ntreg nenegativ introdus de la tastatur.
cph) #include<stdio.h>
cpi) #include<conio.h>
cpj) void main()
cpk) { unsigned n,d=2,e;
cpl) clrscr();
cpm) printf("\nIntroduceti numarul : ");
cpn) scanf("%u",&n);
cpo) printf(" Desc. in factori primi este :\n");
cpp) do
cpq) { e=0; //puterea factorului d
cpr) while(!(n%d))
cps) { n=n/d;
cpt) e++;
cpu) }
cpv) if(e)
cpw) printf("%d ^ %d\n",d,e);
cpx) //afiseaza factorul i puterea lui
cpy) d=d+((d==2) ?1:2);
cpz) //dac d=2,se trece la d=3, altfel se trece
la
cqa) //urmtorul factor impar cu d+2
cqb) }while(n>1);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cqc) getch();
cqd) }
cqe) Exemplul 2: Faptul c ciclul do execut ntotdeauna corpul ciclului
cel puin o dat face ca el s fie perfect pentru a valida rspunsurile
utilizatorului, spre exemplu n cazul procesrii opiunilor unui meniu.
Programul urmtor va repeta ciclul de citire a opiunii pn cnd utilizatorul va
introduce un rspuns valid:
cqf) #include<stdio.h>
cqg) #include<conio.h>
cqh) void main()
cqi) {
cqj) float a,b;
cqk) char ch;
cql)
cqm) clrscr();
cqn) printf(Doriti : \n);
cqo) printf(Adunare,Scadere,Multiplicare,Impartire
?
cqp) \n
);
cqq) //validarea opiunii utilizatorului
cqr) do{
cqs) printf(Introduceti prima litera : );
cqt) ch=getche();
cqu) printf(\n);
cqv) }while(ch!=A && ch!=S && ch!=M && ch!
=I);
cqw) //cnd utilizatorul a introdus opiunea
corect, se
cqx) //pot procesa opiunile din meniu
cqy) printf(Introduceti primul numar : );
cqz) scanf(%f,&a);
cra) printf(Introduceti al doilea numar : );
crb) scanf(%f,&b);
crc) if(ch==A)
crd) printf(%f,a+b);
cre) else if(ch==S)
crf) printf(%f,a-b);
crg) else if(ch==M)
crh) printf(%f,a*b);
cri) else if(b) printf(%f,a/b);
crj) getch();
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
crk) }
crl) Exemplul 3: Ciclul do este folositor n special cnd programul ateapt s
se produc un anumit eveniment. De exemplu, urmtorul program ateapt ca
utilizatorul s tasteze litera q. Programul conine o singur apelare a funciei
getche().
crm) #include<stdio.h>
crn) #include<conio.h>
cro) void main()
crp) {
crq) char ch;
crr) clrscr();
crs) do{
crt) ch=getche();
cru) } while(ch!=q);
crv) printf(\n am gasit pe q);
crw) getch();
crx) }
cry) Exemplul 4: Funcia kbhit() din header-ul conio.h este foarte folositoare
cnd dorim s permitem utilizatorului s ntrerup o rutin fr s l form s
rspund la un mesaj. De exemplu, programul urmtor afieaz o tabel cu
procentul 5% aplicat unor valori care se incrementeaz cu 20. Programul
continu s afieze tabela pn cnd utilizatorul apas o tast sau pn cnd
a fost atins valoarea maxim.
crz) #include<stdio.h>
csa) #include<conio.h>
csb) void main()
csc) { double amount;
csd) amount=20.0;
cse) printf(Apasati o tasta pentru stop.\n);
csf) do{
csg) printf(valoarea:%lf,procent:
%lf\n,amount
csh) ,amount*0.05);
csi) if(kbhit()) break;
csj) amount=amount+20;
csk) }while(amount<10000);
csl) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cso) Aceast instruciune se poate utiliza numai n corpul unui ciclu. Ea
permite abandonarea iteraiei curente. Sintaxa ei este : continue;. Efectul
instruciunii este urmtorul :
a) n corpul instruciunilor while i do-while
csp) La ntlnirea instruciunii continue se abandoneaz iteraia curent i
se trece la evaluarea expresiei care stabilete continuarea sau terminarea ciclului
respectiv (expresia inclus ntre paranteze rotunde i care urmeaz dup cuvntul
cheie while).
b) n corpul instruciunii for
csq) La ntlnirea instruciunii continue se abandoneaz iteraia curent i
se trece la execuia pasului de reiniializare.
csr) Instruciunea continue nu este obligatorie. Prezena ei mrete
flexibilitatea n scrierea programelor C. Ea conduce adesea la diminuarea
nivelurilor de imbricare ale instruciunilor if utilizate n corpul ciclurilor.
css) Exemplul 1: Instruciunea continue este opus instruciunii break.
Ea foreaz ca urmtoarea iteraie a ciclului s aib loc trecnd peste
instruciunile dintre ea i testul de condiie. De exemplu, urmtorul program nu
va afia nimic niciodat:
cst) #include<stdio.h>
csu) void main()
csv) {
csw) int x;
csx) for(x=0;x<100;x++)
csy) { continue;
csz) printf(%d,x);
cta) }
ctb) }
ctc) Instruciunea 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.
ctd) Exemplul 2: O bun utilizare a lui continue este aceea de a porni din nou o
secven de instruciuni atunci cnd apare o eroare. De exemplu, programul
urmtor calculeaz suma total a numerelor introduse de utilizator. nainte de
a aduna o valoare la suma total, el verific dac numrul a fost introdus
corect. Dac numrul nu a fost introdus corect, pornete din nou ciclul,
folosind instruciunea continue.
cte) #include<stdio.h>
ctf) #include<conio.h>
ctg) void main()
cth) {
cti) int i, total;
ctj) char ch;
ctk) clrscr();
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ctl) total=0;
ctm) do{
ctn) printf(numarul urmator(0 pentru stop):
);
cto) scanf(%d,&i);
ctp) printf(Este %d corect ? (Y/N) ,i);
ctq) ch=getche();
ctr) printf(\n);
cts) if(ch==N) continue;
ctt) //numr incorect,se reia citirea
ctu) total+=i; //numr corect,se adaug la
sum
ctv) }while(i); //citirea se ncheie la i=0
ctw) printf(Totalul este %d\n,total);
ctx) getch();
cty) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cur) printf("nu s-a tastat un intreg pozitiv\n");
cus) //valoare incorect, se reia citirea
cut) } while(1);
cuu) do
cuv) { printf("al doilea numar=");
cuw) if(scanf("%ld",&n)==1 && n>0) break;
cux) //valoarea citit este corect,ieim din
ciclul de
cuy) //citire
cuz) printf("nu s-a tastat un intreg pozitiv\n");
cva) //valoare incorect, se reia citirea
cvb)
cvc) } while(1);
cvd) a=m; b=n;
cve) do // algoritmul lui Euclid
cvf) { r=a%b;
cvg) if(r)
cvh) { a=b; b=r;}
cvi) }while(r);
cvj) printf("(%ld,%ld)=%ld\n",m,n,b);
cvk) getch();
cvl) }
cvm) Exemplul 2: Instruciunea break permite ieirea dintr-un ciclu, din oricare
punct din interiorul su. Cnd instruciunea break este ntlnit n interiorul
unui ciclu, acesta se va termina imediat, iar controlul va trece la instruciunea
ce urmeaz dup ciclu. De exemplu, programul urmtor afieaz numai
numerele de la 1 la 10.
cvn) #include<stdio.h>
cvo) #include<conio.h>
cvp) void main()
cvq) {
cvr) int i;
cvs) clrscr();
cvt) for(i=1;i<100;i++)
cvu) { printf(%d,i);
cvv) if(i==10) break;
cvw) //oprirea forta a ciclului la i=10
cvx) }
cvy) getch();
cvz) }
cwa) Exemplul 3: Instruciunea break poate fi folosit cu oricare din cele
trei cicluri ale limbajului. ntr-un ciclu pot exista oricte instruciuni break. n
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
general, se recomand ca instruciunea break s fie utilizat pentru scopuri
speciale i nu ca ieire normal din ciclu. Instruciunea break este utilizat n
cicluri n care o condiie special poate cauza oprirea imediat a ciclului. Spre
exemplu, n programul urmtor, apsarea unei taste poate opri execuia
programului:
cwb) #include<stdio.h>
cwc) #include<conio.h>
cwd) void main()
cwe) {
cwf) int i;
cwg) char ch;
cwh) clrscr();
cwi) for(i=1;i<10000;i++)
cwj) if(!(i%6))
cwk) { printf(%d Mai doriti ? (Y/N): ,i);
cwl) ch=getche();
cwm) if(ch==N) break;
cwn) //oprirea ciclului la cererea
utilizatorului
cwo) printf(\n);
cwp) }
cwq) getch();
cwr) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cxe) sir_n
cxf) break;
cxg) default: sir }
cxh) unde :
cxi) c1,c2,,cn sunt constante integrale
cxj) sir_1,sir_2,..sir_n,sir sunt succesiuni de instruciuni
cxk) Instruciunea switch cu formatul de mai sus se execut astfel :
Se evalueaz expresia dintre parantezele rotunde
Se compar pe rnd valoarea expresiei cu valorile constantelor c1,c2,,cn. Dac
valoarea expresiei coincide cu una din constante, s zicem cu ci, atunci se
execut secvena sir_i, apoi se trece la instruciunea urmtoare instruciunii
switch, adic la instruciunea aflat dup acolada nchis care termin
instruciunea. Dac valoarea respectiv nu coincide cu nici una din constantele
c1,c2,.cn, atunci se execut succesiunea de instruciuni sir din default i apoi
se trece la instruciunea urmtoare instruciunii switch.
cxl) Menionm c este posibil s nu se ajung la instruciunea urmtoare
instruciunii switch n cazul n care succesiunea de instruciuni selectat pentru
execuie (sir_i sau sir) va defini ea nsi un alt mod de continuare a execuiei
programului (de exemplu, execuia instruciunii de revenire dintr-o funcie, saltul la o
instruciune etichetat etc.). Succesiunile sir_1,sir_2,..,sir_n se numesc
alternativele instruciunii switch. Alternativa sir este opional, deci ntr-o instruciune
switch secvena default : sir poate fi absent. n acest caz, dac valoarea expresiei
nu coincide cu valoarea nici uneia dintre constantele c1,c2,.. ..cn, atunci instruciunea
switch nu are nici un efect i se trece la execuia instruciunii urmtoare. Instruciunea
switch de mai sus este echivalent cu urmtoarea instruciune if imbricat :
cxm) if(expresie==c1)
cxn) sir_1
cxo) else
cxp) if(expresie==c2)
cxq) sir_2
cxr) else
cxs) if(expresie==c3)
cxt) sir_3
cxu) else
cxv) if
cxw) ..
cxx) else
cxy) if(expresie==cn)
cxz) sir_n
cya) else
cyb) sir;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
cyc) Instruciunea break de la sfritul fiecrei alternative permite ca la
ntlnirea ei s se treac la execuia instruciunii urmtoare instruciunii switch. Se
obinuiete s se spun c instruciunea break permite ieirea din instruciunea
switch.
cyd) Instruciunea break poate fi utilizat numai n corpurile ciclurilor i n
alternativele instruciunii switch. Prezena ei la sfritul fiecrei alternative nu este
obligatorie. n cazul n care instruciunea break este absent la sfritul unei
alternative, dup execuia succesiunii de instruciuni din compunerea alternativei
respective se trece la execuia succesiunii de instruciuni din alternativa urmtoare a
aceleai instruciuni switch. Adic, dac o instruciune switch are formatul :
cye) switch(expresie)
cyf) { case c1:
cyg) sir_1
cyh) case c2:
cyi) sir_2
cyj) }
cyk) atunci ea este echivalent cu urmtoarea secven :
cyl) if(expresie==c1)
cym) { sir_1
cyn) sir_2
cyo) }else
cyp) if(expresie==c2)
cyq) sir_2;
cyr) Exemplul 1: Urmtorul program recunoate numerele 1,2,3 i 4 i afieaz
numele cifrei introduse.
cys) #include<stdio.h>
cyt) void main()
cyu) {
cyv) int i;
cyw) printf(Introduceti un intreg intre 1 si 4 :
);
cyx) scanf(%d,&i);
cyy) switch(i)
cyz) {
cza) case 1 : printf(unu); break;
czb) case 2 : printf(doi); break;
czc) case 3 : printf(trei); break;
czd) case 4 : printf(patru); break;
cze) default: printf(numar necunoscut);
czf) }
czg) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
czh) Exemplul 2: Instruciunile switch sunt deseori folosite pentru a
procesa comenzi meniu. De exemplu, programul urmtor:
czi) #include<stdio.h>
czj) #include<conio.h>
czk) void main()
czl) {
czm) float a,b;
czn) char ch;
czo) clrscr();
czp) printf(Doriti :\n);
czq) printf(Adunare,Scadere,Multiplicare,
czr) Impartire?\n);
czs) //validarea opiunii introduse
czt) do{
czu) printf(Introduceti prima litera : );
czv) ch=getche();
czw) printf(\n);
czx) }while(ch!=A && ch!=S && ch!=M && ch!
=I);
czy) printf(Introduceti primul numar : );
czz) scanf(%f,&a);
daa) printf(Introduceti al doilea numar : );
dab) scanf(%f,&b);
dac) //procesarea comenzii de meniu
dad) switch(ch)
dae) {
daf) case A: printf(%f,a+b);break;
dag) case S: printf(%f,a-b);break;
dah) case M: printf(%f,a*b);break;
dai) case I: if(b) printf(%f,a/b);break;
daj) }
dak) getch();
dal) }
dam) Exemplul 3: Instruciunile asociate unui case pot s lipseasc.
Aceasta permite ca dou sau mai multe case s execute aceleai instruciuni
fr s fie nevoie de duplicarea lor. Iat un program care clasific literele n
vocale i consoane:
dan) #include<stdio.h>
dao) #include<conio.h>
dap) void main()
daq) { char ch;
dar) clrscr();
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
das) printf(Introduceti o litera : );
dat) ch=getche();
dau) switch(ch)
dav) { case a:
daw) case e:
dax) case i:
day) case o:
daz) case u: printf(\n este o
vocala);break;
dba) default : printf(\n este o consoana);
dbb) }
dbc) }
dbd)
dbe)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dbl) Exemplu : Presupunem c ntr-un punct al programului, aflat n interiorul mai
multor cicluri, se depisteaz o eroare i se dorete s se continue execuia
programului cu o secven de tratare a erorii respective. n acest caz vom
folosi o instruciune goto ca mai jos.
dbm) for()
dbn) {..
dbo) while(.)
dbp) { ..
dbq) do
dbr) {.
dbs) for(.)
dbt) {..
dbu) if(k==0)
dbv) goto divzero;
dbw) else x=y/k;
dbx)
dby) }
dbz) ..
dca) }while(..);
dcb) .
dcc) }
dcd) .
dce) }
dcf)
dcg) /* secvena de tratare a erorii */
dch) divzero:
dci) printf(..);
dcj) ..
dck) n absena instruciunii goto se poate realiza acelai lucru folosind un
indicator i o serie de teste realizate asupra lui.
dcl)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dcp)Funcia sprintf se folosete, ca i funcia printf, pentru a realiza conversii
ale datelor de diferite tipuri din formatele lor interne, n formate externe reprezentate
prin succesiuni de caractere. Diferena 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 sprintf. Ele se pstreaz sub forma unui ir de caractere
i pot fi afiate ulterior din zona respectiv cu funcia puts. De aceea un apel al
funciei printf poate fi ntotdeauna nlocuit cu un apel al funciei sprintf, urmat de un
apel al funciei puts. O astfel de nlocuire este util cnd dorim s afim de mai
multe ori aceleai date. n acest caz se apeleaz funcia sprintf o singur dat pentru
a face conversiile necesare din format intern n format extern, rezultatul conversiilor
pstrndu-se ntr-un ir de caractere. n continuare, se pot afia datele respective
apelnd funcia puts ori de cte ori este necesar afiarea lor. Funcia sprintf, ca i
funcia printf returneaz numrul octeilor irului de caractere rezultat n urma
conversiilor efectuate.
dcq) Exemplu :
dcr) int zi,luna,an;
dcs) char data_calend[11];
dct) .
dcu)sprintf(data_calend, %02d/%02d/%02d,zi,luna,an);
dcv) puts(data_calend);
dcw) .
dcx) puts(data_calend);
dcy)
dcz)
dda)Funcia sscanf realizeaz, ca i funcia scanf, conversii din formatul extern n
format intern. Deosebirea const c de data aceasta caracterele nu sunt citite
din zona tampon corespunztoare tastaturii, ci ele provin dintr-un ir de
caractere definit de primul parametru al funciei sscanf. Aceste caractere pot
ajunge n irul respectiv n urma apelului funciei gets. n felul acesta, apelul
funciei scanf poate fi nlocuit prin apelul funciei gets urmat de apelul funciei
sscanf. Astfel de nlocuiri sunt utile cnd dorim s eliminm eventualele erori
aprute la tastarea datelor.
ddb) Funcia sscanf, ca i funcia scanf, returneaz numrul cmpurilor
convertite corect conform specificatorilor de format prezeni n sintax. La ntlnirea
unei erori, ambele funcii i ntrerup execuia i se revine din ele cu numrul de
cmpuri tratate corect. Analiznd valoarea returnat, se poate stabili dac au fost
prelucrate corect toate cmpurile sau a survenit eroare. n caz de eroare se poate
reveni pentru a introduce corect datele respective. n acest scop este necesar s se
elimine caracterele ncepnd cu cel din poziia eronat. n cazul n care se utilizeaz
secvena:
ddc)gets(....); sscanf(....);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ddd)abandonarea caracterelor respective se face automat reapelnd funcia gets.
n cazul utilizrii funciei scanf este necesar s se avanseze pn la
caracterul linie nou aflat n zona tampon ataat tastaturii sau s se videze
zona respectiv prin funcii speciale.
dde) n exerciiile urmtoare vom folosi secvenele formate din apelurile
funciei gets urmate de apelurile lui sscanf. O astfel de secven se apeleaz repetat
n cazul n care se ntlnesc erori n datele de intrare.
ddf) Exemplul :
ddg) char tab[255];
ddh) int zi,luna,an;
ddi) ..
ddj) gets(tab);
ddk) sscanf(tab,%d %d %d,&zi,&luna,&an);
ddl) Amintim c funcia gets returneaz valoarea NULL la ntlnirea sfritului de
fiier. Funciile sscanf i sprintf au prototipurile n fiierul stdio.h.
ddm) Exemplu: S se scrie un program care citete msurile a,b,c ale laturilor
unui triunghi, calculeaz i afieaz aria triunghiului respectiv folosind formula
lui Heron.
ddn) #include<stdio.h>
ddo) #include<conio.h>
ddp) #include<stdlib.h>
ddq) #include<math.h>
ddr) void main()
dds) { double a,b,c,p;
ddt) char tab[255];
ddu) clrscr();
ddv) do /* citete msurile laturilor triunghiului */
ddw) { do /* citete pe a */
ddx) { printf("a=");
ddy) if(gets(tab)==NULL)
ddz) { printf("s-a tastat EOF\n");
dea) exit(1);
deb) }
dec) if(sscanf(tab,"%lf",&a)==1 && a>0)
break;
ded) /* se iese din ciclul pentru citirea lui a */
dee) printf("nu s-a tastat un numar
pozitiv\n");
def) printf("se reia citirea lui a\n");
deg) }while(1);
deh) do /* citete pe b */
dei) { printf("b=");
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dej) if(gets(tab)==NULL)
dek) { printf("s-a tastat EOF\n");
del) exit(1);
dem) }
den) if(sscanf(tab, "%lf", &b)==1 && b>0)
break;
deo) /* se iese din ciclul pentru citirea lui b */
dep) printf("nu s-a tastat un numar
pozitiv\n");
deq) printf("se reia citirea lui a\n");
der) }while(1);
des) do /* citete pe c */
det) { printf("c=");
deu) if(gets(tab)==NULL)
dev) { printf("s-a tastat EOF\n");
dew) exit(1);
dex) }
dey) if(sscanf(tab,"%lf",&c)==1 && c>0)
break;
dez) /* se iese din ciclul pentru citirea lui c */
dfa) printf("nu s-a tastat un numar
pozitiv\n");
dfb) printf("se reia citirea lui a\n");
dfc) }while(1);
dfd) p=(a+b+c)/2;
dfe) if(p-a>0 && p-b>0 && p-c>0) break;
dff) /* a,b,c pot fi laturile unui triunghi */
dfg) printf("a=%g\tb=%g\tc=%g\t",a,b,c);
dfh) printf("nu pot fi laturile unui
triunghi\n");
dfi) }while(1);
dfj) printf("aria=%g\n",sqrt(p*(p-a)*(p-b)*(p-c)));
dfk) getch();
dfl) }
dfm)
dfn)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dfq) Header-ul ctype.h este specializat pentru prelucrarea datelor de tip
caracter. El conine numai funcii i macrouri (secvene de cod asemntoare
funciilor, la apelul crora se face substituia numelui funciei cu codul asociat) de
verificare i prelucrare a caracterelor. Astfel, pentru clasificarea caracterelor, avem
urmtoarele macrodefiniii :
dfr)
dfs) Macro de dft) Valoarea 1 cnd caracterul este :
verificare
dfu) isalnum(c) dfv) o liter sau cifr
dfw) isalpha(c) dfx) o liter
dfy) isdigit(c) dfz) o cifr n baza 10
dga) iscntrl(c) dgb) un caracter de control
dgc) isascii(c) dgd) un caracter valid ASCII
dge) isprint(c) dgf)un caracter tipribil
dgg) isgraph(c) dgh) un caracter tipribil mai puin
spaiul
dgi) islower(c) dgj) o liter mic
dgk) isupper(c) dgl) o liter mare
dgm) ispunct(c) dgn) un caracter de punctuaie
dgo) isspace(c) dgp) spaiu,tab,CR,LF,tab
vertical,form-feed
dgq) isxdigit(c) dgr)o cifr n baza 16
dgs) Funcii dgt) Face conversia unui
conversie caractere caracter :
dgu) int toupper(int dgv) n liter mare. Spre deosebire
ch) de macroul _toupper care modific
orice caracter, dac caracterul ch nu
este liter mic, funcia l ntoarce
nemodificat
dgw) int tolower(int dgx) n liter mic. Spre deosebire
ch) de macroul _tolower care modific
orice caracter, funcia ntoarce
caracter nemodificat dac nu este
liter mare.
dgy)
dgz) Exemplul: Transformarea literelor unui ir n litere mari.
dha) #include<stdio.h>
dhb) #include<ctype.h>
dhc) void main()
dhd) { int i;
dhe) char t[255];
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dhf) scanf(%s,t);
dhg) for(i=0;s[i];i++)
dhh) s[i]=toupper(s[i]);
dhi) printf(%s\n,t);
dhj) }
dhk)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
coeficieni ai funciei polinomiale,
coef[0] este termenul liber i
coef[n] este termenul de rang
maxim
dip) double diq) Rotunjire inferioar. ntoarce cel
floor(double x); mai mare numr ntreg mai mic
sau egal cu x.
dir) double ceil(double x); dis) Rotunjire superioar. ntoarce cel
mai mic ntreg mai mare sau egal
cu x.
dit)
diu) Exemplu: Calculul valorii unui polinom.
div) #include<stdio.h>
diw) #include<math.h>
dix) // polinomul: x5-2x3-6x2+15x-1
diy) void main()
diz) { double a[]={-1.0,15,-6.0,-2.0,0,1.0};
dja) // coeficienii polinomului in ordinea
cresctoare a
djb) // puterilor
djc) double x,rez;
djd) printf(x=); scanf(%lf,&x);
dje) rez=poly(x,5,a);
djf) printf( val. polinomului pentru x=%lg este
djg) %lg\n,x,rez);
djh) }
dji) Funciile trigonometrice au argumente de tip real care trebuie
specificate n radiani. Cele mai utilizate funcii implementate sunt :
djj)
djk)Sintaxa funciei djl) Numele djm) Valo
funciei area
returnat
djn) double sin(double djo) Sinus djp) Real ntre
x); 1 i 1
djq) double djr) Cosinus djs) Real ntre
cos(double x); 1 i 1
djt) double tan(double x); dju) Tangent djv) Real
djw) double djx) Arc sinus djy) Real ntre
asin(double x); -/2 i /2
djz)double acos(double x); dka) Arc dkb) Real
cosinus ntre 0 i
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dkc) double dkd) Arc dke) Real
atan9double x); tangent ntre -/2 i
/2
dkf) double dkg) Arc dkh) Real
atan2(double y, double x); tangenta lui ntre 0 i
y/x
dki)double sinh(double x); dkj) Sinusul dkk) Real
hiperbolic
dkl)double cosh(double x); dkm) Cosi dkn) Real
nusul
hiperbolic
dko) double dkp) Tan dkq) real
tanh(double x); genta
hiperbolic
dkr)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dle) 3. Ce va afia programul dmb) case
urmtor, dac de la tastatur 10:
se introduc n ordine numerele dmc)
5, 7 i 8? { printf(Foarte
dlf) #include<stdio.h dmd)
> bine);
dlg) void main() dme) bre
dlh) { ak;
dli) int dmf) }
x,y,z,m; dmg) default:
dlj) scanf(%d dmh) printf(Ero
%d %d, are);
dlk) & dmi) }
x,&y,&z); dmj) }
dll) dmk) a) Corigent
m=(x+y+z)/3; b) Mediocru
dlm) switch(m) c) Satisfctor d) Foarte
{ bine
dln) case dml) e) Eroare
1,2,3,4: dmm)
dlo) { dmn) 4. Precizai ce se va
dlp) printf( afia n urma execuiei
Corigent); secvenei de program de mai
dlq) bre jos pentru n=5 (s,n i k sunt
ak; variabile ntregi).
dlr) } dmo) s=0; k=1;
dls) case dmp) while(k<=n)
5,6: dmq) {
dlt) { dmr) s+=k;
dlu) printf( dms) k+=2;
Mediocru); dmt) }
dlv) bre dmu) printf(s=%d,
ak; s);
dlw) } dmv) a) s=4 b) s=16
dlx) case c) s=9
7,8,9: dmw) d) s=15 e)s=0
dly) dmx)
{ printf(Bine); dmy) 5. Care dintre
dlz) bre secvenele de program de mai
ak; jos calculeaz corect
dma) } factorialul numrului natural
n?
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dmz) 1) p=1; for(i=1; dnx) { s=0;
i<=n; i++) dny) for(j=1;
dna) p=p j<=i; j++)
*i; dnz) s+=
dnb) 2) p=1; i=1; j;
dnc) while(i<=n) doa) p*=s;
p=p*i++; dob) }
dnd) 3) p=1; i=1; a) 180 b) 18 c) 9
dne) do{ doc) d) 216 e) 1
dnf) p*=i; dod)
i=i+1; doe) 8. Precizai ce se va
dng) }while(i<=n); afia n urma execuiei
dnh) a) numai 1) b) programului urmtor pentru
numai 2) x=179 ?
dni) c) numai 3) d) dof) #include<stdio.h
1) i 3) >
dnj) e) toate dog) void main()
dnk) doh) {
dnl) 6. Care trebuie s fie valoarea doi) int c,s;
variabilei ntregi m, astfel long d,x;
nct urmtoarea secven de doj)
program s afieze exact un scanf(%ld, &x);
caracter A ? dok) d=x; s=0;
dnm) x=5; dol) while(d)
dnn) do{ dom) { c=d
dno) %10; s+=c;
putchar(A); don) d=d/1
dnp) x++; 0;
dnq) }while(x>m); doo) }
dnr) a) 12 b)5 dop)
c)6 printf(%d, s);
dns) d) 4 e)1 doq) }
dnt) dor) a) 16 b)
dnu) 7. Se consider 18 c)17
secvena de program de mai dos) d) 0 e)
jos, n care toate variabilele 971
sunt ntregi. Pentru n=3, care dot)
va fi valoarea variabilei p dup dou) 9. Considerm
execuia secvenei ? programul urmtor :
dnv) p=1; dov) #include<stdio.h
dnw) for(i=1; i<=n; >
i++) dow) void main()
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dox) { dpv) #include<stdio.h
doy) short int >
m,x; dpw) void main()
doz) m=-1; dpx) {
dpa) while((scan dpy) int i,n,s;
f(%d,&x)==1)&& dpz)
dpb) x) scanf(%d, &n);
dpc) if(x>m) m=x; dqa)
dpd) printf(%d for(s=0,i=2; i<n/2;
, m); dqb) !(n%i)?
dpe) } s+=i++: i++);
dpf) Precizai ce valoare va dqc)
afia programul, dac irul de printf(%d,s);
numere citit de la tastatur dqd) }
este 2, 5, -32000, dqe) a) 0 b) 9 c)
33000, 0. 12 d) 78
dpg) a) 1 b) 0 dqf) e) programul
c) 33000 conine erori
dph) d) 2 e) 5 dqg)
dpi) dqh) 12. Dac de la
dpj) 10. Pentru ce valoare a tastatur se introduc, n
variabilei m, secvena de ordine, numerele
program de mai jos reprezint 2,7,3,8,5,5, ce valoare va
o bucl infinit ? afia secvena urmtoare ?
dpk) int n=10, m; dqi) int a, b, nr=0;
dpl) do{ dqj) do{
dpm) while(n>0) dqk) scanf(%d
n--; %d,&a,&b);
dpn) }while(n!=m); dql) }while((b!=a) ?
dpo) a) 10 ++nr : 0);
dpp) b) orice valoare dqm) printf(%d,
de 10 nr);
dpq) c) 0 a) 0 b) 1 c) 2
dpr) d) orice valoare dqn) d) 3 e) 4
de 0 dqo)
dps) e) orice valoare dqp) 13. int i=0; int
ntreag j=6;
dpt) dqq) if(i!=0) &&
dpu) 11. Ce valoare va afia (j/i!=1)
programul urmtor pentru dqr) j=i; i+=4; j+=i;
n=12 ?
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dqs) Pentru codul de mai dro) } while(c!=EOF);
sus alegei comportamentul drp)Care din urmtoarele afirmaii
corect : este adevrat :
a) va genera eroare la a) se numr cte caractere
rulare litere mici sunt citite
b) j=4 c) j=0 d) j=10 b) se numr cte caractere
dqt) sunt citite
dqu) 14. c) se numr cte caractere
A) for(exp1;exp2;exp3) litere mari sunt citite
dqv) instruc d) nici una
tiune; drq)
dqw) este echivalent cu drr) 16. Se d o secven de
dqx) exp1; program n care toate
dqy) variabilele sunt de tip ntreg. n
while(exp2) urma execuiei programului ce
dqz) conine aceast secven, ce
{ instructiune; valori capt variabilele d i
dra) exp3;} s?
B) for( ;exp; ) drs) a=8;
drb) instructi drt) b=c=1; d=s=0;
une; dru) i=3;
drc)este echivalent cu drv) do{
drd) while(exp) drw) i++;
instructiune; drx) if(a>0)
C) for( ; ; ) instructiune; dry) if(b>1)
dre)este echivalent cu drz) if(c>1)
drf) while(1) d=a;
instructiune; dsa) else d=a+b;
drg)Care din echivalenele de mai dsb) else d=a+b+c;
sus sunt eronate: dsc)
a) nici una b) A,B dsd) s+=i+d;
drh) c) B,C dse) } while(i>5);
d) A,C dsf) a) d=8 s=12 b)
dri) d=9 s=12
drj) 15. Fie secvena : dsg) c) d=10 s=13 d)
drk) do{ d=10 s=14
drl) scanf(% dsh)
c,&c); dsi) 17. Se consider secvena de
drm) if program:
(c>=a && dsj) void main(void)
drn) c< dsk) { int x=1;
=z) i++;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dsl) float z, dth) 1
y=0.96; dti) 22
dsm) x+=y; dtj) 333
z=sqrt(x); dtk) 4444
dsn) printf(%f, dtl) 55555
z); a) for(loop==1;loop<=5;
dso) } dtm)
dsp) Valoarea afiat este : looop++)
a) 1.46 b) 1.000000 c) 1 dtn) {
dsq) d) programul dto) for(loop1=
conine erori de =1;
sintax dtp) loop1<=lo
dsr) op;loop1++)
dss) 18. Fie secvena de dtq) printf(%d,l
cod prezentat mai jos : oop1);
dst) i=1; dtr) printf(\n);
dsu) while(n) dts) }
i=i*(n--); b) for(loop=1;loop<=5;
dsv) atunci aceasta : dtt)
a) calculeaz n! loop++)
b) calculeaz in dtu) { for(loop1=1;
dsw) c) calculeaz ni dtv) loop1<=loop;
loop1++)
dsx) d) se cicleaz dtw) printf(%
la infinit d,loop);
dsy) dtx) printf(\n);
dsz) 19. Fie secvena de dty) }
cod prezentat mai jos : c) for(loop=1;loop<=5;
dta) i=1; dtz)
dtb) while(n--) loop++)
i=i*2; dua) { for(loop1=1;
dtc) atunci aceasta : dub) loop1<=loop
a) calculeaz 2n ;loop1++)
b) calculeaz i2 duc) printf(%d
dtd) c) calculeaz n2 ,loop1);
dud) printf(\n);
due) }
dte) d) se cicleaz
d) for(loop=5;loop>0;loop--)
la infinit
duf) { for(loop1=1;
dtf) dug) loop1<=loop;l
dtg)20. Scriei o bucl care oop1++)
afieaz secvena :
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
duh) printf(%d dvd) c) doar III d) doar I
,loop1); i III
dui) printf(\n); dve)
duj) } dvf) 24. Se d codul :
duk) dvg) int x=4, a=2;
dul) 21. Referitor la secvena de dvh) int b=4, c=8;
cod de mai jos, ce valoare va dvi) if(x==b) x=a;
avea variabila contor dup dvj) else x=b;
execuia ei ? dvk) if(x!=b) c=c+b;
dum) int x=3, dvl) else
contor=0; c=c+a;
dun) while((x-1)) dvm) printf(c=%d\n,c);
duo) { dvn) Ce se va afia dup execuia
dup) ++ contor; codului de mai sus ?
duq) x--; a) c=4 b) c=8
dur) } dvo) c) c=10 d) c=12
a) 0 b) 1 c) 2 d) 3 dvp)
dus) dvq) 25. Se d urmtoarea
dut)22. Ce realizeaz urmtoarea secven de cod:
secven : dvr) int i, j=0;
duu) scanf(%d,&x,&y dvs) for(i=1;i<11;i+=2)
,&z); dvt) { j++; if(i==7)
duv) if(x<=y); break; }
duw) dvu)Care va fi valoarea final a lui
dux) x=x+z; j?
duy) y=y+z; a) 3 b) 4 c) 5 d) 7
duz) else z=x+y; dvv)
a) citete trei numere i dvw) 26. Se d urmtoarea
calculeaz suma lor secven de cod:
b) citete trei numere i dvx) int i, j, k; i=1;
calculeaz produsul lor j=1; k=2;
c) este greit dvy) while(i<6)
d) z devine minimul dintre x dvz) { k=k+i;i++;
dva) si y dwa) j=j+k;
dvb) dwb) if(k==3) j--;
dvc) 23. Care secven de dwc) else if(j==8)
program realizeaz o repetiie break;
la infinit : dwd) }
I) do while(1); dwe) printf(%d--%d--
II) do while(0); %d,i,j,k);
III) do while(i%1<2); dwf)Ce va afia codul de mai sus ?
a) doar I b) doar II a) 112 b) 233
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dwg) c) 385 dxg) int y=1;
d) 4168 dxh) for(x=0;x<=30;x++)
dwh) dxi) { y=y+1;
dwi) 27. Se d codul : dxj) if(x<5)
dwj) int a=3, b=0; continue;
dwk) while(a) dxk) if(x>5) break;
dwl) { b=b++; dxl) y=y+x;
a=b; } dxm) }
dwm) Ce valoare va avea dxn) Dup execuia codului
b? anterior, ce valoare va avea
a) 1 b) 3 c) 0 y?
e) nedefinit pentru c va dxo) a) 486 b) 31 c)
dwn) fi o bucl 13 d) 496
infinit dxp)
dwo) dxq) 30. Fie urmtorul program :
dwp) 28. Fie secvena de dxr) int main()
cod : dxs) { int i;
dwq) #include<stdio.h dxt) for(i=1;i<65535;
> i++);
dwr) void main(void) dxu) printf(i=
dws) { int i,y,x=6; %d\n,i);
dwt) y=x; dxv) }
dwu) while(1) dxw) a)valoarea afiat
dwv) { y--; este
x=x*y; dxx) i=65535
dww) if(y==0) dxy) b)valoarea afiat
break; este
dwx) } dxz) i=65534
dwy) printf(%d, dya) c)valoarea afiat
x); este
dwz) } dyb) i=32766
dxa) Ce numr va fi afiat dyc) d)programul nu este
pe ecran la terminarea corect
execuiei acestui cod ? dyd) deoarece este
dxb) a) 720 depit
dxc) b) programul va dye) domeniul de valori
rula la infinit c) dyf)
0 d) 6 dyg) 31. n urma execuiei
dxd) secvenei de program de mai
dxe) 29. Fie secvena de jos, pentru care dintre tripletele
cod : de valori ale variabilelor a, b,
dxf) int x;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
c, date mai jos, se va afia dzh) Ce valoare se afieaz
valoarea 1? pentru a=33 i b=18 ?
dyh) x=1; dzi) a) 8 b) 7 c)
dyi) if(!(a<=b)||! 0 d) 16 e) 33
(a<=c)) dzj)
dyj) { if(b>=c) dzk) 33. Fie urmtorul
dyk) printf(%d\n program:
,-x); dzl) #include<stdio.h
dyl) } >
dym) else dzm) void main()
dyn) if(b<c) dzn) {
printf(%d\n,x); dzo) int
dyo) a) a=3, b=2, c=4 x,y,m,n,a,b;
dzp) a=b=2;
dyp) b) a=2, b=3, c=4 //(1)
dyq) c) a=4, b=3, c=2 dzq) m=(x=a+3,y=b-
1,y++,y+x); //(2)
dyr) d) a=2, b=4, c=3 dzr) if(a&&x>y)
dys) e) a=4, b=2, c=3 dzs) printf(%d
dyt) ,m);//(3)
dyu) 32. Se consider dzt) if(x-
programul urmtor: y>a&&x>y||!m)
dyv) #include<stdio.h //(4) putchar(1);
> dzu) else
dyw) void main() putchar(0);
dyx) { dzv) if((n=x>y)==0
dyy) int )||(--x==4)) //(5)
a,b,c,d,i; printf(%d,x--);
dyz) scanf(%d dzw) }
%d,&a,&b); dzx) n timpul execuiei
dza) if(a>b) programului se pot spune
dzb) { c=a; urmtoarele:
a=b; b=c; } dzy) a) atribuirea
dzc) d=0; din linia (1)
dzd) dzz) este eronat
for(i=a;i<=b;i++) b) instruciunea din linia
dze) if(i (2) este eronat
%2==0) d++; c) n urma execuiei liniei
dzf) (3) nu se afieaz nici o
printf(%d,d); valoare
dzg) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
d) n urma execuiei liniei eav) if(!
(4) se afieaz valoarea ((x<=a)&&(x>=b)))
1 eaw) putchar(1
e) n urma execuiei liniei );
(5) se afieaz valoarea eax) if(!(x<=a||
4 x>=b))
eaa) eay) putchar(1
eab) 34. Dac de la );
tastatur se introduce numrul eaz) if(!(x<=a)&&!
22, cte valori distincte va (x>=b))
afia programul urmtor? eba) putchar(1
eac) #include<stdio.h );
> ebb) if(!(x<=a)||!
ead) #include<math.h> (x>=b))
eae) void main() ebc) putchar(1
eaf) { );
eag) int x,n,i; ebd) }
eah) for(scanf(%d, ebe) a) nici o dat
&n),i=1;; b) o dat
eai) x=sqrt(i) ebf) c) de dou ori
, d) de trei ori
eaj) printf(% e) de patru ori
d,x),i++) ebg)
eak) if(i>n) ebh) 36. Dac n timpul
break; execuiei programului de mai
eal) } jos n va primi valoarea
eam) a) nici una 232213, care vor fi n final
ean) b) 1 c) 2 valorile variabilelor f1, f2 i
d) 3 e) 4 f3 ?
eao) ebi) #include<stdio.h
eap) 35.Precizai de cte >
ori se va afia valoarea 1 n ebj) void main()
timpul execuiei programului ebk) {
urmtor, dac a=3,b=4 i x=5. ebl) long n;
eaq) #include<stdio.h ebm) unsigned
> f1,f2,f3,c;
ear) void main() ebn)
eas) { scanf(%ld,&n);
eat) int a,b,x; ebo)
eau) scanf(%d%d%d, f1=f2=f3=0;
&a,&b,&x); ebp) do{
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ebq) c=n%10; eck) while(i<=n)
n=n/10; { p*=i;i+=2;}
ebr) b) p=1; i=1;
switch(c) { ecl) while(i<n/2)
ebs) case ecm) {i+
1: +;p=p*(2*i+1); }
ebt) { f1+ c) p=1; i=1;
+; break; } ecn) while(i<=n/2)
ebu) case {p=p*(2*i);i++; }
2: d) p=1; i=0;
ebv) { f2+ eco) while(i<n)
+; break; } { i+=2;p*=i; }
ebw) case e) nici una dintre
3: secvenele anterioare
ebx) { f3+ ecp)
+; break; } ecq) 38. Precizai care dintre
eby) } urmtoarele secvene de instruciuni
ebz) }while(n! atribuie
=0); ecr) variabilei ntregi x valoarea n2,
eca) printf(%u cu n numr natural.
%u %u, a) x=1;
ecb) ecs) for(j=1;j<3;j++)
f1,f2,f3); x*=n;
ecc) } b) x=1;
ecd) a) ect) for(j=1;j<=n;j+
f1=1,f2=1,f3=1 +) x*=2;
ece) b) c) x=1; j=0;
f1=1,f2=2,f3=2 ecu) while(j<2) x*=n;
ecf) c) j++;
f1=1,f2=3,f3=2 d) x=1; j=0;
ecg) d) ecv) do{
f1=2,f2=1,f3=3 ecw) j++; x*=n;
ech) e) ecx) }while(j<2);
f1=3,f2=2,f3=1 e) x=n*n;
eci) ecy)
ecj) 37.Pentru n=7, care dintre ecz) 39. Precizai care dintre
secvenele de program de mai urmtoarele secvene de instruciuni
jos trebuie executat astfel atribuie variabilei ntregi x valoarea
nct, la finele execuiei, 10n, cu n numr natural.
valoarea variabilei p s fie a) x=10;
48 ? eda) for(j=1;j<=n;j+
a) p=1; i=2; +)x*=i;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
b) x=1; e) nici una din variantele
edb) for(j=n;j>0;j--) anterioare
x*=10; edv)
c) x=1; j=1; edw) 42. Care dintre
edc) do{ urmtoarele secvene de
edd) x*=10; j++; instruciuni atribuie variabilei
ede) }while(j<n); ntregi u valoarea ultimei cifre
d) x=1; j=0; a numrului natural
edf) while(j<=n) { j+ reprezentat de variabila x ?
+; x*=i;} edx) a) while(x>=10)
e) nici una dintre varian- x=x/10; u=x;
tele anterioare b) u=x; while(u>=10) u=u%10;
edg) c) u=x%10;
edh) 40. Deducei ce valoare se va d) u=x/10;
afia n urma execuiei secvenei de e) toate variantele ante-
program de mai jos, dac valorile rioare
variabilei x citite de la tastatur sunt n edy)
ordine 3,2,4,3,5,10,20,0. edz) 43. Fie secvena de program
edi) scanf(%d,&x); urmtoare, n care ok este o variabil
edj) nr=0; de tipul int, iar x este un numr
edk) do{ natural.
edl) y=x; eea) ok=0;
edm) scanf(%d,&x); eeb) for(j=2;j<x;j++)
edn) if(x==2*y) nr++; eec) if(x%j==0) ok=1;
edo) }while(x!=0); eed) printf(%d,ok);
edp) printf(%d,nr); eee) Secvena afieaz 1 dac:
edq) a) 0 b) 1 c) 2 a) numrul x are cel puin
d) 3 e) 4 un divizor propriu
edr) b) numrul x nu are nici-un
eds) 41. Care dintre urmtoarele divizor propriu
secvene de nstruciuni atribuie c) toate numerele naturale
variabilei ntregi u valoarea primei mai mici ca n, fr 0 i
cifre a numrului natural reprezentat 1, sunt divizori proprii
de variabila x ? ai lui x
a) u=x; d) numrul x are cel mult un
edt) while(u>=10) u=u divizor propriu
%10; e) nici una dintre vari-
b) while(x>=10) x=x/10; antele de mai sus
edu) u=x; eef)
c) u=x/10; eeg) 44. Se consider
d) u=x%10; secvenele de program de mai
jos. Pentru n=4, precizai care
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dintre secvene afieaz, n triplet se obine aceeai
urma execuiei, irul de valoare a lui s ?
numere: 1,2,2,3,3,3,4,4,4,4 . eew) a) (3,5,6) b)
a) for(j=1;j<=n;j++) (6,7,8)
eeh) for(k=1;k<=n;k+ eex) c) (10,11,12) d)
+) (6,9,12)
eei) printf(%2d, eey) e) (15,16,17)
j); eez)
b) for(j=1;j<=n;j++) efa)46. Considernd c toate
eej) for(k=1;k<=j;k variabilele sunt ntregi, ce
++) valoare se afieaz dup
eek) printf(%2d execuia secvenei de mai
,j); jos ?
c) for(j=1;j<=n;j++) efb) s=0;t=0;x=3;i=1;
eel) for(k=1;k<=n;k y=1;z=1;
++) efc) do{
eem) printf(%2d efd) if(x>0)
,k); efe) if(y>1)
d) for(j=1;j<=n;j++) eff)
een) for(k=1;k<=j;k if(z>2) t=x;
++) efg) else
eeo) printf(%2d t=x+y;
,k); efh) else
e) for(k=1;k<=n; k++) t=x+y+z;
eep) for(j=1;j<=n;j efi) s+=i+t; i+
++) +;
eeq) printf(%2d efj) }while(i>7);
,j); efk) a) 1 b) 5 c)
eer) 6 d) 51 e) 63
ees) 45. Fie secvena de efl)
program urmtoare: efm) 47. Care dintre irurile
eet) s=0; de valori date n variantele de
eeu) for(j=3;j<=n;j+= rspuns trebuie introduse de la
3) s+=j; tastatur n timpul execuiei
eev) Se dau mai jos cinci programului urmtor, astfel
triplete de numere, fiecare nct s se declaneze un
astfel de triplet reprezentnd ciclu infinit ?
un set de valori pentru efn) #include<stdio.h
variabila de intrare n. Care >
dintre aceste triplete au efo) void main()
proprietatea c pentru toate efp) {
cele trei valori ale lui n din efq) int x,y;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
efr) while(scanf(%d programul va afia
,&x)==1 && suma numerelor citite,
efs) scanf(%d,&y) adic 14
==1 && egr) b) dac prima
eft) valoare intro-dus de
(x||y)) la tastatur este 0,
efu) do{ atunci ciclul se
efv) y--; ncheie i se afieaz
efw) printf(* valoarea 1
%d *%d,x,y); egs) c) ciclul este
efx) }while(x!=y); eronat: nu se poate
efy) } face o citire n linia
efz) a) 2,7,3,8,0,0 for
egt) d)instruciunea
ega) b) 2,5,4,4,0,0 if este eronat
egb) c) 1,3,6,2,0,0 egu) e) din cauz c
lipsete expresia care
egc) d) 2,4,5,8,0,0 d condiia de
egd) e) 0,0 continuare, ciclul for
ege) se va executa la
egf)48. Pentru programul urmtor, infinit
care dintre afirmaiile de mai egv)
jos sunt adevrate ? egw) 49. Care dintre
egg) #include<stdio.h secvenele de mai jos afieaz
> corect irul cifrelor impare
egh) void main() 97531 n aceast ordine ?
egi) { egx) a)
egj) for(j=9;j>=1;j--)
egk) int s,x; egy) printf(
egl) for(s=0,x=1;0;s+ %d,j--);
=x, b) for(j=0;j<=9;j++)
egm) scanf( egz) printf(
%d,x)) %d,9-j++);
egn) if(!x) c) for(j=9;j-->=1;)
break; eha) printf(%
ego) printf(%d,s d%d,j,j--);
); d) j=10;
egp) } ehb) while(j--)
egq) a) dac de la ehc) printf(%d
tastatur se introduc, ,--j);
n ordine, numerele e) j=1;
2,3,4 i 5, atunci ehd) do{
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ehe) printf(%d ehg)
,10-j++); ehh)
ehf) }while(j<=9?j+ ehi)
+:0); ehj)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
eid)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
(implicit a numrului de elemente) citite de la intrare. Uzual, un vector se declar n
urmtoarea manier:
ejf) #define MAX 100 /* dimensiunea maxim admis */
ejg)
ejh) int a[MAX];
eji) int n; /* dimensiunea real citit la intrare */
ejj) Secvena tipic de validare a dimensiunii unui vector este urmtoarea:
ejk) do{
ejl) printf(n=);
ejm) scanf(%d,&n);
ejn) if(n<=0||n>MAX) printf(dimensiune
incorecta\n);
ejo) }while(n<=0||n>MAX);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ekf) if(minim>a[i]) /* (maxim<a[i]) */
ekg) minim=a[i]; /* maxim=a[i]; */
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
care nu au proprietatea respectiv. De exemplu, pentru a elimina dintr-un vector toate
elementele negative, putem utiliza secvena:
elb) j=-1;
elc) for(i=0;i<n;i++)
eld) if(a[i]>=0) /* nu are proprietatea cerut */
ele) b[++j]=a[i]; /* pstram elementul n vectorul b */
elf) n=j; /* actualizm dimensiunea vectorului */
elg) Metoda este ineficient datorit consumului de memorie necesar pentru
vectorul b. O metod mult mai eficient este s folosim acelai vector n care
vom ngrmdi pe primele poziii elementele care trebuie pstrate. Prin
actualizarea dimensiunii vectorului, elementele de prisos nu vor mai fi luate n
consideraie n prelucrrile ulterioare. Secvena care realizeaz aceast
operaie este urmtoarea:
elh) j=-1;
eli) for(i=0;i<n;i++)
elj) if(a[i]>=0) /* nu are proprietatea cerut */
elk) a[++j]=a[i]; /* mutm elementul la nceputul vectorului */
ell) n=j; /* actualizm dimensiunea vectorului */
elm)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
poziie spre dreapta pentru a face loc noii valori y introdus n poziia k (indice k-1).
Dimensiunea vectorului crete cu o unitate:
elx) for(j=n;j>=k;j--) a[j]=a[j-1];
ely) /* deplasm elementele spre dreapta */
elz) a[k-1]=y; /* inserm elementul y */
ema) n++; /* actualizm dimensiunea */
emb)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
emw) Conform acestei metode, vectorul este parcurs de la stnga spre
dreapta comparndu-se perechi de elemente succesive (a[j] cu a[j+1]). Dac cele
dou elemente nu sunt n ordinea cerut, se interschimb i, o variabil iniial egal cu
0, se incrementeaz. n acest fel, la prima parcurgere a vectorului, elementul maxim
din ir (dac se face ordonare cresctoare) se deplaseaz spre dreapta pn cnd
ajunge n ultima poziie. La a doua parcurgere a vectorului , al doilea cel mai mare
element ajunge n penultima poziie etc. Parcurgerea vectorului se reia pn cnd nu
mai gsim nici-o pereche de elemente consecutive neordonate. La fiecare parcurgere,
lungimea secvenei care se verific scade cu o unitate:
emx) k=n; /* iniial verificm tot vectorul */
emy) do{
emz) f=0; /* numr perechile neordonate */
ena) for(j=0;j<k-1;j++)
enb) if(a[j]>a[j+1]) /* pentru ordonare
cresctoare */
enc) { aux=a[j]; a[j]=a[j+1];
end) a[j+1]=aux; /* interschimbm elementele
*/
ene) f++; /* numrm in f */
enf) }
eng) k--; /* lungimea secvenei care se verific scade
*/
enh) }while(f); /* repet ct timp mai sunt perechi neordonate */
eni)
enj) B)Sortarea prin selecie direct
enk) Conform acestei metode primul element (a[0]) se compar pe rnd cu
toate elementele de dup el i dac ordinea de sortare nu este respectat, cele dou
elemente se interschimb. Dup efectuarea tuturor comparaiilor, n prima poziie
ajunge cel mai mic element din vector (n cazul ordonrii cresctoare). Se compar
apoi al doilea element cu toate elementele de dup el etc. La ultimul pas se compar
numai ultimele dou elemente. Secvena corespunztoare de program este :
enl) for(i=0; i<n-1; i++) /* elementul care se compar */
enm) for(j=i+1;j<n;j++) /* elem. de dup el cu care se
compar */
enn) if(a[i]>a[j]) /* pentru ordonare cresctoare */
eno) { aux=a[i]; a[i]=a[j];
enp) a[j]=aux; /* interschimbm elementele */
enq) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
enr) 6.3.11 Algoritmul de cutare binar
ens)
ent) Se consider un vector oarecare A cu n elemente i o valoare x. Se
cere s se verifice dac x apare printre elementele vectorului sau nu. Dac lucrm cu
un vector oarecare, se vor compara pe rnd elementele acestuia cu valoarea cutat
x. Sunt necesare cel mult n comparaii n caz de succes (x apare n vector) i exact n
comparaii n caz de eec (x nu apare n vector). n cazul n care vectorul este ordonat
cresctor sau descresctor se poate folosi un algoritm de cutare mult mai eficient
avnd complexitatea log2n. Acest algoritm se numete algoritmul de cutare binar
i poate fi descris astfel : iniial se consider tot vectorul A i se compar x cu
elementul din mijlocul acestuia (fie el a[mij]). Dac x=a[mij], algoritmul se ncheie cu
succes; dac x<a[mij], vectorul fiind ordonat, cutarea va continua n prima jumtate,
iar dac x>a[mij] cutarea va continua n a doua jumtate. Procedeul se repet pn
cnd fie gsim valoarea x, fie nu mai avem secven valid de cutare, adic
elemente neverificate. Secvena curent n care se face cutarea elementului x este
identificat prin indicele elementului din extrema stng, respectiv indicele elementului
din extrema dreapt. Secvena de program este urmtoarea :
enu) f=-1; /* x nu a fost gsit n vectorul A */
env) st=0; dr=n-1; /* secvena iniial de cutare este ntregul vector
A */
enw) while(st<=dr)
enx) /* secvena curent de cutare conine cel puin un element */
eny) { mij=(st+dr)/2;
enz) /* indicele elementului din mijlocul secvenei de cutare */
eoa) if(a[mij]==x)
eob) { f=mij; /* memorm poziia n care apare */
eoc) break; /* cutare ncheiat cu succes */
eod) }
eoe) if(x<a[mij])
eof) dr=mij-1; /* cutarea continu n prima jumtate */
eog) else
eoh) st=mij+1; /* cutarea continu n a doua jumtate */
eoi) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
elementul curent din A cu elementul curent din B, n C se introduce spre exemplu cel
mai mic dintre ele (la ordonare cresctoare). Dac elementul introdus a fost din
vectorul A atunci se avanseaz la urmtorul element din A, altfel se avanseaz la
urmtorul element din vectorul B. n momentul n care elementele unui vector sunt
epuizate, elementele rmase n cellalt vector sunt copiate direct n vectorul C. Acest
algoritm se simplific dac folosim dou santinele care vor face ca cei doi vectori s
se epuizeze simultan. O santinel este un element care nu influeneaz valoarea unui
rezultat, scopul utilizrii lui fiind numai obinerea unui algoritm mai simplu i mai
eficient. n cazul algoritmului de interclasare, vom aduga la sfritul vectorului A o
santinel mai mare dect cel mai mare element din B, iar la sfritul vectorului B o
santinel mai mare dect cel mai mare element din A. n acest caz, dac presupunem
c toate elementele utile din vectorul A au fost deja introduse n vectorul rezultat C,
atunci, toate elementele utile din B care nu au fost nc verificate sunt mai mici dect
santinela rmas n A i vor fi copiate automat, fr nici-o verificare suplimentar, n
vectorul rezultat C. Secvena care realizeaz interclasarea cu santinele este:
eom) a[m]=b[n-1]+1;
eon) /* santinela din A mai mare dect cel mai mare element din B */
eoo) b[n]=a[m-1]+1;
eop) /* santinela din B mai mare dect cel mai mare element din A */
eoq) i=0; /* indicele elementului curent din A */
eor) j=0; /* indicele elementului curent din B */
eos) for(k=0; k<m+n; k++) /* k este indicele elementului curent din
C */
eot) if(a[i]<b[j]) /* pentru ordonare cresctoare */
eou) c[k]=a[i++]; /* avansez n vectorul A */
eov) else
eow) c[k]=b[j++]; /* avansez n vectorul B */
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
epe) int m,n; /* numrul real de linii, respectiv coloane
*/
epf)
epg) do{
eph) printf(numarul de linii=);
epi) scanf(%d,&m);
epj) if(m<=0 || m>MAXLIN)
epk) printf(dimensiune eronata\n);
epl) }while(m<=0 || m>MAXLIN);
epm) do{
epn) printf(numarul de coloane=);
epo) scanf(%d,&n);
epp) if(n<=0 || n>MAXCOL)
epq) printf(dimensiune eronata\n);
epr) }while(n<=0 || n>MAXCOL);
eps) Pentru o matrice ptratic maniera uzual de declarare i validare a
dimensiunii este urmtoarea:
ept) #define DIM 8
epu) int a[DIM][DIM];
epv) int n; /* dimensiunea real a matricii */
epw) ..
epx) do{
epy) printf(dimensiunea matricii=);
epz) scanf(%d,&n);
eqa) if(n<=0 || n>DIM) printf(dimensiune
eronata\n);
eqb) }while(n<=0 || n>DIM);
eqc)
eqd) Este bine de tiut c memorarea matricilor se face pe linii (ordine
lexicografic), adic compilatorul rezerv pentru matrice o zon contigu de memorie
de dimensiune MAXLIN*MAXCOL*sizeof(tip), unde tip este tipul de baz al matricii,
adic tipul elementelor componente. Primele MAXCOL locaii din aceast zon sunt
pentru elementele din prima linie (de indice 0), chiar dac nu toate sunt folosite,
urmtoarele MAXCOL locaii sunt rezervate pentru elementele din a doua linie (de
indice 1) etc. Practic, n memorie, matricea este liniarizat sub forma unui vector cu
MAXLIN*MAXCOL elemente, unele din aceste elemente putnd fi neutilizate.
Raionamentul se aplic identic pentru matricile ptratice, numrul de elemente fiind
DIM*DIM (dimensiunea matricii).
eqe) n continuare, vom considera cazul general al matricilor
dreptunghiulare, secvenele de instruciuni trebuind modificate corespunztor pentru a
lucra corect cu matricile ptratice (m=n=dimensiunea matricii).
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
eqf) 6.4.1 Citirea elementelor unei matrici
eqg)
eqh) Deoarece memorarea matricilor se face pe linii, elementele se citesc
pe linii, adic indicele de coloan se modific mai rapid dect indicele de linie.
Secvena corespunztoare de program este urmtoarea:
eqi) for(i=0;i<m;i++) /* indicele de linie */
eqj) for(j=0;j<n;j++) /* indicele de coloan */
eqk) { printf(a[%d,%d]=,i,j);
eql) scanf(%d,&a[i][j]);
eqm) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
erf) 6.4.4 Identificarea elementelor specifice unei matrici
ptratice
erg)
erh) n cazul matricilor ptratice se identific urmtoarele elemente
specifice: diagonala principal (DP), diagonala secundar (DS), jumtatea superioar
(JS) i jumtatea inferioar (JI). Diagonalele corespund (geometric) diagonalelor unui
ptrat.
eri) Diagonala principal cuprinde elementele din colul stnga sus pn
n colul dreapta jos, adic mulimea:
erj) DP={aij| i=j, i=0,..n-1}={a00, a11, a22, .,an-1n-1} unde n
este dimensiunea real a matricii.
erk) Diagonala secundar cuprinde elementele din colul dreapta sus pn
n colul stnga jos, adic mulimea:
erl) DS={aij|i=0,1,n-1 , j=n-1,n-2,0, i+j=n-1}={a0n-1, a1n-2,..,an-10}
erm) Jumtatea superioar cuprinde elementele de deasupra diagonalei
principale (fr cele de pe DP), adic mulimea:
ern) JS={aij | i=0,1,n-2 , j=i+1,,n-1}
ero)Jumtatea inferioar cuprinde elementele de sub diagonala principal (fr
elementele de pe DP), adic mulimea:
erp) JI={aij | i=1,2,.n-1 , j=0,1,i-1}
erq)Un element a[i][j] din JS are drept simetric elementul a[j][i] din JI. Astfel,
transpusa unei matrici ptratice (matricea care are liniile drept coloane i
reciproc) se poate genera uor interschimbnd toate elementele din JS cu
simetricele lor din JI aa cum se vede n secvena de mai jos:
err) for(i=0; i<n-1; i++)
ers) for(j=i+1; j<n; j++)
ert) { aux=a[i][j];
eru) a[i][j]=a[j][i];
erv) a[j][i]=aux;
erw) }
erx)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
esf) e) integer etc) int
v[20]; n,k,x,v[7]={5,14,-
esg) 3,8,-1};
esh) 2. Cte erori conine etd) n=5; x=v[0];
programul de mai jos? ete) for(k=1;k<n;k++)
esi) void main() etf) v[k-
esj) { 1]=v[k];
esk) int n,k; etg) v[n-1]=x;
esl) int v[n]; eth) a) (-1,5,14,-
esm) n=4 3,8,0,0)
esn) eti) b) (14,-3,8,-
for(k=0;k<n;k++) 1,0,0,5)
eso) v etj) c) (14,-3,8,-
[k]= =0; 1,5,0,0)
esp) } etk) d) (0,0,5,-
esq) a) 0 b) 1 3,14,-1,8)
c) 2 etl) e) (0,0,-1,14,-
esr) d) 3 e) 4 3,8,5)
ess) etm)
est) 3. Care dintre secvenele de etn)5. Cte elemente ale
program de mai jos calculeaz vectorului v vor avea valoarea
corect suma primelor n 9 dup execuia programului
elemente ale unui vector s ? de mai jos?
a) s=0; eto) #include<stdio.h
esu) for(i=0;i<n;i >
++) s+=v[i]; etp) void main()
b) s=0; i=0; etq) {
esv) while(i<n) etr) int
esw) { s+=v[i]; i++;} ets) v[]={0,1
c) s=0; i=0; ,2,0,4,5,6};
esx) do{ ett) int
esy) s+=v[i]; i+ i=0,x=9;
+; etu) do{
esz) }while(i<n-1); etv) v[i+
d) toate e) nici una +]=x;
eta) etw) }while(i<6
etb)4. Deducei care vor fi && v[i]);
elementele vectorului v dup etx) }
execuia secvenei de program ety) a) nici unul
urmtoare: b) unul
etz) c) dou d) trei
e) toate
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
eua) eur) a[3]
eub) 6. Fie programul [3]={{7,1,7},{-7,7,0},
urmtor : eus) {2,
euc) void main() 4,11}};
eud) { eut) n=3; x=7;
eue) int euu) for(i=0;i<n;i++)
i,j,m,n,p, euv) { nr=0;
euf) a[10] euw) for(j=0;j<n
[10],b[6]; ;j++)
eug) m=2; n=3; eux) if(a[i]
p=6; i=0; [j]==x) nr++;
euh) while(i<p) euy) b[i]=nr;
b[i++]=i; euz) }
eui) eva) a) nedefinite
for(i=0;i<m;i++) b) v=(0,0,0)
euj) evb) c) v=(1,2,3)
for(j=0;j<n;j++) d) v=(2,0,1)
euk) a[i] evc) e) v=(2,1,0)
[j]=b[3*i+j];
eul) } evd)
eum) n urma execuiei sunt eve) 8. Se consider
posibile urmtoarele situaii: secvena de program
a) programul nu funcioneaz urmtoare, n care a este o
din cauz c declaraia matrice cu n linii*n coloane i
matricei este eronat elemente numere ntregi, iar x
b) valorile vectorului b este o variabil de tip ntreg.
sunt 0,1,2,3,4,5 evf) x=1;
c) valorile vectorului b evg) for(i=1;i<=n-
sunt 1,2,3,4,5,6 1;i++)
d) a[1][0] are valoarea 3 evh) for(j=0;j<=i-
e) a[0][2] are valoarea 2 1;j++)
eun) evi) if(a[i][j]!
euo) 7. Se consider o =0) x=0;
matrice a cu n linii*n coloane evj) n urma execuiei secvenei,
i un vector v cu n elemente. valoarea variabilei x va fi 1
Precizai care vor fi elementele dac:
vectorului v, dup execuia a) deasupra diagonalei prin-
secvenei urmtoare: cipale exist cel puin
eup) int nr, n, i, j, un element egal cu 0
x, b[20]; b) toate elementele de dea-
euq) int supra diagonalei princi-
pale sunt 0
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
c) toate elementele de sub c) prezena caracterului ;
diagonala principal sunt dup al doilea ciclu for
diferite de 0 constituie o eroare
d) toate elementele de sub d) dac variabila n primete
diagonala principal sunt prin citire valoarea 5,
0 atunci programul afieaz
e) sub diagonala principal 32
exist cel puin un e) programul funcioneaz
element diferit de 0 corect pentru orice
evk) valoare ntreag a lui n
evl) 9. Fie urmtorul program: mai mic sau egal cu
evm) #include<stdio.h MAXINT
> evz)
evn) void main() ewa) 10. Care dintre
evo) { secvenele de program de mai
evp) int v[20], i, jos afieaz corect elementele
n, E; v[0], ......v[n-1] ale unui vector
evq) scanf(%d, de
&n); ewb)
evr) for(i=0;i<n;i ewc) ntregi ?
++) a) i=0;
evs) v[i]=i%2 ewd) while(i<n)
?i:-i; ewe) {printf(%d,v[i
evt) for(E=1,i=0;i ]);i++;}
<n; b) i=0;
evu) E*=v[i++]); ewf) while(i<n)
evv) E++; ewg) {i+
evw) printf(%d,E +;printf(%d,v[i]);}
); c) i=0;
evx) } ewh) do{ i++;
evy) n urma execuiei sale ewi) printf(%d,
sunt posibile urmtoarele v[i]);
situaii: ewj) }while(i<n);
a) expresia condiional din d) i=0;
primul ciclu for este ewk) do{ printf(%d,
eronat din punct de v[i]);
vedere sintactic ewl) i++
b) dac variabila n primete ewm) }while(i<n);
prin citire valoarea 6, e) nici una
atunci elementele ewn)
vectorului v vor fi, n ewo) 11. Care dintre
ordine (0,1,-2,3,-4,5) secvenele de mai jos afieaz
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
corect produsul elementelor atunci programul afieaz
pare ale unui vector valoarea 4
v[0],.......,v[n-1] cu n elemente d) dac elementele vectoru-
ntregi ? lui sunt 3,-2,8,6,11,4,
a) p=1; atunci programul afieaz
ewp) for(j=1;j<=n;j+ valoarea 4
+) e) indiferent care ar fi
ewq) if(v[j]%2==) elementele vectorului,
ewr) p=p*v[ secvena dat nu poate
j]; afia valoarea 0
b) p=1; exg)
ews) for(j=0;j<n;j++) exh) 13. Pentru secvena
ewt) if(v[j]/2==0) de program urmtoare,
p=p*v[j]; precizai care dintre afirmaiile
c) p=0; de mai jos sunt adevrate:
ewu) for(j=0;j<n;j++) exi) int j=0 ,
ewv) if(v[j]%2!=0) v[5]={1,1,1,1,1};
p=p*v[j]; exj) while(j<5&&v[j]&
d) p=1; &!v[j])
eww) for(j=0;j<n;j++) exk) {v[j]=0;j++;}
ewx) if(v[j]%2==0) a) expresia din while este
p*=v[j]; eronat sintactic
e) p=0; b) declaraia i iniializa-
ewy) for(j=0;j<n;j++) rea vectorului sunt
ewz) if(v[j]%2==0) corecte
p*=v[j]; c) dup execuia secvenei
exa) toate elementele vectoru-
exb) 12. Care dintre lui vor fi 1
afirmaiile de mai jos sunt d) dup execuia secvenei
adevrate pentru secvena de toate elementele vectoru-
program urmtoare ? lui vor fi 0
exc) p=0; e) execuia secvenei va
exd) for(k=1;k<6;k++) produce un ciclu infinit
exe) if(v[k]>v[p]) exl)
p=k; exm) 14. Precizai care va fi
exf) printf(%d, p); efectul secvenei de program
a) secvena este corect din urmtoare, n care
punct de vedere sintactic v[0],.....,v[n-1] este un vector
b) ciclul for are cinci pai cu n elemente ntregi.
c) dac elementele vectoru- exn) x=v[n-1];
lui sunt 5,4,-11,9,-12,1, exo) for(k=n-
1;k>0;k--)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
exp) v[k]=v[ exy) 16. Ce valoare va fi
k-1]; afiat n urma execuiei
exq) v[0]=x; programului urmtor?
a) deplaseaz toate elemen- exz) #include<stdio.h
tele vectorului cu o >
poziie la dreapta eya) void main()
b) deplaseaz toate elemen- eyb) {
tele vectorului cu o eyc) int
poziie la stnga eyd) v[]={0,1
c) terge un element din ,2,0,4,5,6};
vector prin deplasarea eye) int
celor aflate naintea lui j=0,nr=0;
d) rotete circular vectorul eyf) do{
cu o poziie eyg)
e) nici una din variantele if(j==v[j])
anterioare eyh)
exr) nr++;
exs) 15. Fie secvena de eyi) }while(j<6
program urmtoare, n care v &&v[j++]);
este un vector cu n elemente eyj)
ntregi, iar p este o variabil printf(%d,nr);
ntreag: eyk) }
ext) for(p=1,k=1;k<n; eyl) a) 0 b) 1 c)
k++) 3 d) 5
exu) if(v[k]==v[k- eym) e) programul
1]) p=0; intr n bucl
exv) printf(%d, p); infinit
exw) Secvena afieaz 0 eyn)
dac: eyo) 17. Deducei care vor
a) toate elementele sunt fi, n ordine, de la stnga la
distincte dou cte dou dreapta, elementele nenule ale
b) toate elementele sunt vectorului a la sfritul
egale execuiei secvenei de
c) exist dou elemente program urmtoare:
consecutive distincte eyp) int k, j=0;
d) exist dou elemente eyq) int
consecutive egale v[7]={0,2,7,3,4,8,5};
e) nici una din variantele eyr) int
de mai sus a[7]={0,0,0,0,0,0,0};
exx) eys) for(k=0;k<7;k++)
eyt) if((v[k]
%2==0)&&(k%2!=0))
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
eyu) { a[j]=v[k]; ezp) med=(float)s/n;
j++; } III) int i,n,;
eyv) a) 2,4,8 b) ezq) float med, s;
7,5 c) 2,8 ezr) s=0;
eyw) d) 2,3,8 e) ezs) for(i=0;i<n;i++)
7,3,5 s+=a[i];
eyx) ezt) med=s/n;
eyy) 18. Care parcurgere a) doar I b)doar II
pe linii i coloane a unei ezu) c) doar III
matrici n*m este corect ? d) doar II i
I) for(i=0;i<n;i++) III
eyz) for(j=0;j<m;j ezv)
++) ezw) 20. Calculul mediei
eza) printf(%d,a[i geometrice a unui ir de n
][j]); ntregi este:
II) for(j=1;j<m;j++) I) int i,n, pr;
ezb) for(i=1;i<m;i ezx) float med;
++) ezy) for(pr=1,i=0;i<n
ezc) printf(%d,a[i ;i++)
][j]); ezz) pr*=a[i];
III) for(i=0;i<n;i++) faa) med=sqrt(pr);
ezd) for(i=0;j<m;i II) int i,n, pr;
++) fab) float med;
eze) printf(%d,a[i fac) for(pr=1,i=0;i<n
][j]); ;i++)
a) doar I b)doar II fad) pr*=a[i];
ezf) c) doar I si II fae) med=pow(pr,
ezg) d) doar I si III 1/n);
ezh) III) int i,n, pr;
ezi) 19. Care din secvenele de faf) float med;
calcul a mediei unui ir de n fag) for(pr=1,i=0;i<n
ntregi este corect ? ;i++)
I) int i,n,s; fah) pr*=a[i];
ezj) float med; fai) med=pow(pr,
ezk) s=0; 1./n);
ezl) for(i=0;i<n;i++) a) doar I b) doar II
s+=a[i]; faj) c) doar III d)
ezm) med=s/n; doar II
II) int i,n,s; fak) i III
ezn) float med; fal)
ezo) for(i=0,s=0;i<n;
i++) s+=a[i];
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fam) 21. Ce secven fbe) for(i=2;i<n;i++)
calculeaz corect maximul fbf) y[i]=y[i-
unui ir cu n valori? 1]*x[i];
I) for(max=0, i=0;i<n;i+ fbg)elementul Y[n] exprim :
+;) a) x[1]*x[2]**x[n]
fan) if(a[i]>max) b) x[1]*x[2]*.*x[n]
max=a[i]; fbh) c) (-1)n
II) max=a[0]; x[1]*..*x[n]
fao) for(i=0;i< fbi) d) nici una din
n;i++) valorile indicate
fap) if(a[i]>a[i+ fbj)
+]) max=a[i]; fbk) 24. Fie V[1..n] vector de
III) max=a[0]; intregi . Secvena de program :
faq) for(i=0;i< fbl) i=1;
n;i++) fbm) for(i=1;i<=n/2;i
far) if(a[i]>max) ++)
max=a[i]; fbn) { j=n-i;
a) doar I b) doar II fbo) aux=v[i];
fas) c) doar III v[i]=v[j];
d) doar I fbp) v[j]=aux;
fat) i II fbq) }
fau) fbr) are ca efect :
fav) 22. Fie X[1..n] si Y[1..n] a) inversarea ordinii
vectori de ntregi. Care va fi fbs) elementelor n
valoarea lui Y[n] dup vector
execuia secvenei: b) inversarea ordinii
faw) Y[1]=x[1]; tuturor elementelor n
fax) for (i=2;i<n;i+ vector numai cnd n este
+) impar
fay) y[i]=y[i- c) inversarea ordinii
1]+x[i]; tuturor elementelor n
a) x[n]+x[n-1] b) x[n] vector numai cnd n este
faz) c) x[1]+x[2]+ par
..+x[n] d) nici una din variantele
fba) d) nici una din indicate
valorile indicate fbt)
fbb) fbu)25. Se consider matricea
fbc) 23. Fie X[1..n] si Y[1..n] ptratic A(mxm) . Fie
vectori de numere reale. Dup secvena de program :
execuia secvenei de program fbv) x=a[0][m-1];
: fbw) for(i=0;i<m;i++)
fbd) y[1]=-x[1];
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fbx) if(x<a[i][m- fcr) for(i=0;i<m;i++)
i]) fcs) for(j=0;j<i;j+
fby) x=a[i] +)
[m-i]; fct) s*=a
fbz) Variabila x calculat exprim : [i][j];
a) valoarea maxim de pe fcu) Valoarea calculat s reflect :
diagonala principal a) produsul valorilor de sub
fca) b) valoarea diagonala principal
maxim de pe diagonala b) produsul valorilor de pe
secundar diagonala secundar
fcb) c) valarea c) produsul valorilor din
maxim din ntreaga ntreaga matrice
matrice d) alt valoare dect cele
fcc) d) alt valoare indicate
decat cele indicate fcv)
fcd) fcw) 28. Fie o matrice
fce) 26. Fie matricea ptratic A(nxn) citit de la tastatur .
A(mxm) i secvena de Atunci secvena de cod :
program : fcx) i=0; m=a[0][0];
fcf) x=a[0][0]; fcy) while(i<n) {
fcg) for(i=0;i<m;i++) fcz) for(j=0;j<n;j+
fch) { if(x<a[i] +)
[i]) x=a[i][i]; fda) if(m<a[i]
fci) if(x<a[i][m- [j])
i-1]) fdb) m=a[i]
fcj) x=a[i] [j];
[m-i-1]; fdc) i++;
fck) } fdd) }
fcl) Variabila x calculat reflect : a) calculeaz elementul ma-
a) valoarea cea mai mare de xim m dintre elementele
pe diagonale matricii
fcm) b) valoarea cea b) calculeaz elementul mi-
mai mare de pe nim m dintre elementele
diagonala principal matricii
fcn) c) valoarea cea c) se cicleaz la infinit
mai mare de pe d) numr elementele matri-
diagonala secundar cii care sunt mai mari ca
fco) d) alt valoare m
decat cele indicate fde)
fcp) 27. Fie matricea A(mxm) i fdf) 29. Fie secvena de cod de
secvena de program: mai jos. Dac considerm ca
fcq) s=1; date de intrare tabloul V1 de
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
dimensiune n, atunci tabloul fdv) int i,j;
V0 va conine : fdw) int ctr=0;
fdg) for(i=0;i<n;i++) fdx) int tab[4][4];
fdh) v0[n-i- fdy) for(i=0;i<4;i++)
1]=v1[i]; fdz) for(j=0;j<4;j
a) elementele lui V1 n ++)
ordine invers fea) { tab[i]
b) o parte din elementele [j]=ctr;
lui V1 feb) ++ctr; }
fdi) c) numai elem. a) 7 b) 9 c) 11 d) 14
impare ale lui V1 fec)
fdj) d) algoritmul fed)32. Ce face urmtoarea
depune ele-mentele lui secven ?
V1 n ordine invers fee) scanf(%d,&n);
numai dac n este fef) for(i=0;i<n;i++)
impar scanf(%d,&a[i]);
fdk) feg) printf(\n%d,a[0]);
fdl) 30. Fie urmtoarea secven feh) for(i=1;i<n;i++)
de cod care primete o matrice fei) { ex=0;
M ptratic de dimensiune n la fej) for(j=0;j<i;j++)
intrare : fek) if(a[i]==a[j])
fdm) p=1; ex=1;
fdn) for(i=0;i<n;i++) fel) if(!ex)
fdo) p=p*m[i fem) printf(%d,a[
][i]-2; i]);
fdp)atunci aceasta realizeaz : fen) }
a) produsul elementelor din a) afieaz numerele dintr-
matrice un ir care sunt n mai
fdq) b) produsul multe exemplare
elementelor de pe b) afieaz numerele cu
diagonala principal a apariie singular n ir
matricii m c) afieaz numerele dintr-
fdr) c) o prelucrare un ir
a ele-mentelor de pe d) afieaz numerele impare
diagonala principal a dintr-un ir
matricii m feo)
fds) d) se cicleaz fep)33. Ce realizeaz urmtoarea
la infinit secven de program?
fdt) feq) i=0;
fdu)31. Care este valoarea fer) do {
elementului tab[2][3] dup fes) i++;
execuia secvenei de cod : fet) a[i]=nr%2;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
feu) nr/=2; ffr) b) 6 c) 12
fev) }while(nr); d) 24
few) n=i; ffs)
fex) for(i=n;i>0;i--) fft) 36. Fie secvena de cod :
fey) printf(%d ffu) int x,i,t;
,a[i]); ffv) int y[10]=
fez) a) convertirea ffw) {3,6,9,5,7,2,8,1
b10->b2 a unui numr 0,0,3};
fracionar ffx) while(1)
ffa) b) convertirea ffy) { x=0;
b10->b2 a unui numr ffz) for(i=0;i<9;i++)
ntreg fga) if
ffb) c) convertirea (y[i]>y[i+1])
b10->b3 a unui numr fgb) { t=y[i];
ntreg fgc) y[i]=y[i
ffc) d) convertirea +1];
b10->b2 a unui numr fgd) y[i+1]=t
ntreg pozitiv ;
ffd) fge) x++;
ffe) 34. Se d urmtoarea fgf) }
secven de cod: fgg) if(x==0) break;
fff) int fgh) }
y[5]={3,4,5,6,0}; fgi) Cum va arta vectorul dup
ffg) Ce valoare conine y[3] ? execuia acestui cod ?
ffh) 3 b) 5 c) 6 a) programul va rula la
ffi) d) codul nu infinit
compileaz pentru c b) {0,2,3,3,5,6,7,8,9,10}
nu sunt destule valori fgj) {10,9,8,7,6,5,3,3,2,0}
ffj) fgk) {3,6,9,5,7,2,8,10,0,3}
ffk) fgl)
ffl) 35. Se d codul : fgm) 37. Exist greeli n
ffm) short t[4][3]= secvena de calculare a mediei
ffn) {{1}, aritmetice?
{2,3},{4,5,6}}; fgn) #include<stdio.h
ffo) printf(%d\n,si >
zeof(t)); fgo) #include<conio.h
ffp) Presupunnd c tipul short >
este de lungime 2 octei, ce va fgp) void main(void)
afia codul de mai sus ? fgq) { int
ffq) a) nu va compila a[30],i,n=20;
pentru c nu sunt dai fgr) int s=0;
destui iniializatori float ma;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fgs) for(i=0;i<n; fha) =%f,ma);
i++) fhb) getch();
fgt) { printf(\ fhc) }
na[%d]=,i); a) nu, secvena este corect
fgu) scanf(%d b) da, deoarece nu au fost
,&a[i]); citite toate elementele
fgv) } tabloului
fgw) for(i=0;i<n; c) da, deoarece va fi
i++) afiat doar partea
fgx) s=s ntreag a rezultatului
+a[i]; d) da, deoarece nu au fost
fgy) ma=s/n; citite corect toate
fgz) printf(\nRe elementele vectorului
zultatul
fhd)
fhe)
fhf)
fhg)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fhh) Cap.7 Pointeri
fhi) 7.1 Variabile pointer
fhj)
fhk) n memoria intern, valorile variabilelor 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 bytul sau octetul. S
presupunem variabila de tip ntreg a cu valoarea 7 ce ocup n memorie doi octei.
Valoarea variabilei a, care este 7, ocup o locaie de memorie care se poate referi
direct prin numele variabilei sau indirect prin adresa ei, adr(a).
fhl) O variabil capabil s stocheze adresa unei alte variabile se
numeste pointer.
fhm) Limbajul C pune la dispoziie doi operatori pentru lucru cu adrese :
- operatorul & cu rol de extragere a adresei unei variabile
- operatorul * cu rol de extragere a coninutului zonei de memorie adresate de o
variabil pointer
fhn)Variabila pointer se definete n concordan cu un tip de dat. De exemplu,
declaraia int *px; precizeaz c px este un pointer spre ntreg, adic
variabila px este capabil s stocheze adresa unui ntreg. Operatorul * , n
declaraie, are rolul de a exprima faptul c nu px este de tip ntreg ci
coninutul de la adresa memorat n px este de tip ntreg. Deci px este un
pointer la ntreg.
fho)Fie programul :
fhp) #include<stdio.h>
fhq) void main()
fhr) {
fhs) int x=5,*px;
fht) px=&x;
fhu) printf(\nx=%d,x);
fhv) printf(\nx=%d,*px);
fhw) }
fhx) n urma execuiei lui se va afia de dou ori valoarea variabilei x, adic 5. n
primul caz s-a folosit adresarea direct a variabilei folosindu-se numele ei. n
al doilea caz s-a folosit adresarea indirect a variabilei, mai precis, s-a extras
coninutul de la adresa ei (*px). Se observ c, n prealabil, adresa variabilei
x a fost stocat n pointerul px.
fhy) Pe lng definirea de pointeri spre tipurile fundamentale cum ar fi :
fhz) float *py; - py este un pointer la float
fia) char *pc; - pc este un pointer la caracter
fib) exist posibilitatea definirii acestora i spre tipuri structurate de date. Astfel,
declaraiile :
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fic) int (*px)[10]; exprim faptul c px este un pointer la un vector
cu 10 elemente de tip ntreg
fid) int *pt[10]; exprim faptul c pt este un vectori de pointeri la
ntregi.
fie) Este important ca pointerul s stocheze adresa unei variabile ce are un tip
bine definit, pentru ca expresii de genul *pointer s se poat evalua corect
Coninutul de la o adres poate fi de dimensiuni diferite, minim un octet.
Avnd bine precizat tipul de dat referit de pointer, coninutul de la acea
adres este extras n mod corect n funcie de mrimea n octei a tipului de
dat respectiv. n exemplu, *px refer doi octei de la adresa stocat n px
considernd c un ntreg se memoreaz pe 2 octei. Exist i pointerul
generic, adic un pointer fr tip de dat asociat (spre void) ce se declar
sub forma void *p. Acest tip de pointer este folosit mai mult pentru transferul
i stocarea adreselor n cadrul programelor.
fif) Un alt aspect important ce ine de lucrul cu variabile pointer, care
genereaz erori n munca de programare, se refer la faptul c se poate accesa
coninutul unei variabile 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
valid .
fig) Prezentm dou moduri de ncrcare a unui pointer :
a) cu adresa unei variabile anterior definit; n acest caz alocarea s-a fcut la
momentul definirii variabilei :
fih) int a=30,*pa;
fii) pa=&a;
b) prin alocare dinamic de memorie ce se face n momentul execuiei programului ;
pentru realizarea unei astfel de operaii se poate folosi operatorul new. Forma
general este :
fij) pointer=new tip;
fik) unde : - pointer reprezint variabila pointer ce urmeaz a se ncrca
fil) - tip reprezint un tip de date pentru care se face alocarea zonei de
memorie; se folosete pentru a determina mrimea n octei a zonei de
memorie ce urmeaz a se aloca i care este egal cu sizeof(tip) .
fim) Exemplu:
fin) int *pi;
fio) pi=new int;
fip) *pi=5;
fiq) printf(\n%d,*pi);
fir) n cazul n care se dorete a se aloca o zon de memorie care s stocheze
mai muli ntregi (nr) atunci se va folosi operatorul new n forma :
fis) pointer=new tip[nr];
fit) unde : - tip este tipul de dat referit de pointer
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fiu) - nr reprezint numrul de elemente de tipul tip
fiv) Mrimea n octei ce se va aloca se obine conform relaiei : nr*sizeof(tip) .
fiw) Legat de acest operator, limbajul C pune la dispoziie i operatorul delete
pentru dealocarea unei zone de memorie alocat n prealabil cu operatorul
new. Forma de utilizare a operatorului este :
fix) delete pointer sau delete [nr]pointer
fiy) unde : - pointer reprezint variabila pointer
fiz) - nr reprezint numrul de elemente cu tipul referit de variabila
pointer
fja) Exemplu: Se va aloca dinamic o zon de memorie capabil s stocheze n
valori double, dup care spaiul va fi dealocat.
fjb) double *p;
fjc) int n=5;
fjd) p=new double[n];
fje)
fjf) delete [n]p;
fjg) Memoria alocat dinamic i pstreaz coninutul pn cnd se dealoc n
mod explicit n cadrul programului.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fju) /* ambele variabile pointer conin adresa lui a */
fjv) printf(\n a=%d a=%d,*pa1,*pa2);
fjw) Se va afia de dou ori valoarea 7 indirect, prin intermediul celor doi pointeri
care conin aceeai adres.
4) Operaia de incrementare, respectiv decrementare a unui pointer, presupune
obinerea unei adrese mai mari, respectiv mai mici, n funcie de dimensiunea
tipului de dat referit de pointer.
fjx) Exemplu :
fjy) double a[]={5.3,2.1},*pa;
fjz) pa=&a[0];
fka) /* adresa de nceput a tabloului , adic adresa elementului a[0] */
fkb) printf(\n Primul element=%lf,*pa);
fkc) pa++;
fkd) /* conine adresa urmtorului element din tablou , adic adresa lui
a[1] */
fke) printf(\n Al doilea element=%lf,*pa);
5) Operaia de adunare a unui ntreg la un pointer. Dac se adun variabila k la un
pointer spre tipul TIP se obine o dres mai mare cu k*sizeof(TIP).
fkf) Exemplu :
fkg) double a[]={5.3,2.1,8.9,10},*pa;
fkh) int i;
fki) pa=&a[0];
fkj) i=2;
fkk) printf(\n %lf,*(pa+i));
fkl) /* se va afia al treilea element din vector adic 8.9 */
fkm) i=3;
fkn) print(\n %lf,*(pa+i));
fko) /* se va afia al patrulea element din vector adic 10 */
6) Operaia de conversie ntre pointeri. Aceast operaie se face cu ajutorul
operatorului de conversie explicit (cast). Pentru exemplificare vom prezenta o
funcie ce are ca scop alocarea dinamic de memorie . Ea are prototipul : void
*malloc(int); care se afl n header-ul alloc.h. Parametrul are ca scop
dimensionarea zonei de memorie n octei i funcia returneaz adresa la care s-a
alocat zona de memorie. Se observ 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. De aceea, el trebuie convertit ntr-un pointer spre un tip
de dat bine precizat. Pentru dealocarea zonei de memorie ce a fost alocat
anterior cu funcia malloc, biblioteca limbajului pune la dispoziie funcia free care
are prototipul : void free(void *);
fkp) Parametrul funciei reprezint pointerul ncrcat printr-un apel al funciei
malloc. n secvena :
fkq) int *pa,n=5;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fkr) pa=(int*)malloc(n*sizeof(int));
fks) /* conversie n pointer spre ntreg */
fkt)
fku) free(pa);
fkv) s-a alocat o zon de memorie capabil s stocheze 5 variabile de tip ntreg.
Adresa zonei a fost stocat n variabila pointer spre ntreg pa. Dup ce s-au
efectuat prelucrrile necesare asupra zonei de memorie i ea nu mai este
necesar n program, atunci se elibereaz spaiul cu funcia free.
7) Operaia de scdere a doi pointeri necesit ca pointerii s fie spre acelai tip.
Rezultatul 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 TIP
atunci diferena dintre doi pointeri (p1 i p2) se calculeaz dup relaia (p1-
p2)/sizeof(TIP).
fkw) Ca exemplu, se va scrie secvena de program care determin
lungimea unui ir de caractere :
fkx) char sir[50],*pc;
fky) printf(\n Dati sirul : );gets(sir);
fkz) pc=&sir[0]; //adresa de nceput a irului
fla) while(*pc++);
flb) //parcurgem caracterele pn ajungem la
terminatorul \0
flc) printf(\n Lungimea sirului este %d,pc-sir-1);
8) Operaia de comparaie dintre pointeri se realizeaz folosind operatorii de
egalitate i cei relaionali. Astfel, ca exemplu, se va prezenta secvena de
traversare a unui vector n scopul afirii elementelor sale:
fld) int a[]={5,4,3,2,7};
fle) int n=sizeof(a)/sizeof(int); /* numrul de elemente din
vector*/
flf) int *p1,*pc;
flg) //pc se ncarc cu adresa primului element,a[0]
flh) //p1 se ncarc cu adresa ultimului element,a[n-1]
fli) for(pc=&a[0],p1=&a[n-1];pc<=p1;pc++)
flj) printf(\n elementul %d,*pc);
flk) //se parcurg elem. tabloului prin incrementarea lui
pc
fll)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fma) int *pa,n,s;
fmb) printf(\n Nr. de elemente=);
fmc) scanf(%d,&n);
fmd) pa=(int*)malloc(n*sizeof(int));
fme) //instruciunea este echivalent cu pa=new int[n]
fmf) for(int i=0;i<n;i++)
fmg) { printf(\n elem[%d]=,i+1);
fmh) scanf(%d,&pa[i]);
fmi) }
fmj) for(i=s=0;i<n;i++) s+=pa[i];
fmk) printf(\n suma=%d,s);
fml) Se observ c elementele zonei de memorie referite de pointerul pa au fost
accesate folosindu-se adresarea indexat pa[i] care este specific lucrului cu
tablouri.
fmm) Observaie: Aceast metod de alocare a memoriei necesar unui
vector este extrem de eficient deoarece se va aloca exact cantitatea de
memorie necesar numrului real de elemente al tabloului. Reamintim c n
cazul alocrii statice de forma int a[100], compilatorul aloc memorie pentru
100 de ntregi, chiar dac n realitate programul va atuliza n execuie mult
mai puine elemente.
fmn) Metoda de alocare se poate aplica fr probleme i n cazul
matricilor. innd cont c o matrice este un vector de vectori i a[i] este
adresa de nceput a liniei i, este necesar un pointer la pointer ca n exemplul
urmtor:
fmo) #include<stdio.h>
fmp) #include<malloc.h>
fmq) void main()
fmr) {
fms) int **a,n,i,j,s=0;
fmt) printf("n="); scanf("%d",&n);
fmu) //dimensiunea matricii ptratice
fmv) a=new int*[n];
fmw) //a se ncarc cu n pointeri la ntreg,
fiecare
fmx) //reprezentnd adresa de nceput a unei linii
fmy) for(i=0;i<n;i++)
fmz) a[i]=new int[n];
fna) //fiecare a[i] se ncarc cu adresa a n
ntregi din
fnb) //linia i
fnc) for(i=0;i<n;i++)
fnd) for(j=0;j<n;j++)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fne) {
fnf) printf("a[%d,%d]=",i,j);
fng) scanf("%d",&a[i][j]);
fnh) //n continuare, a se folosete ca orice
matrice
fni) //prin indici
fnj) s+=a[i][j];
fnk) }
fnl) printf("suma elementelor=%d\n",s);
fnm) }
fnn) n limbajul C, pointerii i tablourile sunt n strns legtur ei fiind de
fapt interschimbabili. Dac folosii numele unui tablou fr index, generai de fapt un
pointer ctre primul element al tabloului. Iat de ce nu este necesar nici un index
atunci cnd are loc citirea unui ir folosind funcia gets(). Ceea ce este transferat
funciei gets() nu este un tablou, ci un pointer. De fapt, n C nu se poate transfera un
tablou unei funcii, ci numai un pointer ctre tablou. Funcia gets() folosete un pointer
pentru a ncrca tabloul de caractere introdus de la tastatur.
fno)Exemplul 1: Deoarece numele unui tablou fr index este un pointer ctre
primul element al tabloului, aceast valoare poate fi asignat unui alt pointer
i prin aceasta devine posibil accesarea elementelor tabloului folosind
pointerul aritmetic. S considerm urmtorul program:
fnp) #include<stdio.h>
fnq) int a[10]={1,2,3,4,5,6,7,8,9,10};
fnr) void main()
fns) { int *p;
fnt) p=a; /* asigneaz lui p adresa de nceput a tabloului a */
fnu) /* afiarea primelor trei elemente ale tabloului a */
fnv) printf(%d %d %d,*p,*(p+1),*(p+2));
fnw) /* afieaz acelai lucru */
fnx) printf(%d %d %d,a[0],a[1],a[2]);
fny) }
fnz) n acest caz, ambele instruciuni printf() afieaz acest lucru.
Parantezele din expresii ca *(p+2) sunt necesare, deoarece operatorul *
referitor la pointeri are o preceden mai mare dect operatorul +. Dac
folosii un pointer pentru a accesa un tablou bidimensional, trebuie s
executai manual ceea ce compilatorul face automat. De exemplu, n tabloul
float balance[10][5];fiecare rnd are 5 elemente. Pentru a accesa
balance[3][1] folosind un pointer de tip float, trebuie utilizat un fragment de
forma: *(p+(3*5)+1); sau *(*(p+3)+1);
foa)n general, la tablourile multidimensionale este mai uoar folosirea indexrii
numelui dect folosirea pointerului aritmetic.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fob)Exemplul 2: Un pointer se poate indexa ca i cnd ar fi un tablou. Urmtorul
program este valid:
foc) #include<stdio.h>
fod) char str[]=Pointerii sunt puternici;
foe) void main()
fof) { char *p;
fog) int j;
foh) p=str;
foi) for(j=0;p[j];j++) /* ciclare pn la ntlnirea
caracterului NULL */
foj) printf(%c,p[j]);
fok) }
fol) Exemplul 3: Un pointer poate fi indexat numai dac el puncteaz un tablou.
Dei urmtorul program este corect din punct de vedere sintactic, executarea
lui va conduce probabil la blocarea calculatorului:
fom) char *p,ch;
fon) int i;
foo) p=&ch;
fop) for(i=0;i<10;i++) p[i]=A+i;
foq)ntruct ch nu este un tablou, pointerul p nu poate fi indexat. Dei un pointer
punctnd un tablou poate fi indexat ca i cum ar fi un tablou, rareori se va
proceda astfel, deoarece, n general, prin folosirea pointerilor aritmetici se
obin programe mai rapide.
for) Exemplul 4: n biblioteca ctype.h exist funciile toupper() i tolower() care
transform literele mici n litere mari i invers. Urmtorul program cere
utilizatorului s introduc un ir de caractere i apoi afieaz irul introdus mai
nti cu litere mari i apoi cu litere mici. Versiunea urmtoare, pentru a accesa
caracterele din ir, indexeaz numele tabloului.
fos) #include<stdio.h>
fot) #include<ctype.h>
fou) #include<conio.h>
fov) void main()
fow) { char str[80];
fox) int i;
foy) clrscr();
foz) printf(Introduceti un sir : );
fpa) gets(sir);
fpb) for(i=0;str[i];i++) str[i]=toupper(str[i]);
fpc) puts(sir); /* afiarea cu litere mari */
fpd) for(i=0;sir[i];i++) str[i]=tolower(str[i]);
fpe) puts(sir); /* afisarea cu litere mici */
fpf) getch();
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fpg) }
fph)Exemplul 5: n varianta urmtoare este folosit un pointer pentru a accesa
caracterele irului i este preferat de programatorii profesioniti deoarece
incrementarea unui pointer este mai rapid dect indexarea unui vector.
fpi) #include<stdio.h>
fpj) #include<ctype.h>
fpk) #include<conio.h>
fpl) void main()
fpm) { char str[80], *p;
fpn) int i;
fpo) clrscr(); printf(introduceti sirul: );
gets(str);
fpp) p=str; //adresa de nceput a irului
fpq) while(*p) *p++=toupper(*p); //pn cnd gsete
\0
fpr) puts(sir); // afiarea cu litere mari
fps) p=str;
fpt) while(*p) *p++=tolower(*p);
fpu) puts(str); // afiarea cu litere mici
fpv) getch();
fpw) }
fpx) Exemplul 6: Un pointer poate fi i decrementat. Urmtorul program
folosete un pointer pentru a copia coninutul unui ir n alt ir, n ordine
invers:
fpy) #include<stdio.h>
fpz) #include<string.h>
fqa) char str1[]=Pointerii sunt foarte utili;
fqb) void main()
fqc) { char str2[80],*p1,*p2;
fqd) // p1 va puncta sfritul irului str1
fqe) p1=str1+strlen(str1)-1;
fqf) p2=str2; // nceputul irului str2
fqg) while(p1>=str1) *p2++=*p1--;
fqh) *p2=\0;
fqi) //caracterul \0 incheie sirul str2, trebuie
adgat n
fqj) //mod explicit
fqk) printf(%s %s,str1,str2);
fql) getch();
fqm) }
fqn)Exemplul 7: Limbajul C permite utilizarea irurilor constante (iruri de
caractere scrise ntre ghilimele). Cnd compilatorul ntlnete un astfel de ir,
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
l depune n tabela de iruri a programului i genereaz un pointer ctre el. De
exemplu, programul urmtor citete iruri pn cnd este tastat irul stop :
fqo) #include<stdio.h>
fqp) #include<sting.h>
fqq) char *p=stop;
fqr) void main()
fqs) {
fqt) char str[80];
fqu) do{
fqv) printf(introduceti un sir : );
fqw) gets(str);
fqx) }while(strcmp(p,str));
fqy) //ct timp str diferit de stop
fqz) }
fra) Folosirea pointerilor ctre irurile constante poate fi foarte util cnd aceste
constante sunt foarte lungi. De exemplu, s presupunem c, n anumite
puncte ale sale, un program afieaz un mesaj. Pentru a tasta ct mai puin,
trebuie aleas varianta de a iniializa un pointer ctre un ir constant i apoi,
cnd trebuie afiat mesajul, s fie folosit acest pointer.
frb) char *p=Insert disk into drive A then press
ENTER;
frc) ..
frd) printf(p);
fre)
frf) printf(p);
frg) .
frh) Un alt avantaj al acestei metode const n faptul c, dac mesajul trebuie
modificat, schimbarea trebuie fcut o singur dat i toate referirile la mesaj
vor reflecta modificarea fcut.
fri) Exemplul 8: Funcia gets() citete caracterele introduse de la tastatur pn
cnd este apsat tasta Enter. Dac operaia se termin cu succes, gets()
returneaz un pointer ctre nceputul irului. n cazul unei erori este returnat
un pointer null. Programul urmtor arat cum poate fi folosit pointerul returnat
de gets() pentru a accesa un ir care conine informaii de intrare. nainte de a
folosi irul, programul verific dac nu au aprut erori de citire.
frj) #include<stdio.h>
frk) void main()
frl) { char str[80],*p;
frm) printf(Introduceti un sir :);
frn) p=gets(str);
fro) // dac p nu este null se afieaz irul
frp) if(p)printf(%s %s,p,str);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
frq) }
frr) Dac dorii s fii siguri c funcia gets() nu a lucrat cu erori, o putei plasa
direct n instruciunea if ca n exemplul urmtor :
frs) #include<stdio.h>
frt) void main()
fru) { char str[80];
frv) printf(Introduceti un sir : );
frw) // dac pointerul ctre nceputul irului nu este null se produce
afiarea
frx) if(gets(str)) printf(%s,str);
fry) }
frz)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
d) ambele cicluri sunt gat) 27. Ce va afia programul
corecte urmtor?
e) n cele dou cicluri, gau) #include<stdio.h
elementele vectorului vor >
primi valori egale n gav) void main()
modul, dar de semne opuse gaw) {
gad) gax) int (*v)
gae) 26. Se consider [3];
programul urmtor: gay) int
gaf) #include<stdio.h u[]={10,11,12};
> gaz) v=&u;
gag) void main() gba)
gah) { printf(%d,(*v)[1];
gai) int a=5,b=- gbb) }
12,c=7,*v[3]; gbc) a) programul
gaj) v[0]=&a; // este eronat
(1) gbd) b) o adres de
gak) printf(%d\n, memorie oarecare, fr
*v[0]);//(2) nici-o semnificaie
gal) *(v+1)=&b; // gbe) c) valoarea
(3) ntreag 11
gam) printf(%d\n, gbf) d) adresa de
*(*(v+1))); //(4) memorie la care se
gan) 2[v]=&c; // afl valoarea ntreag
(5) 11
gao) printf(%d\n, gbg) e) adresa
*v[2]);//(6) ncepnd cu care se
gap) } gsete vectorul v n
gaq) a) declaraia memorie
vectorului este gbh)
gar) eronat gbi) 28. Se consider urmtoarea
b) atribuirile (1), (3) i (5) secven de program:
sunt toate corecte gbj) int a[9]
c) atribuirea (1) este corect, [11],i,j;
iar (3) i (5) sunt eronate gbk) for(i=0;i<9;i++)
d) atribuirile (1) i (3) sunt gbl) for(j=0;j<11;
corecte, iar (5) este j++)
eronat gbm) if(i==j)
e) programul este corect i gbn) (*(a+
afieaz valorile 5, -12, 7 i)) [j]=0;
gas) gbo) else
*(*(a+i)+j)=i*j;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gbp) Precizai care dintre gck) int a[20]
afirmaiile de mai jos sunt [20],i,j,n=4;
false: gcl)
gbq) a) a[5][2] este for(i=0;i<n;i++)
10 gcm)
gbr) b) a[8][0] este for(j=0;j<n;j++)
6 gcn) *(*(a+i)
gbs) c) *(*(a+3)+3) +j)=(i>j)?
este 0 gco) (j-
gbt) d) programul i) : (j+i);
conine erori de gcp) int m=10;
sintax gcq)
gbu) e) matricea a for(i=0;i<n;i++)
este simetric fa de gcr)
diagonala principal for(j=0;j<n;j++)
gbv) gcs) if(m>(
gbw) 29. Se consider *(a+i))[j])
urmtoarele declaraii de gct)
variabile: m=a[i][j];
gbx) int q=6,d[3][4], gcu)
(e[3])[4],v[4]; printf(%d,m);
gby) int *a[3][4], gcv) }
(*b)[3][4], gcw) a) 10 b)6 c)
gbz) (*c[3])[4]; 3 d) 3
gca) Care dintre atribuirile gcx) e) programul
de mai jos sunt corecte? este eronat
gcb) a) d[0][2]=e[1] gcy)
[3]; gcz) 31. Fie vectorul y cu
gcc) b) a[2][3]=&q; patru elemente numere ntregi:
gcd) c) b=&d; gda) int
d) c[2]=&v; y[4]={0,1,2,3};
gce) e) toate gdb) Care dintre
atribuirile ante- urmtoarele instruciuni
rioare declar i iniializeaz corect
gcf) un pointer ptr ctre vectorul y?
gcg) 30. Precizai ce gdc) a) int
valoare va afia programul *(ptr[4])=&y;
urmtor: gdd) b) int (ptr*)
gch) #include<stdio.h [4]=&y;
> gde) c) int (*ptr)
gci) void main() [4]=&y;
gcj) {
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gdf) d) int din cauza folosirii
ptr*[4]=&y; operatorului de atribuire
gdg) e) int n funcia printf
*ptr[4]=&y; gdx)
gdh) gdy) 33. Fie urmtorul
gdi) 32. Fie urmtorul program: program:
gdj) #include<stdio.h gdz) #include<stdio.h
> >
gdk) void main() gea) void main()
gdl) { geb) {
gdm) int gec) int
u[4]={1,2,3,4}, x[4]={1,2,3},
gdn) v[4]={ ged) y[4]={4,5,6,
5,6,7,8}, 7},
gdo) w[4]={ gee) z[7];
0,0,0,0}, i; gef) int i,j;
gdp) int (*x) geg)
[4]=&u, for(i=0;i<4;i++)
gdq) (*y) geh) *(
[4]=&v, z+i)=*(y+i);
gdr) (*z) gei)
[4]=&w; for(j=0;j<3;j++)
gds) gej) *(z+
for(i=0;i<4;i++) i+j)=*(x+j);
gdt) printf(% gek)
3d, for(i=0;i<7;i++)
gdu) (*z)[i]=(*x) gel) printf(
[i]+(*y)[i]); %d,*(z+i));
gdv) } gem) }
gdw) Care dintre afirmaiile gen) Care vor fi valorile
de mai jos sunt adevrate? afiate n urma execuiei sale?
a) programul va afia patru geo) a) 1,2,3,4,5,6,7
adrese de memorie
b) programul va afia, n gep) b) 7,6,5,4,3,2,1
ordine, valorile 6,8, geq) c) 3,2,1,7,6,5,4
10,12 ger) d) 4,5,6,7,1,2,3
c) valoarea lui (*x)[2] este ges) e) programul
3 este eronat
d) valoarea lui (*y)[4] este get)
8 geu) 34. Fie secvena de
e) instruciunea de afiare instruciuni:
din ciclu este eronat,
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gev) int gfn)37. Fie urmtoarea declaraie
x[]={10,20,30,40,50}; de variabile :
gew) int*ptr=x; gfo) int *p; int
gex) printf(%d\n,*( x,y;
ptr+2)); gfp)Atribuirea x=y; este
gey) printf(%d\n,*( echivalent cu secvena :
ptr)+2); a) p=&x; *p=y;
gez) Ce se va tipri dup b) p=&y; *p=x;
executarea codului de mai c) *p=x; p=&y;
sus? d) *p=y; p=&x;
gfa) a) 30 30 gfq)
b) 30 12 gfr) 38. Fie urmtoarea declaraie
gfb) c) 12 12 de variabile :
d) 12 30 gfs) int *p; int
gfc) x,y;
gfd)35. Fie secvena de gft) Instruciunea x++; este
instruciuni: echivalent cu secvena :
gfe) int *array[3]; a) p=&x; (*p)++;
gff) int(*ptr) b) p=*x; (&p)++;
[]=array; c) p=&x; *(p++);
gfg) int x=2,y=3,z=4; d) p=&x; *p++;
gfh)Avnd n vedere codul de mai gfu)
sus, cum vei realiza atribuirea gfv) 39. Fie urmtoarea declaraie
celui de al doilea pointer din de variabile :
irul ptr ca s pointeze la gfw) int *p; int
valoarea lui y ? x,y;
a) ptr[2]=&y; gfx) p=&x;
b) (*ptr)[1]=y; gfy) Atribuirea y=x*(x+1); este
c) (*ptr)[1]=&y; echivalent cu secvena :
d) (*ptr)[2]=&y; a) y=*p*((*p)++);
gfi) b) y=*p*(*p++);
gfj) 36. Fie urmtoarea declaraie c) y=*p**p++;
de variabile : d) y=(*p)*(*p++);
gfk) int *p; int gfz)
x,y; gga) 40. Fie urmtoarea
gfl) Atribuirea y=x+100; este declaraie de variabile :
echivalent cu secvena: ggb) int *p; int
a) p=&x; y=*p+100; x=100,y; p=&x;
b) y=*p+100; p=&x; ggc) n urma atribuirii
c) p=&y; y=*p+100; y=*p*((*p)++); y va avea
d) p=&x; y=&p+100; valoarea :
gfm)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ggd) a) 10100 b) ghb) q=(int*)malloc
11000 ghc) (sizeof(
gge) c) 10001 d) int));
10000 ghd) *p=5; *q=3;
ggf) *p=*q;
ggg) 41. Fie urmtoarea ghe) if(p==q)
declaraie de variabile : *p+=1;
ggh) int *p; int ghf) printf(%d,
x=100, y; p=&x; *p);
ggi) n urma atribuirii y=*p+((*p) ghg) }
++); y va avea valoarea : ghh) Care este valoarea
a) 201 b) 102 c) 200 afiat pentru p :
ggj) d) 202 ghi) a) 5 b) 3
ggk) c)6 d)4
ggl) 42. Fie secvena : ghj)
ggm) int ghk) 45. Se d urmtoarea
t[5]={20,30,40,50,10}; secvent de cod:
ggn) int *p; int x; ghl) int
ggo) Atribuirea x=t[3]; a[5]={1,2,3,4,5};
este echivalent cu : ghm) int *aPtr;
a) p=t; x=*(p+3); ghn) aPtr=a;
b) p=&t[0]; x=*(p+2); gho) printf(element=
c) p=*t; x=*p+3; %d\n,
d) p=t; x=*p+3; ghp) *(
ggp) aPtr+2));
ggq) 43. Fie secvena : ghq) Ce va afia codul de
ggr) int mai sus dup execuie ?
t[5]={20,30,40,50,10}; a) element=1
ggs) int *p; int x; b) element=2
ggt)Atribuirea x=*(&t[0]+3); c) element=3
d) element=4
este echivalent cu :
a) x=t[3]; b) x=t[4]; ghr)
ggu) c) x=*(&t[2]); ghs) 46. Se d codul:
d) x=*(t+4); ght) int *ptr; int
y[10];
ggv)
ghu) int i;
ggw) 44. Se consider
ghv) for(i=0;i<10;i+
secvena de program:
ggx) void main(void) +) y[i]=i;
ggy) { int *p, *q; ghw) ptr=y; ptr+=8;
ggz) p=(int*)malloc ghx) printf(ptr=
gha) (sizeof( %d\n, *ptr);
int));
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
ghy) Ce se va afia cnd a) ptr=0 b) ptr=9
codul este executat ? ghz) c) ptr=7
d) ptr=8
gia)
gib)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gic) Cap.8 iruri de caractere
gid)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
care s poat conine i caracterele neateptate. Exist un mod mult mai
simplu de a afia irurile, folosind funcia printf() sau puts() . Programul
anterior, rescris cu ajutorul acestei funcii este :
giv) #include<stdio.h>
giw) void main()
gix) { char str[80];
giy) int j;
giz) printf(Introduceti un sir (< de 80 de
gja) caractere):\n);
gjb) gets(str);
gjc) printf(%s,str); // puts(sir);
gjd) }
gje)
gjf) Dac dup afiarea irului se dorete trecerea la o linie nou, se poate afia
str dup cum urmeaz :
gjg) printf(%s\n,str);
gjh) Aceast metod folosete specificatorul de format %s urmat de caracterul
linie nou i utilizeaz tabloul de caractere ca al doilea argument al funciei
printf().
gji)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
calculul lungimii irurilor de caractere
copierea irurilor de caractere
concatenarea irurilor de caractere
compararea irurilor de caractere
cutarea n iruri de caractere
gjr) Funciile standard prin care se realizeaz aceste operaii au fiecare un
nume care ncepe cu prefixul str i au prototipul n fiierul header string.h care
trebuie inclus n program.
gjs)
gjt)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gkn) 8.3.2 Copierea unui ir de caractere
gko)
gkp) Adesea este nevoie 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 : char
*strcpy(char *dest, const char *sursa);
gkq) Funcia copiaz irul de caractere spre care pointeaz sursa n zona
de memorie a crei adres de nceput este valoarea lui dest. Funcia copiaz att
caracterele proprii irului, ct i caracterul \0 de la sfritul irului respectiv. 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 rezervat la adresa definit de parametrul dest. La revenire, funcia
returneaz adresa de nceput a zonei n care s-a transferat irul, adic chiar valoarea
lui dest. Aceast valoare este pointer spre caractere, deci tipul returnat de funcie este
: char*. Se observ c parametrul sursa, care definete zona n care se afl irul ce
se copiaz, este declarat prin modificatorul const. Aceasta deoarece funcia strcpy
nu are voie s modifice irul care se copiaz. n schimb, parametrul dest nu este
declarat cu parametrul const deoarece funcia strcpy modific zona spre care
pointeaz dest (n ea se copiaz caracterele irului).
gkr) Exemplul 1:
gks) char tab[]=Acest sir se copiaza;
gkt) char t[sizeof(tab)]; /* are acelai numr de elemente ca i
tab */
gku) ..
gkv) strcpy(t,tab); /* irul din tab se copiaz n zona
alocat lui t */
gkw) Exemplul 2:
gkx) char t[100];
gky) strcpy(t,Acest sir se copiaza);
gkz) // se copie la adresa t irul constat dat ca al
doilea parametru
gla)Exemplul 3:
glb) char *p=Acest sir se copiaza;
glc) char t[100];
gld) char *q;
gle) q=strcpy(t,p);
glf) irul pstrat n zona spre care pointeaz p se transfer n zona spre care
pointeaz t. Valoarea lui t se atribuie lui q.
glg) Pentru a copia cel mult n caractere ale unui ir dintr-o zon de
memorie n alta, se va folosi funcia de prototip : char *strncpy(char *dest , const
char *sursa, unsigned n);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
glh) Dac n>lungimea irului spre care pointeaz sursa, atunci toate caracterele
irului respectiv se transfer n zona spre care pointeaz dest. Altfel se
copiaz numai primele n caractere ale irului. n rest, funcia strncpy are
acelai efect ca i strcpy.
gli) Exemplu:
glj) char *p=Acest sir se copiaza trunchiat;
glk) char t[10];
gll) strncpy(t,p,10); /* se vor copia numai primele 10 caractere*/
glm)
gln) Funcia strdup copiaz un ir ntr-o locaie nou creat i are prototipul
: char *strdup(consr char *s);
glo) Funcia strdup face copierea unui ir n spaiul obinut prin apelul funciilor
calloc sau malloc. Nu este deci necesar o apelare explicit a funciei de
alocare. Dimensiunea spaiului alocat este egal cu lungimea irului+1
(caracterul \0). Utilizatorul este responsabil pentru eliberarea spaiului atunci
cnd nu mai este nevoie de ir. Valoarea ntoars este pointerul la ir n caz
de succes sau pointerul NULL cnd spaiul nu s-a putut aloca.
glp) Exemplu :
glq) #include<stdio.h>
glr) #include<string.h>
gls) #include<malloc.h> //includere necesar pentru
strdup
glt) void main()
glu) { char *dup, *string=Acest sir se copie;
glv) dup=strdup(string); //se duplic string
glw) printf(%s\n,dup); //se afieaz dublura
glx) free(dup);
gly) //se elibereaz explicit spaiul ocupat de
dublur
glz) }
gma) Observm c nu a fost necesar apelul unei funcii de alocare
prealabil a memoriei. Apelul funciei de eliberare, dup ce irul nu a mai fost
utilizat, este necesar.
gmb)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gmg) Aceast 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 \0 care termin irul rezultat n
urma concatenrii. Funcia returneaz valoarea lui dest.
gmh) Exemplu:
gmi) char tab1[100]=Limbajul C++;
gmj) char tab2[]=este C incrementat;
gmk) strcat(tab1, ); /* se adaug spaiu dup ultimul caracter +
*/
gml) strcat(tab1,tab2);
gmm) Observaie : Funcia strcat, la fel ca funcia strcpy, nu trebuie s
modifice irul de caractere spre care pointeaz sursa.
gmn) O alt funcie de bibliotec utilizat la concatenarea de iruri este
funcia strncat care are prototipul :
gmo) char *strncat(char *dest, const char *sursa, unsigned n);
gmp) n acest caz se concateneaz, la sfritul irului spre care pointeaz
dest, cel mult n caractere ale irului spre care pointeaz dest. Dac n
>lungimea irului spre care pointeaz sursa, atunci se concateneaz ntregul
ir, altfel numai primele n caractere.
gmq) Exemplu:
gmr) char tab1[100]=Limbajul E este mai bun decat ;
gms) char tab2[]=limbajul C++ care este un superset a
lui C;
gmt) strncat(tab1,tab2,12);
gmu) Dup revenirea din funcie, tabloul tab1 conine succesiunea de
caractere Limbajul E este mai bun dect limbajul C++ .
gmv)
gmw)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gou) char s[100];
gov) clrscr();
gow) printf("Introduceti cuvantul : "); gets(s);
gox) n=strlen(s);
goy) for(i=0;i<n;i++)
goz) { for(j=i;j<n;j++)
gpa) printf("%c ",*(s+j));
gpb) //tiprete caract. irului ncepnd din
poziia j
gpc) puts("\n");
gpd) }
gpe) getch();
gpf) }
2. S se determine prima i ultima apariie a unui caracter ntr-un ir de caractere.
gpg) #include<stdio.h>
gph) #include<conio.h>
gpi) #include<string.h>
gpj) void main()
gpk) { char s[100],*ptr,c='e';
gpl) clrscr();
gpm) strcpy(s,"Test sir de caractere.");
gpn) ptr=strchr(s,c); //caut prima apariie a lui c
n s
gpo) if(ptr) //pointer nenul
gpp) { printf("Prima aparitie a car. %c este in
pozitia
gpq) %d\n",c, ptr-s);
gpr) printf("Ultima aparitie a car.%c este pe
pozitia
gps) %d\n",c, strrchr(s,c)-s);
gpt) //scznd din adresa ultimei apariii a lui c
gpu) //adresa de nceput a irului s obinem
numrul de
gpv) //caractere dintre cei doi pointeri adic
poziia
gpw) //ultimei apariii
gpx) }
gpy) else printf("Caracterul %c nu se afla in
sir\n",c);
gpz) getch();
gqa) }
3. Programul urmtor ilustreaz modul de folosire a funciei strstr :
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gqb) #include<stdio.h>
gqc) #include<string.h>
gqd) void main()
gqe) {
gqf) char *s1="c\\tc\\include",*s2="\include";
gqg) char *p;
gqh) p=strstr(s1,s2);
gqi) puts(p); //se afieaz include
gqj) }
gqk)
4. Exemplu de folosire a funciei strpbrk .
gql) #include<stdio.h>
gqm) #include<string.h>
gqn) void main()
gqo) {
gqp) char *s1="abcdefghijklmnopqrst";
gqq) char *s2="12fmg";
gqr) char *p;
gqs) p=strpbrk(s1,s2);
gqt) if(p)
gqu) printf("primul caracter comun este
%c\n",*p);
gqv) //afiseaz f
gqw) else
gqx) printf("cele doua siruri nu au nici-un
gqy) caracter
comun\n");
gqz) }
5. Programul urmtor citete o secven de caractere i determin prima fraz prin
cutarea n irul text a caracterelor din irul eop .
gra) #include<stdio.h>
grb) #include<string.h>
grc) #include<conio.h>
grd) void main()
gre) { char text[128];
grf) char
grg) *eop=".!?"; //caracterele care pot ncheia o
fraz
grh) int length;
gri) clrscr();
grj) printf("Introduceti un text : "); gets(text);
grk) length=strcspn(text,eop);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
grl) //poziia n care apare primul caracter din eop
grm) text[length]='\0';
grn) //adugnd \0 restul textului nu va mai fi
afiat
gro) printf("Prima fraza este : %s\n",text);
grp) getch();
grq) }
6. Programul urmtor gsete toate cuvintele dintr-o linie. Presupunem c un cuvnt
este delimitat de unul din caracterele : !,.:;?-! .
grr) #include<stdio.h>
grs) #include<conio.h>
grt) #include<string.h>
gru) void main()
grv) { char in[100] , *p;
grw) clrscr();
grx) puts("Introduceti linia : "); gets(in);
gry) /* strtok plaseaz terminatorul NULL la nceputul secvenei de
cutare,
grz) la poziia gsit */
gsa) p=strtok(in, ",.!:;-? ");
gsb) //gseste primul cuvnt i pune NULL dup el
gsc) if(p)
gsd) printf("%s\n", p); //afieaz primul cuvnt
gse) / /urmtoarele apeluri utilizeaz pointerul NULL ca prim parametru
gsf) while(p)
gsg) { p=strtok(NULL,",.!:;-? "); // caut i
afieaz
gsh) if(p) printf("%s\n", p); // urmtoarele
cuvinte
gsi) }
gsj) getch();
gsk) }
gsl)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gsp) int atoi(const char *s);
gsq) long atol(const char *s);
gsr) double atof(const char *s);
gss) Primul macrou convertete un ir ntr-un numr ntreg. El ntoarce
valoarea obinut n urma conversiei sau valoarea 0 dac irul nu poate fi
convertit.Analog, macroul atol convertete un ir ntr-un numr ntreg de tip long, iar
atof ntr-un numr real de tip float. n cazul apariiei caracterelor nepermise,
conversia se va opri la primul caracter incorect i se va returna valoarea citit pn
atunci.
gst) Exemplu: Ca exemplu de utilizare a funciei atoi, se consider un ir care
conine caractere neadmise i valori depind dimensiunea tipului ntreg.
gsu) #include<stdlib.h>
gsv) #include<stdio.h>
gsw) void main()
gsx) {
gsy) int j,n;
gsz) char
*s[]={12345,12345.67,123456.78,
gta) 123a45.67,a12345.67,
12345.a67};
gtb) for(j=0; j<6; j++)
gtc) { n=atoi(s[j]);
gtd) printf(sir=%s\n val=%d,s[j],n);
gte) }
gtf) }
gtg)Valorile numerice tiprite sunt, n ordine:
12345 - a fost transformat ntregul ir
12345 - partea zecimal nu a fost luat n consideraie
-7616 - numrul obinut a fost ntreg, dar nu s-a ncadrat n limitele impuse
de tipul int
123 - s-a citit pn la primul caracter care nu era semn sau cifr
0 - primul caracter nu a fost cifr i conversia s-a oprit aici
12345 - caracterul a nu a avut nici o influen fiind dup punctul zecimal
gth)Funciile de conversie invers, din numr n ir de caractere , au sintaxele:
gti) char *itoa(int valoare, char *sir, int baza);
gtj) char *ltoa)long valoare, char *sir, int baza);
gtk) char *ultoa(unsigned long valoare, char *sir, int baza);
gtl) Funciile ntorc valoarea obinut ntr-un ir terminat cu \0 i
stocheaz rezultatul n ir. Parametrul valoare reprezint numrul ntreg care
urmeaz a fi convertit. El poate avea att valori pozitive ct i negative n cazul
funciilor itoa sau ltoa i numai valori pozitive pentru funcia ultoa. Parametrul sir
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
reprezint adresa irului de caractere n care se va obine rezultatul conversiei.
Parametrul baza reprezint baza aleas pentru conversie. Funcia itoa poate ntoarce
un ir de pn la 17 caractere, iar ltoa un ir de pn la 33 de caractere (dac baza
are valoarea 2). n caz de succes, funciile ntorc un pointer la irul obinut, n caz de
eroare, este ntors irul vid.
gtm) Al doilea set de conversie ntre numere i iruri de caractere este mai
performant n privina detectrii erorilor dect primul. Funciile de conversie a unui
numr real ntr-un ir de caractere au sintaxa:
gtn) char *fcvt(double val, int nr_cif, int *dec, int *semn);
gto) char *ecvt(double val, int nr_cif, int *dec, int *semn);
gtp) char *gcvt(double val, int ndec, char *buf);
gtq) Parametrul val i nr_cif reprezint valoarea iniial i numrul de cifre
care se doresc a fi obinute. Funciile vor ntoarce valoarea numrului n baza 10
stocat ca ir de caractere. Nu apare punctul zecimal. Pentru a obine informaii
suplimentare despre conversie, variabilele semn, care reprezint semnul numrului, i
dec, care reprezint numrul de cifre zecimale, vor fi transmise printr-o referin la
ntreg. Pentru ecvt, variabila nr_cif reprezint numrul total de cifre, n timp ce pentru
fcvt variabila nr_cif reprezint numrul de cifre ale prii zecimale. Funcia gcvt face
suprimarea zerourilor inutile. Valoarea ntoars de ctre cele trei funcii este un pointer
spre irul de caractere.
gtr) Conversiile de la iruri de caractere la numere se fac cu funciile:
gts) double strtod(const char *s, char **endptr);
gtt) long strtol(const char *s, char **endptr, int baza);
gtu) long strtoul(const char *s, char **endptr, int baza);
gtv) Funcia strtod convertete un ir ntr-un numr real dubl precizie. irul iniial
s trebuie s aib urmtoarea form: [ws] [s] [ddd] [.] [ddd] [fmt[s]ddd] n
care ws reprezint spaii, s este semnul, ddd sunt cifre zecimale, iar fmt este
e sau E pentru
gtw) forma exponenial. Al 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 conversie.
gtx) Exemplu:
gty) #include<stdio.h>
gtz) #include<stdlib.h>
gua) void main()
gub) {
guc) char sir[80],*s; double valoare;
gud) printf(numarul=); gets(sir);
gue) valoare=strtod(sir, &s);
guf) printf(sirul:%s numarul:
%lf\n,sir,valoare);
gug) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
guh) Funciile strtol i strtoul convertesc un ir s care exprim un numr
ntr-o baz precizat de al treilea argument, baza, ntr-un numr ntreg de tip
long, respectiv de tip unsigned long. Este folosit deasemenea un pointer
dublu la caractere pentru detectarea erorilor.
gui)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gvq) #include<stdio.h e) nici una dintre afir-
> maiile anterioare
gvr) #include<string. gwh)
h> gwi) 4. Pentru programul
gvs) void main() urmtor precizai care dintre
gvt) { afirmaiile de mai jos sunt
gvu) char adevrate:
s1[10], s2[10], gwj) #include<stdio.h
gvv) s3[10 >
]=SB; gwk) #include<string.
gvw) gets(s1); h>
gets(s2); gwl) void main()
gvx) gwm) {
puts(s1+s2); //(1) gwn) char
gvy) if(strlen(s1) s[10]=-2B.2A5;
<strlen(s2)) gwo) int
gvz) putchar j,nr=0;
(1); //(2) gwp) for(j=0;j<strlen
gwa) if(s1>s3) (s);j++)
gwb) put gwq)
char(1); gwr) if(!
gwc) else (s[j]>=0&&
gwd) putchar gws) s[j]<
(0);//(3) =9))
gwe) } gwt) { s[j]=0;
gwf) Presupunem c, n nr++; }
timpul execuiei progra-mului, gwu) printf(%d
se introduc de la tastatur %s,nr,s);
irurile s1=BR i gwv) }
s2=122035. Precizai dac gww) a) declararea
sunt adevrate situaiile de irului este corect
mai jos: gwx) b) n ciclul for
gwg) a) citirea de la sunt parcurse corect
tastatur este eronat caracterele irului s
gwy) c) n ciclul for
b) instruciunea (1) va sunt nlocuite cu 0
afia textul BR122035 cifrele din s
c) instruciunea (2) va gwz) d) condiia din
afia valoarea 1 linia if este eronat
d) n linia (3) se compar gxa) e) programul
irurile s1 i s3 din afieaz 40200205
punct de vedere alfabetic gxb)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gxc) 5. Ne propunem s gxw) long x;
definim un vector care s aib gxx) gets(s1);
dou elemente, ambele de tip gets(s2);
ir de caractere. Fiecare ir gxy)
trebuie s conin dou if(strcmp(s1,s2)<0)
caractere, primul ab, iar al gxz) x=atol
doilea cd. Scriei declaraia (s1);
corect. gya) else
gxd) a) char a[2] gyb) if(!
[3]={ab,cd}; strcmp(s1,s2))
gxe) b) char a[2] gyc)
[2]={ab,cd}; x=0;
gxf) c) char a[3] gyd) else
[2]={ab,cd}; x=atol(s2);
gxg) d) char a[3] gye)
[3]={ab,cd}; printf(%ld, x);
gxh) e) char a[] gyf) }
[3]={ab,cd}; gyg) a) condiiile
gxi) din cele dou linii if
gxj) 6. Care dintre variantele de sunt greite
mai jos reprezint o declaraie e) apelurile funciei atol
corect a unui ir de sunt corecte
caractere? f) dac de la tastatur se
gxk) a) char s[2]; introduc irurile 98 i
gxl) b) char *s[20]; 123, atunci se va afia
gxm) c) char *s; 98
g) dac de la tastatur se
gxn) d) char s; introduc irurile 123
gxo) e) char s[]; i 135, atunci pro-
gramul va afia irul
gxp)
123
gxq) 7. Pentru programul
h) dac de la tastatur se
urmtor, analizai
introduc irurile ab i
corectitudinea afirmaiilor de
ac, atunci se va
mai jos:
semnala un mesaj de
gxr) #include<stdlib.
eroare
h>
gxs) #include<stdio.h gyh)
> gyi) 8. tiind c, n conformitate cu
gxt) void main() standardul ASCII, codurile
gxu) { literelor mari sunt succesive
gxv) char ncepnd cu 65, ce va afia
s1[4],s2[4]; programul de mai jos?
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
gyj) #include<stdlib. gzi) 10. Ce va afia programul
h> urmtor?
gyk) #include<string. gzj) #include<stdio.h
h> >
gyl) #include<stdio.h gzk) void main()
> gzl) {
gym) void main() gzm) char
gyn) { gzn) *a[3]={abc,d
gyo) int ef,ghi};
x=20,e; gzo) char *p=&a[0]
gyp) char [0];
gyq) s[15]=ABC, gzp) printf(%s%c
t[15],u[15]; %c,a[1],
gyr) gzq) a[2]
e=s[1]+s[2]; [1],*(p+5));
gys) gzr) }
itoa(e,t,10); gzs) a) abc d NULL
gyt)
strcpy(u,t); gzt) b) abc d e
gyu) gzu) c) def h NULL
strcat(s,u);
gyv) puts(s);
gzv) d) def h e
gyw) }
gzw) e) programul va
a) nimic, irul s fiind
semnala eroare de
vid
compilare
b) ABC13 c) AB13
gzx)
gyx) d) ABC133
gzy) 11. Ce va afia cea
gyy) e) ABC131
de-a doua instruciune de
gyz)
tiprire din programul de mai
gza) 9. Ce ir de caractere
jos:
va afia secvena urmtoare? gzz) #include<stdio.h
gzb) char
>
*s=abcdefg,*ptr;
haa) void main()
gzc) ptr=s; ptr+=4;
hab) {
gzd) puts(ptr);
hac) char
gze) a) fg b)
a[12]=abcdefghij;
efg
had) char *p=a; int
gzf) c) defg d)
j;
cdefg
hae) for(j=0;j<12;j
gzg) e) secvena este
++)
eronat
gzh)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
haf) *(p+j) hbc) strlen(a)<strl
=a[j]^j; en(b));//(5)
hag) printf(%s\n,p) hbd) b=a;
; //(6)
hah) for(j=0;j<12;j+ hbe) }
+) hbf) a) declaraia de
hai) *(a+j)=p[j] variabile din linia
^j; (1)
haj) printf(%s, p); b) citirea irurilor din
hak) } linia (2)
hal) a) nimic c) atribuirile din liniile
ham) b) textul (3) i (4)
abcdefghij hbg) d) afiarea din
han) c) textul linia (5)
jihgfedcba hbh) e) atribuirea
hao) d) o succesiune din linia (6)
de caractere hbi)
imprevizibil hbj) 13. Precizai ce ir de
hap) e) programul caractere se va afia n urma
conine erori execuiei programului
haq) hbk)
har)12. Care dintre instruciunile hbl) urmtor:
programului de mai jos hbm) #include<stdio.h
sunt eronate? >
has) #include<stdio.h hbn) #include<string.
> h>
hat) #include<string. hbo) void main()
h> hbp) {
hau) void main() hbq) char
hav) { hbr) s[20]=BorLanD
haw) char C++ 3.1;
a[10],b[10];int k; // hbs) int j;
(1) hbt) for(j=0;j<strlen
hax) scanf(%s (s);j++)
%s,a,b); //(2) hbu) if((s[j]>=A)
hay) k=strlen(a)/2; &&
//(3) hbv) (s[
haz) a[k]=*; j]<=Z))
hbw) s[j]-
hba) //(4) =(A-a);
hbb) printf(%d, hbx) puts(s);
hby) }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hbz) a) BorLand C++ hcw) #include<stdio.h
3.1 >
hca) b) bORlAND c++ hcx) void main()
3.1 hcy) {
d) BORLAND C++ 3.1 hcz) char
hcb) d) borland c++ s[10]=AB6X92P3M,
3.1 hda) b[10];
hcc) e) Borland C++ hdb) int j=0,k=0;
3.1 hdc) while(s[j])
hcd) hdd) if(j%2)
hce) 14. Care dintre cele b[k]=s[j++];
trei instruciuni printf de mai hde) b[k]=0;
jos tipresc irul bd? puts(b);
hcf) #include<stdio.h hdf) }
> hdg) a) BX23 b)
hcg) void main() A69PM c) B
hch) { hdh) d) 3 e)
hci) char s[6] nimic
[3]={ab,ac, hdi)
hcj) ad,bc hdj) 16. Considernd declaraiile:
,bd,cd}; hdk) char
hck) printf(%c s[4]=123,t[4]; int
%c,s[3][0], x=123,y;
hcl) s[2] hdl) Care din expresiile de mai jos
[1]); au valoarea 0?
hcm) printf(%s,s[3] hdm) a) atoi(s)!=x;
[0]+
hcn) s hdn) b)
[2][1]); itoa(x,t,10)==s;
hco) printf(%s,s[5] hdo) c) (y=
); =atoi(s))==x;
hcp) } hdp) d) x=
hcq) a) toate b) =(atoi(itoa(x,t,10)));
numai prima e) !strcmp(itoa(x,t,10),s);
hcr) c) numai primele hdq)
dou hdr)17. Ce va afia programul
hcs) d) numai prima urmtor?
i a treia hds) #include<stdlib.
hct) e) nici una h>
hcu) hdt) #include<stdio.h
hcv) 15. Ce va afia >
programul de mai jos?
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hdu) #include<string. heu) c) EXEMPLU
h> SIMPLU SIMPLU
hdv) void main() hev) d)
hdw) { EXEMPLUSIMPLU
hdx) char hew) e) SIMPLU
s[12]=6789,t[12]=6 hex)
, hey) 19. Ce afieaz
hdy) u[12]=89; programul urmtor?
hdz) long x=0; hez) #include<stdio.h
hea) strcat(t,u); >
heb) if(strcmp(s,t)) hfa) void main()
x=atol(t); hfb) {
hec) else x=atol(s); hfc) char
hed) if(strcmp(s,u)>0 *s=123456789,*t,*u;
) hfd) u=&s[4],s+=3,t=&
hee) x=a s[1];
tol(u); hfe) printf(%d%d
hef) printf(%ld, %d,u==s,u==t,
x); hff) s==t)
heg) } ;
heh) a) 0 b) 6 hfg) }
c) 89 hfh) a)000
hei) d) 689 b)001 c)010
e) 6789 hfi) d)100
hej) e)111
hek) 18. Ce afieaz hfj)
programul urmtor? hfk) 20. Care dintre instruciunile
hel) #include<stdio.h (1),.....(5) de mai jos sunt
> eronate?
hem) void main() hfl) #include<stdio.h
hen) { >
heo) char hfm) #include<string.
*s1=EXEMPLU SIMPLU, h>
hep) *s2=SIMPLU hfn) void main()
; hfo) {
heq) printf(\n%.8s hfp) char
%.6s,s1,s2);} *s1,*s2,*s3;
her) hfq) int x;
hes) a) EXEMPLU hfr) s1=test;
het) b) EXEMPLU //(1)
SIMPLU hfs) scanf(%s,s2);
//(2)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hft) s3=&s1; caractere succesive
//(3) identice
hfu) printf(%s,s1+s hgr) d) n irul s
2);//(4) exist cel puin dou
hfv) x=strlen(*s2); caractere succesive
//(5) identice
hfw) } hgs) e) n irul s nu
hfx) a) 2,3 ,4 exist dou caractere
b) 2,3,4,5 succesive identice
hfy) c) 4,5 hgt)
d) 3,5 e) hgu) 22. Considerm
3,4,5 urmtoarele noiuni:
hfz) hgv) A)vector de doi
hga) 21. Fie programul: pointeri ctre
hgb) #include<stdio.h caracter
> hgw) B)pointer ctre
hgc) void main() ir de dou caractere
hgd) { hgx) i urmtoarele
hge) char *s,*t,*u; declaraii de variabile:
hgf) int j,x; I) char *a[2];
hgg) gets(s); II) char (*b)[2];
hgh) for(x=0,j=0;s[j] hgy) Precizai
;t=&s[j], corespondenele corecte:
hgi) hgz) a) A) cu I) i
hgj) u=t+1,u[0] B) cu II)
==t[0]? hha) b) A) cu II) i
hgk) x B) cu I)
=1:0,j++); hhb) c) nu exist
hgl) printf(%d, x); corespondene
hgm) } hhc) d) B) nu are
hgn) n urma execuiei corespondent
programului, se va afia hhd) e) cele dou
valoarea 0, dac: declaraii semnific
hgo) a) toate acelai lucru
caracterele irului s hhe)
sunt identice hhf)23. Ce afieaz programul de
hgp) b) n irul s mai jos?
exist cel puin dou hhg) #include<stdio.h
caractere succesive >
diferite hhh) void main()
hgq) c) n irul s hhi) {
exist cel mult dou
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hhj) char hil) }
*s[5]={012,345, him) a) 1 b) 0
hhk) 678,9A c) 1
B,CDE}; hin) d) 3 e) 4
hhl) char *t,*u; int hio)
j; hip) 25. Se dau urmtoarele
hhm) t=&s[1][0]; declaraii
hhn) hiq) A)char *a[4][6];
hho) printf(%d, hir) B)char (*b[4])
hhp) (*(t+5)==s[2] [6];
[1])); his) C)char (*c)[4]
hhq) u=&s[3][0]+1; [6];
hhr) j=0; hit) D)char ((*d)[4])
hhs) while(u[j]) [6];
hht) printf(%c hiu) i urmtoarele noiuni:
,u[j++]); hiv) N1. vector de 4 elemente,
hhu) } fiecare element este un pointer
hhv) a)178 b)1AB ctre un vector de 6 caractere
c)078 hiw) N2. pointer ctre
hhw) d)0AB e)067 matrice de caractere de 4 linii
hhx) i 6 coloane
hhy) 24. Ce afieaz hix) N3. pointer ctre vector cu 4
programul de mai jos? elemente, fiecare fiind vector
hhz) #include<stdio.h de 6 caractere
> hiy) N4. matrice de 4 linii i 6
hia) #include<string. coloane, fiecare element este
h> pointer ctre caracter
hib) void main() hiz) Precizai corespondena
hic) { direct:
hid) char hja) a) (A,N1),
*s[10]={10,00,10 (B,N2), (C,N3), (D,N4)
, hjb) b) (A,N4),
hie) 10, (B,N1), (C,N2), (D,N3)
01,11}; hjc) c) (A,N4),
hif) char *t=10; (B,N1), (C,N3), (D,N2)
hig) int i=0,j=i-1; hjd) d) (A,N2),
hih) while(s[i]) (B,N3), (C,N4), (D,N1)
hii) if(! hje)
strcmp(s[i++],t)) hjf) 26. Cte erori conine
hij) programul urmtor ?
j=i; hjg) void main()
hik) printf(%d, j); hjh) {
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hji) char hjn) *a[1]
*(a[4][6]); [3]=b+3;
hjj) char b; hjo) }
hjk) a[2] hjp) a) nici una
[3]=*(b+2); b) una c) dou
hjl) a[3] d) trei
[2]=&b+3; hjq) e) patru
hjm)
*(4+a[2])=&b+1;
hjr)
hjs)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hjt) Cap.9 Structuri
hju) 9.1 Definirea tipurilor structur
hjv)
hjw) Limbajul C ofer programatorului posibilitatea de a grupa
datele, date de tipuri diferite putnd fi prelucrate att individual ct i
mpreun. Dac tabloul conine numai elemente de acelai tip, o structur
este format din mai multe elemente de tipuri diferite. La rndul lor,
structurile definite pot constitui elemente componente pentru formarea de noi
tipuri de date (tablouri, structuri, uniuni) . Elementele componente ale unei
structuri se numesc membri sau cmpuri .
hjx) Sintaxa declarrii unei structuri este urmtoarea :
hjy)struct [nume_tip_structura]
hjz) { tip_1 lista_campuri_tip_1;
hka) tip_2 lista_campuri_tip_2;
hkb) .
hkc) tip_n lista_campuri_tip_n;
hkd) } [lista_variabile_structura];
hke) n declaraie poate lipsi precizarea numelui pentru tipul structurii sau a
listei de variabile ns nu ambele simultan. n cazul n care lipsete numele
tipului, spunem c variabilele au un tip anonim. Cmpurile componente ale
unei structuri pot fi oricare din tipurile :
- predefinite (ntreg, caracter, numr real)
- definite de utilizator : scalari (cmpuri de bii , enumerare) sau compuse (tablouri,
structuri, uniuni)
hkf) Exemplul 1: Definirea datelor de baz pentru o persoan specificnd
numele i vrsta.
hkg) struct pers
hkh) { char nume[35];
hki) int an;
hkj) };
hkk) S-a definit o structur de tip pers fr a fi folosit nici o variabil de
tipul definit.
hkl) Exemplul 2: Definirea unei structuri de tip angajat specificnd pe lng
datele de baz (un cmp de tip structur pers) adresa, salariul i vechimea n
munc.
hkm) struct angajat
hkn) { struct pers p; /* structura pers a fost
definit anterior */
hko) char adresa[50];
hkp) long salariu;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hkq) int vechime;
hkr) } persoana , firma[100];
hks) struct angajat p[50];
hkt) Observm modul cum poate fi o structur folosit la rndul ei drept cmp al
altei structuri. n acest caz, s-a definit o structur de tip angajat i variabilele de tip
angajat :
- variabila persoana
- variabila firma de tip tablou de nregistrri
hku) n a doua declaraie, s-a folosit tabloul p de 50 de nregistrri de tipul
angajat.
hkv) Putem defini orice tip structur folosind typedef. Astfel,
exemplul anterior se mai poate scrie :
hkw) typedef struct
hkx) { struct pers p;
hky) char adresa[50];
hkz) long salariu;
hla) int vechime;
hlb) } ANGAJAT;
hlc) ANGAJAT persoana , firma[100];
hld) Am definit un tip de structur cu aceleai componente ca mai sus i variabilele
persoana i firma cu aceeai semnificaie ca mai nainte. Se observ c nu
mai este necesar precedarea tipului de structur de cuvntul cheie struct.
Prin convenie, tipurile declarate cu typedef se scriu cu majuscule.
hle) Exemplul 3: Se definete o structur care grupeaz informaii, specificnd
datele necesare fiei medicale a unui bolnav.
hlf) typedef struct { int an , luna , zi} DATA;
hlg) struct
hlh) { struct pers p;
hli) DATA data_internarii;
hlj) char adresa[50];
hlk) char boli[10][30];
hll) } pacient[200];
hlm) n ultimul caz, nu s-a mai definit numele tipului structurii, ci doar
tabloul de nregistrri pacient care conine 200 de nregistrri de tipul fielor
medicale.
hln) Exemplul 4: n cazul n care un tablou este definit ca ultim cmp al unei
structuri este acceptat omisiunea primei dimensiuni din tablou. Astfel, este
acceptat declaraia :
hlo) struct vector
hlp) { int n;
hlq) int dim[];
hlr) };
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hls) Exemplul 5: n implementrile limbajului C exist diferite structuri
predefinite. Spre exemplu, pentru utilizarea numerelor complexe este definit
n header-ele math.h i complex.h urmtoarea structur :
hlt) struct complex
hlu) { double x;
hlv) double y;
hlw) };
hlx)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hmp) Exemplul 4: n exemplul urmtor se iniializeaz o variabil de tipul
struct persoana, precum i a unui tablou cu elemente de acest tip.
hmq) struct persoana
hmr) { char nume[32];
hms) int varsta;
hmt) float salariu;
hmu) };
hmv) struct persoana pers={Alex,28,1200000.0};
hmw) struct persoana grup[]=
hmx) { {Gigi , 32, 3000000.0} ,
hmy) {Mimi , 19 , 1500000.0} ,
hmz) {Fred, 33 , 2950000.0}
hna) };
hnb)
hnc)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hno) } x,y,*ps;
hnp) Tiprirea valorilor elementelor componente se face astfel :
a) n cazul accesrii cmpurilor pentru structura x care este de tip pers, se va folosi
selecia direct. O tiprire corect se poate face astfel :
hnq) printf(\nNumele:%s\nVarsta:%d\n,x.nume,x.ani);
b) n cazul accesrii cmpurilor structurii indicate de pointerul la pers numit ps, se va
folosi selecia indirect. O secven corect de tiprire este :
hnr) printf(\nNumele:%s\nVarsta:%d\n,ps->nume,ps-
>ani);
hns) Pentru atribuirea coninutului structurii x la structura y se poate folosi
una din secvenele :
a) atribuirea cmp cu cmp : y.ani=x.ani ; strcpy(y,nume,x.nume);
b) atribuirea direct ntre dou structuri de acelai tip : y=x;
hnt)Exemplul 2: Pentru structura de tip pers i variabilele 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
hnu) ps=&x; /* adresa indicat de ps este egal cu adresa lui x */
hnv) y=*ps; /* coninutul lui y devine egal cu coninutul structurii de la
adresa pointat de ps */
hnw) Atribuirea coninutului unui pointer la o structur cu o structur de
acelai tip se poate face astfel :
hnx) *ps=y;
hny) Aceast atribuire este echivalent cu secvena :
hnz) (*ps).inf=y.inf ;
hoa) strcpy((*ps).nume,y.nume);
hob) Urmtoarele dou atribuiri sunt echivalente cu cele dou de dinainte :
hoc) ps->inf=y.inf;
hod) strcpy(ps->nume,y.nume);
hoe) Folosirea expresiei de tipul (*ps).inf este corect dar greoaie i
neuzual. n locul ei este recomandat forma ps->inf .
hof)Exemplul 3: Tablourile nu pot fi atribuite direct. Totui, dac tabloul este
membru al unei structuri, atunci atribuirea poate avea loc .
hog) #include<stdio.h>
hoh) #include<stdlib.h>
hoi) struct tablou {int x[10]};
hoj) void main()
hok) { struct tablou a={{1,1,1,1,1,1,1,1,1,1}} ,
hol) b={{2,2,2,2,2,2,2,2,2,2}};
hom) struct tablou *a1 , *b1;
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hon) /* copierea direct a structurilor; are loc copierea direct a
tabloului folosindu-l drept
hoo) cmp al unei structuri */
hop) b=a;
hoq) /* se aloc spaiul necesar structurii i adresa spaiului alocat
se stocheaz n pointerul
hor) la structur */
hos) a1=(struct tablou*)malloc(sizeof(struct
tablou));
hot) *a1=a;
hou) b1=(struct tablou*)malloc(sizeof(struct
tablou));
hov) /* se copiaz coninutul structurii de la adresa indicat de
pointerul a1
how) peste coninutul structurii indicate de pinterul b1 */
hox) *b1=*a1;
hoy) /* sau : *(struct tablou)b1=*(struct tablou)a1 */
hoz) }
hpa) Observm c s-au putut face atribuirile directe cu tablouri care sunt
cmpuri ale unei structuri, att ntre structuri, ct i ntre pointeri la structuri. n
acest exemplu, toate structurile i coninutul pointerilor la structuri primesc
valoarea structurii a.
hpb) Exemplul 4: Se consider o grup de n studeni (n<=40), pentru
fiecare dintre ei cunoscndu-se numele i media anual. Se cere s se
afieze studenii n ordinea descresctoare a mediilor.
hpc) #include<stdio.h>
hpd) #include<conio.h>
hpe) void main()
hpf) { struct student
hpg) { char nume[30];
hph) float media;
hpi) } aux , grupa[40];
hpj) int n,i,j;
hpk) float media;
hpl) clrscr();
hpm) /* citirea datelor */
hpn) printf("Numarul studentilor :
");scanf("%d",&n);
hpo) puts("\n Introduceti datele studentilor
:\n");
hpp) for(i=0;i<n;i++)
hpq) { getchar();
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
hpr) printf("Numele :");gets(grupa[i].nume);
hps) printf("Media : ");scanf("%f",&media);
hpt) grupa[i].media=media;
hpu) }
hpv) /* sortarea tabloului grupa descrescator dupa medie */
hpw) for(i=0;i<n-1;i++)
hpx) for(j=i+1;j<n;j++)
hpy) if(grupa[i].media<grupa[j].media)
hpz) { aux=grupa[i];
hqa) grupa[i]=grupa[j];
hqb) grupa[j]=aux;
hqc) }
hqd) /* afisarea rezultatelor */
hqe) clrscr();
hqf) puts("Studentii ordonati desc. dupa medii
:\n");
hqg) for(i=0;i<n;i++)
hqh) printf("%30s%5.2f\n",grupa[i].nume,
hqi) grupa[i].media);
hqj) }
hqk)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
20. b) struct total; 44. c=myComputer.cpuT
21. c) struct sample ype;
total; c) char
22. d) declare total as 45. c=myComputer[0].cp
type sample; uType;
23. d) char
24. 4. Linia de cod care asigneaz 46. c=myComputer.cpuTy
valoarea 10 cmpului loop din pe[0];
structura total (de tip sample), 47.
este : 48. 7. Fie secvena :
25. a) loop=10; 49. typedef struct
26. b) total.loop=10; 50. { long cust_id;
27. c) 51. char custName[50];
sample.total.loop=10; 52. double balance;
28. d) sample.loop=10; 53. } CUSTOMER_REC;
29. 54. CUSTOMER_REC
30. 5. Linia de cod care afieaz customer[50];
valoarea cmpului word din 55. int i;
structura total (de tip sample), 56. /*mai jos in program*/
este : 57. for(i=0;i<50;i++)
31. a) printf(%s,total); 58. { printf(%s\n,?????)
32. b) printf(%s,word); ;}
33. c) printf(%s,total- 59. Ce ar trebui pus in locul ????
word); pentru a afia fiecare element
34. d) custName n codul anterior :
printf(%s,total.word); 60. a) customer[i]-
35. >custName;
36. 6. Se d urmatoarea secven de 61. b)
cod : customer.custName[i];
37. struct computer { 62. c)
38. int cpuSpeed; customer[i].custName;
39. char 63. d) customer-
cpuType[10];}; >custName[i];
40. struct computer 64.
myComputer; 65. 8. Fie declaraia:
41. Referindu-ne la codul de mai sus, 66. struct computer{
cum accesai primul caracter din 67. int
cpuType? cpuSpeed;
42. a) char 68. char
43. c=myComputer.cpuTy cpuType[10];
pe(0); 69. } comp[]=
b) char 70. {
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
71. {400,Pentium va evalua numrul structurilor din
} , ir (n cazul de fa este 3)?
72. {266,PowerPC 75. a)
} , sizeof(*comp)/sizeof(comp
73. {333,Sparc} )
}; 76. b) sizeof(*comp)
74. Se d irul de structuri de mai sus. 77. c) sizeof(comp)
Care dintre urmtoarele expresii 78. d)
sizeof(comp)/sizeof(*comp
)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
- a+ adugare; dac fiierul exist, coninutul este distrus
- t fiierul este de tip text
- b fiierul este binar
91. Se pot face combinaii cu opiunile de mai sus. De exemplu,
deschiderea unui fiier text pentru citire se face cu opiunea rt. Crearea unui fiier
binar pentru scriere este posibil prin wb. Nu conteaz ordinea n care sunt date
literele n irul mod_deschidere.
92. n caz de succes, funcia fopen returneaz un pointer la noul flux de
comunicare deschis; altfel ntoarce pointerul NULL. Operaia de deschidere a unui
fiier trebuie nsoit de verificarea reuitei respectivei operaii conform modelului de
mai jos:
93. if(identificator_fisier)
94. instructiuni_operatie_reusita
95. else
96. instructiune_eroare_la_deschidere;
97. Exemple: Fie declaraia FILE *f ; vom ncerca urmtoarele deschideri de
fiiere:
1) f=fopen(test1.in,rt); Am deschis fiierul test1.in din
directorul curent pentru citire n mod text. Litera t nu era necesar,
modul text fiind modul de deschidere implicit al fiierelor n C. Dac
fiierul nu exist, atunci funcia ntoarce NULL. O deschidere mai
riguroas ar fi:
98. if(!(f=fopen (test1.in,rt)))
99. { printf(Eroare la deschiderea
fisierului !); exit(1); }
2) f=fopen(test2.out,wb); Este deschis/creat fiierul test2.out
din directorul curent n mod binar pentru scriere.
3) f=fopen(c:\\tc\\test3.bin,ab+); Este deschis fiierul
test3.bin din directorul c:\tc n mod binar pentru citire/scriere fiind
poziionat la sfritul fiierului.
100.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
104. 10.4 Funcia de verificare a sfritului unui fiier
105.
106. Pentru a verifica dac poziia curent de citire/scriere a ajuns la
sfritul unui fiier se folosete funcia int feof(FILE *f); care ntoarce valoarea 0 dac
poziia curent nu este la sfritul fiierului i o valoarea diferit de 0 dac poziia
actual indic sfritul de fiier.
107.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
170. Funcia char *fgets(char *s, int n, FILE *f); citete un ir de
caractere dintr-un fiier oarecare. Primul parametru, s, reprezint zona de memorie n
care se stocheaz irul citit. Parametrul n indic numrul maxim de caractere care se
vor citi din fiier. Dac se detecteaz mai puine caractere rmase pe linia curent din
fiier, citirea se oprete la ntlnirea caracterului sfrit de linie \n. n cazul unei citiri
reuite, funcia ntoarce un pointer la irul citit, n caz de sfrit de fiier sau de eroare
se ntoarce pointerul NULL.
171. Observaie: Funcia fgets insereaz n linia citit i caracterul \n generat la
apsarea tastei Enter. Pentru o prelucrare corect a irului de caractere citit din
fiier, acest caracter trebuie eliminat utiliznd spre exemplu instruciunea
linie[strlen(linie)-1]=0 care scrie terminatorul de ir \0 peste caracterul \n (am
considerat c irul citit din fiier s-a depus n variabila linie).
172. Funcia int fputs(const char *s, FILE *f); scrie irul de caractere s
(care nu se modific) n fiierul f. n caz de eroare, funcia ntoarce valoarea EOF.
173. Exemplul 1: Copierea a dou fiiere text, linie cu linie.
174. #include<stdio.h>
175. void main()
176. {
177. FILE *f1,*f2; char linie[80];
178. f1=fopen(in.txt,r);
179. f2=fopen(out.txt,w);
180. do{
181. if(feof(f1)) break;
182. //fiierul f1 s+a terminat
183. fgets(linie,80,f1); //citete o linie
din f1
184. fputs(linie,f2); //scrie linia n
f2
185. }while(1);
186. fcloseall();
187. }
188. Exemplul 2: Afiarea unui fiier text pe ecran. La fiecare afiare a 22 de linii
se va face o pauz, afiarea continund la apsarea unei taste.
189. #include<stdio.h>
190. void main()
191. {
192. FILE *f; char linie[80];
193. long n=0; // numara cate linii au fost citite
194. f=fopen(in.txt,r);
195. while(!feof(f))
196. { fgets(linie,80,f); printf(%s,linie);
197. if(++n%22==0) getch();
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
198. }
199. fclose(f);
200. }
201. Exemplul 3: Fiind dat un fiier, s se determine numrul de linii, linia de
lungime maxim i lungimea fiierului (numrul de caractere utile).
202. #include<stdio.h>
203. #include<string.h>
204. #include<stdlib.h>
205. void main()
206. {
207. FILE *f; char linie[120];
208. int l,max=0;
209. // lungimea celei mai lungi linii din fisier
210. long nr=0,n=0;
211. // nr-lungimea fisierului, n-numarul de linii
212. f=fopen(in.txt,r);
213. if(!f) //deschiderea ntoarce pointer nul
214. { printf(fisierul nu exista); exit(1); }
215. while(!feof(f))
216. { n++; //numr liniile
217. fgets(linie,120,f);
218. //citete o linie din fiier
219. l=strlen(linie); //afl lungimea liniei
curente
220. if(max<l) max=l;//actualizeaz lungimea
maxim
221. nr+=l;
222. //actualizeaz nr. caracterelor citite
din
223. //fiier
224. }
225. printf(linia de lungime maxima :%d\n,max);
226. printf(numarul de linii :%ld\n,n);
227. printf(lungimea fisierului :%ld\n,nr);
228. fclose(f);
229. }
230. Exemplul 4: Programul urmtor numr apariiile unui cuvnt ntr-un fiier
text. Citirea acestuia se face linie cu linie.
231. #include<stdio.h>
232. #include<string.h>
233. void main()
234. {
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
235. typedef char STRING[256];
236. STRING cuv,linie,
237. FILE *f;
238. char *p;
239. int nr=0;
240. f=fopen(in.txt,r);
241. printf(cuvantul cautat : ); scaf(%s,cuv);
242. while(!foef(f))
243. { fgets(linie,256,f);
244. p=linie;
245. while(p!=NULL) // mai sunt caractere in
linie
246. { p=strstr(p,cuv);
247. // cauta cuvantul in sirul curent de
248. //caractere
249. if(p) // cuvantul apare in sirul
curent)
250. { nr++; // numarul aparitia
cuvantului
251. p++; // avansez la urmatorul
caracter
252. // din sir pentru a repeta
cautarea
253. }
254. }
255. }
256. printf(numarul de aparitii: %d,nr);
257. fclose(f);
258. }
259. Exemplul 5: Se consider un fiier text a crui nume se citete de la
tastatur, format din iruri de caractere scrise fiecare pe cte o linie. Se cere s se
sorteze liniile fiierului n ordine alfabetic i s se scrie rezultatul ntr-un alt fiier
al crui nume se citete de la tastatur.
260. Rezolvare: Vom stoca irurile citite din fiier ntr-un tablou de iruri de
caractere pe care l vom ordona. Vom scrie apoi elementele tabloului ordonat n
fiierul de ieire. Fiecare ir citit din fisier va fi corectat prin eliminarea caracterului
'\n' cu excepia ultimului ir citit din fiier, care nu conine acest caracter
suplimentar.
261.
262. #include<stdio.h>
263. #include<string.h>
264. void main()
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
265. {
266. FILE *f;
267. char sir[100][100],aux[100];
268. char nume[20];
269. int n=0,i=0,j;
270. printf("numele fisierului de intrare: ");
271. scanf("%s",nume);
272. f=fopen(nume,"rt");
273. while(!feof(f))
274. { fgets(sir[i],100,f); //citim o linie din fiier
275. if(!feof(f)) // nu este ultima linie din fisier
276. sir[i][strlen(sir[i])-1]=0;
277. // eliminam din sir '\n'
278. i++;
279. }
280. n=i; fclose(f);
281. for(i=0;i<n-1;i++)
282. for(j=i+1;j<n;j++)
283. if(strcmp(sir[i],sir[j])>0)
284. { strcpy(aux,sir[i]);
285. strcpy(sir[i],sir[j]);
286. strcpy(sir[j],aux);
287. }
288. // scriem datele in fisierul de iesire
289. printf("numele fisierului de iesire: ");
290. scanf("%s",nume);
291. f=fopen(nume,"wt");
292. for(i=0;i<n;i++)
293. { fputs(sir[i],f);
294. fputc('\n',f);
295. }
296. fclose(f);
297. }
298.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
- citete o secven de cmpuri de intrare caractere cu caracter
- formateaz fiecare cmp conform specificatorului de format corespunztor
- valoarea obinut este stocat la adresa variabilei corespunztoare
305. Valoarea ntoars, n caz de succes, este numrul de cmpuri citite. Dac nu
a fost citit nici-un cmp, funcia ntoarce valoarea 0. Dac funcia citete sfritul
de fiier, atunci valoarea ntoars este EOF. Specificatorii de format pentru funcia
fscanf sunt aceeai cu cei ai funciei scanf.
306. Pentru scrierea cu format a datelor ntr-un fiier text se folosete
funcia:
307. int fprintf(FILE *f, specificatori_de_format, expresii);
308. Funcia fprintf realizeaz urmtoarele:
- accept o serie de argumente de tip expresie pe care le formateaz conform
specificatorilor de format corespunztori
- scrie datele formatate n fiierul specificat
309. Funcia fprintf folosete aceleai formate ca i funcia printf.
310.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
329. f=fopen(test.bin,wb);
330. if(!f)
331. { printf(fisierul nu se poate deschide);
332. exit(1); }
333.
334. s.ani=40;
335. strcpy(s.nume,Mihai Popescu);
336. fwrite(&s,sizeof(s),1,f);
337. // scrie structura s in fisier
338. fclose(f);
339. }
340.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
returneaz un pointer 371. a) fscanf(f,%d %f %d
ctre fiierul deschis %f\n
este f=fopen(r, 372. ,&x,&a,&y,&b)
nr.txt); ;
359. b) pentru a putea citi 373. fscanf(f,%c
din fiier folosim %f,&c,&d);
atribut r la 374. b) fscanf(f,%d %d %f
deschidere, iar pentru a %f\n,
scrie n fiier l 375. &x,&y,&a,&b)
deschidem cu atributul ;
w 376. fscanf(f,%c
360. c) pentru a testa dac %f,&c,&d);
nu s-a ajuns la sfritul 377. c) fscanf(f,%d %d %f
fiierului referit de %f\n,
pointerul f, vom scrie ! 378. &x,&y,&b,&a)
feof(f) ;
361. d) pentru a nchide 379. fscanf(f,%f
fiierul referit de %c,&d,&c);
pointerul f vom scrie 380. d) fscanf(%f %f %d
close(f) %d\n,
362. e) nici una dintre 381. &b,&a,&y,&x,
afirmaiile de mai sus nu f);
este adevrat 382. fscanf(%c
363. %f,&c,&d,f);
364. 2. Se consider un fiier definit e) fscanf(%d %f %d %f\n,
prin pointerul f, i care conine 383. &x,&a,&y,&d,
urmtoarele valori pe primele dou f);
rnduri : 384. fscanf(%f
4 7 2.5 -6.23 %c,&d,&c,f);
365. # 8 385.
366. Fie urmtoarele declaraii de 386. 3. n timpul execuiei
variabile: programului urmtor sunt posibile
367. FILE *f; urmtoarele situaii :
368. int x,y; float 387. #include<stdio.h>
a,b,d; 388. void main()
369. char c; 389. {
370. Care dintre secvenele de 390. FILE *f; int
instruciuni de mai jos trebuie x=1,s=0;
executate astfel nct toate 391. f=fopen(suma.txt
variabilele declarate s primeasc ,r);
valori citite din fiierul f ? 392. while(!feof(f)
&& x)
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
393. 409. //secventa S2
{ fscanf(f,%d,&x); 410. j=0;
394. if(x%2) 411. while(!feof(f))
s+=x; } 412. { fscanf(f,%d,&v[j
395. fclose(f); ]);
396. printf(\ns= 413. j++; }
%d,s); 414. n=j;
397. } 415. //secventa S3
398. a) programul este 416. j=0;
corect sintactic 417. do{
399. b) pentru a funciona 418.
citirea din fiier, fscanf(f,%d,&v[j]);
acesta trebuie deschis n 419. j++;}while(!
alt mod feof(f));
c) programul va intra ntr- 420. n=j-1;
un ciclu infinit 421. a) toate b) nici
d) dac n fiier se gsesc, una
pe acelai rnd separate c) numai S1 i S2
prin cte un spaiu, d) d) numai S2 i S3
numerele 2 5 4 3 6 1 422. e) numai S1
0 7, atunci programul va 423.
afia s=16 424. 5. Ce numr se va gsi pe al
e) modul n care este nchis patrulea rnd al fiierului 4.txt
fiierul nu corespunde cu dup execuia programului urmtor
modul n care a fost ?
deschis 425. #include<stdio.h>
400. 426. void main()
401. 4. Fie fiierul identificat prin 427. {
descriptorul f, avnd urmtorul 428. FILE *f;
coninut: 429.
402. 5 f=fopen(4.txt,w);
403. 2 3 4 6 430. int n=8,j=0,
7 8 431. v[8]={1,3,8,5,0,6
404. Care dintre secvenele ,7,4};
urmtoare de program S1, S2, S3 432. while(v[j]%2) j+
poate fi executat, astfel nct, n +;
vectorul v s se citesc corect 433. while(j<n)
toate numerele din fiier ? 434. if(v[j++])
405. //secventa S1 435. fprintf(f,%d\n,
406. fscanf(f,%d,&n); v[j]);
407. for(i=0;i<n;i++) 436. fclose(f);
408. fscanf(f,%d,&v[i]); 437. }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
438. a) 5 b) 0 465. c) n cele dou
c) 6 fiiere exist i
439. d) 7 e) 4 caractere identice
440. 466. d) cele dou fiiere
441. 6. Fie programul: au acelai numr de
442. #include<stdio.h> caractere
443. #include<math.h> 467. e) nici unul dintre
444. void main() cazurile de mai sus
445. { 468.
446. FILE *f,*g; int 469. 7. Precizai care va fi
e; coninutul fiierului g dup
447. char c1, c2; execuia programului urmtor,
448. dac fiierul f conine pe fiecare
f=fopen(1.txt,r); linie o zi a sptmnii (luni,
449. g=fopen(2.txt, ..,duminica) :
r); 470. #include<stdio.h>
450. e=1; 471. #include<math.h>
451. do{ 472. void main()
452. 473. {
c1=fgetc(f); 474. FILE *f,*g; int
453. c2=fgetc(g j=1;
); 475. char
454. if(c1!=c2) s[11],c1,c2;
e=0; 476.
455. }while(! f=fopen(7.txt,r);
(feof(f)|| 477. g=fopen(7_2.txt,
456. feof(g))&&e); w);
457. if(e) 478. while(j++<4)
458. if(! 479. fgets(s,10,f)
(feof(f)&&feof(g)))e=0; ;
459. fclose(f); 480. fprintf(g,%d
fclose(g); ,j-1);
460. printf(%d,e); 481. fputs(s,g);
461. } 482. fclose(f);
462. Programul de mai sus afieaz fclose(g);
valoarea 1 dac: 483. }
463. a) cele dou fiiere 484. a) 3 Miercuri b) 3
difer prin cel puin un Joi
caracter 485. c) 4 Miercuri d) 4
464. b) cele dou fiiere Joi
sunt identice 486. e) 5 Joi
487.
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
488. 8. Fie programul urmtor: 514. void main()
489. #include<stdio.h> 515. {
490. void main() 516. int v[9]=
491. { 517. {0,1,0,0,2,3,0
492. FILE *f,*g; ,4,5},
493. int a,x,s; 518. j;
494. 519. FILE *f;
f=fopen(in.txt,r); 520. f=fopen(nr.txt,
495. g=fopen(out.txt, w);
w); 521. j=0;
496. scanf(%d,&a); 522. while(j<9)
497. while(!feof(f)) 523. { while(v[j])
498. { s=0; 524. fprintf(f,%3d,v
499. while(s<a && ! [j++];
feof(f)) 525.
500. { fprintf(f,%3d,99);
501. fscanf(f,%d 526. j++;
,&x); 527. }
502. s+=x; } 528. fclose(f);
503. 529. }
fprintf(g,%d,s); 530. a) 4 b) 5
504. } c) 8
505. fclose(f); 531. d) 9 e) 10
fclose(g); 532.
506. printf(\n s= 533. 10. Deducei ce valoare va
%d,s); afia programul urmtor, tiind c
507. } n fiierul f se gsesc pe un rnd,
508. Dac de la tastatur se separate prin spaii, numerele 1 3
introduce valoarea 10, iar 0 0 2 -3 0 -4 -1
coninutul fiierului in.txt este 4 6 534. #include<stdio.h>
3 2 6 15 1 (pe aceeai linie), 535. #include<math.h>
cte numere va scrie programul n 536. void main()
fiierul out.txt ? 537. {
509. a) nici unul b) 538. FILE *f;
unul 539. int
510. c) dou d) trei e) s=1,j=0,a[20];
patru 540.
511. f=fopen(nr.txt,r);
512. 9. Cte numere se vor gsi n 541. while(!feof(f))
fiierul nr.txt dup execuia 542. { j++;
programului urmtor ? 543. fscanf(f,%d,&
513. #include<stdio.h> a[j]);
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
544. if(a[j]) 568.c) concateneaz fiierul
545. s*=abs(a[j g la sfritul fiierului
]); f
546. } 569.d) concateneaz fiierul
547. printf(\n f la sfritul fiierului
%d,s); fclose(f); g
548. } 570.e) nici unul dintre
549. a) 1 b) cazurile anterioare
72 c) 72 571.
550. d) 572.12. Deducei ce valoare va afia
programul conine erori programul de mai jos, dac fiierul
de sintax text are urmtorul coninut:
551.e) nu se pot citi corect 573. 3 3
numerele din fiier 574. 1 2
552. 3
553.11. Presupunnd c toate liniile 575. 4 5
fiierului g conin cel mult 100 de 6
caractere, care este aciunea 576. 7 8
programului urmtor ? 9
554. #include<stdio.h> 577. #include<stdio.h>
555. void main() 578. void main()
556. { 579. {
557. FILE *f,*g; 580. FILE *f;
558. char s[101]; 581. int i,j,m,n,s=0,
559. 582. a[20][20];
f=fopen(1.txt,a); 583.
560. f=fopen(c.txt,r);
g=fopen(2.txt,r); 584. fscanf(f, %d
561. while(!feof(g)) %d,&m,&n);
562. 585. for(i=0;i<m;i++)
{ fgets(s,100,g); 586. for(j=0;j<n;j+
563. fputs(s,f); } +)
564. fclose(f); 587. {
fclose(g); 588. fscanf(f,%d,&a[i
565. } ][j]);
566.a) nlocuiete 589. if((i+j)%2)
coninutul fiierului g 590. s+=a[i]
cu coninutul fiierului [j];
f 591. }
567.b) nlocuiete 592. fclose(f);
coninutul fiierului f printf(%d,s);
cu coninutul fiirului g 593. }
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
594. a) 0 b) 8 c) 619. #include<string.h>
20 620. void main()
595. d) 25 e)programul 621. {
este eronat 622. FILE *f;
596. 623. int i=0,j,k;
597. 13. Se d fiierul identificat 624. char *aux;
prin descriptorul f, cu urmtorul 625. char
coninut: *a[9]={Marius,
598. 33 1 -45 18 626. Claudiu,3rei-
6 Sud-Est,
599. Ce instruciune trebuie scris 627. Daniel,Vasile,
n loc de .. astfel nct Dan,
programul urmtor s tipreasc 628. Sinacdu,2Pac
85? };
600. #include<stdio.h> 629. while(a[i]) i++;
601. void main(() 630. for(j=0;j<i-1;j+
602. { +)
603. FILE *f; 631.
604. int x, y; for(k=j+1;k<i;k++)
605. 632. if(strcmp(a[j],a[k
f=fopen(v.txt,r); ])>0)
606. fseek(f,-6,2); 633. {
607. fscanf(f, 634. aux=a[j];
%d,&y); 635. a[j]=a[k]
608. ;
609. 636. a[k]=aux;
fscanf(f,%d,&x); }
610. printf(\n%d 637. k=0;
%d,x,y); f=fopen(p.txt,w);
611. fclose(f); 638. while(a[k])
612. } 639. fprintf(f,%s\n,a[k
613. a) fseek(f,11,0); ++]);
b)fseek(f,-2,2); 640. fclose(f);
614. c) fseek(f,3,1); 641. }
d)fseek(f,2,1); 642. a) 2Pac b)Claudiu
615. e) fseek(f,-3,2); 643. c) Dan d) Daniel
616. 644. e) Marius
617. 14. Precizai ce nume se va 645.
gsi pe al cincilea rnd din fiierul 646. 15. Precizai care va fi coninutul
p.txt dup execuia programului fiierului b.txt dup execuia
de mai jos: programului urmtor, tiind c
618. #include<stdio.h>
k)
g)
h) Limbajul C/C++ pentru nceptori
i)
j)
fiierul a.txt are urmtorul 655. g=fopen(b.txt,
coninut: w);
647. 11 2 13 4 15 6 17 8 19 656. fread(v,8,1,f);
648. #include<stdio.h> 657. fwrite(v,6,1,g);
649. #include<math.h> 658. fclose(f);
650. void main() fclose(g);
651. { 659. }
652. FILE *f,*g; a) 11 2 13 4 15 6
653. int v[10]; b) 1 2 2 4 1 6
654. c) 11 2 13
f=fopen(a.txt,r); d) 11 2 1
e) un alt coninut dect
cel indicat
k)
660.
661. Rspunsuri la testele gril
662.
663.
664. 1.5 Elemente de baz ale limbajului C
665.
666. 1)a 2)c 3)c 4)b 5)d 6)a 7)c 8)d
667.
668. 2.3 Tipuri fundamentale de date
669.
670. 1)b 2)a 3)d 4)b 5)b 6)c 7)c 8)c 9)a,b,c,d
10)e
671. 11)a,b 12)c 13)b,c,d,e 14)a,c,d 15)d 16)c 17)b 18)c
19)c
672. 20)a
673.
674. 3.8 Funcii de intrare/ieire standard
675.
676. 1)c 2)c 3)c 4)c 5)c 6)e 7)b 8)b 9)c 10)b
677. 11)a,c 12)b 13)c 14)b,c 15)a 16)c 17)a 18)d 19)c 20)a
21)a
678. 22)a 23)a 24)a 25)c 26)b 27)c 28)d 29)c 30)c 31)d
32)b
679. 33)b 34)b 35)b 36)b 37)d 38)b
680.
681. 4.13 Operatorii limbajului C
682.
683. 1)b 2)a,d 3)b 4)a,c,d 5)b,c,e,g 7)a,c,f 10)b
11)a,b 13)c 14)a,b 19)c 20)b 21)d 22)b 23)d 24)d
25)a 26)d 27)b
684. 28)a 29)b 30)c 31)b 32)c 33)b 34)d 35)c 36)c
37)a,d 8)d
685. 39)b,c,e 40)c 41)c 42)b,c 43)b 44)b 45)d 46)a,e
47)b,e 48)e 49)e 50)c,e 51)a,c,e 52)a,e 53)c 54)c
55)c 56)a,c,d
686. 57)a,e 58)e
687.
688. 5.16 Instruciunile limbajului C
689.
690. 1)a,d 2)a,c,d,e 3)b 4)c 5)e 6)a,c 7)b 8)c 9)e
10)d
691. 11)b 12)c 13)d 14)a 15)a 16)d 17)b 18)a 19)a 20)b
21)c
692. 22)c 23)d 24)d 25)b 26)c 27)d 28)c 29)c 30)d 31)b
32)a
693. 33)d,e 34)e 35)c 36)c 37)a,c 38)a,d,e 39)b 40)d 41)b
42)b,c
694. 43)a 44)b 45)b,e 46)c 47)b,c 48)b 49)a,b,e
695.
696. 6.5 Tablouri
697.
698. 1)c 2)d 3)a,b 4)c 5)d 6)b,d,e 7)e 8)d 9)b
10)a,d 11)d 12)a,b,d 13)b,c 14)d 15)b,d 16)b 17)c
18)a 19)d 20)c
699. 21)c 22)c 23)b 24)d 25)d 26)a 27)a 28)a 29)a 30)c
31)c
700. 32)b 33)d 34)c 35)d 36)b 37)c
701.
702.
703. 7.4 Pointeri
704.
705. 7) b cu e, c cu d 10)b 11)c,d,e 12)d 13)e 14)d 15)a
706. 16)a,b,c 17)c 18)c 19)a,d 20)b 21)c 22)a 23)d
24)b,c 25)d,e 26)b,e 27)c 28)a,c,e 29)e 30)d 31)c
32)b,c 33)d 34)b 35)b 36)a 37)a 38)a 39)a 40)a 41)a
42)a 43)a 44)b
707. 45)c 46)d
708.
709.
710. 8.6 iruri de caractere
711.
712. 1)c 2)b 3)c 4)a,b,e 5)a,d,e 6)a 7)b 8)d 9)b
10)d
713. 11)b 12)e 13)d 14)b 15)e 16)a,b 17)d 18)b 19)c 20)e
21)d
714. 22)a 23)b 24)d 25)b,c 26)b
715.
716. 9.4 Structuri
717.
718. 1)d 2)d 3)c 4)b 5)d 6)d 7)c 8)d
719.
720. 10.10 Exploatarea fiierelor
721.
722. 1)b,c 2)b 3)a 4)d 5)d 6)b 7)c 8)e 9)e 10)b
11)c
723. 12)c 13)d,e 14)d 15)d
724. Bibliografie
725.
726.
727.
728. 1. Herbert Schildt
- C manual complet, Editura Teora, Bucureti, 1998
729. 2. Liviu Negrescu
730. - Limbajul C,vol.I, II, Editura Albastr, Cluj-Napoca, 1997
731. 3. Dorian Stoilescu
732. - Manual de C/C++, Editura Radial, Galai, 1998
733. 4. Damian Costea
734. - Iniiere n limbajul C, Editura Teora, Bucureti, 1996
735. 5. George-Daniel Mateescu, Pavel Florin Moraru
- Limbajul C++, probleme i teste gril pentru liceu i
736. bacalaureat,
737. Editura Niculescu, Bucureti, 2001
738. 6. Claudia Botez, Dumitru Ilinca
- Teste de informatic, Editura Universitii Tehnice
739. Ghe. Asachi, Iai, 2001
740.