Documente Academic
Documente Profesional
Documente Cultură
int main() {
int n,i;
dou'le a)&00*;
scanf(""d",#n);
for (i!0; i<n; i$$)
scanf(""lf",#a)i*);
printf("".,lf\n", media(a,n));
return 0;
int main() {
int i;
33333333333333333333333333333333333333333333
E
scanf(""d",#n);
for (i!0; i<n; i$$) scanf(""lf",#a)i*);
printf("".,lf\n",produs());
return 0;
Jariabila -$ care ar trebui s memoreze &aloarea A6E77$ are tipul ntreg scurt
(short,$ pentru care omeniul e &alori este restrns la <B?6EC B?6E6. Astfel
33333333333333333333333333333333333333333333
6
c &aloarea 4447777477777777
(?,
(n zecimal A6E77,$ n reprezentare ntreag cu
semn este e fapt <6FBE.
=n continuare &ariabila a prime!te &aloarea E7.4$ care nu poate fi reprezentat
exact n virgul mobil. 0e aceea &ariabila - prime!te &aloarea E77F atorit
erorilor e apro.imare.
Al treilea set e opera%ii necesit o analiz mai atent; e.plica%iile snt &alabile
pentru programe care ruleaz pe ar/itecturi +ntel. Jariabila c$ care ar trebui s
memoreze &aloarea ?DEF4BA6 (rezultatul corect,$ &a a&ea &aloarea ?DEF4BAE$
eoarece tipul float are rezer&ate pentru mantis oar ?D e cifre binare.
Rezultatul este foarte apropiat e cel corect eoarece rezultatele intermeiare se
pstreaz n regi!trii coprocesorului matematic cu precizie ma.im. Abia la
memorare se efectueaz trunc/ierea$ e une rezult &aloarea afi!at.
Cu totul altfel stau lucrurile n cazul celui e al patrulea set e opera%ii. Aici
rezultatele intermeiare snt memorate e fiecare at cu trunc/iere n &ariabile e
tip float. =n final se calculeaz !i iferen%a intre cele ou &alori trunc/iate$ e
une rezult &aloarea 4E666?4E.
=nainte e terminare se &erific ac &alorile c !i w snt egale. =n caz afirmati&
se comunic sistemului e operare un co 7 (terminare normal,. =n caz contrar se
comunic un co 4 (terminare anormal,.
Rula%i acest program pe iferite sisteme e calcul !i obser&a%i care este
rezultatul.
"ltimul program cite!te cte o linie e la intrarea stanar !i o afi!eaz la
ie!irea stanar.
#include <stdio.h>
char lin)50*;
int main() {
while (8ets(lin)) puts(lin);
return 0;
int 8() {
static int s ! .;
s$$; e$$;
return s $ e;
int main() {
int (&,(.,(,,(/;
(& ! f(); (. ! 8();
(, ! f(); (/ ! 8();
printf(""d "d "d "d "d\n",(&,(.,(,,(/,e);
return 0;
33333333333333333333333333333333333333333333
?B
=
#include <stdio.h>
int fact(int n) {
int i,p;
for (p!i!&; i<!n; i$$)
p 0! i;
return p;
int main() {
int n,-,i;
puts("Salori n si -P ");
scanf(""d "d",#n,#-);
printf("Eom'inariP"d\n",fact(n)+fact(-)+fact(n7-));
return 0;
Kunc%ia fact este apelat n programul principal e trei ori$ fiecare apel
transmite func%iei un argument.
@ sec&en% mai eficient < in punctul e &eere al &olumului e calcul !i al
corectituinii acestora < se bazeaz pe urmtoarea formul#
,
, n n n
,
n
C
4
...
?
4
4
+
=
Kunc%ia fact prouce rezultate eronate pentru &alori mari ale lui n (n C$
sisteme e calcul pe 4E bi%i; n 4?$ sisteme e calcul pe B? e bi%i,. Kunc%ia
com'$ bazat pe rela%ia e mai sus$ permite operarea cu &alori mai mari ale
parametrilor n !i -.
33333333333333333333333333333333333333333333
DE
int com'(int n, int -) {
int i,p;
for (p!i!&; i<!-; i$$)
p ! p 0 (n7i$&) + i;
return p;
> +
=
4 $
4 $
? 4
n ! !
n n
!
n n
n
int rfi'o(int n) {
if (n<!&) return &;
else return fi'o(n7&) $ fi'o(n7.);
33333333333333333333333333333333333333333333
D6
*implitatea cu care snt efinite aceste func%ii ar putea cuceri imeiat pe un
programator nee.perimentat. 'rebuie s atragem aten%ia asupra faptului c cele
ou efini%ii au o comple.itate e.ponen%ial# pentru o &aloare oarecare a lui n$
numrul e opera%ii elementare efectuate (aritmetice !i logice, este apro.imati&
propor%ional cu ?
n
.
0e aceea recursi&itatea este justificat numai n situa%ia n care !tim cu
certituine c se ob%ine o efini%ie a&n comple.itate acceptabil. "n e.emplu n
acest sens &a fi at n capitolul nou# gestionarea unei structuri e ate e tip
arbore.
Am &zut n sec%iunea preceent o efini%ie simpl !i eficient a unei func%ii
care calculeaz &aloarea
,
n
C . =n continuare prezentm o efini%ie simpl !i
eficient pentru eterminarea unui termen in !irul lui Kibonacci#
int fi'o(int n) {
int a,',c,i;
a ! 0; ' ! &; c ! n;
for (i!.; i<!n; i$$) {
c ! a $ ';
a ! '; ' ! c;
return p;
33333333333333333333333333333333333333333333
A4
D. Kunc%ia lower con&erte!te literele mari in setul e caractere A*C++ n
litere mici. 0ac lo:er prime!te un caracter care nu este o liter mare atunci l
returneaz nesc/imbat.
int lower(int c) {
if (c>!B=B ## c<!BTB)
return c $ BaB 7 B=B;
else
return c;
int main() {
unsi8ned p,G,-;
citire(#p); citire(#G);
- ! cmmdc(p,G);
printf("EmmdcP "u\n",-);
return 0;
Ki!ierul surs numere.c este proiectat pentru a putea fi folosit n mai multe
aplica%ii care au ne&oie e astfel e func%ii. Prin incluerea fi!ierului numere.h
se garanteaz c efini%ia func%iilor este conform cu a!teptrile moulului
principal$ n care este inclus acela!i fi!ier /eaer.
#include "numere.h"
unsi8ned eprim(unsi8ned n) {
unsi8ned i,a,r;
if (n!!0) return 0;
if (n</) return &;
if ((n#&)!!0) return 0;
for (i!,; ; i$!.) {
r ! n"i;
if (r!!0) return 0;
33333333333333333333333333333333333333333333
AE
a ! n+i;
if (a<!i) return &;
int Mter8ere(dou'le () {
int -;
- ! Qntero8are(();
if (-<0) return 0;
for (; -<ne; -$$)
?is)-* ! ?is)-$&*;
ne77;
return &;
int Qntero8are(dou'le () {
int l,r,m;
dou'le d;
l ! 0; r ! ne 6 &;
while (l<!r) {
m ! (l $ r) + .; d ! ?is)m* 6 (;
if (d!!0) return m;
if (d<0) l ! m $ &;
else r ! m 6 &;
return 6&;
Proiectele < programe e imensiuni mari < snt compuse e cele mai multe
ori in moule care se elaboreaz !i se pun la punct n mo inepenent. "neori
pot fi ientificate func%ii care prezint un interes general mai mare$ !i care pot fi
utilizate n elaborarea unor tipuri e aplica%ii foarte i&erse. Acestea snt ez&ol-
33333333333333333333333333333333333333333333
AF
tate separat !i$ up ce au fost puse la punct n totalitate$ se epun ntr-o bibliotec
e func%ii n format obiect. =n momentul n care acestea snt incluse n proiecte nu
se mai piere timp cu compilarea moulelor surs. =n sc/imb moulele care le
apeleaz au ne&oie e moul cum snt efinite aceste func%ii$ !i acesta se pstreaz
ca !i eclara%ii n fi!iere /eaer.
Ki!ierele /eaer pstreaz !i alte informa%ii comune mai multor moule$ cum
snt e e.emplu tipurile efinite e programator$ cel mai aesea tipuri structurate
(etalii n capitolul nou,.
33333333333333333333333333333333333333333333
E7
>. &ointeri 7i masi#e
"n pointer este o &ariabil care con%ine aresa unei alte &ariabile. Pointerii
snt foarte mult utiliza%i n programe scrise n C$ pe e o parte pentru c uneori snt
unicul mijloc e a e.prima un calcul$ iar pe e alt parte pentru c ofer
posibilitatea scrierii unui program mai compact !i mai eficient ect ar putea fi
ob%inut prin alte ci.
>.1. &ointeri 7i adrese
0eoarece un pointer con%ine aresa unui obiect$ cu ajutorul lui putem a&ea
acces$ n mo inirect$ la acea &ariabil (obiect,.
* presupunem c : este o &ariabil e tip ntreg !i p: un pointer la un ntreg.
Atunci aplicn operatorul unar # lui :$ instruc%iunea#
p: ! #:;
atribuie &ariabilei p: aresa &ariabilei :; n acest fel spunem c p: inic
(pointeaz, spre :.
+n&ers$ ac p: con%ine aresa &ariabilei :$ atunci instruc%iunea#
; ! 0p:;
atribuie &ariabilei y con%inutul loca%iei pe care o inic p:.
Jariabila : are asociat o zon e memorie$ !i aceast zon are (presupunem,
aresa CAAD. 0up atribuirea p: = #:$ &ariabila p: &a a&ea &aloarea CAAD.
G&ient toate &ariabilele care snt implicate n aceste instruc%iuni trebuie
eclarate. Aceste eclara%ii snt#
int :,;,0p:;
0eclara%iile &ariabilelor : !i ; snt eja cunoscute. 0eclara%ia pointerului p:
este o noutate. Aceasta inic faptul c o combina%ie e forma 0p: este un ntreg$
iar &ariabila p: care apare n conte.tul 0p: este ec/i&alent cu un pointer la o
&ariabil e tip ntreg. =n locul tipului ntreg poate aprea oricare intre tipurile
amise n limbaj !i se refer la obiectele pe care le inic p:.
Pointerii pot aprea !i n e.presii; n e.presia urmtoare &ariabilei ; i se
atribuie &aloare &ariabilei : plus &#
; ! 0p: $ &;
+nstruc%iunea urmtoare are ca efect con&ertirea &alorii &ariabilei : pe care o
inic p: n tip dou'le !i apoi epunerea rcinii ptrate a &alorii astfel
con&ertite n &ariabila d#
d ! sGrt((dou'le)0p:);
Referiri la pointeri pot aprea e asemenea !i n partea stng a atribuirilor.
0ac$ e e.emplu$ p: inic spre :$ atunci urmtoarea instruc%iune atribuie
&ariabilei : &aloarea zero#
33333333333333333333333333333333333333333333
E4
0p: ! 0;
+nstruc%iunile urmtoare snt ec/i&alente$ !i incrementeaz &aloarea &ariabilei
: cu &#
0p: $! &;
(0p:)$$;
=n acest ultim e.emplu parantezele snt obligatorii eoarece$ n lipsa lor$
e.presia ar incrementa pe p: n loc e &aloarea &ariabilei pe care o inic
(operatorii unari 0$ $$ au aceea!i preceen% !i snt e&alua%i e la reapta spre
stnga,.
&ointeri de tip (oid 5tip 'eneric de pointer6
"n pointer poate fi eclarat e tip (oid. =n aceast situa%ie pointerul nu poate
fi folosit pentru inirectare (ereferen%iere, fr un cast e.plicit$ !i aceasta
eoarece compilatorul nu poate cunoa!te tipul obiectului pe care pointerul l
inic.
int i;
float f;
(oid 0p;
p ! #i; +0 p indic spre i 0+
0(int 0)p ! .;
p ! #f; +0 p indic spre * 0+
0(float 0)p ! &.2;
Pointerii generici snt foarte utiliza%i e unele func%ii e bibliotec$ atunci
cn este ne&oie s se opereze cu zone e memorie care pot con%ine informa%ii e
orice natur# opera%ii e intrare > ie!ire fr format (capitolul zece,$ alocri e
memorie$ sortare !i cutare (capitolul unsprezece,. Aceste func%ii nu cunosc tipul
atelor cu care opereaz$ pentru aceste func%ii zonele e memorie nu au un tip
precizat. Acest fapt este e&ien%iat prin pointeri e tip (oid.
>. &ointeri 7i ar'umente de *uncii
0ac transmiterea argumentelor la func%ii se face prin &aloare (!i nu prin
referin%,$ func%ia apelat nu are posibilitatea e a altera o &ariabil in func%ia
apelant. Problema care se pune este cum procem ac orim s moificm
&aloarea unui argumentZ
0e e.emplu$ o rutin e sortare trebuie s sc/imbe ntre ele ou elemente
care nu respect orinea orit$ cu ajutorul unei func%ii swap. Kie func%ia swap
efinit astfel#
(oid swap(int :, int ;) { +0 're7it 0+
int tmp;
tmp ! :;
33333333333333333333333333333333333333333333
E?
: ! ;;
; ! tmp;
0eoarece &ariabila 'is poate lua ca &alori numai zero sau unu$ up cum
e.presia (scris e ata aceasta e.plicit,#
(an"/!!0) ## (an"&00%!0) II (an"/00!!0)
este fals sau ae&rat$ ea poate fi folosit ca inice e linie n tabelul Tile care
are oar ou linii n e.emplul nostru.
(oid ?unaTi(int an, int 9ian, int 0plun, int 0p9i) {
int i,'is;
'is ! %(an"/) ## (an"&00) II %(an"/00);
for (i!&; 9ian>Tile)'is*)i*; i$$)
9ian 7! Tile)'is*)i*;
0plun ! i; 0p9i ! 9ian;
Rutina care afi!eaz liniile n noua lor orine este Yrite?ines !i are
urmtorul co#
(oid Yrite?ines(char 0linptr)*, int nrl) {
int i;
for (i!0; i<nrl; i$$)
puts(linptr)i*);
33333333333333333333333333333333333333333333
64
=n func%ia puts$ linptr inic ini%ial prima linie e afi!at; fiecare
incrementare a&anseaz pe 0linptr la urmtoarea linie e afi!at$ n timp ce nrl
se mic!oreaz up fiecare afi!are a unei linii cu 4.
Kunc%ia care realizeaz sortarea efecti& a liniilor se bazeaz pe algoritmul e
njumt%ire !i are urmtorul co#
(oid Mort(char 0()*, int n) {
int 8ap,i,H;
char 0tmp;
for (8ap!n+.; 8ap>0; 8ap+!.)
for (i!8ap; i<n; i$$)
for (H!i78ap; H>!0; H7!8ap) {
if (strcmp(()H*,()H$8ap*)<!0)
'rea-;
tmp ! ()H*;
()H* ! ()H$8ap*;
()H$8ap* ! tmp;
+ni%ial se aloc memorie une se &or epune aresele celor n linii$ e aceea
primul apel malloc cere o zon e memorie pentru n pointeri. =n continuare
trebuie alocat memorie !i pentru matricea propriu-zis. Pentru simplificare am
preferat s alocm o zon continu e nm ntregi (al oilea apel malloc,.
=n acest moment putem etermina aresa fiecrei linii a matricei. Prima linie
are eterminat aresa in momentul alocrii. Pentru o linie oarecare i (i > 7,
aresa acesteia se ob%ine in aresa liniei preceente la care se aaug m (numrul
e elemente ale liniei,; a se &eea !i figura e mai jos.
333 33333333333333333333333333333333
_33_<<<<_33_33_33_33_33_33_33_33_33_
33333333333333333333333333333333333333333333
6E
_33_<<<<<<<<<<<<
_
_
_33_<<<<<<<<<<<<<<<<<<<
_
Gste foarte important s se respecte ace!ti pa!i n alocarea memoriei pentru
matrice. =n caz contrar &ariabilele pointer con%in &alori necunoscute !i nu e.ist
garan%ii c inic spre zone e memorie sigure# este foarte probabil c programul
nu are acces la zonele respecti&e.
Kunc%ia principal &a fi scris astfel#
int main() {
int 00Cat,n,m;
+0 alte de*iniii de #ariabile 0+
+0 Cite7te #alorile n 7i m 0+
Cat ! QntCatr(n,m);
+0 Completea" matricea cu #alori Cat)i*)H* ... 0+
+0 &relucrea" matricea 0+
free(Cat)0*); free(Cat); +0 :liberea" memoria 0+
*pre eosebire e e.emplul preceent$ une toat memoria a fost alocat ntr-
o singur opera%ie (al oilea apel malloc,$ aici am alocat separat memorie pentru
fiecare linie.
Apelul acestei func%ii necesit anumite pregtiri#
33333333333333333333333333333333333333333333
66
dou'le 00Fm; +0 pentru o matrice cu elemente de tip double 0+
int n,0C;
+0 alte de*iniii de #ariabile 0+
+0 Cite7te #aloarea n 0+
C ! (int 0)malloc(n0si9eof(int));
+0 preci"ea" pentru *iecare linie numrul de elemente 0+
Fm ! (dou'le 00)Zenmatr(n,C,si9eof(dou'le));
+0 0peraii cu elementele matricei 0+
-emoria ocupat se elibereaz astfel#
for (i!0; i<n; i$$)
free(Fm)i*);
free(Fm); free(C);
Gste posibil s alocm o zon compact pentru memorarea matricei$ trebuie
mai nti s eterminm numrul total e elemente. A oua &ariant a func%iei
ZenCatr este#
(oid 00Zenmatr(int n, int C)*, int s) {
int i,l;
char 00p;
p ! (char 00)malloc(n0si9eof((oid 0));
for (l!i!0; i<n; i$$)
l $! C)i*;
p)0* ! (char 0)malloc(l0s);
for (i!&; i<n; i$$)
p)i* ! p)i7&* $ C)i* 0 s;
return p;
une linia e coman este e e.emplu# find lim'aH n care find este numele
programului$ iar lim'aH este !ablonul cutat. Rezultatul &a fi afi!area tuturor
liniilor te.tului e intrare care con%in cu&ntul lim'aH.
* elaborm acum moelul e baz$ legat e linia e coman !i argumentele
ei.
* presupunem c orim s introucem n linia e coman ou argumente
op%ionale# unul care s afi!eze toate liniile cu e.cep%ia acelora care con%in
!ablonul$ !i al oilea care s precea fiecare linie afi!at cu numrul ei e linie.
@ con&en%ie pentru programele scrise n limbajul C este ca argumentele intr-
o linie e coman care ncep cu un caracter 7 s introuc un parametru op%ional.
0ac alegem$ e e.emplu$ 7: pentru a inica cu excepia !i 7n pentru a cere
numrarea liniilor$ atunci comana#
find 7: 7n la
a&n intrarea#
la miezul stinselor lumini
s#a0ung victorios,
la temelii, la rdcini,
la mduv, la os/
&a prouce afi!area liniei a oua$ preceat e numrul ei$ eoarece aceast linie
nu con%ine !ablonul la.
Argumentele op%ionale snt permise n orice orine n linia e coman.
Analizarea !i prelucrarea argumentelor unei linii e coman trebuie efectuat n
33333333333333333333333333333333333333333333
C7
func%ia principal main$ ini%ializn n mo corespunztor anumite &ariabile.
Celelalte func%ii ale programului nu &or mai %ine e&ien%a acestor argumente.
Gste mai como pentru utilizator ac argumentele op%ionale snt concatenate$
ca n comana#
find 7:n la
Caracterele : respecti& n inic oar absen%a sau prezen%a acestor op%iuni
(switch, !i nu snt tratate in punct e &eere al &alorii lor.
Kie programul care caut !ablonul la n liniile e la intrare !i le afi!eaz pe
acelea$ care nu con%in !ablonul$ preceate e numrul lor e linie. Programul
trateaz corect att prima form a liniei e coman ct !i a oua. =n continuare
este prezentat oar func%ia principal a acestui program.
int main(int ac, char 0a()*) { +0 caut un 7ablon 0+
char lin)50*,0s;
lon8 nl;
int e:c,num,tst;
nl ! num ! 0;
while (77ac>0 ## (0$$a())0*!!B7B)
for (s!a()0*$&; 0s%!0; s$$)
switch(0s) {
case B:BP e:c ! &; 'rea-;
case BnBP num ! &; 'rea-;
defaultP
printf("findP optiune ile8ala "c\n",0s);
ac ! 0;
'rea-;
if (ac%!&)
puts("Ju e:ista ar8umente sau sa'lon");
else
while (8ets(lin) {
nl$$;
tst ! inde:(lin,0a()>!0;
if (tst%!e:cept) {
if (num)
printf(""/dP",nl);
puts(lin);
FF #nfo FF #nfo F
aablonul unei structuri (no, este urmtorul#
t;pedef struct MUlist {
char 0num,0def;
33333333333333333333333333333333333333333333
FD
struct MUlist 0n:t; > Y urmtoarea intrare n lan% Y>
RUlist, 0VUlist;
Aceast eclara%ie recursi& a unui no este perfect legal$ eoarece o
structur nu poate con%ine ca !i component o intrare a ei ns!i$ ar poate con%ine
un pointer la o structur e acela!i !ablon cu ea.
0eclara%ia e mai sus efine!te un tip structurat cu numele RUlist$ sinonim
cu tipul struct MUlist. 'ipul VUlist este sinonim cu RUlist 0 !i cu
struct MUlist 0.
-asi&ul e pointeri care inic nceputurile lan%ului e blocuri ce escriu
simboluri e acela!i co /as/ este#
#define JH=MH 0:&00
static RUlist 0hasht)JH=MH*;
Algoritmul e /as/ing pe care-l prezentm nu este cel mai bun posibil$ ar are
meritul e a fi e.trem e simplu#
int hashf(char 0s) { >Y formeaz &aloarea /as/ pentru !irul s Y>
int h(;
for (h(!0; 0s;) h( $! 0s$$;
return h( " JH=MH;
Cum eliberm toate zonele ocupate e o listZ 'rebuie s fim foarte aten%i
eoarece$ nainte e a elibera memoria ocupat e noul curent$ trebuie eliberat
memoria ocupat e noul care urmeaz celui curent. Prezentm mai nti &arianta
recursi&#
(oid >ree?ist(RUlist 0np) {
if (np) {
>ree?ist(np7>n:t);
free(np);
?.<. C-mpuri
"n cmp se efine!te ca fiin o mul%ime e bi%i consecuti&i intr-un cu&nt sau
ntreg. Concret$ in moti&e e economie a spa%iului e memorie$ este util
mpac/etarea unor obiecte ntr-un singur cu&nt ma!in. "n caz frec&ent e acest
tip este utilizarea unui set e flaguri$ fiecare pe un bit$ pentru tabela e simboluri a
unui compilator.
Kiecare simbol intr-un program are anumite informa%ii asociate lui$ cum snt
e e.emplu clasa e memorie$ tipul$ ac este sau nu cu&nt c/eie !.a.m.. Cel mai
compact mo e a coifica aceste informa%ii este folosirea unui set e flaguri$ e
cte un bit$ ntr-un singur ntreg sau caracter.
-oul cel mai uzual pentru a face acest lucru este e a efini un set e m!ti$
fiecare masc fiin corespunztoare pozi%iei bitului n interiorul caracterului sau
cu&ntului. 0e e.emplu#
#define NA[YWXF 0&
#define A<RAXJ=? 0.
#define MR=RQE 0/
efinesc m!tile NA[YWXF$ A<RAXJ=? !i MR=RQE care se refer la bi%ii 7$ 4 !i
respecti& ? in caracter sau cu&nt. Atunci accesarea acestor bi%i se realizeaz cu
ajutorul opera%iilor e eplasare$ mascare !i complementare$ escri!i ntr-un
capitol anterior. )umerele trebuie s fie puteri ale lui ?.
G.presii e forma urmtoare apar frec&ent !i ele seteaz bi%ii 4 !i ? in
caracterul sau ntregul flags (n e.emplul nostru,#
fla8s I ! A<RAXJ=? I MR=RQE;
G.presia urmtoare selecteaz bi%ii 4 !i ? in flags#
fla8s #! A<RAXJ=? I MR=RQE;
33333333333333333333333333333333333333333333
47?
G.presia urmtoare este ae&rat cn cel pu%in unul in bi%ii 4 sau ? in
flags este unu#
if (fla8s # (A<RAXJ=? I MR=RQE)) ...
G.presia urmtoare este ae&rat cn bi%ii 4 !i ? in flags snt ambii zero#
if (%(fla8s # (A<RAXJ=? I MR=RQE))) ...
1imbajul C ofer aceste e.presii ca o alternati& pentru posibilitatea e a
efini !i e a accesa bi%ii intr-un cu&nt n mo irect$ folosin operatorii logici
pe bi%i.
*inta.a efini%iei cmpului !i a accesului la el se bazeaz pe structuri. 0e
e.emplu construc%iile #define in e.emplul e mai sus pot fi nlocuite prin
efinirea a trei cmpuri#
struct {
unsi8ned isU-e;wordP&;
unsi8ned isUe:ternalP&;
unsi8ned isUstaticP&;
fla8s;
Aceast construc%ie efine!te &ariabila fla8s care con%ine B cmpuri$ fiecare
e cte un bit. )umrul care urmeaz up P (ou puncte, reprezint lungimea
cmpului n bi%i. Cmpurile snt eclarate unsi8ned pentru a sublinia c ele snt
cantit%i fr semn. Pentru a ne referi la un cmp ini&iual in &ariabila fla8s
folosim o nota%ie similar cu nota%ia folosit pentru membrii structurilor.
fla8s.isU-e;word
fla8s.isUstatic
Cmpurile se comport ca ni!te ntregi mici fr semn !i pot participa n
e.presii aritmetice ca orice al%i ntregi. Astfel$ e.presiile anterioare pot fi scrise
mai natural sub forma urmtoare#
fla8s.isUe:tern ! fla8s.isUstatic ! &;
pentru setarea bi%ilor 4 !i ? in &ariabila fla8s$
fla8s.isUe:tern ! fla8s.isUstatic ! 0;
pentru !tergerea bi%ilor$ iar#
if (fla8s.isUe:tern!!0 ## fla8s.isUstatic!!0)
pentru testarea lor.
"n cmp nu trebuie s ep!easc limitele unui cu&nt (4E sau B? e bi%i$ n
func%ie e sistemul e calcul,. =n caz contrar$ cmpul se aliniaz la limita
urmtorului cu&nt. Cmpurile nu necesit s fie enumite. "n cmp fr nume$
escris numai prin caracterul P !i lungimea lui n bi%i$ este folosit pentru a rezer&a
spa%iu n &eerea alinierii urmtorului cmp. 1ungimea zero a unui cmp poate fi
folosit pentru for%area alinierii urmtorului cmp la limita unui nou cu&nt$ el
fiin presupus a con%ine tot cmpuri !i nu un membru obi!nuit al structuri$
eoarece n acest ultim caz alinierea se face n mo automat. )ici un cmp nu
33333333333333333333333333333333333333333333
47B
poate fi mai lung ect un cu&nt. Cmpurile se atribuie e la reapta la stnga$ e
la pozi%iile cele mai pu%in semnificati&e la cele mai semnificati&e.
Cmpurile nu pot constitui masi&e$ nu au arese$ astfel nct operatorul & nu se
poate aplica asupra lor.
?.>. !euniuni
@ reuniune este o &ariabil care poate con%ine$ la momente iferite$ obiecte e
iferite tipuri !i imensiuni; compilatorul este cel care %ine e&ien%a imensiunilor
!i aliniamentului.
Reuniunile ofer posibilitatea ca mai multe tipuri iferite e ate s fie tratate
ntr-o singur zon e memorie.
* relum e.emplul tabelei e simboluri a unui compilator$ presupunn c se
gestioneaz constante e tip int$ float sau !iruri e caractere.
Jaloarea unei constante particulare ar putea fi memorat ntr-o &ariabil e tip
corespunztor$ ar este mai con&enabil$ pentru gestiunea tabelei e simboluri$ ca
&aloarea s fie memorat n aceea!i zon e memorie$ iniferent e tipul ei.
Acesta este scopul unei reuniuni# e a furniza o singur &ariabil care s poat
con%ine oricare intre &alorile unor tipuri e ate. Ca !i n cazul cmpurilor$
sinta.a efini%iei !i accesului la o reuniune se bazeaz pe structuri. Kie efini%ia#
union uUta8 {
int i(al;
float f(al;
char 0p(al;
u(al;
Jariabila u(al &a fi suficient e mare ca s poat pstra pe cea mai mare
intre cele trei tipuri e componente. @ricare intre tipurile e mai sus poate fi
atribuit &ariabilei u(al !i apoi folosit n e.presii n mo corespunztor$ aic
tipul n u(al este tipul ultim atribuit. "tilizatorul este cel care %ine e&ien%a
tipului curent memorat ntr-o reuniune.
*intactic$ membrii unei reuniuni snt accesibili printr-o construc%ie e forma#
nume#reuniune. membru
pointer#la#reuniune7>membru
0ac &ariabila ut;pe este utilizat pentru a %ine e&ien%a tipului curent
memorat n u(al$ atunci putem a&ea urmtorul co#
switch (ut;pe) {
case QJRP
printf (""d\n",u(al.i(al); 'rea-;
case >?W=RP
printf(""f\n",u(al.f(al); 'rea-;
case MRXQJZP
33333333333333333333333333333333333333333333
47D
printf(""s\n",u(al.p(al); 'rea-;
defaultP
printf("tip incorect "d in ut;pe\n",ut;pe);
'rea-;
Reuniunile pot aprea n structuri !i masi&e !i in&ers. *inta.a pentru accesarea
unui membru al unei reuniuni intr-o structur (sau in&ers, este ientic cu cea
pentru structurile imbricate. 0e e.emplu$ n masi&ul e structuri
s;mta')JM[C* efinit e#
struct {
char 0name;
int fla8s,ut;pe;
union {
int i(al;
float f(al;
char 0p(al;
u(al;
s;mta')JM[C*;
&ariabila i(al se refer prin#
s;mta')i*.u(al.i(al
iar primul caracter al !irului inicat e p(al prin#
0s;mta')i*.u(al.p(al
'e/nic$ o reuniune este o structur n care to%i membrii au eplasamentul zero$
structura fiin suficient e mare pentru a putea pstra pe cel mai mare membru.
Alinierea este corespunztoare pentru toate tipurile reuniunii. Pointerii la reuniuni
pot fi folosi%i n mo similar cu pointerii la structuri.
"rmtorul e.emplu trebuie stuiat cu aten%ie$ eoarece implementarea este
epenent e ar/itectura sistemului e calcul. 0e aceea &om prezenta ou
eclara%ii e tip$ corespunztoare celor ou mouri e reprezentare a &alorilor
ntregi#
< pentru ar/itecturi 1ig $ndian#
t;pedef struct {
short an;
char luna, 9i;
RUstruc;
< pentru ar/itecturi %ittle $ndian#
t;pedef struct {
char luna, 9i;
short an;
33333333333333333333333333333333333333333333
47A
RUstruc;
=n continuare putem efini un tip at calenaristic#
t;pedef union {
RUstruc ds;
lon8 dn;
RUdata;
Kie urmtoarele efini%ii e &ariabile#
RUdata dc&, dc.;
=n continuare putem interpreta con%inutul &ariabilelor dc& !i dc. fie ca
structuri fie ca ntregi lungi.
@ &ariabil e acest tip se ini%ializeaz astfel#
dc&.ds.an ! . . .;
dc&.ds.luna ! . . .;
dc&.ds.9i ! . . .;
0ou ate calenaristice se compar ct se poate e natural#
dc&.dn < dc..dn
Cum putem epista automat ce fel e ar/itectur are sistemul e calculZ
union {
lon8 l;
char c)/*;
tst ! 0:&.,/2135;
if (tst.c)0*!!0:&.) puts("Di8 Andian");
else puts("?ittle Andian");
33333333333333333333333333333333333333333333
47E
1@. 0peraii de intrare D ie7ire
=ntruct limbajul C nu a fost ez&oltat pentru un sistem particular e operare$
!i atorit faptului c s-a orit realizarea unei portabilit%i ct mai mari$ att a unui
compilator C$ ct !i a programelor scrise n acest limbaj$ el nu pose facilit%i e
intrare > ie!ire.
G.ist totu!i un sistem e intrare > ie!ire constituit intr-un numr e
subprograme care realizeaz func%ii e intrare > ie!ire pentru programe scrise n C$
ar care nu fac parte in limbajul C. Aceste subprograme se gsesc n biblioteca
C.
*copul acestui capitol este e a escrie cele mai utilizate subprograme e
intrare > ie!ire !i interfa%a lor cu programele scrise n limbajul C.
1@.1. Intrri 7i ie7iri standard+ *i7iere
*istemul +>@ ofer utilizatorului trei fiiere stanar e lucru. Cu&ntul fi!ier
a fost pus ntre g/ilimele$ eoarece limbajul nu efine!te acest tip e at !i pentru
c fi!ierele reprezint mai egrab ni!te flu.uri e intrare > ie!ire stanar puse la
ispozi%ia utilizatorului. Aceste fi!iere snt#
< fi!ierul stanar e intrare (stdin,;
< fi!ierul stanar e ie!ire (stdout,;
< fi!ierul stanar e afi!are a mesajelor (stderr,.
'oate aceste trei fi!iere snt sec&en%iale !i n momentul e.ecu%iei unui program
C snt implicit efinite !i esc/ise.
stdin !i stdout snt asociate n mo normal terminalului e la care a fost
lansat programul n e.ecu%ie. *istemul +>@ permite reirectarea acestor fi!iere pe
alte periferice !i nc/ierea lor la nc/eierea e.ecu%iei programului. Reirectarea
fi!ierului stdin se specific prin construc%ia#
<specificator#fiier#intrare
n linia e coman prin care a fost lansat programul.
Reirectarea fi!ierului stdout se specific prin construc%ia#
>specificator#fiier#ieire
n linia e coman prin care a fost lansat programul.
Reirectarea fi!ierului stdout pe un alt periferic$ n scopul efecturii unei
opera%ii e augare (appen, se specific prin construc%ia#
>>specificator#fiier#ieire
stderr este ntoteauna asociat terminalului e la care a fost lansat
programul n e.ecu%ie !i nu poate fi reirectat.
Astfel c o linie e coman a unui program poate arta astfel#
"rog <intrare#standard >ieire#standard ali parametri
33333333333333333333333333333333333333333333
476
"rog < intrare#standard >> ieire#standard ali parametri
Kiecare in parametri poate lipsi; n lipsa unui specificator e intrare sau ie!ire
stanar se folose!te terminalul curent. Asocierea unui fi!ier cu intrarea sau
ie!irea stanar este fcut e sistemul e operare$ programul primin oar
informa%ii espre ceilal%i parametri in linia e coman.
Pentru a se putea face o referire la fi!iere orice program C trebuie s con%in
fi!ierul stdio.h$ care se inclue printr-o linie e forma#
#include <stdio.h>
Pentru claritatea !i lizibilitatea programelor scrise n C$ ct !i pentru crearea
unei imagini sugesti&e asupra lucrului cu fi!iere$ n fi!ierul e efini%ii stanar
stdio.h s-a efinit un nou nume e tip e at !i anume >Q?A care este o
structur. Pentru a referi un fi!ier$ este necesar o eclara%ie e forma#
>Q?A 0fp;
une fp &a fi numele e at cu care se &a referi fi!ierul n orice opera%ie e intrare
> ie!ire asociat. +at cte&a informa%ii pstrate e structura >Q?A#
< un ientificator e fi!ier pe care sistemul e operare l asociaz flu.ului pe
urata prelucrrii; acesta poate fi aflat cu ajutorul func%iei fileno;
< aresele zonelor tampon asociate; pozi%ia curent n aceste zone;
< inicatorii e sfr!it e fi!ier !i e eroare;
< alte informa%ii.
1@.. Accesul la *i7iere+ desc,idere 7i -nc,idere
)ume
fopen - esc/ie un flu.
0eclara%ie
>Q?A 0fopen(const char 0num, const char 0mod);
0escriere
Kunc%ia fopen esc/ie fi!ierul al crui nume este un !ir inicat e num !i i
asociaz un flu..
Argumentul mod inic un !ir care ncepe cu una in sec&en%ele urmtoare#
r esc/ie un fi!ier pentru citire;
r$ esc/ie pentru citire !i scriere;
w trunc/iaz fi!ierul la lungime zero sau creeaz un fi!ier pentru scriere;
w$ esc/ie pentru augare la sfr!it$ n citire !i scriere; fi!ierul este creat ac
nu e.ist$ altfel este trunc/iat;
a esc/ie pentru augare la sfr!it$ n scriere; fi!ierul este creat ac nu e.ist;
a$ esc/ie pentru augare la sfr!it$ n citire !i scriere; fi!ierul este creat ac
nu e.ist;
33333333333333333333333333333333333333333333
47C
0up esc/iere$ n primele patru cazuri inicatorul pozi%iei n flu. este la
nceputul fi!ierului$ n ultimele ou la sfr!itul acestuia.
airul mod inclue e asemenea litera ' (esc/ie un fi!ier binar, sau t
(esc/ie un fi!ier te.t, fie pe ultima pozi%ie fie pe cea in mijloc.
@pera%iile e citire !i scriere pot alterna n cazul flu.urilor rea > :rite n orice
orine. * re%inem c stanarul A)*+ C cere s e.iste o func%ie e pozi%ionare
ntre o opera%ie e intrare !i una e ie!ire$ sau ntre o opera%ie e ie!ire !i una e
intrare$ cu e.cep%ia cazului cn o opera%ie e citire etecteaz sfr!itul e fi!ier.
Aceast opera%ie poate fi inefecti& < cum ar fi fsee-(flu:, 0?,
MAANUE@X) apelat cu scop e sincronizare.
Jalori returnate
=n caz e succes se returneaz un pointer e tip >Q?A. =n caz e eroare se
returneaz )"11 !i &ariabila global errno inic coul erorii.
)ume
fclose - nc/ie un flu.
0eclara%ie
int fclose( >Q?A 0flu:);
0escriere
Kunc%ia fclose nc/ie fi!ierul asociat flu.ului flu:. 0ac flu: a fost
esc/is pentru ie!ire$ orice ate aflate n zone tampon snt scrise n fi!ier n
prealabil cu un apel fflush.
Jalori returnate
=n caz e succes se returneaz 0. =n caz e eroare se returneaz AW> !i
&ariabila global errno inic coul erorii.
)ume
tmpfile - creeaz un fi!ier temporar
0eclara%ie
>Q?A 0tmpfile();
0escriere
Kunc%ia tmpfile genereaz un nume unic e fi!ier temporar. Acesta este
esc/is n mo binar pentru scriere > citire ("w'$",. Ki!ierul &a fi !ters automat la
nc/iere sau la terminarea programului.
Jaloare returnat
33333333333333333333333333333333333333333333
47F
Kunc%ia returneaz un escriptor e flu. n caz e succes$ sau J@?? ac nu
poate fi generat un nume unic e fi!ier sau ac fi!ierul nu poate fi esc/is. =n caz
e eroare &ariabila global errno inic coul erorii.
)ume
fflush - for%eaz scrierea n flu.
0eclara%ie
int fflush(>Q?A 0flu:);
0escriere
Kunc%ia fflush for%eaz o scriere a tuturor atelor aflate n zone tampon ale
flu.ului flu:. Klu.ul rmne esc/is.
Jalori returnate
=n caz e succes se returneaz 0. =n caz e eroare se returneaz AW> !i
&ariabila global errno inic coul erorii.
)ume
fsee-$ ftell$ rewind - repozi%ioneaz un flu.
0eclara%ie
int fsee-(>Q?A 0flu:, lon8 ofs, int reper);
lon8 ftell(>Q?A 0flu:);
(oid rewind(>Q?A 0flu:);
0escriere
Kunc%ia fsee- seteaz inicatorul e pozi%ie pentru fi!ierul asociat flu.ului
flu:. )oua pozi%ie$ at n octe%i$ se ob%ine aunn ofs octe%i (offset, la pozi%ia
specificat e reper. 0ac reper este MAANUMAR$ MAANUE@X$ sau
MAANUAJF$ ofs este relati& la nceputul fi!ierului$ pozi%ia curent a
inicatorului$ respecti& sfr!itul fi!ierului. Kunc%ia fsee- !terge inicatorul e
sfr!it e fi!ier.
Kunc%ia ftell ob%ine &aloarea curent a inicatorului e pozi%ie pentru
fi!ierul asociat flu.ului flu:.
Kunc%ia rewind pozi%ioneaz inicatorul e pozi%ie pentru fi!ierul asociat
flu.ului flu: la nceputul fi!ierului. Gste ec/i&alent cu#
((oid)fsee-(flu:, 0?, MAANUMAR)
cu completarea c func%ia rewind !terge !i inicatorul e eroare al flu.ului.
Jalori returnate
33333333333333333333333333333333333333333333
447
Kunc%ia rewind nu returneaz nici o &aloare. =n caz e succes$ fsee-
returneaz 0$ !i ftell returneaz offset-ul curent. =n caz e eroare se returneaz
AW> !i &ariabila global errno inic coul erorii.
)ume
fileno < returneaz escriptorul asociat flu.ului
0eclara%ie
int fileno(>Q?A 0flu:);
0escriere
Kunc%ia fileno e.amineaz argumentul flu: !i returneaz escriptorul
asociat e sistemul e operare acestui flu..
1@.%. Citire 7i scriere *r *ormat
)ume
f8ets - cite!te un !ir e caractere intr-un flu. te.t
0eclara%ie
char 0f8ets(char 0s, int si9e, >Q?A 0flu:);
0escriere
Kunc%ia f8ets cite!te cel mult si9e7& caractere in flu: !i le memoreaz
n zona inicat e s. Citirea se opre!te la etectarea sfr!itului e fi!ier sau ne:-
line. 0ac se cite!te caracterul ne:-line acesta este memorat n s. 0up ultimul
caracter se memoreaz null.
Apeluri ale acestei func%ii pot fi combinate cu orice apeluri ale altor func%ii e
intrare in bibliotec (fscanf$ e e.emplu, pentru un acela!i flu. e intrare.
Jalori returnate
Kunc%ia returneaz aresa s n caz e succes$ sau J@?? n caz e eroare sau la
ntlnirea sfr!itului e fi!ier ac nu s-a citit nici un caracter.
)ume
fputs - scrie un !ir e caractere ntr-un flu. te.t
0eclara%ie
int fputs(const char 0s, >Q?A 0flu:);
0escriere
Kunc%ia fputs scrie !irul s n flu. fr caracterul terminator null.
Apeluri ale acestei func%ii pot fi combinate cu orice apeluri ale altor func%ii e
ie!ire in bibliotec (fprintf$ e e.emplu, pentru un acela!i flu. e ie!ire.
33333333333333333333333333333333333333333333
444
Jalori returnate
Kunc%ia returneaz o &aloare non-negati& n caz e succes$ sau AW> n caz e
eroare.
)ume
fread$ fwrite - intrri > ie!iri pentru flu.uri binare
0eclara%ie
unsi8ned fread((oid 0ptr, unsi8ned si9e,
unsi8ned nel, >Q?A 0flu:);
unsi8ned fwrite(const (oid 0ptr, unsi8ned
si9e, unsi8ned nel, >Q?A 0flu:);
0escriere
Kunc%ia fread cite!te nel elemente$ fiecare a&n mrimea si9e octe%i$ in
flu.ul inicat e flu:$ !i le memoreaz n zona inicat e ptr.
Kunc%ia fwrite scrie nel elemente$ fiecare a&n mrimea si9e octe%i$ in
flu.ul inicat e flu:$ pe care le ia in zona inicat e ptr.
Jalori returnate
Kunc%iile returneaz numrul e elemente citite sau scrise cu succes (!i nu
numrul e caractere,. 0ac apare o eroare sau se ntlne!te sfr!itul e fi!ier$
&aloarea returnat este mai mic ect nel (posibil zero,.
1@./. Citire cu *ormat
)ume
scanf$ fscanf$ sscanf - citire cu format
0eclara%ie
int scanf(const char 0fmt, ...);
int fscanf(>Q?A 0flu:, const char 0fmt, ...);
int sscanf(char 0str, const char 0fmt, ...);
0escriere
Kunc%iile in familia ...scanf scaneaz intrarea n concoran% cu !irul e
caractere fmt up cum se escrie mai jos. Acest format poate con%ine
specificatori e con&ersie; rezultatele unor astfel e con&ersii (ac se efectueaz,
se memoreaz prin intermeiul argumentelor pointer. Kunc%ia scanf cite!te !irul
e intrare in flu.ul stanar stdin$ fscanf in flu:$ !i sscanf in !irul
inicat e str.
Kiecare argument pointer trebuie s corespun n orine ca tip cu fiecare
specificator e con&ersie (ar a se &eea suprimarea mai jos,. 0ac argumentele
33333333333333333333333333333333333333333333
44?
nu snt suficiente comportamentul programului este impre&izibil. 'oate
con&ersiile snt introuse e caracterul ". airul format poate con%ine !i alte
caractere. *pa%ii albe (blanc$ tab$ sau ne:-line, in !irul format se potri&esc cu
orice spa%iu alb n orice numr (inclusi& nici unul, in !irul e intrare. @rice alte
caractere trebuie s se potri&easc e.act. *canarea se opre!te atunci cn un
caracter in !irul e intrare nu se potri&e!te cu cel in format. *canarea se opre!te
e asemenea atunci cn o con&ersie nu se mai poate efectua (a se &eea mai jos,.
Con&ersii
0up caracterul " care introuce o con&ersie poate urma un numr e
caractere inicatori$ up cum urmeaz#
0 *uprim atribuirea. Con&ersia care urmeaz se face n mo obi!nuit$ ar nu se
folose!te nici un argument pointer; rezultatul con&ersiei este pur !i simplu
abanonat.
h Con&ersia este e tip d$ i$ o$ u$ : sau n !i argumentul asociat este un pointer
la short (n loc e int,.
l Con&ersia este e tip d$ i$ o$ u$ : sau n !i argumentul asociat este un pointer
la lon8 (n loc e int,$ sau con&ersia este e tip e$ f$ 8 !i argumentul
asociat este un pointer la dou'le (n loc e float,.
? Con&ersia este e tip e$ f$ 8 !i argumentul asociat este un pointer la lon8
dou'le.
=n completare la ace!ti inicatori poate e.ista o mrime w ma.im op%ional
pentru cmp$ e.primat ca un ntreg zecimal$ ntre caracterul " !i cel e con&ersie$
!i naintea inicatorului. 0ac nu este at o mrime ma.im se folose!te
mrimea implicit infinit (cu o e.cep%ie la con&ersia e tip c,; n caz contrar se
scaneaz cel mult un numr e w caractere n timpul con&ersiei. =nainte e a
ncepe o con&ersie$ majoritatea con&ersiilor ignor spa%iile albe; acestea nu snt
contorizate n mrimea cmpului.
*nt isponibile urmtoarele con&ersii#
" Potri&ire cu un caracter ". Cu alte cu&inte$ "" n !irul format trebuie s se
potri&easc cu un caracter ". )u se efectueaz nici o con&ersie !i nici o
atribuire.
d Potri&ire cu un ntreg zecimal (e&entual cu semn,; argumentul asociat trebuie
s fie un pointer la int.
i Potri&ire cu un ntreg (e&entual cu semn,; argumentul asociat trebuie s fie un
pointer la int. Jaloarea ntreag este citit n baza 4E ac ncepe cu 0: sau
33333333333333333333333333333333333333333333
44B
0<$ n baza C ac ncepe cu 0$ !i n baza 47 n caz contrar. *nt folosite
numai caracterele care corespun bazei respecti&e.
o Potri&ire cu un ntreg octal fr semn; argumentul asociat trebuie s fie un
pointer la unsi8ned.
u Potri&ire cu un ntreg zecimal fr semn; argumentul asociat trebuie s fie un
pointer la unsi8ned.
: Potri&ire cu un ntreg /e.azecimal fr semn; argumentul asociat trebuie s fie
un pointer la unsi8ned.
f Potri&ire cu un numr n &irgul mobil (e&entual cu semn,; argumentul
asociat trebuie s fie un pointer la float.
e$8 Gc/i&alent cu f.
s Potri&ire cu o sec&en% e caractere iferite e spa%iu alb; argumentul asociat
trebuie s fie un pointer la char$ !i zona trebuie s fie suficient e mare
pentru a putea primi toat sec&en%a !i caracterul terminator null. airul e
intrare se termin la un spa%iu alb sau la atingerea mrimii ma.ime a cmpului
(prima coni%ie ntlnit,.
c Potri&ire cu o sec&en% e caractere e mrime w (ac aceasta este
specificat; prin lips se ia w=4,; argumentul asociat trebuie s fie un pointer
la char$ !i zona trebuie s fie suficient e mare pentru a putea primi toat
sec&en%a (nu se aaug terminator null,. )u se ignor ca e obicei spa%iile albe
in fa%. Pentru a ignora mai nti spa%iile albe se inic un spa%iu e.plicit n
format.
) Potri&ire cu o sec&en% ne&i e caractere in setul specificat e caractere
acceptate; argumentul asociat trebuie s fie un pointer la char$ !i zona
trebuie s fie suficient e mare pentru a putea primi toat sec&en%a !i
caracterul terminator null. )u se ignor ca e obicei spa%iile albe in fa%.
airul e intrare &a fi format in caractere aflate n (sau care nu se afl n, setul
specificat n format; setul este efinit e caracterele aflate ntre ) !i *. *etul
e.clue acele caractere ac primul caracter up ) este L. Pentru a inclue
caracterul * n set$ acesta trebuie s fie primul caracter up ) sau L;
caracterul * aflat n orice alt pozi%ie nc/ie setul. Caracterul 7 are !i el un
rol special# plasat ntre ou alte caractere aaug toate celelalte caractere
aflate n inter&alul respecti& la set. Pentru a inclue caracterul 7 acesta trebuie
s fie ultimul caracter nainte e *. 0e e.emplu$ "")L*0747*" semnific
setul orice caracter cu excepia *$ 0 pn la 4$ i 7. airul se termin la
33333333333333333333333333333333333333333333
44D
apari%ia unui caracter care nu se afl (sau$ ac se precizeaz L$ care se afl, n
set sau ac se atinge mrimea ma.im specificat.
n )u se prelucreaz nimic in !irul e intrare; n sc/imb$ numrul e caractere
consumate pn la acest punct in !irul e intrare este memorat la argumentul
asociat$ care trebuie s fie un pointer la int.
Jalori returnate
Kunc%iile returneaz numrul e &alori atribuite$ care poate fi mai mic ect
numrul e argumente pointer$ sau c/iar zero$ n cazul n care apar nepotri&iri
ntre format !i !irul e intrare. Sero inic faptul c$ c/iar ac a&em un !ir e
intrare isponibil$ nu s-a efectuat nici o con&ersie (!i atribuire,; aceast situa%ie
apare atunci cn un caracter in !irul e intrare este in&ali$ cum ar fi un caracter
alfabetic pentru o con&ersie "d. Jaloarea AW> este returnat ac apare o eroare
nainte e prima con&ersie$ cum ar fi etectarea sfr!itului e fi!ier. 0ac o eroare
sau un sfr!it e fi!ier apare up ce o con&ersie a nceput$ se returneaz numrul
e con&ersii efectuate cu succes$ !i se pozi%ioneaz bitul corespunztor in
structura >Q?A$ care poate fi testat.
1@.1. 2criere cu *ormat
)ume
printf$ fprintf$ sprintf - scriere cu format
0eclara%ie
int printf(const char 0fmt, ...);
int fprintf(>Q?A 0flu:, const char 0fmt, ...);
int sprintf(char 0str, const char 0fmt, ...);
0escriere
Kunc%iile in familia ...printf genereaz o ie!ire n concoran% cu format up
cum se escrie mai jos. Kunc%ia printf afi!eaz ie!irea la flu.ul stanar
stdout; fprintf scrie ie!irea la flu:; sprintf scrie ie!irea n !irul e
caractere str.
Aceste func%ii genereaz ie!irea sub controlul !irului format care specific
cum se con&ertesc argumentele pentru ie!ire.
airul e formatare
airul fmt este un !ir e caractere$ printre care se pot afla zero sau mai multe
irecti&e# caractere obi!nuite (iferite e ", care snt copiate a!a cum snt n flu.ul
e ie!ire$ !i specifica%ii e con&ersie$ fiecare intre ele rezultn in ncrcarea a
zero sau mai multe argumente. Kiecare specifica%ie e con&ersie este introus e
caracterul " !i se termin cu un specificator e con&ersie. =ntre acestea pot fi (n
33333333333333333333333333333333333333333333
44A
aceast orine, zero sau mai mul%i inicatori$ o mrime minim a cmpului
op%ional$ o precizie op%ional !i un moificator op%ional e lungime.
Argumentele trebuie s corespun n orine ca tip cu specificatorii e
con&ersie. Acestea snt folosite n orinea at$ une fiecare caracter 0 !i fiecare
specificator e con&ersie solicit urmtorul argument. 0ac argumentele nu snt
suficiente comportamentul programului este impre&izibil.
Caractere inicatori
Caracterul " este urmat e zero$ unul sau mai mul%i inicatori#
0 Jaloarea numeric este con&ertit cu zerouri la stnga. Pentru con&ersii e tip
d$ i$ o$ u$ :$ <$ e$ A$ f$ >$ 8 !i Z$ &aloarea con&ertit este completat cu
zerouri la stnga n loc e blanc. 0ac apar inicatorii 0 !i 7 mpreun$
inicatorul 0 este ignorat. 0ac pentru o con&ersie numeric (d$ i$ o$ u$ :$ <,
este at o precizie$ inicatorul 0 este ignorat. Pentru alte con&ersii rezultatul
este neefinit.
7 Jaloarea con&ertit este aliniat la stnga (implicit alinierea se face la
reapta,. Cu e.cep%ia con&ersiilor e tip n$ &aloarea con&ertit este completat
la reapta cu blanc$ n loc s fie completat la stnga cu blanc sau zero. 0ac
apar inicatorii 0 !i 7 mpreun$ inicatorul 0 este ignorat.
)p (spa%iu, =n cazul unui rezultat al unei con&ersii cu semn$ naintea unui numr
poziti& sau !ir &i se pune un blanc.
$ *emnul ($ sau 7, este plasat naintea numrului generat e o con&ersie cu
semn. +mplicit semnul este folosit numai pentru numere negati&e. 0ac apar
inicatorii $ !i )p mpreun$ inicatorul )p este ignorat.
1%imea cmpului
"n !ir e cifre zecimale (cu prima cifr nenul, specific o l%ime minim
pentru cmp. 0ac &aloarea con&ertit are mai pu%ine caractere ect l%imea
specificat$ &a fi completat cu spa%ii la stnga (sau reapta$ ac s-a specificat
aliniere la stnga,. =n locul unui numr zecimal se poate folosi * pentru a specifica
faptul c l%imea cmpului este at e argumentul coresponent$ care trebuie s
fie e tip int. @ &aloare negati& pentru l%ime este consierat un inicator 7
urmat e o &aloare poziti& pentru l%ime. =n nici un caz nu se &a trunc/ia cmpul;
ac rezultatul con&ersiei este mai mare ect l%imea cmpului$ cmpul este
e.panat pentru a con%ine rezultatul con&ersiei.
Precizia
Precizia (op%ional, este at e caracterul . urmat e un !ir e cifre zecimale.
=n locul !irului e cifre zecimale se poate scrie 0 pentru a specifica faptul c
precizia este at e argumentul coresponent$ care trebuie s fie e tip int.
33333333333333333333333333333333333333333333
44E
0ac precizia este at oar e caracterul . sau ac precizia este negati&$ atunci
aceasta se consier zero. Precizia numrul minim e cifre care apar pentru
con&ersii e tip d$ i$ o$ u$ :$ <$ numrul e cifre care apar up punctul zecimal
pentru con&ersii e tip e$ A$ f$ >$ numrul ma.im e cifre semnificati&e pentru
con&ersii e tip 8 !i Z$ sau numrul ma.im e caractere generate pentru con&ersii
e tip s.
0ac se folose!te 0 pentru l%ime sau precizie (sau ambele,$ argumentele se
iau n orine# l%ime$ precizie$ &aloare e scris.
-oificator e lungime
=n acest caz prin con&ersie ntreag n%elegem con&ersie e tip d$ i$ o$ u$ :$ <.
h Con&ersia ntreag care urmeaz corespune unui argument short sau
unsi8ned short$ sau urmtoarea con&ersie e tip n corespune unui
argument e tip pointer la short.
l Con&ersia care urmeaz corespune unui argument e tip#
< lon8 sau unsi8ned lon8$ ac este o con&ersie e tip d$ i$ o$ u$ :$ <
sau n;
< dou'le$ ac este o con&ersie e tip f.
? "rmtoarea con&ersie e tip e$ A$ f$ >$ 8$ Z corespune unui argument lon8
dou'le.
*pecificator e con&ersie
"n caracter care specific tipul con&ersiei care se &a face. *pecificatorii e
con&ersie !i semnifica%ia lor snt#
d$i
Argumentul e tip int este con&ertit la nota%ia zecimal cu semn. Precizia$
ac este at$ numrul minim e cifre care trebuie s apar; ac &aloarea
con&ertit necesit mai pu%ine cifre$ aceasta este completat la stnga cu
zerouri. Precizia implicit este 4. 0ac &aloarea 7 este afi!at cu precizie
e.plicit 7$ ie!irea este &i.
o$u$:$<
Argumentul e tip unsi8ned este con&ertit la nota%ie octal fr semn (o,$
zecimal fr semn (u,$ sau /e.azecimal fr semn (: !i <,. 1iterele
a'cdef se folosesc pentru con&ersii e tip :$ literele =DEFA> pentru
con&ersii e tip <. Precizia$ ac este at$ numrul minim e cifre care
trebuie s apar; ac &aloarea con&ertit necesit mai pu%ine cifre$ aceasta
este completat la stnga cu zerouri. Precizia implicit este 4. 0ac &aloarea 7
este afi!at cu precizie e.plicit 7$ ie!irea este &i.
33333333333333333333333333333333333333333333
446
e$A
Argumentul e tip flotant este rotunjit !i con&ertit n stil I7\d.dddeGdd
une a&em o cifr nainte e punctul zecimal !i numrul e cifre up acesta
este egal cu precizia; ac aceasta lipse!te se consier E; ac precizia este
zero$ punctul zecimal nu apare. @ con&ersie e tip A folose!te litera A (n loc
e e, pentru a introuce e.ponentul. G.ponentul are ntoteauna cel pu%in
ou cifre; ac &aloarea este zero$ e.ponentul este 00.
f$>
Argumentul e tip flotant este rotunjit !i con&ertit n nota%ie zecimal n stil
I7\ddd.ddd$ une numrul e cifre up punctul zecimal este egal cu precizia
specificat. 0ac precizia lipse!te se consier E; ac precizia este e.plicit
zero$ punctul zecimal nu apare. 0ac punctul zecimal apare$ cel pu%in o cifr
apare naintea acestuia.
8$Z
Argumentul e tip flotant este con&ertit n stil f sau e (sau A pentru con&ersii
e tip Z,. Precizia specific numrul e cifre semnificati&e. 0ac precizia
lipse!te se consier E; ac precizia este zero se consier 4. *tilul e este
folosit ac e.ponentul rezultat n urma con&ersiei este mai mic ect D ori
mai mare sau egal cu precizia. Serourile finale snt eliminate in partea
frac%ionar a rezultatului; punctul zecimal apare numai ac este urmat e cel
pu%in o cifr.
c Argumentul e tip int este con&ertit la unsi8ned char !i se scrie
caracterul rezultat.
s Argumentul e tip const char 0 este un pointer la un !ir e caractere.
Caracterele in !ir snt scrise pn la (fr a inclue, caracterul terminator
null; ac precizia este specificat$ nu se scrie un numr mai mare ect cel
specificat. 0ac precizia este at$ nu e ne&oie e caracterul null; ac
precizia nu este specificat$ !irul trebuie s con%in un caracter terminator null.
p Argumentul e tip pointer este scris n /e.azecimal; formatul este specific
sistemului e calcul.
n )umrul e caractere scrise pn n acest moment este memorat la argumentul
e tip int 0. )u se face nici o con&ersie.
" *e scrie un caracter ". )u se face nici o con&ersie. *pecifica%ia complet este
"".
Jaloare returnat
33333333333333333333333333333333333333333333
44C
Kunc%iile returneaz numrul e caractere generate (nu se inclue caracterul
terminator null pentru sprintf,.
1@.;. 4ratarea erorilor
)ume
perror - afi!eaz un mesaj e eroare sistem
0eclara%ie
(oid perror(const char 0s);
#include <errno.h>
const char 0s;sUerrlist)*;
int s;sUnerr;
0escriere
Rutina perror afi!eaz un mesaj la ie!irea stanar e eroare$ care escrie
ultima eroare ntlnit la ultimul apel sistem sau func%ie e bibliotec. -ai nti se
afi!eaz argumentul s$ apoi &irgula !i blanc$ !i n final mesajul e eroare !i ne:-
line. *e recoman (mai ales pentru epanare, ca argumentul s s inclu numele
func%iei n care a aprut eroarea. Coul erorii se ia in &ariabila e.tern errno.
1ista global e erori s;sUerrlist)* ine.at cu errno poate fi folosit
pentru a ob%ine mesajul e eroare fr ne:-line. "ltimul inice e mesaj in list
este s;sUnerr7&. *e recoman o aten%ie eosebit n cazul accesului irect la
list eoarece unele couri noi e eroare pot lipsi in s;sUerrlist)*.
0ac un apel sistem e!ueaz &ariabila errno inic coul erorii. Aceste
&alori pot fi gsite n <errno.h>. Kunc%ia perror ser&e!te la afi!area acestui
co e eroare ntr-o form lizibil. 0ac un apel terminat cu eroare nu este imeiat
urmat e un apel perror$ &aloarea &ariabilei errno se poate piere ac nu e
sal&at.
)ume
clearerr$ feof$ ferror - &erific !i reseteaz starea
flu.ului
0eclara%ie
(oid clearerr(>Q?A 0flu:);
int feof(>Q?A 0flu:);
int ferror(>Q?A 0flu:);
0escriere
Kunc%ia clearerr !terge inicatorii e sfr!it e fi!ier !i eroare ai flu.ului.
33333333333333333333333333333333333333333333
44F
Kunc%ia feof testeaz inicatorul e sfr!it e fi!ier al flu.ului$ !i returneaz
non-zero ac este setat. Acesta este setat ac o opera%ie e citire a etectat
sfr!itul e fi!ier.
Kunc%ia ferror testeaz inicatorul e eroare al flu.ului$ !i returneaz non-
zero ac este setat. Acesta este setat ac o opera%ie e citire sau scriere a
etectat o eroare (atorat e e.emplu /ar:are-ului,.
Kunc%iile e citire (cu sau fr format, nu fac istinc%ie ntre sfr!it e fi!ier !i
eroare$ astfel c trebuie apelate func%iile feof !i ferror pentru a etermina
cauza terminrii.
AtenieH Gste foarte frec&ent folosirea incorect a func%iei feof pentru a
testa ac s-a ajuns la sfr!itul fi!ierului. )u se recoman n nici un caz acest stil
e programare#
#define ?MQX 50
char lin)?MQX*;
>Q?A 0fi,0fo;
fi!fopen(nume-fiier-intrare,"rt");
fo!fopen(nume-fiier-ieire,"wt");
while (%feof(fi)) { DE 're7itH ED
f8ets(lin,?MQX,fi);
fputs(lin,fo);
fclose(fi); fclose(fo);
=n aceast sec&en%$ ac !i ultima linie a fi!ierului te.t e intrare este
terminat cu ne:-line$ aceasta &a fi scris e ou ori n fi!ierul e ie!ire. 0e ceZ
0up ce se cite!te ultima linie nc nu este pozi%ionat inicatorul e sfr!it e
fi!ier$ eci func%ia f8ets nc returneaz succes. 1a reluarea ciclului se ncearc
un nou f8ets !i abia acum se episteaz sfr!itul e fi!ier$ fapt marcat n zona
rezer&at flu.ului fi. Astfel con%inutul !irului lin rmne nemoificat !i este
scris a oua oar n fi!ierul e ie!ire. Abia la o nou reluare a ciclului func%ia
feof ne spune c s-a epistat sfr!itul e fi!ier.
=n acest manual snt prezentate mai multe programe care efectueaz iferite
prelucrri asupra unor fi!iere te.t. Pentru simplitate toate programele presupun c
nu apar erori la citire sau la scriere.
1@.<. 0peraii cu directoare
Kunc%iile e parcurgere a cataloagelor e fi!iere escrise n aceast sec%iune
(opendir$ readdir$ closedir, snt efinite e mai multe meii e
programare C (printre care !i N)" C pentru sistemul e operare 1inu.,$ precum
!i e stanarul P@*+Q. Aceste func%ii snt eclarate n <dirent.h>.
33333333333333333333333333333333333333333333
4?7
Kunc%iile e reenumire !i !tergere a unor fi!iere snt escrise n
<stdio.h>.
)ume
opendir - esc/ie un irector
0eclara%ie
FQX 0opendir(const char 0nume);
0escriere
Kunc%ia opendir esc/ie un flu. pentru irectorul cu numele nume$ !i
returneaz un pointer la flu.ul esc/is. Klu.ul este pozi%ionat pe prima intrare in
irector.
Jaloare returnat
Kunc%ia returneaz un pointer la flu. n caz e succes$ sau )"11 n caz e
eroare !i &ariabila global errno inic coul erorii.
Cte&a erori posibile
A=EEAM Acces interzis
AJWRFQX nume nu este un irector
)ume
readdir - cite!te intr-un irector
0eclara%ie
struct dirent 0readdir(FQX 0dir);
0escriere
Kunc%ia readdir returneaz un pointer la o structur e tip dirent care
reprezint urmtoarea intrare in irectorul inicat e flu.ul dir. Returneaz
)"11 ac s-a epistat sfr!itul e irector sau ac a aprut o eroare.
*tructura e tip dirent con%ine un cmp char dUname)*. "tilizarea altor
cmpuri in structur reuce portabilitatea programelor.
Jaloare returnat
Kunc%ia returneaz un pointer la o structur e tip dirent$ sau )"11 ac s-
a epistat sfr!itul e irector sau ac a aprut o eroare.
)ume
closedir - nc/ie un irector
0eclara%ie
int closedir(FQX 0dir);
33333333333333333333333333333333333333333333
4?4
0escriere
Kunc%ia closedir nc/ie flu.ul dir.
Jaloare returnat
Kunc%ia returneaz 0 n caz e succes sau AW> n caz e eroare.
)ume
rename - reenume!te un fi!ier
remo(e - !terge un fi!ier
0eclara%ie
int rename(const char 0old, const char 0new);
int remo(e(const char 0name);
0escriere
Kunc%ia rename sc/imb numele unui fi!ier in old n new. 0ac a fost
precizat un periferic n new$ acesta trebuie s coinci cu cel in old.
0irectoarele in old !i new pot s fie iferite$ astfel c rename poate fi folosit
pentru a muta un fi!ier intr-un irector n altul. )u se permit specificatori
generici (:ilcars,.
Kunc%ia remo(e !terge fi!ierul specificat prin name.
Jaloare returnat
=n caz e succes se returneaz 0. =n caz e eroare se returneaz AW> !i
&ariabila global errno inic coul erorii.
1@.>. &ro'rame demonstrati#e
Primele trei programe primesc ca parametri n linia e coman numele
fi!ierelor pe care le &or prelucra. "ltimul program prime!te ca parametru n linia
e coman numele irectorului al crui con%inut &a fi afi!at.
4, 0eterminarea mrimii unui fi!ier
#include <stdio.h>
>Q?A 0f;
int main(int ac, char 00a() {
if (ac%!.) {
fputs("@n ar8ument%\n",stderr);
return &;
f ! fopen(a()&*,"r'");
if (%f) {
perror("Aroare la deschidere");
return &;
33333333333333333333333333333333333333333333
4??
fsee-(f,0,MAANUAJF);
fprintf(stderr,">ile "s, si9e "ld\n",ftell(f));
fclose(f);
return 0;
33333333333333333333333333333333333333333333
4?A
11. Alte rutine din biblioteca standard
=n acest capitol snt escrise func%ii care rezol& probleme legate e alocarea
inamic a memoriei$ sortare !i cutare$ clasificare$ opera%ii cu blocuri e
memorie !i !iruri e caractere$ func%ii matematice.
11.1. Alocarea dinamic a memoriei
)ume
calloc$ malloc$ realloc - aloc memoria n mo inamic
free - elibereaz memoria alocat n mo inamic
0eclara%ie
#include <stdli'.h>
(oid 0calloc(unsi8ned nel, unsi8ned si9e);
(oid 0malloc(unsi8ned si9e);
(oid 0realloc((oid 0ptr, unsi8ned si9e);
(oid free((oid 0ptr);
0escriere
Kunc%ia calloc aloc memorie pentru un masi& e nel elemente$ fiecare e
mrime si9e octe%i !i returneaz un pointer la memoria alocat. Con%inutul
memoriei este pus la zero.
Kunc%ia malloc aloc si9e octe%i !i returneaz un pointer la memoria
alocat. Con%inutul memoriei nu este !ters.
Kunc%ia free elibereaz spa%iul e memorie inicat e ptr$ care trebuie s fi
fost returnat e un apel anterior malloc$ calloc sau realloc. =n caz contrar$
sau ac a e.istat eja un apel anterior free(ptr)$ comportamentul
programului este impre&izibil.
Kunc%ia realloc moific mrimea blocului e memorie inicat e ptr la
si9e octe%i. Con%inutul rmne nesc/imbat la mrimea minim intre mrimea
&ec/e !i cea nou; noul spa%iu e memorie care este e&entual alocat este
neini%ializat. 0ac ptr este J@?? apelul este ec/i&alent cu malloc(si9e);
ac si9e este egal cu zero apelul este ec/i&alent cu free(ptr). Cu e.cep%ia
cazului cn ptr este J@??$ acesta trebuie s fi fost returnat e un apel preceent
malloc$ calloc sau realloc.
Jalori returnate
Pentru calloc !i malloc &aloarea returnat este un pointer la memoria
alocat$ aliniat n mo corespunztor pentru orice tip e &ariabile$ sau J@?? ac
nu e.ist suficient memorie continu.
33333333333333333333333333333333333333333333
4?E
Kunc%ia free nu returneaz nimic.
Kunc%ia realloc returneaz un pointer la noua zon e memorie alocat$
aliniat n mo corespunztor pentru orice tip e &ariabile. Jaloarea acestuia
poate fi iferit e ptr$ poate fi J@?? ac nu e.ist suficient memorie
continu sau ac &aloarea si9e este egal cu 0. 0ac realloc e!ueaz$ blocul
original rmne neatins < nu este nici eliberat nici mutat.
11.. 2ortare 7i cutare
)ume
Gsort - sorteaz un masi&
'search - cutare binar ntr-un masi& sortat
0eclara%ie
#include <stdli'.h>
(oid Gsort((oid 0'ase, unsi8ned nel,
unsi8ned si9e, int (0comp)
(const (oid 0, const (oid 0));
(oid 0'search(const (oid 0-e;, const (oid
0'ase, unsi8ned nel, unsi8ned si9e, int
(0comp)(const (oid 0, const (oid 0));
0escriere
Kunc%ia Gsort sorteaz un masi& e nel elemente$ fiecare e mrime si9e.
Argumentul 'ase inic spre nceputul masi&ului.
Glementele masi&ului snt sortate n orine cresctoare n concoran% cu
func%ia e comparare referit e comp$ apelat cu ou argumente care inic
spre obiectele ce se compar. Kunc%ia e comparare trebuie s returneze un ntreg
mai mic ect$ egal cu$ sau mai mare ect zero ac primul argument este
consierat a fi mai mic ect$ egal cu$ respecti& mai mare ect al oilea. 0ac cele
ou elemente comparate snt egale$ orinea n masi&ul sortat este neefinit.
Kunc%ia 'search caut ntr-un masi& e nel elemente$ fiecare e mrime
si9e$ un membru care coincie cu obiectul inicat e -e;. Argumentul 'ase
inic spre nceputul masi&ului.
Con%inutul masi&ului trebuie s fie sortat cresctor n concoran% cu func%ia
e comparare referit e comp$ apelat cu ou argumente care inic spre
obiectele ce se compar. Kunc%ia e comparare se efine!te ca n cazul Gsort.
Primul argument este aresa c/eii$ al oilea este aresa unui element in masi&.
Jaloare returnat
Kunc%ia 'search returneaz un pointer la un membru al masi&ului care
coincie cu obiectul inicat e -e;$ sau J@?? ac nu se gse!te nici un
33333333333333333333333333333333333333333333
4?6
membru. 0ac e.ist mai multe elemente care coinci cu -e;$ poate fi returnat
oricare element cu aceast proprietate.
11.%. !utine de clasi*icare
)ume
isalnum$ isalpha$ isascii$ iscntrl$ isdi8it$
is8raph$ islower$ isprint$ ispunct$ isspace$
isupper$ is:di8it - rutine e clasificare
tolower - con&ersie n liter mic
toupper - con&ersie n liter mare
0eclara%ie
#include <ct;pe.h>
int isalnum(int c);
int isalpha(int c);
int isascii(int c);
int iscntrl(int c);
int isdi8it(int c);
int is8raph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int is:di8it(int c);
int toupper(int c);
int tolower(int c);
0escriere
Primele 4? func%ii &erific ac c$ care trebuie s fie o &aloare e tip
unsi8ned char sau AW>$ se afl n una in clasele e caractere enumerate mai
sus.
isalnum
Jerific ac c este alfanumeric (liter sau cifr,.
isalpha
Jerific ac c este alfabetic (liter mare sau mic,.
isascii
Jerific ac c este o &aloare pe 6 bi%i in setul e caractere A*C++.
iscntrl
33333333333333333333333333333333333333333333
4?C
Jerific ac c este un caracter e control.
isdi8it
Jerific ac c este o cifr (ntre 7 !i F,.
is8raph
Jerific ac c este un caracter afi!abil cu e.cep%ia spa%iului.
islower
Jerific ac c este o liter mic.
isprint
Jerific ac c este un caracter afi!abil inclusi& spa%iu.
ispunct
Jerific ac c este un caracter iferit e spa%iu !i non-alfanumeric.
isspace
Jerific ac c este un spa%iu alb.
isupper
Jerific ac c este o liter mare.
is:di8it
Jerific ac c este o cifr /e.azecimal in setul#
7 4 ? B D A E 6 C F a b c e f A B C 0 G K
tolower
Con&erte!te caracterul c$ ac este o liter$ la litera mic corespunztoare.
toupper
Con&erte!te caracterul c$ ac este o liter$ la litera mare corespunztoare.
Jaloare returnat
Jaloarea returnat e func%iile is... este nenul ac caracterul c se afl n
clasa testat$ !i zero n caz contrar.
Jaloarea returnat e func%iile to... este litera con&ertit ac caracterul c este
o liter$ !i neefinit n caz contrar.
11./. 0peraii cu blocuri de memorie
Pentru majoritatea func%iilor in aceast categorie compilatorul e.paneaz
coul acestora folosin instruc%iuni pe !iruri e caractere. Aceste func%ii snt
eclarate n <strin8.h>
)ume
33333333333333333333333333333333333333333333
4?F
memcp; - copiaz o zon e memorie
0eclara%ie
(oid 0memcp;((oid 0dest, const (oid 0src,
unsi8ned n);
(oid 0memmo(e((oid 0dest, const (oid 0src,
unsi8ned n);
0escriere
Kunc%ia memcp; copiaz n octe%i in zona e memorie src n zona e
memorie dest. Sonele e memorie nu trebuie s se suprapun. 0ac e.ist acest
risc se utilizeaz memmo(e.
Jaloare returnat
Kunc%iile returneaz un pointer la dest.
)ume
memcmp - compar ou zone e memorie
0eclara%ie
int memcmp(const (oid 0s&, const (oid 0s.,
unsi8ned n);
0escriere
Kunc%ia memcmp compar primii n octe%i ai zonelor e memorie s& !i s..
Jaloare returnat
Returneaz un ntreg mai mic ect$ egal cu$ sau mai mare ect zero ac s&
este mai mic ect$ coincie$ respecti& este mai mare ect s..
)ume
memset - umple o zon e memorie cu o constant pe un octet
0eclara%ie
(oid 0memset((oid 0s, int c, unsi8ned n);
0escriere
Kunc%ia memset umple primii n octe%i ai zonei e memorie inicat e s cu
constanta c pe un octet.
Jaloare returnat
Kunc%ia returneaz un pointer la zona e memorie s.
)ume
memchr - caut n memorie un caracter
33333333333333333333333333333333333333333333
4B7
0eclara%ie
(oid 0memchr(const (oid 0s, int c, unsi8ned n);
0escriere
Kunc%ia memchr caut caracterul c n primii n octe%i e memorie inica%i e
s. Cutarea se opre!te la primul octet care are &aloarea c (interpretat ca
unsi8ned char,.
Jaloare returnat
Kunc%ia returneaz un pointer la octetul gsit sau )"11 ac &aloarea nu
e.ist n zona e memorie.
11.1. 0peraii cu 7iruri de caractere
Pentru majoritatea func%iilor in aceast categorie compilatorul e.paneaz
coul acestora folosin instruc%iuni pe !iruri e caractere. Aceste func%ii snt
eclarate n <strin8.h>
)ume
strlen - calculeaz lungimea unui !ir
0eclara%ie
unsi8ned strlen(const char 0s);
0escriere
Kunc%ia strlen calculeaz lungimea !irului s$ fr a inclue caracterul
terminator null.
Jaloare returnat
Kunc%ia returneaz numrul e caractere in s.
)ume
strcp;$ strncp; - copiaz un !ir e caractere
0eclara%ie
char 0strcp;(char 0dest, const char 0src);
char 0strncp;(char 0dest, const char 0src,
unsi8ned n);
0escriere
Kunc%ia strcp; copiaz !irul inicat e src (inclusi& caracterul terminator
null, n zona inicat e dest. airurile nu trebuie s se suprapun$ !i n plus zona
dest trebuie s fie suficient e mare pentru a primi copia.
33333333333333333333333333333333333333333333
4B4
Kunc%ia strncp; este similar$ cu e.cep%ia faptului c nu se copiaz mai
mult e n octe%i in src. Astfel$ ac caracterul terminator null nu se afl n
primii n octe%i in src$ rezultatul nu &a fi terminat cu null. =n cazul n care
lungimea lui src este mai mic ect n$ restul octe%ilor in dest primesc
&aloarea null.
Jaloare returnat
Kunc%iile returneaz un pointer la !irul dest.
)ume
strdup - uplic un !ir
0eclara%ie
char 0strdup(const char 0s);
0escriere
Kunc%ia strdup returneaz un pointer la un nou !ir care este un uplicat al
!irului s. -emoria pentru noul !ir se ob%ine cu malloc$ !i poate fi eliberat cu
free.
Jaloare returnat
Kunc%ia returneaz un pointer la !irul uplicat$ sau )"11 ac nu e.ist
memorie suficient isponibil.
)ume
strcat$ strncat - concateneaz ou !iruri
0eclara%ie
char 0strcat(char 0dest, const char 0src);
char 0strncat(char 0dest, const char 0src,
unsi8ned n);
0escriere
Kunc%ia strcat aaug !irul src la !irul dest suprascriin caracterul null
e la sfr!itul lui dest$ !i la sfr!it aaug un caracter terminator null. airurile nu
trebuie s se suprapun$ !i n plus !irul dest trebuie s aib suficient spa%iu
pentru a pstra rezultatul.
Kunc%ia strncat este similar$ cu e.cep%ia faptului c numai primele n
caractere in src se aaug la dest.
Jaloare returnat
Kunc%iile returneaz un pointer la !irul rezultat dest.
33333333333333333333333333333333333333333333
4B?
)ume
strcmp - compar ou !iruri e caractere
0eclara%ie
int strcmp(const char 0s&, const char 0s.);
0escriere
Kunc%ia strcmp compar cele ou !iruri s& !i s..
Jaloare returnat
Kunc%ia returneaz un ntreg mai mic ect$ egal cu$ sau mai mare ect zero
ac s& este mai mic ect$ coincie$ respecti& este mai mare ect s..
)ume
strchr$ strrchr - localizeaz un caracter
0eclara%ie
char 0strchr(const char 0s, int c);
char 0strrchr(const char 0s, int c);
0escriere
Kunc%ia strchr returneaz un pointer la prima apari%ie a caracterului c n
!irul s.
Kunc%ia strrchr returneaz un pointer la ultima apari%ie a caracterului c n
!irul s.
Jaloare returnat
Kunc%iile returneaz un pointer la caracterul gsit sau )"11 ac &aloarea nu
a fost gsit.
)ume
strstr - localizeaz un sub!ir
0eclara%ie
char 0strstr(const char 0sir, const char 0su's);
0escriere
Kunc%ia strstr gse!te prima apari%ie a sub!irului su's n !irul sir.
Caracterul terminator null nu este luat n consierare.
Jaloare returnat
Kunc%ia returneaz un pointer la nceputul sub!irului$ sau )"11 ac sub!irul
nu este gsit.
33333333333333333333333333333333333333333333
4BB
)ume
strspn$ strcspn - caut un set e caractere ntr-un !ir
0eclara%ie
unsi8ned strspn(const char 0s, const char 0acc);
unsi8ned strcspn(const char 0s, const char 0reH);
0escriere
Kunc%ia strspn etermin lungimea segmentului ini%ial in s format n
ntregime numai cu caractere in acc.
Kunc%ia strcspn etermin lungimea segmentului ini%ial in s format n
ntregime numai cu caractere care nu se gsesc n reH.
Jalori returnate
Kunc%ia strspn returneaz pozi%ia primului caracter in s care nu se afl n
acc.
Kunc%ia strcspn returneaz pozi%ia primului caracter in s care se afl n
reH.
11.;. Biblioteca matematic
4, Kunc%iile in prima categorie snt eclarate n <stdli'.h>
)ume
rand$ srand - generarea numerelor pseuo-aleatoare
0eclara%ie
int rand((oid);
(oid srand(unsi8ned int seed);
0escriere
Kunc%ia rand returneaz un ntreg pseuo-aleator ntre 0 !i X=JFUC=<
(pentru majoritatea meiilor e programare C aceast constant este egal cu
&aloarea ma.im cu semn reprezentabil pe un cu&nt al sistemului e calcul,.
Kunc%ia srand ini%ializeaz generatorul cu &aloarea seed pentru o nou
sec&en% e &alori ntregi pseuo-aleatoare care &or fi returnate e rand. Aceste
sec&en%e se repet ac srand se apeleaz cu aceea!i &aloare seed.
*e obi!nuie!te ca generatorul s fie ini%ializat cu o &aloare at e ceasul
sistemului e calcul$ ca n e.emplul e mai jos#
#include <time.h>
srand(time(J@??));
Jaloare returnat
Kunc%ia rand returneaz o &aloare ntre 0 !i X=JFUC=<.
33333333333333333333333333333333333333333333
4BD
@bser&a%ie
=n lucrarea 2umerical 3ecipes in C4 The *rt of )cientific Computing -
8illiam O Press$ Brian P Klanner2$ *aul A 'euLolsL2$ 8illiam ' Jetterling >
)e: RorL# Cambrige "ni&ersit2 Press$ 4FF7 (4st e$ p ?76,$ se face urmtorul
comentariu#
Dac dorii s generai o valoare aleatoare ntreag ntre . i .5, se
recomand s folosii secvena
H!&$(int)(&0.00rand()+(X=JFUC=<$&.0));
i nu o secven de tipul
H!&$(int)(&000000.00rand())"&0;
care folosete biii de rang inferior.
'ot n fi!ierul <stdli'.h> snt escrise !i urmtoarele func%ii#
int a's(int i); &aloare absolut
lon8 la's(lon8 i); &aloare absolut
int atoi(char 0s); con&ersie in A*C++ n ntreg
lon8 atol(char 0s); con&ersie in A*C++ n ntreg lung
dou'le atof(char 0s); con&ersie in A*C++ n ubl precizie
"rmtoarele func%ii e con&ersie necesit o iscu%ie etaliat#
dou'le strtod(char 0str, char 00end);
con&ersie in A*C++ n ubl precizie
lon8 strtol(char 0str, char 00end, int 'ase);
con&ersie in A*C++ n ntreg lung
unsi8ned lon8 strtoul(char 0str, char 00end, int 'ase);
con&ersie in A*C++ n ntreg lung fr semn
airul e caractere str este con&ertit n reprezentare binar$ ca !i n cazul
func%iilor atoi$ atol$ atof. Pentru con&ersii e tip ntreg se precizeaz !i baza
e numera%ie folosit$ care poate fi ntre ? !i BE. Pentru baze mai mari ect zece
se folosesc litere mici sau mari. =n plus$ ac parametrul end inic o ares
&ali (nu este null,$ la ie!ire prime!te aresa primului caracter in&ali in str$
care nu respect regulile e scriere a unei &alori numerice e tipul a!teptat.
?, Kunc%iile in a oua categorie snt eclarate n <math.h>
dou'le fa's(dou'le :); &aloare absolut
dou'le floor(dou'le :); parte ntreag inferioar
dou'le ceil(dou'le :); parte ntreag superioar
dou'le sGrt(dou'le :);
x
dou'le sin(dou'le :); sin(x,
dou'le cos(dou'le :); cos(x,
dou'le tan(dou'le :); tg(x,
33333333333333333333333333333333333333333333
4BA
dou'le asin(dou'le :); arcsin(x,
dou'le acos(dou'le :); arccos(x,
dou'le atan(dou'le :); arctg(x, n I-/?$/?\
dou'le atan.(dou'le ;, dou'le :);
arctg(y'x, n I<$\
dou'le e:p(dou'le :); e
x
dou'le lo8(dou'le :); ln(x,
dou'le pow(dou'le :, dou'le ;); x
y
dou'le sinh(dou'le :); sin/(x,
dou'le cosh(dou'le :); cos/(x,
dou'le tanh(dou'le :); tg/(x,
dou'le lde:p(dou'le :, int e); x ?
e
dou'le fmod(dou'le :, dou'le ;); x moulo y
Kunc%ia fmod returneaz o &aloare f efinit astfel# x = a y + f
a este o &aloare ntreag (at e x/y, !i 7 _f _ d y; f are semnul lui x.
"rmtoarele ou func%ii returneaz ou &alori# una este &aloarea returnat
e func%ie (e tip dou'le,$ !i cealalt returnat prin intermeiul unui argument
e tip pointer la int respecti& dou'le.
dou'le fre:p(dou'le :, int 0e);
Kunc%ia fre:p esparte &aloarea x n ou pr%i# o parte frac%ionar normalizat
(f I7.A$4,, !i un e.ponent e. 0ac x este 7 atunci f=7 !i e=7. Jaloarea returnat
este f.
dou'le modf(dou'le :, dou'le 0n);
Kunc%ia modf esparte &aloarea x n ou pr%i# o parte frac%ionar subunitar f !i
o parte ntreag n. Jalorile f !i n au acela!i semn ca !i x. Jaloarea returnat este f.
11.<. Auncii pentru timp 7i dat calendaristic
Kunc%iile in aceast categorie$ mpreun cu tipurile !i structurile e ate
folosite$ snt eclarate n <time.h>
Auncia time
0ata !i ora calenaristic se reprezint n format compact printr-o &aloare e
tip timeUt. -ajoritatea meiilor e programare efinesc acest tip ca un sinonim
pentru unsi8ned lon8. Aceast &aloare se ob%ine prin apelul func%iei time.
timeUt time(timeUt 0tims);
33333333333333333333333333333333333333333333
4BE
Kunc%ia returneaz ata !i ora curent n cooronate uni&ersale ("'C,$ care
reprezint numrul e secune e la nceputul erei "ni. (4 ianuarie 4F67$ ora
7#77#77,.
Jaloarea returnat este memorat la aresa inicat e argumentul tims$
ac acesta nu este )"11. 0ac argumentul tims este )"11$ trebuie s
memorm &aloarea returnat.
2tructura tm 5dat calendaristic de*alcat6
Auncia 'mtime
@ &aloare e tip timeIt poate fi efalcat pe componente !i memorat ntr-o
structur#
struct tm {
int tmUsec; >Y secune$ ntre 7 !i AF Y>
int tmUmin; >Y minute$ ntre 7 !i AF Y>
int tmUhour; >Y ore$ ntre 7 !i ?B Y>
int tmUmda;; >Y ziua in lun$ ntre 4 !i B4 Y>
int tmUmon; >Y luna$ ntre 7 !i 44 Y>
int tmU;ear; >Y anul curent minus 4F77 Y>
int tmUwda;; >Y ziua in sptmn$ uminica# 7 Y>
int tmU;da;; >Y ziua in an$ ntre 7 !i BEA Y>
int tmUisdst; >Y op%iunea a2lig/t sa&ing time Y>
;
Observaie. Alegerea numelui tm pentru aceast structur a fost ct se poate
e neinspirat. Programatorii trebuie s fie eosebit e aten%i ca$ atunci cn
folosesc func%ii in aceast categorie$ s nu foloseasc n nici un caz numele tm
pentru efini%ii proprii.
Kunc%ia 8mtime efectueaz aceast efalcare. Aceast func%ie returneaz
aresa unei zone une se afl ata calenaristic efalcat. +nforma%iile in
aceast zon trebuie sal&ate n cazul n care se efectueaz prelucrri ulterioare. "n
apel ulterior al func%iei 8mtime le &a suprascrie$ zona fiin alocat static n
interiorul acesteia.
struct tm 08mtime(const timeUt 0tims);
Auncia mJtime
timeUt m-time(struct tm 0datc);
Aceast func%ie efectueaz con&ersia in&ers$ e la o structur efalcat la o
&aloare compact. Gste suficient s completm &alorile tmU;ear$ tmUmon$
tmUmda;$ tmUhour$ tmUmin$ tmUsec. 0ac o &aloare se afl n afara
33333333333333333333333333333333333333333333
4B6
limitelor permise$ acestea snt automat normalizate. 0e e.emplu$ ora ?A#77#77
este ec/i&alat cu ora 4#77#77 a zilei urmtoare. Kunc%ia corecteaz (ac e
ne&oie, toate &alorile structurii. 0ac ata calenaristic nu poate fi reprezentat
ca o &aloare e tip timeUt$ func!ia returneaz &aloarea (timeUt,(<4,.
Aunciile ctime 7i asctime
char 0ctime(const timeUt 0tims);
char 0asctime(const struct 0datc);
Aceste func%ii con&ertesc ata calenaristic n reprezentare A*C++. Aceste
func%ii returneaz aresa unui !ir e forma#
"Mun \un 02 &0P00P00 .002"
+nforma%iile in aceast zon trebuie sal&ate n cazul n care se efectueaz
prelucrri ulterioare. "n apel ulterior al func%iei le &a suprascrie$ zona fiin
alocat static n interiorul acesteia.
Auncia clocJ
cloc-Ut cloc-((oid);
Kunc%ia cloc- returneaz o apro.imare a timpului pe care procesorul l-a
folosit pentru program pn la momentul apelului. 'ipul cloc-Ut este efinit e
majoritatea meiilor e programare ca un sinonim pentru unsi8ned lon8.
)umrul e secune e la lansarea programului se ob%ine astfel#
(dou'le)cloc-()+E?WENMUVAXUMAEWJF
Constanta E?WENMUVAXUMAEWJF este specific meiului e programare folosit.
0e e.emplu$ biblioteca N)" C Compiler pentru sistemul e operare 1inu.
efine!te &aloarea 4777777. @ consecin% a acestui fapt este c pe un sistem e
calcul pe B? e bi%i func%ia cloc- &a returna aceea!i &aloare la apro.imati&
fiecare 6? e minute.
Observaie. *tanarul C nu impune ca aceast cronometrare s nceap e la
zero la lansarea programului. 0e aceea$ pentru a garanta un ma.im e
portabilitate$ cronometrarea se face astfel#
main() {
dou'le stm;
stm ! cloc-();
. . .
printf("RimeP".,lf\n",(cloc-()7stm)+
E?WENMUVAXUMAEWJF);
33333333333333333333333333333333333333333333
4DB
Biblio'ra*ie 5inclusi# manuale electronice6
Pentru o escriere etaliat a limbajului C recomanm#
Brian 8 9ernig/am$ 0ennis - Ritc/ie - The C "rogramming %anguage
Prentice-Oall *oft:are *eries$ 4FCC
/ttp#>>freebooLs.b2.ru>CanCpp./tml
Oerbert *c/ilt - 6anual C complet
Gitura 'eora$ 4FFC
Brian Bro:n - C "rogramming
/ttp#>>:::..ploiter.com>mirrors>cprogram>cstart./tm
*te&e *ummit - (ntroductory C "rogramming Class 2otes
/ttp#>>:::.esLimo.com>Hscs>cclass>cclass./tml
*te&e *ummit - (ntermediate C "rogramming Class 2otes
/ttp#>>:::.esLimo.com>Hscs>cclass>cclass./tml
33333333333333333333333333333333333333333333
4DD
Cuprins
4. Neneralit%i asupra limbajului C. . . . . . . . . . . . . . . . . . . . D
4.4. +ntroucere. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D
4.?. Reprezentarea &alorilor numerice . . . . . . . . . . . . . . . . . . . . . . A
4.B. Primele programe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E
?. "nit%ile le.icale ale limbajului C . . . . . . . . . . . . . . . . . . 4D
?.4. +entificatori; cu&inte c/eie . . . . . . . . . . . . . . . . . . . . . . . . . . 4D
?.?. Constante. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4A
?.B. airuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
?.D. @peratori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4C
?.A. *eparatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4C
B. Jariabile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?7
B.4. Clase e memorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?4
B.?. 'ipuri funamentale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?B
B.B. @biecte !i &alori-stnga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?E
B.D. Con&ersii e tip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?6
B.A. -asi&e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B7
B.E. +ni%ializri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B7
B.6. Calificatorul const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B?
D. @peratori !i e.presii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BB
D.4. G.presii primare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BB
D.?. @peratori unari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BA
D.B. @peratori aritmetici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B6
D.D. @peratori e comparare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BC
D.A. @peratori logici pe bi%i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BF
D.E. @peratori pentru e.presii logice . . . . . . . . . . . . . . . . . . . . . . . D4
D.6. @peratorul coni%ional. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D?
D.C. @peratori e atribuire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DB
D.F. @peratorul &irgul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DD
D.47. Preceen%a !i orinea e e&aluare . . . . . . . . . . . . . . . . . . . . . DD
A. +nstruc%iuni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DE
A.4. +nstruc%iunea expresie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DE
A.?. +nstruc%iunea compus sau blocul . . . . . . . . . . . . . . . . . . . . . . DE
A.B. +nstruc%iunea if. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D6
A.D. +nstruc%iunile while !i do. . . . . . . . . . . . . . . . . . . . . . . . . . . DF
A.A. +nstruc%iunea for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DF
A.E. +nstruc%iunea switch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A4
A.6. +nstruc%iunile 'rea- !i continue. . . . . . . . . . . . . . . . . . . . AB
A.C. +nstruc%iunea return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AA
A.F. +nstruc%iunea &i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AA
33333333333333333333333333333333333333333333
4DA
E. Kunc%ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A6
E.4. 0efini%ia func%iilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A6
E.?. Apelul func%iilor; func%ii recursi&e . . . . . . .. . . . . . . . . . . . . . . AF
E.B. Re&enirea in func%ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E4
E.D. Argumentele func%iei !i transmiterea parametrilor . . . . . . . . . E?
E.A. G.emple e func%ii !i programe. . . . . . . . . . . . . . . . . . . . . . . . EB
6. 0ez&oltarea programelor mari . . . . . . . . . . . . . . . . . . . . . E6
6.l. =nlocuirea simbolurilor$ substitu%ii macro . . . . . . . . . . . . . . . . E6
6.?. +ncluerea fi!ierelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EC
6.B. Compilarea coni%ionat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.D. G.emple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
C. Pointeri !i masi&e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6E
C.4. Pointeri !i arese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6E
C.? Pointeri !i argumente e func%ii . . . . . . . . . . . . . . . . . . . . . . . . 6C
C.B. Pointeri !i masi&e. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6F
C.D. Aritmetica e arese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C4
C.A. Pointeri la caracter !i func%ii . . . . . . . . . . . . . . . . . . . . . . . . . . CB
C.E. -asi&e multiimensionale . . . . . . . . . . . . . . . . . . . . . . . . . . . CD
C.6. -asi&e e pointeri !i pointeri la pointeri . . . . . . . . . . . . . . . . C6
C.C. +ni%ializarea masi&elor !i masi&elor e pointeri . . . . . . . . . . . F4
C.F. -asi&e e pointeri !i masi&e multiimensionale . . . . . . . . . . FD
C.47. Argumentele unei linii e coman . . . . . . . . . . . . . . . . . . . FC
C.44. Pointeri la func%ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47?
F. *tructuri !i reuniuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47E
F.4. Glemente e baz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47E
F.?. t;pedef. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47F
F.B. -asi&e e structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
F.D. Pointeri la structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44A
F.A. *tructuri auto-referite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
F.E. Arbori binari e cutare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4?B
F.6. Cmpuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4?6
F.C. Reuniuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4?F
47. +ntrri > ie!iri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4BB
47.4. +ntrri !i ie!iri stanar; fi!iere . . . . . . . . . . . . . . . . . . . . . . . 4BB
47.?. Accesul la fi!iere; esc/iere !i nc/iere. . . . . . . . . . . . . . . 4BA
47.B. Citire !i scriere fr format . . . . . . . . . . . . . . . . . . . . . . . . . . 4BC
47.D. Citire cu format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4D7
47.A. *criere cu format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4DB
47.E. 'ratarea erorilor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4DC
47.6. @pera%ii cu irectoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4A7
47.C. Programe emonstrati&e . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4A?
33333333333333333333333333333333333333333333
4DE
44. Alte rutine in biblioteca stanar . . . . . . . . . . . . . . . . . 4AE
44.4. Alocarea inamic a memoriei . . . . . . . . . . . . . . . . . . . . . . . 4AE
44.?. *ortare !i cutare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4A6
44.B. Rutine e clasificare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4AC
44.D. @pera%ii cu blocuri e memorie. . . . . . . . . . . . . . . . . . . . . . . 4E7
44.A. @pera%ii cu !iruri e caractere . . . . . . . . . . . . . . . . . . . . . . . . 4E?
44.E. Biblioteca matematic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4EE
44.6. Kunc%ii pentru timp !i at calenaristic . . . . . . . . . . . . . . . 4EC
44.C. G.ecutarea unei comenzi sistem . . . . . . . . . . . . . . . . . . . . . . 464
44.F. Programe emonstrati&e . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46?
Bibliografie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
33333333333333333333333333333333333333333333
4D6