Sunteți pe pagina 1din 253

Conf. dr. ing.

ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Prefat-a
7
Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


Aceast| carte se adreseaz| celor interesaÛi în a p|trunde "spiritul" limbajului C. MulÛi
SudenÛii
dintre ceiparticipanÛi
care au înva la7 t-orice form|
at acest de înv|Û|mânt
limbaj au ajuns sasuperior bugetar
7 -l cunoasca 7 din cpot
|rÛimultiplica acest
care prezentau
documentde
exemple pentru uzul personal.
tipul numeric sau grafic, îns| Brian W. Kernighan Õi De nn is M . Ritchie ,
atunci când au inventat limbajul C, aveau în minte un singur lucru: punerea la punct a
unui limbaj
SudenÛii care s| permit
participanÛi la orice| scrierea unui
form| de sistem decu
înv|Û|mânt operare cu efort
plat| sau minim. Toat
alte persoane | istoria
doritoare
limbajului C Õidocumentul
pot multiplica multe dintre ciud|Û
numai eniilecost
contra lui sunt
Õi cu strâns
acordullegate deautorului.
scris al sistemul de În operare
acest
UNIX. Portarea lui sub
scop m| puteÛi contact| la: sistemul de operare DOS, dup | umila mea p | rere, unul dintre
cele mai slabe sisteme de operare scrise pe aceast| planet|, a încurcat lucrurile Õi mai
mult.
ANTAL Tiberiu Alexandru
tel.:
Cartea 0040-264-530918
prezint| numai C standard. Majoritatea firmelor produc|toare de compilatoare
e-mail:
ader| laantaltiberiu@pcnet.ro
acest standard dar asigur|, în plus, o mulÛime de facilit|Ûi care pot fi cunoscute
numai prin citirea documentaÛiei de firm| a compilatorului. Lucrarea s-a n|scut ca un
protest împotriva celor care au folosit C f|r| a citi "THE C PROGRAMMING
LANGUAGE, SECOND EDITION" a lui Brian W. Kernighan Õi Dennis M. Ritchie
respectiv standardul ANSI ajungând s|-l aplice în domenii în care alte limbaje de
programare îi sunt net superioare. Pentru cei interesaÛi în calculul numeric ANEXA 1
prezint
Conf. dr. | avantajele
ing. ANTAL actuale b|trânului FORTRAN faÛ| de C. Sintaxa limbajului C nu
ale Alexandru
Tiberiu
este una academic | , iar C nu
Universitatea Tenhic| din Cluj-Napoca este nici m|car un limbaj de programare de nivel înalt. Celor
care doresc s| înveÛe un limbaj în care reguli stricte duc la formarea unei gândiri ordonate
Facultatea
le recomand ConstrucÛii de MaÕini
limbajele Pascal Õi Ada.
Catedra de Mecanic| Õi Programare
Curs
De ce,de limbaj
totu C | carte? Numai din experienÛa trecerii prin "labirintul" acestui limbaj
Õi, aceast
putem înÛelege capcanele program|rii Õi "imperfecÛiunile maÕinii" pe care ruleaz|
programele
Copyright 2001. noastre.
Toate de alt| parte,
Pedrepturile sunt toate limbajele
rezervate actuale de nivel înalt, produse de
autorului.
proiectare asistat| sau sisteme de gestionare a bazelor de date au interfeÛe cu C pentru
aMultiplicarea
oferi posibilitatea
acestuiscrierii unorîn
document mici rutine
scop la nivel
comercial "asamblare" necesare optimiz|rii
deinterzis|.
este
unor aplicaÛii mai delicate.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Publicarea acestei ca7 rt-i se datoreaza7 prietenilor s- i cunoscut-ilor care în fazele de concept-ie,
document pentru uzul personal.
corectura7 s- i publicare a manuscrisului m-au sprijinit financiar s- i sufletes- te. Printre cei
care au avut contribut-ii esent-iale îi amintesc pe: Horea Ca7 lin HOREA, Tony WILLOWS,
SudenÛii
Ioana Carmen participanÛi
ÚICO, la orice
Ovidiuform| de înv|Û|mânt
T{TARU, Mihai cu plat| sau alte
DAMIAN. persoane
Copert doritoare
-ile sunt lucra7 rile
pot multiplica
artistului documentul
plastic clujean Marin numaiLESCHIAN. Õi cu acordul
contra cost"POARTA" s- i "CRISALIDA"
scris al autorului. 7 într-o
În acest
prezinta
forma
scop m| 7 grafica
puteÛi7 progresul,
contact| la: cons- tientizarea prezentului, trecerea de la concret la abstract,
trasformarea celui care îndra7 znes- te sa7 caute eternitatea, dincolo de frumuset-ea treca7 toare
aANTAL
clipei. Tiberiu Alexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Cluj, 21. I. 2001


Conf. dr. ing. ANTAL Tiberiu Alexandru ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
7 rint-ilor mei.
Pa
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Cuprins
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

6
Cuprins
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Cuprins
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
1 Introducere în funct- ionarea calculatoarelor . . . . . . . . . . . . . . . . . . . 10
SudenÛii1.1participanÛi
Ciclul "fetchla s-orice
i execute"
form|.de . . .înv|Û|mânt
. . . . . . . . . .cu. . plat|
. . . . .sau
. . . alte
. . . .persoane
. . . . . . . .doritoare
. . . . . . . 10
1.2 Evenimente
pot multiplica documentul asincrone
numai .contra . . . . . .cost
. . . Õi
. . cu
. . .acordul
. . . . . . .scris
. . . . al
. . autorului.
. . . . . . . . . .În
. . acest
. . . . 12
1.3 Algoritm, date
scop m| puteÛi contact| la: -
s i program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4 Despre limbajele de programare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
ANTAL Tiberiu 1.4.1 Gramatica formala7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Alexandru
1.4.2 Scheme sintactice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
tel.: 0040-264-530918
e-mail:
2 Scurta antaltiberiu@pcnet.ro
7 istorie s- i descriere a elementelor limbajului C . . . . . . . . . . . . . 19
2.1 Caracteristicile limbajului C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2 Standarde C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.3 Ce a rezolvat standardizarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4 Elemente de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5 Primul program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.6ing.
Conf. dr. main()
ANTAL . . . .Tiberiu
. . . . . . .Alexandru
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.7 printf() . . . . . . . .
Universitatea Tenhic| din Cluj-Napoca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.8 return() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic|
3 Variabile, tipuri de Õi Programare
date s- i constante . . . . . . . . . . . . . . . . . . . . . . . 27
Curs de3.1limbaj C
Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2 Tipuri de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Copyright 2001. 3.2.1 Tipuri
Toate simple sunt
drepturile . . . . .rezervate
. . . . . . . .autorului.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.1.1 Tipul void . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Multiplicarea acestui3.2.1.2document Tipuri întregi
în scop . . . . . . este
comercial . . . .interzis|.
. . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.1.3 Tipuri reale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
SudenÛii3.3participanÛi
Constante la. .orice
. . . . form|
. . . . . .de
. . .înv|Û|mânt
. . . . . . . . . .superior
. . . . . . . bugetar
. . . . . . . pot
. . . .multiplica
. . . . . . . . .acest
. . 34
3.3.1 Constante numerice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
document pentru uzul personal.
3.3.1.1 Constante întregi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.1.2 Constante reale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
SudenÛii participanÛi 3.3.1.3
la oriceConstante
form| de înv|Û|mânt
caracter . . .cu . . plat|
. . . . .sau
. . . alte
. . . .persoane
. . . . . . . . doritoare
. . . . . . . 35
pot multiplica documentul 3.3.1.4numaiConstanta contra s- ircost Õi cu acordul
de caractere . . .scris
. . . . al
. . autorului.
. . . . . . . . . .În
. . acest
. . . . 36
scop m| puteÛi3.3.2 Constante
contact| la: cu nume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.3 Constante ale preprocesorului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
ANTAL Tiberiu 3.3.4 Constante enumerate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Alexandru
tel.: 0040-264-530918
4 Operatori
e-mail: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
antaltiberiu@pcnet.ro
4.1 Operatorul de atribuire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2 Operatori aritmetici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2.1 Conversii la utilizarea operatorilor aritmetici . . . . . . . . . . . . . . . . . 42
4.3 Operatorii de incrementare s- i decrementare . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.4 Valori de adeva7 r în C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
7
Cuprins
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
4.5 Operatori
Facultatea ConstrucÛii de-ionali
relat MaÕini. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.6 Operatori logici .................................................
Catedra de Mecanic| Õi Programare 47
4.7 Operatori pe bit-i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Curs de4.8
limbaj C
Atribuirea compusa7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.9 Operatorul sizeof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Copyright
4.102001. Toate drepturile
Operatorul de evaluare sunt rezervate
secvent -iala7 .autorului.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.11 Operatorul expresie condit-ionala7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Multiplicarea acestui -document
4.12 Precedent a operatorilor în scop . . comercial
. . . . . . . . . este
. . . .interzis|.
. . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.13 Asociativitatea operatorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.14
SudenÛii Tabel cu precedent
participanÛi la orice form| -a s- i asociativitatea
de înv|Û|mânt operatorilor
superior bugetar C . . .pot. . .multiplica
. . . . . . . . .acest
. . 56
4.15 Expresia . . . .
document pentru uzul personal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

5 Instruct- iunile limbajului C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61


SudenÛii5.1participanÛi la orice
Instruct-iunea form|s- ide
expresie înv|Û|mânt
blocul . . . . . . .cu
. . plat|
. . . . .sau
. . . alte
. . . .persoane
. . . . . . . .doritoare
. . . . . . . 61
pot multiplica documentul numai contra cost Õi
5.2 Instruct-iunea if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .În
cu acordul scris al autorului. . . acest
. . . . 62
scop m|5.3puteÛi contact|
Instruct-iuneala:
switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.4 Instruct-iuni de ciclare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
ANTAL Tiberiu 5.4.1 Instruct-iunea de ciclare while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Alexandru
5.4.2 Instruct-iunea de ciclare do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
tel.: 0040-264-530918
5.4.3 Instruct-iunea de ciclare for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
e-mail: antaltiberiu@pcnet.ro
5.5 Instruct-iunea break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.6 Instruct-iunea continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.7 Instruct-iunea goto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

6 Funct- ia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.1 Apelul funct-iilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Conf. dr.
6.2ing. ANTAL
Definirea unei funct-ii
Tiberiu Alexandru
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
6.2.1 Definirea
Universitatea Tenhic| unei funct-ii - exemplu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
din Cluj-Napoca
6.3 Apelul
Facultatea de funct
ConstrucÛii de-MaÕini
ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.3.1 Conversii
Catedra de Mecanic| Õi Programare aritmetice standard la apelul de funct-ii . . . . . . . . . . . . . 79
Curs de limbaj C6.3.2 Apelul unei funct-ii - exemplu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.4 Prototipuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.5 Parametrii funct-iilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Copyright 2001. Toate drepturile sunt rezervate autorului.
6.6 Ordinea evalua7 rii argumentelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.7 Transferul prin valoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Multiplicarea acestuiexterne
6.8 Variabile document sauîn scop comercial
variabile globale este . . . .interzis|.
. . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.8.1 Vizibilitatea (scope) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
SudenÛii participanÛi la orice
6.8.2 Declarat -iaform|
s- i definit
de -înv|Û|mânt
ia . . . . . . . .superior
. . . . . . . bugetar
. . . . . . . .pot
. . .multiplica
. . . . . . . . .acest
. . 87
document6.9 pentru
Stiva . .uzul
. . . .personal.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.9.1 Stiva s- i limbajul C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.9.2 Exemplu
SudenÛii participanÛi la orice de form| lucru decu stiva . . . .cu
înv|Û|mânt . . plat|
. . . . .sau
. . . alte
. . . .persoane
. . . . . . . .doritoare
. . . . . . . 89
6.10 Organizarea
pot multiplica documentul memoriei
numai contra pentrucost programele
Õi cu acordul scris-ie
în execut . . . . . . . . . .În
al autorului. . . acest
. . . . 90
6.11 Durata de
scop m| puteÛi contact| la: existent - 7
a sau persistent - a variabilelor . . . . . . . . . . . . . . . . . . . . . 91
6.11.1 Durata de existent-a7 auto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.11.2 Durata de existent-a7 static . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
ANTAL Tiberiu Alexandru
6.11.3 Durata de existent-a7 register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
tel.: 0040-264-530918
6.12 Tipuri de legare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.12.1 Legarea s- i modulele de program - un exemplu comentat . . . . . . 94
e-mail: antaltiberiu@pcnet.ro
6.12.2 Legarea s- i duratele de existent-a7 ale variabilelor . . . . . . . . . . . . . 96
6.13 Recursivitatea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

7 Preprocesarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

8
Cuprins
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
8 Poantori
Catedra . . . . . Õi. Programare
de Mecanic| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
8.1 Declararea poantorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Curs de8.2
limbaj C
Operatorul adresa7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
8.3 Operatorul de indirectare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Copyright 2001.
8.4 Ce Toate
este NULL drepturile
? . . . . . sunt
. . . . .rezervate
. . . . . . . .autorului.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
8.5 Poantorii s- i argumentele funct-iilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
8.6 Funct
Multiplicarea -ii cu numa
acestui 7 r variabil
document în scop de comercial
parametrieste . . .interzis|.
. . . . . . . . . . . . . . . . . . . . . . . . . 114
8.7 Poantori la poantori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
SudenÛii8.8participanÛi
Poantori lalafunct -ii form|
orice . . . . . .de
. . .înv|Û|mânt
. . . . . . . . . .superior
. . . . . . . bugetar
. . . . . . . pot
. . . .multiplica
. . . . . . . . .acest
. 117
document pentru uzul personal.
9 Tablouri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
9.1 Declararea tablourilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
SudenÛii9.2participanÛi
Accesul la la orice form|
elementele de detablouînv|Û|mânt
. . . . . . .cu
. . plat|
. . . . .sau
. . . alte
. . . .persoane
. . . . . . . .doritoare
. . . . . . 121
pot multiplica documentul numai contra cost Õi
9.3 Operatorul de indexare al tablourilor . . . . . . . . . . . . . . . . . . . . . . . . .În
cu acordul scris al autorului. . . acest
. . . 122
scop m|9.4puteÛi contact|
Conversia la:
numelor de tablouri în poantori . . . . . . . . . . . . . . . . . . . . . . . . . . 122
9.5 Calculul pozit-iei s- i a valorii celui de al i-elea element de tablou . . . . . . . . . 123
ANTAL 9.6Tiberiu
Aritmetica poantorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Alexandru
9.7 Tablouri multidimensionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
tel.: 0040-264-530918
e-mail:9.8 Transferul tablourilor s- i funct-iilor ca parametri de funct-ie . . . . . . . . . . . . 129
antaltiberiu@pcnet.ro
9.8.1 Transferul unui tablou unidimensional . . . . . . . . . . . . . . . . . . . . . 129
9.8.2 Transferul unui tablou unidimensional prin poantor . . . . . . . . . . 130
9.8.3 Operatorii * s- i ++ la poantori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
9.8.4 Transferul unui tablou bidimensional . . . . . . . . . . . . . . . . . . . . . . . 132
9.8.5 Care notat-ie o folosim? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
9.9 Ôiruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Conf. dr. ing. ANTAL Tiberiu în
9.9.1 Atribuirea cazul de s- iruri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Alexandru
9.9.2 Sortarea
Universitatea Tenhic| alfabetica7 a s- irurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
din Cluj-Napoca
de MaÕini s- irurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
9.9.3 Concatenarea
Facultatea ConstrucÛii
Catedra de Mecanic| Õis-Programare
9.10 Poantori la iruri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Curs de limbaj C9.10.1 Considerat -ii despre cres- terea vitezei programelor . . . . . . . . . . 139
9.10.2 Tablouri de poantori la s- iruri . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Copyright 2001. Toate drepturile sunt rezervate autorului.
10 Structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
10.1 Operatorul de select-ie a unui membru de structura7 . . . . . . . . . . . . . . . . . 144
Multiplicarea acestui-document
10.2 Comparat în scop
ie între tablou comercial
s- i structura 7 . este
. . . .interzis|.
. . . . . . . . . . . . . . . . . . . . . . . . . 146
10.3 Atribuirea structurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
SudenÛii participanÛi
10.4 Transferul lavariabilelor
orice form| de de tipul
înv|Û|mânt
structura 7 ca parametri
superior bugetarde potfunct -ii . . . . .acest
multiplica . 147
document10.5pentru
Poantori
uzullapersonal.
structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
10.5.1 De ce (*p).membru? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
10.5.2 Utilizarea
SudenÛii participanÛi lui p->membru
la orice form| de înv|Û|mânt . . .cu
. . plat|
. . . . .sau
. . . alte
. . . .persoane
. . . . . . . . doritoare
. . . . . . 149
pot multiplica10.5.3 Problema
documentul transferului
numai contra cost prinÕi cupoantor
acordul. .scris. . . . al
. . autorului.
. . . . . . . . . .În
. . acest
. . . 150
10.6 Întoarcerea
scop m| puteÛi contact| la: unei valori structura 7 de ca7 tre o funct - ie . . . . . . . . . . . . . . . . . 151
10.7 Crearea unei liste înla7 nt-uite prin folosirea structurilor . . . . . . . . . . . . . . 153
10.7.1 Parcurgerea listei simplu înla7 nt-uite . . . . . . . . . . . . . . . . . . . . . . . 155
ANTAL Tiberiu
10.8 Alexandru
Instruct-iunea typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
tel.: 0040-264-530918
10.9 Tipul de data7 union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
e-mail:10.10 Câmpuri de bit-i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
antaltiberiu@pcnet.ro

11 Considerat- ii privind stilul de programare în limbajul C - generalizarea sorta7 rii

9
Cuprins
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
prinConstrucÛii
Facultatea inserare directa 7 cu ajutorul poantorilor la funct- ii . . . . . . . . . 160
de MaÕini
11.1 Terminologie -
s i -ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
notat
Catedra de Mecanic| Õi Programare
11.2 Sortarea prin inserare directa7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Curs de11.3
limbaj C
Implementarea algoritmului de sortare . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
11.4 Sa7 revenim la problema init-iala7 ... poantorii la funct-ii . . . . . . . . . . . . . . . . 163
Copyright 2001. Toate drepturile sunt rezervate autorului.
12 Operat- ii de intrare/ies- ire în C . . . . . . . . . . . . . . . . . . . . . . . . . . 171
12.1 Funct
Multiplicarea -ii dedocument
acestui ies- ire pe stdout
în scop .comercial
. . . . . . . . este
. . . .interzis|.
. . . . . . . . . . . . . . . . . . . . . . . . . 173
12.2 Funct-ii de intrare de pe stdin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
SudenÛii12.3 Funct-ii pentru
participanÛi la orice operat
form| -ii cu - iere . . . . .superior
de fis
înv|Û|mânt . . . . . . . bugetar
. . . . . . . pot
. . . .multiplica
. . . . . . . . .acest
. 180
12.3.1 Deschiderea
document pentru uzul personal. fis- ierelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
12.3.2 Scrierea datelor într-un fis- ier . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
12.3.3 Citirea s- i afis- area datelor dintr-un fis- ier . . . . . . . . . . . . . . . . . . . 183
SudenÛii participanÛi
12.4 la orice
Fis- iere ASCII form|
- iere de
s- i fis înv|Û|mânt
binare în C . . .cu . . plat|
. . . . .sau
. . . alte
. . . .persoane
. . . . . . . . doritoare
. . . . . . 185
pot multiplica12.4.1
documentul Õi
Pozit-ionarea în fis- ierele binare . . . . . . . . . . . . . . . . . . . . . .În
numai contra cost cu acordul scris al autorului. . . acest
. . . 186
scop m|12.5
puteÛi contact|
Lucrul la:
cu înregistra 7 ri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
12.6 Citirea parametrilor din linia de comanda7 . . . . . . . . . . . . . . . . . . . . . . . . . 192
ANTAL Tiberiu Alexandru
13
tel.: Alocarea dinamica7 a memoriei . . . . . . . . . . . . . . . . . . . . . . . . . 197
0040-264-530918
13.1 Funct -ii pentru alocarea dinamica7 a memoriei . . . . . . . . . . . . . . . . . . . . . . 198
e-mail: antaltiberiu@pcnet.ro
13.2 Alocarea dinamica7 a memoriei pentru vectori . . . . . . . . . . . . . . . . . . . . . . 199
13.3 Alocarea dinamica7 a memoriei pentru matrice . . . . . . . . . . . . . . . . . . . . . . 203
13.4 Structuri dinamice de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

14 Biblioteca C Standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213


14.1 <assert.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Conf. dr. ing.
14.2 ANTAL Tiberiu
<ctype.h> . . . . . .Alexandru
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
14.3 <float.h>
Universitatea . . .Cluj-Napoca
Tenhic| din . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
14.4 ConstrucÛii
Facultatea <limits.h>de. .MaÕini
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
14.5 <math.h> . . .
Catedra de Mecanic| Õi Programare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Curs de limbaj C14.5.1 Funct - ii trigonometrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
14.5.2 Funct-ii exponent-iale s- i logaritmice . . . . . . . . . . . . . . . . . . . . . . . . 216
14.5.3 Cel mai apropiat întreg, valoare absoluta7 , resturi . . . . . . . . . . . 216
Copyright 2001. Toate drepturile sunt rezervate autorului.
14.5.4 Tratarea condit-iilor de eroare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
14.6 <setjmp.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Multiplicarea acestui document
14.7 <signal.h> . . . . . . .în. . scop
. . . . comercial
. . . . . . . . . este
. . . .interzis|.
. . . . . . . . . . . . . . . . . . . . . . . . . 218
14.8 <stdarg.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
SudenÛii participanÛi
14.9 <stdio.h>la .orice
. . . . form|
. . . . . .de
. . .înv|Û|mânt
. . . . . . . . . .superior
. . . . . . . bugetar
. . . . . . . pot
. . . .multiplica
. . . . . . . . .acest
. 219
document pentru 14.9.1 Constante
uzul personal.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
14.9.2 Funct-ii pentru operat-ii cu fis- iere . . . . . . . . . . . . . . . . . . . . . . . . . 221
14.9.3 Funct
SudenÛii participanÛi -ii pentru
la orice form| de ies- ire cu format
înv|Û|mânt cu. plat|
. . . . .sau
. . . alte
. . . .persoane
. . . . . . . .doritoare
. . . . . . 222
pot multiplica14.9.4 Funct-iinumai
documentul pentru intrare
contra costcuÕiformat
cu acordul . . . . .scris
. . . . al
. . autorului.
. . . . . . . . . .În
. . acest
. . . 224
14.9.5 Funct
scop m| puteÛi contact| la: - ii de intrare/ies - ire la nivel de caracter . . . . . . . . . . . . . . . . 225
14.9.6 Funct-ii de intrare/ies- ire directe . . . . . . . . . . . . . . . . . . . . . . . . . . 226
14.9.7 Funct-ii de pozit-ionare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
ANTAL Tiberiu Alexandru
14.9.8 Funct-ii pentru tratarea erorilor . . . . . . . . . . . . . . . . . . . . . . . . . . 227
tel.: 0040-264-530918
14.10 <stdlib.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
e-mail:14.11
antaltiberiu@pcnet.ro
<string.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
14.12 <time.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

10
Cuprins
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Bibliografie . . . . . .de. MaÕini
Facultatea ConstrucÛii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Catedra de Mecanic| Õi Programare
ANEXA C 7 comparat- ie C - FORTRAN . . . . . . . . . . . . . . . . . . 243
1 - Scurta
Curs de limbaj

ANEXA
Copyright22001.
- Citirea - iilor
Toatedeclarat
drepturile C rezervate
sunt . . . . . autorului.
. . . . . . . . . . . . . . . . . . . . 246

Glosar . . . .acestui
Multiplicarea . . . .document
. . . . . . în
. .scop
. . comercial
. . . . . . este
. . .interzis|.
. . . . . . . . . . . . . . . . 252

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

11
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini "C este un limbaj ambiguu s- i us- or subcultural."
Catedra de Mecanic| Õi Programare Horea Ca7 lin HOREA
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

1 Introducere în funct-ionarea
Multiplicarea acestui document în scop comercial este interzis|.

calculatoarelor
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

C
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
ând veÛdocumentul
pot multiplica
în lumea
i începe a citinumai
mentalului,
scop m| puteÛi contact| la:
acestecontra
iar
rânduri
dispozi Ûia
trebuie
cost
voastr |
| ÕtiÛi c|scris
Õi cu sacordul
trebuie s |
este al
fie
vorba
corespunz
a înv|Ûa un limbaj de programare sau a scrie programe într-un limbaj de programare
trebuie s| aveÛi m|car habar de cum funcÛioneaz| calculatorul pe care-l veÛi utiliza. Ceea
|
o c|acest
despre În
autorului.
toare.
l|torie
Pentru

ANTAL
ce urmeaz Tiberiu
| este oAlexandru
sumar| introducere în lumea funcÛion|rii sistemelor de calcul. Ar fi bine
tel.: 0040-264-530918
s| nu v| cramponat-i în detalii Õi s| v| concentraÛi asupra ideilor mari. Foarte probabil c|
veÛi în
e-mail:
nu Ûelege tot, dar asta nu e important; treceÛi mai departe, iar dac| veÛi simÛi nevoia
antaltiberiu@pcnet.ro
s| v| delectaÛi mai pe larg cu acest subiect, exist| c|rÛi suficiente despre hardware Õi
sisteme de operare.

1.1 Ciclul "fetch s- i execute"


Un
Conf.calculator este un sistem
dr. ing. ANTAL Tiberiu complex format din multe componente. Inima, sau mai bine
Alexandru
zis, creierul calculatorului este
Universitatea Tenhic| din Cluj-Napoca Unitatea Central| de Prelucrare sau UCP (Central
Facultatea ConstrucÛiiProcessing
de MaÕini Unit sau CPU), singura care poate executa calcule
împreun
Catedra de Mecanic| Õi Programare | cu instrucÛiuni Õi care controleaz| celelalte componente
Curs de limbaj C ale sistemului de calcul. Unitatea Aritmetic| Õi Logic| (Arithmetic
and Logic Unit sau ALU) este o parte a UCP care poate realiza
operaÛii de tipul aritmetic cu întregi (adunare, sc|dere, înmulÛire
Copyright 2001. Toateetc.), drepturile
operaÛiisunt
pe birezervate autorului.
Ûi sau booleene. OperaÛiile în virgul| flotant| sunt
în general realizate de o componenta7 separat|, care poate face parte
Multiplicarea acestui din document
UCP sauîn scop comercial
nu, numit este interzis|.
| "unitate pentru calcule în virgul| flotant|"
UCP sub forma unui (Floating Point Unit sau FPU). O alt| parte a UCP este unitatea de
circuit integrat
SudenÛii gestionare
participanÛi la orice form|a memoriei
de înv|Û|mânt(Memory Management
superior bugetar potUnit sau MMU)
multiplica acest
folosit
document| pentru
pentrucalcularea adreselor. EvoluÛia tehnologiei Õi a conceptelor de proiectare
uzul personal.
a permis ca în calculatoarele moderne UCP s| fie “îngr|m|dit”, împreun| cu FPU Õi
MMU,
SudenÛiipeparticipanÛi
un singur circuit
la oriceintegrat.
form| deAcesta are sarcina
înv|Û|mânt cu plat|desau
a executa programele
alte persoane s- i se
doritoare
numes - te microprocesor.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact|
Un program este o listla:| de instrucÛiuni care sunt executate mecanic de UCP.
InstrucÛiunile înÛelese de UCP sunt foarte simple, iar limbajul în care se scriu poart|
ANTAL
denumirea Tiberiu Alexandru
de lim 7 . Fiecare calculator are propriul limbaj maÕin| Õi poate
b aj m as- ina
programe numai dac| acestea au fost scrise în propriul lui limbaj maÕin|. Un
tel.: 0040-264-530918
executa
program scris într-un limbaj maÕin| diferit se poate executa numai dup| traducerea lui
e-mail: antaltiberiu@pcnet.ro
în cel cunoscut de UCP pe care se va executa.

Când UCP execut| un program, programul trebuie s| fie stocat în m em oria principala7
a sistemului de calcul, adesea numit| Õi RAM (Random Access Memory). Pe lâng|

12
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca
instruc Ûiuni,ConstrucÛii
Facultatea conÛine Õi date care vor fi prelucrate de programul în sine.
programuldevaMaÕini
Memoria principal | este
Catedra de Mecanic| Õi Programare format| dintr-o secvenÛ| de locat- ii . Aceste locaÛii sunt
numerotate, iar num|rul de ordine al fiec|rei locaÛii este unic Õi se numeÕte adresa7 .
Curs
Adresa de este
limbaj oCmodalitate de a stoca sau a extrage o informaÛie particular| dintre
miliardele de informaÛii stocate în memorie. Când trebuie s| acceseze o informaÛie
Copyright
particular|2001. , cum Toate
ar fi odrepturile
instrucÛiunesuntsaurezervate autorului.
o dat|, UCP va transmite memoriei principlale
adresa la care se afl| informaÛia dorit| sub forma unor semnale electrice. Memoria va
|spunde prinacestui
rMultiplicarea trimiterea înapoi în
document a datei stocate spre
scop comercial esteUCP la adresa primit| anterior de
interzis|.
la acesta. UCP poate stoca Õi date în memoria principal| prin specificarea simultan| a
adresei
SudenÛiilaparticipanÛi
care se va face form|Õidea datei
stocarea
la orice de stocat.
înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
DeÕi la nivelul limbajului maÕin| operaÛiile care pot fi executate de UCP sunt elementare
Õi simple (adunare, sc|dere, comparaÛie, etc.), intern UCP va funcÛiona dup| o schem|
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
foarte complex| pentru cazul execuÛiei anumitor operaÛii. InstrucÛiunile sunt stocate în
pot
memoriamultiplica documentul
principal | sub formanumai contra
unei secven Ûe Õi
cost decu acordul
instruc Ûiuniscris al autorului.
în limbajul În de
maÕinii acest
unde
scop m| puteÛi contact| la:
sunt în mod ciclic extrase Õi executate. Acest proces repetat de citire Õi execuÛie a
instrucÛiunilor se numeÕte “fetch-and-execute cycle” adic| ciclu de extragere Õi execuÛie
instrucÛTiberiu
aANTAL Cu o singur| excepÛie care va fi l|murit| mai târziu, aceasta este tot ceea
iunilor. Alexandru
ce
tel.:face UCP.
0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Detaliile ciclului de extracÛie Õi execuÛie sunt de asemenea caracteristice fieca7 rui UCP în
parte, dar exist| Õi caracteristici comune. Orice UCP conÛine regis- tri interni care sunt
zone de memorie de dimensiune mic|, ce pot stoca un singur num|r sau o instrucÛiune
maÕin|. O parte din regiÕtrii UCP au utiliz|ri speciale. De exemplu, registrul num|r|tor
de program (Program Counter sau PC) va stoca locul din memorie la care se afl| UCP în
timpul execuÛiei unui program. PC-ul va stoca adresa urm|toarei instrucÛiuni din program
Conf. dr. ing.7 ANTAL
care urmeaza Tiberiu
a fi executata Alexandru
7 . La începutul fiec|rui ciclu de extragere-execuÛie UCP va
folosi conÛinutul
Universitatea registrului
Tenhic| PC pentru a afla care este urm|toarea instrucÛiune de extras.
din Cluj-Napoca
În timplu ciclului
Facultatea de extrac
ConstrucÛii Ûie Õi execuÛie, num|rul stocat în PC este actualizat pentru a
de MaÕini
stoca adresa instruc Ûiunii
Catedra de Mecanic| Õi Programare care va fi executat| în urm|torul ciclu. (În mare parte din cazuri
aceasta se afl
Curs de limbaj C | chiar la adresa urm|toare).

UCP este format din milioane de tranzistori sunt interconectaÛi pe o singur| aÕchie
careautorului.
Copyright 2001. Toate drepturile sunt rezervate
de siliciu (numit| "chip" în englez|). Tranzistorii sunt puÕi în circuite care au dou| st|ri
electrice distincte Õi stabile de pornit Õi oprit, între care pot comuta, motiv pentru care
Multiplicarea
aceste st|ri seacestui
pot pune document în scop Û|
în coresponden comercial estebinare
cu valorile interzis|.
de 1 Õi 0. Pe m|sur| ce UCP
calculeaz|, st|rile tranzistorilor se modific|, rezultând un spaÛiu de st|ri determinat de
SudenÛii
modul departicipanÛi
conectare alatranzistorilor
orice form| deÕi de instrucÛiunea
înv|Û|mânt superior bugetar pot
din program caremultiplica |.
se executacest
document pentru uzul personal.
InstrucÛiunile limbajului maÕin| se prezint| sub forma unor numere binare (secvenÛe de
Õi 0). Fiecare
1SudenÛii instruc
participanÛi laÛiune
oriceare o secven
form| Û| particular
de înv|Û|mânt | de 0sau
cu plat| Õi 1. Datele
alte pe care
persoane UCP le
doritoare
manipuleaz
pot multiplica| sunt Õi ele codificate
documentul sub form
numai contra | binar
cost Õi cu |acordul
. UCP poate
scris allucra numai cu
autorului. În numere
acest
binare. Astfel, un tranzistor
scop m| puteÛi contact| la: deschis corespunde lui 1, iar unul închis lui 0. Instruc Ûiunile
limbajului maÕin| reprezint| secvenÛe de 0 Õi 1 stocate la adrese consecutive în memorie.
Când o instrucÛiune se încarc| în UCP secvenÛa binar| din memorie se aduce în UCP, iar
ANTAL Tiberiu
acesta reac ÛioneazAlexandru
| în mod mecanic la instrucÛiune. ReacÛia UCP este determinat| de
tel.: 0040-264-530918
modul în care acesta este microprogramat, adic| de modul în care sunt interconectaÛi
e-mail: din interiorul lui. În concluzie, memoria principal| stocheaz| datele Õi
antaltiberiu@pcnet.ro
tranzistorii
instrucÛiunile sau, într-un cuvânt, programul codificat în binar. UCP aduce din memorie
Õi apoi execut| fiecare instrucÛiune a programului în mod ciclic. UCP poate executa numai
un program perfect în toate detaliile Õi neambiguu.

13
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
Figuradocumentul
1 - Schema numai contra
necesar| cost Õiciclului
înt-elegerii cu acordul scris al s-autorului.
de extragere i În acest
scop m| puteÛi
execut-contact| la:-iunilor
ie a instruct

ANTAL Tiberiu Alexandru


În
tel.:Figura 1 se prezint| o schem| foarte simpl| pentru înÛelegerea funcÛion|rii unui
0040-264-530918
calculator. Memoria nu stocheaz| la o adres| un singur bit, ci grupuri de câte 8 biÛi care
e-mail: antaltiberiu@pcnet.ro
poart| numele de octet (byte). Din acest motiv, unei linii de date sau de adrese îi
corespunde în realitate un grup de linii de date sau adrese. În figura de mai sus se observa7
o singura7 linie pentru adrese s- i doua7 pentru date. Aceste linii sunt însa7 intersectate de
câte una oblica7 , ea simbolizând prezent-a în realitate a unui grup de linii care au aceeas- i
semnificat-ie.
Conf. dr. ing. ANTAL Tiberiu Alexandru
1.2 Evenimente asincrone
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Un sistem de calcul este format din mult mai multe componente decât UCP Õi memoria
Catedra
principalde
|, câteva din Õi
Mecanic| Programare
acestea sunt prezentate în continuare. UCP este fixat pe un circuit
Curs de limbaj C
imprimat numit plac| de baz|, care în plus conÛine magistrale, memorii RAM, ROM Õi alte
circuite integrate:
Copyright 2001. Toate drepturile sunt rezervate autorului.
C h a rd d is c- u l pentru stocarea programelor Õi a fiÕierelor. Memoria principal|
stocheaz
Multiplicarea | o cantitate
acestui mic|îndescop
document Õi numai atât
datecomercial estetimp cât sistemul de calcul este pus
interzis|.
sub tensiune. Hard disc-ul este o memorie magnetic| pentru stocarea permanent|
SudenÛii c|rei conÛinut
(alparticipanÛi nu seform|
la orice pierdedelaînv|Û|mânt
scoaterea de sub tensiune
superior bugetara sistemului de calcul)
pot multiplica acest
a unor cantit |Û i mari
document pentru uzul personal. de informa Ûii, dar programele trebuie înc | rcate de pe disc în
memoria principal| înainte de a putea fi executate;
SudenÛii participanÛi
C tastatura Õi la
mouorice form|
se-ul de înv|Û|mânt
pentru cu plat|
ca utilizatorul sau
s| poat alte persoane
| introduce date;doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|C puteÛi r- u l Õi im
m o n i tocontact| la:prim an ta care se folosesc pentru afiÕarea ieÕirilor produse de
sistemul de calcul;
ANTAL Tiberiu Alexandru
C placa de ret- ea care permite ca sistemul de calcul s| comunice cu alte sisteme de
tel.: 0040-264-530918
e-mail:calcul conectate Õi ele la reÛea;
antaltiberiu@pcnet.ro
C scanner-ul care converteÕte imagini în numere binare care vor putea fi stocate
Õi manipulate prin sistemul de calcul.

14
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


hard disc tastatur| monitor
mousesuperior bugetar pot multiplica acest
SudenÛii participanÛi la orice form| de înv|Û|mânt
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
imprimant| plac| de reÛea
scanner

Lista acestor componente Õi dispozitive r|mâne deschis|, sistemele de calcul fiind astfel
construite încât sa7 poata7 fi extinse prin ad|ugarea de noi dispozitive sub forma unor pla7 ci
de exten sie (expansion cards) care vin introduse în locas- urile de ex tensie (expansion
slots) ale pl|cii de baz|. UCP îns| trebuie s| comunice cu aceste dispozitive pentru a
Conf. dr. ing. ANTAL Tiberiuschimba Alexandru informaÛii cu ele, iar pentru c| singurul limbaj
cunoscut de acesta este cel maÕin|, fiecare dispozitiv are
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini nevoie de un driv er de disp ozitiv . Acesta este un program
Catedra de Mecanic| Õi Programare care dac| este executat de UCP Õtie sa7 deruleze transferul
Curs de limbaj C de informaÛii între UCP Õi dispozitivul în cauz|. Din acest
motiv instalarea unui dispozitiv nou în sistemul de calcul se
sunt|rezervate
deruleaz în dou| etape: se conecteaz| fizic noul dispozitiv
Copyright 2001. Toate drepturile autorului.
la sistemul de calcul, apoi se instaleaz| programul driver
corespunz|tor acestuia. Exist| dispozitive atât de necesare
Multiplicarea acestui document funcînÛion
scop comercial
|rii sistemuluieste interzis|.
de calcul încât drivere-ele
un sistem de calcul corespuz|toare lor sunt stocate în memorii R O M (R ead
SudenÛii participanÛi la orice form|
O nly M deemory)
înv|Û|mânt superior
care sunt bugetar
furnizate pot multiplica
implicit acest
cu orice sistem
de calcul. pentru
document Acesta uzul
este personal.
cazul fericit în care nu avem nevoie de driver pentru a face ca
dispozitivul s| conlucreze cu sistemul de calcul. Pentru c| aceste dispozitive vor schimba
SudenÛiiÛiiparticipanÛi
informa cu UCP Õi la cuorice
memoria
form|principal |, ele trebuie
de înv|Û|mânt cu plat|s|sau
fie alte
interconectate cumva cu
persoane doritoare
acestea. Se nume
pot multiplica Õte magistrala
documentul numai7 (bcontra cost Õi|)cu
u s în englez unacordul
grup descris
linii electrice În acest |
care transport
al autorului.
informa Ûii între dispozitivele
scop m| puteÛi contact| la: interconectate ale sistemului de calcul. În func Ûie de tipul de
informaÛii transportate avem bus de da te , bus de ad rese Õi bu s de sem na le de control.
Pe busul de adrese se vehiculeaz| informaÛia de selecÛie. O adres| va direcÛiona o dat|
ANTAL
particular Tiberiu
| de peAlexandru
busul de date c|tre un anumit dispozitiv sau registru de dispozitiv. Pe
tel.: 0040-264-530918
busul de control se vehiculeaz| semnalele necesare comunicaÛiei între dispozitive. Un
e-mail: va folosi acest bus pentru a semnaliza altuia c| datele aÕteptate sunt disponibile
antaltiberiu@pcnet.ro
dispozitiv
Õi valide pe busul de date. Cea mai simpl| schem| de calculator este prezentat| în Figura
2. Dispozitive cum sunt tastatura, mouse-ul Õi placa de reÛea pot produce date care trebuie
prelucrate de UCP. De unde va Õti UCP c| datele sunt acolo? Cel mai simplu ar fi ca UCP
s| verifice în mod continuu prezent-a datelor, dupa7 care s| le prelucreze. Aceast| metod|

15
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca
de lucru se nume
Facultatea Õte în limba
ConstrucÛii englez| "polling ". Este simpl| dar ineficient| pentru c| UCP
de MaÕini
pierde prea mult timp în
Catedra de Mecanic| Õi Programare a Õteptarea datelor, motiv pentru care în practic| este rar
utilizata7 . Pentru evitarea acestei situaÛii ineficiente de multe ori se vor utiliza întreruperi .
Curs de limbajeste
O întrerupere C un semnal trimis c|tre UCP de un dispozitiv diferit de UCP. UCP
reacÛioneaz| la un semnal de întrerupere suspendându-Õi activitatea curent| Õi
Copyright
r|spunzând2001. Toate drepturile
întreruperii. Dup | cesunt rezervatetratarea
a terminat autorului.întreruperii, UCP va reveni la
activitatea anterioar|, continuând-o din punctul în care a întrerupt-o. De exemplu, la
ap |sarea unei acestui
Multiplicarea taste sedocument
genereazîn| oscop
întrerupere,
comercialUCP îÕi întrerupe activitatea curent|,
este interzis|.
citeÕte tasta ap|sat|, o prelucreaz|, apoi revine la operaÛia pe care o executa înainte de
ap |sareaparticipanÛi
SudenÛii tastei. la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL


Figura 2Tiberiu
- Cea maiAlexandru
simpl| schem| de calculator
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Procesul
Catedra de descris mai sus
Mecanic| este mecanic. Semnalul de întrerupere apare pe un pin al UCP
Õi Programare
care este construit
Curs de limbaj C a Õ a încât dac| apare acest semnal îÕi salveaz| starea curent| pentru
ca ulterior s| poat| reveni la ea Õi s| o continue. Salvarea const| în stocarea conÛinutului
unor regiÕtri maiToate
importan Ûi, cum sunt
ar fi PC-ul. Apoi UCP sare la o adres| de memorie fix|
Copyright 2001. drepturile rezervate autorului.
Õi începe s| execute instrucÛiunile de acolo. Aceste instrucÛiuni alc|tuiesc o rutin| de
tratare a întreruperii care face toate prelucr|rile necesare pentru a r|spunde la
Multiplicarea
întrerupere. De acestui document
obicei, rutina îndescop comercialeste
întrerupere esteointerzis|.
parte a unui program driver a
dispozitivului care a transmis întreruperea. La terminarea rutinei de tratare a
SudenÛii
întreruperii exist| o instruc
participanÛi la oriceÛiune
form|
caredefor Ûeaz| UCPsuperior
înv|Û|mânt s| revin|bugetar Ûia pe
la operapot multiplica acest
care o efectua
la momentul
document în care
pentru a sosit
uzul întreruperea prin refacerea st|rii lui.
personal.

Întreruperile permitlaUCP
SudenÛii participanÛi s| trateze
orice form| evenimente
de înv|Û|mânt asincrone.
cu plat| sau alteÎn ciclul obi
persoane Õnuit de
doritoare
extrac Ûie-execudocumentul
pot multiplica Ûie totul se petrece într-o ordine
numai contra strict
cost Õi cu | Õi predeterminat
acordul |. TotÎn
scris al autorului. ceea ce se
acest
petrece face parte dintr-un
scop m| puteÛi contact| la: Õablon al unui grup de evenimente sincronizate. Din cauza
întreruperilor UCP lucreaza7 eficient cu evenimente asincrone, adic| evenimente care apar
la momente imprevizibile.
ANTAL Tiberiu Alexandru
tel.:
Toate 0040-264-530918
acestea sunt valabile numai dac| UCP are mai multe sarcini de executat.
e-mail: antaltiberiu@pcnet.ro
Calculatoarele moderne folosesc multitasking pentru a executa mai multe task -uri
(sarcini) în acelaÕi timp. Unele sisteme de calcul sunt atât de rapide încât pot fi folosite de
mai mulÛi utilizatori în acelaÕi timp. Din moment ce UCP este atât de rapid, el poate s|-Õi
comute atenÛia de la un utilizator la altul, alocând pentru fiecare o fracÛiune din timpul lui
de lucru. Acest mod de aplicare al multitasking-ului se numeÕte cu timesharing (partajare

16
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca
în timp). Chiar
Facultatea Õi banalele
ConstrucÛii calculatoare personale folosite de un singur utilizator sunt
de MaÕini
capabile de multitasking. De
Catedra de Mecanic| Õi Programare exemplu, poÛi scrie un document într-un editor de text în
timp ce pe ecran, undeva într-un colÛ, îÛi apare ceasul care afiÕeaz| ora exact| în mod
Curs de limbaj
continuu. FiecareC din aceste sarcini individuale executate de UCP se numesc procese (sau
thread-uri; exist| diferenÛe tehnice între proces Õi thread dar pentru explicaÛiile care
Copyright
urmeaz| nu2001.
suntToate drepturile
importante). Unsunt rezervate
singur procesautorului.
poate fi executat la un moment dat de
UCP (exist| sisteme de calcul care au mai multe UCP, iar atunci se poate executa câte un
proces pe fiecare
Multiplicarea UCP).
acestui UCP vaîncontinua
document s| execute
scop comercial esteun proces pân| când:
interzis|.
! procesul, în mod voluntar, va preda controlul UCP altor procese pentru ca Õi
SudenÛiiacestea s| poate
participanÛi fi executate;
la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
!
document pentru uzul personal.apariÛia unui eveniment asincron. De exemplu, procesul
procesul poate aÕ tepta
poate cere date de la hard disc sau poate aÕtepta ca utilizatorul s| apese o tast|. În
timpul aÕtept|rii procesul este blocat s- i alte procese au Õansa s| fie executate.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Când evenimentul aÕteptat apare, o întrerupere va trezi procesul Õi acesta îÕi va
pot multiplica execuÛia; numai contra cost Õi cu acordul scris al autorului. În acest
continuadocumentul
scop
! m|procesul
puteÛi contact| la: durata de timp alocat| execuÛiei Õi va fi suspendat pentru ca Õi
Õi-a folosit
alte procese s| poate fi rulate. Nu toate calculatoarele pot s| suspende astfel un
ANTAL proces;
Tiberiuacelea care pot se spune c| utilizeaz| "preemtive multitasking". Pentru a
Alexandru
realiza preemtive multitasking un sistem de calcul trebuie s| aib| un circuit de
tel.: 0040-264-530918
e-mail:ceas special care s| genereze întreruperi la intervale regulate de timp. La apariÛia
antaltiberiu@pcnet.ro
unei întreruperi de timp, UCP are Õansa s| comute pe un alt proces indiferent dac|
procesului actual "îi convine" aceasta sau nu.

Programul care realizeaz| tratarea întreruperilor Õi toat| comunicaÛia cu utilizatorul Õi


dispozitivele din sistemul de calcul se numeÕte sistem de operare . Sistemul de operare
este un program de baz| f|r| de care un calculator nu poate funcÛiona. Toate celelalte
Conf. dr. ing.
programe careANTAL Tiberiu
se execut Alexandru
| pe sistemul de calcul sunt dependente de sistemul de operare.
Câteva din sistemele
Universitatea Tenhic|de operare
din mai cunoscute sunt OS/2 Warp, UNIX, DOS, Windows
Cluj-Napoca
98, Windows
Facultatea NT, Windows
ConstrucÛii 2000 Õi Macintosh OS.
de MaÕini
Catedra de Mecanic| Õi Programare

1.3 Algoritm, date s- i program


Curs de limbaj C

Copyright
Algoritmul2001. Toate7 odrepturile
reprezinta secvent-a7 detaliata 7 de act-autorului.
sunt rezervate iuni executate pentru îndeplinirea unor
sarcini. Teoretic, un algoritm trebuie sa7 ajunga7 la rezultat dupa7 un numa7 r finit de pas- i.
Denumirea
Multiplicarea deacestui
algoritm document în7 scop
a fost data în onoarea
comercial matematicianului
este interzis|. iranian Al-Khawarizmi.
Pentru un calculator, da tele se prezinta7 sub forma unor numere, caractere, imagini etc.
obt-inute participanÛi
SudenÛii printr-o metoda 7 oarecare
la orice form|de deînregistrare, cu scopulbugetar
înv|Û|mânt superior de a fi introduse în sistemul
pot multiplica acest
de calcul, stocate -
s i prelucrate
document pentru uzul personal. sau transmise la distant- 7
a . Datele în sine nu au o
semnificat-ie. Numai în urma interpreta7 rii lor cu ajutorul unui sistem de prelucrare a
datelor, acestea primesc o semnificat-ie, devenind informat-ie. Activitatea de programare
SudenÛii
presupune participanÛi
trecerea de lalaorice form|problemei
universul de înv|Û|mântrealecu plat|
la cel sau alte persoane
al sistemului doritoare
de calcul, mult mai
pot multiplica
îngust. Universuldocumentul
real al unei numai contrafiind
probleme cost de Õi cu acordul scrisprea
o complexitate al autorului.
mare esteÎnnecesara
acest 7
scop m| puteÛi
trecerea contact|s- ila:
prin limitare abstractizare la cel specific sistemului de prelucrare a datelor.
As- a a apa7 rut not-iunea de model, o descriere a realita7 -tii, simplificata7 prin ignorarea
anumitor Prin folosirea unui model în locul problemei reale s- i prin abstractizare
detalii. Alexandru
ANTAL Tiberiu
se ajunge la simplificarea
tel.: 0040-264-530918 prelucra7 rii realita7 -tii. Rolul abstractiza7 rii este formularea unui
algoritm de transformare
e-mail: antaltiberiu@pcnet.ro a unor date. Algoritmul specifica7 act-iunile de prelucrare, iar
datele descriu universul abstractizat. Pentru a putea fi prelucrate pe un sistem de calcul,
algoritmul trebuie scris într-un limbaj de programare, rezultatul acestei activita7 -ti
numindu-se program . În cadrul limbajului de programare, da tele sunt specificate prin
intermediul declarat-iilor , iar algoritmul prin instruct-iuni.

17
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca

1.4 Despre limbajele de programare


Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Limbajul de programare
Curs de limbaj C este un mijloc de comunicare între programator Õi calculator. Un
limbaj se numeÕte limbaj natural dac| are capacitatea de a evolua, fiind rezultat în urma
dezvolt
Copyright|rii 2001.
lui în Toate
timp. drepturile
Un limbajsunt artificial , cum
rezervate sunt Õi limbajele de programare, nu
autorului.
evolueaz| în timp de la sine. Evident Õi limbajele de programare evolueaz|, ele fiind un
mijloc de comunica
Multiplicarea Ûie document
acestui între om Õîn i ma Õin|comercial
scop , dar aceasta
este numai din cauza oamenilor care le
interzis|.
extind sau îmbun|t|Ûesc pentru a fi cât mai utile domeniului în care se aplic|. Descrierea
unui limbaj se face prin sem an tica7 Õi gra m atica7 . La rândul ei, gramatica se împarte în
SudenÛii
m orfologparticipanÛi
ie Õi sintaxa la
7 . orice form| studiaz
Semantica de înv|Û|mânt superior
| leg|turile bugetar
dintre pot multiplica
cuvintele acest
din dicÛionarul
document pentru
limbajului uzul descrise
Õi obiectele personal.de acestea, adic| înÛelesul cuvintelor. Morfologia studiaz|
modific|rile suferite de cuvinte pentru a realiza nuanÛarea înÛelesurilor. În limbajele de
programare nu se folosesc
SudenÛii participanÛi la orice form||ri
modific demorfologice.
înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Un
scopprogram
m| puteÛi este o secven
contact| la:Û| de instrucÛiuni pe care un sistem de calcul le execut| pentru
a îndeplini o sarcin|. Pentru ca programul s| poat| fi executat, el trebuie s| fie scris
într-un programa re . Limbajele de programare difer| de cele umane fiind
ANTALlimbajTiberiude Alexandru
complet neambigue Õi foarte stricte cu privire la ce este Õi ce nu este permis în program.
tel.: 0040-264-530918
Regulile care determin| ce este permis construiesc sintaxa limbajului. Regulile sintactice
e-mail:
specific|antaltiberiu@pcnet.ro
vocabularul de baz| al limbajului Õi modul în care se pot construi programe
utilizând cicluri, ramificaÛii sau subprograme. Un program corect sintactic este unul care
nu are erori în urma compil|rii (compilarea este operaÛia de traducere a unui program
scris într-un limbaj de nivel înalt în limbajul maÕin|). Dac| apar erori programul trebuie
corectat s- i apoi, din nou, compilat. Deci, pentru a avea succes în programare trebuie s|
înv|ÛaÛi sintaxa limbajului de programare utilizat. TotuÕi, sintaxa este numai o parte din
poveste.
Conf. dr. Nu ing.este
ANTALsuficient
Tiberiu s| scrii programe care se compileaz| f|r| erori. Dorim ca
Alexandru
Universitatea Tenhic| din Cluj-Napoca | rezultate corecte. Asta înseamn| c| înÛelesul
programul în urma execu Ûiei s| produc
programului trebuie s| fie corect. ÎnÛelesul programului se numeÕte sem an tica7 , iar un
Facultatea ConstrucÛii de MaÕini
program corect semantic face ceea ce doreÕte programatorul.
Catedra de Mecanic| Õi Programare
Curs
Sintaxade limbaj C
unui limbaj de programare se memoreaz|, dupa7 care trecet-i la semantic| Õi
încercat-i s| înÛelegeÛi cum lucreaz| anumite instrucÛiuni ale limbajului.
Copyright 2001. Toate drepturile sunt rezervate autorului.

1.4.1 Gramatica
Multiplicarea acestui documentformala 7 este interzis|.
în scop comercial
Pentru c| maÕina de calcul este numai un suport f|r| cel mai mic gram de inteligenÛ| s-a
dezvoltat o teorie a limbajelor
SudenÛii participanÛi formale
la orice form| care, printre
de înv|Û|mânt altele, descrie
superior bugetarno Ûiuni
pot acest|
de gramatic
multiplica
necesare înÛelegerii aspectelor sintactice ale limbajelor de programare. În viziunea lui N.
document pentru uzul personal.
Chomsky, creatorul teoriei limbajelor formale, gramatica G = G(T, N, P, S) unui limbaj
L(G) este specificata 7 prin:
SudenÛii a)participanÛi
un vocabular laTorice form| de terminale,
de simboluri înv|Û|mântnumite
cu plat|
Õi sau alte
cuvin te ;persoane doritoare
pot multiplica
b) o muldocumentul numai contra
Ûime N de simboluri cost Õi cunumite
neterminale, acordulÕi scris al autorului.
cate gor În acest
ii gra m aticale ;
o mulÛcontact|
scop m|c)puteÛi producÛii numite Õi reguli sintactice ;
ime P dela:
d) un simbol S din N , numit simbol de start .
ANTAL Tiberiu Alexandru
Limbajul L(G) este mulÛimea cuvintelor (adic| a Õirurilor de simboluri terminale) care se
tel.: 0040-264-530918
pot ob Ûine din simbolul S prin intermediul regulilor de producÛie. Fie limbajul L definit
e-mail: antaltiberiu@pcnet.ro
prin urm|toarea gramatic|:

T={a, b, c}; N={S, A, B}; P={S ! AB, A ! a, A ! ac, B ! b, B ! cb}

Semnul ! are semnificaÛia “trece prin substituÛie în”. În limbajul de mai sus se pot genera
18
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca
urm |toarele
Facultatea producÛii de
ConstrucÛii de cuvinte:
MaÕini
Catedra de Mecanic| Õi Programare
S ! AB ! aB ! ab
Curs de limbaj C
S ! AB ! aB ! acb
S ! AB ! acB ! acb
Copyright
S ! AB !2001.
acB Toate
! accbdrepturile sunt rezervate autorului.

Se poate ar|taacestui
Multiplicarea c| în limbajul
document deînmai sus
scop | mai
nu existeste
comercial multe cuvinte Õi c| schimbarea
interzis|.
ordinii substituÛiilor conduce la aceleaÕi cuvinte, adic| S ! AB ! Ab ! ab . Se observ|
| abc este
cSudenÛii un cuvântla
participanÛi care se poate
orice form|obdeÛine în dou| moduri,
înv|Û|mânt superiordin acest motiv
bugetar dou|
el va aveaacest
pot multiplica
documentÛiipentru
semnifica dup| cum
uzul litera c se obÛine din substituÛia A ! ac sau B ! cb . Expresii cu
personal.
mai multe semnificaÛii exist| Õi în limbile vorbite. Fie propoziÛia: “Aceasta este masa”. Ea
poate s| semnifice c| în faÛa noastr| st| obiectul pe care ne lu|m masa sau c| avem în faÛa
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
noastr| un cablu care este mas| electric| a unui dispozitiv electronic. Dac| nu se cunoaÕte
pot multiplica
contextul, adicdocumentul
| propoziÛiilenumai contra
din care cost
rezult Õi cu
| cea acordul
actual scris al Ûautorului.
|, semnifica În acest|.
ia este neprecizat
scop m| puteÛi contact| la:
Exist| Õi alte metode pentru a descrie gramatica limbajelor formale, cea mai frecvent
utilizat
ANTAL | Tiberiu a lor I. Backus Õi P. Naur. Aici se folosesc metasimbolurile de tip
fiind ceaAlexandru
paranteze: < > Õi metasimbolul: |, pentru conjuncÛia “fie”. Simbolul ! este înlocuit prin ::= .
tel.: 0040-264-530918
Parantezele se folosesc pentru a descrie modul de înlocuire a simbolurilor prin cuvinte sau
e-mail: antaltiberiu@pcnet.ro
fraze care descriu semnificaÛiile simbolurilor. Rezultatul este obÛinerea unei mulÛimi de
definiÛii. Regula S ! A B se poate obÛine din definiÛia:

<propozit- ie>::= <su bie ct><p red icat>


<sub iect>::= oam enii | câin ii
<p re dicat>::= dor m | ma 7 nânca7
Conf. dr. ing. ANTAL Tiberiu Alexandru
Semnifica Ûia liniilor
Universitatea Tenhic| dedin
maiCluj-Napoca
sus este:
1. O <propozi
Facultatea Ûie> se define
ConstrucÛii Õte ca fiind format| dintr-un <subiect> urmat de un <predicat> .
de MaÕini
2. Un <subiect>
Catedra se define
de Mecanic| Õte ca fiind fie cuvântul "oam enii " fie cuvântul "câin ii ".
Õi Programare
3. Un <predicat>
Curs de limbaj C se define Õte ca fiind fie cuvântul "dorm " fie cuvântul "m a7 nânca7 ".
Ideea de baz
Copyright | este
2001. c| drepturile
Toate o <propozit -ie>rezervate
sunt derivat| dintr-un simbol de start prin
poate fi autorului.
aplicarea unor reguli de înlocuire.
Multiplicarea acestui document în scop comercial este interzis|.
1.4.2 Scheme sintactice
SudenÛii de producÛielaale
Regulile participanÛi uneiform|
orice gramatici pot fi transcrise
de înv|Û|mânt superiorÕi bugetar
sub forma
potunor deseneacest
multiplica care
se numescpentru
document schem uzul personal.. Fiind date regulile de producÛie, prin eliminarea
e sintactice
simbolurilor neterminale, dup| mai multe faze, se obÛin numai simboluri terminale.
Convenind c| simbolurile
SudenÛii participanÛi neterminale
la orice se scriu cu plat| sau alte persoane doritoare
form| de înv|Û|mânt
cu majuscule - mai jos A Õi B - iar cele terminale
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
cu - mai josla:x , y , z Õi w , pentru
scoplitere mici contact|
m| puteÛi
regulile urm|toare scrise folosind formalismul
Backus-Naur:
ANTAL Tiberiu Alexandru
tel.: A
S::= 0040-264-530918
B
e-mail:
A::= x | yantaltiberiu@pcnet.ro
B::= z | w
Gramatica transcris| folosind scheme sintactice
se prezint| în Figura 3. În funcÛie de limbajul de Figura 3 - Modul de specificare a
programare abordat, unii autori prefer| s|
gramaticii prin diagrame de sintax|
19
Capitolul
Conf. - Introducere
dr.1 ing. funct-ionarea
ANTALînTiberiu calculatoarelor
Alexandru
Universitatea Tenhic| din Cluj-Napoca
foloseasc
Facultatea | ConstrucÛii Ûiile
în specificade tehnice ale limbajului, diagrame de sintax|, iar alÛii,
MaÕini
Catedra de Mecanic| Õi ProgramareDiagramele de sintax| sunt lizibile, îns| necesit| mult
Formalismul Backus-Naur (FBN).
spaÛiu. Din acest motiv produc|torii de limbaje de programare prefer| s| foloseasc| FBN,
Curs
în carededescrierea
limbaj C este mai scurt|, dar Õi mai greu de înÛeles.

Copyright
Dup| 2001. Toatemai
explorarea drepturile
multor sunt rezervate
metode formale autorului.
pentru definiÛia limbajului, comitetul
pentru standardizarea limbajului C a decis s| foloseasc| FBN pentru sintaxa
limbajului Õi proza
Multiplicarea pentru
acestui constrângeri
document Õi semanticeste
în scop comercial |. Orice încercare mai ambiÛioas| s-a
interzis|.
considerat c|:
! vaparticipanÛi
SudenÛii duce la întârzierea apariÛiei
la orice form| de standardului;
înv|Û|mânt superior bugetar pot multiplica acest
! va face limbajul mai
document pentru uzul personal.pu Ûin accesibil utilizatorilor.

În standardul C termenii "comportament nespecificat", "nedefinit" Õi "definit prin


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
implementare" sunt folosiÛi pentru a categoriza rezultatele produse de programe ale
pot
c|rormultiplica
proprietdocumentul numai contra
|Ûi nu sunt descrise cost
sau nu potÕi fi
cudescrise
acordul scris al autorului.
complet În acest
în standard. Scopul
scop m| puteÛi contact| la:
acestor termeni a fost crearea unei oarecare variet|Ûi în rândul implement|rilor de C în
vederea categoriza7 rii lor dup| calitate, existând implement|ri de C mai populare care
deviaz
ANTAL | Tiberiu de la standard. Comportamentul nespecificat las| la latitudinea
uneori Alexandru
implementatorului
tel.: 0040-264-530918 limbajului traducerea unor secvenÛe de program, f|r| a permite îns|
ca traducerea programului
e-mail: antaltiberiu@pcnet.ro s| nu reuÕeasc| din acest motiv. Comportamentul nedefinit
permite ca implementatorul s| nu prind| anumite erori de program care sunt dificil de
diagnosticat. De asemenea, acoper| problematica anumitor extensii ale limbajului prin
furnizarea de definiÛii în unele cazuri de comportamente nedefinite. Comportamentul
definit prin implementare las| implementatorului libertatea alegerii unei rezolv|ri proprii,
îns| aceasta trebuie s| fie explicat| utilizatorului. Pe baza acestui comportament
utilizatorul trebuie s| poat| lua decizii semnificative referitoare la scrierea codului.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

20
Capitolul
Conf. dr.2 ing. 7 istorie Tiberiu
- Scurta
ANTAL s-i descr iere a eleme ntelo r limba jului C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

2 Scurta7 istorie s- i descriere a


Multiplicarea acestui document în scop comercial este interzis|.

elementelor limbajului C
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

I
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
storia limbajului
pot multiplica
anilor '70 pentru
scop m| puteÛi contact| la:
C începe
documentul
scrierea
la firma
numai contraBell
sistemului
Labs
cost
de
care
Õi cu
operare
a iniÛiat
acordul dezvoltarea
scris
UNIX
lui laÎn
al autorului.
utilizat
calculatoare - pentru vremea de atunci - DEC (D igital E quipment C orporation). Pân|
atunci sistemele de operare erau scrise în limbaj de asamblare. Acesta era obositor, greu
de c|
începutul
acest
tre noile

ANTAL
de întreÛinutTiberiu Alexandrude timp. Cei de la Bell Labs au înÛeles c| era nevoie de un nou
Õi consumator
tel.: 0040-264-530918
limbaj de programare de nivel înalt, cât mai rapid Õi cât mai uÕor de întreÛinut, care s|
e-mail:|antaltiberiu@pcnet.ro
permit implementarea proiectelor din firm|. Întrucât limbajele de programare de nivel
înalt existente pe atunci (COBOL, FORTRAN, PL/I, Algol) erau prea încete pentru codul
sistemelor de operare, programatorii de la Bell Labs au decis s| scrie propriul limbaj de
programare. Noul limbaj s-a bazat pe limbajul B al lui Ken Thompson care a fost inspirat
de BCPL (B asic C ombined P rogramming L anguage) scris de Martin Richards, care era
o versiune simplificat| a limbajului CPL (C ambridge P rogramming L anguage). Pentru c|
B avea câteva restricÛii, în 1972, Bria n K ernig han Õi De nn is Ritch ie de la AT &T Be ll
Conf. dr. ing. ANTAL Tiberiu Alexandru
Labs , au creat limbajul C ca o extensie a limbajului B.
Universitatea Tenhic| din Cluj-Napoca
Facultatea
Se spune c|ConstrucÛii de MaÕini
totul a pornit de la un joc cu "asteroizi" pe care îl jucau în timpul serviciului
Catedra de
folosind calculatorul Õi Programare
Mecanic| central al companiei. PerformanÛele acestuia l|sau de dorit. Cu
puterea de calcul al unui 386 Õi deservind aproximativ 100 de utilizatori, au ajuns la
Curs de limbaj C
concluzia c| nu pot controla suficient de bine "navele spaÛiale", motiv pentru care erau
distru
CopyrightÕi repede
2001.laToate
trecerea printresunt
drepturile asteroizi. Având
rezervate în birou un DEC PDP-7 care nu era
autorului.
folosit, au hot|rât s| rescrie jocul. Problema era c| DEC nu avea sistem de operare, aÕa
| au început acestui
cMultiplicarea s| scriedocument
unul. În scurt
în scoptimp scrierea
comercial sistemului
este interzis|.de operare a devenit un
proiect mai important decât jocul de la care a pornit totul. El fiind scris în limbaj de
asamblare, un limbaj maÕin| umanizat, în care Õirurile binare de 0 Õi 1 corespunz|toare
SudenÛii
diferitelor participanÛi
instrucÛiuni laale
orice form| dema
limbajului înv|Û|mânt superior
Õin| s-au înlocuit bugetar
prin grupuripotde
multiplica acest-
litere Õi cifre
document
înainta mult pentru uzul personal.
prea greu. Atunci s-au hot|rât s| rescrie sistemul de operare într-un limbaj
de nivel înalt care s| fie portabil pe diferite tipuri de sisteme de calcul. În acest caz, tot
SudenÛii
ceea ce arparticipanÛi la orice
fi fost necesar eraform| de înv|Û|mânt
reimplementarea cu plat| sau alte
compilatorului persoane
pentru fiecaredoritoare
sistem de
calcul
pot multiplica | care sistemul
nou, dupdocumentul de operare
numai contra cost Õi cu acordul
se putea compila.scris
Limbajul care a fost
al autorului. ales în
În acest
acest
scop m| scop s-a contact|
puteÛi numit Bla:dar el nu permitea utilizarea tuturor avantajelor oferite de
instrucÛiunile lui PDP-11. Astfel a fost inventat un nou limbaj, C.
ANTAL Tiberiu Alexandru
C a devenit popular imediat dup| crearea lui. Am putea spune c| numai dup| 6 ani de
nu0040-264-530918
tel.:
la inventarea lui, în 1978, s-a auzit de el prin memorabila carte a lui Brian Kernighan Õi
e-mail:
Dennis antaltiberiu@pcnet.ro
Ritchie - THE C PROGRAMMING LANGUAGE - care a schimbat totul. Din
acest moment C a fost implementat pe calculatoare pe 8 biÛi sub sistemul de operare
CP/M. În 1981 când a început revoluÛia PC prin calculatoarele IBM PC, C era unicul
limbaj care avea puterea s| le exploateze total. Astfel a deviat de la sistemul de operare
UNIX sub care a fost scris iniÛial Õi a devenit un limbaj popular pe toate
21
Capitolul
Conf. dr.2 ing. 7 istorie Tiberiu
- Scurta
ANTAL s-i descr iere a eleme ntelo r limba jului C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
microcalculatoarele.
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Programatorii adorau limbajul C pentru c|, spre deosebire de alte limbaje, el permite
Curs de limbaj C un control absolut asupra calculatorului. Cu acest control vine Õi o
programatorului
responsabilitate - sunt multe posibilitaÛi în C pentru a bloca un calculator - îns|
Copyright
programatorii 2001.auToate
g|sitdrepturile
în sfârÕitsunt rezervate
un limbaj autorului.
care este o unealt| Õi nu un obstacol în
programarea calculatoarelor.
Multiplicarea acestui document în scop comercial este interzis|.

2.1 Caracteristicile
SudenÛii participanÛi limbajului
la orice form| de înv|Û|mânt
document pentru uzul personal.
superior bugetar potC
multiplica acest
Programatorii care ajung s| lucreze în C venind din Basic sau Pascal
Limbaj de
sunt surprinÕi de "nivelul de jos" al program|rii în C. Face puÛine lucruri
asamblare
automat,
SudenÛii participanÛi
avansat
la oriceîns | permite
form| scrierea
de înv|Û|mânt lor însauam
cu plat| |nut,
alte cu mâna,
persoane dac|
doritoare
programatorul
pot multiplica documentul numaidore Õte cost
contra acestÕi lucru. Nu are
cu acordul instruc
scris Ûiuni careÎnlucreaz
al autorului. acest |
direct
scop m| puteÛi contact| la:cu Õiruri de caractere, mul Ûimi, liste. Nu exist| operatori care s|
manipuleze un tablou sau un Õir întreg. Nu are facilit|Ûi de intrare/ieÕire Õi nici nu permite
accesul fiÕiere.Alexandru
ANTALlaTiberiu Toate aceste caracteristici ale limbajelor de nivel înalt sunt explicit
asigurate prin apelul unor funcÛii care nu sunt parte a limbajului Õi sunt stocate sub forma
tel.:
unor0040-264-530918
biblioteci de funcÛii standard. Autorii lui îl numesc un limbaj de nivel relativ jos, în
e-mail:
sensul cantaltiberiu@pcnet.ro
| este destul de aproape de limbajul maÕin|; practic l-am putea numi un limbaj de
asamblare cu câteva caracteristici de limbaj de nivel înalt.

Motivul pentru care C a fost inventat este viteza. Programele scrise în


Vitez| mare
C se execut| foarte rapid, deÕi dezvoltarea lor este de multe ori înceat|.
Pentru creÕterea vitezei, C a renunÛat la majoritatea verific|rilor f|cute
în general de limbajele
Conf. dr. ing. ANTAL Tiberiu Alexandru de nivel înalt cu scopul creÕterii siguranÛei
de programare
func Ûion | rii programului.
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Am spus c| limbajul maÕin| este specific fiec|rui UCP. Pentru c|
Portabilitate
Catedra de Mecanic| Õi Programare
limbajul de asamblare nu este decât un limbaj maÕin| cu o form| mai
Curs de limbaj C elegant|, înseamn| c| Õi acesta este specific fiec|rui UCP, iar
programele scrise în el nu pot fi portate pe maÕini diferite, adic| nu este portabil. C fiind
un limbaj de
Copyright asamblare
2001. în multe feluri,
Toate drepturile înseamn|autorului.
sunt rezervate c| nici programele C nu sunt portabile.
Totul depinde de modul în care s-a scris C. Respectând câteva reguli de baz| este posibil
ca
Multiplicarea C s| fiedocument
programeleacestui portate laînfelscop
cu cele scrise în
comercial Basic
este sau Pascal. Am spus c| C pune
interzis|.
la dipoziÛia programatorului biblioteci. Aceast| modalitate de definire ajut| la izolarea
limbajului de tr|s|turile
SudenÛii participanÛi specifice
la orice form|aledeUCP Õi construc
înv|Û|mânt Ûiei hardware
superior a ma
bugetar pot Õinii pe care
multiplica se
acest
ruleaz
document| o implementare particular| de C, rezultând posibilitatea scrierii unui cod portabil.
pentru uzul personal.
C s-a n|scut din încercarea de creare a unui limbaj de programare
Pentru scrierea
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau sistem
alte persoane doritoare
pentru scrierea sistemelor de opeare. Primul de operare scris în
sistemelor de
pot multiplica documentul numaiÕicontra cost Õi cu acordul scris al autorului. În acest
C a fost UNIX a avut aproximativ 10000 de linii. Azi atât UNIX cât Õi
operare
scop m| puteÛi contact|
Windowsla: au toate specificaÛiile necesare pentru programarea lor
descris| în limbajul C.
ANTAL Tiberiu Alexandru
Sintaxa C este departe de a fi sugestiv|. Din aceast| cauz| se poate
tel.: 0040-264-530918
Lizibilitate grea
ajunge la situaÛia unor programe care nu mai pot fi înt-elese, deÕi sunt
e-mail: antaltiberiu@pcnet.ro
scrise în C Õi funcÛioneaz| corect.

22
Capitolul
Conf. dr.2 ing. 7 istorie Tiberiu
- Scurta
ANTAL s-i descr iere a eleme ntelo r limba jului C
Alexandru
Universitatea Tenhic| din Cluj-Napoca

2.2 Standarde C
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
La
Cursfeldedelimbaj C ca limbajul de asamblare, dar mai prietenos, cu multe instrucÛiuni
eficient
apropiate de echivalentul lor din limbajul de asamblare s- i mai puternic prin noile
instruc
CopyrightÛiuni2001.
ad|ugate
Toateîndrepturile
anii '80, C sunt
a devenit cel mai
rezervate popular limbaj având sute de variante
autorului.
în implementare Õi o comunitate de programatori care creÕte rapid. RevoluÛia C era în
pericol
Multiplicarea s| divizeze
riscândacestui document limbajul în prea
în scop multeeste
comercial variante incompatibile între ele; era
interzis|.
vremea ca limbajul s| fie standardizat.
SudenÛii
În America,participanÛi la orice form|
responsabilitatea de înv|Û|mânt
standardiz superior
|rilor revine bugetar
Institutului pot
Na multiplica
Ûional acest
American de
document pentru
Standarde uzul National
(American personal.Standards Institute sau, mai pe scurt, ANSI). Comitetul
de autorizare ANSI pentru C s-a numit X3J11, iar limbajul este azi definit prin standardul
ANSI
SudenÛii X3.159-1989.
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Aria
scop m|interna Ûional
puteÛi | a standardiz
contact| la: |rilor este acoperit| de OrganizaÛia InternaÛional| de
Standardizare (International Standards Organization sau ISO). ISO a format comitetul
JTC1/SC22/WG14 pentru revizuirea muncii lui X3J11. Azi, standardul ISO pentru C este
ANTAL Tiberiu Alexandru
ISO 9889:1990 Õi este în esenÛ| identic cu X3.159.
tel.: 0040-264-530918
e-mail:
Standardulantaltiberiu@pcnet.ro
ISO C este autoritatea final| prin care s-a reconstruit limbajul C. De obicei,
în documetaÛii, el este referit sub forma "standardul", la fel cum limbajul C definit în
cartea lui Kernighan Õi Ritchie este cunoscut sub numele de "K&R C".

2.3 Ce a rezolvat standardizarea


Conf. dr. ing. ANTAL Tiberiu Alexandru
Limbajul C a beneficiat enorm de pe urma standardiz|rii, ca urmare devenind un limbaj
mult mai uÕor
Universitatea Tenhic| din Cluj-Napoca
de utilizat. În K&R C nu exista un mecanism pentru verificarea
parametrilor transferade
Facultatea ConstrucÛii Ûi func Ûiilor. Nu se verificau nici num|rul, nici tipul parametrilor
MaÕini
transfera Ûi. Din acest motiv
Catedra de Mecanic| Õi Programare întrega responsabilitate c|dea pe umerii programatorului care
trebuia | fie atent
Curs de slimbaj C la asemenea erori în apelul funcÛiilor. Problema era aÕa de serioas|
încât s-a scris un utilitar special, lint, în acest scop.
Copyright 2001. Toate drepturile sunt rezervate autorului.
Calculele în virgul| flotant| erau o glum| în limbajul K&R C. Toate acestea se f|ceau
folosind tipul de dat| numit doub le , deÕi exista un tip de dat| numit float pentru lucrul cu
Multiplicarea
valori mai mici. acestui document
Valorile de tipulînfloat
scopfiind
comercial esteera
mai mici interzis|.
normal ca toate calculele s| fie
efectuate mai rapid, dar datorit| conversiei lor la doub le , timpul de calcul creÕtea.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
De Õi a existat
document o biblioteca
pentru 7 standard sub forma unei colecÛii de subprograme care însoÛeau
uzul personal.
limbajul C, nu era nimic standardizat cu privire la elementele pe care aceast| bibliotec|
le conÛinea.
SudenÛii AcelaÕi subprogram
participanÛi la orice form| putea s| aib| denumiri
de înv|Û|mânt cu plat|diferite
sau altesau s| lucreze
persoane în mod
doritoare
diferit.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Odata7 cu rezolvarea acestor probleme, C standard a devenit mult mai robust Õi uÕor de
utilizat, motiv pentru care voi aborda descrierea acestui C Õi nu a celui descris de K&R
ANTAL
în prima Tiberiu
lor carte.Alexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
2.4 Elemente de C
Acest paragraf descrie elementele limbajului C: nume, numere, caractere folosite la
scrierea unui program C. Sintaxa ANSI C numeÕte aceste componente simboluri, ele fiind

23
Capitolul
Conf. dr.2 ing. 7 istorie Tiberiu
- Scurta
ANTAL s-i descr iere a eleme ntelo r limba jului C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
elementele de baz| recunoscute
Facultatea ConstrucÛii de MaÕini de compilator. Un simbol este un text al programului
surs | care nu poate fi descompus
Catedra de Mecanic| Õi Programare în alte elemente componente. Urm|toarea list| cuprinde
tipurile de simboluri existente în limbajul C: cuv ân t cheie , identificator , constanta7 , s- ir,
Curs de limbaj C
operator, caracter de punctuat- ie .

Copyright
# 2001.
cuvin tele Toate
cheie :drepturile suntÛie
au o semnifica rezervate autorului.
predefinit| pentru compilatorul C, motiv pentru
care un identificator nu poate avea acelaÕi nume - scriere sintactic| - cu un cuvânt
cheie. Cuvintele
Multiplicarea cheie aleînlimbajului
acestui document C sunt:este interzis|.
scop comercial
au to do ub le int struct
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
break
document pentru uzul personal. else long switch

case enum register typedef


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
char documentul numai
pot multiplica contra cost Õi cureturn
extern union
acordul scris al autorului. În acest
scop m| puteÛi contact| la:
const float short unsigned

ANTALc on Tiberiu
ti n u e Alexandru for signed void
tel.: 0040-264-530918
de fau lt goto sizeof vola tile
e-mail: antaltiberiu@pcnet.ro
do if static w hile

NOTA: Toate cuvintele cheie ale limbajului C se scriu cu litere mici.

# identificatorul : este un nume dat de utilizator unei variabile, tip de dat|, funcÛie
sauing.
Conf. dr. unei eticheteTiberiu
ANTAL din program.
AlexandruCrearea unui identificator se face prin specificarea
Universitatea Tenhic| din Cluj-Napoca |, tip sau funcÛie, fiind caracterizat prin tip,
lui într-o declara Ûie de variabil
vizibilitate,
Facultatea ConstrucÛiidurata 7 de existent-a7 (persistent-a7 ) Õi legare. Dup| declarare, un
de MaÕini
identificator poate
Catedra de Mecanic| Õi Programarefi utilizat în program Ûinând locul valorii asociate lui;
# constanta: reprezint| un num|r, un caracter sau Õiruri de caractere care sunt
Curs de limbaj C
folosite ca o unic| valoare în program Õi sunt caracterizate prin valoare Õi tip. C
cunoaÕte constante reale, întregi, enumerate Õi caracter;
Copyright
# 2001. Toate drepturile sunt rezervate autorului.
s- irul : reprezint| o secvenÛ| de caractere cuprins| între simbolurile ” ”, de exemplu
"un sir de caractere";
Multiplicarea
# operatorul acestui document
: este un simbol în care
scop specific
comercial este interzis|.
| modul în care sunt manipulate valorile
asupra c|rora acÛioneaz|. Poate fi format dintr-un singur caracter sau din mai
multe;
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
# caractere
document pentru deuzulpunctuat
personal. -ie : sunt caractere speciale care au utiliz|ri diverse, de la
organizarea programului surs| pân| la definirea unor operaÛii pe care le execut|
compilatorul
SudenÛii participanÛisau programul
la orice form| compilat.
de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
2.5 Primul program
scop m| puteÛi contact| la:

Cel
ANTALmai scurt program
Tiberiu care se poate scrie în C este:
Alexandru
tel.: 0040-264-530918
m ai n() { }
e-mail: antaltiberiu@pcnet.ro
deÕi este un program funcÛional nu va produce un rezultat vizibil pe ecran.

Lansarea în execuÛie a unui program sub sistemul de operare DOS are ca efect transferul
controlului programului lansat în execuÛie. În acest scop DOS trebuie s| Õtie unde s| intre
24
Capitolul
Conf. dr.2 ing. 7 istorie Tiberiu
- Scurta
ANTAL s-i descr iere a eleme ntelo r limba jului C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
în programConstrucÛii
Facultatea pentru a începede MaÕiniexecuÛia lui. m ain înseamn| principal, reprezentând acest
punct de început din care
Catedra de Mecanic| Õi Programare DOS începe s| execute instrucÛiunile programului. Numele se
scrie urmat de paranteze rotunde, adic| m ain (), iar corpul programului este închis între
Curs de limbaj
acolade. C între acolade se afla7 un num|r oarecare de instrucÛiuni:
De obicei,

1 Copyright 2001.
/* SA LU T.C */ Toate drepturile sunt rezervate autorului.
2 #include<stdio.h>
3 Multiplicarea acestui document în scop comercial este interzis|.
4 /* Afis eaza "Salu tare tin erete." pe ecra n */
5
6 SudenÛii
m ain () participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
7 {document pentru uzul personal.
8 prin tf("Sa luta re, tin ere te!");
9
10
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
retu rn(0 );
11 pot
} multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Efectul acestui program este afiÕarea textului "Salutare, tinerete!" pe ecran. Se observ|
| acoladele
cANTAL Tiberiusunt scrise una sub cealalt|, iar liniile de program printf("Salutare,
Alexandru
tine rete!"); retu rn(0
tel.: 0040-264-530918 ); sunt aliniate.

e-mail: antaltiberiu@pcnet.ro
Fiecare linie de program este numerotata7 pentru a simplifica explicat-iile. Aceste linii
NU FAC PARTE DIN PROGRAMUL C (din acest motiv ele NU vor fi scrise la tastarea
acestui program s- i nici la cele care vor urma).

Acest mod de scriere nu este necesar, dar mulÛi programatori îl folosesc, el f|când parte
din stilul
Conf. dr. de
ing.scriere
ANTAL al programelor C.
Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Pentru a face
Facultatea programul
ConstrucÛii de executabil,
MaÕini prima oar| trebuie s|-l stoc|m pe disc într-un fiÕier
text, s| zicem cu numele salut.c. Apoi vom avea nevoie de un program compilator C
Catedra de Mecanic| Õi Programare
pentru a crea fiÕierul executabil. Compilatorul este responsabil pentru traducerea
Curs de limbaj
programului dinC limbajul C în limbajul maÕin|. Programul compilator va produce din
salut.c un nou fiÕier cu numele salut.obj. Acesta este fiÕierul obiect, reprezentând
Copyright
primul pas 2001.
în obÛToate
inereadrepturile sunt rezervate
fiÕierului executabil. autorului.
Acesta este un fiÕier în limbaj maÕin|, toate
datele Õi instrucÛiunile lui fiind dimensionate, în lungime, la cea de octet (8 biÛi). TotuÕi,
acesta
Multiplicarea înc| un
nu esteacestui programînexecutabil.
document Urmeaz
scop comercial | faza de legare prin care codul
este interzis|.
predefinit al funcÛiilor C folosite în fis- ierul text vor fi ad|ugate fiÕierului obiect.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
O funct- ie C este o porÛiune de program pentru rezolvarea unei sarcini distincte din
document pentru uzul personal.
program. De exemplu, funcÛia printf() rezolv| sarcina scrierii textului Salutare,
tinerete! pe ecran. Aceast| funcÛie este definit| în una din bibliotecile standard ale
SudenÛii
limbajului participanÛi la orice
C. O bibliotec form| dedintr-o
| se compune înv|Û|mânt cude
colecÛie plat|
funcsau alte persoane
Ûii, scrise doritoare
de noi sau de firme,
pot multiplica documentul numai contra cost Õi
pentru a putea fi folosite în programele C. Toat| programarea din C se bazeaz| peacest
cu acordul scris al autorului. În funcÛii,
scop
m ainm| puteÛi
() fiind totcontact|
o funcÛiela:
care va cuprinde corpul programului principal.

Pentru
ANTALacest programul de legare va c|uta definiÛia funcÛiei printf() în bibliotec|, de
caz,Alexandru
Tiberiu
tel.: 0040-264-530918Õi o va ad|uga la programul obiect, în final rezultând programul
unde o va extrage
executabil salut.exe.
e-mail: antaltiberiu@pcnet.ro
Linia 8 este cea mai important| din program, fiind Õi cea mai des folosit| funcÛie pentru
afiÕarea datelor pe ecranul monitorului. Surprinz|tor îns|, printf() nu face parte din
limbajul C. C este de fapt divizat în dou| secÛiuni majore: limbajul în sine Õi bibliotecile

25
Capitolul
Conf. dr.2 ing. 7 istorie Tiberiu
- Scurta
ANTAL s-i descr iere a eleme ntelo r limba jului C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
lui. Dup| cum
Facultatea am mai de
ConstrucÛii spus, prin tf() face parte dintr-o bibliotec|. Ea preia Õirul (textul
MaÕini
dintre ghilimele) cuprins
Catedra de Mecanic| Õi Programare între acolade Õi face afiÕarea lui pe ecranul monitorului. O funcÛie
poate citi datele transferate ei prin ceea ce se afl| între parantezele ei rotunde
Curs de limbajfunc
(argumentele C Ûiei), le prelucreaza7 , apoi va întoarce un rezultat. Din acest motiv la
folosirea unei funcÛii C trebuie s| Õtie ce are de f|cut, ce fel de date are de preluat Õi ce fel
Copyright
de dat| va 2001. Toate drepturile sunt rezervate autorului.
fi rezultatul?

Atunci când definim


Multiplicarea acestuipropriile
document înÛiiscop
func estecomercial
responsabilitatea noastr| s| inform|m C despre
este interzis|.
aceste detalii. Pentru c| într-o bibliotec| sunt sute de funcÛii C disponibile ar fi dificil s|
SudenÛii|m
memor pentru fiecare
participanÛi dintre
la orice ele aceste
form| de înv|Û|mânt s| le putem
detalii casuperior comunica
bugetar limbajuluiacest
pot multiplica C în
cazul |rii lor uzul
utilizpentru
document personal.Din acest motiv exist| fiÕierele antet (header files) care
în programe.
au rolul stoc|rii acestor detalii corespunz|toare tuturor funcÛiilor din biblioteci.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
În cazul nostru, linia 2 furnizeaz| compilatorului C toate detaliile necesare despre funcÛia
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
printf() prin includerea fiÕierului antet corect pentru funcÛia printf() . FiÕierul antet se
scop
numem| ÕteputeÛi
std io.hcontact|
. FuncÛiala:
printf() are o linie în acest fiÕier text care spune limbajului C ce
fel de date poate prelua funcÛia Õi ce fel de r|spuns poate întoarce. FiÕierul antet conÛine
mulÛime
oANTAL de astfel
Tiberiu de descrieri pentru multe alte funcÛii. Astfel, se includ informaÛii
Alexandru
despre zeci de funcÛii în programul C, îns| C le va ignora pe toate dac| nu are nevoie de
tel.: 0040-264-530918
ele.
e-mail: antaltiberiu@pcnet.ro
#include este o instrucÛiune special| numit| direc tiva7 de preprocesor Õi este o comand|
adresat| programului compilator - ea nu apare în programul final. Comenzile de acest fel
instruiesc compilatorul sa7 realizeze o act-iune oarecare. În acest caz directiva îi spune
compilatorului sa7 plaseze întregul conÛinut al fiÕierului cu numele std io.h în programul C,
începând cu linia din care este scris| directiva, la noi, linia 2 . Numai dup| ce compilatorul
Conf.
executdr. ing. ANTAL
| aceast | linie vaTiberiu Alexandru
Õti toate detaliile necesare utiliz|rii funcÛiei printf() .
Universitatea Tenhic| din Cluj-Napoca
iile 1 (/*
Facultatea
Lin ConstrucÛii
salut.c */ Õi 3 (/* Afiseaza "Saluta re, tinerete!" pe ecran */ ) sunt
de) MaÕini
comentarii. Compilatorul le
Catedra de Mecanic| Õi Programare ignor| în momentul traducerii, ele având rol numai pentru
programator,
Curs de limbaj Cfiind folosite pentru descrierea efectului unor instrucÛiuni sau porÛiuni de
program. În C, începutul comentariului se marcheaz| prin secvenÛa de caractere /* iar
terminarea lui prin
Copyright 2001. secven
Toate Ûa de caractere
drepturile */ . Când compilatorul întâlneÕte secvenÛa /* se
sunt rezervate autorului.
opreÕte din traducerea programului pân| când întâlneÕte caracterele */ pentru închiderea
comentariului. Folosirea comentariilor va face programul mai uÕor de înÛeles. Acestea se
Multiplicarea acestuiîndocument
pot plasa oriunde programîncu scop comercial
condi Ûia s| este interzis|.
nu cuprind | cumva instrucÛiuni ale
programului. În aceast| idee, programul anterior se poate scrie sub forma:
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
1 /* Progra mu
document l va uzul
pentru fi salvat pe d isc sub n um ele de: salut.c */
personal.
2
3 #in clude<std io.h> /* Fisierul an tet pentru fun ctia printf() */
4
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
5 pot multiplica documentul
/* Programul numai contra cost Õi cu acordul scris al autorului. În acest
afiseaza
6 scop m|"Saluta
puteÛi re, tinerete!"
contact| la: pe ecran */
7
8 m ain ()
9
ANTAL
{
Tiberiu Alexandru
10 tel.: 0040-264-530918
prin tf("Sa luta re, tin ere te!");
11 e-mail: antaltiberiu@pcnet.ro
12 retu rn(0 );
13 }

26
Capitolul
Conf. dr.2 ing. 7 istorie Tiberiu
- Scurta
ANTAL s-i descr iere a eleme ntelo r limba jului C
Alexandru
Universitatea Tenhic| din Cluj-Napoca

2.6 main()
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de
Linia 8 limbaj C | sub forma m ain () . ÔtiÛi deja c| m ain este punctul din care începe
este scris
programul Õi c| este o funcÛie.
Copyright 2001. Toate drepturile sunt rezervate autorului.
InstrucÛiunile limbajului pot fi executate numai dac| sunt scrise în interiorul unei funcÛii.
Func Ûiile se folosesc
Multiplicarea acestuipentru
document compartimentarea
în scop comercial unor interzis|.mari în sarcini mai mici Õi
programe
este
din acest motiv, mai uÕor de rezolvat. AcÛiunile din interiorul unei funcÛii sunt separate de
act-iunile realizate în interiorul alteia, programul devenind modular. Aceasta este o alt|
SudenÛii
denumireparticipanÛi la orice form|
pentru specificarea de înv|Û|mânt
spargerii programului superior
în bucbugetar pot multiplica
|Ûi mai mici, cât mai uÕacest
or de
document pentru uzul personal.
gestionat.

Func Ûia mparticipanÛi


SudenÛii ain () trebuie | fie prezent
la sorice form| de| în orice program
înv|Û|mânt executabil
cu plat| sau alteCpersoane | este locul
pentru cdoritoare
de
potunde se începe
multiplica execuÛianumai
documentul programului. PorÕiÛiunea
contra cost cuprins
cu acordul | între
scris acestÕte
acolade seÎnnume
al autorului.
corpul prog ram ulu
scop m| puteÛi contact| la:i. Pentru programul salut.c acesta este format din liniile
printf("Salutare, tine rete!"); Õi return(0); , iar liniile 10 Õi 12 se numesc instruct- iuni. În C,
orice
ANTAL secvent -a7 deAlexandru
Tiberiu instruct-iuni cuprinsa7 între acolade - caracterele { , } din liniile 9 Õi 13 -
se numeÕte bloc. În particular, corpul unei funcÛii este întotdeauna cuprins între acolade,
tel.:
fiind0040-264-530918
un bloc. Uneori, denumirea de bloc se mai foloseÕte pentru a sublinia c| un grup de
e-mail: antaltiberiu@pcnet.ro
instruct- iun i su nt leg ate între ele , adic| nu sunt tratate independent.

2.7 printf()
Linia 10 este un exemplu clasic al unei linii de program C. InstrucÛiunile de acest fel se
termin| prin caracterul pu nct s- i virgula7 (; ) numit Õi terminator de instruct-iuni. Orice
Conf.
acÛiunedr.îning. ANTAL
C este Tiberiu
o instruct -iuneAlexandru
Õi orice instrucÛiune C se termin| cu punct Õi virgul|.
Universitatea
Acest caracterTenhic|
special din
anun Û| compilatorul c| instrucÛiunea este complet|.
Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Modul
Catedra tipic de utilizare
de Mecanic| Õi al funcÛiei în C este prezentat prin prin tf() . Datele care dorim s|
Programare
fie
Cursprelucrate
de limbajdeC funcÛie se pun între parantezele rotunde. Aceste date ce vor fi apoi
transferate funcÛiei poart| denumirea de arg um en te . În acest caz, printf() are un singur
argument, scris sub
Copyright 2001. forma
Toate Õirului de
drepturile caractere
sunt "Sa luta re, tin ere te!" . În C exist| mai multe
rezervate autorului.
forme de date, numite tipuri de date, care pot fi prelucrate prin instrucÛiuni ale limbajului
C.
Multiplicarea acestui document în scop comercial este interzis|.
printf() este foarte complex| Õi asigur| afiÕarea unei variet|Ûi de tipuri de date pe ecran.
Exist| posibilitatea
SudenÛii la orice|form|
participanÛimanipul rii formei de afiÕare asuperior
de înv|Û|mânt datelor pe bugetar
ecran.pot Demultiplica
exemplu, seacest
pot
folosi caracterele
document pentru \t
uzulÕi \n în Õirul caracterelor de afiÕat astfel:
personal.

1 /* Progra
SudenÛii mu l va fi salvat
participanÛi la oricepeform|
d isc sub n um ele de:cu
de înv|Û|mânt salut.c */
plat| sau
alte persoane doritoare
2
3
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
#in clude<std io.h> /* Fisierul an tet pentru fun ctia printf() */
4 scop m| puteÛi contact| la:
5 /* Programul afiseaza
6 ANTAL "Saluta
Tiberiure,Alexandru
tinerete!" pe ecran */
7
8
tel.: 0040-264-530918
m ain ()
9 e-mail:
{ antaltiberiu@pcnet.ro
10 prin tf("Sa luta re,\n \t tin ere te!");
11
12 retu rn(0 );
13 }

27
Capitolul
Conf. dr.2 ing. 7 istorie Tiberiu
- Scurta
ANTAL s-i descr iere a eleme ntelo r limba jului C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Utilizarea
Catedra deacestor
Mecanic|caractere va duce la afiÕarea pe ecran a textului Salutare,
Õi Programare tinerete!
sub forma:
Curs de limbaj C
Salutare,
Copyright tinerete!
2001. Toate drepturile sunt rezervate autorului.

tinerete! se
Multiplicarea afiÕeaz|document
acestui sub Salutare , pecomercial
în scop o linie nou | interzis|.
este Õi aliniat. Trecerea la linie nou|,
datorit| caracterului /n se mai numeÕte linie nou| (newline ) Õi const| în avansul la
începutul urm|toareila
SudenÛii participanÛi linii de form|
orice ecran. de
Exist | un astfel
înv|Û|mânt de set de
superior caractere
bugetar speciale care
pot multiplica nu
acest
se afiÕeaz| pe ecran, dar influenÛeaz| afiÕarea celorlalte caractere. Toate acestea încep
document pentru uzul personal.
prin caracterul backslash (/ ) iar la întâlnirea lui, urm|torul caracter se traduce într-o
acÛiune cu o semnificaÛie specific| literei puse dup| / . Câteva astfel de caractere speciale
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
sunt:
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Caracter special SemnificaÛie
ANTAL Tiberiu
\a alert| (ring bell ) - emisia unui sunet de c|tre difuzorul PC-ului.
Alexandru
tel.: 0040-264-530918
\n linie nou| (newline ) - trecere la linie nou| pe ecranul
e-mail: antaltiberiu@pcnet.ro
monitorului.
\b Õterge la stânga cursorului (backspa ce ).
\t tabulator (tab) - salt cu un num|r fixat de caractere pe
orizontal|.
ing. ANTALtabulator
Conf. dr.\v vertical (vertical tab ).
Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
\r retur de car (carriage return ) - salt la începutul liniei de pe
Facultatea ConstrucÛiiecran.
de MaÕini
Catedra de Mecanic| Õi Programare
\\
Curs de limbaj C caracterul backslash .

Copyright 2001. Toate drepturile sunt rezervate autorului.


2.8 return()
Multiplicarea
Ultima linie dinacestui document
program în scop comercial
este return(0) ;. Am inclus este aceast
interzis|.
| instrucÛiune din cauza lui
m ain () care este o funcÛie. C aÕteapt| ca funcÛiile s| întoarc| o valoare cu excepÛia cazului
în
SudenÛii specific| explicit
care separticipanÛi la oricelipsa
form|valorii întoarse. În
de înv|Û|mânt acest caz
superior particular,
bugetar nu s-a indicat
pot multiplica acest
lipsa valoriipentru
document întoarse pentru
uzul funcÛia m ain (), motiv pentru care C presupune c| va întoarce
personal.
o valoare întreag|, acesta fiind cazul implicit pentru funcÛii care întorc valoare. Valoarea
SudenÛii|participanÛi
numeric 0 se va întoarce prin instrucÛiunea retu rn(0 ); la terminarea funcÛiei m ain () .
la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Scrierea acestei instruc
pot multiplica documentul Ûiuninumai form| par
într-ocontra costÛial
Õi |cu(numai cuvântului
acordul return ) sau omiterea
scris al autorului. În acest
ei total| va duce la transferarea unui întreg cu valoare aleatoare sistemului de operare.
scop m| puteÛi contact| la:
Aceast| valoarea aleatoare ar putea fi 0 , caz în care aleator, programul s-ar termina cu
succes, sau mai probabil diferit| de zero, caz în care va indica terminare cu eroare a
ANTAL Tiberiu Alexandru
programului.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

28
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

3 Variabile, tipuri de date s- i


Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


constante
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest

Î
document pentru uzul personal.

n limbajul
SudenÛii C, unlaobiect
participanÛi este o de
orice form| regiune din RAM
înv|Û|mânt în care
cu plat| se poate
sau alte persoane o singur|
stocadoritoare
valoare la un moment dat. Obiectul prime Õte un nume prin care valoarea stocat
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest | va
putea fi identificat| în mod unic. Constantele Õi variabilele sunt obiecte care se pot
scop m| puteÛi
manipula contact| la:
în programele C prin operatori Õi instrucÛiuni. DeclaraÛiile prezint| variabilele
care se vor utiliza în program, le asociaz| un tip s- i eventual o valoare iniÛial|.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
3.1 Variabile
e-mail: antaltiberiu@pcnet.ro
În C toate variabilele trebuie declarate înainte de a fi folosite în program. Programatorul
realizeaz| aceasta printr-o declarat-ie care asocieaz| numele variabilei unui tip de dat|.
DeclaraÛia specific| modul de intepretare a numelui de c|tre compilatorul C.

Denumirea tehnic| pentru numele de variabil| este identificator de variabil| sau, mai pe
scurt, variabil
Conf. dr. |. Numele
ing. ANTAL de variabil
Tiberiu | sugereaz| c| valorile stocate sub aceste nume pot
Alexandru
varia sub controlul strict al
Universitatea Tenhic| din Cluj-Napoca programatorului prin intermediul unor obiecte numite
operatori.
FacultateaVariabilele
ConstrucÛiisunt caracterizate prin:
de MaÕini
- tip (type)
Catedra de Mecanic| Õi Programare
Curs de- vizibilita
limbaj C te (scope)
- durata de existent-a7 sau persistent-a7 (storage class)
- legare (linkage)
Copyright 2001. Toate drepturile sunt rezervate autorului.
Din motive didactice, în acest capitol voi aborda numai descrierea tipului, celelalte
Multiplicarea acestui
caracteristici vor document
fi discutate în scop comercial
pe parcurs. Trebuie seste
| ÕtiÛinterzis|.
i îns| c| aceste caracteristici sunt
specificate simultan prin declaraÛia variabilei.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru Literele, cifrele Õi caracterul und erscore (_) sunt caractere permise
uzul personal.
Nume de
într-un nume de variabil|. Primul caracter trebuie s| fie liter| sau
variabile corecte
underscore. Conform standardului
SudenÛii participanÛi la orice form| de înv|Û|mânt C caracterul
cu plat| und erscore este de
sau alte persoane doritoare
unui nume de variabil | pentru c |
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. Înfunc
evitat la începutul de obicei acestÛiile
din biblioteci încep cu acesta. Caracterele mici Õi mari sunt distincte în C. Astfel, a Õi A
scop m| puteÛi
sunt dou | numecontact|
diferite.la:TradiÛional, literele mici se folosesc pentru nume de variabile,
iar cele mari pentru constante simbolice.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Exemple de nu m e cor ecte sunt: x, v_intreg, x1, val_de_inceput
Exemple de nume inc orecte sunt: v-intreg, 1x, val de inceput, in#lire.
e-mail: antaltiberiu@pcnet.ro

În general, caracterul und escore se foloses- te în interiorul unui nume de variabil| pentru
a creÕte lizibilitatea lui. Num|rul maxim de caractere care formeaz| numele depinde de
compilatorul folosit, îns| sunt semnificative, conform standardului, numai primele 31 de

29
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
caractere,
Facultatea adic | numaide
ConstrucÛii acestea
MaÕinisunt folosite pentru a distinge numele de variabile între
Catedra de Mecanic| Õi Programare Ûii de lungime pentru numele de variabile externe -
ele. Unele implement | ri impun restric
care pot fi folosite de exemplu din limbajul de asamblare - de cel mult 6 caractere.
Curs de limbaj C
Numele de variabile nu pot avea aceeaÕi scriere sintactic| cu numele cuvintelor cheie.
Copyright 2001.
Astfel, nume Toate drepturile
de variabile sunt
ca if , else , forrezervate autorului.
, case sunt incorecte.

Este bine ca acestui


Multiplicarea variabileiîns|scop
numeledocument exprime scopul
comercial interzis|.în program Õi s| nu fie
estevariabilei
exagerat de lung.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru O
Declararea uzuldeclara Ûie specific| un tip - acestea vor fi discutate în continuare - Õi
personal.
o list| de una sau mai multe nume de variabile. În exemplul care
variabilelor
urmeaz|, int Õi float sunt tipuri de date.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
int i, j, k; documentul numai contra cost Õi cu acordul scris al autorului. În acest
scopt m|
floa x, vputeÛi contact|
ector[108 ]; la:

Forma
ANTALutilizat
Tiberiu| mai sus condenseaz| declaraÛiile numelor de variabile i , j Õi k respectiv x
Alexandru
Õtel.:
i vector în câte o
0040-264-530918 singur | linie de program C. Este posibil| Õi scrierea distribuit| a
e-mail: Ûantaltiberiu@pcnet.ro
declara iilor sub forma:

int i;
int j;
int k;
float x;
floa t vector[10 8];

Conf. dr. ing. ANTAL Tiberiu Alexandru


3.2 Tipuri de date
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
În limbajul
Catedra C exist|Õiun
de Mecanic| grup de cate gorii pre de finite de da te denumite tipuri.
Programare
Utilizatorul poate modela o problem| utilizând numai aceste categorii predefinite,
Curs de limbaj C
eventual poate defini noi categorii în termenii celor existente. Tip urile pr ed efin ite în C
sunt grupate în dou| clase: simple (uneori numite interne sau de baz|) Õi stru cturate .
Copyright 2001. Toate
Asocierea tipului drepturile
unui nume sunt rezervate
de variabil autorului.
| se face prin intermediul declaraÛiei de variabil|
Õi face ca:
- domeniul
Multiplicarea de valori
acestui pe care
document variabila
în scop le poate
comercial lua,
este adic| valorile care pot fi stocate
interzis|.
în urma evalu|rii unor expresii sau valorile care pot fi atribuite direct variabilei,
SudenÛiis|participanÛi
fie cunoscute;la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
- tipul unei valori
document pentru uzul personal.specificate de variabil| s| poat| fi dedus din declaraÛia acesteia,
f|r| a executa calcule aritmetice;
- fiecare operator sau funcÛie s| foloseasc| argumente de un anumit tip Õi s|
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
întoarc| rezultate de un anumit tip.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
3.2.1 Tipuri simple
ANTAL simple
Tipurile Tiberiuale limbajului C sunt: void , char, short , int, long , float Õi doub le .
Alexandru
tel.: 0040-264-530918
3.2.1.1 Tipul void
e-mail: antaltiberiu@pcnet.ro
Cuvântul rezervat void are 3 utiliz|ri: pentru a specifica valoarea “inexistenta7 ” întoarsa7
de o funct- ie , pentru a specifica un tip de argumente de funct- ie car e nu are arg um en te
Õi pentru a specifica un poantor la un tip nespecificat. Toate aceste denumiri Õi situaÛii
speciale se vor l|muri numai dup| studierea funcÛiilor Õi a tipului structurat de dat| numit

30
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
poantor.
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
3.2.1.2
Curs
Tipuri
de limbaj
întregi
C | mai multe categorii de întregi. Numele lor reflect| spaÛiul de RAM
Limbajul C suport
alocat pentru stocare. Teoretic, un întreg short , ar trebui s| ocupe spaÛiu mai puÛin în
Copyright
RAM decât2001.
tipulToate
întregdrepturile
long . sunt rezervate autorului.

În tabelul careacestui
Multiplicarea urmeaz | se prezint
document | spacomercial
în scop Ûiul de memorie alocat pentru tipurile de date
este interzis|.
întregi de c|tre compilatorul Visual C++ 6.0 Õi domeniul de valori corespunz|tor care
poate fi stocat
SudenÛii în variabilele
participanÛi la oricede tipulde
form| respectiv.
înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
Tip Spat-iu Domeniu de valori Minim s- i maxim în
"limits.h"
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
char 1 octet [-128, 127] [CHAR_MIN, CHAR_MAX]
scop m| puteÛi contact| la:
signed char 1 octet [-128, 127] [SCHAR_MIN, SCHAR_MAX]
ANTAL Tiberiu Alexandru
unsigned char 1 octet [0, 255] [0, UCHAR_MAX]
tel.: 0040-264-530918
e-mail: 2 octeÛi [-32768, 32767]
short antaltiberiu@pcnet.ro [SHRT_MIN, SHRT_MAX]

unsigne d short 2 octeÛi [0, 65535] [0, USHRT_MAX]

int 4 octeÛi [-2147483648, 2147483647] [INT_MIN, INT_MAX]

unsigned int 4 octeÛi [0, 4294967295] [0, UINT_MAX]

Conf.
long dr. ing. ANTAL 4 Tiberiu
octeÛi Alexandru
[-2147483648, 2147483647] [LONG_MIN, LONG_MAX]
Universitatea Tenhic| din Cluj-Napoca
unsigned ConstrucÛii
Facultatea long 4 octe Ûi [0, 4294967295]
de MaÕini [0, ULONG_MAX]

Catedra de Mecanic| Õi Programare


Fiecare
Curs de compilator
limbaj C are un set de constante utile folosite la determinarea domeniului de
valori ale tipurilor de baz|. De exemplu, numele INT _M IN Õi INT_MAX sunt disponibile
în fiÕierul lim its.h sub form| de constante care pot fi utilizate la scriere de programe.
Copyright 2001. Toate drepturile sunt rezervate autorului.
INT_MAX este cel mai mare num|r întreg care poate fi stocat într-o variabil| de tipul int
pentru cazul compilatorului curent. S| zicem c| trecem de la compilatorul firmei Microsoft
Multiplicarea acestui document
la cel al firmei Borland. INT_MAX în scop comercial
va referi estemaxim
valoarea interzis|.
| care se poate stoca cu acest
nou compilator. Acest lucru va r|mâne valabil chiar Õi la schimbarea sistemului de
SudenÛii FiÕierul lim its.h
operare. participanÛi va con
la orice Ûinedetoate
form| limit|rile
înv|Û|mânt compilatorului,
superior iar multiplica
bugetar pot includerea acest
lui în
programul utilizator
document pentru uzulvapersonal.
permite accesul la toate aceste valori extreme actualizate.

1 /* INT EX 1.C */
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
2 #include <limits.h>
3 pot multiplica
#include documentul numai contra cost Õi cu acordul scris al autorului. În acest
<stdio.h>
4 scop m| puteÛi contact| la:
5 int main(void)
6 {
ANTAL Tiberiu Alexandru
7 u n sig ne d lo ng z=U L ON G _M A X ;
8 tel.: 0040-264-530918
9 e-mail:prin
antaltiberiu@pcnet.ro
tf("va loar ea m ax im a in t = %i ", IN T_ M AX );
10 prin tf("va loar ea m inim a in t = %i\ n", IN T_ M IN );
11 prin tf("va loar ea m ax im a u nsign ed = %u \n ", UIN T_ M AX );
12 prin tf("va loar ea m ax im a lon g in t = %li\n", L ON G_ M AX );
13 prin tf("va loar ea m ax im a u nsign ed log = % lu\ n",z);
14

31
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
15 return 0;
Facultatea ConstrucÛii de MaÕini
16 }
Catedra de Mecanic| Õi Programare
Curs de limbaj C
Rezultate:
valoarea maxima int = 2147483647 valoarea minima int = -2147483648
Copyright maxima
valoarea 2001. Toate drepturile
unsigned sunt rezervate autorului.
= 4294967295
valoarea maxima long int = 2147483647
valoarea maxima unsigned log = 4294967295
Multiplicarea acestui document în scop comercial este interzis|.
Pentru înÛelegerea acestui exemplu trebuie s| ÕtiÛi c| funcÛia prin tf("valoa rea m ax im a
SudenÛii
int = % i participanÛi
", IN T _M Ala
X )orice
scrieform| de înv|Û|mânt
pe ecran stocat| în
valoarea superior bugetar pot multiplica
INT_MAX acest
sub controlul
document pentrudeuzul
specificatorului format %i . În funcÛia printf() , pentru fiecare tip de dat|, trebuie s|
personal.
folosim un specificator de format corespunz|tor tipului de dat| afiÕat. În acest scop se
SudenÛii| participanÛi
prezint tabelul urm|lator:
orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|Tip Specificator de format
puteÛi contact| la:
char %c
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
signed char %c
e-mail: antaltiberiu@pcnet.ro
unsigned char %c

short %hi

unsigne d short %hu

int %i, %d
Conf. dr. ing. ANTAL Tiberiu Alexandru
unsigned intTenhic| din Cluj-Napoca
Universitatea %u
Facultatea
long ConstrucÛii de MaÕini %li
Catedra de Mecanic| Õi Programare
unsigned
Curs longC
de limbaj %lu

Copyright Când doriÛi s| lucraÛi cu valori întregi mici în loc de int folosiÛi short Õi
2001. Toate drepturile sunt rezervate autorului.
Tipul int
avet-i impresia c| aÛi folosit mai puÛin| memorie. Invers, dac| valorile
trebuie
Multiplicarea acestui s| fie mari,
document în scopfolosiÛi tipuleste
comercial long . Problema pusa
interzis|. 7 în termenii lui
"mare" Õi "mic" este f|r| prea mult sens datorita7 impreciziei standardului C. Este suficient
c| ÕtiÛi c| SHRT_MAX este undeva pe la 32.767 , iar LONG_MAX pe la 2.147.483.647 .
SudenÛii participanÛi
Aceste valori nu suntla orice pentru
"clare" form| de înv|Û|mânt
tipul superior bugetar pot multiplica acest
int se stocheaz| uneori pe 2 , alteori pe 4 octeÛi.
document pentru
Astfel, pentru uzul personal.particular| de C, nu avem de unde s| Õtim dac| valoarea
o implementare
maxim| este de ordinul a 32 de m ii sau a 2 miliarde. Din acest motiv, programele
portabile în adev|ratul
SudenÛii participanÛi la sens
orice al cuvântului
form| nu folosesc
de înv|Û|mânt tipul sau
cu plat| int, alte
ci numai
persoane sau long .
shortdoritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Tipul
scop m|unsigned este f|rla:
puteÛi contact| | semn. Din acest motiv toÛi biÛii se pot folosi pentru stocarea
valorii numerice, în loc ca cel mai semnifivativ s| fie pe post de bit de semn. Aceasta
ANTAL |Tiberiu
înseamn c| valoarea cea mai mare unsigned poate fi cel mult dublul valorii maxime ale
Alexandru
lui int.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Tipul de dat| char se foloseÕte pentru stocarea Õi prelucrarea
Tipul char
caracterelor. Valorile caracter se formeaz| prin plasarea lor între
apostrofuri ('). Astfel, char b_ m ic = 'b'; stocheaz| valoarea ASCII -
numit| Õi codul ASCII - a literei b mic, valoarea numeric| 98 , în variabila cu numele
b_ m ic .

32
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
1 /* CH AR EX 1.C */
Facultatea ConstrucÛii de MaÕini
2 #include<limits.h>
3 Catedra de Mecanic| Õi Programare
#include<stdio.h>
4 Curs de limbaj C
5 int main(void)
6 {
Copyright 2001. Toate drepturile sunt rezervate autorului.
7 ch ar a_ m ic = 'a';
8 ch ar b_ m ic = 'b';
9 Multiplicarea acestui document în scop comercial este interzis|.
10 prin tf("va loar ea m inim a ch ar = % i, ", CH AR _M IN );
11 prin tf("va loar ea m ax im a ch ar = % i\n ", CH AR _M AX );
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
12
13 document
prinpentru uzul
tf("du pa personal.
'%c' urm eaza '% c'\n ", b_ m ic, b_ m ic+1);
14 prin tf("litera m are '%c' este '%c'\n", b_m ic, b_ m ic + 'A'-'a');
15 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
16 return 0;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
17 }
scop m| puteÛi contact| la:
Rezultate:
ANTAL Tiberiu
valoarea minimaAlexandru
char = -128, valoarea maxima char = 127
tel.: 0040-264-530918
dupa 'b' urmeaza 'c'
litera mare 'b' este 'B'
e-mail: antaltiberiu@pcnet.ro
Cele dou| constante definesc valoarea minim| Õi maxim| pentru un caracter. Pentru c|
în acest caz spaÛiul pentru stocare de 1 octet este garantat de standard putem presupune
valabil domeniul de [0, 255]. TotuÕi, nu este definit dac| char este cu semn sau f|r|, astfel
încât domeniul ar putea fi Õi [-128, 127].

Compilatorul poate efectua


Conf. dr. ing. ANTAL opera
Tiberiu Ûii aritmetice cu tipul char. Astfel, b_mic+1 înseamn|
Alexandru
98+1 , adic | 99. Expresia se poate citi în sensul codific|rii ASCII ca urm|torul caracter
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini corespunz|tor lui B mare se face în expresia b_m ic
dup | b mic. Calculul codului ASCII
+ 'A'-'a'. Dac| veÛi parcurge codificarea ASCII veÛi observa c| "distanÛa" între codurile
Catedra de Mecanic| Õi Programare
ASCII ale aceleiaÕi litere mari Õi mici este constant|, motiv pentru ea se poate calcula prin
Curs de limbaj C
diferenÛa 'A'-'a'.
Copyright 2001. Toate drepturile
În C este posibilsunt rezervate
| scrierea autorului.
valorilor întregi Õi în baze diferite de cea
Întregi în baze
zecimal|. Este posibil| utilizarea numai a bazelor 8 Õi 16 , adic| numerele
diferite
se pot
Multiplicarea acestui scrie în octal
document saucomercial
în scop în hexazecimal. Constantele octa le se specific|
este interzis|.
prin plasarea unui 0 în faÛa cifrei, astfel dac| 9 este un num|r zecimal
corect,
SudenÛii09participanÛi
ar fi incorect pentru
la orice c| este
form| o constant| superior
de înv|Û|mânt octal|, iar 9 nu este
bugetar cifr| corect
potomultiplica | în
acest
sistemul de numera Ûie cu baza
document pentru uzul personal. 8.

Specificarea unui x dup| 0 determin| compilatorul s| interpreteze num|rul întreg ca o


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
constant| hexazecimala7 . Aici literele a , b , c , d , e , f sunt folosite pentru a reprezenta
pot multiplica
numerele de ladocumentul numai contra cost Õi cu acordul scris al autorului. În acest
10 la 15 care în hexazecimal sunt cifre . Este nesemnificativ dac| se scrie
scop m| puteÛi contact| la:
cu litere mari sau mici, astfel 0x1ffa , 0x1FFA Õi 0x1F fA reprezint| acelaÕi num|r, adica7
0X1FFA .
ANTAL Tiberiu Alexandru
1 /*
tel.:BA ZE EX 1.C */
0040-264-530918
2 #include<limits.h>
e-mail: antaltiberiu@pcnet.ro
3 #include<stdio.h>
4
5 int main(void)
6 {
7 int zec=22, oct=022, hex=0x22;

33
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
8 prin tf("zec =%d , oct=% d, hex =%d \n ", zec, oc t, hex );
Facultatea ConstrucÛii de MaÕini
9 prin tf("zec =%d , oct=% o, he x=% x\ n", ze c, oct, hex );
10 Catedra de Mecanic| Õi Programare
11 Curs dereturn
limbaj0;C
12 }
Copyright 2001. Toate drepturile sunt rezervate autorului.
Rezultate:
zec=22, oct=18, hex=34
Multiplicarea acestui
zec=22, oct=22, document
hex=22 în scop comercial este interzis|.

%d determina
SudenÛii 7 afis- area
participanÛi întregului
la orice -ia zecimala
form|înden otat
înv|Û|mânt 7 ; aceasta
superior estepot
bugetar echivalent | cuacest
multiplica %i ;
%o determina7 -
afis area întregului
document pentru uzul personal. în n otat- ia 7
octala ;
%x determina7 afis- area întregului în notat-ia hexazecimala7 , cu litere mici pentru "abcdef ";
%X determina
SudenÛii 7 afis- area
participanÛi întregului
la orice notat- ia hexazecimala
form| deînînv|Û|mânt cu plat| sau 7alte
, cupersoane
litere mari pentru
doritoare
"ABCDEF ".
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop
DeÕi m| puteÛi contact|
discu Ûia este un picla:mai tehnic|, aÕ dori s| descriu ce se petrece când declar|m o
variabil|. Compilatorul este informat despre numele variabilei Õi tipul acesteia. De
ANTAL
exemplu,Tiberiu
pentru oAlexandru
declaraÛie de forma int i1 , la întâlnirea lui int compilatorul aloc| 4 octeÛi
din RAM pentru a stoca o valoare întreag|. De asemenea, genereaz| o tabel| de simboluri
tel.: 0040-264-530918
în care va
e-mail: introduce simbolul i1 Õi adresa relativ| de RAM la care s-au stocat cei 4 octeÛi.
antaltiberiu@pcnet.ro
Astfel, dac| mai târziu în program vom scrie i1=7; la momentul execuÛiei programului, când
se va ajunge la aceast| instrucÛiune, valoarea 7 va fi plasat| în memorie la adresa locaÛiei
rezervate pentru stocarea valorii lui i1. În acest sens variabila întreag| i1 este un obiect
c|ruia îi sunt asociate dou| “valori”. Prima este valoarea numeric| întreag| stocat| acolo
de noi Õi a doua “valoarea” adresei locaÛiei de memorie dat| de compilator. În unele c|rÛi
aceste dou| valori sunt cunoscute sub numele de r-value Õi l-value .
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea
3.2.1.3 Tipuri Tenhic| din Cluj-Napoca
reale
Facultatea
FiÕierul antet standardde
ConstrucÛii careMaÕini
conÛine constantele legate de tipurile reale din C este float.h.
Sunt
Catedradefinite Õi Programare
constantele
de Mecanic| corespunz|toare valorilor extreme Õi preciziei celor trei tipuri
reale.
Curs de limbaj C

Copyright
Tip 2001. Specificator
Toate drepturileSpat
sunt
-iurezervate autorului.Precizie
Domeniu Minim s- i
de format de valori în maxim în
zecimale
Multiplicarea acestui document în scop comercial este interzis|. floa t.h

float % f %e % g 4 octeÛi ±3.4E+/-38 7 [ F L T _M I N , F L T _M A X ]


SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
do ub le pentru%lf
uzul personal.
% le %lg 8 octeÛi ±1.7E+/- 15 [DBL_MIN, DBL_MAX]

308
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
lon g d ou ble %Lf %Le %Lg 10 octeÛi ±1.2E+/- 19 [ L D B L _ M IN , L D B L _ M A X ]
pot multiplica documentul numai contra cost Õi4932
cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Este cel mai put-in precis dintre tipurile reale. Calculele cu acest tip
Tipul float Tiberiu Alexandru
ANTAL sunt cele mai rapide, îns| este relativ uÕor s| apar| erori de depa7 s- ire
tel.: 0040-264-530918
(overflow sau underflow ) pentru c| domeniul pentru reprezentarea
e-mail:
acestui antaltiberiu@pcnet.ro
tip este îngust. Spat-iul de stocar e este ce l ma i mic , motiv pentru care este
preferat pe sistemele de calcul cu RAM puÛin.

Este tipul real cu spat-iu d e stoca re m ediu în C. Calculele se efectueaz|


Tipul do ub le
mai încet decât la tipul float, dar mai prec is . SpaÛiul de stocare fiind mai

34
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
mare, domeniul
Facultatea de valori
ConstrucÛii de care
MaÕinise poate stoca este Õi el mai larg.
Catedra de Mecanic| Õi Programare
Este tipul de dat| cu spaÛiul de stocare cel mai mare în C. Calculele ce
Curs
Tipul de limbaj C folosesc tipuri long d ou ble sunt cele mai încete dintre tipurile reale, dar
long
do ub le Õi cele mai precise.
Copyright 2001. Toate drepturile sunt rezervate autorului.
1 /* FLO AT EX 1.C */
2 #include<float.h>
Multiplicarea acestui document în scop comercial este interzis|.
3 #include<stdio.h>
4
5 SudenÛii
int m ain participanÛi
() la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
6 {document pentru uzul personal.
7 double x=3.1416, y=1.7e-5, z=7000000000.0;
8
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
9 prin tf("x=%lf\ ty=% lf\tz=%lf\ n",x ,y,z);
10 pot multiplicaprin
documentul numai
tf("x=%le\ty= contrale\n
%le\tz=% Õi cu,z);acordul scris al autorului. În acest
cost",x,y
11 scop m| puteÛiprin
contact| la: \ty= %lg \tz=% lg\n ",x,y ,z);
tf("x=%lg
12
13 prin tf("x=%7 .3lf\ty =%.3 le\tz =%.4 g\n ",x,y ,z);
ANTAL Tiberiu Alexandru
14
15 tel.: 0040-264-530918
return 0;
16 }e-mail: antaltiberiu@pcnet.ro

Rezultate:
x=3.141600 y=0.000017 z=7000000000.000000
x=3.141600e+000 y=1.700000e-005 z=7.000000e+009
x=3.1416 y=1.7e-005 z=7e+009
x= 3.142 y=1.700e-005 z=7e+009
Conf. dr. ing. ANTAL Tiberiu Alexandru
%lf îi spune
Universitatea Ûiei Cluj-Napoca
funcdin
Tenhic| printf() s| afiÕeze num|rul cu 6 zecimale, indiferent de mantisa
num | rului;
Facultatea ConstrucÛii de MaÕini
%le îi spune funcÛiei printf() s| afiÕeze num|rul cu 6 zecimale, folosind notaÛia
Catedra de Mecanic| Õi Programare
exponenÛial|, adic| în loc de 0.00012 se afiÕeaz| 1.2e-04 (1.2 înmulÛit cu 10 -4);
Curs de limbaj C
%lg acest specificator face afiÕarea numai a datelor utile, zerourile în plus nefiind
afiÕate. De asemenea, num|rul este afiÕat în form| cât mai scurt| posibil. De exemplu, în
Copyright
loc de 0.00012 2001. Toate drepturile
valoarea se va afiÕasunt rezervate
într-o forma mai autorului.
concis|: 1.2e-04 ;
%7 .3lf num|rul total de caractere folosit pentru afiÕarea valorii este 7 , iar 3 num|rul de
caractere zecimale.
Multiplicarea afiÕeaz| 3.142
acestuiSedocument pentru
în scop c| num
comercial |rul
este are numai 5 caractere din 7 Õi 2
interzis|.
spaÛii în stânga valorii pentru a completa diferenÛa de la 5 la 7 caractere. Se mai observ|
| valoarea
cSudenÛii real| a fost
participanÛi automat
la orice rotunjit
form| |;
de înv|Û|mânt superior bugetar pot multiplica acest
%.3le specific | 3 zecimale
document pentru uzul personal. în formatul exponen Ûial;
%.4lg specific| 4 zecimale, dar acestea nu sunt afiÕate pentru c| sunt 0 -uri, iar
formatul trebuie s| fie cel mai scurt.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul
O variabilnumai
| poatecontra
primi ocost Õi cuini
valoare acordul
Ûial| în scris al autorului.
linia declara În| acest
Ûiei. Dac numele
DeclaraÛie
scop m| cu puteÛi contact| la:
variabilei este urmat de semnul egal ( = ) Õi o expresie valoarea expresiei
iniÛializare
este stocat| în variabil|, procedura numindu-se iniÛializarea variabilei.
IniÛializarea se face o singur| dat| înainte de începerea execuÛiei
ANTAL Tiberiu Alexandru
programului, iar valoarea expresiei de iniÛializare trebuie s| fie o constant|. Acesta este
tel.: 0040-264-530918
cazul Ûializ|rii explicite. Unele variabile sunt iniÛializate implicit de C în funcÛie de
e-mail:iniantaltiberiu@pcnet.ro
durata lor de existenÛ| - aceste cazuri se vor discuta în cadrul capitolului de funcÛii.
Exemple de iniÛializ|ri explicite sunt:

ch ar ln = '/n ';

35
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
int a = 0;
Facultatea ConstrucÛii de MaÕini
float eps = 0.00001;
Catedra
char m esaj[Mecanic|
de Õi Programare
] = "Ai o eroa re!";
Curs de limbaj C

3.3 Constante
Copyright 2001. Toate drepturile sunt rezervate autorului.
O constant| este un obiect cu unic| valoare în program caracterizat prin:
Multiplicarea acestui document în scop comercial este interzis|.
- tip (type)
- valoare (value)
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Dupa 7 modul
document sa7 u de
pentru scriere
uzul o valoare constanta7 se încadreaz| în unul din urma7 toarele
personal.
tipuri de constante: întregi, reale, caracter, enumerate sau Õir de caractere.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
3.3.1 Constante numerice
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
3.3.1.1 Constante întregi
ANTAL Tiberiu
Constanta întreagAlexandru
| este un numa7 r întreg cu sau fa7 ra7 se mn care nu-Õi schimb| valoarea
în program Õi care se poate scrie în sistemele de numeraÛie zecimal (baza 10 ), octal (baza
tel.: 0040-264-530918
) sau hexazecimal
e-mail:
8 (baza 16 ). Dac| Õirul de cifre care formeaz| constanta întreag| este
antaltiberiu@pcnet.ro
prefixat cu cifra 0 num|rul este scris în octal, dac| prefixul este 0x num|rul este scris în
hexazecimal. Tipul num|rului determin| spaÛiul pe care acesta se reprezint| în RAM-ul
sistemului de calcul. Im plicit , constanta întreag| are tipul int Õi se reprezint| pe 2 octeÛi
(16 biÛi), în cazul în care se specific| sufixele u , U (unsigned ) num|rul este f|r| semn, iar
pentru sufixele l, L tipul este long Õi num|rul se reprezint| pe 4 octeÛi (32 de biÛi). În
exemplele care urmeaz| constanta întreag| zecimal| 28 este scris| în toate formele
Conf. dr. ing. ANTAL Tiberiu Alexandru
posibile:
Universitatea Tenhic| din Cluj-Napoca
Facultatea
28 /* constanConstrucÛii de MaÕini
ta intreaga zecim ala */
Catedra de Mecanic| Õi Programare
28L /* constan ta intreaga zecim ala de tipu l long */
034 /* constan ta intreaga octala repreze ntand 28 in zecim al */
Curs de limbaj C
034L /* constan ta intreaga octala de tipu l long */
0x1c /*constan ta intreaga hexa zecim ala repreze ntan d 28 in zecim al */
Copyright 2001. Toate
0x1cL /*constan drepturile
ta intreaga hexasunt rezervate
zecim autorului.
ala de tipu l long */

3.3.1.2 Constante
Multiplicarea reale în scop comercial este interzis|.
acestui document
Constanta real| numit| Õi flotant| este un numa7 r re al cu se mn ce nu-Õi schimb| valoarea
în program
SudenÛii Õi care se la
participanÛi reprezint | în RAM
orice form| printr-o por
de înv|Û|mânt Ûiune întreag
superior |, una
bugetar fracÛionar|acest
pot multiplica Õi un
exponent. PrezenÛa punctului zecimal este obligatorie în constanta real|, excepÛie f|când
document pentru uzul personal.
cazul când se include exponentul.
SudenÛii
23.123 /* participanÛi
numarul real la orice
scris form|
"normde
al"înv|Û|mânt
sub form a cu plat|*/sau alte persoane doritoare
23,123
pot multiplica
1.456e1 /* 14.56documentul
*/ numai contra cost Õi cu acordul scris al autorului. În acest
1456e-2
scop m| /* 14.56contact|
puteÛi */ la:
1.456e-1 /* 0.1456 */
-1.23e3 /* -1230 */
ANTAL
.123e01 /*Tiberiu
1.23 */ Alexandru
tel.: 0040-264-530918
Din exemplele
e-mail: anterioare se observ| c| implicit constantele reale sunt pozitive, cu excepÛia
antaltiberiu@pcnet.ro
cazului în care sunt precedate de semnul minus. Ele pot avea tipurile float, long Õi long
doub le . Im plicit o constat| real| este de tipul doub le . Dac| se folosesc sufixele f sau F
tipul este float, iar în cazul sufixelor l sau L tipul este long d ou ble .

36
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
777.L /* constan ta reala de tipul long dou ble */
Facultatea ConstrucÛii de MaÕini
777.F /* constan ta reala de tipul float */
Catedra de Mecanic|
777.D /* constan ta realaÕi Programare
de tipul dou ble */
Curs/*deconstan
777. limbaj taC reala de tipul dou ble */

3.3.1.3
CopyrightConstante caracter
2001. Toate drepturile sunt rezervate autorului.
Constanta caracter se formeaz| prin inclu dere a între apo strofu ri (') a unui singur
caracter. Caracterele sunt codificate conform reprezent|rii ASCII (American Standard
Multiplicarea acestui document în scop comercial este interzis|.
Code for Information Interchange). Aceasta asociaz| fiec|rui caracter, grafic sau negrafic,
o valoare numeric| întreag| unic| în domeniul 0-127. Valoarea constantei caracter este
SudenÛii
valoarea participanÛi la orice form|
numeric| a caracterului de înv|Û|mânt
respectiv asociat însuperior bugetarASCII
reprezentarea pot multiplica acest
(codul ASCII).
document
Din pentruconstantele
acest motiv uzul personal.
caracter pot participa în operaÛii numerice asemenea unor
întregi. Codurile ASCII ale caracterelor se prezint| sub forma unei liste care specific|
codificarea în octal, lazecimal
SudenÛii participanÛi Õi hexazecimal
orice form| de înv|Û|mânt pentru fiecare
cu plat| caracter
sau alte împreun
persoane | cu
doritoare
reprezentarea lui grafic| lanumai
pot multiplica documentul tip|rire Õi semnifica
contra Ûiaacordul
cost Õi cu lui (pentru
scriscaracterele negrafice):
al autorului. În acest
scop m| puteÛi contact| la:
Octal Zecimal Hexazecimal Nume, Explica Ûie 042 34 0x22 ", ghilime le
043 35 0x23 #, hash
ANTAL Tiberiu Alexandru
000 0 0x00 NUL 044 36 0x24 $, dolar
tel.: 0040-264-530918
001 1 0x01 SOH 045 37 0x25 %, procent
e-mail:
002 2
antaltiberiu@pcnet.ro
0x02 STX 046 38 0x26 &, ampersand
003 3 0x03 ETX, Con trol-C 047 39 0x27 ', apostrof
004 4 0x04 EOT 050 40 0x28 (, parentez| deschis |
005 5 0x05 ENQ 051 41 0x29 ), parentez| închis |
006 6 0x06 ACK 052 42 0x2a *, asterisc
007 7 0x07 BEL 053 43 0x2b +, plus
010 8 0x0 8 BS, Õ terge la stânga
Conf. dr. ing. ANTAL Tiberiu Alexandru cursorului 054 44 0x2c ,, virgul|
011 9 0x09 HT, tabulator orizontal 055 45 0x2d -, minus
Universitatea Tenhic| din Cluj-Napoca
012 10 0x0a LF, trecere la linie nou| 056 46 0x2e ., punct
Facultatea ConstrucÛii de MaÕini
013 11 0x0b VT, tabulator vertical 057 47 0x2f /, oblique stroke
Catedra
014 12 0x0c
de Mecanic| Õi Programare
FF, form feed 060 48 0x30 0
Curs
015 13de limbaj
0x0d C
CR, retur de car 061 49 0x31 1
016 14 0x0e SO 062 50 0x32 2
Copyright
017 15 2001.
0x0f SI Toate drepturile sunt rezervate autorului.
063 51 0x33 3
020 16 0x10 DLE 064 52 0x34 4
021 17 0x1 1 acestui
Multiplicarea DC1, XO document
N, Control-Q în scop comercial065 53este0x35 5
interzis|.
022 18 0x12 DC2 066 54 0x36 6
023 19 0x1 3 DC3, XO FF, Con trol-S 067 55
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar 0x37 7 pot multiplica acest
024 20 0x14 DC4 070 56 0x38 8
document pentru uzul personal.
025 21 0x15 NAK 071 57 0x39 9
026 22 0x16 SYN 072 58 0x3a :, doua7 puncte
SudenÛii
027 23 participanÛi
0x17 ETB la orice form| de înv|Û|mânt 073 59 cu 0x3b
plat| sau alte Õpersoane
;, punct i virgul| doritoare
pot
030 multiplica
24 0x18 documentul
CAN numai contra cost074 Õi cu
60 acordul
0x3c scris <, maial mic
autorului.
decât În acest
scop
031 25 m| puteÛi
0x19 contact|
EM la: 075 61 0x3d =, egal
032 26 0x1a SUB 076 62 0x3e >, mai mare decât
ANTAL
033 27 TiberiuESC,
0x1b Alexandru
escape 077 63 0x3 f ?, semn de întrebare
034
tel.: 28 0x1c FS
0040-264-530918 0100 64 0x40 @, Õ i comercial
035 29 0x1d GS
e-mail: antaltiberiu@pcnet.ro 0101 65 0x41 A
036 30 0x1e RS 0102 66 0x42 B
037 31 0x1f US 0103 67 0x43 C
040 32 0x20 spa Ûiu 0104 68 0x44 D
041 33 0x2 1 !, semn de e xclamare 0105 69 0x45 E

37
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
0106 70
Facultatea 0x46 F
ConstrucÛii de MaÕini 0144 100 0x64 d
0107 71 0x47 G 0145 101 0x65 e
Catedra de Mecanic| Õi Programare
0110 72 0x48 H 0146 102 0x66 f
Curs
0111 73
de limbaj
0x49
CI 0147 103 0x67 g
0112 74 0x4a J 0150 104 0x68 h
Copyright
0113 75 2001.
0x4b Toate
K drepturile sunt rezervate autorului.
0151 105 0x69 i
0114 76 0x4c L 0152 106 0x6a j
Multiplicarea
0115 77 0x4d acestui
M document în scop comercial este 0x6b
0153 107 interzis|. k
0116 78 0x4e N 0154 108 0x6c l
0117 79
SudenÛii 0x4f O
participanÛi la orice form| de înv|Û|mânt 0155 109superior
0x6d bugetar m pot multiplica acest
0120 80 0x50 P
document pentru uzul personal. 0156 110 0x6e n
0121 81 0x51 Q 0157 111 0x6f o
0122 82 0x52 R 0160 112 0x70 p
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
0123 83 0x53 S 0161 113 0x71 q
pot multiplica
0124 84 0x54
documentul
T
numai contra cost0162 Õi cu
114
acordul
0x72
scris r
al autorului. În acest
scop
0125 85m| puteÛi
0x55 contact|
U la: 0163 115 0x73 s
0126 86 0x56 V 0164 116 0x74 t
ANTAL
0127 87 Tiberiu
0x57 Alexandru
W 0165 117 0x75 u
0130 0040-264-530918
tel.: 88 0x58 X 0166 118 0x76 v
0131 89 0x59 Y
e-mail: antaltiberiu@pcnet.ro 0167 119 0x77 w
0132 90 0x5a Z 0170 120 0x78 x
0133 91 0x5b [, parantez | dreptunghiular | deschis | 0171 121 0x79 y
0134 92 0x5c \, backslash 0172 122 0x7a z
0135 93 0x5d ], parantez | dreaptunghiular | închis | 0173 123 0x7b {, acolad| deschis |
0136 94 0x5e ^, caret 0174 124 0x7c |, bar| vertical|
0137 95 0x5f _, underscore 0175 125 0x7d }, acolad| închis |
Conf.
0140 96 dr. ing.
0x60 ANTAL Tiberiu
`, back quote Alexandru 0176 126 0x7e ~, tilda
Universitatea
0141 97 0x61 Tenhic|
a din Cluj-Napoca 0177 127 0x7f, delete, Õ terge caracterul de pe pozi Ûia curent|
Facultatea
0142 98 ConstrucÛii
0x62 b de MaÕini
Catedra de Mecanic| Õi Programare
0143 99 0x63 c
Curs de limbaj C
Unele caractere ASCII sunt negrafice, utilizarea lor fiind special|. În C ele se scriu
precedate
Copyrightde caracterul "\ ". Valorile zecimale ale acestor coduri sunt cuprinse în domeniul
2001. Toate drepturile sunt rezervate autorului.
0-31. De exemplu, caracterul cu numele BS (backspa ce ) are ca efect trecerea din poziÛia
curent| a cursorului cu un caracter la stânga. În C el se scrie sub forma '\b'. Caracterul
Multiplicarea
cu numele BEL acestui document
(audible alert )înare
scopcacomercial este interzis|.
efect emiterea unui sunet de c|tre difuzorul
calculatorului Õi în C se scrie sub forma '\a'. Aceste caractere speciale se mai numesc Õi
secvent- e participanÛi
SudenÛii escape . Elela orice
vor form| mai
fi tratate de înv|Û|mânt Ûia printf()
superior
pe larg la func bugetar. pot multiplica acest
document pentru uzul personal.
Un caracter se va stoca într-o variabil| de tipul char Õi se poate specifica prin codul lui
octal, zecimal
SudenÛii sau hexazecimal.
participanÛi la orice form|Astfel, în locul lui 'A'
de înv|Û|mânt se poate
cu plat| sau scrie 0101 , 65 sau
alte persoane 0x4 1. O
doritoare
eroare
pot multiplica | este când în
frecventdocumentul loculcontra
numai valorii cost
întregi 0 scriem
Õi cu . '0' este
acordul'0'scris o constantÎn
al autorului. | caracter
acest
având codul ASCII 48 , care nu are nici o leg|tur| cu valoarea numeric| 0 (zero). Exist|
scop m| puteÛi contact| la:
posibilitatea specific|rii unui caracter oarecare prin scrierea '\ooo', unde ooo este un
num|r în octal sau prin '\xhh', unde hh este un num|r în hexazecimal corespunz|tor
ANTAL TiberiualAlexandru
codului ASCII caracterului. Conform celor spuse, constanta caracter zero se poate
tel.: 0040-264-530918
defini prin '\0'. Aceasta are o semnificaÛie special| în limbajul C fiind caracterul care
e-mail:
marcheaz | terminarea unui Õir de caractere.
antaltiberiu@pcnet.ro

3.3.1.4 Constanta s- ir de caractere


Din punct de vedere tehnic, un Õir de caractere se scrie în C ca un tablou cu elemente de
tipul caracter. Întrucât tabloul este, asemenea poantorului, un tip de dat| structurat|

38
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
pentru moment
Facultatea este suficient
ConstrucÛii de MaÕinis| ÕtiÛi cum se scrie.
Catedra de Mecanic| Õi Programare
O constant| Õir este o secvenÛ| vid| - f|r| nici un caracter - sau cu mai multe caractere
Curs de limbaj
cuprinse C
între ghilimele: "john ", "balada ", "te salut baietas ". SemnificaÛia special| a
caracterului "\ " se p|streaz| Õi aici, el putând ap|rea în interiorul unor constante Õir. De
Copyright 2001. Toate
obicei, "\ " apare drepturile sunt rezervate autorului.
sub formele:

\' caracterul apostrof


Multiplicarea folosit Õi la
acestui ,document în constanta Õir; este interzis|.
scop comercial
\" caracterul gh ilim ele , folosit la constanta Õir;
\\ caracterul
SudenÛii backslash
participanÛi la orice | \ . de înv|Û|mânt superior bugetar
, adicform| pot multiplica acest
document pentru uzul personal.
De exemplu, "Ghio mi-o zis \"Salutare ...\"" este o constant| Õir care conÛine dou|
ghilimele, iar de exemplu, ' \' ' este constanta caracter '.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
3.3.2 Constante cu nume
scop m| puteÛi contact| la:
Dac| ideea folosirii caracterelor F , L , D etc. pentru specificarea tipului unei constante pare
prea
ANTAL put-in 7 , C are cuvântul cheie const care se poate scrie în faÛa declaraÛiei unei
riguroasa
Tiberiu Alexandru
variabile pentru a defini un nume de constanta7 cu tip . Valoarea acesteia nu se va putea
tel.: 0040-264-530918
modifica. Câteva exemple sunt:
e-mail: antaltiberiu@pcnet.ro
const char sapt=7;
const double pi=3.141592653590;
const cha r me saj[ ] = "Salutare !";

Prin folosirea lui const tipul este specificat explicit. O constant| este tratat| ca o r-value
(Conf.
right dr. adic| poate
ing.), ANTAL
value s| apar
Tiberiu | numai în dreapta unui egal (= ). O instrucÛiune de forma
Alexandru
sapt=8; este incorect
Universitatea Tenhic| | Õdin
i produce mesajul de eroare "invalid lvalue".
Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
3.3.3 Constante ale preprocesorului
Catedra de Mecanic| Õi Programare
Curs de limbaj C
Preproceso ru l este o caracteristic| specific| limbajului C, fiind un edi tor d e tex te
nein teractiv care este "plasat" în faÛa compilatorului. Din acest motiv compilatorul nu
Copyright 2001.
"vede" instruc Ûiunile
Toatescrise
drepturile sunt rezervate
în program, pe acelea care formeaz| ieÕirea
autorului.
ci numai
preprocesorului. Asemenea oric|rui editor de texte, preprocesorul are o seam| de
instruc Ûiuni deacestui
Multiplicarea substitu Ûie de Õîn
document iruri decomercial
scop caractereesteÕi interzis|.
de includere de fiÕiere în textul
documentului curent - care este programul C scris de noi. O astfel de instrucÛiune este
#include care are ca la
SudenÛii participanÛi efect
oriceincluderea
form| decon Ûinutului fi
înv|Û|mânt Õierului bugetar
superior specificat
potînmultiplica
programulacest
care
va fi compilat. Opera Ûiile
document pentru uzul personal. de c| utare Õi substitu Ûie ale preprocesorului se definesc prin
instrucÛiunea #define .

1 SudenÛii
#includeparticipanÛi
<stdio.h> la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
2 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
3 #define PI 3.141592653500L
scop m| puteÛi contact| la:
4 #define ZILE_SAPT 7
5 #de fin e C R '\x d' /* Retu r de Ca r */
6 ANTAL
#define Tiberiu Alexandru
PIpe2 PI/2.
7 tel.: 0040-264-530918
8 int zile=ZILE_SPAT;
e-mail: antaltiberiu@pcnet.ro
9 lon g pi_in_lo ng =P I; /* Valoa rea lui P I */

Forma generala7 a #define -ului este:

39
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Form 7:
Facultatea
a ConstrucÛii
#d efin e denu m e tex t_d e_ su bstitu Ûie
MaÕini
Catedra de Mecanic| Õi Programare
Curs de cuvintele
Numai limbaj C întregi sunt substituite, iar Õirurile de caractere C - secvenÛe de
caractere cuprinse între ghilimele - Õi comentariile nu se modific|. De exemplu, Õirul de
caractere
CopyrightPI va fiToate
2001. substituit prin Õsunt
drepturile irul de caractere
rezervate 3.141592653500L în tot programul C.
autorului.
ObservaÛi c| punct Õi virgul| (;) lipseÕte de la sfârÕitul instrucÛiunilor preprocesorului, iar
între PI Õi 3.141592653500L
Multiplicarea acestui document nu apare
în scopsemnul egaleste
comercial (= ).interzis|.
Din motive istorice constantele
preprocesorului se scriu cu litere mari. În linia 6 observat-i o exp resie constanta7 . Aceasta
este o expresie
SudenÛii care la
participanÛi tot-i form|
areorice termenii constante. Expresiile
de înv|Û|mânt obis- nuite
superior bugetar pot sunt evaluate
multiplica în
acest
timpul execut-iei programului, expresia constanta7 este evaluata7 în timpul compila7 rii
document
programului pentru uzultot
întrucât personal.
-i termenii ei sunt determinat-i deja la acel moment.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
3.3.4 Constante enumerate
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Constantele enumerate
scop m| puteÛi se prezint| sub forma unei liste de întregi cu nume.
contact| la:

ANTAL
Form 7:
a Tiberiu Alexandru
enum 7 }
identificator { lista
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
În limbajul C K&R, listele de valori erau definite folosind #define -ul astfel:

#define duminica 0
#d efine luni 1
#d efine ma rti 2
#d efine mie rcur i 3
#d efine joi 4
Conf. dr.vine
#d efine ing.riANTAL
5 Tiberiu Alexandru
#define sambata 6
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
În limbajul
Catedra C modern,
de Mecanic| exist| posibilitatea declar|rii unor tipuri enumerate de date
Õi Programare
folosind enum astfel:
Curs de limbaj C
enum zi {duminica, luni, marti, miercuri, joi, vineri, sambata} zidelucru;
Copyright 2001. Toate drepturile sunt rezervate autorului.
Efectul este acelaÕi ca în cazul codului anterior, adic| dum inica = 0 , , sam bata = 6 dar
aici, faÛ| de lista
Multiplicarea de #define
acestui -uri de
document înmai
scopsus, apare ascunderea
comercial informaÛiilor Õi posibilitatea
este interzis|.
declar|rii unor variabile de tipul zi. Valoarea primei constante este implicit 0 , valorile
nespecificate cresc înlaprogresie
SudenÛii participanÛi orice form| aritmetic | cu raÛsuperior
de înv|Û|mânt ia 1 de labugetar
ultima pot
valoare acest|.
specificat
multiplica
Enumerarea const | în
document pentru uzul personal.specificarea unei mul Ûimi de constante întregi. O declara Ûie de tip
enumerat d| numele opÛional - în exemplul de mai sus zi - unui identificator de tipul
enumerat - zidelucru - Õi defineÕte o mulÛime de identificatori întregi - du m inica , luni,
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
m arti , ..., sam ba ta - uneori numiÛi Õi mem bri . O variabil| de tipul enumerat stocheaz| una
pot multiplica
din valorile documentul
specificate numai contra
la definirea tipuluicost Õi cu acordul
enumerat. scris alreguli
Urm|toarele autorului. În|acest
se aplic pentru
scop m| puteÛi contact|
membrii unei mulÛimi enumerate:la:
• pot exista valori constante duplicate. Astfel, de exemplu, se poate asocia valoarea
ANTAL 0 Tiberiu identificatori diferiÛi, de exemplu nu ll Õi zero , în aceeaÕi mulÛime
la doi Alexandru
enumerat|;
tel.: 0040-264-530918

e-mail:numele din lista enumerat| trebuie s| fie distincte de alte nume cu aceeaÕi
antaltiberiu@pcnet.ro
vizibilitate, incluzând aici numele de variabile Õi numele din alte liste enumerate.
Vizibilitatea este porÛiune de program în care un nume poate fi folosit. NoÛiunea
se va l|muri la prezentarea funcÛiilor.

40
Capitolul
Conf. - Variabile,
dr.3 ing. ANTAL tipuri Õi constante
de dateAlexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Variabilele de tipul enum
Facultatea ConstrucÛii pot fi utilizate la indexarea expresiilor Õi ca operanzi ai
de MaÕini
operatorilor aritmetici Õi
Catedra de Mecanic| Õi Programarerela Ûionali. Un exemplu clasic de tip enumerat este cel boolean ,
de care C nu beneficiaz| implicit. În C, la declararea variabilei enumerate este obligatorie
Curs de limbaj
folosirea lui enumC înaintea tipului enumerat (vezi exemplul care urmeaz| - Boolean este
un tip de dat|, iar sfars it s- i inceput sunt variabile de acest tip).
Copyright 2001. Toate drepturile sunt rezervate autorului.
enum Boolean /* Declara rea u nui tip en um erat nu mit B oolean */
{Multiplicarea acestui document în scop comercial este interzis|.
false, /* false = 0, true = 1 */
true
SudenÛii
}; participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru
en um Bo olea uzul
n sf ars it,personal.
ince pu t; /* doua variab ile de tipul Boolea n */

În ANSIparticipanÛi
SudenÛii C, expresiilelacare
oricedefinesc
form| devalorile membrilor
înv|Û|mânt list|alte
dinsau
cu plat| trebuie s| fiedoritoare
persoane constante
întregi.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

41
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

4 Operatori
Multiplicarea acestui document în scop comercial este interzis|.

P
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
ân|pentru
document
iar "numele"
SudenÛii
acum am
uzulvorbit
operatorului
participanÛi
despre variabile Õi constante. Valorile stocate în variabile se
personal.
pot modifica sub controlul operatorilor. Operatorul acÛioneaz| asupra operanzilor,
la oricespune
form|cedeseînv|Û|mânt
va face cucuvalorile stocate
plat| sau în operanzi.
alte persoane Dup|
doritoare
num|rul de operanzi asupra c|rora acÛioneaz| avem operatori unari, binari Õi ternari.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
4.1 Operatorul de atribuire
ANTAL Tiberiu Alexandru
Operatorul de atribuire în C este semnul = . În operaÛiile de atribuire operandul din stânga
tel.: 0040-264-530918
operatorului de atribuire trebuie s| fie o l-val u e modificabil| - un nume de variabil|.
e-mail:
Valoarea antaltiberiu@pcnet.ro
numeric| din dreapta egalului se atribuie variabilei din stânga. Dac| în stânga
avem o expresie aritmetic|, aceasta este evaluat| în prealabil, pentru a i se g|si valoarea.
Dac| este cazul, dup| evaluare, expresia aritmetic| se converteÕte la tipul numelui de
variabil| la care se atribuie. Dup| atribuire, expresia de atribuire ia valoarea operandului
din stânga lui = dar f|r| a fi o l-value . Dac| vorbim despre adunarea "1+2", atunci "+" este
operatorul, "1" Õi "2" sunt operanzii, efectul este adunarea valorilor numerice ale celor doi
operanzi, iar rezultatul
Conf. dr. ing. adun|riiAlexandru
ANTAL Tiberiu este 3. Dac| vorbim despre atribuirea simpl| "i=1;" atunci
"=" este operatorul,
Universitatea Tenhic| Õi "1"
"i"din sunt operanzii, efectul este stocarea valorii numerice "1" în
Cluj-Napoca
variabila cu numele"i", iar
Facultatea ConstrucÛii de MaÕinirezultatul atribuirii este valoarea numeric| "1".

1
Catedra
int a,b,c;
de Mecanic| Õi Programare
2 Curs de
a=b=c=77; limbaj C
3 prin tf("%d \n ",c=10 8);
Copyright 2001. Toate drepturile sunt rezervate autorului.
Când se face o atribuire în C, valoarea atribuit| este stocat| într-un registru al UCP.
Aceast | valoare
Multiplicarea din registru
acestui esteîncea
document care
scop Õte interzis|.
se foloseeste
comercial în continuare, eventual ea poate fi
rescris| de urm|toarea atribuire.
SudenÛii
În linia 2participanÛi
, valoarea dela77orice form| |deînînv|Û|mânt
, se plaseaz RAM la adresa superior bugetar
corespunz pot multiplica
|toare variabilei cacest
Õi se
document
stocheaz| pentru
într-un uzul personal.
registru din UCP, în acelaÕi timp. Valoarea din registru este apoi
atribuit| lui b Õi lui a .
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
În
potlinia 3, valoarea
multiplica 108 senumai
documentul atribuie lui ccost
contra , iarÕi valoarea
cu acordul se al
scris
108 plaseaz | Õi înÎnregistru.
autorului. acest
Valoarea | în registru
salvatcontact|
scop m| puteÛi la: este cea afiÕat| de printf() sub controlul descriptorului "%d".
Atribuirea din linia 2 se numeÕte multipla7 , iar cea din linia 3, simpla7 .
ANTAL Tiberiu Alexandru

4.2 Operatori aritmetici


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Operatorii aritmetici ai limbajului C sunt:

42
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Forma7 deConstrucÛii
Facultatea scriere în C de MaÕini Nume operat-ie
Catedra de Mecanic| Õi Programare
Curs de limbaj +
C adunare
- sc|dere
Copyright 2001. Toate drepturile sunt rezervate autorului.
* înmulÛire
Multiplicarea / acestui document în scop comercial
împ |rÛire este interzis|.
%
SudenÛii participanÛi modulo
la orice form| de (restul împ|rsuperior
înv|Û|mânt Ûirii) bugetar pot multiplica acest
document pentru uzul personal.
"+ " Õi "- " pot s| fie atât unari cât Õi binari , adic| sunt permise formele de scriere:
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
1 x=-y;
2
pot
x=z-u;
multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
3 scop
x= +k; m| puteÛi contact|
/* Acelas la:x=x+k */
i lucru cu
4 x=a+b;
ANTAL Tiberiu Alexandru
În
tel.:linia 1 operatorul "- " este unar pentru c| are un singur operand, pe y , iar rezultatul
0040-264-530918
întors
e-mail:de el este valoarea lui y înmulÛit| cu -1 . În linia 2 operatorul "- " are doi operanzi pe
antaltiberiu@pcnet.ro
z Õi u , valoarea întoars| de el fiind diferenÛa dintre z Õi u . În linia 3 "+ " este unar, iar ca
rezultat este echivalent cu forma de scriere din comentariul al|turat.

C are un operator numit "restul împ|rÛirii". Daca7 pentru împa7 rt-irea întreaga7 rezultatul
expresiei 17/3 este 5 la folosirea operatorului modulo, în locul celui de împa7 rt-ire, rezultatul
expresiei 17%3 este 2. Un astfel de calcul are sens numai pentru numere întregi întrucât,
numai aiciing.
Conf. dr. exist | rest. La
ANTAL împ|Alexandru
Tiberiu rÛirea unor valori reale nu exist| rest, ci numai o fracÛie.
Universitatea Tenhic| din Cluj-Napoca
Unele limbaje
Facultatea de programare
ConstrucÛii au operatori speciali pentru ridicare la putere ("^" în Basic
de MaÕini
sau "**" în
Catedra deFORTRAN). C nu are un astfel de operator, dar are implementata7 funct-ia de
Mecanic| Õi Programare
biblioteca7 pow () în acest scop.
Curs de limbaj C
În continuare dau un exemplu de utilizare al operatorilor aritmetici:
Copyright 2001. Toate drepturile sunt rezervate autorului.
1 /* OP AR IT.C */
2 int m ain ()
Multiplicarea acestui document în scop comercial este interzis|.
3 {
4 int a, b, c; /* variab ile intregi */
5 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
6 documenta = pentru
12; uzul personal.
7 b = 3;
8 SudenÛiic =participanÛi
a + b; la/* aduform|
orice nare de */înv|Û|mânt cu plat| sau alte persoane doritoare
9 c = a - b; /* scade re */
10
pot multiplica
c = a * b;
documentul numai contra cost Õi cu acordul scris al autorului. În acest
/* inm ultire */
11 scop m| puteÛi
c = a / b; contact| la:
/* imp artire */
12 c = a % b; /* modulo */
13 ANTAL c Tiberiu
= 12*a + b /2 - a *b*2 /(a*c + b*2 );
Alexandru
14 c = c/4+13*(a + b)/3 - a*b + 2*a*a;
15
tel.: 0040-264-530918
a = a + 1; /* increm entarea variab ilei a */
16 e-mail:bantaltiberiu@pcnet.ro
= b * 5;
17
18 a = b = c = 20; /* atribuire m ultipla */
19 a = b = c = a + b * c/3;
20
21 a = (b = (c = 20)); /* identica cu linia 18 */

43
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
22 return 0;
Facultatea ConstrucÛii de MaÕini
23 }
Catedra de Mecanic| Õi Programare
Curs de limbaj
Rezultatele C
programului sunt neinteresante pentru a fi afiÕate, dar ca exerciÛiu, pentru
c| ÕtiÛi deja cum s| afiÕat-i valoarea unor întregi utilizând printf() , puteÛi insera câteva
instruc
Copyright Ûiuni2001. Õire în drepturile
de ieToate diferite puncte ale programului
sunt rezervate pentru a verifica dac| intuiÛi bine
autorului.
rezultatele calculate în program. Nu uitaÛi s| ad|ugaÛi #include<stdio.h> pentru cazul în
care utilizaÛi printf()
Multiplicarea acestui. document în scop comercial este interzis|.

4.2.1 Conversii la utilizarea operatorilor


SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
aritmetici
SudenÛii
Dac | tratparticipanÛi la orice form|
|m cazul operatorului de înv|Û|mânt
de adunare cu plat|ssau
"+ ", el trebuie alte
| poat persoane
| aduna doritoare
numai întregi,
pot multiplica
numai Õi întregi cunumai
reali, câtdocumentul reali. contra
Cel maicost Õi cuar
simplu acordul s| existe
fi fost scris al autorului. În acest de
câte un operator
adunare pentrucontact|
scop m| puteÛi la: îns| atât pentru întregi (char, short , int, long ) cât Õi pentru
fiecare caz,
reali (float, double , long d ou ble ) exist| mai multe tipuri. Se observ| c| num|rul de
ANTAL ÕTiberiu
variante i de combina Ûii este mare. C-ul elimin| aceast| problem| prin operatorul "+ " care
Alexandru
tel.: 0040-264-530918 adunare pe care o va face. Dac| "+ " are doi operanzi de tipul int
va alege singur tipul de
se va realiza
e-mail: adunare întreag|, dac| are doi operanzi de tipul float se va realiza adunare
antaltiberiu@pcnet.ro
flotant| - de numere reale. Ce se petrece în cazul în care unul din operanzi are tipul int,
iar cel|lat tipul float? Fie exemplul:

1 /* OP AR ITCV .C */
2 #include<stdio.h>
3 int main (void)
4 {
5
Conf. dr. ing. ANTAL Tiberiu Alexandru
int a,b,c;
6 Universitatea
doub le Tenhic|
x,y,z; din Cluj-Napoca
7 Facultatea ConstrucÛii de MaÕini
8 Catedraa=7;
de Mecanic| Õi Programare
9 b=3;
10
Curs de limbaj C
11 x=7.0;
12 y=3.0;
Copyright 2001. Toate drepturile sunt rezervate autorului.
13
14 c=a /b ; /* a si b su nt intregi => se realizea za im partire intrea ga */
15
Multiplicarea acestui document în scop comercial este interzis|.
prin tf("%i\ n",c);
16
17 SudenÛii
z=xparticipanÛi
/y ; /* x si la orice
y su form|=>de
nt reali seînv|Û|mânt
realizeaza superior bugetar
imp artire pot*/multiplica acest
flotanta
18 prin tf("%f\ n",z);
document pentru uzul personal.
19
20 z=a /b ;
21 SudenÛii participanÛi
prin la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
tf("%f\ n",z);
22 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
23 scop m|return
puteÛi 0;
contact| la:
24 }

ANTAL
Rezultate:Tiberiu Alexandru
tel.: 0040-264-530918
2
e-mail: antaltiberiu@pcnet.ro
2.333333
2.000000

Conform celor spuse, compilatorul decide dac | rezultatul întors de operand este întreg
sau real, funcÛie de tipul operanzilor. În acest caz pentru linia 14 (c=a/b ) împ|rÛirea este

44
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
întreag
Facultatea | pentru c| a Õi de
ConstrucÛii b sunt de tip întreg (int). Interesant este rezultatul afiÕat în linia
MaÕini
21 , aici împ|rÛirea este tot de tip întreg, îns| din cauza 7 c| z este real, rezultatul împ|rÛirii
Catedra de Mecanic| Õi Programare
se converteÕte automat la tipul doub le . O astfel de împ|rÛire produce probleme din cauz|
Curs
c| împ de|rlimbaj
Ûirea aCdoi întregi va da întotdeauna un întreg, deÕi poate noi am dori ca
împ|rÛirea s| se fac| la fel ca pentru cazul unor valori reale, din moment ce atribuim
Copyright 2001.
rezultatul împ |rÛToate drepturile
irii unei variabile sunt
reale.rezervate
Conformautorului.
standardului, într-o astfel de împ|rÛire
partea zecimal| se pierde f|r| s| apar| rotunjiri în sus sau în jos ca în alte limbaje de
MultiplicareaOacestui
programare. variant | de trecere
document la împ
în scop |rÛirea flotant
comercial | ar fi ca valorile lui a Õi b s| fie
este interzis|.
atribuite la dou| variabile reale, apoi împ|rÛirea s| se efectueze între aceste variabile.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Când un operator
document pentru uzul operanzi de tipuri diferite se realizeaz| conversia automat| a
arepersonal.
operazilor mai "limitaÛi" spre operanzii mai "complecÕi" pentru evitarea pierderii de
informaÛie. Dac| se doreÕte realizarea explicit| a unor conversii - conversie fort-ata7 - din
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
cauza c| nu se face automat sau dorim s| fim siguri de portabilitatea codului, se poate
pot multiplica
folosi documentul numai contra cost Õi cu acordul scris al autorului. În acest
oper atoru l de con vers ie (type cast ) care are forma:
scop m| puteÛi contact| la:
7:
Form a (tip) expr esie
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Operatorul de conversie modific| temporar tipul variabilei sau expresiei la care se aplic|.
e-mail: antaltiberiu@pcnet.ro
Din acest motiv în liniile 11 , 12 Õi 13 ale programului urm|tor (OPA RITC 1.C ) se realizeaz|
împ|rÛire flotant|. Modalitatea de lucru a compilatorului de exemplu pentru linia 12 este:
a se converteÕte temporar la un doub le , din acest motiv 7 devine 7.0. Acum, compilatorul
are de împ|rÛit un doub le la un int Õi îl va converti automat (în englez| termenul este
promoted ) pe b la tipul doub le (b devine 3.0 ), realizând împ|rÛirea doub le (flotanta 7)
conform regulilor aritmeticii numerelor reale, iar rezultatul va fi 2.333333. În linia 16 ,
parantezele
Conf. dr. ing.rotunde
ANTAL rezolv|Alexandru
nuTiberiu nimic, iar rezultatul împ|rÛirii este 2 , care va fi convertit
la 2.000000.
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
1 /* OP AR ITC1.C */
2
Catedra de Mecanic| Õi Programare
#include<stdio.h>
3 Curs
int main (void) C
de limbaj
4 {
5 Copyrightint a,b;
2001. Toate drepturile sunt rezervate autorului.
6 doub le z;
7
8 Multiplicarea
a=7; acestui document în scop comercial este interzis|.
9 b=3;
10 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
11 z=(double)a/(double)b;
12
document pentru uzul personal.
z=(d ou ble )a/ b;
13 z=a /(d ou ble )b;
14 SudenÛii participanÛi
prin la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
tf("%f\ n",z);
15 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
16
17
scop m|z=(d ou ble )(a/ b);
puteÛi contact| la:
prin tf("%f\ n",z);
18
19 ANTAL Tiberiu
return 0; Alexandru
20 }tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Rezultate:
2.333333
2.000000

Pentru rigoare reiau cazul operanzilor de tipuri diferite când C execut| conversia
45
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
automat
Facultatea| aConstrucÛii
unui tip dede MaÕini la altul, pe baza unor reguli stricte. Regulile se aplic|
operand
numai pentru operatorii
Catedra de Mecanic| Õi Programarebinari Õi numai dac| cei doi operanzi nu sunt de acelaÕi tip.
Pentru a determina care conversii trebuie realizate, compilatorul aplic| urm|torul
Curs de limbaj
algoritm C
operanzilor unui operator binar:
1. Când unul din operanzi este de tipul long d ou ble , cel|lalt se converteÕte Õi el la
Copyright
tipul2001.
long Toate drepturile
d ou ble ; sunt rezervate autorului.
2. În cazul în care condiÛia de mai sus nu este îndeplinit| Õi unul din operanzi este
de tipulacestui
Multiplicarea , cel|lat operand
doub ledocument în scop se Õte interzis|.
converteeste
comercial Õi el la tipul doub le ;
3. În cazul în care condiÛia de mai sus nu este îndeplinit| Õi unul din operanzi este
SudenÛiideparticipanÛi
tipul float, la |lalt operand
celorice form| dese converteÕte
înv|Û|mânt Õi el la bugetar
superior tipul float ; multiplica acest
pot
document4. Înpentru
cazul în care
uzul nici una dintre condiÛiile de mai sus nu este îndeplinit| (din cauza
personal.
tipului operanzilor) urmeaz| conversiile întregi, astfel:
a) Când unul dintre operanzi este de tipul unsigned long , cel|lalt operand
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
este convertit la tipul unsigned long;
pot multiplicab) documentul
Când condinumai
Ûiile decontra
mai sus nuÕisunt
cost cu acordul scrisiar
îndeplinite alunul
autorului. În acest
din operanzi este
scop m| puteÛide contact| la:
tipul long Õi cel|lalt de tipul unsigned int, ambii operanzi se convertesc
la tipul unsigned long ;
ANTAL Tiberiu c) Când condiÛiile de mai sus nu sunt îndeplinite Õi unul dintre operanzi este
Alexandru
de tipul long , cel|lalt operand se converteÕte la tipul long ;
tel.: 0040-264-530918
d) Când condiÛiile de mai sus nu sunt îndeplinite Õi unul dintre operanzi este
e-mail: antaltiberiu@pcnet.ro
de tipul unsigned int, cel|lalt operand se converteÕte la tipul unsigned int;
e) Când nici una din condiÛiile de mai sus nu sunt îndeplinite ambii operanzi
se convertesc la tipul int.

float f;
double d;
int i; dr. ing. ANTAL Tiberiu Alexandru
Conf.
un sign ed longTenhic|
Universitatea ul; din Cluj-Napoca
Facultatea
d=i*u l; /* i ConstrucÛii
co nv ertit ladeunMaÕini
sign ed long (4.), rezu ltatu l inm ultirii con ver tit la dou ble */
Catedra/*deulMecanic|
d=ul+f; Õi Programare
se conve rteste la float (3.), rezultatul adun arii se conv erteste la dou ble */
Curs de limbaj C
Dac| rezultatul unei operaÛii de conversie dep|ÕeÕte domeniul de valori ce corespunde
tipului
Copyrightrezultat,
2001.valoarea va fi trunchiat
Toate drepturile | Õi rezultatul
sunt rezervate va fi dubios. Dup| cum vedeÛi tipul
autorului.
char nu apare mai sus pentru c| el este în realitate un tip int mai "modest". În calcule,

în scopÕte
când este cazul, tipul char se converte automateste
la cel int.
Multiplicarea acestui document comercial interzis|.

4.3 Operatorii de incrementare (++)


SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

- i decrementare
sSudenÛii (--) cu plat| sau alte persoane doritoare
participanÛi la orice form| de înv|Û|mânt
C
potare doi operatori
multiplica unari speciali
documentul numai pentru incrementarea
contra cost (adunarea
Õi cu acordul lui 1 la valoarea
scris al autorului. unei
În acest
variabile) Õi decrementarea
scop m| puteÛi contact| la: (sc|derea cu 1 a valorii unei variabile) variabilelor. De ce s-au
implementat aceÕti operatori într-un limbaj atât de mic cum este C? R|spunsul st| în
coresponden
ANTAL Tiberiu Ûa direct | cu limbajul maÕin|. Toate UCP au o form| de instrucÛiune "inc"
Alexandru
prin care se creÕte cu 1 conÛinutul unei locaÛii de memorie, la fel Õi pentru decrementare.
tel.: 0040-264-530918
Din acest motiv C va traduce operatorii de incrementare Õi decrementare direct în
e-mail:
instrucÛantaltiberiu@pcnet.ro
iuni ale limbajului maÕin|. Fie secvenÛa de instrucÛiuni:

1 int a,b;
2 a=7;
3 b=3;

46
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
4 a++; /* a dev ine 8, form a postfixa ta */
Facultatea ConstrucÛii de MaÕini
5 ++b ; /* b dev ine 4, form a prefix ata */
6 Catedra ine 3 */ Õi Programare
b-- /* b devMecanic|
de
7 Curs/*dea limbaj
--a; dev ineC7 */

Se observ|2001.
Copyright c| operatorii ++ Õi -- ausunt
Toate drepturile o form | postfixata
rezervate 7 Õi una prefixata7 . În ambele cazuri
autorului.
se adun|, respectiv se extrage 1 din valoarea variabilei. DiferenÛele apar la valorile
atribuite.
Multiplicarea acestui document în scop comercial este interzis|.
1 /* IN CD EC .C */
2 SudenÛii
int m ain participanÛi
() la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
3 {document pentru uzul personal.
4 int a, b ; /* intregi in [-32768 , 32767] */
5
6
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
a=7;
7 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
1) a=a+1;
8 scop m|b=++a
puteÛi
; /*contact| la: cu ->
echiva lent */
9 prin tf("b=% d, a=%d \n ", a,b); 2) b=a;
10
11
ANTAL Tiberiu Alexandru
a=7;
tel.: 0040-264-530918 1) b=a;
12 b=a++; /* echiva lent cu -> */
13 e-mail:prin
antaltiberiu@pcnet.ro
tf("b=% d, a=%d \n ", a,b); 2) a=a+1;
14
15 return 0;
16 }

Rezultate:
b=8, a=8
b=8,
Conf. a=7
dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Valoarea expresiei unare este valoarea dupa7 incrementare sau
++Facultatea
, -- prefixat ConstrucÛii de MaÕini
decrementare. La utilizarea operatorilor prefixaÛi, incrementarea sau
Catedra de Mecanic| Õi Programare
decrementarea are loc prima dat|, apoi valoarea modificat| va fi
Curs de limbaj C
atribuit|. În linia 8 , valoarea curent| 7 din a devine 8 , apoi valoarea 8 se copiaz|, datorit|
lui = , în b .
Copyright 2001. Toate drepturile sunt rezervate autorului.
Valoarea expresiei unare este valoarea operandului. Pentru operatorii
postfixat ++ , --
Multiplicarea acestui postfixa Ûi, incrementarea
document sau decrementarea
în scop comercial este interzis|. are loc în faza a doua.
Valoarea nemodificat| este atribuit|, apoi este modificat|. În linia 12 ,
valoarea 7 este copiat|, datorit| lui = , în b , apoi valoarea din a este crescut| cu 1 , devenind
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
8.
document pentru uzul personal.
Pentru realizarea celor descrise, C fie foloseÕte, fie nu foloseÕte un registru temporar
SudenÛii
pentru aparticipanÛi la orice
salva valoarea form|
curent de cazul
|. În înv|Û|mânt cu plat|prefixa
operatorilor sau alte
Ûi, persoane
b=++a; sedoritoare
realizeaz|
pot multiplica documentul
incrementarea, numai
apoi se transfer contra cost
| valoarea. Õi cu acordul
În cazul scris
postfixat, al autorului.
b=a++; C stocheazÎn acest
| valoarea
scop m|
curent | puteÛi contact|registru,
de 7 într-un la: apoi are loc incrementarea (Õi valoarea devine 8 ). În
continuare se extrage valoarea din registru Õi se stocheaz| în b . Astfel, inclusiv în acest
caz,
ANTAL incrementarea are loc înainte de atribuire.
Tiberiu Alexandru
tel.: 0040-264-530918

4.4 Valori de adeva7 r în C


e-mail: antaltiberiu@pcnet.ro

C nu are un tip de dat| special pentru lucrul cu valori de adev|r. Problema este
implementat| prin prisma valorilor numerice ale variabilelor.

47
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Facultatea Oricede
ConstrucÛii valoare
MaÕini numeric| nenul| are valoarea de adev|r adeva7 rat (True).
adeva7 rat (True ) Astfel, întregii 1 Õi -7 au valoarea de adev|r adev|rat pentru c| sunt
Catedra de Mecanic| Õi Programare
nenuli. Similar este tratat| Õi valoarea real| 0.007.
Curs de limbaj C
Orice valoare numeric| nul| are valoarea de adev|r fals (False). Astfel,
fals (False) 2001.
Copyright Toate drepturile
valorile numericesunt rezervate
0, -0, +0, 0.00autorului.
0e-01 au toate valoarea de adev|r fals .

Din acest motivacestui


Multiplicarea testarea valorilorînde
document adev
scop |r în C este
comercial foarte
este direct|. E suficient s| stoc|m
interzis|.
valoarea într-un registru, dup| care verific|m dac| exist| un bit nenul. Dac| da, atunci
valoarea se poate identifica
SudenÛii participanÛi la oriceimediat
form| de fiind adev|rat
ca înv|Û|mânt |. Dac|bugetar
superior nici unpot
bit multiplica
nu este setat pe
acest
1document
atunci valoarea
pentru este
uzul fals|.
personal.

4.5 Operatori relat-ionali


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Operatorii
scop m| puteÛi relaÛcontact| 7 compa rarea a 2 valori num erice , întorcând valoarea de
ionali realizeaza
la:
adev|r adeva7 rat sau fals în funcÛie de validitatea relaÛiei specificate. Dac| relaÛia este
falsa
ANTAL 7 , valoarea
Tiberiunumeric | rezultat| este 0 ; dac| e adeva7 rata7 , valoarea numeric| este 1 .
Alexandru
ExcepÛie fac de la aceast| regul| operatorii == Õi != , când se garanteaz| numai valoarea
tel.: 0040-264-530918
numeric | de 0 pentru fals .
e-mail: antaltiberiu@pcnet.ro
Operator relat-ional Relat-ia testata7
> primul operand este ma i mare decât al doilea
>= primul operand este mai mare sau egal decât al doilea
Conf. dr. ing.< ANTAL Tiberiu Alexandru
primul operand este m ai m ic decât al doilea
Universitatea Tenhic| din Cluj-Napoca
<=
Facultatea ConstrucÛii primul operand este mai mic sau egal decât al doilea
de MaÕini
Catedra de Mecanic|
== Õi Programare
primul operand este egal cu al doilea
Curs de limbaj C
!= primul operand este difer it de al doilea
Copyright 2001. Toate drepturile sunt rezervate autorului.
Operanzii pot fi de tipul întreg, real sau poantor. Tipurile operanzilor pot s| fie diferite,
caz în care se acestui
Multiplicarea vor realiza conversiile
document în scopuzuale pentru
comercial estetipurile întregi Õi reale în vederea
interzis|.
comparaÛiei. În cazul operanzilor poantor, aceÕtia trebuie s| fie poantori la acelaÕi tip.
FuncÛie de implementarea de compilator folosit|, comparaÛiile poantorilor ofer| posibilit|Ûi
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
adiÛionale (comparaÛia unui poantor cu valoarea numeric| 0 sau a unui poantor de tip void )
document
care pot fi pentru
însuÕiteuzul
prinpersonal.
consultarea documentaÛiei compilatorului.

1 SudenÛii
int a,b,c;participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
2 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
a=7;
3 b=a>5;
scop m| puteÛi contact| la:
4 c=b>=144;

ANTAL
În linia Tiberiu Alexandru
3 ,valoarea numeric| 1 , adic| adeva7 rat, se atribuie lui b . În linia 4, valoarea
tel.: 0040-264-530918
numeric | 0 , adic| fals , se atribuie lui c .
e-mail: antaltiberiu@pcnet.ro
Pentru folosirea acestor operatori în exemple C clasice voi anticipa put-in Õi voi descrie pe
scurt instrucÛiunea if , deÕi ea se va discuta formal numai în capitolul de instrucÛiuni. Una
dintre formele de scriere posibile ale lui if este:

48
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
if (condit- ie)ConstrucÛii de MaÕini
Facultatea
Catedra instruct -iune care
de Mecanic| Õi Programare
se executa 7 când condit-ie este adeva7 rata7 ;
else
Curs de limbaj C
instruct- iune care se executa 7 când condit-ie es te falsa7 ;
Copyright 2001. Toate drepturile sunt rezervate autorului.
O eroare frecvent| a încep|torilor în C este utilizarea operatorului de
NuMultiplicarea
confundaÛi = acestuiatribuire (= ) în în
document locul
scopcelui de testare
comercial egalit|Ûii (== ).
este ainterzis|.
cu ==
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
1 /* ER EG AL.C */
2 document pentru uzul personal.
#include<stdio.h>
3
4 int main(void)
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
5 {
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
6 int a = 0;
7 scop m| puteÛi contact| la:
8 if (a=0)
9 ANTAL Tiberiu prin tf("a=0 \n ");
Alexandru
10 else
tel.: 0040-264-530918
11 prin tf ("a<>0\n ");
12 e-mail: antaltiberiu@pcnet.ro
13 return 0;
14 }

Rezultate:
a<>0

Conf. dr.6ing.
În linia lui aANTAL Tiberiu
i se atribuie Alexandru
valoarea 0 . Testul nu este în realitate decât o alt| atribuire.
Universitatea Tenhic| din Cluj-Napoca
Compilatorul va suprascrie vechea valoare a lui a cu valoarea 0 Õi o salveaz| într-un
Facultatea ConstrucÛii
registru. Apoi, de |MaÕini
este testat valoarea din registru. Pentru c| are valoarea numeric| 0 este
7 Õi por
Catedra
falsa iunea elseÕidin
de ÛMecanic| construcÛia if se va executa. Programul va lucra corect dac| în
Programare
loc
Cursdede se vaCscrie a==0 .
limbaj
a=0

Copyright 2001. Toate drepturile sunt rezervate autorului.


4.6 Operatori logici
Operatorii logici
Multiplicarea sunt document
acestui binari, maiînput-in cel
scop de negare
comercial s- i lucreaza7 cu v alor ile logice de
este(!)interzis|.
adeva 7 rat/ fals p erm it-ân d co m bin are a ex presiilor rela t-ion ale (care se obÛin cu ajutorul
operatorilor relaÛionali).
SudenÛii participanÛi Rezultatul
la orice form| deunui operator
înv|Û|mânt logic este
superior o valoare
bugetar logic|, acest
pot multiplica tipul
rezultatului este int . O
document pentru uzul personal. expresie rela Ûionala7 este: a=((b>5) && (c<=123)) || (d>22) || (!e). C
implementeaz| urm|torii operatori logici: S- I, SAU Õi NU. Ar fi fost mai intuitiv| folosirea
unor cuvinte pentru aceÕti operatori, C îns| i-a implementat prin simbolurile & & , || s- i !.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Operatorul N U (!) neag| valoarea operandului. Pentru ceilalÛi operatori prezint în
pot multiplica
continuare documentul
tabele de adev|numai
r dup| contra cost Õi|cu
care opereaz : acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Tabel de adev|r pentru S- I logic Tabel de adev|r pentru S A U logic
ANTAL Tiberiu Alexandru
&& fals adeva 7 rat || fals adeva 7 rat
tel.: 0040-264-530918
e-mail:
fals antaltiberiu@pcnet.ro
fals fals fals fals adeva 7 rat
7 rat
adeva fals 7 rat
adeva 7 rat
adeva 7 rat
adeva 7 rat
adeva

49
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Ca de obicei,
Facultatea valorii de de
ConstrucÛii adev |r adeva7 rat i se asociaz| orice valoare numeric| nenul|, iar
MaÕini
valorii de adev | r fals , valoarea numeric| 0 . Operanzii pot fi de tip întreg sau poantor.
Catedra de Mecanic| Õi Programare
Curs decuvinte,
Spus în limbaj Cfolosind valori de adev|r, S- I logic între doi operanzi întoarce valoarea de
adev|r adeva7 rat numai dac| ambii operanzi au valoarea de adev|r adeva7 rat. SAU logic,
Copyright 2001.valorile
descris folosind Toate drepturile
numerice sunt rezervate
corespunz |toareautorului.
valorilor de adev|r, întoarce valoarea
întreag| 1 dac| unul dintre operanzi este nenul, altfel întoarce valoarea 0 .
Multiplicarea acestui document în scop comercial este interzis|.
Pentru expresiile care conÛin mai mulÛi operatori logici consecutivi, C garanteaz| c|
evaluarea lor se face de
SudenÛii participanÛi la stânga
la orice la dreapta
form| Õi c| vasuperior
de înv|Û|mânt realiza scurtcircuitare când valoarea
bugetar pot multiplica acest
de adev | r a unei expresii se
document pentru uzul personal. poate determina f| r | a-i evalua toÛi termenii;

if (a && b&& c || d)
SudenÛii participanÛi
instruct-iune; la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
În
scopexpresia logic
m| puteÛi | de mai
contact| la:sus prima oar| se evalueaz| a . Dac| ia valoarea adeva7 rat, se
evalueaz| b . Dac| b ia valoarea de adev|r adeva7 rat se trece la c etc., adic| evaluarea se
face
ANTAL de laTiberiu la dreapta. Mai departe, dac| rezultatul de adeva7 rat sau fals poate fi
stângaAlexandru
tel.: 0040-264-530918 dat, nu se mai fac evalu|ri în acelaÕi scop în continuare. De exemplu,
stabilit la un moment
dac | a este
e-mail: adeva 7 rat Õi b fals , c nu ar mai fi evaluat - pentru c| un fals într-un lanÛ de
antaltiberiu@pcnet.ro
& & -uri face ca tot lanÛul s| fie fals (vezi tabela de adev|r pentru && ) - termenul tehnic
fiind de scurtcircuitare. Urm|toarea evaluare care se face este pentru d .

În porÛiunea de program care urmeaz| prezint un exemplu de program care


Utilizarea
nu face ce at-i putea crede. În linia 4 a exemplului urm|tor, prin condiÛia
parantezelor
dintre parantezele rotunde încerc s| zic: "dac| a nu este egal cu 3". Din
rotunde
Conf. dr. ing.nefericire, !a se evalueaz
ANTAL Tiberiu | prima oar|, iar pentru c| a are valoarea 3 , adic|
Alexandru
Universitatea Tenhic| din Cluj-NapocaÕte valoarea de fals , adic| 0 . Apoi, 0 se compar| cu
este adeva7 rata7 , !a prime
3 Õi rezultatul
Facultatea afiÕat vade
ConstrucÛii fi "a egal cu 3" .
MaÕini
Catedra de Mecanic| Õi Programare
1 int a;
2 Curs
a=3; de limbaj C
3
4 if (!a == 3) 2001. Toate drepturile sunt rezervate autorului.
Copyright
5 prin tf("a d iferit de 3 \n ");
6 else
7 Multiplicarea acestui
prin tf("a document
ega l cu 3 \n "); în scop comercial este interzis|.

SudenÛii participanÛi
Pentru eliminarea la orice
acestei form| de
probleme se înv|Û|mânt superior
va folosi o pereche debugetar potînmultiplica
paranteze acest
plus sub forma
== 3)) . Prin
document
(!(a pentruacestea codul va fi mai clar, iar mentenanÛa lui Õi depanarea vor fi mult
uzul personal.
uÕurate în viitor.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare

4.7 Operatori pe bit-i


pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Operatorii pe bit-i sunt binari, mai put-in cel de negare (~ ). Operanzii sunt interpretat-i ca
secvent-Tiberiu
oANTAL a7 de bit-i,Alexandru
except-iile fiind descrise în cadrul notelor din tabelul urma7 tor. Urm|torii
operatori la nivel
tel.: 0040-264-530918 de bit sunt definit-i în C:
e-mail: antaltiberiu@pcnet.ro
Denumire Scriere în C Nota7
- I pe bit-i
S & expresie1 & expresie2

50
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Facultatea
S A U pe bit ConstrucÛii
-i de MaÕini | expresie1 | expresie2
Catedra de Mecanic| Õi Programare
SA U E XC LU SIV pe bit- i ^ expresie1 ^ expresie2
Curs de limbaj C
~expresie1
operatorul mai este numit s- i
Copyright 2001. Toate drepturile sunt rezervate autorului.
N U pe bit- i ~ "complementul lui 1" întrucât
Multiplicarea acestui document în scop comercialrezultatul lui este complementul fat-a7
este interzis|.
de 1 al operandului
SudenÛii participanÛi la orice form| de înv|Û|mântexpresie1
superior <<bugetar pot multiplica acest
expresie2
document pentru uzul personal. operandul expresie1 este interpretat
ca o secvent-a7 de bit-i, iar operandul
SudenÛii participanÛi la orice form| de înv|Û|mântexpresie2 alte 7persoane
specifica
cu plat| sau numa7 ruldoritoare
de bit-i
deplasare la stânga <<
pot multiplica documentul numai contra cost Õi cucuacordul
care se scris
realizeaza 7 deplasarea
al autorului. la
În acest
scop m| puteÛi contact| la: dreapta a secvent - ei de -
bit i
corespunza7 toare operandului
expresie1
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918 expresie1 >> expresie2
e-mail: antaltiberiu@pcnet.ro operandul expresie1 este interpretat
ca o secvent-a7 de bit-i, iar operandul
de pla sar e la d rea pta >>
expresie2 specifica 7 numa7 rul de bit-i
cu care se realizeaza7 deplasarea la
stânga a secvent-ei de bit-i
corespunza7 toare operandului
expresie1
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Ei se pot aplica numai tipurilor întregi (char, short , int Õi long cu sau f|r| semn), iar
Facultatea
rezultatul lor ConstrucÛii
este tot de MaÕini de tipul întreg. C a fost iniÛial creat de Kernighan Õi
o valoare
Catedra
Ritchie pe deoMecanic| Õi Programare
maÕin| PDP-11 pentru scrierea unui sistem de operare Õi din acest motiv ei
Curs de limbaj C
au avut nevoie de instrumente cât mai flexibile pentru manipularea regiÕtrilor maÕinii.
AÕa s-au n|scut operatorii la nivel de bit. VeÛi observa c| & pe bit Õi && logic respectiv |
pe bit Õi || logic
Copyright seama
2001. 7 n|.drepturile
Toate Întrucât Kernighan Õi Ritchie
sunt rezervate foloseau mai mult operatorii pe biÛi
autorului.
decât cei logici au rezervat un singur caracter operatorilor pe biÛi pentru o scriere cât mai
scurt |. În continuare
Multiplicarea acestui sunt prezentate
document tabelele
în scop este|interzis|.
de adev
comercial r pentru operatorii la nivel de biÛi:

Tabel
SudenÛii adev|r pentru
departicipanÛi Tabel
la orice form| dede adev|r pentru
înv|Û|mânt Tabel
superior bugetar adev|r pentru
demultiplica
pot acest
- I pe bit- i
S SAU pe bit- i S A U EXCLUSIV pe bit- i
document pentru uzul personal.
& 0 1 | 0 1 ^ 0 1
SudenÛii
0 0
participanÛi
0
la orice form|
0
de înv|Û|mânt
0 1
cu plat| sau alte
0
persoane
0
doritoare
1
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
1
scop m|0 puteÛi1 contact| la: 1 1 1 1 1 0

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
1 /* OP PE BIT1.C */
e-mail: antaltiberiu@pcnet.ro
2 #include<stdio.h>
3 void m ain ()
4 {
5 unsigne d short a, b, c;
6 char *format1, *format2;

51
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
7
Facultatea ConstrucÛii de MaÕini
8 form at1 =" %04X %s %0 4X = %04X \n";
9 Catedra formMecanic|
de at2 ="%c% 04XÕi Programare
= %04X \n";
10 Curs de limbaj C
11 a=0x0FF0;
12 b=0xFF00;
Copyright 2001. Toate drepturile sunt rezervate autorului.
13
14 c = a << 4;printf(fo rm at1,a ,"<<",4,c );
15 Multiplicarea
c = a >>acestui document
4;printf(form at1,aîn,">>",4,c
scop comercial
); este interzis|.
16 c = a & b;pr intf(fo rm at1,a ," & ",b ,c);
17 c = a | b;p rintf(form at1,a ," | ",b,c);
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
18 c = a ^ b;pr intf(fo rm at1,a ," ^ ",b,c);
19 document pentru
c = ~a uzul personal.
;prin tf(form at2,'~',a,c);
20 a = ~c ;prin tf(form at2,'~',c,a);
21 }SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Rezultate:
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
0FF0 << 0004 = FF00
scop m| puteÛi contact| la:
0FF0 >> 0004 = 00FF
0FF0 & FF00 = 0F00
ANTAL
0FF0 |Tiberiu
FF00 Alexandru
= FFF0
0FF0
tel.: ^ FF00 = F0F0
0040-264-530918
~0FF0 = F00F
e-mail: antaltiberiu@pcnet.ro
~F00F = 0FF0

Specificatorul de format %04X spune c| se vor folosi 0 -uri pentru poziÛiile neocupate,
l|Ûimea num|rului fiind de 4 cifre, num|rul fiind afiÕat în hexazecimal (X este descriptor
pentru baza 16 ). Se Õtie c| un num|r întreg scris în baza de numeraÛie 10 , poate fi convertit
în unul binar - baza de numeraÛie 2 - caz în care num|rul din baza 10 se va transforma
într-o ing.Û|ANTAL
secven
Conf. dr. de 0 Õi 1Tiberiu
. AceÕti Alexandru
operatori act-ioneaza7 la niv el de b it, în sensul c| primul
bit al prim ulu i opera nd va fi p us în corespondent- a 7 cu primul bit al celui de al doilea
Universitatea Tenhic| din Cluj-Napoca
operand , se efectueaz| operaÛia dictat| de operator, apoi se trece la perechea a doua de
Facultatea ConstrucÛii de MaÕini
biÛi Õ.a.m.d.
Catedra de Mecanic| Õi Programare
Curs
Pentru decei
limbaj
care C nu înÛeleg hexa, programul OP PE BIT2 .C prezint| valorile hexa în binar.
Conversia valorii numerice întregi f|r| semn în binar se face folosind o funcÛie din
biblioteca
Copyright 2001. standardToate C.drepturile
Ea se nume suntÕte ltoa Õi autorului.
rezervate pentru rigoare o descriu pe scurt în
continuare:
Multiplicarea acestui document în scop comercial este interzis|.
ltoa - convertes- te un întreg lung într-un s- ir de caractere
Prototip: char * _ltoa(long valoare , char * s- ir, int b aza );
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Fis- ier prototip: ltoa - <stdlib.h>
document pentru uzul personal.
Valoare întoars|: _ltoa întoarce un poantor la un Õir de caractere. În caz de eroare nu
se întoarce o valoare special|.
SudenÛii
Parametri: participanÛi
valoarela- orice
num|form|
r care de
va înv|Û|mânt
fi convertit;cu plat| sau alte persoane doritoare
pot multiplicas-documentul numai
ir - Õir rezultat contra
în urma cost Õi cu acordul scris al autorului. În acest
conversiei;
scop m| puteÛibaza contact|
- bazala: sistemului de numeraÛie în care se face conversia, un num|r
întreg f|r| semn între 2 Õi 36.
ANTAL 7Tiberiu
Remarca : s- ir este terminat în caracterul nu ll.
Alexandru
tel.: 0040-264-530918
1 /* OP PE BIT2 .C */
2
e-mail: antaltiberiu@pcnet.ro
#in clude<std io.h>
3 #include<stdlib.h>
4
5 int main(void)
6 {

52
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
7 un sig ne d sho rt a, b, c;
Facultatea ConstrucÛii de MaÕini
8 char ca[17], cb[17 ], cc[17 ];
9 Catedra de *format1,Õi*format2,
charMecanic| Programare *format3;
10 Curs de limbaj C
11 form at1 =" %16s %s %04X = %16s\n ";
12 form at2 ="\n % 16s %s\ n %16 s\n ----------------\n %16s\n \n";
Copyright 2001. Toate drepturile sunt rezervate autorului.
13 form at3 =" %c% 16 s = %16s\n ";
14
15 Multiplicarea
a=0x0FF0; acestui document în scop comercial este interzis|.
16 b=0xFF00;
17
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
18 c = a << 3;
19 document pentru
itoa(a,ca ,2);uzul personal.
20 itoa(c,cc,2);
21 SudenÛiiprin tf(form at1,ca
participanÛi ,"<<",3,cc
la orice form|); de înv|Û|mânt cu plat| sau alte persoane doritoare
22
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
23 c = a >> 3;
24 scop m| puteÛi contact|
itoa(a,ca ,2); la:
25 itoa(c,cc,2);
26 ANTAL prin tf(form
Tiberiu at1,ca ,">>",3,cc);
Alexandru
27
tel.: 0040-264-530918
28 c = a & b;
29 e-mail:itoa(a,ca
antaltiberiu@pcnet.ro
,2);
30 itoa(b,cb ,2);
31 itoa(c,cc,2);
32 prin tf(form at2,ca," & ",cb,cc );
33
34 c = a | b;
35 itoa(a,ca ,2);
itoa(b,cb
36 Conf. dr. ,2);
ing. ANTAL Tiberiu Alexandru
37 itoa(c,cc,2);
Universitatea Tenhic| din Cluj-Napoca
38 prin tf(form at2,ca," | ",cb,cc);
39 Facultatea ConstrucÛii de MaÕini
40 Catedra c de
= a Mecanic|
^ b; Õi Programare
41 Curs deitoa(a,ca
limbaj C ,2);
42 itoa(b,cb ,2);
43 itoa(c,cc,2);
44 Copyright
prin2001.
tf(formToate drepturile
at2,ca," ^ ",cb,ccsunt
); rezervate autorului.
45
c = ~a; acestui document în scop comercial este interzis|.
46 Multiplicarea
47 itoa(a,ca ,2);
48 itoa(c,cc,2);
49 SudenÛii participanÛi
prin la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
tf(form at3,'~',ca,cc);
50 documenta = pentru
~c; uzul personal.
51 itoa(a,ca ,2);
52 itoa(c,cc,2);
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
53 prin tf(form at3,'~',cc,ca);
54 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
55 scop m| puteÛi 0;
return contact| la:
56 }
ANTAL Tiberiu Alexandru
Rezultate:
tel.: 0040-264-530918
111111110000 << 0003 = 111111110000000
e-mail:111111110000
antaltiberiu@pcnet.ro
>> 0003 = 111111110

111111110000 &
1111111100000000
----------------

53
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
111100000000
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
111111110000 |
1111111100000000
----------------
Copyright 2001. Toate drepturile sunt rezervate autorului.
1111111111110000

Multiplicarea acestui document în scop comercial este interzis|.


111111110000 ^
1111111100000000
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
----------------
document pentru uzul personal.
1111000011110000

SudenÛii
~ participanÛi la= orice
111111110000 form| de înv|Û|mânt cu plat| sau alte persoane doritoare
1111000000001111
~1111000000001111 = 111111110000
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop
DeÕi m| puteÛi contact|
programul la: tipul de dat| tablou, declarat în linia 8, care înc| nu a fost
foloseÕte
prezentat, rezultatele lui vin s| l|mureasc| felul în care se execut| operaÛiile la nivel de
ANTAL Tiberiu
biÛi. Observa Ûi c| Alexandru
_ltoa fiind o funcÛie standard, are caracterul und erscore în faÛa numelui
Õi c| prototipul ei se include în program în linia 3.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Programele folosesc tipul întreg short f|r| semn pentru c| acesta se reprezint| pe 16 biÛi.
Dac| foloseam tipul int, dup| cum am mai spus deja, pe unele maÕini el se reprezint| pe
16 biÛi, iar pe altele pe 32.

Se observ| c| N U pe biÛi (~ ) neag| valorile biÛilor din num|r, astfel un 1 devine 0 Õi un 0


devine 1 . Deplasarea la stânga (<< ) cu un bit corespunde înmulÛirii valorii num|rului întreg
Conf. dr. ing. ANTAL
cu 2, deplasarea cu 2 Tiberiu Alexandru
biÛi la stânga este echivalent| cu o înmulÛire cu 4, etc. PoziÛiile
rUniversitatea
|mase vacante Tenhic|
se vordin Cluj-Napoca
completa cu 0. Deplasarea la dreapta (>> ) cu 1 bit corespunde
împ|rÛirii num
Facultatea |rului cude2.MaÕini
ConstrucÛii ObservaÛi c| bitul din dreapta se pierde în procesul deplas|rii
|r| a mai
fCatedra deexista
Mecanic|posibilitatea recuper|rii lui.
Õi Programare
Curs de limbaj C
Pentru deplasarea la dreapta, în cazul numerelor cu semn, cel mai
FolosiÛi unsigned
semnificativ bit -sunt
bitulrezervate
corespunz |tor puterii celei mai mari a lui 2 - care
cuCopyright
>>
2001. Toate drepturile autorului.
reprezint| semnul, este inserat în noul num|r. Dac| tipul este unsigned ,
pe poziÛiile vacante se vor insera numai 0 -uri. Din punctul de vedere al
Multiplicarea acestui document în scop comercial este interzis|.
reprezent|rii interne a numerelor întregi totul este corect, îns| dac| cunoaÕtem acest mod
de lucru, bitul de semn poate s| fie o surpriz|. În cazul numerelor cu semn, surpriza nu
SudenÛii
apare dacparticipanÛi
| num|rul estela orice form| de înv|Û|mânt superior bugetar pot multiplica acest
pozitiv.
document pentru uzul personal.
Un caz clasic de utilizare a operatorului & este mascarea unor biÛi
Cazuri clasice de
SudenÛii
utilizare
dintr-un
participanÛi num
la orice |r. Mascarea
form| înseamn
de înv|Û|mânt cu| plat|
c| efectul lor în
sau alte num|rului
valoareadoritoare
persoane
este ascuns. Fie expresia a=a & x0f în care a este variabil
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acestx0f| caracter.
binar 00001111. Datorit| lui S- I pe bit-i , în poziÛiile unde avem 0 în
este înla:
scop m| puteÛi contact|
reprezentarea binara7 00001111 , obÛinem 0 , iar în urma S- I -ului pe bit-i , valoarea
respectivilor
ANTAL Tiberiu biÛi Alexandru
din a nu mai conteaza7 . Un alt caz clasic de utilizare, de data aceasta
pentru operatorul |, este setarea pe 1 a unor biÛi dintr-un num|r. În urma expresiei a=a
tel.: 0040-264-530918
| x0f , acei biÛi care sunt 1 în num|rul x0f vor fi 1 Õi în a .
e-mail: antaltiberiu@pcnet.ro

54
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca

4.8 Atribuirea compusa7


Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
C permite
Curs C prescurtat| a expresiilor cu mai mulÛi operatori. Se poate combina
scrierea
de limbaj
operatorul de atribuire cu unul din operatorii descriÕi pân| acum, astfel c| în locul
formulei:
Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea
(ex acestui
pre sie1 ) = (exp document
res ie1) în scop
<o per ator > (excomercial
pre sie2 ); este interzis|.

SudenÛii
se poate participanÛi
scrie: la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
expresie1 <operator> = expresie2;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot
Iat|multiplica documentul
câteva exemple numai
de scriere contra cost
condensat Õi cu acordul scris al autorului. În acest
| a expresiilor:
scop m| puteÛi contact| la:
a=a+b; /* se scrie si sub forma */ a +=b;
a=a*b
ANTAL ; /*Tiberiu
se scrieAlexandru
si sub forma */ a *=b;
a=a
tel.: 0040-264-530918 si sub forma */ a /=b+c;
/(b+c) /* se scrie

e-mail: antaltiberiu@pcnet.ro
C evalueaz| mai întâi expresia din dreapta operatorului compus, din acest motiv a/=b+c
este a=a/(b+c) Õi nu este a=a/b +c .

Efectul celor dou| forme de scriere este acelaÕi, îns| metoda de evaluare nu. În varianta
lung|, valoarea lui <expre sie1> se "evalueaz|" de dou| ori (la întâlnirea operatorilor de
adunare Õi atribuire), iar în varianta compus| numai o dat|. Pentru mai multa7 claritate s|
vedem cam
Conf. dr. cum
ing. se genereaz
ANTAL Tiberiu| codul în limbajul maÕin| pentru a=a+3; "ia valoarea lui a din
Alexandru
RAM Õi încarc-o într-un registru",
Universitatea Tenhic| din Cluj-Napoca "ia valoarea din registru Õi adun-o cu 3 ", "ia valoarea din
registru Õi stocheaz-o înapoi
Facultatea ConstrucÛii de MaÕini în RAM pe locul lui a ". Dac| am fi scris numai a+=3 , din cele
Catedra de Mecanic| Õi Programare a stocat| în RAM Õi adun|-o cu 3 ". Putem spune ca7
de mai sus ar r| mâne: "ia valoarea lui
o expresie de forma expresie1 <opera tor> = expresie2 este echivalenta7 cu expre sie1 =
Curs de limbaj C
expresie1 <operator> (expresie2), cu except-ia ca 7 expresie1 este evaluata7 o singura7 data7 .
Copyright
Din nou, de2001. Toate limbaj
ce într-un drepturile
atâtsunt rezervate
de mic autorului.
ca C s-au implementat astfel de atribuiri? Pe
vremea lui K&R, când optimizarea codului compilat nu prea exista, posibilitatea scrierii
în acest mod cre
Multiplicarea Õtea viteza
acestui de lucru
document Õi sccomercial
în scop |dea dimensiunea programului.
este interzis|.

Pe vremea
SudenÛii lui K&R diferen
participanÛi Ûaform|
la orice între un
deprogram
înv|Û|mântscris f|r| Õi altul
superior scrispot
bugetar aceÕti operatori
cumultiplica acest
era mare (altfel, aceÕti operatori
document pentru uzul personal. nu ar fi fost implementa Ûi). Azi, în cazul unui compilator
cu un optimizator bun, codul ar trebui s| fie identic în ambele cazuri. Putem spune c|
aceÕti operatori au fost p|straÛi numai din motive de compatibilitate cu versiunile vechi
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
de C.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi
Operanzii unei contact|
atribuiri la:
compuse trebuie s| fie de tip întreg sau real. Fiecare operator de
atribuire compus| realizeaz| conversia pe care operatorul binar corespunz|tor o face Õi
restrânge
ANTAL Tiberiutipurile operanzilor corespunz|tori. Pentru cazul adun|rii (+= ) Õi sc|derii (-= )
Alexandru
operatorii pot avea ca operand stâng un tip poantor caz în care operandul drept trebuie
tel.: 0040-264-530918
| fie unantaltiberiu@pcnet.ro
se-mail: întreg.

55
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
4.9 Operatorul sizeof
Catedra de Mecanic| Õi Programare
Curs de limbaj C
În standardul C nu s-a fixat spaÛiul de RAM folosit la stocarea tipurilor de date pentru
diferitele implement|ri de compilatorare. Astfel, este posibil ca o implementare de C s|
Copyright
foloseasc| 16 2001.
biÛiToate
(2 octedrepturile
Ûi) pentru sunt
tipul rezervate autorului.
int, iar alta 32 de biÛi (4 octeÛi). Teoretic, ar putea
fi Õi implement|ri care folosesc 64 de biÛi pentru întregi lungi (long int). Din acest motiv
este dificil s| cunoa
Multiplicarea Õtem
acestui în avansînspa
document Ûiulcomercial
scop folosit la stocarea unui obiect. Operatorul sizeof
este interzis|.
vine s| rezolve aceast| problem|.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
Form 7 : pentru
a uzul
sizeof personal.
identificator sau sizeof (nume-tip)

SudenÛii
Operandul participanÛi
este fie unla orice form|adic
identificator, de înv|Û|mânt
| o expresiecu plat|
unar sauo expresie
|, fie alte persoane doritoare
conversie de tip,
pot multiplica documentul numai contra cost Õi
adic| un specificator de tip cuprins între paranteze. Operatorul sizeof întoarceÎnmacest
cu acordul scris al autorului. |rimea
scop m| puteÛi
operandului în contact|
raport cula:
dimensiunea tipului char. El permite evitarea scrierii de cod cu
m|rimea tipurilor de date dependente de tipul de maÕin| utilizat. Rezultatul lui sizeof este
de obiceiTiberiu
ANTAL de tipulAlexandru
unsigned int .
tel.: 0040-264-530918
1 /* SIZEantaltiberiu@pcnet.ro
e-mail: OF .C */
2 #include <stdio.h>
3
4 int main(void)
5 {
6 long a;
7
8 Conf. dr. ing.
prin ANTAL
tf("\"a \" seTiberiu Alexandru
stoch eaza p e %u octeti\ n", sizeo f a);
9 prin tf("un tip sh ort se stoch
Universitatea Tenhic| din Cluj-Napoca eaza p e %u octeti\n ", size of (sh ort));
10 Facultatea ConstrucÛii de MaÕini
11 Catedrareturn 0;
de Mecanic| Õi Programare
12 }
Curs de limbaj C
Rezultate:
Copyright 2001. Toate drepturile sunt rezervate autorului.
"a" se stocheaza pe 4 octeti
un tip short se stocheaza pe 2 octeti
Multiplicarea acestui document în scop comercial este interzis|.
Aplicat unui tablou - o structur| de date care va fi discutat| în capitolul 9 - operatorul va
avea ca rezultat
SudenÛii num|larul
participanÛi total
orice form| de Ûînv|Û|mânt
de octe i al tabloului. În cazul
superior tipurilor
bugetar potdemultiplica acest|
date structur
(document
struct ) sau reuniune (union )
pentru uzul personal. - care se vor discuta în capitolul 10 - operatorul va avea ca
rezultat num|rul de octeÛi al obiectului.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare

4.10 Operatorul de evaluare


pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

Tiberiu-
secvent
ANTAL iala7
Alexandru
de evaluare secvenÛial|, deseori numit Õi operatorul virgul|, evalueaz| cei 2
tel.: 0040-264-530918
Operatorul
operanzi între care este interpus secvenÛial de la stânga la dreapta.
e-mail: antaltiberiu@pcnet.ro

7:
Form a 7
exp resie, ex pres ie_a tribu ita

56
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Este folositConstrucÛii
Facultatea în mod tipic dela evaluarea uneia sau a mai multor expresii, acolo unde, prin
MaÕini
context, este permis | doar
Catedra de Mecanic| Õi Programare o singur| expresie. Operandul stâng (exp resie ) este evaluat
ca o expresie void , deci nu are tip, iar rezultatul operaÛiei are aceeaÕi valoare Õi tip cu
Curs de limbaj
operandul C
din dreapta (exp resie_ atribu ita7 ). Operanzii pot avea orice tip. Operatorul nu
întoarce o l -v a lu e . Un exemplu de utilizare va fi dat în capitolul de instrucÛiuni, la
Copyright 2001.
prezentarea Toate
ciclului fordrepturile
. sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


4.11 Operatorul expresie
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
condit-ionala7
document pentru uzul personal.
C are unparticipanÛi
SudenÛii singur operator
la oriceternar
form| de(cuînv|Û|mânt
trei operanzi) care
cu plat| saueste
alte opersoane
alternativ| pentru
doritoare
instrucÛiunea if (condit-ie) instruc Ûiune1; else instruc Ûiune2; prezentat| deja sumar.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Form a7: condit- ie ? expresie1 : expresie2;

ANTAL Tiberiu Alexandru


Prima oar| se evalueaz| condit-ie Õi dac| aceasta are valoarea numeric| 0 , valoarea de
tel.: 0040-264-530918
adev | r este falsa7 . Altfel, valoarea de adev|r este adeva7 rata7 . Când condit-ie este
e-mail: antaltiberiu@pcnet.ro
adeva 7 rata7 valoarea imediat dup| ? , adic| valoarea lui expresie1, este folosit| pentru a da
valoarea expresiei condiÛionale. Dac| condiÛie este falsa7 valoarea dup| : , adic| expresie2,
se foloseÕte pentru a da valoare expresiei condiÛionale.

Tipul celor dou| expresii trebuie s| fie identic; nu prea are sens s| scrieÛi o expresie care
se evalueaz| când la o valoare doub le când la una char, în funcÛie de o condiÛie. Dac| totuÕi
Conf.celor
tipul | expresiiTiberiu
douANTAL
dr. ing. difer|, Alexandru
tipul expresiei rezult| din aplicarea regulilor de conversie
discutate deja. De exemplu, dac | i Õi n sunt de tipul int, iar x de tipul float, exp resia i>0
Universitatea Tenhic| din Cluj-Napoca
? x : n va avea tipul float indiferent
Facultatea ConstrucÛii de MaÕini de valoarea lui i .
Catedra de Mecanic| Õi Programare
Expresia condiÛC
Curs de limbaj ional| se poate folosi în orice context în care se poate folosi o "expresie
clasic|". În general, ea duce la scrierea mai succint| a codului (vezi exemplele care
urmeaz| unde acelaÕi efect este obÛinut cu operatorul ternar ? : Õi cu if ).
Copyright 2001. Toate drepturile sunt rezervate autorului.
int a,b=10,c=-3; int a,b=10,c=-3;
Multiplicarea
b=(a>c)?a:c; acestui document în scop comercial este interzis|.
if (a>c)
b=a;
elsesuperior bugetar pot multiplica acest
SudenÛii participanÛi la orice form| de înv|Û|mânt
b=c;
document pentru uzul personal.
Poate veÛi fi miraÛi c| aici am folosit paranteze rotunde în jurul condiÛiei; explicaÛia acestei
SudenÛii
scrieri stparticipanÛi la orice
| în paragrafele careform|
urmeazde|înv|Û|mânt
. cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
4.12 Precedent-a operatorilor
ANTAL Tiberiu Alexandru
C trateaz| operatorii cu importanÛ| diferit| conform precedenÛei lor. Exist| aproximativ
tel.:
40 de 0040-264-530918
operatori în C . Fiecare dintre ei are un "grad de importanÛ|" specific. Fie
e-mail: antaltiberiu@pcnet.ro
programul:

1 /* PR EC ED E.C */
2 #include<stdio.h>
3 int main(void)

57
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
4 {
Facultatea ConstrucÛii de MaÕini
5 int a = 3*7+50/9;
6 Catedra de Mecanic| Õi Programare
7 Curs deprin limbaj
tf("aC= % i\n ",a);
8
9 return 0;
Copyright 2001. Toate drepturile sunt rezervate autorului.
10 }

Multiplicarea
Rezultat: acestui document în scop comercial este interzis|.
a = 26
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Expresia
document3*7+50/9 ar putea
pentru uzul avea urm|toarele semnificaÛii: ((3*7)+50)/9 sau( 3*(7+50))/9 sau
personal.
3*(7+(50/ 9)) etc. SemnificaÛia ei corect| este îns| (3*7)+(50/9) pentru c| C asociaz| o
importan Û| mai marela orice
SudenÛii participanÛi operatorilor Õi / decât cu
form| de* înv|Û|mânt operatorului + . Astfel,
plat| sau alte persoaneînmul Ûirea Õi
doritoare
împ | r Ûirea se realizeaz | înainte de adunare. Preceden Ûa este cea care define Õte
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest ordinea
de evaluare a operatorilor dintr-o expresie.
scop m| puteÛi contact| la:

4.13 Asociativitatea operatorilor


ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Preceden Ûa nu ne spune totul. De exemplu, care este ordinea de evaluare a operatorilor
e-mail: antaltiberiu@pcnet.ro
într-o expresie în care avem mai mulÛi operatori de aceeaÕi precedenÛ|, cum sunt * Õi / sau
- Õi + ? În acest caz se aplic| regula asociativit|Ûii. Asociativitatea este de la stânga la
dreapta sau de la dreapta la stânga.

1 /* AS OC IAT.C */
2 #include<stdio.h>
3 int main(void)
Conf. dr. ing. ANTAL Tiberiu Alexandru
4 {
5 Universitatea
int b = Tenhic|
3*7/9; din Cluj-Napoca
6 Facultatea ConstrucÛii de MaÕini
7 Catedraprin
de tf("b
Mecanic| Õi",b);
= % i\n Programare
8
Curs de limbaj C
9 return 0;
10 }
Copyright 2001. Toate drepturile sunt rezervate autorului.
Rezultat:
Multiplicarea
b = 2 acestui document în scop comercial este interzis|.

În
SudenÛii deÕi * Õi / aulaaceea
3*7/9 ,participanÛi oriceÕiform|
preceden Û|, asociativitatea
de înv|Û|mânt lorbugetar
superior este de la
potstânga la dreapta.
multiplica acest
Astfel, mai întâi se efectueaza
document pentru uzul personal. 7 * , adic| se rezolva7 subexpresia 3*7 , care d| 21 , apoi 21/9 ,
care d| 2 .
SudenÛii participanÛi
În cazul unei expresiiladeorice form|
forma de înv|Û|mânt cu plat| sau alte persoane doritoare
a=b+=c; , = Õi += au aceeaÕi precedenÛ|, dar asociativitatea
pot
de lamultiplica
dreapta ladocumentul numai contra
stânga. Operatorul += se vacost Õi cu acordul
rezolva scris
prima oar al autorului.
|, valoarea Înadun
lui c se acest| la
scop m| puteÛi contact| la:
b , apoi rezultatul adun|rii se atribuie lui a .

ANTAL Tiberiu Alexandru


4.14 Tabel cu precedent-a s- i
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
asociativitatea operatorilor C
Tabelul care urmeaz| prezint| precedenÛa în ordine descresc|toare precum Õi
asociativitatea operatorilor C. O mic| parte din ei nu au fost înc| discutaÛi pentru c| sunt

58
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
lega Ûi de subiecte
Facultatea înc| netratate:
ConstrucÛii de MaÕini poantor, tablou, structur| Õi apel de funcÛie.
Catedra de Mecanic| Õi Programare
Curs de limbaj Simbol
C OperaÛia Asociativitate
[ ] () . -> postfix ++ po stfix -- Expresie de la stânga la dreapta
Copyright 2001. Toate drepturile sunt rezervate autorului.
sizeof & * + - ~ ! (conver sie Unar de la dreapta la stânga
tip) prefix ++acestui
Multiplicarea prefixdocument
-- în scop comercial este interzis|.
* / % Multiplicare de la stânga la dreapta
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
+ - pentru uzul personal. Adunare de la stânga la dreapta
<< >> Deplasare la nivel de bit de la stânga la dreapta
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot
< >multiplica
<= >= documentul numai Rela Ûionali
contra cost Õi cu acordul scrisdeallaautorului.
stânga la În
dreapta
acest
scop m| puteÛi contact| la:
== != Egalitate de la stânga la dreapta
ANTAL
& Tiberiu Alexandru Ôi la nivel de bit de la stânga la dreapta
tel.: 0040-264-530918
^
e-mail: antaltiberiu@pcnet.ro Sau exclusiv la nivel de bit de la stânga la dreapta
| Sau la nivel de bit de la stânga la dreapta
&& Ôi logic de la stânga la dreapta
|| Sau logic de la stânga la dreapta
?:
Conf. Expresie condiÛional|
dr. ing. ANTAL Tiberiu Alexandru de la dreapta la stânga
Universitatea Tenhic|
= *= /= %= += -= <<= >>=din
&= Cluj-Napoca
|= ^= Atribuire simpl| Õi de la dreapta la stânga
Facultatea ConstrucÛii de MaÕini compus|
Catedra de Mecanic| Õi Programare
,
Curs de limbaj C Evaluare secvenÛial| de la stânga la dreapta

Operatorii din aceea


Copyright 2001. Õi celul
Toate | a tabelului
drepturile Õi precedenÛ|. Se observ| c| + Õi - unar
au aceeaautorului.
sunt rezervate
au o precedenÛ| mai mare decât operatorii corespunz|tori binari. Operatorii de atribuire
simpl| Õi compus| au aceeaÕi precedenÛ| însa7 mai mic| decât a majorita7 -tii celorlat-i
Multiplicarea
operatori. Dinacestui
cauz| document
c| precedenîn scop comercial este
Ûa operatorilor pe interzis|.
biÛi este mai mic| decât a celor
relaÛionali, la testarea expresiilor la nivel de bit, trebuie folosite paranteze pentru ca
SudenÛii participanÛi
rezultatele la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
s| fie corecte:
document pentru uzul personal.
if ((a & M ASC A) == x 0f) { . . .}
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
NOTA: Într-o
pot multiplica expresie
documentul numaise pot folosi
contra cost Õiparantezele rotunde
cu acordul scris ( ) pentru
al autorului. În acest a
impune o ordine
scop m| puteÛi contact|de la: efectuare a operat-iilor. Daca 7 expresia are mai
multe perechi de paranteze rotunde, evaluarea se începe cu
subexpresia
ANTAL TiberiucuprinsaAlexandru 7 între parantezele cele mai interioare.
tel.: 0040-264-530918
În este specificat| ordinea de evaluare a operanzilor unui operator (excepÛie fac
C nuantaltiberiu@pcnet.ro
e-mail:
operatorii & & , ||, ?: Õi v ir g u la7 ); astfel, dac| privim expresia 1/3 + 2*4 din punctul de vedere
al operatorului de adunare, nu se Õtie dac| mai întâi se evalueaz| 1/3 sau 2*4 .

59
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca

4.15 Expresia
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Am
Cursnumit C o entitate asupra c|reia acÛioneaz| un operator. Expresia este o
operand
de limbaj
secvent- a7 de op erato ri s- i operanzi care efectueaz| oricare din urm|toarele trei acÛiuni:
< 2001.
Copyright calculeaz | o valoare;sunt rezervate autorului.
Toate drepturile
< specific| un obiect sau funcÛie;
<
Multiplicarea genereaz | efecte secundare.
acestui document în scop comercial este interzis|.
În limbajul C, oper an zii fac parte din categoriile:
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
- constante;
document pentru uzul personal.
- identificatori;
- Õiruri;
- apeluri
SudenÛii participanÛi la Ûorice
de func ii; form| de înv|Û|mânt cu plat| sau alte persoane doritoare
- expresii
pot multiplica de selecÛienumai
documentul a membrilor unuiÕitablou;
contra cost cu acordul scris al autorului. În acest
- expresii complexe
scop m| puteÛi contact| la: formate prin combinarea operanzilor Õi operatorilor sau prin
cuprinderea operanzilor între paranteze.
ANTAL Tiberiu Alexandru
Efectele secundare apar când valoarea unei variabile este modificat| ca urmare a evalu|rii
tel.:
unei0040-264-530918
expresii. Toate operaÛiile de atribuire au efecte secundare. Apelurile de funcÛii pot
e-mail: antaltiberiu@pcnet.ro
avea efecte secundare dac| modific| valoarea unui articol extern vizibil lor, prin atribuire
direct| sau indirect| prin intermediul unui poantor. De exemplu, efecte scundare apar la
urm|torul apel de funcÛie:

ad un a(i+1, i=j+2);

Argumentele unui apelTiberiu


Conf. dr. ing. ANTAL de func Ûie pot fi evaluate în orice ordine. Expresia i+1 poate fi
Alexandru
evaluat | înainte sau dupa7 i=j+2 , rezultatele funcÛiei ad un a() fiind diferite în fiecare caz.
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
x[i]=i++;
Catedra de Mecanic| Õi Programare
Curs de limbaj
În exemplul C sus, valoarea lui x[i] este imprevizibil|. Lucrurile se vor clarifica mai
de mai
bine dup| ce veÛi parcurge Õi capitolul legat de tablouri. Pân| atunci e suficient s| ÕtiÛi c|
forma de scriere
Copyright 2001. x[i] extrage
Toate al i -elea
drepturile element
sunt al tabloului
rezervate x . Indicele poate lua fie valoarea
autorului.
nou| a lui i , fie cea veche. Practic, rezultatul poate varia în funcÛie de compilatorul folosit
sau de nivelul acestui
Multiplicarea de optimizare
documentactivat pentru
în scop compilatorul
comercial curent.
este interzis|.
În documenta
SudenÛii Ûiile tehnice
participanÛi aleform|
la orice limbajului C veÛi întâlni
de înv|Û|mânt noÛiunea
superior de sequence
bugetar adic|
point, acest
pot multiplica
punct de secvent- a 7 . Voi încerca s| l|muresc pe scurt aceast| noÛiune. Un punct de
document pentru uzul personal.
secvenÛ| este un punct aflat la sfârÕitul unei expresii complete sau la atingerea
operatorilor ||, & & , ?: , virgula7 sau înaintea apelului unei funct-ii , pân| la care este
SudenÛii
garantat participanÛi
c| toate efectelela orice form| de
secundare înv|Û|mânt
sunt terminate. cuÎnplat| sau alteÛia
documenta persoane
ANSI/ISOdoritoare
C exist|
pot multiplica
fraza: documentul
“Între punctul numai-a7contra
de secvent costÕÕi
anterior cu acordul
i cel curent, scris
unui al autorului.
obiect i se vaÎnmodifica
acest
scop m| puteÛi
valoarea | cel multla:o dat| prin evaluarea expresiei. În plus, valoarea anterioar| va
stocatcontact|
fi referit| numai pentru a determina valoarea de stocat”. A doua propoziÛie este cam
criptic
ANTAL | ÕTiberiu
i spune ca 7 : dac| un obiect este scris în interiorul unei expresii, orice referinÛ| la
Alexandru
acesta în| untrul
tel.: 0040-264-530918 expresiei din care face parte se face în scopul calcul|rii valorii care
e-mail: antaltiberiu@pcnet.ro| regul| constrânge expresiile legale la cele în care referirea
urmeaz | s| fie stocat | . Aceast
precede modificarea valorii.

Începa7 torii într-ale limbajului C nu fac diferenÛa între termenii "comportament definit
prin implementare", "comportament nespecificat" Õi "comportament nedefinit". DeÕi am

60
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
discutat
Facultateadeja semnificaÛde
ConstrucÛii MaÕini tremeni, s| vedem ce se petrece în cazul particular care
ia acestor
urmeaz | . Comportamentul
Catedra de Mecanic| Õi Programare definit prin implementare presupune c| implementarea
compilatorului utilizat s| selecteze un comportament care trebuie s| fie documentat.
Curs de limbaj C nespecificat presupune ca implementarea compilatorului sa7 selecteze
Comportamentul
un comportament care nu este neap|rat documentat. Nedefinit înseamn| c| orice se poate
Copyright 2001. Toate
întâmpla. Pentru drepturilenusunt
c| standardul rezervate
impune autorului. compilatorului în cazul unor
comportamentul
situaÛii din categoria nedefinit|, compilatorul poate s| fac| orice. În caz particular nu
exist| nici o garan
Multiplicarea Ûie cdocument
acestui | restul programului Ûiona
va funceste
în scop comercial normal. Cazul pe care îl prezint
interzis|.
în continuare face parte din categoria celor nedefinite. Fie liniile de program:
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int a =7;
document pentru uzul personal.
prin tf(”%i\ n”,a ++*a ++);

SudenÛii
R |spunsul participanÛi
afiÕat de la orice form| folosit
compilatorul de înv|Û|mânt
de minecueste plat|
56sau alte persoane
. Când ordinea de doritoare
evaluare
multiplica documentul numai contra cost Õi
conteaz|, fa7 ra7 sa7 fie clar definit| (adic| nu putem spune exact ordinea în care compilatorul
pot cu acordul scris al autorului. În acest
va
scop evalua diferitele
m| puteÛi p|rÛila:
contact| ale expresiei), spunem c| semnificaÛia expresiei este nedefinit|.
Scrierea acestor expresii este de evitat. TotuÕi, amatorii le folosesc pentru c| uneori
compilatorul
ANTAL Tiberiu le evalueaza
Alexandru 7 în ordinea gândit| de ei, iar aceÕtia presupun c| totul este în
regul | din moment
tel.: 0040-264-530918 ce evaluarea funcÛioneaz| conform aÕtept|rilor. Pentru cazul
exemplului anterior, r|spunsurile posibile teoretic ar fi fost 7*8 Õi 8*7 care dau 56. Un alt
e-mail: antaltiberiu@pcnet.ro
r|spuns posibil putea fi 49 , în cazul în care compilatorul folosit ar fi ales s| fac| înmulÛirea
mai întâi Õi apoi increment|rile (alegerea ar fi fost corect| pentru c| punctul de secvenÛ|
apare pentru expresia a++*a++ numai dup| ultimul a++ unde expresia se termin|). Postfix
++ înseamn| c| se face incrementarea mai târziu, compilatorul nefiind obligat s| o fac|
imediat. Pentru c| în ANSI C nu se specific| modul de tratare a acestor cazuri, teoretic,
codul de mai sus putea s| afiÕeze 0 sau 34 sau 56465 sau s| duc| la blocarea calculatorului.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Programatorii greÕescdin
Universitatea Tenhic| de multe ori încercând s| fac| prea multe într-o singur| expresie,
Cluj-Napoca
prognozând comportametul
Facultatea ConstrucÛii de MaÕini compilatorului pe baza ordinii de evaluare a operatorilor. De
exemplu,
Catedra de Õtim c| operatorul
Mecanic| de înmulÛire (* ) are precedenÛ| mai mare decât cel de adunare
Õi Programare
(+ ). Astfel, în expresia a + b * c , mai întâi se înmulÛeÕte b cu c , apoi rezultatul se adun| la
Curs de limbaj C
a . De multe ori zicem pe scurt c| înmulÛirea se face înaintea adun|rii. În acest caz este
chiar adev|rat, dar pentru expresia a++ + b++ * c++ cele afirmate înainte nu ne mai ajut|.
Copyright
Aici, pe lâng 2001. Toate
| înmul Ûiredrepturile
Õi adunare,sunttoate
rezervate autorului.
cele trei variabile sunt Õi incrementate. Nu
putem Õti care dintre ele va fi incrementat| prima; totul depinde de compilator (de
Multiplicarea acestui document
exemplu, compilatorul poate stocaîn scop comercial
valoarea lui aeste registru Õi s-o incrementeze
interzis|.
într-un
imediat, deÕi va trebui s| reÛin| valoarea veche pân| dup| realizarea înmulÛirii). În final,
mai trebuie
SudenÛii s| ÕtiÛi c| la
participanÛi parantezele
orice form| nudedicteaz | ordinea
înv|Û|mânt de evaluare
superior bugetar pot |multiplica
global mai mult acest
decât
odocument
face preceden Ûa. Parantezele
pentru uzul personal. sunt mai tari Õi suprascriu preceden Ûa fort- ând care
operanzi sunt legaÛi de care operatori. Din acest motiv putem spune c| afecteaz|
semnifica Ûia general|laaorice
SudenÛii participanÛi expresiilor,
form| dedar nu spun cu
înv|Û|mânt nimic
plat|despre ordinea
sau alte persoanede doritoare
evaluare a
subexpresiilor Õi de rezolvare a efectelor secundare. Deci, nu se poate "forÛa" ordinea
pot
evalumultiplica documentuldin
|rii unor subexpresii numai contra
expresia dat | caÕiexemplu
cost cu acordul
prinscris al autorului.
ad|ugarea În acestsub
de paranteze
scop m| puteÛi contact| la:
forma a++ + (b++ * c++). Nici pentru aceast| form| de scriere nu se va Õti care dintre
increment|ri va fi efectuata7 prima. Parantezele vor forÛa ca multiplicarea s| aib| loc
ANTAL
înainte de Tiberiu precedenÛa ar fi forÛat oricum aceast| ordine de evaluare.
Alexandru
adunare,
tel.: 0040-264-530918
Morala este c| scrierea unui cod care depinde de ordinea de evaluare este o experienÛ|
e-mail: antaltiberiu@pcnet.ro
ce trebuie dep|Õit|. Astfel de expresii se vor evalua "corect" numai sub anumite
compilatoare Õi se justific| numai pentru a satisface curiozitatea programatorului cu
privire la aceste expresii "interzise". Dac| nu este clar cum se va realiza ceva de un anumit
compilator singura Õans| este evitarea capcanei.

61
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
Pentru
Facultateaa uÕConstrucÛii
ura scrierea deformulelor
MaÕini matematice în limbajul C prezint în continuare un
tabel
Catedra de Mecanic| Õi Programare astfel de formule în expresii ale limbajul C.
cu exemple de transcriere a unor
Curs de limbaj C
Formul| matematica7 Scriere în C
Copyright 2001. Toate drepturile sunt rezervate autorului.
a*b

Multiplicarea acestui document în scop comercial este interzis|.


a*b*c

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar


a/b pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau a/b/c


alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al
sauautorului. În acest
scop m| puteÛi contact| la: a/(b*c)

(a+d)/(b+c)
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
(a*a*a*a+2*a*a+1)/(b*cos(x)+c)
sau
(pow(a,4.)+2.*pow(a,2.)+1.)/(b*cos(x)+c)

(exp(x)+log(x))/sqrt(b+c)

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca exp(x)+log(x)/sqrt(b+c)
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
exp(x)+log(fabs(x+1))/sqrt(b+c)

Copyright 2001. Toate drepturile sunt rezervate autorului.

În expresiile prezentate
Multiplicarea mai susînintervin
acestui document funcÛii din
scop comercial estebiblioteca
interzis|.standard a limbajului C.
Descrierea acestora este prezentat| în paragraful 14.5. Tot acolo sunt explicate Õi
condiÛiileparticipanÛi
SudenÛii în care pot fi
la folosite aceste
orice form| defunc Ûii, adic|superior
înv|Û|mânt valorile permise ale multiplica
bugetar pot acestÕi
argumentelor
valorile întoarse de c| tre
document pentru uzul personal.acestea.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

62
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

5 Instruct-iunile limbajului C
Multiplicarea acestui document în scop comercial este interzis|.

I
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
nstrucÛiunile sunt cele prin care se controleaz| execuÛia programului. În limbajul C,
careparticipanÛi
SudenÛii face parte din clasaform|
la orice celorde imperative,
înv|Û|mântproblemele
cu plat| sausealte
rezolv | prin doritoare
persoane descrierea
algoritmului de rezolvare a problemei în termenii instrucÛiunilor limbajului. Deci, pentru
pot multiplica
a putea scrie undocumentul
program C,numai
trebuie contra
s| Õtim Õi cu acordul
costalgoritmul scris al autorului.
de rezolvare În acest
a problemei, apoi s|
scop m| puteÛi
fim suficient decontact| la:
bine familiariza Ûi cu instrucÛiunile limbajului C pentru a descrie algoritmul
folosind aceste instrucÛiuni, operaÛie numit| Õi programare sau scriere a programului.
ANTAL
Exist | câteva
Tiberiu Alexandru generale pentru rezolvarea problemelor, care pleac| de la
caracteristici
presupunerea c| soluÛiile se obÛin prin manipularea datelor. Iata7 cam cât trebuie s| Õtim
tel.: 0040-264-530918
din C pentru
e-mail: a scrie un program:
antaltiberiu@pcnet.ro
1. citirea datelor în program - operat-ii de intrare;
2. stocarea datelor în program - tipuri de date s- i declarat-ii ;
3. instrucÛiuni de prelucrare, manipulare a datelor - instruct-iun i C care depind de
tipul problemei de rezolvat;
4. afiÕarea rezultatelor calculate - operat-ii de ies- ire .
Conf. dr.
Instruc ing. ANTAL
Ûiunile Tiberiu astfel
sunt organizate Alexandru
încât:
Universitatea
a) unele Tenhic| condiÛionat, adic| numai dac| o anumit| condiÛie sau o
din Cluj-Napoca
sunt executate
mulÛConstrucÛii
Facultatea ime de condi deÛiiMaÕini
sunt adev|rate Õi se numesc instruct-iuni condit-ion ale (if ,
);
Catedra de Mecanic| Õi Programare
switch
Curs deb)limbaj C repetate, atât timp cât o anumit| condiÛie este adev|rat| Õi se numesc
unele sunt
instruct- iuni de ciclare (w hile , do-w hile , for );
c) altele
Copyright 2001.sunt grupate
Toate sub sunt
drepturile un singur nume
rezervate Õi pot fi executate, prin specificarea
autorului.
acelui nume din diferite locuri ale programului Õi se numesc funct-ii .
Multiplicarea acestui
Instruct-iunile au efectedocument în valori.
s- i nu întorc scop comercial
Ele sunt este interzis|.
executate secvent-ial în ordinea scrierii
lor în program. Unele instruct-iuni, prin efectul lor particular, pot întrerupe execut-ia
SudenÛii participanÛi
secvent-iala la oriceproducând
7 a programului form| de înv|Û|mânt
salturi întresuperior
diferitebugetar
port-iunipot
demultiplica
program (acest
goto ,
document, break
continue pentru, return ).
uzul personal.

5.1 Instruct-iunea expresie s- i blocul


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi
Expresiile contact| pân
prezentate la: | acum sau printf() Õi sca nf() devin instrucÛiuni dac| sunt
urmate de caracterul punct Õi virgul| (;). În limbajul C ; poart| denumirea de terminator
ANTAL
de -iuni. Acesta
Tiberiu
instruct marcheaz| terminarea unei instrucÛiuni Õi are utiliz|ri multiple.
Alexandru
A Ûi v | zut deja
tel.: 0040-264-530918c| este folosit inclusiv la terminarea declaraÛiilor, adic| este Õi terminator
de declarat
e-mail: -ii .
antaltiberiu@pcnet.ro

7:
Form a expresie;

O expresie urmat| de ; se numeÕte instruct- iun e ex pres ie . Majoritatea instrucÛiunilor


63
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
expresie
Facultatea C ConstrucÛii
sunt atribuiri desau apeluri de funcÛii. Toate efectele secundare ale instrucÛiunii
MaÕini
expresie sunt terminate
Catedra de Mecanic| Õi Programare înainte de executarea instrucÛiunii urm|toare. Dac| expresia
lipseÕte, construcÛia se numeÕte instruct-iun e vid a7 .
Curs de limbaj C
InstrucÛiuni expresie C sunt:
Copyright 2001. Toate drepturile sunt rezervate autorului.
1 a=0;
2 b=b+1;
Multiplicarea acestui document în scop comercial este interzis|.
3 prin tf("Te salu t!\n ");

SudenÛii
ExpresiileparticipanÛi la orice
Õi instrucÛiunile form| de
expresie potînv|Û|mânt superior
s| fie complicate. bugetar
Pentru ca opot multiplica
expresie s| fieacest
util|
document pentru uzul personal.
trebuie s| modifice spaÛiul de date al programului (denumirea formal| este "trebuie s|
produc| efecte secundare"). Liniile 1 Õi 2 sunt exemple de instrucÛiuni expresie corecte
SudenÛiic|participanÛi
pentru la orice
dau valori noi form| de
variabilelor a Õînv|Û|mânt cu plat|
i b . La fel, linia sauun
3 este alte persoane
apel Ûie, fiind Õi
de funcdoritoare
instrucÛiune
potomultiplica
ea expresie corect
documentul numai |. contra ÛiuniÕiexpresie
Instruccost "degenerate"
cu acordul ale celor În
scris al autorului. de acest
mai sus
ar putea fi:
scop m| puteÛi contact| la:
0;
ANTAL Tiberiu Alexandru
b+1;
tel.: 0040-264-530918
e-mail:
Ele suntantaltiberiu@pcnet.ro
sintactic corecte, dar fiecare calculeaz| o valoare f|r| ca apoi s| mai fac| ceva cu
ea. Din acest motiv valorile calculate se pierd, iar instrucÛiunile sunt inutile. Cazul
"degenerat" prezinta7 instrucÛiuni expresie care nu produceau efecte secundare. Este
posibil Õi opusul acestei situaÛii s- i anume ca o expresie s| aib| efecte secundare multiple
(vezi a++*a++ ). În acest caz expresia este fie confuz| prin rezultatul întors, fie nedefinit|.

Acoladele ({ })ANTAL
Conf. dr. ing. sunt folosite pentru
Tiberiu a grupa o secvenÛ| de instrucÛiuni Õi declaraÛii într-o
Alexandru
instruct- iune compusa 7 care mai poart| Õi denumirea de bloc. Prin aceast| grupare blocul
Universitatea Tenhic| din Cluj-Napoca
devine sintactic echivalentul unei singure instruc Ûiuni.
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Form a7 : limbaj C
Curs de {
instruct- iune1
. . .
Copyright 2001. Toate drepturile sunt rezervate autorului.
instruct- iunen

Multiplicarea acestui} document în scop comercial este interzis|.

Deci
SudenÛiiacest grup de instruc
participanÛi Ûiuni
la orice cuprins
form| între acolade
de înv|Û|mânt se va putea
superior scrie
bugetar oriunde
pot C permite
multiplica acest
scrierea unei singure instruc
document pentru uzul personal. Ûiuni. Un astfel de exemplu sunt acoladele între care se scriu
instrucÛiunile care formeaz| corpul funcÛiei m ain (). Nu se pune ; dup| acolada de închidere
(SudenÛii
} ) a unui bloc.
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest

5.2 Instruct-iunea if-else


scop m| puteÛi contact| la:

ANTAL
În sfârs- it,Tiberiu Alexandru
am ajuns la descrierea construcÛiei if-else pe care am utilizat-o deja în capitolul
Se foloseÕte pentru luar ea u nei d ecizii în mersul logic al rezolv|rii problemei,
tel.: 0040-264-530918
precedent.
fiind
e-mail:modul tradiÛional de programare a unei întreb|ri de tipul daca7 -atunci sau în cazul
antaltiberiu@pcnet.ro
în care-atunci .

7:
Form a if (expresie)

64
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii -iune1
de MaÕini
instruct
Catedra de Mecanic|
else Õi Programare
Curs de limbaj C instruct- iune2

Copyright 2001.
exp resie este Toate drepturile
o expresie care poatesunt rezervate
fi de autorului.
tipul aritmetic sau poantor. Dac| exp resie este
nenul| (!= 0 ), adic| adeva7 rata7 , se execut| instruct-iune 1. Altfel (== 0 ) se execut|
Multiplicarea
instruct PorÛiunea
-iune2.acestui else instructiune2
document ; este op
în scop comercial Ûional
este |. Astfel, o form| valid| este Õi:
interzis|.

SudenÛii
7 : participanÛi
Form a la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
if (expresie)
document pentru uzulinstruct
personal.
-iune1

SudenÛii participanÛi
În acest caz, la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
instructiune1 se execut| dac| Õi numai dac| exp resie este nenul|. Dac| este
pot multiplica documentul numai Õcontra
nul| se trece peste instructiune1 cost Õi continu
i programul cu acordul
| cuscris al autorului.
instruc Ûiunea urm|Întoare.
acest
scop m| puteÛi contact| la:
Întrucât if testeaz| numai valoarea numeric| pentru exp resie , în loc de
if
if (expre sie != 0) se poate scrie prescurtat if (expresie). Câteva exemple
ANTAL Tiberiu Alexandru
de utilizare ale lui if sunt prezentate în continuare:
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
1 /* IF1.C */
2 int m ain ()
3 {
4 int a1 = 11, a2 = 11, a3 = 11;
5 char c1 = 40, c2 = 40, c3 = 40;
6 float x1 = 12.987, x2 = 12.987, x3 = 12.987;
7
8 Conf. dr.uling.
/* Prim grupANTAL
de instruTiberiu Alexandru
ctiuni de com parare */
9 Universitatea
if (a1 ==Tenhic|
a 2) a3 =din -13;Cluj-Napoca
/* a3 = -13 */
10 if (a1
Facultatea > a 3) c1 = de
ConstrucÛii 'A';MaÕini
/* c1 = 65 */
11 if (!(a 1 > a 3)) c 1 = 'B ';/* c1 nu se mo difica */
Catedra de Mecanic| Õi Programare
12 if (c2 <= c3 ) x1 = 0.0; /* x1 = 0.0 */
13 Curs deiflimbaj
(x 1 != xC2) x 3 = c3/2; /* x3 = 20 */
14
15 /* Al doilea
Copyright grup
2001. de instruc
Toate Ûiunisunt
drepturile d e com parareautorului.
rezervate */
16 if (a1 = (x 1 != x 2)) a 3 = 10 00; /* a1 = un n um ar pozitiv oa recare si a3 = 1000 */
17 if (a1 = a2) a3 = 222; /* a1 = a2 Õ i a3 = 222 */
18 Multiplicarea
if (a1 !=acestui
0) a3 = document
333; /* a3 în=scop
333 comercial*/ este interzis|.
19 if (a1) a3 = 44 4; /* a3 = 444 */
20 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
21 /* Al treilea grup de instru ctiuni de com parare */
document pentru uzul personal.
22 a1 = a2 = a3 = 77;
23 if ((a1 == a 2) & & (a1 == 77 )) a3 = 33; /* a3 = 33 */
24 SudenÛii
if participanÛi la orice
((a1 > a 2) || (a3 > 12)) form|
a 3 = de
22; înv|Û|mânt cu plat| sau alte persoane doritoare
/* a3 = 22 */
25 pot multiplica documentul numai contra cost Õi cu acordul
if (a1 & & a2 && a3) a3 = 11; /* a3 = 11 */ scris al autorului. În acest
26 if ((a1 = 1) && (a2 = 2) && (a3 = 3)) x1 = 12.00; /* a1 = 1, a2 = 2, a3 = 3, x1 = 12.00 */
scop m| puteÛi contact| la:
27 if ((a1 == 2 ) && (a2 = 3) & & (a3 = 4)) x 1 = 14 .56; /* x1 nu se m odifica */
28
29 ANTAL
/* Tiberiu
Al patru Alexandru
lea grup de com para tii */
30 tel.: 0040-264-530918 = 27.345; /* a3 se m odifica intotdea una */
if (a1 == a1); a3
31
e-mail:ifantaltiberiu@pcnet.ro
(a1 != a 1) a3 = 27 .345; /* a3 nu se modifica */
32 if (a1 = 0) a3 = 27 .345; /* a1 = 0, a3 nem odificat */
33
34 return 0;
35 }

65
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
Observa
FacultateaÛi cConstrucÛii
| instrucÛiunile if prezentate se termin| în ; . Asta pentru c| gramatical, dup|
de MaÕini
condi Ûia de test din if , urmeaz| o instrucÛiune. Deoarece instrucÛiunile din exemplul
Catedra de Mecanic| Õi Programare
anterior sunt instrucÛiuni expresie, acestea trebuie s| se termine în ;.
Curs de limbaj C
if execut| o singur| instruc Ûiune în funcÛie de rezultatul deciziei. Dac|
if-else
Copyright 2001. Toate
doriÛi drepturile sunt rezervate
s| se execute autorului.
mai multe instrucÛiuni trebuie s| folosiÛi
instruct- iunea compusa 7.
Multiplicarea acestui document în scop comercial este interzis|.
1 if (b == 0.0)
2 prin tf("Fractia e n ed efin ita\ n");
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
3 else
4 document
{ pentru uzul personal.
5 f=a/b;
6 SudenÛiiprin tf("Fractia
participanÛi laeorice
% f\nform|
", f); de înv|Û|mânt
cu plat| sau alte persoane doritoare
7 }
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi
Mai sus, dac| bcontact| la: nenul|, se execut| tot grupul de instrucÛiuni cuprinse între
are o valoare
acoladele din liniile 4 Õi 7 .
ANTAL Tiberiu Alexandru
C permite ca un if s| conÛin| pe locul instrucÛiunilor un alt if. O astfel de
tel.: 0040-264-530918
Suprapunerea
secvenÛ| de if -uri se numesc im bric ate sau suprapu se . Fie secvenÛa:
e-mail: antaltiberiu@pcnet.ro
if -urilor

if (expr esie1)
instruct- iune1
else if (ex pres ie2)
instruct- iune2
Conf. dr. ing. ANTAL Tiberiu Alexandru
else if (ex pres ie3)
Universitatea
instructTenhic|
-iune3 din Cluj-Napoca
Facultatea
else ConstrucÛii de MaÕini
Catedra -iune4 Õi Programare
de Mecanic|
instruct
Curs de limbaj C
ea este caracteristic| unei multi-decizii. Expresiile exp resie 1 , exp resie2 Õi exp resie3 sunt
evaluate
Copyrightîn2001.ordine astfel:
Toate dac| exp
drepturile resie1
sunt este adeva
rezervate 7 rata7 se execut| instruct-iune1 Õi
autorului.
secvenÛa de if -uri se termin|; altfel se execut| ramura else , care conÛine un nou if unde
decizia se ia pe baza lui exp resie2 etc. instruct-iunex poate s| fie o singur| instrucÛiune
Multiplicarea acestui document în scop comercial este interzis|.
sau una compus|. Ultimul else trateaz| cazul "nici una dintre expresiile anterioare nu este
adeva 7 rata7 " instruct-iune4 este atins| în cazul când nici una dintre condiÛiile puse nu au
SudenÛii
fost satisfparticipanÛi la orice
|cute. Sa7 vedem ce form| de înv|Û|mânt
se petrece superior
îns | pentru o situaÛbugetar pot multiplica acest
ie de forma:
document pentru uzul personal.
if (expr esie1)
SudenÛii
if participanÛi
(expr esie2) la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplicainstruct -iune1numai contra cost Õi cu acordul scris al autorului. În acest
documentul
else
scop m| puteÛi contact| la:
instruct- iune2

ANTAL Tiberiu Alexandru


În acest caz se pune problema apartenenÛei lui else . C rezolv| aceast| ambiguitate
tel.: 0040-264-530918
asociindu-l pe else celui mai apropiat if. Conform acestei reguli, else este asociat lui if
e-mail: antaltiberiu@pcnet.ro
(exp resie2 ). Dac| aceast| situaÛie nu ne convine trebuie s| folosim acoladele dup| cum se
prezint| în exemplul care urmeaz|:

int a=7; int a=7;


if (a>0) if (a>0)

66
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
if (a < 100)ConstrucÛii de MaÕini
Facultatea {
prin tf("a in (1, 100)\ n); if (a < 100)
Catedra
else
de Mecanic| Õi Programare prin tf("a in (1, 100)\ n);
Curs
prinde limbaj
tf("a C ra lu i (0, 100 )\n");
in afa }
else
Copyright 2001. Toate drepturile sunt rezervateprin tf("a este n ega tiv\ n");
autorului.
Pentru a verifica dac| o variabil| a este într-un domeniu dat [a min max ,a ]
Multiplicarea
Cazuri clasice deacestui document în scop comercial este interzis|.
vom folosi if sub forma: if (a>= amin && a <= a max) . . ., iar condiÛia scris|
utilizare
se citeÕte astfel "dac| a este mai mare sau egal cu a min Õi mai mic sau
SudenÛii participanÛiegallacuorice
a maxform|
". Încep de|torii
înv|Û|mânt
într-alesuperior
C vor fi bugetar
tentaÛi spot
| punmultiplica
| problemaacest
de
document
mai sus subpentru
forma:uzul
if (apersonal.
min <= a <= a max) . . . Aceast | expresie este analizat | de compilatorul
C la fel cu expresia a min + a + a max. Adic| se adun| a min la a , apoi la rezultat se mai adun|
max. Folosind
SudenÛii
a parantezele
participanÛi rotunde
la orice form|ordinea de rezolvare
de înv|Û|mânt a operatorilor
cu plat| pus| într-o
poate fidoritoare
sau alte persoane
form | didactic|documentul
pot multiplica astfel, (a minnumai max. Similar,
+ a) + acontra cost Õiexpresia
cu acordula min <= aal
scris <=autorului. În acest |
a max este echivalent
cu expresia (a
scop m| puteÛimin <= a) <= a
contact| la:max . Se verific | dac | a min este mai mic sau egal cu a , rezultatul
este 0 sau 1 dup| cum relaÛia este falsa7 sau adeva7 rata7 . Apoi se compar| valoarea
ANTAL |Tiberiu
numeric de 0 sau 1 - în funcÛie de rezultat - cu a max, iar rezultatul este valoarea 1 sau 0,
Alexandru
dup| cum relaÛia este adeva7 rata7 sau falsa7 . Se observ| c| la a doua comparaÛie nu mai
tel.: 0040-264-530918
particip | valoarea variabilei a , ci întotdeauna una din valoarile numerice de 0 sau 1,
e-mail: antaltiberiu@pcnet.ro
rezultatele celei de a doua comparaÛii fiind altceva decât ne-am propus noi iniÛial- pentru
c| nu particip| a -ul ca operand.

La realizarea unei operaÛii, în funcÛie de îndeplinirea unei condiÛii, if se scrie în mod tipic
sub forma: if (a > m ax im ) . . . Operatorul > întoarce valoarea 1 dac| a este mai mare decât
m ax im sau 0 altfel. if îl interpreteaz| pe 0 ca fals Õi pe 1 ca adeva 7 rat.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
5.3 Instruct-iunea switch
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
switch este o variant| mai flexibil| decâ if pentru cazul mu lti-deciziilor .
Curs de limbaj C
7:
Form a switch(expresie)
Copyright 2001. Toate drepturile sunt rezervate autorului.
{
expr-const1 : instruct- iuni1
Multiplicarea acestuicase
document în scop comercial este interzis|.
case expr-const2 : instruct- iuni2

SudenÛii participanÛi .la. .orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzuldefault:
personal.instruct- iuni3
}
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Mai întâi se testeaz
pot multiplica | valoarea
documentul lui exp
numai ; dacÕi|cu
resiecost
contra aceasta este
acordul egalal| autorului.
scris cu una dintre valorile
În acest
constantelor
scop m| puteÛi întregi expr-consti
contact| la: se face ramificarea pe cazul corespunz|tor. Fiecare caz
separat este marcat printr-o etichet| format| din unul sau mai mulÛi întregi sau printr-o
expresie
ANTAL Tiberiuconstant | (expr-consti ). În caz de egalitate între valoarea lui exp resie Õi cea
Alexandru
constant| din case se continu| execuÛia programului, începând cu instrucÛiunile
tel.: 0040-264-530918
(instruc Ûiuni1 , instruc Ûiuni2 etc.) acelui caz. Grupul instruc Ûiuni3 marcat cu eticheta
e-mail: antaltiberiu@pcnet.ro
de fau lt : sunt executate dac| nu s-a g|sit nici o egalitate. PorÛiunea de fau lt : este opÛional|;
dac| aceasta nu exist| nu se face nimic. În secvenÛa de program care urmeaz| se pune
problema select|rii unei variante pe baza conÛinutului variabilei cmd . Implement|rile sunt
scrise folosind atât if cât Õi switch . fisiere (), program (), com pila re() , optiu ni() Õi
alte _c om en zi() sunt nume de funcÛii. Implementarea cu switch arat| modul în care se

67
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
poate executa
Facultatea acelaÕi grup
ConstrucÛii de instrucÛiuni pentru mai multe etichete diferite (cazul funcÛiei
de MaÕini
fisiere () care este selectata
Catedra de Mecanic| Õi Programare 7 la ap|sarea literelor f mic Õi F mare).
Curs de limbaj C
if ((cm d =='F ') || (cmd =='f')) fisiere (); switch(cmd)
else if (cm d == 'R ') prog ram (); {
Copyright
else if (cm2001.
d == Toate drepturile
'C ') com pila re(); sunt
rezervate autorului.
case 'F': case 'f': fisiere();break
else if (cm d == 'O ') optiu ni(); case 'R': program();break;
else alte_com en zi(cm d); case 'C': compilare();break;
Multiplicarea acestui document în scop comercial este interzis|.
case 'O': optiuni;break;
def au lt: alte_ com en zi(cm d);
SudenÛii participanÛi la orice form| de înv|Û|mânt
} superior bugetar pot multiplica acest
document pentru uzul personal.
Din punctul de vedere al tipului expresiei de testat, sw itch este mai puÛin flexibil decât
if . La switch
SudenÛii se pot testa
participanÛi numai
la orice valori
form| de tipul întreg,
de înv|Û|mânt iar valoarea
cu plat| sau alteexpresiei
persoane de testat se
doritoare
poate compara numai cu constante. La if se pot testa Õi valori de tip real, iar în expresia
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
de
scop testat pot interveni
m| puteÛi atât variabile cât Õi constante. În exemplul prezentat mai sus
contact| la:
observaÛi o instrucÛiune neprezentat| înc|, break . Pentru a înÛelege rolul ei, f|r| a spune
mai multe despre ea, prezint programul urm|tor:
ANTAL Tiberiu Alexandru
1 tel.:
/* SW 0040-264-530918
ITCH .C */
2 #include<stdio.h>
e-mail: antaltiberiu@pcnet.ro
3
4 en um zile {lun i=1, m arti, m iercu ri,joi,vine ri,sim ba ta, d um inica };
5
6 int main(void)
7 {
8 enu m zile azi;
9
10
Conf. dr. ing. ANTAL Tiberiu Alexandru
prin tf("Ba ga un nu m ar in tre 1 si 7 = ");
11 Universitatea Tenhic|
sca nf("% din Cluj-Napoca
i",& azi);
12 Facultatea ConstrucÛii de MaÕini
13 Catedraswde
itch(azi)
Mecanic| Õi Programare
14 {
15
Curs de limbajcase
C luni:
16 case ma rti:
17 case
Copyright 2001. mie drepturile
Toate rcur i: sunt rezervate autorului.
18 case joi:
19 case vineri: puts("Cara-te la lucru ...!");break;
20
Multiplicarea cas
acestui document în scop comercial este interzis|.
e sim ba ta: pr intf("R elax eaz a-te si ");
21 case duminica: printf("fa o excursie !");break;
22 de fau lt:laprin
SudenÛii participanÛi tf("N
orice u e xis
form| de ta a sa o zi !");
înv|Û|mânt superior bugetar pot multiplica acest
23 }
document pentru uzul personal.
24 retu rn(0 );
25 }
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Rezultate:
scop un
Baga m|numar
puteÛi contact|
intre 1 si 7la:
= 3 Baga un numar intre 1 si 7 = 6 Baga un numar intre 1 si 7 = 7
Cara-te la lucru ...! Relaxeaza-te si fa o excursie ! fa o excursie !
ANTAL Tiberiu Alexandru
Am
tel.: spus c| la întâlnirea "egalit|Ûii" switch face ca programul s| se continue din acel punct,
0040-264-530918
break întrerupe aceast| continuare fireasc| forÛând saltul la acolada din linia 23 , iar
e-mail: antaltiberiu@pcnet.ro
execuÛia programului continua7 cu urm|toarea linie de program dup| aceast| acolad| (mai
sus, linia 24 ).

68
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca

5.4 Instruct-iuni de ciclare


Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs deÛiunile
Instruc limbajde C ciclare sau mai pe scurt ciclurile asigur| posibilitatea execuÛiei unei
instrucÛiuni în mod repetat. Toate ciclurile sunt formate din dou| p|rÛi: una sau mai multe
expresii
Copyright care controleaz
2001. | reluareasunt
Toate drepturile ciclului Õi corpul
rezervate ciclului, adica7 instrucÛiunea sau grupul
autorului.
de instrucÛiuni a c|rei execuÛie se reia. C are trei instrucÛiuni de ciclare: w hile , do-w hile
ÕMultiplicarea
i for acestui document în scop comercial este interzis|.

5.4.1 Instruct-iunea de ciclare while


SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
w hile este ciclul de baz| în C. Are o singur| expresie de control - exp resie - Õi execut|
reluarea unei instrucÛiunii - instruct-iune - care se mai numeÕte Õi corpul ciclului - atâta
SudenÛii
timp cât participanÛi la orice form| de înv|Û|mânt
exp resie ia valoarea de adev|r adeva 7 rat.cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Form a7: while (expresie)
instructiune
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
e-mail:Ûia
Execu instrucÛiunii w hile seam|n| cu if . Dac| condiÛia exprimat| prin exp resie este
antaltiberiu@pcnet.ro
adeva 7 rata7 , se execut| instruct-iune. În continuare, dup| execuÛia lui instruct-iune,
condiÛia este testat| din nou. Dac| este înc| adeva7 rata7 , se reia instruct-iune. Cât timp
condiÛia r|mâne adeva7 rata7 , corpul ciclului se reia. Când condiÛia devine falsa7 (pentru c|
depinde într-un fel oarecare de valori care sunt modificate în corpul ciclului) corpul ciclului
nu se reia, execuÛia programului continuând cu prima instrucÛiune care urmeaz| dup|
aceasta. Gramatical, exp resie trebuie s| fie de tipul aritmetic sau poantor. SecvenÛele de
Conf. dr. pentru
evaluare ing. ANTAL Õi instruct
Tiberiu
exp resie -iune sunt:
Alexandru
Universitatea Tenhic| din Cluj-Napoca
exp resie ConstrucÛii de MaÕini
Facultatea
instruct- iune
Catedra
. . .
de Mecanic| Õi Programare
Curs de
exp resie limbaj C

Copyright Reluarea unui grup de instrucÛiuni atât timp cât o condiÛie este
Cazuri clasice2001.
de Toate drepturile sunt rezervate autorului.
adev|rat| este aplicaÛia clasic| a ciclului w hile . În exemplul urm|tor,
utilizare
instruc
Multiplicarea acestui Ûiunea reluat
document | este
în scop comercial | Õiinterzis|.
compuseste corespunde liniilor de program în
domeniul 7-10 . Atâta timp cât valoarea variabilei i este mai mic| decât
6 , instrucÛiunile care alc|tuiesc instrucÛiunea compus| a corpului lui w hile se reiau.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
1 document
/* W HILE pentru
.C */ uzul personal.
2 #include <stdio.h>
3 int main(void)
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
4 {
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
5 int i = 0;
6 scop m|wputeÛi
hile (i contact|
< 6) la:
7 {
8 ANTAL Tiberiu prin tf("Va loar ea lui i este % i\n ", i);
Alexandru
9 i++;
tel.: 0040-264-530918
10 }
11 e-mail:return
antaltiberiu@pcnet.ro
0;
12 }

Rezultate:
Valoarea lui i este 0

69
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
Valoarea lui i este 1
Facultatea ConstrucÛii de MaÕini
Valoarea lui i este 2
Catedra de
Valoarea lui i esteÕi3Programare
Mecanic|
Curs de limbaj
Valoarea lui iC este 4
Valoarea lui i este 5
Copyright 2001. Toate drepturile sunt rezervate autorului.
Variante de scriere a programului anterior sunt Õi:
#include <stdio.h> #include <stdio.h>
Multiplicarea
int main(void)
acestui document în scop comercial este interzis|.
int main(void)
{ {
SudenÛii participanÛi
int i = 0; la orice form| de înv|Û|mânt superior
int i = 0;bugetar pot multiplica acest
w hile (i < 6)
document pentru uzul personal. w hile (i < 6)
{ prin tf("i este %i\ n", i++ );
prin tf("i este %i\ n", i); return 0;
SudenÛii participanÛi
i=i+1; la orice form| de înv|Û|mânt
} cu plat| sau alte persoane doritoare
pot multiplica
} documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|return
puteÛi 0;contact| la:
}

ANTAL Tiberiu Alexandru


Dac| în exemplul de mai sus puneam caracterul ; dup| linia 6 (adic|,
Detel.:
evitat
0040-264-530918 scriem w hile(i < 6); ) ciclul while va fi "executat la infinit". Prin definiÛia
e-mail: antaltiberiu@pcnet.ro
gramatical| C aÕteapt| ca w hile s| se încheie într-o instrucÛiune care
este corpul cicului. Caracterul ;, numit instruct-iun ea v ida7 satisface aceast| cerinÛ|.
CreÕterea valorii lui i în corpul ciclului este esenÛial| pentru atingera condiÛiei de ieÕire
din ciclu. Scris în aceast| form|, ciclul w hile se termin| dup| caracterul ;. InstrucÛiunea
compus| în care se modific| valoarea lui i nu mai face parte din w hile . Deci, valoarea lui
i nu se modific| r|mând 0 , iar condiÛia de p|r|sire a ciclului (i>=6) nu se mai îndeplineÕte.
C va testa
Conf. la infinit
dr. ing. ANTAL îndeplinirea condiÛiei de ieÕire din ciclu.
Tiberiu Alexandru
Universitatea
ExperienÛa arat Tenhic| din Cluj-Napoca
| c| cele mai frecvente erori apar la punerea condiÛiei de p|r|sire a
Facultatea
ciclului. De exemplu, s|depresupunem
ConstrucÛii MaÕini c| doriÛi s| afiÕati valoarea lui i cât timp este mai
Catedra
mic | saudeegal| cu 7 Õi Õi
Mecanic| Programare
scrieÛi programul:
Curs de limbaj C
1 /* W HILE 1.C */
2 #include<stdio.h>
Copyright 2001. Toate drepturile sunt rezervate autorului.
3
4 int main(void)
5 Multiplicarea
{ acestui document în scop comercial este interzis|.
6 int i=1;
7 prin
SudenÛii tf("am ince
participanÛi lapu t\n ");
orice form| de înv|Û|mânt superior bugetar pot multiplica acest
8 while (i == 7)
9
document pentru uzul personal.
prin tf("i = %i\n ", i++);
10 prin tf("s-a term ina t\n ");
11 }SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Rezultate:
scop m| puteÛi contact| la:
am inceput
s-a terminat
ANTAL Tiberiu Alexandru
de mai sus este gres- it! Trebuie s| reÛineÛi c| este esenÛial| scrierea corecta7 a
tel.: 0040-264-530918
Programul
condi
e-mail:Ûieiantaltiberiu@pcnet.ro
de pa7 ra7 sire a ciclului. În cazul de mai sus condiÛia i == 7 este falsa7 de la început,
motiv pentru care se sare peste corpul lui w hile Õi se continu| programul cu urm|toarea
instrucÛiune (linia 11 ). Ciclul w hile infinit se poate obÛine Õi din neatenÛie. Dac| în
programul W HILE .C linia 6 se va scrie sub forma w hile (i < 6); , între caracterul ) -
paranteza rotund| închis|- Õi caracterul ; - punct Õi virgul| - se formeaz| corpul ciclului.

70
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
Din aceast|ConstrucÛii
Facultatea cauz| valoarea i -ului nu se mai incrementeaz|, iar condiÛia de p|r|sire a
de MaÕini
Catedra de Mecanic| Õi Programare vom dori s| nu se fac| nimic în corpul ciclului w hile .
ciclului nu se îndeplines - te. Ocazional,
Un astfel de exemplu este linia w hile ((ch = ge tcha r()) != '\n'); . Aici se citeÕte un caracter
Curs deÛia
cu func limbaj C
getch ar() care se stocheaz| în ch Õi se verific| dac| rezultatul este diferit de
caracterul '\n'. Deci acest ciclu va relua citirea unui caracter de la tastatur| atâta timp cât
Copyright 2001.diferit
caracterul este Toatede drepturile sunt
'\n'. Putem rezervate
spune autorului.
c| secven Ûa de program aÕteapt| introducerea
lui '\n' - ap|sarea tastei <Enter> - pentru ca programul s| treac| mai departe la
instruct-iunea urma
Multiplicarea 7 toare.
acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
5.4.2 Instruct-iunea de ciclare do-while
document pentru uzul personal.
Cea de a doua instrucÛiune de ciclare este do-while . Ea testeaz| condiÛia de terminare a
ciclului
SudenÛiidup | executarea
participanÛi instruc
la orice Ûiunii.
form| 7 aceast
hile testeaza
dewînv|Û|mânt cu | condi
plat| sau alteÛie de execuÛia
înainte doritoare
persoane
instruc Û |
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. Înspune
iunii care formeaz corpul ciclului. Din acest punct de vedere putem acest c|
do-w hile este un w hile cu "susul în jos".
scop m| puteÛi contact| la:

Form
ANTAL7:
a do Alexandru
Tiberiu
tel.: 0040-264-530918instruct-iune
w hile (exp resie);
e-mail: antaltiberiu@pcnet.ro

Datorit| test|rii condiÛiei de reluare a ciclului dup| execuÛia lui instruct- iune , corpul
acestui ciclul se va executa cel puÛin o dat|. Dac| exp resie este falsa7 corpul nu se reia.
SecvenÛele de evaluare ale lui exp resie Õi instruct-iune sunt:

instruct- iune
Conf. dr. ing. ANTAL Tiberiu Alexandru
exp resie
Universitatea
. . . Tenhic| din Cluj-Napoca
exp resie ConstrucÛii de MaÕini
Facultatea
Catedra de Mecanic| Õi Programare
1 /* DOde
Curs -Wlimbaj
HILE .CC*/
2 #include<stdio.h>
3 int m ain ()
4 Copyright
{ 2001. Toate drepturile sunt rezervate autorului.
5 int a=3;
6 Multiplicarea acestui document în scop comercial este interzis|.
7 prin tf("inc epu t\n ");
8 do {
9 SudenÛii participanÛi la orice
prin tf("\ta form|
= %i\ n",a );de înv|Û|mânt superior bugetar pot multiplica acest
10 a--; uzul personal.
document pentru
11 } wh ile (a > 0 );
12 prin tf("sfirs it\n ");
13 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
14 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
return 0;
15 }scop m| puteÛi contact| la:

Rezultate:
ANTAL Tiberiu Alexandru
inceput
tel.: 0040-264-530918
a = 3
e-mail: antaltiberiu@pcnet.ro
a = 2
a = 1
sfirsit

În linia 5 se iniÛializeaz| valoarea lui a cu 3 , linia 10 face decrementarea lui a , iar expresia

71
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
testat | esteConstrucÛii
Facultatea a > 0 din linia 11 . Corpul ciclului este format din instrucÛiunile liniilor 8-11
de MaÕini
cuprinse între
Catedra de Mecanic| acolade.Õi Programare
Curs de limbaj C În practic| ciclul do-w hile este mai puÛin folosit decât cel w hile . Exist|
Un exemplu
îns| cazuri când este necesar sau cel puÛin convenabil de utilizat. S|
Copyright 2001. Toate drepturile
presupunem sunt rezervate
c| dorim s| scriemautorului.
un program care citeÕte de la tastatur|
un num|r întreg, apoi afiÕeaz| num|rul de cifre Õi semnul num|rului. Pentru c| un num|r
are cel puÛin o cifr
Multiplicarea |, este
acestui convenabil
document ca execu
în scop Ûia corpului
comercial ciclului s| se fac| cel puÛin o dat|.
este interzis|.
Programul care urmeaz| implementeaz| o astfel de rezolvare.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
1 /* DO -W HILE 1.C */
document pentru uzul personal.
2 #include<stdio.h>
3 int main(void)
4 {SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
5 int a, c=0;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
6 char semn;
scop m| puteÛi contact| la:
7
8 prin tf("a = ");
9 ANTAL Tiberiu
sca nf("% i",Alexandru
&a );
10 prin tf("%i a re ", a );
tel.: 0040-264-530918
11
e-mail: antaltiberiu@pcnet.ro
12 if (semn = (a < 0)) a=-a;
13
14 do
15 c++;
16 w hile ((a/=10 )!=0);
17
18 prin tf("%i c ifre s i este %s\ n", c, sem n ? "n ega tiv" : "p ozitiv ");
19 Conf. dr. ing. ANTAL Tiberiu Alexandru
20 return Tenhic|
Universitatea 0; din Cluj-Napoca
21 }
Facultatea ConstrucÛii de MaÕini
Rezultat:de Mecanic| Õi Programare
Catedra
Curs de limbaj C
a = 5839
5839 are 4 cifre si este pozitiv
Copyright 2001. Toate drepturile sunt rezervate autorului.

5.4.3 Instruct
Multiplicarea -iunea
acestui document decomercial
în scop ciclare for
este interzis|.
for este sintactic cel mai complicat dintre cele trei cicluri. În esenÛ| este asem|nator cu
w hile , având
SudenÛii chiar o la
participanÛi condi Ûieform|
orice de terminare
de înv|Û|mânt | cu cea de
identicsuperior la w hile
bugetar pot. multiplica
for este cea mai
acest
concis | form
document | de ciclu
pentru uzulcare reuneÕte condiÛiile de început, condiÛia de terminare împreun|
personal.
cu instrucÛiunile de avans ce trebuie parcurse înainte de reluarea execuÛiei corpului
ciclului.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Form
scop m|7 : puteÛifor
a (expresie1;
contact| la: expresie2; expresie3)
instruct- iune
ANTAL Tiberiu Alexandru
Gramatical, cele trei componente ale lui for sunt expresii. În cazurile comune expresie1
tel.: 0040-264-530918
Õe-mail:
i expresie3 sunt atribuiri, iar expresie2 este o expresie relaÛional|. Oricare dintre cele
antaltiberiu@pcnet.ro
trei expresii pot fi omise, îns| caracterele ; trebuie scrise. Caracterele ; - punct Õi virgul| -
separ| cele trei expresii Õi nu au nimic în comun cu terminatorul de instrucÛiuni C. Când
compilatorul întâlneÕte un ciclu for, va evalua la început pe expr esie1. Apoi, pe expresie2,
iar dac| este adeva7 rata7 , se execut| corpul ciclului (instruct-iune). Se continua7 cu

72
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
expresie3 pentru a trece la pasul urm|tor, apoi expresie2 se evalueaz| din nou pentru a
Facultatea ConstrucÛii de MaÕini
verifica
Catedradacde |Mecanic|
exist| pasul urm|tor. Pe timpul execuÛiei ciclului for, secvenÛele de evaluare
Õi Programare
ale expresiilor sunt:
Curs de limbaj C
expresie1
Copyright 2001. Toate drepturile sunt rezervate autorului.
expresie2
instruct- iune
expresie3
Multiplicarea
expresie2
acestui document în scop comercial este interzis|.
instruct- iune
SudenÛii
expresie3 participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document. pentru uzul personal.
. .
expresie2
instruct- iune
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
expresie3
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
expresie2
scop m| puteÛi contact| la:
expresie1 se evalueaz| o singur| dat|. expresie3 se evalueaz| dup| fiecare reluare a
corpului instruct- iune). Ultima expresie care se va evalua este expresie2 pentru
ciclului (Alexandru
ANTAL Tiberiu
| atunci
ctel.: când ea
0040-264-530918devine falsa7 , ciclul se termin|.
e-mail: antaltiberiu@pcnet.ro
ConstrucÛia:
ComparaÛie
for (exp_init- ializare; exp_term inare; exp_av ans)
while - for instruct- iune;

este echivalent| cu:


exp_init- ializare;
while(exp_terminare)
Conf. dr. ing. ANTAL Tiberiu
{ Alexandru
instruct- iune;
Universitatea Tenhic| din Cluj-Napoca
exp_a vans;
Facultatea ConstrucÛii de MaÕini
}
Catedra de Mecanic| Õi Programare
Curs de limbaj C
Este util| comparaÛia ciclului for cu echivalenÛii lui din alte limbaje de
ComparaÛie C- programare. Ciclul for prezentat în tabelul care urmeaz| este
BASIC-
Copyright 2001. Toate drepturile sunt rezervate autorului.
"aproximativ echivalent" cu urm |toarele instrucÛiuni de ciclare din
FORTRAN-
limbajele BASIC, FORTRAN Õi PASCAL:
Pascal
Multiplicarea acestui document în scop comercial este interzis|.
Limbaj de programare Forma7 de scriere
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
C
document for (i=a; i<= b; i=i+p)
pentru uzul personal.
BASIC for i=a to b step p
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
FORTAN
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
do 7 i=a,b,p
scop m| puteÛi contact| la:
Pascal for i:=a to b

ANTAL Tiberiu Alexandru


Unele limbaje de programare cum sunt Pascal Õi Ada permit numai incrementarea sau
tel.: 0040-264-530918
decrementarea variabilei de control a ciclului - i în exemplele de mai sus. Dac| se doreÕte
e-mail: antaltiberiu@pcnet.ro
modificarea cu o valoare diferit| de 1 a variabilei de control, trebuie folosit un ciclu de tipul
w hile . Altele cum este FORTRAN, permit ca aceeaÕi variabil| de control s| fie numai de
tipul întreg. Din aceast| prism| C este cel mai puÛin restrictiv pentru c| nu are "o
variabil| de control a ciclului", toate cele trei componente ale ciclului for fiind expresii
arbitrare. În C, spre deosebire de FORTRAN, dac| expresie2 este falsa7 înainte de prima
73
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
execu Ûie a corpului
Facultatea ConstrucÛiiciclului (instruct-iune), acesta nu se va parcurge. În C, spre deosebire
de MaÕini
de Pascal, o variabil | folosit
Catedra de Mecanic| Õi Programare | pentru controlul execuÛiei ciclului îÕi p|streaz| valoarea
final| dup| terminarea ciclului. La terminarea unui ciclu, datorit| realiz|rii condiÛiei de
Curs de limbaj
p|r|sire C - condiÛia testat| devine falsa7 - valoarea variabilei de control, în C, dup|
a ciclului
ciclu va fi prima pentru care condiÛia a fost falsa7 Õi nu ultima pentru care a reuÕit. De
Copyright
asemenea, 2001. Toate
este legal drepturile sunt
| modificarea rezervate
acestei autorului.
variabile în interiorul ciclului Õi a valorii finale
b care controleaz| terminarea ciclului. Pentru exemplificarea unui ciclu for , unde "pasul"
de parcurgereacestui
Multiplicarea este diferit
documentde 1 ,înprezint un program
scop comercial care calculeaz| valoarea funcÛiei
este interzis|.
cosinus în intervalul [0, B ] cu pasul de 0.1 radiani.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
1 /* FO R.C */
document pentru uzul personal.
2 #include<stdio.h>
3 #include<math.h>
4 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
5 #define PI 3.141592553
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
6 int main (void)
scop m| puteÛi contact| la:
7 {
8 dou ble u ngh i;
9 ANTAL Tiberiu Alexandru
10 for(ungh i=0.0; unghi <= P I; unghi+=0.1)
tel.: 0040-264-530918
11 prin tf("cos (%3.2 lg) = %lf\n ", un gh i, cos(u ng hi));
e-mail: antaltiberiu@pcnet.ro
12
13 return 0;
14 }

Rezultate:
. . .
cos(2.8) = -0.942222
Conf. dr. ing.
cos(2.9) ANTAL Tiberiu Alexandru
= -0.970958
Universitatea Tenhic| din Cluj-Napoca
cos( 3) = -0.989992
cos(3.1) =ConstrucÛii
Facultatea -0.999135de MaÕini
Catedra de Mecanic| Õi Programare
+= se foloseÕte pentru a creÕte valoarea variabilei unghi cu 0.1 la fiecare reluare a ciclului.
Curs de limbaj C
În linia 3, m ath .h , este antetul standard pentru declaraÛiile funcÛiilor matematice, în
particular, pentru funcÛia cos ().
Copyright 2001. Toate drepturile sunt rezervate autorului.
Ciclul for pare a fi ideal atâta timp cât avem o singur| expresie de
Extinderea ciclului
Multiplicarea iniÛializare
acestui Õi una
document în scop | pentru este
comercial
singur Dac| dou| sau mai multe astfel
interzis|.
avans.
for
de expresii ar fi necesar de executat, acolo unde for permite numai una
singur
SudenÛii participanÛi |, s-arform|
la orice p|readecînv|Û|mânt
| ar fi nevoie
superior | instruc
de o altbugetar Ûiune
pot C. Problema
multiplica acest
poate fi u Õor dep|Õ it| prin
document pentru uzul personal. folosirea operatorului virgul | . El garanteaz | evaluarea
secvenÛial| a expresiilor de la stânga la dreapta, valoarea Õi tipul expresiei fiind date de
cea mai din
SudenÛii dreapta. la
participanÛi Fie codul
orice for(a=1, b=2, i=0; a=b=5, i<10; a++, b--, i++), expresie1 este
form| de înv|Û|mânt cu plat| sau alte persoane doritoare
format| din a=1, b=2, i=0 . Aici, mai întâi se execut| a=1 , apoi b=2 Õi în final i=0 . Dac| într-un
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
caz nu avem nevoie de expresie1 Õi expresie3, este corect s| scriem un for de forma: for(;
scop m| puteÛi contact| la:
i<7;) care este echivalent cu while (i<7).

ANTAL Tiberiu Alexandru


Dac| se omite expresie2, implicit se presupune c| aceasta are valoarea
Ciclul
tel.: for infinit
0040-264-530918 1 (adeva7 rat), deci ciclul nu se va termina. Astfel, o construcÛie de forma
for(;;) produce un ciclu for infinit. O diferenÛ| între w hile Õi for este c|
e-mail: antaltiberiu@pcnet.ro
la for, expresie2 este opÛional|, pe când la while , exp resie este obligatorie. Omiterea lui
exp resie în ciclul w hile va fi semnalat| de compilator ca o eroare de sintax|. Dac| doriÛi
în mod deliberat s| scrieÛi un ciclu w hile infinit folosiÛi construcÛia wh ile(1).

74
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
for este de preferat când cele trei expresii manipuleaz | aceeaÕi variabil|
DeFacultatea
ce atâtea ConstrucÛii de MaÕini
sau structur| de date pentru iniÛializare, test de terminare Õi avans.
Catedra de
instrucÛiuni de Mecanic| Õi Programare
Dac| acest Õablon de prelucr|ri nu este respectat, probabil w hile ar
ciclare?
Curs de limbaj C oferi o rezolvare mai clar|, cel puÛin pentru c| în cazul lui for ne
aÕtept|m la un tipic descris mai sus, nu s- i pentru w hile .
Copyright 2001. Toate drepturile sunt rezervate autorului.

5.5 Instruct-iunea break


Multiplicarea acestui document în scop comercial este interzis|.

Crearea
SudenÛii deliberat | a unui
participanÛi ciclu
la orice infinit
form| depare s| fie o ac
înv|Û|mânt Ûiune fatal
superior |, din pot
bugetar moment ce un astfel
multiplica acest
de program nu se va termina
document pentru uzul personal. niciodat | . Nu Õi în C ! Aici, se poate s| ri în afara oric| rui tip
de ciclu prin folosirea instrucÛiunii break. InstrucÛiunea break termin| execuÛia celui mai
apropiat do-w hile , for, w hile sau switch . Spun "cel mai apropiat" pentru c| este posibil|
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
suprapunerea mai multor cicluri. Efectul este acela de trecere a controlului la urm|toarea
pot multiplica
instruc documentul
Ûiune dup numai
| cea terminat |. contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
7:
Form a break;
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
break este frecvent utilizat| în switch pentru a termina o ramur| particular|. Nu se poate
e-mail: antaltiberiu@pcnet.ro
folosi în afara instrucÛiunilor de ciclare sau a lui switch .

1 /* BR EA K.C */
2 #include <stdio.h>
3
4 int main(void)
5 {
6 Conf. dr. ing. ANTAL Tiberiu Alexandru
int a;
7 Universitatea
for(a = -2 ; aTenhic| din Cluj-Napoca
< 3 ; a++)
8 {
Facultatea ConstrucÛii de MaÕini
9 if (a de
Catedra == 0)
Mecanic| Õi Programare
10 {
11 Curs de limbaj C corp ul ciclului fo r, IES IRE cu b rea k, a este %d \n ", a);
prin tf("In
12 break;
13 }
Copyright 2001. Toate drepturile sunt rezervate autorului.
14 prin tf("In corp ul ciclului fo r, a es te %d \n ", a);
15 }
16 Multiplicarea
return 0; acestui document în scop comercial este interzis|.
17 }
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Rezultate:
document pentru uzul personal.
In corpul ciclului for, a este -2
In corpul ciclului for, a este -1
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat|
In corpul ciclului for, IESIRE cu break, a este 0
sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| se utilizeaz| la testarea unor condiÛii de terminare excepÛional|
break la:
Cazuri clasice de
a ciclurilor. Într-un astfel de caz se doreÕte saltul în afara corpului
utilizare
ciclului mai devreme decât în cazul realiz|rii condiÛiei de p|r|sire a
ANTAL Tiberiu Alexandru
ciclului - cazul termin|rii normale.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
5.6 Instruct-iunea continue
breakforÛeaz| saltul imediat în afara celui mai apropiat ciclu, continue forÛeaz| saltul la
urm|toarea reluare a ciclului. InstrucÛiunea continue transfer| controlul execuÛiei

75
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
programului la începutul
Facultatea ConstrucÛii MaÕini do-w hile , for, w hile din punctul în care apare, s|rind
de ciclurilor
peste instruc Ûiunile r | mase
Catedra de Mecanic| Õi Programare în corpul corespunz|tor ciclului în care se g|seÕte. În cazul
ciclurilor w hile Õi do-w hile , saltul se face la reevaluarea condiÛiei de terminare a ciclurilor
Curs de limbaj
- exp resie C
. În cazul lui for, saltul se face la expresia de avans - expresie3 - apoi se
reevalueaz| condiÛia de p|r|sire a ciclului - expresie2.
Copyright 2001. Toate drepturile sunt rezervate autorului.
7:
Form a continue;
Multiplicarea acestui document în scop comercial este interzis|.
continue se foloseÕte în elaborarea unui program cu cicluri, când dorim
SudenÛii
Cazuri participanÛi
clasice de la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
s| facem salt la începutul ciclului pentru a testa expresia de p|r|sire a
utilizare
document pentru uzul personal.
ciclului, eventual pentru a relua corpul acestuia, f|r| a trece prin toate
instrucÛiunile din corpul ciclului curent.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
1 potCO
/* multiplica documentul
NT INU E.C */ numai contra cost Õi cu acordul scris al autorului. În acest
2 #include<stdio.h>
scop m| puteÛi contact| la:
3 #include<math.h>
4
5 ANTAL Tiberiu Alexandru
int main(void)
6 {tel.: 0040-264-530918
7 int a,b;
e-mail: antaltiberiu@pcnet.ro
8
9 for(a = -2; a < 3; a++)
10 for(b = -2; b < 3; b++)
11 {
12 if (a <= 0) break;
13 if (b == 0) continue;
14 printf("a = %2 d, b=%2 d, sq rt(a)/b = %f\ n", a ,b, sqr t(a)/b );
15 Conf.
} dr. ing. ANTAL Tiberiu Alexandru
16 Universitatea
return 0; Tenhic| din Cluj-Napoca
17 }
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Rezultate:
Curs de limbaj C
a= 1, b=-2, sqrt(a)/b = -0.500000
a= 1, b=-1, sqrt(a)/b = -1.000000
Copyright
a= 1, b= 2001. Toate drepturile
1, sqrt(a)/b sunt rezervate autorului.
= 1.000000
a= 1, b= 2, sqrt(a)/b = 0.500000
a= 2, b=-2, sqrt(a)/b = -0.707107
Multiplicarea acestui document în scop comercial este interzis|.
a= 2, b=-1, sqrt(a)/b = -1.414214
a= 2, b= 1, sqrt(a)/b = 1.414214
SudenÛii
a= 2, b= participanÛi la orice
2, sqrt(a)/b = form| de înv|Û|mânt superior bugetar
0.707107 pot multiplica acest
document pentru uzul personal.
În exemplul
SudenÛii anterior,laexpresia
participanÛi orice form| se
depoate evaluacu
înv|Û|mânt numai sau|alte
plat| dac b … 0 Õi a>=0 . În linia 12 ,
persoane doritoare
pot
cândmultiplica
condiÛia adocumentul numai contra cost Õi cu acordul scris al autorului. În acest
<=0 este adev|rat|, se sare în afara ciclului for interior pentru c| nu se
scop m| puteÛi contact| la:
poate calcula . În linia 13 , când condit-ie b == 0 este adeva7 rata7 , împ|rÛirea nu se poate
efectua
ANTAL- Tiberiu | b este zero - Õi se trece la o nou| reluare a ciclului for interior.
pentru cAlexandru
tel.: 0040-264-530918
InstrucÛiunile break Õi continue sunt forme particulare ale instrucÛiunii
Cee-mail: antaltiberiu@pcnet.ro
sunt break Õi
de salt necondiÛionat goto . F|r| a intra în prea multe am|nunte, unele
continue? firme de software interzic folosirea lui goto în programe. Pentru c|
break Õi continue sunt într-o relaÛie foarte apropiat| de goto , aceleaÕi
firme propun utilizarea moderat| a acestor instrucÛiuni. De ce aceast| oroare fat-a7 de goto ?
În 1966, Böhm s- i Jacopini publica7 o lucrare în care arata7 ca7 orice program poate fi scris
76
Capitolul
Conf. dr.5 ing.
- Instruc
ANTALÛiunile Tiberiu
limbajuluiAlexandru
C
Universitatea Tenhic| din Cluj-Napoca
|r| utilizarea
fFacultatea saltului de
ConstrucÛii necondi
MaÕini Ûionat. Utilizarea lui goto îngreuneaza7 mult înÛelegerea
programului Õi în general
Catedra de Mecanic| Õi Programare va sc |dea viteza lui de execuÛie. Putem spune deci c| un
program cu salturi necondiÛionate va fi de calitate îndoielnic|.
Curs de limbaj C

5.7 Instruct-iunea goto


Copyright 2001. Toate drepturile sunt rezervate autorului.

Pentru c| C are
Multiplicarea acestui
o instruc Ûiune deînsalt
document scop Ûionateste
comercial
necondi goto m| simt obligat s| o prezint Õi pe
interzis|.
aceasta.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
Form 7 : pentru
a gotouzul personal.
eticheta7;
. . .
SudenÛii participanÛi
etichetala orice form|
7 : instruct-iunede înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
InstrucÛiunea goto face saltul la instrucÛiunea instruct-iune marcat| cu eticheta eticheta7 .
În exemplul care urmeaz|, goto transfer| controlul programului la instrucÛiunea etichetat|
ANTAL
cu iesire:Tiberiu
când a Alexandru
ia valoarea 0 .
tel.: 0040-264-530918
1 e-mail:
/* GO TOantaltiberiu@pcnet.ro
.C */
2 #include <stdio.h>
3
4 int main(void)
5 {
6 int a;
7
8 for(a = -2 ; a < 3 ; a++)
9
Conf. dr.{
ing. ANTAL Tiberiu Alexandru
10 Universitatea Tenhic|
if (a == 0)din Cluj-Napoca
goto iesire;
11 Facultatea ConstrucÛii
prin tf("Indecorp
MaÕini
ul ciclului fo r, a es te %d\ n", a );
12 }
Catedra de Mecanic| Õi Programare
13 iesir e: prin tf("Am iesit cu g oto d in fo r!\n ");
14
Curs dereturn
limbaj0;C
15 }
Copyright 2001. Toate drepturile sunt rezervate autorului.
Rezultate:
In corpul ciclului
Multiplicarea for, a este
acestui document -2 comercial este interzis|.
în scop
In corpul ciclului for, a este -1
Am iesit cu goto din for!
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru Un uzulnum
personal.
e de eticheta 7 urmeaz| aceleaÕi reguli de scriere ca pentru
Ce este o
numele de variable. Eticheta se poa te ata s- a orica7 rei instruct-iun i din
eticheta 7? -iei în de
care apare instruc Ûiunea
SudenÛii participanÛi la orice
corpul functform| înv|Û|mânt cu plat| alte. persoane doritoare
saugoto
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Exist|la:
situaÛii când folosirea unui goto este îndrept|Ûit|. Cazul clasic
Ôiscop
totuÕim| puteÛisecontact|
uneori
este abandonarea unei construcÛii de mai multe cicluri suprapuse la
foloseÕte!
apariÛia unei erori fatale în interiorul unuia dintre ciclurile suprapuse.
ANTAL Tiberiu Alexandru
Folosirea lui break ar duce la ieÕirea numai din cel mai apropiat ciclu,
tel.: 0040-264-530918
ieÕirea direct| din toate ciclurile suprapuse fiind imposibil| far| utilizarea lui goto .
e-mail: antaltiberiu@pcnet.ro

77
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

6 Funct-ia
Multiplicarea acestui document în scop comercial este interzis|.

E
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
programe
stepentru
ideal ca
uzul scrierea unui program acesta s| fie cât mai uÕor de înÛeles Õi de
la personal.
întreÛinut. Pentru aceasta programele lungi trebuie transformate în porÛiuni de
mai scurte,ladeorice
SudenÛii participanÛi st|t|toare
sineform| în funcÛionare
de înv|Û|mânt Õi casau
cu plat| înÛeles, care pusedoritoare
alte persoane
s| dea programul iniÛial. În acest scop s-a creat funct-ia . Ea poate fi privit| ca o cutie
cap la cap,
pot multiplica
neagra 7 cu un numdocumentul numai contra cost Õi cu 7acordul
e s- i argumente care realizeaza
scris
o sarcin a
al autorului.
7 specif În acest
7 . Cea mai
ica dificil|
scop
sarcinm|| aputeÛi contact| la: este aducerea programului de la forma f|r| funcÛii, la o form|
programatorului
mai compact|, prin rescrierea lui sub forma unor funcÛii cu num|r optim de parametri, în
ANTAL
scopul |riiAlexandru
Tiberiu
reutiliz unor funcÛii Õi în alte programe, al ascunderii informaÛiei, al clarit|Ûii Õi
între Ûinerii optime a programului.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Funct- ia trebuie s| duc| la compartimentarea programului în porÛiuni de program prin
care s| se:
- defineasca7 o sarc ina7 clara7 , care se reia de mai multe ori în acelaÕi program,
eventual se poate refolosi Õi în alte programe;
- obÛin| o cutie neagra7 , adic| detaliile de implementare s| nu trebuiasc| s| fie
cunoscute în restul programului pentru a o utiliza;
Conf. dr. ing. ANTAL
- realizeze Tiberiu Alexandru
implementarea cât mai buna 7 a sarcin ii . În acest scop, este probabil
Universitatea Ûia s|-Õdin
ca funcTenhic| |Õeasc| atribuÛiile suficiente pentru rezolvarea sarcinii
Cluj-Napoca
i dep
particulare
Facultatea de MaÕini pentru care s-a scris, dac| se anticipeaz| posibilitatea
din programul
ConstrucÛii
extinderii func Û ionalit
Catedra de Mecanic| Õi Programare |Ûii ei Õi pentru alte programe;
limbaj| C
Curs de- ajung - utilizând apelurile funcÛiilor- la un program în care sarcinile de rezolvat
se observ| clar, adic| s| obÛinem un prog ram lizibil , în loc s| avem un program
Copyrightlung, complicat,
2001. Ûeles,rezervate
dificil de însunt
Toate drepturile cu porÛiuni de cod care se repet|;
autorului.
- poat| rescrie oricând în vederea obÛinerii unei robusteÛi Õi performanÛe mai bune
f|r| alte modific|ri în restul programului. Aceast| rescriere trebuie s| fie posibil|
Multiplicarea acestui
din moment cedocument în scop comercial
restul programului este interzis|.
nu Õtie modul de implementare al funcÛiilor.
SudenÛii
ProgramulparticipanÛi
C este, în la orice form|
general, formatdedin
înv|Û|mânt
mai multesuperior bugetar
funcÛii care pot fipot multiplica
stocate acest
în unul sau
mai multe fi
document Õiere surs
pentru uzul|personal.
C. Limbajul C a fost proiectat pentru utilizarea simpl| Õi eficient|
a funcÛiilor. El este orientat pentru proiectarea aplicaÛiilor prin funcÛii, limbajul C
numindu-se din acest la
SudenÛii participanÛi motiv,
oricefuncÛional.
form| Am v|zut deja
de înv|Û|mânt | în Csau
cu cplat| variabilele trebuie
alte persoane declarate
doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest| Õi
înainte de a fi folosite în program. Procedura este identic | Õ i la func Ûii. Ele se declar
se definesc
scop m| puteÛipentru la: fi folosite în program. Asem|narea Õi diferenÛa între o
a putea
contact|
declaraÛie Õi definiÛie de funcÛie se va l|muri în paragrafele urm|toare.
ANTAL Tiberiu Alexandru
6.1 Apelul funct-iilor
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Dup| cum am mai spus, funcÛia este o porÛiune de program, scris| de noi sau de altcineva,
care rezolv| o sarcin| distinct| din program. În liniile care urmeaz| doresc s| clarific
modul de apelare a funcÛiilor prin prisma observ|rii exemplelor prezentate pân| acum.
Urm|toarele concluzii se pot trage:

78
Capitolul
Conf. dr.6 ing.
- Funct-ii
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
N o ConstrucÛii
Facultatea funcÛie se apeleaza 7 prin numele ei urmat de o pereche de paranteze rotunde;
de MaÕini
N dac | func Ûia are arg um en te , acestea se vor plasa între paranteze rotunde Õi vor
Catedra de Mecanic| Õi Programare
fi separate prin virgule.
Curs de limbaj C
Iat| câteva exemple de apeluri de funcÛii:
Copyright 2001. Toate drepturile sunt rezervate autorului.
p rintf (" Un ap el d e fu nc tie"); /* functia c u n u mele pr in tf() a re 1 a rgu men t, s ir ul "Un
apel de functie"
Multiplicarea */ document în scop comercial este interzis|.
acestui
printf("% d\ n",i); /* aceea si functie prin tf() are aici 2 arg um ente */

SudenÛii participanÛi
cos (x+y+1.61 80 34); /* la orice form|
functia m atemde înv|Û|mânt
atica cos() aresuperior bugetar
ca arg um ent o pot
exp multiplica
resie */ acest
document
getch (); /* pentru
functiauzul personal.
g etch() nu are a rgum ente */

Argumentele unei func


SudenÛii participanÛi laÛiiorice
pot fiform|
constante, nume de variabile,
de înv|Û|mânt Ûii sau
funcalte
cu plat| sau expresiidoritoare
persoane complexe.
Din acest motiv în loc de :
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
z=x+y+1.618034;
prin tf("%f\ n", co s(z));
ANTAL Tiberiu Alexandru
tel.:poate
se scrie:
0040-264-530918
e-mail: antaltiberiu@pcnet.ro
prin tf("%f" ,cos(x +y+1 .618 034 ));

ObservaÛi mai sus c| funcÛia cu numele printf() are ca argument o alt| funcÛie, cos (). Multe
funcÛii întorc o valoare care poate fi folosit| în expresii complexe:

x=r *cos (fi);


Conf.
a=a tandr. ing.s(z)*(x
(x)*co ANTAL Tiberiu
Alexandru
+y)/(z+3.2);
Universitatea Tenhic| din Cluj-Napoca
În exemplulConstrucÛii
Facultatea anterior ata
den() Õi cos () sunt funcÛii din biblioteca matematic| standard care
MaÕini
Catedra de Mecanic| Õi Programare
se folosesc în expresiile: Õi .
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


6.2 Definirea unei funct-ii
Multiplicarea acestui document în scop comercial este interzis|.
FuncÛiile sunt echivalentul subprogramelor Õi procedurilor din alte limbaje de programare
de nivel înalt. Acestea primesc ca da te de intrare un num|r de param etri, execut| apoi
o porÛiune
SudenÛii participanÛi
de cod numit | corpul
la orice form|funct -iei Õi în final
de înv|Û|mânt superior
întorcbugetar
o valoare potde
multiplica
un anumit acest
tip
calculat
document | înpentru uzul Ûpersonal.
corp. Func iile care nu întorc valori se declar| de tipul void . O funcÛie trebu ie
întodeauna declarata 7 într-un prototip de funct-ie înainte de a fi apelat| - noÛiunea de
prototip fi l| murit |
SudenÛii participanÛi laînorice
va paragrafele
form| decare urmeaz|cu
înv|Û|mânt plat|Ûiasau
. Func grupeaza 7 instruct
alte persoane -iuni sub
doritoare
un sin gu r n um
pot multiplica documentul funcÛiei
e . N um elenumai este cost
contra folosit
Õi cupentru
acordulapelarea funct- iei ÕÎn
scris al autorului. i produce
acest
execu Ûia grupului de
scop m| puteÛi contact| la: instruc Ûini care fac parte din corpul func Ûiei. Func Û ia din care se
apeleaz| o alt| funcÛie se numeÕte funct-ie apelanta7 , iar funcÛia care se apeleaz| se
numeÕte funct-ie apelata7 . Funct-ia apelat|, de obicei, întoarce o valoare în funcÛia
ANTAL
apelant| Tiberiu
calculatAlexandru
| pe baza instrucÛiunilor din corpul ei. Valoarea întoars| în funcÛia
tel.: 0040-264-530918
apelant| se poate ignora dac| aÕa doreÕte programatorul. Modalitatea de întoarcere a
e-mail: de funcÛia apelat| în funcÛia apelant| este instrucÛiunea return . Forma
antaltiberiu@pcnet.ro
valorii calculate
ei de scriere este: return expresie;. ex pre sie se va converti la tipul de valoare pe care îl
întoarce funcÛia, dac| este cazul. FuncÛia ne permite s| execut|m acelaÕi grup de
instrucÛiuni, cuprinse în corpul ei, din diferite por Ûiuni ale unui program Õi pentru diferite
valori ale variabilelor grupate în corpul funcÛiei, folosind parametri. Din cele spuse rezult|

79
Capitolul
Conf. dr.6 ing.
- Funct-ii
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
| o funcÛieConstrucÛii
cFacultatea se defineÕtedeprin:
MaÕini
- nu m ele folosit pentru apelul funcÛiei;
Catedra de Mecanic| Õi Programare
- o lista de zero sau mai mulÛi param etri care se transfer| funcÛiei pentru
Curs deprelucr
limbaj|C ri directe sau în vederea dirij|rii unor prelucr|ri;
- un corp care conÛine instrucÛiunile ce îndeplinesc sarcina pentru care funcÛia a
Copyright
fost2001.
creat|Toate
; drepturile sunt rezervate autorului.
- o valoare întoarsa7 .
Multiplicarea acestui document în scop comercial este interzis|.
7:
Form a tip_întors nume _functie(lista declarat- iilor de p ara m etri)
SudenÛii participanÛi
{ la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzuldeclarat
personal.
-ii loca le
instruct- iuni
SudenÛii participanÛi
}
la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Un caz special este când funcÛia revine în programul apelant pentru c| aceasta s-a
terminat - s-a ajuns la acolada } care specific| terminarea corpului funcÛiei - f|r| a întâlni
ANTAL
o instrucTiberiu Alexandru
Ûiune return . Ce fel de valoare se întoarce pentru acest caz? Este ciudat ca o
tel.: 0040-264-530918
funcÛie, uneori s| întoarc| o valoare, aleori nu. Conform definiÛiei, funcÛia trebuie s|
e-mail:| antaltiberiu@pcnet.ro
întorc valoare în ambele cazuri - cu sau f|r| return . Dac| return lipseÕte sau nu este
întâlnit, asta nu înseamn| c| nu se întorce o valoare, ci c| valoarea întoars| nu este
previzibil|, fiind "gunoi".

Conform standardului, tipul valorilor întoarse de o funcÛie poate fi: aritmetic, structur|
(struct), reuniune (union ), vid (void ), poantor (pointer); dar nu poate fi o funcÛie
(Conf.
function) sau un tablou (array ).
dr. ing. ANTAL Tiberiu Alexandru
6.2.1 Definirea unei funct-ii - exemplu
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
S| presupunem c| avem de scris o funcÛie care trebuie s| afiÕeze valoarea lui
Catedraun
pentru dexMecanic| Õi Programare
care parcurge intervalul [a,b] cu pasul constant h .
Curs de limbaj C
Tipul valorii întoarse de funct-ia afisa re()
Copyright 2001. Toate drepturile sunt rezervate autorului.
1 int afisare(double a, double b, double h)
Multiplicarea acestui document în scop comercial este interzis|.
2 {
3 int linia; FuncÛia afisa re() are 3 parametri de
4 SudenÛii participanÛi la orice form| de înv|Û|mânt superior tipul doubbugetar pot multiplica
le cu numele: a , b , h acest
prin tf("-------------------------------\
5 document pentru uzul personal. n");
6 prin tf("| nr.| x | sin(x )/x |\n");
7 prin tf("-------------------------------\ n");
8 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
9 pot multiplicaa<=b;
for(linia=1; documentul numai contra cost Õi cu acordul scris al autorului. În acest
a+=h,linia++)
10 scopifm|(a puteÛi
!= 0 .) contact| la:
11 prin tf("|%2i. | %10 .7lg | %10 .7lg|\n ", linia , a, sin (a)/a );
12 else
13 ANTAL Tiberiu
return 0; Alexandru
14 tel.: 0040-264-530918
Valoare întoars| de funcÛie
prin tf("-------------------------------\
15 e-mail: antaltiberiu@pcnet.ro n");
16 retu rn 1;
17 }
Valoare întoars| de funcÛie
Pentru funcÛia cu numele afisa re() sunt specificate urm|toarele elemente:
Tipul întors: int, specificat în linia 1;
80
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Numele
Facultatea funct-iei: afisare
ConstrucÛii specificat în linia 1. El trebuie s| fie distinct de numele altor
de, MaÕini
func Ûii, variabile, etc. pentru
Catedra de Mecanic| Õi Programare ca s| asigure identificarea unic| a funcÛiei în program;
Parametri: double a, double b, double h , specificaÛi în linia 1. Fiecare parametru trebuie
Curs
s| aibde
| unlimbaj C
tip Õi un n um e ;
Valoarea întoarsa7 : return 0, în linia 13 Õi return 1, în linia 16. Dac| funcÛia are specificat
Copyright 2001.întoarse
un tip al valorii Toate drepturile
aceasta va sunt rezervate
fi întoars autorului.
| prin folosirea lui return .
Corpul funct-iei: format din instrucÛiunile cuprinse între acoladele {, } din liniile 2 Õi 17 .
Multiplicarea acestui document în scop comercial este interzis|.
Valorile de afiÕat sunt calculate în ciclul for din linia 9 . Datele sunt prezentate într-o
form | tabelar
SudenÛii |, capulladeorice
participanÛi tabelform| afiÕînv|Û|mânt
fiind de 5-7. Dac|
at în liniilesuperior în urmapot
bugetar avansului cu acest
multiplica pasul
h parametrul a ia valoarea
document pentru uzul personal. numeric | 0. , atunci împ | r Ûirea este compromis | Õi avem un caz
de eroare. Dupa7 terminarea afis- a7 rii se revine din funcÛie întorcând valoarea numeric| de
0 - terminare cu eroare. Altfel, dac| terminarea este normal|, revenirea din funcÛia
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
afisa re() se face cu valoarea numeric| de 1 - ea indicând terminarea afiÕ|rii cu succes.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
6.3 Apelul de funct-ie
ANTAL Tiberiu Alexandru
Apelul de funcÛie este în realitate un operator . El are ca operanzi doua 7 exp resii s- i are
tel.: 0040-264-530918
ca efect tran sferu l controlu lui pro gra m ulu i s- i al argum entelor , dac| acestea exist|, la
e-mail:
secvenÛaantaltiberiu@pcnet.ro
de cod cuprinsa7 în corpul funcÛiei apelate.

7:
Form a expresie_specificator_de_funct- ie (expresie_lista
7 _argum ente)

expresie_specificator_de_funct- ie identific| funcÛia care este apelat|, fiind un nume de


funcÛie sau o expresie care în urma evalu|rii specific| adresa unei funcÛii.
Conf. dr. ing. 7ANTAL
expresie_lista
Tiberiu Alexandru
_a rgu m en te este o list| de expresii, separate prin virgul|, care constituie
Universitatea
argumentele func Tenhic| din Cluj-Napoca
Ûiei apelate. Termenul de a r gu m ent se foloseÕte pentru o expresie a
Facultatea ConstrucÛii de MaÕini
c|rei valoare este transferat | printr-un apel de funcÛie. Termenul de param etru este
Catedra
folosit de Mecanic|
pentru Õi Programare
un obiect de intrare - variabil| - într-o funcÛie sau într-o declaraÛie de
CursÛie.
func limbaj C de parametru actual Õi param etru formal sunt folosiÛi uneori pentru
de Termenii
a face aceeaÕi distincÛie.
Copyright 2001. Toate drepturile sunt rezervate autorului.
6.3.1 Conversii aritmetice standard la apelul de
Multiplicarea acestui document în scop comercial este interzis|.
funct -ii
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Pentru c| avem de a face cu un operator, tipu l con ver siilor rea lizate pentru operanzii
document pentru
care alc|tuiesc uzul personal.
argumentele funct- iei în apel, depinde de existent- a prototipului funcÛiei
unde sunt declarate tipurile corespunz|toare argumentelor funcÛiei apelate. Dac| funct-ia
SudenÛii
are , pe baza la
participanÛi
prototip orice Ûform|
declara iilor dedetipuri de argumente,
înv|Û|mânt cu plat|compilatorul face verific
sau alte persoane |ri de
doritoare
tip, Õ de num | r, între argumente Õ
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest, se
conversii de tip i i parametri. În lipsa prototipului
fac
scopnumai conversii
m| puteÛi aritmetice
contact| la: standard ale valorilor expresiilor din lista de argumente
în apelul de funcÛie. Aceste conversii se realizeaz | individual pentru fiecare argument în
func
ANTAL Ûie deTiberiu
tipul argumentelor.
Alexandru O valoare de tip float se va converti automat în doub le ; una
char sau short în int; una unsigned char sau unsigne d short în unsigned int .
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
6.3.2 Apelul unei funct-ii - exemplu
Pentru facilitarea înÛelegerii, dezvolt în continuare problema propus| în paragraful 6.2.1.
De aceast| dat| îns| funcÛia afisa re() are o nou| definiÛie. Versiunea anterioar| era
incorect implementat| în C, fiind specific| celor care vin s| lucreze în C, din alte limbaje
81
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
de programare.
Facultatea F|r| a de
ConstrucÛii intra în prea multe detalii, comparaÛia cu valoarea numeric| 0. era
MaÕini
incorect | . Noua abordare
Catedra de Mecanic| Õi Programare folose Õte constanta DBL_EPSILON definit| în fiÕierul antet
floa t.h . DBL_EPSILON este cea mai mic| valoare de tip doub le pentru care avem
Curs de limbaj C
1.0+DB L_ EP SIL ON != 1.0 .
Aceast| linie îi spune
1 Copyright
/* FU NC TIE1.C Toate drepturile suntcompilatorului
2001. */ cum
rezervate autorului.
2 #include<stdio.h> lucreaz| funcÛia
3 #include<math.h>
Multiplicarea acestui document în scop comercial afisa re()
este interzis|.
4 #include<float.h>
5
6 SudenÛii
int afisa participanÛi
re(d ou ble a, la orice
d ou ble form|
b, d oude
bleînv|Û|mânt superior
h); /* Prototip bugetar
afisare () */ pot multiplica acest
7 document pentru uzul personal.
8 int main(void)
9 {
10
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
doub le a,b,pas;
11 pot prin
multiplica
tf("a = documentul
"); contra cost ÕiÕtie
numaiCompilatorul cu c|
acordul
aceste scris al autorului.
expresii trebuie s| În acest
12 sca nf("% lf", &a );
scop m| puteÛi contact| la: fie de tipul doub le din prototip Õi le
13 prin tf("b = ");
14 sca nf("% lf", &b ); converteÕte automat dac| cumva nu sunt de
15
ANTAL Tiberiu Alexandru
prin tf("pa s = "); tipul corespunz|tor.
16 tel.:sca
0040-264-530918
nf("% lf", &p as);
17 if (!afis
e-mail: are (a,b,p as)) /* Ape lul functiei afisare () */
antaltiberiu@pcnet.ro
18 prin tf("Er oar e in calcule !\n \tTerm ina re fo rtata .\n");
19 else
20 prin tf("Te rm ina re cu succes.\n ");
21 return 0;
22 }
23
24 int afisare(double a, double b, double h)
25
Conf.
{
dr. ing. ANTAL Tiberiu Alexandru
26 Universitatea
int linia; Tenhic| din Cluj-Napoca
27 Facultatea ConstrucÛii de MaÕini
28 prin tf("-------------------------------\
Catedra de Mecanic| Õi Programare n");
29 prin tf("| nr.| x | sin(x )/x |\n");
30
Curs de limbaj C
prin tf("-------------------------------\ n");
31
32 Copyright 2001.a<=b;
for(linia=1; Toate drepturile sunt rezervate autorului.
a+=h,linia++)
33 if ((a >= D BL _E PS ILO N ) || (a <= -D BL _E PS ILO N ))
34 prin tf("|%2i. | %10 .7lg | %10 .7lg|\n ", linia , a, sin (a)/a );
35
Multiplicarea
else
acestui document în scop comercial este interzis|.
36 return 0;
37 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
38 prin tf("-------------------------------\
document pentru uzul personal. n");
39 return 1;
40 }
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Rezultate:
scop
a = 1m| puteÛi contact| la: a = -1
b = 2 b = 1
pas
ANTAL = .1Tiberiu Alexandru pas = .2
------------------------------- -------------------------------
tel.:
| nr.|0040-264-530918
x | sin(x)/x | | nr.| x | sin(x)/x |
e-mail: antaltiberiu@pcnet.ro
------------------------------- -------------------------------
| 1. | 1 | 0.841471| | 1. | -1 | 0.841471|
| 2. | 1.1 | 0.8101885| | 2. | -0.8 | 0.8966951|
| 3. | 1.2 | 0.7766992| | 3. | -0.6 | 0.9410708|
| 4. | 1.3 | 0.7411986| | 4. | -0.4 | 0.9735459|

82
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
| 5. |
Facultatea 1.4 | de0.7038927|
ConstrucÛii MaÕini | 5. | -0.2 | 0.9933467|
| 6. | 1.5 | 0.6649967| Eroare in calcule!
Catedra
| 7. |
de Mecanic| Õi Programare
1.6 | 0.6247335| Terminare fortata.
Curs
| 8. de
| limbaj C1.7 | 0.5833322|
| 9. | 1.8 | 0.5410265|
|10.
Copyright 2001. 1.9
| | drepturile
Toate 0.4980527|sunt rezervate autorului.
-------------------------------
Terminare cu succes.
Multiplicarea acestui document în scop comercial este interzis|.

Urm |toarele
SudenÛii elemente
participanÛi la sunt
oriceesen
form| Ûiale
depentru apelulsuperior
înv|Û|mânt unei func Ûii:
bugetar pot multiplica acest
Prototipul: este definit
document pentru uzul personal.în linia 6 Õi informeaz | compilatorul despre modul în care lucreaz|
funcÛia. Astfel, funcÛia cu numele afisare , are trei argumente de tipul doub le Õi întoarce
oSudenÛii
valoareparticipanÛi
de tipul int.la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Apelul: este porÛiunea afisare(a,b,pas)
pot multiplica documentul numai contra cost din linia 17. El are ca efect transferul
Õi cu acordul scris al autorului. În acest
argumentelor Õi al controlului
scop m| puteÛi contact| la: execu Ûiei programului la funcÛia cu numele afisa re() . Dac|
funcÛia ar fi apelat| prin linia afisare(1,a,pas), primul argument ar fi de tipul int. Conform
celor spuse la 6.3.1, în acest caz se face conversia automat| a lui 1 la tipul doub le , adic| la
ANTAL
1.0 pentru Tiberiu
c| acestAlexandru
parametru nu ar fi de tipul corect.
tel.: 0040-264-530918
Valoarea întoarsa7 : valoarea întoars| de funcÛie este folosit| pentru a decide care dintre
de terminare se afiÕeaz| pe ecran. Dac| terminarea se face cu eroare se revine
e-mail: antaltiberiu@pcnet.ro
mesajele
cu valoarea 0 , afisa re() este falsa7 pentru c| nu Õi-a dus treaba pân| la cap|t Õi se execut|
linia 18 . Altfel, valoarea întoars| este 1 , iar afisa re() este adeva 7 rata7 Õi se execut| linia
20 corespunz|toare lui "afisare nu este falsa 7 ". Este posibil ca valoarea întoars| de funcÛie
s| fie atribuit| unei variabile. Este corect deci scriem c=a fisa re(a ,b,pa s); . Nu este
obligatoriu ca valoarea întoars| s| fie folosit| în funcÛia apelant|. Este corect deci Õi un
apel de forma afis are (a,b,p as); . În acest caz valoarea întoars| se va pierde.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Folosirea prototipului duce la evitarea unor dezastre pentru c| pe baza
Rolul prototipului
Facultatea ConstrucÛii de MaÕini poate face verific|rile de tip necesare la apelul funcÛiei.
lui compilatorul
Catedra de Mecanic| Dac|Õilinia 6 nu se scrie în program, adic| prototipul lipseÕte, la un apel
Programare
de
Cursforma
de limbaj C
afisare(1,a,pas) vor fi probleme serioase întrucât compilatorul presupune c| toÛi
parametri sunt de tipul corect. Primul argument nu se converteÕte automat de la tipul int
la doub le , iar
Copyright Toatec|drepturile
pentru
2001. reprezentarea în RAM Õautorului.
sunt rezervate i m|rimea pentru stocare a celor dou|
tipuri difer| rezultatele obt-inute vor fi dubioase.
Multiplicarea acestui document în scop comercial este interzis|.

6.4 Prototipuri
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Linia int apentru
document fisa re(duzul
ou ble a , dou ble b , dou ble h ); se numeÕte prototipul funcÛiei afisa re() .
personal.
Compilatorul are nevoie de câte un prototip pentru fiecare funcÛie apelat| în program.
Prototipul funcÛiei poart| denumirea tehnic| de declarat- ia de prototip a funct- iei. Acesta
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
conÛine trei tipuri de informaÛii care trebuie cunoscute în funcÛia apelant|: nu m ele
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
funct- iei apelate , tipul întors, numa 7 rul, ordinea s- i tipul tuturor argumentelor funcÛie
scop m| Prezen
apelate. puteÛi contact| la:
Ûa prototipului anunÛ| compilatorul de intenÛia noastr| de a apela funcÛia
afisa re() . InformaÛiile din prototip ajut| compilatorul s| genereze codul corect pentru
ANTAL funcÛie Alexandru
apelul deTiberiu Õi permit efectuarea de verific|ri pe marginea apelului de funcÛie (de
exemplu, se poate verifica dac| a fost transferat num|rul corect de argumente). Dac|
tel.: 0040-264-530918
prototipul este omis, apelul funcÛiei se va realiza folosind convenÛii standard. Lista
e-mail: antaltiberiu@pcnet.ro
parametrilor se foloseÕte pentru verificarea corespondenÛei dintre argumentele funcÛiei
din apel s- i lista parameterilor din definiÛia funcÛiei.

83
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Valoarea întoarsa7 : conform acestor convenÛii, o funcÛie f|r| prototip se
ÎnFacultatea
lipsa ConstrucÛii de MaÕini
presupune c| întoarce o valoare de tipul int. Probleme speciale apar de
Catedra de
prototipului deMecanic| Õi Programare
exemplu la funcÛiile matematice sin (), cos (), tan (), ex p() etc. care întorc
funcÛie
Curs ...
de limbaj C o valoare de tipul doub le . F|r| prototipuri, valorile întoarse sunt
incorecte datorit| trunchierii la 2, la 4, eventual la 8 octeÛi a valorii
Copyright
întoarse. 2001. Toate drepturile sunt rezervate autorului.
Argumentele funct-iei: compilatorul va presupune c| num|rul corect de argumente a fost
transferat
Multiplicarea func Ûiei îndocument
acestui apel Õi cîn | tipurile lor sunt
scop comercial corecte.
este Când am vorbit de rolul
interzis|.
prototipului am dat un exemplu în care num|rul de argumente era corect, dar tipul
primului parametru lanu.
SudenÛii participanÛi Majoritatea
orice compilatoarele
form| de înv|Û|mânt suntbugetar
superior echipatepotcu o opÛiune
multiplica de
acest
avertizare pe nivele.
document pentru uzul personal. Dac | nivelul de avertizare este sc| zut ( low level warning )
compilatorul nu va afiÕa avertismente pentru apelul funcÛiilor f|r| prototip. CreÕterea
acestui nivel va cauza apariÛia unor mesaje de avertisment pentru funcÛiile f|r| prototip.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai
Prototipurile contra
func Ûiilorcost Õi cu acordul
standard scris alde
sunt scrise autorului.
cei careÎnauacest
scris
Prototipurile
scop m| puteÛi contact| la: Õi sunt stocate în fis- iere antet (header files ). Programatorul
bibiloteca
funcÛiilor din
trebuie doar s| foloseasc| directiva #include pentru fiÕierul antet
biblioteca
ANTAL Tiberiu Alexandru
standard
relevant. Numele acestuia este specificat întotdeauna în documentaÛia
tel.: 0040-264-530918 compilatorului.
e-mail: antaltiberiu@pcnet.ro
Sper c| aÛi observat c| prototipul unei funcÛii este prim a linie din
Cum scriem
definit- ia ei urmata 7 de caracterul ;. Astfel, dac| funcÛia s-a definit deja
prototipuri?
este suficient s| copiem aceast| prim| linie din definiÛie. Numele
argumentelor din prototip este ignorat complet de compilator, astfel în
loc de int afisa re(d ou ble a , dou ble b , dou ble h); putem scrie int afisare(double, double,
doub le); . Dac| aceste argumente au totuÕi nume, acestea nu trebuie s| fie identice cu cele
Conf. dr. Ûing.
din defini ANTAL
ia func Ûiei. Apare
Tiberiu Alexandru
întrebarea de ce s| mai includem aceste nume dac| tot sunt
ignorate?
Universitatea Pentru
Tenhic|c| orice
din func Ûie are un rol, numele argumentelor pot furniza informaÛii
Cluj-Napoca
semnificative despre func
Facultatea ConstrucÛii de ÛMaÕini
ionarea ei. De exemplu, în loc de int a fisa re(d ou ble a , dou ble
aÕ fi putut
Catedra de Mecanic| Õi Programare
b, dou ble h ); scrie un prototip de forma int a fisa re(d ou ble in cep ut, d ou ble
sfirs it, dou ble
Curs de limbaj C p as); care ar fi l |murit pe deplin semnificaÛia celor trei argumente.
Pentru c| prototipul Õi prima linie din definiÛia funcÛiei sunt aproape
Copyright
Rolul lui ; în 2001. Toate drepturile sunt rezervate autorului.
identice, de unde va Õti compilatorul care este prototipul Õi care este
prototip
definiÛia? Hot|rârea se ia pe baza caracterului care urmeaz| dup|
Multiplicarea acestui document
paranteza în scop
rotund comercial
| închis |, ") ", îneste interzis|.
felul urma7 tor: caracterul "{"arata7 ca7
este vorba de o definit-ie, iar caracterul ";" de un prototip. Din acest motiv ad|ugarea unui
SudenÛii ; dup| prima
caracter participanÛi lalinie
oriceaform| Ûii conducesuperior
de înv|Û|mânt
unei func fatal|pot
bugetar
la o eroare | mai întâi
multiplica
. Dac acest
se
întâlne
document Õte ;pentru
compilatorul crede c| a fost un prototip. Dup| prototip vine o acolad| "{", adic|
uzul personal.
se începe un bloc, de cine anume va Ûine acest bloc?
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
Exemple de
Exemplele
documentul numai contra |cost
care urmeaz Õi cu| acordul
prezint câteva prototipuri. În limbajul
scris al autorului. C, spre
În acest
deosebire
scop m| puteÛi contact| la:
prototipuri
de limbajul Pascal, nu exist | noÛiunea de procedur | . Cuvântul
cheie void trebuie folosit explicit, ca tip întors de o funcÛie, pentru a
defini un fel de "funcÛie echivalent|" cu o procedur|, adic| una care nu
ANTAL
întoarce Tiberiu Alexandru
o valoare. void folosit în lista argumentelor specific| o funcÛie f|r| argumente.
tel.: 0040-264-530918
Este bine ca la specificarea unui prototip s| se scrie un scurt comentariu care descrie rolul
funcÛiei.antaltiberiu@pcnet.ro
e-mail: Iat| câteva exemple:

/* Citeste un intreg de la tastatura,


nu are argumente,
intoarce o va loare de tipu l int */

84
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
int ci teste _in t(void );
Facultatea ConstrucÛii de MaÕini
Catedra
/* Emitede unMecanic| Õi Programare
semnal sonor - beep,
Curs
nu dearelimbaj C
argumente,
nu intoa rce o valoa re */
void u n_ beep(v oid );
Copyright 2001. Toate drepturile sunt rezervate autorului.
/* Ca lculea za m edia aritm etica a trei nu me re intre gi,
Multiplicarea acestui
trei ar gu m en document
te de tip in t, în scop comercial este interzis|.
intoarce un tip doub le */
doub le m ed ie_ ar(in t, int, int);
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
/* Citeste pentru uzulreal
un numar personal.
de a tastatura,
verificarea argumentelor este dezactivata,
intoarce
SudenÛii un tip intla
participanÛi */orice form| de înv|Û|mântcu plat| sau alte persoane doritoare
cites te_rea l();
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| prototip
Ultimul puteÛi contact|
merit|la:
s| fie discutat. Forma de scriere folosit| produce dezactivarea
verific|rilor la nivelul argumentelor. Ceea ce nu înseamna7 c| nu se transfer| argumente.
ANTAL
În Tiberiu
orice apel funcAlexandru
Ûiei cite ste_rea l() i s-ar putea transfera unul sau mai multe argumente
f|r| ca m|car un mesaj de avertisment s| fie afiÕat.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

6.5 Parametrii funct-iilor


7 funct-iei printr-un apel .
Argum entele sunt nume ale valorilor care se transfera
Parametrii sunt obiectele de intrare pe care funcÛia le primeÕte efectiv Õi le prelucreaz|
în corpul ei. În declaraÛia de prototip între parantezele rotunde este specificat| lista
parametrilor
Conf. dr. ing. func Ûiei. Tiberiu
ANTAL parametrilor care se folosesc în corpul funcÛiei se mai
NumeleAlexandru
numesc Õi valorile transferate func
Universitatea Tenhic| din Cluj-Napoca Ûiei. Numele acestora poate fi acelaÕi sau diferit cu cele
Facultatea ConstrucÛii de MaÕini lista parametrilor exist| cel puÛin un parametru, lista
din declara Ûia de prototip. Dac | în
se poate termina
Catedra cu o virgul
de Mecanic| | urmat| de trei puncte, adic| în ",...". Aceast| notaÛie specific|
Õi Programare
o funcÛie cu num|r variabil de argumente. În apel o astfel de funcÛie trebuie s| aib| cel
Curs de limbaj
puÛin atâtea C
argumente câÛi parametri sunt înaintea virgulei. Ordinea Õi tipul parametrilor
trebuie s| fie la fel cu cele din declaraÛia funcÛiei dac| aceasta exist|. Tipurile
Copyright 2001.
argumentelor, Toate
dup drepturile
| conversii sunt rezervate
aritmetice autorului.
standard, trebuie s| devin| compatibile cu tipul
corespunz|tor al parametrilor.
Multiplicarea acestui document în scop comercial este interzis|.

6.6 Ordinea evalua7 rii argumentelor


SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentruc|uzul personal.
S| presupunem avem urm|toarea linie de cod: printf(" . . . ", sqr(5 .0), cos(7 .9));. Poate
v| pare surprinz|tor, dar ordinea în care cele dou| funcÛii sunt apelate este nedefinit| din
SudenÛiide
punctul vedere al standardului
participanÛi la orice form|ANSI C. Unele compilatoare
de înv|Û|mânt vorpersoane
cu plat| sau alte apela sqr doritoare
() mai întâi,
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest |
iar altele cos () Õi ambele variante sunt corecte. Pentru cazul de mai sus nu este important
ordinea puteÛi|rii.
scop m| evalu la: în care s-ar afiÕa ceva din interiorul fiec|rei funcÛii, rezultatul
În cazul
contact|
întors la fiecare apel ar fi corect, ordinea evalu|rii argumentelor nefiind însa7 definit|.
Totu
ANTAL Õi, înainte
Tiberiu intrarea în funcÛia apelat|, toate argumentele vor fi evaluate incluzând
deAlexandru
aici Õi toate efectele secundare.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
6.7 Transferul prin valoare
C este un limbaj unde în locul fiec|rui argument de transferat unei funcÛii se transfer| o
copie a valorii argumentului. Acest tip de transfer de argumente în care funcÛia primeÕte

85
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
oFacultatea
copie a valorilor originale,
ConstrucÛii protejate astfel contra modific|rilor, poart| denumirea de
de MaÕini
transfer prin valoare . FuncÛia poate modifica valorile parametrilor ei, care fiind copii ale
Catedra de Mecanic| Õi Programare
argumentelor, nu duc la modificarea valorilor argumentelor. Uneori este un avantaj,
Curs
alteorideunlimbaj C
dezavantaj. Pentru c| o funcÛie poate întoarce o singur| valoare, de exemplu în
cazul unei funcÛii cite ste_d oi_ intregi() nu se pot întoarce valorile celor doi întregi folosind
Copyright 2001.
o singur| func Ûie.Toate
Va fi drepturile
necesar s|sunt rezervate
scriem o funcÛautorului.
ie cite ste_intr eg() care va fi apelat| de
dou| ori pentru a citi cei doi întregi. O metod| de eliminare a acestui inconvenient este
variabila externa
Multiplicarea 7 . Înainte
acestui de a trece
document în scoplacomercial
acestea doresc s| menÛionez c| C suport| Õi o
este interzis|.
metod| de tran sfer pr in refe rint-a7 . Aici parametrul nu este o copie a valorii variabilei
transferate, ci a adresei
SudenÛii participanÛi la care
la orice form|este stocat| variabila
de înv|Û|mânt superior în bugetar
RAM. ApotÛi vmultiplica
|zut deja acest
acest
mecanism în ac Ûiune la func
document pentru uzul personal. Ûia sca nf() care este capabil | s | altereze valorile parametrilor.
Totul este îns| legat de operatorul & care urmeaz| s| fie discutat la tipul de dat|
structurat poantor.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
6.8 Variabile externe sau variabile
scop m| puteÛi contact| la:

globale
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Programele C sunt formate din obiecte ex terne. Acestea sunt variabile sau funcÛii.
e-mail: antaltiberiu@pcnet.ro
Denumirea de "externe" se foloseÕte pentru a le diferenÛia de obi ecte le denumite interne.
Acestea sunt argumentele funcÛiilor Õi variabilele declarate în interiorul funcÛiilor - dac|
v| amintiÛi de paragraful despre definiÛia funcÛiilor, în corpul acestora ap|rea o linie de
forma: declarat-ii loca le . Variabilele externe sunt definite în afara funcÛiilor. Din acest
motiv ele nu Ûin de nici o funcÛie, fiind la dispoziÛia tuturor funcÛiilor programului. În
standard aceste variabile sunt descrise ca având legare externa7 pentru c| toate
Conf.
referindr.
Ûeleing. ANTALacestora,
la numele Tiberiu chiar
Alexandru
Õi din func Ûii care au fost compilate separat, identific|
Universitatea
obiectele Tenhic|respective
cu numele (este posibil ca un acelaÕi nume s| identifice obiecte
din Cluj-Napoca
Facultatea Se
distincte). pot definideÕi MaÕini
ConstrucÛii variabile externe care s| fie vizibile numai în fiÕierul surs| în
care au fost definite. Felul în care se realizeaz| definiÛia lor va fi discutat într-un paragraf
Catedra de Mecanic| Õi Programare
Curs|tor,
urm numit C
de limbaj durate de existenÛ|. În limbajul C funcÛiile sunt întotdeauna externe. Spre
deosebire de limbajul Pascal, nu este posibil s| se defineasc| în interiorul unei funcÛii o
alt| funcÛie.2001.
Copyright Pentru c| variabilele
Toate drepturile externe sunt global
sunt rezervate accesibile, adic| pot fi utilizate din
autorului.
întregul program, ele permit implementarea unei strategii de comunicaÛie între funcÛii
care ar trebui s| întoarc| mai mult de o valoare. În exemplul care urmeaz| o astfel de
Multiplicarea
funcÛie este cite acestui document în scop comercial este interzis|.
ste_2 _rea li() . Aceasta stocheaz| datele citite în dou| variabile globale,
deim par tit Õi impartitor , de tipul float.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
1 document
/* EX TER pentru
N.C */ uzul personal.
2 #include<conio.h>
3 #include<stdio.h>
4
SudenÛii participanÛi
#include<float.h>
la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
5 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
6 scop m| puteÛi
/*Prototipu rilecontact| la: din prog ram */
functiilor
7 void cite ste_ 2_ rea li(void );
8 float calcule aza _ci tul(floa t deim pa rtit, float im pa rtitor);
9
ANTAL Tiberiu Alexandru
void a fiseaza _ci tul(floa t cit);
10 tel.: 0040-264-530918
11 e-mail:
c antaltiberiu@pcnet.ro
on st flo at IN F IN IT = F LT _M A X ;
12
13 floa t de im pa rtit, im pa rtito r; /* dou a var iabile extern e - globale */
14
15 /* functia m ain() - punctu l de intrare in p rogram */
16 int main(void)

86
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
17 {
18
Facultatea ConstrucÛii de MaÕini
floa t cit; /* o variab ila locala */
19 Catedra do { Mecanic| Õi Programare
de
20 Curs de limbaj C cite ste_2 _rea li();
21 cit=ca lculeaz a_ citu l(deim pa rtit,im pa rtitor);
22 afis eaza_ citu l(cit);
23
Copyright 2001. Toate drepturile sunt rezervate autorului.
} wh ile (ge tch() != 'i');
24
25 Multiplicarea
return acestui
0; document în scop comercial este interzis|.
26 }
27 /* sfarsitul fun ctiei main () */
28
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
29 document
/* pentru
definitiile uzul personal.
functiilor */
30 void citeste_2 _rea li()
31 {SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
32 prin tf("Ba ga 2 nu m ere, deim pa rtit si im pa rtitor: ");
33
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
sca nf("% f %f",&d eim pa rtit,& im pa rtitor);
34 scop
} m| puteÛi contact| la:
35
36 float
ANTAL calculeaza_citul(float
Tiberiu Alexandru deimpa rtit, float impartitor)
37 {
tel.: 0040-264-530918
38 if (impartitor == 0.0F)
39 e-mail: antaltiberiu@pcnet.ro
retu rn(IN FIN IT);
40 else
41 retu rn(d eim pa rtit/im pa rtitor);
42 }
43
44 void a fiseaza _ci tul(floa t cit)
45 {
46 if (cit
Conf. dr. ing.==ANTAL
INFINIT)Tiberiu Alexandru
47 prin tf("Citu l este n ed efin it\n ");
Universitatea Tenhic| din Cluj-Napoca
48 else
49 Facultatea ConstrucÛii de MaÕini
prin tf("Citu l este % f\n ",cit);
50 }Catedra de Mecanic| Õi Programare
Curs de limbaj C
Rezultate:
Baga 2 numere, deimpartit si impartitor: 1 2
Copyright 2001. Toate drepturile sunt rezervate autorului.
Citul este 0.500000
Baga 2 numere, deimpartit si impartitor: -1 34.57
Multiplicarea acestui document în scop comercial este interzis|.
Citul este -0.028927
Baga 2 numere, deimpartit si impartitor: 1 0
Citul este nedefinit
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Aici s-a introdus i pentru terminare
document pentru uzul personal.
Este bine ca prototipurile funcÛiilor s| se scrie la începutul programului. Începând cu acea
SudenÛii participanÛi
linie de program la|orice
Õi pân form| de lui,
la terminarea înv|Û|mânt
funcÛiile cu
potplat| sau alte
fi apelate prinpersoane
numele doritoare
lor oriunde
potprogram
în Õi pot
multiplica fi f|cute verific
documentul numai|contra pe Õimarginea
cost
ri de tip cu acordul |rui al
fiecscris autorului. În acest
apel.
scop m| puteÛi contact| la:
Limbajul C permite ca variabilele externe Õi funcÛiile s| fie organizate în mai multe fiÕiere
surs
ANTAL | C distincte care se pot compila împreun| sau separat pentru a crea un program
Tiberiu Alexandru
tel.: 0040-264-530918Ûi, unele funcÛii pot fi stocate în biblioteci, caz în care pot fi refolosite
executabil. Dac | dori
în mai multe
e-mail: programe. Problema care se pune este cum se va reorganiza un program
antaltiberiu@pcnet.ro
existent în unul cu mai multe fiÕiere? O modalitate de reorganizare a programului anterior
în 5 fiÕiere surs| C este:

1 /* CIT.H */

87
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
2 #include<float.h>
Facultatea ConstrucÛii de MaÕini
3 Catedra de Mecanic| Õi Programare
4 void cite ste_ 2_ rea li(void );
Curs de limbaj C
5 float calcule aza _ci tul(floa t deim pa rtit, float im pa rtitor);
6 void a fiseaza _ci tul(floa t cit);
Copyright 2001. Toate drepturile sunt rezervate autorului.
7
8 con st flo at IN FIN IT = FL T_ M AX ; /* definitia con stantei IN FIN IT */
9
Multiplicarea acestui document în scop comercial este interzis|.
float deimpartit, impartitor; /* definitiile variab ilelor */
1 /* M AIN .C */
2
SudenÛii participanÛi la orice form|
#include<conio.h>
de înv|Û|mânt superior bugetar pot multiplica acest
3 document pentru uzul personal.
#include "cit.h"
4
5 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
int main(void)
6 pot
{ multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
7 scop m|floa
puteÛi
t cit;contact| la: ila locala */
/* o variab
8 do {
9 ANTAL Tiberiu Alexandru cite ste_2 _rea li();
10 tel.: 0040-264-530918cit=ca lculeaz a_ citu l(deim pa rtit,im pa rtitor);
11 afis eaza_ citu l(cit);
e-mail: antaltiberiu@pcnet.ro
12 } wh ile (ge tch() != 'i');
13
14 return 0;
15 }
1 /* CIT2R EA L.C */
2 #include<stdio.h>
Conf. dr. ing. ANTAL Tiberiu Alexandru
3 ex tern floa t de im pa rtit, im pa rtito r; /*declara tiile variabilelor extern e */
Universitatea Tenhic| din Cluj-Napoca
4
Facultatea ConstrucÛii de MaÕini
5 void citeste_2 _rea li()
6
Catedra
{
de Mecanic| Õi Programare
7
Curs deprin
limbaj C
tf("Ba ga 2 nu m ere, deim pa rtit si im pa rtitor: ");
8 sca nf("% f %f",&d eim pa rtit,& im pa rtitor);
9 Copyright
} 2001. Toate drepturile sunt rezervate autorului.
1 /* CA LCIT .C */
2 Multiplicarea acestui
ex tern con st flo document
at IN FIN în scop comercial
IT; /* declara este
tia constan teiinterzis|.
INFIN IT */
3
4 SudenÛii participanÛi la orice deimpa
float calculeaza_citul(float form| de înv|Û|mânt
rtit, superior bugetar pot multiplica acest
float impartitor)
5 {document pentru uzul personal.
6 if (impartitor == 0.0F)
7 SudenÛii participanÛi la orice
retu rn(IN form| de înv|Û|mânt cu plat| sau alte persoane doritoare
FIN IT);
8 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
else
9 scop m| puteÛiretu rn(d eim
contact| la:pa rtit/im pa rtitor);
10 }
1 /* AF ICIT.C
ANTAL */ Alexandru
Tiberiu
2 #include<stdio.h>
tel.: 0040-264-530918
3 ex tern con
e-mail: st flo at IN FIN IT; /* declara tia constan tei INFIN IT */
antaltiberiu@pcnet.ro
4
5 void a fiseaza _ci tul(floa t cit)
6 {
7 if (cit == INFINIT)

88
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
8 prin tf("Citu
Facultatea ConstrucÛii l este n ed efin it\n ");
de MaÕini
9 else
Catedra de Mecanic| Õi Programare
10
Curs de limbajprinC tf("Citu l este % f\n ",cit);
11 }

Copyright 2001. Toate drepturile sunt rezervate autorului.


Cele 5 fiÕiere surs| sunt: CIT.H , M AIN .C , CIT2REA L.C , CA LC IT.C Õi AFIC IT.C . Cele care
au extensia C pot fi compilate independent unul de cel|lat. FiÕierul CIT.H este antetul în
Multiplicarea
care am stocatacestui
definiÛdocument în scopÕicomercial
iile constantelor esteexterne,
variabilelor interzis|.
împreun| cu prototipurile
funcÛiilor din program. Pentru înÛelegerea criteriilor folosite la reorganizarea programului
SudenÛiicunoscut
trebuie | noÛla
participanÛi oricedeform|
iunea de înv|Û|mânt
vizibilitate superior
a variabilelor C. bugetar pot multiplica acest
document pentru uzul personal.
La începutul cursului am prezentat succint preprocesorul Õi directiva #include . Forma
folosit
SudenÛii| înparticipanÛi
linia 3 din M orice este
laAIN.C form|o variant | specialcu
de înv|Û|mânt | care permite
plat| |rcarea con
încpersoane
sau alte Ûinutului
doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În |acest
fi Õierului CIT.H , din directorul curent în programul surs | C unde acesta apare. L muriri
suplimentare vor fi date
scop m| puteÛi contact| la: în capitolul directivelor de procesare.

6.8.1 Vizibilitatea
ANTAL Tiberiu Alexandru (scope)
tel.: 0040-264-530918
La declararea unei variabile se specific| automat Õi vizibilitatea ei. Aceasta depinde de
e-mail:
locul s-a f|cut declaraÛia variabilei în program Õi deter m ina7 port-iunile de program
antaltiberiu@pcnet.ro
în care
din care acea varia bila 7 poa te fi folosita7 , adic| este vizibil|. Un nume este vizibil, deci
poate fi utilizat numai în porÛiunile de program care fac parte din zona de vizibilitate.
Vizibilitatea unui nume poate fi limitat| pentru a creÕte restricÛiile la nivelul unui fiÕier,
al unei funcÛii, al unui bloc, sau al unui prototip de funcÛie în care acesta figureaz|.
Urm|toarele categorii de vizibilit|Ûi sunt posibile:
- bloc: un bloc este o porÛiune de program cuprins| între acolade { ... }. În C se mai
Conf. dr. ing.Õte
ANTAL Tiberiu Alexandru
nume Õi vizibilita te locala 7 întrucât ea corespunde corpului funcÛiei în care s-a
Universitatea Tenhic|
f|cut declara Ûia.dinO Cluj-Napoca
astfel de variabil| este vizibil| din locul în care s-a f|cut
Facultatea
declaraConstrucÛii
Ûia ei Õi de
pânMaÕini
| la acolada de închidere a blocului "} " în care s-a realizat
Catedra Ûia;
de Mecanic|
declara Õi Programare
limbaj C de funct-ie : au aceeaÕi vizibilitate cu variabilele declarate în interiorul
Curs de- parametri
funcÛiilor s- i astfel corespund vizibilit|Ûii de tipul bloc;
Copyright- prototip de funct
2001. Toate -ie : variabilele
drepturile sunt rezervate în interiorul unui prototip de funcÛie au
declarateautorului.
o vizibilitate special|. Aceasta începe din punctul corespunz|tor declaraÛiei
Multiplicarea acestuiÕdocument
parametrului i Ûine pân|în lascop
paranteza este| interzis|.
rotund
comercial ") " care închide lista parametrilor
funcÛiei;
- fis- ier: variabilele cu aceast| vizibilitate sunt declarate în afara tuturor blocurilor.
SudenÛii participanÛi
Aceste nume lasuntorice form| începând
vizibile, de înv|Û|mânt superior
cu punctul în bugetar potdeclarat,
care s-au multiplica acest
pân| la
document pentru uzul
terminarea personal.
fiÕierului surs| al declaraÛiei.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
6.8.2 Declarat-ia s- i definit-ia
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Vizibilitatea
scop m| puteÛi unei la: externe sau a unei funcÛii este cea de tip fiÕier. Dac| o variabil|
variabile
contact|
extern| este referit| în program înainte de a fi definit| într-un program surs| distinct sau
în cel curent
ANTAL este
Tiberiu obligatorie folosirea cuvântului cheie ex tern . Legat de variabilele
Alexandru
externe, se uziteaz| doi termeni: declaraÛia Õi definiÛia. O declarat-ie este un anunÛ legat
tel.: 0040-264-530918
de propriet|Ûile variabilei - în principal ale tipului acesteia. O definit-ie adaug| anunÛului
e-mail:
anteriorantaltiberiu@pcnet.ro
Õi alocarea spaÛiului în RAM pentru stocarea acelei variabile. Pentru programul
anterior, liniile 8 Õi 9 ale fiÕierului surs| CIT.H sunt definiÛii pentru constanta INF INIT
Õi pentru variabilele deim par tit Õi impa rtitor . Tot aici se face Õi alocarea spaÛiului pentru
stocarea acestor obiecte în RAM. Liniile care conÛin extern const float INFINIT; Õi extern
float de im pa rtit, im pa rtito r; sunt numai declaraÛii ale constantei Õi variabilelor respective

89
Capitolul
Conf. dr.6 ing.
- Funct-ii
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
-Facultatea
stocarea lor în RAM s-a
ConstrucÛii |cut deja ca urmare a definiÛiilor lor. Este obligatoriu s| existe
de fMaÕini
definiÛie
oCatedra a unei variabile externe într-unul din fiÕierele surs| ale programului. Toate
de Mecanic| Õi Programare
celelalte fiÕiere pot conÛine numai declaraÛii externe pentru accesul la aceasta.
Curs de limbaj C
În cazul funcÛiilor, problema este diferit|. DistincÛia între o declaraÛie de variabil| extern|
Copyright
Õi o definiÛ2001.
ie de Toate
variabildrepturile
| extern|sunt rezervate
se face prin autorului.
prezenÛa sau absenÛa cuvântului cheie
extern . La funcÛii, definiÛia este format| din antetul funcÛiei - prima linie a acesteia -
împreun | cu corpul
Multiplicarea acestui DeclaraÛiaîn
ei.document func Ûieicomercial
scop se face prin interzis|.ei. Dup| cum am mai spus
prototipul
este
- vezi 6.6, o declaraÛie extern| este singura variant| posibil| în C pentru funcÛii. Din acest
motiv,
SudenÛiicuvântul cheie
participanÛi extern
la orice estedeop
form| Ûional în superior
înv|Û|mânt declaraÛiabugetar
de prototip. Astfel acest
pot multiplica void
cites te_2_ rea li(void ); Õi
document pentru uzul personal. ex tern void citeste_2 _re ali(void ); sunt acelaÕi lucru.

6.9 Stiva
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Stiva este
scop m| o regiune
puteÛi contact|dinla:RAM gestionat| dup| politica Ultimul Introdus este Primul
Extras (L ast I n F irst O ut sau prescurtat, LIFO ). ImaginaÛi-v| o stiv| de c|rÛi sub forma:
Conceptual,
ANTAL Tiberiu limbajului C este asemenea acestor c|rÛi. Introducerea un ei ca7 rt-i noi
stivaAlexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Figura 4 - O stiv| (de c|rÛi)


Alexandru
Universitatea Tenhic| din Cluj-Napoca
în stiv| se face numai la nivelul c|rÛii celei mai de sus - cea pus| ultima în stiv|, aceasta
Facultatea ConstrucÛii de MaÕini
fiind chiar vârful stivei. Altfel apare pericolul ca înteaga stiv| s| se pr|buÕeasc|.
Catedra de Mecanic|
Extragerea unei ca 7 rt-Õi Programare
i respect| aceeaÕi procedur|: numai cartea cea mai de sus va putea
Curs de limbaj C
fi luat| f|r| s| apar| pericolul pr|buÕirii stivei. Conform celor spuse, unei stive i se poate
ad|uga un articol nou numai la vârful acesteia Õi i se poate extrage un articol numai de la
vârful ei. Daca
Copyright 7 asToate
2001. - ezarea ca7 rt-ilor permite
drepturile sa7 se vada
sunt rezervate 7 autorul s- i titlul accesul la ele este
autorului.
simplu, atâta timp cât introducerea Õi extragerea c|rÛilor se face sub controlul riguros al
procedurilor
Multiplicareaprezentate. De exemplu,
acestui document în scopdac | dorim este
comercial s| extragem
interzis|.cea de a treia carte de la
vârful stivei, se extrag pe rând primele trei c|rÛi, apoi se pun la loc ultimele dou|.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
6.9.1 Stiva s- i limbajul C
document pentru uzul personal.
Limbajul C utilizeaz| o zona
7 de RAM cu politica menÛionat| den um ita7 chiar stiva7
SudenÛii
pentru: participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
- stocareadocumentul numai
valorilor contra
v aria bilelor Õiale
costloc cu acordul scris al
(care sunt autorului.
declarate în În acest
interiorul
scop m|func Ûiilor);
puteÛi contact| la:
- stocare a v alor ilor tra nsfera te prin mecanismul parametrilor funcÛiei apelate;
ANTAL - stocarea adresei de revenire în funcÛia apelant|.
Tiberiu Alexandru
tel.: 0040-264-530918
e-mail:Ûiaantaltiberiu@pcnet.ro
Opera de introducere pe stiv| se numeÕte în englez| push , iar cea de extragere pop .
Când o valoare de variabil| se transfer| ca parametru al unei funcÛii, o copie a valorii
respective se introduce pe stiv|. FuncÛia extrage de pe stiv| aceast| valoare copie pe post
de parametru. Pentru c| funcÛia poate accesa numai valoarea parametrului, spaÛiul folosit
pentru stocarea originalului fiind alocat într-un alt bloc de funcÛie, valoarea original| nu
se poate modifica în corpul funcÛiei. OperaÛia de rezervare a unei porÛiuni din RAM pentru
90
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
stocarea
Facultateaunui obiect sedenume
ConstrucÛii Õte alocare . Dac| funcÛia are declarate variabile locale,
MaÕini
alocarea spa Ûiului pentru acestea
Catedra de Mecanic| Õi Programare se face tot pe stiv|. FuncÛia are responsabilitatea ca la
terminarea ei s| elibereze automat spaÛiul alocat acestor variabile. La revenire în funcÛia
Curs
apelantde|limbaj
, funcÛiaC apelat| are sarcina de a distruge Õi spaÛiul alocat pe stiv| pentru
parametrii ei. Cum Õtie îns| C unde anume s| se revin| în funcÛia apelant|? La apelul
Copyright 2001. Toate
funcÛiei, C trebuie s| reÛdrepturile sunt rezervate
in| unde anume era înainte autorului.
de intrarea în funcÛia apelat|. În acest
scop, el va stoca tot pe stiv| adresa locaÛiei curente care va fi adresa de revenire.
Multiplicarea acestui document în scop comercial este interzis|.
Mecanismul transferului de parametri prin stiv| se poate descrie astfel:
SudenÛiiÎparticipanÛi
funcÛia apelant | introduce
la orice form| de stiv| parametrii
pe înv|Û|mânt în ordinea
superior bugetarlorpot
invers | de apari
multiplica acest Ûie
în lista de parametri
document pentru uzul personal. [pu sh(p ara m etri)] ;
Ï se stocheaz| pe stiv| adresa de revenire în funcÛia apelant|, apoi se apeleaz|
funcÛia;
SudenÛiiÐparticipanÛi la |orice
funcÛia apelat form|
îÕi cite de înv|Û|mânt
Õte parametrii de pecustiv
plat|
|; sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu
Ñ funcÛia apelat| introduce pe stiv| variabilele localeacordul scris
[pual autorului.
sh(v În acest
aria bile loca le)] ;
scop m|ÒputeÛi contact|
la revenire, la:Ûia apelat| extrage variabilele locale [pop (variab ile loca le)] Õi
func
sare înapoi la funcÛia apelant| (pe baza adresei care a fost stocat| pe stiv| la Ï);
ANTAL ÓTiberiu
funcÛia Alexandru
apelant| extrage parametrii de pe stiv| [pop (par am etri)] ;
Ô valoarea întoars| de funcÛia apelat| este tratat| - dac| este cazul.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
6.9.2 Exemplu de lucru cu stiva
1 /* AR IA.C */
2 #include<stdio.h>
3
4 doub le ar ia(d ou ble, d ou ble);
5
Conf. dr. ing. ANTAL Tiberiu Alexandru
6 int main(void)
7 {Universitatea Tenhic| din Cluj-Napoca
8 Facultatea ConstrucÛii
double h,r,a; de MaÕini
9 Catedra de Mecanic| Õi Programare
10
Curs deprin tf("ina ltim ea cilindru lui = ");
limbaj C
11 sca nf("% lf", &h );
12 prin tf("raz a cilin dru lui = ");
13 Copyright 2001.lf",
sca nf("% Toate
&r );drepturile sunt rezervate autorului.
14
15 a=a ria(r,h);
Multiplicarea acestui document în scop comercial este interzis|.
16 prin tf("ari a cilin dru lui e ste: % lg\n ",a);
17
18 SudenÛii participanÛi
return 0; la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
19 }document pentru uzul personal.
20
21 double aria(double raza, double inaltimea)
22 SudenÛii
{ participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
23 pot multiplica
double documentul numai contra cost Õi cu acordul scris al autorului. În acest
pi=3.1415926535;
24 scop m| puteÛi contact| la:
25 return pi*raza*raza*inaltimea;
26 }
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Rezultate:
e-mail:
inaltimeaantaltiberiu@pcnet.ro
cilindrului = 2
raza cilindrului = 3
aria cilindului este: 56.5487

Programul îÕi începe execuÛia cu funcÛia m ain (). Pentru c| r , h Õi a sunt variabile locale,

91
Capitolul
Conf. dr.6 ing.
- Funct-ii
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
se aloc| spaConstrucÛii
Facultatea Ûiul pentru de
acestea
MaÕinipe stiv|. Când se apeleaz| aria() , cu argumentele r Õi h ,
valorile acestor variabile se
Catedra de Mecanic| Õi Programarecopiaz | pe stiv|. Se apeleaz| funcÛia. Argumentul r se afl| pe
poziÛia parametrului raza , iar argumentul h se afl| pe poziÛia parametrului inaltimea . Din
Curs
acest de limbaj
motiv, C îÕi citeÕte valorile parametrilor de pe stiv|, aria() va stoca valoarea lui
când
r în raza Õi cea a lui h în inaltimea . Pentru c| funcÛia are o variabil| local| cu numele pi
Copyright
se aloc| spa 2001.
Ûiul Toate
pe stiv drepturile
| pentru suntea Õrezervate autorului.
i se iniÛializeaz | cu valoarea "3.1415926535". Se
calculeaz| valoarea ariei cu expresia din linia 25 Õi se revine în funcÛia apelant| (m ain ()),
datorit | lui return
Multiplicarea acestui care produce
document terminarea
în scop comercialfuncesteÛiei apelate Õi revenirea din ea.
interzis|.
Compilatoarele au strategii diferite de întoarcere a valorilor la revenirea din funcÛii. Unele
întorc
SudenÛiivaloarea pe stivla|,orice
participanÛi alteleform| deÕtri.
în regi Înainte de
înv|Û|mânt terminarea
superior Ûieimultiplica
funcpot
bugetar apelate, eaacest
este
responsabil | pentru "distrugerea"
document pentru uzul personal. lui pi prin extragerea lui de pe stiv | . La revenirea în
m ain () , cei doi parametri raza Õi inaltimea sunt distruÕi Õi ei. Valoarea întoars| este
salvat| într-un registru, de aici copiindu-se în variabila a . Dup| afiÕarea rezultatului pe
SudenÛii
ecran urmeazparticipanÛi
| returnla0orice form|
. Înainte de de înv|Û|mânt
terminarea cuÛiei
func plat| sau alte persoane doritoare
m ain () se distruge spaÛiul alocat
pot multiplica documentul numai contra cost Õi cu
pe stiv| pentru r , h Õi a . Apoi valoarea "0 " se încarc| într-unacordul scris al autorului. În acesta fi
registru pentru
scop m| puteÛi
transferat contact|de
| sistemului la:operare.

ANTAL Tiberiu Alexandru


6.10 Organizarea memoriei pentru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
programele în execut-ie
Când un program este în curs de execuÛie memoria alocat| lui este divizat| în mai multe
zone de RAM numite Õi segmente:

Segmentul de cod (CODE SEGMENT): aceasta este porÛiunea de RAM în care sunt stocate
Conf.
instrucdr. ing. ANTAL
Ûiunile Tiberiu Alexandru
maÕin| corespunz |toare funcÛiilor din programele C - m ain () de exemplu -
Universitatea
sau cele extraseTenhic| de exemplu printf() . Prin definiÛie, zona segmentului de cod
din Cluj-Napoca
din biblioteci-
este protejat
Facultatea | contra modific
ConstrucÛii |rilor pe timpul execuÛiei programului, altfel ar fi posibil s|
de MaÕini
Catedra de Mecanic| Õi Programare| pe sine.
scriem un program care se modific
Stiva(STACK):
Curs de limbajo C porÛiune de RAM în care sunt stocate toate variabilele locale. ConÛinutul
acestei zone Õi dimensiunea ei se modific| pe timpul execuÛiei programului, depinzând de
CopyrightÕi2001.
apelurile de revenirile din funcÛiile
Toate drepturile care
sunt alc|tuiesc
rezervate programul. În unele limbaje, stiva are
autorului.
o dimensiune maxim| fix| pe timpul execuÛiei unui program. Vor apa7 rea erori ca urmare
a încerc|rii de a extrage articole de pe stiva vid| sau ca urmare a introducerii în stiva plin|
Multiplicarea
(datorit| modului acestui document în scop
de implementare) a unuicomercial este interzis|.
articol pentru care nu mai este loc. Ultimul caz
este mai des întâlnit Õi se numeÕte depa7 s- ire de stiva7 (stack overflow ) având ca efect
SudenÛii participanÛi
suprascrierea unor loca Ûii deform|
la orice memorie de înv|Û|mânt superior
adiacente zonei |, rezultând
bugetar
de stiv pot multiplica c|ror
erori a acest
document este
depanare dificil
pentru |. personal.
uzul
Segmentul de date (DATA SEGMENT): este o zon| de RAM în care se stocheaz| variabilele
globale. Din momentla ce
SudenÛii participanÛi variabilele
orice form| de globale
înv|Û|mântsuntcuîntotdeauna
plat| sau altestocate
persoaneacolo Õi au o
doritoare
dimensiune fix | , spre deosebire de cele locale care se creeaz | Õi
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acestse distrug automat,
dimensiunea
scop m| puteÛi total | a segmentului
contact| la: de date nu se schimb| pe timpul execuÛiei programului.
HEAP-ul: este o zon| de RAM a c|rui dimensiune poate varia în timpul execuÛie
programului. În limbajul C, dimensiunea lui este controlat| prin patru funcÛii de alocare
ANTAL
dinamic|Tiberiu
a memoriei Alexandru
m alloc() , calloc() , rea lloc() Õi free() . Pe heap, porÛiuni de memorie
tel.: 0040-264-530918
denumite blocuri sunt alocate Õi eliberate într-o ordine arbitrar|, iar Õablonul de alocare
e-mail:
împreunantaltiberiu@pcnet.ro
| cu dimensiunea lui vor fi cunoscute numai în timpul execuÛiei programului.
FuncÛiile pentru manipularea heap-ului vor fi discutate într-un capitol urm|tor.

92
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca

6.11 Durata de existent-a7 sau


Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
persistent -a (storage class)
Copyright 2001. Toate drepturile sunt rezervate autorului.
variabilelor
Multiplicarea acestui document în scop comercial este interzis|.
În funcÛie de segmentul în care sunt stocate, avem va riab ile glo ba le , loca le Õi registru .
Despre cele registru nu am discutat pân| acum explicit, îns| dac| v| amitiÛi, în capitolul
SudenÛii participanÛi
operatorilor la orice
am folosit form|
uneori de înv|Û|mânt
exprimarea superior
"valoarea bugetarsepot
expresiei multiplica
stocheaz acest
| într-un
document În
registru". pentru uzulCpersonal.
limbajul exist| cuvinte cheie prin care se poate controla segmentul în care
se aloc| spaÛiul pentru stocarea variabilelor. În majoritatea c|rÛilor de C acest subiect este
tratat subparticipanÛi
SudenÛii denumirealadeorice form|
durate de de -a7 .
înv|Û|mânt
existent cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
6.11.1 Durata de existent-a7 auto
Am
ANTAL c| implicit,
spus Tiberiu spaÛiul pentru stocarea variabilelor locale este alocat pe stiv|. Când
Alexandru
tel.: Û0040-264-530918
func ia este apelat|, variabilele locale sunt stocate pe stiv|. La terminarea funcÛiei, spaÛiul
folosit
e-mail:pentru aceste variabile este eliberat - se mai zice c| stiva este desc|rcat|. Deoarece
antaltiberiu@pcnet.ro
procedurile de alocare Õi eliberare a spaÛiului din RAM pentru aceste variabile decurg
automat, durata lor de existenÛa (modul în care compilatorul aloc| spaÛiul de stocare în
RAM pentru variabile) se întreÛine automat, de unde s- i numele de au to . Folosirea
cuvântului cheie au to este deci inutil| dac|, de exemplu, în ARIA.C modific|m linia 8 de
la doub le h,r,a; la auto double h,r,a; efectul va fi c| aceste variabile vor deveni automate -
cum de altfel erau deja.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| DeÕi compilatorul
din Cluj-Napocaasigur| gestionarea pe stiv| a spaÛiului alocat acestor
IniÛializarea
Facultatea ConstrucÛiivariabile, acestea nu se iniÛializeaz| implicit. Este obligatoriu ca
de MaÕini
variabilelor au to
Catedra de Mecanic| utilizatorul s| fac| explicit iniÛializarea Õi s| Ûin| minte c| valorile stocate
Õi Programare
Curs de limbaj C în aceste variabile se pierd - datorit| desc|rc|rii automate a stivei - la
revenirea din funcÛie. Din acest motiv se mai spune c| între dou| apeluri ale funcÛiei
valorile variabilelor locale se pierd. În realitate nu se poate ca o variabil| s| nu conÛin| o
Copyright 2001. Toate drepturile sunt rezervate autorului.
valoare. Acesta este Õi cazul valabil pentru variabilele au to , dar valoarea pe care o conÛin
nu este previzibil|, adic| nu ne putem baza pe valoarea lor iniÛial|.
Multiplicarea acestui document în scop comercial este interzis|.
Dac| o funcÛie care conÛine foarte multe variabile locale este apelat| de
PerformanÛe
SudenÛii participanÛi multe ori din
la orice diferite
form| porÛiuni ale
de înv|Û|mânt unui program,
superior bugetar potpentru fiecareacest
multiplica apel
document pentru spa Ûiul
uzul variabilelor locale va fi alocat respectiv desc|rcat de pe stiv| la
personal.
terminarea funcÛiei. Aceast| procedur| este consumatoare de timp, iar programul va rula
încet
SudenÛii datorit | strategiei
participanÛi de programare
la orice adoptate. cu
form| de înv|Û|mânt Probabil solu
plat| sau Ûia persoane
alte într-un astfel de caz
doritoare
este ca unele variabile s | fie globale.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
6.11.2 Durata de existent-a7 static
ANTAL Tiberiu Alexandru
Din
tel.: punctul de vedere al segmentului în care se stocheaz|, spaÛiul alocat variabilelor static
0040-264-530918
este segmentul de date. Acesta este segmentul în care sunt stocate Õi variabilele globale.
e-mail: antaltiberiu@pcnet.ro
Dac| o variabil| local| este declarat| static (static|), spaÛiul pentru aceasta nu se mai
aloc| pe stiv|, ci pe segmentul de date.
IniÛializarea Variabilele static sunt init-ializ ate im plicit cu valoarea 0 la începutul
variabilelor static execuÛiei programului. Acestea vor "reÛine" valorile stocate în ele Õi între
93
Capitolul
Conf. dr.6 ing.
- Funct-ii
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
apelurile
Facultateafunc Ûiilor în care
ConstrucÛii s-a f|cut declararea lor întrucât m|rimea segmentului de date
de MaÕini
este fix| pe tot parcursul execuÛiei programului (spaÛiul alocat lor nu se distruge). Un
Catedra de Mecanic| Õi Programare
exemplu cu declararea unei variabile statice este prezentat în continuare:
Curs de limbaj C
1 int test(void)
2 {Copyright 2001. Toate drepturile sunt rezervate autorului.
3 int i; /* variab ila locala auto */
4 sta tic in t Co nto r; /* variab ila statica, Contor este initializata cu 0 */
5
Multiplicarea
. . .
acestui document în scop comercial este interzis|.
6 }
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru Pentru aceste variabile nu exist| faze de creare Õi distrugere care se
uzul personal.
PerformanÛe
reiau în funcÛie de apelurile din program, motiv pentru care programele
cu astfel
SudenÛii participanÛi de form|
la orice variabile ruleaza7 maicu
de înv|Û|mânt rapid decât
plat| celepersoane
sau alte cu variable au to .
doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact|
Vizibilitatea la: cu durata de existenÛ| static au o vizibilitate limitat| la
Variabilele
blocul în care au fost declarate. Dac| este vorba de variabile statice
variabilelor static
externe, acestea nu pot fi accesate din alte fiÕiere surs|, asigurând astfel
ANTAL Tiberiu Alexandru
o modalitate de ascundere a datelor. Din acest motiv putem spune c|
tel.: 0040-264-530918
variabilele statice au o vizibilitate local|. Iata7 un exemplu în acest sens:
e-mail: antaltiberiu@pcnet.ro
1 /* STA TIC.C */
2 #include<stdio.h>
3
4 void f1(v oid );
5 void f2 (void );
6 void f3 (void );
7 Conf. dr. ing. ANTAL Tiberiu Alexandru
8 int i; /* un i glob al */
9
Universitatea Tenhic| din Cluj-Napoca
10 Facultatea ConstrucÛii de MaÕini
int main(void)
11 {Catedra de Mecanic| Õi Programare
12 Curs deint i=3; /*
limbaj C un i local au to */
13
14 prin tf("in m ain () i=%i\ n",i);
15 Copyright
f1(); 2001. Toate drepturile sunt rezervate autorului.
16 f2();
17 f3();
Multiplicarea acestui document în scop comercial este interzis|.
18
19 return 0;
20 SudenÛii
} participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
21 document pentru uzul personal.
22 void f1(void)
23 {
24
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
sta tic in t i=5; /* i local static */
25 pot multiplica documentul
prin tf("in numai contra cost Õi cu acordul scris al autorului. În acest
f1 () i=%i\ n",i);
26 scop
} m| puteÛi contact| la:
27
28 void f2(void)
29
ANTAL
{
Tiberiu Alexandru
30 tel.: 0040-264-530918
sta tic in t i=7; /* alt i local static */
31 e-mail:prin
antaltiberiu@pcnet.ro
tf("in f2 () i=%i\ n",i);
32 }
33
34 void f3(void)
35 {
36 /* aici se afiseaz a valoa re i-ului globa l */

94
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
37 prin tf("in f3 () i=%i\ n",i);
38
Facultatea
}
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
Rezultate:
in main() i=3
in f1() i=5
Copyright 2001. Toate drepturile sunt rezervate autorului.
in f2() i=7
in f3() i=0
Multiplicarea acestui document în scop comercial este interzis|.
Dintre variabilele "i" cele din liniile 8 , 24 , 30 sunt permanente, iar cea din linia 12 este
temporar |. Precum vede
SudenÛii participanÛi Ûi, toate
la orice form|valorile
de înv|Û|mânt
stocate superior bugetarDe
sunt distincte. Õi multiplica
pot acest
numele acestor
documenteste
variabile Õi, ele
acelauzul
pentru sunt permanent separate. De asemenea, valorile celor trei "i" -uri
personal.
sunt Õi inaccesibile între ele.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
În condiÛii obiÕnuite, numele de funcÛii sunt globale Õi vizibile în toate
static documentul numai contra cost Õi cu acordul scris al autorului. În acest
pot multiplica
FuncÛiile
modulele
scop m| puteÛi contact| la: unui program. Dac| o funcÛie este declarat| static , numele ei
va deveni invizibil în afara modulului în care s-a declarat.
ANTAL Tiberiu Alexandru
6.11.3 Durata de existent-a7 register
tel.: 0040-264-530918
e-mail:
O | declarat| ca register anunÛ| compilatorul ca va fi des utilizat| în program. Din
antaltiberiu@pcnet.ro
variabil
acest motiv ar fi bine s| fie stocat| într-un registru al UCP pentru ca programul s| fie cât
mai mic Õi cât mai rapid în rulare. Cuvântul cheie este moÕtenit din C K&R când nu
existau optimizatoare de cod. Acesta este motivul pentru care numeroase posibilit|Ûi de
optimizare au fost incluse ca parte a limbajului. O declaraÛie register este de forma:

void f(register unsigned j, register short s)


Conf.
{ dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic|
regis ter int i; din Cluj-Napoca
register
Facultatea char ch;
ConstrucÛii de MaÕini
. . .
Catedra de Mecanic| Õi Programare
}
Curs de limbaj C
Õi poate fi aplicat| numai variabilelor au to sau parametrilor de funcÛii.
Copyright 2001. Toate drepturile sunt rezervate autorului.
Variabilele register nu sunt iniÛializate implicit, din care cauz|
IniÛializarea
Multiplicarea programatorul
acestui document în este nevoit
scop s| le ini
comercial Ûializeze.
este Numai în acest fel valoarea
interzis|.
variabilelor
lor de plecare va fi previzibil|.
register
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
DeclaraÛia register este luat| în seam| de compilator numai dac| are un
RestricÛii de
registru liber în UCP. Tipurile de date care pot fi stocate într-un
utilizare
SudenÛii participanÛi la orice
registru al form| de înv|Û|mânt
UPC sunt dependente cu plat|
Õi de sau alteacestuia.
tipul persoaneNum
doritoare
|rul de
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului.
regiÕtri ai unui UCP este Õi el dependent de tipul lui. Trebuie s| În acest
menÛm|
scop puteÛi
ionez c| variabilele
contact|
tot aici la: stocate în regiÕtrii UCP nu au adres|, motiv pentru care
nu pot participa în expresii care fac calcule cu aceast| adres| - vezi poantorii.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
6.12 Tipuri de legare
e-mail: antaltiberiu@pcnet.ro
NoÛiunea de legare determin| modalitaÛile de comunicare între funcÛiile unor module
distincte ale unui program prin apel Õi prin intermediul variabilelor externe.

Vizibilitatea poate fi privit| în dou| contexte distincte. Unul lexical , uneori numit Õi
95
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
vizibilia te statica
Facultatea ConstrucÛii7 pentru c| este fixat| s- i la momentul compil|rii corespunde porÛiunilor
de MaÕini
Catedra de Mecanic| Õi Programare obiectului sunt cunoscute. Dup| cum aÛi v|zut, în
de program din care caracteristicile
programul ST ATIC .C , acelaÕi nume de identificator este declarat de mai multe ori având
Curs de|Ûlimbaj
vizibilit C sau aceleaÕi vizibilit|Ûi, reuÕind îns| s| refere corect identificatorul în
i distincte
cauz|. Aceasta pentru c| vizibilitatea lexical| permite ca acelaÕi nume s| fie folosit în
Copyright 2001. Toate
vizibilit|Ûi diferite f|r|drepturile sunt rezervate
nici o interferen Û|, chiarautorului.
dac| vizibilitatea lui este aceeaÕi, cu
condiÛia ca acesta s| fie unic în spaÛiul numelor din care face parte.
Multiplicarea acestui document în scop comercial este interzis|.
Cel|lalt context al vizibilit|Ûii este asociat funcÛiilor Õi variabilelor externe, prin care se
SudenÛii |participanÛi
deruleaz co municat-laia orice
întreform|
m odule
deleînv|Û|mânt
separat com ale programului.
pila te bugetar
superior pot multiplica | trei
Existacest
tipuri de legare: interna
document pentru uzul personal. 7 , externa7 Õ i nespecificata 7 . Dac | declara Ûia unui obiect cu
vizibilitate de tip fis- ier conÛine cuvântul cheie static , atunci identificatorul are legare
interna 7 . În interiorul unui modul, fiecare utilizare a identificatorului cu legare intern|
SudenÛii
reprezintparticipanÛi la orice form|
| un unic identificator de înv|Û|mânt
de obiect cuDac
sau funcÛie. plat| sau alte
| prima persoane
declara Ûie cudoritoare
vizibilitate
pot multiplica documentul numai contra cost Õi
de tip fis- ier a identificatorului nu foloseÕte durata de existent-| static obiectul În
cu acordul scris al autorului. areacest
legare
scop m|7 puteÛi
externa Õi estecontact| la: cu specificarea duratei de existenÛ| extern . Un nume de
echivalent
identificator cu legare extern| specific| aceeaÕi funcÛie sau obiect de tipul dat|, asemenea
oric
ANTAL |rei alte declara
Tiberiu Ûii cu acelaÕi nume Õi cu legare extern|. Cele dou| declaraÛii pot fi în
Alexandru
acela Õi modul sau în module distincte. Dac| obiectul sau funcÛia are durat| de existenÛ|
tel.: 0040-264-530918
fi Õier, atunci
e-mail: devine vizibil în toate modulele programului. Fiecare obiect, indiferent de
antaltiberiu@pcnet.ro
legare, trebuie s| aib| o singur| definiÛie. Obiectele cu legare extern| vor avea o singur|
definiÛie la nivelul tuturor modulelor programului. Obiectele cu legare intern|, fiind
interne fiec|rui modul, trebuie s| aib| câte o definiÛie separat| în fiecare modul.

Dac| la declararea unui identificator vizibilitatea lui este de tip bloc Õi nu include durata
de existenÛ| extern , identificatorul nu are legare Õi este unic în funcÛie.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Urm |torii identificatori
Universitatea Tenhic| dinnuCluj-Napoca
au legare:
Î unConstrucÛii
Facultatea identificator MaÕini diferit de orice altceva decât un obiect sau funcÛie;
de declarat
CatedraÏdeunMecanic|
identificator declarat parametru de funcÛie;
Õi Programare
Ð un identificator
Curs de limbaj C cu vizibilitate bloc pentru un obiect declarat f|r| cuvântul
extern .

Copyright 2001. Toate drepturile sunt rezervate autorului.


Dac| un identificator nu are legare, redeclararea lui la acelaÕi nivel de vizibilitate
genereaz| o eroare de redefinire.
Multiplicarea acestui document în scop comercial este interzis|.

6.12.1
SudenÛii Legarea
participanÛi - i modulele
la orice s
form| de program
de înv|Û|mânt superior - un acest
bugetar pot multiplica
document pentru uzul personal.
exemplu comentat
Cele prezentate
SudenÛii pân|la
participanÛi acum
oricevor fi reluate
form| sistematizat
de înv|Û|mânt pentru
cu plat| a în
sau Ûelege
alte exemplul
persoane care va
doritoare
fi prezentat în continuare, deci am spus c| variabilele extern sunt vizibile la nivel de fiÕier.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Sunt definite în afara oric|rei funcÛii Õi pot fi accesate de majoritatea funcÛiilor. FuncÛiile
scop m| puteÛi contact| la:
pot fi definite numai la nivel extern , deci nu pot fi imbricate. Implicit, toate referinÛele la
variabilele sau funcÛiile extern sunt referinÛe la acelaÕi obiect, deci au legare extern|.
ANTAL
Utilizarea Tiberiu Alexandru
lui static duce la modificarea acestei convenÛii implicite.
tel.: 0040-264-530918
Ûiile de variabile la nivelul extern sunt fie definiÛii de variabile (declarat-ii de
Declaraantaltiberiu@pcnet.ro
e-mail:
definit- ii) , fie referinÛe la variabile definite altundeva (declarat- ii de referent- iere ). O
declaraÛie de variabil| extern| (extern ) care face Õi iniÛializarea variabilei se numeÕte
declaraÛie de definit-ie a variabilei.

96
Capitolul
Conf. dr.6 ing.
- Funct-ii
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Urm |toarele
Facultatea reguli sunt
ConstrucÛii devalabile
MaÕini pentru static :
• variabilele declarate
Catedra de Mecanic| Õi Programareîn afara tuturor blocurilor f|r| cuvântul rezervat static îÕi
p|streaz| valorile în tot programul. Pentru a restrânge accesul acestora la unele
Curs demodule
limbaj deC programe particulare se foloseÕte static, ceea ce le va conferi “legare
interna7 ”. Pentru a le face globale, se omite specificarea tipului de durat| de
Copyright 2001.
existen Toate
Û| sau se drepturile sunt
specific| cel rezervate
extern, autorului.
caz în care legarea va fi externa7 ;
• o variabil| extern| se poate defini o singur| dat| într-un program. Se poate defini
o alt| variabil
Multiplicarea acestui|document
cu acelaÕiîn scopÕcomercial
nume i durata de existen
este Û| static într-un alt modul de
interzis|.
program. Din moment ce definiÛiile static sunt vizibile numai în modulul în care
SudenÛiis-au f|cut, nu lavor
participanÛi exista
orice form|conflicte. Aceastasuperior
de înv|Û|mânt este o metod
bugetar | util
pot| multiplica
de ascundere
acesta
numelor de identificatori
document pentru uzul personal. care se partajeaz | între func Ûii ale unui singur modul de
program Õi nu sunt vizibile pentru alte module;
• static poate fi utilizat Õi în cazul numelor de funcÛii, caz în care numele funcÛiei este
SudenÛiif|participanÛi la afara
cut invizibil în orice form| de înv|Û|mânt
modulului de program cuînplat|
caresau altedeclarat.
a fost persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop |m|
Urm puteÛireguli
toarele contact|
suntla:
valabile pentru extern :
• specificatorul de durat| de existenÛ| extern declar| o referinÛ| la o variabil|
ANTAL definit | într-un
Tiberiu alt loc. Se poate folosi o declaraÛie extern pentru a face o definiÛie
Alexandru
dintr-un alt modul vizibil sau pentru a face vizibil| o variabil| înainte de definirea
tel.: 0040-264-530918
e-mail:ei în cadrul aceluiaÕi modul;
antaltiberiu@pcnet.ro
• pentru ca o referinÛ| extern| s| fie valid|, variabila la care se face referinÛ| trebuie
s| fie definit| numai o singur| dat|, la nivel extern. Aceast| definiÛie poate fi în
oricare din modulele programului.

1 /*****************************************************
2 * *
3 Conf.
* dr.Fisierul
ing. ANTAL
sursaTiberiu
C (modu Alexandru
lul) 1.c *
4 Universitatea
* Tenhic| din Cluj-Napoca *
5 Facultatea ConstrucÛii de MaÕini
*******************************************************/
6 Catedra de Mecanic| Õi Programare
7 Curs de limbaj C
#include<stdio.h>
8 ex tern in t i; /* declara tie de referen tiere a lui i, definit ma i jos */
9 Copyright 2001. Toate drepturile sunt rezervate autorului.
10 void urm ato r(void ); /* prototipul fun ctiei urm ator() */
11 void alta (void);
Multiplicarea /* prototipul
acestui document fun ctieicomercial
în scop alta() dineste
fisieru l sursa 2.c */
interzis|.
12
13 m ain () participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
SudenÛii
14 {
document pentru uzul personal.
15 i++;
16 printf("% d\ n",i); /* i este eg al cu 4*/
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
17 urm ator ();
18
pot
}
multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
19
scop m| puteÛi contact| la:
20 int i =3; /*definitia lui i sau declara tia de defin itie a lui i */
21 ANTAL Tiberiu Alexandru
22 tel.: 0040-264-530918
void urmator(void)
23 e-mail:
{ antaltiberiu@pcnet.ro
24 i++;
25 printf("% d\ n",i); /* i este 5 */
26 alta ();
27 }

97
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
1 /******************************************************
Catedra de Mecanic| Õi Programare
2 * *
Curs de limbaj C
3 * Fisierul sursa C (modu lul) 2.c *
4 * *
5 Copyright 2001. Toate drepturile sunt rezervate autorului.
********************************************************/
6
7 Multiplicarea acestui document în scop comercial este interzis|.
#include <stdio.h>
8 ex tern in t i; /* declara tie de referen tiere la i din fisierul 1.c */
9 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
10 document
void pentru uzul personal.
alta(void)
11 {
12 i++;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
13 printf("%
pot multiplica d\ n",i); /* inumai
documentul este 6contra
*/ cost Õi cu acordul scris al autorului. În acest
14 scop m| puteÛi contact| la:
15 }

ANTAL Tiberiu Alexandru


În
tel.:exemplul de mai sus, sunt prezentate dou| fiÕiere surs| (sau module de program) C,
0040-264-530918
1.c Õi 2.c . Pentru crearea unui program executabil se va folosi un proiect, atât în Borland
e-mail: antaltiberiu@pcnet.ro
C cât Õi în Microsoft C, care va conÛine cele dou| nume de fiÕiere. Cele dou| fiÕiere surs|
conÛin în total 3 declaraÛii externe ale lui i . Numai una dintre ele este o declaraÛie de
definiÛie Õi anume int i=3; (linia 20 din 1.c ) care defineÕte variabila global| i Õi o
iniÛializeaz| cu valoarea 3 . DeclaraÛia de referenÛiere la începutul lui 1.c (linia 8) face
variabila global| vizibil| înainte de apariÛia definiÛiei ei în fiÕier. DeclaraÛia de referenÛiere
din linia 8 a modulului 2.c face variabila vizibil| în modulul 2.c . Dac| nu se specific| o
Conf. Ûdr.
defini ie pentru variabila
ing. ANTAL i într-unul
Tiberiu dintre modulele de program, compilatorul presupune
Alexandru
| este o declara
cUniversitatea Ûie de referen Ûiere
Tenhic| din Cluj-Napoca ex tern int i Õi c| o declaraÛie de defini Ûie de forma int
i = 0 apare undeva într-un alt modul al programului.
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Toate cele 3 funcÛii, m ain (), u rm ator() Õi alta (), execut| aceeaÕi operaÛie: incrementeaz|
Curs de limbaj
valoarea C o afiÕeaz| pe ecran. Valorile afiÕate sunt 4 , 5 , Õi 6 .
lui i , apoi
Copyright 2001. Toate drepturile sunt rezervate autorului.
6.12.2 Legarea s- i duratele de existent-a7 ale
Multiplicarea acestui document în scop comercial este interzis|.
variabilelor
Fie programul:
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
1 /* LEG DU RE X.C */
2 #include<stdio.h>
3 SudenÛii
int i=1; participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
4 void a lta(vo id);documentul numai contra cost Õi cu acordul scris al autorului. În acest
pot multiplica
5
scop m| puteÛi contact| la:
6 int m ain ()
7 {
8 ANTAL
extern Tiberiu
int i;/* Alexandru
Referin ta la i-ul din linia 3*/
9 static in t a; /* Valoa rea initiala e 0 si vizib ila num ai in m ain() */
tel.: 0040-264-530918
10 reg iste r in t b = 0 ; /* b va fi stocta intr-u n registru */
e-mail: antaltiberiu@pcnet.ro
11 int c = 0;/* c are im plicit durata d e existenta auto */
12 prin tf("%d \n %d \n %d \n %d \n ",i,a,b,c);
13 /* Valorile afisa te sunt 1, 0, 0, 0 */
14 alta();
15 return 0;

98
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
16 }
17
Facultatea ConstrucÛii de MaÕini
18 Catedra de Mecanic| Õi Programare
void alta(void)
19 {Curs de limbaj C
20 static in t *ex t_i=& i; /* ext_i e glob ala si atribu ita unu i poantor */
21 int i= 16; /* i este redefinit si i-ul global nu ma i este vizibil */
22
Copyright 2001. Toate drepturile sunt rezervate autorului.
static in t a=2; /* acest a este v izibil num ai în fun ctia alta() */
23 a+=2;
24 Multiplicarea
prin tf("%d \nacestui document
%d \n %d în t_i);
\n ", i,a,*ex scop comercial este interzis|.
25 /* Valorile afisa te sunt 16, 4 si 1*/
26 }
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru
În exemplul de maiuzul
sus,personal.
variabila i este definit| la nivel extern cu valoarea iniÛial| 1 (linia
3 ). O declaraÛie extern este folosit| în funcÛia m ain (), pentru a declara o referinÛ| la
SudenÛii participanÛi
variabila la orice form|
extern| i . Variabila de|înv|Û|mânt
a static cu plat|
este iniÛializat sau alte
| automat cu persoane
valoarea 0doritoare
pentru c|
pot multiplica documentul numai contra cost Õi
valoarea de iniÛializare este omis|. FuncÛia printf() va afiÕa valorile 1 , 0 , 0 Õi 0 pe coloan
cu acordul scris al autorului. În acest |.
scop m| puteÛi contact| la:
NoÛiunea de poantor (pointer în englez|) nu a fost înc| discutat|. Pentru moment este
suficient
ANTAL Tiberius| ÕtiÛi cAlexandru
| un poantor stocheaz| adresa unei variabile. În funcÛia alta (), adresa
variabilei globale
tel.: 0040-264-530918 i se foloseÕte pentru a iniÛializa poantorul static extern_i. Metoda de
ini Ûializare func Ûioneaz
e-mail: antaltiberiu@pcnet.ro | pentru c| variabila global| are o durat| de existenÛ| de tipul
static , în sensul c| adresa din RAM la care este stocat| nu se schimb| pe timpul execuÛiei
programului pentru c| variabila se aloc| în segmentul de date . În continuare, variabila
i se redefineÕte ca variabil| local| cu valoarea iniÛial| de 16 (linia 20 ). Aceast| redefinire
nu afecteaz| valoarea stocat| în i extern, aceasta fiind ascuns|, prin folosirea aceluiaÕi
nume pentru o variabil| local|. Valoarea global| este acum accesibil| indirect prin
poantorul extern_i . Încercarea de a da adresa variabilei auto i unui poantor nu merge
pentru
Conf. dr. c|ing.
adresa
ANTALva fi diferit
Tiberiu | la fiecare intrare în bloc. Variabila a este declarat| static
Alexandru
ÕUniversitatea
i iniÛializat| cu valoarea 2 ( linia
Tenhic| din Cluj-Napoca 22 ). Acest a nu intr| în conflict cu a -ul din m ain () din
moment ce variabilele static
Facultatea ConstrucÛii de MaÕini sunt vizibile la nivel intern, adic| numai în interiorul blocului
în care au fost declarate.
Catedra de Mecanic| Õi Programare
Curs de limbaj C
Variabila a este m|rit| cu 2 , rezultând valoarea 4 . Dac| funcÛia alta (), ar fi apelat| din nou
în acelaÕi program, valoarea iniÛial| pentru a ar fi 4 din moment ce variabilele static îÕi
Copyright 2001. Toate
p|streaz| valorile drepturile
pe timpul suntprogramul
în care rezervate autorului.
iese Õi reintr| în blocul în care au fost
declarate.
Multiplicarea acestui document în scop comercial este interzis|.

6.13 Recursivitatea
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
Limbajul Cpentru
permite uzul personal.
utilizarea recursivit|Ûii. O funct-ie care se apeleaza7 pe ea însa7 s- i se
n um es- te recu rsiva 7 . Dac| apelul nu se face direct din corpul funcÛiei, ci indirect , prin una
sau mai multe
SudenÛii funcÛii,laatunci
participanÛi orice grupul
form| deacestor funcÛii cu
înv|Û|mânt se plat| Õte "mutual
numesau recursiv".
alte persoane Dac| o
doritoare
astfel de func Ûie se va apela pe sine în mod neîntrerupt, programul nu
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest se va termina
scop m||puteÛi
niciodat . Pentru evitarea
contact| la: acestei situaÛii, funcÛia realizeaz| un test bazat pe parametrii
ei în care verific| un caz iniÛial - o condiÛie din care poate reveni cu o valoare f|r| a se
apela
ANTAL pe Tiberiu
sine. Alexandru
tel.: 0040-264-530918
Exemplul clasic de funcÛie recursiv| este factorialul:
e-mail: antaltiberiu@pcnet.ro
0!=1
n!=n *(n-1)!

sau, ca s| ne apropiem puÛin de scrierea în limbajul C:


99
Capitolul
Conf. dr.6 ing. -ii
- Funct
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
sau
Curs de limbaj C

Programul C corespunz
Copyright 2001. |tor este: sunt rezervate autorului.
Toate drepturile
1 /* FA CTO RIA .C */
2
Multiplicarea acestui
#include<stdio.h>
document în scop comercial este interzis|.
3
4 SudenÛii
un sign edparticipanÛi la orice
long facto rial(u form|
nsign de înv|Û|mânt
ed int); superior bugetar pot multiplica acest
5 document pentru uzul personal.
6 int main(void)
7 {
8 SudenÛii participanÛi
unsigned la
int n; orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
9 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
10 scop m|prin tf("ncontact|
puteÛi = "); la:
11 sca nf("% u", & n);
12 prin tf("fac toria l(%u ) = %lu \n ", n ,fa ctoria l(n));
13 ANTAL Tiberiu Alexandru
14 tel.: 0040-264-530918
return 0;
15 }e-mail: antaltiberiu@pcnet.ro
16
17 unsigned long factorial(unsigned int n)
18 {
19 if (n == 0) retu rn 1L; /* aici e m ai sana tos sa scriem n <=0 */
20 else retu rn n *fac toria l(n-1);
21 }

Conf. dr. ing. ANTAL Tiberiu Alexandru


Rezultat:
Universitatea
n = 7 Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii
factorial(7) = 5040 de MaÕini
Catedra de Mecanic| Õi Programare
Curs Ûde
Func limbaj Cl() are un singur parametru, pe n , care se va stoca pe stiv|. La fiecare
ia factoria
apel recursiv pe stiv| se va stoca noua valoare a lui n independent de cea anterioar|.
Ini Ûial n ia valoarea
Copyright 2001. Toate7 , o copie a lui n se stocheaz| pe stiv|, apoi la primul apel recursiv al
drepturile sunt rezervate autorului.
lui factoria l() argumentul va lua valoarea 6 , o copie a valorii noului argument - valoarea
6 - se va stoca din nou pe stiv| Õi procedura de apel recursiv va continua pân| ce
Multiplicarea
argumentul iaacestui
valoarea document
0 - liniaîn19
scop comercial
. Pentru acesteste
cazinterzis|.
aplelul recursiv nu se reia, ci se
revine din funcÛie cu valoarea numeric| 1 . Terminarea apelului recursiv determina7
SudenÛii
revenireaparticipanÛi
în linia 20 la orice
unde se form|
poate de înv|Û|mânt
calcula valoareasuperior bugetar =pot
lui factorial(1) multiplica acest
1*factorial(0)=1*1=1.
Apoi se revine
document pentru- din
uzulcauza lui return - cu o nou| valoare, cea a lui factoria l(1) în aceeaÕi
personal.
linie Õi se calculeaz| factorial(2) = 2*factorial(1)=2*1=2 . În final, dup| ce se execut| toate
revenirile, se obÛine valoarea
SudenÛii participanÛi lui factorial(7)
la orice form| = 7*factorial(6)=7*6*5*4*3*2*1=5040
de înv|Û|mânt .
cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Recursivitatea este o metoda
scop m|ÕiputeÛi contact| la: 7 de a curp ind e infin itul în fin it.
Avantaje
Programele recursive vor fi din acest motiv compacte. Din cauza c|
dezavantaje ale
utilizeaz| masiv lucrul cu stiva acestea vor rula încet Õi pot duce la
recursivit|Ûii
ANTAL Tiberiu Alexandru
apariÛia erorii numite "dep|Õire de stiv|". Recursivitatea este
tel.: 0040-264-530918 convenabil| pentru prelucrarea unor structuri de date recursive cum
e-mail:
sunt de antaltiberiu@pcnet.ro
exemplu listele sau arborii.

În limbajele imperative (C, Pascal, BASIC, FORTRAN) - unde


Evitarea
programatorul descrie explicit secvenÛele de paÕi ce trebuie urmaÛi
recursivit|Ûii
pentru a obÛine rezultatul - iteraÛia este de preferat în locul

100
Capitolul
Conf. dr.6 ing.
- Funct -ii
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea|ÛConstrucÛii
recursivit ii, cel puÛin de motive de vitez|. Se numeÕte iteraÛie repetarea unei secvenÛe
dinMaÕini
de instruc Ûiuni. Itera Ûiile
Catedra de Mecanic| Õi Programaresunt caracterizate printr-o mulÛime de condiÛii iniÛiale, un pas de
iteraÛie Õi o condiÛie de terminare. Implementat| iterativ, funcÛia factoria l() este:
Curs de limbaj C
1 unsigned long factorial(unsigned int n)
2 {Copyright 2001. Toate drepturile sunt rezervate autorului.
3 un sign ed lon g p,i;
4 Multiplicarea acestui document în scop comercial este interzis|.
5 for (p=1L,i=2L;i<=n;i++)
p*=i;
6 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
7
document pentru uzul personal.
8 return p;
9 }
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
Ciclul for grupeaz | condiÛiile
documentul iniÛiale
numai contra cost Õi cu, acordul
în p=1L,i=2L pasul descris alÛie
itera în i++ Õi condi
autorului. Ûia de
În acest
terminare în i<=n
scop m| puteÛi .
contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

101
Capitolul
Conf. dr.7 ing.
- Preprocesarea
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

7 Preprocesarea
Multiplicarea acestui document în scop comercial este interzis|.

P
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
rogramul
document pentrupreprocesor
uzul personal.este apelat de compilator pentru realizarea prelucr|rilor de
macrosubstituÛie, compilare condiÛionat| Õi includerea de fiÕiere, înainte de
compilarea programului
SudenÛii participanÛi | C. de înv|Û|mânt cu plat| sau alte persoane doritoare
sursform|
la orice
pot multiplica
Conform celordocumentul
spuse, fazanumai
de compilare esteÕi precedat
contra cost cu acordul scris
| de ceaalnumit
autorului. În acest .
| preprocesare
scop m| puteÛi
Comunica Ûia cucontact| la: preprocesor se deruleaz| prin instruc Ûini sau directive de
programul
preprocesare . Acestea încep cu semnul diez, "#". Sintaxa acestor linii este independent |
ANTAL
de restulTiberiu de programare. Liniile pot s| apar| oriunde în textul surs|, efectul
Alexandru
limbajului
tel.:poate
lor fi local sau global.
0040-264-530918
e-mail: antaltiberiu@pcnet.ro
NOTA: Nu se pune punct s- i virgula 7 (;), în mod “mecanic”, dupa7 o
directiva 7 pentru ca7 aceasta nu este o instruct-iune a limbajului C.
Programul preprocesor are rolul de a elimina comentariile din programul surs| Õi de a
efectua numeroase substituÛii de texte în acesta pe baza directivelor de preprocesare.
Rezultatul
Conf. dr. ing. acÛANTAL
iunilor de mai sus
Tiberiu este un nou program surs|, invizibil de obicei pentru
Alexandru
utilizator s- i care va fi transferat programului compilator. De regul|, directivele sunt
Universitatea Tenhic|
plasate în primele liniidin
ale Cluj-Napoca
programului surs|. Ele pot fi scrise începând cu oricare linie,
Facultatea ConstrucÛii
dar din motive de consisten de MaÕini
Û|, se prefer| scrierea lor la începutul programului din prima
Catedra de Mecanic| Õi Programare
coloan| a textului surs|. Directivele de preprocesare cauzeaz | modificarea programului
surs|,deîns
Curs | aceste
limbaj C modific|ri dureaz| numai atâta timp cât Ûine faza de compilare a
programului surs|. Preprocesarea se deruleaz | în mai multe faze succesive, dar distincte
logic, care 2001.
Copyright depind de implementarea
Toate drepturile sunt programului preprocesor. În continuare prezint
rezervate autorului.
câteva din fazele preproces|rii, împreun| cu preluc|rile caracteristice fazelor.
Multiplicarea acestui document în scop comercial este interzis|.
Liniile de program surs| care se termin| în caracterul backslash "\" Õi
Lipirea liniilor
sunt urmate de trecere la o linie nou| (caracterul newline ), care se
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
obÛine prin ap|sarea tastei <Enter> în textul surs| C, se îmbin|
document pentru
pentru a forma uzul personal.
o singur | linie a programului surs|.
SudenÛii participanÛi la orice
Directiva form| permite
#define de înv|Û|mânt cu de
definirea plat| sau alte persoane
macrocomenzi pentrudoritoare
înlocuirea
Directiva #define
pot multiplica unui Õir de
documentul caractere
numai unÕialtul.
contracucost Se folose
cu acordul Õtealpentru
scris definirea
autorului. unor
În acest
la: numerice în vederea creÕterii lizibilit|Ûii programului.
constante
scop m| puteÛi contact|

#define PI 3.151592653
ANTAL Tiberiu Alexandru
#define TIP_CERC 0
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Form a 7: #d efine IDE NT IFICA TO R1 s- ir2

unde IDENTIFICATOR1 este un cuvânt f|r| spaÛii. s- ir2 este separat de IDENTIFICATOR1
prin cel puÛin un spaÛiu Õi poate fi orice caracter, cuvânt sau propoziÛie; de asemenea,

102
Capitolul
Conf. dr.7 ing.
- Preprocesarea
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
poate conÛine
Facultatea orice num
ConstrucÛii de|rMaÕini
de spaÛii. Directiva #define are ca efect înlocuirea tuturor
apariÛiilor lui IDENTIFICATOR1 din cadrul modulului curent cu s- ir2 începând cu linia
Catedra de Mecanic| Õi Programare
urm|toare directivei. Exist| Õi o form| mai "savant|" a lui #define , îns| pe aceasta am s-o
Curs deprin
prezint limbaj C
intermediul exemplelor.

1 Copyright 2001.
/* DE FIN E1.C */Toate drepturile sunt rezervate autorului.
2 #include <stdio.h>
3 Multiplicarea acestui document în scop comercial este interzis|.
4 #define INCEP UT 5 /* Valoa rea de incepu t a ciclului */
5 #define SFAR SIT 10 /* Valoa rea de sfarsit a ciclului */
6 SudenÛii
#d efin e participanÛi la orice form|)) de
M AX (A,B ) ((A)>(B)?(A):(B /* înv|Û|mânt superior
ma cro definitia bugetar
lui M AX */pot multiplica acest
7 #d efin e M IN (A,B ) ((A)>(B)?(B):(A
document pentru uzul personal. )) /* ma cro definitia lui M IN */
8
9 int main(void)
10
SudenÛii
{
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
11 pot int
multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
i, min, max;
12 int comp = 7;
scop m| puteÛi contact| la:
13
14 for (i = IN CE PU T ; i <= S FA RS IT ; i++)
15
ANTAL{
Tiberiu Alexandru
16 tel.: 0040-264-530918
m ax = M AX (i, com p);
17 e-mail:mantaltiberiu@pcnet.ro
in = M IN (i, com p);
18 prin tf("i=% 2i, com p=% 2i, m ax este %2i si m in e ste % 2i\n ",i,com p,m ax ,\ m in);
19 }
20
21 return 0;
22 }

Rezultate:
Conf. dr. ing. ANTAL Tiberiu Alexandru
i= 5, comp= 7, max este 7 si min est e 5
Universitatea Tenhic| din Cluj-Napoca
i= 6, comp= 7, max este 7 si min est e 6
Facultatea ConstrucÛii
i= 7, comp= 7, max este de MaÕini
7 si min est e 7
Catedra de Mecanic| Õi Programare
i= 8, comp= 7, max este 8 si min est e 7
i= 9, comp= 7,
Curs de limbaj C max este 9 si min est e 7
i=10, comp = 7, max est e 10 si min e ste 7

Copyright
În exemplul2001. Toate
anterior amdrepturile
folosit nosunt
Ûiunea rezervate
de macro.autorului.
O macrodefiniÛie sau, mai pe scurt, un
ma cro este o form| special| de #define capabil cel put-in în aparent-a 7 s| realizeze o decizie
logic| sau s| implementeze
Multiplicarea acestui document Ûie matematic
în scop
o func comercial| este
sub interzis|.
un nume unic. La definirea unui
macro este necesar s| nu existe spaÛii între numele lui Õi paranteza deschis| dup| care se
SudenÛii| participanÛi
specific parametrii.laVoi folosi
orice linia
form| 6 din programul
de înv|Û|mânt superiordebugetar
mai sus potpentru a explica
multiplica acest
“func Ûionarea” unui macro.
document pentru uzul personal. În orice loc din textul surs | în care preprocesorul g | ses- te
cuvântul MAX urmat de un grup de paranteze, va aÕtepta specificarea a doi parametri
care
SudenÛii fi substituiÛilaconform
vor participanÛi specifica
orice form| Ûiilor din acu
de înv|Û|mânt doua parte
plat| a macrodefini
sau alte Ûiei. Astfel,
persoane doritoare
primul parametru va substitui fiecare A din a doua parte a macrodefiniÛiei, iar al doilea
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
parametru va substitui fiecare apariÛie a lui B în cea de a doua parte din macrodefiniÛie.
scop
Cândm| se puteÛi
ajungecontact|
la linia la:
16 , fiecare A se va substitui cu i , iar fiecare B cu com p . Astfel,
linia 16 care va fi transferat| compilatorului este:
ANTAL Tiberiu Alexandru
tel.:
m ax0040-264-530918
= ((i) > (com p)?(i):(com p))
e-mail: antaltiberiu@pcnet.ro
NOTA: Comentariile împreuna 7 cu s- irurile de caractere ra7 mân
întotdeauna neafectate de substitut-iile cauzate de macrodefinit-ii.

S| trecem în continuare la un exemplu de macro care va da chix elegant.


103
Capitolul
Conf. dr.7 ing.
- Preprocesarea
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
1 /* DE FIN E2.C */
2
Facultatea ConstrucÛii de MaÕini
#include <stdio.h>
3 Catedra de Mecanic|A*A
#define GRESIT(A) Õi Programare
/* M acro gresit pen tru patra t
*/
4 Curs
#d dee limbaj
efin P AT RA CT(A ) (A)*(A ) /* M acro O k pen tru patra t */
5 #d efin e A DU N A_ CH IX (A) (A )+(A) /* Asa adu nare a nu va m erge ...*/
#d efin e A DU N A_ OK (A) ((A)+(A)) /* Asa da ...
6
7
Copyright 2001. Toate drepturile sunt rezervate autorului. */
#define START 1
8 #define STOP 3
9 Multiplicarea acestui document în scop comercial este interzis|.
10 int main(void)
11 {
12
SudenÛii participanÛi
la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int i, val_ct=3;
13 document pentru uzul personal.
14 for (i = S TA RT ; i <= ST OP ; i++)
15 {
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
16 prin tf("Pa tratu l lui % 2i es te %2i\n ",i+va l_ct, P AT RA T(i+v al_ ct));
17
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
prin tf("\tP atra tul g resit a lu i %2 i este %3i\n ",i+va l_ct, G RE SIT (i+va l_ct));
18 scop} m| puteÛi contact| la:
19
20 ANTALprin tf("\n Ac um
Tiberiu testa m m acr o-u l de a du na re\ n");
Alexandru
21 for (i = S TA RT ; i <= ST OP ; i++)
tel.:{ 0040-264-530918
22
23 e-mail:prin
antaltiberiu@pcnet.ro
tf("M acro de a du na re gre sit = %2i\
24 , si acum cel O k = % 2i\n ",5*A DU N A_ CH IX(i), 5*AD UN A_ OK (i));
25 }
26
27 return 0;
28 }

Rezultate:
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea
Patratul lui Tenhic|
4 estedin
16Cluj-Napoca
Patratul gresit a lui 4 este 7
Facultatea ConstrucÛii de MaÕini
Patratul lui 5 este 25
Catedra de Mecanic|
Patratul Õi Programare
gresit a lui 5 este 11
Curs de limbaj
Patratul lui C6 este 36
Patratul gresit a lui 6 este 15
Copyright 2001. Toate drepturile sunt rezervate autorului.
Acum testam macro-ul de adunare
Macro de adunare gresit = 6, si acum cel Ok = 10
Multiplicarea acestui
Macro de adunare document
gresit în scop
= 12, comercial
si acum cel Okeste= interzis|.
20
Macro de adunare gresit = 18, si acum cel Ok = 30
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Avem
documentdou|pentru
macrodefini Ûii greÕite în liniile 3 Õi 5 . Pentru cel din linia 3, în linia 17 , când
uzul personal.
i ia valoarea 1 , iar val_ct , 5 , se calculeaz| suma lor prin i+val_ct , adic| 1+5=6 . Pentru
cazul macrodefinit-iei PATRAT , valorile se grupeaz| astfel: (1+5)*(1+5)=6*6=36 . În varianta
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
GRESIT avem 1+5*1+5=11 . Deci, parantezele rotunde sunt necesare pentru gruparea
pot multiplica
corect documentul
| a parametrilor, darnumai contra
conteaz | câtecost Õi cu
sunt Õi acordul
unde le scris
punem.al autorului. În acest
Pentru linia 5, Õi ea
greÕit|, am folosit “stilul” de paranteze care d| rezultatele corecte la produs, îns| la
scop m| puteÛi contact| la:
adunare nu se poate lucra la fel. Pentru 5*AD UN A_ CH IX(i) cu i=1 , obÛinem 5*1+1=5+1=6 .
Ceea
ANTAL ce Tiberiu s| obÛinem este 5*(1+1)=5*2=10, care este r|spunsul corect obÛinut cu
doream Alexandru
ADUNA_OK ca
tel.: 0040-264-530918urmare a parantezelor puse în jurul întregii expresii. Un pic de studiu
e-mail: antaltiberiu@pcnet.rodin cele dou| exemple prezentate sper c| va clarifica modul
individual al macrodefini Ûiilor
în care se pune problema. În general, programatorii experimentaÛi pun paranteze în jurul
fiec|rui argument de macro Õi paranteze adiÛionale în jurul întregii expresii.

O linie de forma #und ef IDENTIFICATOR1 face ca definiÛia lui IDENTIFICATOR1 s| fie

104
Capitolul
Conf. dr.7 ing.
- Preprocesarea
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
uitat | de preprocesor.
Facultatea ConstrucÛii Este corect s | se aplice #und ef asupra unui identificator care nu
de MaÕini
aCatedra
fost definit.
de Mecanic| Õi Programare
Curs de limbaj C Directiva #include insereaz| conÛinutul unui fiÕier în programul surs|.
Directiva
Practic, linia directivei se va înlocui prin conÛinutul întregului fiÕier. De
#include
Copyright 2001. Toate
obiceidrepturile
fiÕierul consunt
Ûine rezervate autorului.
declaraÛii de identificatori Õi/sau definiÛii de funcÛii
care sunt grupate într-un singur modul pentru a facilita un anumit tip
de operaÛii, cum
Multiplicarea ar fi cele
acestui document în scopÕire,
de intrare/ie prelucrare
comercial Õirurilor etc. AcelaÕi fiÕier poate
este ainterzis|.
fi inclus în mai multe module ale aceluiaÕi program sau ale unor programe diferite.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
#include<stdio.h>
document pentru uzul personal.
#include<string.h>

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Form a 7: #in clude<n um efis- ier> sau # include ”num efis- ier”
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Aceast| directiv| nu face mai mult cu programul decât ar face un simplu editor de texte;
editoarele
ANTAL Tiberiude texte sunt Õi ele capabile de operaÛia de includere a conÛinutului unui fiÕier
Alexandru
stocat pe disc în conÛinutul fiÕierului curent. num efis- ier trebuie s| fie numele unui fiÕier
tel.:
text 0040-264-530918
ASCII stocat pe disc. Prima form| asigur| c|utarea lui num efis- ier în locuri definite
e-mail:
dependent antaltiberiu@pcnet.ro
de implementarea particular| a preprocesorului. Cea de-a dou| form| va c|uta
mai întâi pe num efis- ier în acelaÕi loc cu programul surs|, apoi va trece la c|ut|rile
specifice primei forme.

#if , #ifdef , #ifndef , #else , #e nd if sunt directive pentru compilare


Directive de
condiÛionat|. Acestea permit numai compilarea unor porÛiuni din
compilare
programul
Conf. dr. ing. ANTAL
condiÛionat|
surs
Tiberiu |. Se poate scrie astfel un program general, portabil sub
Alexandru
Universitatea Tenhic| mai multe sisteme de operare, de exemplu DOS Õi UNIX, porÛiunile
din Cluj-Napoca
specifice sistemului de operare fiind compilate, în funcÛie de valori luate
Facultatea ConstrucÛii de MaÕini
de anumite constante. Voi prezenta câteva dintre directivele de compilare condiÛionat|
Catedra de Mecanic|
prin intermediul Õi Programare
exemplelor.
Curs de limbaj C
În programul urm|tor - IFD EF .C , OPTIUNE_1 apare într-un #define f|r| argumente.
Aceasta
Copyright este
2001. Toate| drepturile
o form | de rezervate
particularsunt care duce la crearea identificatorului
#define autorului.
OP TIUN E_1. Dac| ulterior se testeaz| existenÛa lui se poate lua o decizie pe baza
existen Ûei sauacestui
Multiplicarea inexisten Ûei lui. în
document Pentru c| O PTIUNE_1
scop comercial este definit în linia 4, când
este interzis|.
preprocesorul ajunge la linia 16 , va include în programul surs| tot ceea ce exist| între
liniile 16 Õi 19 . ifdef se traduce "dac| s-a definit", iar end if marcheaz| terminarea grupului
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
de instrucÛiuni care vor fi incluse în programul surs| la existenÛa lui OP TIUN E_1. Pentru
document pentru uzul personal.
a nu avea definit identificatorul OPTIUNE_1 este suficient s| transform|m linia 4 într-un
comentariu prin modificarea ei la forma /* #de fine OP TIUN E_1 */ , apoi se recompileaz|,
SudenÛii
linkediteazparticipanÛi la orice
| Õi se relanseaz form|
| în execudeÛieînv|Û|mânt cu plat| sau alte persoane doritoare
programul.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
1 scop
/* m| F.C
IFDE puteÛi
*/ contact| la:
2 #include <stdio.h>
3
4
ANTAL Tiberiu Alexandru
#d efine O PTIU NE _1 /* Se de f. ident. pentru con trolul preproces orului */
5 tel.: 0040-264-530918
#ifdef OPTIUNE_1
6 e-mail:
int conantaltiberiu@pcnet.ro
t = 17; /* Ac. linie exista d oar da ca s-a de f. OPTIU NE _1 */
7 #e nd if
8
9 int main(void)
10 {
11 int i;

105
Capitolul
Conf. dr.7 ing.
- Preprocesarea
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
12 for (i = 0 ; i < 3 ; i++)
13
Facultatea
{
ConstrucÛii de MaÕini
14 Catedra de
prin tf("In cicluÕi, ind
Mecanic| Programare
ex = %d ", i);
15 Curs de limbaj C
16 #ifdef OPTIUNE_1
17 /* Aceasta linie exista sau nu, condi Ûionata d e OP TIUN E_1 */
18
Copyright 2001. Toate drepturile sunt rezervate autorului.
prin tf(" si cont = % d", co nt);
19 #e nd if
20 Multiplicarea acestui
prin tf("\n "); document în scop comercial este interzis|.
21 }
22
23
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
return 0;
24 }document pentru uzul personal.
25 #undef OPTIUNE_1
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Dac | programul
pot multiplica este rulat numai
documentul în forma de mai
contra sus
cost Õi se
cu obÛin rezultatele:
acordul scris al autorului. În acest
In ciclu, index = 0 si cont = 17
scop m| puteÛi contact| la:
In ciclu, index = 1 si cont = 17
In ciclu, index = 2 si cont = 17
ANTAL Tiberiu Alexandru
F |r|0040-264-530918
tel.: definiÛia lui OPTIUNE_1 din linia 4 se obÛine:
e-mail: antaltiberiu@pcnet.ro
In ciclu, index = 0
In ciclu, index = 1
In ciclu, index = 2

Exemplul care urmeaz| ilustreaz| utilizarea directivelor de preprocesare pentru


includerea unei port-iuni de cod în programul surs| dac| un identificator nu este definit.
Directiva ifndef se citeÕte “dac| nu s-a definit - if not defined”. Se folosesc doi
identificatori
Conf. dr. ing.OPTIUNE_1
ANTAL Tiberiu Õi AFISARE_DA
Alexandru TE , iar în funcÛie de existenÛa lor se pot obÛine
3Universitatea |spunsuri.
variante de rTenhic| Dac | exemplul anterior era pur didactic Õi simplu, acesta este
din Cluj-Napoca
tot didactic, dar puÛ in mai complex.
Facultatea ConstrucÛii de MaÕini Identificatorul OPTIUNE_1 are rolul inversat din
programul anterior, iar AFISARE_DATE se foloseÕte pentru a valida afiÕarea dac| acesta
Catedra de Mecanic| Õi Programare
este definit. Dac| AFISARE_DATE nu este definit se va afiÕa un mesaj specific acestui
Curs de limbaj C
caz.

1 Copyright 2001.
/* IFN DE F.C */ Toate drepturile sunt rezervate autorului.
2 #include <stdio.h>
3 #d efine O PTIU
Multiplicarea NE _1 document
acestui /* Se de fineste
în scopid. pentru este
comercial controlul prep rocesoru lui */
interzis|.
4 #define AFISARE_DATE /* Daca id. este definit se va a fisa */
5
6 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
#ifndef OPTIUNE_1
7 document
int contpentru
= 17; /*uzul personal.
Linia ex ista num ai daca OP TIUN E_1 n u este de finita */
8 #e nd if
9
10
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
int main(void)
11 {pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
12 scopintm|i; puteÛi contact| la:
13
14 #ifndef AFISARE_DATE
15
ANTAL Tiberiu Alexandru
prin tf("N u se vo r afisa r ezu ltate c u a cea sta v ersiun e a p rog ram ulu i\n ");
16 tel.:
#e nd 0040-264-530918
if
17 e-mail: antaltiberiu@pcnet.ro
18 for (i = 0 ; i < 3 ; i++)
19 {
20 #ifdef AFISARE_DATE
21 prin tf("In ciclu , Ind ex = %i", i);
22

106
Capitolul
Conf. dr.7 ing.
- Preprocesarea
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
23 #ifndef OPTIUNE_1
24
Facultatea ConstrucÛii de MaÕini
printf("con t = %i", co nt); /* Linia se
v a afisa con ditionat */
25 Catedra
#e nd if de Mecanic| Õi Programare
26 Curs de limbaj C
27 prin tf("\n ");
28 #e nd if
29
Copyright
}
2001. Toate drepturile sunt rezervate autorului.
30
31 Multiplicarea
return 0; acestui document în scop comercial este interzis|.
}
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Pentru cazul
document cânduzul
pentru | cei doi identificatori se afiÕeaz| rezultatele:
existpersonal.
In ciclu, Index = 0
In ciclu, Index = 1
SudenÛii
In ciclu,participanÛi
Index = 2 la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Celelalte dou| variante
scop m| puteÛi la: rezultate sper s| le g|siÛi voi. Sunt numai 3 tipuri de rezultate
contact| de
care se vor afiÕa, deÕi exist| 4 st|ri distincte care pot fi obÛinute prin gruparea st|rilor de
ANTALÛ|Tiberiu
existen sau inexisten Û| a celor doi identificatori.
Alexandru
tel.: 0040-264-530918
Directiva #line spune preprocesorului c| pentru programul C generat,
Directiva
e-mail: #line
antaltiberiu@pcnet.ro
num|rul intern de linii Õi numele fiÕierului C s| fie modificate.
Compilatorul foloseÕte aceste numere de linii Õi numele de fiÕier pentru
afiÕarea erorilor g|site în faza de compilare.

7:
Form a 7 "num e de fis- ier"
#line constanta

Conf. dr. ing. prin


De exemplu, ANTAL Tiberiu Alexandru
#line 123 "test1.c" , num|rul intern de linie este modificat la 123 iar
Universitatea Tenhic|
numele fiÕierului din Cluj-Napoca
la test1.c.
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| OriceÕi compilator
Programare are un set de opÛiuni dependente de UCP Õi sistemul
Directive
Curs de limbaj C de operare sub care se ruleaz|. De exemplu, pentru unele programe
# pra gm a
datele trebuie s| fie stocate la anumite adrese în RAM. Alteori dorim s|
control
Copyright 2001. Toate |m modul
drepturile suntînrezervate
care func Ûiile primesc parametri. Directiva
autorului.
#p ra gm a asigur| aceste facilit|Ûi, dar argumentul ei este de obicei diferit pentru fiecare
combina Ûie deacestui
Multiplicarea UCP Õdocument
i sistem de operare.
în scop Pentru
comercial cunoa
este Õterea acestora va trebui s|
interzis|.
consultaÛi documentaÛia compilatorului pe care îl folosiÛi.
SudenÛii participanÛi la|orice
Exist form|de
un grup de identificatori
înv|Û|mânt superior
care înbugetar
urma pot multiplica
substitu acest
Ûiei produc
Nume predefinite
document pentruinforma
uzul personal.
Ûii speciale. AceÕtia nu se pot redefini sau "uita" cu #undefine .
CâÛiva dintre aceÕtia se afla7 în tablelul care urmeaz|:
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot
Numemultiplica documentul numai contra cost Õi cuSemnificat
identificator acordul scris
-ie al autorului. În acest
scop m| puteÛi contact| la:
__LINE__ O constant| în baza zecimal| ce conÛine num|rul de ordine a
ANTAL Tiberiu Alexandru liniei curente din codul surs|.
tel.: 0040-264-530918
__FILE__ Un Õir ce conÛine numele fiÕierului în curs de compilare.
e-mail: antaltiberiu@pcnet.ro
__DATE__ Un Õir care conÛine data compil|rii sub forma Mm m dd yyyy .
__TIME__ Un Õir care conÛine ora compil|rii sub forma hh:m m:ss .

107
Capitolul
Conf. dr.7 ing.
- Preprocesarea
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Prezint
Facultateaîn continuare
ConstrucÛiiundeexemplu
MaÕini de folosire a acestor nume:
1
Catedra de Mecanic| Õi Programare
/* PR ED EF.C */
2 Curs de limbaj C
3 #include<stdio.h>
4 Copyright 2001. Toate drepturile sunt rezervate autorului.
5 int main(void)
6 {
7 Multiplicarea acestui document în scop comercial este interzis|.
8 prin tf("Lin ia d e pr ogr am %d ,\nd in fis ieru l sur sa % s,\n com pila t\
9 laparticipanÛi
SudenÛii d ata %s, o ra
la%orice
s\n ",__ LINde
form| E_înv|Û|mânt
_, _ _F ILE __ , __ DAbugetar
superior TE __ , __
potTIM E_ _); acest
multiplica
10
11
document pentru uzul personal.
return 0;
12 }
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Rezultate:
scop m|deputeÛi
Linia contact|
program 9, la:
din fisierul sursa C:\Visual C++\prefef.c,
compilat la data Feb 3 2000, ora 16:22:29
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

108
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

8 Poantori
Multiplicarea acestui document în scop comercial este interzis|.

P
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
prin
rincipial,
pentruvariabila
tipulparticipanÛi
SudenÛii lui va indicalatipul
de tipul poantor sau, mai pe scurt, poantorul (pointer-ul în
uzul personal.
englez|) stocheaza7 adresa un ei locat-ii din RAM . Poantorul poate fi tipizat, adic|
obiectului
orice form| delaînv|Û|mânt
care poanteaz |. Poantorii
cu plat| sau altepot fi priviÛdoritoare
persoane
unor salturi care asigur| leg|turi dintr-o parte a programului în alta. Tony Hoare, în
i asemenea
pot
colec multiplica
Ûia lui de documentul
eseuri "Hints numai contra cost Õi cu
on Programming acordul Design",
Language scris al autorului. În acest
1973, Prentice-Hall
scop
spunea:m| "Intr
puteÛi contact|
oducere la: torilor în lim ba jele d e ni vel în alt a fost un pas înapoi dupa7
a poan
care este pos ibil sa 7 nu ne mai revenim niciodata7 " . În C, nu trebuie s| ne facem griji
ANTAL
datorit | afirma
TiberiuÛiei de mai sus, cel puÛin pentru c| K&R nu îl numesc limbaj de nivel înalt,
Alexandru
ci mai
tel.: degrab| un limbaj de asamblare de nivel înalt. Pentru c| C este un limbaj destul
0040-264-530918
de jos este
e-mail: imposibil s| se scrie în el ceva serios f|r| poantori. De exemplu, este imposibil
antaltiberiu@pcnet.ro
s| alter|m valorile argumentelor unei funcÛii aducând modific|ri asupra parametrilor în
corpul funcÛiei, cu cele discutate pân| acum. Numai folosind poantori se pot crea variabile
noi în timpul execuÛiei programului. C permite programului s| aloce o cantitate de RAM
pe heap, întorcând o adres| care poate fi stocat| într-un poantor. Aceast| tehnic| poart|
denumirea de aloca re din am ica7 a mem oriei.
Conf. dr. ing. ANTAL Tiberiu
În primul Alexandru
capitol, am spus c| RAM-ul este o secvenÛ| de locaÛii, fiecare
RAM-ul Õi
Universitatea locaÛie
Tenhic| din o adres| unic| Õi un conÛinut unic, care se poate modifica.
Cluj-Napoca
având
poantorii
Facultatea ConstrucÛii Cazulde tipic de organizare a locaÛiei este grupul de 8 biÛi, care se mai
MaÕini
nume Õte
Catedra de Mecanic| Õi Programare Õi octet. Putem spune c| RAM-ul este un "vector" M = (L 1, L 2, ...,
L k, ..., de
Curs , unde LCk este o locaÛie format| dintr-un grup de 8 biÛi, iar k este adresa locaÛiei.
L n)limbaj
ÔtiÛi c| tipul char se stocheaz| pe un octet, iar tipul long pe 4 octeÛi consecutivi. La nivelul
RAM-ului,
Copyright 2001. în cazul comun,
Toate poantorul
drepturile suntse | într-un grup de 4 (eventual 2) locaÛii
stocheazautorului.
rezervate
succesive (vezi în Figura 5 pe L 1, L 2, L 3, L 4). În Figura 5 se reprezinta7 grafic lega7 tura
creata7 prin poantarea la o variabila7 a de tipul char de ca7 tre un poantor pta .
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.:
Figura0040-264-530918
5 - Model de reprezentare a poantorului în RAM
e-mail: antaltiberiu@pcnet.ro
Când un poantor stocheaz| adresa unui obiect, prin modificarea conÛinutului poantorului -
a adresei stocate în el - putem poanta la diferite obiecte din RAM. Astfel, apare
posibilitatea manipul|rii (atribuire, citire, modificare) informaÛiilor stocate la adrese
diferite cu ajutorul unei singure variabile, aceea de tipul poantor.
109
Capitolul
Conf. dr.8 -ing.
Poantori
ANTALTiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
Poantorii
Datorit
ConstrucÛii
în ANSI de|MaÕini
asem|n|rii poantorilor cu instrucÛiunea goto este posibil s| se
fac| leg | turi
C Catedra de Mecanic| Õi Programare
incorecte sau cu zone de RAM interzise. Deci, din neatenÛie
sau lips| de experienÛ|, un poantor va putea poanta "incorect". Era cazul
Curs de limbaj C ca o oarecare disciplin| s| fie introdus| Õi pentru variabila poantor.
Aceasta este marea contribuÛie a standardului ANSI C. El defineÕte regulile de lucru cu
Copyright
variabilele 2001. ToateAcestea
poantor. drepturileausunt
fostrezervate autorului.
preluate din practic|, de la programatorii
profesioniÕti, iar compilatoarele C bune oblig| la folosirea acestora.
Multiplicarea acestui document în scop comercial este interzis|.

8.1 Declararea
SudenÛii participanÛi poantorilor
la orice form| de
document pentru uzul personal.
înv|Û|mânt superior bugetar pot multiplica acest
Un poantor se declar| în C prin precedarea numelui de variabil| cu caracterul asterisc "*".
Acesta informeaz| compilatorul c| dorim s| declar|m o variabil| poantor Õi s| aloce spaÛiul
corespunz |tor num|rului
SudenÛii participanÛi de octe
la orice Ûi necesari
form| pentru acu
de înv|Û|mânt stoca
plat|o adres| depersoane
sau alte memorie. Dac| prin
doritoare
linia:
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
char a;

ANTAL Tiberiu Alexandru


se declar| o variabil| a de tipul întreg char, atunci prin linia:
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
char *pta;

se declar| o variabil| poantor la un tip char cu numele pta. Din punct de vedere al
declaraÛiei, poziÛia caracterului * este nesemnificativ| atât timp cât se afla7 între tipul Õi
numele variabilei poantor. Astfel, declaraÛia de mai sus se poate scrie Õi aÕa:

char* pta;ing.
Conf. dr. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Se pot declara mai mulÛi poantori în aceeaÕi linie de program astfel:
Facultatea ConstrucÛii de MaÕini
1 Catedra de
char *pta pt1; Õi Programare
Mecanic|
, *ptb,
2 Cursptx1,
int* de limbaj C
x2, *ptx3;

În
Copyright pta ÕiToate
linia 1, 2001. ptb sunt poantori
drepturile la tipul
sunt , dar pt1 este o variabil| de tipul char
charautorului.
rezervate
pentru c| * lipseÕte. În linia 2, ptx1 Õi ptx sunt poantori la tipul int, iar x2 este o variabil|
întreag |.
Multiplicarea acestui document în scop comercial este interzis|.
La fel cum o variabil| are un tip ce specific| atributele acesteia în
Tipul poantorului
SudenÛii participanÛi la oriceÕiform| de înv|Û|mânt
program, poantorul are un tipsuperior bugetar
prin care pot multiplica
compilatorul acest
este anun Ûat
document pentru asupra
uzul personal.
num|rului de octeÛi Õi a atributelor datelor care sunt valide
începând de la adresa poantat| de poantor.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
8.2 Operatorul adresa7 "&"
scop m| puteÛi contact| la:
7 " &"
Operatorul adresa l-am folosit în funcÛia sca nf(). El are ca rezultat adresa unei
ANTAL
variabileTiberiu
stocate Alexandru
pe stiv| sau în zona segmentului de date. Tehnic vorbind & întoarce
operandului. Operandul poate fi un nume de funcÛie sau un nume de obiect, iar
tel.: 0040-264-530918
adresa
rezultatul este un poantor la operand.
e-mail: antaltiberiu@pcnet.ro

1 /* PT1.C */
2 #include<stdio.h>
3
4 int a, *p ta; /* a si pta su nt varia bile globale */

110
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
5
6
Facultatea ConstrucÛii de MaÕini
int main(void)
7 Catedra
{ de Mecanic| Õi Programare
8 Curs deint
limbaj
*pt1a;C/* pt1a este va riabila locala */
9 pta =& a; /* se atribuie a dresa lui a poan torului pta */
a=50;
10
11
Copyright 2001. /* se atribuie va loarea 50 variab ilei a */
Toate drepturile sunt rezervate autorului.
pt1a=pta ; /* se atribuie a dresa stocata în pta lui p t1a */
12
13 Multiplicarea acestui
prin tf("ad resadocument
lu i a: %p\n în",scop
&a );comercial este interzis|.
14 prin tf("con tinu tul lu i a: %i\n \n ", a);
15
16
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
prin tf("con tinu tul lu i pta : %p\ n", p ta);
17 documentprinpentru uzuleapersonal.
tf("va loar la ca re p oan teaza p ta: %i\n \n ", *pta );
18
19 SudenÛiiprin tf("con tinu
participanÛi latul lu i form|
orice pt1a : %p\ n", p t1a); cu plat| sau alte persoane doritoare
de înv|Û|mânt
20 prin tf("va loar ea la ca re p oan teaza p t1a: % i\n \n ", *pt1a );
21
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
22 scop m| puteÛi
prin contact|
tf("va lorile nula:m eric e su nt: % i %i % i\n ", a, *pta , *pt1a );
23
24 ANTAL *pt1a=22
Tiberiu; Alexandru
/* aici se m odifica va loarea lui a */
25
tel.: 0040-264-530918
26 prin tf("va lorile nu m eric e su nt: % i %i % i\n ", a, *pta , *pt1a );
27 e-mail: antaltiberiu@pcnet.ro
28 return 0;
29 }

Rezultate:
adresa lui a: 004237A4
continutul lui a: 50
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatealui
continutul Tenhic|
pta: din Cluj-Napoca
004237A4
valoarea la care poanteaza pta: 50
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic|
continutul lui pt1a:Õi Programare
004237A4
Curs de limbaj
valoarea C poanteaza pt1a: 50
la care

valorile numerice sunt: 50 50 50


Copyright 2001. Toate drepturile sunt rezervate autorului.
valorile numerice sunt: 22 22 22

Multiplicarea
În programul acestui
anteriordocument în scop |comercial
a este o variabil întreag|,este
iar interzis|.
pta este un poantor la întreg. În
aceste condiÛii & a are ca rezultat adresa variabilei a din segmentul de date. Aceast|
adres|, prin
SudenÛii operatorul
participanÛi de atribuire,
la orice form| de se copiaz| -superior
înv|Û|mânt vezi linia 9 - în pot
bugetar poantorul
multiplica Din
pta.acest
rezultatele afiÕateuzul
document pentru de program
personal.se observ| c| poantorii stocheaz| tot numere, îns| acestea
sunt intepretate ca Õi adrese. Prin "tradiÛie", adresele se scriu în notaÛie hexazecimal|,
ceea ce ajuta
SudenÛii 7 la distingerea
participanÛi la oricelor de valorile
form| numerice
de înv|Û|mânt cu"normale".
plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Valoarea unui poantor se poate afiÕa folosind în printf() specificatorul de
AfiÕarea
scop m| puteÛi contact| la:
format %p.
poantorilor
ANTAL Tiberiu Alexandru
În programul PT 1.C se
Reprezentarea
declar| 3 variabile: a -
tel.: 0040-264-530918
spaÛiului de date
variabil| de tipul întreg,
e-mail: antaltiberiu@pcnet.ro
pta - variabil| poantor la
întreg global|, pt1a - variabil| poantor la
întreg local|. Acesta din urm| stocheaz|
adresa variabilei de tipul int. pta fiind un
Figura 6
111
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
poantor global
Facultatea este iniÛde
ConstrucÛii ializat cu o valoare special| numit| NULL , despre care voi discuta
MaÕini
pe larg într-un paragraf urm
Catedra de Mecanic| Õi Programare| tor. Variabila a fiind global| este automat init-ializata7 cu
valoarea 0 . Pentru a uÕura înÛelegerea problemei, prezint în Figura 6 spaÛiul de date al
Curs de limbaj
programului C
anterior.
Copyright
Pentru pt1a2001.
spaÛiulToate drepturile
se aloc | pe stivsunt
|, iarrezervate
acolo autorului.
unde s-a f|cut aceast| alocare sunt stocate
câteva valori imprevizibile.
Multiplicarea acestui documentÎntrucât
în scopacestea
comercial este interzis|.
sunt lipsite de utilitate pentru programator,
SudenÛiis|participanÛi
prefer zic c| variabilele “nu au
la orice form| de nici o
înv|Û|mânt superior bugetar pot multiplica acest
valoare”, iar în reprezentarea
document pentru uzul personal. spa Û iului de
date am folosit "? " pentru a simboliza situaÛia.
Variabila a are stocat| în ea valoarea 0 . Figuracu7 plat| sau alte persoane doritoare
SudenÛii participanÛi la orice form| de înv|Û|mânt
pot multiplica
În urma execu documentul
Ûiei liniilornumai contra
9 Õi 10 , ptacostva Õi cu acordul scris al autorului. În acest
scop m|laputeÛi
poanta a , iarcontact| la: stoca valoarea 50 ,
în a se va
deci reprezentarea spaÛiului datelor devine
cea
ANTALdin Figura
Tiberiu7.Alexandru
Din acest moment avem un
poantor la variabil| întreag| a Õi o valoarea
tel.: 0040-264-530918
e-mail:| antaltiberiu@pcnet.ro
stocat în ea, care va putea fi manipulat|, fie
prin numele variabilei a , fie prin poantorul la
aceasta pta , dup| cum se va vedea în Figura 8
continuare. Variabila pt1a este Õi ea tot o
variabil| poantor la un tip int. Prin atribuirea din linia 11 , adresa din pta se copiaz| Õi în
pt1a , deci pt1a va poanta în acelaÕi loc cu pta. SituaÛia este ilustrat| în Figura 8.

Conf. dr. ing. ANTAL Tiberiupoate


Un poantor poanta numai la o variabil| de acelaÕi tip cu tipul
Alexandru
Reguli de
poantorului
Universitatea Tenhic| folosit în declaraÛia acestuia. Motivul acestei interdicÛii st|
din Cluj-Napoca
atribuire a
Facultatea
adreselor
în faptul
ConstrucÛii de c| prin
MaÕini intermediul unui poantor este posibil s| avem acces la
valoarea
Catedra de Mecanic| numeric| de la adresa poantata de poantor. Tipul poantorului
Õi Programare
Curs de limbaj C specific| cum anume va fi tratat| valoarea de la acea adres|. Ar fi tragic
ca prin intermediul poantorilor s| fie permis|, de exemplu, tratarea unei valori de tipul
int ca una de tipul doub le . Un compilator bun trebuie s| sancÛioneze orice tentativ| de
Copyright 2001. Toate drepturile sunt rezervate autorului.
acest fel.
Multiplicarea acestui document în scop comercial este interzis|.
8.3 Operatorul de indirectare, "*"
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Operatorul de indirectare "*" este într-un fel opusul celui adres|. Dac| "&" are ca rezultat
document pentru uzul personal.
adresa unei variabile, operatorul "*" foloseÕte aceast| adres| stocat| într-o variabil|
poantor pentru accesarea conÛintului locaÛiei de memorie corespunz|toare. Operatorul de
SudenÛii
indirectare participanÛi
"*" acceseazla orice form| numeric
| o valoare de înv|Û|mânt cu plat|
| indirect sauÕalte
- de aici persoane
i numele doritoare -
de indirectare
pot multiplica
prin intermediul documentul
unui poantor.numai contra cost
Operandul Õi cu sacordul
trebuie scris alde
| fie o valoare autorului. În acest
poantor. Rezultatul
opera
scop m| ÛieiputeÛi
este valoarea
contact|adresat
la: | de operand, adic| valoarea de la adresa la care poanteaz|
operandul. Tipul rezultatului este tipul pe care operandul îl adreseaz|. Se mai spune c|
operatorul
ANTAL Tiberiu "*" realizeaz | dereferent-ierea poantorului, adic| îl coverteÕte într-o l-value .
Alexandru
tel.: 0040-264-530918
În programul PT 1.C , pentru c| pta poanteaz| la a , folosirea indirect|rii, adic| a formei de
e-mail: antaltiberiu@pcnet.ro
scriere *pta , permite manipularea valorii întregi stocate în variabila a . În orice loc din
program în care este permis| utilizarea lui a , începând cu linia 10 , este permis| Õi
utilizarea lui *pta . SemnificaÛia lor este identic| atât timp cât pta poanteaza la a . În linia
11 , pt1a este f|cut s| poanteze la aceeaÕi adres| cu pta , deci de acum Õi pt1a poanteaz| la
as - i *pt1a se poate folosi în locul lui a pentru c| sunt identice. printf() din linia 22 , în care
112
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
se folosesc ConstrucÛii
Facultatea toate cele 3de
modalit
MaÕini|Ûi de identificare a variabilei a , afiÕeaz| de 3 ori aceeaÕi
valoare. De Õi sunt declarate 3 variabile,
Catedra de Mecanic| Õi Programare în realitate spaÛiul folosit pentru stocarea valorii
întregi este unul singur, corespunz |tor variabilei a .
Curs de limbaj C
Pân| acum în programul prezentat am extras valoarea numeric|
Modificarea
Copyrightvalorii
2001. Toate drepturile sunt rezervate autorului.
poantate de
poantat | de poantori. Este
posibil| îns| Õi modificarea
poantor
Multiplicarea acestuiacestei valori sub
document controlul
în scop comercial este interzis|.
operatorului de atribuire.
Aceasta
SudenÛii se ilustreaz|laînorice
participanÛi 24 în de
liniaform| care i se
înv|Û|mânt superior bugetar pot multiplica acest
atribuie valoarea 22 variabilei
document pentru uzul personal. a , prin *pt1a .
printf() din linia 26 cauzeaz| afiÕarea a noii
valori, de 22 , de trei ori. Avem deci trei nume
SudenÛii participanÛi
alternative pentru o la orice|form|
singur de|înv|Û|mânt
variabil pe a , Figuracu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu 9
acordul scris al autorului. În acest
*pta Õi *pt1a . În Figura 9 se prezint| spaÛiul
scop
de m| pentru
date puteÛi contact| la: Ûie.
aceast| situa

Alexandru care urmeaz| conÛine o eroare - în jargonul programatorilor


ANTAL Tiberiu Programul
O eroare aceasta7 eroare se numes- te
tel.: 0040-264-530918
comun|
ploÕniÛa7 sau bug în englez|.
e-mail: antaltiberiu@pcnet.ro
1 /* PTR 2.C */
2
3 #include<stdio.h>
4
5 int main(void)
6 {
7
Conf. dr. ing. ANTAL
int b, *ptb;
Tiberiu Alexandru
8 Universitatea Tenhic| din Cluj-Napoca Figura 10
9 Facultatea
b=13;ConstrucÛii de MaÕini
10 Catedraprin
de tf("b= % i\nÕi
Mecanic| ");Programare
11
12
Curs de*ptb=7;
limbaj C
13 prin tf("b= % i\n ");
14 Copyright 2001. Toate drepturile sunt rezervate autorului.
15 return 0;
16 }
Multiplicarea acestui document în scop comercial este interzis|.
Starea spaÛiului de date a programului, când se ajunge la linia 12 , se prezint| în Figura
SudenÛii participanÛi
10. Probabil speraÛi calaprin
orice form|
linia de;înv|Û|mânt
*ptb=7 s| se modificesuperior bugetar
valoarea stocatpot
| înmultiplica
variabila bacest
. Din
p|cate, linia ptb=&b; lipseÕte Õi pentru c| ptb este o variabil| local| au to , va fi iniÛializat|
document pentru uzul personal.
cu o valoare aleatoare. Presupunând ca tipul int se stocheaz| pe 4 octeÛi, linia 12 va
suprascrie 4 octeÛi dinlaRAM
SudenÛii participanÛi oriceîncepând
form| decu adresa stocat
înv|Û|mânt | în ptb.
cu plat| sauEste foarte puÛdoritoare
alte persoane in probabil
ca 4 octe Ûi s | fie chiar cei corespunz |
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. Înoriunde,
cei tori lui b . Practic, scrierea se poate face acest
inclusiv
scop m|în segmentul
puteÛi contact| cod, caz în care programul va "cr|pa" subit. Scrierea în segmentul
de la:
de date, în stiv| Õi pe heap este permis|, îns| va avea ca efect modificarea la valori
aleatoare a unor obiecte care vor duce cel puÛin la rezulate eronate. Este posibil s| apar|
ANTAL Tiberiu Alexandru
Õi un caz mai deosebit de scriere în afara zonelor de adres| puse la dispoziÛia programului
tel.:
de c|0040-264-530918
tre sistemul de operare. Dac| sistemul de operare lucreaz| cu protecÛie (UNIX sau
e-mail:
Windows antaltiberiu@pcnet.ro
NT) programul este ucis înainte de a apuca s| fac| ceva r|u. Sub vechiul
MS-DOS, el va corupe o parte din propriul lui cod, al altui program sau cel al DOS-ului.
Rezultate "ciudate" vor fi observate în programul actual sau în altele, dup| caz. În
W indow s, o astfel de eroare produce terminarea aplicaÛiei cu mesajul "General Protection
Fa ult ".

113
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL
Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Cea mai
Facultatea ConstrucÛii sigur| metod| de iniÛializare a unui poantor este iniÛializarea în
de MaÕini
IniÛializarea
linia declaraÛiei lui. Astfel, pentru exemplul anterior, în loc int b, *ptb;
Catedra de Mecanic| Õi Programare
poantorilor
se poate scrie int b, *ptb=&b;.
Curs de limbaj C

8.4 Ce este NULL?


Copyright 2001. Toate drepturile sunt rezervate autorului.
Am v|zut dejaacestui
Multiplicarea c| existdocument
| posibilitatea definirii
în scop unoreste
comercial constante folosind directiva #define
interzis|.
a preprocesorului. NULL este o astfel de valoare definit| în mai multe fiÕiere antet (de
exemplu în std io.h ). Ea indic| faptul c| poantorul care ia aceast| valoare special| nu
SudenÛii
poanteazparticipanÛi
| adresa unui la orice
obiectform| de |înv|Û|mânt
C. Dac declaraÛia superior bugetarpoantor
unei variabile pot multiplica acest|,
este global
document pentru
compilatoarele uzulvor
ANSI personal.
iniÛializa variabila poantor cu valoarea special| NULL . SecvenÛa
de biÛi corespunz|toare lui NULL nu este neap|rat valoarea numeric| zero, fiind
dependent | de compilatorul
SudenÛii participanÛi specific
la orice form| pe care lucr
de înv|Û|mânt cu|plat|
m. Pentru a persoane
sau alte face codurile surs|
doritoare
compatibile
pot multiplicaîntre diferite compilatoare
documentul numai contra a fost
cost necesar | reprezentarea
Õi cu acordul poantorului
scris al autorului. NULL
În acest
printr-un macro.
scop m| puteÛi NULL este
contact| la: de fapt numele acestui macro. Setarea unui poantor folosind
acest macro se face printr-o atribuire de forma ptb = NULL . De asemenea, aceast| valoare
special
ANTAL | poate fi testat
Tiberiu | în expresii pentru a verifica dac| un poantor este sau nu iniÛializat.
Alexandru
1
tel.: 0040-264-530918
/* PTR 3.C */
2 e-mail: antaltiberiu@pcnet.ro
#include<stdio.h>
3
4 int *ptb;
5 int main(void)
6 {
7 int b;
8 /* int *ptb=N UL L; */
9 b=13;
Conf. dr. ing. ANTAL Tiberiu Alexandru
10 prin tf("b= % i\n ",b);
11
Universitatea Tenhic| din Cluj-Napoca
12 Facultatea ConstrucÛii
if (ptb == NULL)de MaÕini
13 Catedra de Mecanic| Õi Programare
prin tf("poan toru l ptb e ste in valid!\ n");
14 Curs deelse
limbaj C
15 {
16 *ptb=7;
17 Copyright 2001. Toate
prin tf("b=drepturile
% i\n ",b); sunt rezervate autorului.
18 }
19 Multiplicarea acestui document în scop comercial este interzis|.
20 return 0;
21 }
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
În programul pentru uzul personal.
anterior, ptb este o variabil| global|, motiv pentru care este iniÛializat|
automat cu valoarea NULL . Dac| ar fi fost local|, iniÛializarea trebuia f|cut| explicit de noi
ca Õi în linia
SudenÛii 8 . În cazul
participanÛi la orice iniÛializarea
cândform| nu se face
de înv|Û|mânt nici automat,
cu plat| nici explicit,
sau alte persoane avem o
doritoare
problem | , pentru ca7 nu avem de unde s| Õtim dac | valoarea poantat | este
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest una real | sau
"gunoi", detec Ûia cu un
scop m| puteÛi contact| la: if , ca în exemplul anterior, neputându-ne salva de la dezastru.

8.5 Poantorii s- i argumentele


ANTAL Tiberiu Alexandru
tel.: 0040-264-530918

funct-iilor
e-mail: antaltiberiu@pcnet.ro

În programul EX TE RN .C din paragraful 6.6 am prezentat un program care citea dou|


numere reale, apoi calcula Õi afiÕa câtul lor. Implementarea dat| folosea variabile globale.
Implementarea care urmeaz| foloseÕte variabile locale Õi transferul de parametri prin
114
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
poantori.
FacultateaAm apelul prin valoare c| funcÛia apelat| nu are cum s| modifice
spus dejadelaMaÕini
ConstrucÛii
valorile variabilelor pe post de argumente din funcÛia apelant| pentru c| se transfer|
Catedra de Mecanic| Õi Programare
numai o copie a lor prin stiv|. SoluÛia este s| apeleze funcÛia cu poantori la parametri.
Curs de limbaj
Majoritatea C
programatorilor aleg transferul valorilor de obiect prin adres| Õi nu prin
valoare, din motive de creÕtere a vitezei de execuÛie a programului. De asemenea, metoda
Copyright
de transfer2001. Toate drepturile
este singura sunt modificarea
care permite rezervate autorului.
valorilor variabilelor ale c|ror adrese
s-au transferat ca argumente din interiorul funcÛiei care s-a apelat.
Multiplicarea acestui document în scop comercial este interzis|.
1 /* AP ELP TR .C */
2 #include<conio.h>
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
3 #include<stdio.h>
4 document pentru uzul personal.
#include<float.h>
5
6 /*Prototipu rile functiilor
SudenÛii participanÛi din
la orice prog ram
form| */
de înv|Û|mânt cu plat| sau alte persoane doritoare
7 void cite ste_ 2_ rea li(float *d eim pa rtit, float *im pa rtitor);
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
8 float calcule aza _ci tul(floa t deim pa rtit, float im pa rtitor);
9 scop
void m| puteÛi_ci
a fiseaza contact|
tul(floala:
t cit);
10
11 c on st flo Tiberiu
ANTAL at IN F IN IT = F LT _M A X ;
Alexandru
12
tel.: 0040-264-530918
13 /* functia m ain() - punctu l de intrare in p rogram */
14 e-mail: antaltiberiu@pcnet.ro
int main(void)
15 {
16 floa t cit,d eim pa rtit,im pa rtito r; /* 3 variab ile locale */
17 do {
18 cite ste_2 _rea li(& de im pa rtit,& im pa rtito r);
19 cit=ca lculeaz a_ citu l(deim pa rtit,im pa rtitor);
20 afis eaza_ citu l(cit);
21 Conf. } wh
dr. ile ANTAL
ing. (ge tch() Tiberiu
!= 'i'); Alexandru
22
Universitatea Tenhic| din Cluj-Napoca
23 return 0;
24 Facultatea
} ConstrucÛii de MaÕini
25 Catedra
/* de Mecanic|
sfarsitul Õi Programare
fun ctiei main () */
26 Curs de limbaj C
27 /* definitiile functiilor */
28 void citeste_2_reali(float *deimp artit, float *impartitor)
29 Copyright
{ 2001. Toate drepturile sunt rezervate autorului.
30 prin tf("Ba ga 2 nu m ere, deim pa rtit si im pa rtitor: ");
31 sca nf("%f
Multiplicarea %f",ddocument
acestui eim pa rtit,im pa rtito
în scop r);
comercial este interzis|.
32 }
33
34 SudenÛii participanÛi la orice deimpa
float calculeaza_citul(float form| de înv|Û|mânt
rtit, superior bugetar pot multiplica acest
float impartitor)
35 {document pentru uzul personal.
36 if (impartitor == 0.0F)
37 retu rn(IN FIN IT);
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
38 else
39 pot multiplicaretu
documentul numai
rn(d eim pa contra
rtit/im cost Õi cu acordul scris al autorului. În acest
pa rtitor);
40 scop
} m| puteÛi contact| la:
41
42 void a fiseaza _ci tul(floa t cit)
ANTAL Tiberiu Alexandru
43 {
44 tel.: 0040-264-530918
if (cit == INFINIT)
45 e-mail: antaltiberiu@pcnet.ro
prin tf("Citu l este n ed efin it\n ");
46 else
47 prin tf("Citu l este % f\n ",cit);
48 }

115
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Liniile modificate
Facultatea faÛ| de
ConstrucÛii deMaÕini
implementarea din programul EX TE RN .C s-au marcat prin
culoarea gri a fondului. În linia 18 , prin citeste_2_ rea li(&d eim pa rtit,& im pa rtitor); se
Catedra de Mecanic| Õi Programare
apeleaz| funcÛia citeste_2_rea li() cu dou| argumente ce sunt adresele variabilelor
Curs de limbaj C
deim par tit Õi impartitor . Evident, declaraÛia funcÛiei a fost Õi ea modificat| de la void
cites te_2_ rea li(); la void citeste_2_reali(float *deimpartit, float *impartitor); . Se observ|
Copyright 2001. Toate
c| cei doi parametri drepturile
sunt poantori sunt rezervate
la tipul float, caautorului.
urmare orice modificare a lor în corpul
funcÛiei cite ste_2 _rea li() se va reflecta Õi asupra valorilor variabilelor deim par tit Õi
impartitor din
Multiplicarea funcÛia
acestui apelant|în main()
document . La revenirea
scop comercial din cite ste_2 _rea li() valorile
este interzis|.
variabielor deim par tit Õi impartitor vor fi modificate datorita7 funcÛiei sca nf(). Aceasta,
dup | primul
SudenÛii argument
participanÛi la are caform|
orice argumente adrese desuperior
de înv|Û|mânt variabile. Din acest
bugetar pot motiv, de obicei,
multiplica acest
numele variabilelor în care
document pentru uzul personal.se vor citi valori trebuie s| fie precedate de operatorul & . Aici
nu este cazul pentru c| aceste variabile stocheaz| ele însele adrese, fiind poantori.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
8.6 Funct-ii cu numa7 r variabil de
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

parametri
ANTAL Tiberiu Alexandru
Unele funcÛii C cum ar fi printf() accept| un num|r variabil de argumente pe lâng| un
tel.: 0040-264-530918
num | r fixat de argumente. DeclaraÛia de funcÛie unde ultimul argument din lista
e-mail: antaltiberiu@pcnet.ro
argumentelor este o virgul| urmat| de suit| de 3 puncte ",..." va lucra cu un num|r variabil
de argumente. Este necesar s| existe cel puÛin un argument fix, chiar dac| acesta nu va
fi folosit ulterior, pentru a putea accesa lista argumentelor variabile.

Varianta portabil| de acces la argumentele acestor funcÛii s-a implementat în C prin


intermediul unor macrodefiniÛii ale c|ror nume încep cu va _... . Acestea sunt folosite
Conf.
pentrudr.a ing. ANTAL
parcurge Tiberiu
lista Alexandrucând funcÛia apelat| nu Õtie num|rul Õi tipul
argumentelor
Universitatea
acestora. Tenhic| din
Prototipurile Ûiilor utilizate în acest scop sunt:
Cluj-Napoca
func
Facultatea ConstrucÛii de MaÕini
tip va_arg(va_list
Catedra de Mecanic|argÕi_p tr, tip);
Programare
void va_end(va_list arg _p tr);
Curs de limbaj C
void v a_ star t(va_list arg _p tr, pre v_ pa ram );

Copyright
iar fiÕierul 2001. Toate este
de prototip drepturile sunt. rezervate autorului.
"stdarg.h"

este unacestui
Multiplicarea
va_list care Ûine informa
tabloudocument în scop Ûcomercial | luiinterzis|.
ia necesareste Õi va_end. Când funcÛia
va_a rg
apelat| foloseÕte un num|r variabil de argumente în ea se declar| o variabil| arg _p tr de
tipul va_list
SudenÛii .
participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
va_start este un macro care cere 2 parametri, arg _p tr Õi prev_param ce vor fi explicaÛi
în continuare.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
va_a rg este un macro care devine o expresie de acelaÕi tip Õi valoare cu urm|torul
scop m| puteÛi
argument contact| la:
de transferat. La prima utilizare a lui arg_p tr întoarce primul argument din
list|. prev_param este numele parametrului obligatoriu precedând imediat primul
argument opÛional
ANTAL Tiberiu din list|. Fiecare utilizare succesiv| întoarce urm|torul argument al
Alexandru
listei. Aceasta se face prin dereferenÛierea lui prev_param Õi apoi prin incrementarea lui
tel.: 0040-264-530918
pentru a poanta la urm|torul parametru. va_a rg foloseÕte tip pentru a realiza
e-mail: antaltiberiu@pcnet.ro
dereferenÛierea Õi localizarea urm|torului argument. La fiecare apel succesiv a lui va_a rg
se modific| prev_param pentu a poanta la urm|torul parametru din list|.
va_end ajut| funcÛia apelat| s| revin| la normal. va_end poate modifica pe
prev_param aÕa încât s| nu mai poat| fi folosit| decât dup| reapelarea lui va_a rg .

116
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
va_end va fi apelat| dup| ce va_a rg a citit to Ûi parametrii, altfel programul putând s| o
Facultatea ConstrucÛii de MaÕini
ia razna. de
Catedra Programele care
Mecanic| Õi urmeaz| ilustreaz| modul de lucru cu aceste macrodefiniÛii:
Programare
1 Curs
/* VAde
LSTlimbaj
1.C */C
2 #include<stdio.h>
3 #include<stdarg.h>
Copyright 2001. Toate drepturile sunt rezervate autorului.
4 #include<limits.h>
5
6 Multiplicarea acestui
void m inim (char *fordocument
m at, ...) în scop comercial este interzis|.
7 {
8 int
SudenÛii min;
participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
9 va_list arg_ptr;
document pentru uzul personal.
10 int arg;
11
12 SudenÛii
vaparticipanÛi
_start(a rg_la orice
ptr, form form|
at); de înv|Û|mânt cu plat| sau alte persoane doritoare
13 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
14 scop m|mputeÛi
in=v a_contact|
arg (arg _p
la: tr, int);
15 prin tf("%d ", min);
16
17 ANTAL Tiberiu
while Alexandru
((arg = va_arg(arg_ptr, int)) != INT_MAX)
18 {
tel.: 0040-264-530918
19 prin tf("%i ", a rg);
e-mail: antaltiberiu@pcnet.ro
20 if (min > arg) min=arg;
21 }
22
23 va _e nd (arg _p tr);
24 prin tf(form at, m in);
25 }
26
27 Conf. dr. ing. ANTAL Tiberiu Alexandru
int main(void)
28 {Universitatea Tenhic| din Cluj-Napoca
29 m inim
Facultatea ("\n M inim
ConstrucÛii deulMaÕini
este: % i\n ",1,12,2,3,4,5,3,INT_ M AX );
30
31
Catedra de Mecanic| Õi Programare
return 0;
32 Curs
} de limbaj C

Rezultate:
Copyright 2001. Toate drepturile sunt rezervate autorului.
1 12 2 3 4 5 3
Minimul este: 1
Multiplicarea acestui document în scop comercial este interzis|.
Pentru programul urm|tor, funcÛional în varianta prezentat| mai jos, v| propun s|
SudenÛii
încercaÛi participanÛi
s|-l faceÛi s|lalucreze
orice form| de înv|Û|mânt
cu valori superior
float în loc de doub lebugetar
. pot multiplica acest
document pentru uzul personal.
1 /* VA LST 2.C */
2 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
3 #include<stdio.h>
4
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
#include<stdarg.h>
5 scop m| puteÛi contact| la:
6 do ub le m ed ar(int n, d ou ble *m ax , ...)
7 {ANTAL Tiberiu Alexandru
8 double s, arg;
9
tel.: 0040-264-530918
int i;
10 e-mail:va_list
antaltiberiu@pcnet.ro
arg_ptr;
11
12 va _start(a rg_ ptr, m ax );
13
14 *m ax =va _a rg(a rg_ ptr, d ou ble);
15 prin tf("%5 .3f ", *m ax );

117
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
16 for (i=1;i<n;i++)
17
Facultatea
{
ConstrucÛii de MaÕini
18 s+= (arg Õi
Catedra de Mecanic| = Programare
v a_ arg (arg _p tr, dou ble));
19 Curs de limbajprin
C tf("%5 .3f ", arg);
20 if (*max < arg) *max=arg;
21 }
22
Copyright 2001. Toate drepturile sunt rezervate autorului.
23 va _e nd (arg _p tr);
24 Multiplicarea
return acestui
s/n; document în scop comercial este interzis|.
25 }
26
27
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int main(void)
28 {document pentru uzul personal.
29 double fmax;
30 prin
SudenÛii tf("\n M edla
participanÛi iaorice
a ritm etica de
form| este: %10.5 f\n ",cumplat|
înv|Û|mânt ed ar(4 , &fm
sau alteax , 1.0, 4.0,3.0,
persoane -4.0));
doritoare
31 prin tf("M ax im ul este: % f\n ", fm ax );
32
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
33 scop m|return
puteÛi 0;
contact| la:
34 }
ANTAL Tiberiu Alexandru
Rezultate:
tel.: 0040-264-530918
1.000 4.000 3.000 -4.000
e-mail: antaltiberiu@pcnet.ro 0.75000
Media aritmetica este:
Maximul este: 4.000000

Când argumente de tip char sunt transferate ca argumente variabile ele se convertesc
automat la tipul int. Similar, argumentele de tipul float se convertesc automat la tipul
doub le în cazul argumentelor variabile.
Conf. dr. ing. ANTAL Tiberiu Alexandru

8.7 Poantori la poantori


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
C permite
Catedra de declararea
Mecanic| Õide poantori la orice tip, inclusiv declararea unui poantor la un
Programare
poantor la un tip
Curs de limbaj C oarecare.
1 /* PTR PTR .C */
2
Copyright 2001. Toate
#include<stdio.h>
drepturile sunt rezervate autorului.
3
4 int main(void)acestui document în scop comercial este interzis|.
Multiplicarea
5 {
6 int a=7;
7
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar
int *pta;
pot multiplica acest
8 document
int pentru
**ptpta;uzul personal.
9
10 pta=&a;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
11 ptpta=&pta;
12
pot multiplica documentul
prin tf("%p
numai contra cost Õi cu acordul scris al autorului. În acest
a: [%i]\n ",&a ,a);
13 scop m|prin
puteÛi contact| la:
tf("%p pta: [%p] -> [%i]\n",&p ta,pta ,*pta );
14 prin tf("%p ptpta : [%p] -> [%i]\n",&p tpta,p tpta ,**ptp ta);
15 ANTAL Tiberiu Alexandru
16 retu rn(0 );
17
tel.: 0040-264-530918
18 e-mail:
} antaltiberiu@pcnet.ro

Rezultate:
0065FDF4 a: [7]
0065FDF0 pta: [0065FDF4] -> [7]

118
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
0065FDEC ptpta: [0065FDF0] -> [7]
Facultatea ConstrucÛii de MaÕini
Catedra anteriorÕiaProgramare
de Mecanic|
În programul este o variabil|
Curs de int
de tipul limbaj
, pta Ceste un poantor la un tip
int, iar ptpta este un poantor la un
Copyright
poantor de2001.
tipul Toate
int. Spa Ûiul datelor,
drepturile sunt în
rezervate autorului.
starea final|, se prezint| în Figura 11. În
desen m|rimeaacestui
Multiplicarea locaÛiilor simbolizate
document subcomercial este interzis|.
în scop
forma dreptunghiurilor este aceeaÕi. Am
presupus c| atât tipullaint
SudenÛii participanÛi cât Õform|
orice i poantorii
de înv|Û|mânt superior bugetar pot multiplica acest
se reprezint | pe 4 octe Ûi,
document pentru uzul personal. iar unui grup de Figura 11
4 octeÛi îi corespune câte un dreptunghi.
Deasupra fiec|rui dreptunghi st| scris| adresa de început a primului dintre cei 4 octeÛi
SudenÛii participanÛi
consecutivi, folosiÛi lalastocarea
orice form| de înv|Û|mânt
respectivei cu plat| sau alte persoane doritoare
variabile.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
8.8 Poantori la funct-ii
ANTAL Tiberiu Alexandru
În C, numele unei funcÛii este un poantor constant la începutul codului funcÛiei. Pentru c|
tel.:
numele0040-264-530918
funcÛiei este definit ca un poantor la funcÛia respectiv|, numele funcÛiei se poate
e-mail: antaltiberiu@pcnet.ro
atribui unei variabile poantor la funcÛie. O variabil| poantor la funcÛie poate fi transferat|
ca parametru unei alte funcÛii Õi poate fi folosit| într-o funcÛie pentru apelarea funcÛiei la
care poanteaz|. Modul declaraÛiei variabilei poantor la funcÛie se prezint| în continuare.

7:
Form a tip (*variabila_poantor_la_funct- ie) (lista
7 de p ara m etri)

Conf. dr.permis
Nu este ing. ANTAL Tiberiu
| efectuarea deAlexandru
operaÛii aritmetice cu o variabil| poantor la funcÛie. De
Universitatea
asemenea Tenhic|
ea poate "luadin Cluj-Napoca
valoarea" în urma unei atribuiri, numai a unei funcÛii cu acelaÕi
num|r de parametri Õi cu acelaÛi tip de valoare întoars| cu cele specificate în declaraÛia ei.
Facultatea ConstrucÛii de MaÕini
Un exemplu
Catedra se prezintÕi|Programare
de Mecanic| în programul urm|tor:
Curs de limbaj C
1 /* PTR FN C.C */
2 #include <stdio.h>
3
Copyright 2001. Toate drepturile sunt rezervate autorului.
#include <ctype.h>
4 #include <conio.h>
5 cha r iesire(in tacestui
Multiplicarea c); document în scop comercial este interzis|.
6 cha r fisie re(in t c);
7 cha r ed itare (int c);
8
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar
cha r altcara cter(in t c);
pot multiplica acest
9 document pentru uzul personal.
10 /* ptrfunctie se declara ca poantor la o functie ce primeste ca parametru de intrare
11 o valoareparticipanÛi
SudenÛii int si întoarce o vaform|
la orice loare de
cha r */
înv|Û|mânt cu plat| sau alte persoane doritoare
12 cha r (*ptrfun ctie)(in t);
13
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
14 scop
m ainm|
() puteÛi contact| la:
15 {
16 ANTAL int ch;
Tiberiu Alexandru
17 for(;;)
18
tel.: 0040-264-530918
{
19 e-mail: antaltiberiu@pcnet.ro
ch= tou pper(getch ());
20 sw itch (ch) {
21 case 'I': ptrfunctie=iesire; break;
22 case 'F': ptrfunctie=fisiere; break;
23 case 'E': ptrfunctie=editare; break;
24 default: ptrfunctie=altcaracter;

119
Capitolul
Conf. dr.8 -ing.
Poantori
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
25 }
26
Facultatea ConstrucÛii de MaÕini
/* aici se ape leaza fu nctia prin p oantoru l la ea */
27 Catedra de Mecanic| Õi Programare goto treispe;
if ('I' == (ptrfunctie)(ch))
28 Curs de} limbaj C
29
30 treis pe: p rintf("Ga ta, ai IES IT !\n");
31
Copyright
}
2001. Toate drepturile sunt rezervate autorului.
32
33 Multiplicarea
char iesire(intacestui
c) document în scop comercial este interzis|.
34 {
35 prin tf("\a i ap asa t %c s i esti in fun ctia: IE SIR E\ n",c);
36
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar
return c;
pot multiplica acest
37 document
} pentru uzul personal.
38
39 char fisiere(int
SudenÛii c)
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
40 {
41
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
prin tf("ai a pa sat % c si es ti in fu nctia : FISIER E\ n",c);
42 scop m|return
puteÛi c;contact| la:
43 }
44 ANTAL Tiberiu Alexandru
45 char editare(int c)
tel.: 0040-264-530918
46 {
47 e-mail:prin
antaltiberiu@pcnet.ro
tf("ai a pa sat % c si es ti in fu nctia : ED ITA RE \n ",c);
48 return c;
49 }
50
51 char altcaracter(int c)
52 {
53 prin tf("ai a pa sat % c si N U S TIU ce doresti ... \n",c);
54 return
Conf. dr. c;
ing. ANTAL Tiberiu Alexandru
55 }
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii
Aici linia cha de MaÕini
r (*ptrfun ctie)(in t) declar| un poantor cu numele ptrfu nctie la o funcÛie care
Catedra de Mecanic|
are un parametru deÕiintrare
Programare
int Õi întoarce o valoare char. Toate funcÛiile care sunt
Curs de limbaj C
apelate prin acest poantor la funcÛie întorc tipul char Õi un singur parametru de intrare
de tipul int.
Copyright 2001. Toate drepturile sunt rezervate autorului.
O variabil| poantor la o funcÛie ascunde o facilitate foarte puternic| de programare. Nu
recomand aceast
Multiplicarea | tehnic
acestui | de lucru
document încep
în scop |torilor, este
comercial am meÛionat-o întrucât conceptul
dar interzis|.
intimideaz|, fiind privit ca ceva dificil de abordat. Dup| cum vedeÛi nu este chiar aÕa!
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

120
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

9 Tablouri
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest

T
document pentru uzul personal.

pot
Un tablou
abloul este o colect- ie de date identice ca tip, distincte însa
de dimensiuni ale tabloului depinde de limbaj, dar în
7 prin indice . Num|rul
general,
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane nu estedoritoare
limitat. O
variabil| obiÕnuit| - un scalar - poate fi privit| ca un tablou cu dimensiunea zero.
multiplica
cu o documentul numai contra
singur| dimensiune cost Õi cu
este cunoscut acordul
sub numelescris al autorului.
de "vector", În acest
iar unul cu dou|
scop m| puteÛi
dimensiuni subcontact|
denumireala: de "matrice". În majoritatea limbajelor imperative, o referinÛ|
la un element de tablou se scrie sub forma a[i,j] unde, a este nu m ele tabloului , iar i Õi j
ANTAL
sunt Tiberiu
indici tabloului sunt de obicei stocate în locaÛii de memorie consecutive.
Alexandru
. Elementele
Limbajele difer| de obicei prin metoda de stocare a datelor pe rânduri continue sau pe
tel.: 0040-264-530918
coloane continue.
e-mail: antaltiberiu@pcnet.ro

Tablourile sunt folosite pentru stocarea unui grup de valori care se vor accesa într-o
ordine imprevizibil| (de exemplu, o structur| de dat| numit| list| se preteaz| mult mai
bine pentru stocarea unor valori care se acceseaz| secvenÛial).

9.1 Declararea tablourilor


Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Un tablou se
Facultatea declar| folsind
ConstrucÛii un tip , un n um e de variabil| Õi o list| de constante cuprinse
de MaÕini
între paranteze dreptunghiulare care definesc dim en siu nile tabloului.
Catedra de Mecanic| Õi Programare
Curs de limbaj C
Form a7: tip n um e[d im en siu ne 1][dim en siu ne 2] ... [dim en siu ne N ];

Copyright 2001. Toate drepturile sunt rezervate autorului.


Pentru a declara un tablou cu o singura7 dimensiune de 7 elemente de tipul int, cu numele
a , scriem:
Multiplicarea acestui document în scop comercial este interzis|.
int a[7];
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
În C este opentru
regul| uzul
c| spapersonal.
Ûiul pentru cele 7 elemente ale tabloului a se vor aloca consecutiv
în memoria fizic|. Astfel, putem spune de exemplu c| al doilea element este adiacent cu
SudenÛii
al treilea,participanÛi
al patrulea la
cuorice form| Õde
al cincelea înv|Û|mânt cu plat| sau alte persoane doritoare
.a.m.d.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Pentru
scop m|aputeÛi
declara un tablou
contact| la: cu 2 dimensiuni, prima de 5 , a doua de 3 de tipul float, cu
numele m , scriem:
ANTAL Tiberiu Alexandru
floa t m [5][3];
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
C poate lucra cu orice tipuri de elemente, inclusiv structuri sau reuniuni (care vor fi
discutate în capitolele urm|toare), cu excepÛia tipului void . Este obligatoriu ca între
parantezele dreptunghiulare s| fie scris| o expresie constant|, întreag| Õi pozitiv|. În
locul declaraÛiei anterioare a lui m se poate scrie:

121
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
#d efine D 1 5
Facultatea
#define D2 3
ConstrucÛii de MaÕini
Catedra de Mecanic|
floa t m [D1 ][D2 ]; Õi Programare
Curs de limbaj C
Nu sunt îns| corecte urm|toarele forme de declaraÛie:
int d1=5;
Copyright 2001. Toate drepturile sunt rezervate autorului.con st in t c1=5;
int d2=3 Õi const int c2=3
floa t m [d1][d2]; floa t m [c1][c2 ];
Multiplicarea acestui document în scop comercial este interzis|.

De Õi c1 ÕiparticipanÛi
SudenÛii c2 sunt evident constante,
la orice form| decompilatorul
înv|Û|mântnusuperior
va accepta aceast
bugetar | form
pot | de scriere.
multiplica acest
Între parantezele drepte pot
document pentru uzul personal. s | apar| numai expresii constante (termenii acestor expresii
sunt valori numerice constante).
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Un tablou este format din elemente. IniÛializarea tabloului presupune
IniÛializarea
pot multiplica documentul numai
iniÛializarea contra
fiec |rui cost Õi cu acordul
element scris al autorului.
de tablou. Sintactic, Îndefini
acest Ûia
tablourilor
scop m| puteÛi contact| la:
iniÛializatorului de tablou este recursiv| Õi are forma:

ANTAL Tiberiu Alexandru


<init- ializator>::= expresie constanta 7 | <{lista7 de init-ializare}> | <{lista7 de init-ializa re,}>
tel.:
<lista7 de init-ializare>::= <init-ializator> | <lista7 de init-ializare>, <init-ializator>
0040-264-530918
e-mail: antaltiberiu@pcnet.ro

7 de init-ializare
lista este o list| init-ializator separat| prin virgule. Fiecare init-ializator
din list| este, fie o expresie constant|, fie o alt| lista7 de init-ializare. Astfel, listele pot fi
cuprinse unele în altele.

Dac| tabloul are o singur| dimensiune, se scrie o singur| list| cu valorile de iniÛializare
Conf.
separatedr. prin
ing. ANTAL
virgule. Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
int ConstrucÛii
a[7] ={1,-4,2,28,7 de MaÕini
,67,99};
Catedra de Mecanic| Õi Programare
Sub
Cursaceast | form
de limbaj C | de scriere toate cele 7 elem en te ale tabloului unidimensional a sunt
iniÛializate. Ordinea valorilor din list| este Õi cea de atribuire la elementele de tablou.
Astfel, primul element -4 , etc. Dac| num|rul de valori este mai
Copyright 2001. Toate va lua valoarea
drepturile , al doilea autorului.
sunt1rezervate
mic decât cel al elementelor de tablou, iniÛializarea se face la fel, adic| în ordinea valorilor
din list| pân| când se epuizeaz| toate valorile listei. Elementele r|mase neiniÛalizate vor
Multiplicarea acestui document
fi iniÛializate automat cu valoarea în0scop
. comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int b[7 ]={1};
document pentru uzul personal.
Mai sus, primul element din b este iniÛializat cu valoarea 1 , celelalte cu valoarea 0 . Un alt
caz este când
SudenÛii num|rullade
participanÛi elemente
orice form| ale tabloului nucu
de înv|Û|mânt sunt specificate,
plat| dar suntdoritoare
sau alte persoane specificate
un num | r oarecare de valori pentru ini Û
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. Înnum
ializare. În acest caz compilatorul va fixa |rul
acest
de elemente ale tabloului
scop m| puteÛi contact| la: la cel al valorilor de iniÛializare, atribuirea acestora la elementele
de tablou facându-se în ordinea apariÛiei în list|.
ANTAL Tiberiu Alexandru
int c={1,2 ,3,4};
tel.: 0040-264-530918
e-mail:
Mai susantaltiberiu@pcnet.ro
c este un tablou unidimensional cu 4 elem en te , primul este iniÛializat cu valoarea
1 , al doilea cu valoarea 2 , etc.

IniÛializarea unui tablou bidimensional se face astfel:

122
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
int m[3][2]= {
Facultatea ConstrucÛii de MaÕini
{2, 8},
Catedra de Mecanic|{0, Õi Programare
7},
Curs de limbaj C {6, 7,},
};
Copyright 2001. Toate drepturile sunt rezervate autorului.
Tabloul m are dou | dimensiuni , p rim a cu 3 elem en te , a doua cu 2 . El corespunde unei
ma trice cu 3 linii Õi 2 coloane . Se iniÛializeaz| prim a linie cu 2 respectiv cu 8 , a doua cu
Multiplicarea acestui document în scop comercial este interzis|.
0 Õi 7 etc. ObservaÛi c| iniÛializatorii din linia 3 au o virgul| dup| ultima expresie
constant|. Aceste virgule sunt permise, dar nu obligatorii Õi separ| o expresie constant|
SudenÛii
de alta. participanÛi la orice
Cele care separ | oform|
list| de înv|Û|mânt
(lista superior) bugetar
7 de init-ializare de alta pot
saumultiplica acest
un iniÛializator
init- ializator
(document pentru sunt îns| obligatorii.
uzul personal.
) de altul

SudenÛii Nu se poate specifica un factor de repetiÛie pentru iniÛializ|ri sau


Limit|ri ale participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica iniÛializa numai
documentul un element “dinÕi mijloc”,
contra cost f|rscris
cu acordul | inialÛializarea
autorului.elementelor
În acest
iniÛializ|rilor
anterioare.
scop m| puteÛi contact| la:

9.2 Accesul la elementele de tablou


ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Numerotarea elementelor de tablou începe de la zero.
e-mail: antaltiberiu@pcnet.ro
1 /* TA B1.C */
2 #include <stdio.h>
3 int main(void)
4 {
5 int a[7], d1, i;
6
7
Conf. dr. ing. ANTAL Tiberiu Alexandru
d1=siz eof a/ sizeof a[0 ]; /* d1 = 7 nr. elem entelor de tab lou */
8 Universitatea Tenhic| din Cluj-Napoca
9 Facultatea
/* ConstrucÛii
eleme ntele prim esc de MaÕini
valori intr-o ord ine oarec are */
10 Catedra de Mecanic| Õi Programare a[1+2]=3; a[3/2]=1; a[2*2]=7;
a[0]=5; a[2]=13; a[5]=67; a[6]=28;
11
12
Curs deprin
limbaj C
tf("Ele m en tele ta blou lui a su nt: ");
13
14 Copyright 2001. Toate drepturile sunt rezervate autorului.
for (i=0;i<d1;i++)
15 prin tf("%-4 i", a[i]);
16
17
Multiplicarea acestui document în scop comercial este interzis|.
prin tf("\n Ind icii ta blou lui a sunt: ");
18
19 SudenÛii
forparticipanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
(i=0;i<d1;i++)
20 prin tf("%-4 i", i);
document pentru uzul personal.
21
22 prin tf("\n Ad resele elem en telor s un t: ");
23 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
24 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
for (i=0;i<d1;i++)
25 scop m| puteÛiprin tf("%-9
contact| p", & a[i]);
la:
26 prin tf ("\n ");
27
28 ANTAL Tiberiu
return 0; Alexandru
29 }tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro Figura 12
Rezultate:
Elementele tabloului a sunt: 5 1 13 3 7 67 28
Indicii tabloului a sunt: 0 1 2 3 4 5 6
Adresele elementelor sunt: 0065FDDC 0065FDE0 0065FDE4 0065FDE8 0065FDEC 0065FDF0 0065FDF4

123
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Observa
FacultateaÛi cConstrucÛii
| adresele elementelor
de MaÕini de tablou sunt consecutive. Primul element are indicele
zero , al doilea unu , ultimul indice ia valoarea num|rului total de elemente ale tabloului
Catedra de Mecanic| Õi Programare
minus o unitate. În Figura 12 se prezint| spaÛiul de date al programului corespunz|tor
Curs de limbaj
variabilei tablouCa . Tabloul are o dimensiune Õi 7 ele m en te . Conform celor spuse, indicii
pot varia de la 0 la 6=7-1 . În C nu se verific| dac| indicele se încadreaz| în domeniul
Copyright
permis. Este 2001. Toate
simplu s| drepturile sunt rezervate
scriem de exemplu autorului.
a[7]=0 care are un indice incorect. Pentru acest
caz, orice ar fi stocat în locaÛiile de memorie urm|toare lui a[6] s-ar suprascrie cu valoarea
lui a[7], valorileacestui
Multiplicarea numerice stocateînacolo
document scopprin intermediul
comercial altor variabile devenind corupte.
este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
9.3 Operatorul de indexare al
document pentru uzul personal.

tablourilor
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
7:
Form a expresie1[expresie2]

ANTAL Tiberiu Alexandru


O expresie1
tel.: urmat| de operatorul [expresie2] specific| indexarea unui tablou. Una dintre
0040-264-530918
expresii trebuie s| fie un poantor sau un tip tablou, adic| s| fie declarat| sub una dintre
e-mail: antaltiberiu@pcnet.ro
formele: tip* , tip[ ] . Cealalt| trebuie s| fie de tip întreg. Forma de utilizare comun| este
cea în care expresia de tip întreg este între parantezele drepte.

Operatorul adres| este comutativ, deci expresie1[expresie2] Õi expr esie2[exp resie1] sunt
echivalente pentru c| rezultatul operatorului de indexare se calculeaz| prin definiÛie cu
expresia: *((exp resie2)+(expre sie1 )).
Conf. dr. ing. ANTAL Tiberiu Alexandru
int a[10],a2; Tenhic| din Cluj-Napoca
Universitatea
a2 =a[1];
Facultatea ConstrucÛii de MaÕini
a2 =1[a ];
Catedra de Mecanic| Õi Programare
Curs
Primul de element
limbaj Cal taboului este 0 . Astfel, domeniul indicelui pentru un tablou cu o
dimensiune Õi n elemente este de la tablou[0] pân| la tablou[n-1] .
Copyright 2001. Toate drepturile sunt rezervate autorului.

9.4 Conversia numelor de tablouri în


Multiplicarea acestui document în scop comercial este interzis|.

poantori
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
Dac| tipul unei expresii sau subexpresii este "tablou cu elemente de tipul T", valoarea
acestei expresii se va descompune într-un poantor la primul element din tablou, iar tipul
SudenÛii
expresieiparticipanÛi
va fi poantorla la
orice form|
tipul de înv|Û|mânt
T. Aceast | conversie cunu
plat| saurealiza
se va alte persoane doritoare
dac| expresia este
pot multiplica
operandul urmdocumentul numaioperatorul
|torilor operatori: Õi cu |acordul
contra costadres scris al autorului.
(& ), operatorul În acest
de incrementare (++ ),
scop m| puteÛi contact| la:
operatorul de decrementare (-- ) sau operatorul sizeof.

1 /* TA B2.C
ANTAL */
Tiberiu Alexandru
2 #include<stdio.h>
tel.: 0040-264-530918
3
4 e-mail: antaltiberiu@pcnet.ro
int main(void)
5 {
6 floa t x[10];
7 float *ptx, *pt1x;
8
9 pt1x= &x[0 ];
124
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
10 ptx=x;
11
Facultatea ConstrucÛii de MaÕini
12 Catedra de
prin tf("ad resa Õi
Mecanic| Programare
prim ulu i elem en t (x[0]) din tab lou l x es te: %p \n ", &x [0]);
13 Curs deprin
limbaj C = %p si pt1x =%p ", ptx , pt1x );
tf("ptx
14
15 return 0;
Copyright
16 }
2001. Toate drepturile sunt rezervate autorului.

Multiplicarea
Rezultate: acestui document în scop comercial este interzis|.
adresa primului element (x[0]) din tabloul x este: 0065FDD0
ptx= 0065FDD0
SudenÛii si pt1x
participanÛi =0065FDD0
la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
În Figura 13 se prezint| spaÛiul de
date al programului TAB2.C.
SudenÛii
ObservaÛparticipanÛi
i c| adresa la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
primului
element de tablou se poate g|sicontra cost Õi cu acordul scris al autorului. În acest
pot multiplica documentul numai
scop m|dou
prin puteÛi contact| la:
| metode, fie prin
aplicarea operatorului adres|
ANTALprimului
asupra Tiberiuelement
Alexandru de tablou,
care se scrie &x[0], fie prin
tel.: 0040-264-530918
aplicarea aceluiaÕi operator asupra Figura 13
e-mail: antaltiberiu@pcnet.ro
numelui tabloului, care se scrie & x .
Adresa primului element se converteÕte într-un poantor constant la primul element al
tabloului, motiv pentru care valoarea lui nu se poate modifica. Orice încercare de
modificare a acestei adrese este sancÛionat| de compilator, lucru normal din moment ce
dac| aceast| adres| ar putea fi modificat|, compilatorul ar putea "uita" adresa de început
a tabloului. Ca urmare a conversiei prezentate la operatorul de indexare se poate afirma
Conf. dr. ing.
mai mult. În CANTAL
numele Tiberiu
unui tablou poate fi folosit ca un poantor Õi invers, se poate indexa
Alexandru
un poantor ca un
Universitatea tablou.
Tenhic| Dac
din | x este un tablou unidimensional, urm|toarele expresii sunt
Cluj-Napoca
echivalente:
Facultatea ConstrucÛii de [i]),
(x + i) == &(x MaÕini*(x + i) == x[i]
Catedra de Mecanic| Õi Programare
limbaj C Exist| câteva diferenÛe între un poantor la un tablou (ptx , pt1x ) Õi un
Curs deîntre
DiferenÛe tablou (x[D1] ). Prima este alocarea de memorie. La declararea unui
tablou Õi poantor
tablou, compilatorul aloc| spaÛiul de memorie specificat prin num|rul de
laCopyright
tablou 2001. Toate drepturile sunt rezervate autorului.
elemente ale dimensiunii automat. La declararea unui poantor la un
tablou, utilizatorul trebuie s| aloce explicit spaÛiul pe heap prin folosirea
Multiplicarea
uneia dintre funcacestui
Ûiile mdocument
allo c() sauîn scop comercial
calloc() , eventualeste interzis|.
s| atribuie poantorului o adres| a unui
spaÛiu deja alocat. A doua diferenÛa7 este aceea c| numele tabloului devine un poantor
constant participanÛi
SudenÛii la primul element
la oricedeform|
tablou.
deFiind poantorsuperior
înv|Û|mânt constant, valoarea
bugetar potlamultiplica acest|
care poanteaz
nu se poatepentru
document modifica, concluzie nu se pot efectua manipul|ri ale respectivei adrese. De
uzulînpersonal.
exemplu, nu se poate scrie x++ , îns| se poate scrie ptx++ .
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare

9.5 Calculul pozit-iei s- i a valorii celui


pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

de
ANTAL al i-elea
Tiberiu Alexandruelement de tablou
tel.: 0040-264-530918
Elementul i - al tabloului x (vezi Figura 13) este accesat prin expresia x[i] . Pentru tabloul
e-mail: de reali - elemente de tipul float - procedura de calcul este urm|toarea:
antaltiberiu@pcnet.ro
x unidimensional
1. Valoarea întreag| a lui i este înmulÛit| cu num|rul de octeÛi folosiÛi pentru
stocarea tipului float. Aceast| valoare calculat| va reprezenta a i -a poziÛie a tipului float
faÛ| de adresa de început a lui x Õi se numeÕte offset sau, pe româneÕte, deplasament .
2. Aceast| valoare se adun| la valoarea poantorului x , pentru a forma o adres| care

125
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
se afl| la i pozi
Facultatea Ûii float fa
ConstrucÛii deÛ|MaÕini
de adresa lui x .
3. Se aplic | operatorul
Catedra de Mecanic| Õi Programare de indirectare (* ) asupra acestei adrese, valoarea rezultat|
fiind valoarea elementului al i -lea din x .
Curs de limbaj C
Conform celor spuse putem scrie x[i] = *(x +i*siz eof(flo at)) .
Copyright 2001. Toate drepturile sunt rezervate autorului.
x[0] reprezint| valoarea primului element din x , din moment ce offsetul corespunz|tor lui
este 0 . O expresie
Multiplicarea
x acestui de forma x[5]
document refera
în scop 7 elementul
comercial este cu offsetul 5 din x , adic| al 6 -lea
interzis|.
element din tablou.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest

9.6 Aritmetica poantorilor


document pentru uzul personal.

Puterea limbajul C vine


SudenÛii participanÛi din form|
la orice modulde consistent
înv|Û|mântÕi sistematic
cu plat| saudealte
integrare într-un
persoane tot al
doritoare
tablourilor,
pot multiplicapoantorilor
documentul Õi numai
al aritmeticii adreselor.
contra cost Õi cu acordul Ûii valide
Operascris cu poantori
al autorului. sunt:
În acest
atribuirea între poantori
scop m| puteÛi contact| la:de acela Õi tip; adunarea sau sc| derea unui poantor la un întreg;
adunarea, sc|derea Õi comparaÛia între elementele aceluiaÕi tablou; atribuirea Õi
ANTAL ÛTiberiu
compara ia cu NULL .
Alexandru
tel.: 0040-264-530918
Este corect| adunarea unui poantor la un element de tablou cu un
Adunarea dintre un
e-mail: antaltiberiu@pcnet.ro
întreg. Adunarea lor decurge astfel: valoarea întreag| este convertit|
poantor Õi un întreg
într-un offset prin înmulÛirea acesteia cu dimensiunea elementului de
tablou la care poanteaz| poantorul, apoi se face suma dintre valoarea
stocat| în poantor Õi offset. Suma va fi un poantor de acelaÕi tip cu poantorul original. El
va poanta la un obiect al aceluiaÕi tablou, pe baza valorii de offset calculate. Dac| ptr este
un poantor la un element de tabloul de tipul T , atunci ptr+1 va poanta la urm|torul element
din tabloul
Conf. de tipul
dr. ing. ANTAL T . Dac| suma
Tiberiu rezultat| este în afara limitelor tabloului, rezultatul este
Alexandru
nedefinit.
Universitatea Tenhic| din Cluj-Napoca
1
Facultatea ConstrucÛii de MaÕini
/* TA B3.C */
2 Catedra de Mecanic| Õi Programare
#include<stdio.h>
3 Curs de limbaj C
4 int main(void)
5 {
6
Copyright 2001. Toate drepturile sunt rezervate autorului.
int x[5 ]={1,2,3 ,4,5};
7
8 Multiplicarea
int *ptr; acestui document în scop comercial este interzis|.
9
10 ptr=x;
11
SudenÛii participanÛi
prin tf("ptr
la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
= % p, *ptr = %i, x [0] =%i\ n", ptr, *ptr, x [0]);
12 document pentru uzul personal.
13 ptr++;
prin tf("ptr+
14 SudenÛii + = %pla
participanÛi , *ptr=
orice%form|
i, x[1] de
=% i\n ", ptr, *ptr
înv|Û|mânt cu, x[1]);
plat| sau alte persoane doritoare
15
16
multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
potptr+=3;
17 scop m|tf("ptr+
prin puteÛi contact| la: = %i, x [4] =%i\n ", ptr, *ptr , x[4]);
=3 = % p, *ptr
18
return
19 ANTAL 0;
Tiberiu Alexandru
20 }
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Rezultate:
ptr = 0065FDE4, *ptr= 1, x[0] =1
ptr++ = 0065FDE8, *ptr= 2, x[1] =2
ptr+=3 = 0065FDF4, *ptr= 5, x[4] =5

126
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
În Figura ConstrucÛii
Facultatea de|MaÕini
14 se prezint spaÛiul de
date al programului anterior
Catedra de Mecanic| Õi Programare
( TA B3 .C ). Poantorul ptr este
Curs de limbaj
iniÛializat C primului element
cu adresa
al tabloului un idim ens ional x cu 5
Copyright
elem en te de 2001. Toate
tipul int.drepturile
printf() dinsunt rezervate autorului.
linia 11 va afiÕa 1 pentru valoarea
stocat | la adresa
Multiplicarea poantat
acestui | de ptr.înLa
document scop comercial
Figura 14 este interzis|.
incrementarea poantorului, adresa
stocat | înparticipanÛi
SudenÛii acesta nu valafiorice form|, ci
0065FDE5 de0065FDE8.
înv|Û|mânt Compilatorul Õtie c|pot
superior bugetar este un poantor
ptrmultiplica acest
la tipul int , care se stocheaz
document pentru uzul personal. | pe 4 octe Û i ( sizeof (int) = 4 ). Astfel, va aduna 4 la adresa
0065FDE4 , pentru incrementare. Putem spune c| la acest tip de adunare, valoarea
num|rului întreg adunat la adresa stocat| într-un poantor se "scaleaz|" prin dimensiunea
SudenÛii
obiectuluiparticipanÛi la orice
la care poanteaz form| de înv|Û|mânt cu plat| sau alte persoane doritoare
| acesta.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| Este la:
corect| sc|derea unui întreg dintr-un poantor. Aceasta se va
Sc|derea dintre un
realiza în aceleaÕi condiÛii cu adunarea.
poantor Õi un întreg
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Este corect| Õi adunarea sau sc|derea a doi poantori la obiecte de acelaÕi
e-mail: antaltiberiu@pcnet.ro
Adunarea Õi
tip. Rezultatul este un întreg cu semn reprezentând valoarea offsetului
sc|derea a
dintre cele dou| obiecte poantor. Poantorii consecutivi difer| prin valoarea
doi poantori
1. Valoarea este nedefinit| dac| poantorii nu poanteaz| la acelaÕi obiect
tablou.

1 /* TA B4.C */
2 Conf. dr. ing. ANTAL
#include<stdio.h> Tiberiu Alexandru
3 Universitatea Tenhic| din Cluj-Napoca
4 int main(void)
5
Facultatea
{
ConstrucÛii de MaÕini
6 Catedradode
ubMecanic| Õi Programare
le v[5]={1.1,2.2,3 .3,4.4,5.5};
7 Curs de limbaj C
8 double *ptr1, *ptr2;
9
10
Copyright 2001. Toate drepturile sunt rezervate autorului.
ptr1=v+1;
11 ptr2=v+4;
12 Multiplicarea acestui document în scop comercial este interzis|.
13 prin tf("ptr1 = %p , *ptr1= %lf, v[0] =%lf\ n", p tr1, *ptr 1, v[0]);
14 prin tf("ptr2 = %p , *ptr2 = %lf, v [4] =%lf\ n", p tr2, *p tr2, v[4]);
15
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar
prin tf("ptr2 -ptr1 = %i\ n", p tr2-p tr1);
pot multiplica acest
16 document pentru uzul personal.
17 return 0;
18 }SudenÛii participanÛi
la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Rezultate:
scop m| puteÛi contact| la:
ptr1 = 0065FDD8, *ptr1= 2.200000, v[0] =1.100000
ptr2 = 0065FDF0, *ptr2= 5.500000, v[4] =5.500000
ANTAL Tiberiu
ptr2-ptr1 = 3 Alexandru
tel.: 0040-264-530918
În Figura
e-mail: 15 se prezint| spaÛiul datelor pentru programul anterior (TA B4 .C ).
antaltiberiu@pcnet.ro
Compilatorul realizeaz| sc|derea scalând valoarea g|sit| conform tipului la care
poanteaz| poantorii ptr1 = 0065FDD8 Õi ptr2 = 0065FDF0 , deci ptr2-ptr1=24. În urma
scal|rii acestei valori prin dimensiunea tipului la care poanteaz| poantori (tipul doub le se

127
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
stocheaz
Facultatea | ConstrucÛii
pe 8 octe deÛi,MaÕini
adic|
sizeof(doub le) = 8 ) se obÛine 24/8
Catedra de Mecanic| Õi Programare
= 3.
Curs de limbaj C
OperaÛia de
Compararea
Copyright 2001. Toate
c o m drepturile
p a r a Û i e sunt rezervate autorului.
poantorilor
dintre doi
Multiplicarea acestui p o adocument
n t o r i sîn e Figura
scop comercial
15 este interzis|.
poate realiza numai dac| aceÕtia
poanteaz | la acelaÕi tablou.
SudenÛii participanÛi la oriceÎnform|
afara acestui caz, rezultatul
de înv|Û|mânt compara
superior bugetarÛieipot
este nedefinit.acest
multiplica Este
corect | compara Ûia unui
document pentru uzul personal. poantor cu valoarea NULL . Un caz special de compara Ûie corect |
este când adresa primului element dup| ultimul din tablou este folosit| într-o comparaÛie
sau într-o expresie aritmetic|.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul Operanumai
Ûiile aritmetice cu Õipoantori
contra cost cu acordul
Ûin scris al autorului.
cont de În| acest
tipul de dat la care
ConsistenÛa
scop m| puteÛi contact| la:
aritmeticii adreselor
poanteaz | poantorul. Toate manipul|rile de poantori iau automat în
considerare tipul la care poanteaz| poantorul. De exemplu, dac|
ANTAL Tiberiu Alexandru increment|m un poantor la tipul char, noua adres| este mai mare cu
un
tel.:octet (o unitate), iar dac| se incrementeaz| un poantor la float, noua adres| va fi cu 4
0040-264-530918
octe Ûi - spa
e-mail: Ûiul de RAM folosit pentru stocarea unui tip float - mai mare.
antaltiberiu@pcnet.ro

9.7 Tablouri multidimensionale


Un tablou se poate construi din elemente de tip aritmetic, poantor, structur|, reuniune
sau un alt tablou. Pentru ultimul caz se obÛin tablouri multidimensionale. DeclaraÛia unui
tablou de ing.
Conf. dr. elemente
ANTALfloat cu numele
Tiberiu 7 dimensiuni Õi cu nu m ere le de e lem en te
m , de doua
Alexandru
3 , respectiv 5 se scrie:
Universitatea Tenhic| din Cluj-Napoca
Facultatea
#d efine D 1 3
ConstrucÛii de MaÕini
Catedra de
#define D2 Mecanic|
5 Õi Programare
Curst m
floa de[D1
limbaj
][D2 ]; C

m este un 2001.
Copyright tablouToate
format din 3 articole
drepturile de tipul autorului.
sunt rezervate tablou, fiecare astfel de articol este la
rândul lui un tablou cu 5 elemente. Astfel, oricare din expresiile m , m [i] sau m [i][j] sunt
corecte. Primele dou| au tipul tablou, respectiv m este un tablou cu 3 elemente de tipul
Multiplicarea acestui document în scop comercial este interzis|.
tablou, cu elementul de tip tablou de 5 elemente float, iar m [i] este un tablou cu elementele
de tipul tablou cu 5 elemente float. Ultima expresie are tipul float Õi reprezint| valoarea
SudenÛii
numeric|participanÛi
a elementuluila în
orice
cauzform| de Ûînv|Û|mânt
|. Opera iile de evaluare superior bugetar
a valorilor pot multiplica
elementelor acest
de tablouri
se aplic| Õipentru
document dac| e1 este un tablou, iar e2 un indice, e1[e2] este echivalent| cu
uzul personal.
aici. Astfel,
*((e1)+(e2 )), deci se poate scrie m [i][j] = *(m [i]+j) . Asociativitatea operatorului [ ] este de la
stânga
SudenÛiilaparticipanÛi
dreapta, decila orice
m [i][j]form| de înv|Û|mânt
= *((m [j]) + (i*sizeof(mcu . Regulile
plat|
[j]))) depersoane
sau alte evaluaredoritoare
ale acestei
expresii Û
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. Îno acest
in de aritmetica poantorilor. m [j] este un poantor la care se va aduna valoare
întreag | . În adunarea
scop m| puteÛi contact| la: *((m[j]) + (i*siz eof(m [j]))), sizeof(m [j]) este m | rimea unui tablou de
reali (float) cu num|rul de elemente D2. Se poate scrie astfel: *((m[j]) + i*sizeo f(m [j])) = *(m [j]
+ i*D2*sizeo f(float)). În final, expresia *(m[j] + i*D2* size of(floa t)) se converteÕte în
ANTAL Tiberiu Alexandru
*((m +j*size of(floa t))+i*D2*sizeo f(float)). Întrucât m [j] este un poantor, operatorul de
tel.: 0040-264-530918
indirectare nu se aplic| pentru calculul adresei acestuia.
e-mail: antaltiberiu@pcnet.ro
Dup| cum am spus, C face automat toate aceste transform|ri Õi calcule. ObservaÛi c|
prima dimensiune a tabloului (D1 ) nu particip| la calculele pentru determinarea poziÛiei
unui element. Din acest motiv, când tablourile vor fi transmise ca parametri de funcÛii,
prima dimensiune poate fi omis|. Prima oar| va fi evaluat| subexpresia cuprins| între
128
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
parantezele de MaÕinicare Ûine de j, apoi va fi evaluat| subexpresia care Ûine de
cele mai interioare,
Facultatea ConstrucÛii
i . Ultimul indice, j , este evaluat în expresie înaintea celuilat, i . Din acest motiv se zice c|
Catedra de Mecanic| Õi Programare
el variaz| mai repede. Elementele corespunz|toare ultimului indice vor fi stocate în zone
Curs de limbaj
continue de RAM. C Dac| se face corespondenÛa cu elementele unei matrice, m , unde i este
i,j
rândul Õi j coloana, se poate spune c| tabloul cu dou| dimensiuni este stocat pe rânduri.
Copyright 2001. Toate drepturile sunt rezervate autorului.
1 /* TA B5.C */
2 #include <stdio.h>
Multiplicarea acestui document în scop comercial este interzis|.
3 #d efine D 1 3
4 #define D2 2
5 SudenÛii
#define participanÛi
TIP int la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
6 document pentru uzul personal.
7 TIP m [D1 ][D2 ]= {{1,2},
8 {3,4},
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
9 {5,6}
10 pot multiplica documentul
}; numai contra cost Õi cu acordul scris al autorului. În acest
11 scop m| puteÛi contact| la:
12 int main(void)
13 {
ANTAL Tiberiu Alexandru
14 int i,j;
15 tel.: 0040-264-530918
16 e-mail:char
antaltiberiu@pcnet.ro
*ptr;
17
18 for(i=0;i<D1;i++)
19 {
20 for(j=0;j<D2;j++)
21 prin tf("%4 i ",m [i][j]);
22 prin tf("\n ");
23 }
Conf. dr. ing. ANTAL Tiberiu Alexandru
24
25 Universitatea Tenhic|
prin tf("\n "); din Cluj-Napoca
26 Facultatea ConstrucÛii de MaÕini
for(i=0;i<D1;i++)
27 Catedra{ de Mecanic| Õi Programare
28
Curs de limbajfor(j=0;j<D2;j++)
C
29 printf("% 4i ",*(*(m +i)+j));
30 prin tf("\n ");
31 Copyright
} 2001. Toate drepturile sunt rezervate autorului.
32
33 prin tf("\n ");
Multiplicarea acestui document în scop comercial este interzis|.
34 p tr=m ;
35 for(i=0;i<D1;i++)
36 SudenÛii
{ participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
37 document pentrufor(j=0;j<D2;j++)
uzul personal.
38 prin tf("%4 i ",*(ptr + i*D 2*sizeo f(TIP ) + j*size of(TIP)));
39 prin tf("\n ");
40 SudenÛii
} participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
41 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
42 scop m|return
puteÛi 0;
contact| la:
43 }

ANTAL Tiberiu Alexandru


Rezultate:
tel.:10040-264-530918
2
e-mail:
3 antaltiberiu@pcnet.ro
4
5 6

1 2
3 4
5 6

129
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
1 2
Facultatea
3 4
ConstrucÛii de MaÕini
Catedra
5 6 Mecanic| Õi Programare
de
Curs de limbaj C
Linia 21 prezint| modul de acces clasic - prin operatorul de indexare - la valorile
elementelor
Copyright 2001. unuiToate
tabloudrepturile
bidimensional. prezint| un mod de acces care foloseÕte
Linia 29 autorului.
sunt rezervate
formulele de conversie ale adreselor de tablou în poantori, iar linia 38 implementeaz|
formulele
Multiplicarea folosite de C
acestui pentru calculul
document în scoppoziÛiei în RAM
comercial a unui element de tablou.
este interzis|.
Voi numi în continuare tabloul cu dou| dimensiuni matrice.
SudenÛii participanÛi
În programare, la orice
matricea form|
este de înv|Û|mânt
organizat | pe rându superior
ri Õi
bugetar pot multiplica acest
document
coloane . Înpentru
Figurauzul 16 se personal.
prezint| organizarea conceptual|
a matricei m[3][2] cu 3 rându ri Õi 2 coloane. Reprezentarea
SudenÛii
în RAM aparticipanÛi
matricei este dat| în
la orice form| de înv|Û|mânt
Figura Ûia sau alte persoane doritoare
cu plat|
17. Prin declara
, m devine
pot multiplica
m[3][2] un poantornumai
documentul la un tablou
contraale c|rui
cost Õi cu
elemente
acordul scris al autorului. În acest
sunt
scop m[0] , m[1] Õcontact|
m| puteÛi i m[2]. Lala:
rândul lui, m[0] este un poantor la
un tablou ale c|rui elemente sunt m[0][0] Õi m[0][1]. În
general, un element
ANTAL Tiberiu m [i][j] se poate accesa prin formula:
Alexandru Figura 16
m [i][j]= *(m [i]+j) . Cunoscând c| m[i] se descompune în *(m+i)
tel.: 0040-264-530918
se mai poate scrie m [i][j]= *(*(m + i)+j) . Concluzionând, toate expresiile care urmeaz| vor
e-mail: antaltiberiu@pcnet.ro
referi valoarea aceluiaÕi element m de tipul TIP din matricea M
i,j D1xD2 :

m [i][j]
*(m [i]+j)
*(*(m +i)+j)
*(m +i*D 2*sizeo f(TIP )+j*size of(TIP))

Conf.
Dac| dr. ing. ANTAL
tabloul Tiberiu Alexandru
este tridimensional va
Universitatea
avea Tenhic|Asociativitatea
3 indici. din Cluj-Napoca
Facultatea
operatorului ConstrucÛii
[ ] este de MaÕini
la stânga la
dreapta.
Catedra de Pentru Õi Programare
calcularea
Mecanic| adresei la
care
Curseste stocat|Cvaloarea selectat| prin
de limbaj
indici se evalueaz| num e[indice1] .
Adresa
Copyrightcare Toate| drepturile
2001.rezult din adunarea
sunt rezervate autorului.
adresei lui n um e cu offsetul indice1
formeaz| o expresie poantor, apoi
Multiplicarea acestui document în scop comercial este interzis|.
offsetul lui indice2 se adun| la expresia
anterioar| pentru a forma o nou|
SudenÛii
expresie participanÛi la orice form|pân
poantor, continuându-se de|înv|Û|mânt superior bugetar pot multiplica acest
document
la epuizareapentru uzul personal.
indicilor. Operatorul de
indirectare (* ) se aplic| numai dup|
evaluarea ultimului
SudenÛii participanÛi indice.
la orice form| Fie
de înv|Û|mânt cu plat| sau alte persoane doritoare
declara Ûiile:
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la: Figura 17
#d efine D 1 3
#define D2 4
ANTAL
#define Tiberiu
D3 5 Alexandru
tel.:
int T30040-264-530918
d[D 1][D2][D 3];
int i, *ptrT
e-mail: 3d , (*ptr prfT3d )[D3 ];
antaltiberiu@pcnet.ro
În exemplul de mai sus, s-a declarat un tablou multidimensional T3d de 3 elemente,
fiecare element fiind un tablou de 4 x 5 (D2 x D3) valori de tipul int . O referinÛ| la un
element al unui astfel de tablou apare în expresia i=T 3d [0][0][1];

130
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Generalizând cele discutate
Facultatea ConstrucÛii mai sus se poate spune c| tablourile multidimensionale sunt
de MaÕini
stocate pe linii, deci ultimul
Catedra de Mecanic| Õi Programare indice variaz| cel mai repede. În consecinÛ|, expresia
T3d[0][0][2] va referi urm|torul element de tablou din RAM, adic| pe cel de al 3-lea.
Curs de limbaj C
G|sirea valorii lui T3d[2][1][3] se face astfel:
Copyright 2001. Toate
1. Primul indice drepturile sunt rezervate
r este multiplicat autorului.unui tablou int de 4 x 5 (D2 X
cu dimensiunea
D3) elemente. Acest rezultat va poanta la cel de al 3 -lea tablou 4 x 5 .
2. Cel de
Multiplicarea al doilea
acestui indice 1 în
document este multiplicat
scop comercialcueste
dimensiunea
interzis|. unui tablou int de 5 (D3)
elemente Õi adunat la adresa reprezentat| de T3d[2].
SudenÛii 3. participanÛi
Fiecare element al tabloului
la orice form| de de 5 elemente
înv|Û|mânt este debugetar
superior tipul intpot
, deci indicele acest
multiplica final,
3 , este multiplicat cu lungimea
document pentru uzul personal. lui int înainte de adunarea lui la T3d [2][1] .
4. Operatorul de indirectare este aplicat valorii poantor, rezultatul fiind elementul
int de la acea adres|.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
Formula documentul
de calcul numaiaccesul
final| pentru contralacost Õi cu acordul
valoarea scris
T3d[i][j][k] al autorului. În acest
, este:
scop m| puteÛi contact| la:
*(((T3d + i*D3*D 2*sizeo f(int)) + j*D 2*sizeo f(int)) + k *size of(int));
ANTAL Tiberiu Alexandru
Câteva cazuri pentru care operatorul de indirectare nu mai este aplicat sunt:
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
ptrT3 d=T3 d[2 ][3];
ptrptrT3 d=T3 d[1];

În primul caz, expresia T3d[2][3] este o referinÛ| valid| la tabloul tridimensional T3d ,
referindu-se un tablou unidimesional cu D3 elemente. Pentru c| valoarea poantorului
adreseaz| un tablou, operatorul de indirectare nu este aplicat. Similar, rezultatul T3d [1]
este
Conf.o dr.
valoare poantor Tiberiu
ing. ANTAL la un tablou de 2 dimensiuni (D2 x D3).
Alexandru
Universitatea Tenhic| din Cluj-Napoca

9.8 Transferul tablourilor s- i funct-iilor


Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
ca parametri de funct-ie
Copyright 2001. Toate drepturile sunt rezervate autorului.
Dac| parametrul unei funcÛii este tab lou de tip ul T , declaraÛia este astfel transformat|
încât se va citi "poan to r la ti pu l T ". Dac| un parametru este declarat ca funct-ie ce
Multiplicarea
întoarce tipu lacestui document
T , aceasta | astfel încât
în scop comercial
se transform este interzis|.
se va citi "poantor la funct-ie ce
întoarce tipu l T ". FuncÛia va putea întoarce o valoare de orice tip aritmetic, structur|,
reuniune, poantor saulavoid
SudenÛii participanÛi oricedar nu de
form| detipul funcÛie superior
înv|Û|mânt sau tipul bugetar
tablou. pot multiplica acest
document pentru uzul personal.
9.8.1 Transferul unui tablou unidimensional
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Dac| avem un tablou unidimensional declarat astfel: int a[5], el se transfer| unei funcÛii
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
cu numele m ed ia_ aritm etic a() , scriind media_aritmetica(a). Compilatorul va trata
scop m| puteÛi
numele tabloului contact| la:
a conform celor discutate pân| acum, ca pe un poantor constant la primul
element al tabloului. Deci tabloul nu se transfer| prin valoare, ci funcÛiei i se va transfera
ANTAL Tiberiu
un poantor. motiv, din interiorul funcÛiei se vor putea modifica valorile stocate
Alexandru
Din acest
în tabloul
tel.: din funcÛia apelant|. Dac| funcÛia m ed ia_ aritm etic a() va avea doi parametri,
0040-264-530918
tabloul a Õi num|rul de elemente ale tabloului, urm|toarele forme de declaraÛie sunt
e-mail: antaltiberiu@pcnet.ro
corecte:

doub le m ed ia_ aritm etica (int a [ ], int nr_ elem en te);

131
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
sau
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
doub le m ed ia_ aritm etica (int *a , int n r_e lem en te);
Curs de limbaj C
Pentru c| tot ceea ce primeÕte funcÛia este un poantor, ea nu are de unde s| Õtie num|rul
Copyright
de elemente 2001. Toate drepturile
ale tabloului. suntnecesar
Astfel, este rezervate autorului.
al doilea parametru, nr_ elem en te , care va
trebui s| fie num|rul de elemente ale tabloului.
Multiplicarea acestui document în scop comercial este interzis|.
1 /* TA B6.C */
2 #include<stdio.h>
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
3
4 document
do pentru
ub le m ed uzuletic
ia_ aritm personal.
a(in t [ ], int);
5
6 int main(void)
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
7 {
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
8 int ve ctor[5]={1,2,3 ,4,5};
9 scop m|doub
puteÛi contact| la:
le medar;
10
11 ANTAL mTiberiu
ed ar=m ed ia_ aritm etica (vec tor,5);
Alexandru
12
tel.: 0040-264-530918
13 prin tf("M ed ia a ritm etica este: %lg\ n", m ed ar);
14 e-mail: antaltiberiu@pcnet.ro
15 return 0;
16 }
17
18 double media_aritmetica(int a[ ], int nr_elemente)
19 {
20 int i;
21 Conf. dr. ing. ANTAL Tiberiu Alexandru
22 double total=0.0;
Universitatea Tenhic| din Cluj-Napoca
23
24 Facultatea ConstrucÛii de MaÕini
for(i=0; i<nr_eleme nte; i++)
25 Catedra de Mecanic|totaÕi Programare
l+= a [i];
26 Curs de limbaj C
27 return total/nr_elemente;
28 }
Copyright 2001. Toate drepturile sunt rezervate autorului.
Rezultate:
Multiplicarea acestui
Media aritmetica document
este: 3 în scop comercial este interzis|.

În programul
SudenÛii prezentat
participanÛi tabloul
la orice form|unidimensional
de înv|Û|mânt superior de 5 elem numit
ente pot
bugetar este
vectoracest
multiplica
argumentul func Ûiei m edia_
document pentru uzul personal. aritm etic a() în linia 11 . Parametrul a prime Õte ca valoare
adresa primului element din vector, adic| pe &vector[0]. În interiorul funcÛiei a[i] este
modalitatea de acces la
SudenÛii participanÛi la elementele
orice form|tabloului, a[0] = 1, a[1] = 2 etc. Al doilea parametru este
de înv|Û|mânt cu plat| sau alte persoane doritoare
num|rul de elemente ale vectorului care asigura7 oprirea indicelui i la ultimul element valid
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
de tablou. a[0] este primul element, iar ultimul este a[5] pentru c| atunci când i va lua
scop m| puteÛi
valoarea contact|
6 se iese la: for. Datorit| apelului prin adres|, orice modificare a valorilor
din ciclul
lui a[i] se va reflecta asupra lui vecto r[i].
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
9.8.2 Transferul unui tablou unidimensional
e-mail: antaltiberiu@pcnet.ro
prin poantor
FuncÛia m ain () ramâne identic| cu cea anterioar|.

132
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
1 /* TA B7.C */
2
Facultatea ConstrucÛii de MaÕini
#include<stdio.h>
3 Catedra
do ub le m edMecanic|
de Õi Programare
ia_ aritm etic a(in t *, int);
4 Curs de limbaj C
5 int main(void)
6 {
7
Copyright 2001. Toate drepturile
int a[5]={1,2,3 ,4,5};
sunt rezervate autorului.
8 doub le medar;
9 Multiplicarea acestui document în scop comercial este interzis|.
10 m ed ar=m ed ia_ aritm etica (a,5);
11
12
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
prin tf("M ed ia a ritm etica este: %lg\ n", m ed ar);
13 document pentru uzul personal.
14 return 0;
15 }SudenÛii participanÛila orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
16
17
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
double media_aritmetica(int *ptr, int nr_elemente)
18 {scop m| puteÛi contact| la:
19 int *ptr_capat=ptr + nr_elemente;
20 ANTAL Tiberiu Alexandru
21 double total=0.0;
tel.: 0040-264-530918
22
23 e-mail:wantaltiberiu@pcnet.ro
hile (ptr < ptr_c ap at)
24 total+= *ptr++;
25
26 return total/nr_elemente;
27 }

În linia 10 , în urma apelului se copiaz| adresa elementului 0 în ptr Õi valoarea numeric|


Conf.
5 dr. ing. ANTAL
în variabila nr_ elem Tiberiu Ûializarea din linia 19 va atribui poantorului ptr_capat
en te . IniAlexandru
adresa
Universitatea
ptr+n r_eTenhic|
lem en din eof(in t) . Pentru simplitate, presupunem c| adresa lui ptr în
Cluj-Napoca
te*siz
zecimal este
Facultatea 1000. Astfel,
ConstrucÛii adresa stocat| în ptr_capat este ptr_capat = 1000+5*4=1020.
de MaÕini
Aceast
Catedra | adres | este dincolo
de Mecanic| de domeniul alocat tabloului a îns| conform celor spuse la
Õi Programare
compara Ûia poantorilor,
Curs de limbaj C este corect s| o folosim. Din acest motiv se scrie ptr < ptr_capat
Õi nu ptr <= ptr_capat. InstrucÛiunea din linia 24 face adunarea valorilor elementelor
poantate de ptr . total este iniÛializat| cu valoarea 0 , iar valoarea poantat| de poantor care
Copyright 2001.
este 1 se adun | ÕiToate drepturile
ea la total sunt rezervate
, care devine autorului.
1 . Apoi poantorul se incrementeaz| Õi adresa lui
prtr devine 1000+1*4 , adic| 1004. Cum relaÛia 1004 < 1024 este adeva 7 rata7 , ciclul continu|
Multiplicarea
Õi valoarea de 2acestui
se adundocument în scop
| la valoarea comercial
curent este, aceasta
| a lui total interzis|.
devenind 1+2 =3 . Poantorul
este incrementat la adresa 1008 , etc. Dup| ce s-au adunat cele 5 numere, poantorul va
poanta laparticipanÛi
SudenÛii adresa 1020.laAceasta este adresa
orice form| stocat| superior
de înv|Û|mânt în ptr_capat motiv
bugetar potpentru care acest
multiplica ciclul
nu se reia. pentru
document Valoarea întoars
uzul | este media aritmetica7 , adic| suma elementelor împ|rÛit| la
personal.
num|rul de elemente.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
9.8.3 Operatorii * s- i ++ la poantori
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Operatorul ++ are o precedenÛ| mai mare decât operatorul * . Dac| ++ se realizeaz| prima
oar|, de ce se adun| prima oar| valoarea Õi numai apoi se incrementeaz| poantorul?
ANTAL
Pentru aTiberiu
înÛelegeAlexandru
rezultatul s| revenim la modul de lucru al operatorului ++ postfix. Fie
Ûia int a=3,b;, dac| scriem b=a++; valoarea lui a este salvat| într-un registru. a se
tel.: 0040-264-530918
declara
incrementeaz | devenind 4 , apoi valoarea din registru este atribuit| lui b . Deci
e-mail: antaltiberiu@pcnet.ro
incrementarea se face înaintea atribuirii. Dac| x este o variabil| întreag|, iar p un poantor
la un tip întreg, în cazul unei expresii de forma x=*p++ , adresa din p se salveaz| într-un
registru, apoi p se incrementeaz|. Valoarea adresei salvate în registru este folosit| cu
operatorul * pentru extragerea valorii poantate de la adresa neincrementat|.

133
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛiiÎn aceast | form| conÛinutul adresei din p se salveaz| într-un registru.
de MaÕini
(*p)++
Con Ûinutul
Catedra de Mecanic| Õi Programare locaÛiei poantate de p se va incrementa, dar poantorul p va
continua s| poanteze la aceeaÕi locaÛie. Expresia va creÕte cu 1 valoarea
Curs
stocatde| înlimbaj
locaÛiaCpoantat| de p , f|r| a modifica îns| adresa stocat| în poantorul p . O astfel
de expresie, dac| poanteaz| la un tablou, garanteaz| incrementarea continu| a
Copyright
elementului2001. Toatepoantat
de tablou drepturile sunt rezervate autorului.
de poantor.

Aici document
Multiplicarea acestui operatorulîn++scop
este comercial
prefixat, deci
este nu se foloseÕte registrul. Valoarea
interzis|.
*++p
stocat| în p se incrementeaz|, apoi se acceseaz| valoarea stocat| la
aceast
SudenÛii participanÛi | nouform|
la orice | adresde|. înv|Û|mânt
O astfel desuperior
expresiebugetar pot|multiplica
garanteaz ratarea trat |rii
acest
primului element dintr-un tablou.
document pentru uzul personal.

9.8.4 Transferul unui tablou bidimensional


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot cost Õi cuca
Dacmultiplica documentul
| tabloul este numai este
bidimensional, contra
obligatoriu acordul scris
declara al autorului.
Ûia de parametru În
s| acest
conÛin|
scop|m|
num rul puteÛi contact|
de coloane la:
al parametrului tablou. Num|rul de linii este irelevant, din moment
ce se va transfera un poantor la un tablou de rânduri, unde fiecare rând este un tablou cu
elemente
ANTAL
D2 de tipul
Tiberiu T . Ca exemplu, voi prezenta un program care face suma Õi produsul
Alexandru
elementelor nenule dintr-o matrice A mxn.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
1 /* TA B8 .C */
2 #include<stdio.h>
3 #define R 7
4 #d efine C 10
5
6 vo id Cites teM atric e(int [ ][C], int, in t, ch ar );
7 void ScrieM atr ice(int [ ][C], in t, int, char);
8 Conf.
void Sdr.
uming. ANTAL
Pr odM Tiberiu
atric e(int Alexandru
[ ][C], int , int );
9 Universitatea Tenhic|
int C iteste N rElem (int din
*, inCluj-Napoca
t, cha r);
10 Facultatea ConstrucÛii de MaÕini
11 int main(void)
Catedra de Mecanic| Õi Programare
12 {
13 Curs deint
limbaj C n, m;
a[R ][C],
14
15 if (CitesteNrElem(&n,R,'r'))
Copyright return
2001. Toate drepturile sunt 0;
rezervate autorului.
16 if (CitesteNrElem (&m,C,'c')) return 0;
17 if (m <1) retu rn(0 );
18 Multiplicarea acestui document în scop comercial este interzis|.
19 Cite steM atric e(a,n ,m,'a');
20 Scr
SudenÛii ieM atric e(a,n
participanÛi ,m,'a');
la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
21 Su m ProdM atric e(a,n ,m);
document pentru uzul personal.
22
23 prin tf("Su m a: %i\n Produs ul: % i\n ", a[0][0], a[0 ][1]);
24 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
25 return 0;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
26 }
scop m| puteÛi contact| la:
27
28
29 ANTAL Tiberiu Alexandru
void CitesteMatrice(int m[ ][C], int r, int c, char num e)
30 {tel.: 0040-264-530918
31
e-mail:int i,j;
antaltiberiu@pcnet.ro
32 for(i=0;i<r;i++)
33 for(j=0;j<c;j++)
34 {
35 prin tf("%c [%i][%i] = ",nu m e,i,j);
36 sca nf("% d", & m [i][j]);

134
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
37 }
38
Facultatea
}
ConstrucÛii de MaÕini
39 Catedra de Mecanic| Õi Programare
40 Curs ScrieMatrice(int
void de limbaj C m[ ][C], int r, int c, char num e)
41 {
42 int i,j;
43
Copyright 2001. Toate drepturile sunt rezervate autorului.
prin tf("M atric ea %c e ste:\n ", nu m e);
44 for(i=0;i<r;i++)
45 Multiplicarea
{ acestui document în scop comercial este interzis|.
46 for(j=0;j<c;j++)
47 prin tf("%i ", m [i][j]);
48
SudenÛii participanÛi la orice form| de înv|Û|mânt
prin tf("\n ");
superior bugetar pot multiplica acest
49 document
} pentru uzul personal.
50 }
51 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
52 int CitesteNrElem(int *x, int d, char num e)
53
pot
{
multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
54 scop m|prin
puteÛi contact|
tf("%c la:e);
= ", nu m
55 sca nf("% i", x);
56 ANTAL Tiberiu Alexandru
57 if (*x > d)
tel.: 0040-264-530918
58 {
59 e-mail: antaltiberiu@pcnet.ro
prin tf("\n Eroar e, nu m aru l de e lem en te este pr ea m are \n ");
60 return 1;
61 }
62
63 return 0;
64 }
65
66 void
Conf.Sum ProdM
dr. ing. atrice(int
ANTAL m[ ][C],
Tiberiu int r , int c)
Alexandru
67 {
Universitatea Tenhic| din Cluj-Napoca
68 int i,j;
69 Facultatea ConstrucÛii
int sum de MaÕini
a = 0, produ s = 1;
70 Catedra de Mecanic| Õi Programare
71 Curs defor(i=0;i<r;i++)
limbaj C
72 for(j=0;j<c;j++)
73 {
74 Copyright 2001. Toate sudrepturile
m a+=m [i][j];sunt rezervate autorului.
75 if (m [i][j] != 0) prod us *=m [i][j];
76 Multiplicarea }acestui document în scop comercial este interzis|.
77 m[0][0]=suma;
78 m[0][1]=produs;
79 SudenÛii
} participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
Rezultate:
SudenÛii
r= 2 participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
c= 4
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
a[0][0] = 1
scop m| puteÛi
a[0][1] = 2 contact| la:
a[0][2] = 3
ANTAL Tiberiu
a[0][3] = 0 Alexandru
a[1][0] = 0
tel.: 0040-264-530918
a[1][1] = 4
e-mail:
a[1][2]antaltiberiu@pcnet.ro
= 5
a[1][3] = 6
Matricea a este:
1 2 3 0
0 4 5 6

135
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Suma: 21
Facultatea
Produsul: 720
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs Ûde
Func iilelimbaj
care C manipuleaz| matricea sunt CitesteM atr ice(), ScrieMatrice() Õi
Su m Pr od M atr ice() . Parametrul tablou este declarat sub forma: in t m [ ][C]. El poate fi îns|
CopyrightÕi2001.
declarat sub Toate
una din formele:sunt
drepturile m[R][C] sau
intrezervate int (*m)[C]. Pentru ultima form|,
autorului.
parantezele rotunde sunt obligatorii pentru c| [ ] are precedenÛ| mai ridicat| decât * . Dac|
Õ fi scris numai
aMultiplicarea int *m[C]
acestui , [ ] dimensiunea
document C s-areste
în scop comercial legainterzis|.
de numele m , deci m[C] va fi un
tablou, apoi * s-ar lega de tipul int, adic| elementele tabloului ar fi poantori la tipul int.
Pentru Ûelegerea detaliat
SudenÛiiînparticipanÛi | aform|
la orice modului în care C interpreteaz
de înv|Û|mânt | declara
superior bugetar potÛmultiplica
iile complexe v|
acest
recomand citirea ANEXEI 2.
document pentru uzul personal.

9.8.5 Care notat


SudenÛii participanÛi la orice -form|
ie ode folosim?
înv|Û|mânt cu plat| sau alte persoane doritoare
potprogramul
În multiplica documentul |, atâtcontra
care urmeaznumai a[i] Õi
forma cost câtcuÕiacordul scris
*ptr sunt al autorului.
folosite pentru În acest la
accesul
elementele unuicontact|
scop m| puteÛi tablou unidimensional.
la: Care dintre notaÛii este mai bun|?

1 /* TA B9.C
ANTAL */
Tiberiu Alexandru
2 #include<stdio.h>
3
tel.: 0040-264-530918
4 e-mail:
int antaltiberiu@pcnet.ro
main(void)
5 {
6 floa t x[5 ]={1.1F ,2.2F ,3.3F ,4.4F,5 .5F };
7 float *ptr=x;
8
9 prin tf("x[2 ]= %g \n ", x[2]);
10 prin tf("2[x ]= %g \n ", 2[x]);
11 Conf. prin
dr. tf("*(x+2)=
ing. ANTAL%g\n \n ",Alexandru
Tiberiu *(x+2 ));
12
13
Universitatea Tenhic| din Cluj-Napoca
prin tf("ptr[2 ]= %g \n ", ptr[2]);
14 Facultatea
prin tf("*(ptr+2)= de
ConstrucÛii MaÕini
% g\n ", *(ptr+2 ));
15 Catedra de Mecanic| Õi Programare
16 Curs dereturn
limbaj0;C
17 }

Copyright
Rezultate: 2001. Toate drepturile sunt rezervate autorului.
x[2]= 3.3
Multiplicarea
2[x]= 3.3 acestui document în scop comercial este interzis|.
*(x+2)= 3.3
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
ptr[2]= 3.3
document
*(ptr+2)=pentru
3.3 uzul personal.

Înainte
SudenÛiide a r|spundelalaorice
participanÛi întrebare,
form| observa Ûi linia cu
de înv|Û|mânt din programul
10 plat| . Forma de
TA B9 .Cdoritoare
sau alte persoane
scriere este corect | , astfel ca 7 x[2] Õi 2[x] acceseaz | valoarea aceluia
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În Õi element deacest
tablou.
Asta pentru c | operatorul
scop m| puteÛi contact| la: [ ] se descompune într-o adunare, iar adunarea este comutativ |.
R|spunsul la întrebare este folosirea notaÛiei cât mai uÕor de înÛeles în contextul
problemei care se rezolv|.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
9.9 Ôiruri de caractere
e-mail: antaltiberiu@pcnet.ro
În C nu 7 un tip specific pentru s- irul de caractere. El se declara7 ca un tablou
ex ista
unidim ensional de caractere . Se poate lucra Õi cu un poantor la un tip char. Dac| Õirul
este declarat ca un tablou de caractere, spaÛiul pentru stocarea elementelor de Õir este

136
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
alocat automat.
Facultatea Dac| Õirul
ConstrucÛii se declar| ca un poantor la caracter, nu se aloc| spaÛiu pentru
de MaÕini
elementele lui, utilizatorul
Catedra de Mecanic| Õi Programare fiind nevoit s|-l aloce explicit cu m allo c() , calloc() sau sa7 -i
atribuie adresa unui Õir deja existent. Un caracter special este folosit pentru marcarea
Curs
termin de|rii
limbaj C Acest caracter se numeÕte nu ll Õi se scrie ca '\0'. Nu trebuie s|
Õirului.
confundaÛi acest nu ll cu NULL discutat la poantori. Acel NULL marca o valoarea invalid|
Copyright
de poantor2001. Toate
Õi putea drepturile
fi definit suntfel.
| în orice rezervate
Pentruautorului.
caracterul nu ll este garantat| valoarea
0 . Scrierea de '\0' este preferabila 7 unui simplu 0 deoarece compilatorul, conform celor
discutate la constante,
Multiplicarea atribuie tipul
acestui document în scop lui 0 Õi char
intcomercial estelui '\0'. DiferenÛa dintre tipuri este
interzis|.
spaÛiul folosit pentru stocare, int se stocheaz| pe 2 sau 4 octeÛi, iar char pe unul singur.
Pentru
SudenÛiistocarea unuila
participanÛi zero este
orice suficient
form| un singur superior
de înv|Û|mânt octet. bugetar pot multiplica acest
document pentru uzul personal.
1 /* TA B10.C */
2 #include <stdio.h>
3 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
4 int multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
pot main(void)
5 {scop m| puteÛi contact| la:
6 cha r num e[5]; /* Declara tia variab ilei sir de caractere */
7
8 ANTAL
nu m e[0Tiberiu
] = 'T'; Alexandru
9 tel.:
nu0040-264-530918
m e[1] = 'i';
10 nu m e[2
e-mail: ] = 'b';
antaltiberiu@pcnet.ro
11 nu m e[3 ] = 'i';
12 nu m e[4] = '\0'; /* Cara cterul nu ll - marchea za term inarea textului */
13
14 prin tf("N um ele este: % s\n ", nu m e);
15 prin tf("Al 3 -lea caracte r este : %c\ n", n um e[2]);
16 prin tf("O p arte din nu m e este: %s \n ", &n um e[1]);
17
18 Conf. dr. 0;
return ing. ANTAL Tiberiu Alexandru
19 }Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Rezultate:
Catedra de Mecanic| Õi Programare
Numele este: Tibi
Curs de limbaj C
Al 3-lea caracter este: b
O parte din nume este: ibi
Copyright 2001. Toate drepturile sunt rezervate autorului.
În linia 6, n um e este un tablou unidimensional cu 5 elem en te de tipul
IniÛializarea
Multiplicarea acestui . Putem spune
chardocument în scopc| avem 5 variabile
comercial de tipul char cu numele num e[0],
este interzis|.
Õirurilor
num e[1], num e[2], num e[3], nume[4]. Variabila n um e este un Õir de
SudenÛii participanÛi caractere
la oriceceform|
poatede stoca cel mult 5superior
înv|Û|mânt caractere, dar pentru
bugetar c| este nevoie
pot multiplica acest
Õdocument
i de caracterul nu ll, ce marcheaz| terminarea Õirului, mai r|mân numai 4 caractere
pentru uzul personal.
utilizabile. Pentru a stoca date în Õir se folosesc 5 instrucÛiuni de atribuire, fiecare
atribuind un caracter alfabetic la câte unul dintre caracterele Õirului. În final, ultimul
SudenÛii
caracter dinparticipanÛi la orice numeric
Õir este valoarea form| de| 0înv|Û|mânt
care indic|cu plat| sau alte
terminarea persoane
Õirului. doritoare
Dup| ini Ûializarea
Õpot multiplica
irului documentul
de caractere acesta numai Õat pe cost
va fi aficontra ecranÕi în
culinia
acordul
14 . scris al autorului. În acest
scop m| puteÛi contact| la:
Caracterul de conversie %s din printf() se foloseÕte la afiÕarea Õirurilor de caractere.
Afi
ANTALÕarea Tiberiu
începe cu primul caracter al Õirului Õi se termin| la întâlnirea caracterului nu ll.
Alexandru
tel.: 0040-264-530918 doar numele Õirului trebuie specificat, f|r| nici un indice, pentru
Observa Ûi c | în printf()
| suntem
ce-mail: interesaÛi ca afiÕarea s| se fac| începând cu primul caracter. Pentru c| toate
antaltiberiu@pcnet.ro
cele discutate la tablouri r|mân valabile Õi aici, n um e se refer| la întregul Õir, iar nu m e[i]
la un singur caracter din Õir.

Din exemplul anterior aÛi putea deduce c| utilizarea Õirurilor este greoaie din moment ce
trebuie iniÛializat individual fiecare element de Õir. Realitatea este îns| mai simpl|, iar
137
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
exemplul
Facultateaa ConstrucÛii
avut numai de
rolul de a prezenta un mod de tratare al elementelor de Õir identic
MaÕini
cu metodele generale de ini
Catedra de Mecanic| Õi Programare Ûializare prezentate la tablouri. Urm|toarele metode de
init- ializare pot fi practicate în cazul unui Õir de caractere:
Curs de limbaj C
1 char nu m e[7] = {'V','a','s','i','l','e','\0'};
Copyright
2 char p renu2001. Toate drepturile
me [9]="Gheorgh e"; sunt rezervate autorului.
3 char titlu[ ]="doctor inginer";
Multiplicarea acestui document în scop comercial este interzis|.
În linia 1, folosind o metod| de iniÛializare specific| tuturor tablourilor, compilatorul nu
este suficient de deÕtept ca s| se prind| c| este vorba de un Õir, motiv pentru care trebuie
SudenÛii
s| punemparticipanÛi la orice form|
cu mâna terminatorul dedeÕir.
înv|Û|mânt superior
L|sarea lui bugetar
afar| ar fi duspot multiplica
la un acest
tablou corect
document
iniÛializat, pentru
dar la uzul personal.
un Õir de caractere neterminat. În linia 2, variabila p re nu m e este
iniÛializat| cu un Õir de caractere. Conform celor prezentate în paragraful numit
"Elemente de C" un laÕirorice
SudenÛii participanÛi esteform|
o secven Û| de caractere
de înv|Û|mânt cu plat| | între
sau alte
cuprins persoane doritoare
ghilimele. Aici,
pot multiplica"se
compilatorul | se lucreaz
prinde" cnumai
documentul contra|cost uncuÕiracordul
cu Õi Õi adaug | automat
scris În Õacest
la sfâr
al autorului. itul lui
caracterul nu ll .contact|
scop m| puteÛi prezint| cazul în care num|rul de elemente ale Õirului se deduce
Linia 3 la:
de c|tre compilator, el fiind num|rul de caractere din Õir plus unu, pentru terminatorul
de Õir care
ANTAL din nou
Tiberiu se adaug| automat.
Alexandru
tel.: 0040-264-530918
În linia 15 , printf() ilustreaz | modul de afiÕare al unui singur caracter
e-mail:unor
AfiÕarea antaltiberiu@pcnet.ro
din Õir utilizând caracterul de conversie %c Õi specificând caracterul
porÛiuni ale Õirului
particular din variabila n u me pe care dorim s-o afiÕ|m. Ultimul printf()
ilustreaz| modul în care se poate afiÕa o porÛiune din Õir prin
specificarea punctului de început s- i utilizând indicele. Dup| cum ÕtiÛi deja, operatorul &
întoarce adresa lui num e[1].

9.9.1 Atribuirea în cazul de s- iruri


Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
O eroare frecvent
Facultatea | este de
ConstrucÛii MaÕiniunei atribuiri de forma num e="Ion"; . Aici, nume stocheaz|
scrierea
adresa primului caracter din Õir, adic| adresa lui 'I'. Aceast| adres| este constant|, modul
Catedra Õi Programare
de lucru de Mecanic|
corect este folosirea funcÛiei strc py () din biblioteca standard.
Curs de limbaj C
1 /* TA B11.C */
2 Copyright 2001. Toate
#include <stdio.h> drepturile sunt rezervate autorului.
3 #include <string.h>
4
5
Multiplicarea
int main(void)
acestui document în scop comercial este interzis|.
6 {
7 SudenÛii participanÛi
cha r num la e2[12],
e1[12], num orice form| de
m ax im înv|Û|mânt superior bugetar pot multiplica acest
[25];
8 char titlu[ ]="Acesta este
document pentru uzul personal. un titlu.";
9
10 strcpy (nu m e1, "Ioa na "); /* atribuirea unu i sir la o variab ila */
11 SudenÛii participanÛi
strcp y(n la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
um e2, "T ibi");
12 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
13 prin
scop m|tf("
puteÛi%s\ n\ n", titlu
contact| la: );
14 prin tf("N um e 1 es te: %s \n ", nu m e1);
15 prin tf("N um e 2 este: % s\n ", nu m e2);
16 ANTAL Tiberiu Alexandru
17 tel.: 0040-264-530918
if(strcm p(num e1, num e2) > 0 ) /* com paratia a 2 siruri */
18 strcpy
e-mail: (max im , nu m e1);
antaltiberiu@pcnet.ro
19 else
20 strcpy (max im , nu m e2);
21
22 prin tf("Ce l mai m are nu m e in sen s alfa betic este : %s\ n", m ax im );
23

138
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
24 strcp y(m ax im , nu m e1);
25
Facultatea ConstrucÛii de MaÕini
strcat(m ax im , " "); /* concaten area a doua siruri */
26 Catedra de
strca t(max im , nu mÕi
Mecanic| Programare
e2);
27 Curs
prinde limbaj
tf("Ce C ua nu m e su nt: % s\n ", m ax im );
le do
28
29 return 0;
Copyright
30 }
2001. Toate drepturile sunt rezervate autorului.

Multiplicarea
Rezultate: acestui document în scop comercial este interzis|.
Acesta este un titlu.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Nume 1 este: Ioana
document pentru uzul personal.
Nume 2 este: Tibi
Cel mai mare nume in sens alfabetic este: Tibi
SudenÛii
Cele douaparticipanÛi
nume sunt: la orice
Ioanaform|
Tibide înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Func Ûia de
scop m| bibliotec
puteÛi | strc
contact| la:py () este declarat| în fiÕierul antet string .h (vezi linia 3 din
programul anterior) iar descrierea ei este dat| în continuare:
ANTAL Tiberiu Alexandru
strcpy - copiaza
tel.: 0040-264-530918
7 un s- ir de caractere
Prototip: char *strcpy(char *s- irDestinat- ie, const char *s- irSursa 7 );
e-mail: antaltiberiu@pcnet.ro
Fis- ier prototip: <string.h>
Valoare întoars|: întoarce Õirul destinaÛie. Nu se poate afla din valoarea întoars| dac|
s-a realizat copierea f|r| eroare.
Parametri: s- irDestinat-ie este Õirul în care se face copierea;
s- irSursa 7 este Õirul din care se face copierea; el trebuie s| fie terminat în
caracterul nu ll.
Conf. dr.7 :ing.
Remarca Func Ûia strc py
ANTAL () copiaz
Tiberiu | caracter cu caracter, inclusiv caracterul terminator de
Alexandru
ÕUniversitatea
ir, din s- irSursa 7 în s- irDestinat- ie . Oprirea copierii se face dup | întâlnirea caracterului
Tenhic| din Cluj-Napoca
nu ll . Lipsa lui duce la un comportament nedefinit în funcÛionare, prezenÛa lui nu ll fiind
Facultatea ConstrucÛii de MaÕini
singura metod| de verificare a atingerii limitei lui s- irSursa7 . s- irDestinat-ie trebuie s| fie
Catedra
suficient de deMecanic|
mare pentru Õi Programare
a stoca tot conÛinutul lui s- irSursa7 . Altfel, foarte probabil, din
Curs de limbaj C
cauza c| zona de RAM destinat| lui s- irDestinat-ie este dep|Õit|, programul va "cr|pa".

Copyright 2001. Toate drepturile sunt rezervate autorului.


9.9.2 Sortarea alfabetica7 a s- irurilor
Multiplicarea acestui document în scop comercial este interzis|.
FuncÛia care permite compararea a dou| Õiruri este strc m p() (“string compare” - vezi linia
17 ).
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
strcmp - compara 7 doua7 s- iruri de caractere
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Prototip: int strcmp( const char *s- ir1, const char *s- ir2 );
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
-ier
Fis
scop m|prototip: <string.h>
puteÛi contact| la:
Valoare întoarsa7 : funcÛia compar| pe s- ir1 cu s- ir2 Õi întoarce un rezultat în funcÛie de
relaÛia dintre cele dou| Õiruri, astfel:
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Valoare
e-mail: întoarsa7 Relat-ia între s- ir1 Õi s- ir2
antaltiberiu@pcnet.ro
<0 s- ir1 < s- ir2
0 s- ir1 == s- ir2

139
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea >ConstrucÛii
0 s- ir1
de > s- ir2
MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj
Parametri: s- ir1CÕi s- ir2 sunt Õiruri terminate în nu ll care vor fi comparate.

Din descriere
Copyright seToate
2001. observ | c| strc msunt
drepturile p() va o valoare >0 dac| primul Õir este mai
întoarceautorului.
rezervate
mare decât al doilea, zero dac| au aceeaÕi lungime Õi aceleaÕi caractere Õi o valoare <0 dac|
primul Õir esteacestui
Multiplicarea mai micdocument
decât al doilea.
în scopUnul dintre Õeste
comercial iruri, în funcÛie de rezultat, este copiat
interzis|.
în variabila Õir m ax im prin linia 18 sau 20 , apoi cel mai mare nume, în sensul alfabetic,
se afiÕeaz| în linia 22. Nu trebuie s| fiÛi surprinÕi c| Tibi va fi mai mare pentru c|
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
lungimea nu conteaz|, fiind semnificativ| numai poziÛia în alfabet. Trebuie s| ÕtiÛi c|
document pentru
rezultatul mai uzul personal.
depinde Õi de modul în care au fost scrise numele, adic| cu litere mari sau
mici. Exist| funcÛii care permit transformarea unui Õir oarecare într-unul numai cu
SudenÛii participanÛi
majuscule sau numai la
cuorice
litereform|
mici. de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
9.9.3 Concatenarea s- irurilor
Lin iile 24-27
ANTAL ilustreaz
Tiberiu | o alt| funcÛie standard, strc at() (“string concatenation”). Aceast|
Alexandru
tel.: Û0040-264-530918
func ie adaug| caracterele din al doilea Õir la cap|tul primului Õir, având grij| s| fac|
ajustarea caracterului nu ll. Astfel, n um e1 se copiaz| în m ax im , apoi dou| spaÛii se
e-mail: antaltiberiu@pcnet.ro
concateneaz| la m ax im Õi în final num e2 se concateneaz| la combinaÛia anterioar|.
Rezultatul afiÕeaz| numele celor dou| Õiruri stocate în variabila Õir m ax im .

Ôirurile sunt utile Õi simplu de utilizat, dar necesit| unele precauÛii. Este o eroare s|
copiaÛi un Õir în altul care este declarat mai scurt decât sursa, deoarece compilatorul va
realiza copierea Õi va suprascrie o porÛiune din program sau din date. Pentru c| nu exist|
nici
Conf.o metod | de
dr. ing. a avertiza
ANTAL Alexandru despre acest dezastru, e bine s| fiÛi cu b|gare
programatorul
Tiberiu
de seam | .
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Pentru a g|si toate funcÛiile de lucru cu Õiruri, consultaÛi documentaÛia compilatorului (sau
Catedra de Mecanic| Õi Programare
sistemul lui de ajutor). Exist| funcÛii care copiaz| cel mult un num|r fixat de caractere,
Curs
altelede limbaj
adaug C
| caractere în faÛa, la mijlocul sau la cap|tul unui Õir. Desigur, pot Õi scoate
caractere de oriunde din Õir. Merit| citit| aceast| documentaÛie pentru c|, în unele cazuri,
Copyright 2001.
funcÛiile peste Toate
care daÛidrepturile sunt rezervate
va7 vor simplifica autorului.
mult treaba.

Multiplicarea acestui document în scop comercial este interzis|.


9.10 Poantori la s- iruri
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Durata de existenÛ| a Õirului, tehnic denumit constant| s- ir , este static . Compilatorul va
document pentru uzul
stoca în segmentul personal.
de date toate Õirurile care nu iniÛializeaz| un tablou de caractere. De
exemplu, la o iniÛializare de forma char sir[ ]="Salut!"; caracterele din Õirul "Sa lut!" Õi
variabila sir ar putea la
SudenÛii participanÛi fi stocate
orice form| de|.înv|Û|mânt
pe stiv Pentru exemplul care
cu plat| sauurmeaz | variabila
alte persoane poantor
doritoare
la caracter este stocat | pe stiv| , dar Õirul
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
ptrSir "Sir de caractere cu poantor" este
întotdeauna stocat în segmentul
scop m| puteÛi contact| la: de date.

1 /* TA B12.C */
2 ANTAL
#includeTiberiu Alexandru
<stdio.h>
3 tel.: 0040-264-530918
4 int main(void)
e-mail: antaltiberiu@pcnet.ro
5 {
6 char *ptrSir;
7
8 ptrSir ="Sir de ca ractere cu poan tor";
9 pu ts(ptrS ir);

140
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
10
11
Facultatea ConstrucÛii de MaÕini
return 0;
12 Catedra
} de Mecanic| Õi Programare
Curs de limbaj C
Rezultate:
Copyright
Sir 2001. Toate
de caractere cu drepturile
poantor sunt rezervate autorului.

Func Ûia pu ts()acestui


Multiplicarea primeÕdocument
te ca parametru
în scop de intrare este
comercial adresa primului caracter din Õir. Ea
interzis|.
verific| dac| apare caracterul null ; dac| da, îÕi întrerupe execuÛia. Altfel, afiÕeaz|
caracterul curent pe ecran, adun| 1 la adresa lui, verific| dac| caracterul curent este nu ll
SudenÛii participanÛi
etc. Observa la Ûorice
Ûi c| opera iile deform| de înv|Û|mânt
prelucare a Õirurilorsuperior bugetar pot
sunt dependente de multiplica
caracterulacest
nu ll .
document pentru uzul personal.
Acesta este motivul pentru care Õirurile sunt cunoscute Õi sub numele de Õiruri cu
terminator nu ll, iar în unele documentaÛii mai apar Õi sub numele de Õiruri ASCII-Z.
SudenÛii
Aceast | metod | de stocare
participanÛi la orice form|dep
permite |Õirea limitelor
de înv|Û|mânt cu plat| sau alte
de stocare persoane
fixe. Õirul poate
Practic,doritoare
potoricât
fi de lung
multiplica dac| încape
documentul în RAM.
numai contraÎn costlocÕide
cu pu ts() sescris
acordul poate folosi printf()
al autorului. pentru
În acest
afiÕ area Õirului scriind
scop m| puteÛi contact| la: printf("% s",p trS ir);. Aici "%s" e un Õir constant stocat în segmentul
de date.
ANTAL Tiberiu Alexandru
Caracterele unui Õir constant se stocheaz| în ordinea lor de apariÛie în locaÛii de memorie
tel.: 0040-264-530918
consecutive, iar caracterul '\0' este ad|ugat automat la sfârÕitul lui.
e-mail: antaltiberiu@pcnet.ro
Conform standardelor ANSI Õi ISO compilatoarele pot s| fac| optimiz|ri
Optimiz|ri la la stocarea Õirurilor. Compilatorul poate s| nu stocheze dou| Õiruri,
stocarea Õirurilor
dintre care unul este un subÕir al celuilalt, la adrese de memorie diferite.

9.10.1
Conf. dr. ing.Considerat -ii despre cres- terea vitezei
ANTAL Tiberiu Alexandru
programelor
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Fie programul:
Catedra de Mecanic| Õi Programare
1 Curs de IT1.C
/* SIRV limbaj*/C
2 #include<conio.h>
3 #include<string.h>
Copyright 2001. Toate drepturile sunt rezervate autorului.
4
5 int main(void)
6 Multiplicarea
{ acestui document în scop comercial este interzis|.
7 char sirtab lou[ ]="Salut bad e!\n";
8 int
SudenÛii i,lungime; la orice form| de înv|Û|mânt superior bugetar
participanÛi pot multiplica acest
9
document pentru uzul personal.
10 lun gim e=str len(sirta blou );
11 for (i=0; i < lungim e; i++)
12 SudenÛii participanÛi la orice
pu tch(sirtab louform|
de înv|Û|mânt cu plat| sau alte persoane doritoare
[i]);
13 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
14
scop m|return
puteÛi 0;
contact| la:
15 }

ANTAL
Rezultat:Tiberiu Alexandru
tel.: 0040-264-530918
Salut bade!
e-mail: antaltiberiu@pcnet.ro
El va afiÕa Õirul "Salut bade!\n", caracter cu caracter, prin folosirea funcÛiei pu tch ().
Înainte de fiecare incrementare a lui i se va afiÕa caracterul sirtab lou[i] . La fiecare
referire a unui element de tablou, locaÛia de memorie la care se afl| elementul se
calculeaz| dup| formula &sirtablou[0] + i *sizeof(char). Altfel spus, C începe sa7 calculeze

141
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
adresa de baz
Facultatea | a lui sirtablou
ConstrucÛii sau &sirtabolu[0], apoi determin| offset-ul i*sizeof(char) Õi
de MaÕini
adun | cele dou | valori pentru
Catedra de Mecanic| Õi Programare a obÛine adresa elementului. În acest caz sizeof(char) d| 1
Õi înmulÛirea este simplu de efectuat, dar dac| tabloul ar fi avut elemente de tipul float sau
Curs de limbaj C
doub le lucrurile s-ar fi complicat. La fiecare referire de element de tablou, este necesar |
realizarea unei înmulÛiri, operaÛie care este costisitioare ca timp de execuÛie. S| aducem
Copyright
programul 2001. Toate
de mai drepturile
sus la forma: sunt rezervate autorului.

1 /* SIRV IT2.C acestui


Multiplicarea */ document în scop comercial este interzis|.
2 #include<conio.h>
3 #include<string.h>
4
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
5 document
int pentru uzul personal.
main(void)
6 {
7 char
SudenÛii sirtab lou[
participanÛi la ]="Salut bad de
orice form| e!\n";
înv|Û|mânt cu plat| sau alte persoane doritoare
8 char *psir=sirtablou;
9
pot multiplica documentul
int i,lungime;
numai contra cost Õi cu acordul scris al autorului. În acest
10 scop m| puteÛi contact| la:
11 lun gim e=str len(psir);
12 ANTAL Tiberiu Alexandru
13 for (i=0; i < lungim e; i++)
14
tel.: 0040-264-530918
pu tch(*p sir++ );
15 e-mail: antaltiberiu@pcnet.ro
16 return 0;
17 }

În linia 8 s-a ad|ugat un poantor psir care este iniÛializat în linia de declaraÛie. Rezultatul
va fi identic cu cel al programului anterior, dar la fiecare reluare a ciclului se
incrementeaz| psir Õi se afiÕeaz| *psir . Altfel spus, deplasarea în Õir se face prin
Conf. dr. ing. ANTAL
incrementarea TiberiuCând
unui poantor. Alexandru
compilatorul întâlneÕte expresia psir++ , o aduce la
Universitatea
forma Tenhic| din
psir+sizeof(char) O alt| îmbun|t|Ûire este eliminarea determin|rii adresei
. Cluj-Napoca
elementului de baz|. Cum
Facultatea ConstrucÛii înmulÛirile sunt operaÛii încete, prin aceast| metod| am
de MaÕini
economisit timp. Incrementarea
Catedra de Mecanic| Õi Programare sau decrementarea unui poantor, pentru parcurgerea
unui
Curstablou, esteCîntotdeauna mai rapid| decât generarea complet| a adresei unui element,
de limbaj
avantaj de care putem beneficia numai dac| folosim notaÛia de poantor în locul celei de
tablou.
Copyright 2001. Toate drepturile sunt rezervate autorului.

9.10.2 Tablouri de poantori la s- iruri


Multiplicarea acestui document în scop comercial este interzis|.
ÔtiÛi deja c| în C ne putem referi la un element de tablou în mai multe moduri. Fie
declaraÛiile:
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
1 char tsir[5][11];
2 char *pts ir[5];
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
În linia 1, tsir este un tablou bidimensional cu elemente de tipul char, iar în linia 2, *ptsir
scop
este un m|tablou
puteÛi de
contact| la:la char. Sintactic, referirile de forma tsir[i][j] Õi pts ir[i][j] sunt
poantori
corecte Õi echivalente. tsir este îns| un tablou pentru care se aloc| 5x11 locaÛii de tipul
ANTAL
char, iarTiberiu de calcul a poziÛiei unui element tsir[r][c] este c+r*11 . În cazul lui ptsir se
formulaAlexandru
tel.: |0040-264-530918
aloc spaÛiu numai pentru un tablou de 5 poantori. AceÕtia nu sunt iniÛializaÛi s| poanteze
undeva, motiv pentru care utilizatorul trebuie s|-i iniÛializeze explicit în momentul
e-mail: antaltiberiu@pcnet.ro
declaraÛiei sau prin instrucÛiuni ale programului. Presupunând c| fiecare poantor
poanteaz| la un Õir de 11 caractere, se vor aloca 5x11 locaÛii pentru caractere Õi 5 locaÛii
pentru poantori. Deci, din punctul de vedere al spaÛiului de memorie alocat, cea de a doua
metod| este mai costisitoare. Atunci de ce s| o folosim? Avantajul celei de a doua metode

142
Capitolul
Conf. dr.9 ing.
- Tablouri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
este c| Õirurile
Facultatea MaÕinidiferite. Fie declaraÛia:
pot aveadelungimi
ConstrucÛii
Catedra de Mecanic| Õi Programare
char *mes aj_err[5]={"an gre sit","lu na gre sita ", "zi in [0 ,31]", "eroa re n ecu no scu ta",\
Curs de fata
"eroa re limbaj
la"};C

S-a iniÛializat
Copyright un Toate
2001. tabloudrepturile
m esaj_err de 5rezervate
sunt de tipul poantor la char. ObservaÛi c|
elementeautorului.
nu este necesar ca Õirurile la care poanteaz| elementele tabloului mesa j_err s| aib|
aceea Õi lungime.
Multiplicarea În Figura
acestui 19 seînprezint
document | spaÛiul de
scop comercial estedate pentru declaraÛia de mai sus.
interzis|.
Dac| declara
SudenÛii Ûia ar fi fost
participanÛi de forma:
la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
char tmesaje[5][19]={"an gresit","luna gresita", "zi in [0,31]", "eroare necu no scu ta",\
"eroa re fata la"};
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot Ûmultiplica
spa iul de datedocumentul
era cel dinnumai
Figura 18. Ôcost
contra irulÕicu
culungimea cea al
acordul scris mai mare este
autorului. "eroare
În acest
necunoscuta" Õi are 18
scop m| puteÛi contact| la:caractere plus terminatorul de Õir. Înseamn | în total 19 caractere
pentru stocarea lui. tm esa je este un tablou de 5 elem en te de tipul tablou de 19 ele m en te
de tipul char
ANTAL . Elementele
Tiberiu Alexandru tabloului de 5 elemente au toate acelaÕi tip, Õi anume tablou de
19 elemente de tipul char. Indiferent dac| spaÛiul de 19 caractere este ocupat sau nu, se
tel.:
aloc|0040-264-530918
19 caractere pentru un element tme saje[i] .
e-mail: antaltiberiu@pcnet.ro

Figura 18
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
Figura 19 pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

143
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

10 Structuri
Multiplicarea acestui document în scop comercial este interzis|.

S
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
tructura,
document uzul |personal.
pentrunumit

SudenÛii participanÛi
înregistrare (record ) în limbajele Ada Õi Pascal sau tupl| (tup le )
în programarea funcÛional|, este tipul de dat| cel mai general al limbajului C.
Structura este formatla| din membri,
orice fiecare
form| de membru
înv|Û|mânt cuputând avea
plat| sau alteunpersoane
tip diferit de ceilalÛi
doritoare
membri. Pentru c| tipul unui membru este arbitrar este posibil ca acesta s| fie el însuÕi
pot multiplica
un tip documentul
structurat, numai tablou
ca de exemplu contra sau Õi cu acordul
coststructur scris
|. Tipul dealdat
autorului.
| structurÎn acest
| permite
scop m| puteÛi
gruparea unor contact|
tipuri dela:
date, distincte sau nu, sub un singur nume.

ANTAL Tiberiu În ANSI C sunt definite noÛiunile de atribuire a structurilor, transferul


Alexandru
Modific|ri aduse
de parametri de tipul structur| funcÛiilor Õi întoarcerea unei valori de
tel.: 0040-264-530918
de standardizare
tipul structur| de c|tre funcÛie. Majoritatea compilatoarelor asigurau
e-mail: antaltiberiu@pcnet.ro
aceste facilit|Ûi, f|r| îns| ca mecanismul de lucru s| fie unitar Õi definit
precis.

O declaraÛie de structur| specific| un nou tip de dat| Õi o secvenÛ| de variabile, numite


membri sau câmpuri ale structurii, care pot avea tipuri distincte. Formele declaraÛiei de
structur| sunt:
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
stru ct [tip ] { lista-m em bri } [ide ntifica tori ];
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
sau
Curs de limbaj C

struc t tip iden


Copyright 2001.tificatori;
Toate drepturile sunt rezervate autorului.

Un identificator
Multiplicarea opÛional
acestui tip d| în
document nume
scoptipului structurii
comercial Õi va putea fi utilizat ulterior la
este interzis|.
referirea tipului structur|. În C este necesar| utilizarea explicit| a cuvântului rezervat
SudenÛiipentru
struct a declara
participanÛi o variabil
la orice | de
form| de tipul structur
înv|Û|mânt |. identificatori
superior sunt variabile
bugetar pot multiplica acest
op Ûionale de tipul struct care Ûin sub numele lor întreaga secvenÛ| a membrilor din
document pentru uzul personal.
lista-mem bri definiÛi de acel tip structur|. DeclaraÛia unui tip structur| este numai un
Õablon pentru declaraÛii ulterioare ale unor variabile de tipul structur|. Numele din
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
lista-mem bri nu pot s| apar| de dou| ori în aceeaÕi structur|.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
În continuare prezint modalitatea declar|rii unor tipuri de structuri.
Declararea tipurilor
Cuvântul struct va fi urmat de numele tip . Acest nume de tip permite
de structuri
identificarea Õablonului, f|r| a realiza alocarea de memorie la crearea
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918 tipului structur|.
e-mail: antaltiberiu@pcnet.ro
1 stru ct Data
2 {
3 int zi;
4 int luna;
5 int an;

144
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
6 };
7
Facultatea ConstrucÛii de MaÕini
8 Catedra de Mecanic| Õi Programare
9 Curs tdeMlimbaj
struc em bruC _fa m ilie
10 {
11 char nu m epers oa na [50];
12
Copyright 2001. Toate drepturile sunt rezervate autorului.
int varsta;
13 };
14 Multiplicarea acestui document în scop comercial este interzis|.
15 stru ct Su m a_ platita
16 {
17
SudenÛii participanÛi la orice form|
struc t Data data _pla tii;
de înv|Û|mânt superior bugetar pot multiplica acest
18 documentlongpentru
suma;uzul personal.
19 char m otiv [255 ];
20 };
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
21
22
pot multiplica documentul
struc t Che ltuieli_f am ilie
numai contra cost Õi cu acordul scris al autorului. În acest
23 {scop m| puteÛi contact| la:
24 struct Mem bru_familie cine;
25 ANTAL stru ct Sum
Tiberiu a_ pla tita cit[2];
Alexandru
26 struc t Che ltuieli_f am ilie *ptrC heltuie li;
tel.: 0040-264-530918
27 };
e-mail: antaltiberiu@pcnet.ro
Tipul structur| cu numele de Da ta este format din trei întregi. Avantajul faÛ| de folosirea
unui tablou este c| membrii au nume sugestive Õi dac| este cazul pot avea tipuri distincte.
În cazul unui tablou am fi avut trei elemente, numerotate cu 0, 1 Õi 2, toate de tipul int.
Num|rul de ordine al elementului nu putea sugera semnificaÛia lui, trebuia ca noi s|
reÛinem c| în elementul 0 am stocat ziua, în elementul 1 luna Õi în elementul 2 anul.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Tipul de dat|Tenhic|
Universitatea structurdin| cuCluj-Napoca
numele M em bru _fa m ilie este format din doi membri, un
tablou de caractere Õi un întreg. Tipul structur| Su m a_ platita este format din trei
Facultatea ConstrucÛii de MaÕini
membri dintre care unul este de tipul structur| Da ta . Ôi în final, tipul structur|
Catedra de Mecanic| Õi Programare
Ch eltuieli_ fam ilie , are trei membri, primul de tip structur|, al doilea tablou cu elemente
Curs de structur
de tipul limbaj C|, iar ultimul poantor la un tip structur|.

Copyright 2001.Tipul
Declararea unor
Toatestructurii
drepturileinformeaz | compilatorul
sunt rezervate autorului. despre modul în care se va
construi variabila de tipul respectiv. Odat| ce avem declarat un tip
variabile de tip
Multiplicarea
structur|
structur
acestui | se potîn
document declara variabile este
scop comercial de tipul structur|. Mai jos, tipul Da ta
interzis|.
este declarat în liniile 1-6 . Numele zinastere Õi zisalar sunt nume de
variabile.
SudenÛii participanÛi Între
la orice acolada
form| de închidere
de înv|Û|mânt Õi caracterul
superior ; se pot specifica oricâte
bugetar pot multiplica acest
nume de variabile, separate prin virgul|, care vor deveni variabile de tipul structur|
document pentru uzul personal.
respectiv. Dac| dorim s| declar|m Õi alte variabile de acelaÕi tip, îns| dup| caracterul ;,
deÕi Da ta este un tip de dat| asemenea, de exemplu, lui int, struct trebuie s| precead|
SudenÛii participanÛi
numele tipului la orice
structur form|
|, adic de poate
| nu se înv|Û|mânt
scrie cu
Da plat| sau alte
ta ci este persoanescrierea
obligatorie doritoaresub
pot multiplica
forma documentul
stru ct Data . numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
1 stru ct Data
2 {ANTAL Tiberiu Alexandru
3 int zi;
4 tel.: 0040-264-530918
int luna;
5 e-mail:int
antaltiberiu@pcnet.ro
an;
6 } zinastere, zisalar;
7
8 struct Data zioarecare;
9
10 stru ct D ata sapta m an a[7];

145
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
saptamana este un tablou de 7 ele m en te , fiecare element fiind o structur| de tipul Da ta .
Catedra de Mecanic| Õi Programare
Fiecare element are deci un an, o lun| Õi o zi distinct|. Ne referim la elementul 0 prin
Curs de limbaj C
saptamana[0] , iar prin saptam ana[0].zi la membrul zi al elementului 0 . Pentru a accesa
luna elementului 4 scriem saptamana[4].luna etc.
Copyright 2001. Toate drepturile sunt rezervate autorului.
În capitolul despre tablouri am v|zut modul în care se foloseau
IniÛializarea variabilelor
acoladele înpentru
Multiplicarea acestui document iniÛializarea
scop comercial estetablourilor
interzis|. cu una sau mai multe
de tip structur|
dimensiuni. IniÛializarea structurilor se face dup| o sintax|
SudenÛii participanÛi lasimilar |. Dedeexemplu,
orice form| înv|Û|mântdac | dorim
superior s| ini
bugetar potÛializ|m variabila
multiplica acest
zioarecare în locul liniei
document pentru uzul personal.8 scriem:

stru ct D ata zioareca re ={19,12,19 76};


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot
primamultiplica
valoare documentul numaiprimului
- 19 - i se atribuie contra cost Õi cu acordul
membru scris
- zi , a dou al autorului.
| valoare - 12 - În acest
celui de al
scop m|membru
doilea puteÛi contact|
- luna Õila:
a treia valoare - 1976 - membrului an . Dac| se declar| o variabil|
de tipul structur| cu numele babe :
ANTAL Tiberiu Alexandru
struct Mem bru_familie babe;
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
iniÛializarea mem brilor ei se face astfel:

strcp y(bab e.nu m epe rsoa na ,"Sm ara nd a Q uiz ");


babe.varsta=24;

Pentru c| este posibil ca o structur| s| declare membri de tipul structur|, voi prezenta
un
Conf.exemplu iniÛalizare
dr. ing.deANTAL Õi pentru
Tiberiu acest caz. S| presupunem ca7 se declar| o variabil| x
Alexandru
de tipul structur | Su m a_ platita
Universitatea Tenhic| din Cluj-Napoca . În cazul tablourilor cu mai multe dimensiuni, pentru
fiecare dimensiune foloseam
Facultatea ConstrucÛii de MaÕini o pereche de acolade. Pentru structuri cu membri structur|,
ini Ûializarea unui membru
Catedra de Mecanic| Õi Programarese face similar, fiind necesar| pentru fiecare astfel de membru
câte o pereche de acolade.
Curs de limbaj C
struct Su ma _platita x={
Copyright
{12,72001.
,197 6},Toate drepturile sunt rezervate autorului.
12345000,
"N im icuri"
Multiplicarea acestui document în scop comercial este interzis|.
};

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
10.1 Operatorul de select-ie a unui
document pentru uzul personal.

membru denumai
pot multiplica documentul structura 7 acordul scris al autorului. În acest
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
contra cost Õi cu
scop m| puteÛi contact| la:
Form a 7: expresie.mem bru
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
O expresie urmat| de operatorul de select-ie a membrului "." Õi apoi de numele membrului
e-mail:
face selec Ûia membrului din structur| sau reuniune (reuniunea sau union va fi prezentat|
antaltiberiu@pcnet.ro
în capitolul urm|tor). Primul operand, exp resie , trebuie s| fie o structur| sau o reuniune,
al doilea trebuie s| identifice un mem bru . Rezultatul este valoarea membrului selectat Õi
este o l-value dac| membrul este o l-value , adic| poate s| apar| în stânga operatorului
de atribuire.

146
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
1 /* STR UC T1.C */
2
Facultatea ConstrucÛii de MaÕini
#include<stdio.h>
3 Catedra de Mecanic| Õi Programare
#include<string.h>
4 Curs de limbaj C
5 stru ct Data
6 {
7
Copyright 2001. Toate drepturile sunt rezervate autorului.
cha r zi;
8 char luna;
9 Multiplicarea
int an; acestui document în scop comercial este interzis|.
10 };
11
12
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
struc t M em bru _fa m ilie
13 {document pentru uzul personal.
14 char nu m e_ perso an a[50];
15 int
SudenÛii varsta;
participanÛi la orice form|
de înv|Û|mânt cu plat| sau alte persoane doritoare
16 char func tie[2 5];
17
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
18 scop m| puteÛi contact| la:
};
19
20 stru
ANTAL ct SuTiberiu
m aP latita
Alexandru
21 {
tel.: 0040-264-530918
22 struc t Data data _pla tii;
23 e-mail:long
antaltiberiu@pcnet.ro
suma;
24 char m otiv [255 ];
25 };
26
27 stru ct Ch eltu ieli
28 {
29 struct Mem bru_familie cine;
30 stru
Conf. dr. ct Sum
ing. ANTALaP latita cit[2];
Tiberiu Alexandru
31 struc t Che ltuieli *ptrC heltu ieli;
Universitatea Tenhic| din Cluj-Napoca
32 };
33 Facultatea ConstrucÛii de MaÕini
34 Catedra
int de Mecanic| Õi Programare
main(void)
35 {Curs de limbaj C
36 struct Ch eltuieli a = {
37
38 Copyright 2001. Toate
{"Sile a Mdrepturile
icu ",47 ,"casunt
p d erezervate
fa m ilie"},autorului.
39 {{{1,2,19 98 },100 000L ,"ch ef"}, {{3,4,19 99},2000000L ,"nun ta"}},
40 Multiplicarea NULL
acestui document în scop comercial este interzis|.
41 };
42 int i;
43 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
44 document pentru uzul
printf("%s, de personal.
v ars ta %i, % s, a che ltuit as a:\ n", a.cine .nu m e_ perso an a,\
45 a.cin e.va rsta , a.cin e.fu nctie);
46 for(i=0;i<2;i++)
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
47 printf("- zi = % i, luna = %i, an = %i, lei = % li, pe ntr u % s\n",\
48 pot multiplicaplatii.zi,
a.cit[i].data_ documentul numaita_
a.cit[i].da contra costnaÕi, cu
pla tii.lu acordulta_
a.cit[i].da scris
plaaltii.a
autorului. În acest
n, a .cit[i].sum a, \
49 scop m| otiv);
a.cit[i].m puteÛi contact| la:
50
51 return 0;
ANTAL Tiberiu Alexandru
52 }
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Rezultate:
Sile aMicu, de varsta 47, cap de familie, a cheltuit asa:
- zi = 1, luna = 2, an = 1998, lei = 100000, pentru chef
- zi = 3, luna = 4, an = 1999, lei = 2000000, pentru nunta

147
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
Accesul la un ConstrucÛii
membru deDac| membrul de accesat este tablou cu o dimensiune, de
MaÕini
exemplu cit , având elementele de tipul structur| Su m aP latita ,
Catedra de Mecanic| Õi Programare
tablou
operatorul [ ] trebuie folosit pentru accesul la elementele tabloului
Curs de limbaj C dup|, cum se observ| în liniile 48 Õi 49.
Copyright 2001. Toate drepturile
Când un sunt rezervate
membru este autorului.
la rândul lui o structur|, de exemplu
Accesul la un membru al
membrul cine este o structur| de tipul M em bru _fa m ilie , trebuie
unui membru structur|
folosit deîndou
Multiplicarea acestui document | ori
scop operatorul
comercial este"." pentru a accesa un membru din
interzis|.
interiorul membrului structur| (vezi liniile 44 Õi 45 ).
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest

10.2 Comparat-ie între tablou s- i


document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
structura
pot 7
multiplica documentul
scop m| puteÛi contact| la:
numai contra cost Õi cu acordul scris al autorului. În acest
Atât tabloul cât Õi structura sunt tipuri de date structurate. Tipurile structurate se
definesc în termenii unor tipuri deja existente. Exist| mai multe metode de combinare a
ANTAL Tiberiu
tipurilor pentru a forma o structur| de date complex|, acestea fiind numite
Alexandru
constituente
de structurare . Metodele de structurare difer| prin strategia de construire a
tel.: 0040-264-530918
metode
tipului
e-mail: structurat Õi modalit|Ûile de acces la componentele acesteia. Variabila tablou
antaltiberiu@pcnet.ro
grupeaz| componente de acelaÕi tip, numite elemente, sub un singur nume, numele
tabloului. Metoda de selectare a unei componente este indexarea, numele tabloului
primind ca argument indexul pentru a selecta o component| particular|. Variabila
structur| grupeaz| sub acelaÕi nume componente de tipuri diferite, numite membri,
metoda de acces la acestea fiind selectorul de membru. Putem spune c| ambele tipuri
structurate permit gruparea de variabile sub un singur nume. În ciuda acestei asem|n|ri,
Conf. dr. ing.trateaz
compilatorul ANTAL Tiberiu
| cele dou|Alexandru
tipuri structurate diferit. Dup| cum ÕtiÛi deja, în C numele
Universitatea
unui tablou esteTenhic|
adresadin element de tablou. Pentru o variabil| de tipul structur|,
Cluj-Napoca
primului
numele variabilei
Facultatea structur
ConstrucÛii | este asemenea unui nume de variabil| simpl| (nu este adresa
de MaÕini
unui
Catedramembru al structurii).
de Mecanic| Õi Programare
Curs de limbaj C
Când un tablou se transfer| ca parametru al unei funcÛii nu se poate alege modul de
transfer
Copyright pentru | numele
2001. cToate tabloului
drepturile este
sunt automat
rezervate transformat într-un poantor constant
autorului.
la primul element de tablou. Nu exist| nici o metod| prin care s| forÛ|m transferul unui
parametru tablou prin valoare. În cazul structurii, decizia este la dispoziÛia
Multiplicarea
programatorului, acestui document
aceasta în scop
putându-se comercial
transfera este
atât interzis|.
prin valoare cât Õi prin poantor.

O funcÛieparticipanÛi
SudenÛii la oriceun
nu poate întoarce form|
tablou. Este îns| posibil
de înv|Û|mânt s| bugetar
superior întoarcempotun
multiplica
poantor acest
la un
documentdepentru
element tablou,uzul dac| acesta este chiar primul element putem spune c| întregul
iar personal.
tablou este întors. Argumentul de mai sus este îns| prea slab în comparaÛie cu structura,
care se poate
SudenÛii întoarcelaatât
participanÛi oriceprin valoare
form| cât Õi prin cu
de înv|Û|mânt poantor.
plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Cele spuse
scop m| sus pot fila:sintetizate în tabelul urm|tor:
maicontact|
puteÛi

ANTAL Tip TiberiuNumele obiectului


Alexandru Transfer în caz de Valoare întoarsa7 de
obiect
tel.: 0040-264-530918 este parametru de funcÛie
e-mail: antaltiberiu@pcnet.ro funct-ie
tablou poantor constant la poantor -
primul element

148
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
structura 7 ConstrucÛii
structurade
în MaÕini
sine valoare sau poantor prin valoare sau prin
Catedra de Mecanic| Õi Programare poantor
Curs de limbaj C

10.3 Atribuirea
Copyright 2001. Toate drepturile suntstructurilor
rezervate autorului.
O variabil| de tipul structur| poate fi atribuit| unei alte variabile de acelaÕi tip structur|
Multiplicarea
prin intermediul acestui
lui "="document
. Valorile în scop comercial
tuturor membriloreste interzis|.
variabilei structur| din dreapta lui =
vor fi copiate în membrii variabilei structur| din stânga lui = (inclusiv membri tablou sau
SudenÛii|participanÛi
structur ). De exemplu, folosind
la orice form|tipul
de structur| Dasuperior
înv|Û|mânt ta declarat pot Õmultiplica
mai sus
bugetar i dou| variabile
acest
zi1 Õi zi2 , dintre care prima
document pentru uzul personal. este ini Ûializat| ,

struct Data
SudenÛii zi1 {28,7,1967},
participanÛi zi2;
la orice form|
de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
este corect s| scriem:
scop m| puteÛi contact| la:
zi2=zi1
ANTAL Tiberiu Alexandru
tel.: de cât de complicat| va fi structura, toÛi membrii ei se vor copia. În cazul
0040-264-530918
Indiferent
tablourilor, o astfel de operaÛie este imposibil| pentru c| numele tabloului este un poantor
e-mail: antaltiberiu@pcnet.ro
constant la primul element de tablou. În cazul unei declaraÛii de forma:

char a[8 0], b[80 ];

o atribuire de genul "b=a" ar încerca s| modifice adresa poantorului constant b la cea a lui
a , lucru imposibil pentru c| poantorul fiind constant, el va poanta tot timpul execuÛiei
Conf. dr. ing. aceea
programului ANTAL Tiberiu
Õi adres Alexandru va sancÛiona o astfel de atribuire printr-un
|. Compilatorul
Universitatea
mesaj de eroare.Tenhic| din Cluj-Napoca
De asemenea, este imposibil| comparaÛia între dou| variabile de tipul
Facultatea ConstrucÛii
structur|, dar compara deÛiaMaÕini
se poate face membru cu membru, dac| membrii nu sunt
Catedra sau
tablouri structuri.Õi Programare
de Mecanic|
Curs de limbaj C

10.42001.
Copyright Transferul
Toate drepturile suntvariabilelor
rezervate autorului. de tipul
structura
Multiplicarea 7 document
acestui ca parametri de funct-ii
în scop comercial este interzis|.
Dac| în cazul tabloului nu era de ales, la structuri o variabil| se poate transfera prin
SudenÛii
valoare sau participanÛi la orice
prin poantor. form| de
Problema înv|Û|mânt
care superior
se pune este bugetar
de alegere pot multiplica
a celei acest
mai avantajoase
document
metode depentru uzulToate
transfer. personal.
operaÛiile de transfer se deruleaz| prin stiv|, în sensul c|
obiectele de transferat se copiaz| pe aceasta. Dac| obiectul este mare copierea lui va dura
mult
SudenÛiiÕi programul va rula
participanÛi încet.
la orice În plus,
form| apare posibilitatea
de înv|Û|mânt sau|Õ
cu plat| dep iriipersoane
alte dimensiunii maxime
doritoare
apot
stivei. Transferul unui poantor va ocupa cel mult 4 octeÛi. Transferul unei
multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acestvalori de tipul
scop m| |puteÛi
structur contact| la:de tipul membrilor structurii. Alegerea între copierea a 4 octeÛi
va fi dependent
sau a unui num|r mai mare este simpl|. Putem spune c| este mai avantajoas| folosirea
transferului
ANTAL Tiberiu poantor, aceasta asigurând Õi independenÛa de spaÛiul necesar pentru
prinAlexandru
stocarea variabilei structur|. Considerând tipul structurat Da ta , cele dou| metode de
tel.: 0040-264-530918
transfer posibile sunt ilustrate în urm|toarele prototipuri:
e-mail: antaltiberiu@pcnet.ro
void f_ va loar e(stru ct Data zi);
void f_ poa ntor(stru ct Data *zi);

iar apelurile celor dou| funcÛii, considerând o variabil| cu numele zi de tipul structurat

149
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Da ta sunt:
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
f_v aloa re(zi);
Curs
f_p oandetor(&
limbajzi);C

În primul caz,
Copyright variabila
2001. zi fiind format
Toate drepturile | din 3 tipuri
sunt rezervate int care se stocheaz| pe 4 octeÛi pe
autorului.
stiv| se vor copia 12 octeÛi. În cel de al doilea caz, poantorul va ocupa pe stiv| numai 4
octe Ûi.
Multiplicarea acestui document în scop comercial este interzis|.

10.5 Poantori la structuri


SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
Transferul prin poantori este mai eficient decât cel prin valoare dar codul din funcÛii
devine
SudenÛiimai complicatla
participanÛi deorice
scris.form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
1 /* STR UC T2.C */
2
scop m| puteÛi contact| la:
#include<stdio.h>
3 stru ct Data
4 {
ANTAL Tiberiu Alexandru
5 cha r zi;
tel.: 0040-264-530918
6 char luna;
7
e-mail:int
antaltiberiu@pcnet.ro
an;
8 };
9
10 void cite ste_ da ta(struct Da ta *);
11
12 int main(void)
13 {
14 struc
Conf. dr. ing.t Data
ANTALo_zi;
Tiberiu Alexandru
15 cites te_da ta(& o_zi);
Universitatea Tenhic| din Cluj-Napoca
16 prin tf("Da ta es te: %i, % i, %i\ n",o_zi.zi, o_zi.lun a, o_ zi.an );
17
Facultatea
}
ConstrucÛii de MaÕini
18 Catedra de Mecanic| Õi Programare
19 void
Curs citeste_
de limbajdaC
ta(struc t Data *pzi)
20 {
21 prin tf("zi = ");
22
Copyright 2001. Toate drepturile sunt rezervate autorului.
sca nf("% i",& (*pzi).zi);
23 prin tf("lun a = ");
24 Multiplicarea acestui
sca nf("% document
i",& (*pzi).lu na ); în scop comercial este interzis|.
25 prin tf("an = ");
26 sca nf("% i",& (*pzi).a n);
27
SudenÛii
}
participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
Rezultate:
SudenÛii
zi = 28 participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
luna = 12
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
an = 1978
scop m| puteÛi contact| la:
Data este: 28, 12, 1978

ANTAL
În cazul Tiberiu Alexandru
transferului unui poantor p la o structur|, un membru numit m emb ru se va
accesa prin:
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
(*p).mem bru

ObservaÛi aceast| form| de scriere în liniile 22 , 24 , 26 . Întrebarea care apare este legat|
de necesitatea folosirii parantezelor rotunde.

150
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
10.5.1 De ce (*p).membru?
Catedra de Mecanic| Õi Programare
De
Curs cede
este C s| scriem (*p).mem bru în loc de *p.mem bru ? Cei doi operatori, "*" Õi
necesar
limbaj
"." au precedenÛe diferite. Operatorul de selecÛie a unui membru de structur|, "." , are
CopyrightÛa2001.
preceden cea mai mare.
Toate dac| rezervate
Astfel, sunt
drepturile se scrie *p.mem bru , avem implicit *(p.mem bru).
autorului.
Pentru ca la compilare totul s| mearg| bine, p ar trebui s| fie o structur|. Dar p nu este
o structur|, ci un poantor la structur|. Dac| totuÕi p ar fi fost o structur|, mem bru ar fi
Multiplicarea
fost accesat, îns acestui document
| operatorul în scop comercial este interzis|.
"*" ar fi aflat valoarea la care poanteaz| p.mem bru . Adic| ar
fi fost departe de a accesa ceea ce credeam noi - valoarea lui mem bru poantat| de p .
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Deoarece au folosit
document pentru uzulmult poantorii la structuri, Kernighan Õi Ritchie au inventat un
personal.
operator nou care s| fie mai simplu de folosit. El era format din dou| caractere separate,
"-" Õi ">" participanÛi
SudenÛii care combinate au dat
la orice form|"-> ".deEra ceva similar
înv|Û|mânt cu "/"
cu plat| saucombinat cu "*"doritoare
alte persoane din care a
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest |
rezultat "/*" , adic| secven Ûa de deschidere a unui comentariu. Forma de scriere complicat
(*p).mem bru devine p->mem bru , fiind mai uÕor de scris Õi de citit.
scop m| puteÛi contact| la:

10.5.2 Utilizarea lui p->membru


ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Dup | cum
e-mail: se observ| în codul care urmeaz|, de exemplu (*pzi).zi devine pzi->zi.
antaltiberiu@pcnet.ro
void citeste_ da ta(struc t Data *pzi)
{
prin tf("zi = ");
sca nf("% i",& pzi->zi);
prin tf("lun a = ");
sca nf("% i",& pzi->lun a);
Conf. dr. ing.
prin ANTAL
tf("an = "); Tiberiu Alexandru
Universitatea Tenhic|
sca nf("% i",& din Cluj-Napoca
pzi->an );
}Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Ce se petrece îns| dac| membrul structurii este la rându-i o structur|?
Curs de limbaj C
1 /* STR UC T3.C */
2 Copyright 2001. Toate drepturile sunt rezervate autorului.
#include<stdio.h>
3 stru ct Data
4 {
Multiplicarea acestui document în scop comercial este interzis|.
5 cha r zi;
6 char luna;
7 SudenÛii participanÛi
int an; la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
8 };
document pentru uzul personal.
9
10 struct Persoana
11 SudenÛii
{ participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
12 pot multiplica
char nudocumentul
m e[8 0]; numai contra cost Õi cu acordul scris al autorului. În acest
13 scop m|struc t Data
puteÛi datala:
contact| na sterii;
14 };
15
16 ANTAL
void cite Tiberiu Alexandru
ste_ per s(stru ct Pe rsoa na *);
17 tel.: 0040-264-530918
void sc rie_ per s(stru ct Pe rsoa na *);
18 e-mail: antaltiberiu@pcnet.ro
19 int main(void)
20 {
21 stru ct Pe rsoa na un ul;
22
23 cites te_per s(& un ul);

151
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
24 scrie_ per s(& un ul);
25
Facultatea ConstrucÛii de MaÕini
26 Catedra de
returnMecanic|
0; Õi Programare
27 }Curs de limbaj C
28
29 void citeste_pers(struct Persoana *om)
30
Copyright
{
2001. Toate drepturile sunt rezervate autorului.
31
32 Multiplicarea acestui
prin tf("N document
um ele: "); în scop comercial este interzis|.
33 gets (om ->nu m e);
34 prin tf("zi = ");
35
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
sca nf("% i",& om ->da tan aste rii.zi);
36 document
prinpentru
tf("lunuzul
a = ");personal.
37 sca nf("% i",& om ->da tan aste rii.lun a);
38 prin
SudenÛii tf("an = ");la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
participanÛi
39 sca nf("% i",& om ->da tan aste rii.an );
40
pot
}
multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
41 scop m| puteÛi contact| la:
42 void scrie_pers(struct Persoana *om)
43 {ANTAL Tiberiu Alexandru
44 prin tf("N um ele este: % s\n ", om ->nu m e);
tel.: 0040-264-530918
45 prin tf("\tD ata nasterii este: %i, %i, %i\ n",om ->da tana sterii.zi,\
46 e-mail: antaltiberiu@pcnet.ro
om ->da tan aste rii.lun a, om ->da tan aste rii.an );
47 }

Rezultate:
Numele: Ion Apostol
zi = 11
luna = 12
Conf. dr. ing. ANTAL Tiberiu Alexandru
an = 1947
Universitatea
Numele este: Tenhic| din Cluj-Napoca
Ion Apostol
Data nasterii este: 11, 12, 1947
Facultatea ConstrucÛii de MaÕini
Catedra
ObservaÛde
i cMecanic| Õi Programare
| da tana sterii este un membru structur|, membrul zi este accesat prin
Curs de limbaj C
om->da tanasterii.zi Õi nu prin om->da tanasterii->zi , din moment ce da tana sterii este o
structur| Õi nu un poantor la structur|.
Copyright 2001. Toate drepturile sunt rezervate autorului.
10.5.3 Problema transferului prin poantor
Am
Multiplicarea | transferul
spus deja cacestui printr-un
document poantor
în scop este mai
comercial esteeficient decât cel prin referinÛ|, dar
interzis|.
în cazul acestui transfer este posibil| modificarea valorilor poantate de poantor, ceea ce
este uneori
SudenÛii un dezavantaj.
participanÛi În form|
la orice cazul tablourilor acestsuperior
de înv|Û|mânt fapt este de neevitat,
bugetar iar elementele
pot multiplica acest
tabloului vor putea fi întotdeauna
document pentru uzul personal. modificate în interiorul func Ûiei care le prime Õte ca
parametru. Un dezavantaj al transferului prin poantor al parametrilor structur| este cazul
în care nu dorim s| realiz|m modific|ri ale structurilor în interiorul funcÛiei, dar din
SudenÛii
grab|, departicipanÛi
exemplu, înlalocul
oriceoperatorului
form| de înv|Û|mânt cu plat| sau alte persoane doritoare
"==" scriem "=" .
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
SoluÛiala:
scop m| puteÛi contact| acestei probleme este utilizarea cuvâtului cheie const discutat în
Utilizarea lui
paragraful 3.3.2. La fel ca în cazul unei variabile obiÕnuite, este posibil
const
ca un poantor s| fie declarat poantor constant. De exemplu, prin
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918declaraÛia const float *x; se declar| x ca un poantor la un float constant.
Valoarea stocat | în poantor se poate modifica. De exemplu, putem scrie x-–;, dar valoarea
e-mail: antaltiberiu@pcnet.ro
stocat| la adresa respectiv| nu se poate modifica, adic| nu se poate scrie *x=21; întrucât
compilatorul va semnala linia cu eroare. În cazul structurii, folosirea lui const conduce la
un poantor la o structur| constant|, motiv pentru care membrii structurii nu vor putea fi
modificaÛi prin intermediul poantorului.

152
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca

10.6 Întoarcerea unei valori


Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
structura 7 de ca7 tre o funct-ie
Copyright 2001. Toate drepturile sunt rezervate autorului.
FuncÛiilor li se pot transfera structuri prin valoare Õi pot întoarce structuri, deÕi de multe
ori aceast| modalitate de întoarcere este ineficient|. ConsideraÛiile legate de eficienÛa
întoarcerii
Multiplicareastructurilor r|mân acelea
acestui document în scopÕi comercial
ca în cazulestetransferului
interzis|. de parametri. Cu cât
structura este mai mare, cu atât eficienÛa transferului prin valoare este mai sc|zut| faÛ|
de cea prin
SudenÛii poantor. la
participanÛi Exist | cazuri
orice form| în
de care beneficiile
înv|Û|mânt transferului
superior bugetarunei acest|
valori structur
pot multiplica
permit implementarea unor
document pentru uzul personal. operatori. Un astfel de caz se prezint | în continuare.
Presupunem c| dorim s| scriem o funcÛie care s| poat| aduna dou| numere complexe.
Întoarcerea unei valori
SudenÛii participanÛi la structur | permite
orice form| scrierea cu
de înv|Û|mânt unei Ûii ad
funcsau
plat| un ac() care s| apar| în
alte persoane doritoare
dreapta unui egal. Dac| c1 Õi c2 sunt cele dou| numere complexe, iar în c3 dorim s| stoc|m
pot multiplica documentul numai contra cost Õi
suma celor dou| numere, scriem c3=c1+c2 . Folosind funcÛia ad un ac(), ce În
cu acordul scris al autorului. acest |
realizeaz
scop m| puteÛi
adunarea complexcontact| la: c3=adun ac(c1,c2) (vezi linia 15 ).
|, scriem
1 ANTAL Tiberiu
/* CO M PLE X1.CAlexandru
*/
2 #include
tel.: <stdio.h>
0040-264-530918
3
4
e-mail: antaltiberiu@pcnet.ro
struct complex
5 {
6 doub le real,imagin ar;
7 };
8
9 void a fisa rec(s truct com plex a);
10 stru ct com plex ad un ac(struct com plex a, stru ct com plex b);
11 Conf. dr. ing. ANTAL Tiberiu Alexandru
12 int main(void)Tenhic| din Cluj-Napoca
Universitatea
13 {
Facultatea ConstrucÛii de MaÕini
14 struct complex c1={1.,2.}, c2={-2.,3.}, c3;
15 Catedra de du
c3=a Mecanic| Õi);Programare
na c(c1,c2
16 Curs deafis
limbaj C
are c(c3);
17
18 return 0;
Copyright 2001. Toate drepturile sunt rezervate autorului.
19 }
20
21 Multiplicarea acestui complex
void afisarec(struct documenta)în scop comercial este interzis|.
22 {
23 prin tf("%+lf %+lf\n ",a.re al,a.im ag ina r);
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
24 }
25 document pentru uzul personal.
26 struct complex adunac(struct complex a, struct complex b)
27 {SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau
alte persoane doritoare
28 struct complex suma=a;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
29
30 scop m|suputeÛi
m a.recontact|
al+=b .reala:
l;
31 sum a.imagina r+=b.imaginar;
32 ANTAL Tiberiu Alexandru
33 return suma;
tel.: 0040-264-530918
34 }
e-mail: antaltiberiu@pcnet.ro
Rezultat:
-1.000000 +5.000000

Varianta de scriere a programului folosind poantorii este:


153
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
1 /* CO M PLE X2 .C */
2
Facultatea ConstrucÛii de MaÕini
#include <stdio.h>
3 Catedra de Mecanic| Õi Programare
4 Curs decomplex
struct limbaj C
5 {
6 doub le real,imagin ar;
7
Copyright
};
2001. Toate drepturile sunt rezervate autorului.
8
9 Multiplicarea acestui
void a fisa rec(s document
truct com plex a);în scop comercial este interzis|.
10 void a du na c(stru ct com plex *a, struct com plex *b, struct com plex *su m ac);
11
12
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int main(void)
13 {document pentru uzul personal.
14 struct complex c1={1.,2.}, c2={-2.,3.}, c3;
15 adparticipanÛi
SudenÛii un ac(& c1,&la
c2,& c3);form| de înv|Û|mânt
orice cu plat| sau alte persoane doritoare
16 afis are c(c3);
17
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
18 scop m|return
puteÛi 0;
contact| la:
19 }
20 ANTAL Tiberiu Alexandru
21 void afisarec(struct complex a)
tel.: 0040-264-530918
22 {
23 e-mail:prin
antaltiberiu@pcnet.ro
tf("%+lf %+lf\n ",a.re al,a.im ag ina r);
24 }
25
26 void adu nac(struct complex *a, struct complex *b, struct complex *sum ac)
27 {
28 su m ac-> rea l=a->rea l+b->rea l;
29 sum ac->imagina r=a->imaginar+b->ima ginar;
30 }Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Pentru acest
Facultatea program se
ConstrucÛii de foloseÕte transferul prin poantori pentru toÛi parametrii. Chiar
MaÕini
daca7 nu exist| ineficientul transfer prin valoare, observaÛi modul în care suntem obligaÛi
Catedra
s| apel|mdefunc
Mecanic| Õi Programare
Ûia de adunare ad un ac(& c1,& c2,& c3); (vezi linia 14 ) spre deosebire de linia
Curs de limbaj C
c3=a du na c(c1,c2 ); din programul precedent.

Copyright 2001. Toate drepturile


Probabil gr|rezervate
unii maisunt biÛi ar fi rescris
autorului.
codul primului program pentru a
O eroare fatal|
lucra cu transferul prin poantori sub forma:
Multiplicarea acestui document în scop comercial este interzis|.
struct complex* adunac(struct complex a, struct complex b)
{
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar
struct complex suma=a;
pot multiplica acest
document pentru uzul personal.
su m a.re al+=b .rea l;
sum
SudenÛii a.imaginala
participanÛi r+=b.imaginar;
orice form| de
înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
return &suma;
scop
} m| puteÛi contact| la:

Programul
ANTAL TiberiuconÛine o eroare fatal|. Variabila s um a este stocat| pe stiv|, adic| spaÛiul
Alexandru
tel.: 0040-264-530918alocat pe stiv| la intrarea în funcÛie Õi eliberat la ieÕirea din aceasta,
pentru aceasta este
e-mail:c|antaltiberiu@pcnet.ro
astfel dup| ieÕirea din funcÛie, adresa poantat| de & su m a nu mai face parte din spaÛiul
de date al programului.

154
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca

10.7 Crearea unei liste înla7 nt-uite


Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
prin folosirea structurilor
Copyright 2001. Toate drepturile sunt rezervate autorului.
Limbajul C permite crearea Õi manipularea unor structuri de date avansate cum ar fi
listele înl|nÛuite, arborii, grafele etc. În cele ce urmeaz| prezint cel mai simplu caz, lista
simplu înl|nÛuita
Multiplicarea 7 , folosit
acestui | pentru
document stocarea
în scop unoreste
comercial numere întregi (int ). Lista sim plu
interzis|.
înlant- uita7 este o structur| de date în care fiecare element conÛine un poantor la urm|torul
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


Figura 20
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
element, formându-se astfel o list| liniar|. Reprezentarea ei grafic| o ga7 sit-i în Figura 20,
iar un element al listei se declar| prin structura:

stru ct elem en t {
int data; /* aici este stocata data "u tila" */
struct element * elem_urm ;
}Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Structura
Facultateacu numele element
ConstrucÛii de MaÕiniare o particularitate curioas| Õi anume aceea c| se refer| la
ea îns|Õi. Am întâlnit deja aÕa ceva în cazul funcÛiilor când am vorbit despre recursivitate.
Catedra
Dupa7 cum deseMecanic| Õi Programare
vede, aceasta apare atât la nivelul funcÛiilor cât Õi la cel al datelor. Structura
Curs de limbaj C
element este format| dintr-un întreg de tipul int Õi un poantor la o structur| de tipul
element . DeÕi compilatorul nu Õtie exact ce înseamn| un poantor la o structur| de tipul
Copyright
element , el2001.
cunoa Õte num
Toate |rul de sunt
drepturile octeÛrezervate
i necesariautorului.
pentru stocarea unui poantor. Astfel
creeaz| un spaÛiu în structur| necesar pentru stocarea unui poantor. În programul
LIS TA 1.C listaacestui
Multiplicarea este creat | prin declararea
document a patrueste
în scop comercial variabile de tipul element. ObservaÛi
interzis|.
c| mai întâi este declarat Õi iniÛializat elementul e4 care este ultimul element al listei.
Întrucât acest element
SudenÛii participanÛi lanu
orice urmaÕde
areform| , fiind ultimul, valoarea
înv|Û|mânt superior corespunz
bugetar pot|toare poantorului
multiplica acest
la urm | torul element de list
document pentru uzul personal. | este ini Ûializat| cu valoarea NULL . Apoi este declarat e3 Õi
legat de e4 prin iniÛializarea din linia 12 . Aceasta este singura metod| prin care
elementele listei pot fi legate, adic| nu se poate s|-l declar|m pe e3 Õi s| încer|m s|-l
SudenÛii
leg|m departicipanÛi
un e4 care la
încorice
| nu form|
exist| de înv|Û|mânt
(pentru c| din cu plat| sau
moment alteexist
ce nu persoane
| nu-i doritoare
cunoaÕtem
pot multiplica
adresa). documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
1 /* LISTA 1.C */
2 #in clude<std
ANTAL io.h>
Tiberiu Alexandru
3
4
tel.: 0040-264-530918
stru ct elem en t {
5 e-mail:int
antaltiberiu@pcnet.ro
data;
6 struct element *elem_urm ;
7 };
8
9 int main(void)
10 {

155
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
11 stru ct elem en t e4 = {22, NULL };
12
Facultatea ConstrucÛii de MaÕini
stru ct elem en t e3 = {-1, & e4};
13 Catedra de elem en tÕie2Programare
Mecanic|
stru ct = {12, & e3};
14 Curs destru
limbaj C en t e1 = {10, & e2};
ct elem
15
16 struct elem ent *el_cu rent = &e 1;
17
Copyright 2001. Toate drepturile sunt rezervate autorului.
18 while (el_curent != NULL)
19 Multiplicarea
{ acestui document în scop comercial este interzis|.
20 prin tf("Va loar ea este: %i\n ", el_c uren t->da ta);
21 el_curent=el_curent->elem_urm ;
22
SudenÛii
}
participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
23 document pentru uzul personal.
24 return 0;
25 }SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Rezultate:
scop m| puteÛi contact| la:
Valoarea este: 10
Valoarea este: 12
ANTAL Tiberiu
Valoarea este: Alexandru
-1
tel.: 0040-264-530918
Valoarea este: 22
e-mail: antaltiberiu@pcnet.ro
O alternativ| pentru crearea listei este codul:

1 stru ct elem en t e4 = {22, NULL };


2 stru ct elem en t e3 = {-1, N ULL };
3 stru ct elem en t e2 = {12, N ULL };
4 stru ct elem en t e1 = {10, N ULL };
5 stru ct elem en t *el_curen t;
6
Conf. dr. ing. ANTAL Tiberiu Alexandru
7 Universitatea Tenhic|
e3.elem_urm = &e4; din Cluj-Napoca
8 Facultatearm
e2.elem_u ConstrucÛii
= &e3; de MaÕini
9 e1.elem_urm = &e2;
Catedra de Mecanic| Õi Programare
10 el_cure nt=&e 1;
Curs de limbaj C
Aici în prima etap| poantorii nu poanteaz| nic|ieri, fiind iniÛializaÛi toÛi cu valoarea NULL ,
Copyright
dup| care 2001. Toate
poantorii drepturile
sunt completa sunt rezervate
Ûi prin autorului.
codul din liniile 7-10 care duce la înl|nÛuirea
elementelor listei. Ordinea iniÛializ|rilor este important|. De exemplu, dac| s-ar fi folosit
secven Ûa:
Multiplicarea acestui document în scop comercial este interzis|.

e4.elem_u
SudenÛii rm = &e3; la orice form|
participanÛi de înv|Û|mânt superior bugetar pot multiplica acest
e3.elem_u rm = &e2;
document pentru uzul personal.
e2.elem_ urm = &e1;
el_curent=&e4;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot|multiplica
leg turile întredocumentul
elemente senumai
fac în contra
sensul opus
cost Õi(e4
cueste primul
acordul element
scris Õi e1 este
al autorului. Înultimul),
acest
scop| m|
dup cumputeÛi
se poate la: la afiÕarea rezultatelor:
observa
contact|
Valoarea este: 22
ANTAL Tiberiu Alexandru
Valoarea este: -1
tel.: 0040-264-530918
Valoarea este: 12
e-mail:
Valoarea antaltiberiu@pcnet.ro
este: 10

156
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
10.7.1 Parcurgerea listei simplu înla7 nt-uite
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
PorÛiunea de program care realizeaz| afiÕarea elementelor listei este un exemplu clasic
Curs de limbaj
de vizitare C
a tuturor elementelor din list|. SpaÛiul datelor este prezentat în Figura 21,
adresele folosite în figur| au un rol didactic, uÕurând înÛelegerea operaÛiei de parcurgere
aCopyright 2001. Toate
listei. Adresa drepturile
primului element sunt
derezervate
list| esteautorului.
stocat| în poantorul el_curent prin
atribuirea din linia 16 (vezi LIS TA 1.C ). Modul de înl|nÛuire a elementelor listei ne oblig|
| o parcurgem
sMultiplicarea într-un
acestui singurînsens.
document scop Dac | în locul
comercial liniei 16 scriam struct element
este interzis|.
*el_curent = &e4; parcurgerea listei ar fi fost compromis|, pentru c| e4 nu are un element
urm |tor.participanÛi
SudenÛii Acest ultim la element al listei
orice form| dese mai numeÕsuperior
înv|Û|mânt te Õi coada listei ,pot
bugetar iar multiplica
primul element,
acest
acela cu care se începe parcurgerea
document pentru uzul personal. listei, capul listei .

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Figura 21

Parcurgerea listei prin vizitarea tuturor elementelor ei se realizeaz| prin ciclul w hile din
linia 18 . Cât timp el_curent este diferit de valoarea NULL se va executa afiÕarea valorii
stocate în membrul data al structurii, apoi prin linia de program el_curen t =
Conf. dr. ing. ANTAL
el_curent->elem_u rm; Tiberiu
adresa urm |torului element din list| este transferat| în el_curent.
Alexandru
Observa Ûi c| Tenhic|
Universitatea în poantorul el_curent vor fi stocate pe rând adresele 0x0065FDD8,
din Cluj-Napoca
0x0065FDE0 , 0x0065FDE0
Facultatea ConstrucÛii , 0x0065FDF0 Õi, în final, valoarea special| NULL , caz în care
de MaÕini
condi Ûia de
Catedra de reluare
Mecanic|a corpului ciclului w hile devine fals |.
Õi Programare
Curs de limbaj C

10.8 Instruct
Copyright 2001. -iunea
Toate drepturile typedef
sunt rezervate autorului.
În C clasic, tipurile de date definite de utilizator nu primeau un nume, excepÛie f|când
struct (Õi unionacestui
Multiplicarea care vadocument
fi discutatînînscop
paragaful |tor).
urmeste
comercial Chiar Õi în acest caz, declaraÛiile
interzis|.
acestor variabile trebuiau precedate de cuvintele struct sau union . ANSI C,
implementeaz | un nou
SudenÛii participanÛi la nivel
orice de ascundere
form| a informa
de înv|Û|mânt Ûiilor prin
superior typedef . Aceasta permite
bugetar pot multiplica acest
crearea de noi nume pentru tipurile de date, prin asocierea unui tip de dat| existent la un
document pentru uzul personal.
nume, apoi putându-se declara variabile de acel tip. Iat| câteva exemple:
SudenÛii participanÛi
typ ed ef in t *ptrIn t; la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot ed
typ multiplica
ef cha r Ndocumentul
um e[22 ]; numai contra cost Õi cu acordul scris al autorului. În acest
typedef
scop m| enum {mascul, la:
puteÛi contact| femela, necunoscut} sex;
typ ed ef struct {
Num e num e,prenume;
ANTAL Tiberiu sexAlexandru
Gen;
tel.: 0040-264-530918
short Varsta;
float Med ie;
e-mail: antaltiberiu@pcnet.ro
} stud en t;
typ ed ef stude nt a nd estud ii[10 0];

7:
Form a typede f nu m e_d ef_tip identificator

157
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
typedef permite simplificarea scrierii declaraÛiilor de date conducând la compactizarea Õi
Catedra de Mecanic| Õi Programare
uniformizarea programelor. Nu se poate folosi în interiorul unei funcÛii. O declaraÛie
Curs de limbaj C
typedef specific| un nume care, în cadrul vizibilit|tii declaraÛiei, devine sinonim al tipului
specificat în secÛiunea nu m e_d ef_tip din declaraÛie. Spre deosebire de declaraÛiile struct,
Copyright 2001.
union Õi enum Toate drepturile
, typedef nu creeazsunt
| un rezervate
tip de dat|autorului.
nou, ci numai un nou nume pentru un
tip deja existent. Se poate spune c| typedef este asemenea lui #define cu excepÛia c| este
interpretat
Multiplicarea| deacestui
compilator Õi nuîn
document descop
preprocesor.
comercialFie
estedeclara Ûiile:
interzis|.

typ ed ef cha
SudenÛii r CHAR; la
participanÛi /*orice
tip caracter
form| de*/înv|Û|mânt superior bugetar pot multiplica acest
typ ed ef C HAR * PS TR ; /* poan tor la un sir (char *) */
document pentru uzul personal.
typedef CHAR far * LPSTR /* poan tor far la un sir */

SudenÛii introduse
Numele participanÛi la orice
prin declara Ûiile de
form| de mai
înv|Û|mânt
sus suntcusinonime
plat| saucualte urm|doritoare
persoane
tipurile toare:
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|Nume
puteÛi contact| la:Tip sinonim

CHAR Tiberiu Alexandru


ANTAL char
tel.:
PSTR
0040-264-530918 char *
e-mail: antaltiberiu@pcnet.ro
LPSTR char __far *

Conform celor spuse deja typedef nu aduce nimic nou în semantica


Rolul lui typedef
declaraÛiilor, adic| variabilele declarate cu typedef au aceleaÕi
propriet|Ûi cu cele ale c|ror declaraÛii sunt scrise explicit. Primul motiv
al folosirii lui typedef const| în creÕterea lizibilit|Ûii programelor. Al doilea const| în faptul
Conf. dr. ing. ANTAL Tiberiu Alexandru
c| typedef permite ascunderea datelor asigurând independenÛa implement|rii de detaliile
Universitatea Tenhic| din Cluj-Napoca
acesteia. Dac| un program are porÛiuni dependente de maÕina pe care se ruleaz|, folosirea
Facultatea ConstrucÛii
lui typedef permite de MaÕini
ca numai declarat-iile typedef s| fie modificate la mutarea programului
Catedra de Mecanic|
pe o alt| maÕin|. Õi Programare
Curs de limbaj C

10.9 Tipul de data7 union


Copyright 2001. Toate drepturile sunt rezervate autorului.

union sau tipulacestui


Multiplicarea reuniune este similar
document cucomercial
în scop struct, dar în cazul
este unei
interzis|. variabile de tipul union
toÛi membrii acesteia sunt stocaÛi începând de la aceeÕi adres| de memorie, sub numele
variabilei de tipul union
SudenÛii participanÛi , practic
la orice form|partajându-se
de înv|Û|mântmemoria
superiortotal| a reuniunii
bugetar între acest
pot multiplica toate
componentele ei. Se va aloca spaÛiul maxim pentru fiecare variabil| de tipul union , prin
document pentru uzul personal.
alocarea spaÛiului pentru membrul de dimensiunea cea mai mare a reuniunii. Sub numele
reuniunii se va stoca o singur| component|. Eventual, este posibil accesul sub forma mai
SudenÛii participanÛi
multor tipuri laacela
de date la oriceÕiform| deloca
grup de înv|Û|mânt cu plat|
Ûii de memorie sau alte
alocate persoane
pentru doritoare
reuniune. Forma
| este: documentul numai contra cost Õi cu acordul scris al autorului. În acest
pot multiplica
general
scop m| puteÛi contact| la:
7:
Form a union <num e_u nion> {
ANTAL Tiberiu Alexandru
<tip1> <num e_m emb ru1>;
tel.: 0040-264-530918<tip2> <num e_m emb ru2>;
e-mail: antaltiberiu@pcnet.ro
. . .
<tipn> <num e_m em brun>;
};

158
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Variabila
FacultateadeConstrucÛii
tipul uniondepermite
MaÕinideci stocarea la momente diferite a unor valori de tipuri
diferite în aceea Õi zon| de RAM.
Catedra de Mecanic| Õi Programare Utilizarea lui union poate produce erori grave în execuÛie
dac| se manipuleaz| o variabil| de tipul union f|r| a Õti care din valorile posibile au fost
Curs de în
stocate limbaj
ea. OCmodalitate de evitare a acestei capcane st| în stocarea într-o variabil|
auxiliar| a unei valori ce s| permit| identificarea tipului valorii stocate în union .
Copyright 2001. Toate drepturile sunt rezervate autorului.
/* UN ION .C */
#include<stdio.h>
Multiplicarea acestui document în scop comercial este interzis|.
#define INTREG 1
#define REAL 2
SudenÛii
#define participanÛi
CARACTERla3 orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
m ain ()
{
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
stru ct {
pot multiplicaint
documentul
iCare; numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛiunion
contact|
{ la:
int iA;
float fA;
ANTAL Tiberiu Alexandru
char cA;
tel.: 0040-264-530918
};
e-mail:} antaltiberiu@pcnet.ro
tab lou stru ct[3];
int i;

tabloustruct[0].iCare=INTREG;
tabloustruct[0].iA=10;

tabloustruct[1].iCare=REAL;
tabloustruct[1].fA=11.123457;
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
tabloustruct[2].iCare=CARACTER;
Facultatea ConstrucÛii
tablou de='a';
str uct[2 ].cA MaÕini
Catedra de Mecanic| Õi Programare
Curs defor(i=0
limbaj;i<3;i++) {
C
switch (tab lou stru ct[i].iCa re) {
cas e IN TR EG :prin tf("intr eg = %d \n ", tab lou stru ct[i].iA);
Copyright 2001. Toate drepturilebreak;sunt rezervate autorului.
cas e R EA L:pr intf("r eal = %f\ n", tablou stru ct[i].fA);
break;
Multiplicarea acestui document în scop comercial este interzis|.
cas e CAR AC TE R:p rintf("caracter = % c\n ", tab lou stru ct[i].cA);
brea k;
SudenÛii participanÛi
de falu t:laprin
orice form| de
tf("Eroar înv|Û|mânt
e/n "); superior bugetar pot multiplica acest
}
document pentru uzul personal.
}
}
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Rezultate:
scop m| =puteÛi
intreg 10 contact| la:
real = 11.1234
caracter = a
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
10.10 Câmpuri de bit-i
e-mail: antaltiberiu@pcnet.ro

Ca o completare adus| membrilor unui tip struct sau tip union , identificatorului unui
membru i se poate specifica printr-o declaraÛie num|rul de biÛi pe care se va stoca. Acest
tip de membru se va numi câmp de biÛi. Lungimea se specific| în declaratorul numelui de

159
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
câmp prin caracterul
Facultatea . Un
ConstrucÛii":"de câmp de biÛi este interpretat ca tip întreg.
MaÕini
Catedra de Mecanic| Õi Programare
Form 7 : limbajtip
Curs ade C d eclarato r : expresie constanta7

Copyright 7 specific
2001. Toate
exp resie constanta | numsunt
drepturile |rulrezervate
de biÛi ai autorului.
câmpului. Tipul declaratorului poate fi:
unsigned int, signed int sau int, iar ex pre sie constanta7 trebuie s| fie un întreg pozitiv.
Nu este permis
Multiplicarea | declararea
acestui document de tablouri, poantori este
în scop comercial interzis|.de biÛi sau de funcÛii care
de câmpuri
întorc câmpuri de biÛi. Nu se poate aplica operatorul & asupra acestor câmpuri. Câmpuri
anonime (f|r| nume) la
SudenÛii participanÛi potorice
fi declarate
form| deînînv|Û|mânt
scopul alinierii în memorie,
superior bugetar darpot acestea nu acest
multiplica pot fi
referite, iar conÛinutul lor este nedefinit în timpul execuÛiei programului. M|rimea
document
câmpului de pentru uzul personal.
biÛi trebuie s| fie suficient de mare pentru a conÛine num|rul de biÛi. În acest
sens, urm|toarea declaraÛie este ilegal|:
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot
shortmultiplica
a:17; documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
În exemplul care urmeaz| se defineÕte un tablou bidimensional de structuri cu numele de
ecran
ANTAL : Tiberiu Alexandru
tel.: 0040-264-530918
struct
e-mail:
{
antaltiberiu@pcnet.ro
unsigned short caracter: 8;
unsigned short culoare:4;
uns igned short sub liniere:1;
uns igned short blink :1;
} ecr an [25][8 0];

Conf. dr.are
Tabloul ing. ANTAL
2000 Tiberiufiecare
de elemente, element este o structur| cu patru membri câmpuri
Alexandru
de biÛi: caracter
Universitatea , culoare
Tenhic| subliniere Õi blink . M|rimea structurii este de 2 octeÛi.
din, Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
ANSI
Catedra C de
trateaz | câmpurile
Mecanic| de biÛi din punct de vedere semantic ca întregi. Aceasta
Õi Programare
înseamn | c|
Curs de limbaj C un câmp de bi Ûi va fi folosit într-o expresie în mod identic cu o variabil|
întreag|, indiferent de num|rul de biÛi din câmp. Pentru compilatorul C al Microsoftului
câmpurile de biÛi se aliniaz| în interiorul unui tip int începând de la bitul cel mai puÛin
Copyright 2001. Toate drepturile sunt rezervate autorului.
semnificativ. Fie codul:
Multiplicarea
struc { acestui document în scop comercial este interzis|.
unsigned short a:3;
unsigned
SudenÛii short
participanÛi la b:6;
orice form| de înv|Û|mânt superior bugetar pot multiplica acest
unsigned short c:7;
document
} x;
pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
void main(void)
{pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|x.a=2;
puteÛi/*contact|
in bina r 10 */
la:
x.b=7; /* in bina r 111 */
x.c=0; /* in bina r 0 */
ANTAL
} Tiberiu Alexandru
tel.: 0040-264-530918
bi Ûii vorantaltiberiu@pcnet.ro
e-mail: fi stocaÛi astfel:

00000000 00111010
cccccccb bbbbbaaa

ObservaÛi c| accesul la câmpurile de biÛi este acelas- i cu cel la membri struct sau union .
160
Capitolul
Conf. dr.10ing.
- Structuri
ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ExisÛ|decazuri
ConstrucÛii MaÕinicând spaÛiul de RAM este critic Õi dorim s| îl ocup|m cât
Când se folosesc
Catedracu mai bine, împachetând
Mecanic| Õi Programare
debiÛi? mai multe variabile într-un singur octet al
câmpurile
maÕinii. Un alt motiv sunt interfeÛele, care impun un anumit mod de
Curs de limbaj C grupare a biÛilor unui octet, de exemplu, pentru a comanda un dispozitiv
hardware legat la calculator.
Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

161
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

11 Considerat-ii privind stilul


Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
de programare în limbajul C -
document pentru uzul personal.

generalizarea sorta7 rii prin


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

inserare directa7 cu ajutorul


ANTAL Tiberiu Alexandru
tel.: 0040-264-530918

poantorilor la funct-ii
e-mail: antaltiberiu@pcnet.ro

S
din mul
sortare
e numeÕte sortare procesul de rearanjare, pe baza unui criteriu, a unei mulÛimi de
obiecte,
Conf. dr.
Û imea
ales
într-o ordine
ing. ANTAL
de
Tiberiu
obiecte
este dependent
specific
sortate.
|. Rolul sort|rii este facilitarea g|sirii unor obiecte
Alexandru
Universitatea Tenhic| din Cluj-Napoca algoritmilor de sortare spune c| algoritmul de
Teoria
de structura datelor de sortat. În general, metodele de
Facultatea ConstrucÛii de MaÕini
sortare sunt clasificate în dou
Catedra de Mecanic| Õi Programare | categorii mari: sortarea fis- ierelor Õi sortarea tablourilor.
Cele dou| strategii sunt uneori numite Õi sortare externa7 , pentru c| fiÕierele sunt stocate
Curs de limbaj C
în memorii externe (de exemplu hard disk-uri), respectiv interna7 pentru c| tablourile sunt
stocate în memoria intern| (RAM) a calculatorului.
Copyright 2001. Toate drepturile sunt rezervate autorului.

11.1 Terminologie s- i notat-ii


Multiplicarea acestui document în scop comercial este interzis|.
Fiind date articolele a1,a2, ..., an, sortarea const| în permutarea lor în ordinea ak1, ak2, ...,
SudenÛii
akn, astfelparticipanÛi
încât fiind la
datorice form|
| o func Ûie fdedeînv|Û|mânt
ordonare, superior bugetar
s| avem f(a pot multiplica acest
k1) # f(ak2) # ...# f(akn). În
document pentru
cazurile banale, uzul
func Ûiapersonal.
de ordonare nu se evalueaz| pe baza unor expresii matematice, ci
se stocheaz| explicit într-un membru numit cheie a unei structuri care va Ûine Õi articolele
de sortat.participanÛi
SudenÛii Din cele spuse, tipulform|
la orice de datde| structur | care
înv|Û|mânt custocheaz | cele
plat| sau alte descrise
persoanemai sus este:
doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
struct
scop m| tip_obiect {
puteÛi contact| la:
int cheie;
ANTAL float a; Alexandru
Tiberiu
/* "alte componete" ale structurii */
tel.: 0040-264-530918
};
e-mail: antaltiberiu@pcnet.ro
Comentariul " alte componente" din structura de mai sus reprezint| date relevante,
caracteristice pentru fiecare obiect de sortat. cheie reprezint| un câmp întreg care
identific| unic un obiect din mulÛimea de sortat. Alegerea lui ca întreg este oarecum
arbitrar|, practic fiind posibil| alegerea oric|rui tip pentru care se poate defini o relaÛie
162
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
de ordine total
Facultatea |.
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
În continuare vom studia cazul sort|rii tablourilor in situ , când algoritmul de sortare
Curs de limbaj
produce C în acelaÕi tablou în care la începerea sort|rii erau obiectele nesortate.
rezultatul
Exist| algoritmi de sortare intern| care produc rezultatul sort|rii într-un tablou nou, de
Copyright 2001. Toate
aceeaÕi dimensiune drepturile
Õi tip cu cel desunt rezervate
sortat. Se mergeautorului.
deci pe principiul minimiz|rii risipei
de RAM din calculator. Deoarece cantitatea de RAM necesar|, conform celor afirmate,
se rezum| chiar
Multiplicarea la tabloul
acestui documentoriginal de sortat,
în scop comercial | sortarea
adiceste se face în tabloul original
interzis|.
nesortat, trebuie s| alegem criterii de evaluare a algoritmului studiat diferite de
cantitatea de RAM folosit
SudenÛii participanÛi | pentru
la orice form|sortare. EficienÛsuperior
de înv|Û|mânt a acestorbugetar
algoritmi va m|suraacest
potsemultiplica prin
num | rul de compara Ûii de
document pentru uzul personal. chei C Õ i a num | rului de modifica7 ri prin atribuirile A ale
obiectelor de sortat în vederea realiza7 rii sorta7 rii. Aceste numere (C Õi A ) sunt funcÛii de
num|rul n al obiectelor de sortat. Un algoritm de sortare performant are C proporÛional
SudenÛii
cu n lg (n)participanÛi
respectiv culanorice
2 form|
, când de înv|Û|mânt
algoritmul este maicu plat| sau
modest. alte persoane
În continuare doritoare
se va prezenta
pot multiplica documentul numai contra
algoritmul de sortare prin inserare direct|. cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

11.2 Sortarea prin inserare directa7


ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Metoda const| în divizarea conceptual| a tabloului de sortat a într-o secvenÛ| destinaÛie
e-mail: antaltiberiu@pcnet.ro
a1, ..., ai-1 ,deja sortat| pe baza valorilor de chei, Õi una surs|, ai, ..., an, înc| nesortat|. La
fiecare pas, începând cu i=2 (al doilea articol) Õi incrementând pe i, elementul cu
numa7 rul de ordine i din Õirul surs| este selectat pentru a fi mutat în secvenÛa destinaÛie,
prin inserare la locul dictat de valoarea cheii. Procesul de g|sire a locului obiectului ai se
face prin operaÛiile de comparare Õi/sau deplasare, inserare. Obiectul ai se compar| cu
obiectul curent aj din secvenÛa destinaÛie dupa7 care, fie se insereaz| în secvenÛa destinaÛie,
fie
Conf.obiectul
dr. ing. aj ANTAL
se deplaseaz | la stânga
Tiberiu cu o poziÛie în secvenÛa destinaÛie. Algoritmul este
Alexandru
formulat în liniile urm | toare:
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
variabila a este tablou[1..n] de tipul tip_obiect
Catedra de Mecanic| Õi Programare
Curs de limbaj C
sortare_prin_inseraredirecta()
{
Copyright variabile întregi
2001. Toate i, j;
drepturile sunt rezervate autorului.
variabile de tipul tip_obiect x;
repeta7 acestui
Multiplicarea i:=2 pâna7înlascop
pentru document n comercial este interzis|.
{
SudenÛii participanÛix:=a[i];la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
j=i-1;
document pentru uzul personal.
repeta7 cât timp ((j >=1) Õi (x.cheie < a[j].cheie)) <- COMPARAT,IE
{
SudenÛii participanÛi a[j+1]=a[j];
la orice form|<- deATRIBUIRE
înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul j=j-1;numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi}contact| la:
a[j+1]=x; <- ATRIBUIRE
ANTAL } Tiberiu Alexandru
}tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Num|rul de comparaÛii de chei C i în deplasarea a i-a este cel mult i-1 Õi cel put-in 1 .
Num|rul A i de atribuiri de obiecte este C i+1 , aÕadar num|rul total de comparaÛii Õi
atribuiri pentru cele doua7 cazuri extreme sunt:

163
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


Ment-ionez ca7 în formulele de mai sus i reprezinta7 numa7 rul de relua7 ri a ciclului exterior,
în timp ce în descrierea
Multiplicarea algoritmului
acestui document - i i reprezinta
acelas
în scop comercial 7 pozit-ia elementului de inserat.
este interzis|.
Cel mai favorabil caz apare când obiectele sunt iniÛial ordonate. Cel mai defavorabil caz
apare când
SudenÛii acestea sunt
participanÛi ordonate
la orice form|invers.
de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

11.3 Implementarea
SudenÛii participanÛi la orice form| de înv|Û|mântalgoritmului de
cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
sortare
scop m| puteÛi contact| la:

ANTAL
/* SIN DIRTiberiu
1.C */ Alexandru
#include<stdio.h>
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
int iTa b[10 ] = {3,6,1,2,3 ,8,4 ,1,7,5 };

void sinsdir(int a [ ], int N);

int main(void)
{
int i;
Conf. dr.
pu ing.
tchaANTAL
r('\n'); Tiberiu Alexandru
for(i=0;i<10;i++)
Universitatea Tenhic| din Cluj-Napoca
prin tf("%d ", iTa b[i]);
Facultatea ConstrucÛii de MaÕini
Catedra desdir(iTa
sin Mecanic|b,10Õi
); Programare
Curs depulimbaj C
tcha r('\n');

for(i=0;i<10;i++)
Copyright 2001. Toate drepturile sunt rezervate autorului.
prin tf("%d ", iTa b[i]);

Multiplicarea
return acestui
0; document în scop comercial este interzis|.
}
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
void sinsdir(int a [ ], int N)
document
{ pentru uzul personal.
int i,j;
inparticipanÛi
SudenÛii t iX ; la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
for (i=1;i<N;i++)
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
{
scop m| puteÛiiXcontact|
=a[i]; la:
j=i-1;
ANTAL Tiberiu w hile ((iX < a [j])
Alexandru && (j >= 0))
{
tel.: 0040-264-530918
a[j+1 ]=a[j];
e-mail: antaltiberiu@pcnet.ro
j=j-1;
}
a [j+ 1]=iX ;
}
}

164
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca

11.4 Sa7 revenim la problema init-iala7


Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
... poantorii la funct-ii
Copyright 2001. Toate drepturile sunt rezervate autorului.
S| consider|m urm|toarea problem| real|. Dorim s| scriem o funct-ie care sa7 poata7
sorta virtual orice colect- ie d e da te ce se poate stoca într-un tablou. Ar putea fi un tablou
de Õiruri, unul acestui
Multiplicarea de întregi sau unulînde
document valori
scop reale sau
comercial chiar
este de structuri. SIN SD IR 1.C este
interzis|.
scris pentru sortarea unor întregi. Ce ar trebui s| modific|m pentru ca programul s|
SudenÛiiÕiparticipanÛi
lucreze cu alte tipuri
la de date?
orice Începem
form| cu funcÛiasuperior
de înv|Û|mânt potÛmultiplica
, unde func
sin sd ir()bugetar ia de comparare
acest
va fi modificat | .
document pentru uzul personal.
/* SIN SD IR2.C */
SudenÛii participanÛi
#include<stdio.h> la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
int
scopiTa
m|b[10 ] = {3,6,1,2,3
puteÛi contact| ,8,4
la:,1,7,5 };
void sinsdir(int a [ ], int N);
ANTAL Tiberiu
int co m pa ra(in t Alexandru
m , int n );
tel.: 0040-264-530918
int main(void)
e-mail: antaltiberiu@pcnet.ro
{
int i;
pu tcha r('\n');
for(i=0;i<10;i++)
prin tf("%d ", iTa b[i]);

sin sdir(iTa b,10 );


Conf. dr.
pu ing.
tchaANTAL
r('\n'); Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
for(i=0;i<10;i++)
Facultatea ConstrucÛii de MaÕini
prin tf("%d
Catedra de Mecanic| ", iTa b[i]);
Õi Programare
Curs dereturn
limbaj0;C
}
Copyright 2001. Toate drepturile sunt rezervate autorului.
void sinsdir(int a [ ], int N)
{
Multiplicarea
int i,j;
acestui document în scop comercial este interzis|.
in t iX ;
SudenÛiifor (i=1;i<N;i++)la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
participanÛi
{
document pentru uzul personal.
iX =a[i];
j=i-1;
SudenÛii participanÛi la orice
w hile (com form|
pa ra(iX de &&
,a[j]) înv|Û|mânt
(j >= 0)) cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
{
scop m| puteÛi contact| a[j+1
la:]=a[j];
j=j-1;
}
ANTAL Tiberiu a [j+Alexandru
1]=iX ;
}
tel.: 0040-264-530918
}e-mail: antaltiberiu@pcnet.ro

int compara(int m, int n)


{
retu rn (m < n);
}

165
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedrac|dedorim
Pentru ca func
Mecanic| Õi ÛProgramare
ia de sortare s| fie independent| de tipurile de date de sortat, o
variant| de lucru este folosirea de poantori la tipuri void în loc de poantori la tipul int.
Curs
Pentrudeînceput,
limbaj C programul va fi put-in modificat pentru a ne apropia de o variant| din care
sa7 se poata7 face trecerea simpl| la varianta cu poantori void . Versiunea care urmeaz| este
Copyright
modificat| 2001. Toate la
la poantori drepturile
int. sunt rezervate autorului.

/* SIN SD IR3.C
Multiplicarea */
acestui document în scop comercial este interzis|.
#include<stdio.h>

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int iTa b[10 ] = {3,6,1,2,3 ,8,4 ,1,7,5 };
document pentru uzul personal.
void sinsdir(int *p a, in t N);
int co m pa
SudenÛii ra(in t *m , int
participanÛi *n );
la orice
form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
int main(void)
documentul numai contra cost Õi cu acordul scris al autorului. În acest
{scop m| puteÛi contact| la:
int i;
ANTAL puTiberiu
tcha r('\n');
Alexandru
for(i=0;i<10;i++)
tel.: 0040-264-530918
prin tf("%d ", iTa b[i]);
e-mail: antaltiberiu@pcnet.ro
sin sdir(iTa b,10 );
pu tcha r('\n');

for(i=0;i<10;i++)
prin tf("%d ", iTa b[i]);

return
Conf. dr. 0;
ing. ANTAL Tiberiu Alexandru
}
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii
void sinsdir(int *p a, inde MaÕini
t N)
{Catedra de Mecanic| Õi Programare
Curs deint i,j; C
limbaj
in t iX ;
for (i=1;i<N;i++)
Copyright
{ 2001. Toate drepturile sunt rezervate autorului.
iX =pa [i];
Multiplicarea j=i-1;
acestui document în scop comercial este interzis|.
w hile (com pa ra(& iX ,&p a[j]) && (j >= 0))
{
SudenÛii participanÛi pa la orice
[j+1]=pform|
a[j]; de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzulj=j-1; personal.
}
p a[j+ 1]=iX ;
SudenÛii
}
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot
} multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
int compara(int *m, int *n)
{
ANTAL Tiberiu Alexandru
retu rn (*m < *n);
tel.:
} 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
ObservaÛi modific|rile. Acum lui sin sd ir() i se transfer| un poantor la int, iar din funcÛia
sin sd ir() se transfer| poantori la elementele unui tablou care dorim s| fie comparat prin
intermediul funcÛiei de comparare com pa ra(). Normal, în com pa ra() se face
dereferenÛierea poantorilor pentru a putea face comparaÛia dorit|. În urm|torul pas se vor

166
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
converti poantorii din sin ir() la poantori la tipul void pentru ca funcÛia s| devin| Õi mai
Facultatea ConstrucÛii desdMaÕini
independent | de tipul datelor
Catedra de Mecanic| Õi Programare de sortat.
Curs
/* SIN deSDlimbaj
IR4.CC*/
#include<stdio.h>
Copyright 2001. Toate drepturile sunt rezervate autorului.
int iTa b[10 ] = {3,6,1,2,3 ,8,4 ,1,7,5 };

Multiplicarea acestui
void sinsdir(int document
*p a, in t N); în scop comercial este interzis|.
int co m pa ra(v oid *m , void *n);
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int main(void)
document pentru uzul personal.
{
int i;
SudenÛii
puparticipanÛi
tcha r('\n'); la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
documentul numai contra cost Õi cu acordul scris al autorului. În acest
for(i=0;i<10;i++)
pot multiplica
prin tf("%dla:
scop m| puteÛi contact| ", iTa b[i]);

sin sdir(iTa b,10 );


ANTAL puTiberiu Alexandru
tcha r('\n');
tel.: 0040-264-530918
e-mail:for(i=0;i<10;i++)
antaltiberiu@pcnet.ro
prin tf("%d ", iTa b[i]);

return 0;
}

void sinsdir(int *p a, in t N)
{
Conf. dr.
inting.
i,j; ANTAL Tiberiu Alexandru
in t iX ; Tenhic| din Cluj-Napoca
Universitatea
Facultatea (i=1;i<N;i++)
for ConstrucÛii de MaÕini
{
Catedra de Mecanic|
iX =pa [i];
Õi Programare
Curs de limbajj=i-1;
C
w hile (com pa ra((v oid *)&iX , (void *)&pa [j]) && (j >= 0))
Copyright 2001. { Toate drepturile sunt rezervate autorului.
pa [j+1]=p a[j];
j=j-1;
Multiplicarea }acestui document în scop comercial este interzis|.
p a[j+ 1]=iX ;
} participanÛi la orice form| de înv|Û|mânt superior bugetar pot
SudenÛii multiplica acest
}
document pentru uzul personal.
int compara(void *m, void *n)
{SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
int *m1,documentul
pot multiplica *n1; numai contra cost Õi cu acordul scris al autorului. În acest
m 1= (int *) m ;
scop m|n1=
puteÛi contact|
(int *) n;
la:
retu rn (*m 1 < *n1);
ANTAL
} Tiberiu Alexandru
tel.: 0040-264-530918
Observa Ûi c| în apelul lui com pa ra() s-a introdus operatorul de conversie forÛat| a tipului
e-mail: antaltiberiu@pcnet.ro
poantorilor de la void la tipul de dat| de sortat în momentul actual. Pentru c| ceea ce se
transfer| lui sin sd ir() este înc| tot un poantor la întregi, ar trebui s| convertim aceÕti
poantori în poantori la tipul void când îi transfer|m ca parametri în linia de apel a lui
com pa ra() .

167
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Sa7 revenimConstrucÛii
Facultatea la problemade sin sd ir() . Dorim s| facem primul parametru de tipul void , dar
luiMaÕini
în acela Õi timp trebuie f
Catedra de Mecanic| Õi Programare| cut ceva cu iX care Õi el este de tipul int. De asemenea, acolo
unde apare iX=p a[i]; tipul lui pa[i] trebuie s| fie cunoscut pentru a Õti câÛi octeÛi vor fi
Curs
copiaÛde
i înlimbaj C
iX sau în orice alt| variabil| care ar putea fi substituit| cu iX .

Copyright
Versiunea 2001.
SIN SDToate
IR 4.Cdrepturile
, prin funcsunt rezervate
Ûia sin sdir() obautorului.
Ûine informaÛii despre tipul datelor de
sortat, deci Õi despre dimensiunea individual| a fiec|rui element de tablou datorita7
faptului c| primul
Multiplicarea parametru
acestui document este poantor
în scop la tipuleste
comercial întreg. Dac| dorim s| modific|m pe
interzis|.
sin sd ir() ca s| sorteze orice tip de dat|, trebuie ca acel poantor s| fie la tipul void . Dar aÕa
se
SudenÛii informaÛia legat
pierdeparticipanÛi | deform|
la orice m|rimea individual| superior
de înv|Û|mânt a elementului de tablou,
bugetar motiv pentru
pot multiplica acest
care în SIN SD IR 5.C acesta
document pentru uzul personal. se transfer | ca parametru separat.

/* SIN SD IR5.C */
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
#include<stdio.h>
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
#include<string.h>
scop m| puteÛi contact| la:
lon g iT ab [10] = {3 ,6,1,2 ,3,8 ,4,1,7 ,5};

ANTAL Tiberiu Alexandru


void sinsdir(void *pa , size_ t m arim e, int N );
tel.:co
int 0040-264-530918
m pa ra(v oid *m , void *n);
e-mail: antaltiberiu@pcnet.ro
int main(void)
{
int i;
pu tcha r('\n');
for(i=0;i<10;i++)
prin tf("%d ", iTa b[i]);

Conf. dr.
sining. ANTAL
sdir(iTa Tiberiu
b, siz Alexandru
eof iT ab [0],10);
Universitatea
pu tchaTenhic|
r('\n'); din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
for(i=0;i<10;i++)
Catedra de Mecanic| Õi Programare
prin tf("%ld ", iTa b[i]);
Curs de limbaj C
return 0;
}Copyright 2001. Toate drepturile sunt rezervate autorului.
voi d sin sd ir (v oi d *p a, s iz e_ t m a ri m e, in t N)
Multiplicarea
{ acestui document în scop comercial este interzis|.
int i,j;
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
un sig ne d cha r cB ufX [4];
document pentru uzul personal.
unsigned char *bpa=pa;

SudenÛii
forparticipanÛi
(i=1;i<N;i++)la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
{
scop m| puteÛi/*contact|
iX=pa [i]; */
la:
m em cpy (cBu fX , bpa +i*m arim e, m arim e);
j=i-1;
ANTAL Tiberiu Alexandru
w hile (com pa ra( (vo id *) & cB ufX , (void *) (bpa +j*m arim e)) && (j >= 0 ))
{
tel.: 0040-264-530918
m em cpy (bpa +(j+1)*m arim e, bp a+j*m arim e, m arim e);
e-mail: antaltiberiu@pcnet.ro
/* pa[j+1]=pa[j]; */
j=j-1;
}
m em cpy (bpa +(j+1)*m arim e, cB ufX , ma rim e);
/* a[j+1]=iX; */

168
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
}
Facultatea
}
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs
int de limbaj C *m, void *n)
compara(void
{
long *m 1, *n1;
Copyright 2001. Toate drepturile sunt rezervate autorului.
m 1= (lon g *) m ;
n1= (long *) n;
Multiplicarea
retu rn acestui document în scop comercial este interzis|.
(*m 1 < *n1);
}
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Observa
document Ûi cpentru
| tipul uzul
de dat | al tabloului a trecut de la int la long , aceasta pentru a ilustra c|
personal.
sunt necesare modific|ri Õi în com pa ra(). Problema lui iX este Õi ea rezolvat| printr-un
buffer de 4 caractere f|r| semn folosit pentru a stoca un long . Poantorul la caractere f|r|
SudenÛii
semn *bpa participanÛi
este folositlapentru
orice form| de înv|Û|mânt
a poanta cu element)
baza (primul plat| sautabloului
alte persoane doritoare
de sortat.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop
A fostm| | se modifice
puteÛi scontact|
necesar la: Õi ceea ce i se tranfser| lui com pa ra() Õi felul în care se face
deplasarea elementului de inserat. Utilizarea lui m em cpy() Õi notaÛia de poantor în locul
celei
ANTAL de tablou
Tiberiu duc la reducerea dependenÛei de tipul de dat|.
Alexandru
tel.: 0040-264-530918
Trecem în continuare la S IN SDIR6.C care sorteaz| Õiruri de caractere în locul celor de
e-mail: antaltiberiu@pcnet.ro
întregi long . Desigur, trebuie s| modific|m funcÛia de comparaÛie din moment ce Õirurile
se compar| altfel decât întregii.

/* SIN SD IR6.C */
#include<stdio.h>
#include<string.h>
#define MA X_B UF 256
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic|
char sT ab2[6][23] din Cluj-Napoca
= {"Shiva mb u K alpa",
Facultatea ConstrucÛii de"DeMaÕini
m agistro",
Catedra de Mecanic| Õi Programare
"Yoga S utra",
"Param arthasa ra",
Curs de limbaj C
"Shiva-P uran a",
"Pa du ka Pa nc ha ka "};
Copyright 2001. Toate drepturile sunt rezervate autorului.
void sinsdir(void *pa , size_ t m arim e, int N );
int co m pa ra(v oid *m , void *n);
Multiplicarea acestui document în scop comercial este interzis|.
int main(void)
SudenÛii
{ participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int pentru
document i; uzul personal.
pu tcha r('\n');
for(i=0;i<6;i++)
SudenÛii participanÛi la orice
prin tf("%s form|
\n ", sTa de
înv|Û|mânt cu plat| sau alte persoane doritoare
b2[i]);
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|sin sdir(sT
puteÛi ab 2,23 la:
contact| ,6);
pu tcha r('\n\ n');

ANTAL Tiberiu Alexandru


for(i=0;i<6;i++)
tel.: 0040-264-530918
prin tf("%s \n ", sTa b2[i]);
e-mail: antaltiberiu@pcnet.ro
return 0;
}

voi d sin sd ir (v oi d *p a, s iz e_ t m a ri m e, in t N)
{

169
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
int i,j;
Facultatea ConstrucÛii de MaÕini
Catedra de ne d cha rÕicB
un sigMecanic| Programare
ufX [M AX _B UF];
Curs deunsigned
limbaj C char *bpa=pa;
for (i=1;i<N;i++)
Copyright
{
2001. Toate drepturile sunt rezervate autorului.
m em cpy (cBu fX , bpa +i*m arim e, m arim e);
Multiplicarea j=i-1;
acestui document în scop comercial este interzis|.
w hile ((j>=0) && (com par a((void *)& cB u fX , (void *)(bpa +j*m arim e)) != 0))
{
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
m em cpy (bpa +(j+1)*m arim e, bp a+j*m arim e, m arim e);
document pentru uzulj=j-1;
personal.
}
m em cpy
SudenÛii participanÛi la(bpa +(j+1)*m
orice form|arim e, cB ufX , ma
de înv|Û|mânt cu rim e);sau alte persoane doritoare
plat|
}
pot
}
multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
int compara(void *m, void *n)
{ANTAL Tiberiu Alexandru
int k;
tel.: 0040-264-530918
ch ar *m 1 = m ;
e-mail:char
antaltiberiu@pcnet.ro
*n1 = n;
k=s trcm p(m 1,n1);
if (k < 0) return 1;
return 0;
}

Faptul c| sin sd ir() nu s-a schimbat în raport cu varianta din SIN SD IR 5.C indic| faptul c|
Conf.
func Ûiadr. ing. ANTAL
poate sorta unTiberiu
domeniu larg de tipuri de date. Ceea ce a r|mas de f|cut este
Alexandru
transferul
Universitatea numelui ÛieiCluj-Napoca
funcdin
Tenhic| de comparare pe care dorim s| o utiliz|m pentru ca algoritmul
| fie într-adev
sFacultatea |r general.
ConstrucÛii La fel cum numele tabloului este adresa primului element din
de MaÕini
tablou
Catedra înde
segmentul
Mecanic|deÕi date, numele funcÛiei se descompune în adresa acelei funcÛii din
Programare
segmentul de
Curs de limbaj C cod. Astfel, vom folosi un poantor la funcÛie, în acest caz unul la funcÛia de
comparare.
Copyright
Poantorii la2001.
funcÛToate drepturile sunt rezervate
ii trebuie s| fie identici ca num|autorului.
r Õi tip de parametri, respectiv de valori
returnate, cu funcÛiile la care poanteaz|. Pentru cazul nostru se declar| poantorul la
Multiplicarea acestui document în scop comercial este interzis|.
funcÛie sub forma:

SudenÛii participanÛi
int (*p f)(con la nst
st vo id*, co orice form|
void *); de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
AtenÛie, dac| în loc de linia de mai sus am fi scris int *pf(const void*, const vo id *) am fi
avut prototipul
SudenÛii pentru
participanÛi la oorice Ûie caredeîntoarce
funcform| un poantor
înv|Û|mânt cu plat|lasau
întreg. Aceasta pentru
alte persoane c| în
doritoare
C operatorul parantez | () are precedenÛ| mai mare decât operatorul poantor * . Prin
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
punerea parantezelor sub forma (*pf) se specific| faptul c| declar|m un poantor la o
scop m| puteÛi contact| la:
funcÛie. Acum modific|m declaraÛia funcÛiei sin sd ir() prin ad|ugarea unui al 4-lea
parametru, un poantor la funcÛia corect|. Prototipul funcÛiei devine astfel:
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
void sinsdir(void *pa , size_ t m arim e, int N , int (*pf)(const vo id*, co nst void *));
e-mail: antaltiberiu@pcnet.ro
Când se apeleaz| sin sd ir() , se utilizeaz| numele funcÛiei de comparaÛie dorit. Programul
SIN SD IR 7.C ilustreaz| modul în care aceast| abordare permite utilizarea aceleiaÕi funcÛii
sin sd ir() pentru sortarea diferitelor tipuri de date.

170
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
/* SIN SD IR7.C */
Facultatea ConstrucÛii de MaÕini
#include<stdio.h>
Catedra de Mecanic| Õi Programare
#include<string.h>
Curs de limbaj
#define MA X_B C UF 256
lon g lT ab [9] = {1,5,7,3,5,9,8,5 ,6};
Copyright 2001. Toate drepturile sunt rezervate autorului.
char sT ab2[6][23] = {"Shiva mb u K alpa",
"De m agistro",
Multiplicarea acestui document în scop comercial este interzis|.
"Yoga S utra",
"Param arthasa ra",
SudenÛii participanÛi la "Shiva-P uran a",
orice form| de înv|Û|mânt superior bugetar
"Pa du ka Pa nc ha ka "};
pot multiplica acest
document pentru uzul personal.
void sinsdir(void *pa , size_ t m arim e, int N , int (*pf)(const vo id*, co nst void *));
int co m pa
SudenÛii ra_ long(const
participanÛi voidform|
la orice *m , con
destînv|Û|mânt
vo id *n ); cu plat| sau alte persoane doritoare
int c om pa ra_ sir(co nst void *m , con st vo id *n );
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scopmain(void)
int m| puteÛi contact| la:
{
ANTAL int i;
Tiberiu Alexandru
pu ts("\n Ina inte de s orta re:\n ");
tel.: 0040-264-530918
e-mail:for(i=0;i<9;i++)
antaltiberiu@pcnet.ro
prin tf("%ld ", lTab[i]);
pu ts("\n ");
for(i=0;i<6;i++)
prin tf("%s \n ", sTa b2[i]);

sin sdir(lTa b,4,9,com pa ra_ long);


sining.
Conf. dr. sdir(sT
ANTALab 2,23 ,6,com pa
Tiberiu ra_ sir);
Alexandru
Universitatea Tenhic| din Cluj-Napoca
pu ts("\n \n Du pa de s orta re:\n ");
Facultatea ConstrucÛii de MaÕini
for(i=0;i<9;i++)
Catedra de Mecanic| Õi Programare
prin tf("%ld ", lTab[i]);
Curs depulimbaj
ts("\n C
");
for(i=0;i<6;i++)
prin tf("%s \n ", sTa b2[i]);
Copyright 2001. Toate drepturile sunt rezervate autorului.
return 0;
}Multiplicarea acestui document în scop comercial este interzis|.
void sinsdir(void *pa , size_ t m arim e, int N ,int (*pf)(con st vo id*, co nst void *))
SudenÛii
{ participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
int pentru
i,j; uzul personal.
un sig ne d cha r cB ufX [M AX _B UF];
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
unsigned char *bpa=pa;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|for
puteÛi contact| la:
(i=1;i<N;i++)
{
m em cpy (cBu fX , bpa +i*m arim e, m arim e);
ANTAL Tiberiu Alexandru
j=i-1;
tel.: 0040-264-530918
w hile ((j>=0) && (p f((void *)&c Bu fX , (void *)(bpa +j*m arim e)) != 0))
e-mail: antaltiberiu@pcnet.ro
{
m em cpy (bpa +(j+1)*m arim e, bp a+j*m arim e, m arim e);
j=j-1;
}
m em cpy (bpa +(j+1)*m arim e, cB ufX , ma rim e);
}

171
Capitolul
Conf. dr.11ing.
- Considera
ANTAL Ûii Tiberiu
privin d stilul de pro gra mare în limb ajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
}
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi*m,
int compara_sir(void Programare
void *n)
{Curs de limbaj C
int k;
ch ar *m 1 = m ;
Copyright 2001. Toate drepturile sunt rezervate autorului.
char *n1 = n;
k=s trcm p(m 1,n1);
Multiplicarea acestui
if (k < 0) returndocument
1; în scop comercial este interzis|.
return 0;
}
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
int pentru uzul personal.
compara_long(void *m, void *n)
{
long
SudenÛii *m 1,*n1; la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
participanÛi
m 1 = (long *) m ;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
n1 = (long *) n;
scop m|retu
puteÛi contact|
rn (*m la:
1 < *n1);
}
ANTAL Tiberiu Alexandru
Rezultatele afiÕate de program sunt:
tel.: 0040-264-530918
Inainte de sortare:
e-mail: antaltiberiu@pcnet.ro
1 5 7 3 5 9 8 5 6

Shivambu Kalpa
De magistro
Yoga Sutra
Paramarthasara
Conf. dr. ing. ANTAL Tiberiu Alexandru
Shiva-Purana
Universitatea
Paduka Tenhic| din Cluj-Napoca
Panchaka
Facultatea ConstrucÛii de MaÕini
Dupa de sortare:
Catedra de Mecanic| Õi Programare
Curs
1 3 5de5 limbaj
5 6 7 C8 9

De magistro
Copyright 2001. Toate drepturile sunt rezervate autorului.
Paduka Panchaka
Paramarthasara
Multiplicarea
Shiva-Purana acestui document în scop comercial este interzis|.
Shivambu Kalpa
Yoga Sutra
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
Pentru ceipentru
care nuuzul personal.
au întâlnit înc| cele dou| funcÛii utilizate în programele de mai sus,
urmeaz| câteva explicaÛii.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
memcpy - copiaza 7 caractere
documentul numai contra
între cost Õi cu acordul scris al autorului. În acest
buffer-e
Prototip:
scop m| puteÛivoid
contact|
*m emla:
cpy ( void *de st, con st vo id *s rc, siz e_ t cou nt );
Fis- ier prototip: mem cpy - <m em ory .h > sau <string .h >
Valori
ANTALîntoarse: m em cpy() întoarce valoarea lui dest .
Tiberiu Alexandru
tel.: 0040-264-530918dest - buffer destinaÛie;
Parametri:
src - buffer surs|;
e-mail: antaltiberiu@pcnet.ro
count - num|rul de caractere ce se copiaz|.
Remarca7 : FuncÛia m em cpy() copiaz| count octeÛi din src în dest .

7 doua7 s- iruri - vezi 9.9.2


strcmp - compara

172
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

12 Operat-ii de intrare/ies- ire


Multiplicarea acestui document în scop comercial este interzis|.

(I/E) în C
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

O
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare

scop
peraÛiile
pot multiplica
m| puteÛi
oarecare
de intra re/ie
documentul
fel cu contact|
mediul înla:
s- ire , scrise prescurtat uneori sub forma I/E , nu sunt incluse
numai contra cost Õi cu acordul scris al autorului. În acest
în limbajul C, îns| majoritatea programelor trebuie s| interacÛioneze într-un
care se ruleaz|, ANSI C foloseÕte în acest scop un set de funcÛii
definite precis în biblioteca standard a limbajului. Majoritatea funcÛiilor de I/E ale C
ANTAL fluxuri
folosesc Tiberiu(Alexandru
s tre am s ) de date. Fluxurile sunt conectate la dispozitive pe care C le
numeÕte generic fiÕiere (files ). În acest mod C reuÕeÕte s| ne scuteasc| de cunoaÕterea
tel.: 0040-264-530918
detaliilor de funcÛionare a acestor dispozitive (tastatur|, monitor, pe disc, imprimant|).
e-mail: antaltiberiu@pcnet.ro
Un flux reprezint| o secvenÛ| de date de tipul text sau binar. Primul flux se numeÕte flux
de text Õi conÛine numai caractere ASCII, iar cel de al doilea se numeÕte flux binar Õi
poate conÛine orice fel de secvenÛ| de biÛi. Conexiunea dintre fluxuri Õi dispozitivele
asociate implicit acestora este dat| în tabelul care urmeaz|:

Denumire
Conf. dr. ing.flux
ANTALEste conectat
Tiberiu la dispozitivul
Alexandru
Universitatea
stdout
Tenhic| din Cluj-Napoca
ecran.
Facultatea ConstrucÛii de MaÕini
stdin de Mecanic|tastatur
Catedra |.
Õi Programare
Curs de limbaj C
stprn imprimant|.
Copyright ecran.
stdaux 2001. Toate drepturile sunt rezervate autorului.
stderr ecran.
Multiplicarea acestui document în scop comercial este interzis|.
Pentru c| teoretic funcÛiile de I/E din C sunt f|cute s| lucreze cu fluxuri, unele din funcÛii
SudenÛii participanÛi
sunt dedicate exclusivlalucrului
orice form|
cu unde înv|Û|mânt
anumit superior
flux. De exemplu bugetar pot multiplica acest
printf() lucreaz| numai cu
document
fluxul stdoutpentru
. Existuzul
| Õipersonal.
funcÛii "mai evoluate" care pot lucra cu orice fluxuri. De exemplu
fpr intf() lucreaz| cu oricare dintre fluxurile de mai sus, îns| numele fluxului cu care se
SudenÛii| participanÛi
lucreaz la orice
trebuie explicit form|
precizat ca de înv|Û|mânt
parametru al func Ûiei. În
cu plat| sau urm|doritoare
alte persoane
programul tor efectul
celor dou| funcdocumentul
pot multiplica Ûii este echivalent:
numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
/* FLU X1.C */
#include<stdio.h>
ANTAL Tiberiu Alexandru
int m ain ()
{tel.: 0040-264-530918
e-mail:prin
antaltiberiu@pcnet.ro
tf("Te salu t. (din p rintf)\n ");
fprintf(std ou t, "Te s alu t. (din fprin tf)\n");

return 0;
}

173
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Rezultate:
Facultatea ConstrucÛii de MaÕini
Te salut. (din printf)
Catedra
Te salut. de Mecanic|
(din fprintf)Õi Programare
Curs de limbaj C
Când un program îÕi începe execuÛia, codul de pornire al programului deschide automat
fluxurile
Copyrightde2001. mai Toate
sus, iar programul
drepturile sunt poate lucra
rezervate f|r| alte operaÛii premerg|toare cu
autorului.
acestea. Dac|, de exemplu, am dori s| lucr|m cu un fiÕier pe disc, fluxul i se asociaz|
fi Õierului prin opera
Multiplicarea acestuiÛiadocument
numit| deschiderea Õierului.
(open ) fieste
în scop comercial Numai dup| aceast| operaÛie
interzis|.
se va putea folosi fpr intf() pentru a stoca date în fiÕier.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Am spus c| un flux trebuie s| fie asociat unui fiÕier pe care s|-l
Rolul unui flux
document pentru uzul personal.
manipuleze, îns| standardul nu ne spune clar ce este un flux Õi care este
rolul lui. De asemenea, nu se specific| modul în care fluxul trebuie s| fie
SudenÛii participanÛi
implementat, la orice
chestiunea form|
fiind l|satde| înv|Û|mânt cu plat|
la latitudinea celor sau alte
care persoane
scriu doritoareÎn
compilatorul.
pot multiplica documentul numai contra cost Õi
vremurile când dispozitivele de i ntrare/ie Õire erau încete, programele în curs de
cu acordul scris al autorului. acest Ûie
Înexecu
în
scopRAM rulau mult
m| puteÛi maila:
contact| rapid decât aceste dispozitive erau în stare s| furnizeze datele
cerute de program. De exemplu, când un program citea caractere individuale de pe disc,
acesta
ANTAL era s| aÕtepte pân| ce discul f|cea o rotaÛie Õi sectorul cu data în cauz| putea
nevoit Alexandru
Tiberiu
fi citit apoi pentru
tel.: 0040-264-530918 citirea urm|torului caracter din program, aÕtepta pân| când discul era
în poziÛantaltiberiu@pcnet.ro
e-mail: ia bun|. Produc|torii de dispozitive hardware au inventat pentru eliminarea
acestei aÕtept|ri memoria cache pentru ca discul s| nu citesc| numai un singur caracter.
În acest caz deÕi programul citea un singur caracter, el era extras din cache Õi perioada
de aÕteptare era mult mai mic| (asta pentru c| în cache se citeau în avans mai multe
caractere f|r| a fi siguri c| va fi nevoie de ele; algoritmi complecs- i erau folosiÛi pentru a
determina care caractere s| fie stocate Õi care s| fie desc|rcate din memoria cache). Acest
cache este o memorie tampon între dispozitiv Õi program care, prin preînc|rcarea cu date,
poate
Conf. dr. duce creÕterea
ing.laANTAL vitezei
Tiberiu de lucru cu dispozitivul. Fluxurile realizeaz| aceeaÕi
Alexandru
opera Ûie ca Õi memoria cache
Universitatea Tenhic| din Cluj-Napoca la nivel software. Astfel, dac| dispozitivul cu care se lucreaz|
nu are la nivel hardware
Facultatea ConstrucÛii de MaÕini o memorie cache, software-ul rezolva7 acest neajuns (probleme
Catedra de Mecanic| Õi Programare cache-ul este dublat Õi viteza scade uÕor din acest
apar dac | îns | acesta are, deoarece
motiv).
Curs de limbaj C
Din tabelul prezentat anterior se observ| c| atât stdout cât Õi stderr
DeCopyright
ce exist| 2001. Toate drepturile sunt rezervate autorului.
afiÕeaz| informaÛiile pe ecran. Întrebarea care se pune este de ce a fost
stdout Õi stderr ?
nevoie de dou| fluxuri care lucreaz| cu acelaÕi dispozitiv? R|spunsul se
Multiplicarea acestui afl| în filozofia în
document sistemului de operare
scop comercial UNIX care a crescut împreun| cu
este interzis|.
C. UNIX a introdus noÛiunile de redirectare Õi conduct| (pipe) care au devenit atât de
populare încât noile la
SudenÛii participanÛi sisteme de operare
orice form| MS-DOS,
de înv|Û|mânt Windows
superior 95/98/NT
bugetar Õi OS/2 acest
pot multiplica le-au
implementat Õ i ele. Daca
document pentru uzul personal. 7 avem un program executabil numit prg.exe, lansat în execu Ûie
sub forma prg, el va folosi ca ieÕire ecranul monitorului, dar lansat în execuÛie prin linia
prg > fisier.txt, va lafolosi ieÕire Õierul cu numele
oriceca de fiînv|Û|mânt cu plat|fisier.txt care va doritoare
fi creat în
SudenÛii participanÛi form| sau alte persoane
directorul curent Õi va conÛine ceea ce a fost anterior afiÕat pe ecran. Deci ieÕirea normal|,
pot
adicmultiplica documentul anumai
| ecranul monitorului, contra cost
fost redirectat | c|Õitre
cudisc.
acordul
O altscris al autorului.
| variant În acest
| ar fi folosirea unei
scop m| puteÛi contact| la:
conducte. De exemplu, dac| lansarea în execuÛie se face prin prg | print, datele de ieÕire
ale lui prg sunt transmise automat programului print care va afiÕa conÛinutul primit de
ANTAL
la prg la Tiberiu
imprimant |. Cele dou| idei de mai sus au devenit fundamentale pentru UNIX,
Alexandru
tel.:| 0040-264-530918
îns ap|rea o problem| în cazul erorilor: dac| prg dorea s| afiÕeze un mesaj de eroare,
acesta
e-mail:fie era inserat în fiÕierul fisier.txt la gr|mad| cu datele utile, fie era afiÕat Õi el la
antaltiberiu@pcnet.ro
imprimant|. Era nevoie ca aceste mesaje s| fie afiÕate pe ecran indiferent de redirect |rile
pe care le f|cea utilizatorul. Problema a fost rezolvat| prin crearea a dou| fluxuri sdtout
care se poate redirecta, Õi stderr care este independent de operaÛiile de redirectare.

174
Capitolul
Conf. dr.12ing.
- Operat
ANTAL-ii de intrare/ies
Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
12.1 Funct-ii de ies- ire pe stdout
Catedra de Mecanic| Õi Programare
Curs de limbaj C
printf - realizeaza 7 ies- irea cu format pe fluxul stdout
Prototip: int p rintf(con st ch ar *fo rm at, [, arg um en te] ...);
Copyright 2001. Toate
Fis- ier prototip: drepturile
prin tf - <stdsunt rezervate autorului.
io.h >
Valori întoarse: prin tf () întoarce num|rul de caractere afiÕate sau o valoare negativ|
Multiplicarea acestuidac | a ap|rut
document o eroare.
în scop comercial este interzis|.
Parametri: format - Õir de formatare a informaÛiilor afiÕate;
SudenÛii participanÛi arg um en
la orice te - argumente
form| opÛionale.
de înv|Û|mânt superior bugetar pot multiplica acest
Remarca 7 : func Ûia printf()
document pentru uzul personal. afi Õeaz | formatat un grup de caractere Õi valori pe fluxul
standard de ieÕire, stdout. Dac| argumentele exist|, în Õirul format trebuie s| existe
specificaÛii stricte care sa7 determine modul de afiÕare a argumentelor. format este un Õir
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
de caractere, deci o secvenÛ| de caractere alfanumerice cuprinse între ghilimele. Acesta
pot multiplica
trebuie s| fiedocumentul
prezent în numai orice contra ÛiuneÕi cu
instruccost acordul scris al autorului. În acest
printf() , controlând modul în care se
scop m| puteÛi
converte contact| |la:Õi afiÕeaz| fiecare argument al funcÛiei. format conÛine dou|
Õte, formateaz
categorii de caractere, caractere simple Õi specific atori d e con vers ie . Ca rac terele sim ple
ANTAL
sunt Õi simplu
purTiberiu copiate pe ecran, iar specific atorii d e con vers ie acÛioneaz| asupra
Alexandru
argumentelor [, argumen te] realizând traducerea acestora din reprezentarea intern|
tel.: 0040-264-530918
e-mail:| antaltiberiu@pcnet.ro
folosit de C la cea de caractere înainte de afiÕarea lor pe stdout. În exemplul care
urmeaz|, "Sum a este %d \n" este format , %d Õi \n sunt specificatori de conversie, iar
Su m a este este un grup de caractere simple. iS um a este unicul argument al funcÛiei
printf() , fiind corespuz|tor lui [, argumen te] din forma general| a funcÛiei:

prin tf("Su m a es te %d \n", iS um a);

Conf.
Explicadr.Ûiaing. ANTAL
de mai Tiberiu
sus este un picAlexandru
tras| de coad| pentru c| oricine observ| c| printf() are
Universitatea
în Tenhic| din "Suma
realitate 2 argumente, este %d \n" Õi iS um a . De ce am spus atunci c| unicul
Cluj-Napoca
Facultatea al
argument funcÛiei este
ConstrucÛii iS um a ? FuncÛia printf() necesit| cel puÛin un argument, în
de MaÕini
sensul
Catedra c|deacesta este obligatoriu,
Mecanic| Õi Programare motiv pentru care nu l-am mai num|rat s- i pe acesta.
Curs de limbaj C
Exist | doua 7 categ orii de specif icatori d e con vers ie , unii încep cu simbolul % (procent)
ÕCopyright
i sunt, de 2001.
obicei,Toate -i de un singur
urmatdrepturile caracter, purtând
sunt rezervate autorului.denumirea de specificatori de
format sau de scriptor i de form at, Õi specific| tipul datei de afiÕat Õi modalitatea de
formatare a acesteia la afiÕarea pe ecran. Pentru fiecare specificator de format trebuie s|
Multiplicarea acestuiargument
existe câte un singur documentde în afi
scopÕat;comercial
dac| tipuleste interzis|.
acestuia Õi cel specificat de descriptor
nu sunt identici, C va încerca s| realizeze conversia de la tipul argument la cel al
SudenÛii participanÛi
descriptorului la orice
de format. form| de înv|Û|mânt
Descriptorul | o afiÕare
%d specificsuperior bugetar
a uneipot multiplica
valori AlÛi
întregi.acest
specificatori
document pentru mai frecvent utilizaÛi sunt prezentaÛi în tabelul care uremeaz|:
uzul personal.

SudenÛii participanÛi laTipul


Specificator orice form| de înv|Û|mânt cuModul
plat| sau
de alte persoane doritoare
afis- are
pot
demultiplica
conversiedocumentul numai contra cost Õi cu acordul scris al autorului. În acest
argumentului
scop m| puteÛi contact| la:
d, i int num|r zecimal întreg.
ANTAL
o Tiberiu Alexandru
int num|r octal f|r| semn.
tel.: 0040-264-530918
x, X antaltiberiu@pcnet.ro
e-mail: int num|r hexazecimal f|r| semn cu abcdef pentru
0x Õi cu ABCDEF pentru 0X .

u int num|r zecimal f|r| semn.


c int un singur caracter.

175
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
s ConstrucÛii char
de MaÕini
* afiÕeaz| caracterele unui Õir pân| la întâlnirea lui
Catedra de Mecanic| Õi Programare '/0' sau pân| la atingerea num|rului maxim de
Curs de limbaj C caractere specificate în precizie.
f doub le num|r real implicit în formatul: [-]m.zzzzzz;
Copyright 2001. Toate drepturile suntnumrezervate autorului.z este dat de precizia folosit|
|rul de zecimale
la afiÕare Õi implicit este 6.
Multiplicarea acestui document în scop comercial este interzis|.
e, E doub le num|r real implicit în formatul: [-]m.zzzzzz e ±xx
[-]m.zzzzzz E ±xx ; num|rul de zecimale z este
sauînv|Û|mânt
SudenÛii participanÛi la orice form| de superior bugetar pot multiplica acest
dat de precizia folosit| la afiÕare Õi implicit este 6 .
document pentru uzul personal.
g, G doub le foloseÕte modul de afiÕare de la %e sau %E dac|
exponentul
SudenÛii participanÛi la orice form| de înv|Û|mânt este
cumai mic
plat| saudecât -4 sau mai
alte persoane mare
doritoare
sau egal
pot multiplica documentul numai contra cost decât precizia;scris
Õi cu acordul altfel
al folose Õte modul
autorului. de
În acest
scop m| puteÛi contact| la: afiÕare de la %f ; nu afi Õeaz | zerourile
nesemnificative, num|rul de caractere folosite
ANTAL Tiberiu Alexandru pentru afiÕare fiind minim.
tel.:
p 0040-264-530918 void *, poantor num|rul afiÕat este un poantor (adres| de
e-mail: antaltiberiu@pcnet.ro memorie).

Unele exemple prezentate pân| acum foloseau %f pentru afiÕarea valorilor variabilelor de
tipul float, iar altele %lf pentru afiÕarea valorilor variabilelor de tipul doub le , deÕi tabelul
de mai sus nu spune nimic despre tipul float. Realitatea este c| printf( ) lucreaz| numai
cu %f atât pentru tipul float, cât s- i pentru tipul doub le datorit| conversiilor implicite (vezi
6.3.1)
Conf. dr. f|cute
ing.în cazul argumentelor
ANTAL de funcÛii. Acestea se aplic| la printf() pentru c|
Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca | a funcÛiei cazul fiind similar cu cel al apelurilor
argumentele intervin în partea variabil
de funcÛii f|r| prototip.
Facultatea ConstrucÛii de MaÕini
Catedra
La 7 t-imea de prec iziaÕiafi
sauMecanic| Programare
Õ|rii se poate specifica explicit ca o valoare întreag| sau prin
Curs de limbaj C
caracterul * , caz în care valoarea se calculeaz| prin conversia argumentului, obligatoriu
de tipul int, care precede obiectul de afiÕat. În cazul când sunt specificate atât l|Ûimea cât
ÕCopyright
i precizia, 2001.
acestea trebuie
Toate separate
drepturile prin
sunt caracterul
rezervate punct (.).
autorului.
L|Ûime de 5 document
caractere în scop comercial este interzis|.
Multiplicarea acestui
printf("%5i", j);
SudenÛii participanÛi L|Ûime
la oricedeform| de înv|Û|mânt superior bugetar pot multiplica acest
10 caractere
document pentru uzul personal.
printf("%10.5f", x);
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Precizienumai
pot multiplica documentul contra cost Õi cu acordul scris al autorului. În acest
de 5 caractere
scop m| puteÛi contact| la:
printf("%*.5f",10,x); /* Latime va riabila */
ANTAL Tiberiu Alexandru
Observa Ûi c| l|Ûimea (num|rul de caractere) pe care se afiÕeaz| valoarea argumentului se
tel.: 0040-264-530918
define Õte prin plasarea dup| caracterul % a unui num|r întreg. De exemplu, un câmp
e-mail: antaltiberiu@pcnet.ro
întreg cu l|Ûimea de 5 se scrie %5d . Valorile afiÕate vor fi aliniate la dreapta cu spaÛii pe
locul poziÛiilor din l|Ûime neocupate de num|rul afiÕat. Pentru afiÕarea caracterului % se
scrie % % . Ultimul exemplu prezint| cazul l|Ûimii variabile. S|geata arat| c| valoarea
numeric| de 10 se pune în corespondenÛ| cu caracterul * . Este posibil ca în locul valorii
numerice s| fie folosit| o variabil| de tipul întreg.
176
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Forma general
Facultatea | a specificatorului
ConstrucÛii de MaÕini de format este: %[in dicator][la7 t-im e][.prec izie] [F |N|h|l]
Spe cificator Con vers ie
Catedra de Mecanic| Õi Programare
Curs de limbaj
Caracterele C
indicator, sunt - , + , # Õi spat- iu . Pot ap|rea în orice combinaÛie Õi ordine având
semnificaÛiile:
Copyright 2001. Toate drepturile sunt rezervate autorului.
Indicator SemnificaÛie
Multiplicarea acestui document în scop comercial este interzis|.
- Aliniere la stânga, completare la dreapta cu spaÛii. Dac| nu este
specificat
SudenÛii participanÛi se face
la orice aliniere
form| de înv|Û|mânt Õi completare
la dreaptasuperior la pot
bugetar stânga cu zerouri
multiplica acest
sau spa Ûii.
document pentru uzul personal.
+ Conversiile cu semn rezult| cu + sau - .
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot spat-iu
multiplica Dac| valoarea
documentul estecontra
numai | sauÕi nul
pozitivcost cu |acordul
ieÕireascris
începe cu un spaÛiuÎnînacest
al autorului. loc
de + ; valorile
scop m| puteÛi contact| la: negative p | streaz | semnul - .
# Specific| afiÕarea argumentului convertit conform celor care urmeaz|:
ANTAL Tiberiu• Alexandru
când este folosit împreun| cu o , x sau X , prefixeaz| orice
tel.: 0040-264-530918 valoare nenul| de ieÕire cu 0 , 0x , sau 0X . Implicit, nu se
afiÕeaz| spaÛii;
e-mail: antaltiberiu@pcnet.ro
• când este folosit împreun| cu descriptorii e , E sau f , va forÛa
afiÕarea punctului zecimal în toate cazurile. Implicit, acesta
apare numai dac| num|rul are Õi parte zecimal|;
• când este folosit împreun| cu g sau G forÛeaz| afiÕarea
punctului zecimal în toate cazurile Õi previne trunchierea
zerourilor care urmeaz| dup| num|r. Implicit, punctul zecimal
Conf. dr. ing. ANTAL apare
Tiberiu Alexandru
numai dac| dup| acesta urmeaz| cifre. Dac| acestea sunt
Universitatea Tenhic| zerouri
din Cluj-Napoca
ele vor fi suprimate;
Facultatea ConstrucÛii
• de MaÕini
este ignorat când este folosit împreun| cu c , d , i , u, sau s .
Catedra de Mecanic| Õi Programare
Curs de limbaj C

În forma general
Copyright | a specificatorului
2001. Toate drepturile sunt derezervate
format, toate câmpurile cuprinse între paranteze
autorului.
drepte sunt opÛionale. [F|N|h|l|L] poart| denumirea de modificatori ai valorii de intrare,
specificând lungimea
Multiplicarea argumentului
acestui document conform
în scop celoreste
comercial urmeaz|:
careinterzis|.
F - poantor far
SudenÛiiN participanÛi
- poantor nearla orice form| de înv|Û|mânt superior bugetar pot multiplica acest
documenth - pentru
sh ort inuzul
t saupersonal.
short
l - long sau unsigned long
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
L - lon g d ouble
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
AceÕti modificatori afecteaz| modul în care printf() interpreteaz| tipul de dat|
corespunz |tor argumentului.
ANTAL Tiberiu Alexandru În cazul normal, argumentele corespunz|toare lui %p Õi %s
sunt poantori de tipul modelului de memorie folosit la generarea programului executabil.
tel.: 0040-264-530918
F spune c| “interpreteaz| argumentul ca pe un poantor far”. h Õi l suprascriu m|rimea
e-mail: antaltiberiu@pcnet.ro
implicit| a argumentelor numerice din printf() , astfel ca7 l se aplic| la întregi (d, i, x ) Õi la
valori reale (e, f, g ), iar h numai la tipurile întregi. În prezenÛa lui l argumentul este
interpretat ca long int pentru d, i, x , ca doub le în prezenÛa lui e, f, g sau ca long d ou ble
în cazul lui L .

177
Capitolul
Conf. dr.12ing.
- Operat
ANTAL-ii de intrare/ies
Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Un alt tip de s pecific ator d e con vers ie începe cu caracterul backslash (\ ). SecvenÛa \n
Facultatea ConstrucÛii de MaÕini
este cunoscut
Catedra |, din motive
de Mecanic| istorice, sub numele de secvent-a7 escape Õi reprezint| un
Õi Programare
caracter special inserat într-un Õir. În acest caz \n insereaz| un caracter newline - trecere
Curs
la liniedenou
limbaj
| Õi laCînceput de rând . Câteva din secvenÛele escape mai utile sunt:
• \f - trecere la început de rând (formfeed );
Copyright 2001. Toate drepturile sunt rezervate autorului.
• \t - tabulator orizontal (horizontal tab );
• \b - Õterge
Multiplicarea caracterul
acestui documentdinînstânga cursoruluieste
scop comercial (backspa ce );
interzis|.
• \a - caracterul alert| (bell ) are ca efect emiterea unui semnal sonor;
SudenÛii
• \rparticipanÛi
- retur de carla orice form|return
(carriage de înv|Û|mânt
); superior bugetar pot multiplica acest
document
• pentru uzul personal.
\n - trecere la linie nou| (newline );
• \\ - caracterul backslash , adic| \ ;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
• \? - caracterul semn de întrebare, adic| ?
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
• \ooo - caracterul
scop m| puteÛi contact| la: ASCII în nota Ûie octal|, unde o este o cifr| între 0 Õi 7 ;
• \xhh - caracterul ASCII cu codul hexazecimal hh , unde h este o cifr| între 0 Õi F .
ANTAL Tiberiu Alexandru
tel.:
Func0040-264-530918
Ûia printf() foloseÕte primul argument pentru a afla num|rul de argumente care
e-mail:
urmeaz|antaltiberiu@pcnet.ro
Õi tipul acestora. Ea va genera probleme dac| num|rul de argumente sau tipul
acestora este incorect.

puts- realizeaza ies- irea unui s- ir pe fluxul stdout


Prototip: int puts(const char *s- ir);
Conf. dr. ing. ANTAL
Fis- ier prototip: pu Tiberiu
ts - <stdAlexandru
io.h >
Universitatea Tenhic| din Cluj-Napoca
Valori întoarse: puts() întoarce o valoare nenegativ| în caz de succes, iar altfel
Facultatea ConstrucÛii de MaÕini
întoarce constanta EOF .
Catedra de Mecanic| Õi Programare
Parametri: s- ir - Õirul care va fi trimis pe stdout.
Curs de limbaj C
Remarca7 : funcÛia pu ts() trimite pe stdout Õirul, înlocuind caracterul terminator de Õir ('\0')
cu caracterul
Copyright de Toate
2001. treceredrepturile
la linie nou | ('\n'
sunt ).
rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

12.2 Funct
SudenÛii participanÛi -ii form|
la orice dedeintrare pe potstdin
debugetar
înv|Û|mânt superior multiplica acest
document pentru uzul personal.
Pentru funcÛiile care vor fi prezentate în continuare trebuie s| ÕtiÛi c| acestea sunt
buffer-ate. Aceasta înseamn| c| datele introduse pe stdin vor fi prelucrate numai dup|
SudenÛii
ap|sareaparticipanÛi la orice
tastei <Enter>. Unform| deeste
buffer înv|Û|mânt
o zon| decumemorie
plat| saufolosit
alte persoane doritoarede
| pentru stocarea
pot multiplica
mesaje. Tipic, documentul
buffer-ul are numai contra cost
un poantor Õi cu acordul
de intrare care vascris al autorului.
poanta noile dateÎnscrise
acest în
scop m|un
buffer, poantor
puteÛi Õire care va poanta la urm|torul element care va fi citit Õi un
de iela:
contact|
contor care num|r| spaÛiul înc| r|mas neocupat din buffer. Principala lui utilizare este
decuplarea
ANTAL Tiberiu | procese, astfel încât citirea Õi scrierea s| poat| opera la viteze diferite
a douAlexandru
Õtel.:
i pentru blocuri de date de m|rimi diferite. Exist| mai mulÛi algoritmi pentru utilizarea
0040-264-530918
buffer-elor: First in First Out (FIFO sau coada
e-mail: antaltiberiu@pcnet.ro 7 ), Last In First Out (LIFO sau stiva7 ),
doub le buffering care permite ca un buffer s| fie citit în timpul în care cel|lat este înscris,
buffer circular în care dac| citirea sau scrierea trece de cap|t acestea se continu| de la
început buffer-ului.

178
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
getchar
Facultatea-ConstrucÛii
realizeaza de7 MaÕini
citirea unui caracter de pe stdin
Prototip:
Catedra de Mecanic|int g etch ar(v oid );
Õi Programare
-ierdeprototip:
Fis
Curs limbaj C getchar - <std io.h >
Valori întoarse: întoarce caracterul citit.
Copyright 2001. Toate drepturile sunt rezervate autorului.
1 /* GE TCH AR .C */
2 Multiplicarea acestui
#include<stdio.h> document în scop comercial este interzis|.
3 int main(void)
4 SudenÛii
{ participanÛila orice form| de înv|Û|mânt superior bugetar pot multiplica acest
5 document
int pentru
car; uzul personal.
6
7 SudenÛii participanÛi
while((car la orice form|
= getchar()) de înv|Û|mânt cu plat| sau alte persoane doritoare
!= EOF)
8 pot multiplicaprin
documentul contra cost Õi cu acordul scris al autorului. În acest
numaicar);
tf("<- '%c'\n",
9 scop m| puteÛi contact| la:
10 prin tf("EO F\ n");
11 ANTAL Tiberiu Alexandru
12 return 0;
tel.: 0040-264-530918
13 }e-mail: antaltiberiu@pcnet.ro

Rezultate:
xyz
<- 'x'
<- 'y'
Conf.
<- 'z'dr. ing. ANTAL Tiberiu Alexandru
Universitatea
<- ' Tenhic| din Cluj-Napoca
Facultatea
' ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
a
Curs de
<- 'a' limbaj C
<- '
'
Copyright 2001. Toate drepturile sunt rezervate autorului.
EOF
Multiplicarea acestui document în scop comercial este interzis|.
Întrucât stdin foloses- te un buffer la citirea Õirului de caractere xyz cu funcÛia getch ar()
SudenÛii participanÛi
aceste caractere vor la orice form|numai
fi prelucrate dup| ap|superior
de înv|Û|mânt bugetar
sarea tastei La ap|sarea
pot multiplica
<Enter>. acest
acestei
documenttaste uzul |personal.
se observ
pentru c| ciclul este executat de patru ori, apoi funcÛia getchar() r|mâne
f|r| caractere Õi continua7 s| aÕtepte date de pe stdin (tastatur|). La ap|sarea lui a alte
dou | caractere
SudenÛii sunt prelucrate,
participanÛi caracterul
la orice form| 'a' Õi <Enter>,
de înv|Û|mânt cu plat|iar
sauciclul
alte este din nou
persoane executat
doritoare
de
potdou | ori. În sistemul
multiplica documentulde operare
numai MS-DOS
contra costcaracterul <Ctrl>+
Õi cu acordul <Z>
scris al care se În
autorului. acest |
genereaz
de la tastatur | prin ap
scop m| puteÛi contact| la: | sarea simultan | a tastelor <Ctrl> Õi <Z> este folosit pentru
marcarea sfârÕitului de fiÕier. Când getch ar() întoarce acest caracter ciclul se termin|.
ANTAL Tiberiu Alexandru
Poate c| v-a s|rit deja în ochi c| variabila car este declarat| de tipul int
tel.: 0040-264-530918
De ce int Õi nu
Õi nu de tipul char. În cartea lui K&R, la fel ca Õi în C standa rd , nu se
e-mail: antaltiberiu@pcnet.ro
char? specific| dac| tipul char este cu sau f|r| semn. DeÕi chestiunea pare a
fi nesemnificativ|, valoarea lui EOF este definit| ca -1 . Dac| un
produc|tor de compilator alege s|-l implementeze pe char f|r| semn, atunci când
getch ar() va întoarce valoarea EOF , adic| pe -1 , pentru a indica sfârÕitul fiÕierului, în
variabila car ar fi stocat| valoarea 255 (pentru c| ea nu poate stoca numere negative).
179
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Compararea valorii 255de -1 face ca ciclul s| fie executat la nesfârÕit, condiÛia de p|r|sire
cuMaÕini
Facultatea ConstrucÛii
nefiind îndeplinit | niciodat
Catedra de Mecanic| Õi Programare |. Folosirea lui int garanteaz| c| semnul valorii numerice va
fi reprezentat corect, motiv pentru care situaÛia descrisa7 nu poate s| apar|.
Curs de limbaj C

scanf
Copyright - realizeaza
2001. Toate 7 drepturile
intrareasunt cu format
rezervate de pe fluxul stdin
autorului.
Prototip: int scan f(con st ch ar *fo rm at, [, arg um en te] ...);
Multiplicarea
Fis- ier prototip:acestui document în scop comercial este interzis|.
scanf - <std io.h >
Valori întoarse: sca nf () întoarce num|rul de câmpuri convertite Õi atribuite cu
SudenÛii participanÛi succes;
la orice nuform|
suntdeincluse
înv|Û|mânt superior
câmpurile bugetar
citite pot multiplica
Õi neatribuite. acest0
Valoarea
document pentru uzulînseamn personal.| c| nu s-a efectuat nici o atribuire. Valoarea EOF se
întoarce în caz de eroare sau dac| s-a detectat caracterul terminator
SudenÛii participanÛi de fiÕier.form| de înv|Û|mânt cu plat| sau alte persoane doritoare
la orice
Parametri:
pot multiplica documentul format - Õir de
numai caractere
contra cost Õifolosit pentruscris
cu acordul formatarea În Ûacest
informa
al autorului. iilor de
scop m| puteÛi contact| la: citit;
arg um en te - argumente opÛionale.
ANTAL 7Tiberiu
Remarca : funcÛiaAlexandru
sca nf() citeÕte date de pe stdin Õi le scrie în locaÛiile de memorie
specificate de argumente. Fiecare argument trebuie s| fie un poantor la o variabil| de
tel.: 0040-264-530918
tipul
e-mail:corespunz |tor specificatorului de format din format . sca nf() se opreÕte din citire
antaltiberiu@pcnet.ro
când caracterele de conversie din Õirul format au fost epuizate sau când, datorit| unor
sc|p|ri, se încearc| introducerea unor caractere care duc la o eroare. Tipurile de
caractere care pot fi întâlnite în Õirul format sunt: spat-ii sau tabulatori care sunt
ignorate, caractere obis- nu ite (neprecedate de caracterul % ), care trebuie s| fie identice
cu ceea ce se citeÕte de pe fluxul de intrare când se ajunge la acestea Õi specificatori de
con vers ie care se formeaz| la fel ca Õi la printf() din caracterul % , urmat de caracterul *
opÛional
Conf. dr.deing. ANTAL
anulare Tiberiuvalorii
a atribuirii citite, un num|r opÛional ce specific| l|Ûimea maxim|
Alexandru
aUniversitatea
câmpului, unTenhic|
h , l sau din Ûional care indic| lungimea sursei Õi un caracter de conversie
L opCluj-Napoca
c|rui semnifica
aFacultatea Ûie se prezint
ConstrucÛii de MaÕini | în tabelul urm|tor.
Catedra de Mecanic| Õi Programare
Curs de limbaj C
Specificator Tipul Data de intrare
de conversie
Copyright argumentului
2001. Toate drepturile sunt rezervate autorului.
d int num|r zecimal întreg.
Multiplicarea acestui document în scop comercial este interzis|.
i int num|r întreg zecimal, octal (începe cu 0 ) sau
SudenÛii participanÛi la orice form| hexazecimal
de înv|Û|mânt (începe cu 0x
superior sau 0X
bugetar ). multiplica acest
pot
document
o pentru uzul personal.
int num|r întreg octal f|r| semn, cu sau f|r| 0 la
început.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
x, X
pot multiplica documentul num|cost
int numai contra r întreg notaÛiescris
Õi cuînacordul hexazecimal | f|r| În
al autorului. sau
0xacest
0X la început, folosind abcdef pentru 0x Õi
scop m| puteÛi contact| la:
ABCEDF pentru 0X .

ANTAL
u Tiberiu Alexandru
int num|r întreg zecimal f|r| semn.
tel.: 0040-264-530918
c int un caracter.
e-mail: antaltiberiu@pcnet.ro
s char * Õir de caractere.
f, e, g doub le num|r real în virgul| flotant| cu semn, punct
zecimal Õi exponent opÛional.

180
Capitolul
Conf. dr.12ing.
- Operat
ANTAL-ii de intrare/ies
Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Func Ûia scaConstrucÛii
Facultatea nf() este opusul funcÛiei printf() . Ea realizeaz| operaÛia de intrare de pe stdin ,
de MaÕini
în timp ce printf() o realizeaz| pe cea de ieÕire pe stdout. sca nf() citeÕte caracterele de pe
Catedra de Mecanic| Õi Programare
stdin Õi le interpreteaz| conform caracterelor de conversie din primul argument, Õirul
Curs de limbaj C
format . Argumentele opÛionale arg um en te trebuie s| fie adrese ale unor locaÛii de
memorie.
Copyright 2001. Toate drepturile sunt rezervate autorului.

int a, b ;
Multiplicarea acestui document în scop comercial este interzis|.
. . .
SudenÛii
sca participanÛi
nf("% d % d", & a, &la
b);orice
form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
În exemplul de mai sus, se citesc 2 întregi, separaÛi printr-un spaÛiu; primul va fi stocat
SudenÛii participanÛi
în variabila la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
a , iar cel de al doilea în variabila b . Pentru specificarea adresei la care sunt
pot
stocate variabilele se folosenumai
multiplica documentul contra cost
Õte operatorul Õi cu acordul
& (adres |). SpaÛscris al autorului.
iul între cei doi %dÎn acest |
înseamn
scopmult
mai m| puteÛi
decât contact|
un simplula:spaÛiu, Õi anume orice combinaÛie de un num|r de spaÛii, tab-uri
Õi linii noi între cele 2 valori. Dac|, de exemplu, dorim s| separ|m numerele printr-o
singur
ANTAL | virgul
Tiberiu | înAlexandru
loc de spaÛii scriem:
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
sca nf(“% d,% d”, & a, & b);

Dac| dorim s| citim un Õir de caractere scriem:

#include <stdio.h>
Conf.
m ain ()dr. ing. ANTAL Tiberiu Alexandru
Universitatea
{ Tenhic| din Cluj-Napoca
Facultatea
charConstrucÛii
nu m e[30 ]; de MaÕini
Catedra de tf(“Cu
prin m teÕinu
Mecanic| Programare
m esti: “);
Curs desca
limbaj C
nf(“% s”,nu m e);
prin tf(“Sa lut, % s\n ”,nu m e);
}Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


Pentru c| n um e este un Õir de caractere, care în C se stocheaz| sub forma unui tablou,
valoarea lui num e este adresa de început a tabloului, din care motiv nu se foloseÕte
SudenÛii participanÛi
operatorul & în faÛa la
luiorice
n umform| de înv|Û|mânt
e . Probleme apar însuperior
variantabugetar
de maipotsusmultiplica acest
dac| Õirul de
document introdus
caractere pentru uzul tastatur| conÛine spaÛii. În acest caz sunt citite caracterele numai
de lapersonal.
pân| la primul spaÛiu, el fiind considerat ca terminator al Õirului. O soluÛie poate fi
programul:
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
#include<stdio.h>
m ain ()
ANTAL
{ Tiberiu Alexandru
tel.: 0040-264-530918
char nu m e[10 ], pre nu m e1[10], pren um e2[10];
e-mail:prin
antaltiberiu@pcnet.ro
tf(“Cu m te nu m esti: “);
sca nf(“% s %s %s”,nu m e, pre nu m e1, pren um e2);
prin tf(“Sa lut, % s %s \n ”,nu m e, pre nu m e2);
}

181
Capitolul
Conf. dr.12ing.
- Operat-ii de intrare/ies
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
O alt| variant
Facultatea | ar fi utilizarea
ConstrucÛii de MaÕinifuncÛiei gets() care consider| ca terminator al Õirului
introdus ap | sarea tastei
Catedra de Mecanic| Õi Programare<Enter>, moment în care insereaz| automat la cap|tul Õirului
caracterul nu ll ('\0').
Curs de limbaj C

gets
Copyright - realizeaza 7 intrarea
2001. Toate drepturileunei linii de autorului.
sunt rezervate pe fluxul stdio
Prototip: cha r *ge ts(char *b uffer);
Multiplicarea
Fis- ier prototip:acestui document
gets - <std în scop
io.h > comercial este interzis|.
Valori întoarse: gets() întoarce argumentul în caz de succes. Un poantor nu ll se
SudenÛii participanÛi întoarce
la orice form|
în caz de
deînv|Û|mânt
eroare. superior bugetar pot multiplica acest
document
Parametri:pentru uzul personal.
buffer - zon| de RAM în care se va stoca Õirul.
Remarca7 : funcÛia gets() citeÕte o linie de pe stdin Õi o stocheaz| în variabila buffer. Linia
SudenÛii
const| înparticipanÛi la orice
toate caracterele ei, form|
inclusivdeprimul
înv|Û|mânt cu plat|
caracter sau alte
de trecere persoane
la linie nou| (doritoare
'\n'). gets()
potînlocui
va multiplica
acestdocumentul numai
ultim caracter cu contra cost Õi cude
cel terminator Õir ('\0'
acordul scris al autorului.
) înainte În acest
de a întoarce linia
citit | .
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


12.3 Funct-ii pentru operat-ii cu
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

fis- iere
Dup| cum am mai spus, majoritatea funcÛiilor de I/E din biblioteca C sunt f|cute s|
lucreze cu fluxuri. De exemplu ÕtiÛi deja c| printf() este versiunea simplificat| a lui
fpr intf() . În multe din cazuri, singura diferenÛ| dintre funcÛiile particulare fluxurilor stdin
ÕConf.
i stdout
dr.discutate
ing. ANTALpân|Tiberiu
acum (printf() , sca nf() , gets() , pu ts() etc.) Õi cele care pot lucra cu
Alexandru
Universitatea Tenhic| din Cluj-Napocapentru cele din urm| se poate specifica numele
fi Õiere în general, const | în faptul c|
fluxului
Facultateacu care opereazde
ConstrucÛii |. MaÕini
Denumirea acestor funcÛii care lucreaz| cu fiÕiere se formeaz|
de obiceide
Catedra dinMecanic|
numele func Ûiei de I/E discutat pân| acum, prefixat de caracterul 'f'. Astfel,
Õi Programare
sca nf() devine fscan f() , printf() devine fpr intf() , gets () devine fge ts() etc.
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


12.3.1 Deschiderea fis- ierelor
Multiplicarea acestui
Înainte de a putea document
manipula în scopacestuia
fiÕierul, comercial este interzis|.
trebuie s| i se asocieze un flux. Aceast|
asociere dintre flux Õi fiÕier se realizeaz| prin funcÛia fop en (). FuncÛia va asocia un flux cu
SudenÛii de fiÕier existent
un numeparticipanÛi la oricepeform|
disc, de
fiind obligatorie
înv|Û|mânt Õi specificarea
superior modului
bugetar pot de acces
multiplica la
acest
datele fiÕier. uzul personal.
din pentru
document

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
fopen - deschide un fis- ier
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Prototip: FIL E *fo pen (con st ch ar *n um efisier, co nst cha r *m od );
scop m| puteÛi contact| la:
Fis- ier prototip: fopen - <stdio.h>
Valori întoarse: fop en () întoarce un poantor la fiÕierul deschis. Un poantor N ULL
ANTAL Tiberiu Alexandru
este întors dac| exist| erori.
tel.: 0040-264-530918
Parametri: num efisier - numele fiÕierului;
e-mail: antaltiberiu@pcnet.ro
mod - tipul accesului permis la fiÕier.

Un flux este declarat prin tipul FILE *, adic| un poantor la tipul de dat|
Declararea unui
FILE . Dac| doriÛi s| ÕtiÛi cum este definit acest tip de dat| puteÛi c|uta
flux
definiÛia lui în fiÕierul cu prototipuri stdio.h. F|r| a intra în prea multe
182
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
am |nunte FILE
Facultatea , este ode
ConstrucÛii MaÕini| care stocheaz| informaÛii despre fiÕier: poziÛia buffer-
structur
ului, pozi Ûia caracterului curent
Catedra de Mecanic| Õi Programare din buffer, dac| fiÕierul este citit sau scris, dac| au ap|rut
sau nu erori. Utilizatorul nu trebuie s| cunoasc| aceste detalii de implementare, el fiind
Curs de limbaj
responsabil C pentru declararea unei variabile de acest fel sub forma FILE* pfis;,
numai
dup| cum se observ| în linia 6 a programului care urmeaz|. Argumentul folosit pentru
Copyright
specificarea2001. Toatededrepturile
modului acces la fisunt rezervate
Õier este autorului.
prezentat în tabelul urm|tor.

Multiplicarea acestui document în scop comercial este interzis|.


Mod de deschidere SemnificaÛie
SudenÛii Õierului
a fiparticipanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
"r" Deschide un fiÕier existent pentru citire.
SudenÛii
"w " participanÛi la orice form|
Deschide decreeaz
sau |, dac|cueste
înv|Û|mânt plat| sau alte
cazul, Õier pentru
un fipersoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scriere.
scop m| puteÛi contact| la:
"a" Deschide sau creeaz| un fiÕier pentru ad|ugare.
ANTAL
"r+" Deschide un fiÕier existent pentru citire Õi scriere.
Tiberiu Alexandru
tel.: 0040-264-530918
"w+" Creeaz| sau deschide un fiÕier pentru citire Õi scriere.
e-mail: antaltiberiu@pcnet.ro
"a+" Deschide sau creeaz|, dac| este cazul, un fiÕier pentru citire
Õi ad|ugare.
"rb" Deschide un fiÕier binar pentru citire.
"wb" Deschide un fiÕier binar pentru scriere.
Conf. dr. ing. ANTAL Tiberiu Alexandru
"ab"
Universitatea Tenhic| dinDeschide un fiÕier binar pentru ad|ugare.
Cluj-Napoca
Facultatea
"rt" ConstrucÛii de MaÕini un fiÕier text pentru citire.
Deschide
Catedra de Mecanic| Õi Programare
"w t"
Curs de limbaj C Deschide un fiÕier text pentru scriere.
"at" Deschide un fiÕier text pentru ad|ugare.
Copyright 2001. Toate drepturile sunt rezervate autorului.
"r+b" Deschide un fiÕier binar pentru citire Õi scriere.
Multiplicarea
"w+b" acestui document
Creeaz|în
unscop comercial
fiÕier este interzis|.
binar pentru scriere.
Deschide
"a+b" participanÛi la orice
SudenÛii undefiÕînv|Û|mânt
form| ier binar pentru ad|bugetar
superior ugare. pot multiplica acest
document
"r+t" pentru uzul personal.
Deschide un fiÕier text pentru citire Õi scriere.
Creeaz
"w +t" participanÛi la orice
SudenÛii | un de
form| fiÕier text pentru
înv|Û|mânt cu plat| Õi scriere.
citiresau alte persoane doritoare
pot multiplica documentul
"a+t"
numai un
Deschide contra cost
fiÕier Õi pentru
text cu acordul scris
citire al autorului. În acest
Õi scriere.
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


12.3.2 Scrierea datelor într-un fis- ier
tel.: 0040-264-530918
e-mail:
Dac| veantaltiberiu@pcnet.ro
Ûi executa programul care urmeaz| veÛi g|si pe disc un fiÕier numit salut.txt, de 11
biÛi lungime, care conÛine mesajul din linia 10 .

1 /* FO PE N1.C */
2 #include<stdio.h>
183
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
3 int main(void)
4
Facultatea
{
ConstrucÛii de MaÕini
5
Catedra de Mecanic| Õi Programare
FILE *pfis;
6 Curs de limbaj C
7 if (( pfis = fopen("salut.txt", "w")) != NULL)
8 Copyright
{ 2001. Toate drepturile sunt rezervate autorului.
9 fprintf(p fis, "S alu tare !\n ");
10 Multiplicarea fclos
acestui document în scop comercial este interzis|.
e(pfis);
11 }
12 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
else
13 document
{ pentru uzul personal.
14 prin tf("Er oar e de scrie re in fisier ul sa lut.tx t\n ");
15 per ror("p
SudenÛii participanÛi la en tru form|
orice ca: "); de înv|Û|mânt cu plat| sau alte persoane doritoare
16 pot multiplicareturn 1;
documentul numai contra cost Õi cu acordul scris al autorului. În acest
17 }
scop m| puteÛi contact| la:
18
return
19 ANTAL 0;
Tiberiu Alexandru
20 }
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
fop en () întoarce un poantor la o structur| de tipul FILE care se numeÕte mai sus pfis . Deci
numele fluxului nostru este pfis Õi este conectat la fiÕierul salut.txt de pe disc. Întrucât
membrii structurii FILE sunt trataÛi direct de funcÛiile pentru accesul la fiÕiere, utilizatorul
nu trebuie s|-i cunoasc| pentru ca s| lucreze cu aceÕtia. Ceea ce utilizatorul trebuie s|
cunoasc| este numele poantorului la fiÕier.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic|Dac|din Cluj-Napoca
fiÕierul nu a putut fi deschis, un poantor cu valoarea NULL este
Problema
întors de funcÛie. O eroare comun| este scrierea numelor de fiÕiere f|r|
Facultatea ConstrucÛii de MaÕini
accesului la
Catedra de Mecanic| dublarea caracterelor backslash ('\'). De exemplu dac| argumentul
Õi Programare
fiÕiere
Curs de limbaj C n u m e f i s i e r c o n Û i n e Õ i o c a l e s cr i s | s u b f o r ma
"C:\ pro g\lim ba je\c\sa lut.tx t" , caracterele \ simple vor fi interpretate
ca parte a unei
Copyright 2001. Toate Ûe escape,sunt
sevendrepturile scrierea corect
rezervate | a Õirului de mai sus în C fiind:
autorului.
"C:\ \pr og\ \lim ba je\\ c\\ salu t.txt" . Dac| în DOS Õi Windows problema de mai sus poate
sa7 apara7 , în UNIX, pentru c| directorii din cale sunt separaÛi prin caracterul slash ('/'),
Multiplicarea acestui document în scop comercial este interzis|.
ea nu mai este actual| (în C '\t', '\n' etc. au semnificaÛia unor secvenÛe escape, dar nu Õi
'/t', '/n' etc.).
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
Întrucât lucrul cu fluxul se deruleaz| prin poantori, în cazul unei erori
Tratarea erorilor
SudenÛii participanÛitot ceea ce putem
la orice indica
form| de este faptul
înv|Û|mânt c| o eroare
cu plat| ap|rut prin
sau altea persoane folosirea
doritoare
valorii speciale N U LL pentru poantor. Dac| fop en () întoarce valoarea
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
NULL cu siguranÛ| a ap|rut o eroare, îns| nu Õtim prea multe despre natura erorii. S-ar
scop m| puteÛi contact| la:
putea ca numele fiÕierului s| fie greÕit sau reÛeaua pe care lucr|m s| fi c|zut, din acest
motiv standardul trateaz| erorile prin intermediul unei variabile numite errno care
ANTAL
stocheaz|Tiberiu
num|rulAlexandru
erorii. Fiecare implementare de C atribuie o valoare unic| fiec|rei
tel.: 0040-264-530918
erori posibile, de exemplu 1 poate fi fiÕier inexistent, 2 memorie insuficient| etc. Este
posibil|antaltiberiu@pcnet.ro
e-mail: accesarea valorii numerice a lui errno prin scrierea liniei extern int errno; la
începutul programului. Valoarea numeric| va fi actualizat| în cazul unei erori, îns|
num|rul în sine ne spune prea puÛine. Ar fi mai util dac| am putea afiÕa un mesaj
corespunz|tor erorii ap|rute Õi aceasta se poate realiza prin funcÛia perro r() care a fost
folosit| în linia 16 . Aceasta afiÕeaz| pe ecran mesajul dintre ghilimele Õi un mesaj extras
dintr-o tabel| de mesaje de eroare utile pentru a clarifica sursa exact| a erorii.
184
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
perror
Facultatea - afis- eaza7 un
ConstrucÛii mesaj de eroare
de MaÕini
Prototip: void p
Catedra de Mecanic| Õi Programare erro r(con st ch ar *m esa j);
-ierdeprototip:
Fis
Curs limbaj C perror - <stdio.h> sau <stdlib.h>
Valori întoarse: nu are.
Parametri: mesaj - Õirul de caractere care formeaz| mesajul de afiÕat.
Copyright 2001. Toate drepturile sunt rezervate autorului.
Remarca7 : perro r() afiÕeaz| un mesaj de eroare pe stderr .
Multiplicarea acestui document în scop comercial este interzis|.
m esaj este afiÕat prima oar|, urmat de o virgul|, apoi mesajul de eroare corespunz |tor
ultimului
SudenÛii participanÛi la orice|form|
apel din bibliotec care adeprodus eroarea
înv|Û|mânt de sistem
superior bugetarÕi, pot
în final, caracterul
multiplica acest
newline . Dac | mesaj este
document pentru uzul personal. un poantor N ULL sau un poantor la un Õ ir NULL , perro r()
afiÕeaz| numai mesajul de eroare de sistem. Pentru rezultate reale, perro r() se apeleaz|
imediat dup| funcÛia care ar putea întoarce eroarea, altfel apelurile de noi funcÛii vor
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
suprascrie valoarea numeric| a lui errno . Dac| operaÛia a reuÕit fiÕierul este deschis Õi se
pot
scriemultiplica documentul
în el mesajul numai contra
dorit. Întrucât cost
scrierea peÕiecran
cu acordul
se facescris al autorului.
cu func Ûia printf()În acest
, scrierea
scop
într-unm|fiputeÛi
Õier secontact| la:funcÛia fpr intf() . Aceasta are prototipul int fprintf(FILE *flux,
va face cu
const cha r *for m at [, arg um en te]...); Õi va folosi, asemenea lui printf() , un Õir form at
ANTALformatarea
pentru datelor Õi o list| de argumente opÛionale. În plus, fpr intf() are ca
Tiberiu Alexandru
argument Õi poantorul la fiÕierul în care va realiza scrierea (pentru cazul de mai sus, pfis ).
tel.: 0040-264-530918
În 11 se realizeaz| operaÛia de închidere a fiÕierului prin funcÛia fclo se() , necesar|
liniaantaltiberiu@pcnet.ro
e-mail:
pentru ca sistemul de operare s| poat| actualiza informaÛiile legate de fiÕier în strucura
de director. Ea primeÕte ca parametru pe pfis Õi are ca efect deconectarea fluxului de
fiÕierul pe care l-am deschis pe disc.

12.3.3
Conf. dr. ing.Citirea s- i afis
ANTAL Tiberiu - area datelor dintr-un fis- ier
Alexandru
Universitatea
Programul Tenhic|
care urmeazdin Cluj-Napoca
| realizeaz | citirea Õi afiÕarea datelor stocate într-un fiÕier existent
pe disc. FuncÛia getc() este asemenea funcÛiei getch ar(), cu diferenÛa c| poate lucra cu un
Facultatea ConstrucÛii de MaÕini
Catedra la
poantor de un fiÕier, prototipul
Mecanic| ei fiind int getc(F ILE *flux );. FuncÛia pu tc() trimite un
Õi Programare
caracter C care este specificat prin unicul ei parametru. FuncÛiile getch ar() Õi
pe un flux
Curs de limbaj
pu tch ar() sunt definite în termenii lui getc() , pu tc() , stdin Õi stdout prin macrodefinit-iile
urma 7 toare:2001. Toate drepturile sunt rezervate autorului.
Copyright

#de fin e getcha


Multiplicarea r()
acestui getc(stdin)
document în scop comercial este interzis|.
#d efin e pu tcha r(c) pu tc((c), stdo ut)

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
În programul
document FG ET
pentru .C se
uzul foloseÕte un tablou nu m efis de 80 de caractere pentru stocarea
personal.
numelui de fiÕier împreun| cu calea c|tre acesta, dac| este cazul. ObservaÛi c| în funcÛia
sca nf() din linia 11 prin care se citeÕte numele fiÕierului l|Ûimea maxim| poate fi de 79 de
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
caractere pentru ca nu cumva s| se scrie peste ultimul caracter al Õirului, el fiind rezervat
pot multiplicaterminator
caracterului documentuldenumai
Õir. Observa Ûi deÕi asemenea
contra cost cu acordul cscris al autorului.
| numele În nu
tabloului acest
este
scop m| puteÛi contact| la:
precedat de operatorul adres| (& ), întrucât numele unui tablou în C este un poantor la
primul element din tablou.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
1 /* FGE TC.C */
e-mail: antaltiberiu@pcnet.ro
2 #include<stdio.h>
3
4 int main(void)
5 {
6 char nu m efis[80];
185
Capitolul
Conf. dr.12ing.
- Operat-ii de intrare/ies
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
7 FILE *pfluxin;
8
Facultatea ConstrucÛii de MaÕini
int car;
9
Catedra de Mecanic| Õi Programare
10 Curs deprin
limbaj
tf("NCum ele fisier ulu i de afis at: ");
11 sca nf("% 79s ", nu m efis);
12 Copyright 2001. Toate drepturile sunt rezervate autorului.
13 if ((pfluxin = fopen(numefis, "r")) == NULL)
14 Multiplicarea
{ acestui document în scop comercial este interzis|.
15 fprintf(std err,"F isier ul % s nu a pu tut fi d eschis pt. citire ", nu m efis);
16 SudenÛii participanÛi la orice
per ror("in form| de înv|Û|mânt superior bugetar pot multiplica acest
trucat");
17 document pentru uzul1;personal.
return
18 }
19 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
20 while ((car
pot multiplica = fgetc(pfluxin))
documentul numai contra cost Õi cu acordul scris al autorului. În acest
!= EOF)
21 pu tcha r(car);
scop m| puteÛi contact| la:
22
23 ANTAL fclos e(pfluAlexandru
Tiberiu xin );
24
tel.: 0040-264-530918
25
e-mail:return 0;
antaltiberiu@pcnet.ro
26 }

Rezultate:
Numele fisierului de afisat: salut.txt
Salutare! Numele unui fiÕier existent deja
Conf. dr. ing. ANTAL Tiberiu Alexandru pe disc
Universitatea
Ôi aici perro r()Tenhic|
se folosedin
Õte Cluj-Napoca
pentru a genera un mesaj care explic| natura erorii. ObservaÛi
Facultatea ConstrucÛii de MaÕini
c| în linia 17 se foloseÕte return 1; pentru ca programul s|-i întoarc| sistemului de operare
oCatedra
valoaredeprin care s| Õi
Mecanic| Programare
indice faptul c| a ap|rut o eroare, motiv pentru care nu Õi-a putut
Curs de limbaj
termina treaba C cu succes.

Copyright 2001. Toate drepturile sunt rezervate autorului.


O alt| modalitate de a scrie un program care realizeaz| aceeaÕi operaÛie cu cel de mai sus
se prezint| în continuare:
Multiplicarea acestui document în scop comercial este interzis|.

1 /* FGE TS.C
SudenÛii */
participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
2 #include<stdio.h>
document pentru uzul personal.
3
4 int main(void)
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
5 {
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
6
scop m|FILE *pfluxin;
puteÛi contact| la:
7 char bu ffer[80], num efis[80];
8
ANTAL Tiberiu Alexandru
9 prin tf("N um ele fisier ulu i de afis at: ");
10
tel.: 0040-264-530918
sca nf("% 79s ", nu m efis);
11
e-mail: antaltiberiu@pcnet.ro
12 if ((pfluxin = fopen(numefis,"r")) == NULL)
13 {
14 fprintf(std err,"F isier ul % s nu a pu tut fi d eschis pt. citire ", nu m efis);
15 per ror("in trucat");

186
Capitolul
Conf. dr.12ing.
- Operat-ii de intrare/ies
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
16 return 1;
17
Facultatea
}
ConstrucÛii de MaÕini
18
Catedra de Mecanic| Õi Programare
19 Curs dewhile
limbaj C
(fgets(buffer, sizeof(buffer), pfluxin) != NULL)
20 prin tf("%s ", bu ffer);
21 Copyright 2001. Toate drepturile sunt rezervate autorului.
22 fclos e(pflu xin );
23 Multiplicarea acestui document în scop comercial este interzis|.
24 return 0;
25 }SudenÛii participanÛi
la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
FuncÛia fge ts() este perechea lui gets() citind un Õir de pe un flux. Asemenea lui gets() , ea
SudenÛii
are nevoieparticipanÛi
de o zon| la
deorice
RAMform| de sînv|Û|mânt
în care | stocheze cu plat|
Õirul sau
citit. Înalte persoanededoritoare
programul mai sus o
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
variabil| cu numele buffer se foloseÕte în acest scop. fge ts() are nevoie de trei argumente:
scop
un m| puteÛi
poantor contact|
la zona la: în care se va stoca Õirul, lungimea zonei de RAM în care va
de RAM
fi stocat Õirul Õi un poantor la fiÕier. Dac| funcÛia gets() întoarce un poantor cu valoarea
Tiberiu| Alexandru
ANTALînseamn
NULL c| a ap|rut o eroare pentru c| liniile din fiÕier s-au terminat. Altfel
programul afiÕeaz|, folosind printf() , conÛinutul liniei citite.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

12.4 Fis- iere ASCII s- i fis- iere binare în


C
Conf.
Limbajul dr. ing. ANTAL
C trateaz TiberiuÛiaAlexandru
| informa din fiÕiere în dou| moduri distincte, în funcÛie de modul
Universitatea
în care fiÕierulTenhic| din Cluj-Napoca
este deschis. În mo d u l AS CII , dac| C g|seÕte în fiÕier un caracter
Facultatea
<Ctrl>+<Z> ConstrucÛii ), la citirea lui, acesta va fi interpretat ca terminator de fiÕier
(ASCIIde26MaÕini
ÕCatedra
i va presupune c| s-a Õi
de Mecanic| ajuns la sfârÕitul fiÕierului. C nu scrie automat la sfârÕitul fiÕierului
Programare
ASCII
Curs deacest
limbajcaracter,
C dar el poate fi scris explicit "cu mâna". De asemenea, caracterul de
trecere la linie nou| '\n' (newline ) este stocat sub forma a dou| caractere ASCII 13 10
(Copyright
carriage 2001. Õi linedrepturile
returnToate feed ), dar în RAM
sunt esteautorului.
rezervate stocat numai în formatul intern C, sub
forma terminatorului de linie, adic| ASCII 10 (line feed ). Atunci când Õirul "Salutare!\n"
a fost scris pe disc fiÕierul salut.txt avea 11 octeÛi lungime întrucât a fost scris sub forma
Multiplicarea acestui document în scop comercial este interzis|.
S a l u t a r e ! 13 10 Õi pentru c| modul implicit de scriere pe disc este cel ASCII. În
modul binar C nu interpreteaz| conÛinutul fiÕierului când scrie sau citeÕte datele în el.
SudenÛii
Acesta va participanÛi
fi modul de la orice
lucru form| de înv|Û|mânt
cu datele superior bugetar
când, de exemplu, scriem pot multiplicapentru
un program acest
copierea fiÕpentru
document ierelor.uzul | Õirul de mai sus va fi scris folosind modul binar, conÛinutul pe disc
Dacpersonal.
al fiÕierului va fi S a l u t a r e ! 10 , îns| la folosirea lui fop en () trebuie specificat Õi
caracterul "b". Daca
SudenÛii participanÛi 7 de
la exemplu
orice form| dorim s| scriem un
de înv|Û|mânt Õier binar
cufiplat| în locul
sau alte caracterului
persoane doritoare
"w "
folosim pe .
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
"wb"
scop m| puteÛi contact| la:
Când a fost inventat sistemul de operare MS-DOS, cineva a hot|rât ca
Probleme
ANTALcareTiberiu Alexandru
terminarea unui fiÕier s| fie marcat| de caracterul special
vintel.:
din0040-264-530918
MS-DOS
<Ctrl>+<Z> a c|rui valoare ASCII este 26. Citirea unui octet cu
valoarea 26 în modul ASCII devenea o problem| întrucât acesta putea
e-mail: antaltiberiu@pcnet.ro
marca terminarea fiÕierului. De exemplu fge tc() întoarce valoarea EOF Õi citirea nu se
poate continua. Acesta este motivul pentru care citirea fiÕierelor binare în modul ASCII
va conduce la citirea unui num|r mic de linii din cele totale pentru c| la întâlnirea
caracterului ASCII 26 citirea se opreÕte. Pentru c| MS-DOS a avut o oarecare influenÛ|
asupra sistemelor de operare Windows 95, 98, NT Õi OS/2 toate acestea au prezentat
187
Capitolul
Conf. dr.12ing.
- Operat-ii de intrare/ies
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
aceea Õi problem
Facultatea |. Azi, de
ConstrucÛii MaÕini <Ctrl>+<Z>, uneori scris Õi ^Z, nu mai este stocat
caracterul
la cap | tul fiÕierelor pentru
Catedra de Mecanic| Õi Programare a marca terminarea acestora, întrucât au fost foarte multe
probleme cu aplicaÛii care nu reuÕeau s| scrie acest marcaj de terminare pe disc. Aceste
Curs
fiÕieredeneterminate
limbaj C puteau creÕte peste anumite limite admise ocupând, în cel mai r|u caz,
tot spaÛiul discului. Dac| în cazul fiÕierelor binare acest caracter nu mai marcheaz|
Copyright
terminarea2001. Toateîntrebarea
fiÕierelor, drepturile care
sunt apare
rezervate
esteautorului.
cum se poate detecta terminarea unui
fiÕier binar. Sistemele de operare moderne pa7 streaza7 pe disc num|rul de octeÛi stocaÛi
într-un fiÕier, aceasta
Multiplicarea fiind informa
acestui document Ûia folosit
în scop | pentru
comercial interzis|. termin|rii fiÕierului.
estedetectarea

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Caracterul '\n' (newline ) era folosit în UNIX pentru comanda
Probleme
documentcare
pentru terminalelor
uzul personal.
(UNIX avea cod foarte "dur" scris pentru comanda acestor
vin din UNIX
terminale). Un terminal de tipul consol| sau imprimat| avea un cap care
SudenÛii participanÛi la orice
atunci când form| de la
ajungea înv|Û|mânt cu plat|
cap|tul unei sau altespersoane
linii trebuia | revin| ladoritoare
începutul
multiplica documentul numai contra cost Õi
liniei. Aceast| operaÛie se numea retur de car, motiv pentru care caracterul ce comanda
pot cu acordul scris al autorului. În acest
aceast
scop m| | acÛiunecontact|
puteÛi s-a numitla:carriage return . Apoi, hârtia trebuia s| avanseze cu o linie în
sus, aceast| operaÛie consta în avansul la o linie noua7 , caracterul care comanda aceast|
activitate
ANTAL Tiberiunumindu-se newline . În sistemul de operare UNIX aceste dou| operaÛii se
Alexandru
|ceau
ftel.: la scrierea
0040-264-530918 unui singur caracter Õi anume '\n', tocmai pentru c| aici codul
corespunz |tor comenzii acestor terminale era mare. MS-DOS este o "idee" de sistem de
e-mail: antaltiberiu@pcnet.ro
operare. Datorit| simplit|Ûii lui s-a decis c| newline nu trebuia s| fac| dou| operaÛii, astfel
ca7 aici sunt necesare caracterele '\r' (carriage return - ASCII 13 ) Õi '\n' (line feed -
ASCII 10 ) pentru a obÛine acelaÕi efect asupra capului de scriere ca Õi în UNIX cu '\n'.

12.4.1 -ionarea
Conf. dr. ing.Pozit
ANTAL în fis- ierele binare
Tiberiu Alexandru
Exist | dou| mecanisme
Universitatea Tenhic| dinpentru poziÛionare în fiÕiere. Metoda tradiÛional| este funcÛia
Cluj-Napoca
fse ek () ce are
Facultatea descrierea:
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs
fseek de-limbaj
muta C
7 poantorul de fis- ier într-o pozit-ie specificata7
Prototip: int fs eek ( FILE *flux , long offse t, int origin e );
Copyright 2001. Toate drepturile sunt rezervate autorului.
Fis- ier prototip: fseek - <stdio.h>
Valori întoarse:
Multiplicarea acestuiîn caz de succes,
document ek () întoarce
fsecomercial
în scop . Altfel, întoarce o valoare nenul|.
este0interzis|.
Pentru dispozitive incapabile sa7 efectueze c|utarea poziÛiei
specificate, valoarea întoars| este nedefinit|.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Parametri:
document pentru uzulflux - poantor la structura FILE ;
personal.
offset - num|r de octeÛi faÛ| de origine;
SudenÛii participanÛi origine poziÛia
la orice -form| deini Ûial|.
înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
Remarca 7 : fse ekdocumentul numaide
() mut| poantorul contra
fiÕiercost Õi cufluxului
asociat acordul la scris
o noual autorului.
| pozi În acest
Ûie specificat | prin
scop m|
offset octe Ûi faÛ|
puteÛi contact| la: origine. Urm|toarea operaÛie pe flux va avea loc din noua
de originea
poziÛie. Argumentul origine trebuie s| fie una din urm|toarele constante definite în
ST :
DIO.HTiberiu
ANTAL Alexandru
S E EK _ C UR - poziÛia curent| a poantorului de fiÕier;
tel.: 0040-264-530918
e-mail:Santaltiberiu@pcnet.ro
E EK _ EN D - sfârÕitul fiÕierului;
SEEK_SET - începutul fiÕierului.

Când un fiÕier este deschis pentru ad |ugare, poziÛia curent| este determinat| de ultima
188
Capitolul
Conf. dr.12ing.
- Operat
ANTAL-ii de intrare/ies
Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
opera Ûie deConstrucÛii
Facultatea I/E. Dac| nu s-au efectuat operaÛii de I/E asupra fiÕierului deschis pentru
de MaÕini
ad | ugare, pozi Ûia poantorului
Catedra de Mecanic| Õi Programare de fiÕier este la începutul fiÕierului.
Curs de limbaj C
Pentru fluxuri deschise în modul text, fseek () are o utilitate limitat| pentru c|
decodificarea
Copyright 2001. caracterelor
Toate drepturile
carriage sunt Õi linefeed
rezervate
return poate cauza ca fse ek () s| produc|
autorului.
rezultate neaÕteptate. Singurele poziÛion|ri care sunt garantate pentru fluxuri deschise
în mod text sunt:
Multiplicarea c|utarea
acestui cu offset
document 0 relativ
în scop la oriceeste
comercial valoarea de origine origine; c|utarea
interzis|.
de la începutul fiÕierului cu offset întors de funcÛia ftell().
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru
Problema uzul personal.
fundamental | a funcÛie fse ek () este parametrul offset care fiind de tipul long
poate lua valoarea maxim| de 2 31-1 , adic| permite poziÛionarea peste o porÛiune de 2.1Gb
unui fiÕparticipanÛi
aSudenÛii ier. Pentru rezolvarea acestei
la orice form| probleme standardul
de înv|Û|mânt cu plat| saudefine Õte alte dou
alte persoane | funcÛii
doritoare
cu
poturm |toareledocumentul
multiplica prototipuri:numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
inf fg etpo s(FIL E *flu x, fp os_ t *ptr);
ANTAL
int fs etpoTiberiu
s(FIL E Alexandru
*flu x, co nst fpos _t *p tr);
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Aici fpos_t este un tip dependent de implementare în stare s| stocheze o poziÛie dintr-un
fiÕier de m|rime arbitrar|. FuncÛia fge tpo s() înregistreaz| poziÛia curent| din flux în *ptr
pentru ca s| fie utilizat| în fse tpo s() . FuncÛia fse tpo s() realizeaz| poziÛionarea în flux la
poziÛia înregistrat| prin fge tpo s() în *ptr. Pentru exemplificarea lucrului cu aceste funcÛii
vor fi folosite înc| dou| funcÛii fread () Õi fw rite() care au prototipurile:

Conf.
size _tdr.
freing. ANTAL
ad (void *ptr,Tiberiu Alexandru
size_ t m arim e, size _t n rob , FILE, *flu x);
Universitatea
size _t fw rite(co Tenhic|
nst voiddin*ptr,
Cluj-Napoca
size_ t m arim e, size _t n rob , FILE, *flu x);
Facultatea ConstrucÛii de MaÕini
Catedra Õte de peÕiflProgramare
de Mecanic|
fread () cite u x în tabloul poantat de ptr cel mult nrob de obiecte de
Curs
dimensiunea m C
de limbaj a rim e . Întoarce num|rul obiectelor citite care poate fi mai mic decât
num|rul cerut de noi. Determinarea st|rii dup | citire se face cu una din funcÛiile feo f() sau
() . fw2001.
Copyright
ferror rite () scrie
Toatedin tabloul poantat
drepturile de ptr , nrob
sunt rezervate de obiecte cu dimensiunea m a rim e
autorului.
pe flux . Valoarea întoars| este num|rul obiectelor scrise care poate fi mai mic decât nrrob
în caz de eroare.
Multiplicarea acestui document în scop comercial este interzis|.

1 SudenÛii participanÛi
/* FSE TGE T.C */ la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
2 document pentru uzul personal.
#include<stdio.h>
3
4 int m ain participanÛi
SudenÛii () la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
5 {pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
6 scop m|int nrcit,nrscr;
puteÛi contact| la:
7 double d;
8 ANTAL char tc[50Alexandru
Tiberiu ];
9 fpos_t pozitie;
tel.: 0040-264-530918
10
e-mail:FILE * i, *e;
antaltiberiu@pcnet.ro
11
12 i=fop en ("fisie r.bin ", "rb" );
13 e=fo pen ("noufisier .bin ", "w b");
14
15 nrc it=fre ad (&d , sizeo f(d), 1, i);
189
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
16 prin tf("S-a citit %i obi ect.\n ",nrc it);
17
Facultatea ConstrucÛii de MaÕini
18
Catedra de Mecanic| Õi Programare
fgetpos (i, &p ozitie );
19 Curs denrclimbaj
it=freCad (tc, sizeof(ch ar), 20 , i);
20 prin tf("S-a u citit %i obie cte.\n ",nrc it);
21 Copyright 2001. Toate drepturile sunt rezervate autorului.
22 fsetp os(i, & poz itie);
23 Multiplicarea acestui
nrc it=fre ad (tc, document în scop
sizeof(ch ar), comercial este interzis|.
60, i);
24 prin tf("S-a u citit %i obie cte.\n ",nrc it);
25 SudenÛii
nrsparticipanÛi la sizeo
cr=fw rite(tc, oricefform| denrc
(cha r), înv|Û|mânt
it, e); superior bugetar pot multiplica acest
26 document
prinpentru
tf("S-auzul personal.
u scris %i ob iecte .\n",nrs cr);
27
28 nrs
SudenÛii cr=fw rite(&la
participanÛi d,orice
siz eof (d ), 1,dee);înv|Û|mânt cu plat| sau alte persoane doritoare
form|
29 printf("S
pot multiplica -a s cris % i numai
documentul ob iect.\n ",nrsc
contra r); Õi cu acordul scris al autorului. În acest
cost
30 scop m| puteÛi contact| la:
31 fsee k(i,0L ,SE EK _S ET );
32 ANTAL nrc it=fre ad
Tiberiu (&d , sizeo f(cha r), 8, i);
Alexandru
33 prin tf("S-a u citit %i obie cte.\n ",nrc it);
tel.: 0040-264-530918
34
e-mail:nrs cr=fw rite(& d, siz eof (d ), 1, e);
antaltiberiu@pcnet.ro
35 printf("S -a s cris % i ob iect.\n ",nrsc r);
36
37 fclos e(i);
38 fclos e(e);
39
40 retu rn (0 );
41 Conf.
} dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Pentru
Catedraade
rula acest program
Mecanic| aveÛi nevoie de un fiÕier text numit fisier.bin care s| conÛin|
Õi Programare
textul:
Curs de limbaj C

Copyright 2001. Toateeste


1.0123456789Acesta drepturile
un mic sunt rezervate
fisier autorului.
de 57 de caractere.

Multiplicarea acestui document în scop comercial este interzis|.


Rzultatele afiÕate pe ecran sunt:
S-a citit 1 obiect.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
S-au citit 20 obiecte.
document pentru uzul personal.
S-au citit 49 obiecte.
S-au scris 49 obiecte.
SudenÛii participanÛi la orice
form| de înv|Û|mânt cu plat| sau alte persoane doritoare
S-a scris 1 obiect.
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
S-au citit 8 obiecte.
scop m| puteÛi contact| la:
S-a scris 1 obiect.

ANTAL Tiberiu Alexandru


iar
tel.:pe disc va fi creat un fiÕier cu numele nou fisier.bin având urm|torul conÛinut:
0040-264-530918
e-mail: antaltiberiu@pcnet.ro
6789Acesta este un mic fisier de 57 de caractere.1.0123451.012345

Programul este numai un exemplu de utilizare a acestor funcÛii Õi nu este unul coerent. În
190
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
liniile 12-13 sunt deschise cele dou| fluxuri în modul binar. Primul fread () citeÕte sizeof(d)
Facultatea ConstrucÛii de MaÕini
= 8 octeÛi de pe fluxul de intrare i în variabila d . PoziÛia curent| din flux va fi salvat|
Catedra de Mecanic| Õi Programare
folosind funcÛia fge tpo s() în pozitie . Apoi se încearc| citirea în tabloul tc a 20 x 1 octeÛi,
Curs
apoi sede revine
limbaj la
C aceast| poziÛie Õi se încearc| citirea a 60 de octeÛi. Din rezultate se
observ| c| numai 49 de obiecte (octeÛi) au putut fi citite. În final se va folosi funcÛia fse ek ()
Copyright 2001. Toaterevenirea
pentru a exemplifica drepturile
la sunt rezervate
începutul autorului.
fluxului i.

Multiplicarea acestui document în scop comercial este interzis|.

12.5 Lucrul
SudenÛii participanÛi la orice cu înregistra
form| de 7 ribugetar pot multiplica acest
înv|Û|mânt superior
document
NoÛiunea de pentru uzul personal.
înregistrare (record ) este familiar| celor care au lucrat în Pascal sau au
folosit sisteme pentru gestionarea bazelor de date. S| presupumem c| avem de scris un
program care s| stocheze
SudenÛii participanÛi la orice form|
numele studen Ûilor, anul din
de înv|Û|mânt cu care
plat|fac alte Õpersoane
sauparte general|.
doritoare
i media lor
potînregistrare
O cu acest tip numai
multiplica documentul de datecontra
va fi de Õi cu acordul scris al autorului. În acest
forma:
cost
scop m| puteÛi contact| la:
N u m e: Vasile Cosmin
An : 1234/1
ANTAL Tiberiu Alexandru
Medie generala7 : 9.78
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
ObservaÛi c| exist| atât date ASCII cât Õi date numerice în virgul| flotant|. În limbajul
C o astfel de grupare de date poate fi pus| la un loc folosind o structur| de forma:

struct student
{
char
Conf. dr. ing.nu m e[40]; Tiberiu Alexandru
ANTAL
char gru pa [10]; din Cluj-Napoca
Universitatea Tenhic|
float medie;
Facultatea ConstrucÛii de MaÕini
}Catedra de Mecanic| Õi Programare

Curs de limbaj C
Vom scrie în continuare un program SC RIE.C care s| stocheze mai mulÛi studenÛi pe disc,
într-un fiÕier
Copyright numit
2001. Toatestud.dat .
drepturile sunt rezervate autorului.

1 Multiplicarea
/* SCR IE.C */acestui document în scop comercial este interzis|.
2 #include<stdio.h>
3 SudenÛii participanÛi la orice form|
#include<conio.h> de înv|Û|mânt superior bugetar pot multiplica acest
4 #define
documentNRM AXuzul
pentru 100 personal.
5
6 struct student
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
7 {pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
8 scop m|char nucontact|
puteÛi m e[40]; la:
9 grup a[10 ];
10 float medie;
ANTAL Tiberiu Alexandru
11 };
tel.: 0040-264-530918
12
e-mail: antaltiberiu@pcnet.ro
13 int m ain ()
14 {
15 FILE *pies;
16 int c, nrstud;
17 stru ct stud en t tstu de nti[NRM AX ];
191
Capitolul
Conf. dr.12ing.
- Operat-ii de intrare/ies
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
18 float x;
19
Facultatea ConstrucÛii de MaÕini
20
Catedra de Mecanic| Õi Programare
c=0;
21 Curs deprin
limbaj C odu n r. de stude nti ca re vor
tf("Intr fi stoca ti: ");
22 sca nf("% i", &n rstu d);
23 Copyright 2001.
fflush(s Toate
tdin ); drepturile sunt rezervate autorului.
24
25 Multiplicarea
do { acestui document în scop comercial este interzis|.
26 prin tf("N um e stu de nt: ");
27 SudenÛii participanÛi la orice
gets (tstud form|
en ti[c].nu de înv|Û|mânt superior bugetar pot multiplica acest
m e);
28 document pentru uzultdin
fflush(s personal.
);
29
30 prin tf("Gr
SudenÛii participanÛi up a: form|
la orice "); de înv|Û|mânt cu plat| sau alte persoane doritoare
31 pot multiplicasca nf("% 9s", &
documentul tstu de
numai nti[c].gr
contra up Õi
cost a);cu acordul scris al autorului. În acest
32 scop m| puteÛi contact| la:
33 prin tf("M ed ia g en era la: ");
34 ANTAL Tiberiu scaAlexandru
nf("% f",& tstu de nti[c].m ed ie);
35
tel.: 0040-264-530918
36 fflush(s tdin );
e-mail: antaltiberiu@pcnet.ro
37 ++c;
38 } w hile (c < nrs tud );
39
40 if ((pies = fopen("stud.dat", "w")) == NULL)
41 {
42 fprintf(std err,"F isier ul stu d.dat n u a pu tut fi d eschis pt. scriere ");
43 Conf. dr. ing. ANTAL Tiberiu
per ror("in Alexandru
trucat");
44 Universitatea Tenhic|
return 1;din Cluj-Napoca
45 Facultatea
} ConstrucÛii de MaÕini
46 Catedra de Mecanic| Õi Programare
47 Curs defwlimbaj C de nti, siz eof(s truct stu de nt),
rite(tstu nr stu d, pies);
48 fclos e(pie s);
49 Copyright 2001. Toate drepturile sunt rezervate autorului.
50 return 0;
51 }Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii
Pentru a participanÛi la orice care
realiza un program form|s| de înv|Û|mânt
poat superior
| citi datele scrise înbugetar
fiÕierulpot multiplica acest
stud.dat tot ceea ce
document
trebuie s| pentru uzulsa
facem este personal.
7 folosim fread () în loc de fw rite () Õi s| deschidem fiÕierul pentru
citire în loc de scriere.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
1 /* CITE STE .C */
2
scop m| puteÛi contact| la:
#include<stdio.h>
3 #include<conio.h>
4 ANTAL
#define Tiberiu
NRM AX Alexandru
100
5 tel.: 0040-264-530918
6 e-mail: antaltiberiu@pcnet.ro
struct student
7 {
8 char nu m e[40], gru pa [10];
9 float medie;
10 };

192
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
11 int m ain ()
12
Facultatea
{
ConstrucÛii de MaÕini
13
Catedra de Mecanic| Õi Programare
FILE *pin;
14 Curs deint limbaj C
c, nrstud;
15 stru ct stud en t tstu de nti[NRM AX ];
16 Copyright 2001. Toate drepturile sunt rezervate autorului.
17 prin tf("Intr odu n r. de stude nti ca re vor fi ci titi: ");
18 Multiplicarea acestui
sca nf("% document
i", &n rstu d); în scop comercial este interzis|.
19 fflush(s tdin );
20 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
21 document pentru
if ((pin uzul personal. "r")) == NULL)
= fopen("stud.dat",
22 {
23 fprintf(std
SudenÛii participanÛi err,"F
la orice isier ul
form| destu d.dat n u cu
înv|Û|mânt a pu tut sau
plat| fi dalte
eschis pt. scriere
persoane ");
doritoare
24 pot multiplicaper numai contra cost Õi cu acordul scris al autorului. În acest
ror("in trucat");
documentul
25 return 1;
scop m| puteÛi contact| la:
26 }
27 ANTAL Tiberiu Alexandru
28 frea d(tstu de nti, siz eof(s truct stu de nt), nr stu d, pin);
tel.: 0040-264-530918
29
e-mail:fclos e(pin );
antaltiberiu@pcnet.ro
30
31 c=0;
32 do {
33 prin tf("N um e stu de nt: ");
34 pu ts(tstu de nti[c].n um e);
35 prin tf("Gr up a: %9s\ n", tstu den ti[c].gru pa );
36 Conf. dr. ing. ANTAL
prin tf("MTiberiu Alexandru
ed ia g en era la: %f \n",tstu de nti[c].m ed ie);
37 Universitatea Tenhic| din Cluj-Napoca
prin tf("----------------------------------------------\ n");
38 Facultatea ConstrucÛii
++c; de MaÕini
39 Catedra w hile (cÕi< Programare
} de Mecanic| nrs tud );
40 Curs de limbaj C
41 return 0;
42 }Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


O alt| variant| a acestui program îns| care foloseÕte spaÛiu pentru stocarea în RAM
numai pentru o singur| înregistrare Õi nu pentru un tablou de înregistr|ri, este:
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
1 /* CITE STE 1.C */
2 #include<stdio.h>
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
3 #include<conio.h>
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
4
scop m| puteÛi contact| la:
5 struct student
6 {
7
ANTAL Tiberiu Alexandru
char nu m e[40], gru pa [10];
8 tel.: 0040-264-530918
float medie;
9 e-mail:
}; antaltiberiu@pcnet.ro
10
11 int m ain ()
12 {
13 FILE *pin;

193
Capitolul
Conf. dr.12ing.
- Operat-ii de intrare/ies
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
14 int c, nrstud;
15
Facultatea ConstrucÛii de MaÕini
stru ct stu de nt u nstud en t;
16
Catedra de Mecanic| Õi Programare
17 Curs deprin
limbaj C odu n r. de stude nti ca re vor
tf("Intr fi ci titi: ");
18 sca nf("% i", &n rstu d);
19 Copyright 2001. Toate drepturile sunt rezervate autorului.
20 if ((pin = fopen("stud.dat", "r")) == NULL)
21 Multiplicarea
{ acestui document în scop comercial este interzis|.
22 fprintf(std err,"F isier ul stu d.dat n u a pu tut fi d eschis pt.\ scriere ");
23 SudenÛii participanÛi la orice
per ror("in form| de înv|Û|mânt superior bugetar pot multiplica acest
trucat");
24 document pentru uzul1;personal.
return
25 }
26 SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
27 c=0;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
28 do {
scop m| puteÛi contact| la:
29 fsee k(pin, (lon g) c*s izeo f(stru ct stu de nt), 0);
30 ANTAL Tiberiu frea d(& un stu de nt, siz eof(s truc t
Alexandru stud en t), 1, pin);
31 prin tf("N um e stu de nt: ");
tel.: 0040-264-530918
32 pu ts(un stu de nt.n um e);
e-mail: antaltiberiu@pcnet.ro
33 prin tf("Gr up a: %9s\ n", u nstud en t.gru pa );
34 prin tf("M ed ia g en era la: %f \n",un stu de nt.m ed ie);
35 prin tf("----------------------------------------------\ n");
36 ++c;
37 } w hile (c < nrs tud );
38
39 Conf. dr. ing.
fclos ANTAL
e(pin ); Tiberiu Alexandru
40 Universitatea Tenhic| din Cluj-Napoca
41 Facultatea
returnConstrucÛii
0; de MaÕini
42 }Catedra de Mecanic| Õi Programare
Curs de limbaj C
Programul Õte fsedrepturile
foloseToate
Copyright 2001. ek () pentru poziÛionare în cadrul fiÕierului. În linia 29 poziÛia noii
sunt rezervate autorului.
înregistr|ri se g|seÕte prin deplasarea peste c*sizeof(struct stude nt) octeÛi în fiÕier, în
raport cu începutul fiÕierului.
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
12.6 Citirea parametrilor din linia de
document pentru uzul personal.

comanda
SudenÛii participanÛi7la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Cei
scopcare aÛi lucrat
m| puteÛi la: de operare DOS cunoaÕteÛi comanda copy sursa7 destinat-ie
în sistemul
contact|
care permite copierea unui fiÕier de la o surs|, la o destinaÛie. Programul care urmeaz|
implementeaz
ANTAL Tiberiu | o Alexandru
variant| rudimentar| a acestei comenzi. Utilizatorul trebuie s| specifice
dou| nume de fiÕiere, unul surs| - pe cine copiem - Õi unul destinaÛie - unde Õi sub ce nume
tel.: 0040-264-530918
copiem. Modul de lucru cu fiÕierele este cel binar, iar dup| ce operaÛia de copiere s-a
e-mail:
derulat,antaltiberiu@pcnet.ro
funcÛia fclo se() este folosit| pentru a închide fiÕierele de surs| Õi destinaÛie. În
limbajul de programare C folosirea lui fclo se() nu este obligatorie întrucât la terminarea
programului, care are loc la întâlnirea lui return() din funcÛia m ain (), fiÕierele deschise vor
fi automat închise. TotuÕi, închiderea unui fiÕier de care nu mai este nevoie trebuie s|
devin| obiÕnuinÛ| pentru programator deoarece num|rul maxim de fiÕiere care pot fi
194
Capitolul
Conf. dr.12ing.
- Operat-ii de intrare/ies
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
deschise
Facultateasimultan MaÕinide obicei de c|tre sistemul de operare. Dac| un fiÕier
estedelimitat
ConstrucÛii
deschis va fi închis când
Catedra de Mecanic| Õi Programarenu mai este nevoie de el, atunci un alt fiÕier va putea fi deschis
f|r| a se dep|s- i limita maxim| admis| de sistemul de operare. Pericolul de mai sus apare
Curs de |limbaj
când uit C
m s| închidem fiÕiere într-o funcÛie care este apelat| în mod repetat, în final
mesajul de eroare primit la folosirea lui fop en () fiind "too many open files".
Copyright 2001. Toate drepturile sunt rezervate autorului.
/* CO PIE1.C */
Multiplicarea acestui document în scop comercial este interzis|.
#include<stdio.h>
#define BUFF ER 32*1024
SudenÛii participanÛi la orice
form| de înv|Û|mânt superior bugetar pot multiplica acest
char bu ffer[B UFF ER ];
document pentru uzul personal.
int main(void)
SudenÛii
{ participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
char sudocumentul numai
rsa [80 ], destin contra
atie[8 0]; cost Õi cu acordul scris al autorului. În acest
scop m|FILE
puteÛi contact|
*flux_s, la:
*flux_d;
size _t n rcit;
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
prin tf("N um ele fis ieru lui sursa: ");
e-mail:gets
antaltiberiu@pcnet.ro
(sur sa);
if ((flux_s = fopen(sursa,"rb")) == NULL)
{
fprintf(stderr,"Fisierul %s nu a putu t fi desch is pentru citire\n", sursa );
per ror("in trucat");
return 1;
} ing. ANTAL Tiberiu Alexandru
Conf. dr.
Universitatea Tenhic| din Cluj-Napoca
prin tf("N um ele fis ieru lui d estin atie: ");
Facultatea ConstrucÛii de MaÕini
gets (des tina tie);
Catedra de Mecanic| Õi Programare
if ((flux_d = fopen(destinatie,"w+b")) == NULL)
Curs de limbaj C
{
fprin tf(stderr,"Fisierul %s nu a putut fi desc his pentr u s criere \n ",\
Copyright
de stin atie );2001. Toate drepturile sunt rezervate autorului.
per ror("in trucat");
Multiplicarea return
acestui 1;document în scop comercial este interzis|.
}
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
w hile
document (!feof(flu
pentru uzul x_ s))
personal.
{
SudenÛii participanÛi nrc it=freform|
la orice ad (bude
ffer, s izeo f(bu ffer[0
înv|Û|mânt ]), BU
cu plat| sauFFalte
ER persoane
, flux _s); doritoare
if (ferror(flu
pot multiplica documentul numai x_ s)) cost Õi cu acordul scris al autorului. În acest
contra
{
scop m| puteÛi contact| la:
per ror("\ tEroar e la citire" );
break;
ANTAL Tiberiu Alexandru
}
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
fw rite(b uffer, siz eof(b uffe r[0]), nrc it, flux _d );
if (ferror(flu x_ d))
{
per ror("\ tEroar e la s criere" );
break;
195
Capitolul
Conf. dr.12ing.
- Operat-ii de intrare/ies
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
}
Facultatea
}
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs defclos
limbaj
e(fluCx_ s);
fclos e(flu x_ d);
Copyright 2001. Toate drepturile sunt rezervate autorului.
return 0;
}Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Când programul de mai sus este lansat în execuÛie, conversaÛia cu utilizatorul se va derula
document pentru uzul personal.
sub forma:
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Numele fisierului sursa: a.exe
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Numele fisierului destinatie: b.exe
scop m| puteÛi contact| la:
Cei care aÛi folosit comanda DOS copy ÕtiÛi c| operaÛia de mai sus se realizeaz| prin
ANTAL Tiberiu Alexandru
scrierea copy a.exe b.exe la prompterul sistemului de operare. FiÕierul a.exe din
tel.: 0040-264-530918
directorul curent va fi copiat sub numele de b.exe în acelaÕi director. Limbajul C permite
e-mail:
accesul antaltiberiu@pcnet.ro
la linia comand| într-o modalitate portabil|, astfel ca7 programul de mai sus poate
fi rescris pentru a citi parametrii introduÕi dup| numele programului executabil, la fel ca
în cazul comenzii copy. Pân| acum antetul folosit pentru funcÛia m ain () a fost int
m ain (void ). Pentru a se putea citi parametrii liniei comand| trebuie folosit urm|torul
prototip:

Conf. dr. ing. ANTAL Tiberiu Alexandru


int m ain (int a rgc , cha r * ar gv[ ]);
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Întrucât
Catedra devariabilele
Mecanic|argc Õi argv sunt numai parametri numele lor poate fi schimbat de
Õi Programare
noi când scriem
Curs de limbaj C corpul func Ûiei m ain (), de exemplu sub forma:

int m ain (int


Copyright nr_a
2001. rg, char
Toate * linie_
drepturile arg[rezervate
sunt ]) autorului.
{
. . .
Multiplicarea acestui document în scop comercial este interzis|.
}

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
cu condiÛiapentru
document ca ordinea Õi tipul lor s| nu fie modificate. argc este un întreg care conÛine
uzul personal.
num|rul de cuvinte introduse de utilizator, iar argv este un tablou de poantori la Õiruri de
caractere care stocheaz| cuvintele efectiv introduse de utilizator (mai precis o copie exact|
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
a acestora).
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
/* CO PIE2 .C */
#include<stdio.h>
ANTAL Tiberiu Alexandru
#include<string.h>
tel.: 0040-264-530918
#define BUFF ER 32*1024
e-mail: antaltiberiu@pcnet.ro
char bu ffer[B UFF ER ];

int m ain (int argc, char *ar gv [ ])


{
char su rsa [80 ], destin atie[8 0];
196
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
FILE *flux_s, *flux_d;
Facultatea ConstrucÛii de MaÕini
size _t n rcit;
Catedra de
int i;
Mecanic| Õi Programare
Curs de limbaj C
if (argc != 3)
Copyright
{ 2001. Toate drepturile sunt rezervate autorului.
fprintf(stderr,"Programul %s necesita 2 param etri\nfisierul sursa si pe\
cel d estin atie \n
Multiplicarea ", argdocument
acestui v[0]); în scop comercial este interzis|.
for(i=0; argv[i] != NU LL; i++)

SudenÛii participanÛi fprintf(std err, de


la orice form| "a rgv [%i] = %s \n
înv|Û|mânt ", i, argbugetar
superior v[i]); pot multiplica acest
return 1;
document pentru uzul personal.
}

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
strcp y(su rsa , arg v[1]);
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
strcp y(destin atie , arg v[2]);
scop m| puteÛi contact| la:
if ((flux_s = fopen(sursa,"rb")) == NULL)
ANTAL { Tiberiu Alexandru
tel.: 0040-264-530918
fprintf(stderr,"Fisierul %s nu a putu t fi des chis pe ntru citire\n ", sursa );
e-mail: antaltiberiu@pcnet.ro
per ror("in trucat");
return 1;
}

if ((flux_d = fopen(destinatie,"w+b")) == NULL)


{
Conf. dr. ing. ANTAL Tiberiu Alexandru
fprintf(stderr,"Fisierul %s nu a p u tut fi desc his pentr u s riere\ n",\
de stin atie );
Universitatea Tenhic| din Cluj-Napoca
per ror("in trucat");
Facultatea ConstrucÛii de MaÕini
return 1;
Catedra}
de Mecanic| Õi Programare
Curs de limbaj C
w hile (!feof(flu x_ s))
Copyright
{ 2001. Toate drepturile sunt rezervate autorului.
nrc it=fre ad (bu ffer, s izeo f(bu ffer[0 ]), BU FF ER , flux _s);
Multiplicarea acestuiifdocument înx_
(ferror(flu scop
s)) comercial este interzis|.
{
SudenÛii participanÛi la oriceper
form| detEroar
ror("\ înv|Û|mânt superior
e la citire" ); bugetar pot multiplica acest
document pentru uzul personal.break;
}
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
fw rite(b
pot multiplica documentul uffer,
numai siz eof(b
contra cost Õi cu
uffe r[0]), nrc it, scris
acordul flux _d
al );autorului. În acest
if (ferror(flu
scop m| puteÛi contact| la: x_ d))
{
ANTAL Tiberiu Alexandru per ror("\ tEroar e la s criere" );
tel.: 0040-264-530918 break;
}
e-mail: antaltiberiu@pcnet.ro
}

fclos e(flu x_ s);


fclos e(flu x_ d);

197
Capitolul
Conf. dr.12ing. -ii de intrare/ies
- Operat
ANTAL Tiberiu-ire în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
prin tf("Co pierea a fo st realiza ta cu succes.\n ");
Facultatea ConstrucÛii de MaÕini
return 0;
Catedra
}
de Mecanic| Õi Programare
Curs de limbaj C

Dac | programul
Copyright este lansat
2001. Toate în execu
drepturile Ûierezervate
sunt de comand| copie2 a.exe b.exe, spaÛiul
prin liniaautorului.
de date pentru argc Õi argv se reprezint| în Figura 22.
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Figura 22
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

198
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


13 Alocarea dinamica7 a
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
memoriei
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest

U
scop m| puteÛi contact| la:

ANTAL Tiberiu
n program aflat în execuÛie divizeaz| porÛiunea de memorie în care a fost înc|rcat
conformAlexandru
Figura 23. Dimensiunea
tel.: 0040-264-530918
segmentelor
desenului din

de cod Õi de da te sunt
e-mail:
fixate pe antaltiberiu@pcnet.ro
toata7 durata execuÛiei
p r o g r a m u lu i . D i m e n s i u n e a
segmentului de stiva7 creÕte când se
apeleaz | funcÛii, se transfer|
parametri Õi se creeaz| variabile
locale, respectiv scade când se revine
din
Conf. func Ûii, ANTAL
dr. ing. iar spa Ûiul pentru
Tiberiu Alexandru
variabilele locale Õ i parametri
Universitatea Tenhic| din Cluj-Napoca este
dezalocat. Segmentul de heap, sau
Facultatea ConstrucÛii de MaÕini
heap-ul, este plasat în "opoziÛie" cu
Catedra
cel de stiv în sensul Õi
de| Mecanic| c|Programare
atunci când
Curs de limbaj C
spaÛiul alocat stivei creÕte, cel
disponibil pentru heap scade Õi
invers.
Copyright Linia dintre
2001. heap
Toate Õi stiv| este
drepturile sunt rezervate autorului.
punctat| pentru a simboliza c| cele Figura 23
dou | zone nu sunt
Multiplicarea delimitate
acestui document static.
în scop comercial este interzis|.
Heap-ul pune la dispoziÛia programatorului un spaÛiu de RAM pe care acesta îl poate aloca
dinamic. Problema este
SudenÛii participanÛi m|rimea
la orice form|acestui spaÛiu. Însuperior
de înv|Û|mânt cazul sistemelor
bugetar potde multiplica
operare simple,
acest
cum este MS-DOS, programul executabil conÛine stocat în el un num|r care defines- te
document pentru uzul personal.
cantitatea total| de memorie necesara7 pentru ca programul sa7 fie executat. Num|rul
acesta este spaÛiul de RAM maxim care se aloc| programului de ca7 tre sistemul de
SudenÛii
operare. participanÛi
Dup| înc|rcarea la orice form| de înv|Û|mânt
segmentelor de cod Õi de cu plat|
date, saucealte
ceea persoane
r|mâne doritoare
se împarte între
pot |multiplica
stiv Õi heap. Dac documentul
| segmentul numai contra
de stiv | crecost Õi cumult
Õte prea acordul
Õi d|scris
pestealcel
autorului. În acest
de heap programul
"crapa
scop m|7 ". puteÛi contact| la:

ANTAL Tiberiu Alexandru


În cazul sistemelor de operare moderne programul este înc|rcat undeva
tel.: 0040-264-530918
Alocarea
în RAM Õi l|sat s| se execute. Dac| spaÛiul în care s-a înc|rcat devine
memoriei în cazul
e-mail: antaltiberiu@pcnet.ro
prea mic, de exemplu pentru c| stiva Õi heap-ul cresc prea mult,
sistemelor de
operare moderne
sistemul de operare g|seÕte o alt| zon| de RAM mai mare în care va
copia segmentele de cod Õi de date. În noua zon|, stiva Õi heap-ul vor fi
plasate cât mai departe, apoi din nou programul este l|sat s| se execute.
Dac| stiva Õi heap-ul cresc prea mult se încearc| din nou g|sirea unei zone Õi mai mari de
199
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
RAM, iar num
Facultatea |rul de de
ConstrucÛii repet |ri ale procedurii este practic influenÛat numai de limitele
MaÕini
memoriei fizice a calculatorului.
Catedra de Mecanic| Õi Programare Dac| sistemul de operare Õtie sa7 lucreze cu memorie
virtual|, limitele memoriei fizice sunt dep|Õite în c|utarea spaÛiului necesar execut|rii
Curs de limbaj
programului. ÎnCcazul sistemelor de operare "pe 32 de biÛi" cum sunt UNIX, Windows NT
Õi 95/98, limita este dat| de 232 octeÛi, ceea ce corespunde la aproximativ 2 GB de RAM.
Copyright
În realitate,2001. Toate
pentru drepturile sunt
c| majoritatea rezervate
sistemelor de autorului.
operare trebuie s| r|mân| rezidente în
RAM, cantitatea de memorie disponibil| este ceva mai mic|. În cazul sistemelor de
operare
Multiplicarea de biÛi",document
"pe 64acestui de exemplu Winows
în scop NT pe este
comercial interzis|.DEC Alpha, limita creÕte
un procesor
la 264 biÛi care ar fi un num|r de ordinul TB (Tera octeÛi). Ultima limit| a spaÛiului folosit
pentru
SudenÛiistocarea programelor
participanÛi la orice form| de Ûînv|Û|mânt
în execu ie este hardsuperior
disc-ul. Memoria virtual
bugetar pot | folosit
multiplica | de
acest
un sistem de operare trebuie
document pentru uzul personal. salvat | undeva dar întrucât majoritatea calculatoarelor nu
dispun de foarte mult| memorie RAM, urm|torul dispozitiv de stocare a datelor care nu
mai încap în RAM este hard disc-ul.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
13.1 Funct-ii pentru alocarea
ANTAL Tiberiu Alexandru
dinamica 7 a memoriei
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

malloc - aloca 7 un bloc de memorie pe heap


Prototip: void *m alloc (size_t d im en siu ne );
Fis- ier prototip: m allo c() - <stdlib.h> Õi <malloc.h>
Valoridr.
Conf. întoarse: allo c() întoarce
ing. ANTALmTiberiu un poantor de tipul void la spaÛiul alocat sau NULL
Alexandru
dac | spa Û
Universitatea Tenhic| din Cluj-Napocaexistent pe heap este insuficient pentru a realiza
iul liber
Facultatea ConstrucÛii alocarea.
de MaÕini Dac| se întoarce un poantor de tipul diferit de void ,
Catedra de Mecanic|trebuie folosit operatorul de conversie forÛat| a tipului pentru
Õi Programare
valoarea întoars|. Dac| dimensiune este zero, m allo c() aloc| spaÛiu
Curs de limbaj C
pentru un obiect de lungime 0 octeÛi Õi întoarce un poantor valid la
acesta.
Copyright 2001. Toate drepturile sunt rezervate autorului.
Parametri: dimensiune - num|rul de octeÛi alocaÛi pe heap.
Remarca7 : Spaacestui
Multiplicarea Ûiul alocat de m allo
document în c() pecomercial
scop heap areeste
cel pu Ûin ma7 rimea lui dimensiune în
interzis|.
octeÛi. Blocul poate fi mai mare din cauza stoc|rii Õi a unor informaÛii legate de gestionarea
heap-ului Õi a opera
SudenÛii participanÛi laÛiei deform|
orice aliniere. Codul care
de înv|Û|mânt lanseaz
superior | în execu
bugetar Ûie programul
pot multiplica acest
utilizatorului folose Õte m allo c() pentru alocarea spaÛiului pentru variabilele environ , envp
document pentru uzul personal.
Õi argv .
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
calloc - aloca
pot multiplica 7 un tablou
documentul pe contra
numai heap cost
cu elementele init-ializate
Õi cu acordul scris cu În
al autorului. 0 acest
scop m|
Prototip: puteÛi contact| la:
void *calloc(size_t numa 7 r, size _t d im en siu ne );
Fis- ier prototip: calloc() - <stdlib.h> Õi <malloc.h>
ANTAL Tiberiu Alexandru
Valori întoarse:
tel.: 0040-264-530918 calloc() întoarce un poantor la un spaÛiu suficient de mare pentru
stocarea unui num|r de obiecte de dimensiunea specificat| prin
e-mail: antaltiberiu@pcnet.ro
dimensiune pe heap. Fiecare obiect este ini Ûializat cu valoarea zero.
Parametri: numa 7 r - num|rul de obiecte;
dimensiune - ma 7 rimea, în octet-i, a unui obiect alocat pe heap.

200
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
realloc
Facultatea- ConstrucÛii
realoca 7 blocurile
de MaÕini de memorie
Prototip:
Catedra de Mecanic|void Õi Programare
*re alloc (void *ptrb loc, siz e_ t dim en siu ne );
Curs
Fis-ierdeprototip:
limbaj C calloc() - <stdlib.h> Õi <malloc.h>
Valori întoarse: rea lloc () întoarce un poantor void la blocul de memorie realocat.
Copyright 2001. Toate drepturile
Valoarea sunt|rezervate
întoars este NULL autorului.
dac| dimensiune este zero Õi ptrbloc
nu este NULL sau dac| nu este suficient| memorie disponibil|
Multiplicarea acestuipentru document în scopspa
a expanda Ûiul blocului
comercial este interzis|.
la cel specificat în dimensiune . În
primul caz spaÛiul originar alocat blocului este eliberat, iar în cel de
SudenÛii participanÛi al la doilea bloculde
orice form| originar r|mâne
înv|Û|mânt nemodificat.
superior bugetar pot multiplica acest
document pentru uzulptrbloc
Parametri: personal. - poantor la spaÛiul originar alocat blocului de memorie;
dimensiune - noua dimensiune a blocului de memorie în octeÛi.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
free
scop m|- dezaloca 7 (elibereaza
puteÛi contact| la: 7 ) spat-iul alocat unui bloc de memorie
Prototip: void fre e(vo id *p trblo c);
ANTAL Tiberiu Alexandru
Fisier prototip: free() - <stdlib.h> Õi <malloc.h>
tel.: 0040-264-530918
Valori
e-mail: întoarse: nu are
antaltiberiu@pcnet.ro
Parametri: ptrbloc - poantor la un bloc de memorie alocat deja cu m allo c() ,
calloc() sau rea lloc() care va fi eliberat (dezalocat).
Remarca7 : dup| dezalocarea unui bloc de memorie spaÛiul disponibil pe heap creÕte.

13.2 Alocarea dinamica7 a memoriei


Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
pentru vectori
Catedra de Mecanic| Õi Programare
Curs de limbaj C
În limbajul C tablourile sunt implementate într-o form| destul de primitiv|. Nu exist| un
mecanism al limbajului pentru modificarea num|rului de elemente sau de dimensiuni ale
Copyright
unui tablou2001.
dupToate drepturile
| declararea sunt rezervate
acestuia autorului.de limbajul BASIC care are
(spre deosebire
instrucÛiunea Re Dim numai pentru acest scop). Este îns| posibil ca un spaÛiu continuu de
Multiplicarea
adrese fizice sacestui document
| fie alocat în scoppecomercial
unui tablou heap. Condi esteÛia
interzis|.
de continuitate a tabloului este
garantat| îns|Õi prin modul de lucru al funcÛiilor de manipulare a heap-ului. În acest scop
programul trebuie s| la
SudenÛii participanÛi declare un poantor
orice form| la adresa de
de înv|Û|mânt începutbugetar
superior a blocului demultiplica
pot memorie alocat
acest
pe heap. De
document exemplu,
pentru în locul unui tablou declarat prin floa t a[10 0]; putem declara un
uzul personal.
poantor la tipul float (floa t *pa ;), apoi folosind funcÛia m allo c() aloc|m spaÛiul dinamic pe
heap tabloului
SudenÛii cu expresia
participanÛi pa form|
la orice = m alloc
de(100* sizeo f(float));
înv|Û|mânt . Spa
cu plat| sauÛiulalte
de persoane
memorie doritoare
în acest caz
va alocat pe heap Õi nu pe segmentul de date ca Õ
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. alÎntabloului
fi i în primul caz. Un element acest
pa va putea fi referit prin expresia pa[i] . Dac| se aloc| mai multe tablouri pe heap este
scop m| puteÛi contact| la:
nevoie pentru fiecare tablou de câte un poantor de tipul elementelor de tablou. Este
posibil| Õi folosirea lui m allo c() pentru alocarea pe heap a spaÛiului folosit pentru stocarea
ANTAL
unei singureTiberiu Alexandru
variabile. Aceasta este cea mai simpl| modalitate de folosire a funct-iei
tel.:
m allo c() , iar programul care urmeaz| ilustreaz| modul de folosire a funcÛie m allo c() în
0040-264-530918
acest
e-mail:scop:
antaltiberiu@pcnet.ro

/* M ALL OC 1.C */
#include <malloc.h>
#include <stdio.h>

201
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
int main(void)
Facultatea
{
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
dou ble *pf;
Curs depf= limbaj C *) malloc (sizeof(dou ble));
(d ou ble
*pf=123.456789;
Copyright
prin2001.
tf("CoToate drepturile
ntin utu sunt
l lui pf: %p \nrezervate
",pf); autorului.
prin tf("Va loar ea la ca re p oan teaza: % lf\n ",*pf);
Multiplicarea
free (pf);acestui document în scop comercial este interzis|.

SudenÛii participanÛi
return 0; la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
}document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Rezultate:
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Continutul lui pf: 00780EB0
scop m| puteÛi contact| la:
Valoarea la care poanteaza: 123.456789
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
În programul de mai sus poantorului pf la tipul doub le i se atribuie valoarea întoars| de
Ûia antaltiberiu@pcnet.ro
e-mail:
func m allo c() - declarat| în m allo c.h. Apoi lui *pf i se atribuie valoarea 123.456789,
stocând aceast| valoare la adresa la care poanteaz| pf. Linia (double *) malloc(sizeof
(dou ble)) face urm|toarele:
- expresia m alloc (sizeof (do ub le)) întoarce num|rul de octeÛi utilizaÛi pentru
stocarea unui tip doub le , adic| valoarea 8 ;
- funcÛia ma lloc(dimensiune) aloc| un num|r de dimensiune octeÛi consecutivi pe
Conf.
heap-ul dr.neutilizat
ing. ANTAL Tiberiuadresa
Õi întoarce Alexandru
de început a blocului de memorie;
Universitatea Tenhic| din Cluj-Napoca
- expresia (doub le *) forÛeaz| tratarea adresei de început ca un poantor de tipul
Facultatea ConstrucÛii de MaÕini
doub le (aceast| operaÛie am spus deja c| poart| denumirea de forÛare a tipului - casting ).
Catedra de Mecanic|fac
Unele compilatoare Õi aceast
Programare
| operaÛie automat, dar majoritatea compilatoarelor C vor
Curs de limbaj C
genera mesajul de eroare Non-portable pointer assignement dac| conversia este omis|;
- în final, adresa este stocat| în pf. Aceasta înseamn| c| s-a creat dinamic o
Copyright
variabil| real2001.
| deToate
tipul drepturile sunt rezervate autorului.
doub le pe care o putem referi prin *pf.

Multiplicarea acestui document în scop comercial este interzis|.


Dac| doriÛi s| alocaÛi dinamic spaÛiul pentru elementele unui vector, programul urm|tor
SudenÛii |participanÛi
ilustreaz modul de lucru cu func
la orice Ûiade
form| calloc() .
înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
1 /* CA LLO C1.C */
2 SudenÛii
#includeparticipanÛi
<malloc.h> la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
3 #include documentul numai contra cost Õi cu acordul scris al autorului. În acest
<stdio.h>
4 int
scopmain(void)
m| puteÛi contact| la:
5 {
6 ANTAL int *Vector,i,n;
Tiberiu Alexandru
7 tel.: 0040-264-530918
8 e-mail:prin tf("N r. elem en telor
antaltiberiu@pcnet.ro d e ve ctor = ");
9 sca nf("% i",& n);
10
11 if ((Vector=(int *) calloc(n,sizeof(int))) == NULL)
12 {
13 fprintf(stderr,"Nu se poate a loca spatiul de %u oc teti"\
202
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
14 "\n pen tru %u intre gi pe stiva \n ", n*s izeo f(int), n );
15
Facultatea ConstrucÛii
return 1;
de MaÕini
16
Catedra }
de Mecanic| Õi Programare
17 Curs de limbaj C
18 for (i=0; i<n;i++)
19 Copyright
{ 2001. Toate drepturile sunt rezervate autorului.
20 prin tf("Ve ctor + %2i = ", i);
21 Multiplicarea sca
acestui document
nf("%i", V ector+în
i);scop comercial este interzis|.
22 }
23 SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
24 document
prinpentru uzul
tf("Lis ta personal.
a dre selor: ");
25 for (i=0; i<n;i++)
26 prin tf("%8
SudenÛii participanÛi p ",(Ve
la orice ctorde
form| + i));
înv|Û|mânt cu plat| sau alte persoane doritoare
27 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
28 scop m|prin tf("\n
puteÛi Lista va
contact| la:lorilor : ");
29 for (i=0; i<n;i++)
30 ANTAL Tiberiu prin tf("%8 d ",*(V ector
Alexandru + i));
31
tel.: 0040-264-530918
32
e-mail:prin tf("\n ");
antaltiberiu@pcnet.ro
33
34 free (Vector);
35
36 return 0;
37 }

Conf. dr. ing. ANTAL Tiberiu Alexandru


Rezultate:
Universitatea Tenhic| din Cluj-Napoca
Facultatea
Nr. ConstrucÛii
elementelor de MaÕini
de vector = 3
Catedra de Mecanic| Õi Programare
Vector + 0 = 123
Vector
Curs de +limbaj
1 = C34553
Vector + 2 = 2323
Lista adreselor: 00780EB0 00780EB4 00780EB8
Copyright 2001. Toate drepturile sunt rezervate autorului.
Lista valorilor: 123 34553 2323

Multiplicarea acestui document în scop comercial este interzis|.


Programul permite manipularea valorilor de tipul int în condiÛiile de necunoaÕtere a
num |rului
SudenÛii acestora înlamomentul
participanÛi compil
orice form| |rii programului.
de înv|Û|mânt superiorÎnbugetar se încearc
linia 11 pot | alocarea
multiplica acest
spa Ûiului pentru un num |
document pentru uzul personal. r de n elemente de tipul int . Când calloc() întoarce valoarea
NULL înseamn| c| nu exist| suficient spaÛiu pe heap pentru alocarea blocului cerut.
Elementele vectoruluilalaorice
SudenÛii participanÛi careform|
poanteaz | Vector sunt
de înv|Û|mânt cureferite
plat| sauprin sintaxa
alte *(Ve ctor + i). În
persoane doritoare
locul acesteia s-ar fi putut scrie Õi Vec tor[i]. În linia 34 se elibereaz| spaÛiul alocat pe heap
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
pentru bloc.
scop m| puteÛi contact| la:

Ce se petrece
ANTAL Tiberiu | la un moment dat ne d|m seama c| avem nevoie de mai multe elemente
dacAlexandru
decât cele citite în
tel.: 0040-264-530918 variabila n ? FuncÛia rea lloc() permite modificarea cantit|Ûii de memorie
alocate unui bloc. S| presupunem c| în locul celor n elemente dorim s| realoc|m spaÛiu
e-mail: antaltiberiu@pcnet.ro
pentru 2*n elemente de tipul int. Va fi nevoie de un nou poantor. În exemplul care
urmeaz| poantorul se numes- te ReV ector , iar spaÛiul pentru stocarea tabloului va fi
realocat folosind expresia: Re Ve ctor = rea lloc(Vector, 2*n *size of(in t));.

203
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Ô i în acest caz
Facultatea este posibil
ConstrucÛii ca realocarea s| nu reuÕeasc|, adic| s| nu se g|seasc| o zon|
de MaÕini
continu | de memorie dinamic
Catedra de Mecanic| Õi Programare | cu dimensiunea cerut|. În acest caz rea lloc() va întoarce
valoarea NULL care va fi atribuit| lui ReVector . Dac| adresa obÛinut| din rea lloc() ar fi
Curs de limbaj
fost atribuit C lui Vector, în cazul nereuÕitei aloc|rii, adresa iniÛial| ar fi fost pierdut|
| direct
pentru c| valoarea N U LL ar fi fost pus| în locul celei iniÛiale (datorit| operatorului de
Copyright
atribuire). 2001. Toate drepturile
Dac| alocarea reuÕeÕte,sunt
urmrezervate autorului.
|toarele dou | scenarii sunt posibile:
1. rea lloc() a fost în stare s| creasc| regiunea de memorie iniÛial alocat|
Multiplicarea blocului,
acestui document în scop
motiv pentru comercial
care esteReVector
adresa lui interzis|. este aceeaÕi cu cea a lui
Vector sau
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
2. realloc() nu a putut creÕte m|rimea blocului alocat iniÛial Õi a trebuit s|
document pentru uzul|personal.
g|seasc un bloc nou. Adresa lui ReVector Õi cea a lui Vector vor fi diferite
în acest caz. Blocul iniÛial va fi copiat la noua adres| Õi în continuarea lui se
SudenÛii participanÛi
va alocalaspa
orice
Ûiulform|
pentrudeobiectele
înv|Û|mânt
noi.cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Ce se petrece în cazul tablourilor cu mai multe dimensiuni s- i cum anume se va aloca
dinamic spaÛiul Alexandru
ANTAL Tiberiu pentru acestea? S| presupunem c| lucr|m cu un tablou float
tempmed zil[10][365] care va stoca temperatura medie pentru fiecare zi din an a 10 regiuni
tel.: 0040-264-530918
distincte. Dac| am dori s| aloc|m dinamic spaÛiul pentru acest tablou, permiÛând ca
e-mail:
num|rulantaltiberiu@pcnet.ro
de regiuni s| fie variabil Õi numai partea de 365 de float-uri s| fie fix|, codul ar
putea fi scris astfel:

float **pp tm pm ed zil;


**pp tm pm ed zil = ca lloc(nrreg iun i, 365 * size of(floa t));

Conf. dr. ing. ANTAL


unde nrregiuni va conÛTiberiu
ine numAlexandru
|rul de regiuni în care se va m|sura temperatura medie.
Universitatea
Acest stil deTenhic| din Cluj-Napoca
declarare nu ofer| îns| suficiente informaÛii pentru ca poantorul
Facultatea
pp tm pm edz il s| permit
ConstrucÛii de|MaÕini
deplasarea corect | prin tablou. De exemplu, când scriem
Catedraedzil[3][100]
ptmpm de Mecanic| s| produc| saltul peste 4 blocuri de 365 de r -uri (3*365*4 =
Õi Programare
, 3 trebuie
Curs octe
5696 Ûi) Õi apoi
de limbaj C 100 peste înc| 4*100 = 400 de octeÛi. În total trebuie s| se sar| 6096
octeÛi, îns| compilatorul nu poate determina acest lucru folosind declaraÛia poantorului.
Copyright 2001. Toate drepturile sunt rezervate autorului.
/* PTT AB .C */
Multiplicarea acestui
#include<stdio.h> document în scop comercial este interzis|.

SudenÛii
int participanÛi
main(void) la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
{
document pentru uzul personal.
floa t tm pm ed zil[3][10],**pp tm pm ed zil;
tmparticipanÛi
SudenÛii pm ed zil[0 ][0]=3.;
la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentult numai
pptm pm ed zil=(floa **)tm pm ed zil;cost Õi cu acordul scris al autorului. În acest
contra
scop m| puteÛi contact| la:
prin tf(" tmpm ed zil %p\ n", tm pm ed zil);
prin tf(" pptm pm ed zil %p\ n", p ptm pm ed zil);
ANTAL Tiberiu Alexandru
prin tf(" tmpm ed zil[0][0] % f\n ", tm pm ed zil[0][0]);
tel.: 0040-264-530918
prin tf(" &tm pm ed zil[0][0] % p\n ", &tm pm ed zil[0][0]);
e-mail: antaltiberiu@pcnet.ro
prin tf("& pptm pm ed zil[0][0] % p\n ", &p ptm pm ed zil[0][0]);

return 0;
}

204
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Rezultate:
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi0065FD80
tmpmedzil Programare
pptmpmedzil 0065FD80
Curs de limbaj C
tmpmedzil[0][0] 3.000000
&tmpmedzil[0][0] 0065FD80
Copyright 2001. Toate drepturile sunt rezervate autorului.
&pptmpmedzil[0][0] 40400000

Multiplicarea acestui document în scop comercial este interzis|.


În programul de mai sus se poate observa uÕor c| tmpm edzil[0][0] Õi pptmpm edzil[0][0]
sunt dou|participanÛi
SudenÛii obiecte diferite pentru
la orice c| de
form| au înv|Û|mânt
adrese diferite, deÕi tmp
superior il Õmultiplica
m edzpot
bugetar i pptm pmacest
edz il
document| pentru
poanteaz la aceeaÕi adres
uzul |. Cum se poate rezolva aceast| problem|? SoluÛia st| în
personal.
declararea poantorului sub forma:
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot
floa multiplica zil)[365]; numai contra cost Õi cu acordul scris al autorului. În acest
documentul
t (*ptm pm ed
scop m| puteÛi contact| la:
Compilatorul
ANTAL Tiberiu Õti" c| în cazul expresiei ptm pm ed zil[3][100 ], 3 trebuie înmulÛit cu
"vaAlexandru
dimensiunea a 365 de float-uri (pptm pm edz il fiind poantor la un tablou de 365 de float-uri
tel.: 0040-264-530918
3 duce la saltul peste 3 astfel de tablouri). De asemenea, "Õtie" c| 100 trebuie scalat prin
e-mail: antaltiberiu@pcnet.ro
dimensiunea lui float, astfel ca7 adresele folosite pentru poziÛionarea în tablou vor fi
calculate corect.

13.3 Alocarea dinamica7 a memoriei


Conf. dr. ing. ANTAL Tiberiu Alexandru
pentru
Universitatea matrice
Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Dup | cum
Catedra Ûi dedus din
deaMecanic| cele citite pân| acum, când se aloc| dinamic spaÛiul pentru un
Õi Programare
tablou unidimensional
Curs de limbaj C (vector), dimensiunea acestuia poate fi g|sit| în timpul execuÛiei
programului. La utilizarea unor tablouri cu mai multe dimensiuni, nu trebuie s|
cunoaÕtem prima dimensiune în momentul compil|rii. Necesitatea cunoaÕterii celorlalte
Copyright
dimensiuni2001. Toate
depinde drepturile
numai de felulsunt rezervate
în care autorului.
vom scrie noi codul. În continuare se vor discuta
problemele aloc|rii dinamice a spaÛiului pentru tablourile de întregi cu 2 dimensiuni
Multiplicarea acestui document
(matrice de întregi). consider|este
în scop comercial
Pentru început, în care se cunoaÕte a 2-a
interzis|.
m cazul
dimensiune în momentul compil|rii programului.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
Metoda 1: Una dintre metodele de a trata problema este utilizarea lui typedef. Pentru
alocarea spaÛiului unui tablou de dou| dimensiuni reamintiÛi-v| notaÛiile echivalente:
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
iTab 2[rand ][coloana ] = 1; *(*(iTab 2 + rand ) + coloana) = 1;
scop m| puteÛi contact| la:
este de asemenea adev|rat c| urm|toarele notaÛii genereaz| acelaÕi cod:
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
iTab2[rand] *(iTab2 + rand)
e-mail: antaltiberiu@pcnet.ro
deci iTab2 poate fi privit ca un tablou de tablouri, iar iTab2[n] ca un poantor la cel de al
n- elea tablou din tabloul de tablouri. Fie programul:

205
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
#include <stdio.h>
Facultatea ConstrucÛii de MaÕini
#include<stdlib.h>
Catedra de Mecanic| Õi Programare
Curs de limbaj
#define COLOANE C 5

Copyright
typ ed ef in t2001. Toate
tip_ Ta drepturile
bR an sunt
du ri[C OLO ANrezervate
E]; autorului.

Multiplicarea acestui
tip_TabRanduri* document
prand; în scop comercial este interzis|.

SudenÛii
int participanÛi
main(void) la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
{ pentru uzul personal.
int iNrRan duri = 10;
int
SudenÛii iRand, iColoana;
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pra nd =m
pot multiplica alloc (iNrR numai
documentul an du ri* C OL OA
contra NE
cost Õi *cusize of(in t));
acordul scris al autorului. În acest
for (iRand ; iRand
scop m| puteÛi contact| la: < iNrR and uri; iRan d++)
{
ANTAL Tiberiu forAlexandru
(iColoana = 0; iColoana < COL OA NE ; iColoana ++)
{
tel.: 0040-264-530918
prand[iRand][iColoana]=22;
e-mail: antaltiberiu@pcnet.ro
}
}
return 0;
}

Am presupus
Conf. | utilizaÛTiberiu
dr. ing. cANTAL i un compilator
Alexandru ANSI care face automat conversia de la poantorul
Universitatea Tenhic| din Cluj-Napoca compilator antic, trebuie s| faceÛi conversia cu
void întors de ma lloc() . Dac | utilizaÛi un
mâna, scriind prand= (tip_TabR andu ri *) m allo c (...) . Utilizarea acestor declaraÛii face
Facultatea ConstrucÛii de MaÕini
ca prand s| aib| toate caracteristicile unui nume de tablou (cu excepÛia c| prand poate
Catedra de Mecanic| Õi Programare
fi modificat) Õi notaÛia de tablou poate fi folosit| în continuarea programului. Aceasta
Curs de |limbaj
înseamn c| dacC
| doriÛi s| scrieÛi o funcÛie care s| modifice conÛinutul tabloului, COLOANE
trebuie s| fie unul din parametrii transferaÛi funcÛiei, dupa7 cum am discutat la tablouri Õi
Copyright
funcÛii. 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


Metoda 2: În metoda anterioar| prand este un poantor la un tip de “tablou
unidimensional de num
SudenÛii participanÛi la|orice O LO A N E de întregi”. Exist| o scriere sintactic| mai simpl|
r de Cform| de înv|Û|mânt superior bugetar pot multiplica acest
pentru a exprima acest lucru, f|r| a utiliza typedef:
document pentru uzul personal.
int (*p1rand )[CO LO AN E];
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Aici
scop variabila
m| puteÛip1rand are
contact| la:aceleaÕi caracteristici cu prand Õi reprezint| un poantor la un
tablou de întregi, iar dimensiunea tabloului se d| prin C O LO A N E . Plasarea parantezelor
face ca notaÛia de poantor sa7 fie predominant| întrucât f|r| acestea notaÛia de tablou are
ANTAL
precedenTiberiu Alexandru
Û| mai mare. Dac| scriam:
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
int *p1 rand [CO LO AN E];

p1rand ar fi fost un tablou de poantori cu num|rul de poantori la întregi egal cu


C O LO A N E .

206
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Metoda Consider|de
Facultatea3:ConstrucÛii cazul în care nu se cunosc num|rul de elemente la momentul
m MaÕini
compil | rii. O metod | ar fi
Catedra de Mecanic| Õi Programare crearea unui tablou de poantori la tipul întreg Õi apoi alocarea
spaÛiului pentru fiecare rând în parte Õi stocarea adresei rândului alocat în poantorul
Curs de limbaj
corespunz |tor dinC tablou.

Copyright 2001. Toate drepturile sunt rezervate autorului.


/* ALD INT A1.C */
#include <stdio.h>
Multiplicarea acestui document în scop comercial este interzis|.
#include <stdlib.h>

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int main(void)
document pentru uzul personal.
{
int iNrRandu ri = 5; /* Nu ma rul de linii cat si cel de coloan e se eva lueaza */
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
int iN rC oloan e = 10 ; /* sau se citeste in timpu l execu tiei program ului */
potint iRand; documentul numai contra cost Õi cu acordul scris al autorului. În acest
multiplica
scop
intm| puteÛi contact| la:
**pRand;
pR an d = m alloc (iNrR an du ri * siz eof(in t *));
ANTAL Tiberiu
if (pRand Alexandru
== NULL)
tel.:{ 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
puts("\ nN u p ot alo ca s pa tiul p en tru iRa nd poa ntori.\n ");
exit(0);
}

prin tf("\n \n \n Ind ice P oan tor(hex a) P oan tor(ze c) Dife ren ta(ze c)");

for dr.
Conf. (iRand = 0; iRa nd
ing. ANTAL < iN rRa
Tiberiu ndu ri; iRand ++)
Alexandru
{
Universitatea Tenhic| din Cluj-Napoca
pRa nd
Facultatea [iRa nd ] = ma
ConstrucÛii de lloc(iN
MaÕinirColoa ne * sizeof(in t));
if (pRand[iRand] == NULL)
Catedra de Mecanic| Õi Programare
{
Curs de limbaj C
prin tf("\n N u p ot alo ca s pa tiul p entr u R an d[% d]\n ",iRan d);
exi t(0);
Copyright 2001. Toate drepturile sunt rezervate autorului.
}
printf("\ n% d %p %d", iR an d, pR an d[iR an d], pR an d[iR an d]);
Multiplicarea acestui document în scop comercial este interzis|.
if (iRand > 0)
printf(" % d",(in t)(pR an d[iR an d] - pR an d[iR an d-1]));
SudenÛii
} participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
return 0;
SudenÛii
} participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
Rezultate:
Indice Poantor(hexa) Poantor(zec) Diferenta(zec)
ANTAL Tiberiu Alexandru
0 00770710 7800592
tel.: 0040-264-530918
1 00770760 7800672 20
e-mail: antaltiberiu@pcnet.ro
2 007707B0 7800752 20
3 00770800 7800832 20
4 00770850 7800912 20

207
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
În codul anterior
Facultatea pRand este un poantor la un poantor la tipul int. Pentru cazul nostru,
ConstrucÛii de MaÕini
poanteaz |
Catedra de Mecanic|element
la primul al unui tablou de poantori la tipul int. Dac| lucraÛi cu aceast|
Õi Programare
metod| accesul la un element de tablou se face tot în stilul clasic, adic|
Curs de limbaj C
pR an d[ran d][coloan a]= 22 , dar aceasta nu înseamn| c| datele din tabloul cu 2 dimensiuni
sunt stocate continuu în memorie.
Copyright 2001. Toate drepturile sunt rezervate autorului.

Num |rul de apeluri


Multiplicarea funcÛiei mîn
acestuialdocument allo c() este:
scop comercial este interzis|.
Pentru tabloul de poantori 1
SudenÛii Pentru alocarea spaÛiului fiec|rui rând 5 superior bugetar pot multiplica acest
participanÛi la orice form| de înv|Û|mânt
document pentru uzul personal.
______________________________________
SudenÛii Total
participanÛi la orice form| de înv|Û|mânt6 cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop
Dac|m| doriputeÛi contact|
Ûi ca un la:
bloc continuu de memorie s| fie alocat pentru tablou, puteÛi folosi metoda
urm|toare.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Metoda 4: Aici se aloc| un bloc continuu de memorie pentru stocarea tabloului. Apoi se
e-mail: antaltiberiu@pcnet.ro
creeaz| un tablou de poantori care vor poanta la fiecare rând. DeÕi se utilizeaz| un tablou
de poantori, tabloul actual este continuu în memorie.

/* ALD INT A2.C */


#include <stdio.h>
#include <stdlib.h>
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
int main(void)
Facultatea ConstrucÛii de MaÕini
{
Catedra de Mecanic| Õi Programare
int **pRand;
Curs de limbaj C
int *piA;
int *pte st;
Copyright
int k;
2001. Toate drepturile sunt rezervate autorului.
int iNrRandu ri = 5;/* Am bele dim ensiu ni pot fi evalua te sau p ot fi*/
Multiplicarea acestui
int iNrColoane document
= 8;/* întimpul
citite in scop comercial este
ex ecutiei interzis|.
prog ram ului */
int iRand, iColoana;
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
/* Aici pentru
se alocauzul personal.
spatiul pen tru tablou */

SudenÛii
piA = mparticipanÛi
alloc (iNrRla
anorice
du ri form| de înv|Û|mânt
* iN rColoa cu plat|
ne * sizeof(in t)); sau alte persoane doritoare
potifmultiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
(piA == NULL)
scop
{ m| puteÛi contact| la:
pu ts("\n N u p ot alo ca s pa tiul p en tru tab lou ");
ANTAL exit(0);
Tiberiu Alexandru
}
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
/* Aici se aloca spatiu pe ntru po antorii la ran dur i */

pR an d = m alloc (iNrR an du ri * siz eof(in t *));


if (pRand == NULL)
{
208
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
pu ts("\n N u p ot alo ca s pa tiul p en tru poa ntori");
Facultatea
exit(0);
ConstrucÛii de MaÕini
Catedra
}
de Mecanic| Õi Programare
Curs de limbaj C
/* Aici se va po anta la p oantori */
Copyright 2001. Toate drepturile sunt rezervate autorului.
for (k = 0; k < iNrRa ndu ri; k++)
Multiplicarea
{ acestui document în scop comercial este interzis|.
pRa nd [k] = piA + (k * iN rColoa ne );
SudenÛii
} participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
/* Aici se ilustreaz a m odu l in care poa ntorii la rand uri se incre me nteaza */
prin tf("\n
SudenÛii \n Ilus trar
participanÛi ea m odulu
la orice form|i de
in înv|Û|mânt
ca re po an torii la ran
cu plat| dualte
sau ri se incr em en
persoane teaza" );
doritoare
potprin tf("\n \ndocumentul
multiplica Ind ex Poanumai
ntor(he x) D ifere
contra Õi cu
cost nta (zec)");
acordul scris al autorului. În acest
scop m| puteÛi contact| la:
for (iRand = 0; iRa nd < iN rRa ndu ri; iRand ++)
{
ANTAL Tiberiu Alexandru
printf("\ n% d %p ", iRa nd , pR an d[iR an d]);
tel.: 0040-264-530918
if (iRand > 0)
e-mail: antaltiberiu@pcnet.ro
printf(" %d ",(pR an d[iR an d] - pR an d[iR an d-1]));
}
prin tf("\n \n Ac um se tip are ste ta blou l\n" );
for (iRand = 0; iRa nd < iN rRa ndu ri; iRand ++)
{
for (iColoan a = 0; iColoan a < iNrC oloane; iColoa na++)
Conf. {dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
pRand[iRand][iColoana] = iRand + iColoana;
Facultatea ConstrucÛii de MaÕini
prin tf("%d ", pR an d[iR an d][iC oloa na ]);
} de Mecanic| Õi Programare
Catedra
Curs de limbaj
putch C ');
ar('\n
}
Copyright 2001. Toate drepturile sunt rezervate autorului.
puts ("\n ");
Multiplicarea acestui document în scop comercial este interzis|.
/* Aici se ilustreaza faptul ca se utilizeaza un tablou
bidimes
SudenÛii ional intr-un
participanÛi bloc
la orice continu
form| u de m em orie.
de înv|Û|mânt */
superior bugetar pot multiplica acest
prin tf("Ac
document um dem
pentru uzulonstra m con tinu itate a in m em orie \n ");
personal.
ptest =participanÛi
SudenÛii piA; la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
for (iRand = 0; iRa nd < iN rRa ndu ri; iRand ++)
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
{
scop m| puteÛi contact| la:
for (iColoan a = 0; iColoan a < iNrC oloane; iColoa na++)
{
ANTAL Tiberiu Alexandru
prin tf("%d ", *(ptest++));
tel.: 0040-264-530918
}
e-mail: antaltiberiu@pcnet.ro
putch ar('\n ');
}

return 0;
}

209
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Rezultate:
Catedra de Mecanic| Õi Programare
Curs de limbaj
Ilustrarea C
modului in care poantorii la randuri se incrementeaza

CopyrightPoantor(hex)
Index 2001. Toate drepturile sunt rezervate
Diferenta(zec) autorului.
0 007706D0
1 007706F0
Multiplicarea acestui 8
document în scop comercial este interzis|.
2 00770710 8
3 00770730
SudenÛii participanÛi 8 form| de înv|Û|mânt superior bugetar pot multiplica acest
la orice
4 00770750 8
document pentru uzul personal.
Acum se tipareste tabloul
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
0 1 2 3 4 5 6 7
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
1 2 3 4 5 6 7 8
scop m| puteÛi contact| la:
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 10
ANTAL
4 5 6 7 Tiberiu
8 9 10 Alexandru
11
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Acum demonstram continuitatea in memorie
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 10
4 5 6 7 8 9 10 11
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic|
Num|rul de apeluri aledin Cluj-Napoca
func Ûie m allo c() este:
Facultatea ConstrucÛii de MaÕini
CatedraPentru tabloul ÕiînProgramare
de Mecanic| sine 1
Curs dePentru
limbajtabloul
C de poantori 1
______________________________________
Copyright 2001. Toate drepturile sunt rezervate autorului.
Total 2
Multiplicarea acestui document în scop comercial este interzis|.
Sigur v-aÛi întrebat de ce este important| continuitatea în memorie a tabloului. Un motiv
ar
SudenÛii c| prin m em
fi acelaparticipanÛi oriceseform|
laset() poatede
face inÛializarea
înv|Û|mânt lui în mod
superior elegant.
bugetar Un alt motiv
pot multiplica ar
acest
fi c | sistemul de operare
document pentru uzul personal. implementeaz | m allo c() sub forma unei liste 7
înla n Ûuite care
conÛine date despre m|rimea fiec|rui bloc. Deci fiecare apel a lui m allo c() va duce la
alocarea de spaÛiu în lista înl|Ûuit| descris| mai sus. Cum în acest caz num|rul de apeluri
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
a lui m allo c() este mai mic, spaÛiul auxiliar consumat pentru stocarea poziÛiei Õi dimensiunii
pot multiplica
blocurilor documentul
de memorie numaidecontra
alocate aceastcost Õi cu acordul scris
| implementare este al
maiautorului.
mic decât În în
acest
cazul
scop m|
anterior. puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
13.4 Structuri dinamice de date
e-mail: antaltiberiu@pcnet.ro
Alocarea dinamic| a memoriei se poate face Õi pentru structuri de date diferite de tablou.
De exemplu, struct este des folosit| pentru structuri de date care au elementele legate
între ele cum sunt listele, arborii, grafele etc. unde num|rul de elemente (noduri) necesare
pentru stocarea datelor nu poate fi cunoscut exact la momentul compil|rii programului.
210
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
În Figura 24
Facultatea se reprezint
ConstrucÛii de|MaÕini
schema unei structuri de dat| numit| lista7 sim plu înlant- uita
7.
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
Figuradocumentul
24 - Schema numai contra
unei liste Õi cu acordul scris al autorului. În acest
costînl|nÛuite
simplu
scop m| puteÛi contact| la:
Datele sunt stocate într-o structur|, care pe lâng| informaÛia util| are Õi un poantor la
urm
ANTAL |torul nod. Oricând
Tiberiu Alexandru i se poate ad|uga un nou nod listei dac| ultimul poantor este
actualizat pentru a poanta la noul element ad|ugat. Dac| se pleac| de la începutul listei,
tel.: 0040-264-530918
aceasta se va crea din aproape în aproape, adic| nod cu nod, prin folosirea poantorului la
e-mail: antaltiberiu@pcnet.ro
nodul urm|tor. Ultimul poantor este de obicei iniÛializat cu valoare NULL pentru a marca
faptul c| aici lista se termin|. Un alt exemplu de list| este cea dublu înl|nÛuit|. Aceasta
are doi poantori, unul la nodul urm|tor Õi unul la nodul anterior, în acest fel lista putând
fi parcurs| în dou| sensuri, spre deosebire de cea simplu înlanÛuit| care poate fi parcurs|
numai într-un singur sens. Probabil cel mai bun exemplu de list| înlanÛuit| este Tabela
de Alocare a FiÕierele (FAT sau File Allocatio n T ab le ) folosit| de sistemul de operare
Conf. dr. ing. ANTAL
DOS. Aceasta | de cluster-e
este o listTiberiu Alexandru(cluster - spaÛiu pe disc cu m|rimea minim| alocat|
pentru stocareTenhic|
Universitatea de date)dinalocat | fiÕierelor stocate pe disc. Din moment ce dimensiunea unui
Cluj-Napoca
fi Õier poateConstrucÛii
Facultatea creÕte, listele 7 nÛuite sunt folosite în scopul stoc|rii lor. Fiecare intrare în
de înla
MaÕini
FAT reprezint | un cluster
Catedra de Mecanic| Õi Programare pe disc Õi stocheaz | poziÛia urm|toarei intr|ri. Pentru a g|si
care clustere
Curs de limbaj C sunt folosite pentru stocarea unui fiÕier se parcurge FAT-ul pân| când se
ajunge la un marcaj de terminare a listei de clustere.
Copyright 2001. Toate drepturile sunt rezervate autorului.
Exemplul care urmeaz| prezint| un grup de funcÛii care aloc| spaÛiu pentru un nod al unei
Multiplicarea |nÛuite,document
liste simplu înlacestui afiÕeaz| datele
în scopstocate în aceasta
comercial prin parcurgerea ei de la cap la
este interzis|.
coad| Õi în final elibereaz| spaÛiul alocat pe heap nodurilor listei. În paragraful 10.7
no Ûiunea participanÛi
SudenÛii de list| a fostladeja form| de|,înv|Û|mânt
oriceprezentat noutatea programului care vapot
superior bugetar fi prezentat acest7
multiplicaconsta
în alocarea dinamic | a memoriei
document pentru uzul personal. pentru elementele listei (pentru a m | apropia de
terminologia specific| listelor, aici elementele au fost numite noduri).
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
potLISTA
/* multiplica
SI.C documentul
*/ numai contra cost Õi cu acordul scris al autorului. În acest
#include<stdio.h>
scop m| puteÛi contact| la:
#include<string.h>
#include<malloc.h>
ANTAL Tiberiu Alexandru
#include<stdlib.h>
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
struct Nod
{
int cod;
struct Nod *p_urm_Nod;
};
211
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
struct Nod* nod_ Nou (int c)
Facultatea
{
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
struct Nod *p;
Curs deiflimbaj C
((p = malloc(sizeof(struct Nod))) == NULL)
{
Copyright 2001. Toate drepturile
fprintf(std err, "S -a sunt rezervate
epu izat autorului.
me m oria din am ica dispon ibila !\n ");
ex it(9);
Multiplicarea
} acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
p->cod=c;
document pentru uzul
p->p_urm_N personal.
od=NULL;

return
SudenÛii p;
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
}pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
struct Nod* nod_ Inserare(struct Nod *curent, int c)
{ANTAL Tiberiu Alexandru
s tr uc t N od * N N ;
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
N N =no d_ N ou (c);
c ur en t-> p_ u rm _ N od =N N ;

r etu rn N N ;
}

Conf. dr. ing.


void lista ANTAL
_A fisa Tiberiu
re(co nst Alexandru
stru ct N od *cu ren t)
{Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii
prin tf("%ide",MaÕini
curen t->cod );
}Catedra de Mecanic| Õi Programare
Curs de limbaj C
void lista_Parcurgere(const struct Nod *p)
{Copyright 2001. Toate drepturile sunt rezervate autorului.
stru ct N od *cu ren t;
Multiplicarea acestui document în scop comercial este interzis|.
curent=(struct Nod *) p;
while
SudenÛii (curent la
participanÛi != orice
NULL) form| de înv|Û|mânt superior bugetar pot multiplica acest
{
document pentru uzul personal.
lista_ Afisare(cu ren t);
curent=curent->p_urm_Nod;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
}
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
}
scop m| puteÛi contact| la:
void lista_Eliberare(struct Nod *p)
ANTAL Tiberiu Alexandru
{
tel.: 0040-264-530918
stru ct N od *cu ren t;
e-mail: antaltiberiu@pcnet.ro
prin tf("\n Elib era rea nod urilor:");

curent = p;
while (curent != NULL)

212
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
{
Facultatea ConstrucÛii de MaÕini
curent=curent->p_urm_Nod;
Catedra de Mecanic| Õi Programare
lista_ Afisare(p);
Curs de limbajfree C (p);
p=curen t;
Copyright
} 2001. Toate drepturile sunt rezervate autorului.
}
Multiplicarea acestui document în scop comercial este interzis|.
int cite ste_N od ()
{SudenÛii participanÛi
la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
int pentru
n; uzul personal.

prin
SudenÛii tf("n = "); la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
participanÛi
sca nf("%documentul
pot multiplica i", &n ); numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
return n;
}ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
int main(void)
e-mail: antaltiberiu@pcnet.ro
{
int n;
stru ct N od *cap , *cur en t;

if ((n = citeste_Nod()) <= 0)


{
Conf. dr. ing. ANTAL Tiberiu
prin tf("Am term Alexandru
ina t!\n");
Universitatea Tenhic|
ex it(0); din Cluj-Napoca
Facultatea
} ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs decuren
limbaj Cd_ N ou (n);
t=no
cap =cu ren t;
Copyright 2001. Toate drepturile sunt rezervate autorului.
while (n > 0)
{
Multiplicarea acestui document în scop comercial este interzis|.
if ((n = citeste_Nod()) > 0)
SudenÛii participanÛi curen t=no
la orice d_ Ins
form| deera re(cu ren t,n);
înv|Û|mânt superior bugetar pot multiplica acest
}
document pentru uzul personal.
lista_
SudenÛii Pa rcu rge
participanÛi lare(ca
oricep);form| de înv|Û|mânt cu plat| sau alte persoane doritoare
lista _E libera re(c ap );
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
return 0;
}
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Rezultate:
e-mail: antaltiberiu@pcnet.ro
n = 1
n = 2
n = 3
n = 4

213
Capitolul
Conf. dr.13ing.
- Alo carea dinam
ANTAL ica7 a memor
Tiberiu iei în limbajul C
Alexandru
Universitatea Tenhic| din Cluj-Napoca
n = 5
Facultatea
n = 6
ConstrucÛii de MaÕini
Catedra
n = 7
de Mecanic| Õi Programare
Curs
n = 8de limbaj C
n = 0
Copyright
1 2 3 4 5 2001.
6 7 8Toate drepturile sunt rezervate autorului.
Eliberarea nodurilor:1 2 3 4 5 6 7 8
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

214
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


14 Biblioteca C Standard
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

C
SudenÛiiapitolul
participanÛi la orice|form|
care urmeaz este o prezentare
de înv|Û|mânt cu |plat|
sumar a func Ûiilor
sau altedin biblioteca
persoane
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest de
Biblioteca
programare
scop m| puteÛi
standard nu este o parte a limbajului C, dar toate
C ANSI.
doritoare
mediile
asigur| ola:metod| de lucru cu fiÕierele antet descrise în continuare Õi o
C contact|
biblioteca7 standardizata7 corespunz|toare acestor declaraÛii. DeclaraÛiile de funcÛii, tipuri
de date Õi macrodefinit-ii sunt stocate în fiÕiere denumite an tete standard . Acestea sunt
ANTAL
prezentateTiberiu Alexandru
în continuare, împreun| cu o sumar| descriere.
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Diagnostic: <as ser t.h >
Testare tip caractere: <cty pe.h> :
Numere de eroare: <err no .h>
Limite definite prin implementare pentru virgula7 flotanta7 : <floa t.h>
Limite
Conf. dr. definite Tiberiu
ing. ANTAL prin implementare:
Alexandru <lim its.h >
Universitatea Tenhic|
<loca le.h > din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Funct-ii matematice: <m ath .h>
Catedra de Mecanic| Õi Programare
Curs deSalturi
limbajnelocale:
C <setjm p.h >
Semnale: <sig na l.h>
Copyright
Liste2001. Toate
cu numa 7 r drepturile
variabil desunt rezervate
argumente: autorului.
<std arg.h >
<std de f.h>
Multiplicarea acestui document în scop comercial este interzis|.
Intrare s- i ies- ire: <std io.h >
SudenÛiiFunct -ii utilitare:
participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
<std lib.h>
document pentru
Funct uzul prelucrarea
-ii pentru personal. s- irurilor: <string .h>
Funct-ii pentru ora7 s- i data7 : <tim e.h>
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
Includerea acestor
scop m| puteÛi antete
contact| la: în programul surs| se face prin directiva #include discutat|
deja în capitolul 7.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
14.1 <assert.h>
e-mail: antaltiberiu@pcnet.ro

void ass ert(in t expre ssio n); macro folosit pentru realizarea diagnostic|rii unui program.
Dac| expresia expression este falsa7 (ia valoarea numeric| 0) un mesaj va fi afiÕat pe
stderr Õi apoi se apeleaz| funcÛia ab ort() pentru terminarea execuÛiei programului. FiÕierul

215
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
surs| Õi num
Facultatea |rul de linie
ConstrucÛii a macrodefinit-iei se afiÕeaz| prin __FILE__ , __L IN E__ a
de MaÕini
preprocesorului. Dac | N D E B U G este definit| acolo unde s-a inclus <assert.h> , macro
Catedra de Mecanic| Õi Programare
asser t() este ignorat.
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


14.2 <ctype.h>
Multiplicarea acestui document în scop comercial este interzis|.
Antetul conÛine declaraÛiile funcÛiilor pentru testarea caracterelor. Conform standardului,
submulÛimea literelor implicite cuprinde 26 de caractere mici Õi 26 de caractere mari ale
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
alfabetului latin. Acestea pot varia în funcÛie de anumite set|ri locale specifice, sub
document pentru
controlul func uzul personal.
Ûiei setloca le() .

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
um (int c); diferit
int isalndocumentul
pot multiplica numaide 0 dac|cost
contra c este
Õi cuunacordul
caracter saual
scris num|r ('A'-'Z'
unautorului. , 'a'-'z',
În acest
'0'-'9' ), adic | dac | sunt
scop m| puteÛi contact| la: adev | rate isalpha(c) sau isd igit(c ). Altfel are valoare 0 ;
int is alpha (int c); difera 7 de 0 dac| c este o liter| din alfabet ('A'-'Z', 'a'-'z');
ANTAL Tiberiu
int Alexandru
iscn trl(int c); difera 7 de 0 dac| c este un caracter de control (0x7F , 0x00 -0x1F );
tel.: 0040-264-530918
int is dig it(int c); difer| de 0 dac| c este o cifr| ('0'-'9');
e-mail: antaltiberiu@pcnet.ro
int isgraph(int c); difer| de 0 pentru cazul în care caracterul este grafic, adic| se
poate afiÕa Õi este diferit de spaÛiu (0x21-0x7E );
int is low er(in t c); difer| de 0 dac| c este o liter| mic| ('a'-'z');
int isprint(in t c); difer| de 0 dac| c este un caracter ce se poate afiÕa, inclusiv
spaÛiu (0x20-0x7E );
Conf. dr. ing. ANTAL Tiberiu Alexandru
int ispu nct(in t c); difer| de 0 dac| c este un semn de punctuaÛie diferit de spaÛiu,
Universitatea
cifr | sau liter|Tenhic|
; din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
int issp ace (int c); difer| de 0 dac| c este spa Ûiu , formfeed , ne w line , carriage
Catedra de Mecanic| Õi Programare
return , horizontal tab sau vertical tab (0x09-0x0D , 0x20 );
Curs de limbaj C
int is up per (int c); difer| de 0 dac| c este o liter| mare ('A'-'Z');

Copyright int is xd igit(in


2001. Toatet c); difera7 desunt
drepturile 0 dac| c este autorului.
rezervate o cifr| hexazecimal|;
int tolow er(in t c); întoarce echivalentul literei mici corespunz|toare lui c ;
Multiplicarea acestui document în scop comercial este interzis|.
int toup per(int c); întoarce echivalentul literei mari corespunz|toare lui c .

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document7 pentru uzul personal.
Remarca
isupper(c) implic| isalpha(c)
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
islower(c) implic| isalpha(c)
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
issspace(c) , ispunct(c)
scop m| puteÛi contact|, iscntrl(c)
la: sau isdigit(c) implic| !isalpha(c)

ANTAL Tiberiu Alexandru


14.3 <float.h>
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
FLT _R AD IX - r|d|cina reprezent|rii exponenÛiale;
FLT_ROUNDS - modul de rotunjire pentru adun|ri în virgul| flotant|;
FLT_DIG - num|rul de cifre q astfel încât un num|r în virgul| flotant| cu q
zecimale s| poat| fi rotunjit la o reprezentare în virgul| flotant| Õi invers f|r| pierderea
216
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
preciziei;
Facultatea ConstrucÛii de MaÕini
Catedra FLT_EPSILON cel mai mic num|r x astfel încât 1.0 + x != 1.0
de Mecanic| Õi-Programare
Curs deFLT limbaj
_M ANC T_ DIG - num|rul de cifre zecimale din r|d|cin| specificate de
FLT _R AD IX semnificative în virgul| flotant|;
Copyright 2001. Toate drepturile sunt rezervate autorului.
FLT_MAX - cel mai mare num|r în virgul| flotant| care se poate reprezenta;
F LT _M A X _ EX P - cel mai mare întreg astfel încât FLT_RA DIX ridicat la acea
Multiplicarea acestui document în scop comercial este interzis|.
putere s| dea un num|r care se poate reprezenta în virgul| flotant|;
SudenÛii FLT _M IN - valoarea
participanÛi form||de
la oriceminim normalizat
înv|Û|mânt | pentru num|r înpot
un bugetar
superior virgul | flotant
multiplica |;
acest
document F LTpentru uzul
_M I N _E XP - valoarea întreag| negativ| minim| astfel încât FLT _R AD IX
personal.
ridicat la acel num|r s| dea o valoarea care se poate reprezenta în virgul| flotant|;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplicaprezentate
documentul numai contra cost Õi cu acordul scris al în
autorului. În acest
Constantele pân | acum au format obiectul valorilor virgul| flotant | cu
scop
simplm| puteÛi contact|
| precizie (corespunz la:|toare tipului float). Cele care urmeaz| au aceleaÕi semnificaÛii
(Õi se pot identifica prin terminaÛia scris| în urma primului caracter und erscore , " _ ", din
ANTAL
nume; deTiberiu
exemplu, FLT_DIG Õi DBL_DIG au aceeaÕi semnificaÛie, dar valorile lor sunt
Alexandru
diferite. FLT _D IG = 6 , iar DB L_D IG = 15 ) cu cele prezentate deja cu diferenÛa c| sunt
tel.: 0040-264-530918
definite pentru valorile reprezentate în virgul| flotant| cu dubl| precizie (corespunz |toare
e-mail: antaltiberiu@pcnet.ro
tipului do ub le ): DB L_D IG , D B L _ E PS IL O N , D BL _ M ANT _D IG , D B L _ M A X ,
D B L_ M A X _E X P , DB L_M IN , D B L_ M IN _ EX P .

14.4 <limits.h>
Conf. dr. ing. ANTAL Tiberiu Alexandru
CH AR _B
Universitatea Tenhic| din|Cluj-Napoca
IT - num rul de biÛi dintr-un tip char;
Facultatea de MaÕinimaxim| pentru o variabil| de tipul char;
ConstrucÛii- valoarea
CHAR_MAX
Catedra de Mecanic| Õi Programare
CH AR _M IN - valoarea minim| pentru o variabil| de tipul char;
Curs de limbaj C
INT_MAX - valoarea maxim| pentru o variabil| de tipul int;
INT2001.
Copyright - valoarea
_M INToate minim
drepturile | pentru
sunt o variabil
rezervate | de tipul int;
autorului.
LONG_MAX - valoarea maxim| pentru o variabil| de tipul long;
Multiplicarea acestui document în scop comercial este interzis|.
LO NG _M IN - valoarea minim| pentru o variabil| de tipul long;
SCHAR_MAX - valoarea maxim| pentru o variabil| de tipul signed char ;
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
documentSC HA R_ Muzul
pentru valoarea minim| pentru o variabil| de tipul signed char ;
IN -personal.
SHRT_MAX - valoarea maxim| pentru o variabil| de tipul short ;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
SH RT _M IN - valoarea minim| pentru o variabil| de tipul short ;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
valoarea maxim| pentru o variabil| de tipul unsigned char ;
puteÛi contact|- la:
scop m|UCHAR_MAX
UC HA R_ M IN - valoarea minim| pentru o variabil| de tipul unsigned char ;
ANTAL Tiberiu Alexandru
UINT_MAX - valoarea maxim| pentru o variabil| de tipul unsigned long ;
tel.: 0040-264-530918
ULONG_MAX - valoarea minim| pentru o variabil| de tipul unsigned long ;
e-mail: antaltiberiu@pcnet.ro
USHRT_MAX - valoarea minim| pentru o variabil| de tipul unsigne d short ;

217
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca

14.5 <math.h>
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj
Din motive C biblioteca matematic| este definit| numai pentru tipul doub le . Toate
istorice
numele formate prin ad|ugarea unui f sau l numelui din <math.h> sunt rezervate pentru
aCopyright 2001. Toate de
permite specificarea drepturile
bibliotecisunt definiÛautorului.
rezervate
având ii Õi pentru tipurile float Õi long d ou ble .

Multiplicarea acestui document în scop comercial este interzis|.


14.5.1 FuncÛii trigonometrice
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document doub le sin (dou
pentru uzul ble x ); - sinus
personal.
doub le cos (dou ble x ); - cosinus
SudenÛii participanÛi
doub le tan (dou lable
orice
x ); form| de înv|Û|mânt
- tangenta cu plat|
are singularit|Ûi lasau alte persoane
multiplii doritoare
impari ai lui B /2 Õi
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului.
se apropie de valorile + 4 Õi - 4 la extremit|Ûile domeniului de definiÛie. Implement În acest
|rile
scop m| puteÛi
comune | s| reduc
prefercontact| la:| argumentul folosind cea mai bun| reprezentare a maÕinii
pentru B; pentru argumente foarte apropiate de singularit|Ûi reducerea poate conduce la
oANTAL
valoareTiberiu
de partea greÕit| a singularit|Ûii;
Alexandru
doub le asin (dou ble x ); - arcsinus, rezultatul este în domeniul [- B /2, B /2] Õi x 0 [-1,1];
tel.: 0040-264-530918
e-mail:doub
antaltiberiu@pcnet.ro
le ac os(d ou ble x ); - arccosinus, rezultatul este în domeniul [0, B ] Õi x 0 [-1,1];
doub le ata n(d ou ble x ); - arctangent|, rezultatul este în domeniul [- B , B ] .
doub le ata n2 (dou ble y, do ub le x); - funcÛia arctangent| ata n2 () este preluat| din
limbajul FORTRAN Õi corespunde lui arctan(y/x). Este bine definit| Õi pentru cazul în
care x=0 , dar nu Õi pentru cazul în care ambele argumente sunt nule; rezultatul este în
domeniul [- B , B ];
Conf. dr. ing. ANTAL Tiberiu Alexandru
doub le sin h(d ou
Universitatea Tenhic| x ); - sinus hiperbolic;
bleCluj-Napoca
din
Facultatea
doubConstrucÛii
le cos h(d oude MaÕini
ble x ); - cosinus hiperbolic;
Catedra de Mecanic| Õi Programare
doub le tan h(d ou ble x ); - tangent| hiperbolic|.
Curs de limbaj C

14.5.2 Funct-ii exponent-iale s- i logaritmice


Copyright 2001. Toate drepturile sunt rezervate autorului.
x
Multiplicarea
doub le acestui
ex p(dou ble x ); - e
document înlascop
x , ecomercial
; este interzis|.
doub le log(dou ble x ); - logaritm natural, ln(x) , x>0 ;
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
doub le log10(d ou ble x ); - logaritm zecimal, log 10(x) , x>0 ;
document pentru uzul personal.
y
doub le pow (dou ble x , dou ble y); - x la puterea y , x ; o eroare de domeniu apare
dac| x = 0participanÛi
SudenÛii Õi y # 0 sau la
dac | x<0form|
orice Õi y denuînv|Û|mânt
este întreg;cu plat| sau alte persoane doritoare
doub le documentul
pot multiplica sqr t(dou ble x ); - r|d
numai |cin| pcost
contra |trat
Õi|cu , x $ 0 . scris al autorului. În acest
, acordul
scop m| puteÛi contact| la:

14.5.3 Cel mai apropiat întreg, valoare


ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
absoluta7 , resturi
e-mail: antaltiberiu@pcnet.ro
doub le ceil(dou ble x ); - cel mai mic num|r întreg care nu este mai mic decât x ;
doub le floor(dou ble x ); - cel mai mare num|r întreg care nu este mai mare decât
x;

218
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
doub le fabs(d ou ble x ); - valoarea absolut| a lui x , |x|;
Facultatea ConstrucÛii de MaÕini
n
Catedra doub le lde xp (dou
de Mecanic| ble x , int n ); - întoarce x*2 ;
Õi Programare
Curs dedoublimbaj C (do ub le x , int* e xp ); - împarte pe x într-o fracÛie normalizat| în
le frexp
intervalul [1/2, 1] care este întors Õi o putere a lui 2 , care este stocat| în *exp . Dac| x = 0
ambele
Copyright rezultate sunt 0drepturile
2001. Toate ; sunt rezervate autorului.
doub le m odf(doub le x, dou ble *ip); - împarte un num|r x în partea întreag| Õi cea
fracÛionar|, fiecare
Multiplicarea acestui acelaÕi semn
cudocument în scop
al luicomercial
x . Partea este | este stocat| în *ip , iar partea
interzis|.
întreag
fracÛionar| este întoars|;
SudenÛii participanÛi
doub la orice
le fm od(dou ble xform| de yînv|Û|mânt
, dou ble superior
); - restul împar Ûirii bugetar
lui x la ypot multiplica
, mod(x,y) ; acest
document pentru uzul personal.

Func ÛiileparticipanÛi
SudenÛii frexp () , ldela () Õi form|
xporice m od f()desunt cu s-plat|
primitive
înv|Û|mânt i folosite de persoane
sau alte funcÛii din
celelalte doritoare
bibliotec | . Folosirea lor este problematic |
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În precizia
pe unele arhitecturi lde xp () pierzând acest
Õscop
i frexp () putând fi ineficient|.
m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


14.5.4 Tratarea condiÛiilor de eroare
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Macrodefinit -iile EDOM Õi ERANGE sunt constante întregi nenule folosite pentru
semnalarea erorilor de domeniu Õi de reprezentare. O eroare de domeniu apare atunci
când argumentul este în afara domeniului pentru care este definit| funcÛia. În cazul acesta
variabila errno ia valoarea EDOM . O eroare de reprezentare apare dac| rezultatul unei
funcÛii nu se poate reprezenta folosind tipul doub le . Dac| rezultatul a dus la o dep|Õire,
funcÛia în cauz| întoarce valoarea HUGE_VAL Õi errno primeÕte valoarea ERANGE . Dac|
rezultatul esteANTAL
Conf. dr. ing. o valoare prea mic
Tiberiu |, funcÛia întoarce valoarea 0 ; unele implement|ri pot
Alexandru
seta în acest caz errno la ERANGE .
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
14.6 <setjmp.h>
Curs de limbaj C

DeclaraÛiile2001.
Copyright din <setjmp.h> furnizeaz
Toate drepturile | orezervate
sunt metod| de evitare a secvenÛei normale de apel Õi
autorului.
revenire dintr-o funcÛie, tipic pentru a permite o revenire imediat| dintr-un apel de funcÛii
imbricate.
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi
int setjm p(jm p_la bu
orice
f en v); - salveaz
form| | informa
de înv|Û|mânt Ûia de stare
superior în env
bugetar potpentru a putea
multiplica acestfi
ulterior
document folosit | deuzul
pentru p() . Valoarea 0 este întoars| dac| apelul a fost direct Õi o valoare
personal.
lon gjm
diferit| de 0 dac| saltul s-a f|cut cu un apel ulterior al unui lon gjm p() .
SudenÛii participanÛi
void la orice
long jm p(jm p_ bu form| det înv|Û|mânt
f en v, in val); - refacecustarea
plat| sau alte persoane
programului | prin cel
doritoare
salvat
mai recent apel
pot multiplica al lui setjmnumai
documentul p() pe contra cost Õi Ûcu
baza informa ieiacordul
salvate scris
în env. ExecuÛia seÎnreia
al autorului. ca Õi
acest
când
scop m|setjm p() tocmai
puteÛi contact|s-ala:executat Õi a întors valoare nenul| pentru val. FuncÛia care
conÛine setjm p() nu a fost terminat|. Permite implementarea unui "goto" nelocal.
ANTAL Tiberiu Alexandru
1 tel.:JM
/* 0040-264-530918
P.C */
2 e-mail: antaltiberiu@pcnet.ro
#include<stdio.h>
3 #include<setjmp.h>
4
5 int valoare;
6 jmp _b uf sa ltaici;

219
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
7 void sa lt(void );
8
Facultatea ConstrucÛii de MaÕini
9
Catedra de Mecanic| Õi Programare
int main(void)
10 Curs
{ de limbaj C
11 va loar e=se tjmp(sa ltaici);
12 Copyright 2001. Toate
if (valoare != 0) drepturile sunt rezervate autorului.
13 {
14 Multiplicarea prin
acestui document
tf("Sa în scop
lt cu v aloa comercial
rea %d este e);
\n", va loar interzis|.
15 return valoare;
16 SudenÛii
} participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
17 document
prinpentru uzulsepersonal.
tf("Ac um a pele aza fun ctia salt()\n ");
18 salt();
return
19 SudenÛii 0;
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
}
20 pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
21 scop m| puteÛi contact| la:
22 void salt(void)
23 {ANTAL Tiberiu Alexandru
24 longjm p(sa ltaici,0);
tel.: 0040-264-530918
25 }
e-mail: antaltiberiu@pcnet.ro

Rezultate:
Acum se apeleaza functia salt()
Salt cu valoarea 1

Conf. dr. 7ing.


Remarca : Aceste
ANTALrutine sunt utile
Tiberiu când se trateaz| erori sau excepÛii ap|rute în funcÛii
Alexandru
de nivel foarte jos ale unui program.
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
14.7 <signal.h>
Curs de limbaj C

Antetul <signal.h>
Copyright asigur
2001. Toate | facilitasunt
drepturile Ûi pentru tratarea
rezervate condiÛiilor excepÛionale care apar în
autorului.
cursul execuÛiei programului. De exemplu, apariÛia unui semnal de întrerupere de la o
surs| extern| acestui
Multiplicarea sau apari Ûia unei erori
document în cursul
în scop execu
comercial Ûieiinterzis|.
este programului.

SudenÛii participanÛi
void la orice
(*signal(int form|
sig, void de înv|Û|mânt
(*hand superior
ler)(int)))(int); bugetar
- instaleaz | opot multiplica
rutin acesta
| de tratare
document
erorilor pentru pentru
software uzul personal.
semnalul sig , aceasta determinând modul în care vor fi tratate
semnalele ulterioare. Dac| handler ia valoarea SIG_DFL se foloseÕte rutina de tratare
definit
SudenÛii| prin implementare,
participanÛi la oriceiar dac|de
form| handler ia valoarea
înv|Û|mânt sau altesemnalul
SIG_IGN
cu plat| persoaneeste ignorat;
doritoare
altfel, func Ûia poantat | de handler este apelat | cu argumentul sig .
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acestsig na l() întoarce
valoarea anterioar
scop m| puteÛi | a luila:
contact| handler pentru semnalul specific sau SIG_ERR în caz de eroare.
Când apare un semnal sig ulterior, semnalul este ref|cut la starea implicit|. Dac| se
revine din rutina de tratare a erorii execuÛia se reia din locul în care a ap|rut semnalul.
ANTAL Tiberiu Alexandru
Starea iniÛial| a semnalelor este definit| prin implementare. Valori permise pentru
tel.: 0040-264-530918
semnale sunt:
e-mail: antaltiberiu@pcnet.ro
SIGABRT - terminare anormal|, de exemplu cu ab ort() ;
SIGFPE - eroare aritmetic|, de exemplu împarÛire cu zero sau dep|Õire;
SIGILL - imagine ilegal| de funcÛie, de exemplu o instrucÛiune ilegal|;
S IG IN T - atenÛionare interactiv|, de exemplu o întrerupere;
220
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
SIGSEGV - acces ilegal la o zon| de RAM, de exemplu accesul este în afara
Facultatea ConstrucÛii de MaÕini
limitelor memoriei;
Catedra de Mecanic| Õi Programare
Curs de limbajSIGTERM
C - cerere de terminare transmis| programului.
int rais e(int sig); - transmite semnalul sig programului, întoarce o valoare nenul|
în caz de insucces.
Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


14.8 <stdarg.h>
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
Antetul pentru uzul
<stdarg.h> | facilit|Ûi pentru parcurgerea listei argumentelor unei funcÛii,
personal.
asigur
în cazul în care nu se cunoaÕte num|rul Õi tipul acestora.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
void va _start(v a_ list ap , lasta rg); - macro pentru iniÛializare care trebuie apelat
scop m| puteÛi contact| la:
înainte de accesarea oric|rui argument necunoscut. ap trebuie declarat| ca Õi o variabil|
local| de tipul va_list , lastarg este numele ultimului parametru cunoscut al funcÛiei;
ANTAL Tiberiu Alexandru
type va _a rg(v a_ list ap , type ); - întoarce o valoare de tipul type Õi de valoarea
tel.: 0040-264-530918
urm|torului argument f|r| nume. Modific| ap aÕa încât urm|toarea folosire a lui va _a rg()
e-mail: antaltiberiu@pcnet.ro
va întoarce urm|torul argument;
void va _e nd (va_list ap); - trebuie apelat| o dat| dup| prelucrarea tuturor
argumentelor, s- i apoi înc| o dat| înaintea termin|rii funcÛiei.

14.9 <stdio.h>
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Un flux (stream
Facultatea ) este ode
ConstrucÛii surs | sau o destinaÛie de date care poate fi asociat| unui periferic
MaÕini
(disc, tastatur | , monitor
Catedra de Mecanic| Õi Programare etc.). Multe dintre implement|rile bibliotecilor C (mai ales sub
sistemul de operare UNIX) asigur|, pe lâng| funcÛiile standard de I/E (fop en (), fclo se() ,
Curs de limbaj C
fread () , fw rite () , fse ek () ), o mulÛime de servicii de I/E nebuffer-ate (open () , clos e() , rea d() ,
w rite () , lseek () ). Comitetul de standardizare a decis s| nu standardizeze acest grup de
Copyright 2001. Toate
funcÛii. Biblioteca drepturile
asigur sunt
| lucrul cu rezervate
fluxuri autorului.
de text Õi binare , deÕi sub unele sisteme de
operare, între acestea nu sunt diferenÛe. Un flux de text este o secvenÛ| de linii, o linie
este format| din
Multiplicarea acestuizero,document
unul sauînmai multe
scop caractere
comercial Õi se termin| prin '\n'. În unele
este interzis|.
contexte este necesar| conversia unui flux de caractere de la o reprezentare la alta, de
exemplu caracterul '\n'
SudenÛii participanÛi la se
orice form|Õte
converte deîn caracterelesuperior
înv|Û|mânt carriage Õi line
returnpot
bugetar feed . Unacest
multiplica flux
binar este o secven Û|
document pentru uzul personal. neprelucrat | de octe Ûi care se stocheaz | într-un format intern cu
proprietatea c| dac| acestea sunt scrise Õi apoi citite pe acelaÕi sistem, compararea celor
dou| secvenÛe de date va conduce la egalitate. Un flux este conectat la un dispozitiv în
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
urma operaÛiei numite deschiderea fluxului, iar conexiunea este întrerupt| prin operaÛia
pot
numitmultiplica
| închiderea documentul numai contra cost Õi cu acordul scris al autorului. În acest
fluxului . Deschiderea unui fiÕier întoarce un poantor la un obiect de
scop m| puteÛi contact| la:
tipul FILE care stocheaz| toate informaÛiile necesare pentru controlarea fluxului. NoÛiunile
de poantor la fiÕier Õi flux sunt echivalente. La începerea execuÛiei unui program fluxurile
ANTAL
stdin , stdout Õi stderr
Tiberiu sunt deschise automat.
Alexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Concepte privitoarea la fluxuri care pun probleme:
Definit-ia liniei: În UNIX, gruparea unui fi Õier în linii se face sub efectul caracterului
newline ('\n'). Tehnicile folosite în acest scop sunt dependente de sistemul de operare, de
exemplu liniile pot fi separate prin caracterele carriage return Õi line feed , prin porÛiuni
neînregistrate ale mediului de stocare sau prin prefixarea liniei prin lungimea acesteia.
221
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
În aceast| diversitate
standardConstrucÛii
Facultatea de MaÕinide tehnici este referit| specificând c| newline este folosit
ca separator de linie la nivelul
Catedra de Mecanic| Õi Programare programului, îns| în funcÛie de convenÛiile mediului pe care
se face rularea, o implementare particular| poate transforma acest caracter, la citire sau
Curs de limbaj
la scriere, C unor convenÛii particulare de mediu.
conform
Transparent
Copyright 2001. -a: Unele
Toateprograme
drepturilenecesit | accesul autorului.
sunt rezervate la surse de date externe care nu suport|
modific|ri. De exemplu, transformarea caracterelor carriage return Õi line feed în
caracterul newline este interzis| în cazul prelucr|rii unui cod obiect. Standardul defineÕte
Multiplicarea
din acest motiv acestui document
cele dou | tipuri în
descop comercial
fluxuri, cel texteste interzis|.
Õi cel binar, pentru a permite ca un
program s| specifice dac| la deschiderea unui fiÕier conÛinutul acestuia va fi p|strat exact
sau dac| participanÛi
SudenÛii organizarealadatelor
orice form| de înv|Û|mânt
sub forma superior
liniilor este bugetar |pot
mai important multiplica
întrucât acest
mediul nu
poate
documentreflecta
pentrucu acurate Ûe simultan ambele tr|s|turi.
uzul personal.
Accesul aleator: Modelul de I/E UNIX asigur| accesul aleator la datele unui fiÕier,
SudenÛiiprin
indexat participanÛi
num|rulla deorice form|
ordine de înv|Û|mânt
al caracterului. Pe cu plat| unde
sisteme sau alte persoanenewline
caracterul doritoare
este
multiplica documentul numai contra cost Õi
prelucrat de program, devenind un num|r necunoscut de caractere fizice acest mecanism
pot cu acordul scris al autorului. În acest
scop m| nu
simplu îÕi contact|
puteÛi p|streazla:
| consistenÛa dac| fluxul este de tipul text. Standardul
abstractizeaz| propriet|Ûile semnificative ale accesului aleator la fluxurile de text de
exemplu posibilitatea
ANTAL Tiberiu determin|rii poziÛiei curente într-un fiÕier unde, prin repoziÛionare,
Alexandru
tel.: 0040-264-530918 târziu. În acest scop ftell() întoarce indicatorul de pozit-ie în fis- ier,
se va putea reveni mai
care
e-mail: o semnificat-ie corecta7 numai daca7 este interpretat de fse ek (). Având ca valoare
areantaltiberiu@pcnet.ro
acest indicator, fse ek () va realiza repoziÛionarea în fiÕier în acelaÕi loc. Astfel, o
implementare poate sa7 codifice informaÛia de poziÛionare corespunz|toare unui fiÕier text
cât mai bine, singura constrângere fiind aceea c| ea trebuie s| poat| fi reprezentata7 ca o
valoare long . Folosirea funcÛiilor fge tpos() Õi fse tpo s() elimin| chiar Õi aceast|
constrângere.
Buffer-are: UNIX permite controlul extinderii Õi al tipului de buffere din mai multe
Conf.
motive. dr.De
ing. ANTALun
exemplu, Tiberiu
programAlexandru
poate avea propriul lui buffer de I/E pentru a creÕte
Universitatea
performan ÛeleTenhic| dinrealiza
sau poate Cluj-Napoca
prelucrarea nebufferat| a caracterelor unui terminal de
Facultatea
I/E care cite Õte caraterul
ConstrucÛii imediat cum este introdus. Unele sisteme asigur| accesul
de MaÕini
Catedra la
exclusiv dedatele
Mecanic| Õi Programare
terminalului de intrare la nivel de linie, altele permit lucrul cu buffer-e
alocate
Curs deînlimbaj
program C numai prin copierea datelor din sau în buffer-ele alocate de sistemul
de operare. În standard buffer-ele sunt manipulate prin funcÛiile setbu f() Õi setvb uf() care
asigur | o gam
Copyright | mare
2001. Toatede facilit|Ûi. sunt rezervate autorului.
drepturile

Multiplicarea acestui document în scop comercial este interzis|.


14.9.1 Constante
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
FILE - tip care stocheaz| informaÛiile necesare pentru controlul unui flux;
document pentru uzul personal.
stdin - fluxul standard de intrare; deschis automat la începutul execuÛiei unui
program;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
stdout -documentul
pot multiplica fluxul standard
numaide ieÕire;
contra deschis
cost automatscris
Õi cu acordul la începutul ÎnÛiei
execu
al autorului. unui
acest
program;
scop m| puteÛi contact| la:
stderr - fluxul standard de eroare; deschis automat la începutul execuÛiei unui
program;
ANTAL Tiberiu Alexandru
FILENAME_MAX - lungimea maxim| permis| pentru un nume de fiÕier;
tel.: 0040-264-530918
e-mail:FOPEN_MAX
antaltiberiu@pcnet.ro
- num|rul maxim de fi Õiere care pot fi deschise simultan;
TMP_MAX - num|rul maxim de fiÕiere temporare care pot fi deschise în timpul
execuÛiei unui program.

222
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
14.9.2 Funct-ii pentru operat-ii cu fis- iere
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Tipul size_t
Curs de limbaj C unul întreg, f|r| semn întors de operatorul sizeof.
este

Copyright 2001. Toate drepturile sunt rezervate autorului.


FILE* fope n(co nst cha r* filen am e, con st ch ar* m ode); - deschide un fiÕier Õi
întoarce un flux sau NULL dac| operaÛia nu reuÕeÕte. Modurile (sau combinaÛiile) corecte
Multiplicarea
pentru acestui document în scop comercial este interzis|.
mode sunt:
"r" - deschide un fiÕier text pentru citire;
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
"w " - creeaz| un fiÕier text pentru scriere; dac| acesta exist| deja,
document pentru uzul personal.
conÛinutul lui este Õters;
"a" - mod
SudenÛii participanÛi la orice |ugare;
de adform| de scrierea
înv|Û|mânt se face începând
cu plat| cu sfâr
sau alte Õitul fidoritoare
persoane Õierului;
pot multiplica"r+" - deschide
documentul numai Õier text
un ficontra în Õi
cost modul de actualizare
cu acordul (citire sau În
scris al autorului. scriere);
acest
scop m| puteÛi"w+"
contact| la: | un fiÕier text pentru actualizare; dac| acesta exista7 deja,
- creeaz
conÛinutul lui se Õterge;
ANTAL Tiberiu Alexandru
"a+" - mod de ad|ugare; fiÕierul este deschis sau creat pentru actualizare,
tel.: 0040-264-530918
iar scrierea se face la sfârÕitul lui.
e-mail: antaltiberiu@pcnet.ro

Modul de actualizare permite citirea Õi scrierea aceluiaÕi fiÕier. fflus h() sau o funcÛie
pentru poziÛionare (fsetpos() , fse ek (), rew ind() ) trebuie apelat| între o citire Õi o scriere
sau invers. Dac| modul include b dup| litera iniÛial|, de exemplu "rb" sau "w+b", fiÕierul
este prelucrat în modul binar.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
FILE* freopen(const char* filenam e, const char* mode, FIL E* s trea m ); - deschide
fi Õierul cu numele
Facultatea ConstrucÛii e în modul mode Õi îi asociaz| un flux. Întoarce fluxul sau NULL
demMaÕini
file na
în cazul unei
Catedra erori. freopen
de Mecanic| () se foloses
Õi Programare - te de obicei pentru a schimba fiÕierele asociate lui
stdin , stdout
Curs de limbaj C sau stderr .
int fflu sh(F ILE * stream ); - pentru un flux de ieÕire, face ca toate buffer-ele care
con Ûin înc| 2001.
Copyright date nescrise s| fie scrise
Toate drepturile suntpe flux; efectul
rezervate este nedefinit în cazul unui flux de
autorului.
intrare. În caz de eroare întoarce EOF , altfel 0 . flush(NULL) goleÕte toate fluxurile de
ie Õire.
Multiplicarea acestui document în scop comercial este interzis|.
int fclose(FIL E* s trea m ); - închide un flux dup| ce în prealabil l-a golit de toate
datele
SudenÛii care înc| nu aulafost
participanÛi oricescrise
form|Õi adedezalocat
înv|Û|mânt Ûiul folositbugetar
spasuperior pentrupot buffer-ele acestuia.
multiplica acest
Întoarce EOF în caz de
document pentru uzul personal. eroare sau altfel 0 .
int remove(const char* filen am e); - Õterge fiÕierul cu numele file na m e. Întoarce
oSudenÛii nenul| în caz
valoareparticipanÛi la de eroare;
orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul
int ren am e(con st ch numai contra
ar* oldn am e,cost Õistcuch
con acordul
ar* new scris ale);autorului.
na m - schimbÎn
| acest
numele
fiÕierului de la o ld na m e la n ew n am e . Întoarce o valoare nenul| în caz de eroare;
scop m| puteÛi contact| la:
FILE* tm pfile (); - creeaz| un fiÕier temporar (mode este "wb +" ) care va fi automat
ANTAL
Õters la Tiberiu
închidere Alexandru
sau dac| programul se termin| normal. tm pfile() întoarce fluxul,
tel.: 0040-264-530918
respectiv NULL în caz de eroare;
e-mail: antaltiberiu@pcnet.ro
char* tm pn am e(ch ar s [L_tm pn am ]); - creeaz| un Õir s care conÛine un nume de
fiÕier unic (numele respectiv nu mai exist|) Õi întoarce un poantor la Õirul cu legare intern|
s- i persistent-a7 static . Ôirul este stocat în s Õi trebuie s| aib| spaÛiu pentru stocarea a cel
puÛin L_tmpnam caractere. tm pn am e() genereaz| câte un nume diferit pentru fiecare
apel, cel mult TMP_MAX nume diferite fiind garantate în timpul execuÛie programului.
223
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
int setvbuf(FIL E* s trea m , cha r* bu f, int m ode, size _t size); - asigur| controlul
Facultatea ConstrucÛii de MaÕini
buffer-elor
Catedra de pentru
Mecanic| flux. Trebuie apelat| înainte de orice operaÛie (citire, scriere etc.) cu
Õi Programare
fluxul. Dac| mode ia valoarea _IOB UF buffering-ul este complet, pentru _IOLBF
Curs de limbaj
buffering-ul C | numai pentru fiÕierele text, iar pentru _IONBF nu se face buffering.
exist
Dac| buf nu este NULL va fi folosit ca Õi buffer. size determin| m|rimea buffer-ului.
Copyright 2001. Toate
setbu f() întoarce valoaredrepturile
nenul| însunt
caz rezervate
de eroare;autorului.
void setbuf(F ILE * stream , cha r* bu f); - dac| buf este NULL buffering-ul este
Multiplicarea acestui
dezactivat pentru flux.document în scop
Altfel, setbuf() comercial
este este
echivalent cuinterzis|.
void setbuf(stream, buf, _IOFBF,
BU FS IZ);
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
14.9.3 Funct-ii pentru ies- ire cu format
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
int fprin
pot multiplica tf(FIL E* s trea
documentul numaim , con st chcost
contra Õi rm
ar* fo cu at, ...); - converte
acordul Õte Õi scrieÎn
scris al autorului. ieÕacest
irea pe
fluxul stream sub controlul
scop m| puteÛi contact| la: lui format . Valoarea întoars | este num | rul caracterelor scrise
sau o valoare negativ| în caz de eroare. Ôirul format conÛine dou| tipuri de obiecte:
caractere nor m ale , care sunt copiate pe fluxul de ieÕire Õi specificatori de conversie ,
ANTAL Tiberiu Alexandru
fiecare dintre aceÕtia cauzând conversia Õi scrierea argumentului corespunz|tor din
tel.: 0040-264-530918
fpr intf() . Specificatorii de conversie încep cu % Õi se termin| într-un caracter de conversie.
e-mail:
Între % antaltiberiu@pcnet.ro
Õi caracterul de conversie pot s| apar| urm|toarele caractere în orice ordine:
Ind icatori (F lags):
-, aliniere la stânga;
+ , afiÕare a semnului întotdeauna;
spa Ûiu , spaÛiu dac| primul caracter al num|rului nu este un semn;
Conf. dr. ing. ANTAL Tiberiu Alexandru
0 , zerouri de aliniere a num|rului, pentru uÕurarea prelucr|rilor numerice;
Universitatea Tenhic| din Cluj-Napoca
# , modificatori
Facultatea ConstrucÛii de form|: pentru caracterul de conversie 0 , prima cifr| va
de MaÕini
fi zero, pentru
Catedra de Mecanic| Õi Programare [x X ] prefixul va fi 0x sau 0X , pentru [eEfgG] se va folosi în
Curs de limbaj C rezultat întotdeauna punctul zecimal, pentru [gG] zerourile nesemnificative
nu sunt afiÕate.
La
Copyright 7 t-im e : un
2001. Toate |r care specific
numdrepturile | num|rul
sunt rezervate minim de caractere ale unui câmp.
autorului.
Argumentul care este convertit va fi afiÕat într-un câmp cu l|Ûimea (num|rul de
caractere)
Multiplicarea acestui puÛin egal|însau
cel document scopmai mare decât
comercial valoarea acestui num|r. Dac| în
este interzis|.
urma conversiei argumentul are mai puÛine caractere decât lungimea câmpului
valoarea va fi aliniat| la stânga (sau la dreapta dac| se foloseÕte indicatorul - )
SudenÛii participanÛi
pentru a ocupa la întreg
orice form|
spaÛiuldede
înv|Û|mânt
caracteresuperior bugetar
specificate prin pot
La7 t-multiplica acest
im e . Caracterul
document pentru
folosit pentruuzulumplere
personal. este spat-iu , dar poate fi Õi caracterul 0 dac| indicatorul 0
este prezent;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Pun ct : separ| l|Ûimea de lungimea unui câmp;
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
cizie : un num|r care specific| num|rul maxim de caractere care sunt afiÕate
scop m|PreputeÛi contact| la:
dintr-un Õir sau num|rul de zecimale care sunt afiÕate dup| punctul zecimal pentru
[eEf] sau num|rul de cifre semnificative pentru [gG], sau pentru un întreg num|rul
ANTAL Tiberiu
minim de Alexandru
cifre care vor fi afiÕate (zerouri pot fi afiÕate în faÛa întregului dac| se
tel.: 0040-264-530918
foloseÕte indicatorul corespunz|tor).
e-mail: antaltiberiu@pcnet.ro
M odificatori de lungime:
h, argumentul va fi afiÕat ca short sau ca unsigne d short ;
l sau L , argumentul va fi afiÕat ca long sau ca unsigned long ;

224
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
La prec izie pot fi specificate prin * , caz în care valorile se calculeaz| prin
7 t-im e sauConstrucÛii
Facultatea de MaÕini
conversia argumentului corespunz|tor caracterului * a c|rui valoare trebuie s| fie
Catedra de Mecanic| Õi Programare
obligatoriu de tipul int.
Curs de limbaj C

Caractere
Copyright 2001. Toate drepturile suntde conversie
rezervate fpr intf() :
autorului.
Caracter acestui
Multiplicarea Tip argument
document în scop comercial este interzis|.- te la
se convertes
d, i int notaÛie zecimal| cu semn.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
o
document pentruintuzul personal. notaÛie octal| f|r| semn.

x, X int notaÛie hexazecimal| f|r| semn.


SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
u multiplica documentul
pot int numainotaÛie zecimal
contra | f|acordul
cost Õi cu r| semn.scris al autorului. În acest
scop
c
m| puteÛi contact|
int
la: un singur caracter, dup| conversie la usigned char .
s
ANTAL Tiberiuchar *
Alexandru caracterele Õirului, afiÕarea continu| pân| la
tel.: 0040-264-530918 atingerea lui '\0' sau pân| când num|rul maxim de
e-mail: antaltiberiu@pcnet.ro caractere de afiÕat a fost atins.
f doub le notaÛia de forma [-]mmm.ddd unde d-urile sunt
specificate prin prec izie . Precizia implicit| este 6 ,
precizia 0 suprim| punctul zecimal.
e, E doub le notaÛia de forma [-]m.dddddde(+|-)xx unde
num|rul d-urilor este specificat prin prec izie .
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea
g, G Tenhic| %e sau %E sunt folosiÛi dac| exponentul este mai mic
doub le din Cluj-Napoca
Facultatea ConstrucÛii de MaÕinidecât -4 sau mai mare sau egal cu precizia, altfel
Catedra de Mecanic| Õi Programare se foloses- te %f . Zerourile nesemnificative Õi punctul
Curs de limbaj C zecimal nu se afiÕeaz|.
p void * afiÕarea de poantor.
Copyright 2001. Toate drepturile sunt rezervate autorului.
n int * num|rul de caractere scrise pân| în acel moment de
printf() este scris în argument. Nu se realizeaz|
Multiplicarea acestui document în scop comercial este interzis|.
conversia argumentului.
SudenÛii
% afiÕde
participanÛi la orice form| area caracterului
înv|Û|mânt %.
superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii int prin tf(con st


participanÛi lach ar* form|
orice form at,
de...); - printf(f,cu
înv|Û|mânt este echivalent
...)plat| | cu fprintf(std
sau alte persoane doritoareou t,
f, ...);
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|int sprintf(char*
puteÛi contact| la: s, const cha r* for m at, ...); - lucreaz| ca fpr intf() , cu excepÛia c|
ieÕirea este scris| în Õirul s terminat în '\0'. s trebuie s| fie suficient de lung pentru a
putea
ANTAL stoca rezultatul.
Tiberiu Valoarea întoars| este num|rul de caractere f|r| '\0'.
Alexandru
tel.: 0040-264-530918
int v fprintf(F ILE * stream , con st ch ar* fo rm at, va _list arg );
e-mail:int antaltiberiu@pcnet.ro
vp rin tf(co ns t char* for m at, v a_ list a rg);
int vsprintf(ch ar* s, co ns t char* for m at, v a_ list a rg);

FuncÛiile vp rin tf() , vfp rin f() Õi vsprintf() sunt echivalente cu funcÛiile corespunz|toare
225
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
printf() , cu excepÛia c| lista variabil| de argumente este înlocuit| prin arg , care a fost
Facultatea ConstrucÛii de MaÕini
ini Ûializatde
Catedra | folosind
Mecanic| macrodefinit -ia va_start , eventual prin apeluri ale lui va_a rg .
Õi Programare
Curs de limbaj C

14.9.4
Copyright 2001. Toate-drepturile
Funct ii pentru intrare
sunt rezervate cu format
autorului.
int fsca nf(F ILE * stream , con st ch ar* fo rm at, ...); - citeÕte de pe fluxul stream sub
Multiplicarea
controlul acestuiÕdocument
lui format în scop comercial
i atribuie valorile convertiteeste interzis|. care urmeaz|, fiecare
argumentelor
dintre acestea trebuind s| fie un poantor. Revenirea se face când s-a epuizat format .
fscan f() întoarce
SudenÛii valoarea
participanÛi F dac|
E Oform|
la orice des-a întâlnit sfâr
înv|Û|mânt Õitul fibugetar
superior Õierului pot dac| a ap|acest
sau multiplica rut o
eroare. Altfel întoarce
document pentru uzul personal. num | rul de articole convertite Õi atribuite. Ô irul format poate
conÛine:
SudenÛii ! participanÛi
spat- ii , la
tab -uri: form|
orice de|înv|Û|mânt
se ignor , acestea faccuparte
plat|dintre
sau altecaracterele
persoane albe (w hite
doritoare
pot multiplicaspace = spa Ûnumai
documentul iu , tabcontra
, new-line
cost, Õi
carriage return
cu acordul , vertical
scris tab , formfeed
al autorului. În acest );
scop m|!puteÛicaractere
contact| la: nor m ale : care trebuie s| fie identice cu urm|torul caracter ne-
alb;
ANTAL !Tiberiu% :Alexandru
spec ificatori d e con vers ie formaÛi din % , un caracter opÛional pentru
tel.: 0040-264-530918
suprimarea atribuirii, un num|r opÛional specificând l|Ûimea maxim| a
câmpului, unul dintre caracterele opÛionale [hlL] indicând m|rimea
e-mail: antaltiberiu@pcnet.ro
destinaÛiei, Õi un caracter de conversie. Un câmp de intrare se defineÕte ca
un Õir de caractere ne-albe Õi Ûine pân| la urm|torul caracter alb sau, în
cazul în care este specificat, este determinat de l|Ûimea câmpului. Un
caracter de conversie determin| conversia urm|torului câmp de intrare. În
condiÛii normale, rezultatul este plasat în variabila poantat| de argumentul
corespunz|tor. Dac| argumentul specific| suprimarea atribuirii prin * , de
Conf. dr. ing. ANTAL
exemplu Tiberiu Alexandru
%*s câmpul de intrare este s|rit f|r| a se face atribuirea.
Universitatea Tenhic|
Caracterul din de
Cluj-Napoca
conversie specific| modul de interpretare a câmpului de
Facultatea ConstrucÛii de MaÕini
intrare. Caracterele de conversie [dinoux] pot fi precedate de h dac|
Catedra de Mecanic|
argumentul Õi Programare
este un poantor short , Õi nu unul int, sau de l dac| argumentul
Curs de limbajeste C un poantor long . Caracterele de conversie [efg] pot fi precedate de l
dac| argumentul este un poantor la doub le , în locul unuia float, sau de L
Copyright 2001. | poantorul
dacToate estesunt
drepturile la long
rezervate .
d oubleautorului.

Multiplicarea acestui document în scop


Caractere decomercial
conversieestefscan
interzis|.
f() :

Caracter
SudenÛii Tip argument
participanÛi Data de bugetar
la orice form| de înv|Û|mânt superior intrare pot multiplica acest
document pentru uzul personal.
d int * întreg zecimal.
SudenÛii
i participanÛi
int * la orice form| de înv|Û|mânt
întregul cu plat|
poate fi în octal sau alte
(începe cu 0persoane
) sau în doritoare
pot multiplica documentul numai hexazecimal Õi cu acordul
contra cost(începe cu 0x sau al).autorului. În acest
scris0X
scop m| puteÛi contact| la:
o int * întreg octal, cu sau f|r| 0 la început.
ANTAL
x Tiberiu
int Alexandru
* întreg hexazecimal cu sau f|r| 0x la început.
tel.: 0040-264-530918
u un sign ed int* întreg zecimal f|r| semn.
e-mail: antaltiberiu@pcnet.ro

226
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
c ConstrucÛii
char * de MaÕiniurm|toarele caractere de intrare sunt plasate în
Catedra de Mecanic| Õi Programare tabloul indicat pân| se atinge l|Ûimea de caractere
Curs de limbaj C specificata7 (implicit aceasta este 1 ). Nu se adaug| '\0'.
Saltul normal peste caracterele albe este inhibat,
Copyright 2001. Toate drepturile pentru
sunt citirea urm
rezervate |torului caracater ne-alb se foloseÕte
autorului.
%1s .

Multiplicarea
s char * documentÕir
acestui în de
scop comercial
caractere (f|r| ghilimele). Argumentul
este interzis|.
ne-albe
va poanta la un tablou de caractere suficient de mare
pentru
SudenÛii participanÛi la orice form| de stocarea Õirului
înv|Û|mânt Õi a terminatorului
superior '\0' care acest
bugetar pot multiplica va
document pentru uzul personal. fi ad | ugat automat.
e, f, g float * num|r în virgul| flotant|. OpÛional, acesta poate
SudenÛii participanÛi la orice form| de înv|Û|mânt
conÛine semn, un Õircudeplat| sau alte
numere carepersoane
pot sau nudoritoare
sa7
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului.
conÛina7 punctul zecimal sau un exponent opÛional În acest
scop m| puteÛi contact| la: conÛinând e sau E , urmat de un num|r întreg cu semn.
p
ANTAL Alexandru valoare de poantor, aÕa cum este afiÕat| de
void *
Tiberiu
printf("%p") .
tel.: 0040-264-530918
e-mail:
n antaltiberiu@pcnet.ro
int * scrie în argument num|rul de caractere citite pân| în
acel moment de apelul funcÛiei. Nu se citeÕte nimic de
pe intrare. Num|rul articolelor convertite nu este
incrementat.
[...] char * caracterele din interiorul parantezelor
dreptunghiulare definesc o mulÛime de c|utare pentru
caracterele posibile în câmpul de intrare Õi diferite de
Conf. dr. ing. ANTAL Tiberiu Alexandru
Õirul vid. '\0' este ad|ugat automat la mulÛime.
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
[^...] char * caracterele din interiorul parantezelor
Catedra de Mecanic| Õi Programare
dreptunghiulare definesc o mulÛime de c|utare pentru
Curs de limbaj C caractere care nu pot face parte din câmpul de intrare
Õi sunt diferite de Õirul vid. '\0' este ad|ugat automat la
Copyright 2001. Toate drepturile Ûime.rezervate autorului.
mulsunt
%
Multiplicarea%
înÕarea
acestui documentafi scop caracterului %.
comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int scan f(con st ch ar* form at, ...); - scanf(f, ...) este echivalent| cu fscanf(stdin, f,
document
...) pentru uzul personal.
int ssca nf(ch ar* s, con st ch ar* form at, ...); echivalent| cu fscan f() , numai c|
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
intrarea este stocat| în Õirul s .
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

14.9.5
ANTAL Tiberiu Funct -ii de intrare/ies- ire la nivel de
Alexandru
caracter
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
int fgetc (FIL E* s trea m ); - întoarce urm|torul caracter de pe fluxul stream ,
convertit la un întreg de tipul unsigned char sau EOF în caz de eroare, respectiv la
terminarea fiÕierului.
char* fgets(char* s, int n , FILE* s trea m ); - citeÕte cel mult n-1 caractere de pe
227
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
stream în Õirul s , oprindu-se la întâlnirea caracterului newline . Caracterul newline este
Facultatea ConstrucÛii de MaÕini
inclus
Catedra în de
s care se termina 7 în '\0'; întoarce s sau NULL în caz de eroare, respectiv la
Mecanic| Õi Programare
terminarea fiÕierului.
Curs de limbaj C
int fpu tc(int c , FILE* s trea m ); - scrie pe c , convertit la unsigned char pe stream .
Întoarce
Copyrightcaracterul
2001. Toate scris sau EOFsunt
drepturile în caz de eroare.
rezervate autorului.
char* fpu ts(con st ch ar* s, FIL E* s trea m ); - scrie Õirul s care nu trebuie s| conÛin|
caracterul
Multiplicarea pe fluxul
'\n' acestui stream . În
document în caz
scopdecomercial
succes întoarce o valoare nenul|, respectiv EOF
este interzis|.
în caz contrar.
SudenÛii participanÛi
int getc (FIL E* la orice
s trea - echivalent
form|
m ); | cu fgetc(),
de înv|Û|mânt cu excep
superior Ûia faptului
bugetar c| poateacest
pot multiplica fi un
macro; poate evalua stream
document pentru uzul personal. de mai multe ori.
int g etch ar(); - echivalent| cu getc(stdin).
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
char* gets (cha r* s); - citeÕte urm|toarea linie de pe stdin în s . ÎnlocuieÕte
pot multiplica documentul
caracterul terminator numaicucontra
newline cost Õi cu sacordul
'\0'; întoarce scris la
sau NULL al autorului.
terminareaÎnfiÕacest
ierului
scop m| puteÛi
respectiv în cazcontact|
de eroare.la:
int putc(int c, FIL E* s trea m ); - echivalent| cu fpu tc() cu excepÛia faptului c| poate
ANTAL Tiberiu
fi un macro, poate Alexandru
evalua pe stream de mai multe ori.
tel.: 0040-264-530918
p utcha r(int c); - este echivalent| cu pu tc(c, std ou t) .
e-mail:intantaltiberiu@pcnet.ro
int pu ts(con st ch ar* s); - scrie pe s Õi un caracter newline pe stdo u t; întoarce o
valoare nenegativ| în caz de succes, respectiv EOF în caz contrar.
int unget(int c, FILE* strea m ); - îl împinge pe c , care trebuie s| fie diferit de EOF ,
convertit la unsignd char pe stream , aÕa încât acesta va fi întors la urm|toarea citire.
Este garantat| împingerea pe stream numai a unui singur caracter; întoarce c sau EOF
în caz dr.
Conf. de eroare.
ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
14.9.6 Funct-ii de intrare/ies- ire directe
Catedra de Mecanic| Õi Programare
Curs de limbaj C
size_ t frea d(void * ptr, size_ t size, size_ t nob j, FILE * stream ); - citeÕte cel mult nobj
obiecte cu dimensiunea size de pe fluxul stream în ptr. Întoarce num|rul de obiecte citite.
FuncÛiile feo
Copyright f() ÕiToate
2001. ferrordrepturile sunt rezervate
() trebuie folosite determinarea st|rii.
pentru autorului.
size_t fwrite(const void* ptr, size_t size, size_ t nob j, FILE * stream ); - scrie pe fluxul
Multiplicarea acestuicu
stream nobj obiecte document în scop
dimensiunea sizecomercial este interzis|.
dintr-un tablou ptr. Întoarce num|rul de obiecte
scrise care nu va fi mai mic ca nobj decât în caz de eroare.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
14.9.7 Funct-ii de pozit-ionare
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
int fseedocumentul
pot multiplica k(F ILE * stream
numai , long offsecost
contra Õi origin
t, int cu acordul scris |alpozi
); - seteaz Ûia în fiÕÎn
autorului. ieracest
pentru
fluxul stream . Pentru
scop m| puteÛi contact| la: un fi Õier binar pozi Ûia este setat | printr-un deplasament de
caractere faÛ| de origine, care poate fi SEEK_SET (început), SEEK_CUR (poziÛia
curent|) sau SEEK_EN D (sfârÕitul fiÕierului); pentru un flux text offset trebuie s| fie 0
ANTAL Tiberiu Alexandru
sau o valoare întoars| de ftell(), caz în care originea trebuie s| fie SEEK_SET. Întoarce
tel.: 0040-264-530918
o valoare nenul| în caz de eroare.
e-mail: antaltiberiu@pcnet.ro
long ftell(FILE* strea m ); - întoarce poziÛia curent| în fiÕier pentru fluxul stream sau
-1L în caz de eroare.
void rew ind (FIL E* s trea m ); - este echivalent| cu fseek(stream, 0L, SE EK _S ET );
cle are rr(s tre am ).

228
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
int fgetpos(FILE* strea m , fpos _t* p tr); - îi atribuie lui *ptr poziÛia curent| în fluxul
Facultatea ConstrucÛii de MaÕini
stream . Tipul fpos_t se foloseÕte pentru stocarea acestor valori; întoarce o valoare nenul|
Catedra de Mecanic| Õi Programare
în caz de eroare.
Curs de limbaj C
int fsetpo s(F ILE * strea m , const fpos_ t* ptr); - seteaz| poziÛia curent| în fluxul
stream la *ptr; întoarce o valoare nenul| în caz de eroare.
Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


14.9.8 Funct-ii pentru tratarea erorilor
SudenÛii participanÛi
void la orice
clea rerr (FIL form|
E* s trea m ); de
- Õînv|Û|mânt superior
terge indicatorii bugetar pot
de terminare de fimultiplica acest
Õier Õi de eroare
document
pentru pentru
fluxul uzul. personal.
stream
int feof(F ILE * stream ); - întoarce o valoare nenul| dac| indicatorul de terminare
SudenÛii participanÛi
de fiÕier este la orice
setat pentru form|
fluxul de înv|Û|mânt cu plat| sau alte persoane doritoare
stream .
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
ferro r(FIL E* s trea m ); - întoarce o valoare nenul| dac| indicatorul de eroare a
scop m|intputeÛi contact| la:
fluxului stream este setat.
ANTAL void perror(const
Tiberiu Alexandru cha r* s); - afiÕeaz| pe s Õi un mesaj de eroare dependent de
implementare corespunz
tel.: 0040-264-530918 | tor lui errno , este echivalent| cu fpr intf(std err , "%s : %s\n ", s,
"me saj de eroa re") .
e-mail: antaltiberiu@pcnet.ro

14.10 <stdlib.h>
Antetul <stdlib.h> conÛine un set de funcÛii pentru diferite conversii numerice, alocare de
Conf. dr. Õing.
memorie i alte acÛiuniTiberiu
ANTAL având un caracter similar.
Alexandru
Universitatea Tenhic| din Cluj-Napoca
FacultateadoubConstrucÛii
le atof(conde ch ar* s); - converteÕte pe s la doub le , este echivalent| cu
st MaÕini
Catedra de
strtod(s, Mecanic| Õi .Programare
(char**)NULL)
Curs deint limbaj
atoi(cConst ch ar* s); - converteÕte pe s la int, este echivalent| cu (int)strtol(s,
(char**)NULL, 10).
Copyright 2001. Toate drepturile sunt rezervate autorului.
long atol(co nst cha r* s); - converteÕte pe s la long , este echivalent| cu strtol(s,
(char**)NULL, 10).
Multiplicarea acestui document în scop comercial este interzis|.
doub le strto d(co nst cha r* s, ch ar** endp ); - converteÕte prefixul lui s la doub le ,
ignorând orice spaÛiu alb aflat în faÛ|. Stocheaz| un poantor la orice sufix neconvertit în
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
*endp excepÛie f|când cazul în care endp e NULL . Dac| rezultatul conduce la dep|Õire,
document
HUGE_VAL pentru uzul personal.
este întors cu semnul corespunz|tor, dac| rezultatul este o valoare prea mic|,
întoarce valoarea 0 . În ambele cazuri errno primes- te valoarea ERANGE .
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
long strtol(co nst cha r* s, ch ar** en dp , int base ); - converteÕte prefixul lui s la long
pot multiplica
ignorând documentul
spaÛiile albe de lanumai contra
început. cost Õi| cu
Stocheaz unacordul
poantorscris al autorului.
la orice În acest în
sufix neconvertit
scop m| puteÛi contact| la:
*endp dac| endp este diferit de NULL . Dac| base este între 2 Õi 36 , conversia se face
presupunând c| intrarea este în baza respectiv|. Dac| base este 0 , baza este 8 sau 16 . Un
zero
ANTAL (0 ) în faÛ| implic
Tiberiu | octal, iar 0x sau 0X implica7 hexazecimal, altfel zecimal. Cifrele în
Alexandru
ambele cazuri trebuie s| fie în domeniul [0, base-1]. Dac| rezultatul produce dep|Õire,
tel.: 0040-264-530918
LONG_MAX sau LO NG _M IN este întors, în funcÛie de semnul rezultatului, iar errno
e-mail: antaltiberiu@pcnet.ro
primes- te valoarea ERANGE .
unsigned long strtoul(const char* s, cha r** en dp , int base ); - lucreaz| identic cu
strtol() , excepÛie facând rezultatul întors care este de tipul unsigned long , iar valoarea de
eroare ULONG_MAX .
229
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
int ra nd (); - întoarce un num|r aleator în domeniul [0 , R A N D_ M A X ].
Facultatea ConstrucÛii de MaÕini
Catedra void srand(unsigned
de Mecanic| int seed); - foloseÕte seed pentru a genera o nou| secvenÛ|
Õi Programare
de numere
Curs de limbaj C pseudo-aleatoare. Valoarea iniÛial| este 1 .
void* calloc(size_t nobj, size_t size ); - întoarce un poantor la o zon| nou alocat|
de RAM corespunz
Copyright 2001. Toate |toare unui tablou
drepturile suntini Ûializat cu
rezervate valori nule de nobj obiecte, fiecare de
autorului.
dimensiunea size sau NULL dac| alocarea nu se poate face.
Multiplicarea
void* macestui document
alloc (size_t size);în-scop comercial
întoarce la o zon| de RAM nou alocat| Õi
este interzis|.
un poantor
neiniÛializat| pentru un obiect de dimensiunea size sau NULL dac| alocarea nu se poate
face.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document void*pentru uzul personal.
realloc(void* p, size _t size); - modific| spaÛiul alocat obiectului poantat de
p la size . ConÛinutul blocului este neschimbat pân| la mimimul dintre dimensiunea veche
ÕSudenÛii
i noua dimensiune.
participanÛiDac | nouaform|
la orice dimensiune este mai cu
de înv|Û|mânt mare, noul
plat| sauspa Ûiupersoane
alte r|mâne neini Ûializat.
doritoare
Întoarce un poantor
pot multiplica documentul spaÛiu contra
la noulnumai alocat sau dac| alocarea
Õi cu acordul
costNULL scris alnu se poate realiza,
autorului. În acestcaz
în care
scop r|mâne
m|*pputeÛi nemodificat.
contact| la:
void free (void * p); - dezaloc| spaÛiul la care poanteaz| p . p trebuie s| fie NULL ,
caz
ANTALîn care nu se Alexandru
Tiberiu petrece nimic, sau un poantor întors de calloc(), m allo c() sau rea lloc().
tel.: 0040-264-530918
void ab ort(); - cauzeaz| terminarea anormal| a programului la fel cu
e-mail: antaltiberiu@pcnet.ro
raise(SIGABRT) .
void exit(int sta tus ); - cauzeaz| terminarea normal| a programului. FuncÛiile
instalate folosind ate xit() sunt apelate în ordinea invers| celor de înregistrare, fiÕierele
deschise sunt golite, fluxurile deschise sunt închise, iar controlul este redat mediului.
status este întors mediului într-o form| dependent| de implementare. Valoarea zero
înseamn| terminare cu succes, de asemenea pot fi folosite valorile EXIT_SUCCESS Õi
EXIT_FAILURE
Conf. dr. ing. ANTAL . Tiberiu Alexandru
Universitatea
int atex Tenhic| )(void )); - înregistreaz| funcÛia fcn pentru ca s| fie apelat| la
din Cluj-Napoca
it(void (*fcm
terminarea normal| a programului;
Facultatea ConstrucÛii de MaÕini întoarce valoare nenul| dac| înregistrarea nu se poate
realiza.
Catedra de Mecanic| Õi Programare
Curs deint limbaj C (con st ch ar* s); - îl transfer| pe s mediului de execuÛie. Când s este
sys tem
NULL , system () întoarce o valoare nenul| dac| exist| un procesor de comenzi. Când s nu
este
Copyright , valoarea
NULL 2001. Toate întoars | estesunt
drepturile dependent | deautorului.
rezervate implementare.
char* gete nv (con st ch ar* na m e); - întoarce, dependent de implementare, Õirul din
Multiplicarea
mediu asociat acestui
cu n amdocument
e , sau NULL în scop
dac| comercial este
acest Õir nu interzis|.
exist |.
void* bse arc h(co nst void * ke y, con st void* b ase , size_ t n, size_t size, int
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
(*cmp)(const void * ke yv al, con st vo id* d atu m )); - caut| în base[0] ... base[n-1] un articol
document
identic cu *keypentru uzul
. Func Ûiapersonal.
cm p trebuie s| întoarc| o valoare negativ| dac| primul argument
este mai mic decât cel de al doilea, zero dac| acestea sunt egale, sau pozitiv dac| primul
argument este mai mare
SudenÛii participanÛi decât
la orice cel de
form| de înv|Û|mânt
al doilea. Cele n articole
cu plat| trebuie
sau alte s| fie
persoane în ordine
doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest |
cresc | toare. Funct -ia întoarce un poantor la articolul pentru care condiÛia a fost satisfacut
sau
scopNULL dac|contact|
m| puteÛi nu s-a g|sit.
aceasta la:
void qsort(void* base, size_t n, size_t size, int (*cm p)(con st vo id*, co nst void *)); -
ANTAL| Tiberiu
sorteaz în ordine cresc|toare tabloul base [0]...base[n-1] de obiecte cu dimensiunea size .
Alexandru
tel.: 0040-264-530918Ûie cm p trebuie s| întoarc| valoare negativ| dac| primul argument
Func Ûia de compara
este mic decât cel de al doilea, zero dac| argumentele sunt egale, iar altfel o valoare
maiantaltiberiu@pcnet.ro
e-mail:
pozitiv|.
int a bs(in t n); - întoarce valoarea absolut| a lui n de tipul int.
long lab s(lon g n ); - întoarce valoarea absolut| a lui n de tipul long .
div_t div (int n um , int d en om ); - întoarce în câmpurile quot Õi rem ale structurii
230
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
de tipul dive_t
Facultatea câtul Õi de
ConstrucÛii restul lui num /denom .
MaÕini
Catedra ldiv_t ldiv (lonÕi
de Mecanic| n um , lon g d en om ); - întoarce în câmpurile
g Programare quot Õi rem ale
structurii de
Curs de limbaj C tipul ldiv_t câtul Õi restul lui num /denom .

Copyright 2001. Toate drepturile sunt rezervate autorului.


14.11 <string.h>
Multiplicarea acestui document în scop comercial este interzis|.
Exist| dou| grupe de funcÛii pentru prelucrarea Õirurilor. Prima începe cu str ; a doua
începe
SudenÛiicuparticipanÛi
m em . Cu excep Ûia luiform|
la orice m em m
deove() , comportamentul
înv|Û|mânt este nedefinit
superior bugetar dac| copierea
pot multiplica acest
are loc între obiecte care se
document pentru uzul personal. suprapun.

SudenÛii participanÛi
char* la orice
strc py (char* form|
s, co de înv|Û|mânt
ns t char* cu plat|
ct); - îl copiaz | pesau alte
ct în persoaneterminatorul
s , inclusiv doritoare
pot multiplica documentul
'\0'; îl întoarce pe s . numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
char* strn cpy (cha r* s, const cha r* ct, int n); - copiaz| cel mult n caractere din ct
în s ; realizeaz| completarea cu '\0' dac| lungimea lui ct este mai mic| decât a lui n ; îl
ANTAL
întoarce Tiberiu
pe s . Alexandru
tel.: 0040-264-530918
char* strcat(char* s, con st ch ar* ct); - îl concateneaz| pe ct la s; îl întoarce pe s .
e-mail: antaltiberiu@pcnet.ro
char* strn cat(cha r* s, co nst cha r* ct, int n); - concateneaz| lui s cel mult n
caractere din ct; îl întoarce pe s care se va termina în '\0'.
int strcmp(const ch ar* cs, con st char* ct); - îl compar| pe cs cu ct ; întoarce
valoare negativ| dac| cs < ct, zero dac| cs == ct, sau pozitiv| dac| cs > ct.
int strn cm p(const cha r* cs, const ch ar* c t, int n ); - compar| cel mult n caractere
din
Conf. cu ct.
cs dr. Întoarce
ing. ANTALvaloare
Tiberiu negativ | dac| cs < ct, zero dac| cs == ct, sau pozitiv| dac| cs
Alexandru
> ct .
Universitatea Tenhic| din Cluj-Napoca
Facultatea char* ConstrucÛii
strchr(const cha r* cs, in t c); - întoarce un poantor la prima apariÛie a lui c
de MaÕini
în cs sau de
Catedra NULL dac| acesta
Mecanic| nu este g|sit.
Õi Programare
Curs dechar* limbaj C
strrchr(co nst cha r* cs, in t c); - întoarce un poantor la ultima apariÛie a lui
c în cs sau NULL dac| acesta nu este g|sit.
Copyright 2001. Toate drepturile sunt rezervate autorului.
size_t strspn(const char* cs, const char* ct); - întoarce lungimea prefixului lui cs
format din caracterele lui ct.
Multiplicarea acestui document în scop comercial este interzis|.
size _t str csp n(co nst cha r* cs, const char* ct); - întoarce lungimea prefixului lui
cs format din caracterele care nu fac parte din ct.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document char* strpb
pentru rk(const
uzul ch ar* cs, con st char* ct); - întoarce un poantor la prima
personal.
apariÛie în cs a oric|rui caracter din ct, sau NULL dac| nu s-a g|sit nici unul.
SudenÛii char* strstr(const
participanÛi char*
la orice cs, con
form| de st - întoarce
ch ar* c t); cu
înv|Û|mânt unalte
plat| sau poantor la prima
persoane apariÛie
doritoare
apot
luimultiplica
ct în cs , sau NULL dac | aceasta nu s-a g| sit.
documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m|size puteÛi
_t strcontact|
len(conla:
st ch ar* cs); - întoarce lugimea lui cs.
char* strer ror(in t n); - întoarce un poantor la un Õir definit prin implementare
ANTAL
corespunz Tiberiu Alexandru
|tor erorii n.
tel.: 0040-264-530918
char* strto k(cha r* s, con st ch ar* ct); - o secvenÛ| de apeluri la strtok () întoarce
e-mail: antaltiberiu@pcnet.ro
atomi (tokens ) din s delimitaÛi prin caracterele din ct. Primul apel din secvenÛ| are s cu
valoare diferit| de NULL . Acesta g|seÕte primul atom din s care nu este format din
caracterele lui ct; va termina aceast| c|utare prin suprascrierea urm|torului caracter din
s cu '\0' Õi întoarce un poantor la atom. Fiecare apel ulterior, indicat prin valoarea NULL
a lui s , întoarce urm|torul atom, continuând c|utarea începând cu ultimul atom. strtok ()
231
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
va NULL dac| nu s-a g|sit un nou atom. Ôirul ct poate fi diferit la fiecare apel.
întoarceConstrucÛii
Facultatea de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj
Programul careCurmeaz| prezinta7 modul de prelucrare a datelor cu ajutorul funcÛiei
strtok () . ObservaÛi c| data poate fi scris| în oricare dintre formatele: 28 Iul., 2000;
Copyright 2001.
20/07/2000; 28-07-2000 .
Toate drepturile sunt rezervate autorului.

Multiplicarea
/* STR TO K.C acestui
*/ document în scop comercial este interzis|.
#include<stdio.h>
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
#include<string.h>
document pentru uzul personal.
int main(void)
{SudenÛii participanÛila orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
char s[ documentul numai contra cost Õi cu acordul scris al autorului. În acest
]= "28 Iul., 2000";
scop m|char
puteÛi contact| la:
*ptr;
ptr= s trtok (s, " .,-/\\" );
prin
ANTAL tf("ptrAlexandru
Tiberiu = % s\n ", ptr);
ptr= s trtok (NU LL, " .,-/\\");
tel.: 0040-264-530918
e-mail:prin tf("ptr = % s\n ", ptr);
antaltiberiu@pcnet.ro
return 0;
}

Rezultate:
ptr = 28
Conf.= dr.
ptr Iuling. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
void* mem cpy(void* s , con st void* ct, in t n); - copiaz| n caractere din ct în s ; îl
Catedra Õi Programare
întoarce de pe Mecanic|
s . Nu lucreaza 7 corect dac| cele dou| obiecte se suprapun.
Curs de limbaj C
void* m em m ove (void * s, con st vo id* ct, in t n); - copiaz| n caractere din ct în s ; îl
întoarce s . Lucreaz| corect dac| cele dou| obiecte se suprapun.
pe2001.
Copyright Toate drepturile sunt rezervate autorului.
int m em cm p(const void * cs, co nst void * ct, int n ); - compar| primele n caractere
din cs cu ct; întoarce
Multiplicarea acestuivaloare
documentnegativ | dac
în scop | cs < ct, este
comercial dac| cs == ct, pozitiv| dac| cs > ct.
zerointerzis|.
void* m em chr (con st ch ar* cs, in t c, int n ); - întoarce un poantor la prima apariÛie
aSudenÛii
lui c între primele nlacaractere
participanÛi orice form| ale de
luiînv|Û|mânt
cs , sau NULL dac| acesta
superior bugetarnupot g|sit.
estemultiplica acest
document pentru
void* ar* s, int c, in t n); - înlocuieÕte fiecare dintre primele n caractere
uzul personal.
m em set(ch
ale lui s prin c ; îl întoarce pe s .
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest

14.12 <time.h>
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


Antetul <time.h> conÛine declaraÛiile tipurilor Õi funcÛiilor folosite pentru manipularea
Õi a timpului. Unele funcÛii prelucreaz| timpul local, care poate sa7 difere de cel din
tel.: 0040-264-530918
datelor
calendar, de exemplu din cauza zonei de timp.
e-mail: antaltiberiu@pcnet.ro

- tip aritmetic folosit pentru reprezentarea timpului;


clock_t
CLOCKS_PER_SEC - num|rul de unit|Ûi clock_t pe secund|;

232
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
time_t - tip aritmetic reprezentând timpul;
Facultatea ConstrucÛii de MaÕini
Catedra stru
de ct tm - structur
Mecanic| | care reprezint| timpul din calendar:
Õi Programare
Curs de limbajint C tm_sec; - secunde dup| minut (0, 61);
int tm_min; - minute dup| or| (0,59);
Copyright 2001. Toate drepturile sunt rezervate autorului.
int tm_hou r; - ore dup| miezul nopÛii (0, 23);

Multiplicarea int acestui document


tm_mday; - ziua din lun
în scop | (1, 31)este interzis|.
comercial
int tm_mon; - luni trecute dupa 7 ianuarie (0, 11)l
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
int tm_year; - ani trecuÛi dupa 7 1900;
document pentru uzul personal.
int tm_wday; - zile trecute dupa 7 duminic| (0, 6);
SudenÛii participanÛi la orice -form|
int tm_yday; zile trecute dupa7 1 ianuarie
de înv|Û|mânt cu plat|(0,
sau356)
alte persoane doritoare
pot multiplicaint documentul numai contra cost Õi cu acordul scris
tm _isdst ; - indicator Daylight Saving Time (DST): al autorului. În acest
este pozitiv dac|
scop m| puteÛieste activ,la:zero dac| este inactiv Õi negativ dac| informaÛia nu este
contact|
disponibil|.
ANTAL Tiberiu
clock _t cloAlexandru
ck(); - întoarce timpul consumat de procesor de la începutul execuÛiei
tel.: 0040-264-530918
programului sau, -1 dac| nu este disponibil. clock()/CLOCKS_PER_SEC este timpul în
e-mail: antaltiberiu@pcnet.ro
secunde.
time_t tim e(tim e_ t* tp); - întoarce timpul calendaristic curent sau -1 dac| nu este
disponibil. Dac| tp este ne-NULL , valoarea întoars| este atribuit| lui *tp .
double difftim e(time_ t tim e2, tim e_ t tim e1); - întoarce diferenÛa în secunde dintre
time2 Õi time1.
time_t m ktim e(stru ct tm * tp); - întoarce timpul local corespunz|tor lui *tp sau -1
Conf. dr. ing. ANTAL Tiberiu Alexandru
dac| reprezentarea nu se poate face.
Universitatea Tenhic| din Cluj-Napoca
char*
Facultatea asc tim e(con
ConstrucÛii de st stru ct tm * tp); - întoarce timpul din structura *tp sub forma
MaÕini
ÕCatedra
irului Sun Jan 3 14:14:13
de Mecanic| 1988\n\0 .
Õi Programare
Curs dechar*
limbajctimC e(con st tim e_ t* tp); - converteÕte timpul calendaristic în Coordonate
Universale de Timp (Coo rdin ated Un iversa l Tim e ) Õi întoarce Õirul echivalent. Este
Copyright|2001.
echivalent cu asc tim e(loca
Toate sunt.rezervate autorului.
ltim e(tp))
drepturile
struct tm* g m time (const tim e_t* tp ); - întoarce timpul calendaristic în Coordonate
Universale
Multiplicarea de acestui
Timp sau NULL dac
document | nu este
în scop disponibil.
comercial este interzis|.
struct tm * loca ltime(cons t tim e_ t* tp); - întoarce timpul calendaristic *tp convertit
SudenÛii
la timpulparticipanÛi
local. la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
size_t strftim e(ch ar* s, size _t sm ax , con st ch ar* fm t, con st stru ct tm * tp); -
formateaz| *tp în s conform fm t care este analog Õirului format din printf() . Caracterele
SudenÛii
de conversie îns| sunt
participanÛi la orice Õi vordefi înv|Û|mânt
alteleform| prezentate cuîn plat| saucare
tabelul alteurmeaz |, caracterele
persoane doritoare
potÕmultiplica
obi nuite vor fidocumentul
copiate direct în scontra
numai . Cel mult Õi cu acordul
costsmax caractere sunt
scris copiate în sÎn
al autorului. . Întoarce
acest
scop|m|
num rulputeÛi
de caractere,
contact| exclusiv
la: '\0', sau zero dac| au fost produse mai multe de smax
caractere.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
Caracter
e-mail: de conversie
antaltiberiu@pcnet.ro Semnificat-ie
%a numele zilei abreviat.
%A numele complet al zilei din s|pt|mân|.
%b numele abreviat al lunii.
233
Capitolul
Conf. dr.14ing.
- Biblioteca
ANTAL C Tiberiu
standard Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
%B ConstrucÛii de MaÕini
numele complet al lunii.
Catedra de Mecanic| Õi Programare
%c
Curs de limbaj C reprezentarea local| a datei Õi timpului.
%d ziua din lun| (01-31).
Copyright 2001. Toate drepturile sunt rezervate autorului.
%H ora (reprezentat| prin 24 de ore) (00-23).
Multiplicarea
%I acestui document în scop comercial
ora (reprezentat | prineste interzis|.
12 ore) (01-12).
%j
SudenÛii participanÛi la oriceziua din de
form| an înv|Û|mânt
(001-366). superior bugetar pot multiplica acest
document
%m pentru uzul personal.
luna (01-12).
%M
SudenÛii participanÛi la oriceminutul (00-59).
form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot
%p
multiplica documentul numai contra cost Õi
echivalentul local al cu
lui acordul
AM sauscris
PM. al autorului. În acest
scop m| puteÛi contact| la:
%S secunda (00-61).
ANTAL
%U
Tiberiu Alexandrunum|rul s|pt|mânii din an (duminica este ziua 1 a
tel.: 0040-264-530918 s|pt|mânii) (0-53).
e-mail: antaltiberiu@pcnet.ro
%w num|rul zilei din s|pt|mân| (0-6, duminic| este 0).
%W num|rul s|pt|mânii din an (luni este ziua 1 a s|pt|mânii)
(0-53).
%x reprezentarea local| a datei.
Conf.
%X
dr. ing. ANTAL Tiberiu Alexandru local| a timpului.
reprezentarea
Universitatea Tenhic| din Cluj-Napoca
%y
Facultatea an f|r| secol (00-99).
ConstrucÛii de MaÕini
Catedra
%Y
de Mecanic| Õi Programare
an cu secol.
Curs de limbaj C
%Z numele zonei de timp, dac| exist|.
Copyright 2001. Toate drepturile sunt rezervate autorului.
%% caracterul %.
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

234
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Index
Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


... declaraÛia, 83, 114 ~ operatorul complement faÛ| de unu, 49
SudenÛii participanÛi
, operatorul virgul|, la
54orice form| de înv|Û|mânt superiorhexazecimale,
0x constante bugetar pot multiplica
34 acest
document pentru uzul personal.
!= operatorul de neegalitate, 46 A
?: operatorul
SudenÛii participanÛi oriceÛional
expresielacondi form||, de
55,înv|Û|mânt
57 ab ort()cu plat|218,
, 213, sau228
alte persoane doritoare
pot multiplica documentul
' caracterul apostrof, 30 numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la: ab s() , 228
+ operatorul de adunare, 41, 42
acos() , 216
++
ANTAL operatorul
Tiberiude incrementare, 44, 45
Alexandru
adev|rat (True), 46
tel.: 0040-264-530918
++, – prefixat, 45
e-mail: antaltiberiu@pcnet.ro adres|, 11, 13, 32, 107
+= operatorul de atribuire compus|, 53,
aritmetica, 124
56
NULL , 112
* operatorul de înmulÛire, 41
operatorul, 108
/ operatorul de împ|rÛire, 41
aliniere, 175, 222
^
Conf.operatorul pe biti SAU
dr. ing. ANTAL EXCLUSIV,
Tiberiu Alexandru
49, 57 din Cluj-Napoca
Universitatea Tenhic| alocare
Facultatea
< operatorul ConstrucÛii de MaÕini
mai mic, 46 dinamic|, 197
Catedra de Mecanic| Õi Programare
<< funcÛii, 198
Cursoperatorul
de limbaj C deplasare la stânga, 49
<= operatorul mai mic sau egal, 46 pentru structuri dinamice de date,
Copyright 2001. Toate drepturile sunt rezervate autorului. 208
= operatorul de atribuire, 40, 47
alocarea dinamica a memoriei
== operatorulacestui
Multiplicarea de egalitate,
document46 în scop comercial este interzis|.
malloc, 200
> operatorul mai mare, 46
SudenÛii participanÛi la orice form| de înv|Û|mânt alocarea superior
dinamic | a memoriei,
bugetar pot multiplica
197 acest
>= operatorul mai mare
document pentru uzul personal.sau egal, 46
alocarea dinamic| a memorie
>> operatorul deplasare la dreapta, 49
pentru matrice, 203
SudenÛii participanÛi
% operatorul modulo,la41orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul alocarea dinamic
scris | a memorie
al autorului. În acest
# operatori de preprocesare,
scop m| puteÛi contact| la: 100 pentru vectori, 199
& operatorul adres|, 52, 57, 108 funcÛii pentru alocarea dinamic| a
ANTAL Tiberiu Alexandru memoriei, 198
\\ caracterul backslash, 26, 176, 182
tel.: 0040-264-530918
\0, 36, 135
e-mail: antaltiberiu@pcnet.ro structuri dinamice de date, 208
\a caracterul pentru alert|, 26, 36, 176 apel
| operatorul pe biti SAU, 49 de funcÛie, 76, 77
|| operatorul logic SAU, 47 operator, 79
235
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
argument,
Facultatea 24, 25, 58, 76,
ConstrucÛii de83
MaÕini bs ea rch () , 228
Catedra de Mecanic| Õi Programare
ordinea evalu|rii, 83 buffer, 176
Curs de limbaj C
poantorii, 112 C
transferul
Copyright prin valoare,
2001. Toate 83 sunt rezervate
drepturile autorului.
calloc() , 228
ASCII, 35
Multiplicarea acestui document în scop comercial câmpuri estede biÛi, 157
interzis|.
asctim e() , 231
caractere de punctuaÛie, 22
SudenÛii
asin() , 216participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
caracterul ”, 22
document pentru uzul personal.
asociativitate, 56, 126 ce este o etichet|?, 75
asser t() , 213
SudenÛii participanÛi la orice form| de înv|Û|mânt ceil() , cu
216plat| sau alte persoane doritoare
pot multiplica
ata n() , 216 documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la: char , 30
ata n2 () , 216
CH AR _B IT , 215
ANTAL
ate Tiberiu Alexandru
xit() , 228
CHAR_MAX , 215
tel.: 0040-264-530918
ato f() , 227
e-mail: antaltiberiu@pcnet.ro CH AR _M IN , 215
ato i() , 227
ciclul for infinit, 72
ato l() , 227 clearerr () , 227
au to , 91 cloc k() , 231
B clock_t, 230
Conf. dr. ing. ANTAL Tiberiu Alexandru
biblioteca C Standard,
Universitatea 213Cluj-Napoca
Tenhic| din CLOCKS_PER_SEC , 230
Facultatea ConstrucÛii
assert.h, 213 de MaÕini comparaÛie C-BASIC-FORTRAN-Pascal,
Catedra de Mecanic| Õi Programare 71
Curs dectype.h,
limbaj C214
float.h, 214 comparaÛie w hile - for, 71
Copyright 2001.215
limits.h, Toate drepturile sunt rezervate autorului.
const , 37
math.h,acestui constante, 22
216 document în scop comercial
Multiplicarea este interzis|.
setjmp.h, 217 continue, 73
SudenÛii participanÛi la orice form| de înv|Û|mânt superior
conversie, 200 bugetar pot multiplica acest
stdarg.h, 219
document pentru uzul personal.
stdio.h, 219 aritmetice standard la apelul de
SudenÛii participanÛi funcÛii, 79
stdlib.h, 227 la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul
automat |, 43al autorului. În acest
scris
scop m|string.h, 229
puteÛi contact| la:
caracter de, 173, 223, 224
bit, 12
ANTAL exemplu, 81
deTiberiu Alexandru
semn, 30
tel.: 0040-264-530918 forÛat|, 43
e-mail:nenul, 46
antaltiberiu@pcnet.ro
la utilizarea operatorilor aritmetici,
operatori, 48, 50
42
bloc, 25, 61, 82
cos () , 216
break, 73
cos h() , 216
236
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
ctim e() , 231ConstrucÛii de MaÕini
Facultatea FLT_EPSILON , 215
Catedra
cuvintelede 22 Õi Programare
Mecanic|
cheie, FLT _M AN T_ DIG , 215
Curs de limbaj C
D FLT_MAX , 215
Copyright _M A X _ EX P , 215
declaraÛie 2001. Toate drepturile sunt rezervate
F LTautorului.

constante, FLT _M IN , 215


37 document în scop comercial
Multiplicarea acestui este interzis|.
variabile, 27 FLT _R AD IX , 214
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar
FLT_ROUNDS , 214 pot multiplica acest
declaraÛie cu iniÛializare, 33
document pentru uzul personal.
difftim e() , 231 flux, 171
SudenÛii
do-w hileparticipanÛi
, 69 la orice form| de înv|Û|mânt cubinar,
plat|171
sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului.
citirea parametrilor În acest
din linia
doub le , 32
scop m| puteÛi contact| la:
comand|, 192
E
ANTAL Tiberiu Alexandru citirea Õi afiÕarea datelor dintr-un
EDOM, 217
tel.: 0040-264-530918 fiÕier, 183
e-mail: antaltiberiu@pcnet.ro de ce exist| stdout Õi stderr ?, 172
enum , 38

ERANGE , 217 de text, 171


ex p() , 216 declararea unui flux, 180
extern , 84 deschiderea fiÕierelor, 180
legare,
Conf. dr. 93
ing. ANTAL Tiberiu Alexandru fiÕiere ASCII Õi fiÕiere binare în C,
Universitatea Tenhic| din Cluj-Napoca 185
variabile, 84, 87
Facultatea ConstrucÛii de MaÕini funcÛii pentru operaÛii cu fiÕiere,
extinderea
Catedra de ciclului
Mecanic| , 72
forÕi Programare 180
Curs de limbaj C F lucrul cu înregistr|ri, 189
() , 217 2001.
Copyright
fabs poziÛionarea în fiÕierele binare, 186
Toate drepturile sunt rezervate autorului.
fals (False), 46 problema accesului la fiÕiere, 182
Multiplicarea acestui document în scop comercial este interzis|.
fclo se() , 221 probleme care vin din MS-DOS,
SudenÛii participanÛi
feo f() , 187, 227 la orice form| de înv|Û|mânt superior185 bugetar pot multiplica acest
document pentru uzul personal. probleme care vin din UNIX, 186
ferror () , 227
rolul unui flux, 172
fge tc() , 225
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul tratarea erorilor,
scris 182
al autorului. În acest
fge tpo s() , 226
scop m| puteÛi contact| la: fm od() , 217
fge ts() , 225
FOPEN_MAX , 220
ANTAL
FILE , 220Tiberiu Alexandru
tel.: 0040-264-530918 for , 70
FILENAME_MAX , 220
e-mail: antaltiberiu@pcnet.ro
FORTRAN, 19, 71, 216
float, 32
scurt| comparaÛie C Õi FORTRAN
floo r() , 216
în domeniul calculului
FLT _D IG , 214 numeric, 243
237
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
fpr intf() , 222
Facultatea ConstrucÛii de MaÕini 130
fpu tc() , 226 Mecanic| Õi Programare
Catedra de transferul variabilelor de tipul
Curs de limbaj C structur|, 147
fpu ts() , 226
fw rite () , 226
fread () , 2262001.
Copyright Toate drepturile sunt rezervate autorului.
free() ,
228 G
Multiplicarea acestui document în scop comercial este interzis|.
freopen () , 221 getc() , 226
SudenÛii participanÛi la orice form| de înv|Û|mânt
frexp () , 217 superior
getch ar() , 226 bugetar pot multiplica acest
document pentru uzul personal.
fscan f() , 224 geten v() , 228

fse ek () , 226
SudenÛii participanÛi gets() ,cu
la orice form| de înv|Û|mânt 226
plat| sau alte persoane doritoare
pot multiplica documentul numai contra costgm Õi cu acordul
tim e() , 231
scris al autorului. În acest
fse tpo s() , 227
scop m| puteÛi contact| la:
ftell() , 226 goto , 75
ANTAL
funcÛia, 76 Tiberiu Alexandru I
tel.: 0040-264-530918
e-mail:apel, 76, 79
antaltiberiu@pcnet.ro identificatori, 22
apel - exemplu, 79 if-else , 62
cu num|r variabil de parametri, 114 indirectare, 110
definire, 77 instrucÛiune compus|, 62
definire - exemplu, 78 instrucÛiune expresie, 61
Conf. dr. ing. ANTAL Tiberiu Alexandru
exemple de prototipuri, 82 instrucÛiune vid|, 62
Universitatea Tenhic| din Cluj-Napoca
în lipsa
Facultatea prototipului,
ConstrucÛii 81
de MaÕini int , 30
Catedra de Mecanic| Õi Programare
întoarcerea unei valori structur| de INT_MAX , 215
Curs de limbajc|Ctre o funcÛie, 151
INT _M IN , 215
ordinea
Copyright 2001.evalu |riidrepturile
Toate argumentelor, 83
sunt rezervate autorului.
întregi în baze diferite, 31
parametri, 83
Multiplicarea acestui document în scop comercial isa lnu , 214
m ()interzis|.
este
poantori la funcÛii, 117
isa lph a() , 214
SudenÛiipoantorii Õi argumentele
participanÛi la orice form| Ûiilor,
funcde înv|Û|mânt superior bugetar pot multiplica acest
112 uzul personal. iscntr l() , 214
document pentru
prototipuri, 81 isd igit() , 214
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
prototipurile funcÛiilor din contra costisg raph () , 214
pot multiplica documentul numai Õi cu acordul scris al autorului. În acest
scop m| puteÛibiblioteca
contact| la:standard, 82 islo w er() , 214
rolul lui ; în prototip, 82 isp rin t() , 214
ANTAL Tiberiu Alexandru
transferul tablourilor Õi funcÛiilor ca isp un ct() , 214
tel.: 0040-264-530918
parametri de funcÛie, 129
e-mail: antaltiberiu@pcnet.ro isspa ce() , 214
transferul unui tablou
isu pp er() , 214
bidimensional, 132
transferul unui tablou isx digit() , 214

unidimensional prin poantor,


238
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini K P
Catedra de Mecanic| Õi Programare
Kernighan
Curs de limbaj Õi Ritchie,
C 19, 22, 49, 149 perro r() , 182, 227

L poantori, 107
Copyright 2001. Toate drepturile sunt rezervate autorului. * Õi ++, 131
l-value, 32, 40, 144
Multiplicarea
lab s() , 228 acestui document în scop comercial este Õarea, 109
afiinterzis|.

lde xp () , 217
aritmetica, 124
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
, 229 pentru uzul personal. conversia numelor de tablouri, 122
document
ldiv()
declararea, 108
legarea
SudenÛii participanÛi la orice form| de înv|Û|mânt cuînplat| ANSI sauC,alte
108persoane doritoare
extern|documentul
pot multiplica , 94 numai contra cost Õi cu acordul scris al autorului. În acest
scop m|internputeÛi|,contact| la: iniÛializare, 112
94
la funcÛii, 117
loca ltim e() , 231
ANTAL Tiberiu Alexandru la poantori, 116
tel.: ,0040-264-530918
log() 216
e-mail: antaltiberiu@pcnet.ro la Õiruri, 138
log10() , 216
Õiruri de caractere, 134
long d ou ble , 33
postfixat ++, --, 45
LONG_MAX , 215
pow () , 216
LO NG _M IN , 215
preprocesare, 100
lon gjmdr.
Conf. p() ,ing.
217ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca #define, 100
M
Facultatea ConstrucÛii de MaÕini #include, 103
Catedra101
macro, de Mecanic| Õi Programare
#line, 105
Curs de limbaj C
m allo c() , 228
#pragma, 105
m em chr() , 2001.
Copyright 230 Toate drepturile sunt rezervate autorului.compilare condiÛionat|, 103
m em cm p() , 230
Multiplicarea acestui document în scop comercial este lipirea liniilor, 100
interzis|.
m em cpy() , 230 nume predefinite, 105
m em m ove() , 230
SudenÛii participanÛi la orice form| de înv|Û|mânt superior
printf() , 223
bugetar pot multiplica acest
document pentru uzul personal.
m ktim e() , 231 program, 10
m od f() , 217
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
programe
pot multiplica documentul numai contra cost O Õi cu acordul
1.C, 95
scris al autorului. În acest
scop m| puteÛi contact| la:
octet, 23, 107 2.C, 96
ANTAL
offset, 123 Tiberiu Alexandru AFICIT.C, 86, 92
tel.: 0040-264-530918
operatori
e-mail: antaltiberiu@pcnet.ro ALDINTA1.C, 205
asociativitate, 57 ALDINTA2.C, 206
logici, 47 APELPTR.C, 113
relaÛionali, 46 ASOCIAT.C, 56

239
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
BAZEEX1.C,
Facultatea ConstrucÛii31de MaÕini OPARIT.C, 41
Catedra 73 Õi Programare
de Mecanic|
BREAK.C, OPARITC1.C, 43
Curs de limbaj C
CALCIT.C, 86 OPARITCV.C, 42
CALLOC1.C,
Copyright 2001. Toate200 OPPEBIT1.C, 49
drepturile sunt rezervate autorului.
CHAREX1.C, 31 OPPEBIT2.C, 50
Multiplicarea acestui document în scop comercial este interzis|.
CIT.H, 85 PRECEDE.C, 55
SudenÛii participanÛi la86
CIT2REAL.C, orice form| de înv|Û|mânt superior bugetar pot multiplica acest
PT1.C, 108
document pentru uzul personal.
COMPLEX1.C, 151-153 PTR2.C, 111
CONTINUE.C,
SudenÛii 74 form| de înv|Û|mânt cuPTR3.C,
participanÛi la orice 112
plat| sau alte persoane doritoare
pot multiplica documentul
COPIE1.C, 193 numai contra cost Õi cu acordul
PTRFNC.C,al117
scris autorului. În acest
scop m| puteÛi contact| la:
DEFINE1.C, 101 PTRPTR.C, 116
ANTAL DEFINE2.C, 102
Tiberiu Alexandru SALUT.C, 23
tel.: 0040-264-530918
DO-WHILE.C, 69 SCRIE.C, 189
e-mail: antaltiberiu@pcnet.ro
DO-WHILE1.C, 70 SINDIR1.C, 162
EREGAL.C, 47 SINSDIR2.C, 163
EXTERN.C, 84 SINSDIR3.C, 164
FACTORIA.C, 98 SINSDIR4.C, 165
Conf. dr. ing. ANTAL
FGETC.C, 183 Tiberiu Alexandru SINSDIR5.C, 166
Universitatea Tenhic| din Cluj-Napoca
FGETS.C,
Facultatea 184 de MaÕini
ConstrucÛii SINSDIR6.C, 167
Catedra de Mecanic| Õi33
FLOATEX1.C, Programare SINSDIR7.C, 169
Curs deFLUX1.C,
limbaj C 171 SIRVIT1.C, 139, 140
FOPEN1.C,
Copyright 181drepturile sunt rezervate autorului.
2001. Toate SIZEOF.C, 54
FOR.C, 72 STRTOK.C, 230
Multiplicarea acestui document în scop comercial este interzis|.
FUNCTIE1.C, 80 STRUC2.C, 148
GOTO.C,
SudenÛii 75 la orice form| de înv|Û|mânt superior
participanÛi STRUCT1.C, 145
bugetar pot multiplica acest
document pentru
IF1.C, 63 uzul personal. STRUCT2.C, 149
IFDEF.C,
SudenÛii 103,
participanÛi la104
orice form| de înv|Û|mânt cuSWITCH.C, 66persoane doritoare
plat| sau alte
INCDEC.C,
pot multiplica 45
documentul numai contra cost Õi cu acordul
TAB1.C, 121al autorului. În acest
scris
scop m|INTEX1.C,
puteÛi contact|
29 la: TAB10.C, 135
ANTAL JMP.C,
Tiberiu217
Alexandru TAB11.C, 136
tel.: 0040-264-530918
LEGDUREX.C, 96 TAB12.C, 138
e-mail: antaltiberiu@pcnet.ro
LISTASI.C, 209 TAB2.C, 122
MAIN.C, 86 TAB3.C, 124
MALLOC1.C, 199 TAB4.C, 125

240
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
TAB5.C,
Facultatea 127 de MaÕini
ConstrucÛii SHRT_MAX , 215
CatedraTAB6.C, 130 Õi Programare
de Mecanic| SH RT _M IN , 215
Curs de limbaj C
TAB7.C, 131 SIGABRT , 218
TAB8.C,
Copyright 2001. 132
Toate drepturile sunt rezervate , 218
autorului.
SIGFPE

TAB9.C, 134 SIGILL, 218


Multiplicarea acestui document în scop comercial este interzis|.
UNION.C, 157 S IG IN T , 218
SudenÛii participanÛi115
VALST1.C, la orice form| de înv|Û|mânt superior
sig na l() , 218 bugetar pot multiplica acest
document pentru uzul personal.
VALST2.C, 115 SIGSEGV , 219

SudenÛii WHILE.C, 67la orice form| de înv|Û|mânt


participanÛi sin () , 216
cu plat| sau alte persoane doritoare
pot multiplica documentul
WHILE1.C, 68 numai contra cost Õi cu acordul scris al autorului. În acest
sin h() , 216
scop m| puteÛi contact| la:
pu tc() , 226 Õirul, 22
ANTAL
pu , 226 Alexandru
tch ar()Tiberiu size_t, 221
tel.: 0040-264-530918
pu ts() , 226 sprin tf() , 223
e-mail: antaltiberiu@pcnet.ro
Q sqr t(), 216
qso rt() , 228 sra nd () , 228

R ssc an f() , 225


stderr , 220
r-value,
Conf. dr.32, 37ANTAL Tiberiu Alexandru
ing.
stdin , 220
Universitatea
raise () , 219 Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini stdout, 220
rand () , 227
Catedra de Mecanic| Õi Programare
stiva, 88
Curs
rea de ,limbaj
lloc() 228 C
alocarea memoriei în cazul
recursivitate, 97
Copyright 2001. Toate drepturile sunt rezervate autorului. sistemelor de operare
avantaje Õi dezavantaje, 98 moderne, 197
Multiplicarea acestui
evitarea, 98 document în scop comercial este interzis|.
exemplu de lucru, 89
rem ove() , 221 organizarea memoriei RAM pentru
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
ren am e() , 221
document pentru uzul personal. programele în execu Ûie, 90
rew ind() , 226 Õi limbajul C, 88
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
at() , 229
pot multiplica documentul numai contra costS strc
Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la: strc hr() , 229
sca nf() , 225
strc m p() , 229
ANTAL Tiberiu, 215
SCHAR_MAX Alexandru
strc py () , 229
tel.:
SC HA 0040-264-530918
R_ M IN , 215
e-mail: antaltiberiu@pcnet.ro stre rro r() , 229
setbu f() , 222
strf tim e() , 231
setjm p() , 217
strlen () , 229
setvb uf() , 222
strn cat() , 229
241
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
strn cm p() , 229
Facultatea ConstrucÛii de MaÕini T
Catedra de Mecanic| Õi Programare
strn cpy() , 229
Curs de limbaj C tablou, 119
strp brk() , 229
accesul la elementele de tablou, 121
strr chr() , 229
Copyright 2001. Toate drepturile sunt rezervate autorului.
accesul la un membru tablou, 145
strs pn () , 229 alocarea dinamic| a memoriei
Multiplicarea acestui document în scop comercial este interzis|.
strs tr() , 229 pentru matrice, 203
SudenÛii participanÛi la orice form| de înv|Û|mânt superior
strtod () , 227 poziÛiei Õpot
calculul bugetar multiplica
i a valorii celuiacest
de
document pentru uzul personal. al i-elea element al unui
strtok () , 229
tablou, 123
SudenÛii
strtol() , 227
participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
compara
pot multiplica documentul numai contra cost Õi cu acordul Ûie între
scris tablou ÕiÎn acest
al autorului.
strtou l() , 227 structur | , 146
scop m| puteÛi contact| la:
struct, 142 conversia numelor de tablouri în
ANTAL Tiberiu Alexandru
atribuirea structurilor, 147 poantori, 122
tel.: 0040-264-530918 declarare, 119
e-mail:compara Ûie între tablou Õi
antaltiberiu@pcnet.ro
structur|, 146 diferenÛe între tablou Õi poantor la
crearea unei liste înl|nÛuite prin tablou, 123
folosirea structurilor, 153 iniÛializarea, 120
de ce (*p).membru?, 149 operatorul de indexare al
declararea, 142 Tiberiu Alexandru tablourilor, 122
Conf. dr. ing. ANTAL
Universitatea Tenhic|
iniÛializarea din Cluj-Napoca
variabilelor de tip Õiruri de caractere, 134
Facultatea ConstrucÛii de MaÕini
structur|, 144 tablouri de poantori la Õiruri, 140
Catedra de Mecanic| Õi Programare
limbaj C unei valori structur| de
Curs deîntoarcerea tablouri multidimensionale, 126
c|tre o funcÛie, 150
transferul tablourilor Õi funcÛiilor ca
Copyrightmodific |riToate
2001. adusedrepturile
de standardizare,
sunt rezervate autorului. parametri de funcÛie, 129
142
tan () , 216
Multiplicarea acestui
operatorul document
de selec în scop comercial este interzis|.
Ûie al unui
tan h() , 216
membru de structur|, 144
SudenÛii participanÛi la orice form| de înv|Û|mânt superior
terminator bugetarÛiuni,
de instruc pot multiplica
61 acest
p->membru, 149
document pentru uzul personal.
tim e() , 231
poantori la structuri, 148
SudenÛii participanÛi la orice form| de înv|Û|mânt time_t , 231
cu plat| sau alte persoane doritoare
transferul variabilelor de tipul
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
tip, 25, 27
contact|| la:
scop m| puteÛistructur ca parametri de
funcÛie, 147 constant|, 34
ANTAL
stru , 231 Alexandru
ct tmTiberiu constanta Õir de caractere, 36
tel.: 0040-264-530918
suprapunerea if -urilor, 64
e-mail: antaltiberiu@pcnet.ro constante caracter, 35
switch , 65 constante cu nume, 37
system () , 228 constante enumerate, 38
constante numerice, 34

242
Index dr. ing. ANTAL Tiberiu Alexandru
Conf.
Universitatea Tenhic| din Cluj-Napoca
întregi,
Facultatea 29
ConstrucÛii de MaÕini vizibilitatea
Catedra de Mecanic|
real, 32 Õi Programare bloc, 87
Curs de limbaj C
simplu, 28 fiÕier, 87
variabile,
Copyright 27
2001. Toate prototip de funcÛie, 87
drepturile sunt rezervate autorului.
void , 28 vp rin tf() , 223
Multiplicarea acestui document în scop comercial este interzis|.
tipuri de baz|, 28 vsprintf() , 223
SudenÛii
tipuri de participanÛi
directive la orice form| de înv|Û|mânt superior bugetar pot multiplica acest W
document pentru uzul personal.
#define, 100, 103 w hile , 67
#if, #include, #ifdef, #ifndef,
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica#else, #endif,
documentul 103 contra cost Õi cu acordul scris al autorului. În acest
numai
scop m| puteÛi
TMP_MAX contact| la:
, 220
tm pfile() ,Tiberiu
ANTAL 221 Alexandru
tel.: 0040-264-530918
tm pn am e() , 221
e-mail: antaltiberiu@pcnet.ro
tolow er() , 214

tou pp er() , 214


type casting, 200
typedef , 155
Conf. dr. ing. ANTAL Tiberiu AlexandruU
Universitatea Tenhic| din Cluj-Napoca
UCHAR_MAX , 215 de MaÕini
Facultatea ConstrucÛii
Catedra
UC HA R_de IN , 215 Õi Programare
MMecanic|
Curs de limbaj C
UINT_MAX , 215

Copyright
ULONG_MAX 2001., 215
Toate drepturile sunt rezervate autorului.
und erscore , 27
Multiplicarea acestui document în scop comercial este interzis|.
un get() , 226
SudenÛii
union , 156participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
USHRT_MAX , 215

SudenÛii participanÛi la orice form| de înv|Û|mânt


V cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
va_a
scop m|rg , puteÛi
219 contact| la:
va_end , 219
ANTAL Tiberiu Alexandru
va_start , 114, 219
tel.: 0040-264-530918
variabile
e-mail: antaltiberiu@pcnet.ro
durata de existenÛ|, 27
vizibilitate, 27, 87
vfp rin tf() , 223
243
Biblio grafie
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare

Bibliografie
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


[1] Niklaus
Multiplicarea Wirth,
acestui ALGORITHMS+DATA
document STRUCTURES
în scop comercial este interzis|. = PROGRAMS,
PRENTICE-HALL, INC., 1976.
SudenÛii[2]participanÛi
Brian W. Kernighan, Dennis
la orice form| M. Ritchie,superior
de înv|Û|mânt THE C bugetar
PROGRAMMING
pot multiplica acest
document pentru
LANGUAGE, uzul personal.
SECOND EDITION, PRENTICE HALL SOFTWARE SERIES,
1988.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
[3] Steven Holzner with the Peter Norton Computing Group, C
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
PROGRAMMNIG, Brady Publishing, 1991.
scop m| puteÛi contact| la:
[4] Turbo C reference guide, Borland International Inc., 1987.
ANTAL [5]Tiberiu
Turbo Alexandru
C user's guide, Borland International Inc., 1987.
tel.: 0040-264-530918
e-mail:[6] Herbert Schild, C manual complet, Teora, 1998.
antaltiberiu@pcnet.ro
[7] Popescu, M., Floricica7 , I., Jitaru, M., Metode avansate de utilizare a tehnicii
de calcul, Editura Militara7 , Bucures- ti, 1989.
[8] M., Sargent, R., L., Shoemaker, The IMB PC from the inside out, Addison-
Wesley Publishing Company, 1986.
[9]ing.
Conf. dr. A., S., Tanenbaum,
ANTAL Alexandru structurata7 a calculatoarelor, edit-ia a IV-a,
TiberiuOrganizarea
Computer Press AGORA, 1999.
Universitatea Tenhic| din Cluj-Napoca
Facultatea
[10] ConstrucÛii
Giumale, C.de MaÕini
Kalisz, E., Structura datelor s- i tehnici de programare, Lito.
Catedra de
IPB, 1981. Mecanic| Õi Programare
Curs de limbaj C
[11] A., V., Aho, J., D. , Ullman, THE THEORY OF PARSING,
TRANSLATION, AND
Copyright 2001. Toate COMPILING,
drepturile VOLUME
sunt rezervate I: PARSING, PRENTICE-HALL,
autorului.
INC.
[12] C. acestui
Multiplicarea H. Smedema, P. Medema,
document M. Boasson,
în scop comercial este The programming languages
interzis|.
Pascal, Modula, CHILL, Ada, Prentice Hall Inc., 1983.
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
[13] Leon Livovschi, Bazele informaticii, Editura Albatros, 1979.
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

244
ANEXAdr.
Conf. 1 -ing. 7 comparat
O scurta
ANTAL -ie întreAlexandru
Tiberiu C s-i FORTRAN
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

ANEXA 1 - Scurta7 comparat-ie


Copyright 2001. Toate drepturile sunt rezervate autorului.

C - FORTRAN în domeniul
Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest

calculului numeric
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare

A
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
ceast| anex| apare într-o carte de C numai pentru c| în lumea calculelor
numerice
ANTAL Tiberiu prostia a început s| se manifeste din plin. Firme serioase au cedat în
Alexandru
faÛa presiunilor
tel.: Õi a modei venite din America intoxicând lumea calculelor numerice cu tot
0040-264-530918
felul de rutine scrise în C Õi C++. Aceast| tendinÛ| ciudat| este probabil întreÛinut| Õi de
e-mail: antaltiberiu@pcnet.ro
persoane care nu au experienÛ| în calculul numeric, domeniu în care b|trânul FORTRAN
predomin|, deÕi în ultima vreme a cam început s| piard| teren din motivele descrise mai
sus. Iat| câteva dintre calit|Ûile FORTRAN-ului culese de mine de pe Internet:

A.
Conf. dr.FORTAN
ing. ANTALsatisface mai bine nevoile oamenilor de s- tiint-a
Tiberiu Alexandru 7 decât C
pentru
Universitatea 7 : din Cluj-Napoca
ca
Tenhic|
Facultatea ConstrucÛii de MaÕini
- permite lucrul cu tablouri de dimensiune variabil| în subrutine, din acest motiv
Catedra de Mecanic| Õi Programare
pot fi scrise rutine cu scop general, f|r| a specifica explicit dimensiunea tabloului care este
Curs de limbaj C
transferat. C standard nu are aceast| facilitate important|, iar preÛul pl|tit const| în
complicarea codului care s| poat| trata aceste cazuri. Unele compilatorare, de exemplu
Copyright 2001. Toate drepturile sunt rezervate autorului.
gcc , au aceast| extensie nestandard;

- are unacestui
Multiplicarea grup mare
document în Ûscop
de func ii intrinseci cu precizie
comercial generic|. Aceste funcÛii pot fi
este interzis|.
optimizate foarte bine (prin scrierea lor în limbaj de asamblare cu optimizarea folosirii
cache-ului)
SudenÛii Õi asigur|la oorice
participanÛi oarecare
form|standardizare
de înv|Û|mânt asuperior
programelor lapot
bugetar un multiplica
nivel mai acest
înalt,
documentportabilitatea;
crescând pentru uzul personal.
- asigur| intern lucrul cu aritmetica numerelor complexe;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
- are implementat
pot multiplica documentulun operator
numai contraexponen Ûialacordul
cost Õi cu infix care este
scris generic înÎn
al autorului. raport
acest cu
precizia Õi tipulcontact|
scop m| puteÛi la: | foarte eficient cazuri speciale frecvente de genul numa7 r
care trateaz
flotan t ** întreg m ic ;
ANTAL TiberiudeAlexandru
- indicii tablouri pot începe de la un întreg arbitrar;
tel.: 0040-264-530918
FORTRAN 90 suport| o notaÛie de tablou care permite operaÛii pe porÛiuni de
e-mail:-antaltiberiu@pcnet.ro
tablou, acesta fiind un avantaj în cazul calculului paralel;
- FORTRAN 90 suport| selecÛia automat| a tipurilor de date numerice având
specificate precizia Õi domeniul ceea ce face programele înca7 Õi mai portabile;
- extensiile FORTRAN pentru programare paralel| sunt strandardizate de
245
ANEXAdr.
Conf. 1 -ing. 7 comparat
O scurta
ANTAL -ie întreAlexandru
Tiberiu C s-i FORTRAN
Universitatea Tenhic| din Cluj-Napoca
consor Ûiul High
Facultatea Performance
ConstrucÛii de MaÕini Fortran .
Catedra de Mecanic| Õi Programare
Curs de limbaj C
FORTRAN 90 suport| majoritatea facilit|Ûilor specifice limbajelor C (poantori, alocare
dinamic
Copyright| de2001.
memorie
Toateetc.) Õi C++sunt
drepturile (supraînc|rcarea
rezervate operatorilor, obiecte simple) având
autorului.
în plus o sofisticat| capacitate de manipulare a tablourilor. Are facilit|Ûi privind precizia
numeric | Õi controlul
Multiplicarea domeniului,
acestui document în crescând astfel portabilitatea
scop comercial este interzis|. programelor.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
B. Modul de proiectare a limbajului FORTRAN permite viteza
document pentru uzul personal.
7
maxima 7 în execut-ie:
SudenÛii participanÛi 77
- FORTRAN la orice form|| de
nu lucreaz înv|Û|mânt
explicit cu plat|
cu poantori, sau alte
motiv persoane
pentru doritoare
care optimizarea
pot multiplica documentul numai contra cost Õi
automat| a codului este simplificat|; FORTRAN 90 permite poantori expliciÎn
cu acordul scris al autorului. Ûi, acest
îns| cu
scop m| puteÛi contact| la:
restricÛii care s| nu d|uneze optimiz|rii automate de cod;

ANTAL - FORTRAN a fost proiectat pentru a permite alocarea static| a memoriei, astfel
Tiberiu Alexandru
tel.: 0040-264-530918cu crearea Õi distrugerea înregistr |rilor de activare de pe stiv|,
nu se pierde timpul
pentru
e-mail: fiecare apel de procedur|. Proceduri recursive nu sunt posibile cu alocarea static|,
antaltiberiu@pcnet.ro
dar pot fi simulate eficient dac| este cazul;
- FORTRAN nu permite folosirea unor nume alternative între variabilele globale
(COMMON) Õi argumentele fictive.
Toate aceste restricÛii asigura7 o mai buna7 optimizare a codului fat-a7 de C.
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea
C. Exist| Tenhic|
deja scrisdinunCluj-Napoca
numeros cod FORTRAN, care în mare parte este public Õi de
Facultatea ConstrucÛii de
foarte bun| calitate. MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C
D. C standard specific| numai existenÛa bibliotecilor matematice în dubl| precizie
Copyright 2001.
(doub Toate drepturile
le ). Standardul oblig| laautorului.
sunt rezervate
FORTRAN existent-a bibliotecilor în simpl| Õi dubl|
precizie, în plus mulÛi produc|tori furnizeaz| biblioteci Õi pentru quad-precizie
Multiplicarea acestui
(long dou document
ble , RE în scopîncomercial
AL*16 ). Codul este interzis|.
simpl| precizie va fi mai rapid decât cel în dubl|
precizie întrucât datele în simpl| precizie ocup| mai puÛin spaÛiu de RAM.
SudenÛii participanÛi
Calculele la orice form|
în quad-precizie de înv|Û|mânt
(long superior
d ou ble ) sunt uneori bugetar
necesare pot multiplica
pentru acest
a minimiza
document pentru
erorile uzul personal.
de rotunjire. În C exist| rutine matematice numai pentru doub le , acestea
vor consuma un timp mai lung decât cel necesar în calcule de simpl| precizie, iar
SudenÛii participanÛi
exactitatea lorlavaorice
l|sa form|
de doritdedac
înv|Û|mânt cu plat|
| sunt folosite cu sau alte persoane doritoare
long d ou ble .
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
E. FORTRAN este proiectat sa 7 efectueze calculele numerice foarte
ANTAL Tiberiu Alexandru
clar s- i precis definite pentru ca 7:
tel.: 0040-264-530918
1) Ordinea
e-mail: evalu|rii expresiilor aritmetice este precis definit| Õi poate fi controlat| prin
antaltiberiu@pcnet.ro
paranteze;
2) DeclaraÛiile implicite de tip scurteaz | timpul de scrierea a programelor, dar în acelaÕi
timp fac programele mai vulnerabile la erori Õi complica7 depanarea;

246
ANEXAdr.
Conf. 1 -ing. 7 comparat
O scurta
ANTAL -ie întreAlexandru
Tiberiu C s-i FORTRAN
Universitatea Tenhic| din Cluj-Napoca
3) Nu este dependent
Facultatea ConstrucÛii de
de scrierea
MaÕini cu litere mari sau mici;
Catedra
4) Nu aredecuvinte
Mecanic| Õi Programare
cheie rezervate, programatorul având libertatea deplin| în alegerea
Curs de limbaj C
numelor de identificatori;
5) Principiul
Copyright o linie
2001. pe rând
Toate creÕtesunt
drepturile multrezervate
lizibilitatea programelor;
autorului.
6) Este un limbaj mult mai uÕor de înv|Ûat decât limbajul C.
Multiplicarea acestui document în scop comercial este interzis|.

F. Compilatoarele
SudenÛii participanÛi la FORTRAN emit
orice form| de înv|Û|mânt eroare Õbugetar
mesaje desuperior i de diagnosticare multacest
pot multiplica mai
bune
document decâtuzul
pentru cele personal.
C.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

247
ANEXAdr.
Conf. 2 -ing.
Citirea declarat-Tiberiu
ANTAL iilor C Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

ANEXA 2 - Citirea declarat-iilor C


Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

D
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document

complexe
pentru
eclara Ûiileuzul

SudenÛii participanÛi
complexe trebuie
personal.
folosite

se poate descompune
în curs au fost relativ simple: int, float, tablouri de char,
structuri de tipuri de baz| Õi poantori la acestea. Citirea unei declaraÛii C
în câÛde
la orice form|
s| cunoa
paÕi elementari.
ivaînv|Û|mânt
Õtem contra
regulile
Pentru
cu plat| a putea
sau alte | declaraÛii
citi însdoritoare
persoane
le foloseÕÎn
pot multiplica documentul numai costpe care
Õi cu compilatorul
acordul scris al autorului. te acest
pentru
interpretarea declara
scop m| puteÛi contact| la:Ûiilor. Etapele de parcurs pentru înÛelegerea unei declara Ûii sunt:
Ø IdentificaÛi numele variabilei care se declar|;
ANTAL
Ù RotiÛi-vTiberiu Alexandru
| în afar | în sens trigonometric (antiorar, yang);
tel.: 0040-264-530918
Ú
e-mail: antaltiberiu@pcnet.ro
La întâlnirea lui CitiÛi
* poa ntor la

[ ] tablou de

Conf. (dr.
) ing. ANTAL Tiberiu funct-ie care a re ... s- i ca re înto arce
Alexandru ...
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Û CitiÛi stru ct S , union U sau e nu m E dintr-o singur| bucat|;
Catedra de Mecanic| Õi Programare
Ü Ûi colec
Citide
Curs Ûiile
limbaj C adiacente de [ ][ ] dintr-o singur| bucat|.

Copyright
Exemplul2001.
1 Toate drepturile sunt rezervate autorului.
Fie declaraÛia:
Multiplicarea acestui document în scop comercial este interzis|.
floa t *p[7 ];
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
DeclararaÛpentru uzul
ia de mai suspersonal.
poate s| specifice:
1) un tablou de 7 poantori la float sau
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
2) un poantor
pot multiplica la un tablou
documentul numai de 7 float
contra . Õi cu acordul scris al autorului. În acest
cost
scop m| puteÛi contact| la:
Începem citirea cu numele variabilei care se declar|, adic|
ANTAL
cu p . Ne Tiberiu Alexandru
rotim spre în afar| în sens trigonometric Õi g|sim [7]. Acum putem spune deja
de 7 . Continuând cu rotirea d|m peste * care se citeÕte poantor la ; pentru c| avem
tel.: 0040-264-530918
tablou
deja
e-mail:7 buc |Ûi vom spune mai precis 7 poa ntor i la , trecem mai departe printre ] Õi ;
antaltiberiu@pcnet.ro
ajungând în final la float. Sistematizând cele citite mai sus, putem scrie:
p este un
1) tablou de 7

248
ANEXAdr.
Conf. 2 -ing.
Citirea declarat-Tiberiu
ANTAL iilor C Alexandru
Universitatea Tenhic| din Cluj-Napoca
2) poa ntori
Facultatea ConstrucÛii la
de MaÕini
3) float Õi Programare
Catedra de Mecanic|
Curs de limbaj C
Deci, variabila p este un tablou care are 7 elemente, fiecare dintre acestea fiind un
Copyright 2001.. Toate drepturile sunt rezervate autorului.
poantor la float
Multiplicarea acestui document în scop comercial este interzis|.
Exemplul 2
SudenÛii
Fie declara Ûia:
participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.
int (*p) [11];

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Diferen Ûa esendocumentul
pot multiplica Ûial| faÛ| de exemplul anterior
numai contra este
cost Õi cu un
acordul scris al autorului. În acest
set de paranteze rotunde
scop m| puteÛi contact| la: în jurul lui *p . De Õ i s-ar
pa7 rea c| efectul acestora este nesemnificativ, acestea
vor modifica ordinea de parcurgere în sipral| yang.
ANTAL Tiberiu Alexandru
Se începe cu p care este variabila declarat|, se
tel.: 0040-264-530918
continu | spirala în interiorul parantezelor Õi întâlnim
e-mail:
un * careantaltiberiu@pcnet.ro
ne face s| spunem poan tor la . Apoi
continu|m rotirea în spiral| în afara parantezelor,
întâlnim [11] Õi vom putea spune tablou de 11. Apoi termin|m spirala la int. Sistematizând,
putem spune:
p este
1) un poa ntor la
Conf. dr. ing. ANTAL Tiberiu Alexandru
2) un ta blou
Universitatea Tenhic| d e 11
din Cluj-Napoca
3) int de MaÕini
Facultatea ConstrucÛii
Catedra de Mecanic| Õi Programare
Curs de limbaj C
Deci variabila p este un singur poantor. La cap|tul poantorului, dup| iniÛializare, se va afla
un tablou de 11 întregi (int).
Copyright 2001. Toate drepturile sunt rezervate autorului.

Exemplul 3 acestui document în scop comercial este interzis|.


Multiplicarea
Fie declaraÛia:
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
short **a[3 ][7];
document pentru uzul personal.

Mai
SudenÛii g|sim variabila
întâiparticipanÛi la oricecare se declar
form| |, adic| pecu
de înv|Û|mânt a .plat| sau alte persoane doritoare
Apoi ne rotim în spiral | yang Õ i g | sim pe , care se
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
[3][7]
scopÕte
cite m|conform regulilorla:expuse dintr-o bucat|, adic|
puteÛi contact|
tablou de 3 tablouri de 7 . Continuând rotirea g|sim
cel mai apropiat * de a Õi zicem poa ntor la , apoi g|sim
ANTAL Tiberiu Alexandru
cel|lalt * spunând din nou poantor la . La ultima
tel.:
spiral0040-264-530918
|, ieÕim între ] Õi ; Õi d|m peste short . Deci putem
e-mail:
zice: antaltiberiu@pcnet.ro
a este un
1) un tablou 3 tablouri de 7
2) poa ntori la
249
ANEXAdr.
Conf. 2 -ing.
Citirea declarat-Tiberiu
ANTAL iilor C Alexandru
Universitatea Tenhic| din Cluj-Napoca
3) poa ntori
Facultatea ConstrucÛii la
de MaÕini
4) shortÕi Programare
Catedra de Mecanic|
Curs de limbaj C
aeste un tablou de 3 tablouri de 7 poantori la poantori la short .
Copyright 2001. Toate drepturile sunt rezervate autorului.

Exemplul
Multiplicarea 4 acestui document în scop comercial este interzis|.
Fie declaraÛia:
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
floa t *f(in t, do ub le);
document pentru uzul personal.

Începem cu spirala la
SudenÛii participanÛi dinorice
f , întâlnim
form| demai întâi (int,
înv|Û|mânt cu plat| sau alte persoane doritoare
doub le ) Õi spunem
pot multiplica funct- ie numai
documentul care are cost Õietri
ca param
contra cu de
acordul scris al autorului. În acest
intrare un int -
s i
scop m| puteÛi contact| la:un double -
s i întoarce , la
urm|toarea spiral| g|sim pe * Õi spunem poa ntor la ,
apoi, în final, ajungem la float. Deci,
ANTAL Tiberiu Alexandru
f este:
tel.: 0040-264-530918
1) o funct-ie, ca re a re ca par am etri d e in trar e u n in t s- i un float s- i
e-mail: antaltiberiu@pcnet.ro
întoarce
2) un poa ntor la
3) float

Avem de aing.
Conf. dr. faceANTAL
deci cu prototipul unei funcÛii cu numele f care are ca parametri de intrare
Tiberiu Alexandru
un int Õi un doub le Õi întoarce un
Universitatea Tenhic| din Cluj-Napocapoantor la un long .
Facultatea ConstrucÛii de MaÕini
Catedra
Exemplul de Mecanic|
5 Õi Programare
Curs de limbaj C
Fie declaraÛia:
cha r
Copyright (*pf)(void
2001. Toate);drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.


Aici apare un set de paranteze rotunde în jurul lui *pf.
Este declarat| variabila pf ; parantezele rotunde ne
SudenÛii
oblig| s| participanÛi la orice
realiz|m spirala form|
yang de înv|Û|mânt
în interioul superior bugetar pot multiplica acest
lor întâlnind
document
pe * pentrupentru personal.la. Apoi g|sim pe (void)
uzul poantor
care citim
Õi citim funct-ie care nu are p ara m etri s- i care întoarce,
continuând spirala nela oprim
SudenÛii participanÛi în final
orice form| de la char . Deci
înv|Û|mânt cu pf
plat| sau alte persoane doritoare
este:
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi1)contact| la: la o
un poantor
2) funct-ie care nu are p ara me tri s- i întoarce un
ANTAL Tiberiu Alexandru
3) char
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Astfel, pf nu este un prototip de funcÛie, ci declaraÛia unui singur poantor cara va stoca o
funcÛie. Un astfel de tip de poantor va putea poanta, de exemplu în segmentul de cod.

250
ANEXAdr.
Conf. 2 -ing.
Citirea declarat-Tiberiu
ANTAL iilor C Alexandru
Universitatea Tenhic| din Cluj-Napoca
Exemplu 6
Facultatea ConstrucÛii de MaÕini
Fie
Catedra de ÛMecanic|
declara ia: Õi Programare
Curs destru
limbaj
ct comC plex (*tpf[7]) (void);

Copyright 2001. Toate drepturile sunt rezervate autorului.


Acest exemplu este imposibil de înÛeles f|r|
aplicarea
Multiplicarearegulilor. Începem încuscop
acestui document tpf. Apoi
comercial este interzis|.
parcurgând spirala yang, ajungem la [7] Õi citim
tablou de 7 . Continuând g|sim pe * Õi citim
SudenÛii
poantor laparticipanÛi la orice
, apoi ajungem form|citind
la (void) de înv|Û|mânt
funct- ie superior bugetar pot multiplica acest
document
care pentru
nu are uzul
para m etripersonal.
s- i întoarce . Acum se ajunge la struct complex , care fiind un caz
special, se citeÕte aÕa cum este scris. Punând toate cele zise cap la cap, avem:
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
tpf este un
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi1)contact|
tablou de 7
la:
2) poa ntori la
ANTAL Tiberiu Alexandru
3) funct-ii care nu au param etru de intrare s- i întorc
tel.: 0040-264-530918
4) structuri complex
e-mail: antaltiberiu@pcnet.ro

tpd este un tablou de 7 poantori la funcÛii care întorc prin valoare câte o structur|
complex . Fiecare funcÛie întoarce câte o singur| structur| de tipul complex .

Exemplul 7
Conf. dr. ing. ANTAL Tiberiu Alexandru
Fie declaraÛia:
Universitatea Tenhic| din Cluj-Napoca
int (*(*pfpa
Facultatea )(void))[5];
ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs
Iat| ode limbaj
declara ÛieCcare probabil v-ar putea face s|
picaÛi un examen. TotuÕi, s| aplic|m regulile deja
Copyright
prezentate.2001. pfpaToate drepturile
este sunt declarat
variabila rezervate |. autorului.
Realiz|m parcurgerea în spiral| din interiorul
parantezelor, ceea cedocument
Multiplicarea acestui ne conduce la comercial
în scop * , citind este interzis|.
poantor la . Parcurgerea în spiral| ne conduce
mai departe
SudenÛii la (void), la
participanÛi citind
oricefunct -ie de
form| care nu are param
înv|Û|mânt s- i întoarce
etri bugetar
superior pot. În continuare
multiplica se
acest
ajunge la [5] care se va citi tablou de 5 Õi termin|m cu int. Recapitulând, pfpa este:
document pentru uzul personal.
1) un poa ntor la
SudenÛii participanÛi la-orice
2) o funct form|
ie care de înv|Û|mânt
nu are parametri cu de plat| saus-alte
intrare persoane
i care întoarcedoritoare
pot multiplica3) documentul numai contra cost Õi cu acordul scris al autorului. În acest
un poa ntor la
scop m| puteÛi contact| la:
4) un tablou de 5
ANTAL Tiberiu 5) int
Alexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
Astfel, pfpa declar| un singur poantor. Restul declaraÛiei se foloseÕte numai pentru a
specifica ce anume se afl| la cap|tul poantorului dup| iniÛializare. Este un poantor la un
cod, poantând la o funcÛie f|r| parametri Õi care întoarce un poantor ce poanteaz| la un
tablou de 5 valori int.

251
ANEXAdr.
Conf. 2 -ing.
Citirea declarat-Tiberiu
ANTAL iilor C Alexandru
Universitatea Tenhic| din Cluj-Napoca
Exemplul 8
Facultatea ConstrucÛii de MaÕini
Fie
Catedra de ÛMecanic|
declara ia: Õi Programare
Curs decha
limbaj
r *(*(*Cpf)(in t))(cha r);

Copyright 2001. Toate drepturile sunt rezervate autorului.


pf este un poa ntor la , datorit| parantezelor
rotunde Õi a luiacestui
Multiplicarea * , urmeaz| (int) Õi citim funct- ie
document în scop comercial este interzis|.
care are un pa ram etru de tip ul in t s- i întoarce .
Continuând parcurgerea în spiral| yang, întâlnim
SudenÛii participanÛi
pe * cu semnifica Ûia la orice
poa ntorform| de înv|Û|mânt
la , urmeaz | apoi superior bugetar pot multiplica acest
document
(char) pentru
Õi citim uzul
funct -ie personal.
care are un pa ra m etru
de tipul char s- i întoarce . Urmeaz| înc| un * citit
SudenÛii
poa ntor la , apoi în final
participanÛi la orice .
charform| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica
pf este documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:
1) un poa ntor la
ANTAL Tiberiu funct- ie ca re a re u n p ara m etru int s- i întoarce un
2) oAlexandru
3) poantor la
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro
4) o funct-ie care are un param etru char s- i întoarce un
5) poa ntor la
6) char

Astfel, pf este declaraÛia unui singur poantor din nou. Restul declaraÛiei serveÕte numai
Conf. dr. ing. ANTAL
la specificarea tipului Tiberiu
poantatAlexandru
de poantor. Avem un poantor la o funcÛie care are un
Universitatea
parametru de Tenhic| Õi care
tipul intdin întoarce un poantor. Poantorul întors poanteaz| la o alt|
Cluj-Napoca
func Ûie careConstrucÛii
Facultatea are ca parametru
de MaÕiniun char Õi care întoarce o valoare tot de tipul char.
Catedra de Mecanic| Õi Programare
Curs de limbaj C
ÎnÛelegerea declaraÛiilor complexe poate fi mult uÕurat| prin folosirea lui typedef. Dac|
dorim s| simplific|m declaraÛia floa t* p[7 ]; care declar| un tablou p de 7 poantori la float,
Copyright
vom începe2001. Toate drepturile
întotdeauna de la cap|sunt rezervate
t. Cre autorului.
|m un nou tip poantor la float cu numele de ptf.
Tabelul care urmeaz| prezint| câteva dintre variantele de folosire ale lui typedef pentru
Multiplicarea
exemplele dejaacestui document în scop comercial este interzis|.
parcurse.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
Declara
document pentru Ûie personal.
uzul init-iala7 cu typedef
floa t *p[7 ]; - tablou p de 7 (1) poantori (1) typede f float * ptf;
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
la float.
pot multiplica documentul numai contra cost Õi cu acordul
ptf p[7 ]; scris al autorului. În acest
scop m| puteÛi contact| la:
short **a[3 ][7]; - a este un tablou de 3 (1) typedef short ** pps;
tablouri de 7 (1) poantori la poantori la pps a[3][7];
ANTAL Tiberiu
short ; putem în Alexandru
continuare crea un (2)
tel.: 0040-264-530918
tablou de 3 poantori la poantori la sau
e-mail: dup| care crearea lui a va fi
short , antaltiberiu@pcnet.ro (2) typ ed ef p ps a3[3];
simpl|.
a3 a[7];

char (*pf)(void) - pf este un poantor la (1) typed ef ch ar f(v oid );


(1) o funcÛie f|r| parametri.
f *pf;

252
ANEXAdr.
Conf. 2 -ing.
Citirea declarat-Tiberiu
ANTAL iilor C Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
stru ct comConstrucÛii
plex (*tpf[7]) de(void);
MaÕini- tpf (2) typed ef struct com plex f(void );
este un de
Catedra tablou
Mecanic| Õi Programare
de 7 (1) poantori la (2) (1) typede f f *pf;
funcÛde
Curs ii far | parametri
limbaj C care întorc
structuri complex . pf tpf[7];

Copyright 2001. Toate drepturile sunt rezervate autorului.


int (*(*pfpa )(void))[5]; - pfpa este (1) un (3) typ ed ef in t (*pt6 )[6];
Multiplicarea acestui
poantor la o (2) funcdocument în scop comercial este interzis|.
Ûie f|r| parametri (2) type de f pt6 f(void );
care întoarce (3) un poantor la un
SudenÛii
tablou departicipanÛi
6 int. (1) typedef
la orice form| de înv|Û|mânt f *pfpa;
superior bugetar pot multiplica acest
document pentru uzul personal.
cha r *(*(* pf)(in t))(cha r); - pf este un (4) typedef char *ptc;
(1) poantor la o funcÛie cu un
SudenÛii participanÛi la orice form| de înv|Û|mânt(3) typed ef ptc
cu plat| f(cha
sau alter);persoane doritoare
parametru int care întoarce (2) un
pot multiplica
poantor la (3)documentul
o funcÛie carenumai
are contra
un cost
(2)Õi cu acordul
typede scris al autorului. În acest
f f *ptf;
scop m| puteÛi
parametru contact|
char la:
care întoarce (4) un (1) ptf (*pf) (int);
poantor la char.
ANTAL Tiberiu Alexandru
tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru


Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

253
GLOSAR
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare

Glosar
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

AS CII
Multiplicarea acestui documentAîn merican S tandard
scop comercial C ode
este for I nformation I nterchange
interzis|.
este un standard pe 7 biÛi pentru codificarea setului de
caractere
SudenÛii participanÛi la orice form| folosit de superior
de înv|Û|mânt sistemelebugetar
de calcul.
pot multiplica acest
document pentru uzul personal.
BIOS B asic I nput O utput S ystem este o interfaÛa 7 software de
nivelde
SudenÛii participanÛi la orice form| foarte jos cu hardware-ul
înv|Û|mânt cu plat| sau unui PC. Estedoritoare
alte persoane
implementat | în ROM BIOS Õi înc | 7 la boot-area
rcata
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la: PC-ului.
Bit (bit) b inary digit , denumirea unit|Ûii de informaÛie; în
ANTAL Tiberiu Alexandru
tehnica de calcul este cea mai mic| unitate de stocare,
tel.: 0040-264-530918
suficient| pentru stocarea unui bit.
e-mail: antaltiberiu@pcnet.ro
Boolean o variabil| care poate lua numai dou| valorile:
adeva 7 rat sau fals . Denumirea vine de la Ge org e B oole ,
matematician britanic, care a creat un sistem
matematic ce lucra numai cu dou| valori de adev|r.
Boot-are
Conf. termenul vine din "to pull oneself up by one's
dr. ing. ANTAL Tiberiu Alexandru
bootstraps" Õi semnific| procesul de înc|rcare Õi
Universitatea Tenhic| din Cluj-Napoca
iniÛializare a sistemului de operare.
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Buffer
Curs de limbaj C o zon| de memorie care asigur| stocarea temporar| a
datelor pentru dispozitivele de I/E.
Copyright 2001. Toate drepturile
By te ( octet) sunt rezervate
o component autorului.
| în ierarhia de date a unui sistem de
calcul, tipic| pentru stocarea unui caracter (în
Multiplicarea acestui documentsistemele
în scop comercial
de calculeste interzis|.
pe 36 de biÛi are 9 biÛi, iar pe unele
sisteme mai vechi, 6 sau 7 biÛi).
SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document
Cache pentru uzul personal.o zon| de memorie cu informaÛie salvat| pentru
referiri ulterioare.
SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
Device
pot (driver de numai
driverdocumentul
multiplica un contra
software folosit
cost Õi cu pentru
acordulcomanda unui dispozitiv
scris al autorului. În acest
dispozitiv)
scop m| puteÛi contact| la: hardware.
FAT F ile A llocation T able este sistemul de fiÕiere nativ al
ANTAL Tiberiu Alexandru
sistemului de operare DOS.
tel.: 0040-264-530918
G UI antaltiberiu@pcnet.ro G raphical U ser I nterface este o denumire utilizat|
e-mail:
pentru interfeÛele grafice prin care utilizatorul poate
comanda un sistem de calcul.

254
GLOSAR
Conf. dr. ing. ANTAL Tiberiu Alexandru
Universitatea Tenhic| din Cluj-Napoca
Facultatea
Interrupt ConstrucÛii de MaÕini
(întrerupere) un eveniment care suspend| procesul curent activ Õi
Catedra de Mecanic| Õi Programare
produce comutarea UCP pe un proces nou.
Curs de limbaj C
Interrupt driven un sistem care este controlat prin întreruperi.
Copyright 2001. Toate drepturile sunt rezervate autorului.
Interrupt handler ( rutina 7 un program care prelucreaz| întreruperi.
pentru tratarea
Multiplicarea acestui document în scop comercial este interzis|.
întreruperii)
SudenÛii
LibraryparticipanÛi
7 )la orice form|
(biblioteca deÛie
o colec înv|Û|mânt
de rutine superior
software bugetar pot
disponibil multiplica
| pentru acest
toate
document pentru uzul personal.programele.

SudenÛii
Machine participanÛi limbaj
language la orice form| decu instrucÛiuni
înv|Û|mânt cu înÛelese
plat| saudirect de UCP. doritoare
alte persoane Cel mai
(limbaj
pot mas- ina
multiplica 7)
documentul apropiat
numai cost Õide
contralimbaj cu cel maÕinscris
acordul | este
allimbajul de În acest
autorului.
scop m| puteÛi contact| la: asamblare.
M acro sau
ANTAL macrodefinit
Tiberiu -ie o referinÛ| simbolic| la un grup de instrucÛiuni sau
Alexandru
tel.: 0040-264-530918 date. Simbolul este înlocuit prin instrucÛiuni sau valori
e-mail: antaltiberiu@pcnet.ro actuale în faza de expandare a macrodefinit-iei.
Octet (octet) 8 biÛi, termenul este folosit în domeniul reÛelelor de
calculatoare în locul lui by te , întrucât pe unele sisteme
de calcul acesta nu are 8 biÛi.
Type (tip) o mulÛime de valori din care o variabil| sau o constant|
Conf. dr. ing. ANTAL Tiberiu Alexandru
poate lua valori.
Universitatea Tenhic| din Cluj-Napoca
Facultatea ConstrucÛii de MaÕini
Catedra de Mecanic| Õi Programare
Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document în scop comercial este interzis|.

SudenÛii participanÛi la orice form| de înv|Û|mânt superior bugetar pot multiplica acest
document pentru uzul personal.

SudenÛii participanÛi la orice form| de înv|Û|mânt cu plat| sau alte persoane doritoare
pot multiplica documentul numai contra cost Õi cu acordul scris al autorului. În acest
scop m| puteÛi contact| la:

ANTAL Tiberiu Alexandru


tel.: 0040-264-530918
e-mail: antaltiberiu@pcnet.ro

255

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