Beruflich Dokumente
Kultur Dokumente
Em Construo
v0.003.11
17 de outubro de 2013
Sumrio
Introduo
1.2.1
O In io . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2
A Era Moderna . . . . . . . . . . . . . . . . . . . . . . . .
1.2.3
11
1.2.4
As Geraes . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.3 O Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
1.3.1
Mi ro omputadores . . . . . . . . . . . . . . . . . . . . .
15
1.3.2
Memrias . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
1.3.3
Bits e Bytes . . . . . . . . . . . . . . . . . . . . . . . . . .
18
1.3.4
Perifri os . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.4 O Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.5 Um programa em C . . . . . . . . . . . . . . . . . . . . . . . . .
25
26
Algoritmos
27
2.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
28
2.3 Representao . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
2.3.1
Linguagem Natural . . . . . . . . . . . . . . . . . . . . . .
30
2.3.2
Fluxogramas . . . . . . . . . . . . . . . . . . . . . . . . .
30
2.3.3
Pseudo-Linguagem . . . . . . . . . . . . . . . . . . . . . .
31
33
34
2.5.1
Comandos de leitura . . . . . . . . . . . . . . . . . . . . .
35
2.5.2
Comandos de es rita . . . . . . . . . . . . . . . . . . . . .
35
2.5.3
Expresses . . . . . . . . . . . . . . . . . . . . . . . . . .
36
2.5.4
Comandos de atribuio . . . . . . . . . . . . . . . . . . .
38
2.5.5
Comandos de ontrole . . . . . . . . . . . . . . . . . . . .
39
2.5.6
Comandos de repetio . . . . . . . . . . . . . . . . . . .
40
41
46
48
3.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
48
3.2.1
Tipos Bsi os . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.2.2
49
49
3.3.1
50
3.3.2
51
3.3.3
52
3.3.4
52
3.3.5
53
54
3.4.1
55
3.5 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
3.5.1
56
3.5.2
De larao de variveis . . . . . . . . . . . . . . . . . . .
56
3.5.3
Atribuio de valores . . . . . . . . . . . . . . . . . . . . .
57
58
60
4.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
60
61
4.3.1
Cdigos de Converso . . . . . . . . . . . . . . . . . . . .
62
64
66
4.5.1
66
4.5.2
67
4.5.3
68
4.5.4
69
4.5.5
A Funo fgets . . . . . . . . . . . . . . . . . . . . . . .
69
71
Operadores e Expresses
72
5.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
72
73
74
5.4.1
74
5.4.2
Operadores Lgi os . . . . . . . . . . . . . . . . . . . . .
74
77
78
79
79
79
81
82
Comandos de Controle
84
6.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
84
84
6.3.1
Comando if . . . . . . . . . . . . . . . . . . . . . . . . . .
85
6.3.2
Comando swit h . . . . . . . . . . . . . . . . . . . . . . .
86
6.3.3
Comando Ternrio . . . . . . . . . . . . . . . . . . . . . .
89
89
6.4.1
Comando for . . . . . . . . . . . . . . . . . . . . . . . . .
89
6.4.2
Comando while . . . . . . . . . . . . . . . . . . . . . . .
94
6.4.3
Comando do-while . . . . . . . . . . . . . . . . . . . . .
95
96
6.5.1
Comando break . . . . . . . . . . . . . . . . . . . . . . .
96
6.5.2
Comando ontinue . . . . . . . . . . . . . . . . . . . . .
96
6.5.3
Comando goto . . . . . . . . . . . . . . . . . . . . . . . .
96
6.5.4
Funo exit() . . . . . . . . . . . . . . . . . . . . . . . .
97
6.5.5
Comando return . . . . . . . . . . . . . . . . . . . . . . .
97
98
101
Funes
117
8.4.2
8.5.2
8.5.3
8.7.2
Ponteiros
136
9.2.2
9.2.3
9.2.4
9.2.5
158
170
187
A Tabela ASCII
197
B Palavras Reservadas
199
Lista de Figuras
1.2 Imagem de um ba o. . . . . . . . . . . . . . . . . . . . . . . . .
10
10
12
15
16
18
23
31
32
35
39
41
43
Lista de Tabelas
12
15
19
19
38
50
51
52
52
54
55
55
59
62
73
74
75
76
76
76
77
77
81
Lista de Algoritmos
29
29
31
33
34
39
40
40
42
2.10 Algoritmo para ler nmeros e imprimir se so pares ou no. A quantidade de nmeros a ser lida de
2.11 Algoritmo para
al
ular a maior nota de uma turma de 25 alunos.
44
44
45
47
47
53
Listings
25
61
63
64
. . . . . . . . . . . . . . . . . . . . .
66
67
67
68
. . . . . .
70
78
. . . . . . . . . . . . . . . . . . .
80
. . . . . . . . . . . . . . . . . . . . . . .
83
. . . . . . . . . . . . . . . . . . . . . .
86
87
. . . . . . . . . . . . . . . . . . . . . . . . .
90
91
92
92
93
. . . . . . . . . . . .
93
. . . . . . . . . . . . . . . . . . . . . .
94
. . . . . . . . . . . . . . . . .
95
. . . . . . . . . . . . . . . . . . . . . 100
. . . . . . . . . . . . . . . . . . 104
. . . . . . . . . . . . . . . . . 105
. . . . . . . . . . . . . . . . . . . . . . . 108
10
. . . . . . . . . . . . . . . . . . 109
. . . . . . . . . . . . . . . . . . . . . 116
. . . . . . . . . . . . . . . . . . . . 122
. . . . . . . . . . . . . . . . 125
. . . . . . . . . . . . . . 126
. . . . . . . . . . . . . . . 127
. . . . . . . . . . . . . . . . . . . . . 128
. . . . . . . . . . . . . . . . . . . . 129
. . . . . . . . . . . . . . . . . . 129
. . . . . . . . . . . . . . . . . . . . . . 131
. . . . . . . . . . . . . . . . . . . . . . 134
. . . . . . . . . . . . . . 141
. . . . . . . . . . . . . . . . . . . 144
. . . . . . . . . 145
. . . . . . . . . . . . . . . . . 146
. . . . . . . . . . . . . . . . . . . . . 147
. . . . . . . . 148
. . . . . . . . . . . . 148
. . . . . . . . . . . . . . 149
. . . . . . . . . . . 151
. . 152
. . . . . . . . . . . . . . . . . . . 153
. . . . . . . . . . . . . . . . . . . . . 155
. . . . . . . . . . . . . . . . . . . . . 156
. . . . . . . . . . . . . . . . . . . . . 157
. . . . . . . . . . . . . . . . . 163
. . . . . . . . . . . . . . . 164
. . . . . . . . . . . . . . . . . . . 164
. . . . . . . . . . . . . . . . . . . . . . 168
. . . . . . . . . . . . . . . . . . . . . . . 175
. . . . . . . . . . . . 177
. . . . . . . . . . . . 178
. . . . . . 179
. . . . . . . . . . 182
. . . . . . . . . . . . 183
. . . . . . . . . . . . . 186
12
Captulo 1
Introduo
1971
1972
1974
1982
1985
1989
1993
1997
1999
2000
Pro essador
4004
8008
8080
80286
80386
80486 DX
Pentium
Pentium II
Pentium III
Pentium 4
Transistores
2.250
2.500
5.000
120.000
275.500
1.180.000
3.100.000
7.500.000
24.000.000
42.000.000
Tabela 1.1: Transistores por ir uito integrado nos mi ropro essadores da Intel
16
Em 1834 ele tinha
ompletado os primeiros desenhos da mquina que denominou Analyti
al Engine que tinha as seguintes
ara
tersti
as:
50 dgitos de
imais de pre
iso;
Memria para 1000 destes nmeros (165000 bits);
Controle por meio de
artes perfurados das operaes e endereos dos
dados;
Tempo de soma e subtrao igual a 1 segundo; tempo de multipli
ao e
diviso igual a 1 minuto;
Sub-rotinas;
17
Em 1944 a IBM e H. Haiken da Universidade de Harvard,
on
luam a
onstruo de um verdadeiro
omputador: o Harvard Mark I, que operava em base 10.
O Mark I efetuava as quatro operaes fundamentais, mais o
l
ulo de funes
trigonomtri
as, exponen
iais e logartmi
as. As instrues eram forne
idas por
meio de tas de papel e os dados lidos de
artes perfurados. Os resultados eram
forne
idos em forma de
artes perfurados ou impressos por meio de mquinas
de es
rever.
18
soma
multipli
ao
diviso
Tempo
200 s
2,8 ms
6,0 ms
Jnos von Neumann, emigrante hngaro que vivia nos EUA, sugeriu que a
memria do
omputador deveria ser usada para armazenar as instrues do
omputador de maneira
odi
ada, o
on
eito de programa armazenado. Esta
idia foi fundamental para o progresso da
omputao. Os primeiros
omputadores,
omo o ENIAC, eram programados por os que os
ientistas usavam para
one
tar as diversas partes. Quando um programa terminava, estes
ientistas
tro
avam os os de posio de a
ordo
om a nova tarefa a ser exe
utada. Com o
programa armazenado na memria, juntamente
om os dados, no era mais ne
essrio interromper as atividades. Carregava-se o programa na memria, uma
tarefa extremamente rpida, junto
om os dados e dava-se partida no programa.
Ao trmino da exe
uo do programa passava-se imediatamente para a prxima
tarefa sem interrupes para tro
a de os.
Em 1949, na Inglaterra, dois
omputadores que usavam a memria para
armazenar tanto programas
omo dados foram lanados. Na Universidade de
Cambridge foi lanado o EDSAC, (Ele
troni
Delay Storage Automati
Cal
ulator) e em Man
hester o
omputador
hamado de Man
hester Mark I. O EDSAC
onsiderado o primeiro
omputador de programa armazenado a ser lanado.
Curiosamente, a Universidade de Man
hester reivindi
a que o primeiro
omputador de programa armazenado foi o
hamado Baby, um prottipo do Mark I,
que
omeou a operar onze meses antes do EDSAC.
Outro fato
urioso em relao Inglaterra e que foi divulgado re
entemente
relata que um
omputador
hamado COLOSSUS entrou em operao se
retamente na Inglaterra em 1943. Este
omputador foi usado para auxiliar na
quebra dos
digos de
riptograa alemes durante a segunda grande guerra.
1.2.4 As Geraes
Costumava-se dividir os projetos de
omputadores em geraes. Hoje em dia
omo a taxa de evoluo muito grande no se usa mais este tipo de terminologia. No entanto interessante men
ionar estas divises.
Os
omputadores
onstrudos
om rels e vlvulas so os
da primeira gerao. Estes
omputadores
onsumiam muita energia e
espao.
Primeira Gerao:
Segunda Gerao:
Com o advento dos
ir
uitos integrados, que so
omponentes em que vrios transistores so
onstrudos em uma mesma base
de semi
ondutor,
hegamos aos
omputadores de ter
eira gerao. Com
a integrao o tamanho dos
omputadores e seu
onsumo diminuiu ainda
mais e aumentou a
apa
idade de pro
essamento.
20
Quarta Gerao:
1.3 O Hardware
O hardware
orresponde aos
ir
uitos eletrni
os e
omponentes me
ni
os que
ompem o
omputador. Um tpi
o diagrama em blo
os de um
omputador
digital monopro
essado esta mostrado na Figura 1.7. A Unidade Central
de Pro
essamento (UCP), em ingls Central Pro
essing Unit (CPU),
omo o
prprio nome diz, a unidade onde os dados so pro
essados, ou seja alterados,
no
omputador. Ou seja, dentro das UCPs os dados so somados, subtrados
et
. A UCP tambm
ontrola a movimentao dos dados dentro de todo o
sistema. Os mdulos que
onstituem a UCP so os seguintes:
omanda a operao do
omputador. Esta unidade l da memria tanto as instrues
omo os dados e
omanda todos
os
ir
uitos para exe
utar
ada instruo lida da memria. Atualmente as
unidades de
ontrole so
apazes de exe
utar mais de uma instruo por
i
lo de mquina, o que
ara
teriza o pro
essamento paralelo. A t
ni
a
mais
omum para
onseguir este paralelismo
onhe
ida
omo pipelining,
que ser detalhada mais adiante.
ontrola a
omuni
ao
om os usurios do
omputador e os equipamentos perifri
os tais
omo dis
os e impressoras. Em alguns
omputadores mais simples esta unidade no existe
independentemente, sendo distribuda pela Unidade Central de Pro
essamento. Em
omputadores mais poderosos ao
ontrrio as Unidades de
Entrada e Sada so
omputadores
ompletos que foram programados para
ontrolar a
omuni
ao
om os perifri
os.
Unidade
de
Controle
Unidade
de
Entrada
e
Sada
Memria
Unidade
Arimtica
Discos
Vdeo
Unidade
Central
de
Processamento
1.3.1 Mi
ro
omputadores
Uma UCP integrada em um ni
o
ir
uito (
hip)
omumente
hamada de
Os mi
ropro
essadores atuais in
luem outros
ir
uitos que
normalmente
avam fora da UCP, tais
omo pro
essadores de ponto utuante
e memrias
a
he. Alguns exemplos de mi
ropro
essadores so mostrados na
Tabela 1.3
mi
ropro
essador .
Mi ropro essador
Empresa
Intel, AMD
Consr
io Apple/IBM/Motorola
IBM
MIPS Te
hnologies
ARM Te
hnologies
SUN
dores.
22
1.3.2 Memrias
Os dados no
omputador podem ser armazenados em diversos nveis de memria
semi
ondutoras ou em perifri
os (dis
os, tas, et
). Quanto mais rpida a
memria, usualmente mais
ara ela . A idia por traz da separao em nveis
olo
ar mais perto do pro
essador, em memrias rpidas e mais
aras, os
dados que o pro
essador ir pre
isar mais freqentemente. A medida que vamos
nos afastando do pro
essador as memrias vo, ao mesmo tempo,
ando mais
baratas, aumentando de
apa
idade e diminuindo de velo
idade. A Figura 1.8
ilustra esta hierarquia.
PROCESSADOR
MEMRIA
DISCO
CACHE
REGISTRADORES
ir
uitos espe
iais veri
am se este dado est no
a
he,
aso esteja, ele repassado para o pro
essador. Para o pro
essador o que a
onte
eu que a memria
entregou o dado
om uma rapidez maior do que o normal.
Uma memria
omo se fosse uma srie de
ofres numerados
apazes de
armazenar os dados,
omo est ilustrado na Figura 2.3. Os dados e instrues
na memria so apontados ou referen
iados por estes nmeros,
onhe
idos
omo
endereos. Ou seja, para ler um dado da memria ne
essrio forne
er um
endereo para que a memria possa en
ontrar e devolver o
ontedo pedido. Isto
similar ao o que o
orre quando enviamos uma
arta, o endereo faz
om que o
arteiro saiba onde ele deve entregar a
orrespondn
ia. Em operao normal,
toda vez que o pro
essador pre
isa de um dado ele envia um pedido de leitura
memria junto
om o endereo da memria onde o dado est. Nas es
ritas
o pro
essador envia o endereo, o dado e pedido de es
rita. Normalmente a
memria somente pode atender um pedido de
ada vez. Portanto, para ler 1000
nmeros o pro
essador ter de fazer 1000 a
essos seqen
ialmente.
Os dois tipos bsi
os de memria mais
omuns so ROM e RAM. Estas
siglas tm diversas variaes (PROM, EPROM, DRAM, et
), mas os prin
pios
bsi
os so os mesmos. Estas siglas indi
am os dois tipos bsi
os de memria
que so usadas em
omputadores. A sigla bsi
a ROM signi
a Read Only
Memory, ou seja, memria de somente de leitura. A outra sigla RAM (Random
A
ess Memory) signi
a memria de a
esso randmi
o, portanto, memria que
se pode ler em qualquer endereo.
A sigla RAM muito
onfusa porque em uma memria ROM tambm se
pode ler em qualquer endereo. A diferena real que nas RAMs se pode ler e
es
rever
om a mesma velo
idade em qualquer endereo, enquanto que na ROM,
o a
esso rpido somente para leituras, a es
rita uma histria mais
ompli
ada.
A ROM normalmente
ontm dados que no podem ser modi
ados durante o
fun
ionamento do
omputador. Outro tipo de dados armazenados em ROMs so
os que no devem ser perdidos quando o
omputador desligado. Exemplos de
uso de ROM so as memrias que armazenam os programas que so exe
utados
quando os
omputadores so ligados, os famosos BIOS (Basi
Input Output
System). Um
omputador ao ser ligado deve ter um programa mnimo
apaz
de ini
iar o seu fun
ionamento normal,
aso
ontrrio seria
omo uma pessoa
que perdeu totalmente a memria. Para isto so es
ritos programas simples que
fazem a
esso aos perifri
os em bus
a do Sistema Opera
ional da mquina.
As primeiras memrias do tipo ROM eram gravadas nas fbri
as e nun
a
mais eram modi
adas. Isto trazia algumas di
uldades, por exemplo, quando
um programa pre
isava ser atualizado. Para resolver este tipo de problemas
surgiram as PROMs, que so ROMs programveis. Ou seja possvel desgravar
o
ontedo antigo e gravar novos programas nesta memria. Antigamente este
era um pro
esso
ompli
ado e exigia que a memria fosse retirada si
amente
do
ir
uito e
olo
ada em dispositivos espe
iais
apazes de apagar o
ontedo
antigo. Em seguida um
ir
uito programador de PROMs era usado para gravar
o novo
ontedo e somente aps tudo isto a memria era re
olo
ada no lo
al.
O
omputador
ava literalmente sem a memria dos programas ini
iais. Hoje
em dia existem PROMs que podem ser apagadas e regravadas muito fa
ilmente.
Por exemplo, as EEPROMs (Eletri
aly Erasable PROMs), que so memrias
que podem ser apagadas eletri
amente sem a ne
essidade de serem retiradas
24
dos
ir
uitos. Flash memory uma forma de memria no voltil que pode
ser apagada e reprogramada eletri
amente. Diferentemente das EEPROMs, ela
deve ser apagada em blo
os de endereos. Este tipo de memria
usta menos
do que EEPROMs e portanto so preferidas quando ne
essrio usar memria
no voltil em forma de
ir
uitos integrados.
As memrias RAMs so as memrias onde os nossos programas
omuns
rodam. Elas so modi
veis e de a
esso rpido tanto na leitura quanto na
gravao. Muitas siglas apare
em e desapare
em quando falamos de memrias
RAM. Existem as DRAM, memrias EDO, SIMM, et
. Tudo isto ou se refere ao
mtodo de a
esso dos dados na memria ou a te
nologia de
onstruo ou a outra
ara
tersti
a a
essria. O
erto que todas elas tem
omo
ara
tersti
a bsi
a
o fato dos a
essos de leitura e es
rita poderem ser feitos na mesma velo
idade.
BYTE
8 BITS
PALAVRA
32 BITS
4 BYTES
Kilobyte
Megabyte
Gigabyte
Terabyte
Petabyte
Exabyte
Smbolo
Kb
MB
GB
TB
PB
EB
Multipli ador
210 = 1024
220
230
240
250
260
1.3.4 Perifri
os
Como j men
ionamos antes, os dados no
am guardados somente na memria, h tambm os perifri
os . H perifri
os de entrada, outros de sada
e alguns que servem tanto para entrada
omo sada de dados. Perifri
os no
servem somente para armazenar dados. H perifri
os que so usados para permitir a interao entre os usurios e o
omputador. A tabela 1.5 ilustra alguns
destes perifri
os.
Entrada
Te
lados
Mouse
CD-ROM
S
anner
Sada
Impressoras
Vdeo
Plotter
Alto-falantes
Ambos
Dis
os Rgidos
Fitas Magnti
as
Disquetes
Dis
os Zip
1.4 O Software
Tudo isto que sobre o que a
abamos de es
rever
onstitui o hardware do
omputador, o que se v e o que se to
a. A partir de agora falaremos brevemente
no software, o que no se v nem se to
a, mas tambm est l.
Para que um
omputador exe
ute alguma tarefa primeiro se desenvolve um
algoritmo , que uma esp
ie de re
eita que diz pre
isamente, ao
omputador,
omo o problema deve ser resolvido. Esta denio informal de algoritmo
enganosamente simples, e a
have para entender o engano est nas palavras
dizer pre
isamente ao
omputador. Por exemplo, uma re
eita em gastronomia
normalmente no um algoritmo. Re
eitas so entendidas pela
omunidade de
ozinheiros, que as seguem fa
ilmente durante o preparo do prato. No entanto,
re
eitas esto
heias de expresses
omo, por exemplo, mexer at
ar no ponto
26
Em seguida este algoritmo deve ser traduzido para uma linguagem que possa
ser entendida pelo
omputador ou que possa ser traduzida para esta linguagem.
No in
io da
omputao eletrni
a
om programas armazenados, estes eram
es
ritos diretamente em linguagem de mquina que a linguagem que o
omputador realmente entende. Estas instrues so
onjuntos de bits indi
ando
a operao que deve ser exe
utada e,
aso ne
essrio, onde
omo a
har os dados
que sero operados. Por esta razo tambm
ostuma-se dizer que so programas
es
ritos em binrio.
Com a evoluo da
omputao os programas passaram a ser es
ritos em
assembly , que uma representao em mnemni
os das instrues de mquina.
Deste modo era mais f
il es
rever os algoritmos. Por exemplo, um fragmento
de um programa es
rito em assembly do pro
essador PowerPC :
li r3,4
* O primeiro numero a ser somado e 4.
li r4,8
* 8 e o segundo numero
add r5,r4,r3 * Some os
ontedos de r3 (4) e r4 (8)
* e armazene o resultado em r5
Este pequeno tre
ho de programa armazena os nmeros 4 e 5 em registradores internos do pro
essador em seguida os soma e armazena o resultado em um
ter
eiro registrador. As informaes aps os asteris
os so
omentrios usados
para expli
ar o que o programa est fazendo naquela instruo.
O PowerPC um mi
ropro
essador
riado em 1991 por um
onsr
io formado pela IBM, Apple e Motorola Os mi
ropro
essadores PowerPC podem ser
usados para equipar desde sistemas embutidos at
omputadores de alto desempenho. A Apple usou este mi
ropro
essador para equipar suas mquinas at
2006.
27
Pas al:
COBOL:
Basi
:
Java:
Delphi:
Lisp e Prolog:
Arti ial.
Apli
ativos importantes para os programadores so os
ompiladores. Estes programas traduzem programas es
ritos em linguagens de alto nvel para
a linguagem de mquina, de modo que o
omputador possa exe
ut-los. De
maneira geral um
ompilador um programa que traduz um programa de uma
linguagem para outra.
Podemos resumir os passos ne
essrios para
riar um programa em uma
linguagem de programao, por exemplo C, nos passos des
ritos a seguir. A
Figura 1.10 ilustra a ordem em que se desenvolvem estes passos.
neste passo
riado o algoritmo que ir resolver o
problema. As diversas maneiras de des
rever um algoritmo sero apresentadas no prximo
aptulo.
Criao do Algoritmo:
28
O algoritmo preparado no passo anterior es
rito em uma linguagem de programao. Neste passo o programador
onta, normalmente,
om a ajuda de um editor de textos (no pro
essador de textos). Para esta edio qualquer editor pode ser usado. Hoje
em dia muitos ambientes de desenvolvimento integram todas as ferramentas ne
essrias para
riar um programa, in
lusive o editor, em um ni
o
apli
ativo.
Codi ao do Algoritmo:
Compilao do Programa:
Ligao:
Depurao e Testes:
O programa foi entregue aos seus usurios para ser usado. Durante o uso, erros que no foram en
ontrados durante o desenvolvimento do programa podem ser des
obertos e pre
isam ser
orrigidos. A
orreo pode ser feita pelos mesmos programadores que desenvolveram o
programa ou por outro grupo devidamente treinado. Costuma-se
hamar
esta
orreo de manuteno do programa.
Uso do Programa:
Incio
Ligao
Criao de
Algoritmo
Depurao e
Testes
Sim
Codificao do
Algoritmo
Erros de
Execuo?
No
Compilacao do
Programa
Uso do programa
Sim
Sim
Erros de
Compilao?
Erros de
Execuo?
No
dis
urso um tradutor repete as frases na linguagem destino. Um programa
ompilado fun
iona
omo se primeiro, o tradutor traduzisse todo o dis
urso e depois
o lesse. A linguagem Basi
uma linguagem interpretada. Em Java o
orre um
pro
esso um pou
o diferente. Um programa em Java traduzido para uma linguagem intermediria e depois interpretado por meio de uma
hamada mquina
virtual. No h efetivamente uma
ompilao para linguagem de mquina. A
exe
uo de um programa es
rito em uma linguagem interpretada mais lenta,
j que o pro
esso de interpretao e exe
uo ao mesmo tempo mais lento do
que a simples exe
uo de um programa traduzido ante
ipadamente.
Hoje em dia a maior parte dos usurios de
omputadores no so programadores e sim pessoas que usam programas para resolver seus problemas do dia
a dia. Apli
ativos tpi
os que rodam nos
omputadores so: editores de texto,
pro
essadores de texto, planilhas eletrni
as,
ompiladores, ban
os de dados,
jogos, et
.
Para geren
iar os re
ursos do
omputador existe um programa espe
ial normalmente
hamado de Sistema Opera
ional (S. O.). Por exemplo,
onsidere o
problema de geren
iar
omo os diversos programas que um usurio normalmente
utiliza partilharo o pro
essador do
omputador. Um usurio pode estar ouvindo msi
a, digitando um texto e imprimindo um outro do
umento ao mesmo
tempo. Portanto, os
omputadores so
apazes de exe
utar um nmero de tarefas muito maior do que o nmero de pro
essadores disponveis. Atualmente
a maior parte dos
omputadores possui somente um pro
essador. O Sistema
Opera
ional
ontrola a alo
ao de re
ursos tais
omo:
omuni
ao
om os
usurios, espao em dis
os, uso de memria, tempo que
ada programa pode rodar et
. Alguns dos sistemas opera
ionais
onhe
idos so os baseados no padro
UNIX, por exemplo o LINUX. Outros sistemas muito usados so os da famlia
30
Windows.
Compilando Programas Simples em
Para resolver os exer
ios deste livro vo
ir pre
isar de um
ompilador para a
linguagem C e de um editor de textos simples (no pro
essador
omo o Word).
O editor pode ser to simples quanto o Notepad, na verdade re
omendamos
fortemente que o editor seja simples para que vo
possa ter
ontato
om todas
as etapas do pro
esso de desenvolvimento de um programa. Para
ompilar
empregaremos o
ompilador g
que gratuito e pode ser obtido na Internet
omo veremos adiante. No ser ne
essrio nenhum ambiente mais
omplexo,
tal
omo um Integrated Development Environment (IDE).
A
oleo de
ompiladores da GNU (GNU Compiler Colle
tion) usualmente
abreviada por g
, uma
oleo de
ompiladores produzidos pelo projeto GNU.
A abreviao g
, originalmente, signi
ava GNU C Compiler. Este apli
ativo
distribudo gratuitamente pela Free Software Foundation (FSF) sob a li
ena
GNU GPL e GNU LGPL. Este o
ompilador padro para os sistemas opera
ionais livres do tipo Unix,
omo o LINUX, e diversos sistemas opera
ionais
proprietrios
omo o Apple Ma
OS X. Atualmente o g
pode
ompilar C++,
Obje
tive-C, Java, Fortran e ADA, entre outras linguagens. Vamos
onsiderar,
omo exemplo, um programa
hamado teste.
. Para
ompilar e gerar o
exe
utvel para este programa digitamos o
omando
g
-o teste teste.
-Wall
em uma janela de
omandos no sistema Windows ou em um terminal nos sistemas Unix. O suxo .
no nome do programa normalmente usado para indi
ar
que o arquivo de um programa C. Este
omando deve ser digitado no diretrio
onde est o arquivo fonte teste.
. O arquivo exe
utvel ser armazenado no
mesmo diretrio.
Nos sistemas Unix normalmente o g
faz parte da distribuio padro e
nada pre
isa ser feito. No Windows uma maneira f
il de obter uma verso
do g
instalar o MinGW (Minimalist GNU for Windows). MinGW uma
oleo de arquivos e bibliote
as distribudas livremente as quais
ombinadas
om outras ferramentas da GNU permitem que programas para Windows sejam
produzidos sem a ne
essidade de bibliote
as extras e pagas. O MinGW dispe
de um programa instalador que fa
ilita enormemente o pro
esso. Este programa
pode ser obtido no stio o
ial do MinGW. Caso aps a instalao, o
omando
indi
ado no fun
ione uma das razes para a falha pode ser que o sistema opera
ional no sabe onde se en
ontra o
ompilador g
. Suponha que o programa
g
foi instalado no diretrio C:\MinGW\bin. Uma soluo digitar o
aminho
ompleto do
ompilador. Neste
aso o
omando se torna
31
1.5 Um programa em C
Vamos terminar este
aptulo mostrando um exemplo simples de programa es
rito em C(Listagem 1.1). A ni
a
oisa que este programa faz imprimir Alo
Mundo! e terminar [?, ?, ?.
A primeira linha do programa avisa ao
ompilador que ir usar funes de
entrada e sada de dados guardadas na bibliote
a stdio. Neste
aso a funo
usada printf. A segunda linha o in
io real do programa. A linha indi
a que
esta a funo main que todo programa C deve
onter, pois nesta funo que
o programa obrigatoriamente
omea sua exe
uo. A funo vai retornar um
valor inteiro (int) ao nal de sua exe
uo e no vai pre
isar re
eber nenhum
argumento para sua exe
uo (void). As
haves ({ e }) mar
am o in
io e o
m da funo. Para imprimir o texto Alo Mundo! o programa usa a funo
printf. O in
io e o m do texto a ser impresso so mar
ados pelo
ara
tere ".
A funo termina
om o
omando return 0, que avisa ao sistema opera
ional,
que foi quem ini
iou a exe
uo do programa, que o programa terminou sem
problemas. Este programa simples ilustra alguns das estruturas bsi
as que
sero usadas nos programas C que sero apresentados neste livro.
#in
lude
int main
{
}
return
32
1.2:
1.3:
1.4:
1.5:
1.6:
1.7:
1.8:
usa.
1.9: Pro
ure em manuais, internet e outras fontes quais so os tempos de a
esso
das memrias RAMs atuais.
1.10:
1.11:
1.14:
33
Captulo 2
Algoritmos
2.1 Introduo
O objetivo deste
aptulo fazer uma breve introduo ao
on
eito de algoritmos e apresentar algumas formas mais
omuns de representar algoritmos para
fa
ilitar o entendimento dos demais
aptulos deste livro. Iremos apresentar as
onstrues mais
omuns empregadas no desenvolvimento de algoritmos e apresentaremos exemplos bsi
os de algoritmos usando algumas destas formas de
representao e
onstrues.
Para resolver um problema no
omputador ne
essrio que seja primeiramente en
ontrada uma maneira de des
rever este problema de uma forma
lara
e pre
isa. pre
iso que en
ontremos uma seqn
ia de passos que permitam
que o problema possa ser resolvido de maneira automti
a e repetitiva. Alm
disto pre
iso denir
omo os dados que sero pro
essados sero armazenados no
omputador. Portanto, a soluo de um problema por
omputador
baseada em dois pontos: a seqn
ia de passos e a forma
omo os dados sero
armazenados no
omputador. Esta seqn
ia de passos
hamada de algoritmo.
Usamos algoritmos em diversas atividades que realizamos diariamente. Uma
grande parte destas atividades no esto rela
ionadas
om
omputao. Um
exemplo simples e prosai
o, de
omo um problema pode ser resolvido
aso forneamos uma seqn
ia de passos que mostrem a maneira de obter a soluo,
uma re
eita para preparar um bolo.
Uma vez que foi
riado um algoritmo para resolver um determinado problema usando
omputadores passamos para a prxima fase que a es
rita deste
algoritmo em alguma linguagem de programao.
A noo de algoritmo
entral para toda a
omputao. A
riao de algoritmos para resolver os problemas uma das maiores di
uldades dos ini
iantes
em programao em
omputadores. Isto porque no existe um
onjunto de regras, ou seja um algoritmo, que nos permita
riar algoritmos. Caso isto fosse
possvel a funo de
riador de algoritmos desapare
eria. Claro que existem
linhas mestras e estruturas bsi
as, a partir das quais podemos
riar algoritmos, mas a soluo
ompleta depende em grande parte do
riador do algoritmo.
34
um:
Pro
esso de
l
ulo, ou de resoluo de um grupo de problemas semelhantes, em que se estipulam,
om generalidade e sem restries,
regras formais para a obteno de resultado ou de soluo de problema.
Um algoritmo opera sobre um
onjunto de entradas (no
aso do bolo, farinha
ovos, fermento, et
.) de modo a gerar uma sada que seja til (ou agradvel)
para o usurio (o bolo pronto).
Um algoritmo
omputa
ional tem
in
o
ara
tersti
as importantes:
Finitude:
sos.
Denio:
Entradas:
Um algoritmo deve ter uma ou mais sadas, isto quantidades que tem
uma relao espe
a
om as entradas.
Sadas:
Um algoritmo deve ser efetivo. Isto signi
a que todas as operaes devem ser su
ientemente bsi
as de modo que possam ser, em prin
pio, exe
utadas
om pre
iso em um tempo nito por um humano usando
papel e lpis.
Efetividade:
Exemplo de Algoritmo.
in
io
enquanto
m enqto
m
Computadores so mquinas muito e
ientes na resoluo de problemas matemti
os ou que envolvam nmeros. Como exemplo de um algoritmo matemti
o, vamos
onsiderar o problema de resolver uma equao do primeiro grau da
forma
ax + b = 0
A soluo desta equao
x = b/a
x b/a
imprimir
m se
m
2.3 Representao
As formas mais
omuns de representao de algoritmos so as seguintes:
Os algoritmos so expressos diretamente em linguagem
natural,
omo nos exemplos anteriores.
Linguagem Natural:
Pseudo-linguagem:
No existe
onsenso entre os espe
ialistas sobre qual seria a melhor maneira de representar um algoritmo. Atualmente a maneira mais
omum de
representar-se algoritmos atravs de uma pseudo-linguagem ou pseudo-
digo.
Esta forma de representao tem a vantagem de fazer
om que o algoritmo seja
es
rito de uma forma que est mais prxima de uma linguagem de programao
de
omputadores.
2.3.2 Fluxogramas
Esta forma de representao de algoritmos emprega vrias formas geomtri
as
para des
rever
ada uma das possveis aes durante a exe
uo do algoritmos.
37
Algoritmo 2.3:
Entrada: Notas n1 , n2 e n3 .
Sada: Resultado media do aluno
in
io
Obter as notas n1 , n2 e n3
Cal
ular mdia. Usar a frmula ((n1 + n2 + n3 )/3.0).
Se a mdia for maior que 5.0 imprimir que o aluno foi aprovado
Caso
ontrrio imprimir que o aluno foi reprovado.
Imprimir a mdia.
m
Existem algumas formas geomtri
as que usualmente so empregadas neste mtodo. Estas formas esto mostradas na Figura 2.1. Cada uma destas formas se
apli
a a uma determinada ao
omo est indi
ado na gura. Estas formas so
apenas alguns exemplos, existindo outras, no entanto, nesta apostila estas sero
su
ientes para os exemplos que sero mostrados.
Incio e Fim de Fluxograma
Processamento
Ponto de Deciso
Impresso de Resultados
2.3.3 Pseudo-Linguagem
Este modo de representar algoritmos pro
ura empregar uma linguagem que esteja o mais prximo possvel de uma linguagem de programao de
omputadores de alto nvel, mas evitando de denir regras de
onstruo gramati
al muito
rgidas. A idia usar as vantagens do emprego da linguagem natural, mas
restringindo o es
opo da linguagem. Normalmente estas linguagens so verses
ultra reduzidas de linguagens de alto nvel do tipo Pas
al ou C. O algoritmo 2.2
foi es
rito em uma pseudo-linguagem. A maioria destas linguagens so muito
pare
idas e tm a vantagem de serem fa
ilmente entendidas. Vamos apresentar
38
Incio
Obter a
Obter b
Sim
a =0
No
No h razes
reais
x=-b/a
Imprime x
Fim
39
Algoritmo 2.4:
notas.
L primeira nota
ler
notaAluno
maiorN ota notaAluno
L segunda nota
ler notaAluno
se notaAluno >
m se
m se
imprimir
m
40
Observe que no modelo de von Neumann instrues e dados
am na memria. Considere a ltima instruo do programa que pede para que os dados
da posio 10 (a) e 11 (b) sejam somados e o resultado armazenado na posio
12 (c). Para exe
utar esta instruo, o
omputador faz as seguintes operaes
na memria:
1. ler a instruo no endereo 2;
2. ler o dado a na posio 10;
3. ler o dado b na posio 11;
4. es
rever o resultado da soma no endereo 12.
Portanto, temos 3 leituras e uma es
rita. Destas operaes, a primeira
uma leitura de instruo e as restantes operaes
om dados.
a<-2
b<-8
12
13
14
15
c<-a+b
9
10
11
10
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Endereo
Endereo
Endereo
Endereo
Endereo
Endereo
0: Instruo a <--2
1: Instruo b <--8
2: Instruo c <--a+b
10: Dado a
11: Dado b
12: Dado c
a, b
imprimir
x1, x2
Notar que os textos entre aspas indi
am um texto que deve ser impresso no
perifri
o de sada sem nenhuma modi
ao. Vamos
onsiderar que as variveis
destes exemplos valem x = 10, x1 = 5 e x2 = 8. Os trs
omandos mostrariam
no perifri
o de sada os seguintes resultados:
2.5.3 Expresses
Expresses so usadas para denir os
l
ulos requeridos pelo algoritmo, por
exemplo b/a. Iremos dis
utir dois tipos bsi
os de expresses: expresses aritmti
as e expresses lgi
as.
Expresses manipulam dados dentro dos algoritmos. Uma pergunta importante neste momento : que tipo de dados poderemos manipular? As linguagens
de programao normalmente estabele
em regras pre
isas para denir que tipos
de dados elas iro manipular. Nesta dis
usso vamos estabele
er, ainda que
informalmente, algumas regras que limitam os
onjuntos de dados existentes na
Matemti
a e estabele
em que dados podero ser manipulados pelos algoritmos.
Isto o
orre porque os
omputadores possuem limitaes que os impedem de manipular todos os tipos de dados que um ser humano pode tratar. Mais adiante,
quando formos estudar a linguagem C iremos apresentar mais formalmente as
regras desta linguagem para estas representaes. Existem trs tipos bsi
os de
dados que iremos dis
utir:
Dados numri
os:
so os dados representados por
ara
teres. Como
ara
teres podem ser letras, algarismos e sinais diversos estes dados re
ebem
este nome.
43
+3
3
-324
-50
So exemplos de nmeros reais:
+0.5
0.5
-8.175
2.0
Dados alfa-numri
os servem para tratamento de textos e normalmente so
ompostos por uma seqn
ia de
ara
teres
ontendo letras, algarismos e
ara
teres de pontuao. Nos algoritmos so normalmente representados por uma
seqn
ia de
ara
teres entre aspas, por exemplo:
Linguagem de programao
Qual o seu nome?
12345
Dados lgi
os so intensamente apli
ados durante o pro
esso de tomada
de de
ises que o
omputador frequentemente obrigado a fazer. Em muitos
textos este tipo de dados tambm
hamado de tipo de dados booleanos, devido
a George Boole, matemti
o que deu ao nome lgebra (lgebra booleana) que
manipula este tipo de dados. Os dados deste tipo somente podem assumir
dois valores: verdadeiro e falso. Computadores tomam de
ises, durante o
pro
essamento de um algoritmo, baseados nestes dois valores. Por exemplo,
onsidere a de
iso abaixo:
se
a = 0 ento
imprimir
seno
x b/a
imprimir
m se
Neste algoritmo apare
e a expresso a = 0, que pro
ura des
obrir se o valor
de raiz igual a 0. Esta expresso somente pode ter
omo resultado os valores:
verdadeiro ou falso. Nos nossos algoritmos estes valores sero representados por
verdadeiro e falso.
44
Expresses Aritmti as
Para os nossos exemplos ini
iais iremos adotar os operadores aritmti
os binrios mostrados na Tabela 2.1. A
oluna prioridade indi
a a prioridade relativa
dos operandos. O menor nmero indi
a a maior prioridade. Quando temos
dois operandos de mesma prioridade o
omputador ir exe
utar primeiro a operao mais esquerda. Em
omputao, as expresses devem ser es
ritas em
linhas e para alterar a prioridade deve-se usar parnteses. Maiores detalhes
sobre expresses sero apresentados no Captulo 5. No momento, estamos apenas apresentando alguns
on
eitos bsi
os para fa
ilitar a dis
usso de alguns
algoritmos.
Operador
/
*
%
+
-
Des rio
Diviso
Multipli
ao
Mdulo (resto da diviso de
operandos inteiros)
Soma
Subtrao
Prioridade
0
0
0
1
1
b 4ac
1
1
1+ a+b
Expresso em
Pseudo-linguagem
a/(b+
)
(a+b)/(
+d)
b*b-4*a*
1/(1 + 1/(a+b))
da seta. A direo da seta no pode ser alterada. No
aso da ltima expresso temos que o valor atual de i in
rementado e depois substitui este valor,
portanto, se ele valia 10, ao nal da instruo ele vale 11.
Algoritmando
Falso
Condio
Verdadeiro
Faa isto
Faa aquilo
Continuo
algoritmando
Algoritmo 2.6:
se
Comando se em pseudo-linguagem
seno
Faa aquilo
m se
seno
vou praia
m se
Nem sempre nos algoritmos pre
isamos de duas alternativas. As vezes pre
isamos somente de de
idir se devemos fazer algo ou no Por exemplo, vamos
assumir que de
idimos ir ao
inema no domingo
hova ou faa sol. No entanto,
pre
iso de
idir se levo um guarda-
huva. O algoritmo para este
aso est mostrado no Algoritmo 2.8. Observe que no
aso de no estar
hovendo nada pre
isa
ser feito. A Figura 2.5 mostra esta de
iso em forma de uxograma.
Algoritmo 2.8:
Vou ao inema
Passo 1:
Passo 2:
Vestir para
ir ao cinema
Falso
Chovendo?
Verdadeiro
Pegar
guarda-chuva
Ir ao
cinema
48
Algoritmo 2.9:
ou no.
Entrada:
Sada: Se
in
io
10 nmeros, (numero).
o nmero par ou no
totalN umeros 10
enquanto totalN umeros > 0 faa
ler numero
se numero%2 = 0 ento
imprimir numero, par
seno
imprimir
m se
numero, impar
m enqto
m
49
Algoritmando
Falso
Testa
Condio
Verdadeiro
Bloco de comandos
do enquanto
Continuo
algoritmando
Uma soluo possvel para este exemplo est mostrada no algoritmo 2.13.
Este algoritmo faz o seguinte. Pega a primeira temperatura e a anota
omo a
maior j en
ontrada. A partir da o algoritmo
a repetidamente lendo temperaturas dos registros do es
ritrio
omparando
om a temperatura que no
50
Algoritmo 2.11:
25 alunos.
totalAlunos 25
maiorN ota 0.0
enquanto totalAlunos > 0 faa
ler notaAluno
se notaAluno > maiorN ota ento
maiorN ota notaAluno
m se
totalAlunos totalAlunos 1
m enqto
imprimir
m
Algoritmo 2.12:
25 alunos.
totalAlunos 25
i0
somaN otas 0.0
enquanto i < totalAlunos faa
ler notaAluno
somaN otas somaN otas + notaAluno
ii+1
m enqto
m
51
J li uma temperatura
totalT emperaturas totalT emperaturas 1
52
2.1:
2.2: Assuma que o trabalhador do exer
io anterior deve pagar 10% de imposto
se o seu salrio anual for menor ou igual a R$ 12000.00. Caso o salrio seja maior
que este valor o imposto devido igual a 10% sobre R$ 12000.00 mais 25% sobre
o que passar de R$ 12000.00. Es
reva um programa que
al
ule o imposto devido
pelo trabalhador.
2.3: Es
reva um algoritmo que des
ubra a maior nota de uma turma de alunos.
O tamanho da turma deve ser o primeiro dado pedido ao usurio.
2.4:
Nos exer
ios anteriores assumimos que os usurios sempre digitam uma
nota entre 0 e 10. Vamos assumir agora que o usurio sempre digita um nmero,
mas este nmero pode estar fora do intervalo 0 a 10. Ou seja, poderemos ter
uma nota menor que zero ou maior que 10. Modique o algoritmo anterior
para que ele verique a nota digitada e,
aso o aluno tenha digitado uma nota
invlida, uma mensagem avisando o usurio seja impressa e uma nova nota seja
pedida. O algoritmo deve insistir at que o usurio digite um valor vlido.
2.5:
Es reva um algoritmo que leia trs nmeros e os imprima em ordem res ente.
2.7:
2.8: Es
reva um algoritmo que leia um nmero inteiro entre 100 e 999 e imprima
na sada
ada um dos algarismos que
ompem o nmero. Observe que o nmero
lido
om um valor inteiro, e, portanto, ele tem de ser de
omposto em trs
nmeros: os algarismos das
entenas, dezenas e unidades.
2.9:
2.10: Es
reva um algoritmo que leia duas datas em dia, ms e ano e imprima
a data mais re
ente.
2.11: Um aluno est es
revendo um programa que l uma nota no intervalo
entre 0 e 100, in
lusive. Foi pedido ao aluno que o programa a
eite as notas
vlidas e rejeite as invlidas. Marque a letra que mostra a expresso que falta
no tre
ho pontilhado do algoritmo mostrado em 2.14.
in
io
imprimir Entre
om a nota
ler nota
se .............. ento
imprimir Nota invlida
seno
imprimir Nota vlida
m se
m
Considere que os valores -3, -4 e -5, nesta ordem, foram forne
idos ao
algoritmo 2.15:
2.11:
Algoritmo 2.15:
Dados:
in
io
ler
maior ento
maior t2
m se
se t3 >
maior ento
maior t3
m se
imprimir
m
(maior)
Marque a letra que indi
a o que foi impresso em
ada vez que o programa
foi exe
utado.
(a) 0
(b) -3
(
) -4
(d) -5
(e) nenhuma das respostas anteriores.
54
Captulo 3
Tipos de Dados, Constantes e
Variveis
3.1 Introduo
Variveis e
onstantes so os elementos bsi
os que um programa manipula.
Uma varivel
orresponde a um espao reservado na memria do
omputador
para armazenar um determinado tipo de dado. Variveis devem re
eber nomes para poderem ser mais fa
ilmente referen
iadas e modi
adas sempre que
ne
essrio. Muitas linguagens de programao exigem que os programas de
larem todas as variveis antes que elas possam ser usadas. Estas de
laraes
espe
i
am de que tipo so as variveis usadas pelos programas e as vezes um
valor ini
ial. Tipos podem ser por exemplo: inteiros, reais,
ara
teres, et
. As
expresses
ombinam variveis e
onstantes para
al
ular novos valores.
O valor armazenado um
ara
tere. Cara
teres geralmente so armazenados em
digos (usualmente o
digo ASCII). A Tabela A.1 mostra
este
digo. Cara
teres so armazenados em um byte.
int:
oat:
double:
void:
Este tipo serve para indi
ar que um resultado no tem um tipo denido. Uma das apli
aes deste tipo em C
riar um tipo vazio que pode
posteriormente ser modi
ado para um dos tipos anteriores.
unsigned:
Este modi
ador tambm pode ser apli
ado aos tipos int e
har. O
uso de signed
om int redundante.
signed:
long:
Modi
ador que pode ser apli
ado aos tipos int e double aumentando o
nmero de bytes reservado para armazenamento de dados.
possvel
ombinar estes modi
adores de diversas maneiras
omo est mostrado na Tabela 3.1 que lista os tipos bsi
os denidos no padro ANSI e a sua
ex
urso.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
dgito_sem_zero:
dgito_o
tal:
1, 2, 3, 4, 5, 6, 7, 8, 9
0, 1, 2, 3, 4, 5, 6, 7
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B,
, C, d, D,
e, E, f, F
dgito_hexa:
sinal:
+, 56
Tipo
Bytes
Faixa Mnima
1
1
1
4
4
4
2
2
2
4
4
4
-127 a 127
0 a 255
-127 a 127
-2.147.483.648 a 2.147.483.647
0 a 4.294.967.295
-2.147.483.648 a 2.147.483.647
-32.768 a 32.767
0 a 65.535
-32.768 a 32.767
-2.147.483.648 a 2.147.483.647
-2.147.483.648 a 2.147.483.647
0 a 4.294.967.295
-9.223.372.036.854.775.808 a
9.223.372.036.854.775.807
-9.223.372.036.854.775.808 a
9.223.372.036.854.775.807
8
4
8
12
0 a 18.446.744.073.709.551.615
oito dgitos de pre
iso
16 dgitos de pre
iso
16 dgitos de pre
iso
har
unsigned
har
signed
har
int
unsigned int
signed int
short int, short
unsigned short int
signed short int
long int, long
signed long int
ponto_de
imal:
suxo:
sufixo_sem_sinal, sufixo_longo
suxo_sem_sinal:
suxo_longo:
u, U
l, L
suxo_utuante:
f, F, l, L
O uso destas ara teres ser mostrado om exemplos nas sees seguintes.
[sinaldgito_sem_zero{dgito}[sufixo_sem_sinal|sufixo_longo
Esta notao deve ser entendida da seguinte maneira. Col
hetes indi
am
opo, portanto, o fato de sinal (+ ou -) estar entre
ol
hetes signi
a que um
nmero inteiro pode ou no ter sinal, isto o sinal op
ional. Em seguida temos
57
1997
1997U
1234L
1997UL
134LL
1997ULL
Constantes
-3
45u
1997L
45Lu
1997Ll
45LLu
+5
12345U
-3l
23Ul
-3ll
23Ull
7
0U
+0L
0LU
+0LL
0LLU
0 {dgito_o
tal}[sufixo_sem_sinal|sufixo_longo
Na Tabela 3.3 mostramos exemplos de
onstantes o
tais e o seu valor na base 10.
Nmeros es
ritos na base 8 somente podem ser es
ritos
om algarismos entre 0
e 7 in
lusive.
58
Base 8
Base 10
025
077
011
010ul
0175
21
63
9
8
125
[0x|0Xdgito_hexa{dgito_hexa}[sufixo_sem_sinal|sufixo_longo
Na Tabela 3.4 mostramos exemplos de
onstantes hexade
imais e o seu valor
na base 10. Para es
rever
onstantes na base 16 usamos todos os algarismos e
ainda as letras A (ou a), B (ou b), C (ou
), D (ou d), E (ou e), F (ou f), que
representam respe
tivamente os seguintes valores 10, 11, 12, 13, 14 e 15.
Base 16
Base 10
0xF
0X25
0XAB
0XBEEF
15
37
171
48879
(3.1)
Esta equao est es
rita na base 10. Por exemplo, apli
ando a equao 3.1
para
onverter o nmero 0175 da base 8 para a base 10
amos
om
(0175)8 = 1 82 + 7 81 + 5 80 = (125)10
59
(3.2)
Vamos
onsiderar a
ontante inteira (3AF )16 . Apli
ando a frmula 3.2 temos
(3AF )16 = 3 162 + 10 161 + 15 160 = (943)10
O algoritmo para
onverter um nmero inteiro da base 10 para uma determinada base b feito por um
onjunto de divises su
essivas do nmero pela base
at que o resultado da diviso seja 0. O Algoritmo 3.1 mostra
omo
onverter
um nmero (N )10 para uma base b. importante notar que os algarismos na
base b vo sendo impressos na ordem inversa, do menos signi
ativo para o mais
signi
ativo. Por exemplo,
aso forneamos para o algoritmo o nmero (943)10
e a base 16, o algoritmo iria imprimir os resultados 15, 10 e 3 nesta ordem. Isto
orresponderia aos seguintes dgitos da base 16: F, A e 3 e, portanto, a resposta
seria (3AF )16 .
Algoritmo 3.1:
base b.
(baseb).
inteira) ou aps (a parte fra
ionria), mas nun
a os dois grupos. possvel
es
rever um nmero em ponto utuante sem ponto, desde que um expoente seja
usado. Portanto, os nmeros .8, 1234., 1E1 so nmeros de ponto utuante.
Para mostrar mais formalmente
omo se deve es
rever as
onstantes de ponto
utuante vamos usar a mesma notao usada at aqui, mas usando uma hierarquia de denies para fa
ilitar o entendimento. Primeiro damos uma denio
mais geral que vai sendo mais detalhada a medida que avanamos. Lembrar
que termos entre
haves podem ser repetidos 0 ou mais vezes e termos entre
ol
hetes so op
ionais.
Portanto, usando a forma hierrqui
a, uma
onstante de ponto utuante
(CPF) pode ser denida das seguintes maneiras:
CPF = [sinalfrao[expoente[sufixo_flutuante
CPF = [sinalseq_dgitos expoente[sufixo_flutuante
A seguir denimos
ada um dos
omponentes. Uma frao denida
omo:
expoente = [e | E[sinalseq_dgitos
seq_dgitos = dgito{dgito}
A Tabela 3.5 mostra exemplos de
onstantes em ponto utuante.
Des
rio
Nmero
+23.45e-10
123.45
123.45E+10
123.45F
123.
Cara tere
'a'
'A'
'\0141'
'('
'9'
'\n'
Signi ado
ara
tere a
ara
tere A
Constante o
tal
orrespondente ao
ara
tere 'a'
ara
tere abre parnteses
algarismo 9
Nova linha, posi
iona o
ursor no in
io da nova linha.
Tabela 3.6: Exemplos de
onstantes
ara
tere
Cara tere
'\n'
'\t'
'\b'
'\f'
'\r'
'\a'
'\0'
Signi ado
3.5 Variveis
Variveis so nomes dados para posies de memria a m de fa
ilitar o manuseio dos dados durante a
riao dos programas. Os dados podem ser de
62
boa polti
a es
olher nomes que indiquem a funo da varivel. Por exemplo:
soma
mediaNotas
total
salarioMensal
nome
taxa_imposto
raio
_ini
io
lista_de_variveis;
int i ;
unsigned int a , b ,
;
unsigned short int dia ,
f l o a t raio , diametro ;
double salario ;
mes , ano ;
int i = 0 , j = 10;
f l o a t raio = 2.54;
har
= 'd ';
double pre
isao = 0.00001 L ;
A seguir mostramos um tre
ho de programa
om exemplos de atribuio de
valores aps a denio das variveis.
int i , j ;
f l o a t raio ;
har
;
i = 0;
j = 10;
raio = 2.54;
= 'd ';
64
dos.
3.2:
tempo
nota_final
us$
har
(e)
(f)
(g)
(h)
2dias
teste 1
raio.do.
ir
ulo
DiaHoje
3.3: Indique quais dos nmeros abaixo so
onstantes inteiras (longas ou no)
vlidas. Justique suas respostas.
(a) 100
(e) - 234
(b) 2 345 123 (f) 0L
(
) 3.0
(g) 21
(d) -35
(h) 0xF1
3.4:
3.5:
025
0123
0xD
0x1D
3.6: Indique na tabela 3.8 os tipos que vo
usaria para armazenar os dados
indi
ados.
Marque a opo que indi a quantos dos nmeros abaixo representam resultados da operao (175)8 + (AB)16 .
3.7:
65
Des rio
66
Tipo da varivel
Captulo 4
Entrada e Sada pelo Console
4.1 Introduo
Neste
aptulo vamos apresentar
on
eitos bsi
os de entrada e sada de dados
para que os exemplos e exer
ios ini
iais possam ser
onstrudos. Um programa
que no forne
e resultados nem pede valores para operar no deve ter grande
utilidade. A entrada de dados ser feita pelo te
lado e a sada poder ser vista
na tela do
omputador. Em C, quando um programa se ini
ia, normalmente trs
uxos (arquivos) de dados so abertos para operaes de entrada e sada: um
para entrada, um para sada e um para imprimir mensagens de erro ou diagnsti
o. Normalmente o uxo de entrada est
one
tado ao te
lado, enquanto que
o uxo de sada e o de mensagens de erro, para serem visualizados, esto
one
tados ao monitor. Estas
onguraes podem ser alteradas de a
ordo
om as
ne
essidades dos usurios e estas operaes so
hamadas de redire
ionamento.
O uxo de entrada
hamado de entrada padro (standard input); o uxo de
sada
hamado de sada padro (standard output) e o uxo de erros
hamado
de sada padro de erros (standard error output). Estes termos so substitudos
pelas suas formas abreviadas: stdin, stdout e stderr.
#in lude
<stdio.h>
no in
io do programa.
A diretiva #in
lude instrui o
ompilador a ler o arquivo indi
ado entre '<'
e '>', e pro
ess-lo
omo se ele fosse parte do arquivo original e seu
ontedo
estivesse no ponto onde a diretiva foi es
rita. Se o nome do arquivo estiver
entre os sinais de maior e menor,
omo no exemplo, ele ser pro
urado em
um diretrio espe
o de lo
alizao pr-denida, onde esto os arquivos de
67
in
luso. Quando se usa aspas o arquivo pro
urado de maneira denida pela
implementao, isso pode signi
ar pro
urar no diretrio de trabalho atual,
ou em um diretrio indi
ado no
omando usado para
ompilar o programa.
Normalmente os programadores usam maior e menor para in
luir os arquivos
de
abealho padro e aspas para a in
luso de arquivos do prprio projeto.
int
68
%
%d
%i
%E
%e
%f
%G
%g
%o
%s
%u
%x
%X
%p
%%
Comentrio
largura: Caso seja usado um nmero inteiro, este espe
i
a o tamanho mnimo
do
ampo onde o argumento ser impresso. Na listagem 4.2 o nmero
espe
i
a que 8 espaos so reservados para imprimir o resultado. Os
espaos livres sero
ompletados
om espaos em bran
o. Se o argumento
pre
isar de mais espao que o espe
i
ado ele ser es
rito normalmente e
o tamanho mnimo ignorado.
.pre
iso Este nmero tem diferentes signi
ados dependendo do
digo usado.
No
aso de impresso de
adeia de
ara
teres (s), este nmero espe
i
a o nmero mximo de
ara
teres de uma
adeia de
ara
teres a serem impressos.
ara teres:
ponto utuante:
No formatos inteiros (d, i, o, u, x, X) a pre
iso espe
i
ou o nmero mximo de dgitos a serem impressos. Se o nmero de
ara
teres a serem impressos menor que este o resultado
ompletado
om bran
os. O valor no trun
ado
inteiros:
return
0;
O resultado e = 0.333
.
Alo
Nos exemplos anteriores verique que '\n' no impresso. A barra in
linada
hamada de seqen
ia de es
ape, indi
ando que o prximo
ara
tere no para
70
return
0;
ser impresso mas representa
ara
teres invisveis ou
ara
teres que no esto
representados no te
lado. Esta seqn
ia de es
ape indi
a que o programa deve
passar a imprimir na prxima linha.
Uma diferena fundamental que existe entre esta funo e a funo printf
est nos argumentos que vm depois do
ontrole. No
aso de s
anf os argumentos so os endereos das variveis que iro re
eber os valores lidos e no,
omo em printf, as prprias variveis. A indi
ao que estamos referen
iando
um endereo e no a varivel se faz pelo operador &. Por exemplo, o
omando
s
anf("%d %d", &a, &b);
espera que dois valores inteiros sejam digitados no te
lado. O primeiro armazenado na varivel a e o segundo em b. Os valores sero armazenados diretamente
nos endereos indi
ados por &a e &b respe
tivamente.
Um outro exemplo in
luindo variveis reais :
int i ;
float x;
34 56.43
a exe
uo do exemplo iria terminar
om o valor inteiro 34 sendo armazenado
na varivel i e o valor real 56.43 em x.
Usualmente o
ampo de
ontrole s
ontm espe
i
aes de
onverso,
omo
os listados na Tabela 4.3.1, que so utilizadas para interpretar os dados que sero
71
lidos, no entanto,
omo em printf, outros
ara
teres podem apare
er. O
ampo
de
ontrole pode
onter:
A funo l e ignora todos os
ara
teres bran
o e/ou
<enter> e/ou tab que apare
erem antes de qualquer
ara
tere diferente
destes.
(no %) que devem
asar
om o prximo
ara
tere diferente de bran
o da entrada. Isto signi
a que qualquer
ara
tere que no
for igual a bran
o e/ou <enter> e/ou tab ou parte de um espe
i
ador de
formato faz
om que a funo leia o prximo
ara
tere da entrada (stdin)
e se for igual a este ele des
artado. Caso os
ara
teres sejam diferentes
a funo falha e retorna deixando os
ara
teres seguintes no lidos.
O modelo o seguinte:
%{*}{largura}{modifi
adores}tipo
O
ara
teres entre
haves so op
ionais. O asteris
o indi
a que o dado ser lido
de stdin mas ignorado. A largura espe
i
a o nmero mximo de
ara
teres a
serem lidos.
Os modi
adores alteram o tamanho do espe
i
adores de tipo que vm logo
a seguir. Existem os seguintes modi
adores:
h:
l:
L:
Por exemplo, para que os valores digitados sejam separados por vrgulas, o
omando deveria ser es
rito da seguinte maneira:
s
anf("%d, %f", &i, &x);
Observar que deve haver uma
orrespondn
ia exata entre os
ara
teres no
bran
os do
ontrole e os
ara
teres digitados. Neste
aso a entrada deveria ser:
35, 46.3
O programa 4.4 mostra exemplos de uso da funo s
anf.
O resultado da exe
uo deste programa :
Entre
om um
ara
tere qualquer.
d
Codigo ASCII do
ara
tere d vale 100.
Agora dois inteiros separados por espa
o.
2 4
A soma destes numeros vale 6.
A funo s
anf retorna o nmero de itens lidos
om su
esso. Este nmero
pode ser usado para veri
ar se todos os valores pedidos foram lidos. No
aso
de o
orrer uma falha antes da leitura se ini
iar a
onstante EOF retornada.
72
int
int
return
0;
seguida o programa ir imprimir o nmero 35, lido no s
anf, e apenas uma linha
em bran
o
orrespondente ao
ara
tere <enter>, lido pelo get
har,
omo est
indi
ado a seguir. Mais adiante mostraremos
omo resolver este problema.
ada um deles pode ser a
essado independentemente dos outros por meio de
um endereo. Nesta etapa iremos apresentar rapidamente alguns
on
eitos que
nos permitiro
riar alguns exemplos simples
om
adeias de
ara
teres. Para
usar
adeias pre
iso primeiro denir um espao para armazen-las. Para isto
pre
iso de
larar o nome, o tamanho e o tipo do vetor. Considere que pre
isamos armazenar uma
adeia de
ara
teres
hamada nome
om 40
ara
teres. A
denio desta
adeia
aria da seguinte maneira:
har
nome [41;
Quando denir o tamanho do vetor de
ara
teres, observar que toda
adeia
em C termina
om o
ara
tere NULL ('\0'), que automati
amente inserido
pelo
ompilador. Portanto o vetor nome deve ser denido
om um espao a
mais. Aps este passo, o vetor nome pode ser usado durante a exe
uo do
programa.
#define DIM 40
#in
lude < stdio .h >
int main ( void ) {
har nome [ DIM ;
Considere que este programa se
hama util. Uma possvel interao entre
este programa e um usurio poderia ser da seguinte maneira.
$ util
Por favor, qual o seu nome?
Ze Sa
Sou um
omputador. Posso ajuda-lo Ze?
O smbolo $ o prompt tpi
o dos sistemas Unix. Aparentemente o
omputador se tornou ntimo do usurio Ze Sa e o tratou apenas pelo primeiro nome. A
expli
ao para esta intimidade est no modo de leitura. Quando se usa s
anf
para ler uma
adeia deve-se empregar o
digo de
onverso %s. Este
omando
no l o nome todo, mas en
erra a leitura dos
ara
teres quando en
ontra um
75
ara
tere espao (ou bran
o), ou seja o separador de
adeias no
omando s
anf
o
ara
tere espao. Mas
omo ler para um vetor um nome inteiro, ou um
adeia que
ontenha bran
os? Para isto deve-se usar a funo gets que ser
nosso prximo assunto.
* str ) ;
#define DIM 41
#in
lude < stdio .h >
int main ( void ) {
har nome [ DIM ;
ignora o limite e
ontinua lendo valores at que o usurio digite o
ara
tere
<enter>.
Para evitar este problema re
omenda-se o emprego da funo fgets
ujo
prottipo
* str ,
int
A funo fgets l no mximo um
ara
tere a menos que o nmero de
ara
teres espe
i
ado no parmetro tam a partir do uxo de entrada de dados
denido por fluxo. No
aso de leitura do te
lado,
omo temos feito, uxo
igual a stdin. A leitura interrompida quando um
ara
tere <enter> en
ontrado ou o nal do arquivo foi atingido. Diferentemente do que o
orre na
funo gets, aqui o
ara
tere <enter> armazenado no vetor onde os demais
ara
teres esto sendo guardados. O
ara
tere nulo adi
ionado aps o ltimo
ara
tere lido.
A funo retorna str
aso seja bem su
edida. Se o nal do arquivo for
atingido e nenhum
ara
tere tiver sido lido, o vetor str permane
e inalterado
e um ponteiro nulo retornado. Caso o
orra um erro de leitura o
ontedo do
vetor
a indeterminado e um ponteiro nulo retornado.
77
4.2:
4.3: Faa um programa que leia um valor inteiro no formato de
imal e es
reva,
na tela, este mesmo valor nas bases hexade
imal e o
tal.
4.4:
Faa um programa que leia trs palavras de at 10 letras e rees
reva estas
palavras alinhadas direita da tela.
4.5:
4.6: Sabendo que os argumentos da funo printf podem ser expresses (a+b,
a/b, a*b, 3*a...), e no somente argumentos, faa um programa
apaz de ler
um valor inteiro e es
rever seu triplo, seu quadrado, e a sua metade.
Faa um programa que pea ao usurio a quilometragem atual, a quilometragem anterior, os litros
onsumidos e informe a taxa de
onsumo (quilmetros
por litro) de um automvel.
4.9:
4.10:
4.11:
rea.
Faa um programa que utilize a funo gets para ler duas
adeias de
tamanho at 20 e em seguia s rees
reva na linha de baixo, uma ao lado da
outra e separadas por "/-/ ";
4.12:
78
Captulo 5
Operadores e Expresses
5.1 Introduo
O objetivo deste
aptulo apresentar os operadores existentes na linguagem
C e a forma
orreta de
onstruir expresses que envolvam estes operadores,
onstantes e variveis.
soma = a + b;
pi = 3.1415;
possvel fazer-se vrias atribuies em uma ni
a linha,
omo no exemplo
a seguir:
a = b =
= 1.0;
as trs variveis re
ebem o mesmo valor. As atribuies so feitas na seguinte
ordem:
1.
= 1.0;
re
ebe o valor 1.0.
2. b re
ebe o resultado da expresso sua direita, que o valor atribudo
, ou seja 1.0.
3. a re
ebe o resultado da expresso sua direita, que o valor atribudo
b, ou seja 1.0.
79
+
++
*
/
%
+
-
Des
rio
Mais unrio
Menos unrio
In
remento
De
remento
Multipli
ao
Diviso
Resto da diviso
Soma
Subtrao
Prioridade
0
0
1
1
2
2
2
3
3
1. a +
b
b+c
= a + b/(b+ )
2. b2 + c2 = b*b +
*
3.
x
a+ cb
= x/(a+b/ )
>=
>
<=
<
==
!=
Des rio
Maior ou igual a
Maior que
Menor ou igual a
Menor que
Igual a
Diferente de
Prioridade
0
0
0
0
1
1
int i = 3 , j =
f l o a t z = 3.0;
int resultado ;
-5;
p
0
0
1
1
q
0
1
0
1
p && q
0
0
0
1
OU lgi o
f l o a t x = 3.0;
int n = 55 , i =
int resultado ;
0;
p
0
0
1
1
q
0
1
0
1
p || q
0
1
1
1
No lgi o
int
int
p
0
1
!p
1
0
!
>, >=, <, <=
==, !=
&&
||
Prioridade
0
1
2
3
4
83
Des rio
Prioridade
~
&
^
|
0
0
1
2
3
4
p
0
0
1
1
q
0
1
0
1
p ^ q
0
1
1
0
vezes:
operando
vezes:
Observaes:
Nos deslo
amentos direita em variveis unsigned e nos deslo
amentos
esquerda, os bits que entram so zeros;
Nos deslo
amentos direita em variveis signed, os bits que entram
orrespondem ao sinal do nmero (1= sinal negativo, 0 = sinal positivo).
84
Um deslo
amento para a direita equivalente a uma diviso por 2. Deslo
amento para a esquerda equivalente a uma multipli
ao por 2. Assim
a = a * 2; e a = a 1; so equivalentes.
= 7;
return
0;
14 = 0000000E
7 = 00000007
-14 = FFFFFFF2
-7 = FFFFFFF9
Os resultados mostram que o nmero 7 aps o primeiro deslo
amento de 1
bit para a esquerda
ou igual a 14, portanto um 0 entrou no nmero. Quando
o nmero foi deslo
ado para direita 1 bit, ele retornou ao valor original. Observe
que quando o nmero -14 foi deslo
ado para a direita entrou um bit 1, que
igual ao sinal negativo.
ano += 10;
Outros exemplos so:
85
raiz = raiz * 4;
raiz *= 4;
soma = soma / ( a + b);
soma /= (a + b);
a = a 1;
a = 1;
i = i % 2;
i %= 2;
Tamanho
Tamanho
Tamanho
Tamanho
Tamanho
Tamanho
em
de
do
do
do
do
86
#define DIM 10
#in
lude < stdio .h >
#in
lude <
onio .h >
int main () {
int i =0;
f l o a t f =3.0;
har
= 'a ';
int v [ DIM ;
l = l - 'A' + 'a';
A letra mais
ula armazenada na varivel l subtrada do
digo da letra
mais
ula 'A', forne
endo a posio desta letra no alfabeto. Em seguida este
valor somado ao
digo da letra mins
ula 'a', resultando da
onverso para
mins
ula.
Portanto,
onverses aritmti
as o
orrem de maneira quase que natural. Em
operaes binrias as seguintes
onverses o
orrem quando diferentes tipos esto
envolvidos:
har
onvertido para int;
float
onvertido para double.
5.10
A Tabela 5.10 mostra, em ordem de
res
ente de prioridade, as regras de pre
edn
ia dos operadores em C. Os operadores que esto na mesma linha da tabela
e
om a mesma ordem tm a mesma prioridade. Alguns dos operadores listados
na Tabela somente sero mostrados nos
aptulos seguintes.
Pri
0
1
1
2
3
4
5
6
7
8
9
10
11
12
13
13
14
Operador
() [ -> .
! ++ * &
(tipo) sizeof()
* / %
+
< <= >= >
== !=
&
^
|
&&
||
? () : ()
= += -= *= /= %=
= = &= |=
,
Des rio
88
1. (a/b)*(
/d)
2. (a/b*
/d)
3. (a/(b*
)/d)
4. a*x*x+b*x+
5.2:
1. b2 4 b c
2.
3.
1
1+
1+
a+b
c+d
4. a
5.3:
1
1
1+x
x
c+d
1. x = 5 * 4 / 6 + 7;
2. x = 5 * 4.0 / 6 + 7;
3. x = 5 * 4 % 6 + 7;
4. x = ((4 / 2) + (3.0 * 5));
5.4:
sivo.
5.5:
5.6:
5.7:
5.8:
5.9: Uma empresa est sele
ionando entre seus empregados os que iro fazer um
treinamento espe
ial. O fun
ionrio sele
ionado deve satisfazer a dois
ritrios.
O primeiro
ritrio para que um fun
ionrio seja pr-sele
ionado que ele deve
ter um salrio menor ou igual a R$ 400,00 ou maior ou igual a R$ 1.000,00.
O segundo
ritrio leva em
onta o tempo de trabalho e o fun
ionrio deve ter
mais de 5 anos na empresa. Marque a resposta que indi
a a expresso lgi
a
que representa este
ritrio. Considere que existem as seguintes variveis.
89
f l o a t salario ;
int tempo ;
(a) (salario <= 400.00) && (salario >= 1000.00) && (tempo > 5)
(b) (salario <= 400.00) || (salario >= 1000.00) && (tempo > 5)
(
) ((salario <= 400.00) || (salario >= 1000.00)) || (tempo >
5)
(d) ((salario <= 400.00) || (salario >= 1000.00)) && (tempo >
5)
(e) ((salario <= 400.00) && (salario >= 1000.00)) || (tempo >
5)
90
Captulo 6
Comandos de Controle
6.1 Introduo
Este
aptulo tem por objetivo apresentar os
omandos de
ontrole da linguagem
C. Estes
omandos servem para
ontrolar o uxo de exe
uo das instrues
de um programa. Estes
omandos permitem que o
omputador tome de
ises
independentemente do usurio que est rodando o programa.
6.3.1 Comando if
O
omando if utilizado quando for ne
essrio es
olher entre dois
aminhos.
A forma geral do
omando if a seguinte:
if
( expresso )
blo
o_de_
o ma n do s 1 ;
else
blo o_de_ o ma n do s 2 ;
if
( expresso )
blo
o_de_
om a nd o s ;
if
( expresso )
blo
o_de_
o ma nd o s
e l s e i f ( expresso1 )
blo
o_de_
o m an d os 1
e l s e i f ( expresso2 )
blo
o_de_
o ma nd o s2
...
else
blo o_de_ o ma nd o sn
92
else
if
( expresso )
blo
o_de_
om a nd o s ;
e l s e i f ( expresso )
blo
o_de_
om a nd o s ;
e l s e i f ( expresso )
blo
o_de_
om a nd o s ;
...
e l s e blo
o_de_
o ma n do s ;
93
/* primeiro operando */
num2 ,
/* segundo operando */
res ; /* resultado da opera
ao */
oper ;
/*
ara
tere que define a opera
ao */
94
a es
rita de tre
hos de programa em que a seleo deve ser feita entre vrias
alternativas.
A forma geral do
omando swit
h a seguinte:
swit
h ( expresso ) {
ase
onstante1 :
seqn ia_ d e _ o ma n d os ;
ase
break ;
onstante2 :
seqn
ia_ d e _
o ma n d os ;
break ;
ase
onstante3 :
seqn
ia_ d e _
o ma n d os ;
break ;
...
default :
seqn
ia_ d e_
om a n do s ;
95
for
96
/* primeiro operando */
/* segundo operando */
/* resultado da opera
ao */
/*
ara
ter que define a opera
ao
97
/* primeiro operando */
/* segundo operando */
/* resultado da opera
ao */
for
}
for
98
main () {
int numero , fat =1 , i ;
printf ( " \ nEntre
om um numero positivo . " ) ;
s
anf ( " % d " , & numero ) ;
for ( i = numero ; i >1; i - -) fat = fat * i ;
printf ( " O fatorial de % u vale % u . " , numero , fat ) ;
return 0;
int
for
}
Laos
i,j;
( i =1 , j = 10; i <= 10; i ++ , j += 10) {
printf ( " i = %d , j = % d \ n " , i , j ) ;
for
Laos
return
for
0;
om expresses faltando
Um outro ponto importante do for que nem todas as expresses pre
isam estar
presentes. No exemplo 6.7 a varivel de
ontrole no in
rementada. A ni
a
maneira do programa terminar o usurio bater o nmero -1.
99
!= -1 ; ) {
printf ( " % d \ n " ,i ) ;
s
anf ( " % d " , & i ) ;
return
0;
i ++) {
printf ( " numero % d \ n " , i ) ;
i f ( i == 5) break ;
return
0;
Lao innito
for
( ; ; ) {
printf ( " \ nVo
e quer parar ?\ n " ) ;
= get
har () ;
i f (
== 'S ' ||
== 's ') break ;
100
Laos
for
aninhados
Uma importante
onstruo apare
e quando
olo
amos
omo
omando a ser repetido um outro
omando for. Esta
onstruo pode apare
er quando estamos
trabalhando
om matrizes. O exemplo 6.9 mostra um programa que imprime
uma tabuada.
while
( expresso )
blo
o_de_
o ma nd o s
101
while
}
( i <= 100) {
printf ( " Numero % d \ n " , i ) ;
i ++;
while
do
blo
o_de_
o ma nd o s
( expresso ) ;
while
102
i = 1;
{
printf ( " Numero % d \ n " , i ) ;
i ++;
} while ( i <= 100) ;
do
for
for
desvio indi
ado por um rtulo, que um identi
ador vlido em C seguido por
dois pontos. importante notar que o
omando goto e o ponto para onde ser
feito o desvio pode estar em qualquer ponto dentro da mesma funo. A forma
geral deste
omando :
goto rtulo;
...
rtulo:
Este
omando durante muito tempo foi asso
iado a programas ilegveis. O
argumento para esta armao se baseia no fato de que programas
om
omandos goto perdem a organizao e estrutura porque o uxo de exe
uo pode
ar saltando errati
amente de um ponto para outro. Atualmente as restries
ao uso do
omando tem diminudo e seu uso pode ser admitido em alguns
asos.
return expresso;
Notar que a expresso op
ional. A
have que termina uma funo equivalente a um
omando return sem a expresso
orrespondente. possvel haver
mais de um
omando return dentro de uma funo. O primeiro que for en
ontrado durante a exe
uo
ausar o m da exe
uo. Uma funo de
larada
omo do tipo void no pode ter um
omando return que retorne um valor.
Isto no faz sentido, j que funes deste tipo no podem retornar valores.
104
6.5:
6.12:
6.13:
6.14:
105
6.15:
0 (1*0*0)
0 (1*0*1)
0 (1*0*2)
(...)
0 (1*1*0)
1 (1*1*1)
2 (1*1*2)
9*9*9=729
Faa seu programa dar uma pausa a
ada 20 linhas para que seja possvel
ver todos os nmeros pou
o a pou
o. Soli
ite que seja pressionada alguma te
la
para ver a prxima seqn
ia de nmeros.
6.16:
******
*****
****
***
**
*
6.17:
106
}
}
< 6; i ++) {
s
anf ( " % d " , & m ) ;
i f ( m % 2) {
for ( j = 0; j < m ; j ++) {
printf ( " # " ) ;
}
}
else {
for ( j = m ; j > 0; j - -) {
printf ( " * " ) ;
}
}
printf ( " \ n " ) ;
return
0;
107
Captulo 7
Vetores e Cadeias de
Cara
teres
7.1 Introduo
Vetores so usados para tratamento de
onjuntos de dados que possuem as
mesmas
ara
tersti
as. Uma das vantagens de usar vetores que o
onjunto
re
ebe um nome
omum e elementos deste
onjunto so referen
iados atravs
de ndi
es. Pelo nome vetor estaremos referen
iando estruturas que podem
ter mais de uma dimenso,
omo por exemplo matrizes de duas dimenses.
Neste
aptulo estaremos mostrando vetores de tamanhos xos. Somente aps
apresentarmos ponteiros iremos abordar alo
ao de memria para vetores.
onde tipo um tipo qualquer de dados, nome o nome pelo qual o vetor vai
ser referen
iado e tamanho o nmero de elementos que o vetor vai
onter.
Observar que em C o primeiro elemento tem ndi
e 0 e o ltimo tamanho - 1.
Exemplos de de
laraes de vetores so:
sizeof(tipo)
#define DIM 5
#in
lude < stdio .h >
int main ( void ) {
int vetor [ DIM ;
unsigned int i ,
num ;
return
0;
109
v[0
v[1
v[2
v[3
v[4
v[4
20
15
15
15
15
15
15
15
15
20
20
8
8
8
8
8
8
8
8
20
20
12
12
12
12
12
12
12
12
20
20
5
5
5
5
5
5
5
5
20
v[1?
v[0 e v[1
v[2?
v[1 e v[2
v[3?
v[2 e v[3
15
8
8
8
8
8
8
15
15
12
12
12
12
12
12
15
15
5
5
5
5
5
5
15
20
20
20
20
20
20
8
8
8
12
12
5
5
5
12
15
15
15
20
20
20
8
5
5
8
12
12
15
15
20
20
Operao
Passo 1
v[0 >
Tro
ar
v[1 >
Tro
ar
v[2 >
Tro
ar
v[3 >
Tro
ar
v[1?
v[0 e
v[2?
v[1 e
v[3?
v[2 e
v[4?
v[3 e
v[1
v[2
v[3
Passo 2
v[0 >
Tro
ar
v[1 >
Tro
ar
v[2 >
Tro
ar
Passo 3
110
#define DIM 5
#in
lude < stdio .h >
int
main ( void ) {
int vetor1 [ DIM , vetor2 [ DIM , i , prod =0;
printf ( " Entre
om um vetor de % d elementos \ n " , DIM ) ;
for ( i = 0; i < DIM ; i ++) {
printf ( " Elemento % d " , i ) ;
s
anf ( " % d " , & vetor1 [ i ) ;
}
printf ( " Entre
om outro vetor de % d elementos \ n " , DIM )
;
for ( i = 0; i < DIM ; i ++) {
printf ( " Elemento % d " , i ) ;
s
anf ( " % d " , & vetor2 [ i ) ;
}
for ( i = 0; i < DIM ; i ++)
prod += vetor1 [ i * vetor2 [ i ;
printf ( " O produto vale % d " , prod ) ;
return
0;
"programando em C"
No ne
essrio a
olo
ao do
ara
tere nulo ao nal da
adeia. Em C
no h o tipo
adeia (string) e, portanto,
onjuntos de
ara
teres teriam de
ser tratados
omo
onjuntos de nmeros inteiros, por exemplo. Para fa
ilitar a
programao foram
riadas algumas funes para manipular
adeias. Algumas
das funes mais
omuns esto resumidamente des
ritas a seguir:
Nas denies a seguir, size_t o tipo inteiro sem sinal que volta
omo
resultado do operador sizeof.
har *str
at(
har *dest,
onst
har *orig): Con
atena
adeia orig ao
nal de dest. O primeiro
ara
tere de orig substitui o
ara
tere nulo de
dest. A funo retorna o valor de dest.
har *strn
at (
har *dest,
onst
har *orig, size_t n): Con
atena
adeia orig ao nal de dest, usando no mximo n
ara
teres de orig. O
111
#define
#define
#define
DIM 5
FALSO 0
VERDADE 1
#in
lude
int main
int
int
do
tro
ou = FALSO ;
for ( i =0; i < fim -1; i ++) {
i f ( vetor [ i > vetor [ i +1) {
temp = vetor [ i ;
vetor [ i = vetor [ i +1;
vetor [ i +1 = temp ;
tro
ou = VERDADE ;
}
}
fim - -;
} while ( tro
ou ) ;
for
}
return
0;
112
primeiro
ara
tere de orig substitui o
ara
tere nulo de dest. A funo
retorna o valor de dest.
har *str
mp (
onst
har *
ad1,
onst
har *
ad2): Compara lexi
ogra
amente as duas
adeias. Retorna zero se as
adeias so iguais, menor
que 0 se
ad1 <
ad2, maior que 0 se
ad1 >
ad2.
har *strn
mp (
onst
har *
ad1,
onst
har *
ad2, size_t n): Compara lexi
ogra
amente at n
ara
teres das duas
adeias. Retorna zero se
as
adeias so iguais, menor que 0 se
ad1 <
ad2, maior que 0 se
ad1
>
ad2.
size_t strlen(
onst
har *
ad): Cal
ula o
omprimento da
adeia sem
ontar o
ara
a ter nulo. O
omprimento da
adeia determinado pelo
ara
tere nulo. No
onfundir o tamanho da
adeia
om o tamanho do
vetor que armazena a
adeia.
har *str
py(
har *dest,
onst
har *orig): Copia
adeia orig para
dest. A
adeia destino deve ter espao su
iente para armazenar orig.
O valor de dest retornado.
Estas funes esto na bibliote
a string.h. O programa 7.4 mostra exemplos de uso de algumas das funes de
adeia. Neste exemplo, o programa
primeiro l um nome e em seguida um sobrenome. O programa ir ento
on
atenar as duas
adeias. Observe que sempre
olo
ado um bran
o ao nal
do nome para separ-lo do sobrenome. Este bran
o inserido usando a funo
str
at, e esta razo das aspas, ou seja, uma
adeia de um
ara
tere apenas.
A seguir mostramos um resultado da exe
uo do programa 7.4.
Entre
om um nome Ze
Ze
Entre
om um sobrenome Sa
Sa
Ze Sa
Qual
ara
ter? a
O
ara
tere apare
e na posi
ao 4
sizeof(tipo)*dim1*dim2*dim3*...*dimN
113
void ) {
har
, nome [81 ,
int i ;
main (
sobrenome [41;
for
}
}
return
0;
114
int
matriz[10[20;
armazena o dobro do elemento que est na quarta linha e nona
oluna na varivel
. Observar que o primeiro ndi
e indi
a a linha e o segundo a
oluna. Lembrar
que o nmero da primeira linha (
oluna) igual a 0. O programa 7.5 l uma
matriz de trs linhas e
in
o
olunas e imprime os valores lidos.
#define DIML 3
#define DIMC 5
#in
lude < stdio .h >
int main ( void ) {
int i , j ;
int matriz [ DIML [ DIMC ;
for
for
}
}
return
0;
C1
X
M 1ik M 2kj
k=1
115
(7.1)
3
3
3
3
void ) {
f l o a t m1 [ L1 [ C1 ,
f l o a t mr [ L1 [ C2 ,
int i , j , k ;
main (
for
for
for
for
}
}
L1
L2
C1
C2
m2 [ L2 [ C2 ;
m;
return
0;
116
1000
m[0][0]
1004
m[0][1]
1008
m[0][2]
1012
m[1][0]
1016
m[1][1]
1020
m[1][2]
1024
m[2][0]
1028
m[2][1]
1032
m[2][2]
har nome_turma[30[80;
O Programa 7.7 mostra um programa que l uma matriz de nomes e imprime
os seus
ontedos. importante notar que para ler um nome o programa no
l um
ara
ter de
ada vez mas usa a funo fgets. Como
ada linha da matriz
uma
adeia de
ara
teres, o programa l o nome que est na linha i
omo
fgets(nomes[i, DIMC-1, stdin).
117
#define DIML 5
#define DIMC 41
#in
lude < stdio .h >
#in
lude < string .h >
int main ( void ) {
int i ;
har nomes [ DIML [ DIMC ;
for
for
}
}
return
0;
float
118
#define DIM 5
#in
lude < stdio .h >
int
main () {
int vetor [ DIM = {10 , 15 , 20 , 25 , 30};
int vetor1 [ = {10 , 20 , 30 , 40 , 50 , 60 , -1};
int vetor2 [ = {3 , 6 , 9 , 12 , 15 , 18 , 21 , 24};
unsigned int i , tam ;
printf ( " Este programa imprime vetores " ) ;
printf ( "
ontendo numeros inteiros e \ n " ) ;
printf ( " que foram ini
ializado s durante " ) ;
printf ( " a sua de
lara
ao .\ n " ) ;
/* Impressao dos
onjuntos */
printf ( " \ nVetor
om tamanho pre - definido \ n " ) ;
for ( i =0; i < DIM ; i ++)
printf ( " Elemento % d = % d \ n " , i , vetor [ i ) ;
printf ( " \ nVetor terminando por -1\ n " ) ;
for ( i =0; vetor1 [ i >0; i ++)
printf ( " Elemento % d = % d \ n " , i , vetor1 [ i ) ;
tam = s i z e o f ( vetor2 )
printf ( " \ nDes
obrindo
for ( i =0; i < tam ;
printf ( " Elemento
return
/ s i z e o f ( int ) ;
o tamanho do Vetor \ n " ) ;
i ++)
% d = % d \ n " , i , vetor2 [ i ) ;
0;
119
#define DIM 5
#in
lude < stdio .h >
int
main (
har
};
int
void
) {
dis
iplinas [[40 = {
" dis
0: Computa
ao para Informati
a " ,
" dis
1: Ban
o de Dados I " ,
" dis
2: Ban
o de Dados II " ,
" dis
3: Arquitetura de Computadores I "
i;
printf ( " Qual a dis
iplina ? " ) ; s
anf ( " % d " , & i ) ;
puts ( dis
iplinas [ i ) ;
}
return
0;
120
7.1:
7.2: Es
reva um programa que leia uma linha de
ara
teres do te
lado e imprima
quantas vezes um
ara
tere, tambm forne
ido pelo te
lado, apare
e nesta linha.
O programa tambm deve imprimir em que posies o
ara
tere foi en
ontrado.
7.3:
7.4: Es
reva um programa que leia uma linha do te
lado e imprima todas as
vogais en
ontradas no texto e o total de vezes que elas apare
em.
Obs: Tamanho mximo da linha deve ser 40
ara
teres.
7.5:
7.6:
7.7:
1. Frase lida:
EVA VIU A UVA
2. Retirada dos espaos em bran
o:
EVAVIUAUVA
3. Diviso em blo
os de 5 (blo
os indi
ados por tipos diferentes):
EVAVIUAUVA
4. Criptograa:
FYDANVCYAF
Portanto, o que ser impresso pelo programa :
FYDANVCYAF
7.8: Es
reva um programa que leia uma matriz de 3x3 que
ontm somente
ara
teres 0 e X e pro
ure linhas que
ontenham somente um dos dois
ara
teres.
O
ara
tere a ser pro
urado deve ser lido do te
lado.
121
7.9: Es
reva um programa que leia uma linha de
ara
teres do te
lado e
onverta
o primeiro
ara
tere de
ada palavra para mais
ulas. Assuma que as palavras
so sempre separadas por um bran
o.
7.11: Faa um programa que inverta uma
adeia de
ara
teres. O programa
deve ler a
adeia
om gets e armazen-la invertida em outra
adeia. Use o
omando for para varrer a
adeia at o seu nal.
7.13:
122
temp ;
gets ( texto ) ;
tam = strlen ( texto ) ;
for ( i = 0; i < tam ; i ++) {
temp = texto [ i ;
texto [ i = texto [ tam -1 - i ;
texto [ strlen ( texto ) -1 - i = temp ;
}
puts ( texto ) ;
return 0;
123
Captulo 8
Funes
8.1 Introduo
Em C, diferentemente de outras linguagens
omo Pas
al, todas as aes o
orrem
dentro de funes. Na linguagem C no h
on
eito de um programa prin
ipal, o
que existe uma funo
hamada main que sempre a primeira a ser exe
utada.
Um programa pode ser es
rito apenas
om a funo main e mais as funes
existentes nas bibliote
as da linguagem C. No entanto o uso de funes pode
fa
ilitar o desenvolvimento de programas de diversas maneiras.
Em primeiro lugar temos as vantagens do reuso de
digo desenvolvido por
outros programadores. As funes de entrada e sada so o exemplo mais direto
deste reuso. Em C no existem estes tipos de
omandos
omo na maioria das
linguagens. Programas es
ritos em C usam funes de entrada e sada es
ritas
e testadas por outros programadores. Este reuso de
digo apresenta vrias
vantagens. Primeiro, diminui o tempo de desenvolvimento do programas. Em
segundo lugar,
omo estas funes foram testadas por diversos usurios, a quantidade de erros bastante reduzida. Estes fatores
ontribuem para a reduo
dos
ustos de desenvolvimento dos projetos.
Uma outra vantagem do uso de funes e a maior fa
ilidade na diviso do
trabalho ne
essrio para
onstruir um apli
ativo. Funes podem ser desenvolvidas por programadores trabalhando independentemente. Para isto basta que
alguns a
ordos sejam feitos entre os programadores que iro programar a funo
e os que iro us-las. Estes a
ordos pre
isam denir que parmetros a funo
ir re
eber, que resultados ir forne
er e que operaes ela deve realizar sobre
estes parmetros para obter os resultados ne
essrios. Esta diviso do trabalho
on
orre para a
elerar o desenvolvimento dos programas e na reduo dos
ustos
deste desenvolvimento.
A diviso de um programa em funes tambm permite que os testes do
sistema
ompleto sejam feitos mais fa
ilmente e
om mais garantia de
orreo.
Os programadores podem testar suas funes separadamente em testes menos
omplexos, j que as funes normalmente so simples e tm requisitos menos
ompli
ados de serem avaliados. Isto permite que muitos erros do sistema
ompleto possam ser retirados antes que ele esteja
ompleto. Normalmente testar
um programa
omplexo requer testes
omplexos.
124
Uma funo re
ebe uma lista de argumentos (nome1, nome2, ..., nomeN),
exe
uta
omandos
om estes argumentos e pode retornar ou no um resultado
para a funo que
hamou esta funo. A lista de argumentos, tambm
hamados de parmetros, uma lista, separada por vrgulas, de variveis
om seus
tipos asso
iados. No possvel usar uma ni
a denio de tipo para vrias
variveis. A lista de argumentos pode ser vazia, ou seja, a funo no re
ebe
nenhum argumento. O nome da funo pode ser qualquer identi
ador vlido.
O tipo que apare
e antes do nome da funo espe
i
a o tipo do resultado que
ser devolvido ao nal da exe
uo da funo. Caso nenhum tipo seja espe
i
ado o
ompilador assume que um tipo inteiro retornado. O tipo void pode
ser usado para de
larar funes que no retornam valor algum.
H basi
amente duas maneiras de terminar a exe
uo de uma funo. Normalmente usa-se o
omando return para retornar o resultado da funo. Portanto, quando o
omando
return
expresso;
for exe
utado, o valor da expresso devolvido para a funo que
hamou.
Quando no h valor para retornar o
omando return no pre
isa ser usado e
a funo termina quando a
have que indi
a o trmino do
orpo da funo
atingido.
Os parmetros so valores que a funo re
ebe para realizar as tarefas para
as quais foi programada. Por exemplo, uma funo que
al
ule a raiz quadrada
de um nmero do tipo oat , deve de
larar
omo parmetro uma varivel deste
tipo para re
eber o valor.
importante notar que diferentemente de de
laraes de variveis onde
podemos asso
iar vrios nomes de variveis a uma de
larao
omo em
int
a, dia, mes, i;
oat
oat
n2,
oat
n3);
Neste exemplo, uma funo
hamada media que do tipo oat , isto retorna
um resultado oat , re
ebe trs argumentos (n1, n2, n3) tambm do tipo oat .
125
int
soma (int,
int)
126
127
#in
lude
void
pares ( void ) {
int i ;
for ( i = 2; i <= 10; i += 2) {
printf ( " % d : " , i ) ;
}
void
int
impares ( void ) {
int i ;
for ( i = 3; i <= 11; i += 2) {
printf ( " % d : " , i ) ;
}
main ( int arg
,
pares () ;
printf ( " \ n " ) ;
impares () ;
return
har
* argv [) {
0;
i ++) {
return
0;
#in
lude
int
void
}
void
int
i;
soma1 ( void ) {
i += 1;
printf ( " Fun
ao soma1 : i = % d \ n " , i ) ;
sub1 ( void ) {
int i = 10;
i -= 1;
printf ( " Fun
ao sub1 : i = % d \ n " , i ) ;
main ( int arg
,
har * argv [) {
i = 0;
soma1 () ;
sub1 () ;
printf ( " Fun
ao main : i = % d \ n " , i ) ;
return 0;
129
int
Eleva ( f l o a t a , int b ) {
res = 1.0;
float
for ( ; b >0;
return res ;
b - -) res *= a ;
main () {
f l o a t numero ;
int poten
ia ;
har linha [80;
puts ( " Entre
om um numero " ) ;
gets ( linha ) ; numero = atof ( linha ) ;
puts ( " Entre
om a poten
ia " ) ;
gets ( linha ) ; poten
ia = atoi ( linha ) ;
printf ( " \ n % f Elevado a % d e igual a % f \ n " ,
numero , poten
ia , Eleva ( numero , poten
ia ) ) ;
return
0;
130
Para ilustrar o fato de que somente o valor passado vamos usar o exemplo
8.6. Neste programa as variveis a e b re
ebem os valores 10 e 20 respe
tivamente. Na funo tro
ar estes valores so re
ebidos e so tro
ados lo
almente.
Aps o retorno da funo, o programa imprime os valores originais das variveis,
j que estes no sofreram nenhuma alterao. O resultado da exe
uo deste
programa o seguinte:
a = 10, b = 20
int
b) {
temp = a ; a = b ; b = temp ;
return
0;
har
onta ( har v [ ,
har
);
main () {
har
, linha [ DIM ;
int maius
ulas [26 , minus
ulas [26;
puts ( " Entre
om uma linha " ) ;
gets ( linha ) ;
for (
= 'a ';
<= 'z ';
++)
minus
ulas [
- 'a ' =
onta ( linha ,
) ;
for (
= 'A ';
<= 'Z ';
++)
maius
ulas [
- 'A ' =
onta ( linha ,
) ;
for (
= 'a ';
<= 'z ';
++)
i f ( minus
ulas [
- 'a ' )
printf ( " %
apare
eu % d vezes \ n " ,
, minus
ulas [
- 'a ' ) ;
for (
= 'A ';
<= 'Z ';
++)
i f ( maius
ulas [
- 'A ' )
printf ( " %
apare
eu % d vezes \ n " ,
, maius
ulas [
- 'A ' ) ;
return 0;
onta (
har v [ DIM ,
int i =0 , vezes =0;
har
) {
while
}
( v [ i != ' \0 ' )
i f ( v [ i ++ ==
) vezes ++;
return vezes ;
132
perfeitamente possvel porque a funo somente pre
isa re
eber o endereo onde
se en
ontra o vetor. Alm disso C no
onfere limites de vetores e portanto a
funo pre
isa do endereo ini
ial do vetor e uma maneira de des
obrir o nal
do vetor. Esta maneira pode ser, por exemplo, uma
onstante, ou o
ara
tere
'\0' em um vetor de
ara
teres. O exemplo 8.8 mostra este modo de passar
vetores
om um programa que inverte o
ontedo de um vetor.
A ter
eira maneira de passagem de parmetros impli
a no uso de ponteiros,
o que somente iremos ver no prximo
aptulo.
return
expresso
A funo que
hamou livre para ignorar o valor retornado. Alm disso a
funo pode no
onter o
omando e portanto nenhum valor retornado e neste
aso a funo termina quando o ltimo
omando da funo exe
utado. Quando
o
omando return no existe o valor de retorno
onsiderado indenido. As
funes que no retornam valores devem ser de
laradas
omo do tipo void.
importante observar que funes que so de
laradas
om um tipo vlido podem
ser in
ludas em qualquer expresso vlida em C.
8.7 Re
urso
Funes em C podem ser usadas re
ursivamente, isto uma funo pode
hamar
a si mesmo.
omo se pro
urssemos no di
ionrio a denio da palavra
re
urso e en
ontrssemos o seguinte texto:
re
urso: s.f. Veja a denio em re
urso
Um exemplo simples de funo que pode ser es
rita
om
hamadas re
ursivas
o fatorial de um nmero inteiro. O fatorial de um nmero, sem re
urso,
denido
omo
n! = n (n 1) (n 2) 2 1
( unsigned long
fato =1 , i ;
int
num ) {
return
fato ;
133
void
main () {
int v [ DIM ;
Le_vetor (v , DIM ) ;
Imprime_vetor (v , DIM ) ;
Inverte_vetor (v , DIM ) ;
Imprime_vetor (v , DIM ) ;
return 0;
Le_vetor ( int v [ ,
int i ;
for
void
tam ) {
int
tam ) {
Inverte_vetor ( int v [ ,
int i , temp ;
for
int
Imprime_vetor ( int v [ ,
int i ;
for
void
v [ , int tam ) ;
( int v [ , int tam ) ;
( int v [ , int tam ) ;
int
134
tam ) {
Deste modo podemos es
rever uma funo re
ursiva em que
ada
hamada
da funo que
al
ula o fatorial
hama a prpria funo fatorial. O exemplo,
mostrado na listagem 8.10 ilustra
omo a funo pode ser es
rita re
ursivamente.
Listagem 8.10: Fatorial
al
ulado re
ursivamente.
num ) {
void
f () {
/* ... */
f ()
/* ... */
135
void
f () {
/* ... */
g ()
/* ... */
void
g () {
... f () ...
Um outro exemplo simples de funo que pode ser resolvida por re
urso
xn , assumindo que n 0. Esta funo pode es
rita na sua forma re
ursiva
omo
xn = x x(n1)
que nos leva a es
rever a funo da maneira mostrada no exemplo 8.13. Na
funo
onsideramos que x do tipo oat .
float
Elevar ( f l o a t x ,
( n <= 1) {
return x ;
if
}
else
return
int
n) {
x * Elevar (x , b -1) ;
Para fa
ilitar pode-se pensar que quando uma
hamada re
ursiva feita, a
funo faz uma
pia de si mesmo, das variveis lo
ais,
om seus valores ini
iais,
e dos parmetros.
Cada
pia da funo in
lui uma mar
ao indi
ando o ponto atual onde a
funo est sendo exe
utada. Quando uma
hamada re
ursiva feita, o mar
ador na funo que
hamou
a logo aps a
hamada. O mar
ador na funo
hamada vai para o in
io da funo.
Quando a funo retorna, a
pia some, e a funo que
hamou
ontinua aps
a
hamada, posio indi
ada pela mar
ao. As
pias anteriores
ontinuam
sabendo de onde
ontinuar porque as mar
aes esto em suas posies.
Funes podem ser re
ursivas
om
auda ou no. Em uma funo re
ursiva
om
auda, nenhuma das
hamadas re
ursivas exe
utam algo aps a
hamada
re
ursiva
ompletar, ex
eto para retornar o valor da funo.
A listagem 8.14 mostra o return de uma tpi
a funo re
ursiva
om
auda e
a listagem 8.15 mostra uma sem
auda. A
hamada sem
auda
ara
terizada
porque primeiro f feita e depois soma 5, portanto, algo exe
utado aps a
hamada.
136
int
}
f ( int x , int y ) {
return f (x , y ) ;
int
}
f ( int x , int y ) {
return f (x , y ) + 5;
Quando a
hamada soma( vetor, 10 ); for exe
utada sabemos que os primeiros 10 elementos do vetor vetor sero somados.
Em seguida, repita vrias vezes para si mesmo o seguinte ra
io
nio:
re
urso resolve um grande problema (de tamanho n, por
exemplo), resolvendo um ou mais problemas de tamanho
menor, e usando as solues destes pequenos problemas
para resolver o grande problema.
Caso bsi
o
Suponha que algum lhe daria a resposta para esta segunda soma. O que
vo
teria? Vo
teria a soma dos n1 primeiros elementos do vetor. Agora que
vo
tem esta soluo (por hiptese), o que falta para resolver todo o problema?
A
har a soluo do
aso base, que o menor problema. Neste exemplo seria:
sum(vetor, 1 );
Quanto falta apenas um elemento a soma a ser
al
ulada o prprio elemento. Deste modo a soluo para este problema
a
omo mostrado na listagem 8.16.
137
int
soma (
vetor [ ,
int menor ;
i f ( n == 1 )
return v [0
else
int
int
n )
{ /*
aso base */
/* sem
hamada re
ursiva */
{
menor = soma ( vetor , n - 1 ) ; /* resolve problema
menor */
/* usa solu
ao do menor para resolver o maior */
return menor + vetor [ n - 1 ;
138
O primeiro argumento, arg
, uma varivel inteira que indi
a quantos argumentos foram forne
idos para a funo. Observar que arg
vale sempre pelo
menos 1, porque o nome do programa sempre o primeiro argumento forne
ido
ao programa. A partir do segundo argumento em diante que apare
em os
outros argumentos.
O outro parmetro um vetor de
adeias de
ara
teres, e portanto,
aso
sejam forne
idos nmeros, estes devem ser
onvertidos para o formato requerido.
Cada um dos argumentos do programa um elemento deste vetor. A primeira
linha da funo main pode ter a seguinte forma
void
har
*argv[)
O programa exemplo 8.17
al
ula o fatorial dos nmeros forne
idos
omo
argumentos.
int
har * argv [) {
unsigned long int numero , fatorial ,
if
for
}
}
num ) {
i;
( arg
< 2) {
printf ( " Para rodar : % s num1 num2 ... .\ n " , argv
[0) ;
return 1;
( i =1; i < arg
; i ++) {
numero = ( unsigned long int ) ( atoi ( argv [ i ) ) ;
fatorial = fat ( numero ) ;
printf ( " O fatorial de % lu vale % lu .\ n " , numero ,
fatorial ) ;
return
0;
139
8.1:
8.5:
8.6:
8.7:
f (0) =
f (1) =
0
1
f (n) =
f (n 1) + f (n 2)
8.8:
int
ab
( int x , int y ) {
printf ( " % d % d \ n " , x , y ) ;
i f ( y == 0) {
return x ;
}
else {
return ab
(y , x % y ) ;
}
main ( void ) {
int a , b ;
s
anf ( " % d % d " , &a , & b ) ;
printf ( " % d \ n " , ab
(a , b ) ) ;
return 0;
8.9:
[) ;
main ( void ) {
har numeroC [80;
fgets ( numeroC , 80 , stdin ) ;
{
numeroC [ strlen ( numeroC ) -1 = ' \0 ';
printf ( " % s = % d \ n " , numeroC , fromHexatoD e
i ma l (
numeroC ) ) ;
fgets ( numeroC , 80 , stdin ) ;
}
return 0;
141
int
toLower (
har
) {
i f (
>= 'A ' &&
<= 'Z ') {
=
- 'A ' + 'a ';
}
return
;
toNumero (
har
) {
int resultado ;
if
}
else i f
}
}
return
resultado ;
142
Captulo 9
Ponteiros
9.1 Introduo
Ponteiros so usados em situaes em que ne
essrio
onhe
er o endereo
onde est armazenada a varivel e no o seu
ontedo. Um ponteiro uma
varivel que
ontm um endereo de uma posio de memria e no o
ontedo
da posio. A memria de um
omputador pode ser vista
omo uma seqn
ia
de bytes
ada um
om seu prprio e ni
o endereo. No h dois bytes
om
o mesmo endereo. O primeiro endereo sempre 0 e o ltimo geralmente
uma potn
ia de 2. Por exemplo um
omputador
om memria igual a 512
Mbytes tem 512x1024x1024 bytes. A Figura 9.1 mostra o mapa de um tre
ho
de memria que
ontm duas variveis inteiras (num, res) o
upando 4 bytes
ada uma e mais um ponteiro (pint), que tambm o
upa 4 bytes. Observar que
os endereos esto pulando de quatro em quatro bytes devido ao espao que
ada um destas variveis o
upa.
0
4
10
num
120
res
*pint
12
16
destas variveis, que aps o m da funo estaro disponveis para a funo que
hamou. Neste
aso os argumentos podem fun
ionar
omo entrada e sada de
dados da funo.
Uma outra apli
ao importante de ponteiros apontar para reas de memria que devem ser geren
iadas durante a exe
uo do programa. Com ponteiros,
possvel reservar as posies de memria ne
essrias para armazenamento
destas reas somente quando for ne
essrio e no quando as variveis so de
laradas. Neste esquema o programador pode reservar o nmero exato de posies
que o programa requer. A Figura 9.2 ilustra
omo um ponteiro faz refern
ia
para uma rea de memria. Na gura a varivel ponteiro pi aponta para a rea
de memria que
ontm um vetor de 10 inteiros. Com ponteiros, o programador
pre
isa, no in
io, denir a varivel ponteiro e seu tipo. Durante a exe
uo do
programa, aps des
obrir o tamanho do vetor, reserva a rea ne
essria para
guardar os dados. Observe a diferena do que o
orre quando se usa vetores de
tamanho xo. Neste
aso a denio do tamanho do vetor dada na de
larao
do vetor e mantida at o nal da exe
uo do programa.
0
pi ponteiro
para vetor
1000
4
8
120
1000
Vetor de
10 inteiros
1036
97
tipo *nome;
Onde tipo qualquer tipo vlido em C e nome o nome da varivel ponteiro.
Por exemplo:
144
*/
flutuante */
Como as variveis, os ponteiros devem ser ini
ializados antes de serem usados. Esta ini
ializao pode ser feita na de
larao ou atravs de uma atribuio.
Aps a de
larao o que temos um espao na memria reservado para armazenamento de endereos. O valor ini
ial da memria indenido
omo a
onte
e
om variveis. A Figura 9.3 ilustra esta situao. Um ponteiro pode ser ini
ializado
om um endereo ou
om o valor NULL. O valor NULL, que equivalente a
0, uma
onstante denida no arquivo <stdio.h> e signi
a que o ponteiro no
aponta para lugar nenhum. A atribuio de inteiros a ponteiros no faz sentido a no ser em apli
aes muito espe
iais e o ni
o valor inteiro que se pode
atribuir a um ponteiro o 0. Este tipo de atribuio no faz sentido porque na
maioria das apli
aes o sistema opera
ional que alo
a e geren
ia a posio
dos programas na memria e, portanto, o usurio no tem
ontrole sobre estes
endereos.
996
1000
endereo indefinido
*res
1004
endereo indefinido
*div
0
4
10
num
120
12
res
*pint
16
omando res = *pint; foi exe
utado logo aps pint = #. Isto signi
a que
a varivel res re
ebe o valor apontado por pint, ou seja a varivel res re
ebe o
valor 10,
omo est mostrado na Figura 9.5.
0
4
10
120 10
12
num
res = *pint
*pint
16
30
100
30
{ 10 , 20 , 30 , 40 , 50 };
* p1 , * p2 ;
i = 100;
0
4
10
v[0]
20
v[1]
12
30
v[2]
16
40
v[3]
20
50
v[4]
24
12
*p1
28
32
100
*p2
32
p1 = &v[2];
p2 = &i;
i
147
int
main ( void ) {
int vetor [ = { 10 , 20 , 30 , 40 , 50 };
int * p1 ;
p1 = & vetor [2;
printf ( " % d \ n " , * p1 ) ;
p1 ++;
printf ( " % d \ n " , * p1 ) ;
p1 = p1 + 1;
printf ( " % d \ n " , * p1 ) ;
return 0;
Pode pare
er estranho que um ponteiro para um nmero inteiro, que armazenado em quatro bytes, seja in
rementado por um e passe para apontar para
o prximo nmero inteiro. A primeira vista, para que passasse a apontar para
o prximo endereo, seria ne
essrio aumentar o endereo em quatro. Ou seja,
sempre que um ponteiro in
rementado (de
rementado) ele passa a apontar
para a posio do elemento seguinte (anterior). O
ompilador interpreta o
omando p1++
omo: passe a apontar para o prximo nmero inteiro e, portanto,
aumenta o endereo do nmero de bytes
orreto. Este ajuste feito de a
ordo
om o tipo do operando que o ponteiro est apontando. Do mesmo modo, somar
trs a um ponteiro faz
om que ele passe apontar para o ter
eiro elemento aps o
atual. Portanto, um in
remento em um ponteiro que aponta para um valor que
armazenado em n bytes faz que n seja somado ao endereo. ento possvel
somar-se e subtrair-se inteiros de ponteiros. A operao abaixo faz
om que o
ponteiro p passe a apontar para o ter
eiro elemento aps o atual.
p = p + 3;
a, b;
if
(
== v )
printf ( " As variveis estao na mesma posi
ao . " ) ;
else
return
0;
149
int
list [5 , i ;
Para per orrer um vetor alm da maneira mostrada no programa 9.6 pos150
svel usar um ponteiro varivel
omo ilustrado no Programa 9.7. Observe
omo
o ponteiro p re
ebe seu valor ini
ial e a maneira
omo ele in
rementado.
At agora um dos usos mais
omuns de
adeias de
ara
teres
onstantes tem
sido na funo printf,
omo no exemplo abaixo
printf("A
abou o programa.\n");
Quando uma
adeia de
ara
teres
omo esta enviada para a funo, o que
passado o ponteiro para a
adeia. possvel ento
arregar o endereo da
adeia em um ponteiro do tipo
har,
omo no exemplo 9.8. Neste programa
ontado o nmero de
ara
teres de uma
adeia. Observe o ponteiro *(s+tam++)
apontando
ara
tere a
ara
tere.
Um outro exemplo (Programa 9.9) mostra uma funo que
opia um
adeia
de
ara
teres para outra.
151
s = lista ;
while (*( s + tam ++) != ' \0 ') ;
tam - -;
printf ( " O tamanho do string \"% s \" e % d
ara
teres .\ n "
,
lista , tam ) ;
return 0;
int
de origem " ;
void *mallo
(size_t size); Reserva espao na memria para algum item
de um programa. O tamanho em bytes reservado denido pela varivel size.
O valor armazenado no espao indenido. A funo retorna um ponteiro de
tipo void para o espao reservado ou NULL no
aso de algum erro o
orrer.
void *
allo
(size_t num, size_t size); Reserva espao na memria para
um vetor de num itens do programa. Cada item tem tamanho size e todos os
bits do espao so ini
ializados
om 0. A funo retorna um ponteiro de tipo
void para o espao reservado ou NULL no
aso de algum erro o
orrer.
void free(void *pont); O espao apontado por pont devolvido ao sistema
para uso. Caso pont seja um ponteiro nulo nenhuma ao exe
utada. No
aso
do ponteiro no ter sido resultado de uma reserva feita por meio de uma das
funes
allo
, reallo
ou mallo
o resultado indenido.
void reallo
(void *pont, size_t size); A funo altera o tamanho do objeto na memria apontado por pont para o tamanho espe
i
ado por size. O
152
ontedo do objeto ser mantido at um tamanho igual ao menor dos dois tamanhos, novo e antigo. Se o novo tamanho requerer movimento, o espao reservado
anteriormente liberado. Caso o novo tamanho for maior, o
ontedo da poro de memria reservada a mais
ar
om um valor sem espe
i
ao. Se o
tamanho size for igual a 0 e pont no um ponteiro nulo o objeto previamente
reservado liberado.
Estas funes podem ser en
ontradas na bibliote
a stdlib.h. O Programa
9.10 ilustra o uso das funo
allo
e free.
tam ,
int
* vezes ) ;
}
void LeVetor ( float *v , int tam ) {
int i ;
for ( i =0; i < tam ; i ++) {
printf ( " Elemento % d ? " , i ) ;
s
anf ( " % f " , v + i ) ;
printf ( " Li valor % f \ n " , *( v + i ) ) ;
}
}
float Pro
uraMaior ( float *v , int tam , int * vezes ) {
int i ;
float maior ;
154
#define
#define
LIN 3
COL 4
{
printf ( " Elemento % d % d = " , i , j ) ;
s
anf ( " % d " , & matriz [ i [ j ) ;
#define
#define
int
int
LIN 3
COL 4
* matriz ;
i, j;
155
main ( void ) {
har * linha [ LINHAS ;
int i ;
for
for
}
for
}
}
return
0;
156
linha 0
*(matriz+0)
*(matriz+1)
linha 1
*(matriz+2)
linha 2
*(matriz+n)
linha n
sizeof(int
*));
foi usado pelo programa para reservar espao para armazenar lin linhas de
ponteiros para ponteiros. Observe que o
omando sizeof(int *)
al
ula o espao
para armazenar um ponteiro na memria. Note tambm que o valor retornado
pela funo mallo
foi
onformado ao tipo ponteiro para ponteiro pela operao
(int **). O interessante do programa que a tro
a de linhas da matriz envolve
simplesmente a tro
a de dois ponteiros e no a tro
a de todos os elementos das
linhas. Esta soluo muito mais rpida do que tro
ar elemento a elemento,
espe
ialmente para matrizes grandes.
A seguir mostramos o programa nas listagens 9.16 e 9.17 que o exemplo
anterior modi
ado para utilizar funes. O propsito mostrar
omo
am as
hamadas e as denies das funes que utilizam ponteiros para ponteiros.
157
*/
158
int
void
159
void
void
void
160
int
linha2 ) {
9.2:
9.3: Es
reva um programa que leia uma frase de at 80
ara
teres e a imprima
em ordem reversa
onvertendo todos os
ara
teres mins
ulos para mais
ulos.
9.4: Es
reva um programa que leia uma matriz e a imprima. O programa deve
ler o numero de
olunas e linhas do te
lado. O programa deve ainda tro
ar duas
linhas da matriz de posio. Os nmeros das linhas a serem tro
adas devem ser
lidos do te
lado.
9.5:
Inserir
Remover
Listar
9.6: Es
reva uma funo que re
eba um ponteiro para uma
adeia de
ara
tere
e troque todo o
ara
ter aps um bran
o pelo seu equivalente mais
ulo.
Es
reva um programa que leia seu nome
ompleto e pergunte quantas letras
tem o seu primeiro nome. Assuma que a letra 'a' tem ndi
e 0, a letra 'b' ndi
e
1 e assim por diante. O programa deve imprimir quantas letras iguais a letra
ujo ndi
e o nmero de letras do seu primeiro nome existem no seu nome
ompleto.
9.7:
Es
reva um programa que leia seu nome
ompleto e pergunte quantas letras
tem o seu primeiro nome. O seu programa deve usar a funo posi
ao que tem
o seguinte prottipo:
9.8:
int
har
*str);
Esta funo deve veri
ar se a
adeia apontada por substr est presente na
adeia apontada por str e retornar a posio em que a sub-
adeia apare
e em
adeia.
9.9: Es
reva um programa que pro
ure em uma matriz elementos que sejam
ao mesmo tempo o maior da linha e o menor
oluna. As dimenses da matriz
devem ser pedidas ao usurio.
9.10:
161
MAX 80
misterio ( har * p1 ,
har
* p2 ) ;
main ( void ) {
har palavra1 [ MAX ;
har palavra2 [ MAX ;
puts ( " Palavra 1? " ) ;
fgets ( palavra1 , MAX , stdin ) ;
palavra1 [ strlen ( palavra1 ) -1 = ' \0 ' ;
puts ( " Palavra 2? " ) ;
fgets ( palavra2 , MAX , stdin ) ;
palavra2 [ strlen ( palavra2 ) -1 = ' \0 ' ;
misterio ( palavra1 , palavra2 ) ;
return
void
while
if
if
0;
(* p1 != ' \0 ') {
(* p1 != ' \0 ') {
put
har (* p1 ) ;
p1 = p1 + 1;
}
while
(* p2 != ' \0 ') {
(* p2 != ' \0 ') {
put
har (* p2 ) ;
p2 = p2 + 1;
}
while
162
MAX 80
nMisterio (
har * p1 ,
(* p1 != ' \0 ') {
p1 = p1 + 1;
while
}
har
* p2 ) {
while
(* p2 != ' \0 ') {
* p1 = * p2 ;
p1 = p1 + 1;
p2 = p2 + 1;
int
}
* p1 = ' \0 ';
main ( void ) {
palavra1 [ MAX ;
palavra2 [ MAX ;
har
har
9.13:
int
int
i = 0;
j = 0;
9.14: O que ser impresso pelo programa mostrado na listagem 9.21. Justique
sua resposta.
void
int
int
f1 ( int v ) {
v = v + 1;
printf ( " f1 = % d \ n " , v ) ;
f2 ( int * v ) {
* v = * v + 1;
printf ( " f2 = % d \ n " , * v ) ;
f3 ( int v ) {
v = v + 1;
printf ( " f3 = % d \ n " , v ) ;
return v ;
main ( void ) {
int v = 1;
f1 ( v ) ;
f2 (& v ) ;
v = f3 ( v ) ;
printf ( " main = % d \ n " , v ) ;
return 0;
164
Captulo 10
Estruturas
10.1 Introduo
Uma estrutura um
onjunto de uma ou mais variveis, que podem ser de tipos diferentes, agrupadas sob um ni
o nome. O fato de variveis agrupadas
em uma estrutura poderem ser referen
iadas por um ni
o nome fa
ilita a manipulao dos dados armazenados nestas estruturas. Um exemplo poderia ser
uma estrutura que armazenasse as diversas informaes sobre os alunos de uma
Universidade. Nesta estrutura estariam armazenadas, sob o mesmo nome, informaes do tipo: nome, registro, data de nas
imento, data de ingresso, CPF,
et
. Uma estrutura pode in
luir outras estruturas alm de variveis simples.
As estruturas fa
ilitam manipular estes agrupamentos
omplexos de dados. Por
exemplo,
onsidere o problema de ordenar as informaes sobre os alunos da
Universidade exemplo. A ordenao pode ser efetuada
omo se todos os dados
que
ompem a estrutura fossem uma entidade ni
a.
165
stru
t ALUNO {
har nome [40;
int registro ;
int ano_entrada ;
har
urso [20;
};
stru t
Nesta de
larao trs estruturas do tipo ALUNO foram
riadas. Esta de
larao alo
ou espao para armazenar os dados dos trs alunos. A de
larao a
ima
idnti
a, na forma, a de
larao de variveis de um tipo pr-denido,
omo
por exemplo:
int
a, b, ;
stru
t ALUNO {
har nome [40;
int registro ;
int ano_entrada ;
har
urso [20;
armazena o ano em que aluno paulo entrou na universidade. Para ler o nome
do
urso que paulo
ursa pode-se usar o
omando
gets(paulo.
urso);
stru
t DATA {
int dia ,
};
mes , ano ;
Agora vamos modi
ar a estrutura aluno de modo que ela in
lua a data de
nas
imento do aluno. A estrutura
a
om a seguinte denio:
166
stru
t aluno {
har nome [40;
int registro ;
int ano_entrada ;
har
urso [20;
stru
t DATA data_nas
im en to ;
};
paulo.data_nas imento.mes
typedef int
typedef int
typedef int
ores ;
laranja ;
manga ;
...
laranja lima ;
manga espada ;
ores = AMARELO ;
...
espada ++;
Ao mesmo tempo que typedef tem a vantagem de tornar mais
laro a nalidade de
ada varivel ele pode trazer problemas na medida em que es
onde o
real tipo da varivel.
omum o uso de typedef em
onjunto
om stru
t. Considere a denio
de uma estrutura para guardar tempos gastos em tarefas. Esta estrutura deve
guardar horas, minutos e segundos. Usando esta
ombinao, a denio
usualmente feita da seguinte maneira:
stru
t _TEMPO {
int hora , minuto ,
};
typedef stru
t
...
TEMPO t1 ;
segundo ;
_TEMPO TEMPO ;
Uma forma ainda mais abreviada, junta as duas denies, ando a denio da estrutura da seguinte maneira:
typedef stru
t
int hora ,
} TEMPO ;
_TEMPO {
minuto , segundo ;
167
...
TEMPO t1 ;
typedef stru
t
int hora ,
} TEMPO ;
...
TEMPO t1 ;
{
minuto , segundo ;
} EMPREGADO ;
int
main () {
EMPREGADO temp , emp1 ;
puts ( " Entre
om nome . " ) ;
gets ( emp1 . nome ) ;
puts ( " Qual o salario ? " ) ; s
anf ( " % f " , & emp1 . salario ) ;
temp = emp1 ;
printf ( " O salario de % s e %.2 f \ n " ,
temp . nome , temp . salario ) ;
return 0;
#in
lude
#in
lude
} ALUNO ;
int
main ( void ) {
ALUNO turma [4 , temp ;
int jaOrdenados = 0 , foraOrdem , i ;
for
do
( i = 0; i < 4; i ++) {
gets ( turma [ i . nome ) ;
s
anf ( " % f " , & turma [ i . n1 ) ;
do {} while ( get
har () != '\ n ') ;
s
anf ( " % f " , & turma [ i . n2 ) ;
do {} while ( get
har () != '\ n ') ;
turma [ i . media =( turma [ i . n1 + turma [ i . n2 ) /2.0;
{
foraOrdem = 0;
for ( i = 0; i < 4 - 1 - jaOrdenados ; i ++) {
i f ( turma [ i . media > turma [ i +1. media ) {
temp = turma [ i ;
turma [ i = turma [ i +1;
turma [ i +1 = temp ; foraOrdem = 1;
}
}
jaOrdenados ++;
} while ( foraOrdem ) ;
for ( i =0; i <4; i ++) {
printf ( " \ nDados do aluno % d \ n " , i ) ;
printf ( " % s : %0.1 f , %0.1 f , %0.1 f \ n " ,
turma [ i . nome , turma [ i . n1 , turma [ i . n2 , turma [
i . media ) ;
}
return 0;
} CIRCULO ;
float
}
int
Area ( f l o a t r ) {
3.141516 * r * r ;
return
main ( void ) {
CIRCULO
;
. x =
. y =
. raio = 1.0;
printf ( " % f \ n " , Area (
. raio ) ) ;
return 0;
A funo que re
ebe este parmetro est preparada para re
eber uma varivel
de ponto utuante simples. Caso seja ne
essrio passar o endereo de um dos
membros ou elementos da estrutura basta
olo
ar o operador & antes do nome
da estrutura. Por exemplo, para tro
ar os valores das
oordenadas x dos
entros
de dois
r
ulos
1 e
2 usaramos
hamadas da seguinte forma.
tro
a_x (&
1 .x , &
2 . x ) ;
tro a_x, mas isto veremos no prximo item. Antes vamos veri ar omo
170
} PONTO ;
f l o a t
omp ( PONTO p1 , PONTO p2 ) {
return sqrt ( pow ( p2 .x - p1 .x ,2) + pow ( p2 .y - p1 .y ,2) ) ;
}
int main ( void ) {
PONTO p1 , p2 ;
void
171
stru
t aluno {
har nome [40;
int ano_entrada ;
f l o a t n1 , n2 , media ;
} * maria ;
Para alo
ar espao para estruturas apontadas por ponteiros ne
essrio usar
o operador unrio sizeof, isto porque o tamanho de uma estrutura sempre
igual ou maior que a soma dos tamanhos dos seu
omponentes. Para expli
ar
esta fato devemos
onsiderar
omo os dados so armazenados na memria dos
omputadores.
Algumas arquiteturas de
omputadores endeream os dados na memria por
bytes, isto
ada endereo de memria se refere a um byte. No entanto, estas
arquiteturas lem sempre uma palavra inteira da memria. Usualmente, palavras podem ser
ompostas de dois bytes e
omeam em endereos pares,
omo
est mostrado na gura abaixo. Sabemos que existem variveis que o
upam
mais de um byte, por exemplo inteiros que so
ompostos de dois bytes.
Imagine ento uma estrutura
omposta de um
ara
tere (1 byte) e um nmero de inteiro (2 bytes). Caso a memria do
omputador seja organizada em
palavras de 16 bits ou 2 bytes a estrutura a
ima o
uparia 3 bytes ou uma palavra e meia. Para ler o nmero inteiro o programa deveria ler duas palavras.
Lembrar que se os dados fossem sempre armazenados seqen
ialmente, metade
do nmero inteiro estaria em uma palavra e a metade restante na outra,
omo
est indi
ado na gura abaixo (parte a). Para fa
ilitar o a
esso s variveis,
alguns
ompiladores armazenam as variveis de a
ordo
om o que est indi
ado na gura (parte b). Observar que agora a estrutura o
upa quatro bytes.
Neste
aso o a
esso ao nmero inteiro ser sempre feito em um passo e portanto
ganhou-se em tempo de a
esso ao
usto de gasto de memria. Este uma tro
a
onstante em
omputao.
172
Vimos ento que embora o total de bytes dos elementos da estrutura fosse
trs o
ompilador pode armazenar a estrutura em quatro bytes, da a ne
essidade
de sempre usar o operador sizeof quando alo
ar espao.
O programa 10.7 mostra
omo alo
ar espao para uma varivel simples e
omo usar esta varivel em diversos tipos de
omandos.
int
main ( void ) {
ALUNO * maria ;
maria = ( ALUNO *) mallo
( s i z e o f ( ALUNO ) ) ;
i f (! maria ) exit (1) ;
gets ( maria - > nome ) ;
s
anf ( " % f % f " , &( maria - > n1 ) , &( maria - > n2 ) ) ;
maria - > media = ( maria - > n1 + maria - > n2 ) / 2;
printf ( " A media de % s vale %0.2 f \ n " , maria - > nome ,
maria - > media ) ;
return 0;
173
} Tfun ;
void
float
f l o a t media =0.0;
int i ;
for
}
int
int
fun ionarios ) {
return
main ( void ) {
Tfun
*
adastro ;
int fun
ionarios ;
har linha [40;
puts ( " Quantos fun
ionarios ? " ) ; fgets ( linha , 39 , stdin )
;
ss
anf ( linha , " % d " , & fun
ionarios ) ;
if
}
le (
adastro , fun
ionarios ) ;
printf ( " Salario medio = %.2 f \ n " ,
media (
adastro , fun
ionarios ) ) ;
return 0;
174
10.1:
10.3:
int
main ( void ) {
stru
t aluno turma [ MAX ;
le ( turma ) ;
puts ( " Imprimindo dados lidos da turma . " ) ;
puts ( " Digite qualquer
oisa para
ontinuar . " ) ;
get
har () ;
imprime ( turma ) ;
ordena_medias ( turma ) ;
puts ( " Imprimindo dados ordenados da turma . " ) ;
puts ( " Digite qualquer
oisa para
ontinuar . " ) ;
get
har () ;
imprime ( turma ) ;
get
har () ;
Es rever um programa que utilize stru ts e ponteiro para stru t e imprima o ontedo das variveis da stru t.
10.4:
175
10.5:
10.7:
empilha C
empilha B
empilha A
desempilha A
desempilha B
desempilha C
10.8: Es
reva um programa que soli
ite o nome e telefone de uma pessoa e grave
essas informaes num vetor de uma estrutura que
ontem esses dados (nome e
telefone). O programa deve ter trs opes apenas: uma que adi
iona um novo
dado, outra que lista todos os dados atualmente armazenados na memria e
outra que sai do programa. Esse vetor de estrutura deve ter apenas 10 elementos
e forne
er uma mensagem de erro
aso o usurio tente adi
ionar mais pessoas
que este mximo permitido.
10.9: Es
reva uma estrutura similar as strings do Delphi (possuem um
ampo
armazenando o tamanho da string e um ponteiro para o primeiro
ara
tere da
string) e
rie as funes str
py e str
at para strings nesse formato.
10.10:
10.11:
10.13:
} FRACAO ;
Captulo 11
Entrada e Sada por Arquivos
11.1 Introduo
Em C no existem instrues espe
iais de entrada e sada
omo em outras linguagens de programao. Estas tarefas, em C so exe
utadas por funes espe
ialmente
riadas para esta nalidade e armazenadas em bibliote
as espe
as.
Por esta razo todos programas em C que pre
isam de entrada e/ou sada de
dados ne
essitam in
luir a diretiva #in
lude<stdio.h> no in
io do programa,
para permitir o uso da bibliote
a padro stdio de funes de entrada e sada.
impressora que espera nal de linha no modo DOS surge o que
omumente
hamado de efeito es
ada. A impresso
ontinua na linha seguinte mas sem
voltar para o in
io da linha porque em UNIX o
ara
tere de retorno de
arro
no inserido no uxo de texto.
At agora temos trabalhado
om os uxos de dados padro: stdin, para
entrada de dados e stdout para sada de dados. Ao ini
iar todo programa em
C automati
amente asso
iado a estes dois uxos de dados sem ne
essitar de
nenhuma interveno do programador. A denio de que perifri
os estaro
asso
iados a estes uxos depende do sistema opera
ional. Normalmente o uxo
de entrada (stdin) est asso
iado ao te
lado e o uxo de sada (stdout) ao
monitor.
fluxo binrio
000...01100
32 bits
12
32 bits
113
8 bits 8 bits
a
b
11.2.3 Arquivos
Um arquivo pode estar asso
iado qualquer dispositivo de entrada e sada
omo, por exemplo: impressora, te
lado, disquete, dis
o rgido et
. No entanto,
178
Obviamente algumas dessas funes no se apli
am a todos os tipos de dispositivos. Por exemplo, para uma impressora pode no ser possvel usar a
funo que reposi
iona o arquivo no in
io. Um arquivo em dis
o permite a
esso
aleatrio enquanto um te
lado no.
Ao nal das operaes nos arquivos o programa deve fe
h-los. Caso o
programador esquea de exe
utar esta operao, ao nal do programa todos os
arquivos asso
iados so fe
hados automati
amente e os
ontedos dos buers
so des
arregados para o dispositivo externo. Caso o arquivo seja de entrada o
ontedo do buer esvaziado.
onde arq o ponteiro que ser usado para exe utar as operaes no arquivo.
11.4 In
io e Fim
As operaes mostradas a seguir mostram operaes que devem ser realizadas
antes e depois de usar um arquivo (fopen() e f
lose()). As outras duas funes
servem para que o usurio possa dete
tar o m de um arquivo ou voltar para
seu in
io.
179
Funo
Des rio
fopen()
f
lose()
fput
()
get
(), fget
()
fprintf()
ss
anf()
fs
anf()
fseek()
rewind()
feof()
ferror()
fflush()
fread()
fwrite()
Abre um arquivo
Fe
ha um arquivo
Es
reve um
ara
tere em um arquivo
L um
ara
tere de um arquivo
Equivalente a printf()
Equivalente a s
anf(). L de uma
adeia de
ara
teres
Equivalente a s
anf()
Posi
iona o arquivo em um ponto espe
o
Posi
iona o arquivo no in
io
Retorna verdade se
hegou ao m do arquivo
Veri
a a o
orrn
ia de um erro
Des
arrega o buer asso
iado ao arquivo
Leitura de dados no modo binrio
Es
rita de dados no modo binrio
har
*parq,
onst har
*modo)
r+:
w+:
a+:
180
Lembrar que abrir, para es
rita, um arquivo que j existe, impli
a em apagar
todo o
ontedo anterior e a preparao do arquivo para re
eber dados a partir
de seu ponto ini
ial. Se o programador deseja a
res
entar dados ao nal de um
arquivo j existente o modo de abertura deve ser a.
int
onde parq um ponteiro de arquivo para o arquivo que deve ser fe
hado. Todos
os buers internos asso
iados
om o uxo de dados do arquivo so des
arregados. O
ontedo de qualquer buer no es
rito es
rito e dados no lidos
de buers so perdidos. Este ponto importante de ser
onsiderado porque
em muitos sistemas opera
ionais uma operao de es
rita em um arquivo no
o
orre imediatamente a emisso da ordem de es
rita. O sistema opera
ional
pode exe
utar a ordem no momento que a
har mais
onveniente. Um valor zero
de retorno signi
a que a operao foi exe
utada
om xito, qualquer outro valor
impli
a em erro.
int
feof(FILE *parq)
= get
har () ;
while (
!= EOF ) {
put
har (
) ;
= get
har () ;
}
return 0;
11.4.4 Volta ao In
io
A funo rewind() re
olo
a o indi
ador de posio de arquivo no in
io do arquivo. Uma operao semelhante ao que fazemos em uma ta
assete de msi
a
ou vdeo. O prottipo da funo o seguinte:
void
rewind(FILE *parq)
int
int
As funes get () e fget () so equivalentes e muitos ompiladores implementam get () omo uma ma ro do seguinte modo:
#dene
A funo l o
ara
tere
omo um unsigned
har mas retorna o valor
omo
um inteiro, onde o byte mais signi
ativo vale zero. O apontador do arquivo
avana um
ara
tere e passa a apontar para o prximo
ara
tere a ser lido.
A funo devolve o
digo EOF ao
hegar ao nal do arquivo ou
aso um erro
o
orra. O valor EOF tambm um inteiro vlido e portanto ao usar arquivos
binrios ne
essrio que a funo feof() seja utilizada para veri
ar o nal do
arquivo. A funo ferror() pode ser usada para determinar se um erro o
orreu.
Para es
rever
ara
teres h duas funes denidas put
() e fput
(). Os
prottipos das funes so os seguintes:
int
int
onde parq um ponteiro de arquivo para o arquivo que foi previamente aberto
por meio da funo fopen() e
h o
ara
tere a ser es
rito.
O programa 11.2 mostra
omo um arquivo pode ser
riado para leitura e
es
rita. Em seguida um
onjunto de
ara
teres lido do te
lado es
rito no arquivo. O prximo passo a leitura do arquivo que ini
iada aps uma
hamada
a funo rewind(), fazendo
om que o indi
ador de posio do arquivo volte a
apontar para seu in
io.
Uma outra alternativa mostrada em 11.3 mostra um exemplo onde o arquivo
riado para es
rita em seguida fe
hado e reaberto para leitura
ando
automati
amente posi
ionado no in
io para a leitura.
#in
lude
int main
if
( pArq == NULL ) {
183
FILE * pa ;
* nome = " texto . txt " ;
har
return
0;
184
FILE * pa ;
* nome = " texto . txt " ;
har
if
}
= get
har () ;
while (! feof ( stdin ) ) {
fput
(
, pa ) ;
= get
har () ;
}
f
lose ( pa ) ;
printf ( " \ nTerminei de es
rever , agora vou ler .\ n " ) ;
i f (( pa = fopen ( nome , " r " ) ) == NULL ) {
printf ( " \ n \ nErro ao abrir o arquivo - leitura .\ n "
);
exit (1) ;
}
= fget
( pa ) ;
while (! feof ( pa ) ) {
put
har (
) ;
= fget
( pa ) ;
}
f
lose ( pa ) ;
return 0;
185
return
else
}
}
{
fput
( 'x ' , pArq ) ;
i f ( ferror ( pArq ) ) {
printf ( " Erro es
revendo arquivo \ n " ) ;
f
lose ( pArq ) ;
return 1;
}
return
0;
int
int
int
A funo fputs() es
reve a
adeia de
ara
teres apontada por str no uxo
apontado por parq. O
digo nulo ao nal da
adeia no
opiado para o uxo.
O
digo
orrespondente EOF ser retornado se o
orrer um erro e um valor no
negativo em
aso de su
esso.
A funo fgets() l uma
adeia de
ara
teres do uxo espe
i
ado por parq
at que um
ara
tere de nova linha seja en
ontrado ou
omp-1
ara
teres sejam
lidos. O
ara
tere de nova linha interrompe a leitura. Observar que diferentemente de gets() o
ara
tere de nova linha en
ontrado passa a fazer parte da
adeia que re
ebe um
ara
tere nulo ao seu nal. O ponteiro str retornado
aso a leitura o
orra sem erro. No
aso de erro o ponteiro str re
ebe o valor
NULL. Se o m do arquivo for en
ontrado e nenhum
ara
tere foi lido, o
ontedo
de str mantido e um NULL retornado. O exemplo 11.5 mostra um exemplo
de uso destas funes para ler e es
rever
adeias de
ara
teres em um arquivo.
Listagem 11.5: Exemplo de leitura e es
rita de
adeias de
ara
teres.
FILE * pa ;
* nome = " texto . txt " ;
har
if
186
return 1;
}
fgets ( linha , MAX , stdin ) ;
while (! feof ( stdin ) ) {
fputs ( linha , pa ) ;
fgets ( linha , MAX , stdin ) ;
}
rewind ( pa ) ; /* volta ao ini
io do arquivo */
printf ( " \ nTerminei de es
rever , agora vou ler .\ n \ n " );
fgets ( linha , MAX , pa ) ;
while (! feof ( pa ) ) {
puts ( linha ) ;
fgets ( linha , MAX , pa ) ;
}
f
lose ( pa ) ;
return 0;
har * nome
i f (( pa =
}
puts ( " Entre
om uma palavra . " ) ; s
anf ( " % s " , palavra )
;
puts ( " Entre
om um numero inteiro . " ) ; s
anf ( " % d " , & i )
;
puts ( " Entre
om um numero flutuante . " ) ; s
anf ( " % f " , &
f);
/* Es
reve os dados no arquivo */
fprintf ( pa , " % s % d % f " , palavra , i , f ) ;
rewind ( pa ) ; /* volta ao ini
io do arquivo */
printf ( " \ nTerminei de es
rever , agora vou ler .\ n " ) ;
fs
anf ( pa , " % s % d % f " , palavra , &i , & f ) ;
printf ( " Palavra lida : % s \ n " , palavra ) ;
printf ( " Inteiro lido : % d \ n " , i ) ;
printf ( " Float
lido : % f \ n " , f ) ;
f
lose ( pa ) ;
return 0;
}
fwrite (& inum , s i z e o f ( int ) , 1 , pa ) ;
fwrite (& fnum , s i z e o f ( f l o a t ) , 1 , pa ) ;
fwrite (& pi , s i z e o f ( double ) , 1 , pa ) ;
fwrite (&
, s i z e o f (
har ) , 1 , pa ) ;
rewind ( pa ) ;
fread (& inum , s i z e o f ( int ) , 1 , pa ) ;
fread (& fnum , s i z e o f ( f l o a t ) , 1 , pa ) ;
fread (& pi , s i z e o f ( double ) , 1 , pa ) ;
fread (&
, s i z e o f (
har ) , 1 , pa ) ;
printf ( " %d , %f , %f , %
\ n " , inum , fnum , pi ,
) ;
f
lose ( pa ) ;
return 0;
Uma das prin
ipais apli
aes destas funes a leitura e es
rita de estruturas
riadas pelos usurios. A gravao em binrio da estrutura permite que o
programador ao es
rever ou ler do arquivo se preo
upe somente
om a estrutura
omo um todo e no
om
ada elemento que a
ompe. O programa 11.8 mostra
um exemplo onde estruturas so gravadas e lidas de um arquivo. Neste exemplo
usado um lao para gravar uma estrutura de
ada vez. No entanto, tambm
possvel gravar todas as estruturas de uma vez mudando o ter
eiro parmetro
da funo fwrite(). O lao seria substitudo por
fwrite( &turma[i,
sizeof (stru t
Para testar erro basta veri
ar o valor retornado pela funo. Caso ela tenha
retornado um valor diferente de MAX o
orreu um erro.
189
int
main () {
FILE * pa ;
har nome [40 , linha [80;
PESSOA turma [4 , ba
k [4;
int i ;
for ( i =0; i <4; i ++) {
puts ( " Nome ? " );
fgets ( turma [ i . nome , 40 , stdin ) ;
turma [ i . nome [ strlen ( turma [ i . nome ) -1= ' \0 ';
puts ( " Ano ? " ); fgets ( linha , 80 , stdin ) ;
ss
anf ( linha , " % d " , & turma [ i . ano ) ;
}
puts ( " \ nGravando \ n " );
puts ( " Qual o nome do arquivo ? " ) ; fgets ( nome , 40 , stdin
);
nome [ strlen ( nome ) -1= ' \0 ';
i f (( pa = fopen ( nome , " w + " ) ) == NULL ) {
puts ( " Arquivo nao pode ser aberto " ) ;
return 1;
}
for ( i =0; i <4; i ++) {
i f ( fwrite ( & turma [ i , s i z e o f ( PESSOA ) , 1 , pa ) !=
1)
puts ( " Erro na es
rita . " ) ;
}
rewind ( pa ) ;
for ( i =0; i <4; i ++) {
i f ( fread ( & ba
k [ i , s i z e o f ( PESSOA ) , 1 , pa ) !=
1) {
i f ( feof ( pa ) ) break ;
puts ( " Erro na leitura . " ) ;
}
}
for ( i =0; i <4; i ++) {
printf ( " Nome = % s \ n " , ba
k [ i . nome ) ;
printf ( " Ano = % d \ n \ n " , ba
k [ i . ano ) ;
}
return 0;
190
3
ZE SA
8.5
10.0
ANTONIO SANTOS
7.5
8.5
SEBASTIAO OLIVEIRA
5.0
6.0
O arquivo a
ima um exemplo. Considere ento que nestes arquivos a
primeira linha
ontm o nmero de alunos no arquivo. As linhas seguintes
ontm os seguintes dados:
nome do aluno
om no mximo 50
ara
teres;
nota da primeira prova;
nota da segunda prova.
11.3:
} ALUNO ;
Es
reva um programa que leia de um arquivo,
ujo nome sera forne
ido
pelo usurio, um
onjunto de nmeros reais e armazena em um vetor. O tamanho mximo do vetor e dado pela
onstante TAM_MAX. A quantidade de nmeros
no arquivo varia entre 0 e TAM_MAX. O programa ao nal
al
ula a media dos
nmeros lidos.
11.4:
191
11.6: Crie uma funo que re
eba duas strings
omo parmetros, uma
om um
endereo de arquivo e outra
om um texto qualquer, e adi
ione o texto no m
do arquivo.
11.7: Utilizando a funo do exer
io anterior faa um programa que gere 10
arquivos
om o nome "Teste"e extenses "01", ..., "10". Cada um
ontendo o
texto "Texto do arquivo [NMERO DO ARQUIVO".
11.8: Es
reva um programa para armazenar o telefone de 5 amigos. O programa
deve obrigatoriamente usar a estrutura
FORMATO:
[nome tem [idade anos e [altura de altura
Tel.: [telefone
Es
reva um programa que leia um arquivo texto
ontendo linhas de
dados. Em
ada linha do arquivo h o nome de um aluno e duas notas. Estes
dados esto separados por ponto e vrgula. Existe um ponto e vrgula ao nal
de
ada linha. O formato dos dados e o seguinte:
ze sa; 10.0; 9.0;
antonio silva: 9.0; 7.0;
11.10:
O programa deve ler estes dados e imprimir os valores lidos, a mdia das
duas notas e se o aluno foi aprovado ou no (media 5). O formato de sada :
ze sa 10.0 8.0 9.0 aprovado
antonio silva 9.0 7.0 8.0 aprovado
11.11:
11.12:
arquivo1.
Ol, pessoal!
arquivo2.
Oi,
omo vai?
Neste
aso, os
ara
teres na primeira e d
ima primeira posio so iguais
nos dois arquivos. A sada do seu programa deve ser algo
omo:
192
1 - O
11 - a
indi
ando que os primeiros
ara
teres dos arquivos so iguais (O) bem
omo o
d
imo primeiro (a)
Um arquivo do tipo texto,
hamado numeros.txt
ontm uma quantidade des
onhe
ida de nmeros reais. Es
reva um programa que leia estes nmeros, os
oloque em ordem
res
ente e depois os grave em um arquivo binrio
hamado numeros.bin.
11.13:
Observaes:
(a) Neste exer
io a quantidade de dados gravados no arquivo do tipo
texto des
onhe
ida, portanto, obrigatrio usar um vetor denido
om ponteiro. A denio de um vetor
om um nmero
onstante
de elementos, mesmo que seja um nmero grande,
onsiderado um
erro.
(b) Para testar o programa
rie o arquivo
om um editor simples.
Um programador es
reveu os tre
hos de programas (I) e (II), mostrados
nas listagens 11.9 e 11.10, para ler dados inteiros de um arquivo. O nmero de
dados armazenados no arquivo des
onhe
ido.
11.14:
while
(1)
fs
anf (p , " % d " , & i ) ;
i f ( feof ( p ) ) break ;
printf ( " % d \ n " , i ) ;
while
193
Captulo 12
Problemas Extras
1a Problema:
A sua tarefa des
obrir em quantos minutos Zeno ir
hegar a uma distn
ia
da fonte menor do que 103 m.
Entrada
O seu programa deve imprimir em quantos minutos Zeno ir
hegar na distn
ia desejada.
2a Problema:
Estatsti a?
194
PN 1
xi
N
v
u N 1
u1 X
(xi x)2
= t
N i=0
i=0
(12.1)
(12.2)
Tarefa
1
2
3
4
5
6
7
8
9
10
Sada na tela:
3a Problema:
Cal
ule o valor do mdulo 11 de soma1 . Se este valor for 0 ou 1 ento o algarismo
v1 0,
aso
ontrrio o algarismo v1 o resultado da subtrao 11soma1 % 11.
Para o segundo dgito veri
ador (v2 ), no nosso
aso o 9, o algoritmo o
seguinte: multiplique o primeiro algarismo por 11, o segundo por 10, e assim
su
essivamente at o nono algarismo do
digo e some todos estes resultados.
Neste exemplo teramos
soma2 = (1 11) + (2 10) + (3 9) + + (9 3)
Some este resultado ao dobro do primeiro dgito veri
ador (soma2 = soma2 +
2 v1 ). Cal
ule o valor do mdulo 11 desta nova soma2 . Se este valor for 0
ou 1 ento o algarismo v2 0,
aso
ontrrio o algarismo v2 o resultado da
subtrao 11 soma2 % 11.
Tarefa
Entre
om o
pf.
12345678909
CPF lido: 12345678909
CPF valido.
4a Problema:
#in
lude
#in
lude
#in
lude
#define
#define
#define
int
int
int
int
int
pfs (
har *) ;
verifi
aCPF (
har *) ;
digito1 (
har *) ;
digito2 (
har * , int ) ;
leCPF (
har *) ;
* argv [) {
int
int
int
int
*/
8
2.0
0.0
1.0
3.0
4.0
0.0
4.0
7.0
2.0
0.0
1.0
3.0
4.0
4.0
0.0
7.0
5a Problema:
Sada na tela:
Produto Es alar
(12.3)
Tarefa
198
Exemplo de sada:
2
4
1 1.5
2 2
3 3.5
4 4
2.0 1.0
2.0 2.0
2.0 3.0
4.0 2.5
6a Problema:
32.000000
22.000000
H pessoas que des
onam de tudo,
omo h pessoas que a
reditam em tudo.
Em Pindorama se joga em tudo, Ultrasena, Maxisena, Lotoesportiva et
, desde
que seja o governo que re
ebe todos os lu
ros.
Um dos jogos a Ultrasena, onde os jogadores devem es
olher nmeros entre
1 e 60. O jogador que a
ertar os nmeros sorteados ganha uma frao mnima
do total que o governo arre
adou. Um jogador des
onado a
ha que o sorteio
vi
iado e
ontratou vo
para des
obrir se isto verdade ou no.
Vo
deve es
rever um programa que leia os N ltimos nmeros inteiros
sorteados e
onte a frequn
ia
om que
ada um dos nmeros foi sorteado.
Entrada:
199
Exemplo de entrada
12
8
21
14
5
36
21
43
14
6
21
24
43
7a Problema:
5
6
8
14
21
24
36
43
=
=
=
=
=
=
=
=
1
1
1
2
3
1
1
2
Para
ada
aso de teste da entrada seu programa deve produzir quatro linhas.
Na primeira linha o programa deve imprimir o
aso de teste no formato Teste
n, onde n nmero do
aso de teste
omeando em 1. Na segunda linha o
nmero
onvertido para base 2. Zeros esquerda no devem ser impressos. Na
ter
eira linha o seu programa deve imprimir a maior sequn
ia de 1's do nmero
em binrio. A quarta linha deve ser deixada em bran
o.
Exemplos de entrada e sada:
200
Exemplo de entrada
6
25
123456
14
-1
Teste 1
110
2
Teste 2
11001
2
Teste 3
11110001001000000
4
Teste 4
1110
3
8a Problema:
typedef stru t
_CIRCULO
int x , y , raio ;
} CIRCULO ;
Entrada
Exemplo de Entrada:
5
1
1
3
2
1
1
2
1
2
1
Exemplo de Sada:
Cir
ulo
Cir
ulo
Cir
ulo
Cir
ulo
Cir
ulo
1
2
2
4
3
1
2
3
4
5
area
area
area
area
area
menor ou igual
menor ou igual
menor ou igual
maior
maior
9a Problema:
Lu
rando
om Aes
Vo
foi
ontratado, pela bolsa de valores de Pindorama, para es
rever um
programa que imprima as aes
om o melhor e o pior desempenho durante o
ano de 2325.
Entrada
Exemplo Sada:
10a Problema:
Somando Linhas
Es
reva um programa que leia de um arquivo texto uma matriz quadrada de
nmeros reais. O tamanho mximo da matriz 10001000. O nome do arquivo
de entrada matrizin.txt. O seu programa deve
al
ular a soma de todos
os elementos de
ada linha. Em seguida o seu programa deve des
obrir qual a
maior soma e que linha tem soma igual a maior soma. O programa deve gravar
202
5
1.0
2.0
3.0
5.0
1.0
2.0
1.0
0.0
1.0
1.0
3.0
2.0
0.0
0.0
1.0
4.0
1.0
0.0
2.0
1.0
Exemplo de Sada:
14.000000
1
2
3
2.0
8.0
11.0
6.0
1.0
11a Problema:
Misturando Dados
Uma tarefa muito
omum em
omputao misturar dois vetores dados j
ordenados para
riar um ter
eiro tambm ordenado.
A sua tarefa es
rever um programa que leia os dados de dois vetores e os
misture em um ter
eiro.
Considere que o tamanho mximo de
ada um dos dois vetores originais
des
onhe
ido.
Entrada
A leitura dos dados vai ser feita da seguinte maneira. Primeiro o programa
deve ler o tamanho do primeiro vetor (tam1). Em seguida o programa deve ler
tam1 nmeros reais. Aps estas leituras o programa l o tamanho do segundo
vetor (tam2). Finalmente, o programa l tam2 nmeros reais. Considerar que
os dados do primeiro e do segundo vetor esto em ordem
res
ente.
Sada
203
Exemplo de Sada:
5
1.0
4.0
7.0
10.0
12.0
3
1.0
2.0
9.0
1.0
1.0
2.0
4.0
7.0
9.0
10.0
12.0
204
Apndi
e A
Tabela ASCII
A tabela ASCII (Ameri
an Standard for Information Inter
hange) usada por
grande parte da indstria de
omputadores para a tro
a de informaes e armazenamento de
ara
teres. Cada
ara
tere representado por um
digo de
8 bits. A Tabela A.1 mostra os
digos para a tabela ASCII de 7 bits. Existe
uma table estendida para 8 bits que in
lui os
ara
teres a
entuados.
Para saber qual o
digo de um
ara
tere na base 10 junte o dgito da
primeira
oluna da tabela
om o dgito da primeira linha da tabela. Por exemplo,
o
digo da letra a mins
ula 97 na base 10.
0
1
2
3
4
5
6
7
8
9
10
11
12
0
nul
nl
d
4
rs
(
2
<
F
P
Z
d
n
x
1
soh
vt
nak
us
)
3
=
G
Q
[
e
o
y
2
stx
syn
sp
*
4
>
H
R
\
f
p
z
3
etx
r
etb
!
+
5
?
I
S
g
q
{
4
eot
so
an
"
,
6
J
T
^
h
r
|
5
enq
si
em
#
7
A
K
U
_
i
s
}
6
a
k
dle
sub
$
.
8
B
L
V
'
j
t
~
7
bel
d
1
es
%
/
9
C
M
W
a
k
u
del
8
bs
d
2
fs
&
0
:
D
N
X
b
l
v
9
ht
d
3
gs
`
1
;
E
O
Y
m
w
205
Cara
nul
stx
eot
a
k
bs
lf
so
dle
d
2
d
4
syn
an
sub
fs
rs
sp
Des rio
Cara
soh
etx
enq
bel
ht
vt
r
si
d
1
d
3
nak
etb
em
es
gs
us
Des rio
Tabela A.2: Conjunto de digos espe iais ASCII e seus signi ados
206
Apndi
e B
Palavras Reservadas
auto:
Comando usado para sair in
ondi
ionalmente dos
omandos for, while,
swit
h, and do...while.
break:
ase:
har:
onst:
ontinue:
default:
do:
double:
else:
Comando que indi
a um blo
o de
omandos alternativo que deve ser exe
utado quando a
ondio testada pelo
omando if foi avaliada
omo
FALSA.
207
Tipo denido pelo usurio que permite a denio de variveis que iro
a
eitar somente
ertos valores.
enum:
Modi
ador de dados que indi
a que uma varivel ir ser de
larada em
outra rea do programa.
extern:
oat:
for:
goto:
if:
Comando que
ausa um pulo para uma posio do programa mar
ada
om um rtulo.
int:
long:
Tipo de dados usado para armazenar valores inteiros
om pre
iso maior
do que o tipo int. Nos
omputadores modernos o tipo long tem a mesma
pre
iso que o tipo int e so usados 4 bytes.
Espe
i
ador de
lasse de armazenamento que pede que,
aso seja
possvel, uma varivel deve ser armazenada nos registradores do pro
essador.
register:
return:
Tipo de dados usado para armazenar valores inteiros em pre
iso menor
do que o tipo int. Neste tipo 2 bytes so usados para armazenar os dados.
short:
Modi
ador usado para indi
ar que uma varivel pode armazenar tanto
valores positivos
omo negativos.
signed:
sizeof:
stati :
stru t:
swit h:
typedef:
Modi ador usado para riar novos nomes para tipos j existentes.
union:
208
Modi
ador usado para signi
ar que uma varivel
onter somente
valores positivos.
unsigned:
void:
volatile:
Modi ador que signi a que uma varivel pode ser alterada.
Comando de teste que exe uta uma seo de digo enquanto uma ondio retorna VERDADEIRO.
while:
209