Documente Academic
Documente Profesional
Documente Cultură
C PDF
C PDF
Prefat-a
7
Copyright 2001. Toate drepturile sunt rezervate autorului.
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:
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:
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:
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:
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:
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:
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
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
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
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
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:
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:
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
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.
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
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
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
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:
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:
Î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.
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.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|:
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:
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.
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:
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
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.
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".
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
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
# 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?
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.
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 .
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
Î
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.
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];
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]
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]
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
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].
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
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.
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
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:
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 */
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:
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:
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
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
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|.
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|.
- 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
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 .
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
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 .
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
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
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
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.
54
Capitolul
Conf. - Op eratorii
dr.4 ing. ANTAL limb ajului C Alexandru
Tiberiu
Universitatea Tenhic| din Cluj-Napoca
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
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.
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:
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 .
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
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);
Î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
(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)
Î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:
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
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.
7:
Form a expresie;
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
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
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
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
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:
}
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;
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).
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.
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
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
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 */
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:
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)
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:
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
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 }
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
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.
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
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:
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 .
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 }
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)!
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 }
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:
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:
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
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.
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.
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.
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
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
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
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:
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
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:
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;
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
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.
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
funct-iilor
e-mail: antaltiberiu@pcnet.ro
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.
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
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:
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
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).
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:
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.
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
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]
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.
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
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
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
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 }
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
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 }
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.
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.
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].
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".
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.
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.
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.
Î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.
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
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:
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
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.
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:
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
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
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:
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|.
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:
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
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
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:
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:
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:
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
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.
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:
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:
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
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.
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.
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
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 };
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
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]);
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};
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');
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]);
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 .
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
(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:
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.
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.
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);
#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.
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:
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
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.
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
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.
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
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
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.
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.
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:
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 ];
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;
}
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
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:
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
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:
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.
/* 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.
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:
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
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.
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.
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.
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 */
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:
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 ;
}
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;
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:
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:
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
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
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');
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)
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 .
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:
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
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.
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
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
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.
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.
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.
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 .
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:
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);
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:
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.
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
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
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
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
Bibliografie
Curs de limbaj 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:
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
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:
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:
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
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.
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.
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);
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);
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];
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];
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:
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
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
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:
255