Вы находитесь на странице: 1из 263

SANDRA PUGA

GERSON RISSE I li

www. pre n h a

ll.co m/ pu ga_br

Sandra Puga
,

Gerson Rissetti

I Ca

com aplicaes
em Java

PEARSON
Prentice
Hali

So Paulo
Brasil
Espanha

Argentina

Guatemala

Colmbia
Mxico

Costa Rica

Peru

Chile

Porto Rico

Venezuela

2004

by Sandra Puga e Gerson Rissetti

Todos os direitos reservados. Nenhuma parte desta publicao


poder ser reproduzida ou transmitida de qualquer modo
ou por qualquer outro meio, eletrnico ou mecnico, incluindo fotocpia,
gravao ou qualquer outro tipo de sistema de armazenamento e transmisso
de informao, sem prvia autorizao, por escrito, da Pearson Education do BrasiI.
Diretor editorial: Jos Martins Braga
Editor: Roger Trimer
Editora de texto: Patrcia C. Rodrigues
Preparao: Maurcio Kibe
Reviso: Thelma G uimares e juliana Takahashi
Capa: Marcelo Franozo
Projeto grfico e diagramao: Figurativa Arte e Proj eto Editorial

Dados Internacionais de Catalogao na Publicao (CIP)


(Cmara Brasileira do livro, SP, Brasil)

Puga, Sandra
Lgica de programao e estruturas de dados, com aplicaes em Java I
Sandra Puga, Gerson Rissetti. --So Paulo : Prentice Hall, 2003.

ISBN 85-87918-82-6
1. Dados - Estruturas (Cincia da computao)
2. Java (Linguagem de programao para computador).

3. Lgica I. Rissetti, Gerson. 11. Ttulo.

03-5239

CDD-005.1
'

lndices para catlogo sistemtico:

1. Lgica estruturada : Computadores :

Processamento de dados

005.1

2004

Direitos exclusivos para a lngua portuguesa cedidos


Pearson Education do Brasil, uma empresa do grupo Pearson Education
Av. Ermano Marchetti, 1435, Lapa
CEP: 05038-001, So Paulo- SP, Brasil
Tel.: (11) 3613-1222. Fax: (11) 3611-0444
e-ma iI: vendas@pearsoned.com

AGRAD E CI M E NTO E SPECIAL


Agradecemos aos professores e amigos Marcos Alberto Bussab e Robert Joseph
Didio pela grande colaborao na tarefa de revisar e criticar o nosso livro.
SGP e GR

,.

DED ICATORIA E AGRADECI M E NTOS


Dedico este trabalho ao Pedro, pois este pequeno personagem foi quem me deu
motivao para organizar e produzir este material.
Agradeo Antonia por ter cuidado de mim e do Pedro durante as longas horas
de trabalho.
SGP

SUMARIO

APRESENTAAO .

. . .

. . .

. . .

. . .

..

. .

. .

. . . .

. . .

. .

..

. . . . . . . . . .

..

. .

XI

. . .

INTRODUAO ......................................................... XIII


,.

CAPITULO 1

'

,.

INTRODUAO A LOGICA .... . . .. . ....... ..


.

0 USO DO RACIOCNIO LGICO NO DIA-A-DIA

0 USO DA LOGICA APLICADA A INFORMATICA

'

... ...... ... .. .....


.

.... ......... .. . .......... .... 2

1.1
.

. .

..

. .
.

......

. .

. .
.

. . .

EXERCCIOS PARA FIXACO ............................................................. 4

EXERCICIOS COMPLEMENTARES ...................................................... 5

1 .4
,.

CAPITULO 2

INTRODUAO AOS ALGORITMOS . ....... .............. ... ..... 8


.

2. 1

2.3

PSEUDOCODIGO .

2.3. 1

2.6

....

..

DECLARAAO DE VARIAVEIS
CORPO DO ALGORITMO . .
.

FLUXOGRAMA

2 .4. 1

IDENTIFICAO DO ALGORITMO

2.3.3

2.5

. .

TIPOS DE ALGORITMOS .. ........ ....... .... . . ...... . ...... ... ...

2.3.2

2.4

ALGORITMOS APLICADOS SOLUO


DE PROBLEMAS COMPUTACIONAIS

2.2

. .

..
.

..
.

..
.

..

......

. . .

....

. . .

9
9

10

. 10
.

............... ... .... ...... .............. 11


.

.
.

...
.

..
.

..
.

.
.

...
.

. . .

12

12

SIMBOLOGIA .......................... ....................... ................ 12


.

EXERCICIOS PARA FIXAAO ........................................................... 1 4


EXERCCIOS COMPLEMENTARES

..

. ..
.

..

....

..

...

..

...

...

. 15

'

VIII

LOGICA DE PROGRAMAAO E ESTRUTURAS DE DADOS


,

CAPITULO 3
,

CONCEITOS BASICOS SOBRE ALGORITMOS


3. I

TIPOS DE DADOS
3. I 1

. . .

. . . .

'

. . .

TIPOS CONSTRUIDOS .

'

3.2

VARIAVEIS

. .

. . . . . . .

..

..

. . . . . .

...

. .
.

. . . .

. . . . . .

..

. .
.

. . . . . .

. .

..

16

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

'

3.2.1

IDENTIFICAAO DAS VARIAVEIS PARA OS ALGORITMOS

3.2.2

IDENTIFICADORES DE VARIVEIS PARA


A LINGUAGEM JAVA

3.3

CONSTANTES ..

3.4

OPERADORES .

..

. . . . . . . . . . . . . . .

. . .

. . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. .

. . . .

..

. . . . . . . . . . . . . . . . . . . . . . . .

..

...
. . .

. . .

. . . . . . . . . . . . . . . .

. . .

3.4.1

OPERADORES DE ATRIBUIAO

3.4.2

OPERADORES ARITMETICOS

3.4.3

OPERADORES RELACIONAIS

3.4.4

OPERADORES LOGICOS

3.4.5

PRECEDENCIA DOS OPERADORES

...

. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

'

. . .

. . . . .

'

...

..

TABELA-VERDADE

3.6

EXERCCIOS PARA FIXAAO

3.7

EXERCCIOS COMPLEMENTARES

. .

. .

. . .

..
.

. . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . .

. . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

3.5

. . .

. .

.
.

. . . . . . . . .

. . .

. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o

o o .

. .

..

. .

. . . . . .

. . . .

o o

. o

. . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

o o

. . . . . . . . . . . . . . . . . . .

17
19
19
20

20
21
21
21
22
23
23
23
25
26
27

CAPITULO 4
29

CONCEITOS DE PROGRAMAAO
'

4. I

INTRODUAO A PROGRAMAAO

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.2

TIPOS DE PROGRAMAAO

4.3

o o

o o .

o o o . . . . . . . . . . . .

o o

4.2.1

CONCEITOS SOBRE A PROGRAMAO LINEAR

4.2.2

CONCEITOS SOBRE A PROGRAMAO ESTRUTURADA

. . .

. . . . .

. . . . . . .

'

0 QUE E UM OBJETO

4.3.2

COMO VISUALIZAR UM OBJETO? ...

4.3.3

CONCEITO DE CLASSES

4.3.4

INSTNCIAS DE OBJETOS

4.3.5

HERANA

4.3.6

POLIMORFISMO ...

4.3.7

ENCAPSULAMENTO

4.3.8

APLICAAO

. . . . . . . . . .

CONCEITOS SOBRE A PROGRAMAO ORIENTADA A OBJETOS


4.3.1

. . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . .

o .

. . . . . . . . .

..

. .

. .

. . . .

. . .

...

. . . .

. .

. . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .

. .

. . . . . . . . . . .

o o o

. .

o o

...

. . . . . . . . . . . . . . . . . .

o .

. .

...

o o

o o . o

o o

o o o

. . . . . . . .

'

. . .

4. 4

EXERCICIOS PARA FIXAAO

4.5

EXERCCIOS COMPLEMENTARES

. . . . . . . . . . . . . . . . .

. . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . .

30
32
32
32
34
36
37
.37
38
39
39
39
41
45
45

CAPITULO 5
CONSTRUO DE ALGORITMOS:
ESTRUTURAS DE CONTROLE
S. 1

ENTRADA

0 0 0 o o o

0 0 0

46

ooo o 47

'

IX

SUMARIO
'

SAlDA

5.2

... .
.

. .

. .

.5.3

ESTRUTURAS DE SELEAO OU DECISAO

5.4

ESTRUTURAS DE SELEO SIMPLES

5.5

ESTRUTURAS DE SELEO COMPOSTAS

5.6

ESTRUTURAS DE SELEO ENCADEADAS

5.7

ESTRUTURAS DE SELEO DE MLTIPLA ESCOLHA

5.8

ESTRUTURAS DE REPETIO

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . .

. .

. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

'

5.8. 1

. . 48

53
54
56
58
62
66

ESTRUTURA DE REPETIAO COM TESTE NO INICIOESTRUTURA ENQUANTO

5.8.2

. .

. .

66

ESTRUTURA DE REPETIO COM TESTE NO FIMESTRUTURA REPITA

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

'

5.8.3

69

ESTRUTURA DE REPETIAO COM VARIAVEL


DE CONTROLE- ESTRUTURA PARA

5.9

EXERCCIOS PARA FIXAAO

5 . 1o

EXERCCIOS SUGERIDOS

5 .1 1

EXERCICIOS COMPLEMENTARES

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. .

'

. . . .

. . .

. .

. .

. .

72
74
75
76

"

CAPITULO 6
ESTRUTURA DE DADOS: VETORES
6.1

ESTRUTURAS INDEXADAS - VETOR (ARRAY)

6.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

. . .

6.1. 1

DECLARAAO DE VETOR

6.1 .2

ACESSO E ATRIBUIO DE VALOR EM VETORES

6. 1.3

OPERAES

. . .

CONCEITO DE MATRIZES
6.2. 1

DECLARAO

6.2.2

OPERAOES

. . . .

.. ......
.

. . . .

... .. ...
.

. . .

. .

. .

. . . .

......

. . . .

..

. .

. .

. . . .

...

. . .

. . . . .

. .

. . ..
.

. . .

. .

...

. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-

EXERCCIOS PARA FIXAAO

6.4

EXERCICIOS COMPLEMENTARES

'

. . . .

. . .

. . .

86
95

.. 96

6.3

79

. 81

. . .

79

96

102

. . 104
.

"

CAPITULO 7
1 05

PROCEDIMENTOS E FUNOES
7.1

PROCEDIMENTOS
7 .1.1

CHAMADA DE PROCEDIMENTOS

o o

. . . . . .

. . . . .

. .

. .

. . .

. . .

7.2

FUNOES

7.3

ESCOPO DE VARIAVEIS . .

7.4

PARAMETROS

'

. . . . .

. .

. . . . .

. . . . . . .

. .
.

. . . .

... .
.

. . . .

...

. . . . . . .

..

. . . .

. .

. . . .

. .

. . .

. .

PARAMETROS FORMAIS

7.4.2

PARAMETROS REAIS . .

7.4.3

PASSAGEM DE PARAMETROS

7.4.4

PASSAGEM DE PARAMETROS POR VALOR

7.4.5

PASSAGEM DE PARAMETROS POR REFERENCIA

. .

. . . .

. . .

. . . . .

. . .

..

. . . . . . .

. .

. . . . . .

..

. . . . .

. . .

. . . . . . . . . . .

. . . . . .

. . .

"

'

. . . . . . . . . . . . . . . . .

7.5

EXERCICIOS PARA FIXAAO

7.6

EXERCCIOS COMPLEMENTARES

..

. . .

. . .

.... .

....

....

. . . . .

1 16

. 1 16

1 13

7 .4. 1

108

. ... 1 15

106

1 17
1 19
1 19
1 20
1 20
120

'

LOGICA DE PROGRAMAAO E ESTRUTURAS DE DADOS

CAPITULO 8
BUSCA E ORDENAO

8. I

ORDENAAO POR TROCAS- METODO DA BOLHA

8.2

8USCA .

. . . . . . . .

. . . . . . . . .

..

..

. .

..

. .

. .
.

BUSCA LINEAR (OU SEQENCIAL)

8.2.2

BUSCA BINRIA (OU BUSCA LOGARTMICA) .....

..

EXERCICIOS PARA FIXAAO

8.4

EXERCICIOS COMPLEMENTARES

. . . . . . . .

..

.. I 23
.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . .

8.3

. .

1 22

. . . . . . . . . . . . . . . . .

8.2. I
/

'

. . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . .

. .
.

. . .

131
131

. I 37

. . . . . . . . . . . . . . .

'

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

I 41
142

CAPITULO 9
ACESSO A ARQUIVOS

1 43

'

9. I

. .............................................................. 144
O QUE E UM ARQUIVO?

9.2

ARQUIVO-TEXTO

9.3

TIPOS DE ARQUIVO QUANTO AS FORMAS DE ACESSO

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . .

. . . . . .

'

9.3.1

ARQUIVOS SEQENCIAIS

9.3.2

ARQUIVOS DE ACESSO ALEATORIO

. . . . . . . . . . . .

OPERAES DE MANIPULAO DE ARQUIVOS

9.4

SEQUENCIAIS
9.4.2

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . .

. . . . .

. . . . . . . .

. . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. .

. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

'

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. .

9.5

EXERCICIOS PARA FIXAAO

9.6

EXERCICIOS COMPLEMENTARES

'

. . .

. . . . . . . . . . . . .

10

..

..

. .

LISTAS

. . .

. .

..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

I 45
145
146
146

146

LISTAS ENCADEADAS .

10. 1.2

TIPOS DE LISTAS ENCADEADAS

10.2

LISTAS DE ENCADEAMENTO SIMPLES ...

10.3

LISTAS DUPLAMENTE ENCADEADAS

10.4

FILAS

10.5

PILHAS

10.6

ARVORES

..

. .

. .

. . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . . . . .

.
.

. . . .

...

..

. . .

. . . . . . . . .

..

. . . . . . . . . . . . .

10.6. 1

'

. . . . .

. .

'

. . . . . . . .

..

. . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . .

'

ARVORES BINARIAS

. .

. . .

..

. .

. . . . . . . . . . . . . . . . . . . . . . . .

..

. .

o . o o

. . . . . . . .

. . . . . o o o o o o o o o o o o o o o o o o o o . o o o o o o o o o

EXERCICIOS PARA FIXAAO

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

I 80
I 81

183
184
186

. 187

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

'

I 65

182

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10.1.1

. . . . . . . . .

. .

"

ESTRUTURAS DE DADOS DINAMICAS

10.7

. .

REPRESENTAO DA MANIPULAO DE ARQUIVOS


'

10.1

DE ACESSO ALEATORIO

CAPITULO

. . .

1 44

REPRESENTAAO DA MANIPULAAO DE ARQUIVOS

9.4.1

..

. . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . .

'

. . .

201
205
213
220
221
233

ANEXO
CONCEITOS SOBRE A LI NGUAGEM JAVA

,236

APRESENTAO

m livro que aliasse a lgica de programao, que efetivamente praticada nos


meios acadmicos, com sua implementao na linguagem Java era um anseio de
professores e alunos, e a esse anseio que esta publicao vem atender.
O livro aborda desde os princpios bsicos de lgica at assuntos mais comple
xos, mas igualmente necessrios, numa linguagem que, sem perder o rigor cientfico
necessrio s obras desse porte, compreensvel pelos estudantes de diferentes graus de
conhecimento e dificuldade. Os tpicos vo desfilando de maneira didtica e tecnica
mente adequada, tornando o aprendizado uma tarefa menos rdua. O texto rico em
exemplos e h uma srie de exerccios prticos com diferentes graus de dificuldade.
Esta obra , acima de tudo, um reflexo da experincia profissional e acadmica
de seus autores e uma contribuio de suma impo11ncia para a bibliografia nacional na
rea de computao e informtica.

Prof. Marcos Alberto Bussab


Coordenador da rea de cincias da computao da Uninove

INTRODUO

L destinado a todas as pessoas interessadas em programao de computadores,

gica de programao e estruturas de dados com. aplicaes em Java um livro

mas especialmente aos estudantes da rea de computao, pois foram eles nossa grande
fonte de inspirao - muitos dos exemplos e exercicios so frutos colhidos nas salas de
aula.
Procuramos sintetizar num nico livro os assuntos que julgamos essenciais para
contribuir para a formao de um bom programador: lgica de programao, estrutura
de dados e aplicaes em Java. Escolhemos a linguagem de programao Java para
implementao dos algoritmos por dois motivos: a necessidade de profissionais espe
cializados em Java e a necessidade de uma bibliografia bsica que mostrasse passo a
passo o uso de estruturas de seleo, repetio, ordenao, filas e pilhas, dentre outros,
implementadas em Java.
A linguagem de programao Java fundamentalmente orientada a objetos, mas
nosso objetivo no estudar esse tipo de programao. Faremos uso de recursos bastan
te simples, sem nos preocuparmos com questes mais sofisticadas da orientao a obje
tos, que sero levemente abordadas no Captulo 4.
Os conceitos aqui abordados podero ser adaptados s questes encontradas no
dia-a-dia, inclusive com o uso de outras linguagens, uma vez que todos os exemplos so
descritos em pseudocdigo e depois transcritos para Java.

XIV

- E ESTRUTURAS DE DADOS
LOGICA DE PROGRAMAAO
'

No Captulo 1 so abordados algw1s conceitos da lgica como cincia pura, ain


da sem a sua aplicao na computao. Sem grandes pretenses, queremos apenas mos
trar que o uso da lgica faz parte de nosso cotidiano.
No Captulo 2 mostramos algumas das aplicaes dos algoritmos na resoluo
de diferentes tipos de problemas. E apresentada uma breve introduo ao conceito de
entrada, processamento e sada e tambm so apresentados os tipos de algoritmos
pseudocdigo e fluxograma.
No Captulo 3 so apresentados os tipos de dados bsicos e seus desdobramentos
na linguagem de programao Java. Alm disso, so definidos o conceito, a aplicao e
a identificao de variveis e constantes e demonstrado o uso dos operadores de atri
buio, aritmticos, relacionais e lgicos tanto na notao algortmica como na lingua
gem de programao Java. Nesse captulo tambm so exemplificados a construo de
expresses de atribuio, aritmticas e lgicas, a ordem de precedncia matemtica uti
lizada na resoluo de problemas e o uso da tabela-verdade como recurso facilitador do
entendimento do uso dos operadores lgicos.
O Capitulo 4 aborda de maneira bastante simplificada alguns dos paradigmas da
programao: linear, estruturada e orientada a objetos.
No Captulo 5 - que aquele que trata dos conceitos relacionados lgica de
programao - so estudados os recursos para entrada e sada de dados e o uso de
esttuturas de repetio e seleo. E por meio do uso dessas estruturas que o programador cria rotinas para controle do fluxo dos dados em seus programas - rotinas que
possibilitem o acesso ou no a determinadas informaes e que implementem estruturas
de dados mais sofisticadas.
O Captulo 6 trata das estruturas de dados estticas e homogneas, isto , dos
vetores e matrizes, e das operaes que estas suportam. Tambm so abordadas algumas
aplicaes prticas.
No Captulo 7 so abordados alguns recursos que melhoram a legibilidade do
cdigo de programao ou do algoritmo e que podem possibiJitar a reutilizao do cdi
go por outros programas; estes recursos so os procedimentos, as funes e os parme
tros que so passados para eles.
No Captulo 8 so apresentados recursos para facilitar a ordenao das informa
es que sero armazenadas ou manipuladas e para possibilitar a busca de informaes
especficas.
O Captulo 9 trabalha as tcnicas de criao e manipulao de arquivos-texto
seqenciais e randmicos.
O Captulo I O aborda as estruturas de dados, pilhas, filas e rvores de maneira
simples e com exemplos que ilustram, passo a passo, como criar e utilizar essas estruturas.
Por ltimo, no anexo, so apresentados alguns recursos do Java.
'

'

Assim, este livro procura de maneira bastante simples abordar algumas questes
que, por vezes, parecem muito complexas ao programador iniciante; todos os assuntos
so explicados e exemplificados por meio de solues comentadas. Ao final de cada

INTRODUO

XV

captulo existem exerccios propostos, os quais tem como objetivo fixar o contedo
estudado ou ento, no caso de exerccios mais sofisticados, complementar o aprendiza
do. No site da editora esto disponveis outros exerccios complementares e desafios.
Esperamos, com este livro, poder contribuir para o aprendizado dos nossos
leitores.
Sandra Gavioli Puga e Gerson Rissetti

PIT

UL

INTRODUO
'

A LOGICA

Introduo lgica
Aplicaes da lgica
Exerccios para fixao
Exerccios complementares

OBJETIVOS:

Abordar o conceito de lgica como cincia; desta


car o uso da lgica de maneira muitas vezes incon
dicional, nas tarefas do dia-a-dia; usar o raciocnio
lgico para a tomada de decises e para a resoluo
ele problemas.

filsofo grego Aristteles considerado o criador da lgica. No entanto, ele no


a chamava assim, denominava-a 'razo'. O termo 'lgica' s passou a ser utiU
zado mais tarde.
A palavra 'lgica' originria do grego fogos, que significa linguagem racional.
De acordo com o dicionrio Michaelis, lgica a anlise das formas e leis do pensa
mento, mas no se preocupa com a produo do pensamento, quer dizer, no se preocu
pa com o contedo do pensamento, mas sim com a forma deste, isto , com a maneira
pela qual mn pensamento ou uma idia so organizados e apresentados, possibilitando
que cheguemos a uma concluso por meio do encadeamento dos argumentos.
Os argumentos podem ser dedutivos ou indutivos. Os argumentos indutivos so
aqueles com que, a partir dos dados, se chega a uma resposta por meio da analogia, ou

- E ESTRUTURAS DE DADOS
LOGICA DE PROGRAMAAO
'

seja, pela comparao com algo conhecido, porm esse tipo de raciocnio no oferece
certeza de que a resposta ser de fato verdadeira. E necessrio conhecer os fatos ou as
situaes para que se possa fazer a comparao. Por exemplo: ontem no havia nuvens
no cu e no choveu. Hoje no h nuvens no cu, portanto no vai chover.
J os argumentos dedutivos so aqueles cuja concluso obtida como conse
qncia das premissas, isto , por meio da anlise das situaes ou fatos, pode-se obter
a resposta. Trabalha-se com a forma das sentenas, sem que haja necessidade do conhe
cimento prvio das situaes ou fatos. Por exemplo: Joana uma mulher. As mulheres
so seres humanos. Logo, Joana um ser humano.
A lgica nos permite caminhar pelos limiares das diversas cincias!
'

1.1

0 U S O DO RACIOCI N I O LOGICO NO DIA-A-DIA

Desde os tempos primitivos o homem utiliza-se do raciocnio lgico para a rea


lizao das suas atividades. Isso comprovado pelo fato de ele ter estabelecido seqn
cias adequadas para a realizao das suas tarefas com sucesso. Podemos citar alguns
exemplos relacionados s suas atividades do dia-a-dia:

1.2

Uma pessoa adulta, para tomar banho, primeiro tira a roupa para no molh
la e tambm para estabelecer contato direto entre sua pele e a gua.
Uma criana, desde pequenina, aprende que, para chupar uma bala, preciso
tir-la da embalagem.
Foi utilizando-se do raciocnio lgico que o homem conseguiu criar a roda!
/

'

0 USO DA LOGICA A P L I CADA A I N FO R MATICA

A lgica aplicada a diversas cincias, tais como a informtica, a psicologia e a


fsica, entre outras. Na informtica e na computao, apJjca-se a todas as suas reas,
para a construo e funcionamento do hardware e do software. Por exemplo, na constnt
o de um circuito integrado para o teclado, trabalha-se com o conceito de portas lgi
cas para a verificao da passagem ou no de pulsos eltricos, a fim de que seja estabe
lecida uma comunicao entre os componentes. J na constmo de software, por
meio do raciocnio lgico que o homem constri algoritmos que podem ser transforma
dos em programas de computador capazes de solucionar problemas cada vez mais complexos. E justamente esse assunto que estudaremos neste livro.
,

NOTA:

Hardware- Parte fsica do computador- peas. Exemplo: teclado.


Software- Parte lgica do computador- programas. Exemplo: Windows.
Algoritmo - Seqncia de passos ordenados para a realizao de uma tarefa.
Programa - Conjunto de instrues legveis para o computador e capazes de

realizar tarefas.

"

...

"'

CAPITULO I - INTRODUAO A LOGICA

Para nos auxiliar na resoluo dos problemas de construo de algoritmos apli


cados informtica, faremos uso da lgica formal dedutiva. No entanto, para que sejam
reunidos dados para a soluo dos problemas, muitas vezes utilizaremos o raciocnio
lgico indutivo.
Como foi visto anteriormente, a lgica preocupa-se com a forma da construo
do pensamento. Isso permite que se trabalhe com variveis para que se possa aplicar o
mesmo raciocnio a diferentes problemas. Por exemplo:
Gerson cientista.
Todo cientista estudioso.
Logo, Gerson estudioso.
Substituindo as palavras 'Gerson' e 'estudioso' por A e B:
A cientista.
Todo cientista B.
Logo, A B.
NOTA:

Variveis- Vide o Captulo 3.

O raciocnio lgico nos conduz a uma resposta que pode ser 'verdadeiro' ou
'falso'. Na construo de algoritmos para a soluo de problemas computacionais, tra
balha-se com esse tipo de raciocnio. As informaes a ser analisadas so representadas
por variveis que posteriormente recebero valores. As variveis, por sua vez, represen
taro as premissas. Por exemplo:
Dados dois valores quaisquer, deseja-se saber qual o maior.
Os dois valores so representados pelas variveis A e B. Analisa-se o problema a
fim de averiguar qual a melhor manei_ra de descobrir a soluo, ento se monta a
seqncia para que seja verificada a questo. Para descobrir a soluo, pode-se partir de
problemas similares j resolvidos e, por analogia, aplicar o mesmo mtodo ao problema
atual, ou podem-se estudar formas de resolv-lo buscando dados com especialistas no
assunto em questo.
Nesse caso, vamos substituir as variveis por valores conhecidos, apenas como
modelo para facilitar o entendimento do raciocnio aplicado:
A ser substituda por 7 e B, por 19.
Para que seja verificado o maior valor, deve-se fazer uma compara
o, por exemplo: 7 maior do que 19?
Logo tem-se a resposta: falso.
Ento, pode-se concluir que 1 9 o maior nmero entre os dois.
I.: EM BRE-sE:

A resposta a uma questo deve ser 'verdadeiro' ou 'falso'; nunca pode


ser as duas opes ao mesmo tempo.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Quando os valores so desconhecidos, na representao para a soluo do problema, trabalha-se apenas com as variveis:
A maior do que B?
Se a resposta 'verdadeiro', A o maior valor.
Se a resposta 'falso', B o maior valor.

NOTA:

1 .3

No est sendo considerada a possibifidade de os vafores de A e 8


serem iguais, por se tratar apenas de um exempfo para a construo do
raciocnio, no sendo (evada em conta a compfexidade do probfema
em questo para o caso de uma impfementao.
/

EXERCICIOS PARA FIXACAO


.;,

1 . Dadas as premissas a seguir, verifique quais so as sentenas que represen


tam a concluso correta:
I - Cavalos so animais. Animais possuem patas. Logo:
a) Cavalos possuem patas.
b) Todos os animais so cavalos.
c) Os cavalos possuem quatro patas.
1 1 - Retngulos so figuras que tm ngulos. Temos uma figura sem nenhum
ngulo. Logo:
a) Essa figura pode ser um crculo.
b) No possvel tirar concluses.
c) Essa figura no um retngulo.

III Se o verde fotte, o vermelho suave. Se o amarelo suave, o azul


mdio. Mas ou o verde forte ou o amarelo suave. Forte, suave e mdio so
as nicas tonalidades possveis. Logo:
-

a) O azul mdio.
b) Ou o vermelho suave ou o azul mdio.
c) O amarelo e o vermelho so suaves.
2.

Responda:
a) Qual a importncia da lgica para a informtica?
b) Descreva algumas atividades relacionadas ao seu dia-a-dia nas quais o
uso da lgica se faz presente e perceptvel.
c) O que so argumentos?
d) Qual a diferena entre argumentos dedutivos e argumentos indutivos?
Exemplifique.

"

CAPITULO 1

- INTRODUAO

A LOGICA

3. Analise e descreva uma maneira de mover os discos do pino A para o pino C,

mantendo a mesma ordem. Em hiptese nenhuma um disco maior poder


ficar sobre um menor. Para que um disco seja movido de A para C, deve-se
passar pelo pino B e vice-versa.

1 .4

EXERCICIOS CO M P L E M E NTARES
1 . Dadas as premissas a seguir, verifique quais so as sentenas que represen
tam a concluso correta:
I Voc est dirigindo seu carro. Se brecar repentinamente, um caminho
bater na traseira dele. Se no brecar imediatamente, voc atropelar uma
criana que est atravessando a estrada. Logo:
-

a) As crianas devem afastar-se das estradas.


b) O caminho bater na traseira de seu carro ou voc atropelar a criana.
c) O caminho vai muito depressa.
- Somente quando B X, K Z. E X ou Z somente quando K no Z.
Duas letras no podem ser uma s. Logo:
TI

a) Quando B X, E no X nem Z.
b) Quando K Z, X ou Z E.
c) Quando B no X, E no X nem Z.
111 - Quando B maior que A, J menor que A. Porm, A nunca maior que
B e jamais igual a B. Logo:
a) J nunca menor que B.
b) J nunca menor que A.
c) J nunca maior que B.
IV - Todas as plantas verdes tm clorofila. Algumas coisas que tm clorofila
so comestveis. Logo:
a) Alface comestvel.
b) Algumas plantas verdes so comestveis.
c) Alface tem clorofila.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

2.

De acordo com as pistas de cada uma das histrias, descubra o que se pede:
a) As amigas de Maria organizaram um ch-de-panela para comemorar seu
casamento, que estava prximo. Como de costume, cada amiga compa
receu reunio com um presente devidamente embrulhado. O ch-de
panela consiste em uma brincadeira que feita com a noiva, na qual ela
deve adivinhar o presente contido em cada embrulho que recebe. Se errar,
recebe castigos. Sua tarefa descobrir o presente que cada amiga levou.
De acordo com as dicas abaixo, preencha a tabela.
Maria adivinhou os presentes de Janete e Sandra.
Maria no adivinhou o contedo do embrulho que continha uma garrafa
trmica, por isso teve de vestir uma fantasia de coelhinha.
Mrcia pediu que Maria danasse a dana da garrafa.
Renata a castigou com uma maquiagem de palhacinho.
- Maria acertou os embrulhos da frigideira e da jarra para suco.
O faqueiro no foi presente de Izabel.
Por ter errado o caldeiro, Maria acabou ficando embriagada.
- No embrulho de Sandra estava escrito 'frgil' e isso facilitou muito a
descoberta.
Colega

Presente

b) Oito carros de equipes diferentes esto alinhados lado a lado para uma
corrida. De acordo com as pistas abaixo, descubra a ordem dos carros
para a largada e a cor de cada carro. (Obs.: a cor utilizada no a cor
original das equipes.)
O carro branco est esquerda do Lotus.
O carro da equipe Ferrari est entre os carros vermelho e branco.
O McLaren o segundo carro esquerda do Ferrari e o primeiro direita
do carro azul.
O Sauber no tem cano sua direita e est logo depois do carro preto.
O carro preto est entre o Sauber e o carro amarelo.

"

CAPITULO 1

- INTRODUAO

....

_,

A LOGICA

- O Jaguar no tem cano algum sua esquerda e est esquerda do carro


verde.
'

- A direita do carro verde est o Renault.


- O Jordan o segundo carro direita do carro prata e o segundo esquerda
do carro laranja.
O Toyota o segundo carro esquerda do Minardi.
3. Um pastor deve levar suas trs ovelhas e seus dois lobos para o pasto que fica

ao sul da regio. Ele deve levar tambm a proviso de alimentos para as


ovelhas, que consiste em dois maos de feno. No entanto, no meio do cami
nho existe um grande rio cheio de piranhas e o pastor tem apenas um peque
no barco sua disposio, que lhe permite levar dois 'passageiros' de cada
vez. Considere como passageiros as ovelhas, os maos de feno e os lobos e
considere que, se as ovelhas ficarem em menor nmero do que os lobos,
sero comidas e que, se o feno ficar com as ovelhas sem um lobo por perto,
as ovelhas comero o feno. Ajude o pastor a atravessar o rio e preservar suas
posses.

"

PIT

UL

Java_cap-02

INTRODUO
AOS ALGORITMOS

Introduo aos algoritmos


Tipos de algoritmos
Pseudocdigo
Fluxograma
Exerccios para fixao
Exerccios complementares

OBJETIVOS:

Mostrar as aplicaes dos algoritmos para resolu


o de diferentes problemas; especificar a importn
cia dos algoritmos para a resoluo de problemas
computacionais; abordar os conceitos de entrada,
processamento e sada do ponto de vista computa
cional; definir os tipos de algori tmos a serem utili
zados neste I ivro (pseudocdigo e fluxograma).

m algoritmo uma seqncia lgica de instrues que devem ser seguidas para
a resoluo de um problema ou para a execuo de uma tarefa. Os algoritmos
so amplamente utilizados nas disciplinas ligadas rea de cincias exatas. tais como
matemtica, fsica, qumica e informtica, entre outras, e tambm so utilizados com
muito sucesso em outras reas.
No dia-a-dia, as pessoas utilizam-se de algoritmos de maneira intuitiva, sem que
haja necessidade de planejar previamente a seqncia de passos para a re soluo das
tarefas quotidianas. Dentre os inmeros exemplos existentes, podemos citar:

'

CAPITULO 2 - INTRODUAO AOS ALGORITMOS

1 . Quando uma dona de casa prepara um bolo, segue uma receita, que nada mais
do que um algoritmo em que cada instruo um passo a ser seguido para
que o prato fique pronto com sucesso:
Bata quatro claras em neve.
Adicione duas xcaras de acar.
Adicione duas xcaras de farinha de trigo, quatro gemas, uma co
lher de fermento e duas colheres de chocolate.
Bata por trs minutos.
Unte uma assadeira com margarina e farinha de trigo.
Coloque o bolo para assar durante vinte minutos em temperatura
mdia.
2. Um motorista que necessita efetuar a troca de um pneu furado segue uma

rotina para realizar essa tarefa:


Verifica qual pneu est furado.
Posiciona o macaco para levantar o carro.
Pega o estepe.
Solta os parafusos.
Substitui o pneu furado.
Recoloca os parafusos.
Desce o carro.
Guarda o macaco e o pneu furado.
3. Um matemtico, para resolver uma equao qualquer, utiliza passos pr-de

terminados que conduzem obteno do resultado.

2. 1

....

'"'

ALGOR I T M O S A P L ICADOS A SOLUAO D E


PROBLEMAS COM PUTACIONAIS

Os algoritmos so amplamente utilizados na rea da computao, seja na elabo


rao de solues voltadas construo de interfaces, software e hardware, seja no pla
nejamento de redes. Os algoritmos tambm constituem uma parte importante da docu
mentao de sistemas, pois descrevem as tarefas a serem realizadas pelos programas.

2.2

T I POS D E ALGOR I T MOS

Existem diversos tipos de algoritmos. Dentre eles, podemos citar: pseudocdigo,


descrio narrativa, fluxograma e diagrama de Chapin.

'

10

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

O pseudocdigo utiliza linguagem estruturada e se assemelha, na forma, a


um programa escrito na linguagem de programao Pascal. O pseudocdigo
tambm denominado por alguns autores como portugus estruturado,
embora existam pequenas diferenas de metodologia entre ambos. bastante
utilizado para representao da resoluo de problemas computacionais.
A descrio narrativa utiliza linguagem natural para especificar os passos
para a realizao das tarefas. Isso d margem a ms interpretaes e ambigi
dades. No muito utilizada.
O fluxograma uma forma universal de representao, pois se utiliza de
figuras geomtricas para ilustrar os passos a serem seguidos para a resoluo
dos problemas. Bastante utilizado, tambm chamado por alguns autores de
diagrama de blocos.
O diagrama de Chapin, tambm conhecido como diagrama Nassi
Shneiderman ou diagrama N-S, apresenta a soluo do problema por meio
de um diagrama de quadros com uma viso hierrquica e estruturada. Esse
tipo de diagrama no muito utilizado, pois muito difcil representar recur
sividade, entre outros procedimentos.

Neste livro, sero abordadas as duas formas mais comuns de representao de


solues para problemas computacionais: pseudocdigo e fluxograma. A seguir, sero
descritas as caractersticas de cada um.

2.3

"

PS E U DOCODIGO

O pseudocdigo um tipo de algoritmo que utiliza uma linguagem flexvel, intermediria entre a linguagem natural e a linguagem de programao. E utilizado para organizar o raciocnio lgico a ser seguido para a resoluo de um problema ou para definir os
passos para a execuo de uma tarefa. E tambm utilizado para documentar rotinas de um
sistema.
A palavra 'pseudocdigo' significa 'falso cdigo'. Esse nome se deve proximi
dade que existe entre um algoritmo escrito em pseudocdigo e a maneira pela qual um
programa representado em uma linguagem de programao.
O Exemplo 2.1 prope um problema simples para o qual ser desenvolvido o
algoritmo em pseudocdigo.
,

'

2.3. 1

I D E N T I FI CAAO DO ALGORITMO

Todo algoritmo representado por um pseudocdigo dever ser, primeiramente,


identificado. Para se identificar ou nomear o algoritmo, recomenda-se:

No utilizar espaos entre as letras. Por exemplo: para um cadastro de clien


tes, o correto seria cad_cli ou cadcliente. O caractere 'sublinha' ou
'underline' ( _ ) pode ser utilizado para representar o espao entre as letras.

'

1 1

CAPITULO 2 - INTRODUAO AOS ALGORITMOS

Desenvolver um pseudocdigo para ler o nome, a idade, o cargo e o salrio

ExEMPLo 2 . 1 :

de 50 pessoas e verificar quantas possuem idade inferior a 30 anos e

um

salrio superior a R$ 3.000,00.

Identificao do algoritmo

Algoritmo Exemplo 2 . 1
_

Var nome , cargo :

Declarao das variveis

literal

idade , n_pessoas, tot_pessoas : inteiro


salario: real

Corpo do algoritmo

Incio
n_pessoas

(- 1

tot_pessoas f- o

Enquanto (n_pessoas <= 50) Faa


Ler (nome, idade, cargo, salario)
se ( idade <= 30) e (salario >= 3000,00) Ento
tot_pessoas f- tot_pessoas + 1
Fim-Se
n_pessoas

f-

n_pessoas + 1

Fim-Enquanto
Mostrar ("O total

de pessoas que atendem a condio " ,

tot_pessoas)
Fim .

No iniciar o nome com algarismos (nmeros). Por exemplo: nao usar


lalgori tmo. O coneto seria algori tmo l.
No utilizar palavras reservadas, isto , palavras que so utilizadas nos algo
ritmos para representar aes especficas. Por exemplo: se (palavra que re
presenta uma condio ou teste lgico); var (palavra que representa a rea
de declarao de variveis).
No utilizar caracteres especiais, como acentos, smbolos (?I : @# etc.), ,
entre outros.

No utilizar nomes iguais para representar variveis diferentes.

Ser sucinto e utilizar nomes coerentes.

2.3.2

DECLARAAO D E VARIAV E I S

Todas as variveis que sero utilizadas na resoluo do problema devem ser pre
viamente declaradas, isto , todas as informaes necessrias resoluo do problema
devem ser representadas. Este assunto ser abordado com mais detalhes no Captulo 3.

'

12

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

2.3.3

CORPO DO ALGORITMO

a rea do algoritmo reservada para a resoluo do problema. Nessa parte, de


vem-se escrever todos os passos lgicos necessrios para solucionar o problema, tais
como:

representar a entrada de valores para as vari.veis;

2.4

representar as operaes de atribuio, lgicas e aritmticas;

representar a abertura e fechamento de arquivos;

representar os laos de repetio;

representar a exibio dos resultados; entre outros.

FLUXOGRAMA

O fluxograma um tipo de algoritmo que utiliza smbolos grficos para repre


sentar as aes ou instrues a serem seguidas. Assim como o pseudocdigo, o fluxo
grama utilizado para organizar o raciocnio lgico a ser seguido para a resoluo de
um problema ou para definir os passos para a execuo de uma tarefa. Tambm utiliza
do para documentar rotinas de um sistema, mas s recomendado para casos pouco
extensos.
NoTA:

O fluxograma, por utilizar figuras para representao das aes, con


siderado um algoritmo universal.

2. 4 . 1

S I M BOLOGIA

Cada instruo ou ao a ser executada deve ser representada por meio de um


smbolo grfico. Os smbolos utilizados neste livro so apresentados a seguir:

(----)

Terminal
Representa o incio e o final do fluxograma.
Processamento
Representa a execuo de operaes ou aes como clculos arit
mticos, atribuio de valores a variveis, abertura e fechamento
de arquivo, entre outras.
Teclado
Representa a entrada de dados para as variveis por meio do
teclado.
Vdeo
Representa a sada de informaes (dados ou mensagens) por
meio do monitor de vdeo ou outro dispositivo visual de sada de
dados.

'

CAPITULO 2 - INTRODUAO AOS ALGORITMOS

13

Deciso
Representa uma ao lgica que resultar na escolha de uma das
seqncias de instmes, ou seja, se o teste lgico apresentar o
resultado 'verdadeiro', realizar uma seqncia e, se o teste l
gico apresentar o resultado 'falso', realizar outra seqncia.
Preparao
Representa uma ao de preparao para o processamento, ou
seja, um processamento pr-definido.

Conector
Utilizado para interligar partes do fluxograma ou para desviar o
fluxo corrente para um determinado trecho do fluxograma.

Conector de pginas
Utilizado para interligar partes do fluxograma em pginas dis
tintas.
Seta de orientao do fluxo
A seqncia do fluxograma pode ser desenvolvida horizontal
mente ou verticalmente.

Para o Exemplo 2.2, apresentado a seguir, o fluxograma foi feito horizontalmen


te e representa a entrada de dados por meio do teclado e a sada pelo vdeo dos dados
inseridos.
ExEMPLO 2.2:

Incio

Ler o nome e a idade de uma pessoa e mostrar na tela.

'

Nome, Idade

I FIGURA

"Nome", Nome

'

"Idade", Idade

,/
'-

Fim

'

I Fluxograma - sentido horizontal

J para o Exemplo 2.3, o fluxograma foi desenvolvido seguindo basicamente a


orientao vertical. Esse exemplo, mais complexo do que o anterior, utiliza-se de laos
de repetio e seleo (que sero tratados no Captulo 5) e processamento, alm da
entrada de dados pelo teclado e sada de dados pelo vdeo. Pode-se observar, tambm, a
presena do conector.

'

14

LOGICA DE PROGRAMAAO E ESTRUTURAS DE DADOS

EXEMPLO 2.3:

Desenvolver um fluxograma para ler o nome, a idade, o cargo e o salrio de

50 pessoas e verificar quantas tm idade inferior a 30 anos e um salrio


superior a R$ 3.000,00.

Incio

tot f- O

pessoas,
1 ' 50, 1

"O Total

>- de pessoas ", I-


tot

....._

Fim

_.,

_
_
_

Nome, ld

Cargo, Sal

.v.

tot f- tot + 1

.F.

IFJG u RA 2 1 Fluxograma - sentido vertical

2.5

EXERCICIOS PARA FIXAAO


1 . Qual a principal funo dos algoritmos?
2. Descreva trs tipos de algoritmos.
3. Comparando-se o fluxograma ao pseudocdigo, pode-se perceber que, no
fluxograma, as variveis no precisam ser declaradas. No entanto, existe uma
similaridade na seqncia de resoluo das tarefas em ambos. Observe qual
a similaridade e comente-a.
4.

Escreva a seqncia de passos para que um rob seja capaz de trocar uma
lmpada queimada que est localizada no centro de uma sala. H uma escada
posicionada logo abaixo da lmpada queimada e o rob est em frente
escada.

'

CAPITULO 2 - INTRODUAO AOS ALGORITMOS

2.6

15

"

EXERCICIOS CO M P L E M E N TA R E S
l . Escreva a seqncia de passos para que uma pessoa abra um arquivo armaze
nado em um disquete utilizando o Word for Windows.
2. Escreva os passos necessrios para uma pessoa efetuar um saque em um
caixa eletrnico.
3. Escreva os passos necessrios para uma pessoa efetuar uma compra por meio
da Internet.

"

PIT

UL

O
/

CONCEITOS B ASICOS
SO BRE ALGORITMOS

Tipos de dados
Variveis
Constantes
Operadores
Tabela-verdade
Exerccios para fixao
Exerccios complementares

OBJETIVOS:

Mostrar os tipos de dados bsicos e seus desdobra


mentos na l inguagem de programao Java; definir
o conceito, a apl icao e a identificao de vari
veis e constantes; demonstrar o uso dos operadores
de atribu io, aritmticos, relacionais e lgicos tan
to na notao algortmica como na li nguagem de
programao Java; exemplificar a construo de
expresses de atribuio, aritmticas e lgicas; mos
trar a ordem de precedncia matemtica utilizada
na resoluo de problemas; apresentar a tabela-ver
dade como recurso que facilita o entendimento do
uso dos operadores lgicos.

s dados so, na verdade, os valores que sero utilizados para a resoluo de um


problema. Esses valores podem ser fornecidos pelo usurio do programa, po
dem ser originados a partir de processamentos (clculos) ou, ento, a partir de arquivos,
bancos de dados ou outros programas.
NOTA:

Dados

informaes - para alguns autores, os dados correspondem

aos valores fornecidos na entrada e que sero processados, gerando


uma informao.

'

'

CAPITULO 3 - CONCEITOS BASICOS SOBRE ALGORITMOS

17

Os dados so armazenados temporariamente em variveis para que sejam pro


cessados de acordo com as especificaes do algoritmo. Para que haja integridade no
resultado obtido, os dados devem ser classificados de acordo com o tipo do valor a ser
armazenado na varivel, isto , para evitar problemas que podem ser ocasionados devi
do ao fornecimento de valores inadequados operao que ser realizada. Por exemplo,
vamos supor que o algoritmo deva especificar os passos para efetuar a soma de dois
nmeros quaisquer fornecidos pelo usurio. Ento, ser feita uma operao aritmtica
(soma), que s poder ser realizada com valores numricos.
Os tipos de dados so definidos, normalmente, a partir dos tipos primitivos cria
dos em funo das caractersticas dos computadores. Como os dados manipulados pe
los computadores durante a execuo dos programas so armazenados na memria,
esses tipos seguem as caractersticas de formato e espao disponvel nessa memria. As
sim, so organizados em bits e bytes e suas combinaes. Por exemplo, para representar
um nmero inteiro, poderiam ser usados dois bytes ou 1 6 bits. Isso resultaria em 216
combinaes possveis para a representao de nmeros, ou 65.536 possibilidades, con
siderando os estados possveis que um bit pode assumir: O ou 1 . Lembrando que os
nmeros poderiam assumir valores negativos e positivos nessa faixa, teramos represen
taes que iriam de -32.768 a 32.767, conforme pode ser verificado na tabela do item a
.
segmr.
NOTA:

Byte - Conjunto de 8 bits que pode representar um caractere (letras,


nmeros ou smbolos especiais).
Bit - A menor unidade de informao reconhecida pelo computador;
pode representar os estados O (desligado) ou 7 (ligado).

3 . 1 TIPOS D E DADOS
Definir o tipo de dado mais adequado para ser armazenado em uma varivel
uma questo de grande importncia para garantir a resoluo do problema. Ao desen
volver um algoritmo, necessrio que se tenha conhecimento prvio do tipo de infor
mao (dado) que ser utilizado para resolver o problema proposto. A pa1tir da, esco
lhe-se o tipo adequado para a varivel que representar esse valor. Na confeco de
algoritmos, utilizamos os tipos de dados primitivos (literal, inteiro, real e lgico), uma
vez que os algoritmos apenas representam a resoluo dos problemas. J na confeco
de programas, existem desdobramentos para esses tipos de dados a fim de adequ-los
melhor ao propsito de cada linguagem e resoluo prtica dos problemas. Veja na
Tabela 1 as definies dos tipos de dados primitivos e seus desdobramentos na lingua
gem de programao Java.
LEMBRE-sE:

Alguns tipos de dados da linguagem de programao Java tm particu


laridades. Veja a seguir quais so elas.

'

18

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

O tipo l ong deve ser identificado com a letra L para no ser 'compactado' pela
linguagem em um tipo inteiro. A compactao ocorre como uma maneira de reduzir a
.
memona gasta.
Da mesma forma que tenta usar o mnimo de memria, a linguagem Java tenta
utilizar o mximo de preciso possvel. Assim, se um elemento do tipo float (7 casas
de preciso aps a vrgula) no for identificado com a letra f, a linguagem vai consider
lo como do tipo double ( 1 5 casas de preciso aps a vrgula), o que pode gerar vrios
erros de compilao e execuo.
Isso uma caracterstica da linguagem Java e no deve ser estendido a outras
linguagens. Por exemplo:
'

int n

4;

long numero

456L;

float pi = 3 . 1 4 f ;
double tamanho = 3 . 87345748651 3 7 9 3 ;

Primitivos
Tipos de

Especficos para linguagem de programao Java

Definio

dados

Tipos de

Capacidade de armazenamento na

dados

memria do computador, de acordo


com a linguagem Java

Literal tambm
conhecido
como texto
ou ca ractere
Inteiro

Real

tambm
conhecido
como ponto
flutuante
Lgico ta mbm
conhecido
como
booleano

1 6 bits - Armazena Unicodes.

Poder receber letras, nmeros e


smbolos.
Obs.: Os nmeros armazenados em
uma varivel cujo tipo de dado
literal no podero ser utilizados
para c leulos.

c har

Poder receber nm eros inteiros


positivos ou negativos.

byte

8 bits - De (-128) at (127).

short

1 6 bits - De (-32.768) at (32.767).

int

32 bits - De (-2.1 47.483.648)


at (2.1 47.483.647).

long

64 bits De (-9.223.372.036.854.775.808)
at (9.223.372.036.854. 775.807).

float

32 bits - De (-3.4E-38)
at (-3,4E+38).

double

64 b i ts - De (-1,7E-308)
at (+ 1 ,7E+308).

Poder receber nmeros reais, isto


, com casas decimais, positivos ou
negativos.

Poder

receber verdadeiro (1) ou

falso (O).

jTABELA

li

NOTA:

Tambm possvel armazenar dados do


tipo fitem/ na Classe
Strins.

boolean 8 bits - Em Java pode-se armazenar


true ou false.

Tabela de tipos de dados

'

'

CAPITULO 3 - CONCEITOS BASICOS SOBRE ALGORITMOS

19

Em java, String uma classe definida, no um tipo primitivo, mas


utilizado para armazenar cadeias de caracteres como o tipo de dado
primitivo Literal.

CU IDADO!

3. 1 . 1

TIPOS CONST R U I DOS

Nos algoritmos, assim como nas linguagens de programao, existe a possibili


dade de criar outros tipos de dados, chamados tipos construdos. O tipo constmfdo
mais comum consiste na declarao de um conjunto de campos que compe um regis
tro. Por exemplo:
Algoritmo Exemplo_Registro
Tipo
Reg_paciente

registro

Nome : literal
Idade : inteiro
Peso : real

fim_registro
Var
Paciente: Reg_paciente

No Exemplo_Regi stro, o tipo Reg_paciente foi construdo com um con


junto de campos (variveis) de diversos tipos de dados primitivos. Aps a construo,
podem-se declarar variveis que utilizem esse tipo. Em nosso exemplo, criamos a vari
vel Paciente.
NOTA:

3.2

Em Java, um registro uma class geralmente composta por vrios


campos.

VAR IAV E I S

Nos algoritmos, as variveis so utilizadas para representar valores desconheci


dos, porm necessrios para a resoluo de um problema e que podero ser alterados de
acordo com a situao. Por isso dizemos que as variveis armazenam valores (dados)
temporariamente.
Quando um algoritmo transcrito para uma determinada linguagem de progra
mao, as variveis tambm tero a funo de armazenar dados temporariamente, mas
na memria RAM do computador. Esses dados sero utilizados durante o processamen
to para a resoluo do problema em questo.
NOTA:

RAM (Random Access Memory) - Memria temporria para armazena


mento dos programas que esto sendo executados no computador.

'

20

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

3.2. 1

I D E N T I F I CAAO DAS VARIAVEIS PARA OS


ALGORITMOS

Toda varivel deve ser identificada, isto , deve receber um nome ou identificador.
O nome de uma varivel deve ser ni.co e deve estar de acordo com algumas regras:

No utilizar espaos entre as letras. Por exemplo, em vez de nome do clien


te, o correto seria nome_do_cliente ou nomecliente. O caractere
'sublinha' ou 'underline' ( _ ) pode ser utilizado para representar o espao
entre as letras.
No iniciar o nome da varivel com algarismos (nmeros). Por exemplo: no
usar 2valor. O correto seria valor2.
No utilizar palavras reservadas, isto , palavras que so utilizadas nos algo
ritmos para representar aes especficas. Por exemplo:
se palavra que representa uma condio ou teste lgico;
var palavra que representa a rea de declarao de variveis.

No utilizar caracteres especiais, como acentos, smbolos (?I : @# etc.), ,


entre outros.
Ser sucinto e utilizar nomes coerentes.

LEMBRE-SE:

Cada linguagem de programao tem suas particularidades para decla


rao de variveis. Essas particularidades devem ser conhecidas e ob
servadas quando da atribuio dos nomes s variveis.

3.2.2

I D E N T I F I CADORES D E VARIAV E I S
PARA A L I N G UAG E M JAVA

Em Java, os nomes para as variveis so case-sensitive, isto , nomes com letras


maisculas so di ferenciados de nomes com letras minsculas. Por exemplo:
NomeCliente diferente de nomecliente e tambm de nomeCliente.

Nomes devem comear com uma letra, um caractere 'sublinha' ou 'underline'


( _ ) ou o smbolo cifro ($). Os caracteres subseqentes podem tambm ser
algarismos.
No utilizar caracteres especiais, como acentos, smbolos (?I : @# etc.), ,
entre outros, exceto os acima citados.
As letras podem ser maisculas ou minsculas.
No podem ser utilizadas palavras reservadas, como final, float, for,
int etc.

'

'

CAPITULO 3 - CONCEITOS BASICOS SOBRE ALGORITMOS

3.3

21

CONSTANTES

So valores que no sofrem alteraes ao longo do desenvolvimento do algo


ritmo ou da execuo do programa. Por exemplo, na expresso abaixo, o valor 3 1 4 1 5
atribudo constante pi e permanecer fixo at o final da execuo.
.

pi

(-

3 . 1415;

permetro <- 2 * pi

raio;

Em Java, uma constante uma varivel declarada com o modificador final.


Por exemplo:
final float pi

NOTA:

3 . 14 1 5 f ;

Modificadores so utilizados para modificar a atribuio de classes,


variveis ou mtodos.

As constantes devem ser declaradas como variveis cujo valor atribudo perma
necer inalterado ao longo do programa. Por isso, so tambm chamadas de variveis
somente de leitura.

3.4

O P E RADORES

Os operadores so utilizados para representar expresses de clculo, compara


o, condio e atribuio. Temos os seguintes tipos de operadores: de atribuio, arit
mticos, relacionais e lgicos.

3.4. 1

OPERADORES DE AT R I B U IAO

So utilizados para expressar o armazenamento de um valor em uma varivel.


Esse valor pode ser pr-definido (variante ou no) ou pode ser o resultado de um proces
samento.
Representao utilizando-se
a notao algortmica

Representao utilizando-se
a notao para linguagem Java
=

(-

Exemplo:

Exemplo:

nome

<-

"Fulano de tal"

resultado
valor

(-

<- a + 5

nome

"Fulano de tal"

resultado
valor

!TABELA 2 1 Operadores de atribuio simples


NOTA:

Alguns autores utilizam : = como sinal de atribuio em algoritmos.

'

22

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


;

3.4.2

OPERADORES A R I T M E TICOS

So utilizados para a realizao dos diversos clculos matemticos. So eles:


Operador

Representao
Representao
Exemplos em Java
utilizando-se a notao utilizando-se a notao
algortmica
para linguagem Java

Incremento

Utiliza -se uma


expresso.
Por exemplo: a+l.

Decremento

Utiliza-se uma
expresso.
Por exemplo: a-1.

++

Adiciona 1 ao valor de a.
Exemplo: a++ - retorna o valor
de a e depois adiciona 1 a esse
valor; ++a - adiciona 1 ao valor
de a antes de retorn-lo.
Subtrai 1 do valor de a.
Exemplo: a-- - retorna o valor
de a e depois subtrai 1 desse
valor;
a
subtrai 1 do valor
de a antes de retornar.
--

Multiplicao

Diviso

a lb

Exponenciao

Mdulo

ou * *
Por exemplo: 2 3 2"3.

Vide nota

Mod.

Por exemplo: a mod b.

Adio
Subtrao

b - Multiplica a por b.
-

Divide o valor de a por b.

a % b - Retorna o resto da

diviso inteira de a por b. Por


exemplo, se o valor de a fosse 9
e o valor de b fosse 2, teramos
9 % 2 ; o resultado da diviso seria
4 e o resto (mod) seria 1.

O valor de a somado
ao valor de b.

a - b - Do valor de a

a + b

subtrado o valor de b.
I TABELA 3 1 Operadores aritmticos

NOTA!

Nem todos os operadores aritmticos utilizados na realizao de clcu


los podem ser diretamente representados por smbolos computacionais.
Alguns deles so representados por funes matemticas, como no caso
da exponenciao e da radiciao. Em Java, essas operaes e algumas
outras so realizadas utilizando-se mtodos da classe Math. Alguns des
ses mtodos so mostrados no Anexo I.
Funes matemticas so programas especiais existentes nas biblio
tecas das linguagens de programao e executam clculos matemti
cos mais complexos no suportados pelos operadores matemticos
bsicos.

CAPTULO 3 - CONCEITOS BSICOS SOBRE ALGORITMOS

3.4.3

23

OPERADORES R E L.ACIONAIS

So utilizados para estabelecer uma relao de comparao entre valores ou ex


presses. O resultado dessa comparao sempre um valor lgico (booleano) verda
deiro ou falso.
Operador

Representao
utilizando-se a
notao
algortmica

Representao
utilizando-se a
notao para
linguagem Java

Exemplos em Java

Maior

>

>

a > b - Se o valor de a for maior do que o


valor de b, retornar verdadeiro. Seno,
retornar falso.

Maior ou igual

>=

>=

a >= b - Se o valor de a for maior ou igual


ao valor de b, retornar verdadeiro. Seno,
retornar falso.

Menor

<

<

Menor ou igual

<=

<=

b - Se o valor de a for menor do que o


valor de b, retornar verdadeiro. Seno,
retornar falso.
a

<

a <= b - Se o valor de a for menor ou igual


ao valor de b, retornar verdadeiro. Seno,
retornar falso.

Igual a

a == b - Se o valor de a for igual ao valor de


b, retornar verdadeiro. Seno, retornar
falso.

Diferente de

.-

a ! b Se o valor de a for diferente do


valor de b, retornar verdadeiro. Seno,
retornar falso.
=

1-

<>

I TABELA 4 1 Operadores reiacionais

3.4.4

OPERADORES L.OGICOS

So utilizados para concatenar ou associar expresses que estabelecem uma re


lao de comparao entre valores. O resultado dessas expresses sempre um valor
lgico (booleano) verdadeiro ou falso.
3.4.5

PRECEDENCIA DOS OPERADORES

As linguagens de programao normalmente estabelecem uma ordem de avalia


o considerando a precedncia dos operadores quando mais de um operador usado em
uma expresso. Consulte o anexo para obter a precedncia dos operadores para a lingua
gem Java. No caso de no haver precedncia entre os operadores aplicados, a expresso
avaliada da esquerda para a direita.
Considere a expresso: A = B < 8 . e C = 3 . Essa expresso combina duas
expresses de comparao: B < 8 e c = 3. Conforme visto, se ambas resultarem em
.

'

24

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Operador Representao
utilizando-se a
notao
algortmica

Representao
utilizando-se a
notao para
linguagem Java

Exemplos em Java

e.

&&

a - 5 && b ! = 9 - Caso o valor de a seja igual


a 5 e o valor de b seja diferente de 9, ento retornar
verdadeiro. Caso contrrio, retornar falso.

. ou.

I I

a - 5 I I b ! = 9 - Caso o valor de a seja igual


a 5 ou o valor de b seja diferente de 9, ento
retornar verdadeiro. Se ambas as comparaes
retornarem falso, o resultado ser falso.

ou

no

no .

! a > 5 - Se o valor de a for maior do que 5,


retornar falso. Caso contrrio, retornar

verdadeiro.

I TABELA s i Operadores lgicos

verdade iro, o valor verdadeiro ser atribudo varivel A. Em quaJquer outra


circunstncia, o valor falso ser atribudo a A. Deve-se observar que, primeiramente,
so avaliadas as expresses de comparao B < 8 e C = 3 e, posteriormente, os
resultados dessas duas expresses so associados por meio do operador e , obtendo
.

se o resultado final. Isso se deve ao fato de existir uma precedncia entre os operadores
relacionais e os lgicos. Os operadores relacionais so avaliados primeiro e, posterior
mente, os lgicos. Normalmente, alm da existncia de precedncia entre operadores de
tipos diferentes, operadores do mesmo tipo possuem, tambm, uma precedncia. A Ta
bela 6 demonstra essa relao.

Operador

Observao

( )' [ ]

Parnteses e colchetes so usados para agrupar expresses, determinando


precedncia, a exemplo das expresses matemticas.

" ou

Operador aritmtico de potenciao.

**

,I

Operadores aritmticos de multiplicao e diviso.

+' -

Operadores aritmticos de adio e subtrao.

f-

Operador de atribuio.

=, <, >, < = , > = , <>

Operadores relacionais.

.nao.

Operador lgico de negao.

.e.

Operador lgico e.

.ou.

Operador lgico ou.


I TABELA

si

Precedncia de operadores

'

'

CAPITULO 3 - CONCEITOS BASICOS SOBRE ALGORITMOS

25

Dessa forma, a expresso:


A f- B + 2 > 5

C <> 4

.e.

seria avaliada na seguinte ordem:


c <> 4
D

[1]

[2]

[ l ] . e . [2]

[3]

B + 2

[4] > 5

[5]

A (LEMBRE-sE:

3.5

[4]
[5]

ou . [3]

[6]

[6]

A precedncia matemtica tambm deve ser considerada na imple


mentao dos algoritmos.

TABELA-VERDADE

A tabela-verdade expressa o conjunto de possibilidades existentes para a com


binao de variveis ou expresses e operadores lgicos. Um exemplo de combinao
entre variveis A >= 5 . e . B ! = 1 O , onde A e B so as variveis, > = e ! = so os
operadores relacionais e . e . o operador lgico. Um exemplo de combinao entre
expresses A + B ! = X - 1 O. A tabela-verdade utilizada para facilitar a anlise
da combinao dessas expresses ou variveis, conforme pode ser verificado a seguir:
Operador
&&

Expresso
algoritmo A - 5 B <> 9 A Expresso
9 A
A -- 5 B !
em Java
Resultados
.v.
. v.
.
poss1ve1s
=

'

==

(.e.)
.e.

B <> 9 A - 5

&& B !

< . ou . )

II

.ou.

B <> 9

I I B !

A -- 5

( . no.)

.no. A - 5

! A --

.v.

.v .

. f.

.v.

.f.

.f.

.v .

. f.

. f.

.v.

.f.

.v .

. v.

.f.

. f.

. f.

. v.

!TABELA 7 1 Tabela-verdade

Na tabela, pode-se verificar que as expresses A = 5 e B ! = 9 podem assumir


quatro possibilidades. Ou seja, ambas podem ser verdadeiras (primeira linha dos resul
tados possveis), a primeira pode ser verdadeira e a segunda falsa, a primeira pode ser
falsa e a segunda verdadeira ou ambas podem ser falsas. Essas combinaes dependem,
p01tanto, dos valores atribudos s variveis A e B.

- E ESTRUTURAS DE DADOS
LOGICA D E PROGRAMAAO
'

26

Submetendo essas expresses aos operadores lgicos ( && - e, I I - ou, ! - no),


obtm-se valores diferentes, dependendo do resultado que cada uma das expresses
assumir individualmente. Assim, considerando a primeira linha de resultados possveis,
onde A = 5 verdadeiro e B <> 9 tambm , obtemos os seguintes resultados:

5 verdadeiro e B
verdadeiro para A
5 . e . B <> 9 : se A
< > 9 tambm , o resultado associado com o operador && tambm ;
=

verdadeiro para A = 5

. ou . B <> 9 : se A = S verdade iro e

falso para .no. A = 5 : se A = 5 verdadeiro,a negao falso.

B <> 9 tambm , o resultado associado com o operador l i tambm ;

Deduz-se que, para o operador &&, o resultado ser verdadeiro somente se


ambas as expresses associadas assumirem o resultado verdadeiro. Por outro lado,
para o operador I I , o resultado ser verdadeiro se pelo menos uma das expres
ses associadas assumir o resultado verdadeiro.

3.6

EXE RCICIOS PARA FIXAAO


1 . Dadas as expresses a seguir, identificar o resultado verdadeiro ou falso

que cada uma delas retornaria, em funo dos valores dados.


Exemplo:
Supondo que varivel A seja atribudo o valor 2 e varivel B seja atribudo
o valor 7 :
A = 2

.e. B = 5

Resultado: falso (para A=2, o resultado verdadeiro; para B=5, o


resultado falso. Como o operador . e . , o resultado final falso).
Considerando os mesmos valores atribudos a A e B, avalie as expresses a
.
seguir:
A = 3

.e. B = 7

b) A < 3

. ou. B <> 7

c) A <= 2 . e . B = 7
d) . n o . A = 2 . e . B = 7
e) A < 5
2.

. e . B > 2 . ou . B <>

Verifique se as variveis abaixo possuem nomes corretos e justifique as alter


nativas falsas:
a) n#l

b) tempo

c) n_l

d) $din

e) n 1

f)

K2K

g) nl

h) U F

i)

2nome

'

'

CAPITULO 3 - CONCEITOS BASICOS SOBRE ALGORITMOS

k) nome2

j) dep

27

l)

val#r

3. Sabe-se que o uso incorreto da precedncia de operadores ocasiona erros.

Pensando nisso, avalie as expresses a seguir e:


a) classifique a ordem em que as operaes devero ser executadas;
b) determine o resultado das operaes.
Considere os seguintes valores para as variveis:
A f- 8 B f- 5 C f - -4 D f- 2
'

'

'

a) Del ta f- B2 - 4 * A * c
b) J f- "Hoje" <> "HOJE"
c) Media f- ( A + B + C + D ) I 4
d) Medi a f- A + B + C + D I 4
e) Resultado f- A mod D I 5

D Resultado f- (A mod D ) I 5
g) X f- ( A + B ) - 1 O * C
h) X f- A

10 * C

i) Y f- A >

.e. B

C > D

j) Y f- A > 3 * 2 . ou . B + C <> D

3.7

EXERCICIOS COM P L E M E NTARES


1 . Considere a seguinte atribuio de valores para as variveis:
A f- 3, B f- 4 e C f-

Avalie as expresses a seguir indicando o resultado final: verdadeiro ou


falso.
- 8
.e. c -

a) A > 3

b) A < > 2 . ou . B

<=

- 3 . ou . B >= 2
c) A - 3
d) A e) A <>

.e.
8

5
.e. c - 8

. nao . B <= 4

- 4
. ou . B -

- 8
.e. c -

.e. c > 2

D B > A . e . c <> A
g) A > B . ou . B

<

- c
h) A <> B . e . B -

i) c > 2 . ou . A < B

j) A > B . ou . B > A . e . c <> B

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

28

2. Complete a tabela-verdade a seguir:


Operador

Expresso

B <> 5 A

B <> 5 A

.e.

. ou.

.e.
-

. nao .

4 . ou . B <> 5 .no. A

Resultados

pOSSJVeis

3. Construa a tabela-verdade para as expresses:


a) A >= 3 . ou . B

b) A <> 9 . e . B <= 6
c) . n o . A

. ou . B >= 1

. e . B <> 5

d) A > 3
4.

. ou . c < 8

Dada a declarao de variveis:


inteiro;

Var A , B , C :

real;

X , Y, Z :

Nome , Rua : literal;


L1 :

lgico;

e atribuindo-se a essas variveis os valores:


A 1

X 2,5

Nome "Pedro"

B 2

y 10 , 0

Rua

c 3

z -1, 0

L1 . v .

"Girassol"

Determine o resultado das expresses a seguir:


a) Nome = Rua
X > Y . e . C <= B

c) (C

A) < ( X

d) ( ( y I 2 )

X)

2 * Z)

. ou .

( (B

2 ) >=

(A

c) )

e) . nao . L1

t) . n o . c

B .e. X

y <= 2 0

. ou . L1 <> . v .

PIT

UL

CONCEITOS DE
-

PROGRAMAAO

Noes gerais sobre as diferentes formas de programao


Caractersticas e vantagens das Ling uagens de prog ramao
Aplicabil idade das diferentes linguagens
Exerccios para fixao
Exerccios complementares

OBJETIVOS:

Abordar os principais paradigmas em programao


para que o leitor passe a conhecer os diferentes ti
pos de li nguagens de programao e suas apli ca
es, pois o pseudocdigo uma forma estruturada
de representao das solues de problemas e a lin
guagem de programao Java, a qual ser utilizada
para codificar os exemplos, orientada a objetos;
apresentar os principais conceitos de programao
orientada a objetos.

m programa um conjunto de instrues que dizem ao computador o que deve


ser feito. Existem muitas formas e diferentes tipos de linguagens de programa
o, cada qual com uma finalidade especfica. Pode-se at dizer que as linguagens de
programao podem ser classificadas em nveis, segundo sua finalidade, muitos deles
coexistentes em um mesmo computador.
Os primeiros computadores, como o Eniac e o Univac, consistiam pri nci p al men
te em vlvulas e rels e tinham de ser programados conectando-se uma srie de plugues
e fios. Uma equipe de programadores podia passar dias introduzindo um pequeno pro
grama em uma dessas mquinas, que ocupavam salas inteiras.

- E ESTRUTURAS DE DADOS
LOGICA D E PROGRAMAAO
'

30

a que entram os diversos nveis de programao. Hoje em dia, existem lingua


gens de programao que atuam diretamente no hardware da mquina, movimentando
dados e acionando dispositivos ligados ao computador. E a chamada linguagem de
baixo nvel . Como esse tipo de linguagem de difcil programao, a exemplo do que
ocorria com os primeiros computadores, criaram-se nveis de linguagens. Assim, as
linguagens de alto nvel como Pascal, C, C++ e Java so utilizadas pelos programado
res no desenvolvimento de programas. Os programas digitados nessas linguagens cons
tituem o que se chama de cdigo-fonte, o qual convertido (traduzido) para programas
de baixo nvel, em um processo chamado de compilao ou interpretao. O progra
ma assim traduzido pode ser executado pela mquina, reproduzindo aquilo que o pro
gramador deseja.
Embora as linguagens de programao consideradas de alto nvel tenham o obje
tivo de aproximar-se da linguagem humana, esse objetivo ainda est longe de ser alcan
ado. O mximo que se conseguiu foi criar instrues mnemnicas, em ingls, para
facilitar o processo.
'

NOTA:

4. t

Eniac (Eiectronic Numerical lntegrator and Calculator) - considerado


o primeiro computador digital eletrnico.
Univac - primeiro computador a ser comercializado.

'

I NTRODUAO A PROGRAMAAO
'"'

Apesar de existirem vrios nveis de programao, neste livro sero tratadas as


linguagens de alto nvel, utilizadas para o desenvolvimento dos algoritmos, objeto de
nosso estudo.
A linguagem de programao, como qualquer linguagem, fOLmada por pala
vras. Essas palavras so agmpadas em frases para produzir um determinado significado.
Dessa forma, pode-se chamar as palavras de uma linguagem de programao de pala
vras-chave e as frases criadas com essas palavras de estruturas de programao.
Assim, um programa constitudo de palavras-chave e estruturas de programa
o definidas segundo as regras dessa linguagem, elaboradas de modo que sejam mais
facilmente compreendidas pelo ser humano. A exemplo da linguagem usada em nossa
comunicao no dia-a-dia, a linguagem de programao possui uma sintaxe, definida
por essas regras.
Por que existem tantos tipos de linguagem? Uma linguagem melhor que outra?
A resposta para essas perguntas est justamente no objetivo para o qual elas foram
criadas. Cada linguagem de programao foi desenvolvida para solucionar determinado
tipo de problema e cumprir uma funo determinada. Uma linguagem pode ser melhor
para a execuo de clculos matemticos complexos, com aplicaes na rea cientfica;
outra pode ser melhor para processar uma grande quantidade de dados submetidos a
operaes simples, com aplicaes na rea financeira; e ainda outras exigem uma interface

CAPTULO 4 - CONCEITOS D E PROGRAMAO

31

elaborada e fcil interao com o usurio. Como se pode ver, a linguagem que voc
escolhe para o desenvolvimento de uma aplicao depende da sua adequao tarefa
que se pretende executar. Como exemplo, podem-se citar algumas das linguagens de
programao mais comumente utilizadas:
PASCAL
'

E uma linguagem de alto nvel poderosa e eficientemente estruturada. Criada


para ser uma ferramenta educacional pela simplicidade de sua sintaxe, vem sendo utili
zada at hoje nos meios acadmicos.
A linha de cdigo abaixo exemplifica uma instruo em Pascal para exibir uma
frase na tela do computador.
V'RITE ( "Algoritmos e Estruturas de Dado s" ) ;

c
Linguagem estmturada utilizada at pouco tempo para o desenvolvimento de apli
caes comerciais. Ultimamente, tem grande aplicao no desenvolvimento de software
bsico e aplicaes com forte interao com o hardware. A mesma instruo do exemplo
anterior pode ser escrita em C como:
printf ( "Algoritmos e Estruturas de Dados" ) ;

c++
Linguagem de alto nvel orientada a objetos; uma evoluo do C que preserva
seus princpios de eficincia e facilidade de programao. A programao orientada a
objetos ser discutida ainda neste captulo. O exemplo anterior pode ser reproduzido
com a instruo:
cout<<"Algoritmos e Estruturas de Dados " ;

JAVA

Linguagem orientada a objetos de fcil programao e larga utilizao no merca


do. Amplamente utilizada em aplicaes de processamento distribudo e para a Internet.
Java est sendo utilizada neste livro para exemplificar a implementao dos algoritmos
estudados. Uma descrio mais detalhada da linguagem encontra-se no Anexo. Repro
duzindo o exemplo anterior, tem-se:
System . out. println( "Algoritmos e Estruturas de Dados " ) ;

Como podemos observar, existe grande semelhana na sintaxe utilizada pelas


diversas linguagens de programao e o aprendizado de uma delas depende de convvio
maior e utilizao freqente. Um bom programa aquele que tem, dentre outras quali
dades, um cdigo eficiente. Programas eficientes so desenvolvidos com tcnicas de
programao adequadas e algoritmos eficientemente projetados.

- E ESTRUTURAS DE DADOS
LOGICA D E PROGRAMAAO
'

32

4.2

T I POS DE PROGRAMAAO

Existem formas diferentes de se programar, mesmo utilizando a mesma lnguagem de programao. E como se fossem comparados textos que tratam do mesmo assunto mas que foram escritos por pessoas diferentes.
Apesar disso, as linguagens de programao possuem caractersticas e regras
que determinam como o programa dever ser escrito para que seja 'interpretado' pela
.
maquma.
,

'

4.2. 1

CONCEITOS SOBRE A PROG RAMAAO L I N E A R

A programao linear pressupe a criao de programas que, na sua execuo,


obedeam a uma seqncia de passos executados consecutivamente, com incio e fim
especficos. Esse princpio era utilizado por linguagens mais antigas, como o Basic, no
qual as linhas de cdigo eram numeradas uma a uma e eventuais desvios eram executa
dos apontando-se para a linha desejada.
Embora alguns tipos de linguagem tenham restries na forma de programao,
dando pouca flexibilidade ao desenvolvedor, nada impede que programas lineares se
jam gerados utilizando-se de linguagens estruturadas ou orientadas a objetos.
A desvantagem da programao linear a complexidade. Programas lineares
extensos so difceis de ser desenvolvidos e at compreendidos.
4.2.2

"

CONCEITOS SOB R E A PROG RAMAAO


E S T R U T U RADA

Usando o velho provrbio "dividir para conquistar", pode-se afirmar que, para a
consecuo de um objetivo, melhor e bem mais fcil dividir as tarefas a serem realiza
das em etapas, executando-as uma por vez, at que todo o trabalho tenha sido realizado.
Pode-se, ainda, pensar que esse trabalho pode ser realizado em equipe. A diviso do
trabalho e a distribuio adequada das tarefas a cada um dos elementos da equipe, se
bem coordenadas, com certeza produziro resultados melhores e bem mais rpidos. O
problema, muitas vezes, est em como dividir essas tarefas de forma adequada e eqita
tiva e gerenciar o seu desenvolvimento.
Em programao, pode-se pensar da mesma forma. A construo de um progra
ma monoltico que execute uma tarefa complexa, alm de ser complicada e demorada,
pode no produzir o resultado esperado. Mesmo que o resultado seja alcanado, o tem
po despendido pode ser demasiado. Essa situao se agrava se for considerado que esse
tempo gasto representa custos no desenvolvimento de uma aplicao que podem supe
rar as expectativas de custos do projeto.
Deve-se utilizar esta filosofia para criar um programa extenso e complicado. Um
bom programador deve ser como um bom gerente no momento de atribuir tarefas em
um programa: deve separar as tarefas que o programa deve realizar, depois deve atac
las uma a uma, tornando o trabalho menos assustador. Essa abordagem o que norteia o
conceito de programao estruturada.

CAPTULO 4 - CONCEITOS D E PROGRAMAO

33

Na programao estruturada, a diviso de tarefas um processo chamado de


modularizao. Nesse processo, divide-se o programa em pmtes ou mdulos que executam tarefas especficas. E importante que essas tarefas, representadas pelos mdulos,
sejam especficas e cada uma delas seja o mais independente possvel das demais reali
zadas por outros mdulos do programa. Isto , a independncia funcional est relacio
nada diretamente modularizao. Por exemplo, suponha que voc pertena a uma
equipe que est participando de uma gincana na qual vrias tarefas so determinadas e o
prazo fmal est estabelecido. Vence a equipe que completar o maior nmero de tarefas
dentro do prazo. Se as tarefas forem divididas adequadamente, ser grande a chance de
que todas sejam cumpridas no tempo determinado. Por outro lado, se ocorrer um erro
nessa distribuio e algum acabar fazendo algo que outro elemento do grupo tambm
esteja fazendo, com certeza o tempo no ser suficiente ou alguma tarefa deixar de ser
realizada.
Os procedimentos ou funes so blocos de programa que executam detenui
nada tarefa. Cada um desses blocos de cdigo recebe um nome, o qual utilizado como
chamada do procedimento ou funo. Tanto procedimentos quanto funes podem re
ceber valores para que possam realizar suas tarefas. A diferena que os procedimen
tos, embora possam receber valores, no retornam outros valores como resultado, en
quanto uma funo retoma valores como resultado das operaes que realizou.
Os nom.es dos procedimentos, normalmente, so palavras ou pequenas frases
que procuram associ-los de forma mnemnica tarefa realizada. Por exemplo:
,

AtualizarDados ( )

As funes so nomeadas da mesma maneira que os procedimentos, lembran


do que o nome de uma funo pode ser utilizado em uma expresso como se fosse
uma varivel, porque uma funo retoma um valor quando termina sua execuo. Por
exemplo:
soma (x,

y) .

A seguir apresentado um pequeno programa em C, que executa a soma de dois


nmeros introduzidos pelo teclado e exibe o resultado no vfdeo.
1.
2.
3.

/ * funcao . c * /
main ( )

4.

int

(
x,

y, r;

5.

print f ( "Digite dois nmeros:

6.

scanf ( "%d %d" , &x ,

7.

r = soma (x, y) ;

8.

printf ( "A soma dos nmeros : %d" ,

9.

10 .
11.
12 .

");

&y) ;

/ * soma ( ) * /
/ * retorna a soma de dois numeros * /
soma ( j , k)

r) ;

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

34

13 .
14.
15.

int

16.

J'

k;

{
return ( j +k ) ;

No exemplo, as variveis x e y recebem os nmeros cuja entrada feita pelo


teclado (linha 6). A funo soma ( ) chamada na linha 7, com a passagem dos valores.
A funo executada a partir da linha 1 2 e, na linha 1 5 , retoma o valor da soma dos
numeros.
O exemplo bastante simples e, obviamente, no seria necessrio criar uma
funo apenas para somar dois nmeros. Serve apenas como ilustrao para a chamada
de uma funo com passagem e retorno de valores.
Ainda dentro do exemplo, podem-se encontrar outras funes internas da pr
pria linguagem, como printf ( ) e scanf ( ) que funcionam, a princpio, da mesma
forma que a funo soma ( ) .
Estudaremos outros exemplos de procedimentos e funes no Captulo 7, que
tratar com mais profundidade desse assunto.
Quando se pensa na criao de um programa, surge a pergunta: por onde devo
comear? Uma forma de desenvolver um programa partir de sua representao em
pseudocdigo ou fluxograma, conforme discutido no Captulo 2. O fluxograma um
tipo de algoritmo que utiliza smbolos grficos para representar as aes ou instrues a
serem seguidas. Assim como o pseudocdigo, ele utilizado para organizar o raciocnio
lgico a ser seguido para a resoluo de um problema ou para a definio dos passos na
execuo de uma tarefa.
Cada etapa importante definida em seu fluxograma ou pseudocdigo pode ser
usada como um nome de sub-rotina (procedimento ou funo) no programa. Essas eta
pas devem estar definidas e claramente identificadas em seu esboo, de forma que se
possa saber onde so utilizadas.
'

4.3

'"'

CONC E I TOS SOB R E A PROGRAMAAO O R I E NTADA


A OBJ ETOS

No item anterior, foram vistos os conceitos de programao estruturada e de


como se pode, partindo de um programa extenso e complexo, subdividi-lo em procedi
mentos ou funes. Essa subdiviso auxilia no desenvolvimento, de forma que mdulos
pequenos e especficos ficam mais fceis de ser programados e compreendidos. Esses
mdulos executam tarefas determinadas, interagindo com outros mdulos ou com o
programa principal, retornando valores ou no, dependendo do que deve ser realizado.
A programao orientada a objetos representa uma mudana no enfoque da
programao, na forma como os sistemas eram vistos at ento. Representa uma quebra
de paradigma, revolucionando todos os conceitos de projeto e desenvolvimento de sis
temas existentes anteriormente.

CAPITULO 4 - CONCEITOS DE PROGRAMAAO


'

NOTA:

35

11Paradigma um conjunto de regras que estabelecem fronteiras e des


crevem como resolver os problemas dentro dessas fronteiras. Os
paradigmas influenciam nossa percepo; ajudam-nos a organizar e a
coordenar a maneira como olhamos para o mundo...
"

Daniel C. Morris e )oel S. Brandon,

Reengenharia: reestruturando sua empresa,

So Paulo, Makron Books, 1 994.

O enfoque tradicional para o desenvolvimento de sistemas e, por conseqncia,


para a programao, baseia-se no conceito de que um sistema um conjunto de progra
mas inter-relacionados que atuam sobre um determinado conjunto de dados que se de
seja manipular de alguma forma para obter os resultados desejados. O enfoque da mo
delagem de sistemas por objetos procura enxergar o mundo como um conjunto de objetos
que interagem entre si e apresentam caractersticas e comportamento prprios represen
tados por seus atributos e suas operaes. Os atributos esto relacionados aos dados, e
as operaes, aos processos que um objeto executa.
Assim, supondo que se deseje desenvolver um sistema de controle de estoque
para uma empresa, procura-se identificar os objetos relacionados ao sistema, como os
produtos, os pedidos de compra, os recibos, as pessoas etc., conforme est detalhado a
seguir. Pode-se dizer que possvel modelar, por meio da orientao a objetos, um setor,
um departamento e at uma empresa inteira.
Esse enfoque justifica-se, de forma resumida, pelo fato de que os objetos existem
na natureza muito antes de haver qualquer tipo de negcio envolvido ou qualquer tipo
de sistema para control-los. Equipamentos, pessoas, materiais, produtos, peas, ferra
mentas, combustveis etc. existem por si ss e possuem caractersticas prprias determi
nadas pelos seus atributos (nome, tamanho, cor, peso) e um determinado comportamen
to no mundo real relacionado aos processos que eles sofrem.

Programa
Processo 1
Processo 2

Dados

I
I
I
I
I
I
I
I
I
I
I
I
I

Classe

Atributo
Atributo

..

1
2

Operaes

I FIGURA 1 I Enfoque tradicional

enfoque orientado a objetos

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

36

4.3.1

0 Q U E E U M OBJETO

Um dos primeiros conceitos bsicos da orientao a objetos o do prprio obje


to. Um objeto uma extenso do conceito de objeto do mundo real, em que se podem
ter coisas tangveis, um incidente (evento ou ocorrncia) ou uma interao (transao
ou contrato).

Tangveis

Pessoas

Livro

Automvel

Competio

Projeto

Conserto

Saque

Venda

Incidente

......
.,.,.,....,.O"'
..,,
-

Interao

.
:
.

'

....,. ,
.,..,.. ....
....
...
_...,
... }
r
:.
.
.
;
.

- --

".,...,
.,... v

:.
.
.

'!

Transao

I FIGURA 2 1 TipO$ de objeto.s

Por exemplo, em um sistema acadmico em que Joo um aluno objeto e Carlos


um professor objeto que ministra aulas objeto da disciplina objeto algoritmos, para
que Joo possa assistir s aulas da disciplina do prof. Carlos, ele precisa fazer uma
matricula objeto no curso objeto de computao.
Tm-se as ocorrncias de objetos citados:

tangveis: aluno e professor;

incidente: curso, disciplina, aula;

interao: matrcula.

A identificao dos objetos em um sistema depende do nvel de abstrao de


quem faz a modelagem, podendo ocorrer a identificao de diferentes tipos de objetos e
diferentes tipos de classificao desses objetos. No existe um modelo definitivamente
correto; isso vai depender de quem faz a modelagem e de processos sucessivos de refi
namento, at que se possa encontrar um modelo adequado a sua aplicao.

CAPTULO 4 - CONCEITOS D E PROGRAMAO


NOTA:

37

Abstrao consiste em se concentrar nos aspectos essenciais, prprios,


de uma entidade e em ignorar suas propriedades acidentais. Isso signi
fica concentrar-se no que um objeto e faz, antes de decidir como ele
deve ser implementado em uma linguagem de programao.

4.3.2

COMO V I S U A L I ZAR U M OBJETO?

Pode-se imaginar um objeto como algo que guarda dentro de si os dados ou


informaes sobre sua estrutura (seus atributos) e possui um comportamento definido
pelas suas operaes.
objeto
operaes

estrutura de dados

IFIGURA 3 1 Visualizao do objeto

Os dados ficam protegidos pela interlace, que se comunica com os demais obje
tos do sistema. Nessa interface, representada pela camada mais externa de nosso mode
lo, esto as operaes. Todo tipo de alterao nos dados do objeto (atributos) somente
poder ser feito por meio das operaes, que recebem as solicitaes externas, fazem as
alteraes nos dados (se permitidas) e retornam outras informaes para o meio externo.
4.3.3

CONCEITO DE CLAS S E S

O conceito de classes muito impottante para o entendimento da orientao a


objetos.
Uma classe uma coleo de objetos que podem ser descritos por um conjunto
bsico de atributos e possuem operaes semelhantes. Falamos em um conjunto bsico
de atributos e operaes semelhantes, pois veremos adiante que nem todos os objetos da
mesma classe precisam ter exatamente o mesmo conjunto de atributos e operaes.
Quando um objeto identificado com atributos e operaes semelhantes em nos
so sistema, diz-se que pode ser agrupado em uma classe. Esse processo chamado de
generalizao. Por outro lado, pode ocorrer que um objeto, ao ser identificado, consti
tua-se, na verdade, de uma classe de objetos, visto que dele podem se derivar outros
objetos. J esse processo chamado de especializao.
Na Figura 4, partindo-se de uma classe veculos, observa-se a existncia de vri
os tipos de veculos e a criao de especializaes como: os utilitrios, os veculos
esporte, os de passeio e os de transpo1te de passageiros. Porm, se os veculos utilitri
os, esporte, de passeio e de transpotte de passageiros so considerados tipos de vecu
los, pode-se generalizar criando-se a classe veculos.

'

38

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

m
V>
"O
,..
n
-
"'

o
"'
""'
"'
N

'

N
"'
..,.,
"''
o

Veculos

Utilitrio

Esporte

Passeio

Passageiros

I FIGURA 4 1 Generalizao e especializao

O critrio para criar a classe ou as especializaes dessa classe est relacionado


aos atributos e operaes de cada um dos objetos. Assim, pode-se dizer que, para todos
os tipos de veculos, tm-se atributos genricos como: marca, mo delo, ano de fabrica
o, po tncia do motor, nmero de eixos, capacidade de carga etc. Tm-se tambm
operaes semelhantes para todos como: dar partida, acelerar, frear, estacionar etc.
Nada impede, contudo, que os veculos de passeio sejam subdivididos em outros
tipos, como os tipos sedan, minivan etc. Nesse caso, a classe veculos teria uma sub
classe passeio e dessa derivariam os veculos sedan e as minivans.
4.3.4

"

I N STANCIAS D E OBJETOS

Quando se fala em classes de objetos, est sendo considerado que se podem


incluir objetos em cada uma delas. Como exemplo, considere que ser modelado um
sistema para uma revendedora de veculos que comercializa os veculos conforme o
esquema citado. Cada novo veculo adquirido pela revendedora seria cadastrado no sis
tema obedecendo a sua classificao. Supondo que o veculo seja um automvel de
passeio do tipo sedan, cria-se um novo objeto dessa classe, que ser chamada de uma
instncia de objeto, conforme o seguinte esquema:
Classe
Veculos

Subclasse
Passeio

Subclasse
Sedan

Instncia
marca: Opel
modelo: Fire
ano: 2002
potncia: 195cv
eixos: 2
carga: 1.500kg.

Instncia
marca: Thunderbird
modelo: Hatch
ano: 2000
potncia: 250cv
eixos: 2
carga: 1.800kg.

Dessa forma, para cada novo veculo adquirido seria criada uma nova instncia
de objeto de uma determinada classe.

'

CAPITULO 4 - CONCEITOS DE PROGRAMAAO

4.3.5

39

H E RANA

Foi dito anteriormente que uma classe constituda de objetos com atributos e
operaes semelhantes. Esse princpio orienta a implementao da herana. A herana
nada mais do que a implementao da generalizao; o compartilhamento de atribu
tos e operaes entre classes com base em um relacionamento hierrquico. Quando se
cria uma nova instncia de um objeto, dizemos, em orientao a objetos, que esse novo
objeto herda os atributos e operaes de sua classe.
No exemplo de instncia de objeto, foi visto que um novo veculo adquirido
possua os seguintes atributos: marca: Opel, modelo: Fire, ano: 2002, potncia: 195cv,
eixos: 2 e carga: 1 .500kg. Esses atributos so herdados da classe veculos, bem como
suas operaes: dar partida, acelerar, frear e estacionar. Ou seja, o objeto marca: Opel
poder executar as mesmas operaes definidas em sua classe, sem que para tanto essas
tenham de ser redefinidas para ele.
O conceito de herana importantssimo na orientao a objetos pois, como
veremos na Seo 4.3.8
"Aplicao", a programao fica bastante facilitada. Os
cdigos escritos na definio da classe, de seus ahibutos e operaes so aproveitados
por suas sub-classes e instncias de objeto, o que reduz o nmero de linhas de progra
mao, gera maior qualidade e facilita a programao, a verificao de erros e futuras
correoes.
-

4.3.6

POLIMORFISMO

Associado ao conceito de herana, o polimorfismo permite que um objeto assu


ma um comportamento diferente daquele definido em sua classe. Polimorfismo signifi
ca a capacidade de assumir muitas formas. Isso importante para permitir o tipo de
classificao como a exemplificada anteriormente. Foi visto que uma classe veculos
possua as subclasses utilitrios, esporte, passeio e passagevs e a operao dar pat1i
da. Tomando-se a operao dar partida como exemplo, pode-se dizer que, para dar
partida em um veculo de passeio e em um veculo utilitrio, pode ser preciso executar
tarefas diferentes. Muitas vezes, dependendo do tipo de motor que equipa o veculo e do
combustvel utilizado, o processo muda significativamente. Considerando-se, assim,
que a operao dar partida precisa ser adaptada para a classe utilitrios, reescrevem-se
as tarefas para essa operao, que passar a responder de forma diferente apenas para
essa classe e para os objetos instanciados por ela.
Em resumo, as classes utilitrios, esporte, passeio e passageiros herdam todos
os atributos e as operaes da classe veculos. Porm, para a classe utilitrios, a opera
o dar partida foi modificada para atender a necessidades especficas. Logo, diz-se
que a operao dar partida apresenta polimorfismo.
4.3.7

ENCAPS U L A M E N TO

Pensando no modelo de representao de um objeto, pode-se visualizar facil


mente a questo do encapsulamento. O encapsulamento, tambm chamado de

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

40

Veculos

Utilitrios

Esporte

marca
modelo
ano
potncia
eJXOS
carga

Atributos

dar partida
acelerar
frear
estacionar

O peraes

Passeio

Passageiros

dar partida
IFJGU RA s i Exemplo de polimorfismo

ocultamento de informaes, consiste na separao entre os aspectos externos de um


objeto, acessveis por outros objetos, e os detalhes internos da sua implementao, que
ficam ocultos dos demais objetos. O encapsulamento impede que um programa se torne
to interdependente que uma pequena modificao possa provocar grandes efeitos que
se propaguem por todo o sistema. E um pouco do conceito de modularizao discutido
em programao estruturada, lembra-se? Dividia-se o programa em mdulos, tratando
cada um deles o mais separadamente possvel, de modo que fosse 'quebrada' a comple
xidade do problema. Aqui o pensamento o mesmo, porm a forma de implementao
bastante diferente.
'

I FJGU RA 6 1 Visua/izao de um objeto

'

CAPITULO 4

- CONCEITOS

4.3.8

DE PROGRAMAAO

41

A P L I CAO

Ser apresentada nesta seo uma aplicao escrita em Java em que os principais
conceitos discutidos em orientao a objetos aparecem. Trata-se de um programa bas
tante simples que representa um rob que possui os seguintes atributos: nome, nmero
de srie, data de fabricao e nvel da bateria. Possui, tambm, as seguintes operaes:
mudaNome, mostraNome e mostraTudo, que alteram o contedo de seus atributos e o
exibem. O rob executa algumas operaes matemticas bsicas; cada execuo conso
me um pouco da carga de sua bateria.
1.

public class Robo_superclasse{

2.

String nome;

3.

int serie;
String data;

4.
5.

int bat;

6.

public Robo_superclass e ( )

7.
8.

9.

public void divide ( ) {

10.
11.

public void soma ( ) {

12.

public void subtra i ( )

13 .

14.

public void multiplica ( )

15.

16.

}
{
{

A classe Robo_superclasse ser utilizada para demonstrao do recurso de


herana. A classe Robo, apresentada a seguir, herda os atributos (variveis) e mtodos
da classe Robo_superclasse:
class Robo extends Robo_supeclasse

Este recurso permite s classes herdeiras (subclasses) implementar os mtodos


herdados de diferentes maneiras; a esse recurso chamamos polimorfismo.
Neste exemplo no estaremos representando esse recurso, mas ele poderia ser im
plementado utilizando-se os mtodos soma ( ) , subtracao ( ) , mul tiplicacao ( )
ou divisao ( ) de maneiras diferentes em outras classes herdeiras, por exemplo:
class Robo_2 extends Robo_superclasse {
public void soma(double a ,
{ double c ;
c = (a + b + 5 ) ;

double b )

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

42

1.

class Robo extends Robo_superclasse

2.
3.
4.
5.
6.
7.
8.
9.

10.

public Robo ( ) {
nome

"XPT11 " ;

serie = 0 0 0 0 ;
data
"00!00/0000;
bat
5;
=

}
public Robo ( String n,
nome = n;

11.

ser1e

12.
13.
14.
15.
16.
17 .
18.
19.
20.
21.
22 .
23 .
24 .
25.
26.
27 .
28.
29.
30.
31.
32 .
33 .
34.
35.
36.
37 .
38.
39.
40.
41 .
42 .
43.
44.
45.
46 .
47 .
48.

data
bat

d;
5;

=
=

int s , String d ) {

s;

}
public void mudaNome( String novo nome) {
this. nome

novo_nome;

}
public String mostraNome ( ) {

return nome;

}
public void mostraTudo ( ) {
System.out . println ( "Robo chama- s e :

+ nome) ;

System.out.print1n ( "Serie: + serie) ;

+ data) ;
System . o u t . println( "Bateria: + bat ) ;
System . ou t . println ( "Data:

"

}
public void soma (int a , int b) {
System . ou t . println ("O nivel da bateria esta' em: + bat ) ;
if

(bat >=1)

int c ;
c

a + b;

System . ou t . println ( "O resultado da operacao e ' : + c ) ;

bat-;
System . ou t . println ( "Nivel da bateria: + bat) ;

}
if

(bat == 1 ) {
System .out .println( "Bateria fraca, recarregar ! ) ;

}
i f (bat == O ) {
System . o u t . println ( "Robo danificado ! ) ;

}
}
public void subtrai (int a , int b ) {

if (bat > = 1 ) {
int c ;
c = a - b;
System . ou t . println ( "O resultado da operacao e ' : " + c ) ;
bat-;

'

CAPITULO 4 - CONCEITOS DE PROGRAMAAO

49 .

43

System . o u t . println( "Nivel da bateria:

50.

51 .

if

"

+ bat ) ;

(bat == 1) {
System. o u t . println( "Bateria fraca, recarregar ! " ) ;

52.

53.
54.
55.

56.

if

(bat

==

0) {

System.out. println ( "Robo danificado ! " ) ;

57.

58.

public void multiplica( int a,

int b) {

i f (bat >=1) {

59.
60.

int c ;

61.

62.

System . o u t . println ( "O resultado da operacao e ' :

63.

bat-;

64.

System . o u t . println( "Nivel da bateria:

65.

66.

if

a * b;

"

+ c);

+ bat ) ;

(bat == 1) {
System. out. println ( "Bateria fraca, recarregar ! " ) ;

67.
68.

69.

if (bat

70.

==

O) {

System . out . println ( "Robo danificado ! " ) ;

71 .
72.

73 .

public void divid e ( int a , int b) {

74 .

if

(bat >=1) {

75 .

int c ;

76.

77.
78.

System . ou t . println ( " O resultado da operacao e' :


bat-;

79.

System . o u t . println( "Nivel da bateria:

80.

81.

if

a I b;

"

"

+ c) ;

+ bat ) ;

(bat == 1 ) {
System . ou t . println ( "Bateria fraca, recarregar ! " ) ;

82.
83.

84.

if

85.

(bat

==

0) {

System.out.println ( "Rob danificado ! " ) ;

86.

87.
88.

"

Nesse exemplo, pode-se verificar a criao de uma classe denominada Robo,


que herda os atributos e mtodos da superclase Robo_superclase (linha 1 ) que
possui os atributos declarados nas linhas 3 a 6. Os chamados mtodos construtores so
responsveis pela criao das instncias de classe, ou seja, novos objetos com as carac
tersticas da classe Robo. Foram definidas duas formas de criao de instncias: uma
sem passagem de parmetros (linha 3) e outra com a passagem de parmetros definindo
nome, srie e data (linha 9).

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

44
ATENO!

A palavra Robo refere-se ao nome da classe e deve ser escrita sem


acento.

NOTA!

Mtodo a implementao ou a codificao em uma linguagem de


programao de uma opera,io de Ltm objeto.

O mtodo mudaNome (linha 15) permite a alterao do nome do rob. Esse


mtodo recebe como parmetro o novo nome que o rob dever assumir. Esse mtodo
demonstra a caracterstica de encapsulamento de dados da metodologia, ou seja, so
mente possvel alterar o nome de um rob acessando-se esse mtodo. Outros atributos
de Robo, como o nmero de srie, por exemplo, no podero ser alterados. Uma vez
definido quando da instanciao de um novo rob, o nmero de srie no poder mais
ser alterado, visto que no h um mtodo que permita esse tipo de alterao. Preserva
se, assim, a integridade dos dados.
Robo tambm executa algumas operaes aritmticas como, por exemplo, a soma
de dois nmeros inteiros fornecidos, exibindo o resultado. Isso foi implementado nas
linhas 27 a 42. A exibio do resultado se d na linha 32, onde se mosna a literal: "O
resultado da operao : ", seguida do valor da varivel c.
Quando da execuo de uma operao aritmtica, a bateria do rob, que se ini
cia com a carga 5, decrementada, o que denota um desgaste. Isso feito pelo comando
na linha 38. Aps a execuo de uma seqncia de quatro operaes aritmticas, o
Robo atinge a carga da bateria igual a O (zero). Nesse caso, exibida a mensagem:
"Robo dani ficado! " , por meio dos comandos nas linhas 39 a 4 1 .
A seqncia de cdigo a seguir executa uma espcie de teste da classe Robo, no
qual so criadas duas i.nstncias da classe, Rl e R2, so chamados alguns mtodos e so
executadas algumas operaes aritmticas.
1.

class TestaRobo

2.

3.

public static void main ( String [ ) args ) {

4.

System. out . println ( "Testando Robo" ) ;

5.

Robo R1

6.

System. out . println ( "Robo :

7.
8.

Rl . soma ( 3 , 2 ) ;
R1 . subtrai ( 8 , 2 ) ;

9.

R 1 . multiplica ( 3 , 4 ) ;

new Robo ( } ;

10.

Rl . divide ( 8 , 2 ) ;

11.

Rl . divide ( 6 ,

" + Rl . mostraNome ( ) ) ;

3) ;

12 .
13.

Robo R2

14.

System . o u t . println ( "Testando Robo" ) ;

15.

System . o u t . println( "Robo :

16.

R2 . soma ( 5 , 4 ) ;

17 .

R2 . multiplica ( 3 , 5 ) ;

18.

R2 . mostraTudo ( ) ;

new Robo ( "D2 8 8 " ,

2,

" 0 5 / 1 1 / 2 0 02 " ) ;

" + R2 . mostraNome ( ) ) ;

'

CAPITULO 4 - CONCEITOS DE PROGRAMAAO

19.

20.

45

A instanciao de um objeto da classe Robo feita por meio do cdigo que est
nas linhas 5 e 1 3; em cada caso, foi usado um dos dois mtodos constmtores possveis.
Deve-se notar a chamada de um mtodo, como o que exibe o nome do rob (linha 6),
utilizando-se a notao: Objeto. mtodo, no caso, Rl . mos traNome ( ) .

4.4

'"'

EXERCICIOS PARA F IXAAO


1 . Faa um comparativo entre a programao estmturada e a programao orientada a objetos e cite as vantagens de cada uma.
2 . Quais so as principais caractersticas da programao estruturada?
3. Quais so as principais caractersticas da programao orientada a objetos?
4.

Quais so as principais caractersticas da programao linear?

5. Cite alguns exemplos de linguagens de programao orientada a objetos,


estruturada e linear.

4.5

EXE RCICIOS COM P L E M E NTARES


1 . Descreva alguns exemplos de atividades nas quais seja possvel o uso do
recurso de polimorfismo.
2. Descreva alguns exemplos de atividades nas quais seja possvel o uso do

recurso de encapsulamento.
3.

Descreva alguns exemplos de atividades nas quais seja possvel o uso do


recurso de herana.

"'

PIT

UL

CONSTRUO
DE ALGORITMOS :
ESTRU T U RAS
DE CONTRO LE
Entrada e sada de dados
Estr uturas de seleo (de deciso ou de desvio)
Estr uturas de repetio
Exemplos e exercfcios parafixao

OBJETIVOS:

Abordar as tcnicas para entrada e sada de dados e


as estruturas para controle do fluxo de dados em
pseudocdigo, fluxograma e na linguagem de pro
gramao Java.

magine que pretendemos construir um aparelho para realizar uma ao qualquer na


casa do comprador. Como no moramos na casa dos possveis compradores, no
sabemos se o aparelho ser utilizado da maneira que planejamos e, portanto, devemos
prever os possveis comportamentos do aparelho para que cumpra suas tarefas sem pro
blemas para o comprador. Quando fazemos um programa, devemos saber constm-lo
para prever qualquer inteno que o usurio tenha ao utilizar esse programa.
Entrada e sada de dados

Entrada

Processamento

Saida

'

CAPITULO 5 - CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

47

importante ressaltar a seqncia de fatos que fundamentam a lgica computa


cional: a entrada dos dados que sero processados para obter a sada. Os dados que
entram em processamento sofrem transformaes resultantes do processo e uma sada
produzida, representando a soluo de um problema. Vamos fazer uma breve anlise
desses dois aspectos de um programa.

5.1

E N T RADA

A entrada elementar de dados feita por meio do teclado (dispositivo-padro) e


representada por:
Ler

(variavel)

Para uma varivel inteira, por exemplo, esse comando procura uma seqncia de
caracteres que representem os dgitos de um inteiro eventualmente precedidos por um
sinal + ou - . Nesse caso, so descartados eventuais caracteres brancos e, a partir do
primeiro caractere no branco, a rotina de leitura assume que encontrou uma cadeia de
caracteres que est de acordo com a sintaxe dos inteiros.
Se isso no acontece, ocorre um erro fatal e a execuo do programa interrom
pida. Se, por outro lado, a rotina encontra um caractere que atenda sintaxe de um intei
ro, ela continua a consumir caracteres at que encontre algo diferente, como um caractere
branco, por exemplo.
Durante o processo, a seqncia de caracteres que satisfaz a sintaxe de um intei
ro convertida em um valor binrio. Ao final do processo, o valor binrio resultante
armazenado na posio correspondente varivel inteira para a qual a rotina de entrada
procurou um valor.
Quando falamos que caracteres brancos so desca1tados, estamos apenas
exemplificando. Isso ocorre tambm com caracteres de formatao de texto como o de
tabulao, o de mudana de linha e o de 'retorno de carro' .
Ao digitarmos dados pelo teclado, eles so 'ecoados' na tela do monitor do
computador, isto , so mostrados na tela conforme vo sendo digitados. Enquanto
no se pressiona uma tecla de mudana de campo (ENTER para DOS ou TAB para
telas grficas), o processo de leitura no disparado e o programa suspende a execu
o do comando de leitura que est solicitando dados do usurio. Ao ocorrer o disparo
pelo pressionar da tecla ENTER (ou TAB), a execuo do programa retomada nesse
ponto.
No caso particular da linguagem Java, todas as variveis lidas por meio do tecla
do so reconhecidas como caracteres da tabela UNICODE. Como a linguagem rigoro
sa quanto aos dados que ir manipular, para ler uma varivel de um tipo qualquer, deve
se utilizar um processo denominado coero, que nada mais do que a produo de um
valor com o tipo diferente do original. Essa coero realizada por meio de recursos
especiais do Java, que podem ser consultados no Anexo.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

48
,

5.2

SAlDA
'

E claro que um computador e toda a sua programao no seriam de nenhuma


utilidade se o programa no mostrasse o resultado das operaes. O dispositivo-padro
de sada o monitor do computador, e essa sada representada com o comando:
Mostrar (variavel)

A maioria das linguagens de programao possui recursos que permitem fazer


uma formatao bsica da sada de tela com comandos que escrevem na mesma linha ou
'pulam' para a linha inferior.
ExEMPLo s. 1:

Como costume, o primeiro programa que se aprende a fazer em qualquer


linguagem um aplicativo que mostra uma frase na tela: "Al Mundo!"
Nesse programa no necessrio o uso de variveis.

Pseudocdigo:
1.
2.

3.
4.

Algoritmo Primeiro
Incio
Mostrar ( "Al Mundo ! " )
Fim.

Na linha 1 o algoritmo identificado. As linhas 2 e 4 representam o incio e o


fim do algoritmo, e a linha 3 a ao que o algoritmo tem que realizar.
Fluxograma:
Incio

"Al Mundo!"

Fim

Java:
1.

2.

class Primeiro {
public static void main ( String args [ ) ) {
System . out .println ( "Al Mundo ! ") ;

3.

4.

5.

}
}

Sobre o cdigo:
1. class Primeiro indica o nome do programa. No caso do Java, todos os
programas so classes.

CAPTULO 5 - C ONSTRUO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

2.

49

publ ic static void main ( String args [ ] ) indica o bloco de

instrues que sero executadas seqencialmente quando o programa for re


quisitado pelo usurio. Todo aplicativo escrito em Java deve possuir um bloco
indicado dessa maneira para poder ser executado.
3. System . out . print l n ( "Al

Mundo ! " ) a instruo que ordena a

exibio da frase na sada do sistema.


As chaves { e } indicam incio e fim de bloco, respectivamente.
CU IDADO!

A linguagem Java sensvel a maisculas e minsculas. Isso quer dizer


que as palavras reservadas devem ser escritas exatamente como so
definidas! class "# Class, public "# Public "# PUBLIC e assim por
diante.

EXEMPLO 5.2:

programa a seguir pergunta qual o nome do usurio e o escreve nova


mente na tela.
O

Pseudocdigo:
1.

Algoritmo ExEntrada

2.

Var

3.
4.

nome : literal
Incio

5.

Mostrar ( "Qual o seu nome ? " )

6.

Ler (nome)

7.

Mostrar (nome)

8.

Fim.

Neste exerccio necessrio o uso de uma varivel para representar o armazena


mento do nome do usurio; a declarao dessa varivel est sendo feita na linha 3. As
linhas 5, 6 e 7 so as aes necessrias para a realizao da tarefa; na linha 5 est sendo
exibida a mensagem "Qual o seu nome ? " ; as mensagens sempre devem estar
entre aspas.
Na linha 6 indicado que deve ser lido (fornecido) um valor para a varivel nome.
Na linha 7 o contedo da varivel nome est sendo exibido.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

50

Fluxograma:
Incio

"Qual o seu
nome?"

nome

nome

Fim

Java:
1.

import j ava . i o . * ;

2.

c1ass ExEntrada {

3.
4.

5.

pub1ic static void main

( String args ( ) ) {

BufferedReader entrada;
entrada = new BufferedReader ( new InputStreamReader
( System. in) ) ;
String nome ;

6.
7.
8.
9.
10.
11.
12.

try {
System . o u t . print1n( "Qual o seu nome?" ) ;
nome = entrada . readLine ( ) ;
Sy stem. out . print1n ( nome ) ;

} catch (Exception e ) {
System . out . println( "Ocorreu

um

erro durante a

leitura ! " ) ;

13 .
14.

15.

}
}

Sobre o cdigo:
1. A clusula import indica a utilizao do pacote de entrada e sada de dados
(j ava . i o . * ) da linguagem Java nesse programa. Embora isso seja desne
cessrio para a sada de dados, a linguagem requer um tratamento de entrada
de dados para sua leitura correta.
2. e 3.

c las s ExEntrada indica o nome do programa e, novamente, publ ic

static void main ( String args [ ) ) indica o blocode instrues

'

CAPITULO 5 - CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

51

que sero seqencialmente executadas quando o programa for requisitado


pelo usurio.
4.

e 5. No se assuste! Nessas linhas esto a declarao e a criao da varivel


entrada que ser utilizada para a leitura do teclado. Isso necessrio para
garantir que a leitura seja armazenada na memria com o formato de uma
seqncia de caracteres (String) para que seu valor possa ser manipulado
sempre da mesma forma. A vantagem dessa sintaxe que o programador
pode utilizar apenas uma varivel de entrada e depois convett-la para os
valores desejados quantas vezes forem necessrias.

6.

A varivel nome est sendo declarada para receber e armazenar na memria


o valor escrito pelo usurio. Como se deseja a entrada de um texto, ela
declarada como do tipo String.

7., 11., 12.

e 13. Definem um bloco de tratamento de erros caracterstico da


linguagem Java. Sempre que houver entrada de dados na linguagem Java,
um tratamento de erros simjlar ser necessrio. Para os fins da lgica deste
livro, o tratamento ser utilizado sempre dessa forma.
'

E recomendvel que o programa exiba uma frase solicitando ao usurio as


informaes necessrias para a sua execuo.
9.

A varivel nome recebe, por meio do mtodo readLine ( ) , o valor que o


usurio escreveu. A varivel entrada um objeto que permite a utilizao
desse mtodo para a leitura. Essa maneira de chamar mtodos tpica da
orientao a objetos.

10.

Aps a leitura da varivel, ela mostrada oa tela como sada de dados.

14.

e 15. As chaves dessas linhas fecham os blocos do mtodo e da classe, res


pectivamente.

EXEMPLo 5.3:

O programa a seguir realiza a soma de dois nmeros inteiros dados pelo


'

usuano.
Pseudocdigo:
1.

Algoritmo ExSoma

2.

Var
valor1 , valor2 , soma : inteiro

3.
4.

Incio

5.

Mostrar ( "Qual o primeiro valor? " )

6.

Ler (valor1)

7.

Mostrar ( "Qual o segundo valor? " )

8.

Ler (valor2 )

9.

soma valor1 + valor2

10.

11.

Mostrar ( soma )

Fim.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

52

Fluxograma:
Incio

'

"Qual
. .
o pnmero
valor?"

valor1
I

"Qual
o segundo
valor?"

valor2
I

soma f- valorl
+ valor2

soma

Fim

'

./)

Neste exemplo, alm da exibio de mensagens e entrada de dados, ocorre tam


bm um processamento determinado pela opemo aritmtica de adio entre as vari
veis valorl e valor2 e pela atribuio do resultado varivel soma (linha 9).
Java:
1.

import java . io. * ;

2.

class ExSoma {

3.

public static void main ( String args [ ) ) {

4.

BufferedReader entrada;

5.

entrada

new BufferedReader ( new InputStreamReader

(System. in) ) ;

6.
7.

int valorl, valor2 , soma ;

try {

'

CAPITULO 5

CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

8.

System .out.print1n( "Qua1 o primeiro valor? " ) ;

9.

valor1

Integer . parseint ( entrada. readLine ( ) ) ;

10.

System .out.print1n( "Qual o segundo valor? " ) ;

11.

valor2

12.
13.
14.

53

Integer . parseint ( entrada . readLine ( ) ) ;

soma = valor1 + valor2;


System.out.println(soma) ;
} catch (Exception e ) {

15 .

System .out.println( "Ocorreu um erro durante a


leitura ! " ) ;

16.

17.

18.

Repare que as linhas em itlico so exatamente iguais s do programa anterior.


Essas linhas so caractersticas da linguagem e no afetam a lgica do problema.
Sobre o cdigo:
Na linha 6 so declaradas trs variveis do tipo inteiro para armazenar os valores
inteiros dados pelo usurio e realizar a soma.
As linhas 9 e 1 1 recebem os valores lidos do console na forma de texto e os
convertem para nmeros inteiros utilizando o mtodo Integer . parseint ( ) , tam
bm especfico da linguagem Java. Note que, no caso de o usurio digitar um nmero
real ou uma letra., o programa no efetuar um erro fatal devido ao tratamento de erro,
mas exibir uma mensagem de erro para o usurio, sem realizar a conta. Essa mensa
gem pode ser personalizada para cada programa.
Finalmente, as linhas 1 2 e 1 3 realizam a soma desejada e mostram o resultado
na tela.

5.3

,...

,...

E S T RUTURAS D E S E L EAO OU D E C I SAO

As estruturas de seleo ou deciso so utilizadas quando existe a necessidade


de verificar condies para a realizao de uma instruo ou de uma seqncia de ins
trues. Os testes de seleo tambm podem ser utilizados para verificar opes de
escolha. A seguir so apresentados exemplos para os dois casos.
Suponha que uma pessoa esteja jogando um jogo de computador:
1.

Para que o jogador passe de uma fase (etapa) para a fase seguinte, necess
rio que se verifique se ele atingiu a pontuao exigida. Assim, existe uma
condio para a realizao de uma seqncia de instrues para liberar o acesso
prxima fase do jogo.

2.

Ao final do jogo, uma pergunta feita: "Deseja continuar jogando?" O joga


dor poder escolher entre as respostas sim ou no.

As estruturas de seleo podem ser do tipo simples, composto ou encadeado.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

54

5.4

'"'

E S T R U T U RAS D E S E L EAO S I M P L E S

So utilizadas para verificar se dada condio atendida: se for, um conjunto de


instrues dever ser executado; se no for, o fluxo da execuo do algoritmo seguir
aps o fim do bloco de deciso.
Toda condio pode ser encarada como uma petgunta que pode ter a
resposta verdadeiro ( . v . ) ou falso (. f . ).

NOTA:

Pseudocdigo:
Se

(condio)

ento

[incio do bloco de deciso)

conjunto de instrues
Fim-Se [fim do bloco de deciso]
Fluxograma:

co ndio

.v.

conjunto
de instrues

Java:
if

(condio)

<conjunto de instrues>;
}
Quando o teste de condio resultar verdadeiro, sempre ser exe
cutado o primeiro conjunto de instrues encontrado. Caso contrrio,
isto , se a condio resultar falso, ser realizado o segundo conjun
to de instrues, ou seja, o conjunto de instrues aps o seno. (Vide
o exemplo no item "Estwturas de seleo compostas".)

NOTA:

EXEMPLo 5.4:

Verificar se um nmero fornecido pelo usurio mpar. Se for, exibir a


mensagem: "O nmero informado mpar".

Pseudocdigo:
1.

Algoritmo no_impar

2.
3.

Var

4.

Incio

no: inteiro

5.

Ler (no)

6.
7.
8.
9.

Se (no mod 2

1 ) Ento

Mostrar ( "0 nmero informado mpar" )


Fim-Se
Fim.

'

CAPITULO 5

CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

55

Neste exemplo, na linha 6 feita a avaliao da condio. Como s existe uma


instruo a ser realizada (mostrar a mensagem "O nmero informado mpar"), ento
esta uma estrutura de seleo simples.
Fluxograma:
Incio

Leia no

"O nmero
informado
mpar"

Fim

.F.

Java:
1.

import java . io . * ;

2.

c1ass Numimpar

3.

pub1ic static void main ( S tring args [ ) ) {

4.

BufferedReader entrada;

5.

entrada

new BufferedReader (new InputStreamReader

( System. in) ) ;
6.

int numero ;

7.
8.

try

{
System .out.print1n ( "Qua1 o nmero? " ) ;
numero = Integer.pa rseint (entrada . readLine () ) ;

9.

10.

if

11.

(numero % 2

==

1)

Sys tem. out .prntln

12.
13.

) catch (Exception e )

14.

("O nmero informado mpar") ;

System . out. println ( "Ocorreu um erro durante a


leitura! " ) ;

15 .

16.
17.

)
)

Sobre o cdigo:
Na linha 6 declarada a varivel de tipo inteiro que receber, na linha 9, o valor
digitado pelo usurio e que ser avaliado no programa.
Na linha 10, a condicional avalia se o nmero mpar ao verificar se o resto da
diviso desse nmero por 2 igual a 1 . Se isso for verdade, ento a frase escrita na linha
1 1 ser mostrada na tela.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

56

Observe que % o operador que determina o resto da diviso e == o operador


que compara o resultado dessa operao com 1 . Em Java, o operador = determina atri
buio de valor e o operador == determina comparao de valores.
,..,

ESTRUTURAS D E S E L EAO COM POSTAS

5.5

A estrutura de seleo composta prev uma condio com dois conjuntos de


instrues para serem realizados de acordo com a avaliao da resposta: um bloco de ins
trues para resposta verdadeiro e um bloco de instrues para resposta falso.
Pseudocdigo:
Se (condio) ento
conjunto de instrues A

[conjunto de instrues que ser realizado se o teste de condio


resultar verdadeiro]

Seno
conjunto de instmes B

[conjunto de instrues que ser realizado se o teste de condio


resultar falso]

Fim-Se

Fluxograma:

condio

.v.

conjunto de

instrues A
Fim

.F.

conjunto de

instrues B

Java:
if

(condio)

<conjunto de instmes A>;

) else

<conjunto de instmes B>;

)
EXEMPLo 5.5:

A empresa XKW Ltda. concedeu um bnus de 20 por cento do valor do

salrio a todos os funcionrios com tempo de trabalho na empresa igual ou


superior a cinco anos e de dez por cento aos demais. Calcular e exibir o
valor do bnus.

Para resolver o problema, necessrio conhecer o valor do salrio e o tempo de


servio do funcionrio. Para isso, sero utilizadas as variveis salario e tempo, que
representaro esses valores. Para armazenar o valor do bnus, ser utilizada a varivel
bonus.

'

CAPITULO 5 - CONSTRUAO
D E ALGORITMOS: ESTRUTURAS DE CONTROLE
-

57

Pseudocdigo:
1.

Algoritmo Premio

2.

Var

3.

salario, bonus : real


tempo : inteiro
Incio

4.

5.
6.

Ler (salario)

7.

10.
11.
12.

Ler ( tempo)
Se ( tempo >= 5 ) ento
bonus f- salario * 0 . 2 0
Seno
bonus <- salario * 0 . 1 0
Fim-Se

13.

Mostrar ( "0 valor do bnus " , bonus)

8.
9.

14.

Fim.

Na linha 8 est sendo feito o teste para verificao da condio que foi estabele
cida no enunciado; esta uma condio com resposta verdadeira e uma instmo para
resposta falsa, por isso uma condio composta.
Fluxograma:
Incio

sala rio

tempo

O valor
do bnus "
bnus
"

.F.

bonus f- Sal:>nnl

-f---'
0.10
'---

Java:
1.
2.
3.

4.

import java . i o . * ;
class Premio {
pub1ic static void main (String args [ ) ) {

BufferedReader entrada;

Fim

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

58
5.

entrada

new BufferedReader (new InputStreamReader

( System. in) ) ;

6.
7.
8.
9.
10.
11.
12 .
13 .
14.
15.
16.
17 .
18.
19.
20.

float salario, bonus;


int

tempo;

try {
System. out.println ( "Qual o salrio ?") ;
salario

Fl oat .pa rseFloat (entrada . readLine () ) ;

System. out .println ("Quanto tempo est na

empresa ?") ;

tempo = Integer.parseint (entrada . readLine ( ) ) ;


if

( tempo >=

5)

bonus - salario

) else

0 . 20f;

bonus - salario

}
catch (Exception e)

* O . l Of;
("0

System . o ut .println

valor do bnus

"

bonus) ;

System. out .println ( "Ocorreu

um

erro durante a

leitura ! " ) ;
21.

22 .
23.

}
)

Sobre o cdigo:
Nas linhas 6 e 7 so declaradas as variveis necessrias para o programa. Obser
ve que o salrio e o bnus so variveis do tipo real (no Java, f lo at) e o tempo
uma varivel do tipo inteiro. Nas linhas I O e 12, onde se far a leitura desses valo
res, isso observado pela converso adequada dos valores de entrada com as funes
Float . parseFloat ( ) e Intege r . parseint ( ) .
Nas linhas 1 3 a 1 7 realizada a condicional composta que fornece o resultado
desejado, como no algoritmo em portugus estruturado. Observe a letra f no final dos
valores multiplicados: essa outra caracterstica da linguagem Java que garante que o
tipo resultante ser um valor real do tipo float.

5 .6

E S T R U T U RAS D E S E L EAO E NCADEADAS

Uma estrutura de seleo encadeada uma seqncia de testes de seleo, os


quais sero executados ou no de acordo com o resultado das condies e de acordo
com o encadeamento dos testes, i.sto , um teste de seleo pode ter dois conjuntos de
instrues, conforme visto na Seo "Estruturas de seleo compostas", um para resul
tado verdadeiro e outro para falso; porm, esses conjuntos de instmes podem
conter outros testes de seleo, que por sua vez tambm podem conter outros e assim
por diante.

'

CAPITULO 5

CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

59

Pseudocdigo:
Se

(condio_l) ento
Se (condio_2)

ento

conjunto de instrues

Seno
conjunto de instrues B
Fim-Se
Seno
conjunto de instrues C
Fim-se

NOTA:

No modelo acima, se a condio_ 1 resultar verdadeiro, ento ser


realizado o teste da condio_2; se esse teste resultar verdadeiro,
ser realizado o conjunto de instrues A; se resultar falso, ser rea
lizado o conjunto de instrues B. Se o teste da condio_1 resultar
falso, ser realizado o conjunto de instrues C.

Fluxograma:

condio_l

condio_2

,_.v_.

conjunto de
instrues A

.F.
.

conjunto de
instrues C

Java:
if ( <condio_l>)

i f ( <condio_2> )

<conjunto de instrues A>

} else

<conjunto de instrues B>

}
} else {
<conjunto de instrues C>

conjunto de
instrues B

Fim

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

60
EXEMPLO 5.6:

Faa um algoritmo que receba trs valores que representaro os lados de


um tringulo e sero fornecidos pelo usulio. Verifique se os valores for
mam um tringulo e classifique esse tringulo como:
eqiltero - trs lados iguais;
issceles - dois lados iguais;
escaleno - trs lados diferentes.
Lembre-se de que, para formar um tringulo:
nenhum dos lados pode ser igual a zero;
um lado no pode ser maior do que a soma dos outros dois.

Pseudocdigo:
1.

Algor itmo tr iangu l o

2.

Var

3.
4.

A , B , C : inteiro
Inicio

5.

Ler (A, B , C)

6.

Se (A <> O )

7.
8.

.e.

(B <> O )

.e.

(C <> 0 } ento

Se (A<B+C) . e . (B<A+C} . e . (C<A+B} ento


C) ento
B} . e . (B
Se (A
=

Mostrar ( " um tringulo eqiltero" )

9.
10.

Seno
Se ( A = B )

11.

.ou.

(A = C}

.ou. (C = B ) ento

'

Mostrar ( "E um tringulo issceles " )

12 .
13 .

Seno

1 4.

Mostrar ( "E um tringulo escaleno " )


Fim-Se

'

15.
16.

Fim-Se
Seno

17 .

Mostrar ( "Os valores no formam um tringu l o " )

18.
19.

Fim-Se

20.
21.

22.
23.

Seno

Mostrar ( "Os valores no formam um tringulo " }


Fim-Se
Fim.

'

CAPITULO 5

CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

61

Fluxograma:
Incio
A
A
"Os valores
,;.;
F
..:...<nio formam
tringulo"
B

.V.

(A=B) e
(B=C)

.v.

" um
tringulo
eq i I te ro"

. F.

A<>O e
B<>O e
C<>O

.F.

"Os valores
formam um
tringulo"

B) ou
(A=C) ou

.v.

" um
tringulo
issceles"

.F.

" um
tringulo
escaleno"
Fim

Java:
1.

import java . i o . * ;

2.

class triangu1o {

3.
4.

public static void main ( String args [ ) ) {


int A, B , C ;

5.

BufferedReader entrada ;

6.

entrada = new BufferedReader (new


InputStreamReader(System . in) ) ;

7.
8.

try{
System.out.print1n ( "Lado A =" ) ;

10.

A = Integer. parseint ( entrada. readLine ( ) ) ;


System . out . println ( "Lado B = " ) ;

11.

B = Integer .parseint (entrada. readLine ( ) ) ;

12.

Sys tem . o u t . println ( "Lado C =" ) ;

13 .

C = Integer .parseint (entrada. readLine ( ) ) ;

14.

if

9.

15.
16.

(A ! = O && B != O && C ! = 0 ) {
if (A + B > C && A + C > B && B + C > A) {
if (A ! = B && A ! = C && B ! = C ) {

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

62

17 .
18.
19.

System. out . println ( "Escaleno" ) ;


}else{
if (A == B && B == C ) {

20.

System. out . println ( "Equilatero" )

21.
22 .

}else{
System. out . println ( " I sosceles" ) ;

23.

24 .

25.

}else{

26.

System . ou t . println( "Nao forma

27.

29.

}
}else{
System . out . println ( "Nao forma

30.

28

31.

} catch ( Exception e)

32 .

um

um

triangulo " ) ;

triangulo" ) ;

System . o u t . println ( "Erro de leitura" ) ;

33 .
34 .
35.

}
}

Na resoluo do exemplo 5.6 so feitos testes de condio encadeados, i.sto ,


testes de condio do conjunto de instrues para uma resposta (ou para ambas) que
contm um outro teste de condio.
Na linha 6 do pseudocdigo e na linha 14 do programa ocorre um teste de condi
o para verificar se os valores fornecidos podem formar um tringulo. Assim, se essa
primeira condio for atendida, isto , se a resposta for verdadeira, um outro teste ser
realizado nas linhas 7 do pseudocdigo e 1 5 do programa; ento, novamente, se essa
condio for verdadeira, sero realizados os testes das linhas 8 e 1 1 do algoritmo e 1 6 e
1 9 do programa para classificar o tringulo.
5.7

"

E S T R U T U RAS DE S E L E AO DE M U LTI PLA


ESCOLHA

Uma estrutura de seleo de mltipla escolha uma estrutura de seleo que


funciona como um conjunto de opes para escolha. E tambm denominada estrutura
de seleo homognea. Existem duas maneiras para represent-la: utilizando o enca
deamento da instruo se e utilizando a instruo escolha caso. A segunda opo
a mais indicada.
'

Estrutura com condicionais encadeadas


Se varivel

Tal_Coisa_1

Faa instruo a
Seno

Se varivel
Tal_Coisa_2
Ento instruo b
=

CAPITULO 5 - CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE


'

Seno
Se varivel

Tal_Coisa_3

Ento instruo c
Seno instruo d
Fim-Se
Fim-Se
Fim-Se

Estrutura com seleo de mltipla escolha


Escolha varivel
Caso Tal_Coisa_ I Faa instruo a
Caso Tai_Coisa_2 Faa instruo b
Caso Tai_Coisa_3 Faa instruo c
Caso Contrrio Faa instruo d
Fim-Escolha

Fluxograma:

condio

,_
.v
__
.

instrues

.F.

condio
B

instrues
B

.V.

instrues

.F.

condio

>

. F.

Java:
( <vaiivei>) {
case <Tal_Coisa_ I > : <instruo a>;

swi tch

[break; J
case <Tal_Coisa_2> : <instruo b> ;
[break ; ]
case <Tai_Coisa_3>

<instruo c>;

[break; ]
defaul t : <instruo d>
}

-- ...

63

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

64
NOTA:

A palavra reservada break utilizada na linguagem Java para garantir


que apenas a instruo selecionada seja executada. Sem esse
modificador de fluxo, todas as instrues a partir da seleo encontra
da seriam executadas.

ExEMPLO 5.7:

Ler o cdigo de um produto e exibir o seu nome de acordo com a tabela a

seguu:

Cdigo do produto

Nome do produto

001
002
003
qualquer outro

Caderno
Lpis
Borracha
Diversos

Pseudocdigo utilizando a instruo escolha caso:


1.
2.

Algoritmo produto
Var

3.

4.

codigo: inteiro
Incio

5.

Ler (codigo)

6.

Escolha codigo
caso 0 0 1 : Mostrar ( "O produto caderno")
Caso 002 : Mo strar ( "O produto lpis " )

7.
8.
9.

10.
11.
12 .

Caso 0 0 3 : Mostrar ( "O produto borracha" )

Caso contrrio: Mostrar ( "Diversos " )


Fim-Escolha

Fim.

Pseudocdigo utilizando a instruo se:


1.
2.
3.
4.

5.

Algoritmo produto
Var
Codigo: inteiro
Incio

7.

Ler (Cdigo)
se Codigo = 001 Ento
Mostrar ( "O produto caderno" )

8.

Seno

6.

9.

Se Codigo

10.

0 0 2 Ento

Mostrar ( "O produto lpi s " )

11.

Seno

003 Ento
Mostrar ( "0 produto borracha" )
Seno

12 .
13 .
14.
15.
16.

Se Codigo

Mostrar ( "Diver s o s " )


Fim-Se
Fim-Se

17 .

18.
19.

Fim-Se

Fim.

CAPITULO 5 - CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE


'

65

Fluxograma:
A representao da resoluo por meio do fluxograma igual para as duas pos
sibilidades, tanto utilizando a instruo escolha caso quanto a instruo se.
Inicio

codigo

codigo
001

.F.

codigo
003

"Diversos"

.v.

"O produto
caderno"

"O produto

"O produto

lpis"

borracha"

Fim

Java (usando escolha):


1.

irnport java . i o . * ;

2.

class Produto {
public static void rnain (String args [ ) ) {

3.

4.

BufferedReader entrada ;
entrada = new BufferedReader (new InputStrearnReader

5.

(Systern. in) ) ;
6.

int codigo;

7.

try {

8.

System. out .println ("Digite o cdigo:

9.

codigo

10.
11.

svitch

Integer.parseint (entrada . readLine () ) ;

(codigo)

case 001

12.

{
System. out .println

("Caderno") ;

System . o u t .println

("Lpis") ;

System. out.println

("Borracha") ;

break;
case 002

13 .
14.

break ;
case 003

15.
16.

break;

17.
18.

default

System . o u t .println

("Diversos ") ;

} catch (Exception e ) {
Systern . out . println ( "Ocorreu

19.
20.

leitura ! " ) ;

21.
22.
23 .

") ;

um

erro durante a

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

66

5.8

""

E S T R U T U RAS D E R E P E TIAO

Em determinadas situaes, temos de repetir o programa ou parte dele vrias


vezes, como no clculo das mdias das notas de um gmpo de alunos. Reiniciar o progra
ma para cada clculo no uma soluo muito prtica e algumas vezes invivel. Uma
soluo comum a utilizao de estruturas de repetio.
O conceito de repetio (ou looping) utilizado quando se deseja repetir um
certo trecho de instrues por um nmero de vezes. O nmero de repeties pode ser
conhecido anteriormente ou no, mas necessariamente precisa ser fmito.
Nem todas as estruturas de repetio possuem recursos para fazer a contagem do
nmero de vezes que o lao dever ser repetido. Por isso, deve-se utilizar uma vari.vel
de apoio, sempre do tipo inteiro.
Exemplo:
Var contador

inteiro

Inicio

contador <- contador + 1


Na expresso contador f- contador + 1, o + 1 denominado
incremento. Isso significa que, cada vez que for executado, acrescen
tar 1 varivel contador. O incremento no precisa ser necessaria
mente 1, pode ser qualquer outro valor; inclusive negativo; neste caso
denominado decremento.

NOTA:

'

As vezes tambm ser necessrio acumular valores, isto , calcular o somatrio


de um conjunto de valores. Para isso, tambm ser necessrio utilizar uma varivel de
apoio, que pode ser do tipo inteiro ou real, de acordo com os valores que sero
acumulados.
Exemplo:
var
acumulador : real ;
valor: real;
Incio
acumulador f- acumulador + valor;

-7

a varivel que deve ter seu valor

acumulado.

5.8. 1

E S T R U T U R A D E R E P ET I AO COM TESTE N O I N I CIO


- ESTRUTURA E N Q UANTO

Na estrutura enquanto, a condio de repetio verificada antes de entrar no


lao, isto , uma condio testada inicialmente e, se o resultado for verdadeiro, o bloco
de instrues ser executado.

'

CAPITULO 5

CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

67

Lao o bloco de instrues que sero realizadas repetidas vezes e

NOTA:

que esto contidas em uma estrutura de repetio.

Pseudocdigo:
Enquanto condio Faa
<Bloco de instrues>

Fim-Enquanto;

Fluxograma:
Loop
condio
de

.F.

.V.
instrues
do lao

Java:
whi le

(<condio> )

<bloco de instrues>

Conforme esboado acima, inicialmente testado o valor da condio. Se ela for


verdadeiro, ento ser executado o comando ou bloco de comandos controlado pela
estrutura do whi le. Aps essa execuo, testa-se novamente o valor da condio. Se a
condio ainda for verdadeiro, ento os comandos sero executados novamente e
assim sucessivamente at que a condio seja falso.
Como o teste da condio sempre realizado antes da execuo dos comandos
controlados pela estrutura, se desde o incio a condio for falso, ento os coman
dos controlados no sero executados nenhuma vez.
E imp01tante observar que, para terminar a execuo do comando whi le, em
algum momento os comandos na estrutura whi 1 e devem modificar o valor da condio
de controle, de modo que a condio se torne falso. Se isso no acontecer, o proces
so de repetio ocorrer indefinidamente e a execuo do programa no ser terminada.
,

ExEMPLo s.a:

Ler 850 nmeros fornecidos pelo usutio e calcular e exibir a mdia.

Pseudocdigo
1.

Algoritmo ExEnquanto

2.

Var

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

68
3.

soma, num, media: real

4.

cont : inteiro

5.

Incio

6.

soma f- O

7.

cont f- O
Enquanto cont
Incio

8.
9.

850 faa

<

10.
11.

Ler (num)

12 .

cont f- cont + 1

soma f- soma + num

Fim
media f- soma I cont
Mostrar ( "Mdia
media)

13 .

14.
15.
16.

"

Fim.

A varivel cont ter a funo de contar o nmero de vezes que as instrues


dentro do lao sero repetidas. A varivel soma ter a funo de acumular todos os
valores atribudos varivel num.
O trecho que est entre as linhas 8 e 13 o conjunto de instrues que ser repe
tido se a condio da linha 8 (Enquanto cont < 8 5 0 faa) resultar verdadeiro.
A varivel soma acumular o seu prprio valor mais o valor de num a cada vez
que o trecho for executado.
ATENO:

Toda vari<ivel que tem a funo de cont,1dor ou acumulador deve ser


inicializada.

Fluxograma:
'-..

Incio

\
"'

./

soma f- o
cont f- O

\
"'
C>.
o
o
_,

cont < 850


.v.

\lt

num

"'
\
soma f-

soma

+ num
cont <- cont + 1

.F.

media fsoma/cont

"Mdia =",

media

Fi m

CAPTULO

5 - C ONSTRUO D E ALGORITMOS: ESTRUTURAS DE CONTROLE


O loop acontece sempre que a condio satisfeita

NOTA:

69

(verdadeiro).

Java:
1.

import java. i o . * ;

2.

class ExEnquanto (
public static void main ( Str ing args

3.
4.

5.

()) (

BufferedReader entrada;
entrada = new BufferedReader ( new InputStreamReader
( System. in) ) ;

6.

float numero, medi a ,

7.

int con t ;

8.

cont

O;

9.

soma

Of;

soma ;

try (

10.
11.

;vhile

(cont

<

850)

12 .

System . o u t .prin t l n ( "Digite o nmero : ") ;

13 .

numero

14 .

soma - soma + numero;

15.

cont

}
media

16.

Float .parseFloat (entrada . readLin e () ) ;

cont

+1;

soma I con t ;
Sys tem. out .println ("Mdia -

17 .
18.

" + media) ;

) catch (Exception e) (
System . ou t . println ( "Ocorreu um erro durante a

19.
20.
l e i tura !
21.

22.
23 .

"

Sobre o cdigo:
Na linha 9, temos que a soma recebeu o valor O f. Como j foi discutido, essa
uma particularidade da linguagem Java e a funo da letra f garantir que o nmero
sja considerado do tipo real (float).
Na condio da estrutura de repetio, utilizamos < em vez de <=. Cuidado com
esses detalhes. A contagem est comeando com O, mas, quando contamos uma quanti
dade qualquer, sempre comeamos com 1. Portanto, se a condio fosse determinada
com <=, estaramos somando um valor a mais. Esse teste pode ser facilmente realizado
com quantidades de nmeros menores.

5.8.2

ESTRUTURA D E R E P E T IAO COM TESTE N O F I M E S T R U T U R A R E P ITA

A estrutura de repetio com teste no fim permite a um ou mais comandos serem


executados repetidamente at uma condio especfica tornar-se verdadeiro. Essa
estrutura age de forma muito semelhante estrutura anterior; a diferena que os co-

'

70

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

mandos so executados antes de se testar o valor da condio. Como a condio testa


da no final, os comandos na estrutura sero executados pelo menos uma vez, desconsi
derando-se o valor inicial da condio de controle.
Pseudocdigo:
Repita
<Bloco de instrues>
(<condio>)

At

Fluxograma:

instrues
do lao

condio
de
repetio

.F.

.v.

Java:
do {
<bloco de instrues>

) while (<condio>) ;

ExEMPt.o 5.9:

Ler 850 nmeros fornecidos peJo usurio e calcular e exibir a mdia.

Pseudocdigo:
1.
2.

Algoritmo ex_repi ta
Var

3.

soma , num, media: real

4.

cont : inteiro

5.

Incio

6.

soma <,-- O

7.

cont <,-- O

8.

Repita
Ler (num}

9.
10.

soma

<,--

11.

cont

<,--

cont + 1
At que cont => 8 5 0

12 .

media <,-- soma I cont

13 .
14.

15.

soma + no

Mostrar ( "Mdia

Fim.

"

media)

'

CAPITULO

71

CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

Fluxograma:
Inicio
'
v

cont O
soma <- O
,

,11

num
'
v

a.
o
o
-'

soma soma
+ num
cont cont + 1
'11
.

NOTA:

cont <= 850

media
soma/cont

"Mdia
media

"

Fim

O loop acontece at que a instruo seja satisfeita (verdadeiro).

Java:
1.
2.
3.

import java. io. * ;


class ExRepita {
public static void main (String args [ ] ) {

4.

BufferedReader entrada ;

5.

entrada = new BufferedReader(new InputStreamReader


(System. in) ) ;

6.

float numero, media, soma;

7.
8.

int cont;
cont = O ;

9.

soma = O f ;

10.

try {
do {

11.
12.

System . ou t .print ( "Digite o nmero : " ) ;

13.

numero = Float. parseFloat( entrada . readLine ( ) ) ;

14.

soma

15.

cont

soma + numero;
cont + 1 ;

16.

) while (cont

17.

media = soma I cont;

18.

System . ou t . println( "Mdia - " + media ) ;

19.

<

85 0 ) ;

) catch (Exception e)

System. out. println ( "Ocorreu um erro durante a

2O .

leitura ! " ) ;

'

72

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

21.

22.
23.

Nos exempl.os 5.8 e 5.9 as variveis de controle que sero testadas a cada repeti
o (loop) podem ser utilizadas para armazenar nmeros (como no exemplo apresenta
do) ou letras. Por exemplo, pode-se desejar que um determinado trecho do programa
seja repetido de acordo com uma resposta do usurio:
Enquanto (resposta

"sim")

faa

<instrues>
Mostrar ( "Deseja continuar ? " )

ler (resposta)
Fim enquanto

No exemplo anterior importante padronizar a leitura da resposta, pois sim


diferente de SiM, ou seja, existe diferenciao entre maisculas e minsculas.

ESTRUTURA D E R E P E T I AO COM VARIAVEL D E

5.8.3

CONTROLE - E S T R U T U RA PARA

A estrutura de repetio para utiliza variveis de controle que definem exata


mente o nmero de vezes que a seqncia de instmes ser executada.
Pseudocdigo:
Para <var>

<valor Inicial> At <valor Final> Passo <incremento> Faa

<Bloco de instrues>
Fim_Para ;
Os argumentos <valor Inicial> e <valor Final> podem ser substitudos

NOTA!

por variveis.

Java:
for ( <var>

<valor Inicial>; <condio>; <incremento> ) {

<bloco de instrues>

}
ExEMPLo s . 1 o:

Ler 850 nmeros fornecidos pelo usurio e calcular e exibir a mdia.

Pseudocdigo:
1.

Algoritmo ex_para

2.

Var

3.

soma, num, media: real

4.

cont : inteiro

5.

Incio

6.

soma f- O

7.

Para cont f- 1 at 850 Passo 1 Faa

'

CAPITULO

8.

73

Ler (no)
soma
Fim-Para

9.

10.
11 .

12.
13.

CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

f-

soma + num

media f- soma I cont


Mostrar ( "Mdia= " , media)
Fim.

No Exemplo 5.10, tem-se que:


cont - varivel de controle (= contador);
1 - valor inicial da varivel de controle;
8 5 O - valor final da varivel de controle - o contador ir variar de 1 at 8 5 O ;
Passo 1 - incremento - representa quanto ser acrescido varivel de controle
cada vez que o loop acontecer;
substitui a instruo contf--cont.
Fluxograma:
Inicio
Processamento pre-definido

I11
soma f- O

,
I11
cont f- 1 ,
850, 1

media fsoma/cont

"Mdia =",
media

I11

a.
o
o
--'

num

I11
soma f- soma
+ num

Java:
1 . import java. i o . * ;
2 . class ExPara (
public static
3.

void main (String args [ ] ) (

4.

BufferedReader entrada ;

5.

entrada = new BufferedReader(new InputStreamReader


( System. in) ) ;

6.

float numero, media, soma;

7.

int cont;

Fim

'

74

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

8.

soma

9.

try {

10.

Of;

for

(cont

O;

cont < 3;

cont++)

11 .
12.
13 .
14.

15.

media

16.

System. o u t . printl n ( "Mdia -

System. out.print ("Digite o nmero : ") ;


numero = Floa t . parseFloa t (entrada. readLine () ) ;

+ numero;

soma

soma

con t ;

} catch (Exception e)

18.

" + media) ;

System. out. println ( Ocorreu


"

um

erro

durante a

leitura ! " ) ;
)

20.
21.

soma

17 .

19.

}
}

Sobre o cdigo:
Na linha 10, o incremento determinado por cont++ equivalente a cont
cont + 1 . Essa sintaxe de compresso de operadores utilizada com freqncia na
linguagem Java.
=

5.9

EXERCICIOS PARA FIXAAO


Para os exerccios 1 e 2, faa o fluxograma e o programa em Java.
1 . Ler 300 nmeros divisveis por 3, calcular a soma entre eles e exibir o re
sultado.
Estrutura enquanto
Algoritmo Exemplo5_14
var

cont: inteiro
n , acm: real
Incio
cont O , acm O
Enquanto cont

300

Ler (n)
Se

n mod 3

O Ento

cont cont + 1
acm acm + n
Fim-Se
Fim_Enquanto
Fim.

2.

Faa a tabuada de um nmero qualquer fornecido pelo usurio e multiplica


do de 98 at 2.589. Exiba cada resultado.

CAPTULO

5 - C ONSTRUO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

75

Estrutura para
Algoritmo Exemplo5_15

var
N1 R : real
cont: inteiro
Incio
Ler (N)
Para cont : = 98 At 2589 Passo 1 Faa
R - N * cont
1'1ostrar (NI "multiplicado por" I contl
Fim-Para
Fim.

" = " I R)

"

5. 1 0 EXERCJCJOS S U G E R I DOS
1 . Um aluno realizou trs provas de uma disciplina. Considerando o critrio
abaixo, faa um programa que mostre se ele ficou para exame; em caso posi
tivo, qual nota esse aluno precisa tirar no exame para passar.
Mdia = (Provai + Prova2 + Prova3)/3
A mdia deve ser maior ou igual a 7,0. Se no conseguir, a nova mdia
deve ser:
Final = (Mdia + Exame)/2
Nesse caso, a mdia final deve ser maior ou igual a 5,0.
2. Uma livraria est fazendo uma promoo para pagamento vista em que o
comprador pode escolher entre dois critrios de desconto:
Critrio A: R$ 0,25 por livro + R$ 7,50 fixo.
Critrio B : R$ 0,50 por livro + R$ 2,50 fixo.
Faa um programa em que o usurio digita a quantidade de livros que deseja
comprar e o programa diz qual a melhor opo de desconto.

3 . Dados seis nmeros inteiros representando dois intervalos de tempo (horas,


minutos e segundos), faa um programa para calcular a soma desses interva
los. Faa outro programa para calcular a diferena entre os intervalos.
4.

Faa uma tabela mostrando a tabuada de um nmero dado pelo usurio.

5. Escreva um programa que apresente a tabuada no seguinte formato:


1

...

...

111-

2m

3m

2n

3n

mn

'

76

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

6.

O tringulo de Floyd tem o seguinte formato:


1
2

10

11

12

13

14

15

Isto , o elementoj da linha i (j <= i) tem o valor (i- 1 ) * i I 2 + j. Escreva um


programa que gere um tringulo de Floyd com m linhas.
7.

Um valor importante nas cincias exatas o neperiano ou nmero de Neper


(e = 2,7182). Alm do valor de e, o valor de ex tambm muito importante
para clculos diversos em matemtica, economia entre outras e pode ser ob
tido por meio da srie:
.

x
xe = 1 + x + - + ... + - + ...
r

'I

?
- .I

l. .

cuja relao de recorrncia :


et = L
11

tn = t1 + t2 + ... + t,

t0 = 1 ;

onde

t'' - tn-1 * .

i>o

Nessa srie, n representa o nmero de termos e x, o expoente. Faa um pro


grama que calcule eX, considerando que o usurio entre com os valores de x e
n como argumentos.
8.

Dado x real que representa um valor em radianos e n natural, calcule uma


aproximao para cos x por meio dos n. primeiros termos da seguinte srie:
?

COS X

= 1-

x-

2!

Relao de recorrncia:

,,.

.
x
x
x- 1
- - - + ... + (- J ) *
+ ...
4!
6!
(2 *i)!
.

'

(.r = - (.c-1 *Kf(k.*(k.


r
t - 1 ) )' i > 1
k. = k. 1
I

ti =

l-

+2

1 e k1

5 . 1 1 EXERCICIOS COM P L E M E N TA R E S
1.

Escreva um programa que determine o nmero de dgitos de um valor inteiro


maior ou igual a O.

2.

Para converter a temperatura de graus Celsius para Fahrenheit, usa-se a ex


presso:

'

CAPITULO

5 - CONSTRUAO D E ALGORITMOS: ESTRUTURAS DE CONTROLE

77

F = - C + 32
5

Faa um programa que efetue essa converso a partir de uma temperatura


dada pelo usurio.
3 . Considere a seqncia de Fibonacci, em que o n-simo nmero dado pela
seguinte frmula de recorrncia:
F1 = 1, F2= 1
F" = F11_1 + F11_2, para n >= 3

O quociente de F" por F11_ 1 converge para o nmero ureo, isto , F,, I F11_1 --7
1 .6 1 8 .. Esse nmero ureo usado em arquitetura e outras reas para deter
minar relaes das dimenses de objetos esteticamente 'agradveis'.
.

a) Faa um programa que calcule o n.-simo nmero de Fibonacci.


b) Faa um programa que calcule o nmero ureo com alguma preciso.
Dica:
A convergncia calculada pela soma dos termos dividida pelo nmero de
termos quando esses termos tendem a infinito, isto ,

"
n

4.

Q. + Q2 + ... +

" --7 1 .6 1 8;

onde

------

Q, =

Considere a seqncia:
1
1
1
l
1 - - + - - - + ... +
3
4
2
9.999

--

1
10.000

Faa um programa para calcular:


a) A soma de todos os termos de modo direto.
b) A soma dos termos positivos menos a soma dos termos negativos.

"

PIT

UL

ESTRU T U RA DE
DADOS: VETORES

Introduo s estruturas de dados


Conceito de vetores
Conceito de matrizes

Exemplos e exerccios parafixao

OBJETIVOS:

Estudar as estruturas de dados estticas e homog


neas (vetores e matrizes), as operaes que estas
suportam e algumas apl icaes bsicas.

t agora imos i1st1:ues bsicas para ealizar seqncias lgicas de instrues


que permJtem atmg1r um resultado deSeJado. Dessa forma, trabalhamos com va
lores simples, definidos ou determinados pelo usurio durante a operao do algoritmo
e armazenados em uma. varivel de memria.
Esse armazenamento de variveis na memria tem sido, at o momento, sufi
ciente para nossas necessidades, porm existem casos em que necessitamos armazenar,
no um nico valor, mas um conjunto de valores. Suponha, por exemplo, o caso de um
treino de classificao de uma corrida de Frmula 1 , em que necessrio verificar os
tempos obtidos por todos os pilotos para. avaliar qual ser o primeiro no grid de largada.
Para fazer essa ordenao, necessrio armazenar o tempo de todos os pilotos e, depois,
realizar a ordenao desses tempos.

79

CAPTULO 6 - ESTRUTURA D E DADOS! VETORES

Com o objetivo de tratar conjuntos de dados, podem-se armazenar os valores em


disco, por meio de arquivos, como veremos no Captulo 8, ou em vmiveis de memria.
Nesse segundo caso, pode-se criar uma varivel para cada valor ou criar uma estrutura
que permita armazenar um conjunto de valores de forma que possamos acessar o valor
ou valores desejados.
6.1

E S T R U T U RAS l N D EXADAS - VETOR (ARRAY)

Nos casos em que necessrio ou conveniente representar os dados em termos


de conjuntos de valores no lugar da utilizao de variveis armazenando valores de
forma isolada, costumam-se utilizar estruturas de dados especiais denominadas estru
turas indexadas.
Nesse tipo de estrutura, diversos valores so armazenados em uma estrutura de
dados mais complexa cujos elementos individuais so identificados com o auxlio de ndi
ces. O exemplo mais simples desse tipo de estrutura definido como uma estrutura
indexada simples (unidimensional) de dados de mesmo tipo. Essa estrutura, que neces
sita apenas de um ndice para identificar um determinado elemento armazenado nela,
chamada, normalmente, de vetor.
Um vetor representado como uma linha de contineres de valores identificados
por ndices.
ndice:

I I

nome:

Assim, um vetor uma coleo de variveis de um mesmo tipo que compru1i


lham o mesmo nome e que ocupam posies consecutivas de memria. Cada varivel
da coleo denomina-se elemento e identificada por um ndice.
Para manipularmos um determinado valor (elemento) em um vetor, precisamos
fornecer o nome do vetor (identificador) e o ndice do elemento desejado. Esse ndice
determina a posio em que o elemento est inserido na estrutura. Cada posio do
vetor contm exatamente um valor que pode ser manipulado individualmente. Natural
mente, a dimenso (tamanho) e os ndices que indicam o elemento selecionado so
definidos por nmeros inteiros.
6. 1

.1

DECLARAAO D E VETOR

Um vetor declarado definindo-se seu nome, que um identificador vlido da


linguagem, seu tipo, que define o tipo individual de cada elemento do vetor, e seu tama
nho, que determina quantos valores o vetor poder armazenar. De modo geral, utilizam
se os colchetes para declarar um vetor e identificar um elemento especfico desse vetor.

'

80

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

O significado dos valores armazenados no vetor depende da aplicao em que a estrutu


ra for usada.

Representao da declarao de um vetor em pseudocdigo:


V

vetor [ O . . N] de inteiros

Essa declarao define uma varivel chamada V que pode armazenar um conjun
to de nmeros inteiros que sero identificados como v [ O J , v [ 1 J , v [ 2 J , ... , v [N] ,
isto , temos um conjunto de nmeros inteiros, cada qual em um endereo seqencial

diferente definido como o ndice do vetor. Assim, V [ O J guarda o primeiro nmero

inteiro, v [ 1 ] guarda o segundo nmero e sucessivamente at v [N] , que contm o


ltimo nmero armazenado. De forma geral, V [ i J (l-se ' V ndice i') guarda o i-simo
elemento do vetor V. Supondo que esse vetor tenha dez elementos e receba os seguintes
valores [58, 4, O, 123, 8, 5 9, 1 , 500, ...N] temos:
ndice

valor

58

123

59

500

758

102

V [ 2 ] v [3] v[4 ]

v[ 5]

v [6]

V[7]

v[ 8]

v[9]

123

59

500

758

Sendo assim,
elemento
varivel

v[ ol

v [1]

58

valor

Observe que, como o primeiro ndice do vetor O, a quantidade de elementos


guardada em um vetor dada pelo maior ndice mais 1 , isto , um vetor que varia de O a
9 tem 1 O elementos.
NOTA:

Algumas linguagens, como a Pascal, permitem determinar o primeiro


ndice do vetor, mas, em Java, o primeiro ndice sempre O!

Em Java, a declarao do vetor se d definindo-se o tipo e um identificador e


acrescentando-se colchetes.
<tipo> <identificador> [ J ;
ou
<tipo> [ J <identificador>;
Em Java, os vetores so objetos, permitindo o uso de atributos (propriedades) e a
aplicao de mtodos. Com isso, alm da declarao, necessrio criar esse objeto na
memria, determinando seu tamanho, para poder utiliz-lo. Essa criao pode ser feita
util izando-se o operador de criao new.

'

CAPITULO 6 - ESTRUTURA D E DADOS! VETORES

81

[ J <identificador> = new <tipo> [ n J ;

<tipo>
ou

<tipo> <identificador>

[ J = new <tipo> [ n ] ;

Exemplo:
int [ ) vetor - new int [n) ;

ou
int vetor [ )

new int

[n) ;

As declaraes acima so equivalentes e definem um vetor de nmeros inteiros


que pode armazenar

n.

valores inteiros. Como, em Java, todas as estruturas indexadas

tm ndice O para seu primeiro elemento, necessrio apenas indicar a quantidade de


elementos.

ACESSO E AT R I BU IAO D E VALOR E M VETORES

6. 1 . 2

Uma vez criado um vetor, a atribuio de valores processada de elemento em


elemento, alterando-se o valor do ndice do vetor.
V

vetor [ 0 . N) de inteiros
.

v [ O J <vaiorO>
V[l]

<valor!>

V[N]

<valorN>

Exemplo: Um vetor usado para guardar os nomes dos meses do ano poderia ser decla
rado:

Pseudocdigo:
Meses : vetor [ 1 . . 12] de inteiros
Meses [ 1 ] <- "janeiro"
Meses [ 2 ] <- "fevereiro"
.

Meses
Meses

[11]

[12]

"novembro"
"dezembro"

Em geral, um vetor pode ser indexado com qualquer expresso cujo valor seja
um nmero inteiro. Essa expresso pode ser uma simples constante, uma varivel ou
ento uma expresso contendo operadores aritmticos, constantes e variveis.
Java possui tratamentos diferenciados para tipos de dados primitivos e para tipos
de dados objetos. At o momento, no precisamos nos preocupar com a diferena, pois
apenas trabalhamos com tipos primitivos como

int, char etc. Ao trabalharmos com

vetores, no podemos mais ignorar o tratamento com objetos, pois o significado dos
valores armazenados nesses dois tipos diferente.

'

82

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Nas variveis declaradas como tipos primitivos, so guardados valores desses


tipos, enquanto nos objetos so guardadas referncias aos valores e no os valores pro
priamente ditos. Vetores, em Java, so objetos e, p01tanto, seus ndices representam
referncias aos objetos construdos pelo operador new e no aos valores em si. Dessa
forma, um vetor no precisa ter seu tamanho previamente definido pelo programador,
podendo ser calculado pelo programa em tempo de execuo.
int tamanho =
int

[]

11

algum clculo para tamanho

n = new int [ tamanho] ;

O valor do tamanho especificado quando o vetor criado pode ser calculado por
qualquer expresso que retorne um valor inteiro positivo. Um vetor pode ser de qualquer
tamanho finito, mas deve ser lembrado que cada elemento usar um espao de memria,
o que significa que vetores definidos com tamanho muito grande provavelmente afeta
ro a eficincia do programa. Se o vetor for grande demais para a manipulao pelo
computador, isso poder provocar uma falha de programa, dependendo do sistema utili
zado.
<tipo> [ ] <identificador>

new

<tipo> [ n ] ;

<identificador> [ O ] = <valorO>;
<identificador> [ 1 ]

<valorl>;

...

<identificador> [ n- 1 ]

CUIDADO!

<valorN>;

Como o primeiro ndice O, um vetor com tamanho N tem elementos


que variam de {01 a {N - 11. Por exemplo, um vetor com 1 O elemen
tos tem um ndice que varia de O a 9.

A leitura, ou acesso, desses valores executada da mesma forma, utilizando-se


os ndices para definir o elemento desejado.
Exemplo:
String mesAno
mesAno [ O ]
mesAno [ l ]

[)

new String [ 1 2 ) ;

- " j aneiro " ;


- "fevereiro" ;

mesAno [ l O ]

"novembr o " ;

mesAno [ 1 1 )

"dezembro" ;

String mesAniversario

mesAno [ O ] ;

Um atrativo dos vetores que sua indexao permite o acesso a qualquer ele
mento em qualquer instante e em qualquer ordem, sem que sua posio no vetor impo
nha qualquer custo extra de eficincia. Freqentemente, tm-se operaes aplicadas a

CAPTULO 6 - ESTRUTURA D E DADOS! VETORES

83

conjuntos de elementos ou mesmo a todos os elementos de um vetor. Nesses casos,


comum utilizar uma estrutura de repetio para varrer os ndices desejados. Por exem
plo, a estrutura a seguir soma todos os nmeros entre os ndices 1 e 6 do vetor

num

dado.

Pseudocdigo:
Algoritmo exemplo_vetor
var
num : vetor [ 1

6]

de inteiros

soma : inteiro
i : inteiro
.

'

l.nl.Cl.O
soma O
Para i 1 at 6 Faa
soma soma + num [ i ]
Fim-Para

Deve-se ter uma ateno especial com os limites de um vetor. O contador, na


estrutura de repetio, deve estar limitado quantidade de elementos do vetor. No caso
acima, para que no haja erros, o tamanho mximo permitido para vetor 6 (ndices que
variam de 1 a 6).

Java:
Integer num [ ] - new Integer [ 6 ] ;
int soma - O ;
for (int i = O ; i < 6 ; i++ ) {
soma - soma + num [ i ] ;

Nesse caso, como estamos trabalhando com a linguagem Java, os valores consi
derados para num variam de O a 6, uma vez que, conforme foi dito anteriormente, os
vetores sempre se iniciam a partir de O.

CUIDADO!

...._
_

Uma tentativa de acessar um elemento fora dos limites do vetor resul


tar em erro de execuo. Em }ava, esse erro ser assinalado com a
mensagem: ArrayindexOutOfBoundsException.

Para as operaes que envolvem todos os elementos do vetor, em Java, podem-se


reduzir as chances de erro fazendo uso do fato de o vetor ser u m objeto. Como u m vetor
sempre conhece seu prprio tamanho, pode-se fazer uso da propriedade length, defi
nida pela linguagem para qualquer vetor e que retoma a quantidade de elementos arma-

'

84

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

zenados no vetor. Dessa forma, a estrutura de repetio acima pode ser reescrita como
segue:

int soma - O;
for ( int i - O ; i < num . length; i++) {
soma - soma + num [ i ) ;
)

Nessa estrutura, a repetio ser realizada desde o primeiro at o ltimo termo

(num. length) do vetor num. Essa soluo , sem dvida, mais adequada para a solu
o de problemas que envolvam o vetor como u m todo. Suponha que, no futuro, o vetor

num mude de tamanho: essa segunda expresso continuaria vlida, enquanto a primeira
teria de ser localizada e alterada e o cdigo teria de ser recompilado.

ExEMPLO 6. 1 :

O programa a seguir faz a leitura de dez valores em um vetor e apresenta o


valor da mdia aritmtica desses valores.

Pseudocdigo:
1.
2.

3.
4.
5.
6.

7.

8.
9.
10.
11.

12.
13.

14.

Algoritmo Exemplo6 . 1
Var
Valores : vetor [ 1 . . 1 0 ) de reais
Soma, Media : real
i : inteiro
Incio
Soma (- O
Para i (- 1 at 10 Faa
Ler (Valores [ i ) )
Soma Soma + Valores [ i J
Fim-Para
Media Soma/lO
Mostrar ( "O valor da mdia : " , Media)
Fim.

'

85

CAPITULO 6 - ESTRUTURA D E DADOS: VETORES

Fluxograma:

("

Inicio

'
/

Soma t- O

i <-

1 , 1 O, 1

...
,

Media tSoma/10

...
,

"O valor
da mdia : ",
Media

,1'
,

Fim

'\

/)

Valores ( i )

Soma t- Soma
+ Valores ( i ]

Java:
1.

2.

import java. io. * ;


class ExVetor {

3.

public static void main (String args [ ] ) {

4.

BufferedReader entrada ;

5.

entrada = new BufferedReader (new InputStreamReader


( System. in) ) ;
try {

6.
8.

float soma = O ;
float [ ] vetor = new float [ 1 0 ] ;

9.

for (int i = O ,

7.

<

vetor . length; i++) (

10.

System . o u t . println ( "Qual o valor? " ) ;

11.

vetor [ i ] = Float. parseFloat ( entrada . readLine ( ) ) ;

12.

soma = soma + vetor [ i ) ;

13.

}
float media = soma I vetor . length;
System .out .println ( "A mdia =
+
} catch (Exception e) (

14.

"

15.
16.

System.out. println ( "Ocorreu

17.

leitura ! " ) ;
18.

19.

2o .

um

media) ;
erro durante a

'

86

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

6. 1 . 3

O P E RAOES

Os vetores permitem a manipulao dos elementos alocados em suas posies


de forma independente, como vimos anteriormente. Assim, possvel reaJjzar opera
es com seus elementos, como o clculo da mdia apresentado no Exemplo 6. 1 .
Vale lembrar que a incluso de um elemento em uma determinada posio de um
vetor implica a substituio do valor anteriormente existente, de forma que a incluso e
substituio de valores consistem em uma nica operao.

A exibio dos elementos pode ser necessria aps a execuo de uma determi
nada operao que envolva a alterao dos valores desses elementos, de modo que o
usurio pode verificar a ocorrncia do efeito desejado:
Para i f- 1 at 6 Faa
Mostrar (Valores [ i ) )
Fim-Para
EXEMPLO

6.2:

O objetivo deste exemplo desenvolver um algoritmo que efetue a leitura

de dez elementos inteiros de um vetor Testel. Vamos construir um vetor


Teste2 do mesmo tipo, observando a seguinte regra de formao: se o
valor do ndice for par, o valor do elemento dever ser multiplicado por 5;
se for mpar, dever ser somado com 5. Ao final, mostrar o contedo dos
dois vetores.

Pseudocdigo:
1.
2.
3.

4.
5.
6.
7.

8.
9.
10.
11.
12.
13 .
14.
15.
16.
17 .
18.
19.

Algori trno Exernplo6 . 2


Var
Teste1, Teste2
vetor [ 1 . . 10) de inteiros
i : inteiro
Inicio
Para i <- 1 at 10 Faa
Ler (Teste1 [ i ) )
Fim-Para
Para i <- 1 at 10 Faa
0 ) Ento
Se ( i mod 2
Teste2 [ i ) Teste1 [ i ) * 5
Seno
Teste2 [ i ) <- Teste1 [ i ) + 5
Fim-se
Fim-Para
Para i <- 1 at 10 Faa
Mostrar (Teste1 [ i ) , Teste2 [ i ) )
Fim-Para
Fim.
=

Nesse exemplo utilizado o operador mod, que retoma o resto da diviso de um


nmero por outro. Esse recurso foi utilizado para o teste que verifica se o ndice do vetor

87

'

CAPITULO 6 - ESTRUTURA D E DADOS: VETORES

par ou mpar. Ou seja, ao fazer a diviso de um nmero por 2, se o resto da operao


resulta em zero, o nmero par. Na expresso Se i mod 2

O Ento realizada

essa verificao. Assim, identifica-se o tipo do ndice (par ou mpar) e, dependendo do


resultado, executa-se a operao solicitada, atribuindo-se o resultado ao respectivo ele
mento do Vetor2.

Fluxograma:

(
....
,

Incio

i 1 . 10, 1

Teste1 [ i 1

i 1 . 10, 1

i <- 1 , 10, 1
i mod 2 = O

.v.

Teste2[ i 1
Teste1 [ i 1 * 5

. F.
Teste1 [ i 1,
Teste2[ i 1

Teste2[ i ]
Teste1 [ i ) + 5

Java:
1.

import java. i o . * ;

2.
3.

class Exemplo62 {

4.
5.

public static void maln ( String args

6.

int testel [ ]

new int [ 10 ] ;

7.

int teste2

new int [ 10 ] ;

8.

BufferedReader entrada;

[]

[]) {

Fim

88
9.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

entrada - new BufferedReader (new InputStreamReader


(System. in) ) ;

10.

try {
for (int i = O ; i < 1 0 ; i++) {
System . out . println ( "Qual o nmero ? " ) ;
teste1 [ i )
Integer.parsein t { entrada. readLine ( ) ) ;

11.

12.
13 .
14 .

15.

16.

for { int i = o ; i < 1 o ; i+ + ) {

17 .

if

18.

19.
20.

(i % 2

0)
teste2 [ i ) - teste 1 [ i l * 5 ;

else

teste2 [ i ]

teste 1 [ i ) + 5 ;

21.

22.

System .out .println ( ) ;

23.

System.out.println{ "Resul tado : " ) ;

24.

for { int i = O ; i < 1 0 ; i++) {


System . o u t . print ( " teste1 [ " + i + " ] = " + teste 1 [ i ] +

25.

"\t " ) ;
26.

27 .

System.out. println ( " teste2 [ " + i + " ]

"

tes te2 [ i J ) ;

28.

catch (Exception e )

29.

System .out.print1n ( "Ocorreu

um

erro durante a leitura ! " ) ;

30.
31.

32.

ExEMPLO 6.3:

Desenvolver um algoritmo que efetue a leitura de cinco elementos para um


vetor A. No tina!, apresentar a sorna de todos os elementos que sejam m
pares.

Pseudocdigo:
1.

Algoritmo Exemplo6 . 3

2.
3.
4.

Var

5.

Incio

Soma, i : inteiro
A : vetor [ 1 . . 5 ) de inteiros

6.

Soma O

7.

Para i 1 at 5 Faa

8.

Ler (A [ i ] }

11.

Fim-Para
Para i 1 at 5 Faa
Se {A[ i J mod 2 ) <> O Ento

12 .

Soma Soma + A [ i ]

9.

10.

13.

Fim-Se

14.

Fim-Para

15.

Mostrar ( "A soma e : "

16.

'

Fim.

Soma)

89

'

CAPITULO 6 - ESTRUTURA D E DADOS: VETORES

Fluxograma:
Incio

Soma <- O

i 1 ' 5, 1

"A soma : ",


Soma

i 1' 5, 1

Fim

A[ i 1

.v.

<>

Soma
Soma + A[ i 1

.F.

Java:
1.

import java. i o . * ;

2.

3.

class Exemplo63 (

4.
5.

public static void ma1n (String args [ ] ) {

6.

final int tamanho = 5 ;

7.

int vetor [ ] = nev1 int [t amanho] ;

8.

BufferedReader entrada ;

9.
10.

entrada = new BufferedReader(new InputStreamReader


( System. in) ) ;
try {
for ( int i = O ; i < tamanho; i++)

11.

12 .

System . out . println ( "Qual o numero?" ) ;

13.

vetor [ i ] = Integer .parsein t ( entrada. readLine ( ) ) ;

14.

15.
16.

int soma = O ;
for (int i = O ; i < tamanho; i ++ ) {
i f (vetor [ i ) % 2

17.

! = 0)

soma = soma + vetor [ i ] ;

18.
19.

20.

System .out.println ( ) ;

21.

System . o u t . println ( " Soma - " + soma) ;

22.

catch (Exception e )

90
23.

System .out.println( "Ocorreu

24.

um

erro durante a leitura ! " ) ;

25.
26.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Na linha 6 foi declarada uma varivel, tamanho, caracterizada como final

int. Essa declarao determina que esse elemento do tipo inteiro e no se altera ao
longo do programa, isto , ele uma constante.
Quando temos um valor que ser utilizado vrias vezes, mais conveniente de
clarar esse valor como constante, de forma que alteraes sobre esse valor s necessi
tem ser feitas em um nico ponto do programa. Como exerccio, experimente realizar
essa modificao no programa Exemplo62.
Freqentemente, os vetores so utilizados para operao com dados agregados
ou que representam um conjunto de elementos que tm uma relao entre si. Muitas
aplicaes poderiam empreg-los. Uma delas poderia ser o tratamento de dados estats
ticos.
Supondo que se queira guardar as informaes referentes s mdias dirias das
temperaturas verificadas no decorrer de uma semana e executar algumas operaes sim
ples, como calcular a temperatura mdia da semana, classificar essas mdias em ordem
crescente ou exibir a menor e a maior delas, poderia ser utilizada uma estrutura do tipo
vetor, conforme exemplo a seguir.
ExEMPLo 6.4:

Este exemplo calcula a mdia das temperaturas verificadas durante a se


mana a partir das mdias dirias j obtidas.

Pseudocdigo:
1.

Algoritmo Exemplo6 . 4

2.

Var

3.

Temp : vetor [ 1 . . 7 ] de rea1s

4.

Soma, Media : real

5.

i : inteiro

6.

Incio

7.

Temp [ l ] 1 9 . 0

8.

Temp [ 2 ] 2 3 . 0

9.

Temp [ 3 ] 2 1 . o

10.

Temp [ 4 ] 2 5 . 0

11.

Temp [ 5 ] 2 2 . 0

12 .

Temp [ 6 ] 2 0 . 0

13.

Temp [ 7 ] 2 4 . 0

14.

Soma o

15.

Para i 1 at 7 Faa

16.

Soma Soma

17 .

Temp [ i ]

Fim

18.

Media Soma I 7

19.

Mostrar ( "Mdia da semana : " , Media)

20.

Fim.

'

91

CAPITULO 6 - ESTRUTURA D E DADOS: VETORES

Fluxograma:

Incio

Temp[1] t-- 19.0


Temp[2) t-- 23.0
Temp [3] t-- 21.0
Tem 4 t-- 25.0

p(

Temp[S) t-- 22.0


Temp[6) t-- 20.0
Temp[7) t-- 24.0

Soma t-- O

"Mdia
da semana: ",
Media

Media t--

i t--- 1 , 7, 1

Soma/7

Soma t-- Soma


+ Temp( i ]

Java:
1.
2.
3.

4.
5.
6.

7.

8.
9.
10.
11.
12.
13.
14.

class Exemplo64 {
public static void main ( String args

[]) {

final int diasSemana = 7 ;


float temperatura [ ) = new float [diasSernana) ;
temperatura [ 0 ) - 1 9 . 0f ;
temperatura [ 1 ) - 2 3 . 0 f ;
temperatura [ 2 ) - 2 1 . 0f ;
temperatura [ 3 ] - 2 5 . 0f ;
temperatura [4) - 2 2 . 0 f ;
temperatura [ 5 ) - 2 0 . 0f ;
temperatura [ 6 )
2 4 . 0f ;
float soma = O f , media;
for (int i = O ; i < diasSemana; i++ ) {

15.

soma = soma + temperatura [ i ] ;

16.

17.
18.
19.

media = soma/diasSemana ;

System .out. print1n ( ) ;


System .out. println( "Mdia da Semana

" + media ) ;

Fim

92
20.
21.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

EXEMPLo

6.5:

Este exemplo eferua a ordenao elos elementos considerados no exemplo


anterior, exibindo o maior e o menor deles.

Pseudocdigo:
1.

Algoritmo Exemplo6 . 5

2.

Var

3.

Temp : vetor [ 1 . . 7 ] de reais

4.

5.

i,

6.

Incio

real
j , min : inteiro

7.

Temp [ 1 ]

f-

19.0

8.

Temp [ 2 ]

f-

23.0

9.

Temp [ 3 ]

f-

21. o

10.

Temp [ 4 ]

f-

25.0

11.

Temp [ S ]

f-

22.0

12 .

Temp [ 6 ]

f-

20.0

13.

Temp [ 7 ]

f-

24.0

14.

Para i

f-

1 at 6 Faa

15.

min f- i

16.

Para j

f-

1 at 7 Faa

Se Temp [ j ] < Temp [min] Ento

17 .
18.

min

19.

x f- Temp [min]

20.

Temp (min]

21.

Temp [ i ]

f-

j
f-

f-

Temp [ i ]

Fim-Se

22.
23.

Fim-Para

24.

Fim-para

25.

Mostrar ( "Mnimo:

"

Temp [ 1 ] )

26.

Mostrar ( "Mximo :

"

Temp [ 7 ] )

27 .

Fim.

Nesse exemplo, utilizou-se um algoritmo de ordenao para obter os resultados


desejados. Mtodos de ordenao so importantes em grande parte da computao, por
isso veremos os priJ1cpios desses algoritmos mais adiante, no Captulo 9.

A estratgia desse algoritmo percorrer o vetor do pri meiro ao penltimo ele


mento. Isso feito por meio da instruo para da linha 14. Nesse percurso, feita a
comparao entre a posio corrente e os elementos das posies subseqentes, por
meio da instruo da linha 16. A comparao efetivamente ocorre na linha 1 7 , por meio
do comando se. Dependendo
do resultado dessa comparao, so executados os co.

mandos que fazem a troca de posio dos elementos (linhas 1 9 a 2 1 ) . Esse processo se
repete at que a penltima posio seja comparada com a ltima, no havendo, portan
to, necessidade de continuidade do processo.

'

93

CAPITULO 6 - ESTRUTURA D E DADOS! VETORES

A tabela a seguir apresenta o teste de mesa para demonstrar, em cada momento


da execuo, os valores que cada uma das variveis envolvidas est assumindo. E poss'

vel, tambm, observar-se o resultado final.


Note que

i varia de 1 at 6, enquanto j varia de i + 1 at 7. Ou seja, quando

i tem valor 2 , j varia de 3 at 7. Quando o resultado da comparao Se Temp [ j ] <


Temp [min] Ento (linha 17) falso, as variveis min e x mantm seus valores
anteriores, uma vez que no ocorre a execuo do cdigo das linhas 1 8 a 2 1 .

I.

1
1

5
6

Temp[1]

Temp[2]

Temp[3]

Temp[4]

Temp[5]

Temp[6]

Temp[7]

19.0
19.0

23.0
23.0

21.0
21.0

25.0
25.0

22.0
22.0

20.0
20.0

24.0
24.0

19.0

23.0

21.0

25.0

22.0

20.0

24.0

19.0

23.0
23.0
23.0

21.0
21.0
21.0

25.0
25.0
25.0

22.0
22.0
22.0

20.0
20.0
20.0

24.0
24.0
24.0

21.0
21.0

23.0

25.0

22.0

20.0

24.0

23.0

25.0

22.0

20.0

24.0

1
1
2
2

21.0

23.0
23.0

25.0
25.0

22.0
22.0

20.0
21.0

24.0
24.0

2
2

5
6

25.0

22.0

21.0

24.0

25.0

22.0

21.0

24.0

7
4

19.0
19.0
19.0
19.0
19.0
19.0

20.0

19.0
19.0

20.0
20.0

23.0
23.0

19.0
19.0
19.0

20.0
20.0
20.0

22.0
21.0
21.0

25.0
25.0
25.0

23.0
23.0
23.0

21.0
22.0
22.0

24.0
24.0
24.0

3
3
3
3

19.0
19.0
19.0

20.0
20.0
20.0

21.0

25.0
25.0
25.0

22.0

24.0

21.0
21.0

23.0
22.0
22.0

23.0
23.0

24.0

24.0

19.0
19.0

20.0
20.0

21.0
21.0

22.0
22.0

23.0
23.0

25.0
25.0

24.0
24.0

5
5

19.0

20.0

21.0

22.0

23.0

24.0

25.0

.
mm

7
3
4

5
6
7
5
6
7
6
7
7

3
3
3
6

21.0
21.0
21.0
20.0

20.0

6
5
6
6

20.0

5
6
6

23.0
22.0
22.0

6
6
7

23.0
23.0

22.0
21.0
21.0

24.0

'

94

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Fluxograma:
Incio

emp[5] LLoVJ
emp[6] ('-- LV.Vj
mp[7] L...VI

"Mnimo: ",
Temp[l]

i 1 ' 6, 1

"Mximo:",
Temp[7]

mm <-

i <'- 1 ' 6, 1

mp[ j 1 <
Temp[mi

mm J
x Temp[min]

Temp[min]
Temp[ i ]
Temp[ i 1 x

.F.

Java:
1.

class Exemplo65 {

2.
3.

public static void main (String args

[] ) {

6.

final int diasSemana = 7 ;


float temperatura [ 1 - new float [diasSemana) ;
temperatura [ o l - 1 9 . 0 f i

7.

temperatura [ 1 )

2 3 . 0fi

8.

temperatura [ 2 )

2 1 . 0fi

9.

temperatura [ 3 )

2 5 . Ofi

10.

temperatura [ 4 )

2 2 . Ofi

11.

temperatura [ 5 ]

20. Of;

4.
5.

Fim

'

CAPITULO 6 - ESTRUTURA D E DADOS! VETORES

12 .
13 .

temperatura [ 6 ] - 2 4 . 0 f ;
f1oat aux;

14.

int min;

15.

for (int i = O ;

95

i < diasSemana - 1 ; i++ ) {

min = i ;
for (int j = i + 1 ; i < diassemana ; i++ ) {
if ( temperatura [ j ] < temperatura [min] ) {

16.
17.

18.
19.

.
ml.n

20.

aux = temperatura [min] ;

21.

temperatura [min] = temperatura [ i ] ;

22.

temperatura [ i ] = aux;

23.

24.

25.

26.

System. out . println ( ) ;

27.

System. out .print1n( "Mnima da semana - " + temperatura [ O ] ) ;


System. out .print1n( "Mnima da semana - " + temperatura [ 6 ] ) ;

28.
29.
30.
31.

6.2

}
}

CONCEITO D E M AT R I Z E S
Estruturas indexadas que necessitam de mais que u m ndice para identificar um

de seus elementos so chamadas de matrizes de dimenso n, onde

representa o n

mero de ndices requeridos. Uma matriz de dimenso 2, portanto, uma matriz que
exige dois ndices para identificar um elemento na sua estrutura. A maioria das lingua
gens no impe limite sobre a dimenso de uma estrutura indexada, ficando a cargo do
programador utilizar tantos ndices quantos achar convenientes.
Supondo que se necessite desenhar u m grfico de uma curva no plano e que,
portanto, seja necessrio guardar as posies dos pontos dessa curva em coordenadas x
e y, uma maneira possvel de armazenar em memria o total dos pontos dessa curva
seria na forma de uma matriz de dimenso 2. Nela, um dado elemento conteria o valor
correspondente ao ponto identificado pelo ndice de x para a abscissa e y para a ordena
da desse elemento.
Por exemplo, se a curva representasse as vendas de u m determinado produto
numa regio, o elemento da linha 4 e coluna 5 conteria a regio para as vendas de 5
unidades e para o valor de $ 4 no perodo em questo. Essa situao pode ser ilustrada
conforme a figura a seguir:

'

96

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Valor ($)
n

...
5
Regio

4
3
2
1
1

6.2. 1

5
Quantidade

"

DECL ARAAO

A declarao de uma matriz poderia ser feita da seguinte forma:


Var
Vendas : vetor [ l . . n , l . . n] de inteiros

Essa declarao muito semelhante declarao de vetor porque o vetor uma


matriz de dimenso 1 . Delimitadas entre os colchetes, temos duas declaraes de tipo
associadas aos ndices, separadas por uma vrgula. A conveno mais comum dizermos
que o primeiro ndice identifica uma linha de uma matriz bidimensional e o segundo, uma
coluna. No exemplo anterior, o elemento marcado na matriz seria: Vendas [ 4 ,

5] .

Se a dimenso n da matriz fosse maior do que dois, ento teramos n declaraes

de tipos de ndices entre os colchetes, separados por vrgulas. A primeira declarao


corresponde ao tipo do primeiro ndice, a segunda declarao, ao tipo do segundo ndice
e assim por diante. Uma outra maneira de representar dados agregados pode ser uma
estrutura de registro. O registro permite a composio de estruturas do tipo vetor, matriz
e dados primitivos, permitindo maior flexibilidade para o programador e um cdigo de
leitura mais fcil. As estruturas de registro so apresentadas no Captulo 7.
A linguagem Java no oferece suporte a arrays (vetores) multidimensionais, a
exemplo do que ocorre com outras linguagens de programao. Porm, a mesma fun
cionalidade pode ser obtida com a declarao de um array de arrays, por exemplo: int

[ J [ J . Isso ser mais detalhado nos exemplos.


6.2.2

"

O P E RAOES

Da mesma forma que se podem fazer operaes com os elementos de um vetor,

possvel faz-las com os elementos de uma matriz. possvel acessar individualmente

os elementos e, por conseguinte, os valores de cada uma das posies e realizar clculos
matemticos e comparativos, o que d uma grande margem de possve is aplicaes
computacionais e prticas. As matrizes tm especial aplicao na estatstica, pois sua
estrutura permite o armazenamento de medies que precisem ser referenciadas a ou
tros valores em duas ou mais dimenses.

'

CAPITULO

ESTRUTURA D E DADOS: VETORES

97

Para demonstrar a realizao de operaes simples em matrizes, ser considera


do u m e xemplo genrico. Aplicaes especficas sero mostradas em seguida.
EXEMPLO

6.6:

D ada uma matriz de 6 linhas e 2 colunas de inteiros, calcular e exibir a

mdia geomtrica dos valores de cada uma das linhas. A mdia geomtrica
calculada pela seguinte expresso: SQRT ( Xl * X2 } , que representa a
raiz quadrada do resultado da multiplicao dos elementos da coluna
(Xl) pelos elementos da coluna 2 (X2).

1
2
3
4
5
6

Pseudocdigo:
1.
2.
3.
4.
5.
6.
7.

Algoritmo Exemplo6 . 6

Var
G : vetor [1 . . 6 , 1 . . 2 ] de inteiros
i , j : inteiro
prod : real
Incio
Para i r 1 at 6 Faa

8.

prod

Para j r 1 at 2 Faa
Ler (G [ i , j ] )
prod f- prod * G [ i , j ]
Fim-Para
Mostrar ( "Linha " i ,
- " , SQRT (prod) )
Fim-Para

9.

10.
11.
12.
13.
14.
15.

Fim.

"

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

98

Fluxograma:

\
-

Incio

i 1 ' 6, 1

"

Fim

I
mn i

"Mnimo:",
Temp[11

i 1 ' 6, 1

G [ i, j 1

prod
Tprod G[ i,j 1

Java:
1.

import java . io . * ;

2.

class Exemplo 6 6 {

3.

public static void main

4.

int G ( ] [ ] = new int

5.

6.

double prod;
BufferedReader entrada;

7.

entrada = new BufferedReader (ne1o1 InputStreamReader

( String args [ ] ) {
(6] [2];

(System. in) ) ;

8.

try{
for (int i = O ; i < 6 ; i++ ) {

9.

prod = 1;

10.
11.
12.

for ( int j = O ; j < 2 ; j++ ) (


System . out.println ( "Entre com valores de G-" + i +
'' ,

n + j) ;

13.

G [ i ] [ j ] = Integer .parseint (entrada. readLine ( ) ) ;

14.
15.
16.

prod = prod * G [ i ] ( j ] ;
}

System. out .println

(prod) ) ;

( "Linha-" + i + " : " + Math . sqrt

CAPTULO

6 - ESTRUTURA D E DADOS! VETORES

17.
18.
19 .

99

} catch (Exception e ) {
System .out. println ( Ocorreu
"

um

erro durante a

leitura ! " ) ;
2o .

21.

22.

}
}

Na programao desse exemplo, foi utilizado o pacote

j ava . lang . Math, que

possui mtodos que realizam operaes matemticas mais complexas, como o caso da
raiz quadrada extrada da varivel prod, utilizando-se a chamada: Math . sqrt (linha

1 6). No h necessidade de u m import do pacote, como feito para o caso do j ava . i o,


pois ele est automaticamente disponvel para a linguagem. Caso isso seja feito, no
provocar erro.
ExEMPLo

Mdia dos alunos de uma disciplina. Considere uma matriz de 30 linhas e

6.7:

3 colunas. Cada linha est associada a um aluno de uma dete1minada disci


plina, e as colunas esto associadas s notas das trs provas referentes quele
estudante. O procedimento abaixo escreve a mdia de cada estudante e a
mdia da turma em cada prova.

Pseudocdigo:
1.

Algoritmo Exemplo6 . 7

2.
3.

Constante
nProvas - 3

nAlunos - 30

4.

5.
6.

//nmero de Provas - colunas


/ /nmero de Alunos - linhas

Var
NotaProva

vetor [ 1 . . nAlunos, 1 . . nProvas] de reais

//nota de

cada prova

7.
8.
9.
10.
11.

12 .

11edAlunos

vetor [ 1 . . nAlunos] de reais

//mdia dos alunos

11edProvas

vetor [ 1 . . nProvas] de reais

//mdia das provas

i,

inteiro

Soma : real
Incio
Para i 1 at nAlunos Faa

13 .

Soma O

14.

Para j 1 at nProvas Faa

15.

Soma Soma + NotaProva [ i

16.

MedAlunos [ i J Soma I nProvas

17.
18.

19.
20.
21.
22.
23.
24.

j ]

Fim-Para
Fim-Para
Para j 1 at nProvas Faa
Soma O
Para i 1 at nAlunos Faa
Soma Soma + NotaProva [ i

j ]

MedProvas [ j J Soma I nAlunos

Fim-Para

1 00
25.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

26.

Fim-para
.
Para f- o at nAlunos Faa

27.

Mostrar (MedAlunos [ i 1

28.

Fim-Para

29.

Para f- o at nProvas Faa


Mostrar (MedProvas [ 1 1 )

30.
31.
32 .

Fim-Para
Fim.

Nos exemplos dados, sabemos quais so as dimenses da matriz e utilizamos


todos os elementos da estrutura. Nem sempre, contudo, possvel determinar o tama
nho de uma estrutura indexada quando construmos o programa. Em muitos casos, o
nmero exato de elementos necessrios s se torna conhecido em tempo de execuo.
Nesses casos, definimos estruturas que possam acomodar os 'piores casos' e utilizamos,
em tempo de execuo, apenas parte dessas estruturas.
No exemplo das mdias de provas e de alunos, poderamos declarar a matriz com
mais colunas para o caso de provas de recuperao ou uma matriz com mais linhas para
o caso de novos alunos.

1 o1

'

CAPITULO 6 - ESTRUTURA D E DADOS: VETORES

Fluxograma:

\
A

Incio

i f- 1 '
nAiunos,

...
,

j f- 1 ,
nProvas, 1
'

Soma +--- O
,

j f- 1 '
nProvas, 1

i f- 1'
nAiunos, 1

Soma +--- O
A

'

...
,

Soma fSoma +
NotaProva [ i, j 1

i <- 1 ,
nAiunos, 1

MedAiunos
[i1
....
,

Soma +--Soma +
Nota Prova[ i, j 1

MedAiunos[ i 1
+--- Soma/
nProvas

i f- 1'
nProvas, 1

I
MedProvas[ j 1
f- Soma/
nAiunos

MedProvas
[i1

I
Fim

Java:
1.

import java . i o . * ;

2.
3.

class Exemplo67 {

4.

public static void main (String args [ ] ) {


final int nProvas = 3 ;

5.

final int nAlunos

6.

float NotaProva [ ) [ )

7.
8.
9.

float MedAlunos [ ) - nevJ float [nAlunos ) ;

10.

float MedProvas

[)

30;

new float [nAlunos) [nProvas ) ;

new float [nProvas ) ;

float Soma ;

BufferedReader entrada;

"

'

1 02

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

11.

entrada = new BufferedReade r ( new


InputStreamReader (System. in) ) ;

12 .

try{

13 .

for (int i = O ; i < nA1unos; i++ ) {

14.

Soma = O ;

15.

for (int j = O ; j < nProvas; j ++ ) {


System . ou t . println ( "Entre com a nota Aluno-" + i +

16.

" Nota-" + j ) ;
NotaProva [ i] [ j ] = Float. parseFloat

17 .

(entrada. readLine ( ) ) ;
18.

Soma = Soma + NotaProva [ i ] [ j ] ;

19.

MedAlunos [ i ] = Soma I nProvas;

20.
21.

22.

for (int j = O ; j < nProvas; j++) {

23.

Soma = O ;

24.

for (int i = O ; i < nAlunos; i+ + ) {

25.

Soma = Soma + NotaProva [ i ] [ j ] ;

26.

MedProvas [ j ] = Soma I nAlunos ;

27 .
28.

29.

for (int i = O ; i < nAlunos; i++) {

30.

System . o u t . println ( "Media do Aluno-" + i + " :


[i l ) ;

MedAlunos
31.
32.
33.

for (int i = O ; i < nProvas; i++ ) {


System.out. println ( "Media da Prova-" + i + " : " +
MedProvas [ i l ) ;

34.

35.

} catch (Exception e ) {

36.
37.

System . o u t . println ( "Ocorreu

6.3

um

erro durante a leitura ! " ) ;

38.
39.

" +

EXERCICIOS PARA FIXAAO

1 . Dadas as temperaturas que foram registradas diariamente durante uma sema


na, deseja-se determinar em quantos dias dessa semana a temperatura esteve
acima da mdia. A soluo para esse problema envolve os seguintes passos:
a) obter os valores das temperaturas;
b) calcular a mdia desses valores;
c) verificar quantos deles so maiores que a mdia.

'

1 03

CAPITULO 6 - ESTRUTURA D E DADOS! VETORES

2. Crie vetores para armazenar:


a) as letras vogais do alfabeto;
b) as alturas de um grupo de dez pessoas;
c) os nomes dos meses do ano.

3. Considere um vetor w cujos nove elementos so do tipo inteiro:


1

w:

Supondo que i seja uma varivel do tipo inteiro e seu valor seja 5, que valo
res estaro armazenados em w aps a execuo das atribuies a seguir?
a) w [ 1 ]

17

f-

b) w [ i di v 2 ]
c) w [ 2
d) w

[ i- 1 ]

e) w [ i ]

f-

95

w [ 9 ] di v 2

. - w[ i ] + w[i-1]
.

(w [ 2 ] -2]

h) w [w [

1]

w[2]

: =

f) w [ i+1]
g) w

f-

.
.

78

- 1]

f-

w [1]

w [

4. Codifique um algoritmo Histograma que exiba um histograma da varia


o da temperatura durante a semana. Por exemplo, se as temperaturas fo
rem: 19, 2 1 , 25, 22, 20, 1 7 e l 5C, de domingo a sbado, respectivamente, o
algoritmo dever exibir:
D:
S:

DDDDODDDDOODDDDODDO

DODDODDDDOODDDDODDOOD

T : D O D D O DD D D O O D D D D O D D O O D D D O O
Q : D O D D O DD D D O O D D D D O D D O O D D
Q:

DODDODDDDOODDDDODDOO

S:

DODDODDDDOODDDD

S : DODDOODDDOODDDDOD

Suponha ainda que as temperaturas sejam todas positivas e nenhuma seja


maior que 80C. (Dica: crie uma rotina que exiba uma l.inha com uma quan
tidade de caracteres de tamanho proporcional temperatura.)
5.

Elabore um algoritmo que, considerando um conjunto de acertos obtidos por


u m grupo de atiradores em u m estande, obtenha as discrepncias e a varincia
da amostra. Utilize a tabela abaixo como referncia. Como exerccio, agrupe
os

valores em uma matriz.

'

1 04

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Atirador

Acertos (X;)

1
2

8
4

10

9
7

6
7

(x;)l

X'

8
Soma

12

As discrepncias so calculadas por x;

X;

M, onde X; a quantidade de

acertos de cada atirador e M a mdia aritmtica dos acertos. A varincia S


dada pelo somatrio de X; elevado ao quadrado.

6.4

EXERCICJOS CO M P L E M E NTARE S
54] e B

[ 15 , 44

35 ,
2 3 , 1 , O , 18 , 17 , 3 7
[ 3 2 , 1 1 5 , 4 8 , 5 5 , 5 1 , O , - 4 8 1 8 5 , 1 5 , 9 9 ] , crie

1 . Dados os vetores A

algoritmos e programa para gerar uma matriz C a partir da:


a) multiplicao dos elementos de A por B;
b) adio dos elementos de A e B;
c) subtrao dos elementos de A de B;
d) A U B.
2. Construa uma matriz X [ 1 O , 3 ] cujos valores devero ser fornecidos
randomicamente e exiba os elementos na ordem inversa da entrada.

3. Uma empresa deseja saber a mdia de idade dos freqentadores de sua praa
de alimentao. Para isso, voc deve construir uma matriz que seja capaz de
armazenar a idade de cem pessoas.
a) Seria possvel armazenar tambm os nomes dos participantes da pesquisa? Como resolver esse problema?
b) Identifique a maior idade da matriz.
c) Calcule a mdia das idades da matriz.
d) Identifique a menor idade da matriz.

PIT

UL

PROCEDIMENTOS
-

E FUNOES

Procedim.entos
Funes
Escopo de variveis
Parmetros
Passagem de parmetros

OBJETIVOS:

Abordar os tpicos: procedimentos, funes e par


metros. Esses so alguns recursos utilizados para tor
nar os algoritmos mais eficientes e possibilitar a reu
tilizao de cdigos, isto , o uso de algumas rotinas
em vrios programas, inclusive com objetivos dife
rentes.

onforme estudado no Captulo 4, a programao estruturada consiste na diviso


de um problema em partes, tornando a tarefa mais fcil de ser resolvida, din

nu.indo assim a extenso dos programas de forma que, se alguma alterao ou acerto
forem necessrios, isso poder ser feito mais rapidamente. A cada uma dessas partes
dado o nome de mdulo. A modularizao uma tcnica utilizada para desenvolver
algoritmos, denominados mdulos, por meio de refinamentos sucessivos.
O refinamento sucessivo nada mais do que a reduo de um problema a um
conjunto de tarefas destinadas a solucion-lo de maneira eficiente. Para cada tarefa,
desenvolve-se um algoritmo/programa (mdulo) que poder ser utilizado na soluo de
outros problemas, pois cada mdulo independente. O gerenciamento das tarefas
feito pelo algoritmo principal ou mdulo principal. Esse mdulo 'chama' ou aciona os
outros mdulos, que devero ser escritos por meio de funes ou procedimentos.

'

1 06

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

A uma das tcnicas de refinamentos sucessivos d-se o nome de top

NOTA:

down (de cima para baixo), ou seja, parte-se do problema como um


todo, de forma abrangente, e vai se detalhando-o at atingir-se o nvel
desejado. Outra tcnica, no muito utilizada mas que tem a mesma
fun,'io, a bottom-up (de baixo para cima), isto , parte-se dos concei
tos mais detalhados at se chegar ao objeto desejado, isto , soluo
do problema.

7. 1

PROC E D I M E NTOS
Um procedimento (procedure), tambm conhecido como sub-rotina, um con

junto de instrues que realiza determinada tarefa. Um algoritmo de procedimento


criado da mesma maneira que outro algoritmo qualquer: deve ser identificado, possui
variveis, operaes e at funes.

Pseudocdigo:
Procedimento nome_do_procedimento

(lista de parmetros)

var
Declarao dos objetos pe11encentes a este procedimento (objetos locais)
inicio
Instrues do procedimento
Fim Procedimento

Nem sempre existe a necessidade do uso de parmetros. Esse assunto ser abor
dado mais adiante.

Fluxograma:

Nome do

,procedimento

leitu ra

das variveis do
procedimento

Operaes do
procedimento

Retornar
NOTA:

'

A instruo retornar indica que o controle do fluxo de dados dever


retornar ao algoritmo principal.

'

CAPITULO

1 07

PROCEDIMENTOS E FUNOES

Java:
Em Java, os mdulos, sejam eles procedimentos ou funes, seguem uma sinta
xe nica, independenemente
t
de qual seja seu objetivo, e so representados pelas clas
ses ou mtodos. Para se escrever mtodos em Java, utiliza-se a seguinte sintaxe:
<modificadores> <tipo_retorno> <nome_Mtodo>

(<argumentos>) {

<tipo_retorno> <nome_varivel_retomo> - <valor_inicial>;


<llstrues> ;
return <nome_varivel_retorno>;

Onde:

<nome_Mtodo>: um identificador vlido da linguagem. Obedece s mes


mas regras que os identificadores de classe, objeto e varivel.

<argumentos>: indica a lista de argumentos que sero passados como par


metros para o mtodo. A sintaxe dos argumentos a de declarao de vari
veis: tipo identificador, e os vri.os parmetros so separados por vrgulas.

<tipo_retorno>: indica o tipo do valor retornado pelo mtodo. Esse tipo pode
ser um tipo primitivo, uma classe ou void, no caso de no retornar valor
(equivalente a um procedimento).

return: palavra reservada que indica o valor que ser devolvido para o pro
grama, sendo associada com a varivel que armazena esse valor. No caso de
um mtodo com tipo de retorno void, nada devolvido, portanto no h
retomo e desnecessrio utilizar return.

<modificadores>: so elementos que caracterizam o mtodo quanto visibi


lidade (escopo) e qualidade. Os mtodos, como as classes e as variveis, po
dem possuir mais de um modificador, no importando sua ordem.

Os modificadores mais utilizados so:

public: pode ser invocado livremente. Indica um mtodo que visvel para
qualquer u m que enxergue a classe.

protected: pode ser utilizado apenas no mesmo pacote e em subclasses.

private: pode ser invocado apenas na classe.

final: no pode ser sobrescrito. Equivale declarao de constante.

s tat i c : no necessita de objeto. Pode ser invocado a partir do nome da


classe. Por exemplo: Integer . parseint( <String>).

Alm desses, existem outros modificadores, como por exemplo: abstract,

native, transient, volatile e synchronized.

'

1 08

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Se no h modificador, o mtodo pode ser chamado apenas no mesmo

NOTA:

pacote.

7. 1 . 1

CHAMADA D E PROCEDIMENTOS

A chamada de um procedimento o momento em que o procedimento aciona


do e seu cdigo executado, isto , a tarefa associada a ele realizada pelo algoritmo
principal.
Algoritmo principal
Var
Declarao das variveis utilizadas no algoritmo principal
Declarao do

Procedimento Nome_do_procedimento

procedimento

Va r
Declarao das variveis do procedimento
Incio do procedimento
Instrues do procedimento
Fim do procedimento

Incio do algoritmo principal


Instrues do algoritmo principal
Fim do algoritmo principal .

EXEMPLo

7. 1 :

Elaborar um algoritmo que realize a operao aritmtica escolhida pelo


usurio, a saber: adio, subtrao, multiplicao ou diviso, entre dois
valores fornecidos por ele.
Dever ser criado um menu de opes para o u surio.

Mdulo
principal
(Menu)

Mdulo
para adio

Pseudocdigo:
1.

Algoritmo Menu

2.

Var Opcao: inteiro

3.

Inicio

4.

Ler (Opcao)

5.

Escolha Opcao

Mdulo
para subtrao

Mdulo
para
multiplicao

Mdulo
para diviso

'

CAPITULO

PROCEDIMENTOS E FUNOES

6.

Caso 1 Ento Faa ModAdicao

7.

Caso 2 Ento Faa ModSubtr

8.

Caso 3 Ento Faa ModMu1tip

9.
10.
11.
12.

1 09

Caso 4 Ento Faa ModDiv

Caso contrrio Ento Mostrar ( " Fim de Programa " )


Fim_Escolha
Fim.

No algoritmo Menu, foi criado um menu de opes e, quando determinada op


o escolhida, o procedimento associado a essa opo acionado e executado. Aps a
execuo do procedimento, o fluxo do programa retoma para o algoritmo principal,
nesse caso o algoritmo Menu.
A seguir so apresentados os procedimentos de adio, subtrao, multiplicao
e diviso que so chamados pelo programa principaL
1.
2.
3.

4.

5.

Procedimento ModAdicao
Var v1, v2 , res: real

Incio
Ler (vl, v2)
res v1 + v2

6.

Mostrar (res)

7.

Fim.

8.

Procedimento ModSubtr
Var v1, v2 , res: real
Incio
Ler (vl, v2)
res f- v1 - v2

9.
10.
11.
12.
13.
14.

Hostrar (res)

Fim .

15.
16.
17.
18.
19 .
20.
21.

Procedimento ModMultip
Var v1, v2 , res: real
Incio
Ler (v1, v2)
res f- v1 * v2

22.
23 .
24 .

Procedimento ModDiv
Var v1, v2 , res: real

Hostrar (res)

Fim.

Incio

25.

Ler (v1, v2)

26 .
27.
28 .

res

f-

v1 I v2

Mostrar (res)

Fim.

1 1o

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Observe que, nos procedimentos anteriores, as variveis vl, v2 e

res

so de

claradas em todos os algoritmos, pois esto declaradas como variveis locais. Esse pro
blema pode ser resolvido declarando-as como variveis globais no mdulo principal.
Esse assunto ser detalhado mais adiante na Seo "Escopo de variveis". Cabe lembrar
que esses procedimentos podem ser utilizados em outros algoritmos e programas.

Fluxograma:

"
I

"
./

Incio

ModAdicao

ModSubtr

opo

vl, v2

v l , v2

res v l + v2

res v l - v2

opo = 1

.V.

ModAdicao

.F.

opo = 2

I
.V.

ModSubtr

.F.

Retornar
.V.

"
./l

.
/ ModMult1pl
I
"
.v.

res

Retornar

"

ModDiv

"

ModMultipl

.F.

opo = 4

res

/
"

vl, v2

vl, v2

res vl * v2

res v1 f v2

res

res

ModDiv

.F.
"Fim de
Programa"

Fim

/
"

Retornar

/
"

I
Retornar

'

CAPITULO

7 - PROCEDIMENTOS E FUNOES

11 1

Java:
1

20
3o

import java o i o * ;
o

class Menu {

40

5o
6o
70
80

public static void main ( String args [ ) ) {


BufferedReader entrada;
Entrada - new BufferedReader (
new InputStreamReader {System o in ) ) ;
Try {

90

100

System o o u t o println ( " 1 : Ad icao" ) ;

11.

System o out o println { "2


Systemo out println ( "3
System o o u t o println ( "4

140

Subtracao" ) ;
Mul tipl icacao " ) ;
: Divisao " ) ;
System o out oprintln( "Qual a Opcao Desejada? " ) ;

15 0

int opcao = Integero parseint(entradao readLine ( ) ) ;

160

switch (opcao) {

120
130

170

case 1

18o
190
200

case 2
case 3
case 4

modSubtracao ( ) ; break;
: modMultiplicacao ( ) ; break;
modDivisao ( ) ; break;
default : System oouto println ("Fim do Programa" ) ;

21.
220

230

} catch (Exception erro)

240

System o o u t o println( "Ocorreu

25 o

26 o
270
280

modAdicao ( ) ; break;

erro de leitura ! " ) ;

}
}

static void modAdicao ( )

290

BufferedReader entraSoma ;

300

entraSoma - new BufferedReader {

310
32

um

new InputStreamReade r ( Systemo in) ) ;


Try {

330
340
350

System o out o println( "Qual o primeiro numero? " ) ;


float numero1 = Floato parseFloat ( entraSoma oreadLine ( ) ) ;
System o out o prin tln ( "Qual o segundo numero?" ) ;

360

float numero2

370

float resultado = numerol + numero2;

380

System o o u t o println( "Soma = " + resultado) ;

39
400
41

Float o parseFloat (entraSoma oreadLine ( ) ) ;

c ateh ( Exception erro) {


System o outoprintln( "Ocorreu

um

erro de leitura ! " ) ;

42

430
440

static void modSubtracao ( )

450

BufferedReader entraSub ;

460
470

entraSub = new BufferedReader (


new InputStreamReade r ( System o in) ) ;

48.
49.
50.
51.
52.
53 .
54.
55.
56.
57.
58.
59.
60.
61.
62 .
63 .
64.
65.
66.
67 .
68.
69.
70.
71.
72 .
73.
74 .
75.
76.
77 .
78.
79.
80.
81.
82 .
83.
84 .
85.
86.
87 .
88.
89.
90.
91.

'

1 12

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Try {
System.out.println ( "Qual o primeiro numero ? " ) ;
float numerol

Float . parseFloat (entraSub. readLine ( ) ) ;

System.out.println ( "Qual o segundo numero? " ) ;

float numero2 = Float. parseFloat ( entraSub .readLine ( ) ) ;


float resultado
numerol - numero2;
System. out . println ( "Subtracao = " + resultado ) ;
=

} catch (Exception erro ) {


System.out.println( "Ocorreu um erro de leitura! " ) ;
}
}

static void modMultiplicacao ( ) (


BufferedReader entraMu l t ;
entraMult - new BufferedReader(
new InputStreamReader ( System . in) ) ;
Try {
System.out.println ( "Qual o primeiro numero?" ) ;

float numerol = Float . parseFloat (entraMult. readLine ( ) ) ;


System . o u t . println( "Qual o segundo numero? " ) ;
float numero2
Float. parseFloat (entraMult. readLine ( ) ) ;
=

float resultado

numerol * numero2;

System.out.println( "Multiplicacao

"

+ resultado) ;

} catch ( Exception erro) {


System.out.println( "Ocorreu um erro de leitura ! " ) ;
}
}

static void modDivisao ( )

BufferedReader entraDiv;
entraDiv - new BufferedReader(
new InputStreamReader (System. in) ) ;

Try {
System.out.println ( "Qual o primeiro numero? " ) ;
Float. parseFloa t ( entraDiv . readLine ( ) ) ;
float numerol
=

System.out.println ( "Qual o segundo numero ? " ) ;


float numero2

float resultado

Float . parseFloat ( entraDiv. readLine ( ) ) ;


=

numerol I numero2 ;

System.out.println( "Divisao =
+ resultado ) ;
} catch ( Exception erro ) {
System.out.println ( "Ocorreu um erro de le it ura ! ) ;
"

"

}
}

NOTA!

A ordem em que os mtodos so escritos indiferente para a execuo

do programa/ da mesma forma que esta independe da ordem em que


eles so chamados. O importante a ordem em que a lgica do progra
ma necessita exewtar tais mtodos.

'

CAPITULO

7.2

PROCEDIMENTOS E FUNOES

1 13

FUNCOES
->

As funes so criadas e chamadas da mesma maneira que os procedimentos. A


diferena entre eles que as funes podem ser utiUzadas em expresses, como se
fossem variveis, pois as funes retornam valores que so associados ao seu nome e
para esses valores se faz necessria a declarao do tipo de dado a ser retornado.
Funo nome_da_funo (lista de parmetros ) : tipo_de dado da
funo
var

Declarao dos objetos pertencentes a esta funo ( objetos


locais)
inicio
Instrues da funo
Retornar (varivel)
NOTA:

Tanto os procedimentos como as funes so 1mini-algoritmos' que pos


suem variveis e at mesmo outros procedimentos e funes.

Fluxograma:
Nome
da funo

Leitura
das variveis
da funo

Operaes
da funo

Retornar
(varivel)

Como j foi explicado na Seo "Procedimentos", na linguagem de programa


o Java, tanto os procedimentos quanto as funes so tratados como mtodos.
Ler um nmero fornecido pelo usurio e calcular o fatorial.
1.

Funo Fatorial ( n : inteiro)

2.

Var

3.
4.

i,

fat: inteiro

Incio

5.

Ler(n)

6.

0 ) Ento
Se (n
Fatorial f- 1

7.

: inteiro

8.
9.
10.
11.
12.
13 .
14 .
15.

'

1 14

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Seno
Para i de 1 at n - 1 passo 1 Faa
fat

f-

fat * i

Fim-Para

Fatorial f- fat
Fim-Se
Retornar (Fatorial)
Fim.
A declarao do tipo de dado da funo e do tipo de dado da varivel

NOTA:

de parmetro da funo se faz necessria, pois o parmetro passado


(saiba mais a seguir) pode ser de um tipo e o retorno do resultado de
outro tipo.

Fluxograma:
Fatorial (n)

.v.

Fatorial f- O

.F.

r- i f- 1 , n -

1 , 1 >- Fatorial f- fat

f-

Fatorial

Retornar (n)

fat <- fat 1


'

Java:
1.

import java . io . * ;

2.

class Exemplo72{

3.

4.
5.

public static void main ( String args [ ) ) {


BufferedReader entrada;
entrada = new BufferedReader (new InputStreamReader
(System. in) ) ;

6.

try{

7.

System . o u t . println ( "Qual Numero?" ) ;

8.
9.

int numero = Integer . parseint (entrada . r eadLine ( ) ) ;

int fat = fatorial (numero ) ;

CAPTULO

1 15

PROCEDIMENTOS E FUNES

System.out.print1n

10.

( " fatorial = " + fat ) ;

11.

} catch (Exception erro) {

12 .

System .out. print1n ( " Ocorreu um erro de leitura ! " ) ;

13.

14.

15.

static int fatorial (int num) {

16.

int fat

17.

for ( int i = 1 ;

1;

18.

fat

19.

return fat;

20.
21.

7.3

<= num; i++)

fat * i ;

}
}

ESCOPO DE VARIAVEIS
At agora, todos os exemplos apresentados utilizaram variveis locais, isto ,

variveis que podem ser utilizadas somente no escopo do algoritmo/programa no qual


foram declaradas. No entanto, isso pode ocasionar redundncia na declarao de vari
veis que se fazem necessrias em vrios mdulos, como no caso do Exemplo 7. 1 , em
que as variveis vl, v2 e

res

foram declaradas em todos os mdulos. Para resolver

esse problema, existe a possibilidade de serem declaradas variveis globais.


As variveis globais so declaradas no algoritmo principal e podem ser utiliza
das por todos os algoritmos hierarquicamente inferiores. J as variveis locais podem
ser utilizadas pelo algoritmo em que foram declaradas e nos algoritmos hierarquica
mente inferiores, conforme mostra o organograma apresentado a seguir:
Algoritmo principal ;
Var V1, V2: inteiro;
Resp: lgica;

Algoritmo A;
Var V3: real;

Algoritmo D;
Var V6: real;

Algoritmo B;
Var V4: real;

Algoritmo E;
Var V7: real ;

Algoritmo F;
Var VB: real ;

Algoritmo C;
Var VS: real;

'

1 16

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Supondo que esse organograma represente a hierarquia da resoluo de um pro


blema em mdulos, tem-se que:

As variveis Vl e V2 foram declaradas no mdulo principal e podem ser


utilizadas por todos os mdulos dos algoritmos.

A varivel V3 foi declarada no algoritmo A e pode ser utilizada pelos algorit


mos D, E e F, que so hierarquicamente inferiores a ele.

As variveis V4, V5, V6 e V8 podem ser utilizadas somente pelos algoritmos

B, C, D e F, respectivamente, pois no possuem algoritmos hierarquicamente


inferiores.

A varivel V7 pode ser utilizada pelos algoritmos E e F.

Algoritmo principal;
Var V1,V2: real;
Resp: lgica;
Algoritmo A;
Var V3: real;

Algoritmo B;
Var V4: real;

Algoritmo O;
Var V6: real;

Algoritmo C;
Var VS: real;

Algoritmo E;
Var V7: real;
Algoritmo F;
Var V8: real;

NOTA!

A definio adequada das variveis pode economizar memria e tor

nar os programas mais eficientes.

7.4

PARA M ETROS
Parmetros so variveis ou valores que podem ser transferidos do algoritmo

principal para um mdulo que est sendo chamado. Eles funcionam como comunicadores
entre os mdulos. Existem dois tipos de parmetros: os formais e os reais.

7 .4. 1

PARAM ETROS FORMAIS

So declarados nos mdulos e tratados como as variveis. O algoritmo que cha


ma a funo ou o procedimento informa os valores que substituiro esses parmetros.
No exemplo a seguir, as variveis A e B so parmetros formais.

'

CAPITULO 7

PROCEDIMENTOS E FUNOES

Calcular a multiplicao entre dois nmeros.

ExEMPLo 7 . 3 :

1.
2.

Algoritmo Exemplo_7 . 3

3.

Var Res : real

4.
5.

Procedimento multiplica (A, B : reais)

Incio
Res

f-

(A * B)

Mostrar (Res)

6.

7.

1 17

Fim.

Fluxograma:

multiplica
(A,B) _/
'-

Res f- A * B

Res

Retornar

Java:
1.
2.

static float multiplicar ( float A, float B ) {


float res;

3.

res = A * B;

4.

return res;

5.

7.4.2

...

PARA M ETROS R E A I S

Os parmetros reais so os valores que substituem os parmetros formais. O


algoritmo que chama a funo ou o procedimento informa esses valores ou variveis.
No Exemplo 7.4 os parmetros formais A e B do Procedimento multiplicar
sero substitudos pelos valores fornecidos para as variveis numl e num2 do algo
ritmo principal.

EXEMPLO

1.
2.

7.4:

Calcular a multiplicao entre dois nmeros.

Algoritmo Exemplo_7 . 4

Procedimento multiplicar (A, B : real)

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Var Res: real

3.

4.

Incio

5.

Res f- (A * B )

6.

Mostrar (Res)

7.

Fim.

8.
9.

Var Num1 , Num2 : real

10.

Incio

11.

Ler (Num1 , Num2 )

12 .

multiplicar (Num1 , Num2 )

13 .

'

1 18

Fim.

As variveis Numl e Num2 so os parmetros reais, isto , so as variveis que


recebero valores que sero utilizados na execuo da funo ou procedimento, no caso
do exemplo anterior, para a realizao da multiplicao, portanto, quando o procedi
mento multiplicar (linha 12) chamado, informa os valores, neste caso numl e

num2 , que substituiro os parmetros formais, neste caso A e B.

Fluxograma:
multiplicar
(A,B)

/
I

Incio

'\
/

Res <- A * B

Num1, Num2

Res

multiplicar
(Num 1 ,
Num2)

Retornar

LEMBRETE:

('-

Fim

Se o procedimentomul tiplicar fosse implementado como uma fun


o, seria necessrio informar o tipo de dado esperado como retorno
na declarao da funo e deveria ser utilizada a palavra
( varivel), no algoritmo, ou

Java:
1.

import Java. J.o. * ;

2.
3.

4.

class Multiplicar {

retorno

return ( varivel) no programa java.

'

CAPITULO

7 - PROCEDIMENTOS E FUNOES
publ ic static void main

5.

6.

1 19

(String args [ ] ) (

BufferedReader entrada ;
entrada - new BufferedReader(

7.

new InputStreamReader ( System . in) ) ;

8.

try {
System . ou t . println( "Qual Numero 1 ? " ) ;
Integer . parseint (entrada. readLine ( ) ) ;
int num1
System .out.println( "Qual Numero 2 ? " ) ;

9.

10.
11.

12 .
13 .

int num2

14.

multiplicar (num1 , num2 ) ;

Integer .parsein t ( entrada .readLine ( ) ) ;

} catch (Exception erro)

15.

16.
17.
18.

System . out . println ( "Ocorreu um erro de leitura ! " ) ;

}
}

19.
20 .

static void multiplicar ( f loat A,

21.

float res;

22 .

res

23.

System . out . pr int ln ( " " + res ) ;

A * B;

24.
25.

float B) (

7.4 .3

"

PAS SAGEM D E PARAMETROS

A passagem de parmetros ocorre por meio da coiTespondncia argumen


to/parmetro, em que os argumentos so valores constantes ou variveis informados no
mdulo chamador, ou principal - isto , passagem de parmetros a substituio dos
parmetros formais pelos parmetros reais. Os argumentos devem ser fornecidos na
mesma ordem dos parmetros.
Os parmetros podem ser passados por valor ou por referncia.

7.4.4

"

PASSAGEM D E PARAM ETROS POR VALOR

Na passagem de parmetros por valor, o valor do parmetro real copiado


para o parmetro formal do mdulo, preservando, assim, o valor original do parmetro.
No Exemplo 7.4, foi utilizado esse tipo de parmetro. Foi solicitada uma entrada

para os parmetros Numl e Num2 (que so parmetros reais) e estes foram armazenados
em A e B (que so parmetros formais), os quais foram manipulados, preservando-se
assim os valores de Numl e Num2.

NOTA:

Na linguagem de programao Java, os objetos (String, Date etc.) e os


arrays so sempre passados por referncia. O Java passa o valor da
varivel quando o mtodo chamado e quaisquer alteraes eitas
f
na varivel tornam-se permanentes.

'

1 20

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

7.4.5

PASSAG E M D E PARAMETROS POR R E F E R E N C I A

Na passagem de parmetros por referncia, toda alterao feita nos parme


tros formais reflete-se nos parmetros reais; assim, o parmetro de entrada e sada. No

Exemplo 7.4, as variveis Numl e Num2 so parmetros de entrada e a varivel Total


um parmetro de sada.

7. 5

EXERCICIOS PARA FIXAAO


Para os exerccios abaixo, escreva os procedimentos ou funes adequados para

cada problema.
1 . Escreva um algoritmo para ordenar trs nmeros fornecidos pelo usurio.
Utilize a passagem de parmetros formais.
2. Escreva um algoritmo para:
a) preencher uma matriz A;
b) ordenar os elementos da matriz A;
c) gerar uma matriz somente com os nmeros pares da matriz A;
d) gerar uma matriz somente com os nmeros mltiplos de 5 ;
e) criar um menu para acessar os itens anteriores.

3. Elabore um algoritmo que seja capaz de fazer a converso de um valor em


reais para o correspondente em dlares, libras, francos e ienes e vice-versa.
O programa dever conter um menu com as opes.

4. Construa um algoritmo que verifique se um dado nmero divisvel por


outro. Ambos devem ser fornecidos pelo usurio.
t o arredondamento de um nmero real para
5 . Faa um algoritmo que possibilie
um nmero inteiro seguindo os padres cientficos.
6. Elabore um algoritmo que escreva por extenso um nmero inteiro com at
dez dgitos fornecido pelo usurio.

7. Construa u m algoritmo que verifique, sem utilizar a funo mod, se um n


mero divisvel por outro.

7 .6

EXERCICIOS COM P L E M E NTARES


1 . Escreva um algoritmo que calcule o mximo divisor comum de dois nme
ros fornecidos pelo usurio.
2. Necessita-se calcular alguns dados correspondentes aos animais de uma fa
zenda. Os animais pertencem a espcies diferentes, a saber: bovinos, ovinos
e caprinos. Construa um algoritmo para a mdia de peso de cada espcie para
os animais do sexo feminino e do sexo masculino, a partir de dados forneci
dos pelo usurio.

'

CAPITULO

PROCEDIMENTOS E FUNOES

121

3. Dada uma data abreviada, escreva-a por extenso.


4. Faa a leitura de mil nmeros pelo processo de sorteio automtico. Os nme
ros devem estar entre O e 1 00. Verifique:
a) Qual foi o nmero sorteado mais vezes.
b) Qual foi o nmero sorteado menos vezes.
c) Qual foi o maior nmero.
d) Qual foi o menor nmero.
5. Construa um algoritmo que calcule a somatria dos N primeiros nmeros de
um conjunto. O valor de N dever ser fornecido pelo usurio.
6. Escreva um algoritmo que calcule o nmero de horas de determinado pero

do estabelecido por duas datas.

"'

PIT

UL

BUSCA
-

E ORDENAAO

Ordenao
Busca

OBJETIVOS:

Abordar algumas tcnicas para construo


ritmos para ordenao e busca de dados.

de algo

os captulos anteriores, foi mostrado como trabalhar com dados fornecidos das
mais diversas formas pelos usurios. Normalmente, o usurio que vai inser os
dados no est ou no pode estar preocupado com a ordem de entrada dos dados no
momento de sua insero na relao, de modo que comum encontrarmos elementos
ordenados de maneira aleatria em nossos sistemas.
Muitas vezes, necessitamos que esses dados apresentem uma ordem para que
possamos realizar aes como verificar se determinado cliente pagou uma conta, se uma
pessoa est em uma lista de convidados para uma festa e assim por diante. Devido a
essas necessidades, foram desenvolvidos vrios algoritmos de ordenao que consis
tem, basicamente, em realizar comparaes sucessivas e trocar os elementos de posio.
Neste captulo, mostraremos alguns dos mtodos de ordenao bsicos.

'

1 23

CAPITULO 8 - BUSCA E ORDENAAO

8.1

0 R D E NAAO POR TROCAS

M ETODO DA BOLHA

O mtodo de ordenao por trocas considerado o mais simples de todos.


Consiste em comparar pares consecutivos de valores e permut-los caso estejam fora de
ordem. O algoritmo determina uma seqncia de comparaes sistemticas que varrem
a seqncia de dados como um todo, fazendo com que o maior valor (ou menor, de
acordo com a ordem desejada) acabe no final da seqncia e uma nova srie de compa
raes sistemticas se inicia.
Seqncia no ordenada

Seqncia ordenada

t
l
t
l
DDDDDDDDDDDD
i
LJ
LJ
LJ
LJ
LJ
Maior nmero deslocado para
o fim da seqncia no ordenada

Comparaes sucessivas entre pares na


seqncia no ordenada vai 'empurrando'
o maior nmero para o fundo

I FIGURA s. 1 I

Ordenao pelo Mtodo da Bolha

Em cada passagem, um elemento deslocado para sua posio final, isto , um


elemento ordenado. Assim, uma seqncia com N elementos ter, aps a primeira
passagem, um elemento ordenado e N - 1 elementos por ordenar. Na segunda passa
gem, a seqncia ter dois elementos ordenados e N - 2 elementos por ordenar e assim
sucessivamente.
A idia desse tipo de ordenao anloga idia de jogar pedras na gua. En
quanto as pedras (elementos mais pesados) vo para o fundo, as bolhas de ar (elementos
mais leves) vo para a superfcie. Da o nome do mtodo ser conhecido como .Mtodo
da Bolha.
Algoritmo de ordenao por trocas - Mtodo da Bolha

EXEMPLo 8 . 1 :
1.
2.

Algoritmo ExemploS . 1
Var

3.

numeros

4.

aux,

5.
6.
7.
8.

1,

vetor de inteiros
:

inteiro

Inicio
Para i de <incio> at <fim - 1> Faa
Para j de <incio> at <fim - 1 - i> Faa

Se (numeros [ j ) > numeros [ j + 1 ) )

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

9.
10.
11.

aux = nurnero s [ j ]
numeros

[j ]

nurneros [ j + 1]

12 .

13 .
14.
15.

'

1 24

numeros [ j + 1 ]
=

aux

Fim-Se

Fim-Para
Fim-Para
Fim.

Na linha 6, a varivel i ter o valor inicial definido pela expresso <incio> e


o valor final definido pela expresso <fim - 1 > . O algoritmo faz uma srie de passa
gens do incio at o fim da seqncia que se deseja ordenar, tambm na linha 6. Como os
dois ltimos nmeros sero ordenados simultaneamente (quando o penltimo estiver
ordenado, o ltimo tambm estar), a estrutura de repetio ir do ndice do primeiro
elemento at o ndice do penltimo .
Em cada passagem, sero feitos um conjunto de comparaes sucessivas (linhas
8 a 1 2 ) e a troca dos valores que estiverem fora de ordem. Nesse caso, o nmero de
comparaes determinado por uma estrutura de repetio (linha 7) que vai desde o
primeiro at o ltimo elemento no ordenado, que dado pelo ndice do ltimo elemen
to da seqncia a ser ordenada (fim
1) menos a quantidade de elementos que j
foram ordenados (i).
Observe que a varivel auxiliar utilizada para a permuta dos elementos deve ser
do mesmo tipo que os elementos que esto sendo permutados.
Considerando que cada passagem ordena um elemento por meio de compara
es sucessivas entre os elementos no ordenados, uma seqncia de n. elementos ter
n. - 1 passagens (a ltima passagem ordena dois nmeros ao mesmo tempo) e cada
passagem ter n - i comparaes, em que i o nmero da passagem.
-

'

1 25

CAPITULO 8 - BUSCA E ORD ENAAO

Fluxograma:
Incio

i f- inicio,
fim - 1 , 1

Fim

j f- inicio,
fim 1 i 1
-

. V.
aux f-
numeros[j]

numeros[j] f-
numeros[j + 1]

numeros[j + 1 ]
f- aux

Vamos considerar, para o Exemplo 8 . 1 , que o vetor contm os seguintes elemen


tos: [9, 1 , 3, 2, 7, 5, 4]. Ento, substituindo as variveis <incio> e <fim - 1>,
teramos a seguinte representao no pseudocdigo (linhas 6 e 7) e no fluxograma:
Para i de O at 5 faa
Para j de O at S

i faa

Na Tabela 8.1 so apresentados, passo a passo, os valores ordenados a cada exe


cuo do lao, considerando o vetor exemplo [9, 1 , 3, 2, 7, 5, 4].
Essa abela
t
apresenta os valores de um vetor carregado iJlicialmente com os va
lores representados pela coluna O. Cada coluna subseqente representa os passos do
algoritmo necessrios para ordenar totalmente o vetor. As linhas nomeadas com i e j
representam os valores que essas variveis assumiriam no decorrer do processo.

'

1 26

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

10

11

12

13

14

15 16

1 7 1 8 1 9 20 2 1

I TABELA 8. t I Ordenao de um vetor

interessante observar que, nesse caso, o algoritmo j concluiu a ordenao no


152 passo, o que no ocorreria com outra ordem de entrada dos valores (coluna 0). Esse
mtodo de tabular os dados pode ser utilizado para outros exemplos, facilitando a com
preenso e a verificao da eficcia do algoritmo. No utilizaremos essa representao
para todos os casos, cabendo ao leitor aplic-la quando julgar necessrio.
EXEMPLO 8.2:

O programa a seguir implementa uma soluo para ordenar o vetor de n


meros inteiros

[9, 1.,

3, 2, 7, 5, 4] utilizando o mtodo de ordenao por

trocas.

Java:
1.
2.

c1ass Exemp1o82 {
public static void main ( String args [ J l {

3.

int num [ )

4.
5.

num [ o l
num [ 1 )

6.

9;

1;

num [ 2 )

3;

7.

num [ 3 )

2;

8.

num [ 4 ]

7;

9.
10.

num [ 5 ) - 5 ;
num [ 6 ) - 4 ;

11.

bolha (num) ;

12 .

for (int i

13.

new int [ 7 ) ;

O ; i < num . length; i++)

System. o u t . println (num [ i) ) ;

14.

15.

pub1ic static void bolha (int numeros [ ) ) {

16.

final int n

17 .

int aux;

18.

for (int i

numero s . length;

O ; i < n-1; i++) {

19.

for (int j

20.

if

O ; j < n-1-i; j++) {

(numeros [ j ) > numeros [ j + 1 ) ) {


=

21.

aux

22.

numeros [ j )

23.

numeros [ j +1 ]

numero s [ j ) ;
=

numeros [ j + 1 ] ;
=

aux;

1 27

CAPTULO 8 - BUSCA E ORDENAO

24.

25.

26.
27.
28.

}
}

Esse mtodo descreve exatamente o mesmo que o algoritmo ExemploS . 2. A


identificao do mtodo (linha 15) utiliza o modificador publ ic, pois interessante
que esse mtodo tenha mxima visibilidade, embora isso no seja obrigatrio. O void
utilizado pois equivalente a um procedimento, isto , ordena um conjunto de nme
ros mas, aps seu processamento, nada acrescentado memria do sistema. O
modificador static usado para torn-lo um mtodo sem dependncias com objetos.
Os elementos que se deseja ordenar so passados como um vetor de parmetros
do tipo desejado, cujo tamanho definido pela propriedade length dos vetores em
Java, usada na linha 1 6. O modificador final (equivalente a uma declarao de cons
tante) apenas indica que o tamanho do vetor no ser alterado durante a ordenao.

CUIDADO!

Ao se fazerem ordenaes ou mesmo pesquisas em Java utilizando


strings, deve-se dedicar especial ateno. String uma classe defini
da na linguagem cujos elementos possuem caractersticas especiais. As
comparaes entre objetos so feitas de maneira diferente das compa
raes de tipos primitivos (como nmeros inteiros).

Para comparar a ordem de duas strings, existe um mtodo chamado compareTo ( ) ,

definido na classe String. Esse mtodo l o cdigo UNICODE equivalente das duas
strings e subtrai um valor do outro. O resultado um valor numrico do tipo inteiro tal
que, se for igual a zero, as duas strings sero iguais; se for menor que zero, elas estaro
ordenadas de forma crescente; e, se for maior do que zero, elas estaro em ordem de
crescente ou fora de ordem crescente (vide Tabela 8.2).
Para ilustrar a explicao sobre ordenao pelo Mtodo da Bolha para strings,
apresentado a seguir o cdigo em Java cuja nica diferena para o ExemploS . 2 est
na condicional da linha 20. Justamente por isso, no existe a necessidade de repetirmos
a representao algortmica em pseudocdigo e fluxograma.

String l . compareTo (String2)

Resultado
=0
>0

String l . compareTo (String2)

<0

Sintaxe da comparao
String l . compareTo ( String2)

Significado
so iguais
Stringl maior que String2
(fora de ordem crescente)
Stringl menor que String2
(em ordem crescente)

I TAs E LA e. 21 Comparaes com strings

'

1 28

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

EXEMPLO 8.3:

1.

Programa para ordenao de caracteres

ou strings de caracteres.

class Exemplo83{

2.

public static void man ( String args [ ) ) {

3.

String letras [ )

4.

letras [ 0 )

5.

letras

[1)

6.

letras

[2)

7.
8.
9.

letras [ 3 )
letras

[4)

letras

[5)

new String [ 7 ) ;

"AG" ;

"AA " ;

''AE " ;

\\AF', ;

''AC " ;

'\AB " ;

11.

"BJI;
letras ( 6 ]
bolha ( letras ) ;

12 .

for ( int i = O ; i < letras . length; i++)

10.

System.out.println ( l etras

13 .
14.

15.

public static void bolha

[i) ) ;

(String palavras

(] ) {

16.

final int

17 .

String aux;

18.

for ( int i = O ; i < n - 1 ; i++ ) {


i ; j++) {
for (int j = O ; j < n - 1

19.

palavras . length;

if

20.

(palavra s [ j ) . compareTo (palavras [ j + 1 ) ) > 0 ) {

21.

aux

22.

palavras [ j )

23 .

palavras [ j + 1 )

24 .

palavras [ j ) ;
=

palavras [j + 1 ) ;
=

aux;

25.

26.

27 .
28.

}
}

Os dois mtodos podem ser escritos na mesma classe. Embora os tipos dos par
metros sejam diferentes, devido qualidade de sobrecarga dos nomes dos mtodos,
apenas o mtodo correto responder chamada do programa principal.
Outra observao importante deve ser feita. Na ordenao de palavras, o progra
mador deve lembrar que maisculas e minsculas so diferentes, estando as maisculas
listadas na frente das minsculas nas tabelas de caracteres.
Para evitar problemas, recomendvel utilizar algum mecanismo de segurana,
por exemplo, converter todos os caracteres indicados pelo usurio para maisculas ou
minsculas. Em Java, utilizam-se os mtodos toUpperCase ( ) e toLowerCase ( )
para fazer as converses para maisculas e para minsculas, respectivamente.
O exemplo a seguir mostra um programa completo que permite ordenar um
conjunto de elementos do tipo nmero inteiro ou String dados pelo usurio. Nesse
exemplo, o usurio deve saber com antecedncia a quantidade de elementos que deseja
ordenar.

'

CAPITULO 8 - BUSCA E ORDENAAO


ExEMPLo 8.4:
1.

Programa completo para ordenao.

class Ordenacao

2.

129

public static void bolha (int numeres [ ] ) (

3.

final int n

4.

int aux;

5.

for (int i

numeros . length;

O ; i < n - 1 ; i++) {
for (int j = O ; j < n - 1 - i ; j+ + ) {
if (numeros [ j ] > numeros [j + 1 ] ) {

6.
7.

8.
9.

aux

numeros [ j ] ;

numeros [ j ]

10.

numeros [ j + 1 ] ;
=

numeros [ j + l ]

11.

aux;

12.

13.

14.

15.

public static void bolha ( String palavras

16.

final int n

17.

String aux ;

18.

for

palavras . length;

O; i < n
1 ; i++) (
O ; j < n - 1 - i ; j ++) (
for ( int j
=

(int i

19.

20.

if

(palavras [ j ] . compareTo (palavras [ j + 1 ] ) > 0 ) (


=

21.

aux

22.

palavras [ j J

23.

palavras [ j + 1 ]

24.

palavras [ j + 1 ] ;
=

aux;

26.

27.

1.

palavras [ j ] ;

25.

28 .

[])(

}
}
import java . io . * ;

2.
3.
4.

class Exemplo84 {
public static void main (String args [ ] )

5.

BufferedReader entrada ;

6.

entrada

new BufferedReader (new InputStreamReader

(System. in) ) ;

7.

try(

qte ;

8.

int

9.

boolean ok;

10.

do{

11.

System . out . println ( "- Ordenar -" ) ;

12 .

System . out . println ( "O que deseja ordenar?" ) ;

13 .

Sys tem . ou t . println ( " l - Numeros Inteiros" ) ;

14.

System . o u t . println ( "2 - Palavras ) ;

15.

System. out . pr int ( Opcao - " ) ;

"

"

'

1 30

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

16.

int opcao

17 .

switch (opcao ) {

18.

case 1 :

Integer .parseint( entrada . readLine ( )

19.

System .out.print( "Quantos Numeros ? " ) ;

20.

qte

21.

int numeros

Integer .parseint ( entrada . readLine ( )

) ;

);

int [qte) ;
for ( int i = O ; i < qte; i++ ) {

22 .

[)

new

23.

System.out.print( "Numero [ "

24.

numeros [ i )

( i + 1)

"

)=

"

);

= Integer.parseint

(entrada. readLine ( ) ) ;

25.

26.

Ordenacao .bolha( numeros ) ;

27 .

System . out . println ( ) ;

28.

Sys tem . out. println ( "Ordenados : " ) ;

29.

System.out.println ( ) ;

30.

for ( int i =

O ; i < qte; i++)

Sys tem.out .println (numeros [ i ] ) ;

31.

32 .

ok = true;

33.

break;

34 .

case 2

35.

System . o u t . print ( "Quantas Palavras ? " ) ;

36.

qte

37 .

String palavras [ ]

38.

for (int i = O ;

Integer .parseint ( entrada . readLine ( )


= new String

i < qte;

[qte ] ;

i++) {

39 .

Sys tem. ou t . pr int ( "Palavra [ " +

40.

palavras [ i )

( i + 1)

42 .

Ordenacao . bolha (palavras ) ;

43 .

System.out.println ( ) ;

44 .

Sys tem . out . println ( "Ordenados : " ) ;

45.

Sys tem.out .println ( ) ;

46.

for (int i =

= ");

O ; i < qte; i++)

System.out.println (palavras [ i ] ) ;

48.

ok

49.

break;

50.

default :

true;

51.

System. out . println ( "Opcao Invalida! " ) ;

52.

System . o u t . println( "Tente Novamente . " ) ;

53.

System . ou t . println ( ) ;

54.

ok

false;

55.
56.

57 .

} catch

58.

while

( ! ok) ;

(Exception e ) (

System . o u t . println( "Ocorreu

59.

60.

61.

+ "]

entrada . r eadLine ( ) . toUpperCase ( ) ;

41.

47 .

) ;

um

erro durante a leitura ! " ) ;

'

CAPITULO 8 - BUSCA E ORDENAAO

131

Nesse exemplo, a classe Ordenacao possui mtodos que permitem ordenar


nmeros inteiros e strings, mas o programador pode ampli-la para permitir a ordenao
dos demais tipos primitivos, como nmeros reais (float) e caracteres (char).
As chamadas dos mtodos ocorrem nas linhas 26 e 42. Essas chamadas so rea
lizadas indicando-se o nome da classe em que o mtodo est definido (Ordenacao) e
o nome do mtodo com os parmetros necessrios. Na linha 40, feita uma converso
da entrada de dados do usurio de forma que todas as palavras (ou frases) sejam conver
tidas para letras maisculas. Isso foi feito para evitar o problema j mencionado de
diferena de ordenao para maisculas e minsculas. O programa apresenta um menu
de escolha para o usurio e uma estrutura adequada para uma entrada de dados conve
niente.

8.2

B U SCA

Evidentemente, possuir os dados no qjuda o programador ou o usurio se eles


no souberem onde os dados esto. Imagine, por exemplo, uma festa de casamento com
cem convidados na qual no se sabe quem eles so ou se determinada pessoa foi ou no
convidada. Imagine, nas eleies, que voc queira votar naquele nico poltico honesto
que conhece, mas no sabe qual seu nmero!
Os algoritmos de busca so alguns dos mais utilizados no mundo da informtica,
sendo usados em bancos de dados, internet, jogos, entre outros. Aqui sero apresenta
dos alguns exemplos de algoritmos de busca linear e busca binria.
A escolha do mtodo a ser utilizado para busca depende muito da quantidade de
dados envolvidos, do volume de operaes de incluso e excluso a serem realizadas,
entre outros fatores que devem ser considerados quando do desenvolvimento da apli
cao.
8.2. 1

BUSCA L I N EAR (OU S E Q E NCIAL)

A maneira mais bvia de fazer uma busca , com certeza, comparar o elemento
que se est procurando com todos os elementos guardados, um a um, isto , o mais
simples procurar o elemento seqencialmente at que seja encontrado.
O algoritmo que realiza essa busca realmente muito simples e consiste em uma
estrutura de repetio que varre toda a seqncia de elementos, realizando uma condi
cional que compara o elemento desejado com os elementos existentes na seqncia.

DDDDDDDDDDDD
t t t
t t t
!FIGURA

a.21

Busca linear

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

1 32

Quando o elemento encontrado, retoma-se o valor verdadeiro, o que indica o


/

sucesso da busca e encerra a estrutura de repetio. E claro que a maneira de encerrar


essa estrutura depender da linguagem de programao a ser utilizada.
LIEMBRE-sE:

A execuo da rotina de busca termina quando a condio de busca

satisfeita, OLI ento quando todo o conjunto percorrido e o elemento


no foi encontrado.
EXEMPLO 8 . 5 :

Algoritmo de busca linear (seqencial).

1.

Algoritmo ExemploS . 5

2.

Var

3.

sequencia : vetor de elementos

4.

5.

encontrou

logica

6.

inteiro

7.

elemento a ser procurado

Incio

(x)

8.

Ler

9.

Para i de <incio> at <fim - 1> Faa


Se (x = sequencia [ i ] )
encontrou f- . v .
<fim da busca>

10.

11.
12.
13 .

Seno

14.

encontrou f- . f .

15.

Fim-Se

Fim-Para

16.
17 .

Fim.

No algoritmo ExemploS . 5, para a varivel sequencia, devem-se declarar o


tamanho do vetor e o tipo de dados que esse vetor receber, conforme visto no Captulo
6, assim como para a varivel x deve-se declarar o tipo de dado da informao a ser
procurada.

'

CAPITULO 8 - BUSCA E ORDENAAO

1 33

Fluxograma:
Inicio

i f- inicio,
fim - 1, 1

Fim

.F.

encontrou f- .f.

.v.

encontrou f- .v.

Uma variao bastante comum dessa e das demais estruturas de busca retoma o
ndice do elemento procurado na seqncia. Para isso, basta substituir a varivel lgica
por uma varivel de tipo inteiro que receber o ndice do elemento, quando este for
encontrado, e poder receber um valor no associado a nenhum ndice, por exemplo, - 1 .
A variao escolhida sempre ser uma opo do programador que refletir suas necessi
dades.
O cdigo em Java to simples quanto o algoritmo. Uma classe com esse mto
do aplicado a nmeros inteiros mostrada no programa a seguir.

Java:
1.

class Busca{

2.

public static boolean linear (int x , int numeres [ ) ) {


final int n = numer o s . length;

3.
4.

5.

for (int i

6.

if (x

==

O ; i < n; i++)
numeros [ i ] )

return true;

7.

return false;

8.
9.
10.

}
}

'

1 34

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Na linha 6 do exemplo, feita a comparao efetiva entre o elemento procurado


e os elementos da seqncia. Caso o elemento procurado seja encontrado, o programa
retoma verdadeiro (linha 7). Em Java, quando a palavra reservada return en
contrada, o mtodo encerrado e as comparaes param.
CUIDADO!

Novamente, deve-se atentar para o fato de as comparaes entre strings


(objetos) serem diferentes das comparaes entre tipos primitivos. Um
cuidado extra requerido, pois a utilizao do operador de igualdade
(==) no provocar erro no programa. Esse operador pode ser utilizado
para comparar os objetos em si, por exemplo, para verificar qual obje
to foi responsvel pela chamada de um mtodo em um programa com
interface grfica. Nesse caso, deseja-se conhecer o objeto (boto, cai
xa de edio...), e no seu contedo (cor do boto, tamanho da caixa
de edio.. .).

Alm do mtodo j citado, a classe Str ing possui alguns mtodos de compara
o direta entre duas strings. O mtodo equals ( Obj ect obj ) derivado da super
classe Obj ect e pode ser utilizado para comparar o contedo completo de dois objetos
quaisquer (inclusive String). Esse mtodo bastante utilizado, mas, para nossos fins
de busca, mais conveniente utilizar o mtodo equal signoreCase ( String tex
to) , que faz a comparao apenas entre objetos do tipo String, mas elimina o pro
blema de comparaes entre maisculas e minsculas.

EXEMPLO 8 . 6 :

Programa em Java para busca linear de strings.

6.

public static boolean linear ( String x , String palavras [ ) ) {


final int n = palavras. length;
for (int i = O ; i < n; i++)
if (x. equalsignoreCase(palavras [ i ) ) )
return true;
return false;

7.

1.
2.
3.
4.
5.

Observe o mtodo de busca l inear descrito para String. As alteraes esto


apenas no identificador do mtodo, que utiliza parmetros corretos para uma busca em
uma seqncia de strings, e na linha 4, onde a comparao foi modificada para adequar
se aos objetos do tipo String. Esse e outros mtodos de busca linear para os demais
tipos primitivos podem ser adicionados classe descrita no Exemplo 8.5, o que consti
tui um bom exerccio de fixao.
O Exemplo 8.7 retrata um programa completo que faz a busca de um nmero
qualquer determinado pelo usurio em uma seqncia de nmeros inteiros tambm for
necidos pelo usurio.

'

CAPITULO 8 - BUSCA E ORDENAAO


Programa completo de busca.

ExEMPLo 8.7:
1.

135

c1ass Busca {

2.

pub1ic static boolean linear ( i n t

3.

final int n = dado s . leng th ;

4.

6.

for (int i
O ; i < n ; i++}
i f (x
dados [ i ) )
return true;

7.

return false;

x,

int dados

5.

==

8.

9.

public static boolean linear ( String x,

String dados

10.

final int n = dados . leng th ;

11.

for (int i
O ; i < n ; i++}
if (x. equalsignoreCase (dados [ i ) ) )
return true;
return false;

[) ) {

12.
13.
14.
15.
16.

[)) {

}
}

A classe Busca incorpora os dois mtodos de busca: para nmeros inteiros e


para strings. Como j dissemos anteriormente, os mtodos esto sobrecarregados, sen
do diferenciados pelo tipo dos dados passados como parmetros.
1.

import java . i o . * ;

2.
3.
4.
5.

6.

class Exemplo 87 {
public static void main (String args ( ] ) {
BufferedReader entrada ;
entrada
new BufferedReader (new InputStreamReader
=

( System. in) ) ;
7.

tr y {

8.

int qte;

9.

boolean ok, achou;


do{
System. out . println ( "- Entrada de Dados - " ) ;
System.out .println ( "Que tipo deseja usar? " ) ;

10.
11.
12.
13 .

System .out .println ( " 1 - Numeres Inteiros " ) ;

14.

System . o u t . println ( " 2 - Palavras " ) ;

15.

System . o u t . print ( "Opcao - " )

16.

int opcao
Integer. parseint (entrada. readLine ( ) ) ;
switch (opcao ) {
case 1 :

17.
18.

19.

System . ou t . print

20.

qte

21.

int numeres

22.

for (int i

23 .

( "Quantos Numeres ? " ) ;

Integer. parseint ( entrada . readLine ( ) ) ;


[)

new int

[qte) ;

qte; i + + ) {
Sys tem . out . print ( "Numero [ " + ( i + 1 ) + " ) = " } ;
=

O;

i <

'

1 36

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

numeros [ i )

24 .

- Integer.parseint

(entrada. readLine ( ) ) ;
25.

26.

System .out.println ( } ;

27 .

System . ou t . print ( "Qual Numero Deseja Pesquisar ? " ) ;

28.

int x = Integer.parseint (entrada. readLine ( ) ) ;

29.

achou = Busca. linear (x,

30.

if

numeres ) ;

(achou)
System . out . println ( "Numero Presente na

31.

Relacao" ) ;
else

32 .

System .out.println( "Numero Nao Presente na

33.
Relacao " ) ;
34.

ok = true;

35.

break;
case 2 :

36.
37.

Sys tem. out . prin t ( "Quantas Palavras? " ) ;

38.

qte

39.

String palavras [ )

40.

for

Integer .parseint ( entrada. readLine ( )

(int i = O ;

) ;

new String (qte ) ;

i < qte; i++ ) {

41.

Sys t em . ou t . print ( "Pa lavra ( " + ( i + l ) + " )

42 .

palavras [ i )

= ");

entrada . readLine ( ) . toUpperCase ( ) ;

43 .

44 .

System.out .println ( ) ;

45 .

System.out.print ( "Qual Palavra Deseja


Pesquisar? " ) ;

46.

String c = entrada. readLine ( ) ;

47 .

achou = Busca . linear ( c ,

48.

if

palavras ) ;

(achou)
System. out.println( "Palavra Presente na

49.

Relacao " ) ;
else

50.

System . o u t . println( "Palavra Nao Presente na

51.
Relacao " ) ;
52 .

ok = true;

53.

break;

54.

default :

55.

System . o u t . println( "Opcao Invalida ! " ) ;

56.

System . out .println( "Tente Novament e . " ) ;

57.

System . out. println ( ) ;

58.

ok = false;

59.

}
} while ( ! ok) ;

60.

}catch (Exception e ) {

61.

System . o u t . println ( "Ocorreu um erro durante a leitura ! " ) ;

62 .
63 .

64.
65 .

'

1 37

CAPITULO 8 - BUSCA E ORDENAAO

Nesse exemplo, que semelhante ao Exemplo 8.4, pede-se para o usurio iden
tificar o tipo de dado que deseja manipular. Dependendo da opo escolhida, aciona-se
o conjunto de instrues adequado.

8 . 2 . 2 BUSCA B I NARIA (OU BUSCA LOGARITM ICA)

O mtodo de busca linear o mais adequado quando no se tem nenhuma infor


mao a respeito da estrutura em que a busca ser realizada. Por outro lado, se o ele
mento procurado estiver entre os ltimos ou no estiver no conjunto, esse mtodo pode
r ser demasiadamente lento, pois oconero comparaes com todos os elementos de
um conjunto que pode ser muito grande - imagine a relao dos clientes de um banco!
Quando temos uma seqncia ordenada de elementos, existem outros mtodos
de busca que so muito mais adequados, pois permitem realizar uma busca por meio de
algoritmos mais eficientes, que podem utilizar um nmero menor de comparaes.
Considere uma seqncia ordenada de elementos de qualquer tipo. Em vez de se
comparar o elemento procurado ao primeiro elemento da seqncia, pode-se compar
lo a um elemento do meio da seqncia. Se o elemento comparado o desejado, a busca
termina; seno, pode-se verificar se o elemento desejado maior ou menor que o ele
mento encontrado. Como todos os elementos esto ordenados, essa verificao elimina
a metade da seqncia onde o elemento no pode estar. Por exemplo, se o eJemento
procurado for maior que o elemento encontrado, a metade inferior da lista poder ser
descartada para a prxima comparao.
A segunda comparao ser feita com o elemento do meio da seqncia que
restou e o procedimento anterior se repetir. Dessa forma, cada vez que o elemento no
for encontrado, o conjunto a ser pesquisado ser reduzido pela metade, aproximada
mente, at que o elemento seja encontrado ou at que a lista no possa mais ser dividida.
Esse mtodo foi batizado de mtodo de busca algortmica pelo fato de haver uma
reduo algortrnica de elementos a serem pesquisados, mas, como ocone essa reduo
pela metade dos elementos da busca em cada comparao, esse mtodo conhecido
como mtodo de busca binria ou busca logartmica.
Para um conjunto de 15 elementos (como ser mostrado na Figura 8.3), o mto
do de busca linear realizaria, no mlimo, uma comparao e, no mximo, 1. 5 compara
es. No caso da busca binria, no mnimo ocorreria uma comparao e, no mximo,
quatro comparaes, o que geraria um ganho considervel, mais sensvel para conjuntos
de elementos muito grandes. Considere o exemplo abaixo, que demonstra isso.
Suponha que o elemento a ser localizado seja o 329, que ser chamado de x:
5oo

1 178 1

1 487 1 158 1 47 1 35

78

329

215

19

78

158

178

214

25

214

38

77

1 passo - Ordenar o conjunto:


2

19

25

35

38

47

77

1 2 1 5 1 329 1 487 1 5oo

'

1 38

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

elemento procurado

D D D D D D D miiiJ D D D D D D D
D D D miiiJ D D D

Comparaes sucessivas so feitas entre o


elemento que se procura e o elemento no meio
da seqncia no pesquisada.
Cada no-sucesso da busca reduz a seqncia
pela metade, at que o elemento seja
encontrado ou a seqncia no possa mais ser
dividida.

D miiiJ D
D

Meio da seqncia pesquisada


I FIGURA 8.31 Busca binria

22 passo - Dividir o conjunto ao meio:


2

19

25

35

38

47

77

78

158

178

214

215

329

487

500

i
3 passo -

Efetuar a comparao para verificar se o elemento procurado igual


ao elemento central, que ser chamado de meio:
x

meio

Se o resultado for verdadeiro, a busca dever ser encerrada. Caso contrrio,


sero executados os passos seguintes. No caso do nosso exemplo:
329
78, a resposta falso .
=

4 passo - Efetuar a comparao para verificar se o elemento procurado

maior

ou menor do que o elemento central:


3 2 9 > = 7 8 , a resposta verdadeiro.
5!! passo - Proceder a uma nova diviso do conjunto que atenda condio do 4.!.!
passo, isto , se x for maior que meio, ser dividido o conjunto da direita, seno, o
conjunto da esquerda. No caso do exemplo, ser utilizado o conjunto da direita.
158

178

214

215

329

487

500

329

487

500

i
Repetir os passos 4 e 5 at que o elemento seja encontrado.

'

CAPITULO 8 - BUSCA E ORDENAAO


ExEMPLo 8 . 8 :

Busca b.inria (ou logartmica).

1.

Algoritmo Exemp l o S . 8

2.

Var

3.

sequencia

4.

x
inteiro
encontrou : logica
inicial, meio, final : nmeros inteiros

5.
6.
7.

vetor de elementos

Incio

8.

encontrou

9.

Ler (x)

f-

elemento a ser procurado

estes sero os ndices


da seqncia

.f.

Enquanto (inicial <= final) Faa

10.

meio <- ( inic ial + fina l ) I 2


Se (x
sequencia [meio) )

11.

12.

13.

encontrou <- . v .

14.

<fim da busca>
Seno

15.
16.

Se (x <= sequencia [meio] )

17.

final - meio - 1

19.

Seno
inicial <- meio + 1

20.

Fim-se

18.

Fim-se

21.

Fim-Enquanto

22.
23.

1 39

Fim.

O algoritmo de busca binria (Exemplo 8.8) , na verdade, bem simples. Consi


derando uma seqncia qualquer, o ndice do meio da seqncia dado pela diviso por
2 da soma do primeiro com o ltimo ndice do conjunto que se deseja pesquisar (linha
1 1 ) - cuidado para garantir o resultado inteiro dessa diviso, uma vez que ndices s
podem ser nmeros inteiros. Compara-se o elemento procurado ao elemento do meio da
seqncia (linha 12) e, se forem iguais, a busca encerrada (linha 14). Caso contrrio,
uma segunda comparao realizada para determinar se o elemento procurado maior
ou menor que o elemento encontrado no meio (linha 16). Se o elemento menor, signi
fica que a segunda metade da seqncia pode ser ignorada para a prxima pesquisa, e
isso pode ser alcanado alterando-se o valor do ltimo ndice do conjunto que se deseja
pesquisar para o valor inferior do meio (linha 17). Caso contrrio, isto , caso o elemen
to seja maior que o elemento encontrado, ento a primeira parte da seqncia pode ser
ignorada, alterando-se o ndice do incio da busca para o valor imediatamente superior
ao do meio (linha 19).
Isso ser repetido at que o elemento seja encontrado ou at que a seqncia no
possa mais ser dividida, o que ocorre, na prtica, quando o ndice do fim torna-se menor
que o ndice do incio. Nesse caso, o elemento no se encontra na seqncia e retoma-se
falso.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

1 40

Fluxograma:
Incio

encontrou

<-

.f.

inicial <=
final

.F.

Fim

.V.
meio <- (inicial
+ final)/2

encontrou .v.

.V.

final
meio - 1

. F.

final
meio + 1

L<EM BREsE:

Para implementar estes algoritmos, as variveis inicial e final de


vem receber algum valor!

O programa em Java para o Exemplo 8.8 segue exatamente a mesma lgica. No


comeo do algoritmo, o ndice do incio do conjunto a ser pesquisado ser o ndice do
primeiro elemento da seqncia e o ndice do fim ser o ndice do ltimo elemento da

141

CAPTULO 8 - BUSCA E ORDENAO

seqncia. Lembramos que o ndice do primeiro elemento de um vetor, em Java, O e,


portanto, o ltimo elemento ter ndice igual quantidade de elementos do vetor me
nos um.
Java:
1.

c1ass BuscaBinaria{
public static boolean binaria ( int x,

2.
3.

int inicio = O ,

4.

int meio;

5.

\'lhile ( inicio <= fim)

fim = numeros . length-1;

{
I 2;

6.

meio = ( inicio + fim)

7.
8.

if ( x == numero s [ meio ) )
return true;

9.

if

(x < numeros [meio) )

10.

fim

11.

meio - 1 ;

e1se

12 .

inicio

13.

14.

return fa1se;

15.

16.

int numeros [ ) ) {

meio + 1 ;

}
}

Esse programa apresenta apenas a criao de um mtodo para busca de nmeros


jnteiros. Seguindo-se as mesmas consideraes de comparaes dadas anteriormente,
pode-se modificar ou ampliar essa classe para fazer pesquisa por meio do mtodo de
busca binria para outro tipo qualquer ou para strings.

8.3

EXERCICIOS PARA FIXAAO


Para os problemas abaixo, faa o pseudocdigo, o fluxograma e o programa em

Java.
1 . Crie uma matriz com 20 nmeros inteiros que devero ser fornecidos aleato
riamente pelo usurio e:
a) coloque os elementos na ordem crescente;
b) coloque os elementos na ordem decrescente.
2. Crie uma matriz com nomes e ordene-a.

3. Elabore uma matriz com as seguintes informaes, que devero ser forneci
das pelo usurio: nome, sexo e idade, e:
a) ordene os elementos;
b) crie uma rotina para procurar um nome fornecido pelo usurio.
4. Reescreva o Exemplo 8.6 acrescentando outros mtodos de busca linear para
os demais tipos primitivos.

- E ESTRUTURAS DE DADOS
LOGICA D E PROGRAMAAO
'

1 42

5. Reescreva o Exemplo 8.7 modificando o programa para que possua um menu


de opes para entrada de dados (incluindo escolha de tipo), ordenao e
busca.
6. Dada uma matriz A com N elementos do tipo real, elaborar um algoritmo que
possibilite a busca binria de um valor qualquer fornecido pelo usurio.
7. Uma matriz X composta pelos elementos do alfabeto e pelos numerais de O
a 9. Escreva um algoritmo que seja capaz de localizar, pelo mtodo binrio,
um caractere fornecido pelo usurio. Se esse caractere for uma letra o usu
rio poder fornec-la no formato maisculo ou minsculo.
8. Dada uma tabela de horrios de nibus que fazem viagens para as diversas
cidades do Estado de So Paulo, escreva um algoritmo que possibilite a l.oca
lizao dos horrios de sada e de chegada quando se fornea o destino.

8.4

EXERCICIOS CO M P L E M E N TA R E S
1 . Elabore uma matriz que armazene dados de 30 funcionrios de uma empre
sa. Devero ser considerados os campos: cdigo funcional, nome, salrio e
data de admisso.
a) Preencha a matriz com dados fornecidos pelo usurio.
b) Ordene os elementos pelo campo cdigo funcional.
c) Crie uma rotina para encontrar os dados de um funcionrio pelo mtodo
binrio.
2. Elabore uma matriz com trs linhas e 20 colunas, que dever ser preenchida
com elementos sorteados aleatoriamente (utilize o mtodo random), e:
a) faa a busca, pelo mtodo binrio, de um elemento sorteado;
b) faa a busca, pelo mtodo seqencial, de um elemento so1teado.

PIT

UL

ACESSO A ARQUIVOS

Acesso a arquivos texto


Operaes de manipulao
Exemplos e exerccios

OBJETIVOS:

Trabalhar as tcnicas para representao da criao


e manipulao de arquivos texto, depois implemen
tar esses algoritmos utilizando a ferramenta Java.

t agora, todos os exemplos apresentados armazenavam as informaes tempo


rariamente na memria RAM do computador. Esse recurso bastante utilizado
durante a fase de aprendizado e tambm quando se est desenvolvendo o algoritmo para
a resoluo de um problema sem que haja, ainda, a preocupao com recursos de imple
mentao como armazenamento de dados, interface e esttica, entre outros.
As informaes podem ser armazenadas em arquivos ou bancos de dados. Am
bos so conjuntos de informaes armazenadas em um meio magntico. A principal
diferena entre eles est relacionada com a organizao do armazenamento, o acesso e
a recuperao dos dados. Os arquivos podem ser facilmente criados utilizando-se os
recursos disponveis no sistema operacional do computador, ao passo que, para a cria
o de um banco de dados, necessrio um software especfico.

'

1 44

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Neste livro, sero abordados apenas os arquivos, pois, para que fosse feita uma
abordagem satisfatria acerca do armazenamento em bancos de dados, seria necessrio
o estudo dos conceitos de bancos de dados e das ferramentas para sua criao e geren
ciamento.
NOTA:

Sistema operacional: software que responsvel pelo gerenciamento


do hardware e do software da mquina, alm de realizar a interface
entre o usurio e o hardware.
/

9. 1

0 Q U E E U M ARQUIVO?

Um arquivo um local reservado para se guardar informaes escritas. Um bom


exemplo so os arquivos de ao utilizados para armazenar fichas contendo dados de
clientes, produtos e pacientes, entre outros.
O arquivo de computador uma maneira de armazenar informaes em meios
magnticos, como por exemplo discos rgidos, discos flexveis e CD-ROM, entre ou
tros. Esses dados podem ser utilizados diversas vezes pelos programas associados ao
.
arqutvo.
Os arquivos podem armazenar imagens, textos ou sons. A ttulo de exemplo, ser
demonstrado como armazenar informaes-texto.

9.2

ARQUIVO-TEXTO

As informaes de um arquivo-texto so organizadas em registros. Os registros,


por sua vez, so organizados em campos e nos campos que so 'inseridas' as informa
es. Suponha que, no exemplo abaixo, a Figura I represente a interface e a Figura 2
represente o arquivo-texto:

Nome:

__
__
__
__
__
__
__
__
__

Endereo:
CEP:

-------

____

I FIGURA

TeI.:

9.1

----

I Interface

Nome
Joo Ningum
Maria Bonita
Jos Filho Jr.

Endereo
Rua do Bosque, 1 0
Rua da Gruta, 247
Av. Sul, 3.196

CEP
08000102
09009904
07989991

Tel.
67867766
31237788
78966998

I FIGURA 9.21 Arquivo-texto

Na interface, so representados os nomes dos campos, que devem ser legveis


para o usurio, isto , o usurio deve ler e entender o que dever ser digitado
nos espaos reservados para as informaes.

Na interface tambm deve existir um espao para que o usurio faa a entrada
dos dados, isto , o local no qual sero digitadas ou selecionadas as informaoes.
-

No programa, deve existir uma varivel para cada informao que ser digitada
na interface.

'

1 45

CAPITULO 9 - ACESSO A ARQUIVOS

No arquivo, deve existir um campo para cada varivel cuja informao deve
ser armazenada.
Nome:

J,

__
__
__
__
__
__
__
__
__
__
__
__
__

Nome
do campo

J,

Espao reservado
para a entrada de dados

No arquivo, cada linha representa um registro. Um registro um conjunto de


campos, isto , um conjunto de informaes sobre um detem1inado assunto. Cada cam
po recebe dados que so armazenados no arquivo por meio da associao da varivel da
interface com o campo do arquivo.
NOTA:

Os tipos de dados das variveis e campos so os mesmos estudados no


Captulo 3.
Os registros so estruturas de dados compostos por um conjunto de
campos definidos.

Campos
Vl

...
....
Vl
-

0"1

CC

Nome

Endereo

CEP

TeI.

Joo Ningum \

Rua do Bosque, 10

08000102

67867766

Maria Bonita

Rua da Gruta, 247

09009904

31237788

07989991

78966998

Jos Jr. Fi I ho

\
\

\,

Av. Sul, 3.196

Dados

9.3

'

TI POS DE ARQU IVO QUANTO AS FORMAS


D E ACESSO

Os arquivos-texto podem ser diferenciados quanto forma de acesso aos dados:


arquivos de acesso seqencial e arquivos de acesso aleatrio ou randmico.
9.3. 1

ARQUIVOS S E Q E NCIAIS

Os arquivos seqenciais armazenam informaes em formato ASCII e as infor


maes so armazenadas na ordem em que so digitadas. Os arquivos seqenciais apre
sentam alguns inconvenientes:
As informaes so lidas na mesma ordem em que foram inseridas, isto , em
sequencta.

"'

'

E necessrio que o arquivo todo seja percorrido at que a informao seja


localizada.
As informaes no podem ser alteradas diretamente no arquivo. Para se alte
rar algum dado, necessrio copiar para um novo arquivo todas as informa
es do arquivo anterior, j com as alteraes.

- E ESTRUTURAS DE DADOS
LOGICA D E PROGRAMAAO
'

1 46

Esse tipo de arquivo no recomendado para trabalhos com grande volume


de i_nformaes, pois lento.

No possvel abri-lo para leitura e escrita.


ASCII -American Standard Code for lnformation lnterchange, que sig
nifica Cdigo Padronizado Americano para Intercmbio de Informa
es. A tabela ASCII possui 256 combinaes de 8 bits, que represen
tam caracteres.

NOTA:

9.3.2

'

ARQUIVOS D E ACESSO ALEATOR I O

Os arquivos de acesso aleatrio ou randmico tambm armazenam as informa


es em formato ASCII. Cada registro armazenado em uma posio especfica. Com
isso, as informaes podem ser lidas independentemente da ordem em que foram inse
ridas.

9.4

'"'

'"'

O P E RAOE S D E M A N I P U LAAO DE ARQU IVOS

As informaes dos arquivos, por estarem armazenadas em um dispositivo fsi


co, podem ser manipuladas, isto , o arquivo pode ser atualizado ou simplesmente con
sultado.
Para a manipulao dos arquivos, existem quatro operaes bsicas que podem
ser realizadas:
Insero de dados: trata-se da incluso de novos registros.

Consulta aos dados: trata-se da leitura dos dados j armazenados.

Alterao dos dados: trata-se da possibilidade da alterar de um ou mais cam


pos do conjunto.

Excluso de dados: trata-se da eliminao de registros.

9. 4 . 1

R E P R E S E NTAAO DA MAN I P U LAAO DE ARQUIVOS

SEQU ENCIAIS

Para que seja possvel manipular arquivos seqenciais, ser necessrio:


Declarar o registro e o arquivo.

Declarar as variveis de arquivo e registro.

Abrir o arquivo.

Fechar o arquivo.

Esses passos so utilizados para qualquer operao de manipulao de arquivos


e sero explicados a seguir, no Exemplo 9.1 - Operao de incluso.
Operao de incluso - arquivo seqencial

1 47

CAPTULO 9 - ACESSO A ARQUIVOS


EXEMPLo 9 . 1 :

Construo de uma agenda que armazene nomes, endereos e telefones.

Pseudocdigo:
1.

Algori tmo Exemplo_9 . 1

2.

Var

3.

Tipo reg_agenda

registro

4.

Nome : caracter

5.

End: caracter

6.

Tel: caracter

7.

Fim_registro

8.

Tipo arq_agenda : arquivo seqencial de reg_agenda

9.

Auxiliar: reg_agenda

10.

Agenda : arq_agenda

11.

Inicio

12 .

Abrir (Agenda)

13 .

Repita

14.

Avanar (Agenda)

15.

At EOF (Agenda )

16.

Ler

17.
18.

Armazenar (Agenda , Auxi liar)

19.

(Auxiliar. Nome , Auxiliar.End, Auxiliar .Tel)

Fechar (Agenda }
Fim.

NOTA:

EOF - end of file (fim de arquivo).

Nos algoritmos, deve-se, primeiramente, declarar uma estrutura do tipo registro,


conforme aprendido no Captulo 6, com todos os campos cujas informaes pretende-se
armazenar, como no trecho das linhas 3 a 7 do Exemplo 9. 1 :
Tipo reg_agenda

registro
Nome : caracter
End: caracter
Tel: caracter
Fim_registro

'

E necessrio tambm declarar um identificador do tipo arquivo, mencionando o


tipo de arquivo que ser utilizado. Esse identificador associado ao arquivo que ser
formado pelos registros de reg_agenda.
As variveis Auxiliar e Agenda so variveis de registro e de arquivo, res
pectivamente.
Para que seja possvel a manipulao do arquivo, esse deve ser aberto:
Abrir (nome da varivel de arquivo)

Ser disponibilizado o primeiro registro armazenado. Para acessar os prximos


registros, utiliza-se a instruo:
Avanar (nome da varivel de arquivo)

'

1 48

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

No caso de se desejar que o arquivo seja posicionado no ltimo registro, utiliza-se


uma estrutura de repetio que provoque o avano pelos registros at o final do arquivo:
Repita
Avanar (nome da varivel de arquivo)

At EOF (nome da varivel de arquivo)


NOTA:

Por se tratar de um arquivo seqencial, para se chegar ao ltimo regis


tro, percorre-se o arquivo todo, passando por todos os registros arma
zenados, como, por exemplo, em uma fita cassete.

Para processar a incluso de um registro, necessrio que seus campos sejam


preenchidos na mesma ordem e com os mesmos campos do arquivo. Por isso, a varivel
de registro declarada com o tipo da estrutura declarada para o registro do arquivo. No
caso do Exemplo 9 . 1 :
Declarao da estrutura de dados do tipo registro:

Var Tipo reg_agenda

registro
Nome : caracter
End : caracter
Tel: caracter

Fim_registro

Declarao da varivel do tipo registro, que ter o mesmo formato da estrutu


ra de dados criada para o registro, isto , Auxiliar . Nome, Auxi liar . End,
Auxil iar . Tel :
Auxiliar: reg_agenda

Preenchimento dos campos:


Ler

(Auxiliar. Nome, Auxiliar.End, Auxi liar.Tel)

Depois de representar o preenchimento dos campos, ser necessrio representar


o armazenamento do contedo no arquivo. Para isso utiliza-se a instruo:
Armazenar (nome da varivel de arquivo, nome da varivel de registro)
Armazenar (Agenda , Auxiliar)

A varivel de arquivo Agenda receber o contedo da varivel de registro Au


xiliar.
Por ltimo, o arquivo deve ser fechado:
Fechar (nome da varivel de arquivo)

'

1 49

CAPITULO 9 - ACESSO A ARQUIVOS

Fluxograma:

/
("

Incio

'

Abrir(Agenda)
...

'

Avanar
(Agenda)

'
.F.

EOF(Agenda)
.v.

'

auxiliar.nome
auxi liar.end
auxiliar.tel

'

Armazenar
(Agenda,
Auxiliar)

'
Fechar(Agenda)

("

'
Fim

Java:
1.

2.
3.
4.

class regAgenda {
private String nome ;
private String end ;
private String tel;

5.
6.

public regAgenda ( String nom,

7.

nome = nom;

8.

end - ender ;
tel = tele f ;

9.
10.
11.

}
public String mostraNome ( ) {

String ender,

String telef ) {

- E ESTRUTURAS DE DADOS
LOGICA D E PROGRAMAAO
'

1 50

12 .
13 .
14.
15.
16.
17 .
18.
19 .
20.

return nome ;

publi String mostraEnd ( ) {

return end ;
)

publi String mostraTel ( ) {


return tel;
)

Para representar uma estntntra do tipo registro em Java, utilizou-se uma classe
regAgenda que possui como atributos: nome, end e tel, conforme trecho de cdigo
acima. Essa forma de representao necessria, uma vez que o Java trabalha com
objetos, conforme citado no Captulo 4. Assim, cada entrada em regAgenda corres
ponde a um novo registro e refere-se a um novo objeto da classe regAgenda, que
possui caractersticas prprias, ou seja, um nome, um endereo e um telefone que o
distinguem dos demais objetos existentes.
A declarao da classe correspondente ao registro feita nas linhas de I a 4. Nas
linhas de 6 a 9 definido o mtodo construtor, responsvel pela instanciao de novos
objetos da classe ou, para o nosso caso, de novas entradas de registro em regAgenda.
Para exibir os atributos de cada novo objeto instanciado, criaram-se os mtodos
mostraNome ( ) , mostraEnd ( ) emostraTel ( ) , que retomamos respectivos dados.
O algoritmo codificado em Java relativo ao Exemplo 9.1 e que utiliza a classe
regAgenda para definio das entradas de novos registros na agenda apresentado a
.
segu1r.
CUIDADO!

1.
2.
3.

4.

Java uma linguagem case-sensitive. As referncias s variveis e m


todos elevem ser feitas exatamente ela forma que estes foram e/ec/ara
elos, consicleranclo as letras maisculas e minsculas.

import j ava . io . * ;
class Exemplo91{
publi static void main ( Str ing [ ] args) {
try{

5.

BufferedReader entrada;

6.

entrada = new BufferedReader (new InputStreamReader


(System. in) ) ;

7.
8.

Buf feredli>Tr i ter saida;


saida = new BufferedWriter (new FileWriter
( "Agenda . txt " ,

9.

10.
11.
12 .
13.

true) ) ;

System . ou t . println ( "Digite o nome " ) ;


String Nome = entrada . readLine ( ) ;
System .out .println ( "Digite o endereo " ) ;
String Endereo = entrada . readLine ( ) ;

Sys tem. out. println ( "Digite o telefone" ) ;

151

CAPTULO 9 - ACESSO A ARQUIVOS

14.

String Telefone = entrada . readLine ( ) ;

15.

regAgenda regAgl

new regAgenda (Nome , Endereco,

Telefone ) ;
16.

saida.write (regAgl.mostraNome ( ) + " \ t " ) ;

17.
18.

saida.write ( regAg l . mo straEnd ( ) + " \ t" ) ;


saida .write ( regAg l . mo straTel ( ) + "\n" ) ;

19.

saida. flush ( ) ;

20.

saida . close ( )

21.

} catch (Exception e) {

22 .

System. out.println ( "Erro de gravacao" ) ;

23.

24.
25.

Para ler a entrada dos dados via teclado, declarou-se uma varivel entrada,
que um continer que recebe os caracteres de entrada digitados via teclado (linhas 5 e
6). Seguindo a mesma filosofia da entrada de dados, utilizam-se classes (e objetos) de
apoio definidos na linguagem Java para trabalhar o acesso e gravao de arquivos.
Nas linhas 7 e 8 est a declarao da varivel (objeto) que ser o continer do
arquivo. Essa declarao muito semelhante declarao das variveis que recebero a
entrada de dados, mas, em vez de se utilizar um objeto do tipo Inpu ts treamReader,
que define uma entrada de caracteres, utiliza-se um objeto do tipo F i l eWri ter (linha
8), que define uma sada para o arquivo Agenda . txt. Um detalhe patticular deve ser
observado nessa declarao: na linha 8, quando se define o nome do arquivo destinado
ao armazenamento dos dados, no trecho Fi leWr i ter ( "Agenda . txt
true) ,
tem-se, na verdade, uma chamada de um mtodo com passagem dos parmetros
"Agenda . txt e true. O primeiro o nome do arquivo, conforme j foi dito, e o
segundo significa que o arquivo ser acessado com a condio append = true, ou
seja, os dados gravados sero sempre inseridos ao final do arquivo. Vale ressaltar ainda
que, caso o arquivo no exista, ele ser criado automaticamente.
O processo de entrada dos dados executado a pattir das instrues das linhas 9
a 14, segundo as quais os caracteres lidos a partir do teclado sero transferidos para as
respectivas variveis de armazenamento: Nome, Enderece e Telefone.
Na linha 15, ocorre a chamada do mtodo construtor da classe, regAgenda,
com a respectiva passagem dos parmetros Nome, Enderece e Telefone, instan
ciando-se um novo objeto regAgl da classe regAgenda. No trecho de cdigo ante
rior (classe regAgenda), pode-se verificar a declarao do mtodo nas linhas 6 a 9.
A sada dos dados feita por meio do cdigo nas linhas 1 6 a 18, com a chamada
dos mtodos que retornam os atributos do novo objeto criado. Por exemplo, em
11

11

saida . write

(regAg l . mos traNome ( )

+ " \ t" ) ,

temos a chamada do mtodo que retoma o atributo nome do objeto regAgl e a trans
ferncia do resultado para a sada. O atributo " \ t 11 associado ao nome indica que, aps
o dado, ser gravado tambm um espao de tabulao como separador.

1 52

LGICA D E PROGRAMAO E ESTRUTURAS DE DADOS

Ao final da transferncia do ltimo dado, tambm passado o caractere de con


trole " \n" (nova linha), utilizado como separador, indicando o final do registro. O
motivo da utilizao desses separadores ser visto nos exemplos posteriores.
Nas linhas 1 9 e 20, so chamados os mtodos s a i da . f 1 u s h ( ) e
sai da. close ( ) , que fazem a transferncia definitiva dos dados da memria para o
arquivo e o fechamento do arquivo, respectivamente.
NOTA:

Pode-se perguntar por que os dados obtidos da entrada via teclado no


so transferidos diretamente para o arquivo, uma vez que eles estariam
disponveis sem a necessidade de instanciar um objeto da classe

regAgenda. O motivo a necessidade de satisfazer os princpios da


orientao a objetos, segundo os quais cada novo dado ou registro
um objeto e assim deve ser tratado. Como ser visto posteriormente, a
manipulao dos atributos dos objetos deve seguir esses princpios,
garantindo-se que alteraes nesses atributos somente podero ser fei
tas mediante a chamada de mtodos, que permitiro ou no as altera
es. Os atributos de um objeto definem sua estrutura, e as operaes,
seu comportamento. Os mtodos implementam essas operaes que
permitem alteraes nos objetos e na sua estrutura, preservando sua
integridade (princpio do encapsulamento discutido no Captulo 4).

Operao de consulta - arquivo seqencial


A operao de consulta pode ser realizada de duas maneiras:
saltando manualmente de um registro para o outro: nesse caso, o usurio
visualizar todos os registros at que se chegue ao registro desejado;

NoTA:

saltando automaticamente para o registro desejado: nesse caso, utiliza-se uma


varivel que recebe a informao a ser encontrada no arquivo e, por meio de
uma estrutura de repetio, provocado o avano pelos registros at que seja
encontrado o registro desejado.
Quando se trabalha com arquivos seqenciais, em ambos os casos to
dos os registros so percorridos at que se chegue ao registro desejado.

No exemplo a seguir, ser utilizado o recurso de consulta automtica. Para isso,


ser declarada a varivel Buscar, que receber o nome a ser consultado.
E>tEMPLo 9.2:

Busca seqencial

1.

Algoritmo Exemplo_9 . 2

2.

Var tipo reg_agenda

em arquivo.

registro

3.

Nome : caracter

4.

End:

5.
6.

Tel: caracter

caracter

Fim_registro

'

CAPITULO 9 - ACESSO A ARQUIVOS

7.

Tipo arq_agenda : arquivo seqencial de agenda

8.

Auxiliar: reg_agenda

9.

Agenda :

arq_agenda

Buscar: caracter

10.
11.

Inicio

12.

Abrir (Agenda}

13.

Ler(Buscar}

14.

Repita
Avanar (Agenda}

15.
16.

At

17.

Se (Auxiliar. Nome = Buscar} Ento

(Auxiliar .Nome = Buscar} ou (EOF (Agenda ) )


Mostrar (Auxiliar.End, Auxi liar.Tel}

18.

Seno

19.

20.

Mostrar ( "No cadastrado " }

21.

Fim-Se

22 .

Fechar (Agenda )

23.

1 53

Fim.

Nesse exemplo, foi utilizada a varivel Buscar, que recebeu o nome a ser con
sultado. A estrutura de repetio Repita provoca o avano pelos registros do arquivo
at que se encontre o nome desejado ou o final do arquivo. Se tivermos sucesso na
consulta, isto , se o nome desejado for encontrado, ento o programa exibir o endere
o e o telefone.

'

1 54

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

Fluxograma:
In cio

Abrir(Agenda)

Buscar

Avanar
(Agenda)

.F.

Auxl iar.nome
= Buscar ou

Auxiliar.nome
= Buscar
.F.

"No
cadastrado"

Fechar(Agenda)

Fim

Auxiliar.end,
Auxiliar.tel

'

CAPITULO 9 - ACESSO A ARQUIVOS

1 55

Java:
1.

import java. i o . * ;

2.
3.
4.

class Exemplo 9 2 {
public static void main( String [ ) args) {
try{

5.

BufferedReader entrada;

6.

entrada = new BufferedReader (new InputStrearnReader

7.
8.
9.
10.

( System. in) ) ;
BufferedReader arqentrada;
arqentrada = new BufferedReader (new FileReader
( "Agenda . tx t" ) ) ;
System . o u t . println ( "Digite o nome" ) ;
Str ing Nome = entrada. readLine ( ) ;

11.

StringBuffer memoria = new StringBuffer ( ) ;

12.
13.
14.
15.
16.

String linha;
while ( ( linha = arqentrada . readLine ( ) )
memoria. append ( l inha + "\n" ) ;

17.

inicio = memoria. indexOf (Nome ) ;

18.

i f ( inicio ! = - 1 ) {

! = null) {

int inicio = - 1 ;

19.
20.
21.
22.
23.
24.
25 .

int fim = memoria. indexOf ( " \n" , inicio ) ;


char [ ] destino = new char [fim - inicio ] ;
memoria. getChars (inicio, fim, destino, 0 ) ;
linha = " " ;
for ( int i = O ; i < fim - inicio; i++ ) {

26.

System . o u t . println ( l inha) ;


}else{
System.out .println ( " I tem nao encontrado" ) ;

linha += destino [ i ) ;

27.
28.
29.

30.

entrada .close ( ) ;
} catch (Fi leNotFoundExc eption erro) {

31.

32.
33.
34.
35.
36.
37.

System . o u t . println ( "Arquivo nao encontrado ! " ) ;

} catch (Exception erro ) {


System.out. println ( "Erro de Leitura ! " ) ;
}
}
}

Na implementao desse exemplo, cria-se uma estrutura chamada memoria,


que uma varivel de memria do tipo StringBuffer. Em Java, esse tipo de vari
vel semelhante ao tipo String, mas permite uma estrutura de trabalho mais avana
da como, por exemplo, append, que adiciona um novo contedo ao contedo j exis
tente, sem perda de dados.

'

1 56

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

A linha 1 3 define a condicional de uma estrutura de armazenamento de dados


que se repetir enquanto houver dados a serem tidos, isto , ler todos os dados at o fim
do arquivo. Essa condicional equivalente determinao de EOF (end offile).
A busca feita na varivel memoria, com o mtodo indexOf, que recebe
Nome como parmetro, dado obtido pela entrada de dados via teclado na linha 1 O. Esse
mtodo retoma a posio onde se inicia o caractere pesquisado. As posies so nume
radas a partir de O, significando que o teste de condio na linha 1 8 verifica se o valor
atribudo inicialmente varivel inicio foi alterado. Em caso afirmativo, ou seja, se
inicio diferente de - 1 , executam-se os comandos internos do lao.
Para que seja possvel obter a seqncia de caracteres correspondentes ao regis
tro completo, necessrio determinar o seu final. Isso feito por meio do comando na
linha 19, que busca o caractere " \n" (nova linha) imediatamente aps o primeiro
caractere encontrado. importante observar que o mtodo indexO f chamado nova
mente, porm, dessa vez, so passados dois parmetros: " \n" e inicio, para que a
nova busca ocona a partir da posio em que foi encontrado o primeiro caractere do
item pesquisado.
Na linha 2 1 , utiliza-se o mtodo getChars para se obter os caracteres corres
pondentes ao registro, passando-se os parmetros inicio e fim como delimitadores.
A string obtida armazenada na prpria varivel l inha, que ser utilizada para exibi
o dos dados (linha 26).
Foram feitos dois tratamentos de erro nas linhas 3 1 e 33, para determinar proble
mas quando o arquivo no for encontrado ou quando ocorrerem outros enos genricos,
respectivamente.
EXEMPLo 9.3:
1.

Operao de alterao- arquivo seqencial.

Algoritmo Exemplo_9 . 3
Var tipo reg_agenda

registro

3.

Nome : caracter

4.

End: caracter

5.

Tel: caracter
Fim_registro

6.
7 .

Tipo arq_agenda : arquivo seqencial de agenda

8.

Auxiliar: reg_agenda

9.

Agenda :

arq_agenda

10.

Buscar: caracter

11.
12 .

Novo_end : caracter

13 .

Novo_tel : caracter
Inicio

14 .

Abrir {Agenda)

15.

Ler (Buscar)

16.

Copiar (Agenda, Auxiliar)

17 .

Enquanto (Auxiliar.Nome <> Buscar)

18.

Avanar (Agenda)

e (No EOF(Agenda) ) Faa

'

1 57

CAPITULO 9 - ACESSO A ARQUIVOS


19.
20.
21.

Copiar {Agenda , Auxiliar)


Fim-Enquanto
Se (Auxiliar . Nome

22 .

Buscar) Ento

Incio

25 .

Mostrar (Auxi liar . End, Auxiliar.Tel)


Mostrar ( "Novo endereo: " ) Ler (Novo_end)
Auxi 1 iar. end Novo_end

26.

Mostrar ( "Novo telefone: " ) Ler (Novo tel)

27.

Auxiliar .tel Novo_tel

28.

Armazenar (Agenda , Auxiliar)

23 .
24 .

Fim

29.

32.

Seno
Mostrar ( "No cadastrado" )
Fim Se

33.

Fechar (Agenda)

30.
31.

34.

Fim.

No Algoritmo 9.3 feita uma consulta similar do Algoritmo 9.2. Se o registro


for encontrado, recomendado que seja exibido antes da alterao. Para a alterao,
devem-se declarar as variveis que recebero os novos valores, preencher os novos va
lores e depois atribuir esses valores s variveis de registro:
Mostrar ( "Novo endereo :
Auxi liar . end

Novo_end

" ) ; Ler {Novo_end)

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

1 58

Fluxograma:
Incio

Auxiliar.nome
= Busca

Abrir(Agenda)

.F.

"No
cadastrado"

Novo_tel

.V.
Auxiliar.end,
Auxiliar.tel

Buscar

Copiar
(Agenda,
Auxiliar)

Auxiliar.nome
<> Buscar e No
EOF(Agenda)

"Novo
endereo: "

Armazenar
(Agenda,
Auxiliar)

Novo_end
>-A

.V.

C>.
o

Auxiliar.tel f
Novo_tel

Fechar(Agenda)
Auxiliar.end f
Novo_end

Avance
(Agenda)

Fim

"Novo
telefone"
Copie(Agenda,
Auxiliar)

Java:
1.

public class regAgenda {

2.

private String nome ;

3.

private String end;

4.

private String tel;

S.
6.

7.
8.

public regAgenda (String nom, String ender, String telef ) {


nome = nom;
end - ender;
tel
telef;

9.
10.

}
public String mostraNome ( ) {

11.
12 .
13.

return nome ;
}

'

CAPITULO 9 - ACESSO A ARQUIVOS

1 59

pub1ic String mostraEnd ( ) {

14.
15.

return end;

16.

17.

public String mostraTel ( ) {

return tel;

18.

19.
21.

public void al teraEnd ( Str ing novoEnd) {


end = novoEnd;

22.

23.

public void alteraTel

20.

tel = novoTel;

24.
25.
26.

( String novoTel ) {

A classe regAgenda sofreu alteraes para suportar as novas necessidades


do algoritmo. Foram includos os mtodos al teraEnd e al teraTel (linhas 20 a
25) para que os objetos permitam alteraes no endereo e no nmero do telefone.
Assim, para que seja possvel a alterao desses atributos, necessrio invocar (ou
chamar) esses mtodos, como ser feito no trecho de cdigo a seguir.
1.
2.
3.

4.
5.

import java. i o . * ;
class Exemplo 9 3 {
static StringBuffer memoria = new StringBuffer ( ) ;
public static void main ( String [ ) args ) {
try{

6.

BufferedReader entrada;

7.

entrada = new BufferedReader (new InputStreamReader


( System. in) ) ;

8.
9.
10.

BufferedReader arqentrada;
arqentrada = new BufferedReader (new FileReader
( "Agenda . tx t " ) ) ;
System . o u t . println ( "Digite o nome" ) ;

11.

String Nome = entrada. readLine ( ) ;

12 .

String Endereco = " " ;

13.

S tring Telefone = " " ;

14.
16.

String linha = " " ;


while ( ( linha = arqentrada . readLine ( ) )
memoria. append ( l inha + "\n" ) ;

17.

18.

int inicio = - 1 ;

19.

inicio = memoria. indexOf (Nome ) ;

20.

if ( inic io ! = -1) {

15.

! = nulll {

24.

int ultimo = memoria. indexOf ( " \ t " , inicio ) ;


Nome = Ler (inicio, ultimo ) ;
int primeiro = ul timo + 1 ;
ultimo = memoria. indexOf ( " \ t " , primeiro) ;

25.

Enderece = Ler (primeiro, ultimo) ;

21.
22.
23.

'

1 60

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

26.

primeiro

27 .

int fim = memoria. indexOf

28.

Telefone = Ler (primeiro, fim) ;

29.

regAgenda regAgl = new regAgenda (Nome, Enderece,

ultimo + 1 ;
( " \n" , primeiro) ;

Telefone ) ;
30.

System . o u t . println ( "Enderece: " +


regAg l . mostraEnd ( ) +

31.

"Telefone : " + regAgl .mostraTel

()) ;

32 .

System. out. println ( "Entre com novo enderece" ) ;

33.

Enderece = entrada. readLine ( ) ;

34.

regAg l . a l teraEnd (Enderece ) ;

35.
37 .

System . o u t . println ( "Entre com novo telefone" ) ;


Telefone = entrada. readLine ( ) ;
regAgl.alteraTel (Telefone ) ;

38.

memoria. replace (inicio,

36.

fim, regAgl.mos traNome ( ) +

"\t" +
regAgl .mostraEnd ( ) + " \ t " + regAgl.mostraTel

39.
40.

gravar ( ) ;

41.

arqentrada. close ( ) ;

}else{
System . o u t . println ( " Item nao encontrado" ) ;

42.
43 .
44 .

}
arqentrada .close ( )

45.

} catch (Fi leNotFoundException erro ) {

46.

System.out .println ( "Arquivo nao encontrado ! " ) ;

47.

} catch (Exception erro ) {


System . ou t . println ( "Erro de Leitura ! " ) ;
}

48.
49.
50.
51.
52 .

}
public static String ler (int primeiro,

53.

String dados = " " ;

54.

char ( ]

55.

memoria. ge tChar s

int ultimo ) {

destino = new char [ultimo - primeiro] ;

(primeiro, ultimo, destino, 0 ) ;


O ; i < destino. length; i++) {
for (int i
dados += destino [ i ] ;
=

56.
57 .
58.

}
return dados;

59.
60.

61.

public static void gravar ( ) {


try{
BufferedWriter sada;
s aida
new Bufferedlr-Jri ter (new Filelr-Jri ter

62.
63 .
64.

( "Agenda . txt " ) ) ;


65.
66.
67.
68.
69.

saida . write (memoria. toString ( ) ) ;


saida. flush ( ) ;
saida .close ( ) ;
} catch (Exception erro) {
System . out . pri ntln ( "Erro de gravacao ! " ) ;

());

CAPTULO 9 - ACESSO A ARQUIVOS


7o .

71.
72.

161

}
}
}

ATENO!

Observe que, para a execuo do programa do Exemplo 9.3, o arquivo


Agenda . txt dever< conter pelo menos um registro de entrada. Por
tanto, necessrio execulr o programa do Exemplo 9. 1 para a inclu
s,'io dos registros desejados.

Os mesmos recursos de entrada de dados e busca em arquivo do Exemplo 9.2


foram utilizados. Porm, para obtermos os dados dos diversos campos separadamente,
buscamos " \ t (tabulao) aps a busca para localizar a primeira posio do nome e
assim obter os caracteres correspondentes somente ao nome. Por exemplo, suponha
que fosse includo o seguinte registro:
11

Gilberto da Silva

Rua A n 203 apto 102

25834911

Para obtermos somente o campo nome (Gilberto da Silva), efetuamos a busca


passando para o mtodo indexO f os parmetros " \ t e inicio, que correspondem
respectivamente tabulao e posio em que foi encontrado o primeiro caractere do
nome (varivel inicio). Para obtermos os caracteres referentes ao campo nome, uti
lizamos o mtodo ler, fornecendo como parmetros as posies de inicio e ul ti
mo, correspondentes ao primeiro e ao ltimo caracteres do nome.
Observe tambm que foram includas as variveis primeiro e ultimo em
relao ao Exemplo 9.2. Essas variveis cumprem o papel de obter as posies de incio
e fim de cada campo, visto que precisamos preservar o valor das variveis inicio e
fim, conforme explicaremos a seguir.
As variveis inicio e fim se prestam a guardar as posies de inicio e fjm do
registro e foram utilizadas para invocar o mtodo replace na linha 38, que faz a
atualizao elo continer elos dados que esto na memria. Para tanto, necessrio iden
tificar corretamente as posies e os dados que sero substitudos. Note que os parme
tros passados para o mtodo so: inicio, fim e uma string composta pela concatenao
regAgl .mostraNome ( ) + " \ t " + regAg l . mostraEnd ( ) + " \ t " +
regAgl .mostraTel ( ) . Usando o exemplo citado acima e supondo que o endere
o de Gilberto da Silva fosse alterado para Rua Alfazema n 203 apto 1 02, a string resul
tante que seria passada para atualizao seria:
11

Gilberto da Silva

Rua Alfazema n 2 0 3 apto 102

25834911

O mtodo ler, implementado a partir da linha 52, tem a finalidade de obter e


retomar uma str1g de caracteres (varivel dados), correspondente s posies forne
cidas (primeiro e ult imo), de forma similar utilizada no exemplo anterior.
Tambm foi implementado um mtodo chamado gravar, cujo cdigo encon
tra-se a partir da linha 6 1 . Esse mtodo usa os mesmos princpios apresentados no Exem-

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

1 62

pio 9 . 1 . Note que ele no recebe nem retoma nenhum valor, executando a transferncia
dos dados do continer memoria para o arquivo.
EXEMPLO 9.4:

Operao de excluso - arquivo seqencial.

1.

Algoritmo exemplo_9 . 4

2.

Var tipo reg_agenda = registro


Nome : caracter
End: caracter
Tel: caracter
Fim registro

3.
4.
5.
6.

7.

Tipo arq_agenda: arquivo seqencial de agenda

8.

Auxi liar: reg_agenda

9.
10.

11.
12.

Agenda : arq_agenda
Buscar: caracter
Resposta: caracter
Inicio

13 .

Abrir (Agenda )

14.

Ler ( Buscar)

15.

Repita

16.

Copiar (Agenda , Auxiliar)


Avanar(Agenda )
At (Auxiliar. Nome = Buscar) ou (EOF(Agenda ) )
Se (Auxiliar . Nome = Buscar) Ento

17.
18.
19.

Incio

20.
21.

Mostrar (Auxiliar . End, Auxiliar.Tel)

22.

Mostrar ( "Deseja Excluir? (Digite S ou N) " ) Ler (resposta)

Se ( resposta = " S " ) Ento


Deletar ( agenda)
Fim-Se
Fim

23.
24.
25.
26.

Seno

27 .
28.

Mostrar ( "No cadastrado" )


Fim-Se

29.
30.

31.

Fechar (Agenda )
Fim.

Para facilitar o processo de excluso, recomendado que seja feita uma busca
automtica, conforme visto anteriormente no Algoritmo 9.2. A excluso ser feita com
a instruo Deletar (nome da varivel de arquivo).
NOTA:

Uma vez deletado, o registro no pode ser recuperado.

'

CAPITULO 9 - ACESSO A ARQUIVOS

1 63

Fluxograma:
Inicio

Abrir(Agenda)

.F.

"No
cadastrado"

Auxiliar.nome
= Buscar
v

Deletar
(Agenda)

Buscar

Auxiliar.end,
Auxiliar.tel

Copiar
(Agenda,
Auxiliar)

"Deseja
excluir? (Digite
S ou N)"
Fechar(Agenda)

Avanar
(Agenda)

.F.

Resposta
Fim

Auxiliar.nome
= Buscar ou
EOF(Agenda)

Java:
1.

import java. i o . * ;

2.

class Exemplo94 {

3.

static StringBuffer memoria

4.

public static void main(String [ ] args ) {

5.
6.
7.

new StringBuffer ( ) ;

try{
BufferedReader en trada ;

entrada = new BufferedReader (new InputStreamReader


( System. in) ) ;

8.

BufferedReader arqentrada ;

9.

arqentrada

new BufferedReader (new FileReader

( "Agenda . txt" ) ) ;
10.

System .out. println ( "Digite o nome" ) ;

11.

entrada
String linha = " " ;

12.

String Nome

eadLine ( ) ;

'

1 64

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

13 .

while ( ( linha = arqentrada . readLine ( ) )

14.

! = null)

memoria. append ( l inha + "\n" ) ;

15.

16.

int inicio = -1;

17 .

inicio = memoria. indexOf (Nome ) ;


i f (inicio ! = -1) {
int fim = memoria. indexOf ( " \n" , inicio ) ;

18.
19.
20.

linha = ler (inicio, fim) ;

21.

System . out .println ( "Deseja excluir? Digite S ou N" ) ;

22.

System.out.println (linha) ;

23.

String resp = entrada . readLine ( ) ;

24.

if (resp. equalsignoreCase ( " S " ) ) {


memoria . delete (inicio, fim + 1 ) ;

25.

System . o u t . println ( " Registro excluido . " ) ;

26.
27 .

28.

gravar ( ) ;

29.

}else{

30.
31.
32.
33.
34 .
35.

System . o u t . println ( " Item nao encontrado" ) ;


}

arqentrada .close ( ) ;
} catch (Fi leNotFoundException erro ) {
System.out.println ( " Arquivo nao encontrado ! " ) ;
} catch (Exception erro) {

36.

System . o u t . println ( " Erro de Leitura ! " ) ;

37.
38.

}
}

public static String ler ( int primeiro, int ultimo ) {


String dados = " ;

39.

40.

"

41.

char [ )

42 .

memoria. getChars

43 .

for (int i = O ;

destino = new char

[ultimo - primeiro) ;

(primeiro, ultimo, destino,


i < destino. length; i++) {

dados += destino [ i ) ;

44 .
45.

}
return dados;

46.
47 .

48 .

public static void gravar ( ) {

49.

try{

50.

BufferedWriter saida;

51.

saida

new Bufferedwriter (new Filewriter

( "Agenda . tx t " ) ) ;
52 .

saida. wri te (memoria. toString ( ) ) ;

53.

sada. flush ( )

56.

saida.close ( ) ;
} catch (Exception erro) {
System . o u t . println ( "Erro de gravacao ! " ) ;

57 .

54.
55.

58.
59.

0);

CAPTULO 9 - ACESSO A ARQUIVOS

1 65

Poucas modificaes foram necessrias em relao ao cdigo do Exemplo 9.3


para implementar a excluso de registro. Utilizou-se para tanto uma String resp
que recebe a entrada feita pelo teclado (linha 23), o que permite a interao com o
usurio, pedindo-se uma confirmao da excluso. Observe a particularidade da expres
so que aval ia a resposta. Usa-se equal s IgnoreCase, um mtodo da classe Str ing,
para verificar a condio de igualdade desconsiderando maisculas e minsculas. Atitu
de bastante salutar, pois o usurio pode no perceber a condio do teclado no momento
(Caps Lock ativado ou no) e no obter sucesso no processo. Qualquer outra tecla digitada
nesse momento invalida a excluso. A excluso ocorre no trecho de cdigo na linha 25
(excluso dos caracteres entre as posies inicio e fim + 1) somente no continer
memoria. A atualizao do arquivo ocorre somente quando chamado o mtodo gra
var. Note ainda que foi utilizado fim + 1, pois a posio fim correspondente ao
final do registro no considera o caractere \n.

9.4.2

R E P R E S E NTAAO DA MAN I P U LAAO D E ARQUIVOS


-"

D E ACESSO ALEATORIO

As informaes de um arquivo de acesso aleatrio ou randmico tm sua ordem


de insero definida por um campo denominado chave. O campo chave de um registro
no pode ter o seu contedo repetido; ele deve ser nico no arquivo para que possibilite
a identificao do registro. Por meio do campo chave, o registro pode ser localizado
diretamente, sem que haja necessidade de se percoiTerem todos os registros anteriores.
O campo chave deve ser declarado juntamente com as demais variveis que iro compor
o registro.
NOTA:

Os arquivos de acesso aleatrio ou randmico so tambm chamados


de arquivo de acesso direto.

Um arquivo de acesso aleatrio ou randmico pode ser comparado a um CD


ROM com msicas pelo qual se pode ouvir a primeira msica, depois saltar para a
dcima e voltar para a stima, sem que haja necessidade de percorrer todas as msicas
intermedirias.
Para que seja possvel a manipulao de arquivos de acesso aleatrio ou rand.
.
mtco, sera necessano:
,

Declarar o registro e o arquivo.

Declarar as variveis de arquivo e registro.

Abrir o arquivo.

Fechar o arquivo.

Esses passos so utilizados para qualquer operao de manipulao de arquivos


e j foram explicados anteriormente no Algoritmo 9.1 - operao de incluso.

'

1 66

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

No exemplo a seguir, ser feita a construo de um cadastro de clientes que


armazene cdigo do cliente, nome, telefone e e-mail.
ExEMPLo 9.5:

Operao de incluso -

1.

Algoritmo Exemplo_9 . 5

2.

Var tipo reg_cliente

arquivo de acesso direto.

registro
Cod_cli : inteiro

3 .

Nome : caracter
Tel: caracter
Emai l : caracter
F im_regi stro

4.
5.
6.
7.
8.

Tipo arq_cliente: arquivo direto de cl iente

9.

Auxiliar: reg_cliente

10.
11.
12 .
13.

Cliente: arq_cliente
Inicio
Abrir (Cliente)
Ler ( auxiliar. cod_cli, auxiliar. nome , auxiliar . tel,
auxiliar . email )

14 .

Posicionar (Cliente, Auxiliar)

15.

Armazenar (Cliente, Aux i l iar)

16.
17 .

Fechar (Cliente)
Fim.

A instruo Posicionar(nome da varivel de arquivo, nome da varivel de


registro) utilizada para posicionar o novo registro corretamente. Essa posio deter
minada pelo campo chave. No Algoritmo 9.5, o campo chave o Cod_C l i . necess
rio que seja indicado tambm o armazenamento do registro para que este seja definitiva
mente inserido no arquivo por meio da instmo Armazenar(nome da varivel de
arquivo, nome da varivel de registro).

'

CAPITULO 9 - ACESSO A ARQUIVOS

1 67

Fluxograma:

/
'

Incio
'
11

./

Abrir(Cliente)
'
v

Auxiliar.cod_cli,
Auxiliar.nome,
Auxiliar.te!,
Auxiliar.email

11
'
Posicionar
(Cliente,
Auxiliar)
'
v

Armazenar
(Cliente,
Auxiliar)

11
'
Fechar(Ciiente)

/
'

'
v

Fim

Java:
1.

public class regAgenda{

2.

private int cod_c l i ;

3.

pr ivate String nome ;

4.

private String tel;

5.

private String email;

6.
7.

public regAgenda ( int cod,


e mai l ) {

cod_cli = cod;
nome = nom;

8.
9.

10.
11.
12.
13.
14.
15.

tel

emai l

telef;
=

e_mail;

}
public int mostraCod ( ) {
return cod c l i ;
}

String nom, String telef,

String

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

1 68

16.

public String mostraNome ( ) {

17 .

return nome ;

18.

19.

public String mostraTel ( ) {

20.

return tel;

21.

22 .

public String mostraEmail

23.

return emai l ;

24.
25.

(){

A classe regAgenda foi modificada para esse algoritmo com alterao nos
atributos e incluso dos mtodos para retornar seus valores, seguindo a mesma idia do
acesso a arquivos seqenciais tratado anteriormente.
1.

import j ava . io . * ;

2.

class Exemp lo 9 5 {

3.

static StringBuffer memoria = new StringBuffer ( ) ;

4.

public static void main(String ( ] args ) {

5.

try{

6.

BufferedReader entrada ;

7.

entrada = new BufferedReader (new InputStreamReader


(System. in) ) ;

8.

BufferedReader arqentrada ;

9.

arqentrada

new BufferedReader (new FileReader

( "Cliente . txt " ) ) ;


-

\\ H .

10 .

String linha

11.

while ( ( linha = arqentrada.readLine ( ) )

12 .

! = null)

memoria. append ( l inha + " \ n" ) ;

13.

14.

int Cod_cli = 1 ;

15.

i f (memoria. 1ength ( )

! = 0} {

16.
17 .

int inicio = memoria. lastindexOf

18.

Cod_cli = Integer . parseint

19.

Cod_cli += 1 ;

( " #" ) ;

int fim = memoria . indexOf ( " \ t " , inicio) ;


(ler (inicio + 1 ,

fim) ) ;

20.

21.

System . o u t . println

22.

System . o u t . println { "Digite o nome" ) ;

23.

String Nome = entrada. readLine ( ) ;

24.

System . o u t . print1n ( "Digite o telefone" ) ;

25.

String Tel = entrada . readLine ( ) ;

26.

System . out . println ( "Digite o

27 .

String Email = entrada . readLine { ) ;

28.

regAgenda regAg1 = new regAgenda (Cod_cli, Nome , Te1,

( " Codigo do Cliente :

ema

" + Cod_cl i ) ;

il" ) ;

Emai1) ;
29.

linha = " # " + regAgl .mostraCod { ) + " \ t " +

'

CAPITULO 9 - ACESSO A ARQUIVOS

1 69

30.

regAgl.mos traNome ( )

31.

regAg l . mostraTel

32.

regAgl .mostraEmail

+ "\t +

( ) + "\t +
( ) + "\n ;

gravar ( linha) ;

33.
34.

} catch ( Fi l eNotFoundException erro ) {

35.

System .out. println ( "Arquivo nao encontrado ! ) ;


} catch (Exception erro) {

36.
37.

System . ou t . println ( "Erro de Leitura ! ) ;

38.

39 .

40.

public static String ler (int primeiro, int ultimo) {

43.

String dados = ;
new char [ul timo - primeiro) ;
char [ ) destino
memoria. getChars (primeiro, ultimo, destino, 0 ) ;

44.

for (int i = O ; i < destino. length; i++) {

41.
42.

45 .

dados += destino [ i ) ;

46.

47.

return dados ;

48 .

49.

public static void gravar ( String Linha) {


try{

50.
51.

BufferedWriter saida;

52.

saida = new BufferedWr iter


( "Cliente . txt ,

true ) ) ;

53.

saida.write (Linha) ;

54.

saida . f lush ( ) ;
saida . c lose ( ) ;
} catch (Exception erro) {

55.
56.
57.

System . ou t . println ( "Erro de gravacao ! ) ;

58.

59.
60.

(new FileWriter

}
}

Essa implementao do algoritmo considera que os cdigos dos clientes so nu


merados a pattir de 1 . O programa efetua uma busca no continer memoria, desde que
ele no esteja vazio (verificao feita na linha 1 5), para obter o cdigo atribudo ao
ltimo cliente cadastrado. Como o arquivo de dados um arquivo texto, utilizou-se um
marcador (caractere #) que precede todos os m1meros de cdigo dos clientes. Dessa
forma, a posio do ltimo # obtida com a busca feita na linha 16 e o fim do campo do
cdigo obtido com a instruo da linha seguinte. Passamos as posies dos ndices de
incio e fim para o mtodo ler, que retoma o cdigo. Como esse cdigo est represen
tado por caracteres, j que se origiJJa de um arquivo texto, o resultado obtido uma
string de caracteres. Utilizamos o mtodo parseint da classe Integer para conver
ter a string para inteiro. Como esse cdigo o que foi atribudo ao ltimo cliente cadas
trado, ele precisa ser acrescido de 1 , garantindo a seqncia e a unicidade de identifica-

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

1 70

o. Obtm-se os demais dados por meio da entrada via teclado e instancia-se um obje
to, como feito anteriormente.
Para gravar os dados no arquivo, utilizaremos uma varivel 1 inha, do tipo
String, que ser passada como parmetro para o mtodo gravar. A varivel linha
recebe a concatenao dos diversos campos do objeto, retornados pelos respectivos
mtodos e dos caracteres separadores, inclusive o caractere # indicador do nmero de
cdigo do cliente (linha 29).
ATENO!

Lembre-se de que o arquivo precisa ser criado antecipadamente, com


o mesmo nome usado no cdigo.

ExEMPLO 9.6:

Operao de consulta - arquivo de acesso aleatrio.

A1gori tmo Exemplo_9 . 6


Var tipo reg_cliente = registro
Cod_cli : inteiro
Nome : caracter

1.
2.

3.
4.

Tel:

5.

Ema i l : caracter
Fim_registro
Tipo arq_cliente: arquivo direto de cliente
Auxiliar: reg_cliente
Cliente: arq_cliente
Consul ta_codc l i : inteiro

6.

7.
8.
9.
10.
11.
12 .

caracter

Inicio

13 .

19.

Abrir (Cl iente)


Ler ( Consulta_codcli)
Se (Consulta_codcli = Auxiliar. Cod_c l i ) Ento
Posicionar (Cliente, Auxiliar. Cod_codcli)
Seno
Mostrar ( "Registro no cadastrado" )
Fim-Se

20.

Fechar (Cl iente)

14.
15.
16.
17 .
18.

21.

Fim.
NOTA:

O acesso direto/aleatrio ao registro a ser consultado feito por meio


do campo chave.

'

171

CAPITULO 9 - ACESSO A ARQUIVOS

Fluxograma:
Incio

Abrir(Cliente}

Consulta_codcli

Posicionar
(Cliente,
Auxiliar.cod_cl i)

.F.

"Registro no
cadastrado"

Fechar(Cliente}

Fim

Java:
1.

import java. i o . * ;

2.

class Exemplo% {

3.

static StringBuffer memoria = new StringBuffer { ) ;

4.

public static void main {String [ ) args ) {

5.
6.
7.

try{

BufferedReader entrada;
entrada = new BufferedReader (new InputStreamReader
( System. in) ) ;

8.

BufferedReader arqentrada;

9.

arqentrada = new BufferedReader (new FileReader


( "Cliente . txt ) ) ;

10.

String linha = " ;

11.

while ( ( linha = arqentrada . readLine ( ) )

! = null )

'

1 72

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

12 .

memoria.append (linha + "\n" ) ;

13 .

14.

Sys tem . o u t . print1n ( " Digite o codigo : " ) ;

15.

String consul taCod_c l i

16.
17 .
18.
19 .

int inicio = - 1 ;
i f (memoria. length ( ) ! = 0 ) {
inicio = memoria. indexOf ( " # " + consul taCod_c li ) ;
i f ( inicio == -1 ) {

20.

System.out. println ( "Codigo nao encontrado . " ) ;

21.

entrada . readLine ( ) ;

}
}else{
System .out.println ( "O arquivo esta vazio . " ) ;
}
} cat ch (FileNotFoundException erro ) {

22.
23.

24 .
25.
26.

System . o u t . println { " Arquivo nao encontrado ! " ) ;

27 .

} catch {Exception erro ) {

28.

System.out.println ( "Erro de Leitura ! " ) ;

29.

30.
31.

}
}

A implementao da busca direta feita por meio do cdigo do cliente, resultan


te da entrada via teclado, e do caractere associado a esse cdigo (caractere #). A instru
o na llnha 1 8 executa essa operao e o mtodo usado o mesmo dos casos anterio
res: indexO f, que retoma a posio inicial do dado pesquisado no continer de memria
e, conseqentemente, do arquivo originrio.
Foram introduzidos dois testes de verificao para garantir a execuo correta do
programa. Um deles, na linha 17, confere se o continer de memria est vazio, execu
tando a busca somente no caso de existirem dados, ou seja, o tamanho de memoria
obtido pelo mtodo length deve retomar um valor diferente de O. A outra verificao
indica se a varivel inicio recebeu um valor diferente do atribudo quando de sua
inicializao (-1.), significando que o cdigo foi encontrado. Caso o cdigo tenha sido
encontrado, a varivel inicio ter um valor igual ou maior que O e corresponder
posio de incio do campo pesquisado.
EXEMPLo 9.7:
1.
2.

Operao de alterao - arquivo de acesso aleatrio.

Algoritmo Exemplo_9 . 7
Var Tipo reg_cliente = registro

3.

Cod_cli :

4.
5.

Nome : caracter

6.

Emai l : caracter

Tel: caracter

7.

8.

inteiro

Fim_registro

Tipo arq_cliente

arquivo direto de cliente

'

CAPITULO 9 - ACESSO A ARQUIVOS

9.

1 73

Auxiliar : reg_cl iente

10.

Cliente :

11.

Altera_codcl i :

12.

novo_nome, novo_tel, novo_end, novo_email

13.

arq_cliente
inteiro
: caracter

Inicio

14.

Abrir (Cl iente}

15.

Ler(Altera_codcl i }

16.

Se (Altera codcli

Auxiliar.Cod c l i } Ento

17.

Posicionar (Cliente, Auxiliar. Cod_codcli)

18.

Mostrar (Auxi liar.Nome, Auxiliar.Tel, Auxi liar .End,


Auxiliar . Email}

19.

Ler (novo_nome , novo_tel, novo_end , novo_emai l )

20.

Auxiliar. Nome novo_nome

21.

Auxiliar.Tel novo_tel

22.

Auxi liar.End

23 .

Auxi liar . Email

24.

Armazenar (C1iente,

25.

novo_end

novo_email
Auxiliar}

Seno
Mostrar ( Regis t ro no cadastrado " }
"

26.
27.

Fim-Se

28.

Fechar (Cliente}

29.

Fim.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

1 74

Fluxograma:
Incio

novo_tel,

novo_end

Abrir(Cliente)

ame
novo_nome
Auxiliar.Tel

Altera_codcli

novo_end

"Registro no
cadastrado"

Auxiliar.Email

Armazenar
(Cliente,
Auxiliar)

Posicionar
(Cliente,
Auxi l iar.cod_cli}

Fechar(Cliente)

Fim

Java:
classe regAgenda deve ser modificada para a incluso dos mtodos que
permitem alterao dos atributos nome, tel e ema i 1; tais mtodos devem ser compa
tveis com os nomes utilizados no programa desse exemplo: al teraNome, al teraTel
e al teraEmai l. Caso voc queira atribuir outros nomes aos mtodos, no h proble
ma, desde que eles sejam compatveis (na classe regAgenda e no Exemplo97),
lembrando a questo das letras maisculas e minsculas, que no pode ser desprezada,
pois Java case-sensitive.
A

1.

import java . io . * ;

2.

class Exemplo97 {

3.

static StringBuffer memoria

4.

public static void main (String [ ] args ) {

5.

try{

new StringBuffer ( ) ;

'

175

CAPITULO 9 - ACESSO A ARQUIVOS

6.

BufferedReader entrada;

7.

entrada = new BufferedReader (new InputStreamReader


( System. in) ) ;
BufferedReader arqentrada;

8.

10.

arqentrada = new BufferedReader (new FileReader


( "Cliente . txt " ) ) ;
String l inha

11.

while ( ( linha = arqentrada. readLine ( ) )

9.

12 .

\\ 11

.
'

! = null)

memoria . append (linha + "\n" ) ;

13.

14.

System. out. println ( "Digite o codigo: " ) ;

15.

String alteraCod_cli = entrada. readLine ( ) ;


int primeiro = 1 ;
i f (memoria. length ( ) ! = O ) {
-

16.
17.
18.

primeiro = memoria. indexOf ( " # " + alteraCod_c l i ) ;

19.

i f (primeiro ! = -1) {

20.

int fim = memoria. indexOf

( " \ t " , primeiro ) ;

21.

int Cod_cli = Integer .parseint (ler (primeiro += 1 ,

fim) ) ;
23.

primeiro = fim + 1 ;
fim = memoria. indexOf { " \ t " , primeiro ) ;

24.

String Nome = ler (primeiro,

25.

int inicio = fim + 1 ;

26.

fim = memoria. indexOf

27.

String Tel = ler (inicio,

28.

inicio = fim + 1 ;
fim = memoria. indexOf ( " \n" , inicio ) ;
String Email = ler (inicio, fim) ;
System . out .println (Nome + " + Tel + " +

22.

29.
30.
31.

fim) ;

( " \ t " , inicio ) ;


fim) ;

Emai l ) ;
regAgenda regAg1 = new regAgenda (Cod_c l i , Nome ,

32 .
Tel, Email ) ;
33.

Sys tem out . print l n ( "Entre com novo nome : " ) ;

34.
35.

Nome = entrada . readLine ( ) ;


System . out. println ( "Entre com novo telefone : " ) ;

36.

Tel = entrada. readLine ( ) ;

37.

System . out .println ( "Entre com novo email : " ) ;

38.

Email = entrada . readLine ( ) ;

39.
41 .

regAg1 . a l teraNome (Nome ) ;


regAg 1 . a l teraTel (Tel ) ;
regAgl . al teraEmail (Emai l ) ;

42.

memoria. replace (primeiro,

40.

( ) + " \ t " + regAgl .mostraTel

fim,

regAgl.mostraNome

( ) + " \ t " + regAg l . mo straEmail ( ) ) ;

45.

gravar ( ) ;
}else{
Systern . o u t . println ( "Codigo nao encontrado . " ) ;

46.

43.
44.

47 .

}else{

- E ESTRUTURAS DE DADOS
LOGICA D E PROGRAMAAO
'

1 76

System .out .println ( "0 arqu1vo esta vazio . " ) ;

48.
49.

50.

arqentrada . close ( ) ;

54.

} catch (Fi leNotFoundException erro) {


System . out.println ( "Arquivo nao encontrado ! " ) ;
} catch (Exception erro) {
System . ou t . pr int ln ( "Erro de leitura ! " ) ;

55

51.
52.
53.

56.

57.

public static String ler (int primeiro,

int ultimo) {

58.

String dados = " " ;

59.

char ( ] destino = new char (ultimo - primeiro) ;


memoria. getChars (primeiro, ultimo, destino, 0 ) ;
for (int i
O ; i < destino. length; i++) {

60.
61.

dados += destino ( i ) ;

62 .
63 .

64.

return dados;

65

public static void gravar ( ) {

66.

t ry{

67 .
68.

BufferedWriter sada;

69.

sada = new Buffered\1\lriter (new File\1\lriter


( "Cliente.txt " ) ) ;

70.

saida.write (memoria . toString ( ) ) ;

71.

saida . flush ( ) ;

72.

sada . elos e ( ) ;

74.

} catch (Exception erro ) {


System .out. println ( "Erro de gravacao ! " ) ;

75

73.

76
77

O cdigo do cliente a ser pesquisado atribudo varivel al teraCod_cli e


a busca feita nos moldes do Exemplo 9.6. Porm, neste caso, utiliza-se uma varivel
adicional: primeiro, que armazena a posio inicial do trecho que ser alterado quando
da atualizao do continer memoria. A varivel primeiro utilizada durante o
percurso pelo registro at que ela represente a posio inicial do campo Nome, quando
ento se passa a utilizar a varivel ini c i o em conjunto com a varivel fim para o
percurso e a recuperao dos demais campos do registro. Isso se deve ao fato de que se
pretende preservar o campo cdigo do cliente, que um campo de controle e no pode
ser alterado pelo usurio.
Na linha 1 8, a varivel primeiro recebe a posio inicial do caractere # e o
cdigo do cliente, caso ele tenha sido encontrado. Na linha 19, testa-se a condio de
primeiro ter recebido um ndice vlido. Na linha 20, efetua-se a busca a pattir da
posio encontrada e a prxima posio de tabulao, isolando-se as posies de incio
e fim do cdigo do cliente. Observe que, para a passagem de posies para o mtodo

'

1 77

CAPITULO 9 - ACESSO A ARQUIVOS

ler, a varivel primeiro incrementada em l , visto que o campo propriamente dito

inicia-se a pat1ir da posio seguinte, que corresponde aos caracteres do nmero do


cdigo do cliente. Deve-se desprezar o caractere #. Na linha 2 1 , a varivel Cod_cli
recebe os dados do cdigo do cliente, que convertido para inteiro, seu tipo de dado
original, como foi declarado em regAgenda. Na linha 22, a varivel primeiro rece
be a posio fim + 1, pois o prximo campo a ser recuperado o campo Nome, que
est na seqncia. Sua primeira posio equivale a uma posio alm do final do campo
cdigo. Na linha 25 passa-se a utiUzar a varivel inicio, permitindo-se que o valor da
varivel primeiro permanea com o valor da posio que lhe foi atribuda por ltimo.
A tabela a seguir apresenta resumidamente um exemplo de possveis posies que os
campos de um registro poderiam assumir e as variveis utilizadas para recuperar as
posies de cada campo. Logo a seguir mostramos um teste de mesa aplicado a esse
exemplo. A coluna 'LINHA' corresponde linha do programa.
E importante destacar que, no momento em que feita a atualizao dos dados
no continer da memria, so passadas as posies referentes ao valor das variveis
primeiro e fim, que conespondem ao intervalo de caracteres que vai de Nome at
Emai l . No exemplo, esse intervalo vai da posio 3 at a 39.
'

pos1ao

3a8

10 a 1 7

18

1 9 a 38

39

contedo

Cdigo

\t

Nome

\t

Te I

\t

Ema i I

\n

pnme1ro

fim

pnme1ro

fim

varivel

pnme1ro
o

I TABELA 9.1 I

fim

IniCIO

Posies possveis para os campos de um registro

LINHA

primeiro

16

-1

18

20

22

23

25

10

26

10

18

28

19

18

29

19

39

IniCIO
o

fim

I TABELA 9.21 Teste ele mesa


EXEMPLo 9.8:

Operao de excluso - arquivo de acesso direto.

1.

Algoritmo Exemplo_9 . 8

2.

Var tipo reg_cliente

registro

3.

Cod_c l i : inteiro

Nome : caracter

5.

T e l : caracter

IniCIO

fim

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

1 78

6.

Email: caracter

7.

Fim_registro

8.

Tipo arq_cliente: arquivo direto de c liente

9.

Auxi liar: reg_c liente

10.

Cliente:

11.

Consulta_codc l i :

12 .

Resposta: caracter

13 .

arq_cliente
inteiro

Inicio

14.

Abrir (Cl iente)

15.

Ler ( Consulta_codcli)

16.

Se (Consulta_codcli

Auxi liar. Cod_c l i ) Ento

17 .

Posicionar (Cliente, Auxiliar. Cod_codcli)

18.

Mostrar ( "Deseja Excluir? S/N") Ler ( Resposta)


Se (Resposta
" S " ) Ento

19.

20.
21.
22.

Deletar (Cliente, Auxiliar)


Fim-Se
Seno
Mostrar ( "Registro no cadastrado" I

23.
24.

Fim-Se

25.

Fechar (Cliente)

26.

Fim.

Fluxograma:
Incio

"

Abri r(CIiente)

Resposta"

.F.

Consulta_codd
.v.

"Registro no
cadastrado"

"Deseja
excluir?
(S/N}"

Deletar
(Cliente,
Auxiliar)

Fechar(Cliente)

Fim

'

17 9

CAPITULO 9 - ACESSO A ARQUIVOS

Java:
1.

irnport java.i o.*;

2.

class Exernplo98{

3.

static StringBuffer rnernoria = new StringBuffer();

4.

public static void main(String[)

5.

args) {

try(

6.

BufferedReader entrada;

7.

entrada =

new BufferedReader (new InputStrea.rnReader

System.in));
8.

BufferedReader arqentrada;

9.

arqentrada = new BufferedReader (new FileReader


("Cliente.txt"));

10.

String linha = "";

11.

while ((linha =

12.

()) l= null) {

arqentrada.readLine

mernoria. app end

( 1 inha

"\n");

13.

14.

System.out.println ("Digite o codigo:");

15.

String consultaCod_cli = entrada.readLine ();

16.

int inicio = -1;

17.

if (memoria.length ()

!=

0){

18.

inicio = m emo ria. i ndexO f ("#"

19 .

if

(inicio !=

c on sultaCod_c li) ;

-1){

20.

int fim = memoria.indexOf ("\t",

21.

int Cod_cli = Integer.parseint (ler (inicio

inicio);
+

1,

fim));
22.

System.out.println ("Deseja excluir cliente: "

23.

Cod_cli + "? S/N");

24.

Str ing

25.

if

resposta = entrada.readLine () ;

(resposta.equalsignoreCase ("S"))(

26.

fim = memoria.indexof ("\n",

27.

memoria.delete (inicio,

28.

gravar ();

29.

1);

30.

}else{
System. out.pri ntln

31.

("Codigo nao encontrado.");

32.
33.

}else{

34.

System.out.println

35.

36.

arqentrada.close ();

("O arquivo esta vazio.");

} catch (FileNotFoundException erro){

37.

System.out.println ("Arquivo na o encont rado ! " ) ;

38.

} catch

39.
40.

(Exception erro) (

System.out.println ("Erro de leitura!");

41.
42.

43.

public static String ler (int primeiro,

44.

fim

inicio);

String dados

"";

int ultimo){

'

LOGICA DE PROGRAMAAO E ESTRUTURAS DE DADOS

180

45.
46.
47.

char

[)

destino =

new

char [ultimo -

memoria.getChars (primeiro,
O;

for (int i =

48.
49.

50.

return dados;

dados +=

51.
52.

ultimo,

i < destino.length;

primeiro);
destino,

0);

i++){

destino [i);

}
public static void gravar (){

53.

try{

54.

BufferedWriter saida;

55.

saida = new Bufferedwriter (new Filewriter

("Cliente.txt"));
56.

saida ...,;rite (memoria.toString ());

57.
58.
59.

saida. flush ( );

} catch {Exception erro){

60.

System.out.println

saida.close ();

61.

}
}

62.
63.

("Erro de gravacao!");

Nesse exemplo, fazemos a busca do cdigo do cliente como no exemplo ante


rior. Obtemos, assim, o incio do registro a ser excludo. Obtemos o cdigo pelo mtodo
ler (linha 21), para exibi-lo no pedido de confirmao ao usurio (linha 22). Se a

resposta for igual a "s" (desprezando-se maisculas e minsculas -linha 25), procede
se excluso do registro no continer de memria. O mtodo gravar efetiva a transfe
rncia dos dados para o arquivo.

9.5

'"'

EXERCICIOS PARA FIXAAO


Para os exerccios abaixo, escreva o pseudocdigo, faa o fluxograma e codifi

que o programa em Java.


1. Elabore um cadastro que armazene os dados dos atletas de um clube. Deve
ro ser armazenados: nome, idade, altura, sexo, peso e modalidade esportiva.
O programa dever permitir a manipulao dos dados armazenados. Utilize
o mtodo seqencial.
2. Elabore um programa que possibilite o armazenamento dos dados dos fun
cionrios de uma empresa para que seja gerada a folha de pagamento. Deve
ro ser armazenados: nome do funcionrio, cdigo funcional, data de admis
so, salrio bruto, nmero de dependentes e cargo. O programa dever permitir
a manipulao das informaes e possuir uma opo para calcular o salrio
lquido de cada funcionrio. Utilize o mtodo randmico.

'

CAPITULO 9 - ACESSO A ARQUIVOS

9.6

181

"

EXERCICIOS COMPLEMENTARES
Para os exerccios abaixo, escreva o pseudocdigo e o fluxograma e codifique o

programa em Java.

1. Elabore um controle acadmico que permita:


a) o cadastro dos dados pessoais dos alunos;
b) o cadastro da grade escolar do aluno;
c) o cadastro das notas associadas grade do aluno;
d) a manipulao dos dados com controle de senha.
Crie um menu de opes e utilize todos os recursos aprendidos at agora.
Utilize o mtodo randmico. O programa dever verificar se o aluno foi apro
vado ou reprovado nas disciplinas, levando-se em considerao que a mdia
de aprovao de 7,0 sem exame e de 5,0 com exame.
2.

Elabore um controle de estoque que permita:


a) cadastrar novos produtos;
b) manipular as informaes cadastradas;
c) acompanhar a quantidade de produtos disponveis;
d) consultar o nome do produto, a quantidade disponvel e o preo.
Faa um menu de opes e utilize todos os recursos aprendidos. Utilize o
mtodo seqencial.

"'

PIT

ESTRUTURAS DE
A

DADOS DINAMICAS

Listas
Filas
Pilhas
,

Arvores

OBJETIVOS:
Apresentar as estruturas de dados freqentemente
utilizadas na programao, por meio de diagramas
e exemplos simples, para facilitar o e n tendim e nto e
sua implementao.

s estruturas de dados so, muitas vezes, a pedra no sapato do programador


inexperiente, por isso, tentamos demonstrar de maneira bem simples como cons

truir alguns exemplos. Como existe a possibilidade de implementao dessas estruturas

com o uso de arranjos ou alocao dinmica, para no sermos repetitivos demonstramos


a implementao de listas e rvores utilizando alocao dinmica e filas e pilhas por
ananJOS.
o

Quando falamos em listas, filas, pilhas e rvores podemos dizer que todas so n a
verdade 'listas de informaes', cuja diferena principal est no acesso a essas 'listas'
para incluso e remoo de informaes.
Os arranjos (vetores ou matrizes) so mais simples de implementar: o contedo
da 'lista' armazenado em um espao de memria com tamanho para N elementos que
sero dispostos em posies contnuas, isso , um seguido do outro. Mas, apesar de ser
mais fcil de compreender como manipular seus dados, os a1Tanjos possuem limitao

CAPTULO 10- ESTRUTURAS DE DADOS DINMICAS

183

quanto quantidade de elementos que o conjunto ir suportar, isto , o arranjo possui


um tamanho pr-determinado que pode ou no ser totalmente ocupado, alm de que
pode haver a necessidade de mais espao do que aquele que foi inicialmente reservado.
J quando falamos em alocao dinmica utilizamos posies descontinuadas da
memria RAM; isso possvel pois cada um dos elementos da 'lista' deve possuir uma
referncia para os elementos seguinte e anterior. Essa referncia o endereo da posi
o de memria em que se encontra tal elemento.
A seguir sero apresentados os conceitos e exemplos de listas, listas encadeadas,
filas, pilhas e rvores. As estruturas no esto apresentadas em ordem de importncia
e/ou facilidade para compreenso. O conceito de lista abordado inicialmente e por
uma questo de continuidade a construo de listas encadeadas abordada em seguida.
NOTA:

Cabe lembrar que a linguagem de programao Java no suporta pon


teiros, assim, quando do uso de ponteiros nos exemplos, na linguagem
sero utilizados objetos que faro referncia aos elementos.

10.1 LISTAS
Uma lista uma coleo de elementos do mesmo tipo dispostos linearmente que
podem ou no seguir determinada organizao, por exemplo: [E1, E2, E3, E4, E5,

, E,],

onde n deve ser > = O.


Como exemplos de listas podemos citar: lista de chamada de alunos, lista de
compras de supermercado, lista telefnica, entre outros. O exemplo apresentado a se
guir de uma lista de pagamentos a serem efetuados em um ms, exemplo que tambm
ser utilizado nos tpicos seguintes.
Lista de pagamentos
Prestao do carro
Carto de crdito
Conta de luz
Condomnio
TV a cabo
Credirio das Casas Bahia
lista simples

Quando criamos uma lista para utiliz-la como estrutura de dados, podemos uti
lizar como continer para armazenamento dos dados um vetor ou uma matriz, ento
dizemos que esta uma lista implementada por meio de arranjo; ou ento podemos
utilizar a alocao dinmica, isto , no criamos um continer para armazenar os dados,
mas precisamos referenciar os elementos seguinte e anterior de cada elemento, ento
teremos uma lista encadeada.

'

LOGICA DE PROGRAMAAO E ESTRUTURAS DE DADOS

184

Veja um exemplo de lista simples:


Lista de pagamentos f- [prestao do carro, carto de crdito, conta de luz, con
domnio, TV a cabo, credirio das Casas Bahia]
Essa uma lista que possui seis elementos do tipo caracter, e os elementos esto
armazenados em um vetor.
1 0.1.1 LISTAS ENCADEADAS

Uma lista encadeada um conjunto de elementos que esto dispostos em uma


dada organizao fsica no linear, isto , esto espalhados pela memria. Para organi
zar a lista de maneira que possa ser utilizada como um conjunto linear, necessrio que
cada elemento do conjunto possua informaes sobre o seu elemento anterior e o seu
elemento seguinte. Para exemplificar ser utilizada uma lista de pagamentos que devem
ser efetuados no ms. Os pagamentos esto dispostos em uma ordem aleatria, isto ,
linear:
Lista de pagamentos
Prestao do carro
Carto de crdito
Conta de luz
Condomnio

TV a cabo
Credirio das Casas Bahia

lista simples

Olhando para a lista pode-se perceber qual o primeo elemento, qual o se


gundo elemento e assim por diante, mas quando desejamos implementar essa lista em
uma estrutura de dados precisamos dizer qual ser o prximo elemento. Para isso, cada
elemento da lista representado por um n, e cada n deve conter os dados e um campo
que indique qual o prximo elemento da lista- esse campo chamado de ponteiro.
Observe a lista seguinte:
Lista de pagamentos

Ponteiro para o prximo elemento

Prestao do carro

Carto de crdito

Conta de luz

Condomnio

a cabo

TV

Credirio das Casas Bahia

Obs.: este o ltimo elemento do conjunto,


ento no aponta para nenhum outro.

lista com um campo para encadeamento

'

CAPITULO 10- ESTRUTURAS DE DADOS DINAMICAS

185

O elemento 1 aponta para o elemento 2, o elemento 2 aponta para o elemento 3 e


assim por diante:

E,

...
,

...
,

E,
I FIGURA

1 o. 1

...
-

E,

...

E.

I Listas encadeadas

onde:

o primeiro elemento da lista E1;

o ltimo elemento da lista E,;

o predecessor de E1;

o sucessor de E2 E3;

e assim por diante at o ltimo elemento.

De acordo com o exemplo apresentado teremos:

...

Primeiro elemento
1

Carto de crdito

Prestao do carro
..-'!

Casas Bahia

Condomnio

Conta de luz

ltimo elemento

I FIGURA

1 o.

Na cabo

21 Li.stas encadeadas

Trata-se de uma lista de encadeamento simples, onde:

o primeiro elemento da lista, ou seja, o seu comeo, prestao do carro;

o seu sucessor carto de crdito, que tem como predecessor prestao do


carro e assim por diante;

NOTA:

o ltimo elemento da lista, ou seja, o seu final, credirio das Casas Bahia.
O ponteiro guarda o endereo de memria do elemento; o exemplo
acima hipottico.

Na representao algorftmica bastante simples ilustrarmos esses apontadores


ou ponteiros, mas a linguagem de programao Java no aceita ponteiros- eles so
representados por uma referncia ao elemento.

'

LOGICA DE PROGRAMAAO E ESTRUTURAS DE DADOS

186

1 o. 1 .2

TIPOS DE LISTAS ENCADEADAS

As listas encadeadas podem ser do tipo:


Encadeamento simples: os elementos da lista possuem apenas um ponteiro

que aponta para o elemento sucessor ou prximo (como no exemplo apresen


tado anteriormente), como mostra a Figura 10.3.
Duplamente encadeadas: cada elemento possui um campo que aponta para

o seu predecessor (anterior) e outro para o seu sucessor (prximo). Veja a


Figura 1 0.4.
Ordenadas: a ordem linear da lista corresponde ordem linear dos elemen

tos, isto , quando um novo elemento inserido na lista ele deve ser colocado
em tal posio que garanta que a ordem da lista ser mantida; essa ordem
pode ser definida por um campo da rea de dados, como por exemplo se
tivermos uma lista ordenada com seguintes valores [1, 5, 7, 9] e desejarmos
incluir um novo elemento com o valor 6, este valor dever ser includo entre
os valores 5 e 7 (Figura 10.5.).
Uma lista ordenada pode ser de encadeamento simples ou duplo, mas o prin
cpio para a ordenao o mesmo.
Circulares: o ponteiro prximo do ltimo elemento aponta para o primeiro; e

o ponteiro anterior do primeiro elemento aponta para o ltimo. Na Figura


10.6, E1 o primeiro elemento e E1, o ltimo elemento.

.
.

.
.

.
.
.
.

..

..
.
.
.

.
.

dados

dados

dados

prximo

prximo

prximo

dados

..
..
.
.
.

..
.

'
.
.

prximo

.
.
.

.
.

..

..
.

..

.
.

.
.
.

E.

E,

I FJGU RA 1 0.3 1 Lista.s com encadeamento simples


N

--

.
.

.
.
.
.
'

..
.
..

..

anterior

anterior

anterior

anterior

dados

dados

dados

dados

prximo

prximo

prximo

prximo

'

'
'

.
.
.
.
.
.

...
..

.
. . ...

.
.
.

E.

E,

I FIGURA 10.41

Listas duplamente encadeadas

'

LOGICA DE PROGRAMAAO E ESTRUTURAS DE DADOS

188

1.

Algoritmo ExemploL istaSimples

2.

Tipo apontador:

3.

NoSimples

ANoSimples
=

registro

4.

valor:

5.

prox: apontador

inteiro

fim

6.

ListaSimples = registro

7.
8.

primeiro : apontador

9.

ultimo: apontador

10 .
11.

fim
Inicio

12.

ListaSimples . primeiro

13 .

ListaSimples . u l timo nulo

14 .

Procedimento InsereNo_fim (var novoNo: No Simp l es )

15.

l.nl.Cl.O

nulo

16.

novoNoA .prox nulo

17 .

Se (ListaSimpl es.primeiro

18.

ListaSimples. primeiro

19 .

Fim-Se

20 .

Se (ListaSimples . u l timo

<>

nulo) Ento
novoNo

nulo) Ento

Lista. Simples .ultimo A . prox novoNo

21.
22.

Fim-Se

23.

L i staSimples . ultimo novoNo

24.

Fim

25.

Procedimento excluiNo(var elemento:

26.

var

27 .

temp_no: NoSimples

28.

temp: NoSimples

29 .

inteiro)

l.nl.Cl.O

30 .

temp Lis taSimples. primeiro

31.

temp_no

32.

Enquanto ( t emp_noA .prox <> nulo ou temp_no.valor <>

elemento)

ListaSimples.primeiroA.prox

faa

33.

temp

34 .

temp_no temp_noA. prox

temp_no

35.

Fim-Enquanto

36.

tempA .prox temp_noA .prox

37 .

desposicione ( temp_no)

38.

Fim.

Na linha 2 a varivel apontador um tipo construdo que ter a funo de


referenciar o prximo elemento de cada um dos elementos da lista, por isso ele deve
ser declarado como sendo do mesmo tipo da varivel que ir representar o n. Em
nosso exemplo, o n est sendo representado pelo NoSimples. O que precede o
tipo de dado utilizado para representar a funo de 'apontar para' ( "'NoSimples ),
isto , a varivel apontador sempre apontar para algum outro elemento do tipo
"'

NoSimples.

CAPTULO 10- ESTRUTURAS D E DADOS DIN MICAS

189

Note, na linha 3, a declarao do NoSimples, tambm um tipo construdo. Ele


possui as variveis valor, que do tipo inteiro, e prox, que do tipo apontador. Voc
se recorda de que o apontador ir fazer referncia a um outro elemento; nesse caso ele
ir fazer referncia ao prximo n do elemento em questo.
Na linha 7 est sendo declarada a ListaSimples, que tambm um tipo
construdo; um registro que contm as variveis primeiro e ultimo, que sero
utilizadas na construo da lista.
LEM eRE-sE:

Isso ser possvel pois o primeiro" .prox ir apontar para o prximo


elemento, e o prximo para o prximo e assim por diante, pois a vari
vel apontador do tipo referncia para NoSimples.

O procedimento InsereNo, linha 14, recebe o parmetro novoNo, que uma


varivel do tipo No Simples, ento lembre-se que novoNo um registro que possui
as variveis valor e prox. Esse procedimento utilizado para inserir um novo n no
final da lista. Note que o novoNo" .prox recebe nulo - isso deve ser feito para que
esse n seja considerado o tltimo.
Nas linhas seguintes verificado se esse dever ser o primeiro elemento da lista
no teste ListaSirnples . primeiro nulo; se isso for verdadeiro, ento o novoNo
ser o primeiro da lista.
Na linha 20 verificado se o ltimo n diferente de nulo, quando j existem
elementos na lista. Isso feito para que o novoNo seja inserido na ltima posio da
lista.
Na linha 23 a varivel ListaSimples. ultimo recebe o valor do novoNo.
=

DICA:

Se o prox for nulo, significa que esse elemento o ltimo.


Se o primeiro elemento e o ltimo tiverem valor nulo, significa que a
lista est vazia.
Se o prox do primeiro elemento for nulo, significa que a lista s tem
um elemento.

O procedimento excluiNo, linha 25, recebe como parmetro um valor para a


varivel elemento, que do tipo inteiro, e ir guardar o dado do n que dever ser
excludo, nesse caso para a varivel valor. Esse procedimento tambm utiliza as va
riveis temp e ternp_no, que sero variveis auxiliares do tipo NoSimples. Nas
linhas 30 e 31 essas variveis recebem, respectivamente, o valor do primeiro n e o
valor do prximo n (do primeiro).
DicA:

'

E aconselhvel criar uma rotina para verificar se a lista est vazia ou


com apenas um elemento antes de implementar esse mtodo, seno,
caso esteja, ir ocasionar um erro. Isso pode ser feito com o seguinte
teste, que deve preceder a atribuio de valores das variveis temp e
temp_no:

Se ListaSimples. primeiro <> nulo e


ListaSimples . primeiro . prox <> nulo ento .
.

'

LOGICA DE PROGRAMAAO E ESTRUTURAS DE DADOS

190

Na linha 32, feito um teste de repetio, que utiliza a estrutura Enquanto


para repetir as instrues enquanto o prox, do temp_no, for diferente de nulo ou
temp_no. valor for diferente do elemento. Se o temp_no.prox for iguaJ a nulo
significa que o elemento lido o ltimo da lista e, se o valor do elemento for igual ao
valor de temp_no. valor, significa que o elemento a ser excludo foi encontrado,
ento o lao de repetio encerrado e so executadas as instrues temp.prox r
temp_no"' . prox, por meio da qual o valor do prximo elemento do elemento a ser
excludo armazenado no prximo elemento do n anterior ao que ser excludo. Lem
bre-se de que o temp inicia com o valor do primeiro e o temp_no, com o valor do
primeiro. prox. Com isso o elemento a ser excludo deixa de ser referenciado. Por
ltimo a instruo desposicione ( temp_no) indica que o n a ser excludo deixa
definitivamente de ser referenciado - em algumas linguagens isso no precisa ser
feito.
Vamos ver a seguir uma situao para utilizao do algoritmo anterior. Suponha
que a lista contenha os nmeros inteiros 1, 3, 5, 7. Vamos inserir o nmero 2 na lista
utilizando o procedimento insereNo.
O nmero 2 dever ser passado como parmetro para o procedimento e ficar
armazenado na varivel novoNo. Isso ser feito no algoritmo principal da seguinte
forma:
InsereNo (2)

ento o procedimento acionado e ir verificar se esse ser o primeiro elemento


da lista. Como no nosso exemplo isso falso, pois a lista j contm os elementos 1, 3, 5
e 7, ento ser executada a instruo ListaSimples. ultimo"'. prox r novoNo,
isto , a referncia do ltimo elemento ir apontar para o novoNo, no caso o nmero 2,
e a varivel que representa o ltimo elemento ir receber o novoNo.

nulo

prximo

prximo

prximo

prximo

prximo

prximo

prximo

prximo

prximo

I FJGU RA 1 o. 7J

nulo

Insero de um n no final da lista (simples)

Ns tambm podemos inserir um novo n em uma determinada posio da lista.


Para isso, preciso que sejam passados como parmetros o valor a ser inserido e a
posio que ele dever ocupar, por exemplo: incluiNo ( 2, 1).

'

CAPITULO 10- ESTRUTU RAS D E DADOS DINAMICAS

191

.
..-i;p-
que ocup.\

\.!l..posio .1../
-- -

nulo

prximo

prximo

prximo

prximo

prximo

prximo

prximo

prximo

prximo

nulo

I FIGURA to. ai Insero de um n em uma posio especfica da lista (simples)

seguir sero apresentados os algoritmos para incluir ns em posies pr


determinadas:
A funo ContarNos ser utilizada para verificar a quantidade de ns ex i sten
tes na lista. Ela no recebe parmetros e retoma a quantidade de ns.
A

ExEMPLo 10.2:

Pseudocdigo para representar uma funo para contagem de ns de uma


lista.

1.

Funo ContarNos (

2.

var numero_nos :

3.

temp_no : NoSimples

4.

inteiro

Inicio

5.

numero_nos <- O

6.

temp_no <- ListaSimples. primeiro

7.

Enquanto( temp_n o A . prox <> nulo)

8.

numero_nos

9.

temp_no

f-

f-

faa

numero_no s + 1

temp_noA. prox

10.

fim_enquanto

11.

return (numero_nos )

O procedimento insereNo_posicao recebe como parmetros as variveis


novoNo, que do tipo NoSimples, e posicao, que do tipo inteiro.
EXEMPLo 10.3:

Pseudocdigo para representar a insero de u m n em uma posio espe


cfica em uma lista de encadeamento simples.

1.

Procedimento I nsereNo_posicao(var novoNo: NoSimples, posicao :


inteiro)

2.

var

3.

temp_no: NoSimples

4.

pos_aux:

5.

numero_nos :

6.

inicio

inteiro
inteiro

'

192

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

7.

pos_aux O

8.

numero_nos ContarNos (}

9.

Se

(posicao = 0}

ento

10.

novoNoA .prox

11.

L istaSimples. primeiro novoNo

12 .

Se

L istaSimples . primeiro

( L i s taSimple s . ultimo = L istaSimples. primeiro) ento


L i staSimples .ultimo

13.
14.

fim-se

15.

Seno

16 .

Se

<-

novoNo

(posicao <= numero_nos)


Enquanto

17.

ento

( t emp_noA .prox <> nulo

. o u . poscao <> pos_aux )

ento
18.

temp_no temp_noA . prox

19.

pos_aux pos_aux + 1

20 .
21.

Fim-Enquanto

22 .

temp_n o A . prox novoNo

23 .

Seno

24.

Se

novoNoA .prox temp_noA . prox

(posicao > numero_no s ( ) )

ento

25.

L i s tasimples . ul timo.prox novoNo

26.

ultimo novoNo
fim-se

27.
28.

fim-se
fim-se

29.
30 .

Fim

verificado se a posio para insero O (linha 9), isto , se o n a ser inserido


dever ser o primeiro. Tambm verificado se ele ser o ltimo elemento da lista (linha
12); se isso for verdadeiro, o valor do seu prox ser nulo, o que significa que a lista s
tem um elemento.
Se o novo n tiver de ser inserido em outra posio, ento verificado se a
posio menor do que a quantidade de ns existentes na lista, o que feito com o
auxlio da funo ContarNos construda anteriormente. Se isso for verdadeiro, ento
ser utilizada uma estrutura de repetio (Enquanto) para encontrar o n atual que
ocupa a posio, depois feito um deslocamento dos ponteiros, e para isso utilizada
uma varivel que armazena temporariamente os valores do n. Esse descolamento
feito nas linhas 2 1 e 22.
E por ltimo verificado se o n dever ser o ltimo da lista, isto , se a posio
desejada igual ao nmero de ns nas linhas 24 e 25. (Obs.: foi convencionado que
qualquer valor para posio superior quantidade de ns ser o ltimo da lista.)
Para implementarmos os algoritmos para criao e manipulao de listas de en
cadeamento simples em Java, precisaremos pensar um pouco diferente: nos algoritmos
declaramos uma varivel do tipo registro, que ir conter os elementos da lista (ns), de
claramos uma varivel que ir referenciar os elementos (apontador) e ento declaramos
a lista.

'

19 3

CAPITULO 10- ESTRUTU RAS D E DADOS DINAMICAS

Em Java isso pode ser muito mais simples: basta criarmos uma classe que ir
representar o n, a qual deve conter a rea de dados - no caso do exemplo, a varivel
do tipo inteiro e a varivel que ir referenciar o prximo elemento, o apontador, no caso
do exemplo prox.
EXEMPLo 10.4:
1.

Classe que cria a estrutura de um n simples.

class IntNoSimples {

2.

int valor;

3.

IntNoSimples prox;

4.
5.

IntNoSimples(int ValorNo) {

6.

valor

7.

prox = null;

ValorNo;

8.

9.

}
A classe

IntNoSimples possui a declarao de duas variveis: valor, que


do tipo inteiro, e prox, que do tipo IntNoSimples. Observe que essa varivel
recebe o mesmo nome da classe, isso se faz necessrio porque a varivel prox o

campo que faz referncia ao prximo elemento da lista. Como em Java no so aceitos
ponteiros, essa varivel dever referenciar o prprio elemento, por isso deve possuir a
mesma estrutura do n.
LEMBRE-sE:

Os programas escritos em Java podem ser reutilizados, ento a classe


IntNoSimples poder ser ul'ilizada por vrios programas que preci
sem de um n com encadeamento simples.

Essa classe tambm possui um mtodo construtor chamado IntNoSimples


(linha 5) que recebe como parmetro passado por valor um valor para a varivel
ValorNo. Como j vimos no Captulo 7, a passagem de parmetro por valor no altera
o valor original da varivel, garantindo assim que o n ter o seu valor preservado.
Na linha 7 a varivel prox recebe um valor nulo, isso acontece porque quando
um novo elemento inserido na lista ele pode vir a ser o ltimo elemento e, sendo
assim, no possui prximo elemento. Veja na ilustrao abaixo:
N
..

..

..

.
.
.

..

dados

.
.

..

.
.
.
.

prximo

dados
prximo

..

.
.
.
.

dados
.

proxmo
.

I/

dados
prximo

No existe prximo
elemento para o elemento
E", por isso o valor da
varivel prox deve r ser
nulo.

E.

E,

I FIGURA

10.9 1 Insero de um n no incio da lista (simples)

'

194

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

EXEMPLO 1 0.5:

A classe ListaSimples101 cria a estrutura de uma lista, cujos ns te


ro a estrutura definida pela classe IntNoSimples. Neste exemplo os
ns so inseridos sempre no final da lista.

1.

c1ass ListaSimp1es101{

2.

IntNoSimples primeiro,

3.

int numero_nos;

ultimo;

4.
ListaSimples101

5.

() {

6.

primeiro = ultimo - null;

7.

numero_nos = O;

8.

9.
10.

void insereNo_fim (IntNoSimples novoNo){

11.

novoNo.prox = null;

12.

if (primeiro == null)

13.

primeiro = novoNo;

14.
if (ultimo ! = null)

15.

ultimo.prox

16.

17.

ultimo = novoNo;

18.

numero_nos++;

19.
20.

novoNo;

}
}

Na linha 2 as variveis primeiro e ultimo, que representaro respectiva


mente o primeiro e o ltimo elemento da lista, so definidas como do tipo IntNoSim
ples.

O construtor ListaSimpleslOl ( ) , linha 5, constri uma lista vazia. Na


linha J O o mtodo insereNo_f im recebe como parmetro a varivel novoNo, que
do tipo IntNoSimples; se esse for o primeiro elemento da lista, ento a varivel
primeiro receber o valor do novoNo; se j houver outros elementos ele ser acres
centado no final da lista.
LEMBRE-SE:

O mtodo construtor sempre leva o nome da classe.

O programa Exemploll acrescenta valores lista. Na linha 3 criado o obje


to Slist, que do tipo ListaSimpleslOl. Nas linhas seguintes o mtodo
insereNo_f im utilizado para inserir os valores na lista. Observe que o valor do n
passado como parmetro para o mtodo IntNoSimples e ficar armazenado na
varivel ValorNo.

EXEMPLO 10.6:

Programa em Java para

utilizar a ListaSimples101.

'

19 5

CAPITULO 10- ESTRUTURAS D E DADOS DINAMICAS

1.

class Exemplo101 {

2.

public static void main (String [ J

args ) {

3.

ListaSimples101 Slist

4.

Slist. insereNo- fim (new IntNoSimples

(1) ) ;

5.

Slist. insereNo-fim (new IntNoSimples

(3) ) ;

6.

Slist. insereNo-fim (new IntNoSimples

(5));

7.

Slist. insereNo-fim (new IntNoSimples

(7) ) ;

new ListaSimples101

();

8.
9.

}
No ExemplolOl, os valores so inseridos na lista sem o auxlio do
usurio, j no Exemplo102 o usurio quem digita os valores a serem
inseridos na lista.

Programa completo para implementao de uma lista de encadeamento

EXEMLo 10.7:

simples na qual so acrescentados os mtodos para manipulao da lista:

buscaNo, insereNo_inicio, insereNo_fim, insereNo_


posicao, ContarNos e exibeLista. Confira no programa!
1.

class ListaSimples102 (

2.

IntNoSimples primeiro,

3.

int numero_nos ;

4.

ListaSimples102

ultimo;

() {

primeiro = ultimo = null;

5.
6.

7.

void insereNo_fim ( IntNoSimples novoNo ) {

8.

novoNo . prox = null;

9.

if

(primeiro == null)
primeiro = novoNo;

10.
11.

if

(ultimo ! = null)
ultimo . prox = novoNo ;

12.

ultimo = novoNo ;

13.
14.

15.

void insereNo_inicio

16 .

if

17.

(IntNoSimples novoNo ) {

(primeiro ! = null)
novoNo .prox = primeiro;

18.

else
(primeiro == null )

19.

{ if

20.

primeiro = novoNo ;

21.

ultimo = novoNo ;

22.

23.

24.

int ContarNos ( )

25.

{ int tamanho = O ;

26.

IntNoSimples t emp_no - primeiro;

27.

while

( temp_no ! = null)

28.

{ tamanho++;

29.

temp_no = temp_no . prox;

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

196

30.

31.

return tamanho;

32 .

33 .

void insereNo_posica o (IntNoSimples novoNo,

34 .

{IntNoSimples temp_no = primeiro;

35.

int numero_nos = ContarNos ( ) ;

36.

int pos_aux ;

37.

i f ( posicao == 0 )

38.

{novoNo . prox = primeiro;

39.

if (primeiro == ultimo)

40.

int posicao)

{ultimo = novoNo ; }
primeiro = novoNo;}

41.

else

42 .
43.

{ i f (posicao <= numero_nos}

44.

{ pos_aux = 1 ;

45.

whi l e ( temp_no ! = null && posicao > pos_aux)


{temp_no = temp_no . prox;

46.
47.

pos_aux ++;

48.

49.

novoNo .prox = temp_no . prox;

50.

temp_no . prox = novoNo;

51.

52.

else

53.

{ i f (posicao > numero nos)

54.

{ultimo.prox = novoNo ;

55.

ultimo = novoNo;

56.

57 .

IntNoSimples buscaNo (int buscaValor ) {

} } }

58.

int i = O ;

59.

IntNoSimples temp_no = primeiro;

60.

while ( temp_no

! = null)

{ i f (temp_n o . valor == buscaValor)

61.

{System . o u t . println("No

62 .
posio

return temp_no;

64.

65.

i+ +;

66.

temp_no - temp_no.prox;

68.

return nul l ;

69.

70.

void excluiNo ( int valor)

71.
72.

+ temp_no . valor + "

+ i);

"

63 .

67 .

"

{ IntNoSimples temp_no - primeiro;


while ( temp_no

73 .

! = null && temp_no .valor ! = valor)

{temp_no = temp_no .prox;

74 .

75.

temp_no . prox = temp_no . prox.prox;

76.

if (ultimo == temp_no .prox)

'

CAPITULO 10- ESTRUTURAS D E DADOS DINAMICAS

19 7

ult imo = temp_no;

77.
78.

79.

void exibeLista ( )

80.

.
{IntNoSimples temp_no - pr1.me1.ro;

81.

int i

82.

while ( t emp_no

83.

O;
! = null)

{System . out.println( "Valor " + temp_no.valor + "


posio " + i ) ;

84.

temp_no

85.

i++;

86 .

temp_no .prox;

} } }

Alguns dos mtodos apresentados no exemplo ListaSimples102 no foram


escritos no algoritmo ExemploListaSimples, por isso vamos discutir cada um dos
mtodos do exemplo ListaSimples102:

insereNo_fim- esse mtodo deve receber como parmetro o valor que

ser includo no final da lista; nesse caso esse valor est sendo representado
pela varivel novoNo do tipo IntNoSimples (linha 7). Observe que o
valor de prox do novoNo dever ser nulo e se a lista estiver vazia o primeiro
elemento ir receber o novoNo. Se o ltimo elemento for diferente de nulo,
o prox (apontador) do ltimo n dever fazer referncia ao novoNo e ento
o valor do novoNo dever ser armazenado na varivel ultimo.
O mtodo insereNo_fim no retoma nenhum valor, por isso do tipo void.

insereNo_inicio - esse mtodo deve receber como parmetro o valor

que ser includo no incio da lista; nesse caso esse valor est sendo represen
tado pela varivel novoNo do tipo IntNoSimples (linha 15). Deve-se
verificar se j existe algum n na lista, isto , se a varivel que representa o
primeiro n contm valores; se isso for verdadeiro, o prox do novoNo de
ver fazer referncia ao primeiro n (linha 17) e armazenar na varivel pri
meiro o valor do novoNo; caso contrrio dever ser verificado se o primei
ro nulo, isto , se a lista estiver vazia, ento as variveis primeiro e
ultimo recebero o valor do novoNo.
O mtodo inserNo_inicio no retoma nenhum valor, por isso do tipo
void.
I...:EMBREsE:

Quando a lista est vazia ou contm apenas um n o valor das vari


veis que representam o primeiro e

tltimo ns so iguais!

ContarNos - esse mtodo no recebe nenhum parmetro, mas deve retor

nar um valor do tipo inteiro (linha 24). utilizado para verificar a quantidade
de ns que a lista contm.

'

198

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

insereNo_posicao - esse mtodo recebe dois parmetros, um para

novoNo do tipo IntNoSimples e outro para posicao, que do tipo


inteiro. A varivel posicao representa a posio em que o n dever ser

inserido no conjunto. Para determin-la devemos verificar a quantidade de


ns da lista com o mtodo ContarNos ( ) e ento, se ela no for a primeira
posio da lista, varrer a lista procura da posio desejada (linha 45). Para
isso utilizado um n auxiliar chamado temp_no. Cada vez que um n
lido, deve-se indicar a leitura do prximo, ento temp_no dever receber o
valor de t emp_no . prox (linha 46), que traz a referncia ao prximo n e
conseqentemente o seu valor.
No caso de a posio desejada ser maior do que o nmero de ns, o novoNo
ser inserido como ltimo n da lista (linha 53).
Em todos os casos dever ser feito o posicionamento do novoNo no conjunto
e para isso, devem-se alterar as referncias. Veja como exemplo novoNo . prox
temp_no. prox; temp_no. prox
novoNo (linhas 49 e 50).
=

Vamos seguir o mesmo exemplo apresentado no algoritmo do Exemplo I 0.6:


insereNo_po sicao ( 2, 1) - o valor 2 dever ser inserido na posio I
da lista. O valor 2 estar representado pelo novoNo e o valor 1 , pela varivel
posicao, ento temos o esquema mostrado na Figura 10.10.
Quando o n que ocupa a posio desejada (1) for encontrado, o lao de
repetio ser encerrado (linhas 45 a 48), ento o valor que estar armazena
do em temp_no ser o valor do n que ocupa a posio anterior desejada
e o temp_no. prox conter a referncia ao n que est na posio desejada.
Aps o encerramento do teste de repetio feita a alterao das referncias
dos ns para que o novoNo possa ser inserido:

novoNo . prox

novoNo.prox

temp_no. prox; em nosso exemplo temos:

a referncia para o n com valor 3;

..... . -....- . ..... .


..- n que ocup \
\.a.-..posio
1. /
. . .. . ..-...
1

nulo

prximo

prximo

prximo

prximo

prximo

prximo

prximo

prximo

prOXImO

1FIGURA 10.1 oi Insero de um n em uma posio especfica na lista (simples)

nulo

CAPTULO 10- ESTRUTURAS D E DADOS DIN MICAS

temp_no . prox

19 9

novoNo, com isso o n de valor 1 (que ocupa a

posio 0) far referncia para o novoNo e este far referncia para o n


com valor 3.

buscaNo - esse mtodo recebe como parmetro um valor inteiro para a

varivel buscaValor. Ns utilizamos a varivel temp_no (novamente!)


para nos auxiliar na localizao do n, para isso feita a varredura de todos os
ns da lista por meio de uma estrutura de repetio (linha 57) que compara
temp_no . valor com a buscaValor e, quando encontra o n, retoma o
temp_no, caso contrrio retoma nulo.

excluiNo - esse mtodo recebe como parmetro um valor inteiro para a

varivel valor, que ser o valor do n a ser excludo. Nesse caso tambm
utilizamos o temp_no e uma estnttura de repetio para percorrer a lista
enquanto o valor no for igual ao temp_no . v a l o r ou enquanto o
temp_no . prox no for nulo. Quando o n encontrado, ento necess
rio que se deixe de fazer referncia a ele, o que feito na linha 75, onde o
temp_no . prox recebe o valor do prximo elemento do prximo.
O mtodo excluiNo no retoma valores.

exibeL i sta - esse mtodo no recebe parmetros e tambm no retoma

valores. Ele exibe os ns da lista e, para isso, utilizada a estrutura de repeti


o, que ir repetir o bloco para exibir o n, enquanto no for encontrado
nenhum n nulo.

EXEMLo 1 o.a:

Com programa Exemplo102 poderemos utilizartodos os mtodos da clas


se ListaSimples102.

1.

import java . i o. *;

2.

class Exemplo102

3.

/* Constri um menu de opes para manipulao da lista*/


public static void escolhas

()

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.

14.

public static void m a i n ( String args [ ] ) {

15.

ListaSimples102 Slist = new ListaSimples102 ( ) ;

16 .

BufferedReader entrada ;

17 .

'

200

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

entrada = new BufferedReader (new


InputStreamReader (System. in) ) ;

18.

int i = O ;

19.

IntNoSimples temp_no;

20.

int valor;

21 .

try (

22 .

escolhas ( ) ;

23 .

char opcao = entrada . readL ine ( ) . charAt ( O ) ;

24.

while (opcao

! = '7')

25.

switch (opcao}

26 .

case

27 .

'1'

System .out .print l n ( "Inserir um N no inicio da


lista " ) ;

28.

System. out . println( "Digite um valor" ) ;

29.

valor = Integer .parseint ( entrada . readL ine ( ) ) ;

30.

Slist. insereNo_ini c i o ( new IntNoSimples (valor ) ) ;

31.

break;

32 .

case '2'

33.

System . o u t . println("Inserir um Valor no final da


lista " ) ;

34.

System . o u t . println("Digite um valor " ) ;

35.

valor = Integer .parseint ( entrada . readL ine ( ) ) ;

36.

S l i s t . insereNo fim(new IntNoSimples(valor} ) ;

37 .

brea k;
case

38.
39.

'3'

System . out . println("Inserir um Valor numa dada


posicao" J ;

40.

System . o u t . println("Digite um valor" ) ;

41.

valor = Integer .parseint ( entrada . readL ine ( ) ) ;

42 .

System . ou t . println("Digite a posicao" ) ;

43 .

int posicao = Integer .parsein t ( entrada . readLine( ) ) ;

44 .

Slist. insereNo_posicao ( new


IntNoSimples(valor) ,posicao) ;

45.
46 .

break;
case

'4':

47 .

System . out . println( "Localiza um valor" ) ;

48.

System . o u t . println( "Digite um va lor" ) ;

49.

valor = Integer .parseint ( entrada . readLine ( ) ) ;

50.

Slist .buscaNo(va l or ) ;

51 .

break;

52 .

case

'5' :

53 .

System . o u t . println ( "Exclui um elemento da lista " ) ;

54.

System .out .println ("Digite o valor" ) ;

55.

valor = Intege r . parseint ( entrada . readLine ( ) ) ;

56 .

S l i s t . excluiNo(valor ) ;

57 .

break;

58.
59.

case

'6 ' :

System . ou t . p rintln( "Exibe a lista " ) ;

CAPTULO 10- ESTRUTURAS D E DADOS DIN MICAS

60.

S l i s t . exibeLista( ) ;

61.

break;

62.

default

63.
64.

}
System .out. println ( ) ;

65.

escolhas ( ) ;

66 .

opcao = entrada . readLine () . charAt ( O ) ;

67.

System .out. println

201

( " Opcao Inva lida ! " ) ;

68.

catch

69.

(Exception erro ) {

System. out . println ( "Erro de Entrada de Dados" ) ;

}}}

70.

1 0 .3 LISTAS DUPLAMENTE E N CADEADAS

Quando se percorre uma lista de encadeamento simples bastante difcil fazer o


caminho inverso, j nas listas de encadeamento duplo esse problema no existe, pois
cada n possui uma referncia para o prximo elemento da lista e outra para o anterior.
A concepo de uma lista duplamente encadeada bastante similar dos sim
ples, basta acrescentar ao n uma varivel que far referncia ao elemento anterior, da
mesma maneira que feito com o prximo. Veja na linha 6 do ExemploLis taDupla:

ExEMPLo 10.9:

Pseudocdigo para representar uma lista duplamente encadeada.

1.

Algoritmo ExemploListaDupla

2.

Tipo apontador:

3.

ANoDuplo

NoDuplo = registro

4.

va lor:

5.

prox: apontador

6.

ant:

7.
8.

inteiro

apontador

fim
ListaDupla = registro
primei ro : apontador

9.
10.

ultimo:

11.

numero_nos:

12.
13 .

apontador
inteiro

fim
Inicio

14.

ListaDupla. numero_nos O

15.

ListaDupla. primeiro nulo

16 .

ListaDupla. ultimo nulo

Para escrevermos algoritmos de manipulao de lista duplamente encadeada po


demos seguir o mesmo raciocnio adotado para o entendimento da lista de encadeamen
to simples, mas devemos lembrar que o n anterior tambm precisa ser referenciado a
cada manipulao.

'

202

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

No algoritmo a seguir, que continuao do ExemploLis taDupla, demons


traremos os procedimentos para inserir um n no final da lista e para excluir um n de
acordo com a sua posio.
Nesta soluo para excluso de n necessrio descobrir qual o n que ocupa
a posio desejada para a excluso; para isso, utilizaremos a funo pegarNo ( } . Essa
funo recebe como parmetro o ndice do n a ser excludo e retoma o prprio n.
.

17 .
18.

Procedimento InsereNo_fim {var novoNo: NoDuplo)


inicio

19.

NovoNo A . prox

nulo

20.

NovoNo A . ant

21 .

if(ListaDupla . primeiro

22.

ListaDup l a . primeiro

f-

u ltim o

t-

nulo)

f-

novoNo

23.

fim-se

24.

i f {ListaDupla.ultim o < > nulo)

25.

ListaDupla . u l t imoA . prox

26.

fim-se

27 .

L is taDup la . u ltim o

t-

f-

novoNo

novoNo

28.

ListaDupla . numero_nos f- ListaDupla.numero_nos + 1

29.

fim

30.

Procedimento pegarNo {var indice:

31.

var

32 .

temp_no: NoDuplo

33.
34.

i:

inteiro) : NoDuplo

inteiro

J.nl.Cl.O
.

35.

temp_no

36.

Enquanto ( t emp no

f-

ListaDup l a . primeiro
_

37 .

temp_no

38.

i t- i + l

f-

<

>

nulo && i

<

- indice)

temp_noA. prox

39.

f im_enquanto

40.

Return temp_no

41.

fim

42.

Procedimento InsereNo_posic a o ( novoNo: NoDupl o ,

43.

var

44 .
45.

temp_no : NoDuplo
inicio

46.

temp_no

47.

novoNoA.prox

48.

Se

f-

pegarNo (indice)
f-

temp_no

( temp_noA . prox < > nulo)

ento

49.

novoNo". ant f- temp_noA. ant

50.

novoNo". proxA. ant f- novoNo

51.

Seno

52 .

novoNo A . ant f- novoNo

53.

ListaDupla .ultimo

54.

fim-se

55.

Se

56.

{ ndic e = 0 )

f-

novoNo

ento

ListaDup l a . primeiro f- novoNo

ndice: inteiro)

'

CAPITULO 10- ESTRUTURAS D E DADOS DINAMICAS

57.

203

Seno
novoNoAan t A . prox f- novoNo

58.
59.

fim-se

60.

ListaDupla.numero_nos

f-

L i staDupla . numero_nos + 1

61 .

fim

62.

Procedimento excluiNo ( i ndice: inteiro)

63.

var

64.

temp_n o : NoDuplo

65.

l.nl.Cl.O

66 .

Se

( indice

0)

ento

67.

L istaDupla . primeiro f- ListaDupla . primeiroA.prox

68.

Se (Li staDupla. primeiro < > nulo) ento


ListaDupla. primeiroA .ant f- nulo

69.

fim-se

70.
71.

Seno

72.

Se

(temp_n o < > ult imo}

f-

73.

temp_no

74.

temp_n o A . a n t A . prox

pegarNo(indice)

f-

temp_n o A . a n t

Seno

75.

ListaDup l a . u ltimo f- temp_no

76 .

fim-se

77.
78.

fim-se

79.

L i s taDupla.numero_nos

f-

Lis taDupla . numero_nos

fim

80.
81.

ento

fim.

seguir ser apresentada a implementao da lista duplamente encadeada em


Java. Observe que na classe IntNoDuplo, criada a estrutura do n, assim como
fizemos para a lista simples, apenas acrescentamos o campo de referncia ant que ir
fazer referncia ao n anterior.
A

EXEMPLO 10.1o: Classe que cria um


1.

n duplo.

class IntNoDuplo(

2.

int valor;

3.

IntNoDuplo prox;

4.

IntNoDuplo a n t ;

5.
6.

In tNoDuplo ( i n t ValorNo) (

7.

valor = ValorNo;

8.

prox

ant = null;

9.
10.

ExEMPLO 1 o. 1 1: Implementao dos mesmos mtodos utilizados no algoritmo


ExemploListaDupla.

1.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

204

class ListaDuplal04(

2.

IntNoDuplo primeiro, ultimo;

3.

int numero_nos;

4.
5.

ListaDuplal04

()(

6.

primeiro = ultimo - null;

7.

numero_nos = O ;

8.

9.
10.

void insereNo

(IntNoDuplo novoNo ) {
null;

11.

novoNo . prox

12.

novoNo . ant = ultimo;

13 .

if

(primeiro == null)
primeiro = novoNo;

14.
15.

if

16.

(ultimo ! = null)
ultimo . prox = novoNo;

17.

ultimo = novoNo;

18.

numero_nos++;

19.

20.

IntNoDuplo pegarNo

(int indice ) (

21.

IntNoDuplo temp_no = primeiro;

22 .

for

23 .

(int i = O ;

( i < indice)

&&

( t emp_no

temp_no = temp_no .prox;

24.

r e turn temp_no;

25.

26.

void incluiNo

(IntNoDuplo novoNo,

int indice ) {

27 .

IntNoDuplo temp_no = pegarNo ( indice ) ;

28.

novoNo . prox = temp_no;

29.

if

(novoNo .prox != nul l ) {

30.

novoNo . ant = temp_no .ant;

31.

novoNo .prox.ant = novoNo;


} else {

32.
33 .

novoNo . ant = ultimo;

34.

ultimo

35.

36.

if

37.
38.

novoNo;

( indice == O )
.
.
prmero = novoNo;

else

39.

novoNo .ant.prox = novoNo;


numero_nos++;

40.
41.

42 .

void excluiNo (int indice) {

43.

if

(indice

==

0){

44.

pr1me1ro = pr1me1 r o . prox;

45.

if

48.

(primeiro ! = null)
primeiro .ant = null;

46.
47 .

! = null ) ;

} else(
IntNoD uplo temp_no

pegarNo

(indice ) ;

i++)

'

205

CAPITULO 10- ESTRUTURAS D E DADOS DINAMICAS

49.

temp_no .ant.prox

50.

if ( temp_no

temp_no .prox;

! = ultimo)

temp_no .prox.ant

51.

temp_no . a n t ;

else

52.
53.

ultimo

54.

55.

numero_nos- ;

56.
57.

temp_no ;

}
}
1 o. t 2: Este programa utiliza as classes criadas no Exemplo 10.11.

1.

class Exemplol 04{

2.

public static void main ( String [l

args) {

3.

ListaDuplal04 Slist - new ListaDuplal04

4.

Slist. insereNo (new IntNoDuplo ( 1 ) ) ;

5.

S1ist. insereNo (new IntNoDuplo ( 3 ) ) ;

6.

S l i s t . insereNo (new IntNoDuplo ( 5 ) ) ;

7.

S l i s t . insereNo (new IntNoDuplo

8.

IntNoDuplo temp_no = Slist. primeiro;

9.

while (temp_no

();

{7) ) ;

! = null) {

10.

System . o u t . println

11.

temp_no = temp_no .prox;

( t emp_no .valor ) ;

12.

13 .

Slist. incluiNo (new IntNoDuplo

14.

System .out.println ( "Apos incluir o no 2 . . . " ) ;

15.

temp_no = S l i s t . primeiro;

16.

while (temp_no

{2) ,

1) ;

! = null) (

17.

System . o u t . println

18.

temp_no = temp_no .prox;

( t emp_no .valor ) ;

19.

20.

Slist. excluiNo ( 2 ) ;

21.

System .out.println ( "Apos excluir o no 3 . . . " ) ;

22.

temp_no = S l i s t . primeiro;

23 .

while (temp_no

! = null) (

24.

System . o u t . println

25 .

temp_no

temp_no . prox;

26.
27.
28 .

( temp_no .valor ) ;

}
}

1 0 .4 FILAS

Acho que todos ns j ficamos em uma ftla. Fila para comprar ingressos para
shows, pegar dinheiro no banco e, s vezes, at para comprar o pozinho da manh. O
conceito de fila em programao o mesmo dessas filas em que esperamos para ser
atendidos em ordem: o primeiro elemento a entrar na fila ser o primeiro elemento a

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

206

sair. Esse conceito conhecido como 'First In, First Out' ou FIFO, expresso conhecida
em pottugus como PEPS ou 'Primeiro Que Entra, Primeiro Que Sai'. Ento, no concei
to de fila, os elementos so atendidos, ou utilizados, seqencialmente na ordem em que
so armazenados.
As filas (queues) so conjuntos de elementos (ou listas) cujas operaes de in
sero so feitas por uma extremidade e de remoo, por outra extremidade.
Como exemplo pode-se implementar uma fila de impresso, em que os arquivos
a ser impressos so organizados em uma lista e sero impressos na ordem de chegada,
medida que a impressora estiver disponvel.
Seqncia armazenada em fila

li

li

Novos elementos

O primeiro elemento a

so armazenados

entrar ser o primeiro

no fim da fila

elemento a sair (FIFO)

I FIGURA

1 o. 1 1 I Conceito de fila

Conforme comentamos na introduo de listas, a implementao das listas, filas,


pilhas e rvores pode ser feita por meio de arranjos ou de ponteiros. At agora fizemos
as implementaes utilizando ponteiros, ento iremos exemplificar a implementao de
filas e pilhas por meio de arranjos, uma vez que o exemplo pode ser facilmente adaptado
para o uso de ponteiros.
LEMBRE -sE:

Ao implementarmos a fila por meio de arranjos, estaremos utilizando


um vetor como continer para o armazenamento dos elementos que
estaro na fila.

Para definir a estrutura de uma fila, implementada por arranjo, necessrio cons
truir um registro que contenha as informaes da fila, como o incio, o final e o continer
de elementos, que um vetor; nesse caso cada um dos elementos da fila ser represen
tado por uma posio no vetor. Veja a estrutura:
ExEMPLO 10.13: Pseudocdigo que representa uma fila implementada com arranjo.
1.

Algoritmo Fila

2.

var

'

CAPITULO 10- ESTRUTURAS D E DADOS DINAMICAS

207

Tipo fila_reg - registro

3.
4.

inicio:

5.

fim:

6.

elemento : vetor [ 1

7.

inteiro

inteiro
.

50]

de inteiro

fim
total:

8.

inteiro

fila:
.
l.nl.Cl.O

9.

10.

fila_reg

f- O
fila. fim f- O
total f- O

11.

fila. inicio

12.
13.

Observe que a varivel elemento, que do tipo vetor, comporta 50 nmeros


inteiros. Essa caracterstica um limitador para trabalharmos com arranjos, pois pode
remos inserir apenas 50 valores!
Para implementar uma fila com o uso de ponteiros (alocao dinmi

NOTA:

ca), basta utilizar o n e fazer as manipulaes de acordo com o con


ceito PEPS.

Algoritmo que representa uma fila implementada com arranjo


14.

Funo vazia (

15.

l.nl.Cl.O

16.

Se ( total

17.
18.

21.
22.
23.
24.

29.
30.

31.
32.

entao

return . f .
fim-se
fim
Funo cheia (

) :

lgica

J.nl.Cl.O
Se ( total >= 5 0 )

ento

return . v .
Seno

27.
28.

0)

Seno

25.
26.

lgica

return . v .

19.
20.

) :

return . f .
fim-se
fim
Procedimento enfileirar (elem:

inteiro)

inicio
Se

(cheia( )

= . f . . ) ento

33.

f i l a . elemento [inicio] elem

34.

f i l a . fim

35 .

total f- total + 1

36.

Se

37.

38.

f-

fila. fim + 1

( f i l a . fim >= 5 0 )
fila. fim = O

fim-se

ento

39.

Seno

40.

Mostre ( "Fila cheia ! " )

41.
42.
43.
44.

fim-se
fim
Funcao desenfileirar(

inte i ro

var

45.
46.

'

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS

208

excluido: inteiro
l.nl.Cl.O
Se (vazia( )

47 .

48.

excluido

49.

fila. inicio

50.

Se

51.

f-

.f.)

ento

f i l a . element o [ inicio)

f-

fila. inicio + 1

( fi la . in i cio

>

fim- se

53 .

total f- total - 1

54.

Seno

55.

excluido f- nulo

56.

retorne excluido

57.

fim-se

59.
60.

var
i:

inteiro

l.nl.Cl.O
Para ( i f- O at total)

64 .

Mostre ( " Posio " ,

65.

67 .

retorne excluido

Procedimento exibeF i l a ( )

63 .

66.

ento

fim

61.
62 .

tamanho )

f i l a . inicio f- O

52 .

58.

faa

i1

" valor "

elemento [ i ) )

fim-para

fim
fim.

A seguir ser apresentado o programa escrito em Java para representar esse algo
ritmo, ento faremos as explicaes do cdigo, assim evitaremos a repetio das expli
caes, que so similares para o cdigo e para o algoritmo!
Java: classe que representa uma fila implementada com arranjo
1.

class Fila {

2.

int tamanho;

3.

int inicio;

4.

int fim;

5.

int total;

6.

Object vetor [ ) ;

7.

Fila ( int tam)

8.

inicio = O ;

9.

fim = O ;

10.

total = O ;

11.

tamanho

tam;

'

CAPITULO 10- ESTRUTURAS D E DADOS DINAMICAS


vetor = new Object [ tam] ;

12.
13 .

14.

public boo1ean vaz1a ( )

15.

if

16.

( total

0)

==

return true;
else

17.

return false;

18.
19.

20.

public boo1ean cheia ( )


if

21.
22.

( total

>=

tamanho)

return true;

23 .

else

24.

return false;

25.

26.

pub1ic void enfi1eirar(Object elem)


if

27.
28.

( ! cheia ( ) )
{ vetor [ f i m ]

e1em;

29.

fim++;

30.

total++;

31.

i f (fim >= tamanho)


fim =

32.
33.

34.

else

O;

{ System.out .println ( "Fila Cheia" ) ;

35.
36.

37.

38.

public Object desenfileirar ( )

39.

{ Object excluido;

40.

{ if

(vazia ( ) == fa1se)

41.

{exc1uido = vetor [inicio ] ;

42.
43 .

inicio++;
if

( inicio

>=

tamanho )

inicio = O ;

44.
45.

total -;

46.

return excluido;

} e1se

47.
48.

{ excluido = nu11;

49.

return excluido;

50.

51.

52.

53.

public void exibeFil a ( )

54.

{for (int i

O ; i < total; i++)

{System . o u t . p rintln("posicao " + i + " valor

55.

vetor [ i l l ;

56.
57.
58.

209

"

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

210

Para representarmos uma fila em Java criamos a classe Fila, que contm as
variveis para tamanho da fila, incio e fim da fila, total de elementos da fila e o vetor
para armazenamento dos elementos, linhas 1 a 6. Observe que o vetor ir armazenar
elementos do tipo objeto; nesse caso, podem ser armazenados quaisquer tipos de valo
res e essa fila pode ser considerada uma fila genrica. Observe tambm que o tamanho
do vetor passado como parmetro para o mtodo construtor, linha 7.
Vamos discutir cada um dos mtodos que foram apresentados no programa F i la:
vazia ( ) e cheia ( ) - linhas 14 e 22, no recebem nenhum parmetro e

retornam um valor lgico. Esses mtodos so utilizados para verificar se a fila


est vazia ou cheia. A verificao feita comparando-se a varivel total
com O ou com a quantidade de elementos que o vetor compo1ta, no caso do
exemplo apresentado para vazia (linha 16) Se o total for igual a O, significa
que a fila est vazia e o mtodo retornar verdadeiro, caso contrrio
retornar falso. J para verificarmos se a fila est cheia, na linha 24 o teste
feito compara o total com a quantidade de elementos que o vetor comporta
(tamanho), ento se isso for verdadeiro significa que a fila est cheia e
o retorno verdade iro, caso contrrio o retorno falso.
Essas funes sero utilizadas nas chamadas aos mtodos para enfileirar ou
desenfileirar elementos. Elas so importantes para que seja verificado se es
sas operaes sero ou no possveis de ser realizadas.
enfileirar -linha 26, recebe como parmetro um valor do tipo Obj ect

para a varivel elem e no retoma nenhum valor, por isso do tipo void.
Na linha 27 feita uma chamada ao mtodo cheia para verificar se poss
vel a insero de um novo elemento na fila. A expresso ! cheia ( ) simi
lar a cheia ( ) ==false. O elemento deve ser inserido no final da fila, a fim
de que seja respeitado o conceito PEPS, ento o ltimo elemento do vetor
dever ser o elemento que est sendo inserido: vetor [ f im] =elem (linha
28). As variveis fim e total devem ser incrementadas, ento verificado
se a varivel fim maior ou igual a tamanho, para garantir que a fila con
tenha a quantidade de elementos que podem ser comportados pelo vetor esse recurso fora a circularidade da fila. Veja o esquema a seguir:
Suponha que a fila tenha capacidade para cinco elementos do tipo inteiro:
posao

valor

45

32

organizao

primeiro elemento
I FIGURA

ltimo elemento

1 o. 1 2 1 Representao de uma fila

Se retirarmos um elemento, o elemento a ser retirado ser o que est em pri


meiro lugar na fila, no caso ele ocupa a posio O e seu valor 45. Com a
retirada do elemento a fila ficar da seguinte maneira:

CAPITULO 1 0 - ESTRUTURAS DE DADOS DINAMICAS


'

21 1

posio

valor

32

organizao

primeiro elemento

ltimo elemento

Incio

Fim

I FIGURA 1 o. 1 3 1 Represenlao da fila aps a remoo de um elemento

O elemento que passou a ser o primeiro da fila ocupa a posio 1 no vetor e o


seu valor 7. Observe que ainda cabe um elemento. Conforme os elementos
vo sendo retirados da fila, o incio da fila deve ser incrementado, de maneira
que o primeiro elemento do conjunto a entrar na fila seja sempre o primeiro a
sa11.
o

Quando o tamanho da fila, que determina o nmero de posies que o vetor


pode conter, estiver completo, se existirem posies vazias os elementos in
seridos devero ocupar as posies 'desocupadas' que esto no incio do ve
tor, por isso o fim da lista zerado (linhas 3 1 e 32), sempre respeitando a
ordem imposta por PEPS. Para isso o incio e o ftm devem ser incrementados.
posio

valor

32

novo valor

organizao

primeiro elemento

ltimo elemento

Incio

Fim

I FIGURA 1 o. t 4 l Represencao do fim da fila

Quando um novo valor for inserido ser armazenado na posio


final da fila, e o ltimo elemento ser este!

O,

que o

desenf ileirar - o mtodo desenfileirar no recebe nenhum pa

rmetro, pois o elemento a ser excludo o elemento que est no incio da


fila. Esse mtodo retoma o elemento que est sendo excludo, que do tipo
Obj ect, para isso foi declarada a varivel exclui do, na linha 39. Nesse
caso, se no existir nenhum valor na fila, o retorno do mtodo ser null; isso
possvel pois o dado do tipo Obj ect, que aceita nulos.
oesERvAo:

No algoritmo tambm atribumos nulo ao retomo, somente a ttulo de


representao, pois o tipo de dado que a funo retoma inteiro, e
este no aceita nulos.

Na linha 40 feita uma chamada ao mtodo vazia ( ) , cujo resultado ser


testado. A instruo vazia ( ) ==false similar a ! vazia ( ) , ento, se a
fila no estiver vazia a varivel excludo receber o primeiro elemento da
fila (linha 41) e o incio da fila dever ser incrementado (linha 41) e o total de
elementos, decrementado (linha 45). Note que, na linha 43, se inicio for

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

212

maior ou igual a tamanho o valor de inicio ser zerado. Assim como


fizemos no mtodo insere, com a varivel fim devemos fazer isso para
garantir a circularidade da flla. Veja no exemplo anterior.

exibeFi l a - esse mtodo no recebe nenhum parmetro e tambm no

retorna nada. utilizado para exibir os elementos da fila, o que feito com o
uso da estrutura de repetio for, que repete o processo de exibio do valor
do elemento e da posio que ele ocupa at que a varivel de controle i atinja
o valor do total de elementos.
A classe usaFila possibilita que o usuiio selecione a opo desejada para
manipulao da fila e utiliza todos os mtodos que implementamos na classe Fila.
Java: classe que utiliza uma fila
1.

import j ava . io . * ;

2.

class usaFila {

3.

() {

public static void escolhas

4.

System . out .print

( " Escolha a Opcao : " ) ;

S.

System . o u t . print

( "\ n l .

6.

System. out . print ( " \n2 . Excluir" ) ;

7.

System.out . print ( " \n3. Exibir a Fila" ) ;

8.

System . o u t . print ( " \n4.

9.

System . o u t . print ( " \n . Opcao

Inserir" ) ;

Sair" ) ;
:\t " ) ;

10.

11.

public static void main(String args [ ) ) {

12.

Fila objFila

13.

BufferedReader entrada;

14.

entrada

new BufferedReader(
new InputS treamReader (System. in ) ) ;

15.
16.

Object valor;

17 .

try {

18 .

escolhas ( ) ;

19.

char opcao

20.

while

21.

new Fila ( 10 ) ;

entrada . readLine ( ) . charAt ( O ) ;

(opcao ! = ' 4 ' )

switch (opcao) {

22.

case ' 1 '

23.

if

( ! objFila. cheia ( ) )
( "Digite algo:

24.

{System . out . print

25.

valor

26.

objFila. enfileirar (valor ) ;

27 .

28.

else

");

entrada. readLine ( ) ;

{System. out. println ( "Fila Cheia ! " ) ;

29.
30.

31.

break;

32.

case ' 2 '

33.

if

(objFi l a . vazia ( )

false)

CAPITULO 1 0 - ESTRUTURAS D E DADOS DINAMICAS


'

34.

213

(System . o u t . println
(objFila. desenfileirar ( ) ) ;

35.

36.

else

{System . out . print l n ( " F i l a Va z ia !

37.
38.

39.

break;

40.

case ' 3 '

objFila. exibeFi l a ( ) ;

42.

break;
defaul t

System. out. println ( "Opcao Invalida ! " ) ;

44.

45.

System . ou t . println ( ) ;

46.

escolhas ( ) ;

47.

opcao

48.

entrada. readLine ( ) . charAt ( O ) ;

49.

} catch (Exception erro ) (

50.

System . o u t . println ( "Erro de Entrada de Dados" ) ;

51.
52.
53.

);

41.
43 .

"

1 0 . 5 P I L HA S

As pilhas tambm so conhecidas como lista LIFO (Last In, First Out), que em
po1tugus significa 'ltimo a entrar e primeiro a sair' (UEPS). E uma lista linear em que
'

Novos elementos
so armazenados /.
no topo da pilha

O ltimo elemento
que entrou ser o
primeiro elemento
a sair (UEPS)

Seqncia
armazenada
em pilha

I FIGURA 1 o. s i Conceito de pilha

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

214

todas as operaes de insero e remoo so feitas por um nico extremo denominado


topo. Um exemplo bastante comum em que se aplica o conceito de pilhas o de uma
pilha de pratos que esto guardados no armrio: quando a pessoa vai utilizar um deles
pega sempre o prato que se encontra no topo da pilha, assim como, quando um novo
prato vai ser guardado, colocado no topo. Isso acontece porque apenas uma das extre
midades da pilha est acessvel.
A operao de insero denominada empilhamento e a de excluso,

desempilhamento.
EXEMPLO 1 0. 1 4: Pseudocdigo que representa uma pilha implementada com arranjo.

1.
2.

Algoritmo Pilha
var

3.

Tipo pilha_reg - registro

4.

topo:

5.

elemento: vetor [1 . . 5 0 ]

6.

fim

pilha: pilha_reg

7.
8.
9.
10.
11.

inicio
pilha . topo - 1
Funo vazia (
.
.
nco
Se

14 .

ento

fim
Funo cheia (
.
.
nco

) :

lgica

'

Se

(pilha. topo >= 5 0 )

retorne

21.

ento

Seno

22.

retorne . f .

23.
24.

27.

-1)

fim-se

20.

26.

retorne . f .

16.

25.

(pilha. topo

Seno

15.

19.

lgica

retorne . v .

13 .

18.

) :

'

12 .

17 .

inteiro

fim-se
fim
Procedimento empi lhar (elem:
.
.
nco

inteiro)

'

Se (cheia ( )

28.

. f . ) ento

29.

pilha. topo pilha. topo + 1

30.

elemento . topo elem

31.

Seno
Mostre ( "Pilha Cheia ! " )

32 .
33.
34 .
35.

fim-se
Funo desempilhar (

var

) :

inteiro

de inteiros

CAPITULO 1 0 - ESTRUTURAS D E DADOS DINAMICAS


'

36.

215

valorDesempilhado : inteiro

37.

incio
Se (vazia (

38.

.f.)

ento

39.

Mostre ( " Pilha vazia ! " )

40.

valorDesempilhado t- nulo

41.

retorne (valorDesemp ilhado)

42.

Seno

43 .

valorDes empilhado

44.

pilha. topo

45.

retorne(valorDesempilhado)

t-

t-

pilha.vetor [ topo]

pilha. topo - 1

fim-se

46.
47.

Procedimento exibePilha(

var

48.
49.

50.
51.

i : inteiro

'

l.nl.Cl.O
Para (i

t-

at topo)

Mostre( "Elemento " ,

52.
53 .

faa
elemento [ i ] ,

" posio " ,

i)

Fim-para

fim

54.
55.

fim.

A definio da estrutura da pilha bastante similar definio de uma fila. Ob


serve que na fila temos o incio, o fim e o vetor; na pilha temos o topo e o vetor (linhas
3 a 7). Como na pilha as inseres e remoes so feitas por uma nica extremidade,
denominada topo, no necessrio que se conhea o elemento da outra extremidade; j
na fila isso se faz necessrio, uma vez que as inseres so feitas por uma extremidade
(fim) e as remoes, por outra (incio).
NOTA:

Para implementar uma pilha utilizando alocao dinmica (ponteiros),


basta utilizar a estrutura do n e fazer as manipulaes de acordo com
o conceito UEPS.

A seguir vamos apresentar o programa em Java para implementar uma pilha e


ento faremos os comentrios sobre o cdigo.
Java: classe que representa uma pilha
1.

class Pilha {

2.

int tamanho;

3.

int topo;

4.

Object vetor [ ] ;

5.

Pilha (int tam)

6.

topo = - 1 ;

7.

tamanho = tam;

8.

vetor = nev Obj e c t [ tam] ;

9.
10.

}
public boolean vazia ( )

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

216

11.

{ i f ( topo

12 .

--

-1)

return true;

13 .

else

14.

return false;

15.

16.

publ ic boolean cheia ( )


{ if ( topo >= tamanho)

17 .

return true;

18.
19.

else
return false;

20.
21.

22.

public void emp ilhar ( Object e l em )

{ i f (cheia( )

23.
24 .

== false)

{topo++;

25.

vetor[ topo]

26.

27.

else

28.

elem;

{System.out. print l n ( "Pilha Cheia" ) ;

29.

30.

31.

public Object desempilhar ( )

32 .

(Object valorDesempilhado;

33.

if

34.

(vazia( )

==

false)

{ System. out.print( "Pilha Vazia" ) ;

35.

valorDesempilhado

36.

r e tu rn val orDesemp il hado;

37 .

38.

else
{ valorDesempilhado

39.

nul l ;

vetor [topo ] ;

40.

topo-;

41.

return valorDesempilhado;

42 .

43 .

44.

public void exibePi lha ( )

45.

{for(int i = topo; i > = O ;

46.

System.out.println ( "E1emento " + vetor [ i ]

i-)
+

"

pos1cao " +

i) ;
47 .
48.

No algoritmo criamos um registro para representar a pilha, no programa em Java


devemos criar uma classe. Na detinio do vetor, no algoritmo, determinamos o tama
nho mximo de elementos aceitos: elemento: vetor [ 1 . . 5 0 ] de inteiros. J na
classe podemos defrnir o vetor: Obj ect vetor [ ] , e no mtodo construtor da classe
passar como parmetro o tamanho do vetor: vetor
new Obj ect ( t am ) .
Vamos discutir cada um dos mtodos que foram apresentados no programa Fila:
=

CAPITULO 1 0 - ESTRUTURAS DE DADOS DINAMICAS


'

217

vazia ( ) e cheia ( ) - linhas 10 e 16, no recebem nenhum parmetro e

retornam um valor lgico. Esses mtodos so utilizados para verificar se a


pilha est vazia ou cheia. A verificao feita comparando-se a varivel topo
com -1 ou com a quantidade de elementos que o vetor comporta, no caso do
exemplo apresentado para vazia (linhal 0) Se o topo for igual a -l, significa
que a pilha est vazia e retornar verdadeiro, caso contrrio retornar
falso. J para verificarmos se a pilha est cheia, na linha 16, o teste feito
compara o topo com a quantidade de elementos que o vetor compOita (ta
manha), ento se isso for verdadeiro significa que a pilha est cheia e o retor
no verdadeiro, caso contrrio o retorno falso.
Essas funes sero utilizadas nas chamadas aos mtodos para empilhar ou
desempilhar elementos. Elas so importantes para que seja verificado se es
sas operaes sero ou no possveis de ser realizadas.

empilhar - linha 22, recebe como parmetro um valor do tipo Obj ect

para a varivel elem e no retoma nenhum valor, por isso do tipo void.
Na linha 23 feita uma chamada ao mtodo cheia para verificar se poss
vel a insero de um novo elemento na pilha. O elemento deve ser inserido no
topo da pilha, a fim de que o conceito UEPS seja respeitado, ento o elemento
do topo dever ser o elemento que est sendo inserido: vetor [topo ) =
elem (linha 25), e a varivel topo deve ser incrementada.
Veja o esquema a seguir.
Suponha que a pilha tenha capacidade para cinco elementos do tipo inteiro,
ento vamos inserir o elemento 45:

posio

valor

45

topo

I FIGURA 1 o. 1 61 Insero de um elemento na pilha

Se inserirmos um novo elemento, por exemplo o nmero 7, a pilha ficar da


seguinte maneira:
.

postao

valor

45

topo

I FIGURA 1 o. t 7 l Representalo da pilha aps a insero de um novo elemento

Se continuarmos as inseres at que a pilha fique cheia teremos:

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

218

I FIGURA

1 o. 1 8 1

posio

valor

32

45

topo

Representao da pilha completamente preenchida

Observe que o ltimo valor que foi inserido, o nmero 1 , o valor que ocupa.
o topo da pilha, j o primeiro valor que foi inserido, o nmero 45, fica no final
da pilha e, nesse caso, ser o ltimo elemento a ser retir:ado da pilha (desem
pilhado).

posio

valor

4
3

32

45

topo

I FIGURA 1 o. 1 91 Representao da pilha aps uma remoo

Observe que o elemento seguinte passou a representar o topo.


IMPORTANTE!

Em nossa representao deixamos de mencionar o nmero 1, que esta


va no topo, mas na verdade essa uma operao lgica, e no fsica. A
referncia ao topo passa para o elemento seguinte, com isso o valor
que estava no topo deixa ele ser referenciado na pilha e o seu espao
poder ser ocupado por outro valor.

desempi lhar - o mtodo desemp i lhar no recebe nenhum parme

tro, pois o elemento a ser excludo o elemento que est no topo da pilha.
Esse mtodo retorna o elemento que est sendo excludo, que do tipo
Obj ect, e para isso foi declarada a varivel valorDesempilhado, na
linha 32. Nesse caso, se no existir nenhum valor na fila o retorno do mtodo
ser null, isso possvel pois o dado do tipo Object, que aceita nulos.
0BSERVAOl

No algoritmo tambm atribumos nulo ao retomo, somente a ttulo de


representao, pois o tipo ele dado que a funo retoma inteiro, e
este no aceita nulos.

CAPTULO 1 0 - ESTRUTURAS D E DADOS DINMICAS

219

Na linha 33 feita uma chamada ao mtodo vazia ( ) , cujo resultado ser tes
tado. Ento, se a pilha no estiver vazia, a varivel valorDesempilhado receber o
elemento do topo da pilha (linha 39) e o topo da pilha dever ser decrementado, confor
me visto no exemplo anterior.

exibePilha - este mtodo no recebe nenhum parmetro e tambm no

retoma nada. utilizado para exibir os elementos da pilha, o que feito com
o uso da estrutura de repetio for, que repete o processo de exibio do
valor do elemento e da posio que ele ocupa at que a varivel de controle i
atinja o valor do total de elementos.
A classe usaPilha possibilita que o usurio selecione a opo desejada para
manipulao da pilha e utiliza todos os mtodos que implementamos na classe Pilha.
Java: classe que utiliza uma pilha
1.

import java . i o . * ;

2.

class usaPilha {

3.

()

publ ic static void escolhas

4.

System . o u t . print ( "Escolha a Opcao : " ) ;

5.

System . o u t . print ( " \n1 . Inserir" ) ;

6.

System . o u t . print

( " \n2. Excluir " ) ;

7.

System . o u t . print

"

\n3. Exibir a Pilha" ) ;

8.

System . ou t . print

"

\n4. Sair" ) ;

9.

System . ou t . print

( " \n. Opcao : \t " ) ;

10.
11.

}
public static void main (String args ( ] ) (

12.

Pilha objPilha = new Pilha ( 10 } ;

13.

BufferedReader entrada;

14.

entrada = new BufferedReader (

15.

new InputStreamReader (System . i n ) ) ;

16.

Object valor;

17.
18.

try {

escolhas ( )

19.

char opcao = entrada . readLine ( ) . charAt ( O ) ;

20.

while

(opcao ! = ' 4 ' )

21.

switch ( opcao)

22.

case ' 1 '

23.

if

(objPilha . cheia ( )

== false)

24.

{ System . o u t . print

( "Digite algo:

25.

valor = entrada . readLine ( ) ;

26.

objPilha. empilhar (valor} ;

27.

28.

el s e

29.

{System . out . printl n ( "Fila Cheia ! " ) ;

30.

31.

break ;

32.

");

case ' 2 '

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

220

33.

if

34.

(objPilha . vazia ( )

==

{System . o u t . println (objPilha . desempilhar ( ) ) ;

35.

36.

else
{ System . out . println ( "Fila Vazia! " ) ;

37.
38.

39.

break;

40 .

case ' 3 '

41.

obj Pilha. exibePilha ( ) ;

42 .

break;

43 .

default :

System . o u t . println ( "Opcao Invalida ! " ) ;

44.

45 .

System . o u t . println ( ) ;

46.

escolhas ( ) ;

47 .

opcao

48.

49.

50.

entrada . readLine ( ) . charAt ( O ) ;

}
catch

(Exception erro ) {

System . out .println ( "Erro de Entrada de Dados" ) ;

51.

52 .
53 .

false)

1 0. 6 ARVORES

Uma rvore uma estrntura de dados bidimensional, no linear, que possui pro
priedades especiais e admite muitas operaes de conjuntos dinmicos, tais como: consulta, insero, remoo, entre outros. E diferente das listas e pilhas, uma vez que estas
so estruturas de dados lineares.
Uma rvore, de modo geral, possui as seguintes caractersticas:
,

'

n raiz - n do topo da rvore, do qual descendem os demais ns. E o primeiro n da rvore;

n interior - n do interior da rvore (que possui descendentes);

n terminal - n que no possui descendentes;

trajetria - nmero de ns que devem ser perconidos at o n determinado;

grau do n - nmero de ns descendentes do n, ou seja, o nmero de


subrvores de um n;

grau da rvore - nmero mximo de subrvores de um n;

altura da rvore - nmero mximo de nveis dos seus ns;

altura do n - nmero mximo de niveis dos seus ns.

Para exemplificar a explicao sobre as caractersticas de uma rvore, vamos


fazer uma anlise da rvore apresentada na Figura 10.20:

CAPITULO 1 0 - ESTRUTURAS D E DADOS DINAMICAS


'

..
. . ...

.. . ....

..

221

.... . .

..
e

..

..

f
..
.

.
.

! FIGURA

10.201 nrores

o n a denominado n raiz, tem grau dois pois possui dois filhos, os ns Q e


c, que tambm podem ser chamados de subrvores ou ns descendentes;
o n b tem grau trs pois possui trs filhos: os ns d, e e f; o n b tambm
denominado pai dos ns Q, e f;,
os ns Q_e e so ns terminais, isto , no possuem descendentes e por isso
tem grau zero;
A

o n f tem grau dois e tem como filhos os ns i e t

o n i um n terminal e possui grau zero;

o n l tem grau um e pai do n k, que terminal;

o n tem grau dois e pai dos ns g e h, que so ns terminais;

a rvore possui grau trs, pois este o nmero mximo de ns descendentes


de um nko pai;
a rvore tem altura igual a 5, j o n b tem altura igual a 4, o n c tem altura
igual a 2, o n k tem altura igual a 1 e assim por diante;
para defulirmos a trajetria a ser percorrida vamos supor que se deseje chegar
ao n j, ento o caminho a ser percorrido seria ' Q, f, j, conforme ilustrado na
Figura 1 0.21 .

As rvores podem ser do tipo listas generalizadas ou binrias. As rvores do tipo


listas generalizadas possuem ns com grau maior ou igual a zero, enquanto uma rvore
do tipo binria sempre possui ns com grau menor ou igual a 2. Veja os exemplos de
rvores apresentados na Figura 10.22.
Neste livro trataremos apenas das rvores binrias.
/

1 0.6. 1 ARVO R E S 8 1 N A RIA S

Conforme j dissemos anteriormente, uma rvore binria sempre possui ns com


grau menor ou igual a dois, isto , nenhum n possui mais do que dois descendentes

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

222

..
...

... . .
. . ..

...

.
..

..
....

.
.. ...
.
.

.
.

..

..

1 o. 2 1 I Trajetria

I FIGURA

Arvore como lista generalizada

Arvore binria

k
! FIGURA

'

10.221 Arvores

57

45

25

I FIGURA

10.231 rvore binria

CAPTULO 1 0 - ESTRUTURAS D E DADOS DINMICAS

223

diretos (dois filhos). Nesse tipo de rvore tambm existe uma particularidade quanto
posio dos ns: os ns da direita sempre possuem valor superior ao do n pai, e os ns
da esquerda sempre possuem valor inferior ao do n pai.
O algoritmo a seguir representa as variveis que sero utilizadas para a manipu
lao da rvore - note que existe grande similaridade com os ns criados para mani
pulao das listas. O algoritmo tem a definio de um registro que possui as variveis
valor, esq e dir, a varivel apontador, que ser utilizada para fazer a referncia
a ns localizados diJeita e esquerda (da raiz ou do n pai), e a varivel raiz, que
guardar o valor do n raiz da rvore.
EXEMPLO 10.15: Pseudocdigo que representa
1.

uma <1rvore binria.

algoritmo BArvore

2.

tipo apontador :

3.

tipo no_arvore - registro

Ano_arvore

4.

valor: inteiro

5.

esq:

6.

d ir : apontador

fim

7.
8.

var

9.
10.
11.
12.
13.

apontador

raiz: apontador
Funo inserir ( arvore: no_arvore,
var

nco
Se (arvore

nulo) ento

apoio. valor novoNo

16.

retorne (apoio)

17.

Seno

18.

Se

19.

(novoNo < arvore.valor) ento


arvoreA .esq

20.

inserir (arvoreA . esq, novoNo)

Seno

21.

arvoreA .dir inserir ( arvoreA.dir, novoNo)


Fim-se

22 .
23.

Fim-se

24.

retorne ( arvore)
Fim

26.
28.
29.
30.

Procedimento inserirNo (novoValor:

inteiro)

inicio
raiz inserir (raiz, novoValor)
fim

31.
32.

no_arvore

15.

27.

inteiro ) :

apoo: no_arvore

14.

25.

novoNo :

Procedimento exibir_esquerdo

33 .

arv: no_arvore

34.

inicio

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

224

35.

arv raJ.z

36.

Se ( arv

<>

nulo) ento

37.

exibir_esquerdo (arvA .esq)

38.

mostre(arvA.valor)

39.

fim

40.
41.

Procedimento exibir_direito

42 .

arv: no_arvore

43 .

J.nl.Cl.O

44 .

arv raiz

45.

J.nl.Cl.O
Se ( arv

46.

<>

nulo)

ento

47 .

exibir_direi to ( arvA .dir)

48.

mostre (arvA . valor)

49.

fim

50.
51.

Procedimento exibir_raiz(

52 .
53 .

mostre ( "Raiz " ,

54.

raiz)

fim

Os comentrios sero feitos juntamente com os comentrios do programa.


Para implementao de rvores binrias em Java, vamos utilizar os princpios
anteriormente utilizados para a implementao de listas e filas. Criaremos uma classe
BintNo, que implementar o n da rvore. A cada novo n inserido na rvore, uma
instncia da classe BintNo ser criada, ou seja, um novo objeto n.
ExEMP,t-o 1 o. 1 6: Classe que representa o n da rvore.

1.

class BintNo{

2.

int valor;

3.

BintNo esq,

dir;

4.
5.

BintNo (int novoValor ) {

6.

valor

7.
8.

novoValor;

No programa, assim como no algoritmo, podemos observar que o n possui as


variveis valor do tipo inteiro, que guarda os elementos do n, e as variveis esq e
di r, que so do tipo BintNo. Na linha 5 temos o mtodo construtor do objeto BintNo,
que recebe como parmetro novoValor, que o elemento do novo n.
Da mesma forma que para o n, criaremos uma classe para a rvore, que ser
instanciada toda vez que uma nova rvore for criada. Essa classe dever conter os mto
dos que possibilitam a incluso e excluso de novos ns, conforme ser visto a seguir.

CAPTULO 1 0 - ESTRUTURAS D E DADOS DINMICAS

t o. 1 7 :

ExEMPLo
1.

225

Programa em Java que implementa uma rvore binria.

c1ass BArvore{

2.

private BintNo Raiz;

3.

private BintNo inserir (BintNo arvore,

4.

if

5.

(arvore

==

null)

return new BintNo


else i f

6.
7.

int novoNo) {

(novoNo ) ;

(novoNo < arvore . valor)

arvore .esq - inserir (arvore . esq,

novoNo) ;

else

8.
9.

arvore . di r - inserir (arvore.dir,

10.

novoNo ) ;

return arvore ;

11.

12.

public void inserirNo (int novovalor) {

13.

Raiz = inserir (Raiz, novoValor) ;

14

15.

private void exibir_esquerdo

16.

if

(BintNo arv) {

(arv ! = null) {

17.

exibir_esquerdo

18.

System. ou t . println (arv.valor) ;

19.

(arv . e sq) ;

}}

20.

private void exibir_direito

21.

if

(BintNo arv) (

(arv ! = nul l ) (

22.

exibir_direito

(arv . d ir ) ;

23.

System.out.println (arv.valor) ;

24.
25 .

26.

public void exibir_raiz ( )


{ System . ou t println( "Ra iz " + Raiz . valor ) ;

27.

28.

29.

public void exibirNo_esq ( ) {

30.

exibir_esquerdo

(Raiz ) ;

31.

32.

public void exibirNo_dir ( ) {

33.

exibir_direito (Raiz ) ;

34.

classe chamada BArvore possui como varivel o n Raiz do tipo BintNo.


BintNo um objeto que ser instanciado toda vez que for inserido um novo n na r
vore. A classe BArvore possui os mtodos inserirNo, para criar um novo n na
rvore, e exibirNo_dir e exibirNo_esq para mostrar todos os ns existentes.
Vejamos cada um dos mtodos/procedimentos da nossa rvore:
A

i n s e r i rNo recebe como parmetro um valor inteiro para a vari.vel


novoValor. Chama ento o mtodo inserir.

inserir recebe como parmetro um valor para arvore, que uma vari

vel do tipo BintNo, e novoNo, que do tipo inteiro. Esse mtodo percorre

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

226

recursivamente a rvore a partir da raiz, buscando uma posio de referncia


nula para ento inserir o novo elemento.
Vamos ver como isso funciona quando a rvore est vazia, isto , quando
Raiz tem valor nulo.
O mtodo inser irNo chama o mtodo inserir, passando como par
metros: Raiz, que nulo, e o valor do elemento. O mtodo inserirNo
(linha 12) recebe os valores, atribuindo Ra i z arvore e o valor do elemento
a novoNo (que so as variveis recebidas como parmetro no mtodo in
serir).

Quando feita a veriftcao na linha 4, como arvore tem valor nulo, o


mtodo retoma um novo n, que passar a ser o n raiz. Quando a rvore j
possui mais de um elemento, o mtodo inserirNo chama o mtodo in
serir, passando os parmetros: Raiz e o valor do elemento. O mtodo
inserir verifica se o valor a ser inserido maior ou menor que o n (linhas
4 a 1 0). Sendo menor, insere-o esquerda, caso contrrio insere-o direita. A
recursividade acionada nas linhas 7 (para ns esquerda) e 9 (para ns
direita). Enquanto a referncia de um n (arvor e . esq ou arvore . di r)
no for um valor nulo, o mtodo inserir continuar a ser chamado. Quan
do isso ocorrer, o mtodo retornar um novo n que passar a fazer parte da
rvore. Dessa forma, uma referncia leva a outra at que se encontre um n
vazio (nulo), que possibilite a insero de um novo n.

NOTA:

A recursividade se d, nesse caso, com uma chamada interna do

pr

prio mtodo no qual ela est inserida.

Deve-se observar, tambm, o que chamamos de visibilidade de um mtodo.


Os mtodos declarados como public podem ser chamados ou invocados
por outros procedimentos em execuo, enquanto os mtodos declarados como
privat e, somente dentro da prpria classe (vide Anexo).

Os mtodos exibirNo_esq (linha 29) e exibirNo_dir (linha 32) usam


o mesmo princpio do mtodo inserirNo. Eles no recebem parmetros e
chamam os mtodos exibir_esquerdo ou exibir_direi to, envian
do como parmetro o n Raiz.
Os mtodos exibir_direi to e exibir_esquerdo recebem como pa
rmetro um valor para arv, do tipo BintNo, que passado pelo mtodo
exibirNo_esq ou exibirNo_dir. Por meio de chamadas recursivas,
buscam os ns esquerda ou direita da rvore. Encontrando uma referncia
nula, isto , se arv no for diferente de nulo (linhas 1 6 e 21), mostra-se o
valor do n (linha 18 e 23). Esse processo garante o percurso na rvore ao
recuperar e imprimir uma sada sempre na ordem ascendente de valor.

CAPTULO 1 0 - ESTRUTURAS D E DADOS DINMICAS

227

O exemplo a seguir faz a incluso dos ns em uma rvore passando os valores de


forma aleatria, exibe o contedo, insere novos ns (linhas 1 1 e 12) e exibe o resultado
novamente. Como o programa, constri a rvore obedecendo relao: ns esquerda
possuem valor inferior ao n pai e ns direita possuem valor superior. A exibio do
resultado (mtodo exibirNo) produz uma sada ordenada dos elementos por valor e
ascendente. Lembre-se de que no exemplo instanciado um objeto BArvore com o
nome arvorel, cujo cdigo apresentamos anteriormente.
ExEMPLo
1.

1 o . t 8:

Classe que utiliza a rvore implementada no Exemplo I0.17.

class Exemplo106 {

2.

public static void main ( String ( ]

3.

args ) {

4.

BArvore arvore1 - new BArvore ( )


arvore1. inserirNo ( 14 ) ;

5.

arvore1. inserirNo ( 1 6 ) ;

6.

arvorel . inserirNo ( 12 ) ;

7.

arvore1. inserirNo ( 1 1 ) ;

8.

arvore1 . inserirNo ( 17 ) ;

9.

arvore1 . inserirNo

( 15 ) ;

() ;

10.

arvore 1 . exibirNo

11.

arvore1. inserirNo ( 1 0 ) ;

12.

arvore1 . inserirNo ( 13 ) ;

13.

System . out . println ( " " ) ;

14.

arvore1. exibirNo ( ) ;

15.
16.

A figura abaixo representa a rvore do Exemplo 10. 1 8 aps a insero dos ns.

I FIGURA 1 o. 241 Representao da rvore aps a insero dos ns

Fizemos a incluso e exibio dos elementos em uma rvore. Vamos agora im


plementar a excluso, lembrando que a excluso de um n um processo um pouco
mais complexo, uma vez que as referncias ao n excludo e a seus filhos precisam ser
devidamente ajustadas.

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

228

Vamos apresentar apenas o trecho correspondente ao processo de ex

LEMBRE-SE:

cluso, mas ele continuao do algoritmo BArvore, e o mtodo


excluirNo continuao da classe BArvore.

EXEMPLo 1 o. 1 9 :

Pseudocdigo para representar o procedimento de excluso de ns com


rvores binrias.

1.

Procedimento exc lui rNo ( i tem :

2.

var

3.

tempNo : no_arvore

4.

pai : no_arvore

5.

filho: no_arvore

6.

temp : no_arvore

7.

inte i ro)

inicio

8.

tempNo raiz

9.

pai nulo

10.

filho raiz

11.

Enquanto ( t empNo <> nulo

.e.

tempNoA . valor <> item)

12 .

pai tempNo

13.

Se( item < tempNoA . valor) ento

14.
15.
16.

tempNo t empNo A . esq


Seno
tempNo tempNoA . dir

17 .

Fim-se

18.

Se ( tempNo = nulo) ento

19.

Mostre ( " Item no localizado " )

20.

Fim-se

21.

Se (pai

nulo) ento

22 .

Se ( tempNoA .dir = nulo)

23.

raiz tempNoA . esq

24.

Fim-se

25.

Se ( tempNo .esq = nulo)


raiz tempNo A . dir

26.
27 .
28.

Fim-se
Seno

29.

temp tempNo

30.

filho tempNoA . esq

31.

Enquanto (filho.dir <> nulo)

32 .

temp filho

33.

filho filho A . dir

faa

34.

Fim-enquanto

35.

Se ( f ilho < > tempNoA. esq} ento

36.

tempA .dir filho. Aesq

37 .

filo. Aesq raiz. Aesq

38.

Fim-se

39.

filho . Adir raiz. Adir

40.

raiz fi lho

41.

Fim-se

faa

CAPITULO 1 0 - ESTRUTURAS D E DADOS DINAMICAS


'

42 .

Se ( tempNo . Adir

43.

Se(pai. Aesq

nulo)

ento

tempNo . Aesq

pai.Aesq f- tempNo . Aesq

44.
45.

Seno

46.

pai. Adir

tempNo . Aesq

f-

Fim-se

47.

Seno

48.
49.

Se ( tempNo A . esq

tempNo)

ento

50.

Se(pai. Aesq

tempNo)

ento

paiA. esq f- tempNoA.dir

51.
52 .

Seno

53.

pa i A . dir

tempNo A . d i r

f-

fim-se

54.

Seno

55.
56.

temp

57.

filho f- tempNoA . esq

58 .

Enquanto ( filho.dir <> nulo)

f-

tempNo

temp

60.

filho

61.

Fim-enquanto

62 .

Se ( filho <> tempNo . Aesq)

f-

filhoA . dir

f-

ento

63.

temp . Adir

64.

filho. Aesq f- tempNo .esq

filho . A esq

f-

65.

Fim-se

66.

filho. Adir

67.

Se(paiA . esq = tempNo)

68.

faa

f i lho

59.

f-

tempNo .

Adir
ento

p a i . Aesq f- filho

Seno

69.

pai. Adir

70.
71.

f-

fi lho

fim-se

72.
73.

229

Fim-se
fim

A seguir apresentamos o mtodo excluirNo, que implementa o processo de


excluso.
1.

2.

public void excluirNo (int item) {


try{

3.

BintNo tempNo

4.

while (tempNo ! = null && tempNo.valor ! = item) {

Raiz, pai

5.

pai = tempNo ;

6.

if

7.

( item < tempNo . valor)


tempNo - tempNo . esq;

8.

else

9.

tempNo

tempNo . dir;

10.

11.

i f (tempNo == null)

null,

filho

Raiz,

temp ;

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

230

12 .

System .out.println
if

13 .
14.

( " Item nao localizado . ) ;

(pai == null) {
if

(tempNo . dir == null)


Raiz = tempNo .esq;

15.

else i f (tempNo .esq

16.

nul l )

==

Raiz = tempNo . d i r ;

17 .

else{

18.
19.

for

20.

filho.dir ! = null;

21.

if

(temp = tempNo ,

filho = tempNo . esq;


temp = filho,

filho = filho . dir) ;

(filho ! = tempNo .esq) {

22.

temp . dir = filho .esq;

23.

filho .esq

Ra iz . e sq;

24 .

25.

filho . dir = Rai z . d i r ;

26.

Raiz = filho;

27 .

28.
29.

else if
if

30.

(tempNo .dir == null ) {

(pai . esq == tempNo )


pa. esq - tempNo .esq;

else

31.

pai.dir = tempNo .esq;

32.

33.
34.

else if
if

35.

(tempNo . esq == null ) {

(pai . esq == tempNo )


pa.esq - tempNo .dir;

else

36.
37 .

pai.dir

38.

tempNo . d i r ;

} else {

39.

for ( temp = tempNo , filho = tempNo . esq;

40.

filho.dir ! = null; temp = filho,

41.

if

(filho

! = tempNo .esq) {

42 .

temp . dir = filho.esq;

43 .

filho.esq = tempNo . esq;

44.

45.

filho.dir

46.

if

47 .

tempNo.dir;

(pai. esq == tempNo )


pai. esq - filho;

48.

else

49.

pai.dir = filho;

50.

} catch (NullPointerException erro)

51.
52 .

/ / Item nao encontrado


}

53.

54.
55.

filho = filho . dir) ;

O mtodo excluirNo recebe como parmetro o valor do elemento a ser


excludo.

CAPITULO 1 0 - ESTRUTURAS DE DADOS DINAMICAS


'

23 1

trecho das linhas 4 a 1 O faz a busca nos diversos ns da rvore, comparando o


valor fornecido (i tem) com o valor do n. Posteriormente, so tratadas as diversas
possibilidades, conforme segue:
O

linha 1 1 - se tempNo for nulo, significa que a rvore foi percorrida total
mente e o valor no foi encontrado;
linha 1 3 - se pai for nulo, significa que o n pesquisado encontra-se na
prpria raiz e a condio da linha 4 no foi satisfeita, ou seja, o valor de
tempNo igual a i tem, que o valor pesquisado;
linha 1 4 - se tempNo . di r for nulo, significa que o n no possui filho
direita, bastando atribuir a Raiz o n esquerda, dado por tempNo . esq;
linha 1 6 - se tempNo . esq for nulo, significa que o n no possui filho
esquerda, bastando atribuir a Rai z o n direita, dado por tempNo . di r;
linha 20 - se o n tiver filhos esquerda e direita, executado o lao for
linha 19, que busca pelo elemento mais direita do ramo esquerdo da rvo
re (maior valor em relao raiz que ser excluda). Esse elemento trocado
pela raiz e as referncias ajustadas. Isso pode ser melhor visualizado pelo
esquema a seguir, que usa os valores do Exemplo 10. L8.
1 4 Raiz

13

filho

I FIGURA 10.251 Representao da excluso de um elemento da ,irvore

linha 28 - se pai no for nulo - condio seno do i f


significa que o n a ser excludo no o n raiz;

linha 38 -,

linha 29 - se o n a ser excludo no possuir filho direita, a referncia do


n pai trocada pela do n a ser excludo;
linha 33- se o n a ser excludo no possuir filho esquerda, a referncia do
n pai trocada pela do n a ser excludo;
linha 38 - se o n a ser excludo possuir filhos esquerda e direita,
utilizado procedimento semelhante excluso do n raiz, porm, nesse caso,
devem ser ajustadas as referncias do pai do n a ser excludo. Usando os
valores do Exemplo I0. 18, pode-se visualizar esquematicamente, pela figura
a seguir, como o rearranjo da rvore realizado.

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

232

14

I FIGURA

0.261 Representao da excluso de um elemento ela rvore

importante observar que nesse exemplo o ramo esquerdo do n a ser excludo


no possui n direita. A busca pelo n mais direita (linha 39) retoma como filho o n
esquerda de tempNo, pela prpria condio do lao. De fato, esse n representa o
maior valor dos elementos do ramo esquerdo do n a ser excludo.
Para o entendimento do funcionamento do processo importante simular a en
trada de valores e a construo da respectiva rvore graficamente. A modificao na
ordem e na quantidade dos valores de entrada e dos ns excludos dar uma idia mais
clara do comportamento assumido para cada caso.
O exemplo a seguir implementa a entrada de valores, a excluso de um n e a
exibio dos ns da rvore antes e depois da excluso.
EXEMPLO t 0.20: Programa

1.
2.

que utiliza a rvore binria criada nos exemplos

class Exemplo107 (
public static void main ( String [ ] args ) {

3.

BArvore2 arvore1

4.

/ * insero de nos na arvore * /

5.

arvore1. inserirNo ( 1 4 ) ;

6.

arvor e 1 . inserirNo ( 1 6 ) ;

7.

arvore1 . inserirNo ( 1 2 ) ;

8.

arvore1. inserirNo

( 11 ) ;

9.

arvore1. inserirNo

(17) ;

10.

arvore1. inserirNo

(15) ;

11.

arvore1. inserirNo ( 1 0 ) ;

12 .

arvore1. inserirNo

new BArvore2

();

(13) ;

13.
exibio dos ns da rvore * /

14.

I*

15.

arvore1 . exibir_raiz ( ) ;

16.

System .out . println ( "No esquerdo " ) ;

17 .

arvore1 . exibirNo_esq ( ) ;

18.

System . out . println ( "No direito" ) ;

19.

arvore1. exibirNo dir ( ) ;

20.

I O.18 e 10.19.

CAPTULO 1 0 - ESTRUTURAS DE DADOS DINMICAS

21.

/*

22 .

System . ou t . println( "valor excluido 5 0 " ) ;

23.

arvorel. excluirNo (1 2 ) ;

exclusao de

um

233

n * /

24.

25.

I* exibicao da rvore aps a excluso * /

26.

System . ou t . println ( "exibicao da arvore apos a exclusao " ) ;

27.

arvorel .exibir_raiz ( ) ;

28.

System. out .println ( "No esquerdo" ) ;

29.

arvorel . exibirNo_esq( ) ;

30 .

System. out.print l n ( "No direito " ) ;

31.

arvorel . exibirNo_dir ( ) ;

32.
33.

}
/

1 0 . 7 E X E R C I C I O S PARA F IXAAO

1 . Leia cem nmeros e construa uma pilha apenas com os nmeros pares.
2. Utilizando a estrutura de uma pilha, leia uma palavra ou frase e a exiba na
ordem inversa.
3 . Considere que o usurio far a entrada de valores (nmeros e operadores) que
iro representar uma expresso matemtica. A expresso poder conter pa
rnteses para isolar as operaes. O programa dever verificar se todos os
parnteses esto fechados. Para isso represente o empilhamento dos '(' e ')';
cada vez que um par for formado dever ser desempilhado, e se sobrar algum
elemento na pilha significar que a expresso no est correta.
4. Descreva a sada da seguinte seqncia sobre a pilha:
empilha(S), empilha(3), desempilhaO, empilha(2), empilha(8), desempilha(),
desempilhaO, empHha(9), empilha( l ), desempilhaO, empilha(7), empilha(6),
desempilhaO, desempilhaO, empilha(4), desempilhaO, desempilhaO.
5. A converso de um valor decimal para o seu conespondente em binrio se d
pelas sucessivas divises dele por 2 at que o quociente seja O. O represen
tante binrio desse nmero ser composto por todos os restos, mas na ordem
inversa que foram calculados. Elabore um algoritmo e um programa capa
zes de resolver essa questo utilizando o conceito de piJhas. O nmero deve
r ser fornecido pelo usurio.
6. Cite e justifique pelo menos trs atividades realizadas em computadores que
requeiram o uso de pilhas.
7 . Escreva uma fila com implementao por meio de arranjos, cuja capacidade
seja para quatro elementos. Na fila devero ser enfileirados apenas os nmeros 1mpares.
/

8. Considerando a soluo do Exerccio 6, faa o teste da seqncia abaixo


indicando o valor da sada e o resultado da fila.

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

2 34

Instrues: na coluna 'sada ' mostre uma das mensagens: Valor enfileirado,
Valor no atende a condio, Erro! Fila cheia, Erro! Fila vazia,
Verdadeiro, Falso; na coluna 'resultado da fila' mostre todos os
elementos da fila na passagem.
Operao

Sada

Resultado da fila

desenfileirar( )
enfileirar(S)
enfileirar(S)
desenfileirar( )
enfileirar(7)
enfileirar(4)
enfileirar( 1)
enfileirar(3)
desenfileirar( )
desenfilei rar( )
desenfileirar( )
vazio( )
enfileirar(9)
enfileirar(7)
tamanho( )
enfileirar( 13)
enfileirar( 15)
desenfileirar( )

9. Cite e justifique pelo menos trs atividades realizadas em computadores que


requeiram o uso de filas.
1 O.

Construa um algoritmo/programa que administre as filas de reservas de fil


mes em uma videolocadora, levando em conta que para cada fLlme existem
sete filas - uma para cada dia da semana - e o usurio quem determina
qual o dia da semana de sua preferncia para alugar o filme. O cliente
informado da disponibilidade da fita e quando confirmada a sua locao ele
deve sair da fila. O nmero de cpias de cada fita no dever ser considerado
nessa soluo, devendo ser considerada uma fita de cada filme.

11.

Crie uma lista com os itens que voc precisa comprar, podendo ser material
de escritrio ou produtos para sua casa. Faa o pseudocdigo e a implemen
tao em Java, de forma que, medida que os itens forem adquiridos, pos
sam ser removidos da lista.

CAPTULO 1 0 - ESTRUTURAS D E DADOS DINMICAS

235

12. Implemente o Exerccio 6 utilizando o conceito de lista simples.


1 3 . Implemente o Exerccio 2 utilizando o conceito de listas duplamente
encadeadas.
14. Crie uma rvore para armazenar os elementos da seguinte expresso mate
mtica: A + B * C - D I E. Cada letra ou smbolo matemtico dever ocupar
a posio de um elemento. O arranjo dos elementos dever seguir uma or
dem que gere uma sada representando a ordem em que a expresso deve ser
executada, considerando a precedncia dos operadores.
1 5 . Crie uma rvore que receba palavras. O programa/algoritmo deve contar as
palavras, que devero ser inseridas pelo usurio por meio do teclado. Deve
ser criado um menu com as opes para: inserir uma nova palavra, excluir
uma palavra fornecida pelo usurio e exibir a rvore.
16. Considere um labirinto qualquer, representado por uma matriz 20 x 20 e crie
um programa/algoritmo para:
a) encontrar um caminho entre o ponto de entrada e sada;
b) armazenar as posies j percorridas;
c) ser capaz de retornar em um caminho que no tem sada.
Observaes: o usurio deve escolher o caminho a ser perco1Tido via conso
le; para isso defina padres de movimentao, por exemplo: direita, esquer
da, acima e abaixo.

A N EXO :
CO N C E I TOS S O B R E
A L I N G UAG E M J AVA

ava uma linguagem de programao orientada a objetos desenvolvida pela Sun


Microsystems para ser portvel entre diferentes plataformas.
/

ALGUMAS CARACT E R I STICAS


'

E orientada a objetos.
'

E portvel, isto , seus programas podem ser utilizados em diferentes plataformas.


Seu cdigo de programao interpretado, o que garante maior velocidade
de desenvolvimento e portabilidade.
Permite que o programa execute mais de um thread (linha de execuo).

A linguagem de programao Java possui um ambiente de desenvolvimento e


um ambiente de aplicativos. Ela resulta da busca de uma linguagem com as caractersti
cas do C++ aliadas segurana do Smalltalk.
RECURSOS
O JVM - Java Viitual

Machine - cria uma mquina imaginria, implementada


por meio da emulao de um software executado em uma mquina real. O cdigo do
JVM est armazenado em um arquivo . class.

237

ANEXO: CONCEITOS SOBRE A LINGUAGEM JAVA

O JVM fornece as especificaes da plataforma de hardware, o que permite a


independncia de plataforma, uma vez que o programa compilado em uma mquina
imaginria. Essas especificaes consistem em instrues e registros da linguagem de
mquina, tamanho do cache, velocidade do processador etc.
COLETA D E LIXO

A garbage coUection vmre as memrias cujo ponteiro possui nmero de refern


cia O. Ocone automaticamente durante o tempo de vida de um programa.

A M B I E NT E JAVA D E C O M P I LAAO

COMPI LAO

TEMPO DE EXECUO

Cdigo Fonte
Arq uivo.java

Carregamento
da classe

'

Classes
Arquivo.class

Verificao
do bytecode

/
Interpretao

Gerador de cdigo
;'just in ti me"

JIT - Code
Generator

O cdigo executado
Tempo
de execuo

Hardware

I FIGURA 1 I Ambiente Java de compilao

D U R A N T E O PROCESSO D E C O M P I LAAO

Os arquivos so compilados medida que so convertidos para bytecodes. Em


tempo de execuo, os bytecodes so carregados, verificados e executados. Durante a
execuo, so feitas as chamadas ao hardware subjacente.
O canegamento de classe responsvel pela carga de todas as classes necess
rias execuo do programa.
O interpretador verifica se foi gerado algum cdigo ilegal, com a finalidade de
verificar se o bytecode adere s especificaes JVM e no viola a integridade e a segu
rana do sistema.
Na gerao de cdigo, os bytecodes so compilados no cdigo de mquina nati
vo antes da execuo, isto , o cdigo interpretado para a plataforma em questo.
Para desenvolver programas, ser necessrio utilizar o Java Development Kit
(JDK), um ambiente de desenvolvimento que, alm das ferramentas de desenvolvimen
to, contm todos os elementos da plataforma Java. possvel adquirir o JDK gratuita
mente no site da Sun: www.sun.com.br.

LOGICA D E PROGRAMAAO E ESTRUTURAS DE DADOS


'

238

ARQUIVOS DO J D K

Quando se instala o JDK, criada a seguinte estrutura de diretrio:


Diretrio

Contedo

. hotjava

Configurao do appletviewer para uso do JDK.

bin

Arquivos binrios (executveis e bibliotecas} do

demo

Exemplos de aplicaes e applets.

does

Documentao da API.

include

Arquivos utilizados para integrao com cdigo nativo.

I ib

Classes da API.

src

Cdigo fonte das classes. Somente ser criado se for especificado como opo

JDK.

na instalao do JDK. Os arquivos desse diretrio podem ser utilizados para


depurao.

,..,

A L G U M AS D E F I N I O E S :
Modificadores - tm a funo de modificar a atribuio de classes, mtodos e
variveis-membro. So utilizados como prefixos.
Construtores - so utilizados para inicializar um objeto aps a sua criao.
Um construtor tem o mesmo nome da classe em que reside e no tem tipo de retomo,
pois o tipo de retomo implcito e do mesmo tipo da classe em que reside.
Mtodos - so os conjuntos de instrues executveis de uma classe.
Cdigo fonte- so os arquivos que contm as instrues escritas na linguagem
de programao escolhida, no caso, Java. O cdigo fonte pode ser escrito em um editor
de textos como o Edit do DOS ou o Notepad do Windows. Os arquivos devem ser salvos
com um nome (que deve ser idntico ao nome da classe), com um ponto ( . ) e com a
extenso, que deve ser j av a . Por exemplo: t e s t e . j av a , med i a . j ava,
cadastro . j ava etc.
1.

// Exemplo de programa em Java

2.

publ ic class Ola

3.

{public static void main (String args [ ] )

4.
5

{ System. out. println ( "Ol para todos ! " )

6. }

E N T E N D E N DO AS I N S T R U O E S DO CODIGO F O N T E :

1. II

inicia um comentrio, utilizado para incluir explicaes no meio do c


digo.

2. A palavra publ i c um especificador de acesso que permite ao programa


dor controlar a visibilidade de uma classe ou mtodo. class Ola a iden
tificao do nome da classe.

239

ANEXO: CONCEITOS SOBRE A LINGUAGEM JAVA

3. static void main - o main o principal mtodo. O Java procura esse


mtodo para interpretar uma classe. O void um modificador utilizado quando
no necessrio retorno. O main declarado como static, pois no
preciso fazer referncia a uma instncia, uma vez que ele chamado pelo
interpretador antes que quaisquer instncias sejam criadas, isto , o main
no ir requerer a chamada de uma instncia dessa classe. O String args [ ]
determina a criao de um vetor chamado args, com elementos do tipo
String utilizados para a entrada de parmetros.
5. System - nome da classe; out - nome do objeto da classe System,
responsvel pela sada; println - mtodo utilizado para exibir mensa
gens na tela do computador.
6. Os blocos de programa so delimitados por chaves. Esses blocos devem ser
abe1tos { e fechados } .
NOTA:

Esse arquivo deve ser gravado com o nome Ola. j ava, pois deve levar
o mesmo nome da classe.

C O M P I LADOR JAVAC

O cdigo fonte contm instrues de alto nvel, isto , instrues em uma lingua
gem que o homem capaz de compreender, mas a mquina no. Por isso, o cdigo fonte
precisa ser compilado. O arquivo responsvel pelo processo de compilao em Java o
Java compiler, chamado javac.
O javac gera, a partir do cdigo fonte, um arquivo de bytecodes. Esse arquivo
ter o mesmo nome do arquivo fonte, mas com a extenso . class. Por exemplo:
teste. class, medi a . class, cadastro . c lass e.
Bytecode

Cdigo fonte
Javac

media.Java

Java.class

Interpretao

:::>

o o

Cdigo
de mquina

I FIGURA 2 1 Diagrama de representao do processo de compilao

Para compilar um arquivo, basta digitar j avac e o nome do arquivo. Por exem
plo, no prompt do DOS, conforme o modelo:
C : \>

javac Ola . j ava

Existem algumas opes que podem ser utilizadas para compilar o programa.
Para isso, utiliza-se a sintaxe j avac [opes] arquivo [arquivo . . . ] . Es
sas opes so relacionadas a seguir:
javac

[opes]

arquivo

[arquivo . . . )

'

240

LOGICA D E PROGRAM AAO E ESTRUTURAS DE DADOS

OPOES:

-classpath path[;... ] - localizao das classes j definidas. Sobrepe a varivel


de ambiente CLASSPATH.
-d dir -

especifica o diretrio raiz onde as classes compiladas sero armaze

nadas.
-deprecation - ativa as mensagens de adve1tncia que indicam os membros ou
as classes que esto em desuso.
-g - cria

tabelas de debugging que sero usadas pelo debugger. Contm infor


maes como variveis locais e nmeros de linha. A ao default do compilador so
mente gerar nmeros de linhas. A opo -g:nodebug suprime a gerao dos nmeros de
linha.
-nowarn - desativa as mensagens de advertncia que informam problemas po
tenciais com o cdigo fonte.
-verbose - mostra informaes adicionais sobre a compilao. Contrasta com
-nowarn.
-depend - efetua a compilao de todos os arquivos que dependem do cdigo
fonte que est sendo compilado. Sem essa opo, so compi.lados apenas os arquivos
cujas classes so invocadas no arquivo que est sendo compilado.
-0 - otimiza o cdigo compilado para gerar programas mais rpidos. Na verso

1 . 1 , inclui o cdigo de todos os mtodos, em vez de simplesmente invoc-los (call);


aumenta o tamanho dos arquivos compilados.
-J opo - passa a string opo como argumento para o interpretador que ir
executar esse cdigo. A string opo no pode conter espaos em branco. O argumento
-J pode ser utilizado mltiplas vezes.
Exemplo:
j avac -classpath . ; C : \classes Ola . j ava
j avac O l a . j ava Tes te . java

PA RA I N T E R P R ETAR O PROGRAMA

Para executar (utilizar) o programa, basta digiar,


t no prompt do DOS, a palavra
j ava seguida do nome do programa. Por exemplo:
c : \> java Ola

PALAVRAS R E S E RVADAS

No Captulo 3, foi abordado o assunto identificadores (nomes) de variveis, so


bre o qual foi dito que no se devem utilizar palavras reservadas linguagem de progra
mao. A seguir so apresentadas as palavras reservadas linguagem Java.
abstract

default

goto

null

synchronized

boolean

do

if

package

this

ANEXO: CONCEITOS SOBRE A LINGUAGEM JAVA

241

break

double

implements

priva te

throw

byte

else

import

protected

throws

case

extends

instanceof

public

transient

catch

false

int

return

true

char

final

interface

short

try

class

finally

long

static

void

const

float

na tive

super

volatile

continue

for

new

switch

while

Essas palavras no podem ser usadas como nomes de variveis, mtodos, inter
faces ou classes.
"'

VA R I AVE I S

A declarao de variveis em Java pode ser feita em qualquer parte do programa,


e a varivel pode ser declarada e inicializada. Para relembrar os tipos de dados em Java,
consulte o Captulo 3.
Exemplos:
byte idade;
short a l ;
int i = 1 0 0 ;

long 1 = 5 0 0 0 ; / * L :
float vl, v2=4 . 5 7 8 f ;

identificador long * /

/* f : identificador float * /

double d = 5 , 02el9; / * notao cientfica * /


char h = ' h ' ;
boolean resposta
/*

true;

String so objetos, mas podem ser inicializados como tipos

primitivos */

String cadeia = "String em Java no tipo primitivo " ;

As variveis podem ser declaradas dentro de uma classe. So as chamadas vari


veis-membro, que podem ser acessadas por qualquer conjunto de instrues da classe.
J as variveis declaradas dentro de um dos mtodos da classe so chamadas de vari
veis locais.
"

MODI FICADORES DE VARIAV E I S

public - a varivel visvel por todos.


pri vate - a varivel s visvel pela classe.
protected - a varivel s visvel para a classe onde foi criada e para suas

herdeiras.
pri vate protected- a varivel visvel somente para as subclasses.
static - a varivel ser chamada pelo nome da classe e no por um objeto

dela.
final - a varivel no pode ter seu valor alterado, pois uma constante.

'

242

LOGICA D E PROGRAM AAO E ESTRUTURAS DE DADOS


.,

COMENTARIOS
'

As vezes toma-se importante a escrita de textos no meio do cdigo do programa


para explicar algo. Isso denominado comentrio e um recurso muito utilizado para
documentar partes do cdigo. Em Java, os comentrios podem ser feitos de trs maneiras:
I I - para uma linha de comentrio, por exemplo: I I comentrio
I * - para um trecho de comentrios. O trecho deve ser delimitado, por exem
plo: I * trecho * I
I * * - para documentao. O trecho deve ser delimitado, por exemplo: I * *
trecho * I
M O D I F ICADORES DE CLASSES

pub1 i c - pode ser instanciada e utilizada livremente, mesmo na classe interna.


protected- pode ser utilizada apenas no mesmo package ou em subclasses

da classe externa.
priva te - pode ser utilizada apenas na classe externa.
abs tract - no pode ser instanciada. Esse modificador utilizado para defi

nir apenas superclasses genricas.


f i na 1 - no permite definio de subclasses.
.,

.,

M O D I F I C A D O R E S DE M E TODOS E VARIAVE I S -M E M B RO

pub1ic - pode ser chamado livremente e as variveis-membro podem ser

utilizadas livremente.
protected- os mtodos e as variveis-membro podem ser chamados apenas

no mesmo package e em subclasses; as variveis-membro seguem o mesmo padro.


priva te - os mtodos e as variveis-membro podem ser chamados apenas na
classe.
abstract - no podem ser definidos nem mtodos nem variveis-membro.
f ina 1 - os mtodos no podem ser sobrescritos; utilizado para declarar cons
tantes.
s tatic - tanto os mtodos como as variveis-membro podem ser invocados a
partir do nome da classe.
na tive - utilizado para a definio de mtodos em cdigo nativo. No se
aplica a variveis-membro.
transient - no se utiliza em mtodos e no h persistncia em variveis
membro.
synchronized - para mtodos, no permite acesso simultneo a programas
multithread. No se aplica a variveis-membro.
vo1at i 1 e - no aplicvel definio de mtodos e em variveis-membro
no permite cache.
NOTA:

A ordem dos modificadores no importa.

ANEXO: CONCEITOS SOBRE A l.. I N G U A G E M JAVA

EXC EES
tratamento de excc.., realizado por um mtodo que o Java possui para
dctet:o de cnos. O tratamento de ext:ees tambm conhecido como tratamento de
eiTO'-. pni' os erro so capturados por esse recurso. que gera um alerta para o usurie.
As c:xt:ee ou erro'> sao deri\ados da supereiasse Throwable, conforme pode
ser llh..,ervado na Figura J.
O

DESCR I O D E A L G U M A S C L A S S E S
Excep t i on -

"o cxt:eiks genrica." que devem ser tratadas.

Error - o eiTo..,

gra\c.., qut.> normalmente no podem ser tratados.

RunTimeException -

"o as excee' geradas por erros de programao.

uma exceo as\ociada tentativa de acesso


a propriedades ou mtodos de n:ferncias com valor null.
Nu l l PointerException -

ArithrneticException

o incorreta de operadores

- l! uma exceo associada tentativa de utiliza

aritmticos

como. por exe mplo. a diviso por zero.

IndexOut:OfBoundsException -

uma exceo

a..,o;;ociada

a ndices de

Yetor ou ...tring.
ArrayStoreException - uma exceo

um

gerada pela tentativa de atribuir a


el ememo de um array um objl.!to inco mpatve l com o tipo declarado do array.
A captura das excees ucvc ser fei ta da segu i n te forma :
try

{
1

cdigo que PODE gerar

catch ( Exception e )

exceo

{ / / captura da exceao

/ 1 cdigo executado no tratamento da exceo

Senuo

que o cdigo que pouc gerar uma exceo deve ser descrito no bloco try.
Esas excees. por sua \ez.. \o capturadas no bloco c atch ( ) . que deve especificar
os argumentos (excees a serem tratadas).
Passagem da exceo pelo mtodo:
voia metodo l ( )

thr:ows

IOException

1 1 cdigo que pode gerar uma exceo IOException

Lanamento de exceo:
VOld metodo2 ( )

throws

IOException

1 1 testa condio de exceo


i f ( cxcep)

then throw ( new IOException ( ) ) ;

LGICA D E PROGRAMAC, O E ESTRUTURA S DE DAD


os

244

Throwable

J
-1

Error

Except1on
_

L llegalAccessException

LmkageError
ThreadDeatn

lnstan t ia t10n Exce ptio n

ed Except1 on
p
lnrerru pted Excepti o n
e

Clon No tSu port

NoSuc:hMethodExceptlon

ClassNot Fou n d E xceptlo n

-l

VirtuaiMach1neError

--l

AWTError

AWTException

e x t
IOExceptio n
---

R n ti m E cep ion

Runti meException

IEmptySrockExceptiOn
-----!
NoSuctlElementExceptJon

IAnthmeticExcept on
;

ArrayStoreException

1ClassCastException

tEx
_
_
a IA
_
_
r gum
en
_
_
_
_
ce_
p_
tio
n ----j
11 11
eg
l l legaiMonltOrStateExceptlon

lndexOutOfBoundsExcept1on
r

NuliPointe Exceptton

lnterruptediOException

UTFDataFormatException

,_
MalformedURLExcept1on

t o

lncompatibleClassChangeError

lassDefFoundError

I Unsat1sfieldlinkError
I VerifyError
I

UnknownHostExceptton

_
_
.....l
_

____J

I:

I
I
I
I

StringlndexOutOfBoundsException

tNurnberrrnatExcep
_
_
t_
ion
=
J
- ---

I
I
I

I
I

I
I

Abstract MethodError
llegaiAccessError

Insta n lta tlonError


NoSuchFieldError
NoSuchMethodError

_..

_
_
_
_
_
_
_

I FIGURA 3 1 Hier<rqui,J r/.1 'll{)erclasse ThmH.Ihlt.o

-j

--

UnknownServic.eExc pt10n

A rraylndexOutOfBou ndsE xceplion

StackOverflowError

1 UnknownError

_
_
_
_

SocketException

NegativeArrayStzeExceplJon

.
llegaiThreadStateExcept1on

CiassCircularnyError
' I nternaiError
--------<
ClassForma Err r
OutOfMemoryError

11

----

--------, r--

ProtocoiExcept i n

I1

Virtuai Ma hineErro

Li nkage Error

EOFException
----l
FileNotFoundExcepLion

SecurityException

.------

IOE cept1 n

ANEX O ! CONCEITOS S O B R E A L I N G U A G E M JAVA

245

C L A S S E S M A I S U T I L I Z A DAS
STRJNG

1 .

A clase String prov objetos que so mais seguros e simples de util izar do
que os mTay.., de caracteres. Os objcLos String so constantes e no podem ser alte
rados.

O-.. ohjetos da clase S t r i ng podem ser inicial izados por atribuio direta. isto

e. quanJo

Jeclara u m objeto, j e atribui um valor a ele. Por exemplo:

String nome = "Rafae l " ;


A concmenao de strings
nome +

"

fe ita uLilizando o operador +. Por exemplo:

1 o resut.ado ser "Rafael Rissetti "

R.Lsset. L i " ;

ficar

armazenado na varivel nome .

C O N ST R U TO R E S
new String ( char

[]

c ) - constri uma S t r ing a partir de um array de

caracteres.
new

S1:ring ( S tring

t
uma String a partir de uma outra
s ) - consTi

String.
new

String ( S t ringBuffer

sb ) - constri uma S t r ing a partir de

um S t r i ngBuffer.

P R I N C I PA I S M ETODOS
pub l i c

char

charAt ( int

i n d i c e ) - retoma o caracter na posio

dada por indice.


public

int

compareTo ( String

var) - compara uma String com

o parmetro String var e retoma zero se ambas forem iguais. um nmero negativo
<>e a S t r ing for menor e um nmero positivo se for maior.
publ i c

static

S t r i ng

var ) - retoma

copyValueOf ( char [ ]

uma String com o contedo do array de caracteres var.


pub l i c boolean equ a l s ( Obj ec t o ) a mesma eqncia d e caractere.
publ i c

bool ean

veri fi ca

se o

equals i gnoreCase ( S tring

uma S tring com a String var. As

uma string com

var) - compara

diferenas entre maiusculas

minsculas so

tgnoradas.

- retoma n comprimento da slring.


publ i c int indexOf ( i n t var) - re toma o nd1ce da primuira onmn

publ i c

int

length ( )

cia do cura<.:te1 var.


publ ic

iot- indexO.E ( in t var, int i n i c io ) - rctorna n ndict da


var u part i r de in i c i o .

primeira ocorrncia dn caral'tere


publ i c
<la Mring.

chaL [

toCha cAl r.ay ( )

retoma u m array

l.'Oill

o.., carm:tcr("s

LGICA DE PROGRA MAO E ESTRUT URAS DE DA DOS

246

pubJ i'"'

) - retoma uma c6pia da 'tring com

toLowerCase (

String

todas a:- letra. comenida para mi nscula-.,

( ) - retoma uma l:pia da "tring com

toUpperCase

String

pub.J.1C

toJas as letra: con\ ertida" para maiscula'.


trim ( )

String

pub l i c

dimina os e.;.pao' em branco no incio e no

fim da string.
Exemplo...:
String nome =

"RAFAEL" :

l f ( nome . equals ( rafuel . toUpperCase ( ) ) )


teste - nome . toCharArray ( ) ;

char ]

CLAS S E Q U E R E P R E S E N TA DATAS
JAVA. U N T I L . DATE

2.

A ela

j ava . un t i l . Date repre'.;ntu datas.

CONSTRUTORES
new Da ce

( } - cri.t uma data que representa o momento Je sua criao.

new Date ( long


dp

tempo ) - cna uma data com o [empo em milissegundo..,

I de janeiro de 1970.
P R I N C I PA I S M TODOS
public

long getTime ( ) - retoma os milissegunuos da data.

publi,.,

uoid

temp ) - c<>pcciJica a data com o tempo

setTime ( long

em mi lis,egunuos
public

boolean

data) - retoma true se a data

before (Date

anteror a data.
i

public boolean a f ter (Date data) - retoma true se a data pos


terior a da ta.
public

in c

compareTo (Date

data. um nmero negati\o

!'>t:

data)

anterior e um

retoma

O e a data igual

positivo se posterior

Exemplos .
Date ua.

ne Date ( ) ;

Date data2

new Date ( ) ;

System . ou t . println ( " Resposta:

3.

datal . a fter ( daa2 ) ) ;

CLAS S E S D E E NTRA DA E S A DA
j a7a . i o . Buff eredReader

ti lt ro que age sobre um Read r. adicio


e
nando um buffcr c oLimiLando o acel.so aos dauo'

ANC:XO: CONCEITOS S O B R E A I .. I N G U A G E M JAVA

247

C O N S T R U TO R E S

new Buff eredReader ( Peader rd)


constri u m BufferedReader
p:.tri ir de um Reader rd. com hullcr de tamanho tlefault.

P R I N C I PA I S M TODOS
publ i c

int

read ( )

int

read

IOException - l u m caractere da

throws

entrada-pad ro.
publ i c

[]

( char

c,

int

inicio ,

int

quant)

IOExcept i o n - l uma scqm:ta quant de caracteres e a coloca no

throws

arruy c a partir da po:-. io dada pnr i n i c i o . Retoma o nmero de caracteres lidos

(-1

->C no houver caractere" para ler)


publ i c S t ring readLine ( )

throws

IOExcept i on - l uma linha

de caral'lcre'>.
void

puo l i c

close ( )

throws

IOExcept ion - fecha o Reader .

Exemplo:
BufferedReaer
arq

String
rry

arq;

new BufferedReader

( new FileReader

( " arquivo " ) ) ;

:inha ;

{
linha

} catcb

- arq. readLine ( ) ;

( IOExcepcion e )

j ava . i o . Buf feredWri ter

nando um buffer e

fiJno que age sobre um Writer. adicio

otirmzando o acc..,so aoc., dado">.

CO N S T R U TO R E S
new BufferedWr i ter

( W r i t e r wr )

constri u m BufferedWriter

a partir de um Wri t e r wr. com buffer de tamanho default.

P R I N C I PA I S M TODOS
public

void writ e ( in t

c}

throws

IOExcep t i o n - escreve um

caracter na sada.
pub l i c
throws

void w r i t e r

( c har

[]

c,

int

ini c i o ,

int quant )

IOExc e p t i on - escreve quant caracteres no array c a partir da posio

dada por i n i c i o .
publ i c

void

newLine ( }

publ i c

void

flush ( )

throws

IOException - inicia u ma

nova

linha.
throws

IOException - descarrega

sadas

forndo a cs<.:rita de caracteres que eventualmente este am no bu ffer.


pub l i c

void

close

(}

throws

IOExcep t i o n - fecha o Writer

-,

AO E EST RUT URA S D E D.6. DOs


LG ICA DE PRO GRA MA

248

Exc111plo:
Bllf feredrtter sa.l.da ;
nE'\oJ Buff er<>Wri ter

sa1.da

String linha
try

" lnhd do texto " :

{
saida ...-ln te

( linha,

saida. nowLine ( l ;
catch

co

( " arquivo u ) ;

' 1ewn.Le
(new F1.

( IOExcept1on e )

0,

s . length ( ) l ;

{ )

c
java . :!.,.... . RanornAcces si l e - um 'trcam de entrada '>ada especfi
para arqui' 0,. cujo acco no prcci a ,er -.eqencial. Pcnmtc c..,pcc l flcar :-e o modo

de acec;..,o ,era ...omcntc para kJtura ou para e:-.crita c leitura.

CONSTRUTO R E S
public RandomAcces sFi l e ( S tring arq,

String modo ) throws

IOException - cria um objeto para acesso a arquivo e o as..,oc w ao arquivo especi


ficado em arq: modo e"pcdlictl o modo de acesso que pode 'ier: r (somente para
leitura ) ou n.,r l lciLUn.l c c-.crita).
public RandomA(.;cessFile ( F i l e arq ,

S t r i ng modo)

throws

IOException - cria um obj eto para acesso a arquivo e o as..,ocia ao arquivo especi
ficado por
leitura) ou

arq: modo
rw

espec1tica o modo de ace 'iO que pode \er:

(leitura c escnta).

(<;omente para

P R I N C I PA I S M TODOS
public int read ( )

throws IOExcept ion - l u m byte do arquivo.

public int read ( byte [ ]

x)

throws IOException - l um array


de bytes do arquivo. ..,e hou\er informaes e retoma o nmero
total de b)te lidos. e
no retoma - I .
publ ic

int read ( byte [ ]

x , int i n c i o , int qtd) throws


IOEx cept ion - l uma ..,eqncm de qtd bytes
e a coloca no array x a partir da
posio dada por inc ie;. Retoma o nmero de
bytc.., lido" nu ento I.
pub lic i nr.:.

readLine ( )

throws

IOEx cept ion

caracteres do arquivo.
pub l i c int skipBytes ( long
x)
ta x. bytcs da entrada c retoma nmero de
b"tes

l uma linha de

throws IOE xce pt j on

Jcs(ar-

1'0r,1n1 d,
J qL1e r
t:'>Cartados.
pub lic void seek ( long x)
t hrows rrExc epto
pustctona o
n
.
.
cursor de lcttu rall.!sCJJta na postao x do
arquivo (em bytc\)
l ic long ge tF ile Po in
p
te r ( ) throws
IO Ex cep tio n
retorna a pos1ao conl.!nlc do cursor, em bytes.

publ ic long skipBytes ( lo


ng x )
carla x byt.:s da entrada.

thlows

IOExce pt ion - de

249

l ong length ( )
thr ows IOE
xcep tion - reto
b 1es.
m
ma o tamanho
e
O
. Jlli\
[ll lll
,
pub l i c void setl ength ( l ong

.
x ) throws IO
Exception
l a rqu i\O em byteo.,
l&.l.lllanI10 <.o
. -..1
espe- ()
puhl i c

(!il

publ i c vo id wr i te ( )

throws IOEx
cepton - escrev
e um byte

o.
,trqui r
publ i c void wri ce ( byte [ ]
tes no arqul\ o.
e b\

- d
lfl
a\

um

vold Wrl te ( byte [ ]

public

b)

throws IOExcep
tion -

no

escreve

.
lnt 1TI
1C l0 '

.
lnt
qtd throws
.
pt 10n - e'crevc a quantidade de byte detennmtt
xce
-oE
dos
por qtd bytes do array

posu;ao detenmnada por inlci o no arq .


da
r
parri
ui\
a
'O.
.
.,

publ i c vo i d

4.

X,

close ( )

throws

IOExcept1on - fecha o arqu


ivo.

FI L E
A clae j ava . i o . Fi l e repre enta um arqUivo ou um diretrio.

CONS T R U T O R E S
new F i l e ( S tring

path) - cria um objeto File que representa um ar

quivo no path especificado.


new

File ( S t r ing

di r ,

S t r i ng

nome ) - cria um objeto File que

representa um arquiYo no d iretrio dir com o nome especificado.


publ ic File ( F i l e di r ,

Stri ng nome) - cria um objeto File que

representa um arq u i \o no diretrio di r com o nome especificado.

P R I N C J PA J S M TODO S

o.
.:;e o arquivo pode ser lid
canRead ( ) - verifica
e <;er escrito.
verifica se o arquivo pod
publ i c boolean canWr i t e ( ) com o de outro
x) - compara o path
publ i c in t compareTo ( F i l e
.
. '
o
ats.
forem 1eu
o
4r4UJv
determ inado por x e re wma O se ambos
do a c'\se objeto.
0 arquivo asocia
publ ic vo id de le te ( ) _ apaga
arquivo ou dire- verilica a ex istncia do
)
(
s
t
.
exJ.s
publ i c boole an
trio.
.
arquivo ou diretrio
ma 0 norne do
o
ret
_
.
)
e(
PUb l i c Star t1ng ge tNam
objeto.
rewma 0 path do
)
(
h
pat
Pub l i c Stri ng get
_
represent um
verifica o.,c 0 obJeto
.
(
)
c t ory
PUbl i c bo ol ea n is Dl re
d'
lrttriu
nta um arquivo.
se o objeto rcprl'c
- veritica
}
(
i sFile
PUbl j c boolean
public boolean

ISO
1\ '

ll t
f

nt.\1 um dlf('h)t ",


[ uh I 1
pu h l

t c

Jc U\.\11\lt\ lt)lll

I tlt1 l tI ' ,

t 1 n<l

\: ' i l

rcturnu

1 w

u
tmttnht do arq

OI .
tr t,l llll fi ll\ lU de f'fUIV

L 1 r. t l 1

r tn.Jm('r

u m dtre1 6Hn

{ F i l l >: )

pm ;
IIWllC dh.rtlHIIUdO

Lgica de
rogramaao
e estruturas
de dados
-

com aplicaes em Java


Este livro foi planeJado para ensinar lgica, algoritmos e estrutu
ras de dados com exemplos na lmguagem Java.
Todos os assuntos so explicados e exemplificados por meio
de solues comentadas e os exerc1cios propostos ao final de
cada capitulo ajudam a fixar os contedos estudados e a
verificar o aprendizado.
Este hvro mostra passo
repetio orden a9
das em Java, mas

pas:;o

;\ri

n-

funda na programa<b.

uso de estruturas de seleo,

pilhas entre outras, implementa-

ita a essa linguagem nem se apro-la em objetos. descrevendo todos

os elementos tambm e!h fJudocdigo.


Completam o livro um anexo que apresenta recursos da lingua
gem Java e um s1te espec1al onde esto disponveis apresenta
es em PowerPoint e manual de solues (exclusivos para os
professores), as listagens apresentadas no livro e exerccios
adicionais para que os alunos possam testar seu conhecimento
e aprofundar seus estudos.
Destinado a todos os Interessados em programao de compu
tadores, atende principalmente estudantes de graduao em
cincia da computao e processamento de dados.

www.pre nhall.com /puga br


site com recursos adicionais
para professores e alunos

PEARSON

111

P
, ren
tic:e ':
: _1})1

www.makron.com.br
www.pearsoned brasil.com

.......

... .
)

==

... .

::

Оценить