Sunteți pe pagina 1din 107

Centro Tecnolgico de Mecatrnica

Fundamentos de
Linguagem C
ou
Tudo que voce precisa saber sobre C para no passar vergonha!
Caxias do Sul, novembro de 1997
1
Conselho Regional do SENAI - RS
Presidente
Dagoberto ima !odo"
Conselheiros
#itulares Su$lentes
Deomedes Ro%ue #alini &ala"r '(lio )osia*+
Enio ,*io S*heln &aldomiro -o*hese da Cunha
Astor .ilton S*hmitt /os( Carlos Cerveri
Diretoria SENAI - SR
Diretor Regional
/os( 0ort(a
Diretor Tcnico
1aulo 2ernando 1resser
Diretor Administrativo e Financeiro
Adalberto ui3 enhard
4
A$resenta56o
7 texto %ue segue ( um resumo dos to$i*os 8undamentais sobre a linguagem C9
C ( uma linguagem $oderosa, robusta, 8lexivel e madura9 Conhe*er todos os seus detalhes,
tru%ues e armadilhas re%uer um estudo *riterioso e $ro8undo9 .as o C ( uma linguagem de sintaxe
sim$les e elegante %ue $ermite ra$ido entendimento $elo $rogramador ini*iante9 Desde sua *ria*ao, o C
tornou-se uma linguagem $o$ular tanto entre $rogramadoere $ro8issionais %uanto ini*iantes9
Neste *ontexto, $ro*uramos abordar os to$i*os essen*iais da linguagem %ue nos $ermite es*rever
um $rograma *om$leto e util9
Es$eramos ter al*an5ados os ob:etivos $ro$ostos, e em $r;ximas edi5<es, a$rimora-las9
Adalberto A9 Dornelles 29
=
A$>ndi*e A9 #abela ASCII
As tabelas mostradas neste a$>ndi*e re$resentam os 4?@ *;digos usados nos *om$utadores da
8amAlia I-.9 Esta tabela re8ere-se ao American Standard Code for Information Interchange B*;digo
$adr6o ameri*ano $ara tro*a de in8orma5<esC, %ue ( um *on:unto de n,meros re$resentando *ara*teres ou
instru5<es de *ontrole usados $ara tro*a de in8orma5<es entre *om$utadores entre si, entre $eri8(ri*os
Bte*lado, monitor, im$ressoraC e outros dis$ositivos9 Estes *;digos tem tamanho de 1 b"te *om valores de
00h a FFh BD a 4?? de*imalC9 1odemos dividir estes *;digos em tr>s *on:untosE *ontrole, $adr6o e
estendido9
7s $rimeiros =4 *;digos de 00h at( 1Fh BD a =1 de*imalC, 8ormam o conjunto de controle
ASCII9 Estes *;digos s6o usados $ara *ontrolar dis$ositivos, $or exem$lo uma im$ressora ou o monitor
de vAdeo9 7 *;digo 0Ch Bform feedC re*ebido $or ima im$ressora gera um avan5o de uma $Fgina9 7
*;digo 0Dh Bcarriage returnC ( enviado $elo te*lado %uando a te*la EN#ER ( $ressionada9 Embora exista
um $adr6o, alguns $ou*os dis$ositivos tratam di8erentemente estes *;digos e ( ne*essFrio *onsultar o
manual $ara saber exatamente *omo o e%ui$amento lida *om o *;digo9 Em alguns *asos o *;digo
tamb(m $ode re$resentar um *ara*ter im$rimAvel9 1or exem$lo o *;digo D1h re$resenta o *ara*ter
Bhappy faceC9
7s 9@ *;digos seguintes de 20h a 7Fh B=4 a 147 de*imalC 8ormam o conjunto padro ASCII9
#odos os *om$utadores lidam da mesma 8orma *om estes *;digos9 Eles re$resentam os *ara*teres usados
na mani$ula56o de textosE *;digos-8onte, do*umentos, mensagens de *orreio eletrGni*o, et*9 S6o
*onstituAdos das letras do al8abeto latino Bmin,s*ulo e mai,s*uloC e alguns sAmbolos usuais9
7s restantes 14H *;digos de 80h at( FFh B14H a 4?? de*imalC 8ormam o conjunto estendido
ASCII9 Estes *;digos tamb(m re$resentam *ara*teres im$rimAveis $orem *ada 8abri*ante de*ide *omo e
%uais sAmbolos usar9 Nesta $arte do *;digo est6o de8inidas os *ara*teres es$e*iaisE , , , u 999
I
De*9 'ex9 Controle
0 00h NUL (Null)
1 01h SOH (Start of Heading)
2 02h STX (Start of Text)
3 03h ETX (End of Text)
4 04h EOT (End of Transmision)
5 05h ENQ (Enquiry)
6 06h ACK (Acknowledge)
7 07h BEL (Bell)
8 08h BS (Backspace)
9 09h HT (Horizontal Tab)
10 0Ah LF (ine !eed)
11 0Bh VT ("ertical Tab)
12 0Ch FF (!orm !eed)
13 0Dh CR (#arriage $eturn)
14 0Eh SO (S%ift &ut)
15 0Fh SI (S%ift 'n)
16 10h DLE ((ata ink Escape)
17 11h DC1 ((e)ice control *)
18 12h DC2 ((e)ice control +)
19 13h DC3 ((e)ice control ,)
20 14h DC4 ((e)ice control -)
21 15h NAK (Negati)e Acknowledge)
22 16h SYN (Sync%ronous 'dle)
23 17h ETB (End Transmission Block)
24 18h CAN (#ancel)
25 19h EM (End of .edia)
26 1Ah SUB (Substitute)
27 1Bh ESC (Escape)
28 1Ch FS (!ile Separator)
29 1Dh GS (/roup Separator)
30 1Eh RS ($ecord Separator)
31 1Fh US (0nit Separator)
?
Cara*ter De*9 'ex9
<espao> 32 20h
!
33 21h
"
34 22h
#
35 23h
$
36 24h
%
37 25h
&
38 26h
'
39 27h
(
40 28h
)
41 29h
*
42 2Ah
+
43 2Bh
,
44 2Ch
-
45 2Dh
.
46 2Eh
/
47 2Fh
0
48 30h
1
49 31h
2
50 32h
3
51 33h
4
52 34h
5
53 35h
6
54 36h
7
55 37h
8
56 38h
9
57 39h
:
58 3Ah
;
59 3Bh
<
60 3Ch
=
61 3Dh
>
62 3Eh
?
63 3Fh
J
64 40h
A
65 41h
B
66 42h
C
67 43h
Cara*ter De*9 'ex9
D
68 44h
E
69 45h
F
70 46h
G
71 47h
H
72 48h
I
73 49h
J
74 4Ah
K
75 4Bh
L
76 4Ch
M
77 4Dh
N
78 4Eh
O
79 4Fh
P
80 50h
Q
81 51h
R
82 52h
S
83 53h
T
84 54h
U
85 55h
V
86 56h
W
87 57h
X
88 58h
Y
89 59h
Z
90 5Ah
[
91 5Bh
\
92 5Ch
]
93 5Dh
^
94 5Eh
_
95 5Fh
`
96 60h
a
97 61h
b
98 62h
c
99 63h
d
100 64h
e
101 65h
f
102 66h
g
103 67h
Cara*ter De*9 'ex9
h
104 68h
i
105 69h
j
106 6Ah
k
107 6Bh
l
108 6Ch
m
109 6Dh
n
110 6Eh
o
111 6Fh
p
112 70h
q
113 71h
r
114 72h
s
115 73h
t
116 74h
u
117 75h
v
118 76h
w
119 77h
x
120 78h
y
121 79h
z
122 7Ah
{
123 7Bh
|
124 7Ch
}
125 7Dh
~
126 7Eh
<delete> 127 7Fh

128 80h
u
129 81h

130 82h

131 83h
a
132 84h

133 85h

134 86h

135 87h

136 88h
@

137 89h

138 8Ah

139 8Bh
Cara*ter De*9 'ex9

140 8Ch

141 8Dh

142 8Eh

143 8Fh

144 90h

145 91h

146 92h

147 93h

148 94h

149 95h

150 96h
u
151 97h
y
152 98h

153 99h

154 9Ah
7

155 9Bh

156 9Ch

157 9Dh
L
158 9Eh

159 9Fh

160 A0h

161 A1h

162 A2h

163 A3h

164 A4h

165 A5h

166 A6h

167 A7h

168 A8h

169 A9h

170 AAh

171 ABh

172 ACh

173 ADh

174 AEh

175 AFh

176 B0h
Cara*ter De*9 'ex9

177 B1h

178 B2h

179 B3h

180 B4h

181 B5h

182 B6h

183 B7h

184 B8h

185 B9h

186 BAh

187 BBh

188 BCh

189 BDh

190 BEh

191 BFh
'
192 C0h
+
193 C1h

194 C2h
]
195 C3h

196 C4h
]
197 C5h
]
198 C6h
]
199 C7h
"
200 C8h

201 C9h
"
202 CAh

203 CBh
[
204 CCh
=
205 CDh
[
206 CEh
=
207 CFh
"
208 DOh

209 D1h
_
210 D2h
"
211 D3h

212 D4h

213 D5h
Cara*ter De*9 'ex9
_
214 D6h
[
215 D7h
]
216 D8h
'
217 D9h

218 DAh

219 DBh

220 DCh
g
221 DDh
_
222 DEh
P
223 DFh
c
224 E0h

225 E1h
L
226 E2h
n
227 E3h
Z
228 E4h
o
229 E5h

230 E6h
:
231 E7h
I
232 E8h
O
233 E9h
O
234 EAh
5
235 EBh

236 ECh
o
237 EDh

238 EEh
O
239 EFh

240 F0h

241 F1h
`
242 F2h

243 F3h
]
244 F4h
]
245 F5h
-
246 F6h
-
247 F7h

248 F8h

249 F9h

250 FAh
Cara*ter De*9 'ex9
\
251 FBh

252 FCh

253 FDh

254 FEh
255 FFh
H
Entre os *ara*teres da tabela ASCII estendidos os mais ,teis est6o, talve3, os *ara*teres
de desenho de %uadro em linhas sim$les e du$lasE os *ara*teres de B3h at( DAh B179 a 41H
de*imalC9 Como a visuali3a56o deste *on:unto ( di8A*il, o desenho abaixo $ode auxiliar nesta
tare8aE
196 194 205 203
218 191 201 =
187
179 186
195 ] ] 180 204 [ [
185
197 206
192 ' + ' 217 200 " "
188
193 202
209 210
213 184 214 _ _
183

198 ] ] 181 199 ] [
182
216 215
212 = 190 211 " "
189
207 208
Figura B.1: Caracteres de desenho de quadro e seus respectivos cdigos ASII.
9
A$>ndi*e -9 Exer*A*ios de $rograma56o
Ca$Atulo IE 2un5<es de Entrada e SaAda
4.1 2a5a um $rograma %ue leia 4 n,meros reais e im$rima a m(dia aritm(ti*a entre eles9
4. 2a5a um $rograma es*reva na tela o *ara*ter ASCII e o res$e*tivo *;digos hexade*imal de um
valor de*imal digitado $elo usuFrio9 KSugest6oE Lse a 8un56o putchar()$ara es*rever os
*ara*teresM9
4.! 2a5a um $rograma %ue leia um angulo Bem grausC e im$rima o valor do seno, coseno e tangente
deste angulo9
4.4 Altere o $rogramas 4. e 4.! $ara %ue utili3em e8eitos de im$ress6o *olorida9
4." 7 volume de um es8era de raio R ( V R =
I
=
=
9 2a5a um $rograma %ue leia um numero R e
im$rima o volume da es8era *orres$ondente9
4.1 2a5a um $rograma %ue leia uma 8rase e res*reva esta 8rase *entrali3ada no to$o da tela9
Ca$Atulo ?E Estruturas de Controle
".1 2a5a um $rograma %ue leia = n,meros e im$rima o n,mero de maior valor absoluto9
". 2a5a um $rograma es*reva na tela todos os *ara*teres ASCII, os res$e*tivos *;digos de*imais e
hexade*imais9
".! 2a5a um $rograma %ue im$rima os 1D $rimeiros n,meros $rimos9
".4 2a5a um $rograma %ue im$rima os n,meros Am$ares no intervalo 8e*hado [a, b] Ba e b
es*olhidos $elo usuFrioC9
"." 2a5a um $rograma %ue leia uma 8rase digitada e im$rima um relat;rio *ontendoE o n,mero de
$alavras, o n,mero de vogais e o n,mero de letras digitadas9
".# Altere o $rograma 4.1 $ara %ue o usuFrio determine a %uantidade de n,meros mani$ulados9
1D
".$ 2a5a um $rograma %ue im$rima os N $rimeiros n,meros da s(rie de 2ibona**iE 1, 1, 2, 3,
5, 8, 13,... A 8;rmula de re*orr>n*ia $ara esta s(rie ( n n n
i i i
= +
1 4
$ara
i 4
$ois
n n
D 1
1 = = 9
".% Altere o $rograma ".1 $ara %ue o usuFrio determine a %uantidade de n,meros mani$ulados9
".& Altere o $rograma ".! $ara %ue o usuFrio determine a %uantidade de n,meros mani$ulados9
".1' 2a5a um $rograma %ue leia os tr>s $arNmetros a, b, * de uma e%ua56o de segundo grau e es*reva
suas raA3es Breais ou *om$lexasC9
".11 2a5a um $rograma %ue exe*ute um $rote56o de tela do seguinte modoE Ao ini*iar o $rograma, um
*ara*ter M Bou outro %ual%uerC $er*orra a tela em dire5<es aleat;rias a$agando os *ara*teres de 8undo9
Ao se $ressionar %ual%uer te*la o texto de 8undo rea$are*e e o $rograma termina9 Lse as 8un5<es
gettext() e puttext()9
".1 2a5a um $rograma %ue $e5a $ara o usuFrio adivinhar um n,mero es*olhido aleatoriamente entre 1
e 1DD9 Se o usuFrio digitar um n,mero errado, o $rograma res$onde o novo intervalo do n,mero
$ro*urado9 Se o usuFrio a*ertou o n,mero $ro*urado, o $rograma di3 %uantos $al$ites 8oram dados9
1or exem$loE
O nmero procurado est entre 1 e 100:
Palpite: 45
O nmero procurado est entre 1 e 44:
Palpite: 27
O nmero procurado est entre 28 e 44:
Palpite: 36
Parabns! Voc acertou o nmero em 3 tentativas.
".1! 2a5a um $rograma %ue leia um valor inteiro de D a 1DDD es*reva o seu valor $or extenso9 1or
exem$loE
Digite valor: 279
Extenso: duzentos e setenta e nove.
".14 2a5a um $rograma %ue *olo%ue um *ara*ter no *entro da tela e $ermita o movimenta56o deste
*om o uso das setas9
".1" Im$lemente um OrastroP $ara o *ara*ter do $rograma ".149 Sugest6oE use os *ara*teres de
$reen*himentoE 17@d, 177d, 17Hd e 419d9
".1# 2a5a um $rograma %ue desenhe um :anela *om bordas Bsim$les ou du$lasC em uma $osi56o
*entrali3ada da tela9 1inte o interior da :anela *om alguma *or di8erente do 8undo da tela9 KSugest6oE
Lse o la5o for... $ara es*rever as bordas e a 8un56o clrscr() $ara $intar o interior da :anelaM9
Ca$Atulo @E 2un5<es
#.1 Crie um 8un56o float round(float r) %ue 8a5a o arredondamento de n,meros reaisE 1or
exem$loE 5 = round(5.4), 7 = round(6.5)9
#. Crie uma 8un56o int sim_nao(void) %ue es$era o usuFrio $ressionar as te*las [s] ou [n]
retornando 1 ou D res$e*tivamente9 Se o usuFrio $ressionar %ual%uer outra te*la um som Bde
advert>n*iaC de 50 H $or !50 ms ( emitido9
#.! #rans8orme o $rograma do exer*A*io ".1# em uma 8un56o *om a seguinte de*lara56oE int
borda(esq, sup, dir, inf, corf, corb) onde esq, sup, dir, inf s6o as
$osi5<es das bordas, corf, corb as *ores do 8undo e da borda da :anela res$e*tivamente9 A 8un56o
11
retorna 1 se houve algum erro na $assagem dos $arNmetros B esq > dir, $or exem$loC e 0 *aso
*ontrFrio9
#.4 2a5a uma 8un56o %ue determine se tr>s n,meros a, b, c 8ormam um triNngulo ou n6o9 A
8un56o deve ter a seguinte de*lara56o int tringulo(float a, float b, float c)
onde o valor de retorno tem o seguinte signi8i*adoE
0: no forma tringulo,
1: tringulo qualquer,
2: tringulo issceles,
3: tringulo equiltero.
#." 2a5a uma 8un56o %ue determine se um determinado numero ( $rimo ou n6o9 A 8un56o deve ter a
seguinte de*lara56o int primo(int N) onde N ( o valor a ser testado9 A 8un56o deve retornar 1
se N ( $rimo e 0 *aso *ontrFrio9 KSugest6oE Altere o $rograma do exer*A*io ".!M9
#.# #rans8orme o $rograma do exer*A*io ".$ em uma 8un56o int fib(int n) %ue retorna o n-
(simo numero de 2ibona**i9
#.$ A m"dia e#$ptica
%
Bou aritm(ti*o-geom(tri*aC de dois n,meros $ositivos a e & Ka ' &M, ( *al*ulada
do seguinte modoE Chamando a a &
n n n +
=
1
e & a &
n n n +
= +
1
4 B C Q res$e*tivamente as m(dias
geom(tri*a e aritm(ti*a desses n,meros obtemos uma se%R>n*ia de n,meros a
D
, a
1
, a
4
, 999 e b
D
, b
1
, b
4
, 999
tal %ue
a a a & & &
D 1 4 4 1 D
< < < < < <
9 7 limite desta se%R>n*ia (
m a & = =

9 1or exem$loE a m(dia
elA$ti*a de 4 e 7 ( 5.5932... 2a5a uma 8un56o double elip(double a, double b) %ue
*al*ule a m(dia elA$ti*a de a e &9 KSugest6oE Lse um la5o while(a < b)...M9
#.% 7 maior divisor *omum dos inteiros $ositivos a e &, %ue abreviamos *omo mdc(a) &*, ( o maior
n,mero m tal %ue m ( divisor tanto de a %uanto de &9 1or exem$loE + , mdc(!0)%-*, . , mdc(!%).*9 7
valor de m $ode ser *al*ulado *om o seguinte algoritmo re*ursivo
4
, de /uc#idesE
se a > b ento mdc(a, b) igual a
b se resto(a, b) 0
mdc(b, resto(a, b)) caso contrrio.
2a5a uma 8un56o recursiva $ara o *Fl*ulo do mFximo divisor *omum de dois n,meros9
#.& Caso :F n6o tenha 8eito assim, trans8orme a 8un56o iterativa do exer*A*io #.# em uma 8un56o
recursiva9
Ca$Atulo 7E &etores
$.1 Es*reva um $rograma %ue leia um vetor de N n,meros inteiros,(N<=100), inverta a ordem dos
elementos do vetor e im$rima o vetor invertido9 1or exem$lo o vetorE {1, 3, 5, 7} terF seus
elementos invertidosE {7, 5, 3, 1}9 ()serva*o+ S ne*essFrio inverter os elementos do vetor9
N6o basta im$rimi-los em ordem inversaT
$. Es*reva um $rograma %ue leia um vetor a de N n,meros reais, (N<=100),e um outro real k e
*onstrua e im$rima um outro vetor b *u:os elementos s6o os res$e*tivos elementos de a
multi$li*ados $or k9 Por e,emplo+ a = {1,2,3}, k = 5, b = {5,10,15}9
$.! Es*reva duas 8un5<esE uma %ue leia um vetor v de n n,meros inteiros, (n<=100), e outra %ue
escreva este vetor9 A de*lara56o destas 8un5<es devem ser, res$e*tivamenteE void le_vet(int
v, int n) e void escreve_vet(int v, int n)9
1
Des*oberta $elo matemFti*o alem6o Car# 0. 1auss9 &er I.A, E9 9, Meu Professor de Matemtica,U,
$914=
4
&er S.I#', /9 D9 Design and Analysis of Algorithms, -ostonE 1)S-Vent 1ub9 Co9 19H9 $9474
14
$.4 Es*reva um $rograma %ue leia um vetor gabarito de 10 elementos9 Cada elemento de
gabarito *ontem um numero inteiro 1, 2, 3, 4 ou 5 *orres$ondente as o$5<es *orretas de
uma $rova ob:etiva9 Em seguida o $rograma deve ler um vetor resposta, tamb(m de 10
elementos inteiros, *ontendo as res$ostas de um aluno9 7 $rograma deve *om$arar os dois vetores e
es*rever o numero de a*ertos do aluno9
$." Es*reva uma 8un56o int min_vet(float v[], int n) re*eba um vetor e retorne o Andi*e
do menor elemento deste vetor9
$.# Es*reva uma 8un56o int remove_dup(float v[], int n) re*eba um vetor e veri8i%ue a
exist>n*ia de elementos du$li*ados9 Caso n6o existam elementos du$li*ados retorne 09 Caso
existam, remova estes elementos Bdeixando a$enas umC e retorne o n,mero de elementos
removidos9
$.$ Es*reva uma 8un56o void insert(float v[], int n, float valor, int pos)
%ue 8a5a a inser*o de valor na $osi56o pos do vetor v, deslo*ando os demais elementos9
$.% #rans8orme o programa do exem$lo e0705.cpp em uma fun23o void ordem(int v, int
n) %ue ordene os elementos de um vetor v de n elementos inteiros9
$.& Es*reva uma 8un56o int merge(float r[], float s[], float v[], int n, int
m) re*eba um vetor r de n elementos e outro vetor s de m elementos e *onstrua um vetor v *om os
elementos de r e s, ordenado e no duplicado9 A 8un56o deve retornar o tamanho do vetor v
*onstruAdo9 Sugest6oE Ltili3e as 8un5<es dos exer*A*ios 79@, 797 e 79H9
$.1' A 8un56o do exer*A*io 799 $ode ser entendida *omo uma 8un56o %ue retorna a uni6o entre dois
*on:untos9 Es*reva uma 8un56o int intersec(float r[], float s[], float v[],
int n, int m) %ue *onstrua um vetor v *om a interse*o entre r e s, ordenados9 A 8un56o
deve retornar o tamanho do vetor v *onstruAdo9
$.11 Es*reva uma 8un56o void desordem(int v, int n) %ue desordene os elementos de um
vetor v Bn6o ne*essariamente ordenadoC de n elementos inteiros9 Sugest6oE use o seguinte algoritmoE
para i de n-1 at 0 faa
j valor aleatrio entre 0 e i
v[i] v[j]
fim faa
()serva*o+ Esta rotina $ode ser usada $ara simular o $ro*esso de embaralhar as *artas de um baralho9
$.1 Es*reva uma 8un56o int find(char v[], char t[], int m, int n) %ue re*eba um
vetor v de m elementos e um vetor t de n elementos Bn < mC9 Esta 8un56o deve veri8i*ar a
o*orr>n*ia do $adr6o t em v ou n6o9 Se houver, deve retornar a $osi56o ini*ial da $rimeira
o*orr>n*ia9 Por e,emplo+ se v={As bananas do Panam so bacanas} e p={anas}
deve retornar 69 Caso n6o ha:a o*orr>n*ia, retorne -19 ()serva*o+ Algoritmos *omo esses s6o
usados em editores de texto
=
9
$.1! 7 produto escalar entre dois vetores $ode ser de8inido
I
*omoE e u v u v
i i
i
n
= =
=


D
, onde u
i
e v
i
s6o
os elementos do vetor9 Es*reva uma 8un56o float prod_esc(float u, float v, int
n) %ue re*eba dois vetores u e v de n elementos reais e retorne o valor do $roduto es*alar entre
eles9
=
&er o algoritmo de Vnuth-.orris-1ratt em S.I#' Bo$9 Cit9C, $ 49I
I
&er S1IE!E, .9 R9, Anlise Vetorial, S6o 1auloE .*!raW-'ill9 197@, $9 4=9
1=
$.14 7 cdigo 4orse 8oi muito usado no tem$o do tel(gra8o $ara transmitir mensagens9 Neste sistema
*ada sAmbolo Bletra, numero ou sinal de $ontua56oC ( enviado $or 8io em uma serie de $ulsos
el(tri*os *urtos ou longos Bpontos ou tra2osC *on8orme a tabela abaixoE
a .- b -... c -.-. d -.. e . f ..-.
g --. h .... i .. j .--- k -.- l .-..
m -- n -. o --- p .--. q --.- r .-.
s ... t - u ..- v ...- w .-- x -..-
y -.-- z --.. 1 .---- 2 ..--- 3 ...-- 4 ....-
..... ! -.... " --... # ---.. $ ----. % -----
& .-.-.- ' ..--.. , --..-- ( ---...
Es*reva um $rograma %ue leia uma 8rase digitada $elo usuFrio e emita $elo alto-8alante do 1C o som
*orres$ondente a uma transmiss6o *om$leta em *;digo .orse9 -ugesto+ Crie uma tabela
cdigo[40][5] em %ue *ada linha re$resente um sinal *ontendo os n,meros 1 B$ontoC, 4 Btra5oC
ou D B8im do *;digoC9
$.1" Existe um $roblema 8amoso no xadre3 *hamado 5ro&#ema das 6 damasE *onsiste em dis$or sobre o
tabuleiro Bde H x H *asasC do :ogo um *on:unto de % damas de tal 8orma %ue nenhuma dama 8i%ue na
mesma #inha, co#una ou diagona# %ue outra9 Es*reva um $rograma %ue *al*ule $elo menos uma
solu56o deste $roblema9 -ugesto+ *rie um vetor tab[8][8] *ontendo 0 $ara uma *asa va3ia e 1
$ara uma *asa o*u$ada9 Es*reva uma 8un56o %ue crie as *on8igura5<es e outra rotina %ue teste a
solu56o9
$.1# As $o$ulares *al*uladoras H5 BHe7##et85ac9ardC usam a nota56o R1N BReverse 5o#ish :otationC
$ara o *Fl*ulo de ex$ress<es num(ri*as9 Este ti$o de nota56o torna mais 8F*il o *Fl*ulo de
ex$ress<es *om$lexas9 Cada valor digitado ( guardado em uma pilha de dados e *ada tecla de
opera*o e8etua uma o$era56o entre os ,ltimos dois valores da $ilha9 1or exem$lo, $ara e8etuar a
ex$ress6o 2+5*3 digitamosE
123 (co#ocamos o primeiro va#or na pi#ha*)
1enter3 1,3 (des#ocamos 2 para a !
a
posi23o da pi#ha e co#ocamos , para o %
o
va#or na
pi#ha*)
143 (efetuamos a mu#tip#ica23o dos dois va#ores) o va#or *2 aparece na %
a
posi23o da pi#ha*)
;+3 (des#ocamos %2 para a !
a
posi23o da pi#ha e co#ocamos , para o %
o
va#or na pi#ha*
153 (adicionamos + ao resu#tado) %. aparece na %
a
posi23o da pi#ha*.
Es*reva um $rograma %ue simule uma calculadora RP. de I o$era5<es B+,-,*,/C utili3ando vetores
$ara re$resentar a $ilha de dados9
$.1$ Reverse ( o nome de um antigo :ogo de tabuleiro, %ue $ode ser 8a*ilmente im$lementado em um
*om$utadorE *onsiste de um tabuleiro de 3x3 *asas, *om um dis*o bran*o ou $reto dis$ostos,
ini*ialmente, de modo aleat;rio em *ada *asa9
[1][2][3]
[4][5][6]
[7][8][9]
Ao sele*ionar uma das *asas o :ogador reverte a *or do dis*o da%uela *asa e de algumas *asas vi3inhas
*on8orme o es%uema a*ima9 7 ob:etivo do :ogo ( reverter todas as *asas $ara uma mesma *or9
Es*reva um $rograma %ue simule o tabuleiro do :ogo de Reverse9
)o pressionar *everte(
[1] [1],[2] e [4]
[2] [2],[1] e [3]
[3] [3],[2] e [6]
[4] [4],[1] e [7]
[5] [5],[2],[4],[6] e [8]
[6] [6],[3] e [9]
1I
[7] [7],[4] e [8]
[8] [8],[7] e [9]
[9] [9],[6] e [8]
$.1% Caso :F n6o tenha 8eito assim, Res*reva o $rograma do exer*A*io 791 tornando-a re*ursiva9
$.1& Es*reva uma 8un56o %ue re*eba duas matri3es de ordem m e *onstrua o $roduto matri*ial entre eles9
Ca$Atulo HE 1onteiros
%.1 Res*reva a 8un56o round() do exer*A*io #.1 $ara %ue re*eba o endere5o da variFvel a ser
arredondada9 A nova 8un56o deve ter a seguinte de*lara56o void round(float *r) e deve
arredondar o $r;$rio numero $assado9
%. Es*reva uma 8un56o void troca(int *a, int *b) %ue $ermuta entre si os valores de a e
b9
%.! Es*reva uma 8un56o void stat(float vet, int N, float *med, float *dsvpd)
%ue re*eba um vetor de n,meros reais vet, seu tamanho N e *al*ule a m(dia aritm(ti*a med e o
desvio $adr6o
?
dsvpd destes valores9
%.4 Es*reva uma 8un56o void extremos(float vet, int N, float *max, float
*min) %ue re*eba um vetor de n,meros reais vet, seu tamanho N e determine o maior e o menor
Bmax e minC destes valores9
%." Res*reva o $rograma do exem$lo $.1 $ara %ue, usando alo*a56o dinNmi*a de mem;ria , *onstrua um
vetor de N elementos, sendo N digitado $elo usuFrio9
%.# Es*reva um $rograma %ue, usando alo*a56o dinNmi*a de mem;ria, *onstrua um vetor de N
elementos gerados aleatoriamente no intervalo [0,10], sendo N digitado $elo usuFrio9 Em seguida
este $rograma deve *hamar a 8un56o remove_dup() do exer*A*io $.#. S ne*essFria alguma
modi8i*a56o no *;digo desta 8un56oU
%.$ Es*reva uma rotina void graf(float a float b, float (*pf)(float)) %ue re*ebe
um endere5o de uma 8un56o no $onteiro pf, os valores de extremos a e b e desenhe o grF8i*o da
8un56o a$ontado $or pf9
19 2undamentos da inguagem C
Neste *a$itulo ser6o vistos os 8undamentos da linguagem C9 7 *on*eito de linguagem de
$rograma56o, linguagens de alto e baixo nAvel, linguagens gen(ri*as e es$e*i8i*as9 SerF visto um $ou*o
do hist;ri*o da *ria56o da linguagem e a des*ri56o das *ara*terAsti*as mais im$ortantes da linguagem C9
2inalmente, serF visto o as$e*to geral de um *;digo 8onte es*rito em C9
?
&er !I7&ANNI, /9 R9, -7N/7RN7, /9 R9, Matemtica, vol9 =, S6o 1auloE 2#D, s9d9 $9 =4D9
1?
1.1 /inguagens de Programa*o
Lm programa de *om$utador ( um *on:unto instru2<es %ue re$resentam um a#goritmo $ara a
resolu56o de algum $roblema9 Estas instru5<es s6o escritas atrav(s de um *on:unto de cdigos BsAmbolos
e $alavrasC9 Este *on:unto de *;digos $ossui regras de estrutura56o l;gi*a e sintFti*a $r;$ria9 Di3emos
%ue este *on:unto de sAmbolos e regras 8ormam uma #inguagem de programa23o9
1.1.1 0,emplos de c1digos.
Existem muitas linguagens de $rograma56o9 1odemos es*rever um algoritmo $ara resolu56o de
um $roblema $or interm(dio de %ual%uer linguagem9 A seguir mostramos alguns exem$los de tre*hos de
*;digos es*ritos em algumas linguagens de $rograma56o9

0,emploE tre*ho de um algoritmo es*rito em Pseudo2linguagem %ue re*ebe um n,mero num e
es*reve a tabuada de 1 a 1D $ara este valorE
leia num
para n de 1 at 10 passo 1 faa
tab num * n
imprime tab
fim faa
0,emploE tre*ho do mesmo $rograma es*rito em linguagem CE
scanf(&num);
for(n = 1; n <= 10; n++){
tab = num * n;
printf(\n %d, tab);
};
0,emploE tre*ho do mesmo $rograma es*rito em linguagem 3asicE
10 input num
20 for n = 1 to 10 step 1
30 let tab = num * n
1@
40 print chr$ (tab)
50 next n
0,emploE tre*ho do mesmo $rograma es*rito em linguagem FortranE
read (num);
do 1 n = 1:10
tab = num * n
write(tab)
10 continue
0,emploE tre*ho do mesmo $rograma es*rito em linguagem Assem)l4 $ara IN#E HDHHE
MOV CX,0
IN AX,PORTA
MOV DX,AX
LABEL:
INC CX
MOV AX,DX
MUL CX
OUT AX, PORTA
CMP CX,10
JNE LABEL
1.1. /inguagens de )ai,o e alto n5vel.
1odemos dividir, generi*amente, as linguagens de $rograma56o em dois grandes gru$osE as
linguagens de &ai=o n$ve# e as de a#to n$ve#E
/inguagens de )ai,o n5vel+ S6o linguagens voltadas $ara a mF%uina, isto (, s6o es*ritas usando
as instru5<es do mi*ro$ro*essador do *om$utador9 S6o generi*amente *hamadas de linguagens Assem&#y9
VantagensE 1rogramas s6o exe*utados *om maior ve#ocidade de $ro*essamento9 7s $rogramas
o*u$am menos espa2o na mem;ria9
>esvantagensE Em geral, $rogramas em Assembl" tem $ou*a porta&i#idade, isto (, um *;digo
gerado $ara um ti$o de $ro*essador n6o serve $ara outro9 C;digos Assembl" n6o s6o estruturados,
tornando a programa23o mais di8A*il9
17
/inguagens de alto n5vel+ S6o linguagens voltadas $ara o ser humano9 Em geral utili3am sintaxe
estruturada tornando seu *;digo mais legAvel9 Ne*essitam de compi#adores ou interpretadores $ara gerar
instru5<es do mi*ro$ro*essador9 Inter$retadores 8a3em a inter$reta56o de cada instru56o do $rograma
8onte exe*utando-a dentro de um ambiente de $rograma56o, 3asic e Auto/6-P $or exem$lo9
Com$iladores 8a3em a tradu56o de todas as instru5<es do $rograma 8onte gerando um $rograma
exe*utFvel9 Estes $rogramas exe*utFveis B*.exeC $odem ser exe*utados 8ora dos ambientes de
$rograma56o, C e Pascal $or exem$lo9 As linguagens de alto nAvel $odem se distinguir %uanto a sua
a$li*a56o em gen"ricas *omo C, Pascal e 3asic ou espec$ficas *omo Fortran B*Fl*ulo matemFti*oC,
7P-- Bsimula56oC, /6-P Bintelig>n*ia arti8i*ialC ou C/6PP0R Bban*o de dadosC9
Vantagens? 1or serem *om$iladas ou inter$retadas, tem maior porta&i#idade $odendo ser
exe*utados em varias $lata8ormas *om $ou%uAssimas modi8i*a5<es9 Em geral, a $rograma56o torna-se
mais 8F*il $or *ausa do maior ou menor grau de estrutura56o de suas linguagens9
>esvantagens? Em geral, as rotinas geradas Bem linguagem de ma%uinaC s6o mais gen(ri*as e
$ortanto mais *om$lexas e $or isso s6o mais lentas e o*u$am mais mem;ria9
1. /inguagem C
A linguagem C ( uma linguagem de a#to n$ve#) gen"rica. 2oi desenvolvida por $rogramadores
para $rogramadores tendo *omo meta *ara*terAsti*as de 8lexibilidade e $ortabilidade9 7 C ( uma
linguagem %ue nas*eu :untamente *om o advento da teoria de #inguagem estruturada e do computador
pessoa#9 Assim tornou-se ra$idamente uma linguagem X$o$ularY entre os $rogramadores9 7 C 8oi usado
$ara desenvolver o sistema o$era*ional 8.69, e ho:e esta sendo usada $ara desenvolver novas
linguagens, entre elas a linguagem C:: e ;ava9
1..1 Caracter5sticas do C
Entre as $rin*i$ais *ara*terAsti*as do C, $odemos *itarE
7 C ( uma linguagem de alto nAvel *om uma sintaxe bastante estruturada e 8lexAvel tornando sua
$rograma56o bastante sim$li8i*ada9
1rogramas em C s6o *om$ilados, gerando $rogramas exe*utFveis9
1H
7 C *om$artilha re*ursos tanto de alto %uanto de baixo nAvel, $ois $ermite a*esso e $rograma56o
direta do mi*ro$ro*essador9 Com isto, rotinas *u:a de$end>n*ia do tem$o ( *rAti*a, $odem ser
8a*ilmente im$lementadas usando instru5<es em Assembl"9 1or esta ra36o o C ( a linguagem
$re8erida dos $rogramadores de a$li*ativos9
7 C ( uma linguagem estruturalmente sim$les e de grande $ortabilidade9 7 *om$ilador C gera
*;digos mais enxutos e velo3es do %ue muitas outras linguagens9
Embora estruturalmente sim$les B$ou*as 8un5<es intrAnse*asC o C n6o $erde 8un*ionalidade $ois
$ermite a in*lus6o de uma 8arta %uantidade de rotinas do usuFrio9 7s 8abri*antes de *om$iladores
8orne*em uma am$la variedade de rotinas $r(-*om$iladas em bibliote*as9
1.. <ist1rico
1&$'+ >enis Ritchie desenha uma linguagem a $artir do 3CP/ nos laborat;rios da @e## Ae#ephones) Inc9
Chama a linguagem de 39
1&$%+ @rian Berningham :unta-se a Ritchie $ara a$rimorar a linguagem9 A nova vers6o *hama-se C9
1elas suas *ara*terAsti*as de $ortabilidade e estrutura56o :F se torna $o$ular entre os
$rogramadores9
=1&%'+ A linguagem ( $adroni3ada $elo American :ationa# Standard InstituteE surge o A.-6 C9
Z1&&'+ A @or#and Internationa# Co, 8abri*ante de *om$iladores $ro8issionais es*olhe o C e o Pascal
*omo linguagens de trabalho $ara o seu Integrated >eve#opment /nviroment BAmbiente
Integrado de DesenvolvimentoCE surge o Tur)o C9
=1&&+ 7 C se torna $onto de *on*ordNn*ia entre te;ri*os do desenvolvimento da teoria de C&Dect
Criented 5rogramming B$rograma56o orientada a ob:etosCE surge o C::9
1.! 0strutura de um programa em C
Lm $rograma em C ( *onstituAdo deE
um *abe5alho *ontendo as diretivas de compilador onde se de8inem o valor de *onstantes simb;li*as,
de*lara56o de variFveis, in*lus6o de bibliote*as, de*lara56o de rotinas, et*9
um blo*o de instru5<es principal e outros blo*os de rotinas9
do*umenta56o do $rogramaE *omentFrios9
Programa 0,emplo+ 7 ar%uivo e0101.cpp *ont(m um $rograma $ara *al*ular a rai3
%uadrada de um n,mero real $ositivoE
19
1.!.1 Conjunto de caracteres
Lm $rograma 8onte em C ( um te,to no >ormatado es*rito em um editor de textos usando um o
*on:unto $adr6o de *ara*teres ASCII9 A seguir est6o os *ara*teres utili3ados em CE
Caracteres v?lidos+
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
1 2 3 4 5 6 7 8 9 0
+ - * / \ = | & ! ? # % ( ) { } [ ] _ ` . , : < >
Caracteres no v?lidos+
@ $
7s *ara*teres a*ima s6o vFlidos a$enas em strings9 @eja se*o .1.4.
1.!. Coment?rios
Em C, *omentFrios $odem ser es*ritos em %ual%uer lugar do texto $ara 8a*ilitar a inter$reta56o do
algoritmo9 1ara %ue o *omentFrio se:a identi8i*ado *omo tal, ele deve ter um /* antes e um */ de$ois9
7bserve %ue no exem$lo e0101.cpp todo o *abe5alho esta dentro de um *omentFrio9
0,emplo+
/* esta e uma linha de comentrio em C */
()serva*o+ 7 C[[ $ermite %ue *omentFrios se:am es*ritos de outra 8ormaE *olo*ando um //
em uma linha, o *om$ilador entenderF %ue tudo %ue estiver a direita do sAmbolo ( um *omentFrio9
7bserve no $rograma exem$lo e0101.cpp as linhas de *omentFrios *olo*adas a direita dos *omandos9
0,emplo+
// este e um comentrio valido apenas em C++
1.!.! Diretivas de Compila*o
4D
Em C, existem *omandos %ue s6o $ro*essados durante a compila*o do $rograma9 Estes
*omandos s6o generi*amente *hamados de diretivas de compi#a23o9 Estes *omandos in8ormam ao
*om$ilador do C basi*amente %uais s6o as constantes sim)1licas usadas no $rograma e %uais )i)liotecas
devem ser anexadas ao $rograma exe*utFvel9 A diretiva #include di3 ao *om$ilador $ara in*luir na
*om$ila56o do $rograma outros ar%uivos9 !eralmente estes ar%uivos *ontem bibliote*as de 8un5<es ou
rotinas do usuFrio9 &oltaremos a trabalhas esta diretiva *om mais detalhe no *a$Atulo ?9 A diretiva
#define di3 ao *om$ilador %uais s6o as *onstantes simb;li*as usadas no $rograma9 &eremos sobre
esta diretiva no *a$itulo 49
1.!.4 Declara*o de vari?veis
Em C, *omo na maioria das linguagens, as variFveis devem ser de*laradas no ini*io do $rograma9
Estas variFveis $odem ser de vFrios ti$osE int BinteiroC, float Breal de sim$les $re*is6oC e outras %ue
ser6o vistas no *a$itulo 49 No exem$lo a*ima num, raiz, inf e sup s6o de*laradas *omo variFveis
reais, en%uanto i ( de*larada *omo uma variFvel inteira9
1.!." 0ntrada e sa5da de dados
Em C existem varias maneiras de 8a3er a leitura e es*rita de in8orma5<es9 Estas o$era5<es s6o
*hamadas de o$era5<es de entrada e sadia9 &eremos no *a$itulo = algumas 8un5<es de entrada e sadia de
in8orma5<es via te*lado e tela9 7utras 8un5<es de leitura e es*rita em ar%uivos, sadia grF8i*a, 8un5<es de
mani$ula56o de mouse) entrada e sadia de in8orma5<es via $ortas serial e $aralela ser6o vistas em
*a$Atulos $osteriores9 No exem$lo a*ima printf ( uma 8un56o de es*rita na tela, scanf ( uma 8un56o
de leitura de te*lado9
1.!.# 0struturas de controle
A linguagem C $ermite uma am$la variedade de estruturas de *ontrole de 8luxo de
$ro*essamento9 Estas estruturas ser6o vistas em detalhes nos *a$Atulos I e ?9 Duas estruturas das
estruturas bFsi*as Bde*is6o e re$eti56oC s6o muito semelhantes as estruturas usadas nas 1seudo-linguagem
algorAtmi*asE
0strutura de Deciso+ 1ermite dire*ionar o 8luxo l;gi*o $ara dois blo*os distintos de instru5<es
*on8orme uma *ondi56o de *ontrole9
Pseudo-linguagem Linguagem C
41
se condi67o if(condi67o){
ent+o bloco * bloco *;
sen+o bloco + }else{
fim se bloco +;
};
0strutura de Repeti*o+ 1ermite exe*utar re$etidamente um blo*o de instru5<es ate %ue uma
*ondi56o de *ontrole se:a satis8eita9

Pseudo-linguagem Linguagem C
fa,a do{
bloco bloco;
at- condi67o }while(condi67o);
49 Constantes e &ariFveis
Neste *a$itulo veremos *omo os dados *onstantes e variFveis s6o mani$ulados $ela linguagem C9
7 %ue s6o *onstantes inteiras, reais, *ara*teres e strings9 \uais s6o as regras de atribui56o de nomes a
variFveis e %uais s6o os ti$os de dados %ue 7 C $ode mani$ular9 &eremos tamb(m *omo s6o de*laradas
as variFveis e as *onstantes simb;li*as usadas em um $rograma9
.1 Constantes
7 C $ossui %uatro ti$os bFsi*os de *onstantesE inteiras, de ponto >lutuante, caracteres e strings9
Constantes inteiras e de $onto 8lutuante re$resentam n,meros de um modo geral9 Cara*teres e strings
re$resentam letras e agru$amentos de letras B$alavrasC9
.1.1 Constantes inteiras
44
Lma *onstante inteira ( um n,mero de valor inteiro9 De uma 8orma geral, *onstantes inteiras s6o
se%R>n*ias de dAgitos %ue re$resentam n,meros inteiros9 N,meros inteiros $odem ser es*ritos no 8ormato
decimal Bbase 1DC, he,adecimal Bbase 1@C ou octal Bbase HC9
Lma *onstante inteira decimal ( 8ormada $or uma se%R>n*ia de dAgitos de*imaisE 0, 1, 2,
3, 4, 5, 6, 7, 8, 99 Se a *onstante tiver dois ou mais dAgitos, o $rimeiro no $ode ser 09 Na
verdade, $ode ser 0 mas o *om$ilador *onsiderarF esta *onstante *omo octal e n6o de*imal9
0,emplo+ A seguir s6o mostradas algumas *onstantes inteiras de*imais vFlidas9
0 3 -45 26338 -7575 1010
0,emplo+ Algumas *onstantes inteiras de*imais invFlidas9
1. (ponto)
1,2 (vrgula)
045 (primeiro dgito 0: no constante decimal)
212-22-33 (caracter ilegal: -)
Lma *onstante inteira he,adecimal ( 8ormada $or uma se%R>n*ia de dAgitos de*imaisE 0, 1,
2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (ou a, b, c, d, e)9 Lma *onstante
hexade*imal deve *ome5ar $or 0x9 Neste *aso, os dAgitos hexade*imais $odem ser min,s*ulos ou
mai,s*ulos9
0,emplo+ A seguir s6o mostrados algumas *onstantes inteiras hexade*imais v?lidas9
0x0 0x3 0x4f5a 0x2FFE OxABCD 0xAaFf
0,emplo+ Algumas *onstantes inteiras hexade*imais inv?lidas9
0x3. (ponto)
0x1,e (vrgula)
0x ff (espao)
FFEE (no comea com 0x: no constante hexadecimal)
0Xfg34 (caracter ilegal: g)
Lma *onstante inteira octal ( 8ormada $or uma se%R>n*ia de dAgitos o*taisE 0, 1, 2, 3, 4,
5, 6, 79 A *onstante o*tal deve ter o $rimeiro digito 0 $ara %ue o *om$ilador a identi8i%ue *omo tal
0,emplo+ A seguir s6o mostrados algumas *onstantes o*tais v?lidas9
00 -03 045 02633 07575 -0101
0,emplo+ Algumas *onstantes inteiras o*tais inv?lidas9
010. (ponto)
4=
01,2 (vrgula)
0 4 (espao)
45 (primeiro digito no 0: no constante octal)
01784 (caracter ilegal: 8)
.1. Constantes de ponto >lutuante
N,meros reais Bn6o inteirosC s6o re$resentados em base 1D, $or n,meros *om um $onto de*imal
e Bo$*ionalmenteC um ex$oente9 Lm n,mero $onto 8lutuante deve ter um $onto de*imal %ue n6o $ode ser
substituAdo $or uma vArgula9 Lm n,mero de $onto 8lutuante $ode ser es*rito em nota56o *ientA8i*a9 Neste
*aso o x10 ( substituAdo $or e ou E9 7 n,mero 1.23e4 re$resenta 1.23 x 10
4
ou 123009
0,emplo+ N,meros de $onto 8lutuante vFlidos9
0.234 125.65 .93 1.23e-9 -1.e2 10.6e18 -.853E+67
A 8orma de re$resenta56o de um n,mero real em C ( bastante 8lexAvel9
0,emplo+ 7 n,mero =1I $ode ser re$resentado $or %ual%uer uma das seguintes 8ormasE
314. 3.14e2 +3.14e+2 31.4e1 .314E+3 314e0
.1.! Constantes caracteres
Lma *onstante *ara*ter ( uma letra ou sAmbolo *olo*ado entre aspas simples9
0,emplo+ Abaixo est6o re$resentados algumas *onstantes *ara*teres9
'a' 'b' 'X' '&' '{' ' '
Embora se:am visualiAados *omo letras e sAmbolos as *onstantes *ara*teres s6o arma3enadas
internamente $elo *om$utador *omo um n,mero inteiro entre D e 4??9 7 *ara*ter 'A' $or exem$lo, tem
valor 659 7s valores num(ri*os dos *ara*teres est6o $adroni3ados em uma tabela *hamada de American
Standard Code for Information Interchange Aa&#e ou sim$lesmente ta&e#a ASCII9 @eja apBndice 3.
Certos *odigos de *ontrole da tabela ASCII B*omo o #ine feedC ou *ara*teres es$e*iaiss B*omo 'C
$ossuem re$resenta56o es$e*ial no C9 Esta re$resenta*ao *hama-se seCDBncia de escape re$resentada $or
uma &arra invertida B\C e um caracter9 Se%uen*ias de es*a$e s6o inter$retadas *omo *ara*teres sim$les9
Abaixo segue uma lista das $rin*i$ais se%uen*ias de es*a$e usadas no C9
4I
.ontrole/.aracter 0equencia de escape 1alor )0.22
nulo (null) \0 00
campainha (bell) \a 07
retrocesso (backspace) \b 08
tabulacao horizontal \t 09
nova linha (new line) \n 10
tabulacao vertical \v 11
alimentacao de folha (form feed) \f 12
retorno de carro (carriage return) \r 13
aspas (") \" 34
apostrofo (') \' 39
interrogacao (?) \? 63
barra invertida (\) \\ 92
.1.4 Constantes strings
Lma *onstante string *onsiste de um *on:unto de *ara*teres *olo*ados entre aspas duplas9
Embora as instru5<es do C usem a$enas os *ara*teres do *on:unto $adr6o ASCII, as *onstantes *ara*ter e
string $odem *onter *ara*teres do *on:unto estendido ASCIIE , , , u, 999
0,emplo+ Abaixo seguem algumas *onstantes strings vFlidas9
Oba!
Caxias do Sul
A resposta :
Joo Carlos da Silveira
a
isto uma string
4?
. 6denti>icadores
Identi8i*adores s6o os nomes das variFveis e 8un5<es usadas no $rograma9 1or exem$lo raiz e
MAX s6o nomes de variFveis utili3adas no $rograma e0101.cpp9
..1 Regras de sinta,e
7s identi8i*adores devem seguir as seguintes regras de *onstru56oE
7s identi8i*adores devem *ome5ar $or uma letra Ba - z , A - ZC ou um underscore B _ C9
7 resto do identi8i*ador deve *onter a$enas letras, underscores ou dAgitos B0 - 9C9 .o pode
*onter outros *ara*teres9 Em C, os identi8i*adores $odem ter at( =4 *ara*teres9
Em C, letras mai,s*ulas s6o di>erentes de letras min,s*ulasE 1or exem$loE MAX, max, Max
s6o nomes di8erentes $ara o *om$ilador9 Esta $ro$riedade ( *hamada de case sensi&i#ity9
0,emplo+ os nomes abaixo s6o vFlidosE
abc, y24, VetorPontosMovimentoRobo, nota_1, TAM_MAX.
0,emplo+ os nomes abaixo n6o s6o vFlidosE
3dia, vetor-1, pao&leite, iterao.
.. Palavras reservadas
Existem *ertos nomes %ue no podem ser usados *omo identi8i*adores9 S6o *hamadas as
pa#avras reservadas e s6o de uso restrito da linguagem C B*omandos, estruturas, de*lara5<es, et*9C9 7
*on:unto de $alavras reservadas usadas em C ( o seguinteE
asm auto break case cdecl char
class const continue _cs default delete
do double _ds else enum _es
extern _export far _fastcall float for
friend goto huge if inline int
interrupt _loadds long near new operator
pascal private protected public register return
_saveregs _seg short signed sizeof _ss
static struct switch template this typedef
4@
union unsigned virtual void volatile while
0,emplo+ N6o ( $ossAvel de*larar estes *on:unto de variFveisE
do, re, mi, fa, sol, la, si
old, new
Dos *on:untos a*ima, do e new s6o $alavras reservadas9
.! Tipos de dados
Em C, *omo na maioria das linguagens, os dados s6o divididos ti$osE inteiro, real, *ara*ter, et*9
Esta divis6o se deve basi*amente ao n,mero de &ytes reservados $ara *ada dado9 Cada ti$o de dado
$ossui um intervalo de valores $ermitidos9
.!.1 Tipos )?sicos
Abaixo segue uma lista dos ti$os bFsi*os de dados $ermitidos em C9 7s ti$os char e int s6o
inteiros e os ti$os float e double s6o de $onto 8lutuante9
3ipo 3amanho 2ntervalo 4so
char 1 byte -128 a 127 n,mero muito $e%ueno e *ara*ter ASCII
int 2 bytes -32768 a 32767 *ontador, *ontrole de la5o
float 4 bytes 3.4e-38 a 3.4e38 real B$re*is6o de 7 dAgitosC
double 8 bytes 1.7e-308 a 1.7e308 *ientA8i*o B$re*is6o de 1? dAgitosC
.!. Declara*o de vari?veis
1ara %ue se $ossa usar uma variFvel em um $rograma, necess?rio 8a3er uma dec#ara23o de
variEve# antes9 A de*lara56o de variFveis sim$lesmente in8orma ao $ro*essador %uais s6o os nomes
utili3ados $ara arma3enar dados variFveis e %uais s6o os ti$os usados9 Deste modo o $ro*essador $ode
a#ocar BreservarC o es$a5o ne*essFrio na mem;ria $ara a mani$ula56o destas variFveis9 S $ossAvel
de*larar mais de uma variFvel ao mesmo tem$o, basta se$arF-las $or vArgulas B,C9
47
-inta,e+ A sintaxe $ara de*lara56o de variFveis ( a seguinteE
tipo )aria)el8* 19 )aria)el8+9 :::3 5
7nde tipo ( o ti$o de dado e )aria)el8* ( o nome da variFvel a ser de*larada9 Se houver
mais de uma variFvel, seus nomes s6o se$arados $or vArgulas9
0,emplo+ De*lara56o das variFveisE
int i;
int x,y,z;
char letra;
float nota_1,nota_2,media;
double num;
No exem$lo a*ima, i, x, y e z 8oram de*laradas variFveis inteiras9 Assim elas $odem arma3enar
valores inteiros de -=47@H at( =47@79 Do mesmo modo letra 8oi de*larada *omo variFvel *ara*ter
$odendo re*eber valores de -14H at( 147 ou *ara*teres do *on:unto $adr6o ASCII9 As variFveis nota_1,
nota_2 e media 8oram de*laradas *omo $onto 8lutuante ti$o 8loat e num *omo $onto 8lutuante ti$o
double9
A de*lara56o de variFveis ( 8eita, em geral, dentro de uma rotina9 1or exem$lo, a rotina $rin*i$al
main()9 Deste modo se di3 %ue estF se 8a3endo uma de*lara56o de variFveis #ocais9 &ariFveis lo*ais
$odem ser re8eren*iadas a$enas dentro da rotina dentro da %ual 8oi de*larada, neste *aso a rotina
main()9
0,emplo+ 7bserve o uso da de*lara56o de variFveis no tre*ho de $rograma abaixoE
void main(){
float raio, area; // declaracao de variaveis
raio = 2.5;
rea = 3.14 * raio * raio;
}
No exem$lo a*ima, as variFveis area e raio 8oram de*laradas *omo variFveis lo*ais ti$o
float9 Assim o $ro*essador 8a3 a alo*a56o de dois es$a5os Bendere5osC de I b"tes *ada $ara arma3enar
as in8orma5<es, um $ara *ada variFvel9 Na ter*eira linha, o $ro*essador *olo*a no endere5o alo*ado $ara
raio o valor 2.59 De$ois, na %uarta linha, o $ro*essador *olo*a o resultado da *onta B19.625C no
endere5o de rea9
S $ossAvel 8a3er a de*lara56o de variFveis >ora de uma rotina9 Neste *aso di3-se %ue se 8e3 a
de*lara56o de variFveis g#o&ais9 7 uso de variFveis globais ( ex$li*ado na sess6o U9U9
4H
.!.! Tipos modi>icados
Al(m dos ti$os de dados *itados a*ima existem outros ti$os de dados ditos modi>icados9 Em C
existem dois modi8i*adoresE o modi8i*ador long e o modi8i*ador unsigned9 #i$i*amente o
modi8i*ador long aumenta o n,mero de b"tes usados $ara o registro do n,mero9 1or *onse%R>n*ia o
intervalo de validade do n,mero 8i*a aumentado signi8i*ativamente9 7 modi8i*ador unsigned, usado
somente em inteiros, $ermite %ue um )it usado $ara guardar o sinal do n,mero se:a usado $ara guardar o
valor do n,mero9 Em *onse%R>n*ia disto o intervalo do n,mero 8i*a dobrado, $or(m somente $ermite o
uso de n,meros $ositivos9
3ipo 3amanho 6bytes7 2ntervalo
unsigned char 1 0 a 255
unsigned int 2 0 a 65 535
long int 4 -2 147 483 648 a 2 147 483 647
unsigned long int 4 0 a 4 294 967 295
long double 10 3.4e-4932 a 1.1e4932
.!.4 -trings.
Lma string ( um *on:unto ordenado de *ara*teres %ue $ode ser arma3enado sob 8orma de um
vetor um $onteiro9 Estas estruturas de dados ser6o vistas em detalhe nos *a$itulo U e U9 1or en%uanto, nos
basta saber *omo de*larar e arma3enar um *on:unto *ara*ter em uma variFvel9
-inta,e+ 1ara de*lararmos uma variFvel $ara re*eber um *on:unto *ara*ter devemos es*reverE
char* )ar;
0,emplo+ No exem$lo seguinte a variFvel nome 8oi de*larada *omo *on:unto *ara*ter e em
seguida re*ebe uma *onstante string9
char* nome;
nome = "Joo Carlos de Oliveira Andrade";

.!." 6nicialiAa*o de vari?veis.
49
\uando se 8a3 a declara*o de uma variFvel estF se determinando %ue ti$o de dado ela vai
re*eber9 S $ossAvel, em C, de*larar uma variFvel e :F arma3enar nela um valor ini*ial9 Chamamos este
$ro*edimento de inicialiAa*o de uma variFvel9
-inta,e+ A sintaxe $ara a ini*iali3a56o de variFveis (E
tipo )ar8* = )alor8* 19 )ar8+ ; )alor8+9 :::3 ;
7nde tipo ( o ti$o de dado, )ar8* ( o nome da variFvel a ser ini*iali3ada e )alor8* ( o
valor ini*ial da variFvel9
0,emplo+ Ini*iali3a56o de variFveisE
int i = 0, j = 100;
float num = 13.5;
char* titulo = " Programa Teste ";
No exem$lo a*ima, i e j 8oram de*laradas variFveis ti$o int9 7 valor ini*ial de i ( 0 e o de j
( 1009 Do mesmo modo num 8oi de*larada *omo variFvel float *om valor ini*ial de 13.59 #ambem a
variavel titulo 8oi de*larada *omo um *on:unto *ara*ter e re*ebeu *omo *onteudo ini*ial a string "
Programa Teste "9
.!.# Converso de tipo ECastingF
Algumas ve3es %ueremos, momentaneamente, modi8i*ar o ti$o de dado re$resentado $or uma
variFvel, isto (, %ueremos %ue o dado se:a a$resentado em um ti$o di8erente do %ual a variFvel 8oi
ini*ialmente de*larada9 1or exem$loE de*laramos uma variFvel *omo int e %ueremos,
momentaneamente, %ue seu *onte,do se:a a$resentado *omo float9 Este $ro*edimento ( *hamado de
converso de tipo ou casting Bmoldagem, em ingl>sC9
-inta,e+ A sintaxe da instru56o de *onvers6o de ti$o (E
(tipo) )ari<)el
onde tipo ( o nome do ti$o ao %ual %ueremos *onverter o dado arma3enado em varivel9
0,emplo+ observe a *onvers6o de ti$o 8eita no exem$lo abaixoE
int num;
float valor = 13.0;
=D
num = (int)valor % 2;
No exem$lo a*ima a variFvel valor 8oi de*larada ini*ialmente *omo sendo do ti$o float
re*ebendo o valor ini*ial 13.09 ogo em seguida o *onte,do de valor ( *onvertido $ara o ti$o int $ara
reali3ar a o$era56o m;dulo B%C *om o inteiro 49 A%ui a *onvers6o ( ne*essFria $ois a o$era56o m;dulo
somente $ode ser 8eita *om inteiros9 S im$ortante salientar %ue a *onvers6o de ti$o ( 8eita *om o dado
arma3enado em uma variFvel mas a vari?vel *ontinua tendo o seu ti$o original9 No exem$lo a*ima a
variFvel valor e os dados nela arma3enados *ontinuam sendo do ti$o float a$;s a *onvers6o9

&eremos na se*o !.1 uma ex$li*a56o mais detalhada do uso da *onvers6o de ti$os9
.4 Constantes -im)1licas
.uitas ve3es identi8i*amos uma *onstante num(ri*a $or um sAmboloE 1i ] =,1I1?9 $or exem$lo9
1odemos de8inir um nome simb;li*o $ara esta *onstante, isto (, $odemos de8inir uma constante
sim)1lica %ue re$resente valor9
.4.1 Constantes de>inidas pelo programador
7 $rogramador $ode de8inir *onstantes simb;li*as em %ual%uer $rograma9
-inta,e+ A sintaxe da instru56o de de8ini56o de uma *onstante simb;li*a (E
#define nome )alor
7nde #define ( uma diretiva de *om$ila56o %ue di3 ao *om$ilador $ara tro*ar as o*orr>n*ias
do texto nome $or )alor9 7bserve %ue no h? 5 no 8inal da instru56o $ois trata-se de um *omando $ara
o *om$ilador e n6o $ara o $ro*essador9 A instru56o #define deve ser es*rita antes da instru56o de
de*lara56o da rotina $rin*i$al9
0,emplo+ a seguir de8inimos algumas *onstantes simb;li*as9
#define PI 3.14159
#define ON 1
#define OFF 0
=1
#define ENDERECO 0x378
void main(){
...
No exem$lo a*ima, de8inimos PI *omo 3.141599 Isto signi8i*a %ue todas as o*orr>n*ias do
texto PI serF tro*ado $or 3.141599 Assim se es*revemos uma instru56oE
rea = PI * raio * raio;
o *om$ilador vai inter$retar esta instru56o *omo se 8osse es*rita assimE
rea = 3.14159 * raio * raio;
1oderAamos es*rever estas instru5<es assimE
float pi = 3.14159;
rea = pi * rea * rea;
$or(m este ti$o de instru56o tem duas desvantagensE 1rimeiro, reserva I b"tes de mem;ria
desne*essariamente9 Segundo, esta instru56o ( exe*utada mais lentamente $ois o $ro*essador $re*isa
a*essar a mem;ria $ara veri8i*ar %ual ( o valor de pi9
7bserve tamb(m %ue no exem$lo de8inimos os nomes simb;li*os *om letras mai,s*ulas9 Isto no
necess?rio, $odemos $er8eitamente de8inir nomes simb;li*os usando letras min,s*ulas, $or(m 8a3 $arte
do :arg6o dos $rogramadores C usar letras mai,s*ulas $ara de8inir *onstantes simb;li*as9
7 uso da diretiva #define n6o se restringe a$enas ao a$resentado a*ima, $odemos usF-la $ara
de8inir macro instru*Ges9 N6o veremos o uso de ma*ros neste texto, $ro*ure mais detalhes na
bibliogra8ia re*omendada9
.4. Constantes pr2de>inidas
Em alguns *om$iladores C, algumas *onstantes simb;li*as :F est6o $r(-de8inidas9 Estas
*onstantes em geral de8inam alguns valores matemFti*os B, Q4, e, et*9C, limites de ti$os et*9 A seguir
segue uma tabela *ontendo algumas Bexistem muitas outrasC *onstantes simb;li*as $r(-de8inidas no
*om$ilador #urbo C[[ da -orland9
=4
8iblioteca .onstante 1alor 0ignificado
math.h M_PI 3.14159...
math.h M_PI_2 1.57079... /2
math.h M_PI_4 0,78539... /4
math.h M_1_PI 0,31830... 1/
math.h M_SQRT2 1,41421... 2
conio.h BLACK 0 valor da cor (preto)
conio.h BLUE 1 valor da cor (azul)
conio.h GREEN 2 valor da cor (verde)
conio.h CYAN 3 valor da cor (cyan)
conio.h RED 4 valor da cor (vermelho)
conio.h MAGENTA 5 valor da cor (magenta)
limits.h INT_MAX 32767 limite superior do tipo int
limits.h INT_MIN -32768 limite inferior do tipo int
Cada uma das *onstantes a*ima esta de8inida em uma bibliote*a9 Lma bibliote*a, em C, ( um
ar%uivo $r(-*om$ilado *hamado ar%uivo header B*abe5alho, em ingl>sC. Em *ada bibliote*a est6o
agru$adas *onstantes e 8un5<es semelhantes Bve:a se56o =9794C9 1or exem$lo, *onstantes e 8un5<es
matemFti*as est6o guardadas na bibliote*a math.h Bmathematica# functionsC, *onstantes e 8un5<es de
mani$ula56o te*lado e monitor est6o guardadas na bibliote*a conio.h Bconso#e input and outputC9 1ara
%ue se $ossa usar a *onstante simb;li*a em um $rograma ( $re*iso incluir a bibliote*a na *om$ila56o do
$rograma9
-inta,e+ A sintaxe de in*lus6o de bibliote*as ( a seguinteE
#include <nome8bib>
onde nome8bib ( o nome da bibliote*a %ue se dese:a in*luir9 Esta instru56o deve ser es*rita
antes do $rograma $rin*i$al9
0,emplo+ 7 $rograma abaixo usa a *onstante $rede8inida .^1I $ara *al*ular a Frea de um dis*o
*ir*ular9
#include <math.h>
void main(){
float area, raio = 5.0;
rea = M_PI * raio * raio;
}
==
=9 7$eradores, Ex$ress<es e 2un5<es
Lm $rograma tem *omo *ara*terAsti*a 8undamental a *a$a*idade de $ro*essar dados9 1ro*essar
dados signi8i*a reali3ar o$era5<es *om estes dados9 As o$era5<es a serem reali3adas *om os dados $odem
ser determinadas $or operadores ou >un*Ges9 7s o$eradores $odem ser de atribui56o, aritm(ti*os, de
atribui56o aritm(ti*a, in*rementais, rela*ionais, l;gi*os e *ondi*ionais9
0,emplo+ o sAmbolo + ( um operador %ue re$resenta a o$era56o aritm(ti*a de adi56o9 7
identi8i*ador sqrt() ( uma fun23o %ue re$resenta a o$era56o de extrair a rai3 %uadrada de um n,mero9
Lma e,presso ( um arran:o de o$eradores e o$erandos9 A *ada ex$ress6o vFlida ( atribuAdo um
valor num(ri*o9
0,emplo+ 4 + 6 ( uma ex$ress6o *u:o valor ( 109 A ex$ress6o sqrt(9.0) tem valor 3.09
!.1 (perador de Atri)ui*o
A o$era56o de atribui56o ( a o$era56o mais sim$les do C9 Consiste de atribuir valor de uma
e,presso a uma vari?vel9
-inta,e+ A sintaxe da o$era56o de atribui56o ( a seguinteE
identificador = express7o;
onde identificador ( o nome de uma variFvel e express7o ( uma ex$ress6o vFlida Bou
outro identi8i*adorC9
0,emplo+ A seguir s6o mostradas algumas atribui5<es vFlidasE
a = 1;
delta = b * b - 4. * a * c;
i = j;
7bserve %ue o sAmbolo de atribui56o B = C no tem o mesmo signi8i*ado %ue o usual da
matemFti*a %ue re$resenta a igualdade de valores9 Este sAmbolo, em C, re$resenta a atribui56o do valor
*al*ulado em express7o a variFvel identificador9 Em $seudo-linguagem o o$erador de
=I
atribui56o ( re$resentado *omo 9 #amb(m n6o se $ode *on8undir o o$erador de atribui56o B = C *om
o o$erador rela*ional de igualdade B == C %ue serF visto na se56o =9?919
7bserve-se tamb(m %ue o o$erando es%uerdo deve ser um identi8i*ador de variFvel, isto (, no
pode ser uma *onstante ou ex$ress6o9
0,emplo+ A seguir s6o mostradas algumas atribui5<es invFlidasE
1 = a; // constante!
b + 1 = a; // expresso!

!.1.1 Converso de tipo.
Se os dois o$erandos de uma atribui56o no so do mesmo ti$o, o valor da ex$ress6o ou o$erador
da direita ser? convertido $ara o ti$o do identi8i*ador da es%uerda9
0,emplo+ Algumas atribui5<es *om *onvers6o de ti$oE
int i;
float r;
i = 5; // valor de i: 5
r = i ; // valor de r: 5.0
A variFvel i 8oi ini*iali3ada *om o valor 59 Ao 8inal da ter*eira instru56o, r re*ebe o valor
5.09

Nestas *onvers<es $odem o*orrer altera5<es dos valores *onvertidos se o o$erando da es%uerda
8or de um ti$o %ue utili3e menor numero de b"tes %ue o o$erando da direita9
0,emplo+ Algumas atribui5<es *om *onvers6o de ti$o e $erda de in8orma56oE
int i;
float r = 654.321;
i = r; // truncamento!

A$;s a exe*u56o deste tre*ho de $rograma o valor da variFvel i serF 654 $ois seu valor 8oi
trun*ado durante a *onvers6o9
1ode-se di3er %ue as *onvers<es $oten*ialmente $erigosas Bonde hF $ossibilidade de $erda de
in8orma56oC s6oE
=?
char int float double
7bserve %ue o *om$ilador C ao en*ontrar esta o$era56o no gera nenhum aviso de aten56o $ara
o $rogramador9 Assim este detalhe $ode gerar um erro de $rograma56o B&ugC %ue $asse desa$er*ebido ao
$rogramador inex$eriente9 S $ossAvel di3er %ue a linguagem C $ossui ti$os Xma*iosY Bsoft typesC $ois a
o$era56o *om variFveis de ti$os di8erentes ( $er8eitamente $ossAvel9 Esta *ara*terAsti*a do C se *ontra$<e
a algumas linguagens em %ue isto n6o ( $ossAvel B2ortran, $or exem$loC9 Estas linguagens $ossuem ti$os
XdurosY Bhard typesC9
!.1. /imites do intervalo do tipo de dado.
#amb(m ( im$ortante observar %ue os ti$os em C tem intervalos bem de8inidos e os resultados
das o$era5<es devem res$eitar estes intervalos9 Se a uma variFvel 8or atribuAdo um valor %ue este:a 8ora
dos seus limites ent6o este valor serF alterado9
0,emplo+ 7bserve as ex$ress<es abaixo, assuma %ue i se:a uma variFvel do ti$o int9
i = 4999; // o valor de i e' 4999
i = 4999 + 1; // o valor de i e' 5000
i = 5000 + 30000; // o valor de i e' -30536

7 valor de 35000 ultra$assou o limite su$erior do ti$o int B32767C9
S im$ortante observar %ue em C, ao *ontrFrio de outras linguagens, a ultra$assagem do limite de
um ti$o no interpretado como erro. Isto $ode a*arretar resultados ines$erados $ara o $rogramador
desatento9
!.1.! Atri)ui*o mHltipla.

E $ossAvel atribuir um valor a muitas variFveis em uma ,ni*a instru56o9 A esta o$era56o dF-se o
nome de atri)ui*o mHltipla9
-inta,e+ A sintaxe da atribui56o m,lti$la ( seguinteE
)ar8* = [)ar8+ = ... ] express7o;
=@
onde )ar8*, )ar8+, 999 s6o os identi8i*adores de variFveis e express7o ( uma ex$ress6o
vFlida9
7bserve %ue na atribui56o m,lti$la as o$era5<es o*orrem da direita $ara a esCuerda, isto (,
ini*ialmente o valor de express7o ( atribuAdo a )ar8+ e de$ois o valor de )ar8+ ( atribuAdo a
)ar8*9 Deve-se tomar *uidado *om as *onvers<es de ti$o e limites de intervalo $ara atribui5<es de ti$os
di8erentes9
0,emplo+ 7bserve a instru56o de atribui56o m,lti$la abaixoE as variFveis inteiras i, j e k
s6o todas ini*iali3adas *om o valor 19 E as variFveis de du$la $re*is6o max e min s6o ini*iali3adas
*om o valor 0.0E
int i, j, k;
double max, min;
i = j = k = 1;
max = min = 0.0;
Programa 0,emplo+ 7 ar%uivo e0301.cpp tra3 um $rograma $ara visuali3ar alguns as$e*tos
rela*ionados *om o o$erador de atribui56o9 Exe*ute o $rograma $asso-a-$asso e observe o valor das
variFveis9
!. (peradores Aritmticos
Existem *in*o o$eradores aritm(ti*os em C9 Cada o$erador aritm(ti*os estF rela*ionado ao uma
o$era56o aritm(ti*a elementarE adi56o, subtra56o, multi$li*a56o e divis6o9 Existe ainda um o$erador B 9C
*hamado o$erador de m1dulo *u:o signi8i*ado ( o resto da divis6o inteira9 7s sAmbolos dos o$eradores
aritm(ti*os s6oE
:perador :pera,+o
+ adi56o9
- subtra56o9
* multi$li*a56o
/ divis6o
% m;dulo Bresto da divis6o inteiraC
=7
-inta,e+ A sintaxe de uma ex$ress6o aritm(ti*a (E
operando operador operando
onde operador ( um dos caracteres mostrados a*ima e operando ( uma constante ou um
identi8i*ador de vari?vel9

0,emplo+ Algumas ex$ress<es aritm(ti*asE
1+2 a-4.0 b*c valor_1/taxa num%2
N6o existe em C, *omo existe em outras linguagens, um o$erador es$e*A8i*o $ara a o$era56o de
$oten*ia56o Ba
b
C9 Existe, $or(m, uma 8un56o de bibliote*a Bpow67C %ue reali3a esta o$era56o9 &e:a a
se56o =97 adiante9 Embora as o$era5<es do C se:am semelhantes as o$era5<es aritm(ti*as usuais da
matemFti*a, alguns detalhes s6o es$e*A8i*os da linguagem, e devem ser observados9
!..1 Restri*Ges de operandos.
7s o$erandos dos o$eradores aritm(ti*os devem ser *onstantes num(ri*as ou identi8i*adores de
variFveis num(ri*as9 7s o$eradores +, -, *, / $odem o$erar n,meros de todos os ti$os Binteiros ou
reaisC $or(m o o$erador 9 somente a*eita o$erandos inteiros9
0,emplo+ Ex$ress<es vFlidas
;xpress+o 1alor
6.4 + 2.1 8.5
7 - 2 5
2.0 * 2.0 4.0
6 / 3 2
47 % 2 1
Lma restri56o ao o$erador de divis6o B/C ( %ue o denominador deve ser di8erente de 3ero9 Se
alguma o$era56o de divis6o $or 3ero 8or reali3ada o *orrera um erro de e,ecu*o do $rograma Brun8time
errorC, o $rograma serF abortado e a mensagem divide error serF exibida9
=H
0,emplo+ A ex$ress6o abaixo ( invFlida $ois o $rimeiro o$erando n6o ( um numero inteiro9
;xpress+o 1alor
6.4 % 3 invalido!
1odemos *ontornar o $roblema do o$erador inteiro da o$era56o modulo usando o arti8A*io da
*onvers6o de ti$o BcastingC mostrada na se56o 49=9IE
0,emplo+ 7bserve o tre*ho de $rograma abaixoE
int num;
float valor = 13.0;
num = valor % 2; // invlido!
num = (int)valor % 2; // vlido!
7bserve %ue usamos a *onvers6o de ti$o $ara %ue o dado arma3enado em valor 8osse
trans8ormado no ti$o int assim a o$era56o m;dulo $ode ser e8etuada9
!.. Converso de tipo.
7 resultado de uma o$era56o aritm(ti*a depende dos ti$os dos o$erandos9 Se os o$erandos s6o
do mesmo ti$o o resultado serF do mesmo ti$o9 Se os o$erando 8orem de ti$os di>erentes ent6o haverF
uma converso de ti$o tal %ue o ti$o %ue o*u$a menos es$a5o de mem;ria serF *onvertido $ara o ti$o
%ue o*u$a mais es$a5o de mem;ria e o resultado serF deste ti$o9 Em geralE
char int float double
Esta ( uma regra geral, alguns *om$iladores $odem ter outras regras de *onvers6o9
0,emplo+ 7bserve as *onvers<es de ti$o abaixoE
;xpress+o 1alor .onvers+o
6 + 2.0 8.0 int float
7.000000 - 2.0000000000000 5.000000000000000 float double
2 * 3.000000000000000 6.000000000000000 int double
7bserve %ue estas *onvers<es $odem gerar resultados sur$reendentes $ara o $rogramador
desatento9
0,emplo+ 7bserve as ex$ress<es abaixo9 Assuma %ue as variFveis num_i, num_f, den_i e
den_f s6o ini*iali3adas *omoE
int num_i = 7 , den_i = 2 ;
=9
float num_f = 7.0, den_f = 2.0;
;xpress+o 1alor :perandos *esultado
num_f / den_f 3.5 float / float float
num_f / den_i 3.5 float / int float
num_i / den_f 3.5 int / float float
num_i / den_i 3 int / int int

7bserve %ue no exem$lo a*ima o valor da ,ltima ex$ress6o ( 3 e n6o 3&9 Isto o*orre $or%ue
*omo os dois o$erandos s6o ti$o int o resultado e *onvertido $ara o ti$o int e o*orre o trun*amento9 7
trun*amento da divis6o inteira ( 8eito de modo a obter o menor valor absoluto9
Em C *ara*teres s6o arma3enados na mem;ria *omo n,meros inteiros e $or isso o$era5<es
aritm(ti*as s6o $ermitidas *om ti$os char9 7s valores usados s6o os *orres$ondentes da tabela ASCII9
0,emplo+ 7bserve as ex$ress<es abaixoE
;xpress+o 1alor .onvers+o
'A' + 1 'B' 65 + 1 66
'A' + 'B' '' 65 + 66 131
'A' + 32 'a' 65 + 32 97
!..4 PrecedBncia de operadores.
\uando mais de um o$erador se en*ontram em uma ex$ress6o aritm(ti*a as o$era5<es s6o
e8etuadas uma de *ada ve3 res$eitando algumas regras de $re*ed>n*iaE Estas regras de $re*ed>n*ia s6o as
mesmas da matemFti*a elementar9

7s o$eradores de multi$li*a56o B*C, divis6o B/C e m;dulo B%C tem $re*ed>n*ia sobre os
o$eradores de adi56o B+C e subtra56o B-C9 Entre o$eradores de mesma $re*ed>n*ia as o$era5<es s6o
e8etuadas da esCuerda $ara a direita9 &e:a a tabela =919
0,emplo+ 7bserve, nas ex$ress<es abaixo, o seu valor e a ordem das o$era5<es e8etuadasE
;xpress+o 1alor :rdem
1 + 2 - 3 0 + -
24 - 3 * 5 9 * -
4 - 2 * 6 / 4 + 1 2 * / - +
6 / 2 + 11 % 3 * 4 11 / % * +
ID
A ordem de $re*ed>n*ia dos o$eradores $ode ser %uebrada usando-se $ar>ntesesE ( )9 7s
$ar>nteses s6o, na verdade, o$eradores de mais alta $re*ed>n*ia e s6o exe*utados $rimeiro9 1ar>nteses
internos s6o exe*utados $rimeiro %ue $ar>nteses externos9
0,emplo+ 7bserve, nas ex$ress<es abaixo, o seu valor e a ordem das o$era5<es e8etuadasE
;xpress+o 1alor :rdem
1 + (2 - 3) 0 - +
(24 - 3) * 5 105 - *
(4 - 2 * 6) / 4 + 1 -1 * - / +
6 / ((2 + 11) % 3) * 4 24 + % / *

7bserve %ue os o$eradores e os o$erandos deste exem$lo s6o os mesmos do exem$lo anterior9 7s
valores, $or(m, s6o di8erentes $ois a ordem de exe*u56o das o$era5<es 8oi modi8i*ada $elo uso dos
$ar>nteses9
Programa 0,emplo+ 7 ar%uivo e0302.cpp tra3 um $rograma $ara visuali3ar alguns as$e*tos
rela*ionados *om os o$eradores aritm(ti*os9 Exe*ute o $rograma $asso-a-$asso e observe o valor das
variFveis9
!.! (peradores de Atri)ui*o Aritmtica
.uitas ve3es %ueremos alterar o valor de uma variFvel reali3ando alguma o$era56o aritm(ti*a
*om ela9 Como $or exem$loE i = i + 1 ou val = val * 29 Embora se:a $er8eitamente $ossAvel
es*rever estas instru5<es, 8oi desenvolvido na linguagem C uma instru5<es otimiAadas *om o uso de
o$eradores ditos operadores de atri)ui*o aritmtica9 7s sAmbolos usado s6o B+=, -=, *=, /= ,
%=C9 Deste modo as instru5<es a*ima $odem ser res*ritas *omoE i += 1 e val *= 2,
res$e*tivamente9
-inta,e+ A sintaxe da atribui56o aritm(ti*a ( a seguinteE
)ar += exp;
)ar -= exp;
)ar *= exp;
)ar /= exp;
)ar %= exp;
onde )ar ( o identi8i*ador da variFvel e exp ( uma ex$ress6o vFlida9 Estas instru5<es s6o
e%uivalentes as seguintesE
)ar = var + exp;
I1
)ar = var - exp;
)ar = var * exp;
)ar = var / exp;
)ar = var % exp;
0,emplo+ 7bserve as atribui5<es aritm(ti*as abaixo e suas instru5<es e%uivalentesE
)tribui,+o aritm-tica 2nstru,+o equivalente
i += 1; i = i + 1;
j -= val; j = j - val;
num *= 1 + k; num = num * (1 + k);
troco /= 10; troco = troco / 10;
resto %= 2; resto = resto % 2;
7 o$erador de atribui56o aritm(ti*a tem $re*ed>n*ia menor %ue os outros o$eradores at( a%ui
dis*utidos9 &e:a a tabela =919
Programa 0,emplo+ 7 ar%uivo e0303.cpp tra3 um $rograma $ara visuali3ar alguns as$e*tos
rela*ionados *om os o$eradores de atribui56o aritm(ti*a9 Exe*ute o $rograma $asso-a-$asso e observe o
valor das variFveis9
!.4 (peradores 6ncrementais
Em $rograma56o existem instru5<es muito *omuns *hamadas de incremento e decremento9
Lma instru56o de in*remento adiciona uma unidade ao *onte,do de uma variFvel9 Lma instru56o de
de*remento su)trai uma unidade do *onte,do de uma variFvel9
Existem, em C, o$eradores es$e*A8i*os $ara reali3ar as o$era5<es de in*remento B++C e
de*remento B--C9 Eles s6o generi*amente *hamados de operadores incrementais9
-inta,e+ A sintaxe dos o$eradores in*rementais ( a seguinteE
instru,+o equivalente
++ var var = var + 1
var ++ var = var + 1
-- var var = var - 1
var -- var = var - 1
onde )ar ( o nome da variFvel da %ual se %uer in*rementar ou de*rementar um unidade9
I4
7bserve %ue existe duas sintaxes $ossAveis $ara os o$eradoresE $ode-se *olo*ar o o$erador I
esCuerda ou ? direita da variFvel9 Nos dois *asos o valor da variFvel serF in*rementado Bou
de*rementadoC de uma unidade9 1or(m se o o$erador 8or *olo*ado ? esCuerda da variFvel, o valor da
variFvel serF in*rementado Bou de*rementadoC antes %ue a variFvel se:a usada em alguma outra o$era56o9
Caso o o$erador se:a *olo*ado I direita da variFvel, o valor da variFvel serF in*rementado Bou
de*rementadoC depois %ue a variFvel 8or usada em alguma outra o$era56o9
0,emplo+ 7bserve o 8ragmento de *;digo abaixo e note o valor %ue as variFveis re*ebem ap1s a
exe*u56o da instru56oE
valor das vari<veis
int a, b, c, i = 3; // a: ? b: ? c: ? i: 3
a = i++; // a: 3 b: ? c: ? i: 4
b = ++i; // a: 3 b: 5 c: ? i: 5
c = --i; // a: 3 b: 5 c: 4 i: 4
7s o$eradores in*rementais s6o bastante usados $ara o *ontrole de la5os de re$eti56o, %ue ser6o
vistos na se56o UU9 S im$ortante %ue se *onhe5a exatamente o e8eito sutil da *olo*a56o do o$erador, $ois
isto $ode enganar o $rogramador inex$eriente9
7s o$eradores in*rementais tem a mais alta $re*ed>n*ia entre todos, sendo su$erados a$enas
$elos $ar>nteses %ue tem $re*ed>n*ia ainda maior9 &e:a a tabela =919
Programa 0,emplo+ 7 ar%uivo e0304.cpp tra3 um $rograma $ara visuali3ar alguns as$e*tos
rela*ionados *om os o$eradores in*rementais9 Exe*ute o $rograma $asso-a-$asso e observe o valor das
variFveis9
!." (peradores Relacionais e /1gicos
A *have $ara a 8lexibilidade de um algoritmo ( a tomada de de*is<es atrav(s da avalia56o de
*ondi5<es de *ontrole9 Lma *ondi5<es de *ontrole ( uma e,presso l1gica %ue ( avaliadas *omo
verdadeira ou >alsa9 Lma ex$ress6o l;gi*a ( *onstruAda *om operadores relacionais e l1gicos9
!.".1 (peradores relacionais
7$eradores rela*ionais veri8i*am a rela56o de magnitude e igualdade entre dois valores9 S6o seis
os o$eradores rela*ionais em CE
I=
:perador 0ignificado
> maior que
< menor que
>= maior ou igual a (no menor que)
<= menor ou igual a (no maior que)
== igual a
!= no igual a (diferente de)
-inta,e+ A sintaxe das ex$ress<es l;gi*as (E
express7o8* operador express7o8+
onde express7o8* e express7o8+ s6o duas ex$ress<es num(ri*as %uais%uer, e operador
( um dos o$eradores rela*ionais9
Ao *ontrFrio de outras linguagens, em C no e,istem ti$os l;gi*os, $ortanto o resultado de uma
ex$ress6o l;gi*a ( um valor numricoE uma ex$ress6o avaliada verdadeira re*ebe o valor 1, uma
ex$ress6o l;gi*a avaliada >alsa re*ebe o valor 09
Se os o$erandos 8orem de tipos di>erentes haverF uma *onvers6o de ti$o antes da avalia56o da
ex$ress6o9 Esta *onvers6o de ti$o ( 8eita de a*ordo *om a regra mostrada na se56o =94949
0,emplo+ 7bserve as ex$ress<es l;gi*as abaixo e veri8i%ue o resultado de sua avalia56o9 Admita
%ue i e j s6o variFveis int *u:os valores s6o 5 e -3, res$e*tivamente9 As variFveis r e s s6o float
*om valores 7.3 e 1.7, res$e*tivamente9
;xpress+o 1alor
i == 7 0
r != s 1
i > r 0
6 >= i 1
i < j 0
s <= 5.9 1
7s o$eradores rela*ionais de igualdade B== e !=C tem $re*ed>n*ia menor %ue os de magnitude
B>, <, >= e <=C9 Estes, $or sua ve3, tem $re*ed>n*ia menor %ue os o$eradores aritm(ti*os9 7$eradores
rela*ionais de mesma $re*ed>n*ia s6o avaliados da es%uerda $ara a direita9 &e:a a tabela =919
0,emplo+ 7bserve as ex$ress<es l;gi*as abaixo e veri8i%ue o resultado de sua avalia56o9 Admita
%ue m e n s6o variFveis ti$o int *om valores 4 e 1, res$e*tivamente9
II
;xpress+o 1alor :rdem de :pera,+o
m + n == 5 1 + ==
m != 2 * n > m 1 * > !=
6 >= n < 3 - m 0 - >= <
m == n <= m > m 0 <= > !=
!.". (peradores l1gicos
S6o tr>s os o$eradores l;gi*os de CE &&, || e !9 Estes o$eradores tem a mesma signi8i*a56o
dos o$eradores l;gi*os -ooleanos AND, 7R e N7#9
-inta,e+ A sintaxe de uso dos o$eradores l;gi*osE
expr8* && expr8+
expr8* || expr8+
!expr
onde expr8* , expr8+ e expr s6o ex$ress<es %uais%uer9
7bserve %ue os o$eradores l;gi*os atuam sobre ex$ress<es de %uais%uer valores9 1ara estes
o$eradores todo valor num(ri*o di8erente de 0 ( *onsiderado 19
0,emplo+ A seguir ( mostrado o valor l;gi*o de uma ex$ress6o %ual%uerE
Expresso Valor lgico
0 0
1 1
1.0 1
0.4 1
-5.2 1
onde expr8* , expr8+ e expr s6o ex$ress<es %uais%uer9
7 resultado da o$era56o l;gi*a && serF 1 somente se os dois o$erandos 8orem 1, *aso *ontrFrio
o resultado ( 09 7 resultado da o$era56o l;gi*a || serF 0 somente se os dois o$erandos 8orem 0, *aso
*ontrFrio o resultado ( 19 7 resultado da o$era56o l;gi*a ! serF 0 se o o$erandos 8or 1, e 1 se o
o$erando 8or 09 Abaixo mostra-se o resultado das $ossAveis *ombina5<es entre os o$erandos $ara *ada
o$erador l;gi*oE
I?
Operador ==: op>1 op>2 *es
op_1 && op_2 1 1 1
1 0 0
0 1 0
0 0 0
Operador ??: op>1 op>2 *es
op_1 || op_2 1 1 1
1 0 1
0 1 1
0 0 0
Operador @: op *es
!op 1 0
0 1
7 7$erador && tem $re*ed>n*ia sobre o o$erador ||9 Estes dois t>m $re*ed>n*ia menor %ue os
o$eradores rela*ionais9 7 o$erador T tem a mesma $re*ed>n*ia %ue os o$eradores in*rementais9 &e:a a
tabela =919
0,emplo+ 7bserve as ex$ress<es l;gi*as abaixo e veri8i%ue o resultado de sua avalia56o9 Admita
%ue a, b e c s6o variFveis ti$o int *om valores 0, 1 e 2, res$e*tivamente9
;xpress+o 1alor :rdem de :pera,+o
a && b 0
c > b || a < c 1 > < ||
a + b && !c - b 1 ! + - &&
!b && c || a 0 ! && ||
Programa 0,emplo+ 7 ar%uivo e0305.cpp tra3 um $rograma $ara visuali3ar alguns as$e*tos
rela*ionados *om os o$eradores l;gi*os e rela*ionais9 Exe*ute o $rograma $asso-a-$asso e observe o
valor das variFveis9
!.# (perador Condicional
I@
7 o$erador *ondi*ional B?:C ( usado em ex$ress<es *ondi*ionais9 Lma ex$ress6o *ondi*ional
$ode ter dois valores di8erentes de$endendo de uma *ondi56o de *ontrole9
-inta,e+ A sintaxe de uma ex$ress6o *ondi*ional (E
condi67o ? express7o8* : express7o8+
onde express7o8* e express7o8+ s6o duas ex$ress<es %uais%uer, e condi67o ( uma
ex$ress6o l;gi*a %ue serF avaliada $rimeiro9 Se o valor de condi67o 8or 1, isto (, verdadeiro, ent6o a
ex$ress6o *ondi*ional assumirF o valor de express7o8*9 Caso *ontrario assumirF o valor de
express7o8+9 Lma ex$ress6o *ondi*ional ( e%uivalente a uma estrutura de de*is6o sim$lesE
se condi67o
ent+o expressao8*
sen+o expressao8+
fim se
0,emplo+ 7bserve as ex$ress<es *ondi*ionais abaixo e veri8i%ue o resultado de sua avalia56o9
Admita %ue i, j e k s6o variFveis ti$o int *om valores 1, 2 e 3, res$e*tivamente9
;xpress+o 1alor
i ? j : k 2
j > i ? ++k : --k 4
k == i && k != j ? i + j : i - j -1
i > k ? i : k 3
7 o$erador *ondi*ional tem baixa $re*ed>n*ia, $re*edendo, a$enas, aos o$eradores de atribui56o9
&e:a a tabela =919
Programa 0,emplo+ 7 ar%uivo e0306.cpp tra3 um $rograma $ara visuali3ar alguns as$e*tos
rela*ionados *om o o$erador *ondi*ional9 Exe*ute o $rograma $asso-a-$asso e observe o valor das
variFveis9
!.$ Fun*Ges de )i)lioteca
Lma 8un56o ( um su)2programa Btamb(m *hamado de rotinaC9 Esta 8un56o rece&e in8orma5<es,
as processa e retorna outra in8orma56o9 1or exem$lo, $odemos ter uma 8un56o %ue re*eba um valor
num(ri*o, *al*ule seu logaritmo de*imal e retorne o valor obtido9 Existem dois ti$os de 8un5<esE fun2<es
I7
de &i&#ioteca e fun2<es de usuErio9 2un5<es de bibliote*a s6o 8un5<es es*ritas $elos 8abri*antes do
*om$ilador e :F est6o $r(-*om$iladas, isto (, :F est6o es*ritas em *;digo de mF%uina9 2un5<es de usuFrio
s6o 8un5<es es*ritas $elo $rogramador9 Nesta se56o trataremos somente das 8un5<es de bibliote*a,
8un5<es de usuFrio ser6o vistas no *a$Atulo U9
!.$.1 ( uso de >un*Ges
Antes de usar uma 8un56o ( $re*iso saber *omo a 8un56o esta de*larada, isto (, %uais s6o os
$arNmetros %ue a 8un56o re*ebe e %uais s6o os $ara metros %ue a 8un56o retorna9 Estas in8orma5<es est6o
*ontidas no manual do usuFrio do *om$ilador ou em sua do*umenta56o on8#ine9
-inta,e+ A sintaxe de de*lara56o de uma 8un56o (E
tipo8ret nome=tipo8*9 tipo8+9 :::>
onde nome ( o nome da 8un56o, tipo8*, tipo8+, 999 s6o os ti$os Be %uantidadeC de $arNmetros
de entrada da 8un56o e tipo8ret ( o ti$o de dado de retorno da 8un56o9 Al(m dos ti$os usuais vistos na
se56o 49=, existe ainda o ti$o void Bva3io, em ingl>sC %ue signi8i*a %ue a%uele $arNmetro ( inexistente9
0,emplo+ A 8un56o cos() da bibliote*a math.h ( de*larada *omoE
double cos(double);
Isto signi8i*a %ue a 8un56o tem um $arNmetro de entrada e um $arNmetro de saAda, ambos s6o do
ti$o double9
0,emplo+ A 8un56o getch() da bibliote*a conio.h ( de*larada *omoE
int getch(void);
Isto signi8i*a %ue a 8un56o n6o tem $arNmetros de entrada e tem um $arNmetro int de saAda9
1ara $odermos usar um 8un56o de bibliote*a devemos incluir a bibliote*a na *om$ila56o do
$rograma9 Esta in*lus6o ( 8eita *om o uso da diretiva #include *olo*ada antes do $rograma $rin*i$al,
*omo visto na se*ao 49I949
IH
0,emplo+ Assim $odemos usar a 8un56o no seguinte tre*ho de $rogramaE
#include <math.h> // incluso de biblioteca
void main(){ // inicio do programa principal
double h = 5.0; // hipotenusa
double co; // cateto oposto
double alfa = M_PI_4; // angulo: /4
co = h * cos(alfa); // calculo: uso da funcao cos()
} // fim do programa
As 8un5<es tem alta $re*ed>n*ia, sendo mais baixa a$enas %ue os $ar>nteses9 A tabela =91 mostra
as $re*ed>n*ias de todos os o$eradores estudados neste *a$Atulo9
!.$. As )i)liotecas dispon5veis e algumas >un*Ges interessantes
A seguir segue uma lista de todas as bibliote*as dis$onAveis no *om$ilador Aur&o CFF G.0
@or#andE Ao longo do texto veremos o uso de muitas 8un5<es *obrindo uma boa $arte destas bibliote*as,
$or(m o leitor %ue dese:ar tornar-se _8luente_ na linguagem C $ode Be deveC estudF-las *om $ro8undidade9
alloc.h assert.h bcd.h bios.h complex.h
conio.h ctype.h dir.h dirent.h dos.h
errno.h fcntl.h float.h fstream.h generic.h
graphics.h io.h iomanip.h iostream.h limits.h
locale.h malloc.h math.h mem.h process.h
setjmp.h share.h signal.h stdarg.h stddef.h
stdio.h stdiostr.h stdlib.h stream.h string.h
strstrea.h sys\stat.h sys\timeb.h sys\types.h time.h
values.h
&e:amos algumas 8un*oes dis$oniveis nas bibliote*as C9

3i)lioteca math.h
int abs(int i);
double fabs(double d);
Cal*ula o valor absoluto do inteiro i e do real d, res$e*tivamente9
double sin(double arco);
I9
double cos(double arco);
double tan(double arco);
double asin(double arco);
double acos(double arco);
double atan(double arco);
2un5<es trigonometri*as do Nngulo arco, em radianos9
double ceil(double num);
double floor(double num);
2un*oes de arredondamento $ara inteiro9
ceil() arredonda $ara *ima9 Ex9 ceil(3.2) == 3.0;
floor() arredonda $ara baixo9 Ex9 floor(3.2) == 4.0;
double log(double num);
double log1%(double num);
2un*oes logaritmi*asE log() ( logaritmo natural Bbase eC, log10() ( logaritmo
de*imal Bbase 1DC9
double pow(double base9 double exp);
1oten*ia*aoE pow(3.2,5.6) ] =94
?9@
9
double sqrt(double num);
Rai3 %uadradaE sqrt(9.0) = 3.0.
3i)lioteca stdli).h
int random(int num);
!era um n,mero inteiro aleat;rio entre 0 e num - 19
Programa 0,emplo+ 7 ar%uivo e0307.cpp tra3 um $rograma $ara visuali3ar alguns as$e*tos
rela*ionados *om 8un5<es de bibliote*a9 Exe*ute o $rograma $asso-a-$asso e observe o valor das
variFveis9
!.% PrecedBncia entre os operadores do C
?D
A tabela =91 mostra a ordem de $re*ed>n*ia de todos os o$eradores estudados neste *a$Atulo9 7s
o$eradores de maior $re*ed>n*ia s6o os parBnteses e as *hamadas de >un*Ges9 7s o$eradores de menor
$re*ed>n*ia s6o os o o$eradores de atri)ui*o9
Categoria (peradores Prioridade
$ar>nteses
( )
interno externo
8un56o
nome()
E D
in*remental, l;gi*o
++ -- !
E D
aritm(ti*o
* / %
E D
aritm(ti*o
+ -
E D
rela*ional
< > <= >=
E D
rela*ional
== !=
E D
l;gi*o
&&
E D
l;gi*o
||
E D
*ondi*ional
?:
E D
atribui56o
= += -= *= /= %=
E D
Taela !.1? 5recedHncia dos operadores. 4aior precedHncia no topo) menor precedHncia na &ase.
I9 Entrada e SaAda
1ara %ue um $rograma torne-se minimamente 8un*ional ( $re*iso %ue ele re*eba dados do meio
externo Bte*lado, mouse, $ortas de *omuni*a56o, drives de dis*o, et*9C e emita o resultado de seu
$ro*essamento de volta $ara o meio externo Bmonitor, im$ressora, alto-8alante, $ortas de *omuni*a56o,
drives de dis*o, et*9C9 De outro modoE um $rograma deve tro*ar in8orma5<es *om o meio externo9 Em C,
existem muitas 8un5<es $r(-de8inidas %ue tratam desta tro*a de in8orma5<es9 S6o as 8un5<es de entrada e
sa5da do C9 Nos exem$los mostrados nos *a$Atulos anteriores 8oram vistas algumas 8un5<es de entrada
Bscanf(), getch()C e algumas 8un5<es de saAda Bprintf()C9 Neste *a$Atulo veremos, em detalhe,
estas e outras 8un5<es de modo a $ermitir es*rever um $rograma *om$leto em C9
.ostraremos, nas duas se5<es ini*iais as mais im$ortantes 8un5<es de entrada e saAda de dados
em CE as 8un5<es printf() e scanf()9 A $artir do estudo destas 8un5<es ( $ossAvel es*rever um
$rograma $ro$riamente dito *om entrada, $ro*essamento e saAda de dados9
?1
I91 SaAda 8ormatadaE printf()
3i)lioteca+ stdio.h
Declara*o+ int printf (const char* st8contr [, lista8arg]);
Prop1sito+ A 8un56o printf() Bprint formatedC im$rime dados da lista de argumentos
lista8arg 8ormatados de a*ordo *om a string de *ontrole st8contr9 Esta 8un56o retorna um valor
inteiro re$resentando o n,mero de *ara*teres im$ressos9
Esta 8un56o im$rime dados num(ri*os, *ara*teres e strings9 Esta 8un56o ( dita de saAda
8ormatada
$ois os dados de saAda $odem ser 8ormatados Balinhados, *om n,mero de dAgitos variFveis, et*9C9
-inta,e+ A string de contro#e ( uma mFs*ara %ue es$e*i8i*a B8ormataC o %ue serF im$resso e de
%ue maneira serF im$resso9
0,emplo+ 7bserve no exem$lo abaixo as instru2<es de saAda 8ormatada e os res$e*tivos
resultados9
2nstru,+o 0aAda
printf(Ola', Mundo!); Ola', Mundo!
printf(linha 1 \nlinha 2 ); linha 1
linha 2
7bserve %ue na $rimeira instru56o, a saAda ( exatamente igual a string de *ontrole9 /F na segunda
instru56o a im$ress6o se deu em duas linhas9 Isto se deve ao \n %ue re$resenta o *;digo ASCII $ara
%uebra de linha Bve:a se56o 4919=C9
Nesta mas*ara ( $ossAvel reservar es$a5o $ara o valor de alguma variFvel usando especificadores
de formato9 Lm es$e*i8i*ador de 8ormato mar*a o lugar e o >ormato de im$ress6o das variFveis *ontidas
na lista vari?veis9 Deve haver um es$e*i8i*ador de 8ormato $ara *ada variFvel a ser im$ressa9 #odos os
es$e*i8i*adores de 8ormato *ome5am *om um %9
?4
0,emplo+ 7bserve no exem$lo abaixo as instru2<es de saAda 8ormatada e os res$e*tivos
resultados9 Admita %ue idade se:a uma variFvel int *ontendo o valor 29 e %ue tot e din se:am
variFveis float *u:o valores s6o, res$e*tivamente, 12.3 e 15.09
2nstru,+o(
printf(Tenho %d anos de vida,idade);
0aAda(
Tenho 29 anos de vida
2nstru,+o(
printf(Total: %f.2 \nDinheiro: %f.2 \nTroco: %f.2,tot,din,din-tot);
0aAda(
Total: 12.30
Dinheiro: 15.00
Troco: 2.70

De$ois do sinal %, seguem-se alguns modi8i*adores, *u:a sintaxe ( a seguinteE
% 1flag3 1taman%o3 1:precis7o3 tipo
[flag]
justi>ica*o de sa5da+ E(pcionalF
-
:usti8i*a56o ` es%uerda9
+
*onvers6o de sinal BsaAda sem$re *om sinalE [ ou -C
<espao>
*onvers6o de sinal BsaAdas negativas *om sinal, $ositivas sem sinalC
[tamanho]
especi>ica*o de tamanho E(pcionalF
n
$elo menos n dAgitos ser6o im$ressos BdAgitos 8altantes ser6o *om$letados $or
bran*osC9
0n
$elo menos n dAgitos ser6o im$ressos BdAgitos 8altantes ser6o *om$letados $or
3erosC9
[.preciso]
especi>icador de precisoJ d5gitos a direita do ponto decimal. E(pcionalF
(nada)
$adr6oE @ dAgitos $ara reais9
.0
nenhum digito de*imal9
.n
s6o im$ressos n dAgitos de*imais9
3ipo
caracter de converso de tipo EReCueridoF
d
inteiro de*imal
o
inteiro o*tal
x
inteiro hexade*imal
f
$onto 8lutuanteE [-]dddd.dddd9
e
$onto 8lutuante *om ex$oenteE [-]d.dddde[+/-]ddd
c
*ara*ter sim$les
?=
s
string
Programa 0,emplo+ 7 ar%uivo e0401.cpp *ont(m um $rograma %ue ilustra o uso da 8un56o
printf() usando vFrias *ombina5<es de strings de contro#e e especificadores de formato9 Exe*ute o
$rograma $asso-a-$asso e veri8i%ue a saAda dos dados9
I94 eitura 8ormatadaE scanf()
3i)lioteca+ stdio.h
Declara*o+ int scanf(const char* st8contr [, end8)ar, ...]);
Prop1sito+ A 8un56o scanf() Bscan formatedC $ermite a entrada de dados num(ri*os,
*ara*teres e astringsa e sua res$e*tiva atribui56o a variFveis *u:os endere5os s6o end8)ar9 Esta 8un56o (
dita de entrada 8ormatada $ois os dados de entrada s6o 8ormatados $ela string de contro#e st8contr9 a
um determinado ti$o de variFvel Bint, float, char, 999C9
-inta,e+ 7 uso da 8un56o scanf() ( semelhante ao da 8un56o printf()9 A 8un56o l> da
entrada $adr6o Bem geral, te*ladoC uma lista de valores %ue ser6o 8ormatados $ela string de *ontrole e
arma3enados nos endere5os das variFveis da lista9 A string de *ontrole ( 8ormada $or um *on:unto de
es$e*i8i*adores de 8ormato, *u:a sintaxe ( a seguinteE
% [*] [taman%o] tipo
B
indicador de supresso E(pcionalF
<presente>
Se o indi*ador de su$ress6o estiver $resente o *am$o n6o ( lido9 Este su$ressor (
,til %uando n6o %ueremos ler um *am$o de dado arma3enado em ar%uivo9
<ausente>
7 *am$o ( lido normalmente9
3amanho
especi>icador de tamanhoE(pcionalF
n
Es$e*i8i*a n *omo o numero mFximo de *ara*teres $ara leitura do *am$o9
<ausente>
Cam$o de %ual%uer tamanho9
3ipo
de>ine o tipo de dado a ser lido EReCueridoF
d
inteiro de*imal BintC
f
$onto 8lutuante BfloatC
o
inteiro o*tal BintC
x
inteiro hexade*imal BintC
i
inteiro de*imal de %ual%uer 8ormatoBintC
u
inteiro de*imal sem sinal Bunsigned intC
s
string Bchar*)
c
*ara*ter BcharC
?I
A lista de variFveis ( o *on:unto de Bendere5osC de variFveis $ara os %uais ser6o $assados os
dados lidos9 &ariFveis sim$les devem ser $re*edidos $elo *ara*ter &. &e:a mais sobre endere5os na
se56o U9U &ariFveis string e vetores n6o s6o $re*edidos $elo *ara*ter &. &e:a mais sobre strings e vetores
na se56o U9U
Programa e,emploE 7 ar%uivo e0402.cpp *ont(m um $rograma %ue ilustra o uso da 8un56o
scanf() na leitura de dados9 Exe*ute o $rograma $asso-a-$asso e veri8i%ue *omo os es$e*i8i*adores de
8ormato agem sobre os dados digitados9
I9= Entrada de *ara*ter individualE getchar()
3i)lioteca+ stdio.h
Declara*o+ int getchar(void);
Prop1sito+ A 8un56o getchar() Bget characterC l> um *ara*ter individual da entrada $adr6o
Bem geral, o te*ladoC9 Se o*orrer um erro ou uma *ondi56o de a fim8de8arquivoa durante a leitura, a 8un56o
retorna o valor da *onstante simb;li*a EOF Bend of fi#eCde8inida na bibliote*a stdio.h9 Esta 8un56o
$ermite uma 8orma e8i*iente de dete*56o de 8inais de ar%uivos9
Esta 8un56o ( dita #ine &uffered, isto (, n6o retorna valores at( %ue o *ara*ter de *ontrole #ine feed
B\nC se:a lido9 Este *ara*ter, normalmente, ( enviado $elo te*lado %uando a te*la [enter] (
$ressionada9 Se 8orem digitados vFrios *ara*teres, estes 8i*ar6o arma3enados no &uffer de entrada at( %ue
a te*la [enter] se:a $ressionada9 Ent6o, *ada *hamada da 8un56o getchar() lerF um *ara*ter
arma3enado no &uffer9
I9I SaAda de *ara*ter individualE putchar()
3i)lioteca+ stdio.h
Declara*o+ int putchar(int c);
Prop1sito+ Esta 8un56o putchar() Bput characterC im$rime um *ara*ter individual c na
saAda $adr6o Bem geral o monitor de vAdeoC9
??
Programa 0,emplo+ 7 $rograma e0403.cpp mostra o uso das 8un5<es getchar() e
putchar() em um $rograma %ue l> *ara*teres do te*lado e os reim$rime *onvertidos $ara mai,s*ulos9
I9? eitura de te*ladoE getch(), getche()
3i)lioteca+ conio.h
Declara*o+ int getch(void);
int getche(void);
Prop1sito+ Estas 8un5<es 8a3em a leitura dos *;digos de te*lado9 Estes *;digos $odem
re$resentar te*la s de *ara*teres BA, y, *, 8, et*9C, te*las de *omandos B KenterM, KdeleteM, KPage UpM,
KF1M, et*9C ou *ombina56o de te*las BKAltM [ KAM, KShiftM [ KF1M, KCtrlM [ KPage Down], et*9C9
Ao ser exe*utada, a 8un56o getch() Bget characterC aguarda %ue uma te*la Bou *ombina56o de
te*lasC se:a $ressionada, re*ebe do te*lado o *;digo *orres$ondente e retorna este valor9 A 8un56o
getche()Bget character and echoeC tamb(m es*reve na tela, %uando $ossAvel, o *ara*ter
*orres$ondente9
C1digo A-C66E ao ser $ressionada uma te*la *orres$ondente a um *ara*ter ASCII, o te*lado
envia um *;digo ao a&uffera de entrada do *om$utador e este *;digo ( lido9 1or exem$lo, se a te*la A 8or
$ressionada o *;digo 65 serF arma3enado no &uffer e lido $ela 8un56o9
C1digo 0specialE ao serem $ressionadas *ertas te*las Bou *ombina56o de te*lasC %ue n6o
*orres$ondem a um *ara*ter ASCII, o te*lado envia ao a &uffera do *om$utador dois *;digos, sendo o
$rimeiro sempre D9 1or exem$lo, se a te*la KF1M 8or $ressionada os valores 0 e 59 ser6o arma3enados e a
8un56o deve ser *hamada duas veAes $ara ler os dois *;digos9
Programa e,emplo+ 7 ar%uivo e0404.cpp mostra um $rograma $ara a leitura de te*lado9 Este
$rograma usa a 8un56o getch() $ara re*onhe*er te*las e *ombina56o de te*las9
Programa e,emplo+ 7 ar%uivo e0405.cpp mostra um $rograma $ara a leitura de te*lado
usando a 8un56o getche()9
?@
I9@ Es*rita 8ormatada em *oresE cprintf()
3i)lioteca+ conio.h
Declara*o+ int cprintf (const char* st8contr [, lista8arg]);
Prop1sito+ Esta 8un56o cprintf() Bco#or print formatedC $ermite a saAda de dados num(ri*os,
*ara*teres e strings usando *ores9 7 uso da 8un56o cprintf()( semelhante a printf()$or(m
$ermite %ue a saAda se:a a *ores9 1ara %ue a saAda se:a *olorida ( ne*essFrio de8inir as *ores de 8undo e de
letra $ara a im$ress6o antes do uso da 8un56o9
.ores 6Codo 3exto7
.or .onstante 1alor Dundo Eetra
Preto BLACK 0 ok ok
Azul BLUE 1 ok ok
Verde GREEN 2 ok ok
Cian CYAN 3 ok ok
Vermelho RED 4 ok ok
Magenta MAGENTA 5 ok ok
Marrom BROWN 6 ok ok
Cinza Claro LIGHTGRAY 7 ok ok
Cinza Escuro DARKGRAY 8 -- ok
Azul Claro LIGHTBLUE 9 -- ok
Verde Claro LIGHTGREEN 10 -- ok
Cian Claro LIGHTCYAN 11 -- ok
Vermelho Claro LIGHTRED 12 -- ok
Magenta Claro LIGHTMAGENTA 13 -- ok
Amarelo YELLOW 14 -- ok
Branco WHITE 15 -- ok
Piscante BLINK 128 -- ok
Estas de8ini5<es s6o 8eitas $elas 8un5<es texcolor() e textbackground() *u:a sintaxe (E
textcolor(cor8de8letra);
textbackground(cor8de8fundo);
?7
onde cor8de8letra e cor8de8fundo s6o n,meros inteiros re8erentes as *ores da $alheta
$adr6o B1@ *ores, modo textoC9 Estes valores de *or s6o re$resentadas $or *onstantes simb;li*as de8inidas
na bibliote*a conio.h9 1ara se usar uma letra $is*ante deve-se adi*ionar o valor 128 ao valor da *or de
letra9 Alguns valores de *or n6o $odem ser usados *omo *or de 8undo9 A rela56o a*ima mostra as *ores,
suas *onstantes simb;li*as e onde $odem ser usadasE
0,emplo+ 7 tre*ho de $rograma abaixo im$rime uma mensagem de alerta em amarelo $is*ante
sobre 8undo vermelho9
#include <conio.h>
...
textbackground(RED);
textcolor(YELLOW + BLINK);
cprintif( Alerta: Vrus Detectado! );
...
Programa 0,emplo+ 7 $rograma do ar%uivo e0406.cpp mostra todas as *ombina5<es
$ossAveis de im$ress6o *olorida em modo texto9
I97 SaAda sonoraE sound(), delay(), nosound()
3i)lioteca+ dos.h
Declara*Ges+ void sound(unsigned freq);
void delay(unsigned tempo);
void nosound(void);
Prop1sito+ A 8un56o sound() ativa o alto-8alante do 1C *om uma 8re%R>n*ia freq B'3C9 A
8un56o delay() reali3a uma $ausa Baguarda intervalo de tem$oC de dura56o tempo BmilisegundosC9 A
8un56o nosound() desativa o alto-8alante9
Programa 0,emplo+ 7 uso destas 8un5<es ( muito sim$les mas $rodu3 resultados interessantes9
No ar%uivo e0407.cpp temos um exem$lo do uso de sons em $rogramas9
I9H im$e3a de telaE clrscr(), clreol()
?H
3i)lioteca+ conio.h
Declara*Ges+ void clrscr(void);
void clreol(void);
Prop1sito+ A 8un56o clrscr() Bc#ear screenC lim$a a :anela de tela e $osi*iona o *ursor na
$rimeira linha e $rimeira *oluna da :anela B*anto su$erior es%uerdo da :anelaC9 A 8un56o clreol()
Bc#ear to end of #ineC lim$a uma linha desde a $osi56o do *ursor at( o 8inal da linha mas n6o modi8i*a a
$osi56o do *ursor9 Ambas 8un5<es $reen*hem a tela *om a *or de 8undo de8inida $ela 8un56o
textbacground()9
I99 1osi*ionamento do *ursorE gotoxy()
3i)lioteca+ conio.h
Declara*Ges+ void gotoxy(int pos8x, int pos8y);
Prop1sito+ Em modo texto $adr6o, a tela ( dividida em uma :anela de 4? linhas e HD *olunas9 A
8un56o gotoxy() $ermite $osi*ionarmos o *ursor em %ual%uer $osi56o (pos_x,pos_y) da tela9
Sendo %ue a $osi56o B1,1C *orres$onde ao *anto su$erior es%uerdo da tela e a $osi56o BHD,4?C *orres$onde
ao *anto in8erior direito9 Como as 8un5<es printf() e cprintf() es*revem a $artir da $osi56o do
*ursor, $odemos es*rever em %ual%uer $osi56o da tela9
I91D Redimen*ionamento de :anelaE window()
3i)lioteca+ conio.h
Declara*Ges+ void window(int esq, int sup, int dir, int inf);
Prop1sito+ Esta 8un56o $ermite rede8inir a :anela de texto9 As *oordenadas esq e sup de8inem o
*anto su$erior es%uerdo da nova :anela, en%uanto as *oordenadas inf e dir de8inem o *anto in8erior
direito da nova :anela9 1ara reativar a :anela $adr6o es*reve-se a instru56o window(1,1,80,25)9
\uando uma :anela ( de8inida, o texto %ue 8i*ar 8ora da :anela 8i*a *ongelado at( %ue se rede8ina a :anela
original9
I911 .onitora56o de te*ladoE kbhit()
?9
3i)lioteca+ conio.h
Declara*Ges+ int kbhit(void);
Prop1sito+ Esta 8un56o B9ey&oard hittingC $ermite veri8i*ar se uma te*la 8oi $ressionada ou n6o9
Esta 8un56o veri8i*a se existe algum *;digo no &uffer de te*lado9 Se houver algum valor, ela retorna um
n,mero n6o nulo e o valor arma3enado no &uffer $ode ser lido *om as 8un5<es getch() ou getche()9
Caso nenhuma te*la se:a $ressionada a 8un56o retorna D9 7bserve %ue, ao *ontrFrio de getch(), esta
8un56o no aguarda %ue uma te*la se:a $ressionada9
Programa 0,emplo+ 7 ar%uivo eDIDH9*$$ *ont(m um $rograma $ara exem$li8i*ar o uso das
8un5<es clrscr(), clreol(), gotoxy(), window(), kbhit().
?9 Estruturas de Controle
Estruturas de *ontrole $ermitem *ontrolar a se%R>n*ia das a5<es l;gi*as de um $rograma9
-asi*amente, existem dois ti$os de estruturas de *ontroleE estruturas de repeti*o e estruturas de
deciso9 A estrutura de re$eti56o $ermite %ue um blo*o de instru5<es se:a exe*utado re$etidamente uma
%uantidade *ontrolada de ve3es9 A estrutura de de*is6o $ermite exe*utar um entre dois ou mais blo*os de
instru5<es9 Neste *a$Atulo estudaremos em detalhe as instru5<es do C %ue $ermitem im$lementar estas
estruturas9
?91 Condi56o de *ontrole
Em todas as estruturas, existe $elo menos uma ex$ress6o %ue 8a3 o *ontrole de Cual blo*o de
instru5<es serF exe*utado ou Cuantas veAes ele serF exe*utadoE ( o %ue *hamamos de condi*o de
controle9 Lma *ondi56o de *ontrole ( uma ex$ress6o l;gi*a ou aritm(ti*a *u:o resultado $ode ser
*onsiderado verdadeiro ou 8also9 Con8orme vimos na se56o =9?, a linguagem C n6o $ossui, entretanto,
variFveis ou *onstantes l;gi*as, $ossui somente ex$ress<es num(ri*as, assim %uando uma e,presso
numrica se en*ontra em uma condi*o de controle, ela serF *onsiderada >alsa se seu valor 8or igual a
Aero, e verdadeira se seu valor 8or di>erente de Aero9
@D
0,emplo+ 7bserve nas *ondi5<es abaixo, seu valor num(ri*o e seu signi8i*ado l;gi*o9 Considere
as variFveis int i = 0, j = 3;
condi,+o valor num-rico significado lFgico
(i == 0) 1 verdadeiro
(i > j) 0 falso
(i) 0 falso
(j) 3 verdadeiro
Este 8ato deve 8i*ar *laro $ois, nas estruturas %ue estudaremos neste *a$Atulo, %uando 8or dito %ue
uma *ondi56o ( >alsa ou verdadeira %uer se di3er %ue seu valor e igual a 3ero ou di>erente de 3ero9
?94 Estrutura do...while
Esta ( uma estrutura bFsi*a de re$eti56o *ondi*ional9 1ermite a exe*u56o de um blo*o de
instru5<es re$etidamente9 Sua sintaxe ( a seguinteE
-inta,e+
do{
bloco
}while(condi67o);
ondeE condi67o ( uma ex$ress6o l;gi*a ou num(ri*a9
bloco ( um *on:unto de instru5<es9
Esta estrutura 8a3 *om %ue o blo*o de instru5<es se:a exe*utado $elo menos uma ve39 A$;s a
exe*u56o do blo*o, a *ondi56o ( avaliada9 Se a *ondi56o ( verdadeira o blo*o ( exe*utado outra ve3,
*aso *ontrFrio a re$eti56o ( terminada9 78luxograma desta estrutura ( mostrada na 8igura ?91E
@1
bloco
condio? V
F
Figura ".1: 0#u=ograma da estrutura do:::w%ile.
0,emplo+ No tre*ho abaixo, a leitura de um n,mero ( 8eita dentro de um la5o de re$eti56o
*ondi*ional9 A leitura ( re$etida *aso o n,mero lido se:a negativo9
do{
puts("Digite um nmero positivo:");
scanf("%f",&num);
}while(num <= 0.0);
Programa e,emplo+ No ar%uivo e0501.cpp existe um $rograma %ue *al*ula o 8atorial de um
n,mero9 Este $rograma ilustra o uso da estrutura do...while9
?9= Estrutura while
A estrutura de re$eti56o *ondi*ional while ( semelhante a estrutura do...while9 Sua
sintaxe ( a seguinteE
-inta,e+
while(condi67o){
bloco
}
ondeE condi67o ( uma ex$ress6o l;gi*a ou num(ri*a9
bloco ( um *on:unto de instru5<es9
Esta estrutura 8a3 *om %ue a *ondi56o se:a avaliada em $rimeiro lugar9 Se a *ondi56o (
verdadeira o blo*o ( exe*utado uma ve3 e a *ondi56o ( avaliada novamente9 Caso a *ondi56o se:a >alsa a
@4
re$eti56o ( terminada sem a exe*u56o do blo*o9 7bserve %ue nesta estrutura, ao *ontrFrio da estrutura
do...while, o blo*o de instru5<es $ode n6o ser exe*utado nenhuma ve3, basta %ue a *ondi56o se:a
ini*ialmente 8alsa9 7 8luxograma desta estrutura ( mostrada na 8igura ?94E
bloco
condio?
V
F
Figura ".#: 0#u=ograma da estrutura w%ile:
0,emplo+ No tre*ho abaixo, *al*ula-se a $re*is6o BC do $ro*essador aritm(ti*o do 1C9 A
variFvel eps tem seu valor dividido $or 2 en%uanto o $ro*essador *onseguir distinguir entre 1 e 1[9
A$;s a exe*u56o do la5o, o valor de eps *ont(m a $re*is6o da mF%uina9
eps = 1.0;
while(1.0 + eps > 1.0){
eps /= 2.0;
}
Programa e,emplo+ No ar%uivo e0502.cpp existe um $rograma %ue *al*ula a rai3 %uadrada
de um n,mero real $ositivo usando o m(todo de NeWton9 Este $rograma ilustra o uso da estrutura
while9
?9I Estrutura for
A estrutura for ( muito semelhante as estruturas de re$eti56o vistas anteriormente, entretanto
*ostuma ser utili3ada %uando se %uer um n,mero determinado de *i*los9 A *ontagem dos *i*los ( 8eita $or
uma variFvel *hamada de contador9 A estrutura for (, as ve3es, *hamada de estrutura de repeti*o
com contador9 Sua sintaxe ( a seguinteE
@=
-inta,e+
for(inicializa67o; condi67o? incremento){
bloco
}
ondeE inicializa67o ( uma ex$ress6o de ini*iali3a56o do *ontador9
condi67o ( uma ex$ress6o l;gi*a de *ontrole de re$eti56o9
incremento ( uma ex$ress6o de in*remento do *ontador9
bloco ( um *on:unto de instru5<es a ser exe*utado9
Esta estrutura exe*uta um n,mero determinado de re$eti5<es usando um *ontador de itera5<es9 7
*ontador ( ini*iali3ado na ex$ress6o de inicializa67o antes da $rimeira itera56o9 1or exem$loE
i = 0; ou cont = 20;9 Ent6o o blo*o ( exe*utado e depois de *ada itera56o, o *ontador (
in*rementado de a*ordo *om a ex$ress6o de incremento9 1or exem$loE i++ ou cont -= 29
Ent6o a ex$ress6o de *ondi56o ( avaliadaE se a *ondi56o 8or verdadeira, o bloco ( exe*utado
novamente e o *i*lo re*ome5a, se a *ondi56o ( 8alsa termina-se o la5o9 Esta *ondi56o (, em geral, uma
ex$ress6o l;gi*a %ue determina o ultimo valor do *ontador9 1or exem$loE i <= 100 ou cont > 09
0,emplo+ No tre*ho abaixo, o *ontador i ( ini*iali3ado *om o valor 19 7 blo*o ( re$etido
en%uanto a *ondi56o i <= 10 8or verdadeira9 7 *ontador ( in*rementado *om a instru56o i++9 Esta
estrutura, deste modo, im$rime os n,meros 1, 2, ..., 9, 109
for(i=1; i<=10; i++){
printf(" %d",i);
}
S interessante notar %ue a mesma estrutura l;gi*a $ode ser im$lementada usando as estruturas
for ou do...whileE
0,emplo+ As seguintes instru5<es s6o $lenamente e%uivalentesE
i = 0; for(i = 0; i <= 100; i++){
do{ bloco
bloco }
i++;
}while(i <= 100);
@I
1odem existir mais de uma ex$ress6o de inicializa67o e de incremento na estrutura
for9 Estas ex$ress<es devem ser se$aradas $or vArgula B,C9 .as no pode haver mais de uma ex$ress6o
de condi67o9 1or exem$loE for(i=0, j=10; i<10; i++, j--){...}
Programa e,emplo+ No ar%uivo e0503.cpp existe um $rograma %ue *al*ula a am$litude de
um *on:unto de valores9 Este $rograma exem$li8i*a o uso da estrutura for...
?9? Estrutura de de*is6o if...else
A estrutura if...else ( a mais sim$les estrutura de *ontrole do C9 Esta estrutura $ermite
exe*utar um entre vFrios blo*os de instru5<es9 7 *ontrole de %ual blo*o serF exe*utado serF dado $or uma
condi67o Bex$ress6o l;gi*a ou num(ri*aC9 Esta estrutura $ode se a$resentar de modos ligeiramente
di8erentes9 Nesta se56o vamos a$resentar se$aradamente *ada uma das $ossibilidades de sintaxe9
".".1 Deciso de um )loco 6if&&&7
A estrutura de de*is6o de um blo*o $ermite %ue se exe*ute Bou n6oC um blo*o de instru5<es
*on8orme o valor de uma *ondi56o se:a verdadeiro ou 8also9 7 8luxograma desta estrutura ( mostrada na
8igura ?9=9
condio
bloco
V
F
Figura ".!: 0#u=ograma da estrutura de decis3o if:::
-inta,e+ De*is6o *om um blo*oE
if(condi67o){
bloco
}
ondeE condi67o ( uma ex$ress6o l;gi*a ou num(ri*a9
bloco ( um *on:unto de instru5<es9
@?
Se a *ondi56o verdadeira, o bloco ( exe*utado9 Caso *ontrFrio, o blo*o n6o ( exe*utado9
0,emplo+ No tre*ho abaixo, se o valor lido 8or maior %ue 1D, ent6o o seu valor ( rede8inido *omo
1D9 7bserve %ue o blo*o *onstitui-se de um ,ni*a instru56o9
printf("Digite o nmero de repeties: (mximo 10)";
scanf("%d",&iter);
if(iter > 10){
iter = 10;
}
Programa 0,emplo+ 7 ar%uivo e0504.cpp mostra um $rograma %ue utili3a a estrutura
if... $ara emitir um sinal sonoro ao im$rimir um n,mero m,lti$lo de I9
".". Deciso de dois )locos 6if&&&else7
#amb(m ( $ossAvel es*rever uma estrutura %ue exe*ute um entre dois blo*os de instru5<es9 A
8igura ?9I mostra o 8luxograma *orres$ondente a esta estrutura de de*is6o9
condio?
bloco 1 bloco 2
Figura ".$: 0#u=ograma da estrutura de decis3o if:::else
-inta,eE De*is6o de dois blo*osE
if(condi67o){
bloco *;
}else{
bloco +;
}
ondeE condi67o ( uma ex$ress6o l;gi*a ou num(ri*a9
bloco * e bloco + s6o *on:untos de instru5<es9
@@
Se a condio 8or verdadeira o bloco * ( exe*utado9 Caso *ontrFrio, o bloco + (
exe*utado9
0,emplo+ No tre*ho abaixo, se o valor de raiz*raiz 8or maior %ue num o valor de raiz
serF atribuAdo a max, *aso *ontrario, serF atribuAdo a min9
if(raiz*raiz > num){
max = raiz;
}else{
min = raiz;
}
Programa 0,emplo+ 7 ar%uivo e0505.cpp mostra um $rograma %ue utili3a a estrutura
if...else $ara determinar o ti$o de raA3es de uma e%ua56o de segundo grau9
".".! Deciso de mHltiplos )locos 6if&&&else if&&&7
#amb(m ( $ossAvel es*rever uma estrutura %ue exe*ute um entre m,lti$los blo*os de instru5<es9
A 8igura ?9? mostra o 8luxograma *orres$ondente a esta estrutura de de*is6o9
Condio
1?
bloco 1
Condio
2?
bloco 2
Condio
3?
bloco 3
. . .
. . .
V
F
V
F
V
F
@7
Figura ".": 0#u=ograma da estrutura de decis3o if:::else if:
-inta,eE De*is6o de m,lti$los blo*osE
if(condi67o *){
bloco *;
...
}else if(condi67o N){
bloco N;
}else{
bloco @
}
ondeE condi67o *9 condi67o +9 ::: s6o ex$ress<es l;gi*as ou num(ri*as9
bloco * 9 bloco +9::: s6o *on:untos de instru5<es9
Se a *ondi56o 1 8or verdadeira o bloco * ( exe*utado9 Caso *ontrario, a *ondi56o 4 (
avaliada9 Se a *ondi56o 4 8or verdadeira o bloco + ( exe*utado9 Caso *ontrario, a *ondi56o = (
avaliada e assim su*essivamente9 Se nenhuma *ondi56o ( verdadeira bloco @ ( exe*utado9 7bserve
%ue a$enas um dos blo*os ( exe*utado9
0,emplo+ No tre*ho abaixo, uma determinada a56o ( exe*utada se o valor de num 8or $ositivo,
negativo ou nulo9
if(num > 0){
a = b;
}else if(num < 0){
a = b + 1;
}else{
a = b - 1;
}
Programa 0,emplo+ 7 ar%uivo e0506.cpp mostra um $rograma %ue utili3a a estrutura
if...else if $ara determinar se um n,mero ( maior, menor ou igual a outro9
?9@ Estrutura switch...case
A estrutura switch...case ( uma estrutura de de*is6o %ue $ermite a exe*u56o de um
*on:unto de instru5<es a $artir $ontos di8erentes *on8orme o resultado de uma ex$ress6o inteira de
*ontrole9 7 resultado deste ex$ress6o ( *om$arado ao valor de *ada um dos r;tulos, e as instru5<es s6o
exe*utadas a $artir desde r;tulo9 A 8igura ?9@ mostra o 8luxograma l;gi*o desta estrutura9
@H
conjunto 1
conjunto N
conjunto 2
conjunto D
...
expresso
rotulo 1
rotulo N
rotulo D
rotulo 2

Figura ".%: 0#u=ograma da estrutura switc%:::case:
-inta,eE Esta estrutura $ossui a seguinte sintaxeE
switch(express7o){
case rAtulo8*:
conBunto8*
case rAtulo8+:
conBunto8+
...
case rAtulo8n:
conBunto n
[default:
conBunto d]
}
ondeE
@9
express7o ( uma ex$ress6o inteira9
rAtulo8*9rAtulo8+9:::rAtulo8n e rAtulo8d s6o *onstantes inteiras9
conBunto *9 conBunto +9 :::9 conBunto n e conBunto d s6o
*on:untos de instru5<es9
7 valor de express7o ( avaliado e o 8luxo l;gi*o serF desviado $ara o *on:unto *u:o rAtulo
( igual ao resultado da ex$ress6o e todas as instru5<es a)ai,o deste r;tulo ser6o exe*utadas9 Caso o
resultado da ex$ress6o 8or di8erente de todos os valores dos r;tulos ent6o conBunto d ( exe*utado9
7s r;tulos devem ser ex$ress<es *onstantes inteiras di>erentes entre si9 7 r;tulo default ( o$*ional9
Esta estrutura ( $arti*ularmente ,til %uando se tem um *on:unto de instru5<es %ue se deve
exe*utar em ordem, $or(m se $ode *ome5ar em $ontos di8erentes9
0,emplo+ 7 tre*ho abaixo ilustra o uso da instru56o switch em um menu de sele56o9 Neste
exem$lo, o $rograma ini*iarF o $ro*esso de usinagem de uma $e5a em um $onto %ual%uer de$endendo do
valor lido9
int seleo;
puts("Digite estagio de usinagem:");
scanf("%d",&selecao);
switch(seleo){
case 1:
// desbaste grosso...
case 2:
// desbaste fino...
case 3:
// acabamento...
case 4:
// polimento...
}
Programa 0,emplo+ 7 ar%uivo e0507.cpp mostra um $rograma %ue utili3a a estrutura
switch $ara determinar o valor de um lan*he9
?97 Interru$56o e desvioE break, continue, goto, exit()
7D
As instru5<es vistas anteriormente $odem so8rer desvios e interrup*Ges em sua se%R>n*ia l;gi*a
normal atrav(s do uso *ertas instru5<es9 As instru5<es %ue veremos a seguir devem ser usadas *om muita
$ar*imGnia, $ois 8ogem da l;gi*a estruturada tem a tend>n*ia de tornar um $rograma in*om$reensAvel9
".$.1 A instru*o break.
Esta instru56o serve $ara terminar a exe*u56o das instru5<es de um la5o de re$eti56o Bfor,
do...while, whileC ou $ara terminar um *on:unto switch...case9
\uando em um la5o de re$eti56o, esta instru56o 8or5a a interru$56o do la5o inde$endentemente
da *ondi56o de *ontrole9
0,emplo+ No tre*ho abaixo um la5o de re$eti56o l> valores $ara o *Fl*ulo de uma m(dia9 7 la5o
$ossui uma *ondi56o de *ontrole sem$re verdadeira o %ue, a $rin*i$io, ( um erroE la5o in8inito9 1or(m, a
saAda do la5o se dF $ela instru56o break %ue ( exe*utada %uando um valor negativo ( lido9
puts("digite valores:");
do{
puts("valor:");
scanf("%f",&val);
if(val < 0.0){
break; // sada do lao
}
num++;
soma += val;
}while(1); // sempre verdadeiro
printf("mdia: %f",soma/num);
0,emplo+ No exem$lo a*ima, o uso da instru56o break $oderia ter sido evitado, *omo segueE
puts("digite valores:");
do{
puts("valor:");
71
scanf("%f",&val);
if(val >= 0.0){
num++;
soma += val;
}
}while(val >= 0.0);
printf("mdia: %f",soma/num);
7 outro uso da instru56o break, em estruturas switch...case, serve $ara se$arar os
*on:untos de instru5<es em *ada case9
0,emplo+ Estrutura switch...case *om a instru56o breakE
int tipo;
puts("Selecione o sabor de sua pizza:");
puts("Muzzarela Calabreza Alho&Oleo:");
tipo = getch();
switch(tipo){
case M:
// prepara pizza muzzarela...
case C:
// prepara pizza calabreza...
case A:
// prepara pizza Alho&Oleo...
default:
puts("Opcao incorreta");
}
Programa 0,emplo+ 7 ar%uivo e0508.cpp mostra um $rograma %ue utili3a a estrutura
switch *om a instru56o break $ara simular um $iano no te*lado do *om$utador9
".$. A instru*o continue.
Esta instru56o o$era de modo semelhante a instru56o break dentro de um la5o de re$eti56o9
\uando exe*utada, ela $ula as instru5<es de um la5o de re$eti56o sem sair do la5o9 Isto (, a instru56o
8or5a a avalia56o da *ondi56o de *onttrole do la5o9
74
0,emplo+ No tre*ho abaixo revemos um la5o de re$eti56o l> valores $ara o *Fl*ulo de uma
m(dia9 Se (val < 0.0) ent6o o $rograma salta diretamente $ara a *ondi56o de *ontrole, sem exe*utar
o resto das instru5<es9
puts("digite valores:");
do{
puts("valor:");
scanf("%f",&val);
if(val < 0.0){ // se val negativo...
continue; // ...salta para...
}
num++; // se (val < 0.0) estas instrues
soma += val; // no so executadas!
}while(val >= 0.0); // ...fim do lao
printf("mdia: %f",soma/num);
".$.! A instru*o goto.
Esta instru56o ( *hamada de desvio de 8luxo9 A instru56o desvia o $rograma $ara um r;tulo
B$osi56o identi8i*adaC no $rograma9 S6o raros os *asos onde a instru56o goto ( ne*essFria, no entanto, hF
*ertas *ir*unstNn*ias, onde usada *om $rud>n*ia, ela $ode ser ,til9
-inta,e+ A sintaxe da instru56o goto ( a seguinteE
goto rAtulo;
...
rAtulo:
...
onde rAtulo ( um identi8i*ador vFlido9
0,emplo+ No tre*ho abaixo revemos um la5o de re$eti56o l> valores $ara o *Fl*ulo de uma
m(dia9 2oram usadas duas instru5<es goto.
puts("digite valores:");
inicio: // rtulo
puts("valor:");
scanf("%f",&val);
if(val < 0.0){ // se val negativo...
goto fim; // ...salta para fim
7=
}
num++; // se (val < 0.0) estas instrues
soma += val; // no so executadas!
goto inicio; // salta para inicio
fim: // rtulo
printf("mdia: %f",soma/num);
".$.4 A >un*o exit().
Esta 8un56o Bn6o instru56oC exit() , da bibliote*a stdlib.h, ( uma 8un56o %ue termina a
exe*u56o de um $rograma9 Normalmente um $rograma ( terminado %uando se exe*uta a ,ltima sua
instru56o, $or(m $ode-se terminar a exe*u56o do $rograma a %ual%uer momento *om o uso desta 8un56o9
A 8un56o exit() tem a seguinte de*lara56oE void exit(int status)9 7nde o argumento
da 8un56o ( um valor inteiro %ue serF $assado $ara o Sistema 7$era*ionalE BvariFvel de sistema
errorlevel no D7SC9
0,emplo+ No tre*ho abaixo revemos um la5o de re$eti56o l> valores $ara o *Fl*ulo de uma
m(dia9 2oi usado a 8un56o exit $ara terminar a exe*u56o do $rograma9
puts("digite valores:");
do{
puts("valor:");
scanf("%f",&val);
if(val < 0.0){ // se val negativo...
printf("mdia: %f",soma/num); // imprime resultado
exit(0); // termina programa
}
7I
num++; soma += val;
}while(1);
@9 2un5<es
2un5<es Btamb(m *hamadas de rotinas, ou su)2programasC s6o a ess>n*ia da $rograma56o
estruturada9 2un5<es s6o segmentos de $rograma %ue exe*utam uma determinada tare8a es$e*A8i*a9 /F
vimos o uso de 8un5<es nos *a$Atulos anterioresE 8un5<es :F $roviden*iadas $elas bibliote*as-$adr6o do C
B*omo sqrt(), toupper(), getch() ou putchar()C9
S $ossAvel ao $rogramador, alem disso, es*rever suas $r;$rias rotinas9 S6o as *hamadas de
>un*Ges de usu?rio ou rotinas de usuFrio9 Deste modo $ode-se segmentar um $rograma grande em vFrios
$rogramas menores9 Esta segmenta56o ( *hamada de modulariAa*o e $ermite %ue *ada segmento se:a
es*rito, testado e revisado individualmente sem alterar o 8un*ionamento do $rograma *omo um todo9
1ermite ainda %ue um $rograma se:a es*rito $or vFrios $rogramadores ao mesmo tem$o, *ada um
es*revendo um segmento se$arado9 Neste *a$Atulo, veremos *omo es*rever 8un5<es de usuFrio em C9
@91 Estrutura das 8un5<es de usuFrio
A estrutura de uma 8un56o de usuFrio ( muito semelhante a estrutura dos $rogramas %ue
es*revemos at( agora9 Lma 8un56o de usuFrio *onstitui-se de um )loco de instru*Ges %ue de8inem os
$ro*edimentos e8etuados $ela 8un56o, um nome $elo %ual a *hamamos e uma lista de argumentos
$assados a 8un56o9 Chamamos este *on:unto de elementos de de>ini*o da >un*o9
0,emplo+ o *;digo mostrado abaixo ( uma 8un56o de8inida $elo usuFrio $ara *al*ular a m(dia
aritm(ti*a de dois n,meros reaisE
float media2(float a, float b){
float med;
med = (a + b) / 2.0;
return(med);
}
No exem$lo a*ima de8inimos uma 8un56o *hamada media2 %ue re*ebe dois argumentos ti$o
floatE a e b. A m(dia destes dois valores ( *al*ulada e arma3enada na variFvel med de*larada
7?
internamente9 A 8un56o retorna, $ara o $rograma %ue a *hamou, um valor tamb(m do ti$o floatE o
valor da variFvel med9 Este retorno de valor ( 8eito $ela 8un56o return()%ue termina a exe*u56o da
8un56o e retorna o valor de med $ara o $rograma %ue a *hamou9
De$ois de de8inimos um 8un56o, $odemos usF-la dentro de um $rograma %ual%uer9 Di3emos %ue
estamos 8a3endo uma chamada a 8un56o9
0,emplo+ No exem$lo abaixo *hamamos a 8un56o media2() dentro de um $rograma $rin*i$alE
void main(){
float num_1, num_2, med;
puts(Digite dois nmeros:);
scanf(%f %f, &num_1, &num_2);
med = media2(num_1, num_2); // chamada a funo
printf(\nA media destes nmeros e %f, med);
}
@94 De8ini56o de 8un5<es
De modo 8ormal, a sintaxe de uma 8un56o ( a seguinteE
tipo8de8retorno nome8da8fun67o(tipo8* arg8*9 tipo8+ arg8+9 :::){
[bloco de instru6Ces da fun67o]
}

A $rimeira linha da 8un56o *ont(m a declara*o da 8un56o9 Na de*lara56o de uma 8un56o se
de8ine o nome da 8un56o, seu tipo de retorno e a lista de argumentos %ue re*ebe9 Em seguida, dentro de
*haves {}, de8inimos o blo*o de instru5<es da 8un56o9
7 tipo de retorno da 8un56o es$e*i8i*a %ual o ti$o de dado retornado $ela 8un56o, $odendo ser
%ual%uer ti$o de dado mostrado na se56o 49=E int, float, et*9 Se a 8un56o n6o retorna nenhum valor
$ara o $rograma %ue a *hamou devemos de8inir o retorno *omo void, ou se:a um retorno ausente9 Se
nenhum ti$o de retorno 8or es$e*i8i*ado o *om$ilador entenderF %ue o retorno serF ti$o int9
&ale notar %ue existe a$enas um valor de retorno $ara 8un5<es em C9 .o $odemos 8a3er o
retorno de dois ou mais valores *omo em algumas linguagens Bno .atabE [media,desvio] =
estat(a, b, c, d, e)C9 1or(m isto n6o ( um limita56o s(ria $ois o uso de $onteiros B*a$9 UC
7@
*ontorna o $roblema9
1or ser um identi8i*ador, o nome da >un*o segue as mesmas regras de de8ini56o de
identi8i*adores Bve:a se56o 494C9
A lista de argumentos da 8un56o es$e*i8i*a %uais s6o os valores %ue a 8un56o re*ebe9 As
variFveis da lista de argumentos s6o mani$uladas normalmente no *or$o da 8un56o Bve:a se56o @9?
adianteC9
A *hamada de uma 8un56o termina *om a instru56o return() %ue trans8ere o *ontrole $ara o
$rograma *hamador da 8un56o9 Esta instru56o tem duas 8inalidadesE determina o >im l1gico da rotina e o
valor de retorno da 8un56o9 7 argumento de return() serF retornado *omo valor da 8un56o9
@9= o*ali3a56o das 8un5<es
Existem basi*amente duas $osi5<es $ossAveis $ara es*revermos o *or$o de uma 8un56oE ou antes
ou depois do $rograma $rin*i$al9 1odemos ainda es*rever uma 8un56o no mesmo arCuivo do $rograma
$rin*i$al ou em arCuivo separado9
#.!.1 Corpo da >un*o antes do programa principal Eno mesmo arCuivoF
\uando es*revemos a de8ini56o de uma 8un56o antes do $rograma $rin*i$al e no mesmo ar%uivo
deste, nenhuma outra instru56o ( ne*essFria9 A sintaxe geral $ara isto ( a seguinteE
-inta,e+ Lma 8un56o es*rita antes do $rograma $rin*i$alE
tipo nomef(...){ // definio da funo
[corpo de fun67o]
}
void main(){ // programa principal
...
var = nomef(...) // chamada da funo
...
}
0,emplo+ 2un56o media2() es*rita antes do $rograma $rin*i$al9
77
float media2(float a, float b){ // funo
float med;
med = (a + b) / 2.0;
return(med);
}
void main(){ // programa principal
float num_1, num_2, med;
puts(Digite dois nmeros:);
scanf(%f %f, &num_1, &num_2);
med = media2(num_1, num_2); // chamada da funo
printf(\nA media destes nmeros e %f, med);
}
Programa e,emplo+ No ar%uivo e0601.cpp existe um $rograma %ue *al*ula o maior valor
entre dois n,meros digitados9 Este $rograma 8a3 uso da 8un56o max()es*rita $elo usuFrio9
#.!. Corpo da >un*o de&ois do programa principal Eno mesmo arCuivoF
\uando es*revemos a de8ini56o de uma 8un56o depois do $rograma $rin*i$al e no mesmo
ar%uivo deste, devemos in*luir um prot1tipo da 8un56o *hamada9 Lm $rot;ti$o ( uma instru56o %ue
de8ine o nome da 8un56o, seu ti$o de retorno e a %uantidade e o ti$o dos argumentos da 8un56o9 7
$rot;ti$o de uma 8un56o indi*a ao *om$ilador %uais s6o as 8un5<es usadas no $rograma $rin*i$al os ti$o9
A sintaxe geral $ara isto ( a seguinteE
-inta,e+ Lma 8un56o es*rita de$ois do $rograma $rin*i$alE
void main(){ // programa principal
tipo nomef(...); // prottipo da funo
...
var = nomef(...) // chamada a funo
...
}
tipo nomef(...){ // definio da funo
[corpo de fun67o]
}
0,emplo+ 2un56o media2() es*rita de$ois do $rograma $rin*i$al9
void main(){ // programa principal
7H
float media2(float,float); // prottipo de media2()
float num_1, num_2, med;
puts(Digite dois nmeros:);
scanf(%f %f, &num_1, &num_2);
med = media2(num_1, num_2); // chamada a funo
printf(\nA media destes nmeros e %f, med);
}
float media2(float a, float b){ // funo media2()
float med;
med = (a + b) / 2.0;
return(med);
}
7bserve %ue o $rot;ti$o de uma 8un56o nada mais ( %ue a declara*o da 8un56o sem o seu *or$o9
7bserve ainda %ue na lista de argumentos do $rot;ti$o $odem ser es*ritos a$enas os tipos dos
argumentos9
Programa e,emplo+ No ar%uivo e0602.cpp existe um $rograma %ue *al*ula o maior valor
entre dois n,meros digitados9 Este $rograma 8a3 uso da 8un56o max()es*rita $elo usuFrio9
#.!.! Corpo da >un*o escrito em ar'ui(o se&arado
Em C, *omo em muitas outras linguagens, ( $ermitido %ue o usuFrio *rie uma 8un56o em um
arCuivo e um $rograma %ue a *hame em outro arCuivo distinto9 Esta 8a*ilidade $ermite a *ria56o de
)i)liotecas de usu?rioE um *on:unto de ar%uivos *ontendo 8un5<es es*ritas $elo usuFrio9 Esta
$ossibilidade ( uma grande vantagem utili3ada em larga es*ala $or $rogramadores $ro8issionais9
\uando es*revemos a de8ini56o de uma 8un56o em arCuivo separado do $rograma $rin*i$al
devemos incluir este ar%uivo no *on:unto de ar%uivos de compila*o do $rograma $rin*i$al9 Esta
in*lus6o ( 8eita *om a diretiva #include9 Esta diretiva, vista nas se5<es 49I94 e =9791, instrui o
*om$ilador $ara in*luir na *om$ila56o do $rograma outros ar%uivos %ue *ontem a de8ini56o das 8un5<es
de usuFrio e de bibliote*a9
-inta,e+ A sintaxe de in*lus6o de 8un5<es de usuFrio ( a seguinteE
#include pat% // incluso da funo
void main(){ // programa principal
...
79
var = nomef(...) // chamada a funo
...
}
Na diretiva #include, indi*amos entre as$as du$las o *aminho de lo*ali3a56o do ar%uivo onde
estF de8inida a 8un56o *hamada9
0,emplo+ A 8un56o media2() estF es*rita em um ar%uivo se$arado9
#include c:\tc\userbib\stat.h // incluso da funo
void main(){ // programa principal
float num_1, num_2, med;
puts(Digite dois nmeros:);
scanf(%f %f, &num_1, &num_2);
med = media2(num_1, num_2); // chamada a funo
printf(\nA media destes nmeros e %f, med);
}
Programa e,emplo+ No ar%uivo e0603.cpp existe um $rograma %ue *al*ula o maior valor
entre dois n,meros digitados9 Este $rograma 8a3 uso da 8un56o max()es*rita $elo usuFrio no ar%uivo
e0604.cpp9
()serva*o+ Lm ar%uivo $ode *onter a de8ini56o de uma ou mais 8un5<es9 Em geral, %uando o
ar%uivo $ossui a$enas uma 8un56o ele ( nomeado *om o mesmo nome da 8un56o e extens6o *.cpp ou
*.c9 1or exem$lo, $oderAamos de8inir a 8un56o media() no ar%uivo media.cpp9 \uando um ar%uivo
$ossui a de8ini56o de mais de uma 8un56o, ele ( nomeado *om a extens6o *.h ou *.lib9 1or exem$loE
$oderAamos *riar um *on:unto de 8un5<es estatAsti*as *hamadas media(), dsvpd(), moda(),
max(), min(), et*9 de8inindo-as em um ar%uivo *hamado stat.h9
@9I 'ierar%uia de 2un5<es
Sem$re ( $ossAvel %ue um $rograma $rin*i$al *hame uma 8un56o %ue $or sua ve3 *hame outra
8un56o999 e assim su*essivamente9 \uando isto a*onte*e di3emos %ue a 8un56o *hamadora tem hierar%uia
maior Bou su$eriorC a 8un56o *hamada9 7u %ue a 8un56o *hamadora estF em um nAvel hierFr%ui*o su$erior
a 8un56o *hamada9
HD
\uando isto o*orre, devemos ter o *uidado de de8inir Bou in*luirC as 8un5<es em ordem *res*ente
de hierar%uia, isto (, uma 8un56o chamada ( es*rita antes de uma 8un56o chamadora9 Isto se deve ao
8ato de %ue o *om$ilador deve *onhe*er uma 8un56o antes de %ue *hamada se:a *om$ilada9
Programa e,emplo+ No ar%uivo e0605.cpp existe um :ogo de XDac9potY %ue ilustra o uso de
vFrias rotinas $or um $rograma $rin*i$al9 7bserve tamb(m %ue estas 8un5<es *hamam-se umas as outras9
Neste $rograma exem$lo, os nAveis hierFr%ui*os das 8un5<es $odem ser *olo*ados da seguinte
maneiraE
main()
regras() abertura() sorte() plim_plim() saida() simnao()
imprimec() roleta()
pinta() bip()
No exem$lo a*ima temos um $rimeiro nAvel onde se en*ontra a 8un56o mainBC Ko $rograma
$rin*i$al tamb(m ( uma 8un56oM %ue *hama as 8un5<es x, ", 39 A 8un56o x $or sua ve3 *hamas as 8un5<es
s, r, e t9 7bserve %ue neste exem$lo os $rot;ti$os das 8un5<es est6o *olo*ados de modo a %ue as 8un5<es
de menor hierar%uia s6o es*ritas antes das 8un5<es de maior hierar%uia9
@9? Regra de es*o$o $ara variFveis
A regra de es*o$o de8ine o Km)ito de validade de variFveis9 Em outras $alavras de8ine onde as
variFveis e 8un5<es s6o re*onhe*idas9 Em C, uma variFvel s; $ode ser usada a$;s ser declarada Bver
se56o 49=94C9 Isto $or %ue o $ro*essador deve reservar um lo*al da mem;ria $ara arma3enar os valores
atribuAdos ` variFvel9 1or(m o lo*al, do $rograma, onde uma variFvel ( de*larada de8ine ainda seu escopo
de validade9 Lma variFvel $ode ser local, glo)al ou >ormal de a*ordo *om o lo*al de de*lara56o9
@ari?veis /ocais+ Lma variFvel ( dita #oca#, se 8or de*larada dentro do )loco de uma 8un56o9
Lma variFvel lo*al tem validade a$enas dentro do blo*o onde ( de*larada, isto signi8i*a %ue $odem ser
a$enas a*essadas e modi8i*adas dentro de um blo*o9 7 es$a5o de mem;ria alo*ado $ara esta variFvel (
criado %uando a exe*u56o do blo*o ( ini*iada e destru5do %uando en*errado, assim variFveis de mesmo
nome mas de*laradas em blo*os distintos, s6o $ara todos os e8eitos, variFveis distintas9

0,emplo+
H1
float media2(float a, float b){
float med;
med = (a + b) / 2.0;
return(med);
}
void main(){
float num_1, num_2, med;
puts(Digite dois nmeros:);
scanf(%f %f, &num_1, &num_2);
med = media2(num_1, num_2);
printf(\nA media destes nmeros e %f, med);
}
No exem$lo a*ima, med ( uma variFvel lo*al de8inida $ela 8un56o media()9 7utra variFvel
med ( tamb(m de8inida $ela 8un56o main()9 1ara todos os e8eitos estas variFveis s6o distintas9
@ari?veis Formais+ Lma variEve# forma# ( uma variFvel lo*al de*larada na lista de parKmetros
de uma 8un56o9 Deste modo, tem validade a$enas dentro da 8un56o onde ( de*larada, $or(m serve de
su$orte $ara os valores $assados $elas 8un5<es9 As variaveis 8ormais na declara*o da 8un56o e na
chamada da 8un56o $odem ter nomes distintos9 A ,ni*a exig>n*ia ( de %ue se:am do mesmo ti$o9
1or serem variFveis lo*ais, os valores %ue uma 8un56o $assa $ara outra n6o s6o alterados $ela
8un56o *hamada9 Este ti$o de $assagem de argumentos ( *hamado de passagem por valor $ois os
valores das variFveis do $rograma *hamador s6o *o$iados $ara as *orres$ondentes variFveis da 8un56o
*hamada9 &eremos no *a$itulo U *omo alterar os valores das variFveis do $rograma *hamador9
Chamaremos esta $assagem de passagem por endere*o9
No exem$lo a*ima, a e b s6o $arNmetros 8ormais de*larados na 8un56o media4BC9 7bserve %ue a
8un56o ( *hamada *om os valores de num_1 e num_29 .esmo %ue os valores de a e b 8ossem alterados
os valores de num_1 e num_2 n6o seriam alterados9
@ari?veis 7lo)ais+ Lma variFvel ( dita g#o&a#, se 8or de*larada >ora do )loco de uma 8un56o9
Lma variFvel global tem validade no es*o$o de todas as 8un5<es, isto (, $ode ser a*essadas e modi8i*ada
$or %ual%uer 8un56o9 7 es$a5o de mem;ria alo*ado $ara esta variFvel ( criado no momento de sua
de*lara56o e destru5do a$enas %uando o $rograma ( en*errado9

0,emplo+ Lso de variFveis globais9
float a, b, med;
H4
void media2(void){
med = (a + b) / 2.0;
}
void main(){
puts(Digite dois nmeros:);
scanf(%f %f, &a, &b);
media2();
printf(\nA media destes nmeros e %f, med);
}
No exem$lo a*ima, a, b, med s6o variFveis globais de8inidas 8ora dos blo*os das 8un5<es
media() e main()9 Deste modo ambas as 8un5<es tem $leno a*esso as variFveis, $odendo ser
a*essadas e modi8i*adas $or %uais%uer uma das 8un5<es9 Assim n6o ( ne*essFrio a $assagem de
$arNmetros $ara a 8un56o9
@9@ Re*ursividade
A re*ursividade talve3 se:a a mais im$ortante vantagem das 8un5<es em C9 Recurso ( o
$ro*esso $elo %ual uma 8un56o *hama a si mesma re$etidamente um numero 8inito de ve3es9 Este
re*urso ( muito ,til em alguns ti$os de algoritmos *hamados de algoritmos recursivos9
&e:amos um exem$lo c#Essico $ara es*lare*ermos o *on*eitoE *al*ulo do >atorial de um n,mero9
A de8ini56o de 8atorial (E
n! = n . (n-1) . (n-2) . ... . 3 . 2 . 1
0! = 1
onde n ( um numero inteiro $ositivo9 Lma $ro$riedade B8a*ilmente veri8i*FvelC dos 8atoriais ( %ueE
n! = n . (n-1)!
Esta $ro$riedade ( *hamada de $ro$riedade re*ursivaE o 8atorial de um numero $ode ser *al*ulado atrav(s
do 8atorial de seu ante*essor9 7ra, $odemos utili3ar esta $ro$riedade $ara es*revermos uma rotina
re*ursiva $ara o *al*ulo de 8atoriais9 1ara *riarmos uma rotina re*ursiva, em C, basta *riar uma *hamada a
$r;$ria 8un56o dentro dela mesma, *omo no exem$lo a seguir9
Programa e,emplo+ No ar%uivo e0606.cpp existe uma rotina re*ursiva $ara o *al*ulo de
8atoriais9
H=
Lma 8un56o re*ursiva *ria a *ada *hamada um novo *on:unto de variFveis lo*ais9 N6o existe
ganho de velo*idade ou es$a5o de mem;ria signi8i*ativo *om o uso de 8un5<es re*ursivas9 #eori*amente
uma algoritmo re*ursivo $ode ser es*rito de 8orma iterativa e vi*e-versa9 A $rin*i$al vantagem destes
algoritmos ( %ue algumas *lasses de algoritmos Kde intelig>n*ia arti8i*ial, simula56o num(ri*a, bus*a e
ordena56o em arvore binaria, et*9M s6o mais 8a*ilmente im$lementadas *om o uso de rotinas re*ursivas9 7
estudo deste ti$o de algoritmo estF, $or(m, al(m do al*an*e deste texto9
79 &etores
Neste *a$Atulo estudaremos o *on*eito de vetor, sua de*lara56o e uso9 Como s6o usados vetores
em argumentos de 8un5<es9 E, ainda, *omo trabalhar *om vetores de mais de uma dimens6o9
791 Introdu56o
Em muitas a$li*a5<es %ueremos trabalhar *om *on:untos de dados %ue s6o semelhantes em tipo9
1or exem$lo o *on:unto das alturas dos alunos de uma turma, ou um *on:unto de seus nomes9 Nestes
*asos, seria *onveniente $oder *olo*ar estas in8orma5<es sob um mesmo *on:unto, e $oder re8eren*iar
*ada dado individual deste *on:unto $or um n,mero Andi*e9 Em $rograma56o, este ti$o de estrutura de
dados ( *hamada de vetor Bou array, em ingl>sC ou, de maneira mais 8ormal estruturas de dados
homogBneas9
0,emplo+ A maneira mais sim$les de entender um vetor ( atrav(s da visuali3a56o de um lista,
de elementos *om um nome *oletivo e um Andi*e de re8er>n*ia aos valores da lista9
n nota
0 8.4
1 6.9
2 4.5
3 4.6
4 7.2
Nesta lista, n re$resenta um n,mero de re8er>n*ia e nota ( o nome do *on:unto9 Assim $odemos
di3er %ue a 4
a
nota ( 6.9 ou re$resentar nota[1] = 6.9
HI
Esta n6o ( a ,ni*a maneira de estruturar *on:unto de dados9 #amb(m $odemos organi3ar dados
sob 8orma de tabelas9 Neste *aso, *ada dado ( re8eren*iado $or dois Andi*es e di3emos %ue se trata de um
vetor )idimensional Bou matriAC
@
9 &etores de mais de uma dimens6o ser6o vistos na se56o 79?9
794 De*lara56o e ini*iali3a56o de vetores
$..1 Declara*o de vetores
Em C, um vetor ( um *on:unto de variFveis de um mesmo tipo %ue $ossuem um nome
identi8i*ador e um Andi*e de re8er>n*ia9
-inta,e+ A sintaxe $ara a de*lara56o de um vetor ( a seguinteE
tipo nome[tam];
ondeE
tipo ( o tipo dos elementos do vetorE int, float, double 999
nome ( o nome identi8i*ador do vetor9 As regras de nomen*latura de vetores s6o as mesmas
usadas em variFveis Bse56o 49491C9
tam ( o tamanho do vetor, isto (, o n,mero de elementos %ue o vetor $ode arma3enar9
;,emplo+ &e:a as de*lara5<es seguintesE
int idade[100]; // declara um vetor chamado 'idade' do tipo
// 'int' que recebe 100 elementos.
float nota[25]; // declara um vetor chamado 'nota' do tipo
// 'float' que pode armazenar 25 nmeros.
char nome[80]; // declara um vetor chamado 'nome' do tipo
// 'char' que pode armazenar 80 caracteres.
Na de*lara56o de um vetor estamos reservando es$a5o de mem;ria $ara os elementos de um
vetor9 A %uantidade de mem;ria Bem &ytesC usada $ara arma3enar um vetor $ode ser *al*ulada *omoE
quantidade de memAria ; taman%o do tipo 4 taman%o do )etor
Assim, no exem$lo anterior, a %uantidade de mem;ria utili3ada $elos vetores (, res$e*tivamente,
200(2x100), 100(4x25) e 80(80x1) &ytes9
@
Alguns autores $re8erem *hamar todos os ti$os de estruturas homog>neas, n6o im$ortando o numero de Andi*es de re8er>n*ia
Bou dimens<esC de vetores9 7utros $re8erem *hamar de matries9 7utros ainda distinguem vetores Buma dimens6oC de matries
Bmais de uma dimens6oC, et*9 N6o vamos entrar no m(rito da %uest6o Bexistem boas :usti8i*ativas $ara todas as inter$reta5<esC e,
nesta a$ostila, vamos usar a $rimeira nomen*laturaE toda estrutura homog>nea de dados serF *hamada de vetor9
H?
$.. Re>erBncia a elementos de vetor
Cada elemento do vetor ( re8eren*iado $elo nome do vetor seguido de um 5ndice inteiro9 7
primeiro elemento do vetor tem Andi*e 0 e o Hltimo tem Andi*e tam-19 7 Andi*e de um vetor deve ser
inteiro9
0,emplo+ Algumas re8er>n*ias a vetoresE
#define MAX 5
int i = 7;
float valor[10]; // declarao de vetor
valor[1] = 6.645;
valor[MAX] = 3.867;
valor[i] = 7.645;
valor[random(MAX)] = 2.768;
valor[sqrt(MAX)] = 2.705; // NO vlido!
$.. 6nicialiAa*o de vetores
Assim *omo $odemos ini*iali3ar variFveis B$or exem$loE int j = 3;C, $odemos ini*iali3ar
vetores9
-inta,e+ A sintaxe $ara a ini*iali3a56o dos elementos de um vetor (E
tipo nome[tam] = {lista de )alores};
ondeE
lista de )alores ( uma lista, se$arada $or vArgulas, dos valores de *ada elemento do
vetor9
;,emplo+ &e:a as ini*iali3a5<es seguintes9 7bserve %ue a ini*iali3a56o de nota gera o vetor do
exem$lo do inA*io desta se56o9
int dia[7] = {12,30,14,7,13,15,6};
float nota[5] = {8.4,6.9,4.5,4.6,7.2};
char vogal[5] = {'a', `e', `i', `o', `u'};
H@
7$*ionalmente, $odemos ini*iali3ar os elementos do vetor enumerando-os um a um9
0,emplo+ 7bserve %ue estas duas ini*iali3a5<es s6o $ossAveisE
int cor_menu[4] = {BLUE,YELLOW,GREEN,GRAY};
ou
int cor_menu[4];
cor_menu[0] = BLUE;
cor_menu[1] = YELLOW;
cor_menu[2] = GREEN;
cor_menu[3] = GRAY;
Programa 0,emplo+ 7 ar%uivo e0701.cpp *ont(m um $rograma %ue mostra o uso de vetoresE
de*lara56o, ini*iali3a56o, leitura e es*rita de elementos999
79= #amanho de um vetor e segmenta56o de mem;ria
$.!.1 /imites
Na linguagem C, devemos ter *uidado *om os limites de um vetor9 Embora na sua de*lara56o,
tenhamos de8inido o tamanho de um vetor, o C n6o 8a3 nenhum teste de veri8i*a56o de a*esso a um
elemento dentro do vetor ou n6o9
1or exem$lo se de*laramos um vetor *omo int valor[5], teori*amente s; tem sentido
usarmos os elementos valor[0], ..., valor[4]9 1or(m, o C n6o a*usa erro se usarmos
valor[12] em algum lugar do $rograma9 Estes testes de limite devem ser 8eitos logicamente dentro do
$rograma9
Este 8ato se deve a maneira *omo o C trata vetores9 A mem;ria do mi*ro*om$utador ( um es$a5o
B8Asi*oC $arti*ionado em $or5<es de 1 &yte9 Se declaramos um vetor *omo int vet[3], estamos
reservando @ &ytes B= segmentos de 4 &ytesC de mem;ria $ara arma3enar os seus elementos9 7 $rimeiro
segmento serF reservado $ara vet[0], o segundo segmento $ara vet[1] e o ter*eiro segmento $ara
vet[2]9 7 segmento ini*ial ( *hamado de segmento )ase, de modo %ue vet[0] serF lo*ali3ado no
segmento base9 \uando a*essamos o elemento vet[i], o $ro*essador a*essa o segmento lo*ali3ado em
)ase:i9 Se i 8or igual a 2, estamos a*essando o segmento )ase: ou vet[2]Bo ultimo segmento
reservado $ara o vetorC9 1or(m, se i 8or igual a 7, estamos a a*essando segmento )ase:$ %ue no >oi
H7
reservado $ara os elementos do vetor e %ue $rovavelmente estF sendo usado $or uma outra variFvel ou
*ont(m in8orma56o es$,ria BlixoC9
7bserve %ue a*essar um segmento 8ora do es$a5o destinado a um vetor $ode destruir
in>orma*Ges reservadas de outras variFveis9 Estes erros s6o di8A*eis de dete*tar $ois o *om$ilador n6o
gera nenhuma mensagem de erro999 A solu56o mais ade%uada ( sem$re avaliar os limites de um vetor
antes de mani$ulF-lo9
A $rin*A$io este 8ato $oderia $are*er um de8eito da linguagem, mas na verdade trata-se de um
re*urso muito $oderoso do C9 1oder mani$ular sem restri5<es todos os segmentos de mem;ria ( uma
8lexibilidade a$re*iada $elos $rogramadores9
Programa 0,emplo+ 7 ar%uivo e0702.cpp *ont(m um $rograma %ue mostra o a*esso de
elementos dentro e 8ora de um vetor9 Note %ue o *om$ilador n6o a*usa nenhum erro de sintaxeT
$.!. Tamanho parametriAado
Na linguagem C n6o ( $ossAvel, usando a sintaxe des*rita a*ima, de*larar um vetor *om tamanho
vari?vel9
0,emplo+ 7 tre*ho de *;digo seguinte 8a3 uma de*lara56o errada de vetor9
...
int num;
puts("Quantos nmeros?");
scanf("%d, &num);
float valor[num]; // declarao de vetor (errado!)
...
.as ( $ossAvel de*larar um vetor *om tamanho parametriAadoE usando uma constante
sim)1lica9 De*laramos uma *onstante simb;li*a B$arNmetroC *om a diretiva #define no *abe5alho do
$rograma e de$ois de*laramos o vetor *om esta *onstante simb;li*a *omo tamanho do vetor9 Deste modo
$odemos alterar o n,mero de elementos do vetor antes de %ual%uer compila*o do $rograma9 Esta ( uma
maneira sim$les de administrar o es$a5o de mem;ria usado $elo $rograma, e tamb(m testar os limites de
um vetor9
Programa 0,emplo+ 7 ar%uivo e0703.cpp *ont(m um $rograma %ue mostra a de*lara56o de
um vetor *om tamanho $arametri3ado9 .ostra tamb(m o uso deste $arNmetro *omo teste de limite do
HH
vetor9 Com$ile este $rograma *om outros valores $ara o $arNmetro MAX e veri8i%ue %ue a exe*u56o do
$rograma ( alterada automati*amente9
No *a$itulo seguinte, se56o U, serF vista uma maneira de de*lararmos um vetor *om um n,mero
variFvel de elementos, usando $onteiros9 Este ti$o de de*lara56o ( *hamada de a#oca23o dinImica de
memria.
79I 1assando &etores $ara 2un5<es
&etores, assim *omo variFveis, $odem ser usados *omo argumentos de 8un5<es9 &e:amos *omo
se de*lara uma 8un56o %ue re*ebe um vetor e *omo se $assa um vetor $ara uma 8un56o9
-inta,e+ Na passagem de vetores $ara 8un5<es usamos a seguinte sintaxeE
nome8da8fun67o(nome8do8)etor)
ondeE
nome8da8fun67o ( o nome da 8un56o %ue se estF *hamando9
nome8do8)etor ( o nome do vetor %ue %ueremos $assar9 Indi*amos apenas o nome do
vetor, sem Andi*es9
-inta,e+ Na dec#ara23o de 8un5<es %ue re*ebem vetoresE
tipo8fun67o nome8fun67o(tipo8)etor nome8)etor[]){
...
}
ondeE
tipo8fun67o ( o ti$o de retorno da 8un56o9
nome8fun67o ( o nome da 8un56o9
tipo8)etor ( o ti$o de elementos do vetor9
nome8)etor ( o nome do vetor9 7bserve %ue de$ois do nome do vetor temos um Andi*e va3io
[] $ara indi*ar %ue estamos re*ebendo um vetor9
0,emplo+ 7bserve o exem$lo abaixoE
Na de*lara56o da 8un56oE
float media(float vetor[],float N){ // declarao da funo
...
H9
}
Na *hamada da 8un56oE
void main(){
float valor[MAX]; // declarao do vetor
...
med = media(valor, n); // passagem do vetor para a funo
...
}
Programa 0,emplo+ 7 ar%uivo e0704.cpp *ont(m um $rograma %ue mostra a $assagem de
vetores $ara 8un5<es9
Aten*o+ Ao *ontrFrio das variFveis *omuns, o *onte,do de um vetor pode ser modi>icado $ela
8un56o *hamada9 Isto signi8i*a %ue $odemos $assar um vetor $ara uma 8un56o e alterar os valores de seus
elementos9 Isto o*orre $or%ue a $assagem de vetores $ara 8un5<es ( 8eita de modo es$e*ial dito
5assagem por endere2o9 Lma abordagem mais detalhada deste $ro*edimento serF 8eita no *a$Atulo U
sobre $onteiros9
1ortanto devemos ter *uidado ao mani$ularmos os elementos de um vetor dentro de uma 8un56o
$ara n6o modi8i*a-los $or des*uido9
Programa 0,emplo+ 7 ar%uivo e0705.cpp *ont(m um $rograma %ue mostra a modi8i*a56o de
um vetor $or uma 8un56o9 Neste *aso a modi8i*a56o ( desejada $ois %ueremos ordenar os elementos do
vetor9
79? &etores .ultidimensionais
&etores $odem ter mais de uma dimens6o, isto (, mais de um Andi*e de re8er>n*ia9 1odemos ter
vetores de duas, tr>s, ou mais dimens<es9 1odemos entender um vetor de duas dimens<es B$or exem$loC
asso*iando-o aos dados de um tabela9
9D
0,emplo+ Lm vetor bidimensional $ode ser visuali3ado atrav(s de uma ta)ela9
nota 0 1 2
0 8.4 7.4 5.7
1 6.9 2.7 4.9
2 4.5 6.4 8.6
3 4.6 8.9 6.3
4 7.2 3.6 7.7
Nesta tabela re$resentamos as notas de ? alunos em = $rovas di8erentes BmatemFti*a, 8Asi*a e
%uAmi*a, $or exem$loC9 7 nome nota ( o nome do *on:unto, assim $odemos di3er %ue a nota do =
o
aluno
na 4
a
$rova ( 6.4 ou re$resentar nota[2,1] = 6.4
$.".1 Declara*o e inicialiAa*o
A de*lara56o e ini*iali3a56o de vetores de mais de uma dimens6o ( 8eita de modo semelhante aos
vetores unidimensionais9
-inta,e+ A sintaxe $ara de*lara56o de vetores multidimensionais (E
tipo nome[tam_1][tam_2]...[tam_N]={{lista},{lista},...{lista}};
ondeE
tipo ( o ti$o dos elementos do vetor9
nome ( o nome do vetor9
[tam_1][tam_2]...[tam_N] ( o tamanho de *ada dimens6o do vetor9
{{lista},{lista},...{lista}} s6o as listas de elementos9
0,emplo+ ve:a algumas de*lara5<es e ini*iali3a5<es de vetores de mais de uma dimens6o9
7bserve %ue a ini*iali3a56o de nota gera a tabela do exem$lo do inA*io desta se56o9
float nota[5][3] = {{8.4,7.4,5.7},
{6.9,2.7,4.9},
{4.5,6.4,8.6},
{4.6,8.9,6.3},
{7.2,3.6,7.7}};
int tabela[2][3][2] = {{{10,15}, {20,25}, {30,35}},
{{40,45}, {50,55}, {60,65}};
91
Neste exem$lo, nota ( um vetor duas dimens<es ([][])9 Este vetor ( *om$osto de ? vetores
de = elementos *ada9 tabela ( vetor de tr>s dimens<es ([][][])9 Este vetor ( *om$osto de 4 vetores
de = sub-vetores de 4 elementos *ada9
$.". Passagem de vetores multidimensionais para >un*Ges
A sintaxe $ara passagem de vetores multidimensionais $ara 8un5<es ( semelhante a $assagem de
vetores unidimensionaisE *hamamos a 8un56o e $assamos o nome do vetor, sem Andi*es9 A ,ni*a
mudan5a o*orre na de*lara56o de 8un5<es %ue re*ebem vetoresE
-inta,e+ Na dec#ara23o de 8un5<es %ue re*ebem vetoresE
tipo8f fun67o(tipo8) )etor[tam8*][tam8+]...[tam8n]){
...
}
7bserve %ue de$ois do nome do vetor temos os Andi*es *om *ontendo os tamanhos de *ada
dimens6o do vetor9
0,emplo+ 7bserve o exem$lo abaixoE
Na de*lara56o da 8un56oE
int max(int vetor[5][7],int N, int M){ // declarao da funo
...
}
Na *hamada da 8un56oE
void main(){
int valor[5][7]; // declarao do vetor
...
med = media(valor, n); // passagem do vetor para a funo
...
}
Programa 0,emplo+ 7 ar%uivo e0706.cpp *ont(m um $rograma %ue mostra a mani$ula56o
de vetores bidimensionaisE leitura de elementos, es*rita, $assagem $ara 8un5<es, et*9
94
()serva*Ges+ Algumas observa5<es a res$eito de vetores multidimensionais $odem ser 8eitasE
Do mesmo modo %ue vetores unidimensionais, os vetores multidimensionais $odem ter seus
elementos modi8i*ados $ela 8un56o *hamada9
7s Andi*es dos vetores multidimensionais, tamb(m *ome5am em 09 1or exem$loE vet[0]
[0], ( o $rimeiro elemento do vetor9
Embora uma tabela n6o se:a a ,ni*a maneira de visuali3ar um vetor bidimensional, $odemos
entender o primeiro Andi*e do vetor *omo o Andi*e de linhas da tabela e o segundo Andi*e do
vetor *omo Andi*e das colunas9
H9 Endere5os e 1onteiros
Neste *a$Atulo veremos a de8ini56o e os $rin*i$ais usos de $onteiros9 &eremos as o$era5<es
8undamentais *omo $onteiros , a estreita rela56o de $onteiros vetores e strings e ainda a alo*a56o
dinNmi*a de mem;ria e a $assagem de 8un5<es $ara 8un5<es *om o uso de $onteiros99
991 Introdu56o
#oda in8orma56o Bdado arma3enado em variFvel sim$les ou vetorC %ue mani$ulamos em um
$rograma estF arma3enado na mem;ria do *om$utador9 Cada in8orma56o ( re$resentada $or um *erto
*on:unto de &ytes B&er *a$Atulo 4C9 1or exem$loE *ara*ter BcharCE 1 &yte, inteiro BintCE 4 &ytes, et*9
Cada um destes *on:untos de &ytes, %ue *hamaremos de )loco, tem um nome e um endere*o de
lo*ali3a56o es$e*i8i*a na mem;ria9
0,emplo+ 7bserve a instru56o abaixoE
int num = 17;
ao inter$retar esta instru56o, o $ro*essador $ode es$e*i8i*arE
.ome da in8orma56oE num
Tipo de in8orma56oE int
Tamanho do )loco Bn,mero de &ytes o*u$ados $ela in8orma56oCE 2
9=
@alor da in8orma56oE 17
0ndere*o da in8orma56o Blo*ali3a56o do $rimeiro yteCE 8F6F:FFF2 Bhexade*imalC
Em geral, interessa ao programador a$enas os nomes simb;li*os %ue re$resentam as
in8orma5<es, $ois ( *om estes nomes %ue s6o reali3adas as o$era5<es do seu algoritmo9 1or(m, ao
processador interessa os endere5os dos blo*os de in8orma56o $ois ( *om estes endere5os %ue vai
trabalhar9
Programa 0,emplo+ 7 ar%uivo e0801.cpp *ont(m um $rograma *om instru5<es $ara
ins$e*ionar o endere5o de uma variFvel, usando o re*urso Inspect do #urbo C[[9 7bserve %ue o endere5o
mostrado *orres$onde ao primeiro &yte do blo*o, mesmo %ue o blo*o o*u$e mais de um &yteE No *aso,
um 8loat o*u$a um blo*o de I &ytes9
H94 1onteiros
1onteiros s6o variFveis %ue *ont(m endere5os9 Neste sentido, estas variFveis apontam $ara algum
determinado endere5o da mem;ria9 Em geral, o $onteiro a$onta $ara o endere5o de alguma variFvel
de*larada no $rograma9
%..1 Declara*o de ponteiros.
\uando de*laramos um $onteiro, devemos de*larF-lo *om o mesmo ti$o Bint, *har, et*9C do blo*o
a ser a$ontado9 1or exem$lo, se %ueremos %ue um $onteiro a$onte $ara uma variFvel int Bblo*o de 4
b"tesC devemos de*larF-lo *omo int tamb(m9
-inta,e+ A sintaxe da de*lara56o de um $onteiro ( a seguinteE
tipo8ptr *nome8ptr8*;
ou
tipo8ptr* nome8ptr8*9 nome8ptr8+9 :::;
ondeE
tipo8ptr : ( o ti$o de blo*o $ara o %ual o $onteiro a$ontarF9
* : ( um o$erador %ue indi*a %ue nome_ptr ( um $onteiro9
nome8ptr8*9 nome8ptr8+9:::D s6o os nomes dos $onteiros Bos nomes dos $onteiros
obede*em as mesmas regras da se56o 49491C
9I
0,emplo+ &e:a as seguintes instru5<esE
int *p;
float* s_1, s_2;
A $rimeira instru56o de*lara um $onteiro *hamado p %ue a$onta $ara um inteiro9 Este $onteiro
a$onta $ara o primeiro endere5o de um blo*o de dois &ytes9 Sem$re ( ne*essFrio de*larar o ti$o do
$onteiro9 Neste *aso di3emos %ue de*laramos um $onteiro ti$o int9
A segunda instru56o de*lara dois $onteiros Bs_1 e s_2C do ti$o float9 7bserve %ue o b estF
:usta$osto ao ti$oE assim todos os elementos da lista ser6o de*larados $onteiros9
%.. (peradores = e B
\uando trabalhamos *om $onteiros, %ueremos 8a3er duas *oisas basi*amenteE
*onhe*er endere*o de uma variFvelc
*onhe*er o conteHdo de um endere5o9
1ara reali3ar estas tare8as a linguagem C nos $roviden*ia dois o$eradores es$e*iaisE
o o$erador de endere*oE &
o o$erador de conteHdoE *
7 o$erador de endere*o E=F determina o endere5o de uma variFvel Bo $rimeiro &yte do blo*o
o*u$ado $ela variFvelC9 1or exem$lo, &val determina o endere5o do blo*o o*u$ado $ela variFvel val9
Esta in8orma56o n6o ( totalmente nova $ois :F a usamos antesE na 8un56o scanf()9
0,emplo+ \uando es*reve-se a instru56oE
scanf("%d", &num);
estamos nos re8erimos endere*o do blo*o o*u$ado $ela variFvel num9 A instru56o signi8i*aE
_#eia o &uffer do tec#ado) transforme o va#or #ido em um va#or inteiro (! &ytes* e o armaene no &#oco
#oca#iado no endere2o da variEve# numJ9
0,emplo+ 1ara se atribuir a um $onteiro o endere5o de uma variFvel es*reve-seE
int *p, val=5; // declarao de ponteiro e varivel
p = &val; // atribuio
9?
7bserve %ue o $onteiro p deve ser de*larado anteriormente *om o mesmo ti$o da variFvel $ara a
%ual ele deve a$ontar9
7 o$erador conteHdo B*C determina o *onte,do BvalorC do dado arma3enado no endere5o de um
blo*o a$ontado $or um $onteiro9 1or exem$lo, *p determina *onte,do do blo*o a$ontado $elo $onteiro $9
De 8orma resumidaE o o$erador B*C determina o *onte,do de um endere5o9
0,emplo+ 1ara se atribuir a uma variFvel o *onte,do de um endere5o es*reve-seE
int *p = 0x3f8, val; // declarao de ponteiro e varivel
val = *p; // atribuio
()serva*Ges+
7 o$erador endere*o B&C somente $ode ser usado em uma ,ni*a variFvel9 N6o $ode ser usado
em ex$ress<es *omo, $or exem$lo, &(a+b)9
7 o$erador conteHdo B*C somente $ode ser usado em variFveis $onteiros9
Programa 0,emplo+ 7 ar%uivo e0802.cpp *ont(m um $rograma %ue mostra *omo se
mani$ulam $onteiros e variFveis9 Como se trans$ortam in8orma5<es entre $onteiros e variFveis9
H9= 7$era5<es elementares *om $onteiros
1onteiros s6o variFveis es$e*iais e obede*em a regras es$e*iais9 Deste modo, existem uma s(rie
de o$era5<es Baritm(ti*as, l;gi*as, et*9C envolvendo $onteiros %ue s6o $ermitidas e outras n6o9 A seguir
s6o desta*adas algumas o$era5<es %ue $odem ser exe*utadas *om $onteiros9
A um $onteiro $ode ser atribuAdo o endere5o de uma variFvel *omum9
0,emplo+ 7bserve o tre*ho abaixoE
...
int *p;
int s;
p = &s; // p recebe o endereo de s
...
Lm $onteiro $ode re*eber o valor de outro $onteiro, isto (, $ode re*eber o endere5o a$ontado
$or outro $onteiro, desde %ue os $onteiros se:am de mesmo ti$o9
9@
0,emplo+ 7bserve o tre*ho abaixoE
...
float *p1, *p2, val;
p1 = &val; // p1 recebe o endereo de val...
p2 = p1; // ...e p2 recebe o contedo de p2 (endereo de val)
Lm $onteiro $ode re*eber um endere5o de mem;ria diretamente9 Lm endere5o ( um numero
inteiro9 Em geral, na 8orma hexade*imal B0x....C9 Nesta atribui56o devemos, em geral,
8or5ar uma *onvers6o de ti$o usando casting $ara o ti$o de $onteiro de*larado9
0,emplo+ 7bserve o tre*ho abaixoE
...
int *p1;
float p2
p1 = 0x03F8; // endereo da porta serial COM1
p2 = (float)0x0FF6; // casting
...
A um $onteiro $ode ser atribuAdo o valor nulo usando a *onstante simb;li*a NULL Bde*larada
na bibliote*a stdlib.hC9 Lm $onteiro *om valor NULL n6o a$onta $ara lugar nenhumT
Algumas 8un5<es a utili3am $ara registrar uma atribui56o ilegal ou sem su*esso Bver 8un56o
malloc() adianteC
0,emplo+ 7bserve o tre*ho abaixoE
#include <stdlib.h>
...
char *p;
p = NULL;
...
Lma %uantidade inteira $ode ser adi*ionada ou subtraAda de um $onteiro9 A adi56o de um
inteiro n a um $onteiro p 8arF *om %ue ele a$onte $ara o endere5o do n8"simo blo*o seguinte9
0,emplo+ 7bserve o tre*ho abaixoE
...
double *p, *q, var;
p = &var
q = ++p; // q aponta para o bloco seguinte ao ocupado por var
97
p = q - 5;// p aponta para o quinto bloco anterior a q
...
Dois $onteiros $odem ser *om$arados Busando-se o$eradores l;gi*osC desde %ue se:am de
mesmo ti$o9
0,emplo+ 7bserve o tre*ho abaixoE
...
if(px == py){ // se px aponta para o mesmo bloco que py ...
if(px > py){ // se px aponta para um bloco posterior a py ...
if(px != py){ // se px aponta para um bloco diferente de py ...
if(px == NULL) // se px nulo...
...
Programa 0,emplo+ 7 ar%uivo e0803.cpp *ont(m um $rograma %ue mostra *omo se utili3am
algumas o$era5<es elementares *om $onteiros *om $onteiros9
H9I 1onteiros, endere5os e 8un5<es
1or%ue usar $onteirosU A $rimeira vantagem da utili3a56o de $onteiros em $rogramas talve3
este:a rela*ionada a sua utili3a56o *omo argumentos de 8un5<es9
%.4.1 Passagem de dados por valor ou por re>erencia
No *a$Atulo @ Bse56o @9?C a8irma-se %ue o valor de uma variFvel var de uma 8un56o fun_1()
$assada $ara uma outra 8un56o fun_2() no $odem ser alterado $ela 8un56o fun_2()9 De 8ato, isto (
verdade se $assamos o valor da variFvel var $ara a 8un56o fun_2()9 .as o valor de var $ode ser
alterado $or fun_2() $assamos seu endere*o.
No $rimeiro *aso, di3emos %ue a $assagem de dados de uma 8un56o $ara outra o*orreu $or valor9
No segundo *aso, di3emos %ue houve uma $assagem $or re>erBncia9 &e:amos em detalhe uma de8ini56o
destes ti$os de $assagem de dados entre 8un5<esE
Passagem por @alor+ A $assagem $or valor signi8i*a %ue $assamos de uma 8un56o $ara outra o
valor de uma variFvel, isto (, a 8un56o *hamada re*ebe um *;$ia do valor da variFvel9 Assim %ual%uer
altera56o deste valor, $ela 8un56o *hamada, serF uma altera56o de uma *;$ia do valor da variFvel9 7 valor
9H
original na 8un56o *hamadora no alterado $ois o valor original e *o$ia 8i*am em blo*os de mem;ria
di8erentes9
Passagem por Re>erencia+ A $assagem $or re8eren*ia signi8i*a %ue $assamos de uma 8un56o
$ara outra o endere*o de uma variFvel, isto (, a 8un56o *hamada re*ebe sua localiAa*o na mem;ria
atrav(s de um $onteiro9 Assim %ual%uer altera56o no *onte,do a$ontado $elo do $onteiro serF uma
altera56o no *onte,do da variFvel original9 7 valor original alterado9
-inta,e+ A sintaxe da $assagem de endere5o ( a seguinteE
na 8un56o *hamadaE
tipof nomef(tipop nomep){
...
ondeE
tipof ( o ti$o de retorno da 8un56o9
nomef ( o nome da 8un56o *hamada9
tipop ( o ti$o do $onteiro Bigual ao ti$o da variFvel $assadaC9
nomep ( o nome do $onteiro9
na 8un56o *hamadoraE
...
nomef(end8)ar);
...
ondeE
nomef ( o nome da 8un56o *hamada9
end8)ar ( o endere5o da variFvel $assada *omo argumento9
0,emplo+ 7bserve o exem$lo abaixoE
void troca(int *p1, int *p1){ // declarao da funo
// Observe: ponteiros
int temp; // varivel temporria
temp = *p1; // temp recebe o contedo apontado por p1
*p1 = *p2; // o contedo de p1 recebe o contedo de p2
*p2 = temp; // o contedo de p2 recebe o valor de temp
}
void main(){ // programa principal
int a,b; // declarao das variveis
99
scanf("%d %d",&a,&b); // leitura das variveis
troca(&a,&b); // passagem dos endereos de a e b
printf("%d %d",a,b); // imprime valores (trocados!)
}
Neste exem$lo temos uma 8un56o troca() %ue tro*a entre si os valores de duas variFveis9 Esta
8un56o re*ebe os endere*os das variFveis $assadas $ela 8un56o main(), arma3enando-os nos $onteiros
p1 e p29 Dentro da 8un56o, tro*a-se os conteHdos dos endere5os a$ontados9
Programa 0,emplo+ 7 ar%uivo e0804.cpp *ont(m um $rograma %ue mostra a di8eren5a entre
a $assagem de dados $or valor e $assagem $or re8eren*ia9
%.4. Retorno de dados em >un*Ges
A passagem por re>erencia $ermite %ue B8ormalmenteC uma 8un56o retorne %uantos valores se
dese:ar9 Dissemos no *a$Atulo @ Bse56o @94C %ue uma 8un56o somente $ode retornar um valor9 Isto
*ontinua sendo valido $ois o C assim de8ine 8un5<es9 1orem *om o uso de $onteiros $ode-se *ontornar
esta situa56o9 &e:amosE
Imagine %ue %ueremos es*rever uma 8un56o stat() *om a 8inalidade de *al*ular a media aritm"tica e o
desvio padr3o de um *on:unto de dados9 7bserveE o retorno destes dados n6o $oder ser via instru56o
return() $ois isto n6o ( $ermitido9 A solu56o ( *riar Bna 8un56o main(), $or exem$loC duas variFveis
$ara arma3enar os valores dese:ados Bmed e desvio, $or exem$loC e ent6o $assar os endere5os destas
variFveis $ara a 8un56o stat()9 A 8un56o re*ebe esses endere5os e os arma3ena em $onteiros Bpm e pd,
$or exem$loC9 Em seguida, 8a3 os *Fl*ulos ne*essFrios, arma3enando-os nos endere5os re*ebidos9 Ao
t(rmino da exe*u56o da 8un56o os valores de med e desvio ser6o atuali3ados automati*amente9 Este
re*urso ( bastante utili3ado $or $rogramadores $ro8issionais9
Programa 0,emplo+ 7 ar%uivo e0805.cpp *ont(m um $rograma %ue mostra o KretornoL de
vFrios dados de uma 8un56o9 Na verdade trata-se da $assagem de valores $or re8eren*ia9
%.4.! Ponteiro como argumento de >un*o
7bserve %ue nos exem$los a*ima, a $assagem de endere5os 8oi 8eita atrav(s do operador
endere2o B&C9 #amb(m ( $ossAvel $assar um endere5o atrav(s de um $onteiro :F %ue o *onte,do de um
$onteiro um endere5o9
1DD
0,emplo+ 7bserve o tre*ho de $rograma abaixo9
...
float *p, x;
p = &x;
fun67o(p); // passagem do ponteiro com o endereo de x.
...
Programa 0,emplo+ 7 ar%uivo e0806.cpp *ont(m um $rograma %ue mostra a $assagem de
endere5o $ara uma 8un56o usando um $onteiro9 7bserve a sintaxe alternativa $ara a 8un56o scanf()T
H9? 1onteiros, vetores e strings
%.".1 Ponteiros e vetores
No *a$itulo 7 8oi mostrado %ue na $assagem de vetores $ara 8un5<es es$e*i8i*a-se a$enas o nome
do vetor e %ue modi8i*a5<es nos elementos do vetor dentro da 8un56o *hamada alteram os valores do
vetor no $rograma *hamador Bse56o 79IC9 Isto se deve ao 8ato de %ue, na linguagem C, vetores s6o
intimamente rela*ionados a ponteiros9
Em C, o nome de um vetor ( tratado *omo o endere*o de seu $rimeiro elemento9 Assim ao se
$assar o nome de um vetor $ara uma 8un56o estF se $assando o endere5o do $rimeiro elemento de um
*on:unto de endere5os de mem;ria9
1or exem$lo, se vet ( um vetor, ent6o vet e &vet[0] re$resentam o mesmo endere*o9 E
mais, $odemos a*essar o endere5o de %ual%uer elemento do vetor do seguinte modoE &vet[i] e
e%uivalente a (vet + i)9 A%ui deve-se ressaltar %ue (vet + i) n6o re$resenta uma adi*o
aritm(ti*a normal mas o endere*o do i8"simo elemento do vetor vet Bendere5o *ontado a $artir do
endere5o ini*ial vet[0]C9
Do mesmo modo %ue se $ode a*essar o endere*o de *ada elemento do vetor $or $onteiros,
tamb(m se $ode a*essar o valor de *ada elemento usando $onteiros9 Assim vet[i] ( e%uivalente a
*(vet + i)9 A%ui se usa o o$erador *onte,do B*C a$li*ado ao endere5o do i8"simo elemento do vetor
vet9
1D1
Programa 0,emplo+ 7 ar%uivo e0807.cpp *ont(m um $rograma %ue mostra a e%uival>n*ia
entre $onteiros e vetores9
%.". Ponteiros e strings
Como dissemos, vagamente na se56o 49=9I, uma string ( um conDunto ordenado de caracteres9
1odemos, agora, di3er muito maisE Em C, uma string ( um vetor unidimensional de elementos *ara*teres
ASCII, sendo o ultimo destes elementos o *ara*ter es$e*ial '\0'9
-inta,e+ As duas maneiras mais *omuns de de*lararmos uma string s6oE
char nome[tam];
ou
char *nome;
ondeE
nome ( o nome do vetor de *ara*teres e
tam seu tamanho9
7bserve %ue sendo um vetor, uma string $ode ser de*larada tamb(m *omo um $onteiro9 Alias a
segunda de*lara56o re$resenta :ustamente isto9 Sabendo isto $odemos reali3ar uma grande variedade de
mani$ula5<es *om strings e *ara*teres9 Existe uma bibliote*a $adr6o C *hamada string.h %ue
$roviden*ia algumas 8un5<es de mani$ula56o de strings muito ,teis9
Programa 0,emplo+ 7 ar%uivo e0808.cpp *ont(m um $rograma %ue mostra algumas
o$era5<es usando-se strings Bvetores e $onteirosC9
H9@ Alo*a56o DinNmi*a de .em;ria
7s elementos de um vetor s6o arma3enados seCDencialmente na mem;ria do *om$utador9 Na
de*lara56o de um vetor, B$or exem$loE int vet[10]C ( dito ao $ro*essador reservar BalocarC um *erto
numero de blo*os de mem;ria $ara arma3enamento dos elementos do vetor9 1orem, neste modo de
de*lara56o, n6o se $ode alo*ar um numero variFvel de elementos Bve:a se56o 79=94C9
A linguagem C $ermite alo*ar dinami*amente Bem tem$o de exe*u56oC, blo*os de mem;ria
usando $onteiros9 Dada a intima rela56o entre $onteiros e vetores, isto signi8i*a %ue $odemos de*larar
1D4
dinami*amente vetores de tamanho variFvel9 Isto ( dese:Fvel *aso %ueiramos $ou$ar mem;ria, isto ( n6o
reservar mais mem;ria %ue o ne*essFrio $ara o arma3enamento de dados9
1ara a alo*a56o de mem;ria usamos a 8un56o malloc()Bmemory a##ocationC da bibliote*a
alloc.h9 A 8un56o malloc() reserva, se%Ren*ialmente, um *erto numero de blo*os de mem;ria e
retorna, $ara um $onteiro, o endere5o do $rimeiro blo*o reservado9
-inta,e+ A sintaxe geral usada $ara a alo*a56o dinNmi*a ( a seguinteE
pont = (tipo *)malloc(tam);
ondeE
pont ( o nome do $onteiro %ue re*ebe o endere5o do es$a5o de mem;ria alo*ado9
tipo ( o ti$o do endere5o a$ontado Bti$o do $onteiroC9
tam ( o tamanho do es$a5o alo*adoE numero de &ytes9
A sintaxe seguinte, $orem, ( mais *laraE
pont = (tipo*)malloc(num*sizeof(tipo));
ondeE
num ( o numero de elementos %ue %ueremos $oder arma3enar no es$a5o alo*ado9
0,emplo+ Se %ueremos de*larar um vetor *hamado vet, ti$o int, *om num elementos $odemos
usar o tre*ho abaixoE
...
int *vet; // declarao do ponteiro
vet = (int*)malloc(num*2); // alocao de num blocos de 2 bytes
...
ou ainda
...
int *vet; // declarao do ponteiro
vet = (int*) malloc(num * sizeof(int));
...
1D=
Caso n6o se:a $ossAvel alo*ar o es$a5o re%uisitado a 8un56o malloc() retorna a *onstante
simb;li*a NULL9
-inta,e+ 1ara liberar Bdesalo*arC o es$a5o de mem;ria se usa a 8un56o free(), *u:a sintaxe ( a
seguinteE
free(pont);
ondeE
pont ( o nome do $onteiro %ue *ontem o endere5o do ini*io do es$a5o de mem;ria reservado9
Programa 0,emplo+ 7 ar%uivo e0809.cpp *ont(m um $rograma %ue mostra *omo se utili3a a
Alo*a56o DinNmi*a de .em;ria9
H97 1onteiros $ara 2un5<es
At( agora usamos $onteiros $ara a$ontar $ara endere5os de mem;ria onde se en*ontravam as
variFveis BdadosC9 Algumas ve3es ( ne*essFrio a$ontar $ara 8un5<es, isto (, a$ontar $ara o endere5o de
mem;ria %ue *ontem o ini*io das instru5<es de uma 8un56o9 \uando assim $ro*edemos, di3emos %ue
usaremos ponteiros para fun2<es9
%.$.1 Ponteiros como chamada de >un*o.
Lm uso de $onteiros $ara 8un5<es ( $assar uma 8un56o *omo argumento de outra 8un56o9 .as
tamb(m se $ode usar $onteiros $ara 8un5<es ao inv(s de 8un5<es nas *hamadas normais de 8un5<es9
-inta,e+ A sintaxe de de*lara56o de $onteiro $ara 8un5<es ( a seguinteE
tipo8r (*nome8p)(lista);
ondeE
tipo8r ( o ti$o de retorno da 8un56o a$ontada9
nome8p ( o nome do $onteiro %ue a$ontara $ara a 8un56o9
lista ( a lista de argumentos da 8un56o9
0,emplo+ Su$onha %ue temos uma 8un56o ( de*larada *omoE
float fun(int a, int b){
...
1DI
}
o $onteiro *orres$ondente serFE
float (*pt)(int,int);
7bserve %ue o $onteiro $ara 8un56o deve ser de*larado entre $ar>nteses9 7bserve tamb(m %ue o
$onteiro e a 8un56o retornam o mesmo ti$o de dado e %ue tem os mesmos argumentos9
-inta,e+ 1ara atribuirmos o endere5o de uma 8un56o $ara um $onteiro usamos a seguinte sintaxeE
pont = &fun67o;
ondeE
pont ( o nome do $onteiro9
fun67o ( o nome da 8un56o9
Se um $onteiro *ontem o endere5o de uma 8un56o, ele $ode ser usado no lugar da *hamada da
8un56o9
0,emplo+ o tre*ho de $rograma abaixo usa um $onteiro $ara *hamar uma 8un56oE
float fun(int a,int b){
...
}
void main(void){
float temp;
float (*pt)(int,int);
pt = &fun;
temp = (*pt)(10,20); // equivale a: temp = fun(10,20);
...
}
Programa 0,emplo+ 7 ar%uivo e0810.cpp *ont(m um $rograma %ue mostra *omo se utili3a o
$onteiro $ara 8un56o9
%.$. Passando uma >un*o como argumento de outra >un*o.
1D?
7utra utili3a56o de $onteiros $ara 8un5<es ( na $assagem de uma >un*o *omo argumento $ara
outra 8un56o9 1ara %ue isso o*orra ne*essitamosE
Na de*lara56o da >un*o a ser passadaE
iC Nada de es$e*ial, a$enas a de8ini56o normalE
tipo nome8p(lista){
...
}
0,emplo+
float soma(float a,float b){
...
}
Na >un*o receptoraE
iC De*larar o ponteiro %ue re*ebe a >un*o passada na lista de argumentosE
tipo nome8r(..., tipo (*pt)(lista), ...){
0,emplo+
float grad(float x, float y, float (*p)(float,float)){
iiC Lsar o $onteiro $ara 8un5<es nas *hamadas da 8un56o $assadaE
)ar = (*pt)(lista);
0,emplo+
valor = (*p)(x,y);
Na 8un56o $rin*i$alE
iC 1assar o nome da 8un56o *hamada $ara a 8un56o re*e$toraE
var = nome_g(... , nome_p , ...);
0,emplo+
g = grad(x,y,soma);
Programa 0,emplo+ 7 ar%uivo e0811.cpp *ont(m um $rograma %ue mostra *omo se utili3a
$onteiros na $assagem de 8un5<es
1D@
1D7

S-ar putea să vă placă și