Documente Academic
Documente Profesional
Documente Cultură
Informatica Limbaj C
Informatica Limbaj C
Roger Bacon
Acest manual este structurat astfel nct elementele limbajului C s fie
prezentate ntr-o manier unitar. Primul capitol face o scurt introducere i
prezint ase programe C.
Urmtoarele cinci capitole descriu elementele primare ale limbajului C:
tipurile fundamentale de date, definiii de constante i variabile, instruciuni,
funcii. Capitolul apte descrie strategii de organizare a activitii de
programare pentru elaborarea programelor mari, compuse din mai multe
module. Tot n acest capitol snt prezentate i directivele de compilare cele
mai folosite. Capitolele opt i nou descriu elemente avansate ale limbajului
C: pointeri i structuri.
Capitolele zece i unsprezece trec n revist funciile cele mai des
utilizate definite n biblioteca standard, mpreun cu cteva programe
demonstrative. Am selectat doar funciile definite de mai multe standarde (n
primul rnd ANSI C), pentru a garanta o portabilitate ct mai mare.
Acest manual a fost conceput pentru a servi ca document care s poat
fi consultat de programatori n elaborarea proiectelor, i nu pentru a fi
memorat. Manualul nu este o prezentare exhaustiv a limbajului C; am
selectat strictul necesar care s permit unui programator s elaboreze
programe eficiente i uor de ntreinut.
Deoarece avem convingerea c cea mai bun explicaie este un program
funcional, exemplele din acest manual pot fi rulate pe orice mediu de
programare C i sub orice sistem de operare.
Ca o ultim observaie amintim recomandarea fcut de nii creatorii
limbajului: cea mai bun metod de nvare este practica.
Dac constructorii ar fi construit cldiri aa cum scriu programatorii
programe, atunci prima ciocnitoare care ar fi venit ar fi distrus civilizaia
(din Legile lui Murphy)
___________________________________________________________________________________________________________________________
http://www.cs.umass.edu/~verts/cs32/endian.html
O valoare real nenul se reprezint normalizat n virgul
mobil, descompus n dou elemente: o parte subunitar n
intervalul [0.5,1) i o putere a bazei doi. Pentru semn se folosete o
poziie distinct (0 pozitiv, 1 negativ).
Exemplu: 4.625 100.101(2) 0.100101(2) 23
Numrul de poziii rezervate pentru partea fracionar, respectiv
pentru exponent depind de precizia aleas, care poate fi simpl, dubl
sau extins.
return s/n;
}
int main() {
int i;
scanf("%d",&n);
for (i=0; i<n; i++)
scanf("%lf",&a[i]);
printf("%.3lf\n",produs());
return 0;
}
10
printf("%hd\n",k);
a = 60.1; k = a * 100;
printf("%hd\n",k);
a = 12345679; b = 12345678;
c = a * a b * b;
u = a * a; v = b * b; w = u - v;
printf("%f %f\n",c,w);
if (c==w) return 0;
else return 1;
}
11
12
___________________________________________________________________________________________________________________________
13
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
___________________________________________________________________________________________________________________________
14
2.2. Constante
n limbajul C exist urmtoarele tipuri de constante: ntreg
(zecimal, octal, hexazecimal), ntreg lung explicit, flotant, caracter,
simbolic.
Constante ntregi
O constant ntreag const dintr-o succesiune de cifre.
O constant octal este o constant ntreag care ncepe cu 0
(cifra zero), i este format cu cifre de la 0 la 7.
O constant hexazecimal este o constant ntreag precedat de
0x sau 0X (cifra 0 i litera x). Cifrele hexazecimale includ literele de
la A la F i de la a la f cu valori de la 10 la 15.
n orice alt caz, constanta ntreag este o constant zecimal.
Exemplu: constanta zecimal 31 poate fi scris ca 037 n octal i
0x1f sau 0X1F n hexazecimal.
O constant ntreag este generat pe un cuvnt (doi sau patru
octei, dac sistemul de calcul este pe 16 sau 32 de bii).
O constant zecimal a crei valoare depete pe cel mai mare
ntreg cu semn reprezentabil pe un cuvnt scurt (16 bii) se consider
de tip long i este generat pe 4 octei.
O constant octal sau hexazecimal care depete pe cel mai
mare ntreg fr semn reprezentabil pe un cuvnt scurt se consider
de asemenea de tip long.
O constant ntreag devine negativ dac i se aplic operatorul
unar de negativare -.
___________________________________________________________________________________________________________________________
15
Constante flotante
O constant flotant const dintr-o parte ntreag, un punct
zecimal, o parte fracionar, litera e sau E, i opional un exponent
care este un ntreg cu semn. Partea ntreag i partea fracionar snt
constituite din cte o succesiune de cifre. ntr-o constant flotant, att
partea ntreag ct i partea fracionar pot lipsi, dar nu ambele; de
asemenea poate lipsi punctul zecimal sau litera e i exponentul, dar
nu deodat (i punctul i litera e i exponentul).
Exemplu: 123.456e7 sau 0.12e3
Orice constant flotant se consider a fi n precizie extins.
Constante caracter
O constant caracter const dintr-un singur caracter scris ntre
apostrofuri, de exemplu 'x'. Valoarea unei constante caracter este
valoarea numeric a caracterului, n setul de caractere al
calculatorului. De exemplu n setul de caractere ASCII caracterul
zero sau '0' are valoarea 48 n zecimal, total diferit de valoarea
numeric zero.
Constantele caracter particip la operaiile aritmetice ca i oricare
alte numere. De exemplu, dac variabila c conine valoarea ASCII a
unei cifre, atunci prin instruciunea:
c = c - '0' ;
aceast valoare se transform n valoarea efectiv a cifrei.
Anumite caractere negrafice i caractere grafice ' (apostrof) i \
(backslash) pot fi reprezentate ca i constante caracter cu ajutorul
unor secvene de evitare. Acestea ofer de altfel i un mecanism
general pentru reprezentarea caracterelor mai dificil de introdus n
calculator i a oricror configuraii de bii. Aceste secvene de evitare
snt:
___________________________________________________________________________________________________________________________
16
\n new-line
\r carriage return
\\ backslash
\t tab orizontal
\f form feed
\' apostrof
\b backspace
\a semnal sonor
\" ghilimele
\ooo configuraie de bii precizat n baza 8
\xhh configuraie de bii precizat n baza 16
Fiecare din aceste secvene, dei e format din mai multe
caractere, reprezint n realitate un singur caracter.
Exemplu: secvena '\040' va genera caracterul spaiu.
Constante simbolice
O constant simbolic este un identificator cu valoare de
constant. Valoarea constantei poate fi orice ir de caractere introdus
prin construcia #define (capitolul apte).
Exemplu: #define MAX 1000
Dup ntlnirea acestei construcii compilatorul va nlocui toate
apariiile constantei simbolice MAX cu valoarea 1000.
Numele constantelor simbolice se scriu de obicei cu litere mari
(fr a fi obligatoriu).
2.3. iruri
Un ir este o succesiune de caractere scrise ntre ghilimele, de
exemplu "ABCD".
Ghilimelele nu fac parte din ir; ele servesc numai pentru
delimitarea irului. Caracterul " (ghilimele) poate aprea ntr-un ir
dac se utilizeaz secvena de evitare \". n interiorul unui ir pot fi
folosite i alte secvene de evitare pentru constante caracter, de
asemenea poate fi folosit caracterul \ (backslash) la sfritul unui
rnd pentru a da posibilitatea continurii unui ir pe mai multe linii,
situaie n care caracterul \ nsui va fi ignorat.
Pentru irul de caractere se mai folosete denumirea constant ir
sau constant de tip ir.
Cnd un ir apare ntr-un program C, compilatorul creeaz un
masiv de caractere care conine caracterele irului i plaseaz
___________________________________________________________________________________________________________________________
17
2.4. Operatori
Limbajul C prezint un numr mare de operatori care pot fi
clasificai dup diverse criterii. Exist operatori unari, binari i
ternari, operatori aritmetici, logici, operatori pe bii etc. Capitolul
patru este rezervat n exclusivitate descrierii operatorilor definii n
limbajul C.
2.5. Separatori
Un separator este un caracter sau un ir de caractere care separ
unitile lexicale ntr-un program scris n C.
___________________________________________________________________________________________________________________________
18
___________________________________________________________________________________________________________________________
19
3. Variabile
Ca i constantele, variabilele snt elemente de baz cu care
opereaz un program scris n C. O variabil este un obiect de
programare cruia i se atribuie un nume i i se asociaz o zon de
memorie.
Variabilele se deosebesc dup nume i pot primi diferite valori.
Numele variabilelor snt identificatori. Numele de variabile se scriu
de obicei cu litere mici (fr a fi obligatoriu).
n limbajul C, variabilele snt caracterizate prin dou atribute:
clas de memorie i tip. Acestea i snt atribuite unei variabile prin
intermediul unei declaraii. Declaraiile enumer variabilele care
urmeaz a fi folosite, stabilesc clasa de memorie, tipul variabilelor i
eventual valorile iniiale. Sintaxa unei declaraii este:
clas tip list-variabile;
Lista de variabile poate avea un element sau mai multe, n al
doilea caz ele fiind separate prin virgul.
Clasa de memorie precizeaz care funcii pot vedea variabilele
declarate n cadrul unui modul:
doar funcia / blocul unde acestea snt definite: variabile automatice
i variabile statice interne;
toate funciile din cadrul modulului care urmeaz declaraiei:
variabile globale statice;
toate funciile din toate modulele care cunosc declaraia: variabile
globale externe.
Clasa de memorie precizeaz n plus i durata de via a
variabilelor declarate. Variabilele automatice exist doar pe durata
execuiei funciei sau blocului unde au fost definite. Variabilele
statice i externe exist pe toat durata execuiei programului.
Tipul unei variabile precizeaz domeniul de valori pe care le
poate lua i operaiile care se pot efectua cu aceste valori.
Declaraiile se folosesc pentru a specifica interpretarea pe care
compilatorul trebuie s o dea fiecrui identificator, i pot aprea n
___________________________________________________________________________________________________________________________
20
Variabile automatice
Variabilele automatice snt variabile locale fiecrui bloc sau
funcii. Ele se declar prin specificatorul de clas de memorie auto
sau implicit prin context. O variabil care apare n corpul unei funcii
sau al unui bloc pentru care nu s-a fcut nici o declaraie de clas de
memorie se consider implicit de clas auto.
O variabil auto este actualizat la fiecare intrare n bloc i se
distruge n momentul cnd controlul a prsit blocul. Ele nu i rein
valorile de la un apel la altul al funciei sau blocului i trebuie
iniializate la fiecare intrare. Dac nu snt iniializate, conin valori
reziduale. Nici o funcie nu are acces la variabilele auto din alt
funcie. n funcii diferite pot exista variabile locale cu aceleai nume,
fr ca variabilele s aib vreo legtur ntre ele.
Exemple. n fiecare program din primul capitol, variabilele locale
snt automatice.
Variabile registru
O variabil registru se declar prin specificatorul de clas de
memorie register. Ca i variabilele auto ele snt locale unui
bloc sau funcii i valorile lor se pierd la ieirea din blocul sau funcia
respectiv. Variabilele declarate register indic compilatorului c
___________________________________________________________________________________________________________________________
21
Variabile statice
Variabilele statice se declar prin specificatorul de clas de
memorie static. Aceste variabile snt la rndul lor de dou feluri:
interne i externe.
Variabilele statice interne snt locale unei funcii i se definesc n
interiorul unei funcii; spre deosebire de variabilele auto, ele i
pstreaz valorile tot timpul execuiei programului. Variabilele statice
interne nu snt create i distruse de fiecare dat cnd funcia este
activat sau prsit; ele ofer n cadrul unei funcii o memorie
particular permanent pentru funcia respectiv.
Alte funcii nu au acces la variabilele statice interne proprii unei
funcii.
Ele pot fi declarate i implicit prin context; de exemplu irurile
de caractere care apar n interiorul unei funcii cum ar fi
argumentele funciei printf snt variabile statice interne.
Variabilele statice externe se definesc n afara oricrei funcii i
orice funcie are acces la ele. Aceste variabile snt ns globale numai
pentru fiierul surs n care ele au fost definite. Nu snt recunoscute
n alte fiiere.
___________________________________________________________________________________________________________________________
22
Variabile externe
Variabilele externe snt variabile cu caracter global. Ele se
definesc n afara oricrei funcii i pot fi apelate prin nume din
oricare modul (fiier surs) care intr n alctuirea programului.
n declaraia de definiie aceste variabile nu necesit specificarea
nici unei clase de memorie. La ntlnirea unei definiii de variabil
extern compilatorul aloc i memorie pentru aceast variabil.
ntr-un fiier surs domeniul de definiie i aciune al unei
variabile externe este de la locul de declaraie pn la sfritul
fiierului. Aceste variabile exist i i pstreaz valorile de-a lungul
execuiei ntregului program.
Pentru ca o funcie s poat utiliza o variabil extern, numele
variabilei trebuie fcut cunoscut funciei printr-o declaraie.
Detalii despre utilizarea variabilelor externe vor fi date n
capitolul apte.
23
Tipul caracter
O variabil de tip caracter se declar prin specificatorul de tip
char. Zona de memorie alocat unei variabile de tip char este de
un octet. Ea este suficient de mare pentru a putea memora orice
caracter al setului de caractere implementate pe calculator.
Dac un caracter din setul de caractere este memorat ntr-o
variabil de tip char, atunci valoarea sa este egal cu codul ntreg al
caracterului respectiv. i alte cantiti pot fi memorate n variabile de
tip char, dar implementarea este dependent de sistemul de calcul.
Domeniul valorilor variabilelor caracter este ntre -128 i 127.
Caracterele setului ASCII snt toate pozitive, dar o constant caracter
specificat printr-o secven de evitare poate fi i negativ, de
exemplu '\377' are valoarea -1. Acest lucru se ntmpl atunci
cnd aceast constant apare ntr-o expresie, moment n care se
convertete la tipul int prin extensia bitului cel mai din stnga din
octet (datorit modului de funcionare a instruciunilor
calculatorului).
Domeniul valorilor variabilelor caracter fr semn (unsigned
char) este ntre 0 i 255.
Descriptori de format:
%c pentru o variabil sau o valoare de tip char;
%s pentru o variabil sau o expresie de tip ir de caractere.
Tipul ntreg
Variabilele ntregi pozitive sau negative pot fi declarate prin
specificatorul de tip int. Zona de memorie alocat unei variabile
ntregi poate fi de cel mult trei dimensiuni.
Relaii despre dimensiune snt furnizate de calificatorii short,
long i unsigned, care pot fi aplicai tipului int.
Calificatorul short se refer totdeauna la numrul minim de
octei pe care se reprezint un ntreg, de obicei 2.
Calificatorul long se refer la numrul maxim de octei pe care
poate fi reprezentat un ntreg, de obicei 4.
___________________________________________________________________________________________________________________________
24
25
Descriptori de format:
%f pentru o variabil sau o valoare de tip float;
%lf pentru o variabil sau o valoare de tip double;
%Lf pentru o variabil sau o valoare de tip long double.
Tipuri derivate
n afar de tipurile aritmetice fundamentale, exist, n principiu, o
clas infinit de tipuri derivate, construite din tipurile fundamentale
n urmtoarele moduri:
masive de T pentru masive de obiecte de un tip dat T, unde T este
unul dintre tipurile admise;
funcii care returneaz T pentru funcii care returneaz obiecte de
un tip dat T;
pointer la T pentru pointeri la obiecte de un tip dat T;
structuri pentru un ir de obiecte de tipuri diferite;
reuniuni care pot conine obiecte de tipuri diferite, tratate ntr-o
singur zon de memorie.
n general aceste metode de construire de noi tipuri de obiecte
pot fi aplicate recursiv. Tipurile derivate vor fi detaliate n capitolele
opt i nou.
26
Caractere i ntregi
Un caracter poate aprea oriunde unde un ntreg este admis. n
toate cazurile valoarea caracterului este convertit automat ntr-un
ntreg. Deci ntr-o expresie aritmetic tipul char i int pot aprea
mpreun. Aceasta permite o flexibilitate considerabil n anumite
tipuri de transformri de caractere. Un astfel de exemplu este funcia
atoi descris n capitolul ase care convertete un ir de cifre n
echivalentul lor numeric.
Expresia urmtoare produce valoarea numeric a caracterului
(cifr) memorat n ASCII:
s[i] - '0'
Atragem atenia c atunci cnd o variabil de tip char este
convertit la tipul int, se poate produce un ntreg negativ, dac bitul
___________________________________________________________________________________________________________________________
27
Conversii flotante
Toate operaiile aritmetice n virgul mobil se execut n
precizie extins. Conversia de la virgul mobil la ntreg se face prin
trunchierea prii fracionare. Conversia de la ntreg la virgul mobil
este acceptat.
ntregi fr semn
ntr-o expresie n care apar doi operanzi, dintre care unul
unsigned iar cellalt un ntreg de orice alt tip, ntregul cu semn
este convertit n ntreg fr semn i rezultatul este un ntreg fr
semn.
Cnd un int trece n unsigned, valoarea sa este cel mai mic
ntreg fr semn congruent cu ntregul cu semn (modulo 2 16 sau 232).
ntr-o reprezentare la complementul fa de 2, conversia este
conceptual, nu exist nici o schimbare real a configuraiei de bii.
Cnd un ntreg fr semn este convertit la long, valoarea
rezultatului este numeric aceeai ca i a ntregului fr semn, astfel
conversia nu face altceva dect s adauge zerouri la stnga.
Conversii aritmetice
Dac un operator aritmetic binar are doi operanzi de tipuri
diferite, atunci tipul de nivel mai sczut este convertit la tipul de
___________________________________________________________________________________________________________________________
28
Conversii logice
Expresiile relaionale de forma i<j i expresiile logice legate
prin operatorii && i || snt definite ca avnd valoarea 1 dac snt
adevrate i 0 dac snt false.
Astfel atribuirea:
d = (c>='0') && (c<='9');
l face pe d egal cu 1 dac c este cifr i egal cu 0 n caz contrar.
Conversii explicite
Dac conversiile de pn aici le-am putea considera implicite,
exist i conversii explicite de tipuri pentru orice expresie. Aceste
conversii se fac prin construcia special numit cast de forma:
(nume-tip) expresie
n aceast construcie expresie este convertit la tipul specificat
dup regulile precizate mai sus. Mai precis aceasta este echivalent
cu atribuirea expresiei respective unei variabile de un tip specificat, i
aceast nou variabil este apoi folosit n locul ntregii expresii. De
exemplu, n expresia:
sqrt((double)n)
se convertete n la double nainte de a se transmite funciei sqrt.
Variabila n nu-i modific valoarea.
___________________________________________________________________________________________________________________________
29
Expresia constant
O expresie constant este o expresie care conine numai
constante. Aceste expresii snt evaluate n momentul compilrii i nu
n timpul execuiei; ele pot fi astfel utilizate n orice loc unde sintaxa
cere o constant, ca de exemplu:
#define NMAX 1000
char lin[NMAX+1];
3.5. Masive
n limbajul C se pot defini masive unidimensionale,
bidimensionale, tridimensionale etc. Un masiv se compune din mai
multe elemente de acelai tip; un element se identific prin indice
(poziia relativ n masiv), sau prin indici (dac masivul este
multidimensional).
Exemple:
char s[100];
int a[10][15];
3.6. Iniializri
ntr-o declaraie se poate specifica o valoare iniial pentru
identificatorul care se declar. Iniializatorul este precedat de semnul
= i const dintr-o expresie (variabile simple) sau o list de valori
incluse n acolade (masive sau structuri).
Toate expresiile dintr-un iniializator pentru variabile statice sau
externe trebuie s fie expresii constante sau expresii care se reduc la
adresa unei variabile declarate anterior. Variabilele de clas auto sau
register pot fi iniializate cu expresii oarecare, nu neaprat
expresii constante, care implic constante sau variabile declarate
anterior sau chiar funcii.
___________________________________________________________________________________________________________________________
30
31
___________________________________________________________________________________________________________________________
32
4. Operatori i expresii
Limbajul C prezint un numr mare de operatori, caracterizai
prin diferite nivele de prioritate sau preceden.
n acest capitol descriem operatorii n ordinea descresctoare a
precedenei lor. Vom preciza de fiecare dat dac asociativitatea este
la stnga sau la dreapta.
Expresiile combin variabile i constante pentru a produce valori
noi i le vom introduce pe msur ce vom prezena operatorii.
identificator
Un identificator este o expresie-primar, cu condiia c el s fi
fost declarat corespunztor. Tipul su este specificat n declaraia sa.
Dac tipul unui identificator este masiv de T, atunci valoarea
expresiei-identificator este un pointer la primul obiect al masivului,
iar tipul expresiei este pointer la T. Mai mult, un identificator de
masiv nu este o expresie valoare-stnga (detalii n capitolul opt).
La fel, un identificator declarat de tip funcie care returneaz T,
care nu apare pe poziie de apel de funcie este convertit la pointer la
funcie care returneaz T (detalii n capitolul opt).
ir
Un ir este o expresie-primar. Tipul su original este masiv de
caractere, dar urmnd aceleai reguli descrise mai sus pentru
identificatori, acesta este modificat n pointer la caracter i rezultatul
este un pointer la primul caracter al irului.
___________________________________________________________________________________________________________________________
33
(expresie)
O expresie ntre paranteze rotunde este o expresie-primar, al
crei tip i valoare snt identice cu cele ale expresiei din interiorul
parantezelor (expresia din paranteze poate fi i o valoare-stnga).
expresie-primar[expresie-indice]
O expresie-primar urmat de o expresie ntre paranteze ptrate
este o expresie-primar. Sensul intuitiv este de indexare. De obicei
expresia-primar are tipul pointer la T, expresia-indice are tipul
int, iar rezultatul are tipul T. O expresie de forma E1[E2] este
identic (prin definiie) cu *((E1)+(E2)), unde * este operatorul
de indirectare (detalii n capitolul opt).
expresie-primar(list-expresii)
Un apel de funcie este o expresie-primar. Ea const dintr-o
expresie-primar urmat de o pereche de paranteze rotunde, care
conin o list-expresii separate prin virgule. Lista-expresii constituie
argumentele reale ale funciei; aceast list poate fi i vid. Expresiaprimar trebuie s fie de tipul funcie care returneaz T, iar rezultatul
apelului de funcie va fi de tipul T (detalii n capitolul ase).
naintea apelului, oricare argument de tip float este convertit la
tipul double, oricare argument de tip char sau short este
convertit la tipul int. Numele de masive snt convertite n pointeri la
nceputul masivului. Nici o alt conversie nu se efectueaz automat.
Dac este necesar ca tipul unui argument actual s coincid cu cel
al argumentului formal, se va folosi un cast.
Snt permise apeluri recursive la orice funcie.
Despre definirea i apelul funciilor, detalii n capitolul ase.
valoare-stnga . identificator
O valoare-stnga urmat de un punct i un identificator este o
expresie-primar. Valoarea-stnga denumete o structur sau o
reuniune (capitolul nou) iar identificatorul denumete un membru
din structur sau reuniune. Rezultatul este o valoare-stnga care se
refer la membrul denumit din structur sau reuniune.
___________________________________________________________________________________________________________________________
34
expresie-primar - identificator
O expresie-primar urmat de o sgeat (constituit dintr-o
liniu i semnul urmat de un identificator) este o expresieprimar. Prima expresie trebuie s fie un pointer la o structur sau
reuniune, iar identificatorul trebuie s fie numele unui membru din
structura sau reuniunea respectiv. Rezultatul este o valoare-stnga
care se refer la membrul denumit din structura sau reuniunea ctre
care indic expresia pointer.
Expresia E1E2 este identic din punctul de vedere al
rezultatului cu (*E1).E2 (detalii n capitolul nou).
List-expresii
O list de expresii este considerat de asemenea expresie, dac
acestea snt separate prin virgul.
* expresie
Operatorul unar * este operatorul de indirectare. Expresia care-l
urmeaz trebuie s fie un pointer, iar rezultatul este o valoare-stnga
care se refer la obiectul ctre care indic expresia. Dac tipul
expresiei este pointer la T atunci tipul rezultatului este T. Acest
operator trateaz operandul su ca o adres, face acces la ea i i
obine coninutul (detalii n capitolul opt).
& valoare-stnga
Operatorul unar & este operatorul de obinere a adresei unui
obiect sau de obinere a unui pointer la obiectul respectiv. Operandul
este o valoare-stnga iar rezultatul este un pointer la obiectul referit
de valoarea-stnga. Dac tipul valorii-stnga este T atunci tipul
rezultatului este pointer la T (detalii n capitolul opt).
expresie
Operatorul unar - este operatorul de negativare. Operandul su
este o expresie, iar rezultatul este negativarea operandului. n acest
___________________________________________________________________________________________________________________________
35
! expresie
Operatorul unar ! este operatorul de negare logic. Operandul
su este o expresie, iar rezultatul su este 1 sau 0 dup cum valoarea
operandului este 0 sau diferit de zero. Tipul rezultatului este int.
Acest operator este aplicabil la orice expresie de tip aritmetic sau la
pointeri.
~ expresie
Operatorul unar ~ (tilda) este operatorul de complementare la
unu. El convertete fiecare bit 1 la 0 i invers. El este un operator
logic pe bii.
Operandul su trebuie s fie de tip ntreg. Se aplic conversiile
aritmetice obinuite.
++ valoare-stnga
valoare-stnga ++
Operatorul unar ++ este operatorul de incrementare. Operandul
su este o valoare-stnga. Operatorul produce incrementarea
operandului cu 1. Acest operator prezint un aspect deosebit deoarece
el poate fi folosit ca un operator prefix (naintea variabilei: ++n) sau
ca un operator postfix (dup variabil: n++). n ambele cazuri efectul
este incrementarea lui n. Dar expresia ++n incrementeaz pe n
nainte de folosirea valorii sale, n timp ce n++ incrementeaz pe n
dup ce valoarea sa a fost utilizat. Aceasta nseamn c, n contextul
n care se urmrete numai incrementarea lui n, oricare construcie
poate fi folosit, dar ntr-un context n care i valoarea lui n este
folosit, ++n i n++ furnizeaz dou valori distincte.
Exemplu: dac n este 5, atunci
x = n++;
atribuie lui x valoarea 5
x = ++n;
atribuie lui x valoarea 6
n ambele cazuri n devine 6.
___________________________________________________________________________________________________________________________
36
-- valoare-stnga
valoare-stnga -Operatorul unar -- este operatorul de decrementare. Acest
operator este analog cu operatorul ++ doar c produce decrementarea
cu 1 a operandului.
(nume-tip) expresie
Operatorul (nume-tip) este operatorul de conversie de tip. Prin
nume-tip nelegem unul dintre tipurile fundamentale admise n C
inclusiv tipul pointer. Operandul acestui operator este o expresie.
Operatorul produce conversia valorii expresiei la tipul denumit.
Aceast construcie se numete cast.
sizeof(operand)
Operatorul sizeof furnizeaz dimensiunea n octei a
operandului su. Aplicat unui masiv sau structuri, rezultatul este
numrul total de octei din masiv sau structur. Dimensiunea se
determin n momentul compilrii, din declaraiile obiectelor din
expresie. Semantic, aceast expresie este o constant ntreag care se
poate folosi n orice loc n care se cere o constant. Cea mai frecvent
utilizare este n comunicarea cu rutinele de alocare a memoriei sau
cele de intrare / ieire.
Operatorul sizeof poate fi aplicat i unui nume-tip. n acest caz
el furnizeaz dimensiunea n octei a unui obiect de tipul indicat.
37
Expresie-aditiv:
expresie + expresie
expresie - expresie
Operatorii aditivi + i - snt operatori aritmetici binari i se
grupeaz de la stnga la dreapta. Se execut conversiile aritmetice
obinuite.
Operatorul binar + produce suma operanzilor si. El este
asociativ i expresiile care conin mai muli operatori pot fi rearanjate
la fel ca n cazul operatorului de nmulire.
Operatorul binar - produce diferena operanzilor si.
38
Expresie-egalitate:
expresie == expresie
expresie != expresie
Operatorii == (egal cu) i != (diferit de) snt analogi cu
operatorii relaionali, dar precedena lor este mai mic. Astfel c
a<b == c<d este 1 dac a<b i c<d au aceeai valoare de
adevr.
39
Expresie-I:
expresie & expresie
Operatorul & este operatorul I logic pe bii. El este asociativ i
expresiile care conin operatorul & pot fi rearanjate. Rezultatul este
funcia logic I pe bii aplicat operanzilor si. Operatorul se aplic
numai la operanzi de tipuri ntregi. Legea dup care funcioneaz
este:
&
0
1
0
0
0
1
0
1
Expresie-SAU-exclusiv:
expresie ^ expresie
Operatorul ^ este operatorul SAU-exclusiv logic pe bii. El este
asociativ i expresiile care-l conin pot fi rearanjate. Rezultatul este
funcia logic SAU-exclusiv pe bii aplicat operanzilor si.
Operatorul se aplic numai la operanzi de tipuri ntregi. Legea dup
care funcioneaz este:
^
0
1
0
0
1
1
1
0
___________________________________________________________________________________________________________________________
40
Expresie-SAU-inclusiv:
expresie | expresie
Operatorul | este operatorul SAU-inclusiv logic pe bii. El este
asociativ i expresiile care-l conin pot fi rearanjate. Rezultatul este
funcia logic SAU-inclusiv pe bii aplicat operanzilor si.
Operatorul se aplic numai la operanzi de tipuri ntregi. Legea dup
care funcioneaz este:
|
0
1
0
0
1
1
1
1
Expresie-SAU-logic:
expresie || expresie
Operatorul || este operatorul SAU-logic i el se grupeaz de la
stnga la dreapta. Rezultatul este 1 dac cel puin unul dintre operanzi
este diferit de zero i 0 n rest.
___________________________________________________________________________________________________________________________
41
42
este mai mic, dar ele pot fi folosite pentru a face expresia
condiional mai lizibil.
Expresie-atribuire:
valoare-stnga = expresie
valoare-stnga op= expresie
unde op poate fi unul din operatorii +, -, *, /, %, <<, >>, &, ^, |.
ntr-o atribuire simpl cu =, valoarea expresiei nlocuiete pe cea
a obiectului referit de valoare-stnga. Dac ambii operanzi au tip
aritmetic, atunci operandul drept este convertit la tipul operandului
stng nainte de atribuire.
Expresiile de forma E1op=E2 se interpreteaz ca fiind
echivalente cu expresiile de forma E1=E1opE2; totui E1 este
evaluat o singur dat.
Exemplu: expresia x *= y+1 este echivalent cu
x = x * (y+1)
i nu cu
x=x*y+1
Pentru operatorii += i -=, operandul stng poate fi i un pointer,
n care caz operandul din dreapta este convertit la ntreg (capitolul
opt). Toi operanzii din dreapta i toi operanzii din stnga care nu snt
pointeri trebuie s fie de tip aritmetic.
Atribuirea prescurtat este avantajoas n cazul cnd n membrul
stng avem expresii complicate, deoarece ele se evalueaz o singur
dat.
___________________________________________________________________________________________________________________________
43
44
Asociativitate
stnga la dreapta
dreapta la stnga
stnga la dreapta
stnga la dreapta
stnga la dreapta
stnga la dreapta
stnga la dreapta
stnga la dreapta
stnga la dreapta
stnga la dreapta
stnga la dreapta
stnga la dreapta
dreapta la stnga
dreapta la stnga
stnga la dreapta
___________________________________________________________________________________________________________________________
45
5. Instruciuni
ntr-un program scris n limbajul C instruciunile se execut
secvenial, n afar de cazul n care se indic altfel.
Instruciunile pot fi scrise cte una pe o linie pentru o lizibilitate
mai bun, dar nu este obligatoriu.
46
Format:
{
list-declaratori
list-instruciuni
}
Dac anumii identificatori din lista-declaratori au fost declarai
anterior, atunci declaraia exterioar este ignorat pe durata blocului,
dup care i reia sensul su.
Orice iniializare pentru variabilele auto i register se
efectueaz la fiecare intrare n bloc. Iniializrile pentru variabilele
static se execut numai o singur dat cnd programul ncepe s
se execute.
Un bloc se termin cu o acolad dreapt care nu este urmat
niciodat de caracterul punct i virgul.
5.3. Instruciunea if
Sintaxa instruciunii condiionale if admite dou formate:
if (expresie)
if (expresie) instruciune-1
instruciune-1
else instruciune-2
Instruciunea if se folosete pentru a lua decizii. n ambele
cazuri se evalueaz expresia i dac ea este adevrat (deci diferit
de zero) se execut instruciune-1. Dac expresia este fals (are
valoarea zero) i instruciunea if are i parte de else atunci se
execut instruciune-2.
n al doilea caz una i numai una dintre cele dou instruciuni se
execut. Deoarece un if testeaz pur i simplu valoarea numeric a
unei expresii, se admite o prescurtare i anume:
if (expresie)
n loc de:
if (expresie != 0)
Deoarece partea else a unei instruciuni if este opional,
exist o ambiguitate cnd un else este omis dintr-o secven de if
___________________________________________________________________________________________________________________________
47
if (n>0) {
if (a>b)
z = a;
}
else
z = b;
else
if (expresie-2) instruciune-2
else
if (expresie-3) instruciune-3
else instruciune-4
48
unsigned n, c = 0;
scanf("%u",&n);
do {
c++; n /= 10;
} while (n>0);
printf("%u",c);
49
while (expresie-2) {
instruciune;
expresie-3;
}
Expresie-1 constituie iniializarea ciclului i se execut o singur
dat naintea ciclului. Expresie-2 specific testul care controleaz
ciclul. El se execut naintea fiecrei iteraii. Dac condiia din test
este adevrat atunci se execut corpul ciclului, dup care se execut
expresie-3, care const de cele mai multe ori n modificarea valorii
variabilei de control al ciclului. Se revine apoi la reevaluarea
condiiei. Ciclul se termin cnd condiia devine fals.
Oricare dintre expresiile instruciunii for sau chiar toate pot
lipsi.
Dac lipsete expresie-2, aceasta implic faptul c clauza
while este echivalent cu while (1), ceea ce nseamn o condiie
totdeauna adevrat. Alte omisiuni de expresii snt pur i simplu
eliminate din expandarea de mai sus.
Instruciunile while i for permit un lucru demn de observat,
i anume: ele execut testul de control la nceputul ciclului i naintea
intrrii n corpul instruciunii.
Dac nu este nimic de fcut, nu se face nimic, cu riscul de a nu
intra niciodat n corpul instruciunii.
Exemple. 1) n primul capitol, al treilea i al patrulea program
folosesc instruciunea for pentru a parcurge un ir de valori. S
notm faptul c fiecare expresie poate fi orict de complex. Secvena
urmtoare determin suma primelor n numere naturale.
unsigned s,i;
scanf("%u",&n);
for (s=0,i=1; i<=n; i++)
s += i;
printf("%u",s);
50
51
do {
gets(op);
switch (op[0]) {
case 'i': case 'I':
Initializare(. . .); break;
case 'a': case 'A':
Adaugare(. . .); break;
case 'm': case 'M':
Modificare(. . .); break;
case 's': case 'S':
___________________________________________________________________________________________________________________________
52
53
for (. . .) {
...
contin:;
}
do {
...
contin:;
} while (...);
54
55
___________________________________________________________________________________________________________________________
56
6. Funcii
Funciile snt elementele de baz ale unui program scris n C:
orice program, de orice dimensiune, const din una sau mai multe
funcii, care specific operaiile care trebuie efectuate.
O funcie ofer un mod convenabil de ncapsulare a anumitor
calcule ntr-o cutie neagr care poate fi utilizat apoi fr a avea grija
coninutului ei. Funciile snt ntr-adevr singurul mod de a face fa
complexitii programelor mari, permit desfacerea programelor mari
n module mai mici, i dau utilizatorului posibilitatea de a dezvolta
programe, folosind ceea ce alii au fcut deja, n loc s o ia de la
nceput.
Limbajul C a fost conceput s permit definirea de funcii
eficiente i uor de mnuit. n general e bine s concepem programe
constituite din mai multe funcii mici dect din puine funcii de
dimensiuni mari. Un program poate fi mprit n mai multe fiiere
surs n mod convenabil, iar fiierele surs pot fi compilate separat.
Un program C const dintr-o secven de definiii externe de
funcii i de date. n fiecare program trebuie s existe o funcie cu
numele impus main; orice program i ncepe execuia cu funcia
main. Celelalte funcii snt apelate din interiorul funciei main.
Unele dintre funciile apelate snt definite n acelai program, altele
snt coninute ntr-o bibliotec de funcii.
57
Cnk
n!
k!( n k )!
#include <stdio.h>
int fact(int n) {
int i,p;
for (p=i=1; i<=n; i++)
p *= i;
return p;
}
___________________________________________________________________________________________________________________________
58
int main() {
int n,k,i;
puts("Valori n si k: ");
scanf("%d %d",&n,&k);
printf("Combinari:%d\n",fact(n)/fact(k)/fact(n-k));
return 0;
}
59
Cnk :
n, n 1
Fn
Fn1 Fn2 , n 1
int rfibo(int n) {
if (n<=1) return 1;
else return fibo(n-1) + fibo(n-2);
}
60
fibo(int n) {
a,b,c,i;
0; b = 1; c = n;
(i=2; i<=n; i++) {
c = a + b;
a = b; b = c;
}
return p;
}
61
62
63
64
sn = 1; i = 0;
if (s[0]=='+' || s[0]=='-')
sn = (s[i++]=='+') ? 1 : -1;
for (val=0; s[i]>='0' && s[i]<='9'; i++)
val = 10 * val + s[i] - '0';
if (s[i]== '.')
i++;
for (fr=1; s[i]>='0' && s[i]<='9'; i++) {
val = 10 * val +s[i] - '0':
fr *= 10;
}
return sn * val / fr;
}
65
___________________________________________________________________________________________________________________________
66
67
#include nume-fiier
Deseori, o linie sau mai multe linii, de una sau ambele forme apar
la nceputul fiecrui fiier surs pentru a include definiii comune
(prin declaraii #define i declaraii externe pentru variabilele
globale).
Facilitatea de includere a unor fiiere ntr-un text surs este
deosebit de util pentru gruparea declaraiilor unui program mare. Ea
va asigura faptul c toate fiierele surs vor primi aceleai definiii i
declaraii de variabile, n felul acesta eliminndu-se un tip particular
de erori. Dac se modific un fiier inclus printr-o linie #include,
toate fiierele care depind de el trebuie recompilate.
68
va fi nlocuit cu:
x = ((p+q)>(r+s) ? (p+q) : (r+s));
69
verific dac
#ifdef identificator
7.4. Exemple
1) Se citete de la tastatur o pereche de numere naturale p i q.
S se determine dac fiecare din cele dou numere este prim sau nu,
i s se calculeze cel mai mare divizor comun.
S rezolvm aceast problem folosind dou fiiere surs. Primul
conine funcia main i apeleaz dou funcii: eprim i cmmdc. Al
doilea fiier implementeaz cele dou funcii.
Prezentm mai nti un fiier header (numere.h) care conine
declaraiile celor dou funcii.
#ifndef _Numere_H
#define _Numere_H
unsigned eprim(unsigned n);
___________________________________________________________________________________________________________________________
70
71
}
}
unsigned cmmdc(unsigned p, unsigned q) {
while ((p>0) && (q>0))
if (p>q) p %= q;
else q %= p;
if (p==0) return q;
else return p;
}
72
#endif
73
return 0;
}
74
Lis[k] = Lis[k+1];
ne--;
return 1;
}
int Interogare(double v) {
int l,r,m;
double d;
l = 0; r = ne 1;
while (l<=r) {
m = (l + r) / 2; d = Lis[m] v;
if (d==0) return m;
if (d<0) l = m + 1;
else r = m 1;
}
return 1;
}
___________________________________________________________________________________________________________________________
75
8. Pointeri i masive
Un pointer este o variabil care conine adresa unei alte variabile.
Pointerii snt foarte mult utilizai n programe scrise n C, pe de o
parte pentru c uneori snt unicul mijloc de a exprima un calcul, iar
pe de alt parte pentru c ofer posibilitatea scrierii unui program mai
compact i mai eficient dect ar putea fi obinut prin alte ci.
76
77
/* greit */
78
79
pa = a + 1;
___________________________________________________________________________________________________________________________
80
81
82
83
84
Limbajul C ofer facilitatea utilizrii masivelor multidimensionale, dei n practic ele snt folosite mai rar dect masivele
de pointeri.
Masivele multi-dimensionale snt folosite mai ales de
programatorii nceptori n scop didactic.
S considerm problema conversiei datei, de la zi din lun, la zi
din an i invers, innd cont de faptul c anul poate s fie bisect sau
nu. Definim dou funcii care s realizeze cele dou conversii.
Funcia NrZile convertete ziua i luna n numrul de zile de la
nceputul anului, i funcia LunaZi convertete numrul de zile n
lun i zi.
Ambele funcii au nevoie de aceeai informaie i anume un tabel
cu numrul zilelor din fiecare lun. Deoarece numrul zilelor din
lun difer pentru anii biseci de cele pentru anii nebiseci este mai
uor s considerm un tabel bidimensional n care prima linie s
corespund numrului de zile ale lunilor pentru anii nebiseci, iar a
doua linie s corespund numrului de zile pentru anii biseci. n felul
acesta nu trebuie s inem o eviden n timpul calculului a ceea ce se
ntmpl cu luna februarie. Atunci masivul bidimensional care
conine informaiile pentru cele dou funcii este urmtorul:
static int Zile[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
85
Deoarece variabila bis poate lua ca valori numai zero sau unu,
dup cum expresia (scris de data aceasta explicit):
(an%4==0) && (an%100!=0) || (an%400==0)
86
f(int Zile[][13]);
87
88
89
90
|______________|______________|______________|
|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|
X[0]
X[1]
X[2]
91
92
93
94
95
________________________________
|__||__|__|__|__|__|__|__|__|__|
|__||
|
|__||
Este foarte important s se respecte aceti pai n alocarea
memoriei pentru matrice. n caz contrar variabilele pointer conin
valori necunoscute i nu exist garanii c indic spre zone de
memorie sigure: este foarte probabil c programul nu are acces la
zonele respective.
Funcia principal va fi scris astfel:
int main() {
int **Mat,n,m;
/* alte definiii de variabile */
/* Citete valorile n i m */
Mat = IntMatr(n,m);
/* Completeaz matricea cu valori Mat[i][j] ... */
/* Prelucreaz matricea */
free(Mat[0]); free(Mat);
/* Elibereaz memoria */
}
96
___________________________________________________________________________________________________________________________
97
98
99
avnd intrarea:
la miezul stinselor lumini
s-ajung victorios,
la temelii, la rdcini,
la mduv, la os.
___________________________________________________________________________________________________________________________
100
101
tst = index(lin,*av)>=0;
if (tst!=except) {
if (num)
printf("%4d:",nl);
puts(lin);
}
}
___________________________________________________________________________________________________________________________
102
___________________________________________________________________________________________________________________________
103
104
tmp = v[j];
v[j] = v[j+gap];
v[j+gap] = tmp;
}
}
___________________________________________________________________________________________________________________________
105
___________________________________________________________________________________________________________________________
106
9. Structuri i reuniuni
O structur este o colecie de una sau mai multe variabile, de
acelai tip sau de tipuri diferite, grupate mpreun sub un singur
nume pentru a putea fi tratate mpreun.
Structurile ajut la organizarea datelor complexe, n special n
programele mari, deoarece permit unui grup de variabile legate s fie
tratate ca o singur entitate. n acest capitol vom ilustra modul de
utilizare a structurilor.
107
108
109
struct {
int x,*y;
} *p;
9.2. typedef
Stilul de utilizare a tipurilor de date structurate prezentat mai sus
este foarte frecvent, i se ntlnete mai ales n programe care
apeleaz funcii ale sistemelor de operare Linux.
Considerm totui c a scrie declaraii de funcii care au ca i
parametri date structurate, sau a defini variabile de tip structur, este
destul de neplcut datorit cerinei de a preciza numele tipului
___________________________________________________________________________________________________________________________
110
111
112
113
114
___________________________________________________________________________________________________________________________
115
116
117
118
119
Fiecare nod din list are tipul T_list i conine, printre altele,
i adresa urmtorului nod. Dar adresa primului nod e memorat ntrun element care are alt tip dect T_list. De aceea avem nevoie s
memorm adresa zonei unde este memorat adresa care ne
intereseaz, de unde necesitatea definiiei globale
P_list *pp;
120
121
122
___________________________________________________________________________________________________________________________
123
| bac |
| lac |
/
| cer |
Fiecare nod al arborelui va reprezenta un cuvnt distinct din
intrare i va conine urmtoarea informaie:
un pointer la un ir de caractere;
un contor pentru numrul de apariii;
un pointer la descendentul stng al nodului;
un pointer la descendentul drept al nodului; nici un nod al arborelui
nu va avea mai mult dect doi descendeni dar poate avea un
descendent sau chiar nici unul.
Arborele se construiete astfel nct pentru orice nod, subarborele stng al su conine numai cuvintele care snt mai mici dect
cuvntul din nod, iar sub-arborele drept conine numai cuvintele care
snt mai mari dect cuvntul din nod, compararea fcndu-se din punct
de vedere lexicografic.
___________________________________________________________________________________________________________________________
124
/* nodul de baz */
/* pointer la cuvnt */
/* numrtor de apariii */
/* descendent stng (left) */
/* descendent drept (right) */
125
126
127
9.7. Cmpuri
Un cmp se definete ca fiind o mulime de bii consecutivi dintrun cuvnt sau ntreg. Concret, din motive de economie a spaiului de
memorie, este util mpachetarea unor obiecte ntr-un singur cuvnt
main. Un caz frecvent de acest tip este utilizarea unui set de flaguri,
fiecare pe un bit, pentru tabela de simboluri a unui compilator.
Fiecare simbol dintr-un program are anumite informaii asociate
lui, cum snt de exemplu clasa de memorie, tipul, dac este sau nu
cuvnt cheie .a.m.d. Cel mai compact mod de a codifica aceste
informaii este folosirea unui set de flaguri, de cte un bit, ntr-un
singur ntreg sau caracter.
Modul cel mai uzual pentru a face acest lucru este de a defini un
set de mti, fiecare masc fiind corespunztoare poziiei bitului n
interiorul caracterului sau cuvntului. De exemplu:
#define KEYWORD 01
#define EXTERNAL 02
#define STATIC 04
___________________________________________________________________________________________________________________________
128
Expresia urmtoare este adevrat cnd cel puin unul din biii 1
sau 2 din flags este unu:
if (flags & (EXTERNAL | STATIC)) . . .
129
flags.is_extern = flags.is_static = 0;
9.8. Reuniuni
O reuniune este o variabil care poate conine, la momente
diferite, obiecte de diferite tipuri i dimensiuni; compilatorul este cel
care ine evidena dimensiunilor i aliniamentului.
Reuniunile ofer posibilitatea ca mai multe tipuri diferite de date
s fie tratate ntr-o singur zon de memorie.
S relum exemplul tabelei de simboluri a unui compilator,
presupunnd c se gestioneaz constante de tip int, float sau
iruri de caractere.
Valoarea unei constante particulare ar putea fi memorat ntr-o
variabil de tip corespunztor, dar este mai convenabil, pentru
gestiunea tabelei de simboluri, ca valoarea s fie memorat n aceeai
zon de memorie, indiferent de tipul ei. Acesta este scopul unei
reuniuni: de a furniza o singur variabil care s poat conine oricare
dintre valorile unor tipuri de date. Ca i n cazul cmpurilor, sintaxa
___________________________________________________________________________________________________________________________
130
131
struct {
char *name;
int flags,utype;
union {
int ival;
float fval;
char *pval;
} uval;
} symtab[NSYM];
132
typedef union {
T_struc ds;
long dn;
} T_data;
___________________________________________________________________________________________________________________________
133
134
135
Descriere
Funcia fopen deschide fiierul al crui nume este un ir indicat
de num i i asociaz un flux.
Argumentul mod indic un ir care ncepe cu una din secvenele
urmtoare:
r deschide un fiier pentru citire;
r+ deschide pentru citire i scriere;
w trunchiaz fiierul la lungime zero sau creeaz un fiier pentru
scriere;
w+ deschide pentru adugare la sfrit, n citire i scriere; fiierul este
creat dac nu exist, altfel este trunchiat;
a deschide pentru adugare la sfrit, n scriere; fiierul este creat
dac nu exist;
a+ deschide pentru adugare la sfrit, n citire i scriere; fiierul este
creat dac nu exist;
Dup deschidere, n primele patru cazuri indicatorul poziiei n
flux este la nceputul fiierului, n ultimele dou la sfritul acestuia.
irul mod include de asemenea litera b (deschide un fiier binar)
sau t (deschide un fiier text) fie pe ultima poziie fie pe cea din
mijloc.
Operaiile de citire i scriere pot alterna n cazul fluxurilor read /
write n orice ordine. S reinem c standardul ANSI C cere s existe
o funcie de poziionare ntre o operaie de intrare i una de ieire, sau
ntre o operaie de ieire i una de intrare, cu excepia cazului cnd o
operaie de citire detecteaz sfritul de fiier. Aceast operaie poate
fi inefectiv cum ar fi fseek(flux, 0L, SEEK_CUR) apelat
cu scop de sincronizare.
___________________________________________________________________________________________________________________________
136
Valori returnate
n caz de succes se returneaz un pointer de tip FILE. n caz de
eroare se returneaz NULL i variabila global errno indic codul
erorii.
Nume
fclose - nchide un flux
Declaraie
int fclose( FILE *flux);
Descriere
Funcia fclose nchide fiierul asociat fluxului flux. Dac
flux a fost deschis pentru ieire, orice date aflate n zone tampon
snt scrise n fiier n prealabil cu un apel fflush.
Valori returnate
n caz de succes se returneaz 0. n caz de eroare se returneaz
EOF i variabila global errno indic codul erorii.
Nume
tmpfile - creeaz un fiier temporar
Declaraie
FILE *tmpfile();
Descriere
Funcia tmpfile genereaz un nume unic de fiier temporar.
Acesta este deschis n mod binar pentru scriere / citire ("wb+").
Fiierul va fi ters automat la nchidere sau la terminarea
programului.
Valoare returnat
Funcia returneaz un descriptor de flux n caz de succes, sau
NULL dac nu poate fi generat un nume unic de fiier sau dac
fiierul nu poate fi deschis. n caz de eroare variabila global errno
indic codul erorii.
___________________________________________________________________________________________________________________________
137
Nume
fflush - foreaz scrierea n flux
Declaraie
int fflush(FILE *flux);
Descriere
Funcia fflush foreaz o scriere a tuturor datelor aflate n zone
tampon ale fluxului flux. Fluxul rmne deschis.
Valori returnate
n caz de succes se returneaz 0. n caz de eroare se returneaz
EOF i variabila global errno indic codul erorii.
Nume
fseek, ftell, rewind - repoziioneaz un flux
Declaraie
int fseek(FILE *flux, long ofs, int reper);
long ftell(FILE *flux);
void rewind(FILE *flux);
Descriere
Funcia fseek seteaz indicatorul de poziie pentru fiierul
asociat fluxului flux. Noua poziie, dat n octei, se obine adunnd
ofs octei (offset) la poziia specificat de reper. Dac reper
este SEEK_SET, SEEK_CUR, sau SEEK_END, ofs este relativ la
nceputul fiierului, poziia curent a indicatorului, respectiv sfritul
fiierului. Funcia fseek terge indicatorul de sfrit de fiier.
Funcia ftell obine valoarea curent a indicatorului de poziie
pentru fiierul asociat fluxului flux.
Funcia rewind poziioneaz indicatorul de poziie pentru
fiierul asociat fluxului flux la nceputul fiierului. Este echivalent
cu:
(void)fseek(flux, 0L, SEEK_SET)
138
Valori returnate
Funcia rewind nu returneaz nici o valoare. n caz de succes,
fseek returneaz 0, i ftell returneaz offset-ul curent. n caz de
eroare se returneaz EOF i variabila global errno indic codul
erorii.
Nume
fileno returneaz descriptorul asociat fluxului
Declaraie
int fileno(FILE *flux);
Descriere
Funcia fileno examineaz argumentul flux i returneaz
descriptorul asociat de sistemul de operare acestui flux.
Descriere
Funcia fgets citete cel mult size-1 caractere din flux i le
memoreaz n zona indicat de s. Citirea se oprete la detectarea
sfritului de fiier sau new-line. Dac se citete caracterul new-line
acesta este memorat n s. Dup ultimul caracter se memoreaz null.
Apeluri ale acestei funcii pot fi combinate cu orice apeluri ale
altor funcii de intrare din bibliotec (fscanf, de exemplu) pentru
un acelai flux de intrare.
Valori returnate
Funcia returneaz adresa s n caz de succes, sau NULL n caz de
eroare sau la ntlnirea sfritului de fiier dac nu s-a citit nici un
caracter.
___________________________________________________________________________________________________________________________
139
Nume
fputs - scrie un ir de caractere ntr-un flux text
Declaraie
int fputs(const char *s, FILE *flux);
Descriere
Funcia fputs scrie irul s n flux fr caracterul terminator
null.
Apeluri ale acestei funcii pot fi combinate cu orice apeluri ale
altor funcii de ieire din bibliotec (fprintf, de exemplu) pentru
un acelai flux de ieire.
Valori returnate
Funcia returneaz o valoare non-negativ n caz de succes, sau
EOF n caz de eroare.
Nume
fread, fwrite - intrri / ieiri pentru fluxuri binare
Declaraie
unsigned fread(void *ptr, unsigned size,
unsigned nel, FILE *flux);
unsigned fwrite(const void *ptr, unsigned
size, unsigned nel, FILE *flux);
Descriere
Funcia fread citete nel elemente, fiecare avnd mrimea
size octei, din fluxul indicat de flux, i le memoreaz n zona
indicat de ptr.
Funcia fwrite scrie nel elemente, fiecare avnd mrimea
size octei, din fluxul indicat de flux, pe care le ia din zona
indicat de ptr.
Valori returnate
Funciile returneaz numrul de elemente citite sau scrise cu
succes (i nu numrul de caractere). Dac apare o eroare sau se
ntlnete sfritul de fiier, valoarea returnat este mai mic dect
nel (posibil zero).
___________________________________________________________________________________________________________________________
140
Descriere
Funciile din familia ...scanf scaneaz intrarea n concordan cu
irul de caractere fmt dup cum se descrie mai jos. Acest format
poate conine specificatori de conversie; rezultatele unor astfel de
conversii (dac se efectueaz) se memoreaz prin intermediul
argumentelor pointer. Funcia scanf citete irul de intrare din
fluxul standard stdin, fscanf din flux, i sscanf din irul
indicat de str.
Fiecare argument pointer trebuie s corespund n ordine ca tip
cu fiecare specificator de conversie (dar a se vedea suprimarea mai
jos). Dac argumentele nu snt suficiente comportamentul
programului este imprevizibil. Toate conversiile snt introduse de
caracterul %. irul format poate conine i alte caractere. Spaii albe
(blanc, tab, sau new-line) din irul format se potrivesc cu orice spaiu
alb n orice numr (inclusiv nici unul) din irul de intrare. Orice alte
caractere trebuie s se potriveasc exact. Scanarea se oprete atunci
cnd un caracter din irul de intrare nu se potrivete cu cel din format.
Scanarea se oprete de asemenea atunci cnd o conversie nu se mai
poate efectua (a se vedea mai jos).
Conversii
Dup caracterul % care introduce o conversie poate urma un
numr de caractere indicatori, dup cum urmeaz:
*
___________________________________________________________________________________________________________________________
141
___________________________________________________________________________________________________________________________
142
e,g Echivalent cu f.
s
___________________________________________________________________________________________________________________________
143
Valori returnate
Funciile returneaz numrul de valori atribuite, care poate fi mai
mic dect numrul de argumente pointer, sau chiar zero, n cazul n
care apar nepotriviri ntre format i irul de intrare. Zero indic faptul
c, chiar dac avem un ir de intrare disponibil, nu s-a efectuat nici o
conversie (i atribuire); aceast situaie apare atunci cnd un caracter
din irul de intrare este invalid, cum ar fi un caracter alfabetic pentru
o conversie %d. Valoarea EOF este returnat dac apare o eroare
nainte de prima conversie, cum ar fi detectarea sfritului de fiier.
Dac o eroare sau un sfrit de fiier apare dup ce o conversie a
nceput, se returneaz numrul de conversii efectuate cu succes, i se
poziioneaz bitul corespunztor din structura FILE, care poate fi
testat.
Descriere
Funciile din familia ...printf genereaz o ieire n concordan cu
format dup cum se descrie mai jos. Funcia printf afieaz ieirea
la fluxul standard stdout; fprintf scrie ieirea la flux;
sprintf scrie ieirea n irul de caractere str.
___________________________________________________________________________________________________________________________
144
145
Limea cmpului
Un ir de cifre zecimale (cu prima cifr nenul) specific o lime
minim pentru cmp. Dac valoarea convertit are mai puine
caractere dect limea specificat, va fi completat cu spaii la stnga
(sau dreapta, dac s-a specificat aliniere la stnga). n locul unui
numr zecimal se poate folosi * pentru a specifica faptul c limea
cmpului este dat de argumentul corespondent, care trebuie s fie de
tip int. O valoare negativ pentru lime este considerat un
indicator - urmat de o valoare pozitiv pentru lime. n nici un caz
nu se va trunchia cmpul; dac rezultatul conversiei este mai mare
dect limea cmpului, cmpul este expandat pentru a conine
rezultatul conversiei.
Precizia
Precizia (opional) este dat de caracterul . urmat de un ir de
cifre zecimale. n locul irului de cifre zecimale se poate scrie *
pentru a specifica faptul c precizia este dat de argumentul
corespondent, care trebuie s fie de tip int. Dac precizia este dat
doar de caracterul . sau dac precizia este negativ, atunci aceasta se
consider zero. Precizia d numrul minim de cifre care apar pentru
conversii de tip d, i, o, u, x, X, numrul de cifre care apar dup
punctul zecimal pentru conversii de tip e, E, f, F, numrul maxim de
cifre semnificative pentru conversii de tip g i G, sau numrul maxim
de caractere generate pentru conversii de tip s.
Dac se folosete * pentru lime sau precizie (sau ambele),
argumentele se iau n ordine: lime, precizie, valoare de scris.
Modificator de lungime
n acest caz prin conversie ntreag nelegem conversie de tip d,
i, o, u, x, X.
___________________________________________________________________________________________________________________________
146
Specificator de conversie
Un caracter care specific tipul conversiei care se va face.
Specificatorii de conversie i semnificaia lor snt:
d,i
Argumentul de tip int este convertit la notaia zecimal cu
semn. Precizia, dac este dat, d numrul minim de cifre care
trebuie s apar; dac valoarea convertit necesit mai puine
cifre, aceasta este completat la stnga cu zerouri. Precizia
implicit este 1. Dac valoarea 0 este afiat cu precizie explicit
0, ieirea este vid.
o,u,x,X
Argumentul de tip unsigned este convertit la notaie octal
fr semn (o), zecimal fr semn (u), sau hexazecimal fr
semn (x i X). Literele abcdef se folosesc pentru conversii de
tip x, literele ABCDEF pentru conversii de tip X. Precizia, dac
este dat, d numrul minim de cifre care trebuie s apar; dac
valoarea convertit necesit mai puine cifre, aceasta este
completat la stnga cu zerouri. Precizia implicit este 1. Dac
valoarea 0 este afiat cu precizie explicit 0, ieirea este vid.
e,E
Argumentul de tip flotant este rotunjit i convertit n stil
[-]d.dddedd unde avem o cifr nainte de punctul zecimal i
numrul de cifre dup acesta este egal cu precizia; dac aceasta
___________________________________________________________________________________________________________________________
147
___________________________________________________________________________________________________________________________
148
Valoare returnat
Funciile returneaz numrul de caractere generate (nu se include
caracterul terminator null pentru sprintf).
Descriere
Rutina perror afieaz un mesaj la ieirea standard de eroare,
care descrie ultima eroare ntlnit la ultimul apel sistem sau funcie
de bibliotec. Mai nti se afieaz argumentul s, apoi virgula i
blanc, i n final mesajul de eroare i new-line. Se recomand (mai
ales pentru depanare) ca argumentul s s includ numele funciei n
care a aprut eroarea. Codul erorii se ia din variabila extern errno.
Lista global de erori sys_errlist[] indexat cu errno
poate fi folosit pentru a obine mesajul de eroare fr new-line.
Ultimul indice de mesaj din list este sys_nerr-1. Se recomand
o atenie deosebit n cazul accesului direct la list deoarece unele
coduri noi de eroare pot lipsi din sys_errlist[].
Dac un apel sistem eueaz variabila errno indic codul erorii.
Aceste valori pot fi gsite n <errno.h>. Funcia perror servete
la afiarea acestui cod de eroare ntr-o form lizibil. Dac un apel
terminat cu eroare nu este imediat urmat de un apel perror,
valoarea variabilei errno se poate pierde dac nu e salvat.
___________________________________________________________________________________________________________________________
149
Nume
clearerr, feof, ferror - verific i reseteaz starea
fluxului
Declaraie
void clearerr(FILE *flux);
int feof(FILE *flux);
int ferror(FILE *flux);
Descriere
Funcia clearerr terge indicatorii de sfrit de fiier i eroare
ai fluxului.
Funcia feof testeaz indicatorul de sfrit de fiier al fluxului,
i returneaz non-zero dac este setat. Acesta este setat dac o
operaie de citire a detectat sfritul de fiier.
Funcia ferror testeaz indicatorul de eroare al fluxului, i
returneaz non-zero dac este setat. Acesta este setat dac o operaie
de citire sau scriere a detectat o eroare (datorat de exemplu
hardware-ului).
Funciile de citire (cu sau fr format) nu fac distincie ntre
sfrit de fiier i eroare, astfel c trebuie apelate funciile feof i
ferror pentru a determina cauza terminrii.
Atenie! Este foarte frecvent folosirea incorect a funciei feof
pentru a testa dac s-a ajuns la sfritul fiierului. Nu se recomand n
nici un caz acest stil de programare:
#define LSIR 80
char lin[LSIR];
FILE *fi,*fo;
fi=fopen(nume-fiier-intrare,"rt");
fo=fopen(nume-fiier-ieire,"wt");
while (!feof(fi)) {
/* greit! */
fgets(lin,LSIR,fi);
fputs(lin,fo);
}
fclose(fi); fclose(fo);
___________________________________________________________________________________________________________________________
150
Nume
opendir - deschide un director
Declaraie
DIR *opendir(const char *nume);
Descriere
Funcia opendir deschide un flux pentru directorul cu numele
nume, i returneaz un pointer la fluxul deschis. Fluxul este
poziionat pe prima intrare din director.
___________________________________________________________________________________________________________________________
151
Valoare returnat
Funcia returneaz un pointer la flux n caz de succes, sau NULL
n caz de eroare i variabila global errno indic codul erorii.
Cteva erori posibile
EACCES Acces interzis
ENOTDIR nume nu este un director
Nume
readdir - citete dintr-un director
Declaraie
struct dirent *readdir(DIR *dir);
Descriere
Funcia readdir returneaz un pointer la o structur de tip
dirent care reprezint urmtoarea intrare din directorul indicat de
fluxul dir. Returneaz NULL dac s-a depistat sfritul de director
sau dac a aprut o eroare.
Structura de tip dirent conine un cmp char d_name[].
Utilizarea altor cmpuri din structur reduce portabilitatea
programelor.
Valoare returnat
Funcia returneaz un pointer la o structur de tip dirent, sau
NULL dac s-a depistat sfritul de director sau dac a aprut o
eroare.
Nume
closedir - nchide un director
Declaraie
int closedir(DIR *dir);
Descriere
Funcia closedir nchide fluxul dir.
Valoare returnat
Funcia returneaz 0 n caz de succes sau EOF n caz de eroare.
___________________________________________________________________________________________________________________________
152
Nume
rename - redenumete un fiier
remove - terge un fiier
Declaraie
int rename(const char *old, const char *new);
int remove(const char *name);
Descriere
Funcia rename schimb numele unui fiier din old n new.
Dac a fost precizat un periferic n new, acesta trebuie s coincid cu
cel din old. Directoarele din old i new pot s fie diferite, astfel c
rename poate fi folosit pentru a muta un fiier dintr-un director n
altul. Nu se permit specificatori generici (wildcards).
Funcia remove terge fiierul specificat prin name.
Valoare returnat
n caz de succes se returneaz 0. n caz de eroare se returneaz
EOF i variabila global errno indic codul erorii.
153
return 1;
}
fseek(f,0,SEEK_END);
fprintf(stderr,"File %s, size %ld\n",ftell(f));
fclose(f);
return 0;
}
154
fputs("Doua argumente!\n",stderr);
return 1;
}
fi=fopen(av[1],"rb"); fo=fopen(av[2],"wb");
if (!fi || !fo) {
perror("Eroare la deschidere");
return 1;
}
while (k=fread(zon,1,LZON,fi))
fwrite(zon,1,k,fo);
fclose(fi); fclose(fo);
return 0;
}
155
fclose(fi);
return 0;
}
___________________________________________________________________________________________________________________________
156
Descriere
Funcia calloc aloc memorie pentru un masiv de nel
elemente, fiecare de mrime size octei i returneaz un pointer la
memoria alocat. Coninutul memoriei este pus la zero.
Funcia malloc aloc size octei i returneaz un pointer la
memoria alocat. Coninutul memoriei nu este ters.
Funcia free elibereaz spaiul de memorie indicat de ptr, care
trebuie s fi fost returnat de un apel anterior malloc, calloc sau
realloc. n caz contrar, sau dac a existat deja un apel anterior
free(ptr), comportamentul programului este imprevizibil.
Funcia realloc modific mrimea blocului de memorie
indicat de ptr la size octei. Coninutul rmne neschimbat la
mrimea minim dintre mrimea veche i cea nou; noul spaiu de
___________________________________________________________________________________________________________________________
157
memorie care este eventual alocat este neiniializat. Dac ptr este
NULL apelul este echivalent cu malloc(size); dac size este
egal cu zero apelul este echivalent cu free(ptr). Cu excepia
cazului cnd ptr este NULL, acesta trebuie s fi fost returnat de un
apel precedent malloc, calloc sau realloc.
Valori returnate
Pentru calloc i malloc valoarea returnat este un pointer la
memoria alocat, aliniat n mod corespunztor pentru orice tip de
variabile, sau NULL dac nu exist suficient memorie continu.
Funcia free nu returneaz nimic.
Funcia realloc returneaz un pointer la noua zon de
memorie alocat, aliniat n mod corespunztor pentru orice tip de
variabile. Valoarea acestuia poate fi diferit de ptr, poate fi NULL
dac nu exist suficient memorie continu sau dac valoarea size
este egal cu 0. Dac realloc eueaz, blocul original rmne
neatins nu este nici eliberat nici mutat.
Descriere
Funcia qsort sorteaz un masiv de nel elemente, fiecare de
mrime size. Argumentul base indic spre nceputul masivului.
___________________________________________________________________________________________________________________________
158
___________________________________________________________________________________________________________________________
159
int
int
int
int
int
isascii(int
iscntrl(int
isdigit(int
isgraph(int
islower(int
c);
c);
c);
c);
c);
int
int
int
int
int
isprint(int c);
ispunct(int c);
isspace(int c);
isupper(int c);
isxdigit(int c);
Descriere
Primele 12 funcii verific dac c, care trebuie s fie o valoare de
tip unsigned char sau EOF, se afl n una din clasele de caractere
enumerate mai sus.
isalnum
Verific dac c este alfanumeric (liter sau cifr).
isalpha
Verific dac c este alfabetic (liter mare sau mic).
isascii
Verific dac c este o valoare pe 7 bii din setul de caractere
ASCII.
iscntrl
Verific dac c este un caracter de control.
isdigit
Verific dac c este o cifr (ntre 0 i 9).
isgraph
Verific dac c este un caracter afiabil cu excepia spaiului.
islower
Verific dac c este o liter mic.
isprint
Verific dac c este un caracter afiabil inclusiv spaiu.
ispunct
Verific dac c este un caracter diferit de spaiu i nonalfanumeric.
___________________________________________________________________________________________________________________________
160
isspace
Verific dac c este un spaiu alb.
isupper
Verific dac c este o liter mare.
isxdigit
Verific dac c este o cifr hexazecimal din setul:
0 1 2 3 4 5 6 7 8 9 a b c d e f AB C D E F
tolower
Convertete caracterul c, dac este o liter, la litera mic
corespunztoare.
toupper
Convertete caracterul c, dac este o liter, la litera mare
corespunztoare.
Valoare returnat
Valoarea returnat de funciile is... este nenul dac caracterul c
se afl n clasa testat, i zero n caz contrar.
Valoarea returnat de funciile to... este litera convertit dac
caracterul c este o liter, i nedefinit n caz contrar.
Nume
memcpy - copiaz o zon de memorie
Declaraie
void *memcpy(void *dest, const void *src,
unsigned n);
void *memmove(void *dest, const void *src,
unsigned n);
___________________________________________________________________________________________________________________________
161
Descriere
Funcia memcpy copiaz n octei din zona de memorie src n
zona de memorie dest. Zonele de memorie nu trebuie s se
suprapun. Dac exist acest risc se utilizeaz memmove.
Valoare returnat
Funciile returneaz un pointer la dest.
Nume
memcmp - compar dou zone de memorie
Declaraie
int memcmp(const void *s1, const void *s2,
unsigned n);
Descriere
Funcia memcmp compar primii n octei ai zonelor de memorie
s1 i s2.
Valoare returnat
Returneaz un ntreg mai mic dect, egal cu, sau mai mare dect
zero dac s1 este mai mic dect, coincide, respectiv este mai mare
dect s2.
Nume
memset - umple o zon de memorie cu o constant pe un
octet
Declaraie
void *memset(void *s, int c, unsigned n);
Descriere
Funcia memset umple primii n octei ai zonei de memorie
indicat de s cu constanta c pe un octet.
Valoare returnat
Funcia returneaz un pointer la zona de memorie s.
___________________________________________________________________________________________________________________________
162
Nume
memchr - caut n memorie un caracter
Declaraie
void *memchr(const void *s, int c, unsigned n);
Descriere
Funcia memchr caut caracterul c n primii n octei de memorie
indicai de s. Cutarea se oprete la primul octet care are valoarea c
(interpretat ca unsigned char).
Valoare returnat
Funcia returneaz un pointer la octetul gsit sau NULL dac
valoarea nu exist n zona de memorie.
Nume
strlen - calculeaz lungimea unui ir
Declaraie
unsigned strlen(const char *s);
Descriere
Funcia strlen calculeaz lungimea irului s, fr a include
caracterul terminator null.
Valoare returnat
Funcia returneaz numrul de caractere din s.
Nume
strcpy, strncpy - copiaz un ir de caractere
Declaraie
char *strcpy(char *dest, const char *src);
___________________________________________________________________________________________________________________________
163
Descriere
Funcia strcpy copiaz irul indicat de src (inclusiv
caracterul terminator null) n zona indicat de dest. irurile nu
trebuie s se suprapun, i n plus zona dest trebuie s fie suficient
de mare pentru a primi copia.
Funcia strncpy este similar, cu excepia faptului c nu se
copiaz mai mult de n octei din src. Astfel, dac caracterul
terminator null nu se afl n primii n octei din src, rezultatul nu va
fi terminat cu null. n cazul n care lungimea lui src este mai mic
dect n, restul octeilor din dest primesc valoarea null.
Valoare returnat
Funciile returneaz un pointer la irul dest.
Nume
strdup - duplic un ir
Declaraie
char *strdup(const char *s);
Descriere
Funcia strdup returneaz un pointer la un nou ir care este un
duplicat al irului s. Memoria pentru noul ir se obine cu malloc,
i poate fi eliberat cu free.
Valoare returnat
Funcia returneaz un pointer la irul duplicat, sau NULL dac nu
exist memorie suficient disponibil.
Nume
strcat, strncat - concateneaz dou iruri
Declaraie
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src,
unsigned n);
___________________________________________________________________________________________________________________________
164
Descriere
Funcia strcat adaug irul src la irul dest suprascriind
caracterul null de la sfritul lui dest, i la sfrit adaug un caracter
terminator null. irurile nu trebuie s se suprapun, i n plus irul
dest trebuie s aib suficient spaiu pentru a pstra rezultatul.
Funcia strncat este similar, cu excepia faptului c numai
primele n caractere din src se adaug la dest.
Valoare returnat
Funciile returneaz un pointer la irul rezultat dest.
Nume
strcmp - compar dou iruri de caractere
Declaraie
int strcmp(const char *s1, const char *s2);
Descriere
Funcia strcmp compar cele dou iruri s1 i s2.
Valoare returnat
Funcia returneaz un ntreg mai mic dect, egal cu, sau mai mare
dect zero dac s1 este mai mic dect, coincide, respectiv este mai
mare dect s2.
Nume
strchr, strrchr - localizeaz un caracter
Declaraie
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
Descriere
Funcia strchr returneaz un pointer la prima apariie a
caracterului c n irul s.
Funcia strrchr returneaz un pointer la ultima apariie a
caracterului c n irul s.
___________________________________________________________________________________________________________________________
165
Valoare returnat
Funciile returneaz un pointer la caracterul gsit sau NULL dac
valoarea nu a fost gsit.
Nume
strstr - localizeaz un subir
Declaraie
char *strstr(const char *sir, const char *subs);
Descriere
Funcia strstr gsete prima apariie a subirului subs n
irul sir. Caracterul terminator null nu este luat n considerare.
Valoare returnat
Funcia returneaz un pointer la nceputul subirului, sau NULL
dac subirul nu este gsit.
Nume
strspn, strcspn - caut un set de caractere ntr-un ir
Declaraie
unsigned strspn(const char *s, const char *acc);
unsigned strcspn(const char *s, const char *rej);
Descriere
Funcia strspn determin lungimea segmentului iniial din s
format n ntregime numai cu caractere din acc.
Funcia strcspn determin lungimea segmentului iniial din s
format n ntregime numai cu caractere care nu se gsesc n rej.
Valori returnate
Funcia strspn returneaz poziia primului caracter din s care
nu se afl n acc.
Funcia strcspn returneaz poziia primului caracter din s care
se afl n rej.
___________________________________________________________________________________________________________________________
166
Nume
rand, srand - generarea numerelor pseudo-aleatoare
Declaraie
int rand(void);
void srand(unsigned int seed);
Descriere
Funcia rand returneaz un ntreg pseudo-aleator ntre 0 i
RAND_MAX (pentru majoritatea mediilor de programare C aceast
constant este egal cu valoarea maxim cu semn reprezentabil pe
un cuvnt al sistemului de calcul).
Funcia srand iniializeaz generatorul cu valoarea seed
pentru o nou secven de valori ntregi pseudo-aleatoare care vor fi
returnate de rand. Aceste secvene se repet dac srand se
apeleaz cu aceeai valoare seed.
Se obinuiete ca generatorul s fie iniializat cu o valoare dat
de ceasul sistemului de calcul, ca n exemplul de mai jos:
#include <time.h>
srand(time(NULL));
Valoare returnat
Funcia rand returneaz o valoare ntre 0 i RAND_MAX.
Observaie
n lucrarea Numerical Recipes in C: The Art of Scientific
Computing - William H Press, Brian P Flannery, Saul A Teukolsky,
William T Vetterling / New York: Cambridge University Press, 1990
(1st ed, p 207), se face urmtorul comentariu:
Dac dorii s generai o valoare aleatoare ntreag ntre 1 i
10, se recomand s folosii secvena
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
i nu o secven de tipul
j=1+(int)(1000000.0*rand())%10;
care folosete biii de rang inferior.
___________________________________________________________________________________________________________________________
167
arctg(y/x) n [,]
___________________________________________________________________________________________________________________________
168
double
double
double
double
double
double
double
double
exp(double x); ex
log(double x); ln(x)
pow(double x, double y);
sinh(double x); sinh(x)
cosh(double x); cosh(x)
tanh(double x); tgh(x)
ldexp(double x, int e);
fmod(double x, double y);
xy
x 2e
x modulo y
Funcia time
Data i ora calendaristic se reprezint n format compact printr-o
valoare de tip time_t. Majoritatea mediilor de programare definesc
___________________________________________________________________________________________________________________________
169
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
/* secunde, ntre 0 i 59 */
/* minute, ntre 0 i 59 */
/* ore, ntre 0 i 23 */
/* ziua din lun, ntre 1 i 31 */
/* luna, ntre 0 i 11 */
/* anul curent minus 1900 */
/* ziua din sptmn, duminica: 0 */
/* ziua din an, ntre 0 i 365 */
/* opiunea daylight saving time */
170
Funcia clock
clock_t clock(void);
Funcia clock returneaz o aproximare a timpului pe care
procesorul l-a folosit pentru program pn la momentul apelului.
Tipul clock_t este definit de majoritatea mediilor de programare
___________________________________________________________________________________________________________________________
171
Nume
system execut o comand a interpretorului de comenzi
Declaraie
system(char *com);
___________________________________________________________________________________________________________________________
172
Descriere
Funcia system execut comanda com
interpretorului de comenzi cu acest parametru.
prin
lansarea
173
v=rand()%M;
p=(int *)bsearch(&v,X,n,sizeof(int),cmp);
if (p)
printf("Val: %d
Pos: %d\n",v,p-X);
}
free(X);
return 0;
}
174
175
na+=NA;
El=(StEl *)realloc(El,na*sizeof(StEl));
}
}
fclose(fi);
qsort(El,ne,sizeof(StEl),comp);
for (i=0; i<ne; i++)
printf("%-12s %c%6.2lf\n",El[i].nm,
El[i].ar,El[i].md);
free(El);
return 0;
}
176
}
fi=fopen(av[1],"rt");
if (!fi) {
perror("Eroare la deschidere");
return 1;
}
fscanf(fi,"%d %s",n,s);
l=strlen(s);
C=(char *)malloc((l+1)*n);
strcpy(C,s);
for (i=1; i<n; i++)
fscanf(fi,"%s",C+(l+1)*i);
fclose(fi);
qsort(C,n,l+1,comp);
for (i=0; i<n; i++)
printf("%s\n",C+(l+1)*i);
free(C);
return 0;
}
___________________________________________________________________________________________________________________________
177
___________________________________________________________________________________________________________________________
178
Cuprins
1. Generaliti asupra limbajului C . . . . . . . . . . . . . . . . . . . .
1.1. Introducere. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Reprezentarea valorilor numerice . . . . . . . . . . . . . . . . . . . . . .
1.3. Primele programe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
5
6
14
14
15
17
18
18
3. Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
21
23
26
27
30
30
32
4. Operatori i expresii . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
33
35
37
38
39
41
42
43
44
44
5. Instruciuni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
46
46
47
49
___________________________________________________________________________________________________________________________
179
49
51
53
55
55
6. Funcii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
57
59
61
62
63
67
67
68
70
70
8. Pointeri i masive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
76
78
79
81
83
84
87
91
94
98
102
106
109
111
115
117
123
127
129
___________________________________________________________________________________________________________________________
180
133
135
138
140
143
148
150
152
156
157
158
160
162
166
168
171
172
Bibliografie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
___________________________________________________________________________________________________________________________
181