Você está na página 1de 247

GRUPO

Educao a Distncia

Caderno de Estudos

Linguagens de Programao
e estrutura de dados

Prof. Edna da Luz Lampert


Prof. Elton Giovani Gretter

UNIASSELVI
2014

NEAD
EDITORA

GRUPO

CENTRO UNIVERSITRIO
LEONARDO DA VINCI
Rodovia BR 470, Km 71, n 1.040, Bairro Benedito
89130-000
Cx. P. 191 - INDAIAL/SC
- 89130-000 - INDAIAL/SC
www.grupouniasselvi.com.br
Fone Fax: (047) 3281-9000/3281-9090

Copyright UNIASSELVI 2014

Elaborao:
Prof. Edna da Luz Lampert
Prof. Elton Giovani Gretter

Reviso, Diagramao e Produo:


Centro Universitrio Leonardo da Vinci - UNIASSELVI

Ficha catalogrfica elaborada na fonte pela Biblioteca Dante Alighieri


UNIASSELVI Indaial.

005.133
L237l Lampert, Edna da Luz
Linguagens de programao e estrutura de dados / Edna da Luz
Lampert, Elton Giovani Gretter. Indaial : Uniasselvi, 2014.
237 p. : il

ISBN 978-85-7830-857-5

1. Linguagens de programao
I. Centro Universitrio Leonardo da Vinci.
APRESENTAO

Caro(a) acadmico(a)!

Seja bem-vindo(a) aos estudos da disciplina de Linguagem de Programao e Estruturas


de dados.

O estudo desta disciplina muito importante para ampliar seus conhecimentos acerca
da estrutura de dados e sua relevncia para a linguagem de programao e como esses dois
conceitos esto muito atrelados, para o desenvolvimento de programas de tecnologia da
informao.

Desta forma ser possvel verificar quais so as responsabilidades de um programador


perante o desenvolvimento de um software, como realizar a estruturao de dados, para que
o sistema seja rpido, confiante, dinmico e seguro. Verificar que a estrutura de dados tem
um papel fundamental em organizar os dados e informaes, armazenar espao de memria,
realizar funes, executar cdigos e gerenciar toda estrutura de dados que um programa
envolve.

Este material foi desenvolvido com objetivo de disponibilizar as melhores prticas,


formas de como estruturar os dados, este um processo de aprendizagem que visa instigar
sua conscincia para a pesquisa e investigativa, buscar novas formas e melhores ferramentas
tecnolgicas para uma aprendizagem significativa.

Desejo sucesso nessa nova busca de informaes, principalmente no que tange ampliar
seus conhecimentos!

Prof. Edna da Luz Lampert

LINGUAGENS DE PROGRAMAO E ESTRUTURA DE DADOS iii


UNI
Oi!! Eu sou o UNI, voc j me conhece das outras disciplinas.
Estarei com voc ao longo deste caderno. Acompanharei os seus
estudos e, sempre que precisar, farei algumas observaes.
Desejo a voc excelentes estudos!

UNI

LINGUAGENS DE PROGRAMAO E ESTRUTURA DE DADOS iv


SUMRIO

UNIDADE 1 INTRODUO AO ESTUDO DE LINGUAGEM DE PROGRAMAO E


ESTRUTURAS DE DADOS ............................................................................................... 1

TPICO 1 CONCEITOS FUNDAMENTAIS - INTERPRETAO VERSUS


COMPILAO ................................................................................................................... 3
1 INTRODUO ................................................................................................................ 3
2 CONCEITOS FUNDAMENTAIS DE INTERPRETAO E COMPILAO ................... 5
2.1 INTERPRETAO ....................................................................................................... 5
2.2 COMPILAO ............................................................................................................. 7
3 LINGUAGEM DE PROGRAMAO C ........................................................................... 8
3.1 TIPOS PRIMITIVOS DE DADOS ................................................................................. 9
3.2 CONSTANTES E VARIVEIS .................................................................................... 10
3.2.1 Constantes .............................................................................................................. 10
3.2.2 Variveis ................................................................................................................... 11
3.3 ATRIBUIO .............................................................................................................. 12
3.4 OPERADORES ARITMTICOS ................................................................................. 13
3.5 FUNES .................................................................................................................. 15
3.5.1 Uso de Funes ...................................................................................................... 16
4 EXEMPLO DE CDIGO EM C ..................................................................................... 19
4.1 PALAVRA RESERVADA ............................................................................................. 20
4.2 COMENTRIOS ......................................................................................................... 20
4.2.1 Utilizando Barra dupla ............................................................................................. 21
4.2.2 Comentrios com /* */ ............................................................................................. 22
4.3 IDENTAO ............................................................................................................... 22
5 COMPILAO DE PROGRAMAS EM C ..................................................................... 23
6 LINGUAGEM DE PROGRAMAO JAVA ................................................................. 27
6.1 EXEMPLOS DE CDIGOS ........................................................................................ 28
6.2 APPLETS JAVA .......................................................................................................... 29
6.3 SEGURANA ............................................................................................................. 29
6.4 PORTABILIDADE ....................................................................................................... 30
6.5 J2ME .......................................................................................................................... 30
7 EXEMPLO DE CDIGO EM JAVA ............................................................................... 31
8 COMPILAO DE PROGRAMAS EM JAVA .............................................................. 32
9 CICLO DE DESENVOLVIMENTO ................................................................................ 33
RESUMO DO TPICO 1 .................................................................................................. 35
AUTOATIVIDADE ............................................................................................................ 36

TPICO 2 FUNES ................................................................................................... 37


1 INTRODUO .............................................................................................................. 37
2 FUNES ..................................................................................................................... 38
2.1 FUNES EM JAVA .................................................................................................. 39

LINGUAGENS DE PROGRAMAO E ESTRUTURA DE DADOS v


2.1.1 Criando funes sem Argumentos .......................................................................... 40
2.1.2 Criando funes com Argumentos .......................................................................... 40
2.1.3 Criando Funes sem Retorno ............................................................................... 41
2.1.4 Criando Funes com Retorno ............................................................................... 41
2.2 UTILIZANDO FUNES DE PRIMEIRA CLASSE .................................................... 42
2.2.1 Funes Internas ..................................................................................................... 42
2.2.2 Usando pginas Web em JavaScript ...................................................................... 42
3 DEFINIO DE FUNES .......................................................................................... 43
4 PILHA DE EXECUO ................................................................................................ 43
4.1 CRIANDO UMA PILHA ............................................................................................... 46
4.2 INSERO DE UM NODO NA PILHA ....................................................................... 46
4.3 ACESSO PILHA ...................................................................................................... 48
4.4 CRIAO DE PILHA ENCADEADA ........................................................................... 48
5 PONTEIRO DE VARIVEIS .......................................................................................... 49
6 RECURSIVIDADE ......................................................................................................... 50
7 VARIVEIS ESTTICAS DENTRO DE FUNES ..................................................... 53
7.1 VARIVEL LOCAL ...................................................................................................... 54
7.2 VARIVEL GLOBAL ................................................................................................... 55
RESUMO DO TPICO 2 .................................................................................................. 57
AUTOATIVIDADE ............................................................................................................ 58

TPICO 3 VETORES E ALOCAO DINMICA ........................................................ 59


1 INTRODUO .............................................................................................................. 59
2 VETORES E ALOCAO DINMICA ......................................................................... 59
2.1 VETORES (ARRAYS) ................................................................................................ 59
2.2 MTODOS UTILIZADOS EM ARRAYS ..................................................................... 61
3 ALOCAO DINMICA ............................................................................................... 63
3.1 ALOCAO ESTTICA ............................................................................................. 67
3.2 ALOCAO DINMICA ............................................................................................. 67
LEITURA COMPLEMENTAR ........................................................................................... 68
RESUMO DO TPICO 3 .................................................................................................. 71
AUTOATIVIDADE ............................................................................................................ 72
AVALIAO ..................................................................................................................... 73

UNIDADE 2 ESTRUTURAS DE DADOS ...................................................................... 75

TPICO 1 CADEIA DE CARACTERES ....................................................................... 77


1 INTRODUO .............................................................................................................. 77
2 CADEIA DE CARACTERES ......................................................................................... 77
2.1 CARACTERES ........................................................................................................... 78
2.2 CADEIA DE CARACTERES (strings) ................................................................... 82
2.2.1 Constantes do tipo caracteres ................................................................................. 82
2.2.2 Variveis do tipo caracteres .................................................................................... 84
2.2.3 Cadeia de caracteres e operaes ......................................................................... 85

LINGUAGENS DE PROGRAMAO E ESTRUTURA DE DADOS vi


2.2.4 Strings ..................................................................................................................... 86
2.3 VETOR DE CADEIA DE CARACTERES ................................................................... 88
2.3.1 Vetores unidimensionais ......................................................................................... 90
2.3.2 Leitura de vetores .................................................................................................... 92
2.3.3 Escrita de vetores .................................................................................................... 93
RESUMO DO TPICO 1 .................................................................................................. 95
AUTOATIVIDADE ............................................................................................................ 96

TPICO 2 TIPOS DE ESTRUTURA DE DADOS ......................................................... 97

1 INTRODUO .............................................................................................................. 97
2 TIPOS ESTRUTURADOS ............................................................................................. 98
2.1 TIPO ESTRUTURA .................................................................................................... 98
2.1.1 Variveis do tipo heterognea ............................................................................... 100
2.1.2 Variveis do tipo homognea ................................................................................ 101
2.1.3 Arranjos unidimensionais ...................................................................................... 101
2.1.4 Arranjos multidimensionais .................................................................................... 104
2. 2 PONTEIRO PARA ESTRUTURAS .......................................................................... 105
2.2.1 Operadores ........................................................................................................... 108
2.3 DEFINIO DE NOVOS TIPOS ............................................................................. 110
2.3.1 Comando typedef ................................................................................................... 112
2.4 VETORES DE ESTRUTURAS .................................................................................. 113
2.5 VETORES DE PONTEIROS PARA ESTRUTURAS ................................................. 114
2.5.1 Funes de vetores de ponteiros para estruturas .................................................. 116
2.6 TIPO UNIO .............................................................................................................. 119
2.7 TIPO ENUMERAO .............................................................................................. 120
LEITURA COMPLEMENTAR ......................................................................................... 121
RESUMO DO TPICO 2 ................................................................................................ 122
AUTOATIVIDADE .......................................................................................................... 124

TPICO 3 MATRIZES ................................................................................................. 125


1 INTRODUO ............................................................................................................ 125
2 MATRIZES .................................................................................................................. 126
2.1 MATRIZES ESPECIAIS ............................................................................................ 128
2.2 VETORES BIDIMENSIONAIS MATRIZES ............................................................ 129
2.3 MATRIZES DINMICAS ........................................................................................... 132
2.4 REPRESENTAO DE MATRIZES ......................................................................... 134
2.5 REPRESENTAO DE MATRIZES SIMTRICAS .................................................. 137
2.6 TIPOS ABSTRATOS DE DADOS ............................................................................. 142
2.6.1 Tipo de dado abstrato Ponto ................................................................................. 144
2.6.2 Tipo de dado abstrato Matriz ................................................................................. 145
RESUMO DO TPICO 3 ................................................................................................ 148
AUTOATIVIDADE .......................................................................................................... 149
AVALIAO ................................................................................................................... 150

LINGUAGENS DE PROGRAMAO E ESTRUTURA DE DADOS vii


UNIDADE 3 EstruturaS de Dados Avanadas ............................................ 151

TPICO 1 LISTAS ENCADEADAS ............................................................................ 153


1 INTRODUO ............................................................................................................ 153
2 A Lista Encadeada ............................................................................................... 155
2.1 NS E LISTA ENCADEADA ..................................................................................... 157
2.2 DEFININDO A INTERFACE ..................................................................................... 159
2.3 IMPLEMENTAO DOS MTODOS ....................................................................... 160
2.3.1 Mtodo adicionaNoComeco() ................................................................................ 160
2.3.2 Mtodo adiciona() .................................................................................................. 162
2.3.3 Mtodo adicionaPosicao() ..................................................................................... 163
2.3.4 Mtodo pega() ....................................................................................................... 165
2.3.5 Mtodo removeDoComeco() ................................................................................. 165
2.3.6 Mtodo removeDoFim() ........................................................................................ 167
2.3.7 Mtodo remove() ................................................................................................... 169
2.3.8 Mtodo contem() ................................................................................................... 170
2.3.9 Mtodo tamanho() ................................................................................................. 171
2.4 VERIFICANDO O FUNCIONAMENTO DOS MTODOS ........................................ 171
2.4.1 Classe TesteAdicionaNoFim .................................................................................. 172
2.4.2 Classe TesteAdicionaPorPosicao .......................................................................... 172
2.4.3 Classe TestePegaPorPosicao ............................................................................... 173
2.4.4 Classe TesteRemovePorPosicao .......................................................................... 174
2.4.5 Classe TesteTamanho ........................................................................................... 174
2.4.6 Classe TesteContemElemento .............................................................................. 175
2.4.7 Classe TesteAdicionaNoComeco .......................................................................... 175
2.4.8 Classe TesteRemoveDoComeco ........................................................................... 176
2.4.9 Classe TesteRemoveDoFim .................................................................................. 176
2.5 CDIGO COMPLETO DA CLASSE LISTA ENCADEADA ....................................... 177
RESUMO DO TPICO 1 ................................................................................................ 182
AUTOATIVIDADE .......................................................................................................... 183

TPICO 2 Lista Duplamente Encadeada ....................................................... 185


1 INTRODUO ............................................................................................................ 185
2 Mtodo adicionaNoComeco() .......................................................................... 185
3 Mtodo adiciona() ................................................................................................ 187
4 Mtodo adicionaPosicao() ............................................................................... 188
5 Mtodo removeDoComeco() ........................................................................... 188
6 Mtodos removeDoFim() e remove() ............................................................. 189
RESUMO DO TPICO 2 ................................................................................................ 191
AUTOATIVIDADE .......................................................................................................... 192

TPICO 3 PILHAS ..................................................................................................... 193


1 INTRODUO ............................................................................................................ 193

LINGUAGENS DE PROGRAMAO E ESTRUTURA DE DADOS viii


2 o conceito de pilhas .......................................................................................... 194
3 A implementao da Classe Pea ................................................................. 194
3.1 SOLUO DOS PROBLEMAS DAS PEAS .......................................................... 195
3.2 OPERAES EM PILHAS ...................................................................................... 198
3.2.1 Inserir uma pea .................................................................................................... 198
3.2.2 Remover uma pea ............................................................................................... 198
3.2.3 Informar se a Pilha est vazia ............................................................................... 199
3.2.4 Generalizao ....................................................................................................... 200
RESUMO DO TPICO 3 ................................................................................................ 204
AUTOATIVIDADE .......................................................................................................... 205

TPICO 4 FILAS ........................................................................................................ 207


1 INTRODUO ............................................................................................................ 207
2 o conceito de filas ............................................................................................ 208
3 Interface de uso ................................................................................................. 208
3.1 OPERAES EM FILA ............................................................................................ 210
3.1.1 Inserir uma pessoa ................................................................................................ 210
3.1.2 Remover uma pessoa ............................................................................................ 211
3.1.3 Informar se a Fila est vazia ................................................................................. 212
3.2 GENERALIZAO ................................................................................................... 212
LEITURA COMPLEMENTAR ......................................................................................... 216
RESUMO DO TPICO 4 ................................................................................................ 227
AUTOATIVIDADE .......................................................................................................... 228
AVALIAO ................................................................................................................... 229
REFERNCIAS .............................................................................................................. 231

LINGUAGENS DE PROGRAMAO E ESTRUTURA DE DADOS ix


LINGUAGENS DE PROGRAMAO E ESTRUTURA DE DADOS x
UNIDADE 1

INTRODUO AO ESTUDO DE
LINGUAGEM DE PROGRAMAO E
ESTRUTURAS DE DADOS

Objetivos de aprendizagem

A partir desta unidade, voc ser capaz de:

conceituar estruturas de dados;


entender sua aplicabilidade na linguagem de programao;
utilizar suas funcionalidades para estruturar dados.

L
I
N
PLANO DE ESTUDOS G
U
A
Esta unidade do caderno de estudos est dividida em trs G
E
tpicos. No final de cada um deles voc encontrar atividades visando N
S
compreenso dos contedos apresentados.
D
E

P
R
O
G
R
TPICO 1 - CONCEITOS FUNDAMENTAIS A
- INTERPRETAO VERSUS M
A
COMPILAO

TPICO 2 - FUNES O

E
TPICO 3 - VETORES E ALOCAO DINMICA
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1

TPICO 1

CONCEITOS FUNDAMENTAIS -
INTERPRETAO VERSUS COMPILAO

1 INTRODUO

A estrutura de dados surgiu com o objetivo de auxiliar a tecnologia da informao a


estruturar a linguagem de programao, nesse sentido podem ser utilizados vrios tipos de
associaes entre estruturas de dados e linguagem de programao. A estrutura de dados fica
L
com a responsabilidade de organizar e armazenar os dados e os algoritmos com a finalidade de I
N
desenvolver, implementar e utilizar os melhores cdigos para cada tipo de estrutura de dados. G
U
Veloso; Santos; Azeredo (1983), definem a estruturao da informao como fabula, onde A
G
computadores servem para armazenar informaes e programas para manipul-los. Seguindo, E
N
colocam a estrutura de dados com a definio de relaes lgicas existentes entre os dados, S
de modo analgico ao uso de um modelo matemtico para espelhar alguns aspectos de uma D
E
realidade fsica.
P
R
Este um contexto em que se definem a importncia e utilizao da linguagem de O
G
programao e estrutura de dados, as estruturas de dados so organizadas, seguras, quando R
A
so utilizadas de forma adequada pelos programadores, pois a execuo e estruturao de M
A
dados so responsabilidade dos programadores, no basta conhecer apenas como desenvolver

um programa, utilizar a melhor linguagem para um projeto, precisa conhecer como manipular O

e estruturar os dados de um programa. E

E
S
A Estrutura de dados um processo muito importante, segundo Edelweiss e Galante T
R
(2009, p. 36), um fator que determina o papel dessas estruturas no processo de programao U
T
de aplicaes a identificao de quo bem as estruturas de dados coincidem com o domnio U
R
do problema a ser tratado. Por isso essencial linguagem de programao o suporte no A

desenvolvimento do programa e auxlio absoluto das estruturas de dados, esta lgica permite D
E
que sejam agregados valor na especificao dos dados, relacionando de forma estruturada os
D
dados, as variveis e seus elementos. Guimares e Lages, (2013, p. 52), afirmam: A
D
O
S
4 TPICO 1 UNIDADE 1

(...) decises sobre estruturas dos dados no podem ser feitas sem conhecimento dos
algoritmos aplicados a eles, e vice-versa: a estrutura e a escolha dos algoritmos dependem
muitas vezes fortemente da estrutura dos dados, e, a arte de programar consiste na arte de
organizar e dominar a complexidade.

Faz parte, como processo de estrutura de dados, o estudo sobre a interpretao e


compilao de dados. A interpretao e compilao so formas de como um computador
pode interpretar e compilar um cdigo fonte de um programa, podemos, assim dizer, que
um computador precisa identificar, interpretar cdigos e linguagens, aps esta sequncia
de processos de interpretao o computador ir realizar a execuo das tarefas solicitadas.
Aguilar (2011) apresenta compilao como um processo de traduo de programas-fonte
para um programa-objeto. O programa-objeto obtido da compilao traduzido normalmente
para cdigo fonte da mquina. Conforme Costa (2010, p. 26), na tcnica de interpretao, um
programa convertido em outro de forma dinmica, automtica.

As etapas que envolvem a linguagem de programao e estruturas de dados pode


ser tudo que envolve a lgica de programao, desde a utilizao de dados, organizao de
memria, utilizao de cdigos e linguagens especficas para cada necessidade. A linguagem
L de programao em C, por exemplo, considerada uma linguagem muito rpida para ser
I
N executada e possui seu prprio compilador de cdigo. A linguagem C composta por vrias
G
U caractersticas, como Tipos Primitivos de dados, Constantes e Variveis, Atribuio, Operadores
A
G aritmticos e Funes.
E
N
S
A linguagem de programao em C possui uma caracterstica muito interessante, em sua
D
E portabilidade permitido converter e executar programas, sistemas operacionais e hardware
P diferentes do seu cdigo-fonte. A linguagem C realiza a compilao de programas atravs do
R
O Cdigo-Fonte, Cdigo-Objeto e Cdigo-Executvel. Segundo Aguilar (2011, p. 42), o programa-
G
R fonte deve ser traduzido para linguagem de mquina, processo realizado com o compilador e
A
M
o sistema operacional, que se encarrega, na prtica, da compilao.
A

O
A programao Java, por sua vez, uma linguagem que atualmente est em ascenso,

E
muito utilizada para vrios tipos de aplicaes, principalmente para aplicaes web. Sua
principal caracterstica est na segurana que sua aplicao disponibiliza, sua agilidade para
E
S ser executado e confiabilidade em ser utilizado para vrios tipos de aplicaes. Como suas
T
R aplicaes esto voltadas principalmente para produtos que imitam o mundo real podemos
U
T citar os aplicativos e programas para jogos de computadores.
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 1 5

2 CONCEITOS FUNDAMENTAIS DE INTERPRETAO E COMPILAO

Especificamente para que um computador funcione, receba e execute funes,


primeiramente este precisa entender os cdigos que formam os programas, um computador
funciona e executa suas tarefas atravs de programas de computador. Alguns processos
auxiliam os computadores nessa funo de entender as linguagens de programao e para
que esses executem de forma correta as atividades advindas da programao.

Para entender melhor ser apresentada a contextualizao e as diferenas entre


Interpretao de Compilao. Na arquitetura de linguagens de programao, a interpretao e
compilao so processos que ocorrem de formas distintas, no entanto, as duas somam para
o processo da linguagem de programao.

Acadmico, analisando as palavras Interpretao e Compilao o que consegues


subentender sobre cada uma?

Interpretao vem de interpretar, j compilar vem de reunir, considerando que estamos L


I
falando sobre a computao, podemos perceber que o computador precisa interpretar os N
G
cdigos e linguagens, reunir os conjuntos de cdigos, para assim executar tarefas, analisando U
A
por este ngulo fica mais fcil entender. Vamos aos conceitos destes dois termos da arquitetura G
E
de linguagens de programao. Iniciando pela definio de programa de Interpretao. N
S

D
E

P
R
O
2.1 INTERPRETAO G
R
A
M
O interpretador possui como funo executar o cdigo-fonte, traduzindo o programa A

a cada linha de cdigo que vai sendo escrito (digitado), assim que o computador consegue
O
interpretar os cdigos, o programa vai sendo executado, a cada execuo do cdigo o programa
E
precisa ser novamente interpretado pelo computador. Conforme Costa (2010, p. 26), na
E
tcnica de interpretao, um programa convertido em outro, dinamicamente. Toda vez que S
T
uma execuo for necessria, o cdigo-fonte ser traduzido para uma linguagem que possa R
U
ser executada, direta ou indiretamente, pelo sistema operacional. T
U
R
A

D
E

D
A
D
O
S
6 TPICO 1 UNIDADE 1

UNI
Conforme Costa (2010, p. 26), quando escrevemos programas
de um computador em uma linguagem de programao, o
conjunto de instrues que formam o programa chamado de
cdigo-fonte. O cdigo-fonte define as instrues do programa
de computador, que, para estarem corretas, devem atender
estrutura lxica, sinttica e semntica da linguagem de
programao utilizada.

Conforme Lopes (1997), um interpretador compila e executa um programa fonte. No


entanto, esse processo pode ocorrer de forma mais lenta que no programa compilador, pois um
interpretador precisa traduzir/executar cada cdigo que est sendo inserido no programa, isso
torna o processo de verificao da existncia de problemas em uma execuo mais demorada,
pois, s aps cada execuo do programa o computador vai identificar a existncia de problemas
no cdigo-fonte. O programa de interpretao possui a caracterstica de executar cada linha
de cdigo digitada no programa de computador, necessariamente o cdigo interpretado e
executado pelo programa em sequncia.

L
I
N
Os programas interpretados tornam o processo de traduo para o sistema mquina
G
U
mais rpido para sua execuo, possuem maior dinamicidade e podem ser utilizados em vrios
A sistemas operacionais, possuem maior portabilidade. No entanto, seu desempenho na execuo
G
E dos cdigos para a linguagem da mquina inferior aos programas compilados.
N
S

D
E FIGURA 1- EXECUO DO PROGRAMA INTERPRETAO
P
R
O
G
R
A Instruo
M Cdigo Fonte
A

O
Interpretador Sada
E Cdigo Executvel

E
S
T
Entrada
R
U
T
U
R FONTE: A autora
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 1 7

2.2 COMPILAO

A seguir ser exposto a definio do contexto da compilao, este precisa de um


programa fonte, como, por exemplo, um sistema operacional que realiza a funo de executar,
gerar outro programa, mas neste caso uma linguagem denominada de alto nvel. Segundo
Costa (2010, p. 27),

(...) a tcnica mais comumente utilizada para a traduo de programas a com-


pilao. Nessa tcnica, um programa especial, chamado compilador, recebe
como entrada o cdigo-fonte de um programa e produz como sada o mesmo
programa, porm escrito em outra linguagem. O resultado da compilao pode
ser chamado de cdigo objeto, cdigo intermedirio ou cdigo executvel, de
acordo com o processo de compilao realizado e a terminologia utilizada.

UNI
Conforme Lorenzi e Lopes (2000) o Fortran e Cobol foram
as primeiras linguagens de programao de alto nvel, cujas L
I
construes no mostram qualquer semelhana com a linguagem N
de mquina. G
U
A
G
E
N
S
Conforme Lopes (1997, p. 52), um compilador tem a funo de transformar um algoritmo
D
codificado em uma linguagem X para a linguagem da mquina equivalente. Conforme Sebesta E
(2010), os programas podem ser traduzidos para linguagem da mquina, a qual pode ser P
executada diretamente no computador. Esse mtodo chamado de implementao baseada R
O
em compilao, com a vantagem de ter uma execuo de programas muito mais rpidos, uma G
R
vez que o processo de traduo estiver completo. Uma funo muito especfica do compilador, A
M
para que o mesmo seja executado, todo o programa fonte precisa estar codificado e digitado, A

aps este processo ocorre a execuo do programa, resumidamente, para que o programa
O
seja executado, todo o cdigo precisa ser compilado, para ser executado pelo computador.
E

E
Costa (2010) afirma, quando compilamos programas de computador utilizamos resultado S
T
desse processo de compilao para executar os programas. Depois de compilado, o programa R
U
pode ser executado indefinidamente, sem a necessidade de repetio do processo de traduo. T
U
Uma compilao s ser necessria quando uma mudana no cdigo-fonte do programa for R
A
refletida no programa compilado.
D
E

D
A
D
O
S
8 TPICO 1 UNIDADE 1

FIGURA 2 - EXECUO DO PROGRAMA COMPILADOR

Programa Fonte
Linguajem Automtica

Anlise
Lxica

Anlise
Sinttica
COMPILAO

Gerao de
Objeto

Programa Objeto
Linguajem Mquina

FONTE: A autora

L
I
N
G
U
A
G 3 LINGUAGEM DE PROGRAMAO C
E
N
S

D
Caro acadmico(a), recorda-se que anteriormente estvamos falando sobre linguagens
E de programao que so consideradas de alto nvel, a linguagem de programao C possui
P
R
essa caracterstica. Outra caracterstica da linguagem C pode ser observada a partir do seu
O prprio compilador, este por sua vez executa os cdigos, gerando programas executveis muito
G
R menores e muito mais rpidos do que outras linguagens de programao.
A
M Como uma das funcionalidades da linguagem C, precisa executar de forma repetida
A
suas funes, realiza um processo de separar as atividades definidas e codificadas, com isso

O tornando o processo de compilao e execuo muito mais rpidos.


E

E Conforme Cocian (2004), uma das grandes vantagens da linguagem C a sua


S
T caracterstica de alto nvel e de baixo nvel ao mesmo tempo, permitindo o controle total
R
U da mquina (hardware e software) por parte do programador, permitindo efetuar aes sem
T
U depender do sistema operacional utilizado. Isso ocorre porque foi desenvolvida com o objetivo
R
A de facilitar a vida dos engenheiros na prtica de programas, sistemas robustos muito extensos,
D tentando ao mximo minimizar a quantidade de erros que podem ocorrer.
E

D
A Cocian (2004, p. 32) destaca as vantagens da linguagem de programao C tornar-se
D
O cada vez mais conhecida e utilizada, como:
S
UNIDADE 1 TPICO 1 9

1. A portabilidade do compilador.
2. O conceito de bibliotecas padronizadas.
3. A quantidade e variedade de operadores poderosos.
4. A sintaxe elegante.
5. O fcil acesso ao hardware quando necessrio.
6. A facilidade com que as aplicaes podem ser otimizadas, tanto na codi-
ficao, quanto na depurao, pelo uso de rotinas isoladas e encapsuladas.

A linguagem C considerada uma linguagem tanto de alto nvel, quanto mdio e


baixo nvel, no entanto sua utilizao se deve ao grande reaproveitamento dos cdigos na
programao de um produto. Utiliza a forma de linguagem de programao baseada nas
metodologias Imperativas e Procedural, isso quer dizer que so aes e comando dos cdigos
que sofrem alteraes, pode mudar de estado, conforme como deve ser executado o cdigo,
como segue etapas e caminhos para alcanar o objetivo final do produto em desenvolvimento.

3.1 TIPOS PRIMITIVOS DE DADOS

L
A definio de dados pode ser compreendida, estruturada e formada por inmeros dados I
N
que so estipulados para cada objetivo em que o computador tenha que entender e executar G
U
alguma tarefa. Conforme Sebesta (2010, p. 268): A
G
E
Um tipo de dado define uma coleo de valores de dados e um conjunto de N
S
operaes pr-definidas sobre eles. Programas de Computador realizam tare-
fas quo bem os tipos de dados disponveis na linguagem usada casam com os D
objetivos no espao do problema do mundo real. Logo crucial uma linguagem E
oferecer suporte para uma coleo apropriada de tipos e estruturas de dados. P
R
O
G
Com essa afirmao pode-se perceber que as estruturas de dados permitem que R
A
a linguagem de computador possa interpretar e compilar os dados e cdigos para uma M
A
determinada linguagem de programao. Edelweiss e Galante (2009), descrevem os tipos de

dados primitivos, em que no possuem uma estrutura sobre seus valores, ou seja, no possvel O
decompor o tipo primitivo em partes menores. Os tipos bsicos so, portanto, indivisveis. E
Consideravelmente este tipo de dado no pode sofrer alteraes, pois definido por E
ter campos de dados infinitos, podemos citar como exemplo desse dado o CPF de um usurio. S
T
R
U
Os tipos de dados primitivos so formados por nmeros inteiros, nmeros, ponto T
U
flutuantes, caracteres e tipos nulos, conforme pode ser observado na tabela a seguir, onde R
A
possui o cdigo e a funo de cada um deles em uma estrutura de dados primitivos.
D
E

D
A
D
O
S
10 TPICO 1 UNIDADE 1

TABELA 1: TIPO DE DADO PRIMITIVO


Palavra (Cdigo) Tipo Primitivo
char caracter
int inteiro
float real de preciso simples
double real de preciso dupla
void vazio (sem valor)
FONTE: A autora

3.2 CONSTANTES E VARIVEIS

L 3.2.1 Constantes
I
N
G
U
A
Segundo Almeida (2008, p. 27), constantes so dados cujos valores so fixos e que
G
E
no se alteram ao longo da execuo de um programa. Exemplos: nmeros, letras, palavras,
N
S
entre outros. Geralmente, a constante definida no incio do programa e sua utilizao acontece
no decorrer dele.
D
E

P FIGURA 3 - CONSTANTES
R
O
G
R
A
M
A

E
S
T
R FONTE: A autora
U
T
U
R Os dados CONSTANTES so definidos por um nico valor, desde o incio do programa,
A
at o final de sua execuo, isto resultando em um processo, em que no possvel os dados
D
E j definidos serem alterados, sejam alteraes por comandos ou funes.
D
A
D
O
S
UNIDADE 1 TPICO 1 11

3.2.2 Variveis

Variveis por sua vez, conforme define Cocian (2004, p. 99), devem ser declaradas
antes de serem utilizadas. Existem dois tipos de variveis: Globais e Locais. Variveis globais
devem ser declaradas no incio do programa e fora de qualquer funo. As variveis locais
devem ser declaradas no incio da funo, onde elas sero vlidas. Os dados variveis seguem
uma lgica muito parecida com as constantes, no entanto elas so declaradas no incio do
programa e no incio das funes.

Almeida (2008, p. 27), por sua vez destaca que as variveis usadas em algoritmos
devem ser declaradas antes de serem utilizadas, visto que os compilados precisam reservar um
espao na memria para cada um deles. Resumindo, uma varivel so as formas de como o
computador disponibiliza um espao para armazenar os dados, estas variveis ficam abertas,
disponveis para receber qualquer dado, podem ser alteradas quando existir a necessidade de
mudana. Por isso esses dados, so denominados de variveis, pois podem sofrer alteraes
e serem mudadas quando for necessrio.
L
I
Cocian (2004, p. 100), afirma que as variveis podem ser de vrios tipos, como: int N
G
(interias), float (real). Os nomes das variveis indicam o endereo de memria onde est U
A
um determinado dado. Conforme Almeida (2008), varivel a representao simblica dos G
E
elementos de certo conjunto. Cada varivel ocupa uma posio de memria, cujo contedo N
S
pode ser modificado durante a execuo de um programa. Mesmo que uma varivel assuma
D
diferentes valores, ela s poder armazenar um valor por vez. E

P
FIGURA 4 - VARIVEL R
O
G
R
A
M
A


O

E
S
T
FONTE: A autora R
U
T
Especificamente um dado varivel pode obter um nico valor, isso desde o incio at U
R
o final das execues do programa, esse procedimento ocorre devido a um processo em que A

o computador armazena espao na memria, para os dados manipulados. So dois tipos de D


E
variveis que podem ser encontradas, Varivel Numrica e Varivel Alfanumrica. A varivel
D
numrica definida por receber dados numricos, com a funcionalidade de realizar clculos. A
D
A varivel alfanumrica definida por receber dados como caracteres e dados em texto. Outra O
S
12 TPICO 1 UNIDADE 1

caracterstica dos dados variveis est relacionada com a declarao da varivel, pois ao
realizar este procedimento de declarar a varivel existe a necessidade de informar o nome e
qual o tipo de dado que esta receber.

FIGURA 5 - IDENTIFICADOR DA VARIVEL

FONTE: Ancibe (2014)

3.3 ATRIBUIO

Um sistema possui como principal funo executar e processar os dados, conforme


solicitaes e comandos estipulados. Nesse sentido o operador de atribuio possui a
responsabilidade de atribuir valor para um dado varivel, o smbolo deste pode ser identificado
L
I por: ( = ), porm o sinal de igual, neste caso no est relacionado com a matemtica de igualar
N
G algum valor, ou clculo de valores. Para a linguagem C, o clculo realizado est entre uma
U
A expresso varivel identificada, segue exemplo:
G
E
N
S identificador = expresso;
D
E
O identificado definido pelo nome da varivel e a expresso o identificador.
P
R
O
G Segundo Edelweiss e Livi (2014, p. 78), o operador de atribuio atribui o valor que
R
A est direita da varivel localizada esquerda. O valor da expresso direita pode ser uma
M
A constante, uma varivel ou qualquer combinao vlida de operadores.

Exemplo:
O

E
TABELA 2: ATRIBUIO
E
S x = 4; Significa que a varivel x recebe o valor de 4
T
R val = 2.5; Varivel val recebe valor de 2,5
U
T y = x + 2; A varivel y recebe valor de x mais valor de 2
U
R Varivel y recebe valor que estava armazenado
A y = y + 4;
nela mesma, mais valor de 4
D
E FONTE: A autora.
D
A
D Pode-se perceber que os valores atribudos, sempre ocorrem da direita para a
O
S
UNIDADE 1 TPICO 1 13

esquerda, sucintamente, o valor das expresses podem ser tanto constantes, quanto variveis,
outro fator muito importante para a atribuio sua disponibilidade de realizar a atribuio de
um valor, para vrias outras variveis, isso ocorre atravs de um encadeamento de atribuies.

Conforme Exemplo:

total_um = total_dois = somatorio = 0;

3.4 OPERADORES ARITMTICOS

Os operadores aritmticos realizam o processo de clculo diferentemente da atribuio,


neste caso os clculos seguem as regras estabelecidas na lgebra, onde os operadores
compilam os valores da esquerda para a direita. Segundo Rebollo (2013), operadores aritmticos
podem ser usados em qualquer tipo de dado escalar sejam nmeros inteiros, reais e caractere.
Quando realizamos operaes com o mesmo tipo de dado o resultado do mesmo tipo. Se
forem do tipo diferente, a converso ser automtica e tentar converter para o tipo mais L
I
apropriado para a operao. N
G
U
A
Os operadores binrios so: * ( multiplicao ), / ( diviso ), % ( modulo ), + ( soma), - G
E
(subtrao). N
S
Os operadores unrios so: + (positivo) e - ( negativo), ++ (incremento) (decremento).
D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
14 TPICO 1 UNIDADE 1

UNI
Dados Escalar so valores individuais sem componentes interno,
assim como os exemplos de NUMBER, DATE ou BOOLEAN.

J os tipos de dados escalares so definidos nas seguintes


categorias da Tabela 2.

Tipos de dados Descrio


Valores numricos em que as operaes
Numeric
aritmticas so realizadas.
Valores alfanumricos que representam
Character
caracteres simples ou strings de caracteres.
Valores lgicos nos quais as operaes lgicas
Boolean
so realizadas.
Datetime Datas e horas basicamente.

FONTE: Disponvel em: Tipos de dados Escalar e LOB <http://


www.devmedia.com.br/pl-sql-tipos-de-dados-escalar-e-
lob/29824#ixzz3CwQmVhuz>

L
I
N
G
U TABELA 3: OPERADORES ARITMTICOS
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E FONTE: Fialho (2011)


E
S
T Exemplos de Operadores Aritmticos:
R
U
T
U A seguir um Exemplo de utilizao de variveis e operadores aritmticos, segundo o
R
A autor Fialho (2011):
D
E

D
A
D
O
S
UNIDADE 1 TPICO 1 15

Declarao de variveis.
Dim x, y, z As Integer
x = 10
y = 25
z = x*y
Nesse exemplo a varivel z conter o valor 250

3.5 FUNES

Analisando que a linguagem C constituda por vrios blocos de construo, logo, esses
blocos so considerados como funcionais, isso permite que um programa seja desenvolvido
atravs desses blocos funcionais, formando assim as estruturas das funes.
Como na utilizao da matemtica, as funes em C recebem vrios parmetros e esses
geram um valor como resultado de uma funo, lgico esse processo ocorre com auxlio dos
programadores que executam as funes, esse processo ocorre de forma ordenada, resultando
em vrias funes executadas pelo prprio programa.
L
I
Segundo Aguilar (2011, p. 197), as funes formam um miniprograma dentro de um N
G
programa. As funes economizam espao, reduzindo repeties e tornando mais fcil a U
A
programao, proporcionando um meio de dividir um projeto grande em pequenos mdulos G
E
mais manejveis. Seguindo essa linha, Mokarzel e Soma (2008, p. 44), salientam que: N
S

todos os mdulos de um programa em C so denominados funes e cada D


funo composta de um cabealho e um escopo. O principal elemento do E
cabealho o nome da funo, mas ele pode conter tambm o tipo de valor P
que ela produz e os parmetros sobre os quais ele deve atuar. R
O
G
R
Analisando as funcionalidades e caractersticas das funes em C, pode ser observado A
M
que sua responsabilidade executar comandos e executar uma ou vrias tarefas, consideradas A

como sub-rotinas dentro de um programa. Essas sub-rotinas so responsveis por receber
O
as informaes ou as solicitaes, realiza o processamento dessas informaes retornando
E
a solicitao com outra informao. Conforme Dornelles (1997, p.74), existem dois tipos de
E
funes: funes de biblioteca e funes de usurio. Funes de biblioteca so funes escritas S
T
pelos fabricantes do compilador e j esto pr-compiladas, isto , j esto escritas em cdigo R
U
de mquina. Funes de usurio so funes escritas pelo programador. T
U
R
A

D
E

D
A
D
O
S
16 TPICO 1 UNIDADE 1

3.5.1 Uso de Funes

Para que se possa utilizar uma funo, existe a necessidade de realizar a declarao
desta funo, devem ser definidos os parmetros que a funo ir receber e tambm quais
so os parmetros que esta funo deve retornar como resposta para o programa, essas
informaes ficam armazenadas no manual do usurio do compilador do sistema.

Segue exemplo, conforme Dornelles (1997), de uma sintaxe declarando uma funo:

(tipo_ret nome(tipo_1, tipo_2, ...)


Onde nome o nome da funo, tipo_1, tipo_2, ... so os tipos (e quantidade) de
parmetros de entrada da funo e tipo_ret o tipo de dado de retorno da funo. Alm dos
tipos usuais vistos existe ainda o tipo void (vazio, em ingls) que significa que aquele parmetro
inexistente.

Na linguagem C, pode ser encontrado um conjunto mnimo de instrues, estas possuem


L
I
como objetivo desenvolver programas executveis com tamanho em propores, quanto
N
G
menor forem melhor ser o objetivo alcanado. No entanto s podem ser adicionadas novas
U
A
funcionalidades para a linguagem C, com incluses feitas atravs de bibliotecas, em que a
G
E
estrutura dessas bibliotecas so formadas por classe de funes. Cada classe da biblioteca
N possui uma responsabilidade especfica para o tratamento dos dados solicitados. Outro fator
S
muito importante em se tratando de linguagens de programao em C que a insero de
D
E bibliotecas devem ser as primeiras instrues do programa a ser desenvolvido.
P
R
O FIGURA 6 - EXEMPLO DE FUNES DE BIBLIOTECA
G
R
A
M
A

E
S
T
R
U
T
U FONTE: Pereira (1996)
R
A

D A seguir vamos analisar um exemplo, tambm do autor Dornelles (1997), com relao
E
a funo da biblioteca, demonstrando como a mesma pode ser declarada.
D
A
D
O A funo cos () da biblioteca math.h declarada como:
S
UNIDADE 1 TPICO 1 17

double cos (double);

Isto significa que a funo tem um parmetro de entrada e um parmetro de sada,


ambos so do tipo double.

Exemplo: A funo getch () da biblioteca conio.h declarada como:


int getch (void);

Isto significa que a funo no tem parmetros de entrada e tem um parmetro int de
sada. Para podermos usar uma funo de biblioteca devemos incluir a biblioteca na compilao
do programa. Esta incluso feita com o uso da diretiva #include colocada antes do programa
principal.

Exemplo: Assim podemos usar a funo no seguinte trecho de programa:

FIGURA 7 - FUNO DE INCLUIR DE BIBLIOTECA

L
I
N
G
U
A
G
E
FONTE: Dornelles (1997) N
S

D
FIGURA 8 - PRINCIPAIS FUNCIONALIDADES DE BIBLIOTECA E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
FONTE: Pereira (1996) T
U
R
A
Seguem alguns exemplos das funes disponveis nas Bibliotecas C, isso segundo a
D
ideia de Dornelles (1997): Biblioteca math.h e Biblioteca stdlib.h. E

D
A
D
O
S
18 TPICO 1 UNIDADE 1

Biblioteca math.h:
int abs (int i);
double fabs (double d);

Calcula o valor absoluto do inteiro i e do real d, respectivamente.

double sin (double arco);


double cos (double arco);
double tan (double arco);
double asin (double arco);
double acos (double arco);
double atan (double arco);

Funes trigonomtricas do ngulo arco, em radianos.

double ceil (double num);


double floor (double num);
L
I
N
G
U
Funes de arredondamento para inteiro.
A
G
E
N
Ceil () arredonda para cima. Ex.: Ceil (3.2) == 3.0;
S floor () arredonda para baixo. Ex.: Floor (3.2) == 4.0;
D
E

P double log (double num);


R
O double log10 (double num);
G
R
A
M Funes logartmicas: log () logaritmo natural (base e), log10 () logaritmo decimal
A
(base 10).

E double pow (double base, double exp);


E Potenciacao: pow (3.2,5.6) = 3.25.6.
S
T
R double sqrt (double num);
U
T Raiz quadrada: sqrt (9.0) = 3.0.
U
R
A Biblioteca stdlib.h
D int random (int num);
E

D
A
D
Gera um nmero inteiro aleatrio entre 0 e num - 1.
O
S
UNIDADE 1 TPICO 1 19

Nos prximos estudos veremos mais alguns exemplos de funes de bibliotecas e


conheceremos mais sobre os exemplos de cdigo em C e posteriormente como realizar a
Compilao de programas em C, at para entender as funcionalidades dessas funes na
linguagem de programao C.

4 EXEMPLO DE CDIGO EM C

Segundo Cocian (2004), a linguagem C possui vrias caractersticas positivas, como,


por exemplo, podemos citar sua portabilidade que indica a facilidade de se converter um
programa feito para um hardware especfico e sistema operacional, em um equivalente que
possa ser executado em outro hardware especfico ou sistema operacional. Ainda segundo o
autor a estrutura de um programa em C composto por Cabealho, Bloco de Instrues e por
Comentrios do Programa.

No cabealho possui as diretivas de compilador onde se definem o valor de


constantes simblicas, declarao de variveis, incluso de bibliotecas, ma-
cros, entre outros. J no bloco de instrues, chamados de funo principal
L
(main) e outros blocos de funes secundrias. Na estrutura de comentrios I
do programa, consistem a documentao is situ. (COCIAN, 2004, p. 97). N
G
U
A
Segundo Celes e Rangel (2002), um programa em C tem que, obrigatoriamente, conter G
E
a funo principal (main). A execuo de um programa comea pela funo principal (a funo N
S
main). As funes auxiliares so chamadas, direta ou indiretamente, a partir da funo principal.
D
E
Celes e Rangel (2002), demonstram outras caractersticas positivas que tornam a P
R
linguagem de programao C muito til para o desenvolvimento de vrios tipos de produtos, O
G
vamos verificar isso a seguir: R
A
M
Em C, como nas demais linguagens convencionais, devemos reservar rea A
de memria para armazenar cada dado. Isto feito atravs da declarao de

variveis, na qual informamos o tipo do dado que iremos armazenar naquela O
posio de memria. Assim, a declarao float t1; do cdigo mostrado, reserva
um espao de memria para armazenarmos um valor real (ponto flutuante E
float). Este espao de memria referenciado atravs do smbolo t1. E
S
Uma caracterstica fundamental da linguagem C diz respeito ao tempo de vida T
R
e visibilidade das variveis. Uma varivel (local) declarada dentro de uma U
funo "vive" enquanto esta funo est sendo executada, e nenhuma outra T
funo tem acesso direto a esta varivel. Outra caracterstica das variveis U
R
locais que devem sempre ser explicitamente inicializadas antes de seu uso, A
caso contrrio contero lixo, isto , valores indefinidos. (CELES; RANGEL,
2002, p. 95 e 96). D
E

D
A
D
O
S
20 TPICO 1 UNIDADE 1

4.1 PALAVRA RESERVADA

As palavras reservadas possuem como objetivo permitir que as tarefas a serem


executadas e solicitadas ocorram de forma correta pelo computador, isso pode definir como
os objetos, variveis, constantes e subprogramas devem ser criados para esta linguagem de
programao.

Uma palavra reservada, em uma linguagem de programao, j possui um significado


definido na linguagem, no podendo ser utilizada para criao de outros objetos, tais como
variveis, constantes ou subprogramas, pois no permitir a correta execuo da tarefa
solicitada ao computador.

FONTE: Disponvel em: <http://cae.ucb.br/conteudo/programar/ltp1/ltp1_conceitosfundamentais.


html>. Acesso em: 08 out. 2014

Conforme Cocian (2004, p. 97), a linguagem de programao em C, possui 32 palavras

L
reservadas, no entanto isso est definido pelos padres da American National Standards Institute
I
N
(ANSI). Na tabela a seguir vamos conhecer estas palavras reservadas:
G
U
A
G FIGURA 9 - PALAVRAS RESERVADAS
E
N
S

D
E

P
R
O
G
R
A
M
A

FONTE: Souza (2009)


O

E
S
T
R
U
4.2 COMENTRIOS
T
U
R
A Os comentrios permitem que o computador compreenda de forma mais rpida as tarefas
D executadas e solicitadas pelo programa. Segundo Rebollo (2013), os comentrios podem ser
E
de uma linha ou comentrios de mltiplas linhas. Comentrios de mltiplas linhas comeam
D
A com /* e terminam com */ tudo que estiver entre esses smbolos considerado comentrio.
D
O Comentrio de uma linha inicia com // e termina no final da linha. Esse processo necessrio
S
UNIDADE 1 TPICO 1 21

para agilizar o tempo de respostas, fazendo com que os comentrios sejam compilados para
que seja compreensvel pelo computador e que auxilie o programador a entender a solicitao.
Os comentrios servem para auxiliar no processo de documentar o cdigo fonte, esse processo
facilita a compreenso, principalmente se este programa possui centenas de linhas de cdigos.

4.2.1 Utilizando Barra dupla

Na incluso de um comentrio que ocorra em uma nica linha, dentro de um cdigo


utilizado duas barras (//), como por exemplo:

FIGURA 10 - BARRA DUPLA

L
I
N
G
U
A
G
E
N
S

FONTE: Rebollo (2013) D


E

P
Exemplo de um comentrio com barra dupla contendo uma linha no final do cdigo: R
O
G
R
FIGURA 11 - BARRA DUPLA LINHA NO FINAL A
M
A


O

E
S
T
R
U
T
U
R
A
FONTE: Rebollo (2013)
D
E

D
A
D
O
S
22 TPICO 1 UNIDADE 1

4.2.2 Comentrios com /* */

Neste exemplo de insero de comentrio que podem ser inseridas vrias linhas,
geralmente utilizadas no cabealho do programa, dentro do cdigo.

FIGURA 12 - BARRA DUPLA CONTENDO DOIS ASTERTICOS

L
I
N
G
U
A
G
E FONTE: Rebollo (2013)
N
S

D
E

P
R
O 4.3 IDENTAO
G
R
A
M
A Identao nada mais do que a organizao da escrita de cdigos-fonte, essa

organizao ocorre de forma horizontal, definindo a ordem das linhas de cdigos em forma
O
hierarquizada. A seguir vamos analisar um exemplo da linha de cdigo, conforme organizao
E
da identao:
E
S
T Variavel A = 0
R
U
SE (Variavel A < 1) ENTO
T
U
ESCREVA "Varivel A menor que 1."
R
A
FIM SE

D
E
Os comandos que fazem parte do escopo so SE ENTO FIM SE, analisando o
D
A comando acima pode-se perceber que ESCREVA est alinhado mais direita, indicando que
D
O no pertence ao escopo principal deste programa. A identao no possui especificaes para
S
UNIDADE 1 TPICO 1 23

uma nica linguagem de programao, no entanto ela pode ser utilizada em qualquer linguagem,
porm ela pode sofrer comportamentos diferentes, dependendo do uso das linguagens de
programao.

FIGURA 13 - EXEMPLO DE COMANDO EM IDENTAO

FONTE: Rodrigues (2014)

5 COMPILAO DE PROGRAMAS EM C
L
I
N
Como j visto no incio deste tpico de estudos, os compiladores so identificados como G
U
programas que realizam a traduo do cdigo-fonte para uma linguagem compilada e entendvel A
G
para o computador. O processo de traduo (compilao) implica na converso de programa, E
N
expresso em cdigo-fonte, em um programa equivalente, expresso em cdigo-executvel. A S
seguir vamos conhecer esses trs componentes da compilao de programas. D
E
Cdigo-fonte: um cdigo escrito em uma linguagem de programao. Os P
programas-fontes so normalmente compostos de diversos cdigos-fontes, R
armazenados em vrios arquivos. O
G
Cdigo-objeto: o cdigo gerado na linguagem de mquina da arquitetura- R
-alvo. Esse cdigo, entretanto, no pode ser diretamente executado pelo A
processador, j que nem todas as referncias necessrias execuo esto M
A
resolvidas. Pode faltar, por exemplo, referncias a endereos de funes que
esto em outros cdigos-objetos.
O
Cdigo executvel: o cdigo gerado na linguagem de mquina da arqui-
tetura-alvo, com todas as referncias resolvidas, que pode ser diretamente E
executado pelo processador. O arquivo contendo esse cdigo chamado de
E
programa executvel. (PINHEIRO, 2012, p. 6) S
T
R
Segundo Aguilar (2011, p. 33), o processamento de execuo de um programa escrito U
T
em uma linguagem de programao e por meio de um compilador costuma obedecer os 7 U
R
(sete) seguintes passos: A
1. Escrever o programa-fonte com um editor e guard-lo em um dispositivo de D
armazenamento, como, por exemplo, um disco. E
2. Introduzir o programa-fonte em memria.
D
3. Compilar o programa com o compilador C. A
4. Verificar e corrigir erros de compilao. D
5. Obteno do programa-objeto. O
S
24 TPICO 1 UNIDADE 1

6. O montador obtm o programa executvel.


7. Executa-se o programa e, se no houver erros, se obter a sada do pro-
grama.

Seguindo a anlise de Pinheiro (2012, p. 6), o compilador C realiza a compilao dos


programas-fonte em quatro etapas, como descritos a seguir:

Pr-processamento: nesta etapa o texto do programa transformado lexi-


camente. Ocorre a supresso de espaos desnecessrios, substituio de
macros e, em especial, a incluso de outros textos indicados pelas diretivas
de pr-processamento #include. O texto resultante chamado de unidade de
compilao.
Compilao: nesta etapa ocorre a anlise sinttica e semntica da unidade de
compilao. Caso no haja erros, gerado o cdigo assembler correspondente.
Montagem: nesta etapa ocorre a gerao do cdigo-objeto. Os comandos
assembler so transformados em linguagem de mquina, faltando, entretanto,
resolver as referncias a (endereos de|) objetos e funes implementadas
em outros cdigos-objetos, como, por exemplo, as referncias s funes das
bibliotecas do sistema.
Ligao: nesta etapa ocorrem a combinao de todos os cdigos-objetos que
compes o programa e a resoluo das referncias no resolvidas na etapa
anterior. O resultado um cdigo executvel.

O compilador possui como responsabilidade transformar os programas fontes em


L
I programas objetos e assim executar de forma compreensvel em uma linguagem mquina.
N
G
U
A
G
Os programas-fontes, em geral, so armazenados em arquivos cujo nome tem a extenso .c.
E
N
Os programas executveis possuem extenses que variam com o sistema operacional: no
S
Windows, tem extenso .exe; no Unix (Linux), em geral, no tem extenso.
D
E
Para exemplificar o ciclo de desenvolvimento de um programa simples, consideremos que
P
R o cdigo apresentado na seo anterior tenha sido salvo num arquivo com o nome prog.c.
O
G Devemos ento compilar o programa para gerarmos um executvel. Para ilustrar este processo,
R
A usaremos o compilador gcc. Na linha de comando do sistema operacional, fazemos:
M
A > gcc o prog prog.c

O
Se no houver erro de compilao no nosso cdigo, este comando gera o executvel com o
E
nome prog (prog.exe, no Windows). Podemos ento executar o programa:
E
S > prog
T
R Digite a temperatura em Celsius: 10
U
T A temperatura em Fahrenheit vale: 50.000000
U
R >
A

D
E Obs.: Em itlico est representado as mensagens do programa e, em negrito, exemplificamos
D um dado fornecido pelo usurio via teclado.
A
D FONTE: Celes e Rangel. 2002. Disponvel em: <http://www.ic.unicamp.br/~ra069320/PED/
O
S MC102/1s2008/Apostilas/Cap01.pdf>. Acesso em: 08 Set. 2014
UNIDADE 1 TPICO 1 25

Conforme site Thoth, a compilao traduz os programas escritos em linguagem de


alto nvel (por exemplo, a linguagem) para instrues interpretveis pelo processador (cdigo
mquina):

Gcc -g -c -o stack.o stack.c

-c apenas compilar no invocar o editor de ligaes (linker).


-I caminho de procura dos ficheiros de incluso, indicados pelas directivas #include.
-g incluir, juntamente com o cdigo gerado, informao para debugging.
-O otimizar o cdigo gerado.
-o para indicao do nome do ficheiro com o cdigo gerado.

UNI
Conhea o compilador GCC GNU Compiler Colletion em:
<http://www.debian.org/releases/stable/ia64/ch01s02.html.pt>
Passo a passo para compilar usando sistema operacional Linux
ou Windows, segue informaes: <https://linux.ime.usp.
br/~lucasmmg/livecd/documentacao/documentos/terminal/
Compilando_um_arquivo_em_C.html> L
I
<http://fig.if.usp.br/~esdobay/c/gcc.html> N
G
U
A
G
Vamos exemplificar de forma bem simples como executar uma compilao utilizando o E
N
sistema operacional Linux. Abra uma arquivo kwrite e insira o seguinte comando: S

D
1. Criar o cdigo-fonte abaixo e salv-lo com o nome de ola.c), se no colocar o 'c no ir E

funcionar: P
R
O
G
R
FIGURA 14 - COMPILANDO A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S

FONTE: A autora
26 TPICO 1 UNIDADE 1

2. Ir at o terminal, navegar (cd) at o diretrio-raiz, onde o arquivo-fonte foi salvo, e dar o


seguinte comando: gcc ola.c -o ola [ENTER]. Este segundo ola que aparece no comando,
o nome do programa executvel, que pode ser qualquer outro nome, mas no nosso caso
ser ola. Se o comando possuir qualquer erro, o mesmo ir aparecer na tela, se estiver
tudo correto com o comando, a tela abaixo ir aparecer:

FIGURA 15 - COMPILANDO

FONTE: Disponvel em: <http://www.academia.edu/4297165/Minitutorial_Compilando_e_rodando_


programas_C_no_GNU_Linux> acesso em: 08 set. 2014

3. Para confirmar se realmente o comando do programa foi compilado, navegue pelo diretrio-
L
I raiz do arquivo-fonte, verificando que foi criado o arquivo ola, com permisses diferentes das
N
G do ola.c:
U
A
G
E
FIGURA 16 - COMPILANDO
N
S

D
E

P
R
O
G
R
A
M
A

FONTE: Disponvel em: <http://www.academia.edu/4297165/Minitutorial_Compilando_e_rodando_


O
programas_C_no_GNU_Linux> acesso em: 08 set. 2014
E

E
S
4. Para executar o comando do programa, digite ./ola [ENTER]. Como resposta de sada do
T
R
programa a seguinte mensagem ir aparecer na tela: ola, nola, mundo!
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 1 27

FIGURA 17 - COMPILANDO

FONTE: Disponvel em: <http://www.academia.edu/4297165/Minitutorial_Compilando_e_rodando_


programas_C_no_GNU_Linux> acesso em: 08 set. 2014

FIGURA 18 - COMPILANDO

L
I
N
G
U
A
G
E
N
S

D
E

P
FONTE: A autora R
O
G
R
A
M
A


6 LINGUAGEM DE PROGRAMAO JAVA O

E
Conforme site JAVABR, o Java uma linguagem de programao e plataforma S
T
computacional lanada pela primeira vez pela Sun Microsystems em 1995. O Java rpido, R
U
seguro e confivel. De laptops a datacenters, consoles de games a supercomputadores T
cientficos, telefones celulares Internet, o Java est em todos os lugares! A programao Java U
R
possui como objetivo programar em alto nvel, onde seus comandos e cdigos de programas so A

compilados diretamente em uma mquina virtual, tornando o processo muito mais rpido e no D
E
consumindo, assim, memria e processamento de um computador. O grande diferencial desta
D
linguagem, alm de ser popularmente muito utilizada, sua aplicao web, pois possui como A
D
objetivo disponibilizar ambientes muito parecidos com o mundo real, por ser uma linguagem O
S
rpida e inteligente.
28 TPICO 1 UNIDADE 1

Conforme dados do site JavaBr, pode-se observar algumas facilidades e vrios


pontos positivos da utilizao desta linguagem, como seguem as descries:

A base da programao Java so as classe e seus objetos, que 'imita', o mundo real,
o que facilita bastante a programao. Por exemplo, os carros so uma classe, j um gol
um objeto da classe carro. As classes possuem mtodos e caractersticas que so comuns a
todos os objetos. Essa associao com o mundo real ajuda bastante na hora abstrao, de
criar aplicaes complexas.

O Java bastante flexvel, por conta da possibilidade de expanso atravs das bibliotecas,
ou APIs, alm das extenses do Java, voltada especificamente para desenvolvimento de
aplicaes para desktop, para celulares, para empresas, para udio, para grficos 3D, banco de
dados, para aplicaes de Internet, criptografia, computao/sistemas distribudos, linguagem
de marcao e vrias outras.
FONTE: Disponvel em: <http://www.java.com/pt_BR/download/faq/whatis_java.xml>. Acesso em: 08
Set. 2014

A linguagem Java considerada uma linguagem que possui segurana e portabilidade.

L
Segundo Horstmann (2008, p. 38), a linguagem possui vrios recursos de segurana que
I
N
garantem que nenhum applet nocivo possa ser executado no seu computador. Com este
G benefcio extra, esses recursos tambm ajudam a aprender a linguagem mais rapidamente.
U
A
G
E Outro fator muito interessante e importante da linguagem Java foi sua grande
N
S contribuio para impulsionar a forma como eram desenvolvidos os programas, possui uma
D especificidade de desenvolver seus cdigos orientados a objetos. Boraks (2013, p. 11) afirma
E
que o Java simplificou a programao geral na web, ela inovou com um tipo de programa de
P
R rede chamado applet que, na poca, mudou a maneira do mundo on-line pensar em contedo.
O
G
R
A
M
A 6.1 EXEMPLOS DE CDIGOS

E FIGURA 19 - PRIMEIRO PROGRAMA EM JAVA


S
T /*
R * O primeiro programa em Java: Hello World
U
T * Autor: Jacques Sauv
U
R
*/
A // Todo programa tem um ponto de entrada: o "mtodo" main de alguma "classe"

D public class Hello {


E public static void main(String[] args) {
D System.out.println("Hello, world!");
A }
D
O }
S
FONTE: Feij; Silva e Clua (2010)
UNIDADE 1 TPICO 1 29

6.2 APPLETS JAVA

Os applets possuem a caracterstica de possibilitar e desenvolver programas dentro de


pginas em HTML, tornam as pginas da web muito mais intuitivas, pois disponibilizam formas
animadas, dinmicas e interativas para a web. Conforme Boraks (2013, p. 11), um applet um
tipo especial de programa Java que projeto para ser transmitido pela internet e executado
automaticamente por um navegador web compatvel com o Java. Basicamente, os applets
permitem que uma funcionalidade seja movida do servidor para o cliente. Schutzer e Massago
(2010, p. 16), afirmam que:

(...) applets so pequenos programas Java que podem ser inseridos dentro de
uma pgina HTML. Com este recurso, uma pgina torna-se dinmica, podendo
interagir com o usurio que a consulte. Um applet pode ainda executar tarefas
complexas, como realizar clculos e apresentar grficos, sons e imagens em
movimento.

Schutzer e Massago (2010), apresentam uma insero de applet em uma pgina HTML,
como exemplo, usando a diretiva <applet>, a qual deve apresentar pelo menos trs parmetros:
code, width e height, veja a seguir o exemplo: L
I
N
G
U
A
<applet G
E
code = [java applet] N
S
width = [largura]
D
height = [altura]> E

P
R
O
G
R
A
M
6.3 SEGURANA A


O

Um fator muito importante para a linguagem de programao Java a segurana E

que fica a cargo do applet, no permitindo que programas no confiveis e no autorizados E


S
acessem arquivos de computador. Ainda segundo Boraks (2013, p. 11), para o Java permitir T
R
que o applet fosse baixado e executado com segurana no computador cliente, era necessrio U
T
impedir que ele iniciasse esse tipo de ataque, no permitindo que sejam acessadas outras U
R
partes do computador. A

D
E
Outro fator observado por Horstmann (2008), com relao segurana na utilizao da
D
linguagem Java, onde a mquina virtual pode capturar muitos erros de iniciantes e inform-los A
D
de uma maneira precisa. O
S
30 TPICO 1 UNIDADE 1

6.4 PORTABILIDADE

Uma caracterstica muito positiva da linguagem de programao Java sua portabilidade


de ser utilizada em qualquer tipo de equipamento tecnolgico, seja ele um equipamento
mvel ou equipamento esttico fisicamente, suas funcionalidades vo alm do uso de apenas
um computador, mas podem ser vistos em vrios tecnologias, como computadores, laptop,
tablets e smartphones. O fator de portabilidade um aspecto muito importante da internet e
dos equipamentos, porque h muitos tipos de computadores e muitos tipos de sistemas, a
portabilidade permite que o mesmo cdigo funcione em vrios computadores.

Boraks (2013, p. 12) afirma que, algum meio de gerar cdigo executvel e portvel era
necessrio. Felizmente, o mesmo mecanismo que ajuda a manter a segurana dos sistemas
e computadores, permite tambm auxiliar a gerar portabilidade, neste caso estamos falando
do applet. Segundo Horstmann (2008, p. 38),

a portabilidade tambm um requisito para applets. Quando voc visita uma


pgina web, o servidor web que disponibiliza o contedo da pgina no faz
L
I ideia do computador que voc est utilizando para navegar pela web. Ele
N simplesmente retorna o cdigo portvel que foi gerado pelo compilador Java.
G A mquina virtual no seu compilador quem executa esse cdigo portvel que
U
A foi gerado pelo compilador Java.
G
E
N
S Sua portabilidade fazer com que haja comunicao entre vrios equipamentos
D tecnolgicos, e que consigam se comunicar de forma segura, gerando assim um ponto muito
E
positivo em termos de portabilidade e de segurana para a linguagem Java.
P
R
O
G
R
A
M
A 6.5 J2ME

O
Pode-se afirmar que a plataforma Java 2 Micro Edition J2ME revolucionou a
E
comunicao entre os equipamentos mveis, tornando o processo de comunicao muito mais
E
S eficaz, como tambm permite, tanto equipamentos, quanto sistemas e aplicativos de empresas
T
R diferentes consigam realizar a comunicao entre si. Segundo Mattos (2005), a plataforma Java
U
T 2 Micro Edition J2ME destinada a dispositivos com recursos limitados de memria, vdeos
U
R e processamento, possui como objetivo fazer com que qualquer produto possa interagir com
A
recursos de maneira nica e simplificada.
D
E

D Somera (2006, p. 6), diz que J2ME um conjunto de tecnologias e especificaes


A
D destinadas ao consumidor, com dispositivos como telefones mveis, PDAs e impressoras,
O
S sendo estas com sistemas Mobile ou que utilizam sistemas Wireless. Mattos (2005, p. 18),
UNIDADE 1 TPICO 1 31

afirma ainda que cada dispositivo executa internamente uma mquina virtual Java desenvolvida
por seu fabricante, e os aplicativos em Java de terceiros interagem apenas com a mquina
virtual e no com o dispositivo real. Fiorese (2005), classifica a plataforma J2ME, onde sua
implementao linguagem de programao Java, como qualquer outra linguagem, composta
por um grupo de comandos predefinidos que, aps escritos e compilados podem ser executados
resultando em aes especficas.

Resumidamente uma tecnologia de programao em Java que permite sua


aplicabilidade em equipamentos mveis, como celulares, laptop e outros dispositivos que
tenham como objetivo a navegao de dados e informaes pela internet, nas pginas web.

7 EXEMPLO DE CDIGO EM JAVA

A linguagem de programao Java possui vrios fatores que a classificam como positivo,
como, por exemplo, a sua portabilidade que significa a facilidade de realizar a comunicao
entre equipamentos, sistemas e aplicativos de empresas diferentes. Outro fator positivo sua L
segurana que garante que a comunicao seja eficiente entre esses vrios equipamentos I
N
e sistemas, conseguindo proteger os equipamentos de invases que possam prejudicar e G
U
danificar os sistemas e mquinas. Sua estrutura de cdigo pode ser considerada como uma A
G
grande vantagem para o desenvolvimento e programao, pois sua estrutura e linguagem E
N
bsica facilitam, assim, a escrita dos cdigos de forma mais simplificada. S

D
E
A seguir vamos conhecer a estrutura de cdigo em Java, alguns exemplos de comandos
P
que so utilizados na programao Java, conforme diretrizes do autor Gacho (2014): R
O
G
R
A
1. // Duas barras significam comentrio M
2. /* comentrios tambm podem seguir o formato de C++ */ A

3.
O
4. public class NomeDoPrograma
5. { E
6. // O mtodo main sempre deve estar presente para que um cdigo E
7. // Java possa ser executado: S
T
8. static public void main(String[] args) R
U
9. { T
10. // aqui viro os comandos, que so parecidos com C++ U
R
11. } A
12. }
D
E

D
A
D
O
S
32 TPICO 1 UNIDADE 1

Conforme Gacho (2014, p. 27), podemos analisar os comandos cima da seguinte


forma:

Linhas 1 e 2: representam comentrios, pode ser uma informao, comporta-


mento do programa, do autor, ou da verso do programa.
Linha 3: est em branco, pois Java permite linhas em branco entre os coman-
dos.
Linha 4: a declarao do "nome do programa", que case-sensitive (existe
diferena entre maisculas e minsculas). O arquivo deve ser salvo com o
mesmo nome que aparece aps a declarao public class e mais a extenso
.java, deve ser salvo: NomeDoPrograma.java.
Linha 5 e 9: a abertura de chave { indica incio de bloco.
Linha 8: essa linha deve aparecer em todos os cdigos Java. Quando um
programa Java executado, o interpretador da JVM executa os comandos que
estiverem dentro do bloco indicado pelo mtodo "static public void main(String)".
Linha 10: aqui seria escrito o cdigo propriamente dito. Instrues como for-
-next e print.
Linha 11 e 12: o fechamento da chave } indica incio do bloco.

8 COMPILAO DE PROGRAMAS EM JAVA

L
I
N Vamos analisar os comandos bsicos de Java para a aplicao a seguir, relacionando
G
U novamente o exemplo do comando ola mundo e vamos compilar este exemplo:
A
G
E FIGURA 20 - COMPILAO JAVA
N
S

D
E

P
R
O
G
R
A
M
A

E FONTE: Disponvel em: <http://www.milfont.org/blog/wp-content/upload/Manual.pdf> Acesso em: 10


set. 2014
E
S
T Acadmico, vamos apresentar agora como rodar o comando do programa acima,
R
U conforme exemplo do autor Gacho (2014):
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 1 33

1. Salve o cdigo acima em um arquivo nomeado: AloMundo.Java (no esquea o case-


sensitive);
2. Digite no console:
a. C:\fic>javac AloMundo.java
3. Caso no ocorra nenhuma mensagem de erro, digite:
a. C:\fic>java AloMundo

FONTE: Disponvel em: <http://www.milfont.org/blog/wp-content/upload/Manual.pdf> Acesso em: 10


set. 2014

Analisando o cdigo acima referente compilao do programa:

As primeiras 5 linhas representam um bloco de comentrio, que tem por objetivo


identificar a funo do programa, seu autor, verso etc.

A linha seguinte (public class AloMundo) declara uma classe chamada AloMundo.
Aps compilado, esse cdigo gerar um arquivo AloMundo.class no mesmo diretrio em
que se encontra o cdigo-fonte.
L
I
N
G
Algumas dicas em relao linguagem, os cdigos e seus comandos Java: U
A
G
Lembrando que um cdigo-fonte em Java pode descrever mais de uma classe. E
N
Aps a compilao do comando, cada descrio de classe gerar um arquivo .class de S

forma separada. D
E
Lembre-se, pode haver no mximo uma classe public dentro de cada cdigo-fonte Java.
P
Caso voc, inadvertidamente, declare mais de uma classe como public dentro de um R
O
cdigo-fonte Java, ocorrer um erro de compilao e este erro ser apresentado na tela. G
R
Todo o corpo da classe (o cdigo que define a classe) deve ser delimitado por chaves, A
M
assim como toda a estrutura de dados. A

FONTE: Adaptado de: <http://www.milfont.org/blog/wp-content/upload/Manual.pdf> Acesso em: 10
set. 2014 O

E
S
T
R
U
9 CICLO DE DESENVOLVIMENTO T
U
R
A
O ciclo de desenvolvimento de um sistema em Java segue basicamente uma metodologia
D
imposta para o desenvolvimento de softwares em outras linguagens, onde todas elas precisam E

passar pelo caminho da identificao de uma necessidade do usurio, precisa modelar o D


A
sistema, isso quer dizer, desenhar o sistema conforme as necessidades do usurio e por fim D
O
S
34 TPICO 1 UNIDADE 1

precisa codificar o sistema. Codificar, necessariamente, definir o cdigo de linguagem que


ser utilizado para a programao e desenvolvimento do sistema.

A seguir ser apresentado um exemplo de ciclo de desenvolvimento de um sistema.

FIGURA 21 - CICLO DE DESENVOLVIMENTO DE UM SISTEMA

FONTE: Vega (2004)


L
I
N
G
Segundo Akita (2006, p. 398), todo desenvolvimento, ou mesmo correes, devem
U
A
necessariamente, seguir o mesmo ciclo: codificar em ambiente de desenvolvimento, versionar,
G
E
instalar em ambiente de testes, realizar todos os Casos de Teste.
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 1 35

RESUMO DO TPICO 1

Nesse tpico, voc viu:

Deve-se observar que tanto a linguagem de programao em C quanto Java, so linguagens


de programao de alto nvel. A linguagem C possui como caracterstica executar as funes
de forma repetitiva, no entanto executa de forma rpida e eficiente, isso torna o processo
de compilao muito rpido.

Um fator muito importante para a linguagem C a interpretao que possui a funo de


executar a cdigo-fonte, traduzir o programa para que seja interpretado pela linguagem
mquina (linguagem de computador).

A atribuio na linguagem C possui como responsabilidade atribuir, processar e executar


um dado varivel.
L
I
N
A linguagem de programao JAVA possui como caracterstica ser rpida para sua execuo, G
U
confivel, segura e possui portabilidade para a comunicao entre vrios equipamentos e A
G
sistemas de vrios fabricantes diferentes. Seu principal ponto positivo sua aplicabilidade E
N
para uso na internet e desenvolvimento de dispositivos mveis e aplicativos web. S

D
E
A compilao tanto na linguagem C, quanto na linguagem Java, possui o mesmo objetivo,
P
que executar os cdigos em uma linguagem de fcil entendimento para o computador. R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
36 TPICO 1 UNIDADE 1


IDADE
ATIV
AUTO

1 Simplificando, a compilao um processo em que o programa compila o recebimento


de entrada de um cdigo-fonte, produzindo uma sada do mesmo programa,
porm escrito em outra linguagem. Esse processo ocorre para que o cdigo
seja compreendido pelo computador que recebe este cdigo-fonte. Conforme as
caractersticas da compilao em linguagem C correto afirmar:

a) ( ) Mtodo chamado de implementao, baseada em compilao.


b) ( ) Processo de decodificao, resultando de um algoritmo funo.
c) ( ) Portabilidade de sistemas, execuo de comandos e dados mveis.
d) ( ) Execuo de ciclo de vida, o cdigo-executvel possui incio e fim.

2 A portabilidade da linguagem Java uma caracterstica muito positiva, possibilitando


L
I que qualquer tipo de equipamento tecnolgico consiga conversar um com os outros,
N
G permitindo desta forma uma evoluo para a rea de tecnologia web. Esse processo
U
A
de portabilidade ocorre atravs do:
G
E
N
S
a) ( ) Compilador Java.

D
b) ( ) Cdigo de mquina.
E c) ( ) Servidor de dados.
P d)
( ) Atribuio de cdigo.
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1

TPICO 2

FUNES

1 INTRODUO

A estrutura de dados composta por muitas funcionalidades e caractersticas, as quais


tm como objetivo auxiliar a linguagem de programao e aos programadores, tornando os
programas mais estruturados. Partindo dessa anlise podemos falar de um elemento muito
L
importante para as estruturas de dados que so as Funes, estas possuem como finalidade I
N
realizar o processo de chamada de uma referncia, de um valor. O valor de uma funo fica G
U
armazenado em uma varivel. A funo considerada um executor de funes, com isso divide A
G
as grandes tarefas em subtarefas, para que uma funo no se repita em uma chamada a E
N
mesma transformada em uma nova funo e que poder ser chamada de forma repetida. S

D
A pilha de execuo est classificada como estrutura de dados, esta possui como objetivo E

estruturar a linguagem de programao, o procedimento para que essa estrutura acontea P


R
disponibiliza confiana, pois todo o processo de incluso de elementos, funes e cdigos O
G
precisam necessariamente passar pelo topo da pilha. Possui como funcionalidade especfica R
A
utilizar as funes Last In, First Out. M
A


Os ponteiros de variveis tambm fazem parte da estrutura de dados, sendo estas que O

cumprem um papel muito importante dentro dessa estrutura, pois os ponteiros possuem como E

responsabilidade armazenar espao na memria do programa para elementos e valores. Este E


S
procedimento de armazenar espao na memria ocorre aps ser declarada uma varivel, aps T
R
essa declarao da varivel a memria armazena o tamanho e o espao que essa varivel vai U
T
ocupar dentro do programa. U
R
A

A recursividade um elemento que tem a funo, dentro da estrutura de dados, de D


E
executar a chamada da mesma funo, esta pode ser tanto uma recursividade direta, quanto
D
uma recursividade indireta. A
D
O
S
38 TPICO 2 UNIDADE 1

2 FUNES

As funes so procedimentos em uma linguagem de programao no recebimento


dos blocos de cdigos, as funes possuem como responsabilidade apresentar algum valor
sobre a ao solicitada. Precisamente, a funo deve retornar sempre um valor para o
comando solicitado no programa, esse processo pode ser chamado de passagem de valor
ou de referncia. Na passagem de valor, o valor atribudo fica contido em um argumento ou
copiado para uma varivel de parmetro formal. Na passagem por referncia ocorre o processo
da chamada da mesma funo onde apontada para mesma posio na memria. Outra
caracterstica da funo, que pode ser considerado como um subprograma, e assim agindo
sobre os dados e posteriormente retornar para o programa principal, um nico valor.

Esse processo de ser atribudo funo um subprograma se deve diviso que ocorre
de grandes tarefas que so divididas em tarefas menores, realiza o processamento de sub-rotina
e retorna para o programa principal outra informao, outro valor. Esse procedimento de dividir
as tarefas maiores em tarefas menores proporciona outra vantagem para a funo, isso evita
L
I que os cdigos sejam repetidos, e que o procedimento solicitado se transforme em uma funo
N
G e esta possa ser chamada por diversas vezes. A funo realiza o trabalho de agrupar conjuntos
U
A de comandos da linguagem de programao, esse processo disponibiliza uma resposta muito
G
E mais rpida, pois os parmetros ficam armazenados e podem ser chamados e consultados
N
S diversas vezes. A funo possui a responsabilidade de agilizar as chamadas, organizar os
D parmetros, realizando desta forma uma economia do cdigo-fonte de um programa.
E

P
R
Como descrito anteriormente uma funo considerada subprograma, esta precisa
O
G
receber um valor numrico, realizar o clculo e por fim retornar com um valor nico deste
R
A
comando. So encontrados dois tipos de funes, a de biblioteca e de usurio. A funo de
M
A
biblioteca so funes j existentes, estipuladas, escritas pelo fabricante do compilador, as
funes j esto pr-compiladas, j esto escritas em cdigo mquina. A funo de usurio

O so funes escritas pelos prprios programadores de um sistema.


E

E Outras caractersticas da funo que a mesma possui recursividade, isso ocorre


S
T quando a funo invoca-se a si mesma, esse procedimento realiza economia de espao na
R
U memria do computador, estes so mais compactos e seus demais dados e parmetros tambm
T
U so recursivos.
R
A

D Mendes (2011, p. 114), coloca que a funo recursiva so funes que obtm um
E
resultado atravs de vrias chamadas prpria funo. Entretanto, as chamadas recursivas
D
A devem ser limitadas para evitar o uso excessivo de memria. Nesse sentido, deve-se estar
D
O atento para que a funo verifique a condio de trmino de uma recurso.
S
UNIDADE 1 TPICO 2 39

A seguir um exemplo de comando Recursivo:

FIGURA 22 - FUNO RECURSIVA

FONTE: Braz (2014)

A funo possui formas de passagem de argumentos, estes so definidos como


mecanismos que permitem a transmisso de dados para uma funo e so divididos
em: argumentos pretendidos e argumentos de procedimento. O argumento possui como
funcionalidade receber a chamada e tornar genrico esses dados recebidos para o uso
L
adequado da funo, essas passagens de argumentos podem ser identificadas de duas formas, I
N
sendo a Passagem de Valor e a Passagem de Referncia. G
U
A
G
Na passagem por valor em uma chamada de funo realizado o processo de pegar o E
N
valor desse dado que est contido em um argumento ou parmetro real, realizar a transmisso S
para a varivel do parmetro formal. J na passagem por referncia, o processo ocorre em uma D
E
chamada da funo, de um parmetro real, formal para apontar a mesma posio da memria.
P
R
O
G
R
A
M
A
2.1 FUNES EM JAVA

O

As funes so classificadas como rotinas e sub-rotinas automatizadas, isso define o E

processo de reutilizao de cdigo, pois se existe a necessidade de utilizar uma codificao j E


S
existente, apenas precisa ser chamada a funo. As funes podem ser utilizadas sempre que T
R
existir a necessidade de utilizar um cdigo especfico, apenas precisa ser criada ou utilizada a U
T
mesma funo. Outra caracterstica de funes que elas so muito teis para a codificao U
R
de um sistema, so adaptveis a vrios tipos de mtodos. A

D
E

D
A
D
O
S
40 TPICO 2 UNIDADE 1

2.1.1 Criando funes sem Argumentos

Um ponto a ser observado que uma funo esttica, pode ser sempre reutilizada,
pode ser citada, como exemplo, a funo mais bsica utilizada para executar uma rotina,
conhecida como funo main, esse comando utilizando em um cdigo, dentro de uma classe.

A seguir vamos apresentar um exemplo de uma funo sem argumento, de acordo


com Xavier (2010):

01. public class ExemploFuncao {


02. //criando a funo
03. public static void mostrarMensagem() {
04. System.out.println("Minha Mensagem");
05. }
06.
07. public static void main(String[] args) {
08. //chamando a funo dentro do programa
09. mostrarMensagem();
L 10. }
I 11. }
N
G
U
A
G
E
N
S

D 2.1.2 Criando funes com Argumentos


E

P
R
O
As funes com argumentos tambm so funes estticas, podem ser reutilizadas, no
G
R
entanto ela se difere por possuir apenas as informaes necessrias para que a funo consiga
A executar o processo com argumentos, estas ficam descritas dentro de parnteses. Levando em
M
A conta um fator muito importante nesta funo que a funo com argumento pode ter entre

um e at vrios argumentos, desde que estes sejam separados por vrgulas. Outro fator que
O
deve ser observado neste caso que cada argumento deve ter seu tipo declarado, conforme
E
seguem os exemplos abaixo, de acordo com o autor Xavier (2010, p. 35):
E
S
T
R public static void funcao1 (String arg1) {}
U
T public static void funcao2 (int arg1, int arg2) {}
U
R public static void funcao3 (String arg1, char arg2, int arg3, float arg4, Object arg5) {}
A

D
E A seguir ser apresentado um exemplo desta funo de resultado fatorial, ser aplicada
D uma funo de 1 a 10, resultando em um nmero no fator final.
A
D
O
S
UNIDADE 1 TPICO 2 41

01. public class FatorialComFuncao {


02. public static void fatorar(int numero) {
03. int fator = 1;
04. for (int i = numero; i > 1; i--) {
05. fator *= i;
06. }
07. System.out.println(numero + "! = " + fator);
08. }
09.
10. public static void main(String args[]) {
11. for (int x=1; x<=10; x++)
12. fatorar (x);
13. }
14. }

FONTE: Xavier (2010)

2.1.3 Criando Funes sem Retorno

Vamos utilizar para criar funes o JavaScript, neste caso utilizada a palavra-chave
L
Function, aps esse procedimento precisa ser dado um nome para esta funo. Vamos I
N
apresentar o exemplo da Function a seguir, conforme autor Xavier (2010, p. 35): G
U
A
G
function nomeDaFuncao ( parmetros ) { cdigo da funo } E
N
S

Vamos analisar a seguir outro exemplo do autor Xavier (2010), em relao D


E
funo sem retorno, o comando apresenta um script que pode ser utilizado diversas
P
vezes durante a execuo do cdigo: R
O
G
R
Por exemplo, a funo ir mostrar na tela a mensagem Bem-vindo ao JavaScript. A
M
A
1. <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
2. function ola () {
3. document.write ("Bem vindo ao JavaScript<br>"); O
4. } E
5. </SCRIPT>
E
FONTE: Xavier (2010) S
T
R
U
T
U
R
A

2.1.4 Criando Funes com Retorno D


E

D
A
O principal cargo de funes com retorno desenvolver um resultado para um D
O
determinado script, onde a soluo da soma gerada e utilizada para desenvolver este resultado S
42 TPICO 2 UNIDADE 1

para o script de um programa.

A seguir vamos analisar um exemplo do autor Xavier (2010), em relao funes com
retorno, usando a funo return:

1. <SCRIPT LANGUAGE = "JavaScript" TYPE = "text/javascript" >


2. function somar () {
3. return 5+5;
4. }
5.
6. document . write ( "A soma de 5 + 5 " + somar () );
7. </SCRIPT>

2.2 UTILIZANDO FUNES DE PRIMEIRA CLASSE

A utilizao de JavaScript nas funes de primeira classe so classificadas como objetos


que so compostos por propriedades e mtodos, podem ser utilizadas para atribuir funes
L
I em variveis e at mesmo retornar as solicitaes como um outro objeto.
N
G
U
A
G
E
N
S
2.2.1 Funes Internas
D
E

P So definidas como funes que pertencem internamente a outras funes, possuem


R
O como finalidade serem criadas em cada situao em que uma funo externa invocada. Outra
G
R caracterstica que ela pode ser criada a partir de funes externas, em que as constantes,
A
M as variveis e os valores dos argumentos so transformados em uma funo interna.
A

E
S 2.2.2 Usando pginas Web em JavaScript
T
R
U
T Uma das principais funes de JavaScript escrever funes para que sejam includas
U
R em pginas web, desenvolvidas em linguagem HTML, onde podem interagir diretamente com
A
Modelo de Objeto de Documento. O JavaScript torna a execuo das aes muito mais rpidas,
D
E pois realizam a execuo do cdigo diretamente no navegador do usurio, outra vantagem
D detectar de forma autnoma as aes e solicitaes do usurio.
A
D
O
S
UNIDADE 1 TPICO 2 43

3 DEFINIO DE FUNES

As funes so definidas por desempenhar o papel de dividir as grandes tarefas em


vrias outras sub-tarefas, auxiliando de forma significativa os programas, tornando-os ainda
mais rpidos em seus comando e execues. Outra funcionalidade das funes fazer com
que os cdigos no sejam repetidos, quando ocorre de um cdigo se repetir o mesmo ser
transformado em uma nova funo no programa, e est poder ser chamada por diversas
vezes. Mendes (2011, p. 108), afirma que:

A funo agrupa instrues em uma unidade (ou entidades) e lhe atribui um


nome. Cabe destacar que essa unidade pode ser chamada de outras partes do
programa. Alm disso, qualquer sequncia de instrues que aparea em um
programa mais de uma vez candidata para se tornar uma funo. Fazendo
isso, voc consegue tambm reduzir o tamanho do programa.

A funo deve ser utilizada sempre que seja necessrio obter um nico valor. Esse uso
corresponde noo matemtica de funo. Consequentemente, muito estranho que uma
funo realize uma tarefa diferente de desenvolver um valor, e no deve faz-lo. (AGUILAR
L
2011, p. 268). I
N
G
U
A
G
E
N
S
4 PILHA DE EXECUO
D
E

Pilhas so classificadas como uma estrutura de dados, muitas vezes utilizada para P
R
realizar a implementao de sua estrutura na linguagem de programao, uma estrutura muito O
G
utilizada, pois permite que todo acesso que realizado em um programa ou ao em cdigo R
A
precisa passar pelo topo da estrutura de dados. A pilha segue uma lgica de programao, M
A
onde cada cdigo ou um novo elemento includo em uma pilha, este passa a ser pertencente

da estrutura de dados do topo, outra caracterstica muito positiva para a programao que O

nesta estrutura, apenas o topo pode ser excludo. Nesse sentido, seguindo os princpios e E

funcionalidades da pilha, quer dizer que os elementos da estrutura de dados so retirados em E


S
ordem inversa, indicando que o primeiro elemento a sair o ltimo que entrou, este procedimento T
R
conhecido como Last In, First Out. U
T
U
R
Edelweiss e Galante (2009, p. 126), colocam a definio de pilhas, sendo listas nas A
quais o acesso somente pode ser feito em uma das extremidades, denominada topo da pilha. D
E
Todas as consultas, alteraes, incluses e remoes de nodos somente podem ser realizadas
D
sobre um nodo, que aquele que est na extremidade considerada o topo da pilha. A
D
O
S
44 TPICO 2 UNIDADE 1

A estrutura da pilha composta por duas operaes bsicas, isso quer dizer que para
realizar o empilhamento de uma estrutura de pilha precisa realizar uma operao para empilhar
um novo elemento e a segunda operao bsica desempilhar um elemento. Na operao de
empilhamento de um novo elemento, o processo ocorre quando so inseridos os elementos
no topo do empilhamento. Na operao de desempilhar um elemento, pega-se o elemento e
remove-o do empilhamento.

Segundo os autores Edelweiss e Galante (2009, p. 127), as pilhas so estruturas de


dados fundamentais, sendo utilizadas em muitas aplicaes em computao. Como, por
exemplo, os navegadores de internet armazenam os endereos mais recentemente visitados
em uma estrutura de dados do tipo pilha. Cada vez que o navegador visita um novo site, o
endereo armazenado na pilha de endereos. Utilizando a operao de retorno (back), o
navegador permite que o usurio retorne ao ltimo site visitado, retirando seu endereo da
operao pilha.

FIGURA 23 - EXEMPLO DE EMPILHAR E DESEMPILHAR

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M FONTE: Farias (2009)
A

O Pode ser percebido na figura acima, como ocorre o processo de empilhamento, na


E primeira pilha includo o elemento 10, este fica como sendo o ltimo a ser includo, na
E segunda pilha, includo o elemento 5, este agora passa a ser o ltimo elemento a ser includo
S
T na pilha, na terceira pilha pode ser percebida a incluso do elemento 15, este passa ento a
R
U ser o ltimo elemento a ser includo na pilha, por isso, se perceber na ltima coluna, chamada
T
U de desempilhar, o nmero 15 foi excludo da pilha, por ser o ltimo elemento a ser includo no
R
A topo da pilha.
D
E
Horowitz e Sahni (1987, p. 77), apresentam a definio de pilha, como Stack Pilha
D
A
uma lista ordenada na qual todas as inseres e retiradas so feitas numa extremidade,
D
O
S
UNIDADE 1 TPICO 2 45

chamada topo. Como j mencionado, este processo conhecido como elementos que so
retirados do topo da pilha, isso quer dizer que sempre o ltimo elemento a entrar na pilha ser
o primeiro elemento a ser retirado do topo da pilha.

A partir dessa premissa, em que mesmo sendo o ltimo elemento inserido na pilha,
ser o primeiro a ser removido, este termo conhecido como LIFO (Last In, First Out). A lista
LIFO considerada uma estrutura dinmica, denominada uma coleo que pode aumentar e
diminuir durante sua existncia. Esta denominao de LIFO vem justamente por serem listas
que crescem e diminuem. Ainda, segundo Pereira (1996, p. 18):

Uma pilha pode suportar at trs operaes bsicas, essas operaes bsicas
so conhecidas como:
TOP: Acessa o elemento que est posicionado no topo da pilha.
PUSH: Este possui como funo inserir um novo elemento no topo da pilha.
POP: Este remove um elemento que est no topo da pilha.

FIGURA 24 - EXEMPLO DE PILHA

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O
FONTE: Jprofessor (2014) E

E
Analisando a figura acima podemos perceber que Top est indicando os elementos que S
T
esto no topo da pilha, por outro lado a funo Push est inserindo os elementos na pilha, e a R
U
funo Pop exclui os elementos da pilha, como podem ser vistos nas pilhas inferiores da figura, T
U
isso pode ser percebido nas trs pilhas em que um elemento foi excludo. R
A

D
E

D
A
D
O
S
46 TPICO 2 UNIDADE 1

4.1 CRIANDO UMA PILHA

Quando existe a necessidade de criar uma nova pilha muitos procedimentos devem
ser levados em considerao e alguns cuidados precisam ser observados. Quando se cria
uma nova pilha a mesma aparecer vazia, deve ser informado que a pilha est vazia. Esses
procedimentos precisam ser considerados para que a pilha tenha sua utilidade e seja utilizada
pelos elementos que a completam. Edelweiss e Galante (2009, p. 129), apresentam o seguinte
raciocnio em relao criao da pilha.

A estratgia indicar que a pilha est vazia, este procedimento feito quando
o ndice do topo da pilha estiver indicando uma unidade a menos do que o
ndice de sua base. Outra estratgia os algoritmos que manipulam as pilhas
(insero, remoo e consulta) utilizam esta estratgia para reconhecer que
a pilha est vazia.

L
I 4.2 INSERO DE UM NODO NA PILHA
N
G
U
A A insero de um nodo na pilha s pode ocorrer se houver espao na pilha, isso pode
G
E ser verificado pelo valor que limita o espao da pilha. Esse procedimento de insero de um
N
S nodo na pilha segue a lgica da pilha, onde esse nodo ser inserido no topo, essa funo
D conhecida tambm pela funo Push. Segundo Edelweiss e Galante (2009, p. 130), caso a
E
insero seja realizada, o valor do topo da pilha incrementado, sendo este agora o nodo do
P
R topo, consequentemente, o nico ao qual se tem acesso. Para verificar se existe espao na
O
G pilha, e a insero ocorra no nodo, precisa ser inserido o valor da posio que o nodo assumir,
R
A se no existir mais espao na pilha a funo sucesso apresenta falso a insero do nodo.
M
A

Vamos analisar a seguir um exemplo de um algoritmo sobre a insero de um novo


O
nodo em um arranjo de pilha.
E

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 2 47

FIGURA 25 - INSERO DE NODO NA PILHA

FONTE: A autora

Para realizar a remoo de um nodo da pilha necessrio que este esteja no topo
da pilha, esta operao reconhecida como Pop, essa remoo pode acontecer se a pilha
apresentar pelo menos um nodo, esse procedimento faz com que o valor da pilha diminua,
considerando que podem a partir desse ponto, incluir novos elementos na pilha, sem espao no
L
possvel incluir, por isso a funo de remoo do nodo. Abaixo vamos analisar um exemplo I
N
de um algoritmo Remoo de um Nodo da Pilha: G
U
A
G
FIGURA 26 - REMOO DE NODO NA PILHA E
N
S

D
E

P
R
O
G
R
A
M
A


O

FONTE: A autora E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
48 TPICO 2 UNIDADE 1

4.3 ACESSO PILHA

O acesso ao nodo de uma pilha pode ser feito apenas com o nodo que est no topo
da pilha, se existir a necessidade de acessar outros nodos da pilha, precisa ser removido os
nodos que esto antes do nodo a ser acessado, iniciando a remoo sempre pelo topo da pilha.

4.4 CRIAO DE PILHA ENCADEADA

O processo de encadeamento de uma pilha exige que os nodos estejam divididos em


dois processos, como no campo denominado Info, nesse campo so armazenadas todas as
informaes inerentes ao nodo. O outro campo dividido chamado Elo, neste campo so
realizados os encadeamentos de todos os nodos da pilha. Para que uma pilha seja encadeada
realizada a atribuio de um valor nulo para a varivel ponteiro, e esta varivel ir armazenar este

L
valor no topo da pilha, isso se a pilha estiver com espao livre para guardar este encadeamento.
I
N
G J no processo de inserir um nodo em uma pilha encadeada, o processo ocorre seguindo
U
A a lgica da pilha, em que os elementos so includos no topo dela, nesse sentido o novo nodo
G
E deve ser encadeado com o elemento que estiver no topo da pilha, passando este nodo a ser
N
S o novo topo. Vamos analisar a seguir um exemplo de como executar a insero de um nodo
D em uma pilha encadeada:
E

P
R
O FIGURA 27 - INSERIR NODO EM UMA PILHA
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A FONTE: A autora
D
O
S
UNIDADE 1 TPICO 2 49

A remoo de um nodo em uma pilha encadeada ocorre em um processo que a varivel


ponteiro aponta para o nodo que est no topo da pilha, removendo-a e, assim, liberando espao
para a incluso de novos elementos no topo. O processo de acesso a uma pilha encadeada se
torna muito mais fcil e de forma lgica, pois como a varivel ponteiro j possui armazenado o
endereo do nodo no topo da pilha, o acesso indicado pela varivel ponteiro, essa indicao
apresenta o nico nodo da pilha que pode ser tanto acessado, quanto alterado.

5 PONTEIRO DE VARIVEIS

Pode-se dizer que para cada tipo de memria, existe um tipo de ponteiro, pois este
possui como caracterstica armazenar endereos de memria, isso em situaes de existncia
de valores que sejam correspondentes com os valores dos ponteiros. Um exemplo de valores
a declarao varivel como: int a, ao realizar o processo de declarar a varivel, com o nome
de a, estamos dizendo que esta varivel pode conter nmeros inteiros, essa declarao
permite que automaticamente seja reservado um espao na memria para valores inteiros.
Com a declarao da varivel j apontada e armazenado seu valor em um espao na memria L
desenvolve-se um ponteiro, necessitando apenas direcionar este ponteiro para a varivel criada. I
N
Segundo Martin (2014, p. 277), os ponteiros permitem que sejam representadas estruturaras G
U
de dados complexas, permite a alterao de valores passados como argumentos para funes A
G
e mtodos. E
N
S

Os ponteiros possuem como objetivo otimizar a utilizao das funcionalidades de um D


E
programa a ser desenvolvido, como tambm garantir a segurana dos dados e uma forma
P
dinmica de organizao dos dados desse programa. Um exemplo do funcionamento do ponteiro R
O
: qualquer dado inserido e executado por um programa ser armazenado na memria, vamos G
R
citar o acesso pela primeira vez em um sistema de e-mail, aps inserir o login e a senha e A
M
este processo for executado, esses dados sero armazenados automaticamente na memria. A


O
Feofiloff (2009, p. 148), define ponteiros sendo este um tipo especial de varivel
E
destinado a armazenar endereos. Todo ponteiro pode ter um valor Null, que um endereo
E
invlido. S
T
R
U
Sebesta (2010, p. 314), T
U
R
Apresenta as operaes de ponteiros como linguagens que fornecem um tipo A
ponteiro, normalmente incluem duas operaes de ponteiros fundamentais,
D
como: Atribuio e Desreferenciamento. A atribuio realiza o processo de E
modificar o valor de uma varivel de ponteiro para algum endereo til. O
desreferenciamento um procedimento que leva uma referncia por meio D
A
de um nvel de indireo, a segunda operao fundamental dos ponteiros. D
O
S
50 TPICO 2 UNIDADE 1

Os ponteiros so definidos por armazenar valores em espaos de memria, estes valores


so reconhecidos como Int, que possuem como finalidade armazenar os valores inteiros, j o
Float possui como funcionalidade armazenar valores de ponto flutuante, como nmeros como
1,5, com relao aos valores Char estes possuem como funo armazenar caracteres, vamos
analisar o exemplo:

int j;
j = 22;

Perceba que o ponteiro declara a varivel j como sendo um nmero inteiro, como no
exemplo o nmero inteiro j = 22.

FIGURA 28 - PONTEIRO

L
I
N
G
U
A FONTE: Schepp (2011)
G
E
N
S

D
E
UNI
P CASAVELLA, Eduardo. Ponteiros em C. A utilizao de ponteiros
R
O em linguagem C uma das caractersticas que tornam a
G linguagem to flexvel e poderosa.
R Para descobrir mais sobre Ponteiros, acesse o Link: <http://
A
M linguagemc.com.br/ponteiros-em-c/>.
A

E
Percebe-se que na figura fica muito clara a disposio do funcionamento do Ponteiro,

E
onde o ponteiro declara a varivel, com isto o valor ocupa um espao na memria e fica
S armazenada, este espao destinado para o valor desta varivel.
T
R
U
T
U
R
A

D 6 RECURSIVIDADE
E

D
A
D Recursividade se define por executar chamadas de uma mesma funo, esse processo
O
S ocorre dentro do corpo de uma funo existente e declarada, a recursividade chama novamente
a prpria funo. Podemos exemplificar de forma mais simples, onde a funo declarada de C
UNIDADE 1 TPICO 2 51

chama a sua prpria funo C, isso denominado de recursividade direta, no entanto podem
ser chamadas tambm funes indiretas, como, por exemplo, a funo C chama a funo D,
e esta funo D, chama a funo C, isso caracterizado como recursividade indireta.

No entanto ao desenvolver uma funo recursiva devem ser tomadas algumas medidas,
mesmo ela sendo uma soluo simples, executando tarefas repetitivas, isso ocorre sem usar
estruturas de repetio, caracterizando-se em processo nada dinmico. Todo processo de
desenvolvimento ao utilizar a recursividade exige muita ateno na sua aplicao, para que
no tenha problema na declarao das funes e no torne o programa demorado no momento
de devolver as respostas das chamadas.

Os cuidados se devem s propostas das funes recursivas. Toda vez que uma funo
chamada de forma recursiva, estas so armazenadas na memria do parmetro de cada
chamada, isso ocorre para que os valores no se percam.

Levando em considerao que cada instncia de uma funo pode acessar as instncias
criadas para ela mesma, no podendo esta instncia acessar os parmetros de outras instncias
e a chamada de uma funo conhecida como registro de ativao, devendo esta chamada
obter os seguintes retornos: deve retornar um endereo, registrar o estado e as Flags do L
I
computador, transformar as variveis como argumentos e o retorno da varivel. N
G
U
A
A seguir temos um exemplo de como ocorre uma funo recursiva utilizando a linguagem G
E
de programao em C. A funo recursiva precisa criar um programa que pea um nmero N
S
inteiro ao usurio e retorne a soma de todos os nmeros de 1 at o nmero que o usurio
D
introduziu, sendo os seguintes valores 1 + 2 + 3 + ... + n: E

P
Vamos criar uma funo soma(int n). R
O
Se n=5, essa funo deve retornar: soma(5) = 5 + 4 + 3 + 2 + 1 G
R
Se n=4, essa funo deve retornar: soma(4) = 4 + 3 + 2 + 1 A
M
Se n=3, essa funo deve retornar: soma(3) = 3 + 2 + 1 A


O
Isso feito de uma maneira muito simples, atravs de um simples teste condicional do
E
tipo IF ELSE. Veja a seguir como ficou nosso cdigo em C:
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
52 TPICO 2 UNIDADE 1

#include <stdio.h>

int soma(int n)
{
if(n == 1)
return 1;
else
return ( n + soma(n-1) );
}

int main()
{
int n;
printf("Digite um inteiro positivo: ");
scanf("%d", &n);

printf("Soma: %d\n", soma(n));


}
L
I FONTE: site Progressivo
N
G
U Segundo Pereira (1996), em geral, uma rotina recursiva R pode ser expressa como
A
G uma composio formada por um conjunto de comando C (que no contm chamadas a R) e
E
N uma chamada (recursiva) rotina R. Exemplo de uma recurso Direta:
S

D
E FIGURA 29 - FUNO RECURSIVA DIRETA
P
R
O
G
R
A
M
A

E
S
T FONTE: A autora
R
U
T
U Pereira (1996), apresenta ainda uma forma indireta de recurso, na qual rotinas so
R
A conectadas atravs de uma cadeia de chamadas sucessivas que acabam retornando a primeira
D que foi chamada.
E

D
A
D
O
S
UNIDADE 1 TPICO 2 53

FIGURA 30 - FUNO RECURSIVA INDIRETA

FONTE: A autora

Analisando os exemplos acima percebemos que a funo recursiva direta chama ela
mesma, com R chamando a funo R, j na funo recursiva indireta a funo R chama a
funo C, e a funo C realiza a chamada da funo R.

L
UNI I
N
G
Conhea mais acerca da Recursividade e suas funcionalidades U
A
dentro das funes acessando o link: <http://geraldoferraz. G
blogspot.com.br/2011/11/recursividade.html> e tambm o link: E
<http://linguagemc.com.br/recursividade-em-c/> N
S

D
E

P
R
O
G
R
7 VARIVEIS ESTTICAS DENTRO DE FUNES A
M
A


A varivel esttica definida por ser um valor que est disponibilizado dentro de um O
escopo local, em uma funo, toda vez que a mesma inicializada pela primeira vez o fluxo E
de controle atinge o bloco ao qual corresponde seu valor, como no perde tambm seu valor, E
S
quando o nvel de execuo do programa deixa o escopo. Um procedimento que ocorre em uma T
R
varivel esttica que esta no fica armazenada em uma pilha, no entanto fica armazenada em U
uma memria esttica, este procedimento ocorre devido a um processo realizado pelo prprio T
U
funcionamento do programa. Segundo Junior, et al. (2012, p. 376), as variveis estticas so R
A
variveis locais cujos valores persistem dentro da funo, e permanecem a cada vez que a
D
funo chamada. E

D
A
Com isso a memria esttica continua existindo aps a funo ser executada, pois seu D
O
S
54 TPICO 2 UNIDADE 1

valor fica armazenado, definindo que essa varivel que foi declarada para esta funo, apenas
pode ser visualizada dentro da mesma funo qual foi declarada. Outra funo muito relevante
que a varivel esttica desempenha a recuperao do valor de uma varivel atribuda,
quando a funo foi executada pela ltima vez, uma vantagem que se deve novamente ao
armazenamento da memria esttica. Conforme Aguilar (2011, p. 268), as variveis estticas
mantm sua informao, inclusive depois de terminada a funo. Quando a funo novamente
chamada a varivel adota o valor que tinha quando foi chamada anteriormente.

A varivel esttica precisa ser declarada dentro de uma funo, esta funo possui
como responsabilidade realizar a impresso de nmeros que so reais, a grande vantagem
desta funo declarada pela varivel esttica est em imprimir um nmero real por vez, cada
nmero separado e colocando at cinco nmeros em cada linha impressa. Essa impresso
ocorre da seguinte forma, na primeira linha so impressos cinco nmeros, na segunda linha
so impressos mais cinco nmeros e assim consequentemente.

Segundo Celes e Rangel (2002) os nmeros so declarados e impressos em funes


com variveis estticas, repare o exemplo:

L
I Void imprime ( float a )
N
G {
U
A static int n = 1;
G
E printf ( " % f " , a );
N
S
if (( n % 5 ) == 0 ) printf ( " \ n " );

D
n++;
E }
P
R
O
G
R
A
M
A
7.1 VARIVEL LOCAL

E
A varivel local definida especificamente para uma funo que possui um
E
S
armazenamento destinado para uma varivel que est definida dentro de uma funo, isso
T
R
acontece devido as variveis locais serem declaradas para apenas uma funo. Esta varivel
U
T
guarda os valores de vrias chamadas de uma funo, esse procedimento muito importante
U
R
quando existe a necessidade de conter um valor na sada da funo, sem necessitar que uma
A varivel global seja criada. Lorenzi, Mattos e Carvalho (2007, p. 44), apresentam as variveis
D locais como declaradas na seo de declarao da sub-rotina, fazendo que somente essa
E
sub-rotina possa utiliz-lo. O restante do programa no reconhece essas variveis.
D
A
D
O Segundo Xavier (2010), as variveis locais so aquelas nas quais apenas a funo que
S
UNIDADE 1 TPICO 2 55

a declarou pode us-la, conforme o exemplo da declarao de um valor int x, dentro de uma
funo main, apenas a funo main pode utilizar esta varivel, vejamos o exemplo:

01. #include <iostream>


02. #include <cstdlib>
03. using namespace std;
04.
05. int obterY (void) // criando a funo
06. {
07. int y; // apenas a funo obterY pode utilizar
08. y=10*5;
09. return y;
10. }
11.
12. int main (void){
13. int valorDeY, x; // apenas a funo MAIN pode utilizar
14. cout <<"digite o valor de X: ";
15. cin >> x;
16. cin .ignore ();
17. valorDeY=obterY();
18. cout <<"\nX="<<x<<"\tY="<<valorDeY<<"\n\n";
19. system ("pause");
20. }
FONTE: Xavier (2010)
L
I
N
Xavier (2010), coloca que a varivel x s pode ser utilizada por main e a varivel y s G
U
pode ser utilizada por obterY. Para conseguirmos utilizar o valor guardado em y na funo A
G
obterY, tivemos que retornar (por na sada da funo) o valor de y (return y) e guardamos E
dentro de outra varivel que estava em main - valorDeY. N
S

D
E

P
R
7.2 VARIVEL GLOBAL O
G
R
A
M
A varivel global, por sua vez, declarada fora das funes, externamente a uma A

funo, por isso sua disponibilidade est associada globalmente, para que as funes estejam
O
localizadas abaixo das variveis declaradas. Um fator muito interessante de uma varivel global
E
a caracterstica de ficar escondida dentro do mdulo ao qual foi declarada, e pode ser visvel
E
apenas para este mdulo. Conforme Lorenzi, Mattos e Carvalho (2007, p. 43), colocam que S
T
as variveis globais so declaradas na seo de declarao do programa principal. Isso que R
U
essas variveis possam ser empregadas em todo o programa, inclusive dentro das sub-rotinas, T
U
pois todo o programa capaz de enxerg-las. R
A

D
Conforme o autor Xavier (2010), a varivel declarada fora de qualquer funo. E
Variveis globais podem ser utilizadas por qualquer funo. E qualquer funo pode alterar D
o valor, utiliz-la em um processo ou at mesmo atribuir o valor que quiser, vamos analisar o A
D
exemplo a seguir: O
S
56 TPICO 2 UNIDADE 1

01. #include <iostream>


02. #include <cstdlib>
03. using namespace std;
04.
05. int _iniciado=0; // varivel global comea em 0
06.
07. void start (void) {
08. _iniciado++;
09. }
10.
11. int main (void){
12. start (); // chamando a funo start
13. int x=0, opcao; // variveis locais, apenas a funo MAIN pode utilizar
14. x++;
15. cout <<"Este programa foi iniciado "<<_iniciado<<" vez(es)";
16. cout <<"\nO valor de X e "<<x;
17. cout <<"\n\nDeseja reiniciar o programa?\n1.\t\tSIM\nOutro numero\tNAO\n";
18. cin >> opcao;
19. cin.ignore ();
20. if (opcao==1)
21. main (); // reiniciar o programa
22. return 0;
23. }
FONTE: Xavier (2010)

L
I Xavier (2010), apresenta a varivel _iniciado que est sendo usada nas duas funes -
N
G main e start. Toda vez que a funo start chamada, incrementada (somada) um a _iniciado.
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 2 57

RESUMO DO TPICO 2

Nesse tpico, voc viu:

Neste tpico de estudos ns falamos muito sobre as funes, sua conceituao, definio,
caractersticas e suas funcionalidades, lembrando que uma caracterstica muito interessante
da funo que esta pode ser atribuda como um subprograma, ao qual a funo recebe
uma tarefa grande e se subdivide em sub-tarefas.

Com a diviso do programa em sub-tarefas os cdigos no se repetem, pois a funo


armazena as chamadas do programa na funo e esta funo pode ser chamada por diversas
vezes.

Uma definio muito importante sobre a funo que a mesma realiza o processo de agrupar
conjuntos de comandos da linguagem, com isso as chamadas das funes retornam a
L
resposta muito rpido, pois os parmetros ficam armazenados, com isso podem ser chamados I
N
e consultados vrias vezes. A caracterstica mais relevante da funo que quando um cdigo G
U
do programa se repete, este ser transformado em uma nova funo dentro do programa. A
G
E
N
A pilha classificada como uma estrutura de dados, para que todo processo, como uma S

ao, chamada ou comando, possa especificamente passar pelo topo da estrutura da pilha. D
E
Outra caracterstica da pilha de execuo : a programao segue uma lgica, em que cada
P
cdigo ou elemento includo em uma nova pilha, e esta por sua vez passa a fazer parte da R
O
estrutura de dados, lembrando que os elementos da pilha so retirados em ordem inversa, G
R
o ltimo elemento, sempre o primeiro a sair, essa lgica conhecida como Last In e First A
M
Out. A


O
A principal funcionalidade dos ponteiros de variveis realizar o processo de armazenar
E
endereos de memria, primeiro precisa-se declarar uma varivel, para saber qual o
E
tamanho que esta varivel vai ocupar na memria. Um exemplo desta funcionalidade S
T
realizar a declarao da varivel int a, estamos declarando que esta varivel pode conter R
U
nmeros inteiros. T
U
R
A
Recursividade, esta palavra j diz tudo, possui como finalidade executar chamadas de uma
D
mesma funo. E

D
A varivel esttica definida por ser um valor que deve ser declarado dentro da funo, este A
D
valor armazenado na memria esttica do programa e continua existindo, mesmo aps a O
S
execuo desta funo, pois seu valor est armazenado na memria esttica.
58 TPICO 2 UNIDADE 1


IDADE
ATIV
AUTO

1 A pilha de execuo possui a funo de incluir cada elemento ao topo de uma pilha,
so denominadas de estruturas de dados auxiliando a linguagem de programao,
pois todo cdigo precisa passar pelo topo da pilha. Com a incluso dos elementos
no topo da pilha, como esses elementos podem ser excludos do topo? Assinale (V)
para as alternativas Verdadeiras e (F) para as alternativas Falsas.
( ) TOP.
( ) POP
( ) PUSH
( ) LAST.

2 Recursividade se define por executar chamadas de uma mesma funo, esse processo
ocorre dentro do corpo de uma funo existente e declarada, a recursividade chama
L
I novamente a prpria funo. Toda vez que uma funo chamada de forma recursiva,
N
G estas so armazenadas na memria do parmetro de cada chamada, isso ocorre
U
A para que os valores no se percam. Na recursividade pode-se executar a chamada
G
E da mesma funo, atravs de suas formas:
N
S ( ) Contnua.
D ( ) Indireta.
E
( ) Direta.
P
R
( ) Instvel.
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1

TPICO 3

VETORES E ALOCAO DINMICA

1 INTRODUO

Neste tpico de estudos vamos conhecer e entender melhor os conceitos sobre os


vetores e alocao dinmica, que tambm so elementos e funcionalidades da estrutura de
dados e so partes fundamentais para estruturar uma linguagem de programao. Os vetores
L
conhecidos como Arrays possuem como responsabilidade realizar a estruturao de um conjunto I
N
de dados, suas vantagens partem do princpio que podem armazenar mais de um valor em G
U
uma nica varivel. Os vetores (arrays) so considerados uma sequncia de valores e so A
G
armazenados em uma sequncia de dados na memria de um programa. E
N
S
A alocao dinmica por sua vez possui a caracterstica por alocar um espao na D
E
memria de um programa, isso ocorre para que se tenha um espao determinado para uma
varivel ou funo, para que o programador saiba de quanto espao precisa e de quanto vai P
R
precisar para alocar espaos na memria. A alocao dinmica uma ferramenta muito utilizada O
G
para resolver problemas com estrutura de dados, a alocao composta por quatro funes: R
A
malloc(), Calloc(), realloc() e a free(). M
A


O

E
2 VETORES E ALOCAO DINMICA S
T
R
U
T
U
R
A

D
2.1 VETORES (ARRAYS) E

D
A
D
A principal funcionalidade de um vetor realizar a estruturao de um conjunto de O
S
dados, para que isso ocorra precisa ser definio desde a estrutura, auxiliando o programador
60 TPICO 3 UNIDADE 1

no desenvolvimento. Segundo Lorenzi, Mattos e Carvalho (2007, p. 51), vetores permitem


armazenar mais de um valor em uma mesma varivel. O tamanho dessa varivel definido
na sua declarao, e seu contedo dividido em posies.

Os vetores so considerados uma sequncia de valores que possuem o mesmo tipo
de dados, e so consequentemente armazenados, em sequncia, na memria do programa
que para acessar os valores armazenados faz uso utilizando o mesmo nome das variveis
para poder acessar esses valores j armazenados. Os vetores podem ser compreendidos de
outra forma, uma caracterstica de ser entendido logicamente por ser uma lista de elementos,
em que esses contenham os mesmos tipos de valor.

Os vetores (arranjos) so quase sempre implementados utilizando a memria


consecutiva, no entanto nem sempre isso acontece. Intuitivamente um arranjo
seria um conjunto de pares de ndices e valores. Para cada ndice definido
existe um valor associado. Em termos matemticos chamamos isso de corres-
pondncia ou mapeamento. Consequentemente que para os arranjos, estamos
preocupados apenas com duas operaes, aquelas que recuperam e a outra
que armazena os valores. (HOROWITZ e SAHNI 1987, p. 47).

Como mencionado os vetores podem ser considerados como uma sequncia lgica
L de elementos, podem estar disponveis atravs de uma lista, para acessar esta lista existe a
I
N necessidade de seguir um ndice, este ndice por sua vez pode ser acessado individualmente,
G
U contendo dados constitudos por nmeros inteiros. Para realizar a indexao desses elementos,
A
G necessrio que sejam do nmero 0, entre n-1, n definido pela quantidade de elementos
E
N que compem o vetor, o n pode ser considerado tambm como a dimenso ou o tamanho
S
deste vetor. Aps a declarao do vetor, seu tamanho torna-se fixo, no sendo possvel
D
E alterar o seu tamanho posterior execuo do programa, pois seu tamanho est armazenado
P e gravado na memria.
R
O
G
R
Segundo Aguilar (2011, p. 250), um vetor (array) uma sequncia de objetos do mesmo
A
M
tipo. Os objetos so chamados elementos do array e so numerados consecutivamente de
A

0, 1, 2, 3, esses valores so denominados valores ndices ou subndice, normalmente

O
utilizado para armazenar valores do tipo char, int ou float. Perry (1999, p. 683), diz que para

E
monitorar e processar vrios itens precisa colocar esses itens em um nico array, com apenas
um nome. A vantagem de um array poder percorrer todas as variveis com a instruo de
E
S loop, como um loop for.
T
R
U
T Conforme Aguilar (2011, p. 250), um array pode conter a idade dos alunos de uma
U
R sala, as temperaturas de cada dia de um ms em uma determinada cidade ou o nmero de
A
pessoas que vivem em cada estado do Brasil. Ser apresentado a seguir um exemplo de um
D
E array, onde este possui 6 (seis) elementos: a[0] = 25,1; a [1] =34,2; a[2] = 5,25; a[3] = 7,45;
D a[4] = 6,09; e a[5] = 7,54.
A
D
O
S
UNIDADE 1 TPICO 3 61

Pode-se perceber que a tabela acima est representando uma rea da memria de um
computador, pois o array sempre armazenado com seus elementos em uma sequncia de
posies, como uma sequncia contnua. Cada item no array chamado de elemento, seguindo
essa linha, cada elemento acessado de forma independente, conforme a posio do ndice,
no exemplo acima fica muito claro, as posies so especificadas atravs dos nmeros.

FIGURA 31 - EXEMPLO DE ARRAY

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
Fonte: Palmeira (2014) M
A


O

2.2 MTODOS UTILIZADOS EM ARRAYS E


S
T
R
U
Todos os array pertencem a uma classe denominada de System.Array, onde so T
U
demonstrados vrios mtodos para membros estticos e instanciados. R
A

D
E

D
A
D
O
S
62 TPICO 3 UNIDADE 1

TABELA 4: SYSTEM.ARRAY
Rank Retorna o nmero de dimenses do array.
GetLength Retorna o nmero de elementos da dimenso especfica do array.
Length Retorna o total de elementos do array.
GetLowerBound Retorna limite baixo da dimenso especificada.
GetupperBound Retorna o limite alto da dimenso especificada.
IsReadOnly Indica se o array apenas para leitura.
IsSynchronized Indica se o acesso ao array thread-safe.
Retorna um objeto que pode ser usado para sincronizar o acesso para o
SyncRoot
array.
IsFixedSize Indica se o array tem um tamanho fixo.
Retorna a referncia para o elemento localizado em uma posio especfica
GetValue
no array.
GetEnumerator Retorna o IEnumerator para o array, permitindo o uso da instruo foreach.
Sort Ordena os elementos de um array.
Retorna o ndice da primeira ocorrncia do valor em um array
IndexOf
unidimensional ou em uma parte dele.
Retorna o ndice da ltima ocorrncia do valor do array unidimensional ou
LastIndexOf
em uma parte dele.
L Reverte a ordem dos elementos em um array unidimensional ou em uma
I
Reverse
N
parte dele.
G Clone Cria um novo array que uma cpia superficial do array de origem.
U
A CopyTo Copia os elementos de um array para outro.
G
E Copia a seo de um array para outro, executando qualquer modelagem
N Copy
S requerida.
D
Clear Configura a faixa de elementos no array para 0 ou null.
E
Fonte: Medeiros (2014)
P
R
O
G
R
A
M UNI
A

Conhea mais sobre o conceito de Vetores (ARRAYS) acessando


O
o Link: http://www.macoratti.net/10/05/c_arrays.htm
E Estudo de: MACORATTI, Jos C. Conceitos - Apresentao Arrays.
E
S
T
R
U
T
Acadmico(a) fique tranquilo, na prxima unidade de estudos, vamos explicar mais as
U
R
funcionalidades e tipos de Arrays, aprofundar ainda mais nossos estudos acerca de elementos
A e seus valores dentro da programao.
D
E

D
A
D
O
S
UNIDADE 1 TPICO 3 63

3 ALOCAO DINMICA

Antes de explicar sobre o que se trata a alocao dinmica, vamos falar um pouco sobre
o uso da memria em um programa. Para que sejam armazenados dados e informaes em um
espao de memria, precisamos proceder de trs formas, utilizar as variveis globais, variveis
locais e solicitar um espao para o prprio sistema. Conforme Pereira (1996, p. 146), sabemos
que para executar um programa, o computador precisa carregar seu cdigo executvel, para
a memria. Neste momento, uma parte da memria total disponvel no sistema reservada
para o uso do programa e o restante fica livre.

FIGURA 32 - ALOCAO DA MEMRIA

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

FONTE: Rocha (2010)
O

E
Conforme j visto anteriormente as variveis globais so classificadas por continuar
E
existindo enquanto o programa est sendo executado. Na varivel local, o espao armazenado S
T
somente para funes declaradas, onde a varivel est sendo executada. J para armazenar R
U
espao na memria ocorre um processo que exige que seja solicitado para o sistema, no entanto T
U
esse processo deve ocorrer enquanto o sistema est sendo executado, deve ser determinado R
A
tambm o espao ao qual precisa ser armazenado, este espao continua armazenado e
D
registrado, enquanto no seja solicitado de forma explicita para o sistema, at que este espao E

seja liberado. D
A
D
O
Agora que sabemos sobre as definies das variveis que realizam o armazenamento S
64 TPICO 3 UNIDADE 1

de memria, seja em um programa ou em um sistema operacional, vamos conhecer sobre a


alocao dinmica. A alocao dinmica definida por um processo de alocar um espao na
memria, este procedimento utilizado, quando no se sabe exatamente o espao correto que
um elemento ou funo vai ocupar, isso ocorre somente quando o programa ou sistema est
em execuo. Ainda segundo Pereira (1996, p. 146), quem determina quanto de memria
ser usado para as instrues o compilador. Alocar rea para armazenamento de dados,
entretanto, responsabilidade do programador.

Como a alocao de memria responsabilidade do programador este consegue


desenvolver variveis durante o tempo de execuo do programa, alocando desta forma
memria para as novas variveis que foram criadas. Com a criao das variveis temos maior
disponibilidade e melhor utilizao da memria do programa, sem precisar utilizar a memria
adicional.

A alocao dinmica consideravelmente muito utilizada para resolver problemas


com estruturas de dados, so denominadas quatro funes, estas as mais utilizadas para a
alocao de memria, pertencem a biblioteca Stdlib.h: malloc(), Calloc(), realloc() e a free(). A
funcionalidade de cada uma muito importante para que o processo de alocar uma memria
L tenha xito, as funes da malloc() e Calloc(), so iguais, elas realizam o processo de alocar
I
N espao na memria, a realloc(), como sua denominao j menciona, tem por funo realizar
G
U o espao da memria e a funo free() possui a responsabilidade de liberar as memrias que
A
G esto alocadas no programa.
E
N
S
A principal funo da alocao dinmica a funo malloc(), que est localizada
D
E dentro da biblioteca stdlib.h, a funo malloc() recebe como parmetros o nmero de bytes,
P que necessita alocar de memria, retornando com um endereo inicial em que foi alocada
R
O a memria. Quando no houver espao suficiente para a solicitao de alocao a funo
G
R malloc() retorna apontando um valor nulo (null), para verificar se existe espao suficiente para
A
M a alocao necessrio o seguinte comando:
A

E
S
T
R
U
T Este exemplo acima de um comando para obter certeza que existe espao suficiente
U
R para alocar memria no programa. Vamos analisar na figura abaixo como ficaria disponibilizada
A
e reservada a memria, utilizando a funo malloc().
D
E

D
A
D
O
S
UNIDADE 1 TPICO 3 65

FIGURA 33 - FUNO MALLOC()

L
I
FONTE: Rocha (2010) N
G
U
A
de extrema importncia que seja verificado e testado se a alocao ocorreu de forma G
E
correta, esse processo deve ser realizado antes mesmo de utilizar o apontador. Vamos analisar N
S
como devem ser os comandos para essa verificao, segue exemplo da figura logo abaixo.
D
E
FIGURA 34 - TESTE DA FUNO MALLOC()
P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
FONTE: Rocha (2010) S
66 TPICO 3 UNIDADE 1

Para realizar o procedimento de liberar espao de memria alocada, precisa ser


executado um comando utilizando a funo free(), esta funo recebe como parmetro um
ponteiro com um endereo da memria, a qual precisa ser liberada da memria do programa.
Vamos analisar a seguir o comando que precisa ser executado para liberar o espao:

Para que o procedimento de liberao de espao de uma memria alocada seja efetivo
precisamos executar o comando que utiliza a funo free(), deve ser observado que aps a
liberao do espao na memria esta no poder ser mais acessada. Vamos analisar a seguir
o exemplo da funo free() na execuo de liberar espao na memria alocada dinamicamente.

FIGURA 35 - FUNO FREE()

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

O
FONTE: Rocha (2010)
E

E
S A alocao dinmica, nada mais do que criar um espao na memria de um programa
T
R
ou sistema operacional, no entanto, esse procedimento de criar uma alocao, de armazenar
U
T
um espao da memria deve ser realizado enquanto o programa est sendo executado. Outra
U
R
caracterstica da alocao dinmica que para realizar o armazenamento de vrios elementos
A s possvel alocar espao para um elemento por vez, no possvel alocar espao para vrios
D ao mesmo tempo. Tanto para liberar espao, como para desalocar espao de um elemento
E
a funo deve estar sendo executada pelo programa. Com relao aos elementos, para a
D
A liberao de espao da memria alocada, precisa ser feito de um elemento de cada vez, como
D
O no processo de alocao de espao da memria. A alocao de memria pode ocorrer em
S
UNIDADE 1 TPICO 3 67

duas categorias, sendo Esttica ou Dinmica, como veremos a seguir na definio de cada
uma dessas alocaes de memria.

3.1 ALOCAO ESTTICA

Considerando que a definio de uma memria esttica se d atravs do processo em


que uma varivel pode ser uma rea, um espao de memria de um programa em que ainda
no foi alocado nenhum espao para a memria. Pereira (1996, p. 146), diz que as variveis
de um programa tm alocao esttica se a quantidade total da memria utilizada pelos dados
previamente conhecida e definida de modo mutvel, no prprio cdigo-fonte do programa.
Durante toda a execuo, a quantidade de memria utilizada pelo programa no varia.

A alocao esttica ocorre em tempo de compilao, ou seja, no momento


que se define uma varivel ou estrutura necessrio que se definam seu
tipo e seu tamanho. Por qu? Porque esse tipo de alocao, ao se colocar o
programa em execuo, a memria necessria para se utilizar as variveis e
estruturas estticas precisa ser reservada e deve ficar disponvel at o trmino
do programa. (LORENZI, MATTOS e CARVALHO 2007, p. 51). L
I
N
G
U
A
G
E
3.2 ALOCAO DINMICA N
S

D
E
Podemos considerar que a definio de uma alocao dinmica ocorre quando a
P
alocao de memria estava prevista no desenvolvimento do cdigo do programa, em que o R
O
espao j estava alocado, reservado para as variveis, esse processo de predefinir um espao G
R
para alocamento da memria chamado de alocao dinmica. Lorenzi, Mattos e Carvalho A
M
(2007, p. 51), definem a alocao dinmica como ocorre em tempo de execuo, ou seja, A

as variveis e estruturas so declaradas sem a necessidade de se definir seu tamanho, pois
O
nenhuma memria ser reservada ao colocar o programa em execuo.
E

E
Pereira (1996, p. 146), diz se o programa capaz de criar novas variveis enquanto S
T
executa, isto , se as reas de memria que no foram declaradas no programa passam a R
U
existir durante a sua execuo, ento dizemos que a alocao dinmica. T
U
R
A

D
E

D
A
D
O
S
68 TPICO 3 UNIDADE 1

LEITURA COMPLEMENTAR

RECURSIVIDADE EM JAVA

A recursividade nada mais nada menos do que uma funo dentro da outra e ela deve
ser pensada como uma pilha (estrutura de dados onde o ltimo a entrar deve ser o primeiro a
sair). A estrutura dela consiste em descer at a base fazendo os clculos ou rotinas de cada
instruo, e ento da base at o topo da pilha so empilhados os resultados de cada instruo
e no final o topo contm o resultado que retornado. Na figura a seguir, temos um exemplo
que frequentemente usado para explicar a recursividade, podemos encontrar em diversos
livros didticos, porque um dos mais fceis para se entender, estou falando do fatorial.

Ex.: desenvolver um mtodo recursivo para descobrir o fatorial de um nmero N.


Suponhamos que o N seja igual a 4.

L
I
N
G
U
A
G
E
N
S

D
E

P
R Obs.: O fatorial(4) s pode ser descoberto depois que o fatorial(3) for descoberto,
O
G que por sua vez s poder ser descoberto depois do fatorial(2) e assim por diante. Por isso vai
R
A do topo at a base, e depois vai empilhando os resultados da base at o topo.
M
A

Agora uma ilustrao com os valores para fixar o conceito:


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 3 69

O conceito de recursividade, como podemos ver anteriormente, no to difcil, claro


que na hora da programao sempre recomendvel ateno, organizao e fazer o to
chato, mas eficiente teste de mesa, ou seja, fazer o mximo para dar certo, pois a hora de
errar quando estiver treinando, fazendo exerccios e no deixar para errar quando estiver em
um mercado de trabalho, onde um projeto pode ter mais de 10000 linhas. Agora vamos deixar
de Blblbl, e vamos ao que interessa, a seguir implementaremos o exemplo do fatorial no
JAVA. Crie uma classe como a seguir:

L
Essa a funo recursiva do fatorial em JAVA. Agora vamos implementar um mtodo I
N
principal para testar esta funo, para facilitar coloque esse mtodo dentro da classe que j G
U
foi criada. Como a seguir: A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
Com isso eu encerro este artigo, espero que tenham gostado e entendido a to temida T
recursiva. Qualquer dvida podem entrar em contato. U
R
A

Concluso D
E

D
Ao final deste artigo podemos ver que a recursividade no aquele bicho papo que A
D
muitos pensam, tudo questo de ateno e organizao. Se voc tiver pacincia, ateno O
S
70 TPICO 3 UNIDADE 1

e organizao vai se dar muito bem com a recursividade, no esquecendo claro de fazer
aquele bom e velho teste de mesa (pelo menos no comeo), e importante lembrar, tambm,
que a recursividade trabalha com o conceito de pilha e pode at substituir laos de repetio.

FONTE: ALVES, Ricardo. Recursividade em Java. Disponvel em: <http://www.linhadecodigo.com.br/


artigo/3316/recursividade-em-java.aspx#ixzz3EQu8W9rl>. Acesso em: 08 Set. 2014.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 3 71

RESUMO DO TPICO 3

Nesse tpico, voc viu:

Vetores (arrays) so classificados como um processo para estruturao de um conjunto de


dados, possuem como caracterstica realizar o armazenamento de mais de um valor em
uma mesma varivel. Para a definio do tamanho dessa varivel, esse procedimento
realizado na sua prpria declarao.

Para realizar o armazenamento de dados e informaes em um espao de memria, seja


de um programa ou sistema operacional, esta execuo pode ser feita atravs de variveis
globais, variveis locais e requisitando ao computador.

A alocao dinmica definida especificamente por exercer a funo de alocar um espao da


memria, isso para alocar um elemento ou uma funo, este procedimento ocorre somente L
com a execuo do programa. I
N
G
U
A alocao dinmica possui a responsabilidade de resolver problemas com estruturas de A
G
dados, possui quatro funes para alocao de memria, malloc(), Calloc(), realloc() e a E
N
free(), estas so pertencentes a biblioteca Stdlib.h. As funes da malloc() e Calloc(), S

realizam o processo de alocar espao, a funo realloc(), realocar espao da memria e a D


E
funo free(), libera espao na memrias.
P
R
O
A alocao esttica se define por ser um espao que ainda no foi alocado e no sabe-se G
R
o tamanho ao qual pode ocupar na memria. J a alocao dinmica ocorre ao contrrio, A
M
quando se sabe o tamanho e o espao da alocao que a mesma vai ocupar na memria A

do programa.
O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
72 TPICO 3 UNIDADE 1


IDADE
ATIV
AUTO

1 Os vetores (array) so definidos por serem uma sequncia de objetos do mesmo


tipo, estes objetos so denominados de elementos do array e so consequentemente
numerados em sequncia, uma vantagem muito interessante de um array que
estes podem percorrer todas as variveis, utilizando a instruo loop. Os valores
sequenciais dos arrays so denominados de:

a) ( ) Valores ndices.
b) ( ) Valores Programa.
c) ( ) Valores Subndice.
d) ( ) Valores Subprograma.

2 Na alocao dinmica so utilizados vrios procedimentos para alocar espao na


L
I memria de um programa, um processo muito utilizado no desenvolvimento de
N
G sistemas, pois possuem como finalidade auxiliar com problemas de estruturao de
U
A dados. Para realizar o procedimento de alocar espao na memria, so utilizadas
G
E quais funes?
N
S

D a) ( ) REALLOC()
E
b) ( ) FREE()
P
R
c) ( ) MALLOC()
O
G
d) ( ) CALLOC()
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 1 TPICO 3 73

IAO
AVAL

Prezado(a) acadmico(a), agora que chegamos ao final


da Unidade 1, voc dever fazer a Avaliao referente a esta
unidade.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
74 TPICO 3 UNIDADE 1

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2

ESTRUTURAS DE DADOS

Objetivos de aprendizagem

A partir desta unidade voc ser capaz de:

entender a cadeia de caracteres e seus dados primitivos;

distinguir os tipos de caracteres;

compreender vetores unidimensionais;

conhecer os tipos de estruturas de dados;

distinguir a diferena entre arranjos unidimensionais e


multidimensionais;

entender operadores e vetores; L


I
N
compreender os tipos e matrizes; G
U
entender os tipos abstratos de dados. A
G
E
N
S
PLANO DE ESTUDOS D
E

A Unidade 2 do Caderno de Estudos est dividida em trs P


R
tpicos. No final de cada um deles, voc encontrar autoatividades O
G
que servem de auxlio para fixar os contedos apresentados em toda R
A
a unidade e seus tpicos de estudos. M
A


O
TPICO 1 CADEIA DE CARACTERES E

TPICO 2 TIPOS DE ESTRUTURAS DE DADOS E


S
T
TPICO 3 MATRIZES R
U
T
U
R
A

D
E

D
A
D
O
S
L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2

TPICO 1

CADEIA DE CARACTERES

1 INTRODUO

Uma cadeia de caracteres formada por uma sequncia finita de caracteres. So


formados por conjuntos de um ou vrios caracteres. Usualmente so utilizados com os
caracteres entre aspas ( ) e tambm podem aparecer entre apstrofos ( ). Uma cadeia
L
de caracteres considerada como uma sequncia finita de smbolos, estes smbolos esto I
N
presentes em um alfabeto especfico, em que cada smbolo pertence a um tipo de alfabeto. Estes G
U
smbolos esto presentes no incio da cadeia, como tambm no final da cadeia de caracteres. A
G
E
N
Conforme os autores JUNIOR; et al. (2012, p. 389), uma das formas mais bsicas S
de composio das informaes a cadeia de caracteres, tambm conhecida como string. D
E
Conhecer esta estrutura permite a manipulao das informaes que levam ao conhecimento.
P
R
A cadeia de caracteres formada por uma variedade de conceituaes, sua definio O
G
pode ser descrita com o fator String que apresenta sua utilizao na representao de valores R
A
textuais, em que uma string pode ser escrita seguindo uma sequncia de caracteres. Entre M
A
os tipos de caracteres podemos encontrar as Constantes do Tipo Caracteres; Variveis do

tipo Caracteres; Cadeia de Caracteres e Operaes; Vetor de Cadeia de Caracteres; Vetores O

Unidimensionais; Leitura de Vetores e Escrita de Vetores. Todos esses conceitos podem ser E

conferidos no contedo desta unidade de estudos. E


S
T
R
U
T
U
R
A
2 CADEIA DE CARACTERES
D
E

D
A
D
O
S
78 TPICO 1 UNIDADE 2

2.1 CARACTERES

Os caracteres so definidos por serem dados primitivos, encontrados na maioria dos


computadores. Esses dados primitivos esto relacionados com a linguagem mquina, onde o
computador permite a manipulao desses dados primitivos. Uma cadeia formada por uma
sequncia de caracteres que so ordenados para que ocorra a manipulao dos dados pela
cadeia, caracteres so formados por um conjunto finito. Podemos citar como exemplo de um
carcter uma representao lgica da memria, sendo esta uma sequncia de bits, em que os
bits so uma sequncia de zeros(0) e uns(1), para cada carcter atribuda uma sequncia
distinta de bits, isso pode ser definido tambm como uma codificao de um conjunto de
caracteres, em uma sequncia de bits com tamanhos fixos.

Uma cadeia (string) de caracteres um conjunto de caracteres, incluindo o


branco, que armazenado em uma rea contnua da memria. Podem ser
entradas ou sadas para um terminal. O comprimento de uma cadeia o
nmero de caracteres que ela contm. A cadeia que no contm nenhum
carcter denominada cadeia vazia ou nula, e seu comprimento zero; no
devemos confundir com uma cadeia composta somente de brancos, espaos
L em branco, j que esta ter como comprimento o nmero de brancos conti-
I
N
dos. A reapresentao das cadeias costuma ser com apstrofos ou aspas.
G (AGUILAR 2011, p. 268).
U
A
G
E
N
S Nos dias atuais, as cadeias de caracteres (strings) armazenam no somente dados,
D mas principalmente informaes e, portanto, a maioria dos processamentos computacionais
E
exige um tratamento mais complexo e apurado de strings.
P
R
O Pode-se afirmar que a definio de cadeia de caracteres (strings) uma se-
G quncia de letras, smbolos e tambm de nmeros, em que sempre o ltimo
R
A carcter o carcter nulo '\0', no entanto essa string possui internamente uma
M coleo sequencial de dados que so armazenados somente como leitura de
A um Char. (JUNIOR; et al., 2011, p. 392).

O
Conforme a definio de Ramos; Neto; Vega (2009), caracteres podem ser utilizados
E
para representar elementos de pontuao, dgitos, sinais, espaos e letras. Um valor da classe
E
S
string constitudo por uma sequncia de caracteres delimitada por um par de apstrofos ( '
T
R
) ou aspas ( ).
U
T
U Goodrich e Tamassia (2002, p. 417), afirmam que cadeia de caracteres podem surgir
R
A de uma variedade de origens, incluindo aplicaes cientficas, lingusticas e da internet. Vamos
D analisar a seguir estes exemplos de cadeia de caracteres:
E

D
A
D
O
S
UNIDADE 2 TPICO 1 79

P = GGTAAACTGCTTTAATCAAACGC
R = U.S. Men win soccer world cup!
S = http://www.wiley.com/college/goodrich/

A primeira cadeia de caracteres, P, tem origem em aplicaes de pesquisa sobre o DNA.


A cadeia de caracteres R uma manchete fictcia. A cadeia de caracteres S um endereo
(URL) do site da web que acompanha o livro do autor.

A string tambm denominada cadeia de caracteres, pois uma lista linear ou vetor,
onde cada elemento desse vetor um carcter, e o agrupamento deles ir representar uma
informao. Vamos analisar o exemplo da seguinte frase: Vendas crescem 28% ao ms!
(JUNIOR; et al. 2011, p. 393):

V e n d a s c r e s c e m 2 8 % a o m s !

No exemplo anterior pode ser analisada a estrutura de dados, esta estrutura comporta
26 caracteres, incluindo nmeros e espaos em branco, todos esses caracteres da estrutura L
I
de dados formam uma informao. N
G
U
A
O conceito de string pode ser construdo atravs do uso de vrias linguagens de G
E
programao, como, por exemplo a construo de algoritmos simples, vamos analisar a seguir N
S
esses modelos, vamos iniciar pela linguagem C. Segundo JUNIOR; et al. (2011, p. 402),
D
E
na linguagem de programao C no existe um tipo de dado string, pois nessa
linguagem uma string considerada um arranjo (ou vetor) de caracteres (tipo P
R
char), sendo que sua manipulao ocorre atravs do uso de diversas funes O
de manipulao ocorre do uso de diversas funes de manipulao de strings. G
Esse arranjo armazena uma sequncia de caracteres do tipo char, cujo ltimo R
A
elemento o carcter: NULL, tipicamente, representado na forma do carcter M
'\0', ou simplesmente pelo seu valor 0. A


O

E
Analise a seguir algumas sub-rotinas predefinidas em C, para tratamento de strings:
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
80 TPICO 1 UNIDADE 2

FIGURA 36 SUB-ROTINAS PREDEFINIDAS EM C, PARA TRATAMENTO DE STRINGS

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O FONTE: Juni; et al. (2011)
G
R
A
M
Agora que sabemos mais sobre as sub-rotinas que realizam o tratamento de strings na
A

utilizao da linguagem de programao C, sabemos como podem funcionar seus comandos

O
e funes utilizando os caracteres. Vamos analisar a seguir algumas caractersticas dos dados

E
que so caracteres.

E
S Dados na forma de caracteres so armazenados nos computadores como
T codificaes numricas, onde a codificao mal-usada era o ASCII (Padro
R de Codificao para Intercmbio de Informao American Standard Code for
U
T Information Interchange) dados de 8 bits, usam valores de 0 a 127 para codifi-
U car 128 caracteres diferentes. O padro UCS-2, um conjunto de caracteres
R
A de 16 bits. Essa codificao geralmente chamada de Unicode. (SEBESTA
2010, p. 273).
D
E

D
A
D
O
S
UNIDADE 2 TPICO 1 81

UNI
Java foi a primeira linguagem de programao que utilizou
amplamente conjunto de caracteres Unicode UCS-2, adotado
posteriormente tambm pelas linguagens JavaScript, Python,
Perl e em C#.

A utilizao do padro ASCII em vrios tipos de equipamentos que utilizam cdigos


diferentes. Para utilizar cdigos diferentes e para que mquinas diferentes consigam compilar
esses cdigos, podem ser utilizados alguns cdigos do padro ASCII. Vamos analisar esses
cdigos deste padro que so associados aos caracteres:

TABELA 5: CARACTERES UTILIZANDO PADRO ASCII


0 1 2 3 4 5 6 7 8 9
30 sp ! # $ % &
40 ( ) * + , - / . 0 1
50 2 3 4 5 6 7 8 9 : ;
60 < = > ? @ A B C D E
L
70 F G H I J K L M N O I
N
80 P Q R S T U V W X Y G
U
90 Z [ \ ] ^ _ a b c A
G
100 d e f g h i j k l m E
N
110 n o p q r s t u v w S
120 x y z { | } ~ D
E
FONTE: Celes e Rangel (2008)
P
R
TABELA 6: CARACTERES DE CONTROLE PADRO ASCII O
G
0 nul Null: nulo R
A
7 bel Bell: campainha M
A
8 bs Basckpace: voltar e apagar um caractere

O
9 ht Tab ou tabulao horizontal
E
10 nl Newline ou line feed: mudana de linha
E
S
13 cr Carriage return: volta ao incio da linha T
R
U
127 del Delete: apagar um caractere T
U
FONTE: Celes e Rangel (2008) R
A

D
E

D
A
D
O
S
82 TPICO 1 UNIDADE 2

2.2 CADEIA DE CARACTERES (strings)

Conforme mencionado anteriormente, uma cadeia de caracteres (string) definida por


ser composta por uma sequncia ordenada de smbolos, letras e nmeros, como tambm
cada smbolo que armazenado na memria de um programa, se transforma em um valor
numrico e este nmero tambm considerado um carcter. Esta sequncia ordenada de
nmeros, letras e smbolos, sempre representada pelo ltimo carcter que identificado por
'\0', como tambm so pertencentes da mesma famlia dos seguintes caracteres, '\n' e '\t'.
Com relao aos caracteres representados por smbolos, estes podem ser tanto espaos em
branco, dgitos, como tambm pontos de interrogao e de exclamao, bem como formados
pelos smbolos da matemtica.

No entanto essa aplicao em utilizar o carcter '\0', esse marcador utilizado na


linguagem C, para indicar o final de uma funo string, os smbolos aos quais representam
a cadeia de caracteres, como descrito anteriormente podem ser letras, nmeros e smbolos,
esses definem a cadeia de caracteres, tambm denominadas de strings, vamos analisar alguns
L
I
exemplos desses smbolos, como: (__espaos, ?, !, &), logicamente so alguns exemplos,
N
G
se analisarmos no s a matemtica, mas tambm a quantidade existente de caracteres que
U
A
formam um computador, podemos neste momento imaginar vrios exemplos.
G
E
N Analisando a linguagem C, com o uso de caracteres, pode-se perceber que o ltimo
S
elemento '\0' indica o fim de uma cadeia de caracteres, no entanto este no se torna exibvel,
D
E por isso em uma situao composta por n elementos, apresentar uma tabela de n + 1 elemento
P do tipo char, em uma cadeia de caracteres. Como o exemplo a seguir, String Boa noite, ser
R
O apresentado da seguinte forma na tabela de caracteres:
G
R
A
M
A B o a n o i t e \0

E Conforme Sebesta (2010, p. 274), cadeia de caracteres um tipo no qual os valores


E consistem em sequncias de caracteres. Cadeia de caracteres so tambm um tipo essencial
S
T para todos os programas que realizam manipulao de caracteres.
R
U
T
U
R
A

D
E 2.2.1 Constantes do tipo caracteres
D
A
D
O Podemos definir as constantes como valores pertencentes a programas de computador
S
que por sua vez no podem mudar seus valores durante a sua execuo. Segundo Aguilar
UNIDADE 2 TPICO 1 83

(2011, p. 84), os programas de computador contm certos valores que no devem mudar
durante a execuo do programa. Tais valores so chamados de constantes. Entretanto,
existem outros valores que mudaro durante a execuo do programa; esses valores so
chamados de variveis.

As constantes tambm so tipos de caracteres, utilizados para verificar os valores que


uma funo possui ao ser executada em um programa de computador, esses valores podem
ser vistos com as entradas e sadas dos dados. Conforme Sebesta (2010), constantes do tipo
de caracteres so usados para rotular a sada, e a entrada e sada de todos os tipos de dados
geralmente feita em termos de cadeia. As constantes podem ser declaradas, utilizando a
palavra constat, esta constante recebe um valor no mesmo momento em que declarada, essa
modificao do valor pode ocorrer sem nenhum problema durante a execuo do programa.

Segundo Aguilar (2011), as constantes no mudam durante a execuo do programa,


na linguagem C++ existem quatro tipos de constantes:

Constantes literais.
Constantes definidas.
Constantes enumeradas. L
I
Constantes declaradas. N
G
U
As constantes literais so as mais usuais; recebem valores, tais como A
45.32564,222 ou introduza seus dados que no so escritos diretamente G
E
no texto do programa. As constantes definidas so identificadores que se N
associam a valores literais constantes e que recebem determinados nomes. S
As constantes declaradas so como variveis: seus valores so armazenados D
na memria, mas no podem ser modificados. As constantes enumeradas E
permitem associar um identificador, tal como cor, a uma sequncia de outros
P
nomes, como azul, verde, vermelho e Amarelo. (AGUILAR 2011, p. 76). R
O
G
R
As constantes podem ser utilizadas para a declarao de valores em vrias linguagens A
M
de programao, como C++, Fortran 95, C#, bem como outras linguagens. Sua principal A
finalidade definir e verificar quais so os valores das constantes dos tipos de caracteres dessa

linguagem. Sebesta (2010, p. 259) apresenta a linguagem Java, esta permite a vinculao O

dinmica de valores a constantes nomeadas. Em Java, constantes nomeadas so definidas E

com a palavra reservada final. O valor inicial pode ser dado na sentena de declarao ou E
S
em uma sentena de atribuio subsequente. T
R
U
T
U
R
A

D
E

D
A
D
O
S
84 TPICO 1 UNIDADE 2

2.2.2 Variveis do tipo caracteres

As variveis do tipo caracteres possuem como finalidade armazenar letras e smbolos


que podem existir em um texto. So as variveis do tipo inteiros que armazenam nmeros
que podem ser associados a smbolos. Aguilar (2011) apresenta as variveis como um tipo
de carcter, essas variveis devem ser declaradas diretamente no algoritmo, e conforme a
linguagem de programao tero uma notao especfica. Vamos analisar esse procedimento
de como realizar esta declarao da varivel, conforme exemplo a seguir:

var
carcter : C, D
cadeia : NOME, CIDADE

Segundo Rita (2009, p. 40), variveis do tipo carcter so aquelas que podem armazenar
informaes compostas por um simples carcter ou um conjunto de letras, dgitos e smbolos
especiais. Com a utilizao das aspas simples no possvel realizar clculos, pois o programa
L
I
considera apenas como um texto, no entanto ao utilizar as aspas duplas o programa consegue
N
G
ser atribudo para uma cadeia de caracteres.
U
A
G
E
As variveis do tipo carcter possuem alguns pontos importantes que devem ser falados,
N conforme Almeida (2008, p. 27) cita:
S

D
E A utilizao de aspas simples ( ' ): usada na hora em que se faz atribui-
es de um valor para uma varivel do tipo carcter.
P A utilizao de aspas duplas ( ): usada na hora em que se faz atribuies
R
O de um valor para uma varivel do tipo de cadeia de caracteres.
G
R
A
M Vamos analisar na imagem abaixo como ficaria um exemplo das variveis do tipo carcter
A
utilizando aspas simples e aspas duplas:

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2 TPICO 1 85

FIGURA 37 VARIVEL DO TIPO CARACTERES

FONTE: Almeida (2008)

2.2.3 Cadeia de caracteres e operaes

L
I
As cadeias de caracteres so formadas por vrias operaes, como: atribuio, N
G
concatenao, referncia a subcadeias, comparao e casamentos de padres. U
A
G
Iniciando pede referncia a subcadeias, est conhecida por ser chamada E
de fatia. As operaes de atribuio e comparao de cadeia de caracteres so N
S
compiladas com a possibilidade de compilar operadores de diversos tamanhos.
O casamento de padres uma operao fundamental para as cadeias de D
caracteres, pois pode ser suportada diretamente, como pode ser fornecida por E
uma funo ou uma biblioteca de classe para uma linguagem de programao. P
(SEBESTA 2010, p. 275): R
O
G
R
A
M
A
UNI

O
Segundo Sebesta (2010), a linguagem SNOBOL, foi a primeira
E
linguagem bastante conhecida a suportar o casamento de
padres. E
S
T
R
U
T
U
Segundo Aguilar (2011, p. 269), uma constante do tipo carcter um carcter entre R
A
aspas e uma constante de tipo cadeia um conjunto de caracteres vlidos entre apstrofos
D
para evitar confundir com nomes de variveis, operadores e inteiros. As operaes de E
caracteres uma forma primitiva do computador executar uma determinada operao de D
A
caracteres. D
O
S
86 TPICO 1 UNIDADE 2

Em vez de tentar determinar o tempo de execuo especfico de cada opera-


o primitiva, vamos simplesmente contar quantas operaes primitivas sero
executadas e usar este nmero t como uma estimativa de alto nvel do tempo
de execuo do algoritmo. Essa contagem de operaes est relacionada
com o tempo de execuo em um hardware e software especficos, pois cada
operao corresponde a uma instruo realizada em tempo constante e existe
um nmero fixo de operao primitiva. (GOODRICH e TAMASSIA 2002, p. 25).

Em vrias situaes uma operao necessita identificar e reconhecer um


determinado nmero de caracteres de uma cadeia, como por exemplo o seu comprimento,
assim como a unio, tambm conhecida como concatenao de cadeias. Conforme Aguilar
(2011, p. 272), o tratamento de cadeias um tema importante, por causa da grande quantidade
de informao armazenada nele. Segundo o tipo de linguagem de programao escolhido,
teremos maior ou menor facilidade para a realizao de operaes, vrias linguagens, bem
como as orientadas a objetos realizam o processo de manipular uma variedade de funes de
caracteres. Em qualquer caso, as operaes com cadeias mais usuais so:

Clculo do comprimento.
Comparao.
Concatenao.
L Extrao de subcadeias.
I
N Busca de informao.
G
U
A
G
E
N
S

D 2.2.4 Strings
E

P
R Strings so definidas por serem caracteres utilizadas para representar valores
O
G textuais, como, por exemplo, nomes e endereos, podem ser consideradas como arranjos
R
A unidimensionais, onde os elementos so caracteres, como podem ser consideradas um tipo de
M
A carcter bsico da linguagem. Na linguagem de programao os caracteres que compem uma

string, compreendem os smbolos de uma tabela que esteja codificada, lembrando novamente
O
que os valores de uma string geralmente so escritos em uma sequncia de caracteres e
E
esses esto identificados com a utilizao de aspas duplas, como por exemplo a e 'a', este
E
S segundo exemplo representa um tipo de dado de carcter e o primeiro representa um tipo de
T
R dado string. A seguir vamos analisar como as operaes so tratadas em relao ao tipo string:
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2 TPICO 1 87

TABELA 7: OPERAES SOBRE STRINGS

OPERAO DESCRIO
Inverso Retorna a string escrita na ordem inversa.
Compara se duas strings so iguais, retornando 0 (zero)
Comparao
em caso positivo.
Retorna a juno das duas strings, com a segunda string
Concatenao
comeando imediatamente aps o fim da primeira.
FONTE: Costa e Neta, 2014

Um tipo de dado String utilizado para representar cadeia de caracteres, onde esses
dados podem ser textos, nomes, sentenas; geralmente, esses tipos de dados strings so
textos pequenos, formados por cadeias de caracteres. Para efetuar operaes com cadeia de
caracteres em Java, precisa-se acionar mtodos presentes na classe String, de quem a cadeia
especfica de caracteres ser um objeto. (FEIJ; SILVA; CLUA, 2010, p. 93).

Segundo Ramos; Neto; Vega (2009, p. 140), a classe java.lang.string disponibiliza vrias
funcionalidades para manipular textos, como: comparao, contagem, pesquisa, eliminao e
insero de caracteres, converso de caixa de texto e tratamento de conjuntos de caracteres.
L
I
Vamos analisar na imagem a seguir os principais mtodos fornecidos por java.lang.string: N
G
U
A
FIGURA 38 java.lang.string G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S

FONTE: Ramos; Neto; Vega (2009)


88 TPICO 1 UNIDADE 2

Existem, dentro da classe java.lang.string, vrios outros mtodos, no apenas estes


exemplificados acima.

2.3 VETOR DE CADEIA DE CARACTERES

Um vetor pode ser considerado como uma cadeia de caracteres, quando representado
em algumas aplicaes de um programa, um vetor considerado um tipo char. Quando o vetor
classificado como tipo char, pode representar elementos como uma cadeia de caracteres,
e esse vetor apontando para ponteiros char, esse processo de representar os elementos e
apontar para os ponteiros do tipo char conhecido como vetor bidimensional de char.

Uma cadeia pode ser implementada como um vetor, cada elemento do vetor
contendo um ou mais caracteres. O vetor dever ser dimensionado de modo
a conter a cadeia; assim, se o comprimento da cadeia m e cada elemento
do vetor pode conter p caracteres, ento o nmero n de elementos do vetor
dever ser tal p.n m. Como por exemplo: n I_m/p_I (menor inteiro maior
ou igual a m/p). O armazenamento de mais de um carcter por elemento
torna necessria a existncia de operaes que obtenham ou modifiquem o
L
I valor de cada carcter. Tais operaes em geral utilizam algum mecanismo
N de deslocamento (shift) para trazer o carcter desejado para a primeira (ou
G ltima) posio dentro do espao ocupado pelo elemento. (VELOSO, SANTOS
U
A e AZEREDO 1983, p. 78).
G
E
N
S Para realizar a declarao da varivel para um vetor, como por exemplo de uma turma
D de alunos, deve-se declarar a quantidade de caracteres, como o nome de cada aluno, deve ter
E
no mximo at 70 caracteres, e o limite de alunos na turma deve ser de 40. Todo esse processo
P
R de identificar e declarar as variveis chamado de vetor bidimensional, nele que todos os
O
G
caracteres contendo os nomes ou nmeros de alunos que formam a turma so armazenados.
R
A
Conforme podemos analisar no exemplo a seguir, como declarar uma varivel de um vetor
M
A
bidimensional:

O char alunos [40] [70];


E

E
S Em uma situao, onde a representao de vetores de cadeia de caracteres, so
T
R declaradas, atravs de um ponteiro, e este ponteiro realiza a funo de alocar de forma dinmica
U
T cada elemento da cadeia de caracteres. Com este processo, o espao da memria otimizado
U
R e dessa forma reduzido, pois quando a quantidade de alunos for menor do que o declarado, a
A
dimenso mxima da cadeia de vetor no utilizada, lembrando que cada elemento do vetor
D
E da cadeia de caracteres um ponteiro. No caso de existir a necessidade de armazenar algum
D nome de aluno na cadeia de caracteres, ser prontamente alocado um espao na memria
A
D do vetor.
O
S
UNIDADE 2 TPICO 1 89

FONTE: Celes e Rangel (2008)

Vamos analisar alguns exemplos de funes que realizam a captura de funes, em um


vetor de cadeia de caracteres. A funo em especfico ir capturar o nome dos alunos de uma
determinada turma, onde a funo ir iniciar realizando a leitura da quantidade de nmeros que
esto alocados na turma, como tambm esta funo ir capturar o nome desses alunos que
esto alocados nesta turma e apresentar estes nomes em uma sequncia de linhas, realizando
a alocao conforme ordem dos nomes que esto alocados. Esta funo realizar a capturar
de uma linha de nomes, por exemplo, e posteriormente ir fornecer um retorno para a cadeia
alocada de forma dinmica, apresentando a linha que foi inserida.

Vamos analisar como a funo para capturar os nomes dos alunos preenche o vetor
de nomes e pode ter como valor de retorno o nmero de nomes lidos:
L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
FONTE: Celes e Rangel (2008) M
A


A funo para liberar os nomes alocados na tabela pode ser implementada por: O

E
S
T
R
U
T
U
R
A

D
E

D
FONTE: Celes e Rangel (2008) A
D
O
S
90 TPICO 1 UNIDADE 2

Uma funo para imprimir os nomes dos alunos pode ser dada por:

FONTE: Celes e Rangel (2008)

Um programa que faz uso destas funes mostrado a seguir:

L
I
N FONTE: Celes e Rangel (2008)
G
U
A
G
E
N
S

D 2.3.1 Vetores unidimensionais


E

P
R Leite (2006, p. 103) apresenta o vetor que possui apenas uma dimenso; como se
O
G seus elementos (notas mensais) pudessem ser expostos sobre uma linha. Na realidade pode
R
A ser considerada como uma lista ordenada de elementos que so do mesmo tipo de dado,
M
A sempre iniciando pela sequncia de um primeiro elemento, depois pelo segundo e assim

consequentemente, como vamos apresentar na figura a seguir.


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2 TPICO 1 91

FIGURA 39 VETORES

FONTE: Leite (2006)



Pode-se definir um vetor unidimensional como uma lista ordenada de elementos do
mesmo tipo. Por ordem entende-se que existe um primeiro elemento, um segundo, um terceiro e
assim por diante. (JUNIOR; et al. 2012). J Lorenzi e Lopes (2000, p. 51), apresentam vetores
como estes permitem armazenar mais de um valor em uma mesma varivel. Esta dividida
em posies, e cada posio pode receber um valor diferente, porm todos do mesmo tipo.
Conforme exemplo a seguir:

L
FIGURA 40 VETORES UNIDIMENSIONAIS I
N
G
U
A
G
E
N
S

D
E

P
FONTE: Lorenzi e Lopes (2000) R
O
G
R
Observando que a cada posio apresentada, na figura anterior, deste vetor de Notas, A
M
podem receber valores, no entanto, apenas valores pr-definidos para cada tipo de vetor. Outro A

fator interessante cada posio do vetor, ou cada elemento do vetor pode ser acessado
O
atravs de um ndice, tambm desenvolvido para estes elementos do vetor. Conforme Lorenzi
E
e Lopes (2000, p. 52), um vetor pode ser declarado na seo de variveis ou na seo tipos.
E
Quando definido um tipo de vetor na declarao de tipos, ele pode ser utilizado por qualquer S
T
varivel declarada no programa, inclusive nas sub-rotinas. Vamos analisar o exemplo a seguir: R
U
T
U
R
A

D
E

D
A
D
O
S
92 TPICO 1 UNIDADE 2

FIGURA 41 DECLARAO DE TIPOS DE VETORES

L
I
N
G
U
A
G FONTE: Lorenzi e Lopes (2000)
E
N
S
Como cada tipo de vetor possui estipuladas suas predefinies para os vrios tipos de
D
E posies, este tipo pode ser manipulado, de formas diferentes dos outros tipos, como pode
P ser percebido na figura anterior, onde declarado o tamanho, as posies e os tipos de dados
R
O dos vetores. Segundo Feij, Silva e Clua (2010, p. 80), um vetor unidimensional, em Java,
G
R caracteriza um conceito que admite diversos valores, com a restrio de que todos os valores
A
M em um vetor devem ter a mesma natureza.
A

E
S 2.3.2 Leitura de vetores
T
R
U
T A leitura de um vetor pode ser feita com o emprego da estrutura de controle para...
U
R fim_para dentro da qual cada elemento lido para a memria. (LEITE 2006, p. 105).
A

D
E Vamos analisar a seguir um pseudocdigo que realiza a leitura de um vetor denominado
D Nmeros, de 15 elementos inteiros:
A
D
O
S
UNIDADE 2 TPICO 1 93

FIGURA 42 LEITURA DE VETORES

FONTE: Leite (2006)



Tanto a leitura como a escrita de dados com vetores so denominadas como entrada
e sada, so geralmente utilizadas em estruturas em que as operaes so repetitivas, no
entanto, as duas podem tambm ser utilizadas em estruturas seletivas. Pode-se permitir aos
elementos de um vetor introduzir dados (escrever) nele ou visualizar seu contedo (ler). A
operao de efetuar uma ao geral sobre todos os elementos de um vetor denominada
varredura do vetor. (AGUILAR 2011, p. 233).

L
I
N
G
U
A
2.3.3 Escrita de vetores G
E
N
S
A escrita por sua vez recebe definies como argumentos de um apontador, isso ocorre D
E
quando o incio do espao temporrio, em que se necessita armazenar dados, como tambm
P
so declarados os espaos que estes dados temporrios necessitam. O processo de escrita dos R
O
elementos de um vetor segue o mesmo princpio da leitura. A nica diferena uma alterao G
R
a ser feita no comando, mudar de leia para escreva, dentro do lao para...fim_para. A
M
A
Vamos analisar o exemplo do pseudocdigo a seguir:

O

FIGURA 43 ESCRITA DE VETORES E

E
S
T
R
U
T
U
R
A

D
E

D
A
D
FONTE: Leite (2006) O
S
94 TPICO 1 UNIDADE 2

A escrita escreve sobre uma regio contnua de memria para o descritor de arquivo.
Todavia, um programa muitas vezes ir precisar escrever muitos itens de dados, cada um
residindo em uma diferente parte da memria. (MITCHELL; OLDHAM e SAMUEL 2001, p. 346).
Isso quer dizer que cada elemento possui como responsabilidade especificar ou identificar uma
regio da memria que ainda precisa ser escrita, esse processo pode ser feito declarando uma
varivel como struct iovec, se possuir a certeza do espaamento da regio que ir precisar,
caso contrrio, se o nmero de regies no for exata pode sofrer alteraes de tamanho,
possvel alocar um vetor de forma dinmica.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2 TPICO 1 95

RESUMO DO TPICO 1

Neste tpico vimos que:

Os caracteres podem ser definidos como dados primitivos, so encontrados na maioria dos
computadores, esto relacionados com a linguagem da mquina de um computador e essa
linguagem mquina permite a manipulao desses dados primitivos.

A definio de cadeia de caracteres formada por uma sequncia de caracteres, essas


cadeias de caracteres so ordenadas para que os dados possam ser manipulados pela cadeia
de caracteres, uma sequncia de bits de tamanho fixo considerada como um conjunto
codificado de caracteres.

Uma cadeia de carcter (string) composta por uma sequncia ordenada de smbolos, letras
e nmeros, como tambm so caracteres os espaos em branco, dgitos e pontos, essa
sequncia pode ser representada pelo ltimo carcter identificado como \0, so pertencentes L
I
dessa famlia de caracteres os smbolos \n e \t. N
G
U
A
As constantes do tipo caracteres so definidas como valores que pertencem a um programa G
de computadores. Esses valores no podem ser alterados durante a execuo do programa E
N
e so chamados de constantes. S

D
E
As variveis do tipo caracteres possuem a finalidade de realizar o armazenamento de letras
P
e smbolos, que podem estar dentro de um texto. Essas variveis so do tipo inteiros e R
O
armazenam nmeros que podem ser associados aos smbolos. G
R
A
Uma cadeia de caracteres possui sua formao atravs de operaes. Essas operaes so M
A
constitudas atravs de Atribuio, Concatenao, Referncia a Subcadeias e por Casamento

de Padres. O

E
O vetor considerado uma cadeia de caracteres, este considerado como um tipo de E
S
Char, o tipo char pode representar elementos de cadeia de caracteres e ser apontado para T
ponteiros tambm do tipo Char. R
U
T
U
Vetor unidimensional definido por ser composto por uma linha ordenada de elementos e que R
A
so um tipo de dado. Para iniciar, a lista segue uma sequncia crescente, como por exemplo,
D
primeiro, segundo e terceiro elemento e assim por diante. Os vetores unidimensionais E
realizam a leitura e escrita de vetores. A leitura de vetores possui como funo realizar a D
leitura dos elementos da estrutura de dados para a memria. A escrita de vetores por sua A
D
vez possui a responsabilidade de armazenar espao na memria para dados temporrios. O
S
Os dois utilizam o comando para...fim_para de estrutura de controle.
96 TPICO 1 UNIDADE 2


IDADE
ATIV
AUTO

1 As variveis do tipo caracteres, possuem como finalidade armazenar letras e smbolos,


estes esto acoplados dentro de um texto. As variveis so do tipo inteiros e com isso
armazenam os nmeros, para que estes possam ser associados aos smbolos. As
variveis do tipo carcter possuem algumas caractersticas bem importantes, como
realizar a atribuio de um valor para uma varivel. Analise as sentenas a seguir e
classifique V para as sentenas verdadeiras e F para as falsas.
( ) Utilizao de caracteres \n e \t.
( ) Utilizao de aspas simples ( ).
( ) Utilizao de aspas duplas ( ).
( ) Utilizao de caracteres \0.

Assinale a alternativa que apresenta a sequncia correta:


L
I a) ( ) V V F F.
N
G b) ( ) V F F V.
U
A c) ( ) F V V F.
G
E d) ( ) F F F F.
N
S

D
2 Strings so caracteres e possuem como funcionalidade representar os valores textuais,
E como por exemplo nome e endereos. Em uma linguagem de programao a string
P
R
compreendida por smbolos que esto codificados, e os valores de uma string
O devem ser escritos em uma sequncia lgica. Uma string pode realizar operaes
G
R com tratamentos como: pode ser escrita em ordem inversa; compara duas strings
A
M e retorna a juno das duas strings comparadas, com relao a essas operaes,
A
classifique V para as sentenas verdadeiras e F para as falsas.

O ( ) Comparao.
E ( ) Inverso.
E ( ) Concatenao.
S
T ( ) Compilao.
R
U
T
U Assinale a alternativa que apresenta a sequncia correta:
R
A a) ( ) V F F F.
D b) ( ) V V V F.
E
c) ( ) V V F V.
D
A d) ( ) F V V F.
D
O
S
UNIDADE 2

TPICO 2

TIPOS DE ESTRUTURA DE DADOS

1 INTRODUO

Os tipos de estruturas de dados precisam ser definidos, especficos e eficientes, pois


para cada linguagem de programao existe uma estrutura de dados apropriada. Isso tudo
pode ser definido conforme a necessidade do programa a ser desenvolvido, onde existe a
L
necessidade de definir as operaes para cada estrutura e que este processo seja eficiente. I
N
G
U
Uma caracterstica muito interessante da estrutura de dados se deve ao seu objetivo de A
G
analisar a melhor a forma de como organizar os dados, mtodos de armazenamento eficiente E
N
dos dados e quais cdigos e algoritmos so mais propcios para realizar as operaes de S
manipulao dos dados da estrutura. lgico que no existe um processo predefinido, pois D
E
cada programa e cada linguagem de programao possuem suas especificidades e suas
necessidades a serem atendidas. P
R
O
G
As estruturas de dados podem conter vrios tipos de aplicaes. Estas suportam e R
A
conseguem auxiliar os cdigos de programao, onde so fornecidos processos de estruturas M
A
como listas lineares, conjuntos de elementos e rvores, em que cada um desses elementos

realiza um processo, seja ele de organizar, armazenar ou de acessar os dados que precisam O

ser utilizados em uma estrutura de dados. E

E
S
O objetivo deste tpico de estudos levar a uma compreenso sobre alguns pontos T
R
muito importantes e pertinentes aos estudos das estruturas de dados. Os estudos se daro U
T
com os seguintes temas: Variveis do tipo Heterognea; Variveis do tipo Homognea; Arranjos U
R
Unidimensionais; Arranjos Multidimensionais; Ponteiro para estruturas; Operadores; Definio A

de novos tipos; Comando Typedef; Vetores de estruturas; Vetores de ponteiros para estruturas; D
E
Tipo unio e Tipo enumerao.
D
A
D
Vamos aos estudos! O
S
98 TPICO 2 UNIDADE 2

2 TIPOS ESTRUTURADOS

Estruturar dados que so muitas vezes muito complexos exige que alguns processos
sejam realizados. Como as informaes so compostas por vrios tipos de campos, devem
ser analisados, contudo, como se processam os mecanismos que possibilitam o agrupamento
de tipos distintos. A seguir vamos conhecer mais sobre como estruturar um tipo de dado.
Segundo Edelweiss e Galante (2009, p. 36), a representao dos dados manipulados por uma
aplicao pode ser feita por diferentes estruturas de dados. Um fator que determina o papel
dessas estruturas no processo de programao de aplicaes a identificao de quo bem
as estruturas de dados coincidem com o domnio do problema a ser tratado.

Conforme Pereira (1996, p. 5), os objetivos das estruturas de dados, podem ser
identificados como terico e prtico:

Terico: identificar e desenvolver modelos matemticos, determinando que


classes de problemas podem ser resolvidas com o uso deles.
Prtico: criar representaes concretas dos objetos e desenvolver rotinas
L capazes de atuar sobre estas representaes.
I
N
G
U
A
G
E
N
S 2.1 TIPO ESTRUTURA
D
E

P Um tipo estrutura de dados definido por conter vrios tipos de valores sua estrutura
R
O considerada muito bsica definida por ser um tipo de estrutura simples, tem como possibilidade
G
R
otimizar e dinamizar utilizao da memria de um programa de computador, disponibilizam
A
M
estruturas mais compreensveis para o desenvolvimento de programas mais complexos, isso
A

ocorre atravs da codificao dos dados da estrutura. Conforme Pereira (1996, p. 4)

O
a maioria das linguagens de programao modernas oferecem um conjunto
E bsico de tipos de dados primitivos (inteiro, real, caracteres e lgicos) que
E
podem ser usados para soluo de problemas em geral, bem como alguns
S mecanismos que permitem criar agrupamentos complexos de dados destes
T tipos primitivos (vetor, registro, unio, ponteiro).
R
U
T
U Na linguagem de programao C, um tipo de dado tambm composto por diversos
R
A valores e estes so de tipo simples, para entender melhor pode-se dizer: para que um programa
D possa manipular dois pontos diferentes isso deve ocorrer na declarao dos pontos, como x e
E
y, em que a linguagem C realiza o agrupamento de dados. Caso no se tenha essa opo de
D
A realizar o agrupamento dos dois componentes citados, os pontos teriam que ser representados
D
O
S
UNIDADE 2 TPICO 2 99

em duas variveis independentes. Vamos analisar no exemplo a seguir essa afirmao dos
dois pontos de forma agrupada:

struct ponto {
float x;
float y;
};

Neste exemplo demonstrado como realizado o agrupamento dos dados, dos dois
pontos x e y, os dois pontos so considerados como um tipo de varivel simples. Aps esse
agrupamento possvel acessar os valores pertencentes aos dois pontos declarados na
varivel, como tambm possvel acessar todos seus dados, como nome e endereos, entre
outros dados.

Um tipo de dado definido por ser um conjunto de valores e formado por um conjunto de
operaes. Os dados podem ser nmeros inteiros e esto presentes em vrias linguagens de
programao. Esses valores de tipo de dado que so nmeros inteiros podem ser representados
pelos seguintes nmeros, -2, -1, 0, 1, 2 e assim consequentemente. J os dados do tipo
L
operaes podem ser apresentados como uma sequncia muito grande de valores, mas as I
N
mais comuns so soma, diviso, multiplicao, subtrao entre outras operaes, que podem G
U
ser vrios tipos. A
G
E
N
Resumidamente, um tipo estruturado de dados possui como finalidade permitir que S
dados complexos sejam estruturados, com objetivo de compor todos os pontos, declarar seus D
E
valores e suas variveis, isso para diversos campos da estrutura. Como mencionado no exemplo
P
dos pontos, anteriormente, o tipo estrutura realiza o agrupamento de diversas variveis dentro R
O
de uma nica estrutura. Analise a seguir um exemplo de uma declarao de uma varivel do G
R
tipo ponto: A
M
A
struct ponto p;

p. x = 10.0; O

p. y = 5.0; E

E
S
T
Os elementos podem ser acessados atravs do operador de acesso ponto ( . ), onde: R
U
/* declara o ponto do tipo struct */; T
U
/* declara o p como sendo uma varivel do tipo struct ponto */; R
A
/* este acessa os elementos de ponto */;
D
E

Segundo Edelweiss e Galante (2009, p. 36), tipos de dados e estruturas de dados D


A
so considerados como semelhantes, no entanto, os significados de cada um so diferentes D
O
um do outro, conforme seguem as explicaes dessas diferenas: S
100 TPICO 2 UNIDADE 2

Um tipo de dado consiste da definio do conjunto de valores (denominado domnio) que uma
varivel pode assumir ao longo da execuo de um programa e do conjunto de operaes
que podem ser aplicados sobre ele.
Os tipos de dados estruturados permitem agregar mais do que um valor em uma varivel,
existindo uma relao estrutural entre seus elementos. Os principais tipos de dados
estruturados fornecidos pelas linguagens de programao so: arranjos, registros, sequncias
e conjuntos.

Ainda conforme Edelweiss e Galante (2009, p. 36), existem os tipos de dados bsicos
e os tipos de dados definidos pelo usurio, vamos analisar os dois tipos a seguir:

Os tipos de dados bsicos, tambm denominados tipos primitivos, no pos-


suem uma estrutura sobre seus valores, ou seja, no possvel decompor o
tipo primitivo em partes menores. Os tipos bsicos so, portanto, indivisveis.
Os tipos de dados definidos pelo usurio so tambm tipos de dados es-
truturados, construdos hierarquicamente atravs de componentes, os quais
so de fato tipos de dados primitivos e/ou estruturados. Um tipo definido pelo
usurio constitudo por um conjunto de componentes, que podem ser de
tipos diferentes, agrupados sob um nico nome.

L
I
N
G
U 2.1.1 Variveis do tipo heterognea
A
G
E
N
S
Variveis do tipo heterognea so do tipo estruturado, so definidas por serem elementos
de tipos diferentes, os elementos que so do tipo estrutura de dados so heterogneos, este
D
E conjunto de elementos que no so do mesmo tipo de dados, podem ser conhecidos como um
P registro. Vamos analisar o seguinte exemplo: uma pessoa precisa comprar uma passagem de
R
O nibus e precisa saber algumas informaes referente: qual ser o nmero da passagem, origem
G
R e destino, data, horrio de sada e chegada, nmero da poltrona, idade do viajante e nome
A
M do passageiro. Berg e Figueir (2006, p. 149), apresentam as variveis do tipo heterogneas
A
so um conjunto de dados, onde os elementos no so do mesmo tipo de dados. Segundo

O Aguilar (2011, p. 246), um registro uma estrutura de dados heterognea, o que significa que
E cada um de seus componentes pode ser de tipos de dados diferentes. Consequentemente um
E arranjo de registros uma estrutura de dados cujos elementos so do mesmo tipo heterogneo.
S
T
R
U Podemos considerar cada um desses dados como Campos, os dados so os seguintes:
T
U nmero de passagem um dado (inteiro), origem e destino so (caracteres), data e horrio
R
A so (caracteres), nmero da poltrona e idade so do tipo (inteiro) e por ltimo o nome do
D passageiro um dado (carcter).
E

D
A
D
O
S
UNIDADE 2 TPICO 2 101

FIGURA 44 REGISTRO DE VARIVEIS DO TIPO HETEROGNEA

FONTE: Frozza (2014)

2.1.2 Variveis do tipo homognea

Variveis do tipo homognea tambm so do tipo estruturado, no entanto, sua definio


em relao aos elementos de que esses elementos podem ser do mesmo tipo, elementos
como vetores e matrizes so do tipo homogneas. As variveis Compostas Homogneas so
alocadas em posies na memria de um programa, essas posies so identificadas atravs
de um nico nome do dado, podem ser definidas por serem individualizadas atravs de ndices, L
I
seus dados so do mesmo tipo de elementos. Segundo Aguilar (2011, p. 246), um arranjo N
G
uma estrutura de dados homognea, o que significa que cada um dos seus componentes deve U
A
ser do mesmo tipo de dado. Berg e Figueir (2006) apresentam que um conjunto homogneo G
E
de dados composto por variveis do tipo primitivo. N
S

D
Como o exemplo a seguir: E

P
Notas: 6,0 5,0 4,5 9,0 10 7,0 2,0 8,0 3.5 R
O
Posio: 0 1 2 3 4 5 6 7 8 G
R
A
M
Pode ser percebido que a posio o ndice e as notas so os elementos que so A

individuais, para cada aluno, mas na estrutura de dados cada elemento est inserido em um
O
ndice, at mesmo para que o programa esteja organizado e que se tenha facilidade em uma
E
determinada busca de dados ou de elementos.
E
S
T
R
U
T
U
R
2.1.3 Arranjos unidimensionais A

D
E
Os arranjos unidimensionais so definidos por serem utilizados para armazenar vrios D
A
conjuntos de dados, em que esses dados so elementos que esto diretamente endereados D
O
para um nico ndice de elementos. Os arranjos unidimensionais tambm so conhecidos S
102 TPICO 2 UNIDADE 2

como vetores. Edelweiss e Galante (2014, p. 165) dizem um vetor um arranjo de uma s
dimenso que, portanto, necessita um s ndice para acessar seus elementos.
As caractersticas de um vetor so:

nome, comum a todos os elementos;


ndice que identificam, de modo nico, a posio dos elementos dentro do vetor;
tipo dos elementos (inteiros, reais, entre outros), comum a todos os elementos do vetor;
contedo de cada elemento do vetor.

Este arranjo possui como finalidade armazenar elementos de dados em uma memria de
computador, no entanto, esses elementos so armazenados de forma organizada, seguindo um
armazenamento em sequncia crescente, onde um elemento organizado e armazenado aps
o outro. Conforme Edelweiss e Galante (2014, p. 165), os arranjos podem ser unidimensionais
(de uma s dimenso), quando precisam de um s ndice para identificar seus elementos, os
arranjos de uma nica dimenso tambm so chamados de vetores.

Outra caracterstica deste arranjo que o armazenamento realizado atravs de um


nico identificador e possui a capacidade de guardar somente um valor, como tambm podem
L ser acessados seus elementos de forma aleatria. Ele possui outras caractersticas que o
I
N definem como:
G
U
A
G Seus valores so do mesmo tipo de dado.
E
N Possui vrios tipos de valores definidos.
S
identificado por um nico nome como uma varivel.
D
E Os valores podem ser acessados de forma aleatria.
P Seus elementos e dados podem ser armazenados e acessados de forma aleatria.
R
O
G
R Vamos analisar o exemplo a seguir que demonstra um nico identificador, para uma
A
M estrutura de dados. Neste exemplo ser trabalhada a altura de pessoas:
A

Valores: 1,60 1,80 1,65 2,00 2,05 1,76


O
ndices: 0 1 2 3 4 5
E

E
S
T Podemos perceber que os valores correspondem aos dados de altura das 5 pessoas,
R
U so contedos lidos do usurio. No item ndices apresentada a ordem crescente de forma
T
U organizada, como os valores esto armazenados e como podem ser acessados e manipulados
R
A pelo ndice.
D
E
Para otimizar e solucionar problemas de clculos de razes, vrios mtodos numricos
D
A diretos esto disponveis para auxiliar arranjos unidimensionais, Chapra (2012), apresenta
D
O como os problemas unidimensionais envolvem funes que dependem de uma nica varivel
S
UNIDADE 2 TPICO 2 103

dependente. Vamos analisar a figura a seguir que demonstra um arranjo unidimensional


otimizando os problemas das funes:

FIGURA 45 OTIMIZAO DO ARRANJO UNIDIMENSIONAL

FONTE: Chapa (2012)


L
Pode ser percebido na imagem a cima que para resolver os problemas de otimizao I
N
das funes unidimensionais, a otimizao oscila entre picos, subindo e descendo maximizando G
U
a eficincia dos arranjos e minimizando os problemas das funes. A
G
E
N
S

D
UNI E

P
R
VOC SABIA QUE: O
Os arranjos em Java so unidimensionais: usa-se um G
nico ndice para acessar cada clula do arranjo. Apesar disso, R
A
existe uma maneira de definir arranjos de duas dimenses M
em Java pode-se criar um arranjo de duas dimenses como A
um arranjo de arranjos. Isto , pode-se definir um arranjo

bidimensional como sendo um arranjo em que cada uma de suas O
clulas outro arranjo. Tal arranjo bidimensional por vezes
chamado de matriz. (GOODRICH e TAMASSIA, 2002, p. 116). E

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
104 TPICO 2 UNIDADE 2

2.1.4 Arranjos multidimensionais

Os arranjos multidimensionais tambm possuem a funcionalidade de armazenar vrios


tipos de conjuntos de dados, com a diferena que esses conjuntos de dados precisam que os
elementos sejam endereados para mais de um ndice de elementos. Conforme Edelweiss e
Galante (2014, p. 165), os arranjos podem ser multidimensionais (de duas ou mais dimenses),
tambm so chamados de matrizes.

As matrizes podem ter duas ou mais dimenses, embora a grande maioria dos
problemas no envolva mais do que trs ou quatro. O nmero de dimenses de
uma matriz dever ser definido em funo das necessidades do problema que
est sendo analisado e das limitaes eventuais da linguagem em uso. Isso
porque, embora teoricamente no exista limitao para o nmero de dimen-
ses de uma matriz, uma implementao particular de uma linguagem pode
definir um limite para esse nmero. (EDELWEISS e GALANTE 2014, p. 165).

Uma caracterstica muito interessante deste arranjo e que seus dados podem
ser agrupados em diferentes direes, como sua varivel possui um nico nome denominado
L para o conjunto de dados, precisa-se realizar a diferenciao de um elemento do outro, esse
I
N procedimento pode ser realizado atravs de um ndice que seja associado ao conjunto de
G
U dados desses elementos.
A
G
E
N
S FIGURA 46 ARRANJOS MULTIDIMENSIONAI
D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U FONTE: A autora
R
A

D A diferenciao dos arranjos multidimensionais pode ser percebida no exemplo anterior,


E
onde cada elemento est disposto em linhas ou colunas, ordenados de forma organizada e
D
A
sequencial.
D
O
S No arranjo multidimensional tambm podem ser encontrados problemas de otimizao.
UNIDADE 2 TPICO 2 105

Os problemas multidimensionais envolvem funes que dependem de duas


ou mais variveis dependentes, da mesma forma que o arranjo unidimensio-
nal, este possui a mesma lgica para solucionar os problemas de otimizao,
seguindo o fluxo que oscila entre o mnimo e mximo, fazendo com que os
problemas de otimizao sejam diminudos. (CHAPRA 2012, p. 185).

Segundo o referido autor, do mesmo modo como uma trilha real no se limita a andar
em uma nica direo; em vez disso, a topografia deve ser examinada a fim de se alcanar a
meta de forma eficiente. Vamos analisar a seguir o exemplo da otimizao multidimensional:

FIGURA 47 OTIMIZAO DO ARRANJO MULTIDIMENSIONAL

L
I
N
G
U
A
G
E
N
S
FONTE: Chapa (2012)
D
E
Como j mencionado anteriormente, para solucionar problemas de funes a lgica P
segue a mesma do arranjo unidimensional. O arranjo multidimensional realiza o mesmo R
O
processo de otimizao oscilando entre picos, subindo e descendo, maximizando a eficincia G
R
dos arranjos e minimizando os problemas das funes. Chapra deixa claro, na figura anterior, A
M
como pode ser observada a otimizao e demonstra como pode ser utilizada para representar A

a maximizao (os contornos aumentam em elevao at o mximo, como em uma montanha)
O
ou a minimizao (os contornos decrescem em elevao at o mnimo, como em um vale).
E

E
S
T
R
U
T
2. 2 PONTEIRO PARA ESTRUTURAS U
R
A

D
Ponteiros so definidos como variveis e possuem a responsabilidade de armazenar E
endereos na memria de um programa de computador. Ao realizar o processo de D
A
armazenamento de endereos na memria do programa possvel que sejam includos valores, D
O
bem como, tambm, podem ser utilizados. No entanto esse processo no apenas armazenar S
106 TPICO 2 UNIDADE 2

ou gravar um endereo na memria, para que isso ocorra existe a necessidade de se fazer a
declarao de um ponteiro, para que realize este armazenamento do endereo. Brookshear
(2013, p. 313) apresenta:

um ponteiro como uma rea de armazenamento que contm um desses


endereos codificados. No caso de estruturas de dados os ponteiros so
usados para gravar a posio na qual os itens de dados esto armazenados.
Por exemplo, se precisssemos mover repetidamente um item de dados de
uma posio para outra, poderamos designar uma posio fixa para servir
como um ponteiro. Ento, cada vez que movssemos um item, poderamos
atualizar o ponteiro para refletir o novo endereo dos dados. Posteriormente,
quando precisssemos acessar o item de dados, poderamos encontr-lo por
meio do ponteiro. Na verdade, o ponteiro sempre apontar para os dados.

O ponteiro, tambm conhecido como apontador, e definido por ser uma varivel
que possui como uma de suas principais finalidades armazenar endereo na memria de um
programa, tendo como caractersticas em suas essenciais funcionalidades apontar e acessar
a posio, o endereo que a varivel est armazenada, apontar para as variveis que esto
alocadas e declaradas, sua associao sempre em relao ao tipo da varivel que se est
apontando.

L
I
Para que dados e informaes possam sem encontrados em uma lista enorme de dados,
N
G
possvel, segundo Brookshear (2013, p. 313),
U
A
G reservar uma clula de memria adicional, dentro de cada bloco de clulas
E como ponteiros, onde esses ponteiros sero apontados para outros blocos,
N estes representam um livro do mesmo autor. Com isso os livros com os mesmos
S
autores, mas com temas diferentes em comum podem tornar-se interligados
D com setas de identificao.
E

P
R Vamos analisar a figura a seguir, que representa esta funcionalidade do ponteiro.
O
G
R
A
M FIGURA 48 PONTEIROS INTERLIGADOS
A

E
S
T
R
U
T
U
R
A

D
E FONTE: Brookshear (2013)

D
A
D O ponteiro pode apontar para uma estrutura. Pode-se declarar um ponteiro para uma
O
S estrutura tal como se declara um ponteiro para qualquer outro objeto. Declara-se um ponteiro:
UNIDADE 2 TPICO 2 107

especificando um ponteiro em lugar do nome da varivel estrutura. (AGUILAR, 2011, p. 330).


Ao realizar a declarao do ponteiro, tambm so indicados ao compilador a quantidade de
espao da memria que se necessita fazer o armazenamento dos valores. Aps realizar esses
procedimentos de declarar o ponteiro e indicar para o compilador o espao necessrio na
memria, uma varivel identificada como tipo ponteiro, ser apontada para uma varivel que
est identificada como tipo (char, int, float e double).

Uma caracterstica muito interessante que deve ser observada ao realizar a declarao
de um ponteiro : precisa-se especificar para qual localizao e qual tipo de varivel que este
ponteiro ser apontado. Geralmente, os ponteiros so declarados atravs do seguinte operador
( * ), utilizado antes do nome da varivel ao qual dever ser apontado. Podemos citar como
exemplo deste comando de declarao de ponteiro:

Tipo *nomeVariavel;

Outro exemplo:

Int *aux; L
I
Float *temp; N
Char *pont; G
U
A
G
E
N
Essas variveis, como aux, temp e pont, realizam o procedimento de armazenar os S
endereos na memria do programa, pois esto utilizando o operador ( * ) para apontar para D
E
a varivel. Vamos analisar a figura a seguir que trata essas variveis:
P
R
FIGURA 49 PONTEIROS O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E
Fonte: Almeida (2013)
D
A
D
Analisando a figura possvel verificar que as variveis do tipo aux, temp e pont, realizam O
S
108 TPICO 2 UNIDADE 2

o armazenamento dos endereos na memria do programa, lembrando que isso necessrio,


pois ao declarar as variveis possvel identificar o espao necessrio que essas variveis
vo ocupar no programa, um fator muito importante para o desenvolvimento de programas. O
operador ( * ) utilizado para identificar e acessar a posio de memria da varivel, observando
que a posio da varivel que deve ser acessada e no o endereo da memria.

Os ponteiros possuem algumas vantagens muito interessantes e importantes, como


possibilitam que se tenha passagem para os parmetros de funes por referncia, alm de
alocar endereo na memria, tambm possui a finalidade de liberar espao na memria do
programa e este processo ocorre de forma dinmica, durante a execuo do programa que
est sendo utilizado, outra vantagem que muito importante no processo de um ponteiro
que o mesmo permite que sejam implementadas de forma eficaz e dinmica novas estruturas
de dados.

2.2.1 Operadores

L
I
N O significado de um operador uma operao que realiza e tipo de resultado
G
U depende dos tipos dos seus operandos. At que se conhea o tipo de operando(s), no se
A
G pode conhecer o significado da expresso. (AGUILAR 2008, p. 12). Os ponteiros possuem os
E
N seguintes operadores utilizados para realizar a declarao das variveis, so: ( * , & e Null). O
S
operador ( * ) possui como finalidade apontar a varivel para um ponteiro, bem como realizar
D
E
a recuperao de contedo das variveis declaradas. O operador ( & ) tem a funcionalidade

P
de indicar que um ponteiro poder apenas receber endereos de memria, esta sua nica
R
O
e principal funo para um operador. O operador Nulo (Null) possui como funcionalidade
G receber valores dele mesmo, valores nulos, no entanto, esses valores no sero apontados
R
A para nenhuma varivel na memria.
M
A

Especificamente o operador ( * ) realiza as seguintes funes:


O
preferenciamento da varivel;
E
armazenar atravs de;
E
S apontar uma varivel para um ponteiro.
T
R
U
T O ponteiro ( & ) possui as seguintes funcionalidades:
U
R identificar o endereo da memria;
A
armazenar um endereo na memria.
D
E

D A seguir a figura demonstra esses dois operadores, que possuem grande importncia
A
D para a definio dos ponteiros e para a declarao das variveis:
O
S
UNIDADE 2 TPICO 2 109

FIGURA 50 OPERADORES DE PONTEIROS

FONTE: Almeida (2013)

Conforme Pinheiro (2012, p. 112), os operadores podem ser classificados quanto ao


nmero de operadores em unrios, binrios e ternrios. Os operadores unrios requerem um
operador, os binrios, dois e os ternrios, trs nmeros. Podem existir operadores que realizam
operaes com quatro, cinco ou mais operaes. Uma caracterstica interessante do operador
que ele avaliado pelas operaes, pode resultar em um valor especfico para a funo. L
I
Ainda segundo o autor: N
G
U
a notao utilizada para representar uma operao pode ser classificada como: A
G
prefixada, se o operador ocorre antes dos operandos; E
ps-fixada, se o operador ocorre aps os operandos; N
infixada, se o operador ocorre entre os operandos. S

D
E
Um operador nada mais do que expresses, caracteres e vrios jarges da linguagem
P
de programao, que so considerados como valores e podem ser utilizados para realizar a R
O
alimentao dos operadores. Podemos encontrar vrios tipos de operadores e cada um possui G
R
sua finalidade e especificidade. A seguir vamos listar cada um desses operadores, para que A
M
tenha uma noo de quais so eles: A

Operadores Aritmticos.
O
Operadores Bit a Bit.
E
Operadores de Comparao.
E
Operadores de Controle de erro. S
T
Operadores de Execuo. R
U
Operadores de Incremento/Decremento. T
U
Operadores Lgicos. R
A
Operadores de String.
D
Operadores de Arrays. E
Operadores de Tipo. D
A
D
O
S
110 TPICO 2 UNIDADE 2

UNI
Acesse o Link a seguir e saiba mais sobre cada um desses
operadores: <http://php.net/manual/pt_BR/language.operators.
php>.

2.3 DEFINIO DE NOVOS TIPOS

Na linguagem de programao C possvel realizar a soma de dois nmeros inteiros,


somando as duas fraes seguindo as funes com parmetros, utilizando os novos tipos
de dados, que so a base do tipo de dados primitivos, como o char, int, float e double, esses
tipos de dados primitivos tambm so conhecidos como tipos estruturados. Lembrando que
um tipo estruturado de dado uma varivel que foi declarada e definida pelo usurio, levando
em considerao que as variveis fazem parte da estrutura de dados.

L
I
Um benefcio dos objetos que eles oferecem ao programador uma forma conveniente
N de construir novos tipos de dados. Suponha que voc necessite trabalhar com coordenadas
G
U x e y (par de quantidades numricas independentes) no seu programa. Seria interessante
A
G expressar operaes sobre esses valores simplesmente usando operaes aritmticas
E
N normais, como:
S

D posio1 = posio2 + origem


E

P
R Onde essas variveis posio1, posio2 e origem representam as coordenadas.
O
G
R FONTE: Filho (2011, p. 11)
A
M
A

O perceptvel que ao criarmos essa classe, como no exemplo do autor anteriormente


E mencionado, esta classe realiza a funo de incorporar esses dois valores que esto declarados,
E como posio1, posio2 e origem e os torne como objetos dessa classe. Com isso pode-se
S
T dizer que estamos criando um novo tipo de dado.
R
U
T
U Para ser desenvolvida uma estrutura de dados, formada por vrios tipos de variveis
R
A necessrio que seja utilizado o comando Struct, utilizando essa palavra (comando) possvel
D declarar um novo tipo de dado. O comando Struct definido por ser um tipo de dado, formado
E
por nmeros Int e Float, onde cada membro declarado entre ( [ ] ), como tambm essa
D
A declarao terminada em ( ;). Quando realizada a declarao de uma estrutura, os campos
D
O
dessa estrutura no podem em situao alguma ser inicializados, pois para que isso acontea
S
UNIDADE 2 TPICO 2 111

precisa ser alocado espao na memria do programa. Aps realizar o procedimento de declarar
um novo tipo de dado, podem ser criadas novas variveis, que sirvam para armazenar valores
e conjuntos de dados.

Um struct um tipo de dado composto por um conjunto de outros tipos e dados.


Struct possui um tamanho fixo. Os atributos de um struct so acessados usando
a sintaxe <struct>.<nome do atributo> (tambm conhecido como notao de
pontos). Atributos struct so armazenados na memria na mesma ordem em
que aparecem no cdigo. Voc pode alinhar structs. Se utilizar typedef com
um struct, no precisa dar um nome ao struct. (GRIFFITHS e GRIFFITHS,
2013, p. 235).

Como o objetivo da estrutura agrupar vrios tipos de variveis em uma nica varivel,
esse processo possibilita otimizar toda a estrutura de dados existente. Vamos analisar na figura
a seguir o procedimento para se criar uma estrutura utilizando o comando Struct:

FIGURA 51 COMANDO STRUCT

L
I
N
G
U
A
G
E
N
S

D
E

P
R
FONTE: Melo (2014) O
G
R
Vamos analisar nas figuras a seguir como so definidos os novos tipos de dados: A
M
A
FIGURA 52 DEFININDO OS NOVOS TIPOS DE DADOS

O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S

FONTE: Melo (2014)


112 TPICO 2 UNIDADE 2

Agora, vamos analisar o procedimento de como acessar os campos de uma estrutura


de dados, para que isso ocorra existe a necessidade de adicionar o smbolo ( . ), para assim
separar o nome da varivel, conforme exemplo a seguir:

FIGURA 53 ACESSANDO OS NOVOS TIPOS DE DADOS

FONTE: Melo (2014)


L
I
N
G Para que um novo tipo de dado seja definido preciso informar para o compilador
U
A
do programa os seguintes dados: nome; tamanho do dado; procedimento de como deve ser
G
E
armazenado e procedimento de como recuperar os dados na memria do programa. Com
N
S
este processo de definir o novo tipo de dado, pode-se afirmar que este novo tipo agora existe

D
e pode ser utilizado para criar variveis que so denominadas como similares, como tipos de
E variveis do tipo simples.
P
R
O
G
R
A
M
A 2.3.1 Comando typedef

E Antes de iniciarmos a definio sobre o comando C, vamos analisar tambm a definio


E de uma declarao typedef. Segundo Cocian (2004, p. 202):
S
T
R Uma declarao typedef uma declarao que usa keyword typedef como
U classe de armazenamento. O declarador aparecer como sendo um novo tipo
T
U de dado. Pode utilizar as declaraes typedef para construir tipos com nome
R menores ou mais significativos, para tipos previamente definidos pela linguagem
A ou para novos tipos que se desejam criar. Os nomes typedef permitem encap-
D sular detalhes de implementao que podem mudar. importante notar, que
E uma declarao typedef no cria tipos. Ele cria sinnimos para tipos existentes,
ou nomes para tipos que possam ser especificados de maneiras diferentes.
D
A Quando um nome typedef utilizado como um especificador de tipo, ele pode
D ser combinado como um certo tipo de especificadores, mas no com todos.
O
S
UNIDADE 2 TPICO 2 113

Este comando denominado de typedef possui a finalidade de definir que um novo


nome seja atribudo para um determinado tipo de dado, como mencionado, sua funo no
produzir ou criar novos tipos de dados, mas sim definir novos nomes, sinnimos e at mesmo
pode-se dizer apelidos para os tipos de dados j existentes e pr-definidos em uma estrutura.
Geralmente podemos utilizar seu formato geral, conforme exemplo a seguir:

FIGURA 54 COMANDO typedef

FONTE: A autora

Segundo Cocian (2004), o comando typedef permite ao programador definir um novo


nome para um determinado tipo de dado. O comado typedef pode ser utilizado para dar nome
a tipos complexos, como as estruturas.

2.4 VETORES DE ESTRUTURAS


L
I
N
G
Os vetores de estruturas podem ser definidos, ou at mesmo de forma mais especfica, U
A
podemos afirmar que podem ser identificados como um vetor onde seus elementos apontam G
E
para dados do tipo struct, esses elementos tambm podem ser definidos como ndices, pois N
S
os vetores, como j estudados anteriormente, so dados armazenados e organizados em uma
D
sequncia ou ndice de dados. Voltando ao contexto dos vetores de estruturas, seu acesso E
ocorre atravs do ndice. Este ndice encontra-se entre colchetes, como aps os colchetes P
pode ser encontrado o nome do vetor, posteriormente o mesmo seguido pelo operador ( . ), R
O
como tambm o nome do campo da estrutura de dados. G
R
A
M
Para iniciar o acesso ao ndice, onde pode ser realizado com a delimitao do contedo A

do vetor, com a utilizao do par de chaves { }, esse procedimento ocorre da mesma forma
O
com o contedo que ser atribudo para cada posio do vetor. Com relao aos valores do
E
vetor, cada um dos membros precisa seguir e respeitar a ordem ou os ndices que j esto
E
declarados e separados por vrgula, dentro da estrutura de dados. Vamos analisar a seguir um S
T
exemplo de um vetor de estrutura: R
U
T
struct aluno U
R
{ A

char nome [80]; D


E
int matricula;
D
} faculdade [10]; A
D
O
S
114 TPICO 2 UNIDADE 2

2.5 VETORES DE PONTEIROS PARA ESTRUTURAS

possvel utilizar vetores de ponteiros para que seja possvel tratar vrios conjuntos
de elementos e estes possuem como especificidade serem complexos, lembrando que vetores
so considerados uma sequncia de valores e estes valores so do mesmo tipo de dado, como
so alocados e armazenados em uma sequncia organizada na memria do programa.

Como j mencionado anteriormente os vetores de ponteiros para estrutura so muito


teis quando existe a necessidade de tratar conjuntos de elementos que so considerados
complexos. Um exemplo complexo uma tabela de alunos, onde:

Matricula: nmero inteiro ;


Nome: cadeia com 80 caracteres ;
Endereo: cadeia com 120 caracteres ;
Telefone: cadeia com 20 caracteres ;
m C podemos representar aluno:
L FONTE: Garcia (2010)
I
N
G
U Para representar esses conjuntos de elementos na linguagem C, o exemplo dessa
A
G tabela alunos, ficaria da seguinte forma:
E
N
S
FIGURA 55 VETOR DE CADEIA DE CARACTERES
D
E

P
R
O
G
R
A
M
A

E FONTE: Garcia (2010)


E
S
T Lima (2014) sugere duas solues para a tabela de alunos, na primeira:
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2 TPICO 2 115

FIGURA 56 SOLUO 1 TABELA ALUNO

FONTE: Lima (2014)

No segundo exemplo, podemos observar a seguinte soluo:


L
FIGURA 57 SOLUO 2 TABELA ALUNO I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
FONTE: Lima (2014) R
U
T
U
Esses exemplos apresentam a necessidade de definir o nmero mximo de alunos R
A
para o vetor, esse procedimento auxilia para se saber e at mesmo para alocar o espao
D
necessrio na memria desses dados no vetor, para que a memria seja utilizada de forma E

dinmica e eficiente. D
A
D
O
S
116 TPICO 2 UNIDADE 2

2.5.1 Funes de vetores de ponteiros para estruturas

Podemos afirmar que os vetores de ponteiros para estruturas possuem vrias funes,
alm de alocar memria para um vetor, vamos apresentar a seguir algumas funes que fazem
parte dos vetores de ponteiros, como:

Funo Inicializa.
Funo Preenche.
Funo Retira.
Funo Imprime.

Vamos apresentar primeiramente a Funo Inicializa. Ela possui a funo de iniciar


a tabela, como no exemplo anterior, tabela de alunos. Esta funo ir realizar os seguintes
procedimentos para executar a funo inicializar, que recebe um vetor de ponteiros. Outra
funcionalidade atribuir um valor Null para todos os elementos da tabela. Vamos analisar o
exemplo.
L
I
N
G
U FIGURA 58 FUNO INICIALIZA
A
G
E
N
S

D
E

P
R
O
G
R
A FONTE: Lima (2014)
M
A

A Funo Preencher possui a principal funcionalidade de iniciar a tabela, como j


O
foi dito, podemos citar como exemplo a tabela de alunos. Esta funo ocorrer atravs do
E
recebimento da posio do local em que os dados sero armazenados, a funo ir analisar
E
S se a posio na tabela est vazia, a funo ir criar a alocao de uma nova estrutura, caso
T
R contrrio, a prpria funo atualiza a estrutura que est apontada pelo ponteiro. Vamos analisar
U
T o exemplo a seguir, com relao ao funcionamento desta funo:
U
R
A

D
E

D
A
D
O
S
UNIDADE 2 TPICO 2 117

FIGURA 59 FUNO PREENCHE

FONTE: Lima (2014)

Na Funo Retira, a principal funcionalidade remover os dados dos vetores, como


no exemplo anterior, falamos da tabela de alunos, esta funo ir realizar o procedimento de
preencher, como tambm armazenar dados de um novo aluno na tabela. L
I
N
G
U
FIGURA 60 FUNO RETIRA A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
FONTE: Lima (2014) T
R
U
E por ltimo, mas no menos importante, a Funo Imprime possui como principal T
U
funo imprimir os dados de um aluno que est alocado na tabela, onde a funo recebe qual R
A
a posio do aluno na tabela e depois realiza a impresso dos dados desse aluno. A seguir
D
vamos analisar o exemplo desta funo: E

D
A
D
O
S
118 TPICO 2 UNIDADE 2

FIGURA 61 FUNO IMPRIME

FONTE: Lima (2014)

L A funo Imprimi, tambm, possui a disponibilidade de realizar a impresso de toda a


I
N tabela, com a Funo Imprime Tudo, em que a funo recebe o tamanho dos dados existentes
G
U na tabela e realiza a impresso de todos os alunos e seus dados.
A
G
E
N
S FIGURA 62 FUNO IMPRIME TUDO
D
E

P
R
O
G
R
A
M
A

E
S
T
R
FONTE: Lima (2014)
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2 TPICO 2 119

2.6 TIPO UNIO

Um tipo estruturado de unio possui como funcionalidade armazenar valores que so


considerados como valores heterogneos, realiza o armazenamento desses valores em um
nico espao na memria do programa. Conforme Aguilar (2011, p. 302), o tipo de dado
unio similar a struct, de maneira que uma coleo de membros dados de tipos diferentes
ou semelhantes. Uma observao deve ser levada em considerao quando for realizar o
armazenamento, pois apenas um nico elemento de unio pode estar armazenado na memria,
pois cada vez que um processo de atribuio realizado para um campo da unio, este por
sua vez subscreve os valores que j estavam armazenados anteriormente e atribudos para os
campos j armazenados. A definio de um tipo de estrutura de unio pode ser dada atravs
do seguinte comando:

union exemplo {
int i ;
char c ;
L
} I
N
G
U
A declarao de uma varivel do tipo de estrutura Unio pode ser declarada com o A
G
seguinte comando: E
N
S

D
union exemplo v ; E

P
R
Observando que esta estrutura de cdigo no possui a funo de declarar as variveis O
G
da estrutura e dados, mas sim possui a funo de definir o tipo de estrutura de unio. R
A
M
A
FIGURA 63 FUNO UNIO

O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
FONTE: Garcia (2010) S
120 TPICO 2 UNIDADE 2

Segundo Aguilar (2011, p. 298), as unies declaradas com a palavra reservada union
armazenam tambm membros mltiplos em um pacote; no obstante, em vez de localizar seus
membros um trs do outro em uma unio.

2.7 TIPO ENUMERAO

O tipo estruturado de enumerao possui como finalidade especificar os valores do qual


uma varivel do seu tipo pode possuir, formado por um conjunto de constantes inteiros, com
nomes que identificam as variveis. Segundo Cocian (2004, p. 385), em uma enumerao
pode-se indicar ao compilador quais os valores que uma determinada varivel pode assumir.
O tipo estrutura de enumerao um procedimento que organiza todos os valores de uma
constante. Quando so criados valores do tipo booleano, as variveis deste tipo podem receber
os valores da seguinte forma: 0 (FALSE) ou 1 (TRUE). Vamos analisar a seguir um exemplo
de duas constantes que esto simbolicamente dissociadas e utilizam um valor inteiro, em que
o mesmo poder representar o tipo booleano, com os valores FALSE e TRUE.

L
I
N
#define FALSE 0
G #define TRUE 1
U
A typedef int Bool;
G
E /* pode armazenar qualquer inteiro*/
N
S

D
E Com relao ao exemplo anterior pode ser percebido que com as definies de FALSE
P e TRUE, possvel utilizar esses smbolos no cdigo do programa, que tornam mais claro
R
O o processo de armazenar os nmeros inteiros, observando que o tipo booleano pode ser
G
R equivalente a qualquer nmero, no apenas FALSE e TRUE.
A
M
A
Vamos analisar o exemplo a seguir, com relao criao de um tipo booleano, utilizando

O o tipo estrutura de enumerao:


E
FIGURA 64 TIPO BOOLEANO
E
S
T
R
U
T
U
R
A

D
E

D
A
FONTE: Garcia (2010)
D
O
S
UNIDADE 2 TPICO 2 121

O exemplo anterior representa o comando de criao do tipo booleano, usando o tipo


estrutura de enumerao, em que os valores so atribudos, seguindo uma ordem em que os
elementos foram definidos para o tipo enumerao.

LEITURA COMPLEMENTAR

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O
FONTE: PINHEIRO, Francisco A. C. Elementos de Programao em C. Porto Alegre: Ed. E
Bookman, 2012
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
122 TPICO 2 UNIDADE 2

RESUMO DO TPICO 2

Neste tpico vimos:

Os tipos de estruturas de dados possuem a responsabilidade de estruturar o processo de


programao de aplicaes, para que essas estruturas contenham um domnio dos dados
que necessitam ser tratados, identificados, declarados e armazenados.

O tipo de estrutura formado por vrios tipos de valores, sua estrutura definida como um
tipo simples, com isso objetiva otimizar e dinamizar espaos na memria de um programa
de computador. Ao realizar a codificao de dados, a estrutura torna compreensvel o
desenvolvimento de programas que so considerados mais complexos.

Os elementos do tipo estrutura de dados so denominados variveis do tipo heterognea,


L as variveis do tipo heterognea possuem seus elementos de tipo diferente. As variveis
I
N do topo homognea so consideradas como um tipo estruturado e ao contrrio do anterior,
G
U
seus elementos podem ser definidos como elementos do mesmo tipo. Os elementos como
A
G
os vetores e matrizes so do tipo homognea.
E
N
S Os arranjos unidimensionais so utilizados para armazenar conjuntos de dados, em que
D esses dados so identificados como elementos e esto diretamente endereados para um
E
nico ndice de elementos. Os arranjos multidimensionais possuem como objetivo armazenar
P
R tambm vrios tipos de conjuntos de dados, no entanto devem estar endereados para mais
O
G de um ndice de elementos.
R
A
M
A Um operador identificado pelo elemento ( ). Possui como objetivo realizar a operao de

um tipo de resultado, enquanto no se conhece o topo do operador, no se pode conhecer


O
o significado da expresso.
E

E
S Vetores de ponteiros para estruturas so utilizados para tratar vrios tipos de conjunto de
T
R elementos, principalmente conjunto de elementos que possuem sua estrutura muito complexa
U
T de ser especificada.
U
R
A
Funes de vetores de ponteiros para estruturas possuem como funcionalidade alocar
D
E memria de um vetor para uma estrutura de ponteiros, realiza outros processos como: funo
D inicializa, funo preenche, funo retira, funo imprime.
A
D
O
S Tipo de estrutura de unio realiza o armazenamento de valores e estes so considerados
UNIDADE 2 TPICO 2 123

como valores heterogneos, o armazenamento dos valores so alocados em um nico


espao na memria do programa. Tipo estruturado de enumerao realiza a especificao
dos valores, que uma varivel do tipo deve obter, formado por um conjunto de constantes
inteiros, so identificados com nomes nas variveis, organizam a enumerao para organizar
os valores de uma constante.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
124 TPICO 2 UNIDADE 2


IDADE
ATIV
AUTO

1 Estruturas de dados possuem como finalidade realizar a manipulao de estruturas


de dados e suas aplicaes, pois realiza o processo de organizar os dados para o
desenvolvimento de uma aplicao. Segundo Pereira (1996), as estruturas de dados
possuem dois objetivos principais, quais so?

( ) Arranjos e Operador.
( ) Terico e Prtico.
( ) Unio e Enumerao.
( ) Ponteiros e Vetores.

2 Os tipos de dados definidos pelo usurio so tipos de dados estruturados, so


construdos hierarquicamente atravs de componentes, os quais so de fato tipos de
L
I dados primitivos ou tipo de dados estruturados. Segundo Edelweiss e Galante (2009)
N
G existem dois tipos de dados estruturados. Assinale a alternativa que corresponde a
U
A esses dados:
G
E
N
S
( ) Tipo de dados Inteiro e Definidos por Funes.

D
( ) Tipo de dados Vetores e Definido pelo Arranjo.
E ( ) Tipo de dados Bsico e Definido pelo Usurio.
P
R
( ) Tipo de dado Booleano e Definido por Variveis.
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 2

TPICO 3

MATRIZES

1 INTRODUO

Uma matriz definida por ser uma estrutura de dados que possui a funcionalidade de
armazenar vrios conjuntos de elementos. O armazenamento, como o acesso aos dados,
realizado de forma organizada e sequencial. Os elementos podem ser acessados seguindo um
L
ndice. O ndice organizado atravs das linhas e colunas pertencentes matriz e sua estrutura I
N
de dados. As matrizes podem ser entendidas como matrizes dimensionais, bidimensionais e G
U
multidimensionais, so formadas por vrias dimenses. A
G
E
N
Neste tpico de estudos veremos as matrizes. Sero abordados os seguintes contedos S
que definem a estrutura e os tipos de matrizes: Matrizes Especiais; Vetores bidimensionais D
E
Matrizes; Matrizes dinmicas; Representao de matrizes e Representao de matrizes
simtricas. P
R
O
G
Os tipos abstratos de dados possuem como finalidade agrupar toda a estrutura de dados, R
A
isso em conjunto com as operaes, consequentemente, realiza o processo de encapsular M
A
a estrutura de dados, toda a implementao da estrutura especfica dos tipos abstratos

de dados. O processo de abstrao dos dados ocorre atravs das classes structs, objetos, O

encapsulamentos, como por exemplo, listas, filas, rvores, entre outros. E

E
S
Seguindo com os estudos dessa unidade de estudos, daremos nfase tambm T
R
descrio dos conceitos dos tipos abstratos de dados, utilizando: os tipos de dados abstratos; U
T
ponto e tipo de dado abstrato; matriz. U
R
A

D
E

D
A
D
O
S
126 TPICO 3 UNIDADE 2

2 MATRIZES

As matrizes so consideradas arranjos ordenados, sua definio tambm especifica que


podem ser formadas por n dimenses, observando que essas dimenses so denominadas
de dimensional. As matrizes so formadas por vrias dimenses, elas so chamadas de
bidimensional, quando a matriz possui duas dimenses, chama-se tridimensional, quando
formada por trs dimenses e assim consequentemente. Conforme Laureano (2008, p. 5), a
matriz uma estrutura de dados que necessita de um ndice para referenciar a linha e outro
para referenciar a coluna para que seus elementos sejam endereados.

A matriz possui algumas funcionalidades de um vetor, como por exemplo, realizar a


declarao de variveis em um arranjo bidimensional, organizando esses arranjos em linhas
e colunas, dentro dessas linhas e colunas so criadas vrias clulas, e estas possuem a
capacidade de armazenar dados do mesmo tipo.

Uma matriz um arranjo bidimensional ou multidimensional de alocao est-


tica e sequencial. Todos os valores da matriz so do mesmo tipo e tamanho, e
a posio de cada elemento dada pelos ndices, um para cada dimenso. Os
L elementos ocupam posies contguas na memria. A alocao dos elementos
I
N da matriz na memria pode ser feita colocando os elementos linha-por-linha
G ou coluna-por-coluna. (LOREZI, MATTOS e CARVALHO 2007, p. 8).
U
A
G
E Como dito anteriormente, uma matriz segue muitos parmetros dos vetores, como
N
S organizar uma sequncia de clulas em uma estrutura, a matriz definida por ser uma varivel
D composta de dados homogneos bidimensionais, com dados do mesmo tipo, com nome do
E
mesmo identificador da varivel, e realiza o processo de alocar de forma sequencial espao
P
R na memria do programa. A matriz utiliza identificadores de valores para mapear as linhas e
O
G colunas, esse procedimento feito atravs do ndice, que est armazenado e alocado de forma
R
A organizada e em sequncia, dentro da sua estrutura de dados. A matriz realiza o procedimento
M
A de mapear os valores utilizando as linhas e colunas, usando o indicador entre ( [ ] colchetes),

para que seja possvel identificar esses valores.


O

E
Uma das caractersticas de declarao de uma matriz que ela precisa realizar alguns
E
S processos como, informar o tipo de dados que ser armazenado, informar a quantidade de
T
R clulas, linhas e colunas que sero disponibilizadas para o arranjo. A matriz possui dimenses
U
T de linhas e colunas que devem ser especificadas e ter uma delimitao, isso pode ser feito
U
R utilizando o delimitador [ ], aps o nome referido da matriz, so reconhecidos como tipos de
A
dados para a matriz os seguintes valores: int, float, double, char, bool, string. Para realizar a
D
E
declarao de uma matriz pode ser utilizada a seguinte sintaxe:

D tipo_de_dados nome_da_variavel [quantidade_de_linhas][quantidade_de_colunas];


A
D
O
S
UNIDADE 2 TPICO 3 127

A matriz tambm conhecida como Arrays, possui a mesma definio j mencionada


anteriormente de que formada por uma coleo de dados que esto armazenados na memria,
estes dados podem ser acessados, seja em conjunto ou de forma individual, isso definido
de acordo com a posio espacial dentro da estrutura, que foram dimensionadas e alocadas
para a matriz. Vamos analisar a seguir uma matriz com 1 dimenso, contendo no mximo 15
elementos:

FIGURA 62 MATRIZ DIMENSIONAL

FONTE: Cenapad-SP (2014)

Como foi mencionado anteriormente, a matriz composta por dois tipos, matriz
unidimensional e matriz multidimensional. Sobre a matriz unidimensional podemos afirmar
que o modelo da figura acima, composta apenas por uma nica dimenso, em que os
dados e nmeros so organizados de forma contnua. Conforme Aguilar (2011, p. 237), so
denominados arrays (matriz) unidimensionais e nelas cada elemento definido ou feita
referncia por um ndice ou subndice. Esses vetores so elementos de dados escritos em
uma sequncia.
L
I
A matriz multidimensional formada por duas ou mais dimenses, como por exemplo N
G
uma tabela contendo linhas e colunas. Aguilar (2011, p. 240) apresenta um array (matriz), que U
A
pode ser definido em trs dimenses, quatro e at em n dimenses. Em geral, um array de n G
E
dimenses requer que os valores dos n subndices possam ser especificados para se identificar N
S
um elemento individual do array.
D
E

Java no suporta criar arrays unidimensionais cujos elementos tambm sejam arrays P
R
unidimensionais, por isso arrays de arrays. Eles costumam ser usados para representar tabelas O
G
de valores, que consistem em informaes dispostas em linhas e colunas. (SERSON 2007, R
A
p. 166), Nos dois formatos, a matriz se comporta da mesma forma em que os dados so M
A
armazenados e consultados de maneira contnua na memria do programa. Vamos analisar a

seguir um exemplo de uma matriz multidimensional: O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
128 TPICO 3 UNIDADE 2

FIGURA 65 MATRIZ MULTIDIMENSIONAL

FONTE: Disponvel em: <http://cae.ucb.br/conteudo/programar/labor1/new_matriz.html>. Acesso em:


3 out. 2014

L
I
N 2.1 MATRIZES ESPECIAIS
G
U
A
G
E Podemos considerar que uma matriz especial quando na sua maioria seus elementos
N
S so iguais a zero ou considerados um valor constante. Ateno muito especial se d neste
D modelo de matriz, pois existe um desperdcio de espao na alocao da memria, devido aos
E
elementos possurem o mesmo valor. Para que esse processo seja evitado, existe a necessidade
P
R de serem apresentados apenas valores que so considerados representativos e significativos
O
G
para a matriz, como valores que sejam diferentes de zero e valores constantes.
R
A

M
A
VELOSO; SANTOS; AZEREDO e FURTADO (1983) apresentam as matrizes especiais

como representaes que guardam todos os elementos da matriz. Frequentemente ocorrem


O matrizes de nmeros representando uma boa parte de elementos nulos. Com isso os espaos
E que podem ser inutilizados podem diminuir, para que todos os espaos tenham utilizao e
E tornem o processo mais dinmico.
S
T
R
U Compem as matrizes especiais as matrizes diagonais, matrizes triangulares, matrizes
T
U simtricas e antissimtricas e cada uma possui uma finalidade dentro das matrizes especiais.
R
A Como, por exemplo, as matrizes diagonais so formadas por valores significativos da diagonal
D principal ou secundria. As matrizes triangulares possuem a finalidade de armazenar valores
E
significativos em um vetor e possuem valores diferentes de constantes e zero. As matrizes
D
A simtricas e antissimtricas utilizam a matriz para representar apenas os elementos do tringulo
D
O superior e inferior.
S
UNIDADE 2 TPICO 3 129

2.2 VETORES BIDIMENSIONAIS MATRIZES

Segundo Horstmann (2008, p. 341), vetores e arrays podem armazenar sequncias


lineares de nmeros. Acontece com frequncia querermos armazenar colees de nmeros que
tem um layout bidimensional. Os vetores bidimensionais so considerados como matrizes de um
vetor bidimensional realizam a funo de armazenar informaes de forma organizada, atravs
de linhas e colunas, lembrando que uma matriz uma estrutura de dados lgicos e organiza
um conjunto de valores na estrutura formados por linhas e colunas, em que a organizao se
d atravs de um ndice, o acesso sempre se dar pelo ndice que indicar primeiramente a
linha e como segundo acesso a coluna dos vetores bidimensionais. Vamos analisar a seguir
uma matriz bidimensional, contendo uma tabela com linhas e colunas, em que estes possuem
os pesos [ 3 ] [ 5 ], a matriz pode ser pensada da seguinte forma:

TABELA 8: TABELA DE VETORES BIDIMENSIONAIS LINHAS E COLUNAS

L
I
N
FONTE: Adaptado de: Neto (2014) G
U
A
Observe a tabela anterior, onde o peso [ 3 ], representa as linhas da tabela e o segundo G
E
peso est representando [ 5 ] as colunas pertencentes da tabela. Analisando que o peso [ 3 ] N
S
composto por valores de zero at o nmero 2 e o peso [ 5 ] composto por valores de zero ao
D
nmero 4, sabendo a composio e as limitaes desses dois pesos, podemos a partir dessa E

premissa determinar os ndices de cada posio dos valores na matriz. No exemplo a seguir P
R
vamos representar a tabela contendo os valores: O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
130 TPICO 3 UNIDADE 2

TABELA 9: TABELA DE LINHAS E COLUNAS E OS PESOS


0,0 0,1 0,2 0,3 0,4
1,0 1,1 1,2 1,3 1,4
2,0 2,1 2,2 2,3 2,4
FONTE: Adaptado de: Neto (2014)

Perceba que na tabela o que determina os valores so os nmeros da primeira coluna,


depois elas continuam a sequncia organizada dos valores. Na prxima tabela vamos analisar
a posio de cada ndice e vamos dar valores para os pesos, como por exemplo:

TABELA 10: VALORES E PESOS


10 30 45 70 36
86 44 63 82 80
70 61 52 63 74
FONTE: Adaptado de: Neto (2014)

Agora que temos os valores para cada peso e para os ndices, seguindo a metodologia
dos vetores bidimensionais, podemos analisar a tabela anterior da seguinte forma:
L
I
N TABELA 11: VALORES E PESOS DE VETORES BIDIMENSIONAIS.
G
U pesos[1][3] = 82
A
G pesos[0][4] = 36
E
N pesos[0][0] = 10
S
Peso [2][4] = 74
D
E FONTE: Adaptado de: Neto (2014)

P
R FIGURA 66 RESULTADO DOS VALORES E PESOS
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S FONTE: A autora
UNIDADE 2 TPICO 3 131

Vamos analisar a seguir como pode ser representado o comando da matriz bidimensionais
desses valores e pesos, que esto expostos no exemplo da figura 63.

Para preencher nossa matriz com os valores mostrados na tabela anterior podemos usar
uma declarao como:

int pesos [3] [5] = {{10, 30, 45, 70, 36},


{86, 44, 63, 82, 80},
{70, 61, 52, 63, 74}};

Podemos manipular os elementos de nossa matriz bidimensional usando duas variveis e


um lao sendo da mesma maneira que fizemos com as matrizes comuns. Observe o cdigo
a seguir:

/* manipulando uma matriz bidimensional */


#include <stdio.h>

int main()
{
int pesos [3] [5] = {{10, 30, 45, 70, 36},
L
{86, 44, 63, 82, 80}, I
N
{70, 61, 52, 63, 74}}; G
U
A
G
int linha,coluna; E
N
S
for (linha = 0; linha < 3; linha++) D
E
for (coluna = 0; coluna < 5; coluna++)
P
printf ("elemento [%d] [%d] = %d\n" , linha, coluna, pesos [linha] [coluna]); R
return (0); O
G
} R
A
M
FONTE: Neto (2014) A


O
Feij, Silva e Clua (2010) colocam que a manipulao de matrizes bidimensionais exige
E
o controle cuidadoso das variveis de ndices, para que seja possvel apontar exatamente para
E
cada valor desejado. S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
132 TPICO 3 UNIDADE 2

2.3 MATRIZES DINMICAS

As matrizes dinmicas exigem que sejam criadas abstraes conceituais com vetores
e assim representar de forma bidimensional os conjuntos dessa estrutura e representar quais
matrizes esto alocadas dinamicamente. A matriz dinmica representada por vetores do tipo
simples, tambm representada por vetores do tipo unidimensional. A matriz dinmica possui
como finalidade armazenar elementos do vetor na primeira linha da matriz. Cria abstraes
conceituais com os vetores, para que possam ser representadas as matrizes que esto alocadas
dinamicamente. Rita (2009, p. 62), coloca que uma matriz poder ser formada de uma nica
linha (unidimensional) ou com mais de uma linha e colunas; nesse caso, ser tridimensional.

A matriz dinmica possui seu conjunto bidimensional que representado por um vetor
unidimensional. Para realizar o acesso aos seus elementos precisa-se acessar utilizando algumas
regras e procedimentos. Com relao ao acesso dos elementos que esto armazenados isso
ocorre em uma sequncia contnua. O primeiro acesso na primeira linha, depois o acesso
aos elementos da segunda linha e assim consequentemente. Ainda segunda Rita (2009, p.
L 62), h matrizes retangulares e quadradas. Quando o nmero de linhas diferente do nmero
I
N
de colunas, uma matriz considerada como uma matriz retangular. Caso o nmero de linhas
G
U
e colunas seja idntico, a matriz quadrada.
A
G
E
N FIGURA 67 MATRIZ DINMICA
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E FONTE: Cruz (1999)
D
A
D A matriz dinmica possui algumas limitaes que podem ser observadas como, sua
O
S
UNIDADE 2 TPICO 3 133

alocao esttica, suas dimenses devem ser analisadas antes de utilizar, armazenar e
acessar seus elementos, a alocao realizada diretamente na matriz, para que seja alocada de
forma dinmica se dar apenas para conjuntos de elementos unidimensionais, a representao
das matrizes alocadas dinamicamente ocorre atravs de abstraes conceituais e vetores que
realizam o papel de alocao. Rita (2009, p. 63) afirma que podemos declarar uma matriz com
tamanho fixo ou uma onde seu tamanho possa ser alterado durante a execuo do programa,
nesse caso, ela ser considerada uma matriz dinmica.

A declarao de uma matriz dinmica pode ser feita de modo em que as dimenses
da matriz possam sofrer alteraes, elas so aumentadas ou diminudas, isso pode ocorrer
ainda enquanto a macro da matriz for executada. Um problema que pode ocorrer quando
estiver realizando a declarao da matriz dinmica, onde os contedos podem ser pedidos ao
redimensionar a matriz. Para realizar a declarao de uma matriz dinmica, pode ser utilizado
o seguinte comando:

dim < array name > ( ) as < data type >

Para criar uma matriz dinmica com tamanho varivel, de forma esttica, pode-se utilizar L
I
n dimenses de forma simples, vamos analisar a seguir um exemplo de como dimensionar N
G
essa matriz, ser utilizado o seguinte comando: U
A
G
E
int array [ 5 ] [ 10 ] [ 20 ]; N
S

D
E
Para que a matriz se torne dinmica, preciso criar um ponteiro para esse tipo de dados
P
que vai ser utilizado na matriz, nesse dado deve conter a mesma quantidade de indirees que R
O
as dimenses da matriz, para isso vamos utilizar uma matriz bidimensional de valores inteiros G
R
e posterior a isso deve-se criar um ponteiro que esteja apontado para outro ponteiro. Vamos A
M
analisar o exemplo a seguir, de como seria a criao dessa matriz dinmica: A


O
int * *array;
E

E
S
Posterior a isso precisa-se alocar os ponteiros das linhas e depois alocar cada linha T
R
da matriz. Vamos analisar o exemplo a seguir de como seriam os comandos para alocar os U
ponteiros das linhas: T
U
R
A
array = (int **)maloc(sizeof(int *) * 10);
D
for(c = 0; c < 10; c++) E

array[c] = (int *)malloc(sizeof(int) * 20); D


A
D
O
S
134 TPICO 3 UNIDADE 2

Tambm existe o processo contrrio. Para realizar o deslocamento de um ponteiro, os


comandos sero feitos de forma contrria. Primeiro deve-se desalocar as linhas da matriz e
em sequncia desalocar os ponteiros de linhas. Para que isso possa ocorrer, vamos utilizar o
seguinte comando como exemplo:

for(c = 0; c < 10; c++)


if(array[c])
free(array[c]);
if(array)
free(array);

2.4 REPRESENTAO DE MATRIZES

Para realizar a representao de matrizes precisa-se levar em considerao alguns


aspectos, como procedimentos e funes que possam ser realizadas para representar as
tarefas das matrizes. Essas operaes computacionais devem seguir as seguintes funes,
L
I como: realizar a leitura de uma matriz, tanto as dimenses como todos os dados da matriz;
N
G desenvolver uma matriz que seja identificada como a identidade matriz; realizar a comparao
U
A de duas matrizes; fazer a somatria dessas duas matrizes, fazer a multiplicao dessas duas
G
E matrizes e para finalizar deve-se imprimir uma dessas matrizes. Esses so alguns pontos
N
S que devem ser levados em considerao para realizar o procedimento de representar uma
D matriz, sempre lembrando que uma matriz formada por linhas e colunas e podem ser do tipo
E
quadrada e de tipo de identidade.
P
R
O
G
Uma funo muito interessante da representao da matriz que possvel utilizar
R
A
as linhas e colunas da matriz para associar os vrtices, como tambm possvel utilizar os
M
A
elementos da matriz para identificar se existem na estrutura da matriz arestas, algum problema

com algum ngulo ou algo do tipo. Sempre se deve observar que as matrizes servem para
O representar dados das dimenses da matriz e como essas dimenses esto ordenadas e
E organizadas, pode ser utilizada para vrios tipos de operaes, seja para clculos de adio,
E multiplicao e inverso.
S
T
R
U Para representar um tipo de matriz, pode ser escolhido um conjunto de operaes que
T
U pode ser implementado sobre o tipo de matriz escolhido, utilizando esses clculos anteriormente
R
A citados, como adio, multiplicao e a inverso das matrizes. Para que isso ocorra vamos
D utilizar a implementao das seguintes operaes bsicas da matriz, como:
E

D
A
D
O
S
UNIDADE 2 TPICO 3 135

TABELA 12: OPERAES BSICAS DA MATRIZ


OPERAES RESULTADO
CRIA operao que cria uma matriz de dimenso m por n;
LIBERA operao que libera a memria alocada para a matriz;
ACESSA operao que acessa o elemento da linha i e da coluna j da matriz;
ATRIBUI operao que atribui o elemento da linha i e da coluna j da matriz.
FONTE: Adaptado de: Celes e Rangel (2008)

Lopes (1997) apresenta que a matriz de adjacncia e a lista de adjacncia so duas


formas encontradas para a representao de grafos dirigidos. As representaes de matrizes
podem ser representadas por matriz adjacncia e pela matriz de incidncia. A matriz de
incidncia pode ser definida como uma representao de um grafo G, esta uma matriz m x
n, em que as linhas e colunas podem ser indexadas, seguindo a ordenao dos vrtices e das
arestas do grafo G. Vamos analisar a seguir a figura que representa esses dados da matriz
de incidncia.

FIGURA 68 MATRIZ DE INCIDNCIA

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O
FONTE: Fontes (2009)
E
Para representar um grafo por uma matriz de adjacncia, utiliza-se uma matriz E
quadrada booleana M(1..N, 1..N), onde N indica o nmero de vrtices do grafo S
a ser representado, sendo preenchido com valores verdade ( v ) sempre que T
R
um vrtice j adjacente a um vrtice i, i e j variando de 1 a n, com notao U
M(i, j) = v. M(i, j) = falso (f) quando um vrtice j no adjacente a um vrtice i. T
U
Para matrizes onde N grande, essa representao deve ser evitada, devido R
ao desperdcio de memria. (LOPES 1997, p. 429). A

D
A lista da matriz de incidncia formada por uma tabela, em que sua funcionalidade E

listar todos os vrtices V, como tambm listar todas as arestas incidentes em V. Essa matriz D
A
de incidncia geralmente composta, em sua maior parte, por valores em zero. A matriz de D
O
incidncia possui como vantagem a possibilidade de representar todos os grafos gerais da S
136 TPICO 3 UNIDADE 2

matriz. Tambm pode ser construda uma representao mais eficiente em relao ao uso
eficiente do espao da memria. A matriz incidncia est em desvantagem nas representaes,
pois suas funcionalidades precisam rotular todas as arestas existentes do grafo. Perceba:

FIGURA 69 MATRIZ DE INCIDNCIA

L
I
N
G
U FONTE: Arenales; et al. (2011)
A
G
E
N A matriz adjacncia possui a finalidade de representar atravs de grafos simples suas
S
listas, com isso as representaes se tornam mais eficientes, constituda em sua grande parte
D
E
por suas adjacncias por valores zero. A matriz adjacncia de um grafo G = (V, A), formada
P
por n vrtices, como se pode afirmar que uma matriz n x n contendo n bits, em que A[i, j]
R
O
1 (ou verdadeiro) possui um arco do vrtice i apontado para o vrtice j. A existncia de grafos
G A[i, j], onde esses possuem o rtulo ou peso que est associado com a aresta e, com isso se
R
A pode afirmar que a matriz no formada por bits. Acaso ocorra de no possuir uma aresta de i
M
A para j existe a necessidade de utilizar um valor que no possa ser usado como rtulo ou peso.

Logo adiante vamos apresentar a figura representando a matriz adjacncia.


O

E
Lipson e Lipschutz (1997, p. 205), afirma que quaisquer duas matizes de adjacncia
E
S esto intimamente relacionados, podendo uma ser obtida a partir da outra pela simples troca
T
R de posio de linhas e colunas, no entanto, LIPSON e LIPSCHUTZ (1997, p. 171) diz que:
U
T
U a matriz de adjacncia A de um grafo G depende da ordenao dos vrtices
R
A de G, isto , uma ordem diferente dos vrtices conduz a uma matriz de adja-
cncia diferente. Porm, duas matrizes de adjacncia do mesmo grafo esto
D
E
fortemente relacionadas entre si, de modo que uma pode ser obtida a partir
da outra, simplesmente permutadas as linhas e colunas. Por outro lado, a
D matriz de adjacncia no depende da ordem na qual as arestas so inseridas
A
D
no computador.
O
S
UNIDADE 2 TPICO 3 137

Vamos analisar a figura a seguir que trata sobre as representaes da matriz de


adjacncia:

FIGURA 70 MATRIZ ADJACNCIA

FONTE: Fontes (2009)

Em relao s arestas existe uma diferena fundamental entre as duas pri-


meiras estruturas e a terceira. A estrutura de lista de arestas e a estrutura de
L
lista de adjacncia armazenam apenas as arestas realmente presentes no I
grafo, enquanto a matriz adjacente armazena uma posio para cada par de N
G
vrtices. (GOODRICH e TAMASSIA 2002, p. 603). U
A
G
E
N
S

UNI D
E

Saiba mais sobre o que so os GRAFOS acessando: <http:// P


www.obmep.org.br/docs/Apostila5-Grafos.pdf>. R
O
G
R
A
M
A


O
2.5 REPRESENTAO DE MATRIZES SIMTRICAS E

E
S
O significado de matriz simtrica, seguindo conceitos de matemtica, esse resultado T
R
vem da matriz transposta, em que essa matriz o resultado da troca de linhas por colunas, U
T
isso pode ocorrer em uma determinada matriz, por isso toda matriz simtrica chamada desta U
R
forma por ser igual a sua matriz transposta. A

D
E
Para entendermos melhor o que significa a matriz simtrica, vamos analisar a definio
D
desta matriz. A
D
O
S
138 TPICO 3 UNIDADE 2

Para que possamos compreender a definio de uma matriz simtrica, necessrio


compreendermos algumas notaes usadas no estudo de matrizes.

Conhecendo estas notaes, vejamos a definio para uma matriz simtrica.

Uma matriz simtrica uma matriz quadrada de ordem n, que satisfaz:


At = A

Outra forma para enunciar esta definio fazendo as igualdades dos elementos
da matriz. Dizemos que uma matriz simtrica quando,

Vejamos alguns exemplos de matrizes simtricas.

L
I
N
G
U
A
G
E
N
S Vejamos um exemplo geral, com elementos quaisquer, simtricos.
D
E

P
R
O
G
R
A
M
A
Voc parou para pensar por que uma matriz simtrica uma matriz quadrada?

O Faamos a seguinte reflexo: o que devemos fazer para obter a matriz transposta de
E uma determinada matriz?
E Devemos inverter as linhas com as colunas, ou seja, uma matriz:
S
T
R
U
T
U
R
A
Veja que trocamos a quantidade de linhas pela quantidade de colunas. Para que
D
E uma matriz seja simtrica devemos ter a igualdade desta matriz com a sua transposta.
D
A
D
O
S
UNIDADE 2 TPICO 3 139

Isto s ser possvel caso, m = n, e quando isso ocorre dizemos que a matriz quadrada.

FONTE: OLIVEIRA, Gabriel A. Matriz Simtrica. Disponvel em: <http://www.mundoeducacao.com/


matematica/matriz-simetrica.htm>. Acesso em: 30 set. 2014.

A matriz transposta formada pela base de uma matriz A, seguindo a ordem m x n, com
isso teremos uma matriz transposta, indicando diretamente para At, em que sero invertidas as
posies de m e n, isso significa que ser n x m, vamos analisar como sero expostos esses
valores:

FIGURA 71 MATRIZ SIMTRICA

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


FONTE: S (2014) O

E
Analisando o exemplo anterior podemos perceber que a primeira linha de A tornou-se a
E
primeira coluna de At; a segunda linha de A tornou-se a segunda coluna de At; a terceira linha S
T
de A tornou-se a terceira coluna de At. Vamos analisar no exemplo a seguir como fica a linha R
U
e coluna de B: T
U
R
A

D
E

D
A
D
O
S
140 TPICO 3 UNIDADE 2

FIGURA 72 MATRIZ SIMTRICA TRANSPOSTA

FONTE: S (2014)

Seguindo o exemplo da figura, pode-se perceber que A na primeira linha de B tornou-se


a primeira coluna de B t; a segunda linha de B tornou-se a segunda coluna de B t.

Analisando os exemplos anteriores, precisa-se observar que a matriz transposta At,


onde a mesma for igual matriz quadrada de A, pode-se dizer que esta matriz de A uma
matriz simtrica, isso significa que se A = At, A sempre ser uma matriz simtrica. Em uma
matriz simtrica, os elementos sempre sero simtricos, isso em relao diagonal principal
da matriz quadrada, onde podemos ter A = (a ij), esta simtrica, temos aij = aji. Perceba no
L exemplo a seguir:
I
N
G
U FIGURA 73 MATRIZ SIMTRICA
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
FONTE: S (2014)
T
U
R
A
Agora que conseguimos observar como so dispostos os elementos da matriz simtrica,
vamos analisar no exemplo a seguir como pode ser aplicado o conceito da representao da
D
E matriz simtrica.
D
A
D
O
S
UNIDADE 2 TPICO 3 141

FIGURA 74 APLICANDO A MATRIZ SIMTRICA

L
I
N
G
U
A
G
E
N
S
FONTE: S (2014)
D
E
Agora que temos noo do que uma matriz simtrica, vamos aprofundar ainda mais
P
nossos estudos, analisando que uma matriz simtrica considerada como n x n, e no existe R
O
a necessidade de armazenar os seguintes elementos mat[ i ] [ j ] e mat[ j ] [ i ], pois tanto G
R
esses valores quanto i j, possuem o mesmo valor. Com isso existe a necessidade apenas A
M
de armazenar os valores dos elementos que esto na diagonal, bem como da metade dos A

elementos restantes, segundo o exemplo dos elementos da diagonal, com os quais i > j, isso
O
pode ajudar no processo e obter mais espao na memria, aumentando a eficincia com a
E
alocao da matriz. Vamos analisar a seguir o exemplo de como realizar esse processo, ao
E
invs de n2 valores, vamos armazenar apenas s como elementos, sendo este s dado, com o S
T
seguinte comando: R
U
T
U
R
A

D
E

Para que possamos determinar o s como um elemento da soma de uma progresso D


A
aritmtica, precisa-se armazenar um elemento na primeira linha, depois dois elementos na D
O
segunda linha, posterior trs elementos na terceira linha e assim consequentemente. Vamos S

analisar como seriam estes valores:


142 TPICO 3 UNIDADE 2

2.6 TIPOS ABSTRATOS DE DADOS

Quando um mdulo define um novo tipo de dado, como define o conjunto de operaes
que iro manipular os dados desse novo tipo de dado? Esse procedimento est representando
um tipo abstrato de dado, conhecido pela sigla TAD. O tipo de dado abstrato definido por
ter sua finalidade do tipo e de suas operaes, no como so implementadas. Para criar uma
TAD para que esta possa representar matrizes que sejam alocadas dinamicamente, preciso
criar um tipo de matriz, como tambm uma srie de funes para manipular essas matrizes. No
caso de criar formas de acessar a matriz, podem ser utilizadas funes que possam acessar
e manipular os elementos dessa matriz, para que isso ocorra podemos criar um tipo abstrato
de dado, onde possvel esconder a forma como so implementadas essas funes.

L Os tipos abstratos de dados (TADs) so estruturas de dados capazes de re-


I
N presentar os tipos de dados que no foram previstos no ncleo das linguagens
G de programao e que, normalmente, so necessrios para as aplicaes
U especficas. Essas estruturas so divididas em duas partes: os dados e as
A
G operaes. Um TAD , portanto, uma forma de definir um novo tipo de dado
E juntamente com as operaes que manipulam esse novo tipo de dado. As
N
S
aplicaes que utilizam esses TADs so denominadas clientes do tipo de dado.
(EDELWEISS e GALANTE, 2009, p. 37).
D
E
Lembrando que o uso de tipos abstratos de dados, para serem utilizados, precisam
P
R apenas conhecer para qual finalidade se est criando essa funcionalidade, no a forma de
O
G como pode ser implementada, com este processo de saber suas funcionalidades, possvel
R
A reutilizar os cdigos, bem como facilitar a manuteno dessa matriz. TAD definido por ser
M
A formado por uma coleo de dados definidos a serem armazenados, tambm formado por

um grupo de operadores que possuem a finalidade de serem aplicados para a manipulao


O
dos dados. O TAD possui como suas principais caractersticas, que so denominadas de
E
fundamentais para a formao dos dados abstratos, onde os operadores de TAD realizam a
E
S implementao de regras e essas precisam estar bem definidas para a manipulao dos valores
T
R que esto armazenados, outra caracterstica os valores que esto armazenados, precisam
U
T ser manipulados de forma exclusiva pelos operadores do TAD.
U
R
A
O TAD um tipo de dado que estabelece sua forma de representar esses dados de forma
D
E separada, sua representao definida pelo modelo da matemtica, em que esta definio
D dada pelo par de ( V e O ), onde o V representado por um conjunto de valores e o O
A
D formado por um conjunto de operaes sobre esses valores de V. Vamos analisar a seguir a
O
S representao do tipo de dado abstrato real:
UNIDADE 2 TPICO 3 143

A definio de um TAD serve para especificar e descrever quais os dados podem ser
armazenados, como possvel utilizar esses dados atravs dos operadores dos dados TAD,
no entanto, essas definies no descrevem como devem ser implementados o TAD em um
programa. Sua aplicao possui apenas a definio de ser um TAD modelo, em que este
modelo define e especifica como manipular e armazenar os dados.

Vamos analisar um exemplo de TAD, em que possvel armazenar e manipular a idade


das pessoas. So componentes (1) os dados armazenados e (2) os operadores. O operador
Nasce e operador Aniversrio, uma caracterstica fundamental dos TADs que os dados
armazenados devem ser manipulados EXCLUSIVAMENTE atravs dos operadores do TAD.
(BARBOSA; MIYOSHI e GOMES 2008).

FIGURA 75 TIPO ABSTRATO DE DADOS


L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

FONTE: Barbosa; Miyoshi e Gomes (2008) D


A
D
O
S
144 TPICO 3 UNIDADE 2

2.6.1 Tipo de dado abstrato Ponto

Para a criao de um tipo de dado, em que seja possvel representar um ponto no R2,
deve-se primeiramente definir um tipo de dado abstrato, que pode ser chamado de Ponto,
como o conjunto de funes que pode operar sobre esse tipo de dado. Esse ponto realiza as
seguintes operaes, de acordo com Lima (2014):

cria: operao que cria um ponto com coordenadas x e y;


libera: operao que libera a memria alocada por um ponto;
acessa: operao que devolve as coordenadas de um ponto;
atribui: operao que atribui novos valores s coordenadas de um ponto;
distancia: operao que calcula a distncia entre dois pontos.

Segundo Celes e Rangel (2008), a interface deste mdulo, contendo as operaes de


cria, libera, acessa, atribui e distancia, pode ser dada atravs do seguinte cdigo:

FIGURA 76 ARQUIVO PONTO.H.


L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D FONTE: Celes e Rangel (2008)


E

D
A Podemos citar alguns exemplos de caractersticas do TAD Ponto, como por exemplo,
D
O
definir o nome do tipo e definir os nomes das funes que sero exportadas. Este TAD Ponto
S
UNIDADE 2 TPICO 3 145

possui tambm algumas limitaes, como a estrutura Ponto no contempla as partes da


interface, no fazem parte dessa estrutura do Ponto, pois no so exportadas pelo mdulo,
no pertence interface do mdulo, como tambm no est disponvel visivelmente para os
outros mdulos.

Podemos encontrar outras limitaes em relao aos mdulos que utilizam o TAD Ponto,
essas limitaes do mdulo so: no possvel acessar diretamente os campos da estrutura do
Ponto e s podem acessar aos dados que foram obtidos atravs das funes exportadas. Para
realizar a implementao do TAD Ponto so seguidos os passos como incluir os arquivos de
interface de Ponto, definir qual a composio da estrutura Ponto e incluir a implementao das
funes externas. Vamos analisar a seguir um exemplo de como pode ser utilizado o TAD Ponto:

FIGURA 77 COMANDO TAD PONTO

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
FONTE: Lima (2014) A


O

E
2.6.2 Tipo de dado abstrato Matriz S
T
R
U
T
Como um TAD implementado de forma que fica escondido dentro do seu prprio U
R
mdulo, dessa forma fica mais fcil de experimentar formas que sejam diferentes para A

implementar um mesmo tipo de dado TAD. Esse processo de utilizar o mesmo tipo de dado D
E
TAD, torna-se mais fcil de experimentar diversas formas de implementar o mesmo TAD, sem
D
mesmo afetar os seus clientes. Com esta dependncia da implementao de dados TAD, em A
D
que se pode criar vrios tipos de dados abstratos, em que esse representa matrizes de valores O
S
146 TPICO 3 UNIDADE 2

reais, e esses valores reais esto alocados de forma dinmica, onde as dimenses de m x
n, so fornecidos no mesmo tempo de execuo. Especificamente existe a necessidade de
definir um tipo de dado abstrato, que ser denominado de matriz, como tambm ser definido
o conjunto de funes que iro operar sobre esses tipos de dados. Segundo Lima (2014) neste
dado do TAD matriz sero consideradas as seguintes operaes:

cria: operao que cria uma matriz de dimenso m por n;


libera: operao que libera a memria alocada para a matriz;
acessa: operao que acessa o elemento da linha i e da coluna j da matriz;
atribui: operao que atribui o elemento da linha i e da coluna j da matriz;
linhas: operao que devolve o nmero de linhas da matriz;
colunas: operao que devolve o nmero de colunas da matriz.

Conforme Celes e Rangel (2008), a interface deste mdulo, contendo as operaes


de cria, libera, acessa, atribui e distancia, pode ser dada atravs do tipo de dado TAD matriz,
com o seguinte cdigo:

FIGURA 78 ARQUIVO MATRIZ.H.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E FONTE: Celes e Rangel (2008)
D
A
D Para que possamos analisar e verificar se uma matriz realmente simtrica, precisa-se
O
S
UNIDADE 2 TPICO 3 147

observar se os valores retornam como: 1 se verdadeiro e 0 se falso, sempre lembrando que s


pode ser uma matriz simtrica se ela for igual a sua transposta e a matriz transposta o retorno
do resultado da troca entre linhas por colunas, isso ocorre da matriz original, sendo transposta
para uma matriz simtrica. A seguir vamos analisar como pode ser apresentado o TAD Matriz:

FIGURA 79 TAD MATRIZ

FONTE: Lima (2014) L


I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
148 TPICO 3 UNIDADE 2

RESUMO DO TPICO 3

Neste tpico vimos:

As matrizes so consideradas arranjos ordenados, podem ser formadas por n dimenses,


essas so denominadas de dimensional. As matrizes possuem vrias dimenses, em que
uma chamada de dimensional, quando so duas bidimensional, trs tridimensional e
assim consequentemente.

Quando a grande parte dos elementos igual a zero ou considerada como um valor
constante, chamado de matriz especial. Esta matriz exige muita ateno devido ao seu
desperdcio de espao ao realizar a alocao da memria. Isso se deve matriz especial
possuir elementos que tem o mesmo valor, para que o espao no seja desperdiado precisa-
se apresentar apenas valores que so representativos e significativos para a matriz.

L Os vetores bidimensionais de matrizes possuem como responsabilidade armazenar


I
N informaes de forma organizada, esse processo realizado atravs de linhas e colunas,
G
U em que a matriz formada por uma estrutura de dados que so lgicas e por um conjunto
A
G de valores da estrutura.
E
N
S A matriz dinmica representada por vetores que so do tipo simples, representada tambm
D por vetores do tipo unidimensional. As principais funes da matriz dinmica armazenar os
E
elementos do vetor na primeira linha da matriz, criar abstraes conceituais com os vetores.
P
R
O
G A representao de matriz ocorre atravs de dois processos, como por exemplo, procedimentos
R
A e funes, em que estes realizam a funcionalidade de representar as tarefas das matrizes.
M
A As representaes dessas operaes ocorrem da seguinte forma: realizar a leitura da matriz;

desenvolver uma matriz; fazer a comparao somatria e manipular as duas matrizes.


O

E
A representao de matrizes simtricas ocorre atravs de um processo em que existe
E
S
um resultado na troca de linhas e colunas, esse procedimento conhecido como matriz
T transposta, ento a matriz simtrica igual a sua matriz transposta e isso a define como a
R
U matriz simtrica.
T
U
R
A O tipo abstrato de dados TAD definido por ser formado de um novo tipo de dado, em
D que o mdulo define um conjunto de operaes que sero manipuladas por esse novo tipo
E
de dado, sua principal caracterstica a finalidade de suas operaes. A utilizao do TAD
D
A para saber qual a sua finalidade e sua funcionalidade de ser implementada, formado
D
O por um grupo de operadores, em que esses manipulam os dados. O TAD representado
S
atravs de dois tipos de dados: dado Abstrato Ponto e o dado Abstrato Matriz.
UNIDADE 2 TPICO 3 149


ID ADE
ATIV
AUTO

1 As matrizes so formadas por dimenses que podem ser chamadas de dimensional,


bidimensional, tridimensional e assim consequentemente, uma estrutura de dados
que necessita de um ndice. Os vetores bidimensionais de matrizes tambm so
referenciados por ndices, esses referenciam:
( ) Linha e Coluna.
( ) Vetores e Arrays.
( ) Alocao e arranjo.
( ) Memria e Valores.

2 A definio de tipos abstratos de dados se d atravs da sua forma de definir para qual
finalidade pode ser utilizada e como pode utilizar as suas operaes. Suas estruturas
so divididas em duas partes de dados e operaes. O tipo de dado abstrato Ponto
L
formado por cinco operaes, analise as alternativas a seguir e assinale a alternativa I
N
correta. G
U
( ) Linha, Colunas, Cria, Libera e Acessa. A
G
( ) Cria, Libera, Acessa, Atribui e Distancia. E
N
( ) Atribui, Distancia, Aloca, Retorna e Liga. S
( ) Aloca, Retorna, Liga, Linha e Colunas. D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
150 TPICO 3 UNIDADE 2

IAO
AVAL

Prezado(a) acadmico(a), agora que chegamos ao final


da Unidade 2, voc dever fazer a Avaliao referente a esta
unidade.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3

EstruturaS de Dados Avanadas

Objetivos de aprendizagem

A partir desta unidade voc ser capaz de:

formar estruturas de dados encadeadas com referncias, classes


autorreferenciais e recurso;

criar e manipular estrutura de dados dinmicas como listas


encadeadas, duplamente encadeadas, pilhas e filas;

entender vrias aplicaes importantes de estruturas de dados


encadeadas e como criar estruturas de dados reutilizveis com
classes, herana e composio.

PLANO DE ESTUDOS L
I
N
Esta unidade est dividida em quatro tpicos. Ao final de G
U
cada um deles, voc encontrar atividades que auxiliaro a fixar A
G
as estruturas e praticar problemas prticos em uma linguagem de E
N
programao. S

D
E

P
TPICO 1 Listas Encadeadas R
O
G
TPICO 2 Listas Duplamente Encadeadas R
A
M
TPICO 3 Pilhas A

TPICO 4 Filas
O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3

TPICO 1

LISTAS ENCADEADAS

1 INTRODUO

Conforme j estudamos, a representao de um grupo de dados pode se dar atravs


do uso de vetor. E a forma mais primitiva de representar diversos elementos agrupados. Com
o objetivo de sintetizar a discusso dos conceitos que sero apresentados a seguir, iremos
L
tomar por base o desenvolvimento de uma aplicao que deve representar um grupo de valores I
N
inteiros. Para tanto, podemos declarar um vetor escolhendo um nmero mximo de elementos, G
U
conforme se verifica na figura a seguir. A
G
E
N
S
FIGURA 81 DECLARAO DE VETOR DE INTEIROS
D
E

P
R
O
G
FONTE: O autor R
A
M
Ao declarar um vetor, reserva-se um espao contguo de memria para armazenar A

seus elementos, sendo que seu ndice iniciar na posio 0, conforme ilustra a figura a seguir.
O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
154 TPICO 1 UNIDADE 3

Figura 82 Vetor preenchido com valores inteiros

vet[0] vet[1] vet[2] vet[3] vet[4] vet[5] vet[6] vet[7] vet[8] vet[9]
0 1 2 3 4 5 6 7 8 9

FONTE: O autor

O fato de o vetor ocupar um espao contguo na memria nos permite acessar qualquer
um de seus elementos a partir do ponteiro para o primeiro elemento. Efetivamente, o smbolo
vet, aps a declarao acima, como j vimos, representa um ponteiro para o primeiro elemento
do vetor, isto , o valor de vet o endereo da memria onde o primeiro elemento do vetor
est armazenado. De posse do ponteiro para o primeiro elemento, podemos acessar qualquer
elemento do vetor atravs do operador de indexao vet[i]. Dizemos que o vetor uma estrutura
que possibilita acesso randmico aos elementos, pois podemos acessar qualquer elemento
aleatoriamente.

Entretanto, o vetor no uma estrutura de dados muito flexvel, pois precisamos


dimension-lo com um nmero mximo de elementos. Se o nmero de elementos que
precisarmos armazenar exceder a dimenso do vetor, teremos um problema, pois no existe
L uma maneira simples e barata (computacionalmente) para alterarmos a dimenso do vetor em
I
N tempo de execuo. Por outro lado, se o nmero de elementos que precisarmos armazenar no
G
U
vetor for muito inferior sua dimenso, estaremos subutilizando o espao de memria reservado.
A
G FONTE: Disponvel em: <http://www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap10.
E pdf>. Acesso em: 24 nov. 2014
N
S

D Alm disso, o uso inadequado de vetores pode afetar diretamente o desempenho do


E
nosso programa, por exemplo, ao adicionar um elemento na primeira posio de um Vetor
P
R teremos que deslocar todos os outros elementos uma posio para frente. Esta operao,
O
G medida que a quantidade de elementos do nosso vetor cresce, consumir tempo linear em
R
A relao ao nmero de elementos. Da mesma forma, ao remover um elemento da primeira
M
A posio implicar deslocar todos os outros elementos que esto na sua frente para trs.

O
Com o objetivo de minimizar estes problemas, a soluo utilizar estruturas de dados
E
que possibilitem o seu dimensionamento de forma automtica, acrescentando ou retirando
E
S elementos conforme a necessidade de armazenamento. Tais estruturas so chamadas
T
R dinmicas e armazenam cada um dos seus elementos usando alocao dinmica.
U
T
U
R Nas sees a seguir, discutiremos a estrutura de dados conhecida como lista encadeada.
A
As listas encadeadas so amplamente utilizadas na implementao de diversas outras estruturas
D
E de dados com semnticas prprias, que sero tratadas nos tpicos seguintes.
D
A
D
O
S
UNIDADE 3 TPICO 1 155

2 A Lista Encadeada

Ao utilizar uma lista encadeada, cada novo elemento inserido na estrutura ser alocado
de forma dinmica na memria. Consequentemente, o espao total de memria utilizado pela
estrutura ser proporcional ao nmero de elementos nela armazenado.

De acordo com Deitel e Deitel (2003, p. 62):

Criar e manter estruturas de dados dinmicas exige alocao dinmica de


memria a capacidade de um programa obter mais espao de memria
durante a execuo para armazenar novos nodos e liberar espao no mais
necessrio. [...] O limite para alocao dinmica de memria pode ser to
grande quanto quantidade de memria fsica disponvel no computador ou a
quantidade de espao disponvel em disco em um sistema de memria virtual.
Frequentemente, os limites so muito menores porque a memria disponvel
do computador deve ser compartilhada entre muitos aplicativos.

Outra caracterstica interessante do processo de alocao dinmica que no podemos


afirmar que os elementos armazenados na lista ocuparo um espao de memria contguo, isto
L
quer dizer, um ao lado do outro. Logo, no h possibilidade de acesso direto aos elementos I
N
da lista. Para que seja possvel percorrer todos os elementos da lista, devemos explicitamente G
U
armazenar o encadeamento dos elementos. Desta forma, armazena-se a informao de cada A
G
elemento juntamente com um ponteiro para o prximo elemento da lista. A figura a seguir ilustra E
o arranjo da memria de uma lista encadeada. N
S

D
Figura 83 ARRANJO DA MEMRIA DE UMA LISTA ENCADEADA E

P
R
O
G
R
A
M
FONTE: O autor A


O
A estrutura consiste numa sequncia encadeada de elementos, comumente denominada
de ns da lista. A lista representada por um ponteiro para o primeiro elemento (ou n), a E

partir do qual se pode ascender ao segundo, seguindo o encadeamento, e assim por diante. E
S
O ltimo elemento da lista aponta para NULL, indicando que no h mais elementos na lista. T
R
U
T
Para exemplificar a implementao de listas encadeadas em Java, vamos considerar U
R
um exemplo simples em que queremos armazenar o nome e o peso de uma pessoa numa lista A

encadeada. O n da lista pode ser representado pela estrutura a seguir: D


E

D
A
D
O
S
156 TPICO 1 UNIDADE 3

FIGURA 84 ESTRUTURA LISTA EM JAVA

FONTE: O autor

A classe PessoaLista trata-se de uma estrutura autorreferenciada, pois, alm dos campos
que armazenam as informaes (nome e peso), h o atributo (prox) que um ponteiro para uma
prxima estrutura do mesmo tipo. Normalmente, o acadmico fica confuso em relao a isso,
como se esse cdigo fosse gerar um lao infinito, ou uma recurso infinita. No entanto, no o
caso, j que a declarao do atributo prox apenas uma referncia, que no cria uma instncia
de PessoaLista na memria, apenas criando uma referncia a referida classe j instanciada!

FIGURA 85 REPRESENTAO DA LISTA DE PESSOAS

L
I
N
G
U
A
G
E
N
S FONTE: O autor
D
E
Importante destacar que, embora a Figura 85 represente as pessoas uma ao lado da
P
R outra, na memria provavelmente elas estejam em regies bem distintas, contudo, cada uma
O
G delas sabe dizer em que local se encontra a prxima pessoa j que h a referncia ao prximo
R
A pelo atributo prox.
M
A

O cdigo exibido na Figura 84 no a melhor forma de implementar uma lista, tendo em


O
vista que h uma confuso de responsabilidades, onde a classe PessoaLista alm de armazenar
E
informaes sobre uma pessoa, armazena tambm uma lista de pessoas. Logo, manipul-la,
E
S
pode ficar estranho e muito trabalhoso, j que h a necessidade de manter constantemente
T
R
uma referncia para a primeira pessoa na memria em algum outro lugar, o que tambm pode
U
T
ser confuso, alm de violar o conceito de coeso.
U
R
A Ademais, sendo necessrio criar uma lista encadeada de produtos, por exemplo, ao invs
D de reaproveitar o cdigo existente, prtica comum na programao orientada a objetos, ser
E
necessrio criar uma nova classe denominada ProdutoLista semelhante com a PessoaLista.
D
A
D
O
S
UNIDADE 3 TPICO 1 157

Neste sentido, para criar uma estrutura mais funcional, utiliza-se uma classe separada
como ns, evitando mesclar a classe de dados (Pessoa) da nossa estrutura.

2.1 NS E LISTA ENCADEADA

Para isolar a manipulao da estrutura de dados ser imprescindvel a criao de uma


classe para representar o n, a qual dever possuir uma referncia para o elemento ao qual
ela se refere, e uma referncia para o prximo n, que pode ser null, caso esse seja o ltimo
n da Lista.

UNI
Ao trabalhar com lista duplamente encadeada, alm de armazenar
a referncia para o prximo n, ser necessrio armazenar a
referncia para o n anterior, conforme veremos no tpico a L
seguir. I
N
G
U
A
G
E
Atravs do ambiente integrado de desenvolvimento Eclipse Luna, disponvel para N
S
download no link <http://www.eclipse.org/downloads/>, daremos incio ao projeto de
D
desenvolvimento da Lista Encadeada, criando inicialmente a classe No, conforme figura a E
seguir, a qual ir possuir apenas dois atributos getters e setters, alm dos construtores para P
facilitar nosso trabalho. R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
158 TPICO 1 UNIDADE 3

FIGURA 86 CDIGO DA CLASSE NO

L
I
N
G
U
A FONTE: O autor
G
E
N
S Importante ressaltar que a classe No nunca ser acessada diretamente por quem
D for desenvolver uma classe de Lista Encadeada. Desta forma, estaremos escondendo
E
funcionamento da nossa classe e, consequentemente, garantindo que ningum altere o
P
R funcionamento da sua estrutura interna.
O
G
R
A Concluda a classe No, crie uma nova classe denominada ListaEncadeada que
M
A possuir inicialmente apenas uma referncia para o primeiro n e outra para o ltimo. Atravs

do primeiro n ocorrer a iterao para chegar a qualquer posio necessria, enquanto que
O
a referncia ao ltimo ir facilitar a insero no fim da Lista.
E

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 1 159

FIGURA 87 CDIGO DA CLASSE LISTAENCADEADA

FONTE: O autor

2.2 DEFININDO A INTERFACE

A nossa interface dever possibilitar ao usurio as seguintes operaes:


Adicionar uma pessoa no fim da lista.
Adicionar uma pessoa em uma posio especfica.
Pegar uma pessoa em uma posio especfica.
Remover uma pessoa de uma posio especfica.
Verificar se determinada pessoa est armazenada.
Informar o nmero de pessoas armazenadas.
L
I
Definidas as operaes que devero constar em nossa interface, podemos esboar N
G
os mtodos que sero implementados na classe ListaEncadeada. U
A
G
FIGURA 88 MTODOS DA CLASSE LISTAENCADEADA E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
FONTE: O autor T
R
U
T
Atravs da utilizao de uma lista encadeada, as operaes de adicionar e remover U
R
da primeira e da ltima posio sero computacionalmente eficientes, diferentemente do que A

ocorria quando da utilizao de vetores. Contudo, para que isso seja possvel, precisaremos D
E
desenvolver mais trs mtodos na classe ListaEncadeada, que observamos na figura a seguir.
D
A
D
O
S
160 TPICO 1 UNIDADE 3

FIGURA 89 MTODOS ESSENCIAIS DA CLASSE LISTAENCADEADA

FONTE: O autor

Neste momento, voc deve se perguntar: por que no foi definido o mtodo
adicionaNoFim()? A explicao simples: O mtodo adiciona() j definido anteriormente (Figura
88), exercer a funo de inserir no fim da Lista, no havendo desta forma, a necessidade de
criar um novo mtodo para realizar esta tarefa.

2.3 IMPLEMENTAO DOS MTODOS

Aqui vamos comear a aumentar o cdigo da nossa classe ListaEncadeada baseado


L nas operaes que precisamos realizar com ela. Para facilitar a contagem de elementos
I
N (pessoas) e algumas operaes, logo a seguir dos atributos primeiro e ltimo, adicione o atributo
G
U int totalDeElementos, perceba.
A
G
E FIGURA 90 CRIAO DO ATRIBUTO PARA CONTAR OS ELEMENTOS
N
S

D
E

P
R
O
G FONTE: O autor
R
A
M
A

E 2.3.1 Mtodo adicionaNoComeco()


E
S
T Inserir no comeo da Lista muito simples, basta criarmos um novo n, que se dar
R
U atravs da utilizao do operador new, que segundo Deitel e Deitel (2003) essencial para
T
U alocao dinmica na memria, j que recebe como operando o tipo do objeto que est sendo
R
A dinamicamente alocado e devolve uma referncia para um objeto desse tipo recm-criado. Alm
D disso, este objeto recm-criado ter a referncia proximo" apontando para o atual primeiro
E
da lista, sendo que posteriormente atualizamos o atributo primeiro para se referenciar a este
D
A novo objeto.
D
O
S
UNIDADE 3 TPICO 1 161

No entanto, importante verificar se a Lista encontra-se vazia. Nestas situaes


devemos atualizar a referncia que aponta para o ltimo n tambm. Para tanto, precisaremos
de um novo atributo, que chamaremos de int totalDePessoas, e ser responsvel por retornar
o total de pessoas que se encontram armazenadas nesta lista.

FIGURA 91 ADICIONA NO COMEO COM A LISTA VAZIA

FONTE: O autor

FIGURA 92 ADICIONA NO COMEO COM A LISTA NO VAZIA L


I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A
FONTE: O Autor

O

Compreendido o conceito de como deve ocorrer o processo de insero das pessoas na E

lista encadeada, vamos ao desenvolvimento do cdigo-fonte no ambiente de desenvolvimento: E


S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
162 TPICO 1 UNIDADE 3

FIGURA 93 CDIGO PARA ADICIONAR NO COMEO

FONTE: O autor

2.3.2 Mtodo adiciona()

O mtodo adiciona() permitir adicionar a pessoa no ltimo n da Lista, no entanto, se


no tivssemos guardado a referncia para o ltimo n precisaramos percorrer n a n at

L
o fim da Lista para alterar a referncia proximo do ltimo n, reduzindo consideravelmente
I o desempenho do nosso programa, j que havendo um grande nmero de elementos e o
N
G processo tornar-se-ia lento.
U
A
G
E No caso especial da Lista estar vazia, adicionar no comeo ou no fim dessa lista d o
N
S mesmo efeito. Ento, se a Lista estiver vazia, chamaremos o mtodo j definido anteriormente
D adicionaNoComeco(Object), (CAELUM, 2014). Conforme veremos no cdigo-fonte a seguir.
E

P
R
FIGURA 94 ADICIONA NO LTIMO N COM A LISTA NO VAZIA
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A
FONTE: O autor
D
E

D
A
D
O
S
UNIDADE 3 TPICO 1 163

FIGURA 95 CDIGO PARA ADICIONAR NO LTIMO N DA LISTA

FONTE: O autor

Perceba que aqui estamos fazendo que haja n ns para n elementos, isto , um n
para cada elemento. Outra implementao clssica de lista encadeada usar um n sentinela
a mais para indicar o comeo da Lista, e outro para o fim, assim poderamos simplificar um
pouco alguns desses mtodos, como o caso particular de inserir um elemento quando no h
ainda elemento algum. Vale sempre lembrar que aqui estamos estudando uma implementao
de estrutura de dados, e que h sempre outras formas de codific-las que podem ser mais ou
menos elegantes.
L
FONTE: Caelum (2014) I
N
G
U
A
G
E
N
2.3.3 Mtodo adicionaPosicao() S

D
E
A insero no comeo e no fim da Lista j foram devidamente tratadas nos itens P
R
anteriores. Aqui vamos nos preocupar em inserir em uma posio no interior da Lista, ou O
G
seja, qualquer posio que no seja a primeira e nem a ltima. Para inserir um elemento em R
A
qualquer posio precisamos pegar o n anterior ao da posio desejada, porque precisamos M
A
mexer na sua referncia proximo. (CAELUM, 2014). Para isso vamos criar um mtodo auxiliar
responsvel por pegar determinado n, ao qual atribuiremos o nome de pegaNo. Ao utilizar este
O
mtodo devemos tomar cuidado no caso da posio no existir. Para tanto, iremos inicialmente E
desenvolver o mtodo posicaoOcupada, que verificar se a posio existe ou no.
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
164 TPICO 1 UNIDADE 3

FIGURA 96 CDIGO PARA VERIFICAR POSIO OCUPADA

FONTE: O autor

Os mtodos so privados (private), pois no queremos que ningum de fora tenha


acesso ao funcionamento interno da nossa estrutura de dados. importante notar que o mtodo
pegaNo consome tempo linear.

Desenvolvido os mtodos auxiliares, torna-se mais fcil a implementao do mtodo


L
I
adicionaPosicao(int, Object). Basta pegar o n anterior, a posio onde a insero ser feita
N
G
e atualizar as referncias. O anterior deve apontar para um novo n e o novo n deve apontar
U para o antigo proximo do anterior. (CAELUM, 2014).
A
G
E
N Devemos tomar cuidado com os casos particulares nos quais a posio para inserir
S
o comeo ou o fim da Lista.
D
E

P
FIGURA 97 ADICIONA EM UMA POSIO DA LISTA
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A FONTE: O autor
D
E

D
A
D
O
S
UNIDADE 3 TPICO 1 165

FIGURA 98 CDIGO PARA ADICIONAR EM UMA POSIO DA LISTA

FONTE: O autor

2.3.4 Mtodo pega()

Para pegar um elemento muito simples: basta pegarmos o n em que aquele elemento
se encontra e acessar o elemento que se encontra dentro dele. Podemos utilizar o mtodo L
I
pegaNo(int) previamente criado: N
G
U
FIGURA 99 CDIGO PARA PEGAR UM ELEMENTO NA LISTA A
G
E
N
S

D
FONTE: O autor E

P
R
O
Perceba que este mtodo consome tempo linear. Esta uma grande desvantagem da G
R
Lista Encadeada em relao aos Vetores. Vetores possuem o chamado acesso aleatrio aos A
M
elementos, ou seja, qualquer posio pode ser acessada em tempo constante. Apesar dessa A

grande desvantagem, diversas vezes utilizamos uma Lista e no necessrio ficar acessando
O
posies aleatrias: comumente percorremos a lista por completa, que veremos como fazer
E
mais adiante.
E
FONTE: O autor S
T
R
U
T
U
R
A

2.3.5 Mtodo removeDoComeco() D


E

D
A
Antes de tentar remover devemos verificar se a posio est ocupada. No faz sentido D
O
remover algo que no existe. Depois, basta avanar a referncia que aponta para o primeiro n. S
166 TPICO 1 UNIDADE 3

Por fim, importante perceber que a Lista pode ficar vazia. Neste caso, devemos colocar
null na referncia que aponta para o ltimo n.

Se no fizermos isso ficaramos em um estado inconsistente, em que o atributo primeiro


null e o ltimo no, ou seja, tem um ltimo, mas no tem um primeiro, algo que no faria sentido.

FIGURA 100 REMOVE DO COMEO LISTA COM APENAS UM ELEMENTO

L
I FONTE: O autor
N
G
U
A
G
E FIGURA 101 REMOVE DO COMEO LISTA COM PELO MENOS DOIS (2) ELEMENTOS
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T FONTE: O autor
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 1 167

FIGURA 102 CDIGO PARA REMOVER DO COMEO DA LISTA

FONTE: O autor

2.3.6 Mtodo removeDoFim()

A primeira verificao a ser realizada tem por objetivo constatar se a ltima posio
existe, que poder ser realizada atravs do mtodo anteriormente criado posicaoOcupada(int).

L
Ao constatar que a Lista possui apenas um elemento o processo de remoo do fim I
N
ser idntico a remover do comeo, possibilitando desta forma a reutilizao do mtodo G
U
removeDoComeco(), nestes casos. A
G
E
N
No entanto, se a Lista possui mais que um elemento, devemos pegar o penltimo n, S
fazer o prximo do penltimo ser null e fazer o atributo ultimo apontar para o penltimo. D
E

P
A questo neste momento : como pegar o penltimo n? Podemos fazer isso usando R
O
o mtodo pegaNo(int), mas isso consumiria tempo linear, reduzindo consideravelmente o G
R
desempenho de nosso programa. Desta forma, como queremos consumo constate teremos A
M
que achar outra soluo. A


O
Ento, em vez de fazer uma Lista Encadeada simples, vamos fazer uma Lista Duplamente
Encadeada. Ou seja, cada n aponta para o seu anterior alm de apontar para a prxima. E

(CAELUM, 2014). Para tanto, devemos reabrir a classe No e adicionar o cdigo a seguir. E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
168 TPICO 1 UNIDADE 3

FIGURA 103 CDIGO PARA IMPLEMENTAR A LISTA DUPLAMENTE ENCADEADA

FONTE: O autor

Com cada n sabendo quem o seu anterior, fica fcil escrever o mtodo removeDoFim().

FIGURA 104 REMOVE DO FIM LISTA COM PELO MENOS DOIS (2) ELEMENTOS

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G FONTE: O autor
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 1 169

FIGURA 105 CDIGO PARA REMOVER DO FIM DA LISTA

FONTE: O autor

A modificao para Lista Duplamente Encadeada implicar pequenas modificaes nos


outros mtodos que j tnhamos implementado, que sero apresentadas no Tpico a seguir.
L
I
N
G
U
2.3.7 Mtodo remove() A
G
E
N
S
O respectivo mtodo possibilitar a remoo do elemento de qualquer posio da Lista.
D
Contudo, inicialmente devemos verificar se a posio est ou no ocupada. Se no estiver E
ocupada, devemos lanar uma exceo, caso contrrio, devemos verificar se a remoo P
R
do comeo ou do fim da Lista, haja vista que se for um destes casos, basta chamarmos os O
G
mtodos j implementados removeDoComeco ou removeDoFim. R
A
M
A
Por fim, se a remoo no interior da Lista, devemos atualizar as referncias dos ns

relacionados ao n que vamos remover (anterior e prximo). O prximo do anterior deve ser O
o proximo e o anterior do proximo deve ser o anterior. E

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
170 TPICO 1 UNIDADE 3

FIGURA 106 REMOVE DO INTERIOR DA LISTA

FONTE: O autor

FIGURA 107 CDIGO PARA REMOVER DO INTERIOR DA LISTA

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O FONTE: O autor
G
R
A
M
A

O
2.3.8 Mtodo contem()
E

E
S Est operao deve percorrer a Lista e comparar com o mtodo equals(Object) o
T
R elemento procurado contra todos os elementos da Lista.
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 1 171

FIGURA 108 CDIGO PARA VERIFICAR SE UM ELEMENTO EST NA LISTA

FONTE: O autor

2.3.9 Mtodo tamanho()

Est operao no tem segredo, pois j definimos um atributo que possui esta
informao, qual seja totalDeElementos.
L
I
FIGURA 109 CDIGO PARA RETORNAR O TAMANHO DA LISTA N
G
U
A
G
E
N
S
FONTE: O autor
D
E

P
R
O
G
R
2.4 VERIFICANDO O FUNCIONAMENTO DOS MTODOS A
M
A


Para que possamos verificar se os mtodos anteriormente definidos esto funcionando O
corretamente, iremos implementar algumas classes que nos permitiro fazer a incluso e E
excluso de pessoas em nossa Lista Encadeada. E
S
T
R
Todavia, para que esses mtodos consigam imprimir o contedo da nossa lista, devemos U
primeiramente reescrever o mtodo toString(), o qual permitir visualizar facilmente o contedo T
U
da Lista. Utilizamos a classe StringBuilder para construir a String que mostrar os elementos R
A
da Lista.
D
E

D
A
D
O
S
172 TPICO 1 UNIDADE 3

FIGURA 110 CDIGO PARA RETORNAR UMA STRING

FONTE: O autor

2.4.1 Classe TesteAdicionaNoFim

Crie a classe TesteAdicionaNoFim, conforme a figura a seguir, a qual possibilitar


L adicionarmos pessoas em nossa Lista Encadeada.
I
N
G FIGURA 111 IMPLEMENTAO DA CLASSE TesteAdicionaNoFim
U
A
G
E
N
S

D
E

P
R
O
G
R FONTE: O autor
A
M
A
Ao executar a classe acima, teremos como sada esperada:

O [Guilherme, Felipe]
E

E
S
T
R
U
T 2.4.2 Classe TesteAdicionaPorPosicao
U
R
A

D
Crie a classe TesteAdicionaPorPosicao, conforme a figura a seguir, a qual possibilitar
E adicionarmos pessoas em nossa Lista Encadeada, conforme a posio informada.
D
A
D
O
S
UNIDADE 3 TPICO 1 173

FIGURA 112 IMPLEMENTAO DA CLASSE TesteAdicionaPorPosicao

FONTE: O autor

Ao executar a classe acima, teremos como sada esperada:


[Felipe, Letcia, Guilherme]

2.4.3 Classe TestePegaPorPosicao

L
I
Crie a classe TestePegaPorPosicao, conforme a figura a seguir, a qual possibilitar N
G
pegarmos uma pessoa em nossa Lista Encadeada, de acordo com a posio informada. U
A
G
FIGURA 113 IMPLEMENTAO DA CLASSE TestePegaPorPosicao E
N
S

D
E

P
R
O
G
R
A
M
A


FONTE: O autor O

Ao executar a classe acima, teremos como sada esperada: E


S
[Felipe] T
R
U
T
U
R
A

D
E

D
A
D
O
S
174 TPICO 1 UNIDADE 3

2.4.4 Classe TesteRemovePorPosicao

Crie a classe TesteRemovePorPosicao, conforme a figura a seguir, a qual possibilitar


removermos uma pessoa em nossa Lista Encadeada, de acordo a posio informada.

FIGURA 114 IMPLEMENTAO DA CLASSE TesteRemovePorPosicao

FONTE: O autor

L
I
N Ao executar a classe acima, teremos como sada esperada:
G
U [Guilherme, Letcia]
A
G
E
N
S

D
E 2.4.5 Classe TesteTamanho
P
R
O
G Crie a classe TesteTamanho, conforme a figura a seguir, a qual possibilitar visualizarmos
R
A a quantidade de elementos que compem nossa Lista Encadeada.
M
A

O
FIGURA 115 IMPLEMENTAO DA CLASSE TesteTamanho
E

E
S
T
R
U
T
U
R
A

D
E

D
A
D FONTE: O autor
O
S
UNIDADE 3 TPICO 1 175

Ao executar a classe acima, teremos como sada esperada:


2
3

2.4.6 Classe TesteContemElemento

Crie a classe TesteContemElemento, conforme a figura a seguir, a qual possibilitar


pesquisarmos se determinado elemento encontra-se armazenado em nossa Lista Encadeada.

FIGURA 116 IMPLEMENTAO DA CLASSE TesteContemElemento

L
I
N
G
FONTE: O autor U
A
G
E
Ao executar a classe acima, teremos como sada esperada: N
S
true
D
false E

P
R
O
G
R
A
M
2.4.7 Classe TesteAdicionaNoComeco A


O
Crie a classe TesteAdicionaNoComeco, conforme a figura a seguir, a qual permitir
E
inserir um novo elemento no comeo da nossa Lista Encadeada.
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
176 TPICO 1 UNIDADE 3

FIGURA 117 IMPLEMENTAO DA CLASSE TesteAdicionaNoComeco

FONTE: O autor

Ao executar a classe acima, teremos como sada esperada:


[Felipe, Guilherme]

2.4.8 Classe TesteRemoveDoComeco

L Crie a classe TesteRemoveDoComeco, conforme a figura a seguir, a qual permitir


I
N remover um elemento no comeo da nossa Lista Encadeada.
G
U
A
G
FIGURA 118 IMPLEMENTAO DA CLASSE TesteRemoveDoComeco
E
N
S

D
E

P
R
O
G
R
A
M
A

FONTE: O autor
O

E
Ao executar a classe acima, teremos como sada esperada:
E
S [Felipe]
T
R
U
T
U
R
A

D 2.4.9 Classe TesteRemoveDoFim


E

D
A Crie a classe TesteRemoveDoFim, conforme a figura a seguir, a qual permitir remover
D
O o ltimo elemento da nossa Lista Encadeada.
S
UNIDADE 3 TPICO 1 177

FIGURA 119 IMPLEMENTAO DA CLASSE TesteRemoveDoFim

FONTE: O autor

Ao executar a classe acima, teremos como sada esperada:


[Guilherme, Felipe]

2.5 CDIGO COMPLETO DA CLASSE LISTA ENCADEADA

Disponibilizamos a seguir o cdigo completo da classe Lista Encadeada. L


I
N
FIGURA 120 - COMPLETO DA CLASSE LISTA ENCADEADA G
U
A
G
package exemplo; E
N
S
public class ListaEncadeada { D
private No primeiro; E

private No ultimo; P
R
O
G
private int totalDeElementos; R
A
M
A
private Object elemento;

O

public void adicionaNoComeco(Object elemento) { E

No novo = new No (this.primeiro, elemento); E


S
this.primeiro = novo; T
R
U
T
if (this.totalDeElementos == 0) { U
R
//caso especial da lista vazia A

this.ultimo = this.primeiro; D
E
}
D
this.totalDeElementos++; A
D
} O
S
178 TPICO 1 UNIDADE 3

public void adiciona(Object elemento) {


if (this.totalDeElementos == 0) {
this.adicionaNoComeco(elemento);
} else {
No novo = new No(elemento);
this.ultimo.setProximo(novo);
this.ultimo = novo;
this.totalDeElementos++;
}
}

public void adicionaPosicao(int posicao, Object elemento) {


if(posicao == 0){ // No comeo.
this.adicionaNoComeco(elemento);
} else if(posicao == this.totalDeElementos){ // No fim.
this.adiciona(elemento);
} else {
L
I No anterior = this.pegaNo(posicao - 1);
N
G No novo = new No(anterior.getProximo(), elemento);
U
A anterior.setProximo(novo);
G
E this.totalDeElementos++;
N
S }
D }
E

P
R public Object pega(int posicao) {
O
G return this.pegaNo(posicao).getElemento();
R
A }
M
A

public void remove(int posicao){


O
if (!this.posicaoOcupada(posicao)) {
E
throw new IllegalArgumentException("Posio no existe");
E
S
}
T
R
if (posicao == 0) {
U
T
this.removeDoComeco();
U
R
} else if (posicao == this.totalDeElementos - 1) {
A this.removeDoFim();
D
E
} else {
No anterior = this.pegaNo(posicao - 1);
D
A No atual = anterior.getProximo();
D
O No proximo = atual.getProximo();
S
UNIDADE 3 TPICO 1 179

anterior.setProximo(proximo);
proximo.setAnterior(anterior);
this.totalDeElementos--;
}
}

public int tamanho() {


return this.totalDeElementos;
}

public boolean contem(Object elemento) {


No atual = this.primeiro;
while (atual != null) {
if (atual.getElemento().equals(elemento)) {
return true;
}
atual = atual.getProximo();
}
L
return false; I
N
} G
U
A
public void removeDoComeco() { G
E
if (!this.posicaoOcupada(0)) { N
S
throw new IllegalArgumentException("Posio no existe"); D
} E

this.primeiro = this.primeiro.getProximo(); P
R
this.totalDeElementos--; O
G
if (this.totalDeElementos == 0) { R
A
this.ultimo = null; M
A
}

} O

public void removeDoFim() { E


S
if (!this.posicaoOcupada(this.totalDeElementos - 1)) { T
R
throw new IllegalArgumentException("Posio no existe"); U
T
} U
R
if (this.totalDeElementos == 1) { A

this.removeDoComeco(); D
E
} else {
D
No novo = new No(elemento); A
D
this.ultimo.setProximo(novo); O
S
180 TPICO 1 UNIDADE 3

novo.setAnterior(this.ultimo);
this.ultimo = novo;
No penultima = this.ultimo.getAnterior();
penultima.setProximo(null);
this.ultimo = penultima;
this.totalDeElementos--;
}
}

private boolean posicaoOcupada(int posicao){


return posicao >= 0 && posicao < this.totalDeElementos;
}

private No pegaNo(int posicao) {
if(!this.posicaoOcupada(posicao)){
throw new IllegalArgumentException("Posio no existe");
}
L No atual = primeiro;
I
N
for (int i = 0; i < posicao; i++) {
G
U
atual = atual.getProximo();
A
G
}
E
N
return atual;
S }
D
E
public No getPrimeiro() {
P
R return primeiro;
O
G }
R
A
M
A public void setPrimeiro(No primeiro) {

this.primeiro = primeiro;
O
}
E

E
S public No getUltimo() {
T
R return ultimo;
U
T }
U
R
A
public void setUltimo(No ultimo) {
D
E this.ultimo = ultimo;
D }
A
D
O
S
UNIDADE 3 TPICO 1 181

public int getTotalDeElementos() {


return totalDeElementos;
}

public void setTotalDeElementos(int totalDeElementos) {


this.totalDeElementos = totalDeElementos;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
No temp = primeiro;

for(int i = 0; i< this.totalDeElementos;i++){
sb.append(temp.getElemento()+" ");
temp = temp.getProximo();
L
} I
N
return sb.toString(); G
U
} A
G
E
public Object getElemento() { N
S
return elemento; D
} E

P
R
public void setElemento(Object elemento) { O
G
this.elemento = elemento; R
A
} M
A


} O

E
FONTE: O autor E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
182 TPICO 1 UNIDADE 3

RESUMO DO TPICO 1

Neste tpico vimos que:

As estruturas de dados dinmicas podem crescer e encolher durante a execuo.

As listas encadeadas so colees de itens de dados colocados em fila, sendo que as


inseres e excluses podem ser feitas em qualquer lugar da lista em uma lista encadeada.

A classe autorreferencial contm uma referncia para outro objeto do mesmo tipo de classe.
Os objetos autorreferenciais podem ser encadeados entre si para formar estruturas de dados
teis, como listas, filas e pilhas.

Criar e manter estruturas de dados dinmicas exige alocao dinmica de memria a


L capacidade de um programa obter mais espao de memria durante a execuo para
I
N armazenar novos ns e liberar espao no mais necessrio.
G
U
A
G O limite para alocao dinmica pode ser to grande quanto memria fsica disponvel no
E
N computador ou a quantidade de espao em disco disponvel em um sistema de memria
S
virtual. Frequentemente os limites so muito menores, porque a memria disponvel no
D
E
computador deve ser compartilhada entre muitos usurios.

P
R
O
O operador new recebe como operando o tipo do objeto que est sendo dinamicamente
G
R
alocado e devolve uma referncia a um objeto desse tipo recm-criado.
A
M
A A lista encadeada uma coleo linear (isto , uma sequncia) de objetos de classe

autorreferecial, denominados ns, conectados por ponteiros de referncia.


O

E
A lista encadeada acessada atravs de uma referncia ao primeiro n da lista. Cada n
E
S subsequente acessado atravs do membro de referncia de ponteiro armazenado no n
T
R anterior.
U
T
U
R Por conveno, a referncia de ponteiro do ltimo n de uma lista configurada como null
A
para marcar o fim da lista.
D
E

D O n pode conter dados de qualquer tipo, incluindo objetos de outras classes.


A
D
O
S A lista encadeada apropriada quando o nmero de elementos de dados a representar na
estrutura de dados imprevisvel.
UNIDADE 3 TPICO 1 183


IDADE
ATIV
AUTO

1 Desenvolva um programa que possibilite a insero de 25 valores do tipo inteiro


aleatrios de 0 a 100 em ordem em um objeto de lista encadeada. Ao final o programa
dever calcular a soma dos elementos e a mdia em ponto flutuante dos elementos.

2 Desenvolva um programa que crie um objeto de lista encadeada de 10 caracteres e


depois cria um segundo objeto de lista que contm uma cpia da primeira lista, mas
na ordem inversa e exiba os dados ao usurio.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
184 TPICO 1 UNIDADE 3

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3

TPICO 2

Lista Duplamente Encadeada

1 INTRODUO

Para o mtodo responsvel por remover o elemento do fim da Lista ter consumo de
tempo constante, o ltimo n deve se referir ao penltimo. Isso possvel se utilizarmos o
esquema de Lista Duplamente Encadeada, no qual os ns possuem referncias tanto para a
L
prxima, quanto para o n anterior (CAELUM, 2014). I
N
G
U
Est modificao implica alteraes na implementao dos outros mtodos, como j A
G
falamos anteriormente, as quais sero vistas a seguir. Para realizar estas mudanas, iremos E
N
criar uma nova classe, a qual chamaremos de ListaDuplamenteEncadeada e posteriormente S
copiaremos todos os mtodos j definidos na classe ListaEncadeada a fim de agilizar nosso D
E
trabalho.
P
R
O
G
R
A
M
2 Mtodo adicionaNoComeco() A


O
Para este mtodo devemos considerar dois casos: Lista Vazia e Lista no Vazia, sendo E
que para o primeiro caso o novo n ser o primeiro e o ltimo. Alm disso, ele no ter prximo E
S
nem anterior, pois ser o nico n. T
R
U
T
J no caso da Lista no encontrar-se vazia, ser necessrio ajustar os ponteiros para U
R
o novo segundo (antiga referncia primeiro) apontar para o novo primeiro e vice-versa. A

D
E

D
A
D
O
S
186 TPICO 2 UNIDADE 3

FIGURA 121 ADICIONA NO COMEO LISTA DUPLAMENTE ENCADEADA VAZIA

FONTE: O autor

FIGURA 122 ADICIONA NO COMEO LISTA DUPLAMENTE ENCADEADA NO VAZIA

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A FONTE: O autor

O FIGURA 123 CDIGO PARA ADICIONAR NO COMEO DA LISTA DUPLAMENTE ENCADEADA


E

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
FONTE: O autor
UNIDADE 3 TPICO 2 187

3 Mtodo adiciona()

Ao utilizar o mtodo adiciona(), a pessoa ser adicionada no ltimo n da lista. No caso


em que a Lista est vazia, adicionar no fim a mesma coisa que adicionar no comeo. Agora,
caso a Lista no esteja vazia ento devemos ajustar as referncias de tal forma que o novo
ltimo n aponte para o novo penltimo (antigo ltimo) e vice-versa.

FIGURA 124 ADICIONA NO FIM LISTA DUPLAMENTE ENCADEADA NO VAZIA

L
I
N
G
U
A
G
E
N
FONTE: O autor S

D
FIGURA 125 CDIGO PARA ADICIONAR NO FIM DA LISTA DUPLAMENTE ENCADEADA E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A
FONTE: O autor D
E

D
A
D
O
S
188 TPICO 2 UNIDADE 3

4 Mtodo adicionaPosicao()

Separamos os casos em que a insero no comeo ou no fim porque podemos


reaproveitar os mtodos j implementados.

Resta a situao em que a insero no meio da Lista, ou seja, entre dois ns existentes.
Neste caso, devemos ajustar as referncias para o novo n ser apontado corretamente pelos
dois ns relacionados a ele (o anterior e o prximo). E tambm fazer o novo n apontar para
o anterior e o prximo (Caelum, 2014).

Para tanto, precisaremos utilizar os mtodos pegaNo e posicaoOcupada, os quais j


foram definidos na classe ListaEncadeada e sero reaproveitados em sua ntegra, sem sofrer
qualquer alterao.

FIGURA 126 CDIGO PARA ADICIONAR EM UMA POSIO DA LISTA DUPLAMENTE


ENCADEADA

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M FONTE: O autor
A

E
S 5 Mtodo removeDoComeco()
T
R
U
T Esta operao idntica em ambos os tipos de Lista Encadeada (simples ou dupla).
U
R Ela apenas deve avanar a referncia primeira para o segundo n e tomar cuidado com o
A
caso da Lista ficar vazia, pois, neste caso, a referncia ltimo deve ser atualizada tambm
D
E (CAELUM, 2014, p. 34).
D
A
D
O
S
UNIDADE 3 TPICO 2 189

FIGURA 127 REMOVE DO COMEO LISTA DUPLAMENTE ENCADEADA COM APENAS UM


ELEMENTO

FONTE: O autor (2014)

FIGURA 128 REMOVE DO COMEO LISTA DUPLAMENTE ENCADEADA COM PELO MENOS
DOIS ELEMENTOS

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
FONTE: O autor
E
S
T
R
U
T
U
6 Mtodos removeDoFim() e remove() R
A

D
E
Estes dois mtodos j foram tratados e implementados anteriormente usando o esquema
D
de Lista Duplamente Encadeada. A
D
O
S
190 TPICO 2 UNIDADE 3

FIGURA 49 REMOVE DO FIM LISTA DUPLAMENTE ENCADEADA

FONTE: O autor

FIGURA 130 REMOVE DO INTERIOR DA LISTA DUPLAMENTE ENCADEADA

L
I
N
G
U
A
G
E
N
S

D
E

P FONTE: O autor
R
O
G
R
A

UNI
M
A

O Dentro da biblioteca da linguagem Java dispomos da classe


LinkedList, a qual faz o papel da nossa Lista Encadeada, possuindo
E
os mesmos mtodos que a ArrayList, e adiciona alguns outros,
E como o addFirst(Object), removeFirst(), addLast(Object),
S removeLast(), que operam no comeo e no fim da Lista em
T
R tempo constante.
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 2 191

RESUMO DO TPICO 2

Neste tpico vimos que:

A lista duplamente encadeada visa suprir a ineficincia de algumas operaes da lista


simplesmente encadeada, como, por exemplo, a remoo do ltimo elemento ou um elemento
intermedirio, j que necessrio percorrer toda lista para encontrar o elemento anterior.

Na lista duplamente encadeada, cada n armazena o elemento, o ponteiro para o prximo


n e para o anterior.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
192 TPICO 2 UNIDADE 3


IDADE
ATIV
AUTO

1 Desenvolva uma funo que possibilite a concatenao de duas listas duplamente


encadeadas.

2 Desenvolva uma funo que possibilite a cpia dos dados de um vetor para uma lista
duplamente encadeada.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3

TPICO 3

PILHAS

1 INTRODUO

Um determinado produto composto por diversas peas (digamos p1, p2, ...,pn). O
processo de montagem deste produto automtico (executado por uma mquina) e exige que
as peas sejam colocadas em uma ordem especfica (primeiro a p1, depois a p2, depois a p3 L
I
e assim por diante). N
G
U
A
As peas so empilhadas na ordem adequada e a mquina de montagem vai retirando G
E
pea por pea do topo desta pilha para poder montar o produto final. N
S

D
A mesma mquina que faz a montagem capaz de trocar uma pea quebrada de um E
produto j montado. P
R
O
G
O que a mquina faz desmontar o produto at chegar pea defeituosa, troc-la R
e ento depois recolocar as peas que foram retiradas. Isso tambm feito com o uso da A
M
pilha de peas. Veja a seguir o algoritmo que a mquina montadora implementa para fazer a A

manuteno de um produto com defeito.
O

E
1) Retirar e empilhar pea por pea do produto at chegar na pea defeituosa.
E
2) Retirar a pea defeituosa. S
T
3) Colocar uma pea nova sem defeitos. R
U
4) Desempilhar e montar pea por pea do topo da pilha at a pilha ficar vazia. T
U
R
FONTE: Caelum (2014, p. 1) A

D
E

D
A
D
O
S
194 TPICO 3 UNIDADE 3

2 o conceito de pilhas

A estrutura de dados denominada pilha admite a remoo e insero de novos elementos


de forma dinmica na memria, sujeitando-se a seguinte regra de operao: o elemento a ser
removido ser sempre o que est na estrutura h menos tempo.

A pilha uma verso limitada de uma lista encadeada novos nodos podem
ser adicionados a uma pilha e removidos de uma pilha apenas na parte supe-
rior (topo). Por essa razo, a pilha conhecida como uma estrutura de dados
ltimo a entrar, primeiro a sair (last-in, first-out - LIFO). O membro de link do
nodo inferior (isto , o ltimo) da pilha configurado como nulo para indicar a
base da pilha. (DEITEL E DEITEL, 2003, p. 56).

Neste sentido, as pilhas tm muitas aplicaes interessantes, principalmente na anlise


de expresses e sintaxe, como no caso das calculadoras que utilizam a Notao Polonesa
Reversa, que implementam a estrutura de dados de pilha para expressar seus valores, podendo
ser representadas de forma prefixa, posfixa ou infixa, ou ainda, os compiladores de muitas
linguagens de programao ao realizar a anlise sinttica de expresses e blocos de programas.
L
I
N
G
U
A
G
E
N
S
3 A implementao da Classe Pea
D
E
De alguma forma uma pea precisa ser representada em nosso programa. Como
P
R estamos usando orientao a objetos as peas sero representadas por objetos. Uma classe
O
G Java ser criada somente para modelar as peas, algo similar ao cdigo a seguir:
R
A
M Figura 131 CDIGO PARA IMPLEMENTAR A CLASSE PEA
A

E
S
T
R
U
T
U
R
A

D
E

D
A FONTE: O autor
D
O
S Com a classe Peca j possvel criar objetos para representar as peas que
UNIDADE 3 TPICO 3 195

a mquina montadora utiliza. Porm, o sistema deve definir como armazenar


estes objetos, ou seja, ele precisa escolher uma estrutura de dados. Esta
estrutura de dados deve manter os dados seguindo alguma lgica e deve
fornecer algumas operaes para a manipulao destes e outras operaes
para informar sobre seu prprio estado. (CAELUM, 2014, p. 3).

3.1 SOLUO DOS PROBLEMAS DAS PEAS

Para implementar o algoritmo de manuteno do carro necessrio criar uma estrutura


de dados que se comporte como a pilha de peas. Vamos chamar esta estrutura de dados
de Pilha.

Primeiro, definimos a interface da Pilha, ou seja, o conjunto de operaes que queremos


utilizar em uma Pilha.

1) Insere uma pea (coloca uma pea no topo da Pilha).


2) Remove uma pea (retira a pea que est no topo da Pilha). L
I
3) Informa se a Pilha est vazia. N
G
U
A
Podemos criar uma classe Pilha para implementar a esta estrutura de dados. Os G
E
mtodos pblicos desta classe sero a implementao das operaes. N
S
FONTE: Caelum (2014)
D
E
Figura 132 CDIGO PARA IMPLEMENTAR A CLASSE pilha P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A
FONTE: O autor
D
E

O primeiro fato importante que devemos observar que uma vez que a interface da D
A
Pilha foi definida, j saberamos usar a classe Pilha. Vamos criar uma classe de teste bem D
O
simples para exemplificar o uso de uma Pilha (CAELUM, 2014). S
196 TPICO 3 UNIDADE 3

Figura 133 CDIGO PARA IMPLEMENTAR A CLASSE de teste da pilha

FONTE: O autor

O segundo fato importante que a estrutura que queremos aqui muito similar as Listas
que vimos anteriormente. A semelhana fundamental entre as Listas e as Pilhas que ambas
devem armazenar os elementos de maneira sequencial. Este fato o ponto-chave deste Tpico.

Qual a diferena entre uma Lista e uma Pilha? A diferena est nas operaes destas
L
I duas estruturas de dados. As operaes de uma Pilha so mais restritas do que as de uma
N
G Lista. Por exemplo, voc pode adicionar ou remover um elemento em qualquer posio de
U
A uma Lista, mas em uma Pilha voc s pode adicionar ou remover do topo.
G
E
N
S Ento, uma Lista uma estrutura mais poderosa e mais genrica do que uma Pilha. A
D Pilha possui apenas um subconjunto de operaes da Lista. Ento o interessante que para
E
implementar uma Pilha podemos usar uma Lista. Isso mesmo! Vamos criar restries sobre
P
R as operaes da Lista e obteremos uma Pilha.
O
G
R
A
Ns implementamos dois tipos de Listas: Vetores e Listas Encadeadas. Vimos, tambm
M
A
que, na biblioteca do Java, h implementaes prontas para estes dois tipos de Listas. Neste

captulo, vamos utilizar a classe LinkedList para armazenar as peas que sero guardadas
O na Pilha.
E

E FONTE: Caelum (2014)


S
T
R
U
T O segundo fato importante que a estrutura que queremos aqui muito similar as Listas
U
R que vimos anteriormente. A semelhana fundamental entre as Listas e as Pilhas que ambas
A
devem armazenar os elementos de maneira sequencial. Este fato o ponto-chave deste Tpico.
D
E

D
Qual a diferena entre uma Lista e uma Pilha? A diferena est nas operaes destas
A
D
duas estruturas de dados. As operaes de uma Pilha so mais restritas do que as de uma
O
S
Lista. Por exemplo, voc pode adicionar ou remover um elemento em qualquer posio de
UNIDADE 3 TPICO 3 197

uma Lista, mas em uma Pilha voc s pode adicionar ou remover do topo.

Ento, uma Lista uma estrutura mais poderosa e mais genrica do que uma Pilha. A
Pilha possui apenas um subconjunto de operaes da Lista. Ento o interessante que para
implementar uma Pilha podemos usar uma Lista. Isso mesmo! Vamos criar restries sobre
as operaes da Lista e obteremos uma Pilha.

Ns implementamos dois tipos de Listas: Vetores e Listas Encadeadas. Vimos, tambm


que, na biblioteca do Java, h implementaes prontas para estes dois tipos de Listas. Neste
captulo, vamos utilizar a classe LinkedList para armazenar as peas que sero guardadas
na Pilha.

FONTE: Caelum (2014)

Para tanto, ser indispensvel que a classe Pilha faa a importao das referidas
bibliotecas do Java, conforme demonstra a figura a seguir:

FIGURA 134 CDIGO PARA IMPLEMENTAR A CLASSE PILHA UTILIZANDO AS BIBLIOTECAS


DO JAVA L
I
N
G
U
A
G
E
N
S

D
E

FONTE: O autor P
R
O
G
Dentro de nossa Pilha teremos uma LinkedList encapsulada, que vai simplificar bastante R
A
o nosso trabalho: delegaremos uma srie de operaes para essa Lista Ligada, porm sempre M
A
pensando nas diferenas essenciais entre uma Pilha e uma Lista.

O

Devemos ter um getPecas() que devolve uma referncia para essa nossa LinkedList? E

Nesse caso, a resposta no, pois estaramos expondo detalhes de nossa implementao, e o E
S
usurio dessa classe poderia mexer no funcionamento interno da nossa pilha, desrespeitando as T
R
regras de sua interface. sempre uma boa prtica expor o mnimo possvel do funcionamento U
T
interno de uma classe, gera um menor acoplamento entre as classes. U
R
A
FONTE: Caelum (2014)
D
E

D
A
D
O
S
198 TPICO 3 UNIDADE 3

3.2 OPERAES EM PILHAS

Agora vamos implementar as operaes da Pilha.

3.2.1 Inserir uma pea

As peas so sempre inseridas no topo da Pilha. Ainda no definimos onde


fica o topo da Pilha. Como estamos utilizando uma Lista para armazenar os
elementos ento o topo da Pilha poderia ser tanto o comeo ou o fim da Lista.
Aqui escolheremos o fim da Lista.
Ento, inserir na Pilha simplesmente adicionar no fim da Lista. (CAELUM,
2014, p. 11).

FIGURA 135 CDIGO PARA IMPLEMENTAR O MTODO ADICIONA NA PILHA

L
I
N
G
U
A
G
E
N
S

D
E

P
R FONTE: O autor
O
G
R
A Recordando que o mtodo add(Object) adiciona no fim da Lista.
M
A

E 3.2.2 Remover uma pea


S
T
R
U
T A remoo tambm bem simples, basta retirar o ltimo elemento da Lista.
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 3 199

FIGURA 136 CDIGO PARA IMPLEMENTAR O MTODO REMOVE NA PILHA

FONTE: O autor

bom observar que se o mtodo remove() for usado com a Pilha vazia ento uma
exceo ser lanada, pois o mtodo remove(int) da List lana IndexOutOfBoundsException
quando no existir elemento para remover. (CAELUM, 2014, p. 12).

L
I
N
3.2.3 Informar se a Pilha est vazia G
U
A
G
Para implementar esta operao basta verificar se o tamanho da Lista zero. Contudo, E
N
o mtodo isEmpty() j implementado e disponvel na classe LinkedList a forma mais S

convenientemente para verificar se a pilha encontra-se vazia. D


E

P
FIGURA 137 CDIGO PARA IMPLEMENTAR O MTODO PARA VERIFICAR SE A PILHA EST R
VAZIA O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

FONTE: O autor D
A
D
O
S
200 TPICO 3 UNIDADE 3

3.2.4 Generalizao

Nossa Pilha s funciona para armazenar objetos da classe Peca. Vamos generalizar a
Pilha para poder armazenar qualquer tipo de objeto. Isso ser feito utilizando a classe Object
da qual todas as classes derivam direta ou indiretamente. Criaremos uma LinkedList de Object
em vez de uma LinkedList de Peca. (CAELUM, 2014).

FIGURA 138 CDIGO PARA IMPLEMENTAR A CLASSE PILHA GENRICA

L
I
N
G
U
A
G
E
N
S

D
E
FONTE: O autor

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 3 201

Agora, podemos armazenar qualquer tipo de objeto na Pilha. Isso uma grande
vantagem, pois a classe Pilha poder ser reaproveitada em diversas ocasies. Mas, h
uma desvantagem, quando removemos um elemento da Pilha no podemos garantir qual
o tipo de objeto que vir.

No Java 5 poderamos usar Generics para solucionar este problema. A nossa classe
Pilha poderia ser uma classe parametrizada. Na criao de um objeto de uma classe
parametrizada possvel dizer com qual tipo de objeto que queremos trabalhar.

FIGURA 139 CDIGO PARA IMPLEMENTAR A CLASSE PILHA PARAMETRIZADA

L
I
N
G
U
A
G
E
N
S

D
FONTE: O autor E

P
Poderamos tambm adicionar outros mtodos, provavelmente teis a manipulao R
O
de uma pilha, como saber o tamanho da pilha, espiar um elemento em determinada posio, G
R
entre outros. Vamos testar a classe Pilha que usa Generics. A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
202 TPICO 3 UNIDADE 3

FIGURA 140 CDIGO PARA IMPLEMENTAR A CLASSE TESTEPILHA

FONTE: O autor

L Neste exemplo, criamos duas Pilhas. A primeira vai armazenar s objetos


I
N do tipo Peca e a segunda s String. Se voc tentar adicionar um tipo de
G objeto que no corresponde ao que as Pilhas esto guardando ento um
U
A
erro de compilao ser gerado para evitar que o programador cometa
G um erro lgico. (CAELUM, 2014, p. 16).
E
N
S

D
E
UNI
P
R
O Na biblioteca do Java existe uma classe que implementa a
G estrutura de dados que foi vista neste Tpico, esta classe chama-
R
A se Stack e ser testada pelo cdigo a seguir.
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 3 203

FIGURA 141 CLASSE STACK

FONTE: O autor

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
204 TPICO 3 UNIDADE 3

RESUMO DO TPICO 3

Neste tpico vimos que:

As pilhas demonstram-se importantes em compiladores e sistemas operacionais as


inseres e excluses so feitas apenas em uma extremidade de uma pilha, ou seja, seu
topo.

A pilha uma verso limitada de uma lista encadeada novos ns podem ser adicionados e
removidos apenas da parte superior de uma pilha. A pilha conhecida como uma estrutura
de dados ltimo a entrar, primeiro a sair (LIFO).

Os mtodos primrios utilizados para manipular uma pilha so push e pop (classe Stack).
O mtodo push adiciona um novo n ao topo da pilha, enquanto o mtodo pop remove um
L n do topo da pilha e devolve o objeto do n retirado.
I
N
G
U As pilhas tm muitas aplicaes interessantes. Quando feita uma chamada de mtodo, o
A
G mtodo chamado deve saber retornar para seu chamador, assim o endereo de retorno
E
N
adicionado pilha de execuo do programa. Se ocorrer uma srie de chamadas de mtodos,
S
os sucessivos valores de retorno so adicionados pilha, na ordem ltimo a entrar, primeiro
D
E
a sair, de modo que cada mtodo possa retornar para seu chamador.

P
R A tcnica de implementar cada mtodo de pilha como uma chamada para um mtodo List
O
G chamada de delegao, o mtodo de pilha invocado delega a chamada para o mtodo de
R
A List adequado.
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 3 205


IDADE
ATIV
AUTO

1 Desenvolva um programa que permita a leitura de uma linha de texto e utiliza uma
pilha para imprimir as palavras da linha na ordem inversa.

2 Uma estrutura de dados caracteriza-se como sendo um objeto do tipo LIFO, assim,
correto afirmar que:

a) Incluses ocorrem no final e excluses no incio.


b) Excluses ocorrem no final e incluses no incio.
c) Incluso de novos elementos, assim como a excluso se processa sempre no final
do objeto.
d) Excluses e incluses ocorrem no incio (primeiro elemento).
e) Podem ocorrer excluses e incluses em qualquer extremidade do objeto.
L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
206 TPICO 3 UNIDADE 3

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3

TPICO 4

FILAS

1 INTRODUO

No dia a dia, estamos acostumados com as filas em diversos lugares: nos bancos,
nos mercados, nos hospitais, nos cinemas entre outros. As filas so importantes, pois elas
determinam a ordem de atendimento das pessoas. L
I
N
As pessoas so atendidas conforme a posio delas na fila. O prximo a ser atendido G
U
o primeiro da fila. Quando o primeiro da fila chamado para ser atendido a fila anda, ou A
G
seja, o segundo passa a ser o primeiro, o terceiro passa a ser o segundo e assim por diante E
N
at a ltima pessoa. S

D
E
Normalmente, para entrar em uma fila, uma pessoa deve se colocar na ltima posio,
P
ou seja, no fim da fila. Desta forma, quem chega primeiro tem prioridade. R
O
G
R
Neste tpico estamos interessados em desenvolver estrutura de dados com o A
M
comportamento das filas. Assim como Listas e Pilhas, as Filas so estruturas de dados que A

armazenam os elementos de maneira sequencial.
O

E
Assim como as Pilhas, as Filas tm operaes mais restritas do que as operaes das
E
Listas. Nas Filas, os elementos so adicionados na ltima posio e removidos da primeira S
T
posio. Nas Listas, os elementos so adicionados e removidos de qualquer posio. R
U
T
U
Ento, podemos implementar uma Fila simplesmente colocando as restries adequadas R
A
nas operaes de adicionar e remover elementos de uma Lista. Isso bem parecido ao que
D
fizemos com as Pilhas. E

D
FONTE: Caelum (2014, p. 2) A
D
O
S
208 TPICO 4 UNIDADE 3

2 o conceito de filas

As estruturas de dados denominadas Filas, so estruturas do tipo FIFO (first-in, first-


out), ou seja, o primeiro elemento a ser inserido, ser o primeiro a ser retirado, assim sendo,
adiciona-se itens no fim e remove-se do incio.

A fila semelhante a uma fila de caixa em um supermercado a primeira


pessoa na fila atendida primeiro e os outros clientes entram na fila apenas
no final e esperam ser atendidos. Os nodos da fila so removidos apenas do
incio (ou cabea) da fila e so inseridos somente no final (ou cauda) da fila.
(DEITEL E DEITEL, 2003, p. 72).

Segundo Deitel e Deitel (2003), as filas podem ser aplicadas em diversas aplicaes
computacionais, haja vista que a maioria dos computadores tem apenas um nico processador,
logo, apenas um aplicativo pode ser atendido por vez. Desta forma, os pedidos dos outros
aplicativos so colocados em uma fila, onde cada pedido avana gradualmente para o incio
da fila medida que os aplicativos vo sendo atendidos.
L
I
N
So exemplos de uso de fila em um sistema:
G
U
A
G
Controle de documentos para impresso (spool de impresso).
E
N
Troca de mensagem entre computadores numa rede (pacotes de informaes).
S Solicitaes de acesso a arquivos em uma rede.
D
E

P
R
O
G
R 3 Interface de uso
A
M
A

Em nosso estudo de caso realizaremos uma fila de Pessoas, para tanto, precisaremos
O
criar inicialmente a classe Pessoa, responsvel por permitir a criao de objetos para representar
E
as pessoas a serem cadastradas.
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 4 209

FIGURA 142 CDIGO PARA IMPLEMENTAR A CLASSE PESSOA

FONTE: O autor

As operaes que formam a interface de uso da Fila de pessoas so:

1) Insere uma Pessoa (coloca uma pessoa no fim da Fila).


L
2) Remove uma Pessoa (retira a pessoa que est no comeo da Fila). I
N
3) Informa se a Fila est vazia. G
U
A
G
O esboo da classe Fila seria mais ou menos assim: E
N
S
FIGURA 143 CDIGO PARA IMPLEMENTAR A CLASSE FILA
D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
FONTE: O autor A

D
E
Agora que j temos a interface de uso da Fila definida vamos escrever a classe TesteFila,
D
a fim de verificar como ela deveria se comportar. A
D
O
S
210 TPICO 4 UNIDADE 3

FIGURA 144 CDIGO PARA IMPLEMENTAR A CLASSE TESTEFILA

FONTE: O autor

Importante ressaltar que a classe TesteFila somente funcionar efetivamente, aps a


realizao da implementao de cada mtodo definido na classe Fila (Figura 143). Contudo,
neste primeiro momento, para que possamos compreender o funcionamento da estrutura de
dados de uma Fila, utilizaremos a classe LinkedList do pacote java.util, para armazenar as
pessoas da Fila, a qual j traz os referidos mtodos implementados.
L
I
N FIGURA 145 IMPLEMENTAO DA CLASSE FILA A PARTIR DA CLASSE LINKEDLIST
G
U
A
G
E
N
S

D
E

P
R
O
FONTE: O autor
G
R
A
M
A

O 3.1 OPERAES EM FILA


E

E
S Na sequncia, implementaremos as operaes da Fila de pessoa.
T
R
U
T
U
R
A

D
3.1.1 Inserir uma pessoa
E

D
A As pessoas que entram na Fila devem sempre se colocar no fim da mesma. Vamos
D
O definir que o fim da Fila o fim da Lista que estamos utilizando para implementar. Ento, entrar
S
UNIDADE 3 TPICO 4 211

na Fila e adicionar no fim da Lista.

FIGURA 146 CDIGO PARA ADICIONAR UMA PESSOA NA FILA

FONTE: O autor

3.1.2 Remover uma pessoa

A prxima pessoa a ser atendida sempre a que est no incio da Fila. No nosso caso,
quem est no incio da Fila a pessoa que est no incio da Lista. L
I
N
G
Ento, basta remover a primeira pessoa. U
A
G
FIGURA 147 CDIGO PARA REMOVER UMA PESSOA DA FILA E
N
S

D
E

P
R
O
G
R
A
M
A


O

FONTE: O autor E

E
S
bom observar que se o mtodo remove() for usado com a Fila vazia ento uma T
R
exceo ser lanada, pois o mtodo removeFirst() lana IndexOutOfBoundsException quando U
T
no existir elemento para remover. (CAELUM, 2014, p. 5). U
R
A

D
E

D
A
D
O
S
212 TPICO 4 UNIDADE 3

3.1.3 Informar se a Fila est vazia

Para implementar esta operao basta verificar se o tamanho da Lista zero.

FIGURA 148 CDIGO PARA VERIFICAR SE A FILA EST VAZIA

FONTE: O autor

L Ou ainda, poder utilizar a funo isEmpty, a qual retornar um valor booleano,


I
N indicando se a Fila est ou no vazia.
G
U
A FIGURA 149 CDIGO PARA VERIFICAR SE A FILA EST VAZIA COM isEmpty
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
FONTE: O autor
E
S
T
R
U
T
U
R 3.2 GENERALIZAO
A

D
E
Nossa Fila s funciona para armazenar objetos da classe Pessoa. Vamos generaliz-
D
A la para poder armazenar qualquer tipo de objeto. Isso ser feito utilizando a classe Object da
D
O qual todas as classes derivam direta ou indiretamente. Criaremos uma LinkedList de Object
S
UNIDADE 3 TPICO 4 213

em vez de uma LinkedList de Pessoa. (CAELUM, 2014).

FIGURA 150 CDIGO DA CLASSE FILA GENERALIZADA

FONTE: O autor

Agora podemos armazenar qualquer tipo de objeto na Fila. Isso uma grande
vantagem, pois a classe Fila poder ser reaproveitada em diversas ocasies.
L
Mas, h uma desvantagem, quando removemos um elemento da Fila no I
podemos garantir qual o tipo de objeto que vir. N
A soluo para este problema utilizar o recurso do Generics. A nossa classe G
U
Fila vai ser uma classe parametrizada. Assim, quando criarmos uma Fila, A
poderemos definir com qual tipo de objetos ela deve trabalhar. (CAELUM, G
2014, p. 16). E
N
S

Conforme veremos na figura a seguir. D


E

P
FIGURA 151 - CDIGO DA CLASSE FILA GENERALIZADA E PARAMETRIZADA R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
FONTE: O autor A
D
O
S
214 TPICO 4 UNIDADE 3

Vamos criar duas Filas, uma para Pessoa e outra para String.

FIGURA 152 CLASSE TESTEFILA COM DUAS FILAS DISTINTAS

L
I
N
G
U
A FONTE: O autor
G
E
N
S
Ao executar a classe acima, teremos como sada esperada:

D
[
E A fila est vazia
P Guilherme
R
O Letcia
G
R ]
A
M
A
Em tempo de compilao verificado o tipo de objetos que esto sendo adicionados

O na Fila. Portanto, se voc tentar inserir um objeto do tipo Pessoa em uma Fila de String um
E erro de compilao ser gerado. (CAELUM, 2014, p. 17).
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 4 215

FIGURA 153 INSERO DE UM OBJETO PESSOA EM UMA FILA DE STRING

FONTE: O autor

UNI
Na biblioteca do Java, existe uma interface que define a estrutura
de dados Fila. Essa interface chama-se Queue, umas das classes
que implementam Queue a LinkedList. O funcionamento fica
extremamente semelhante com a implementao que fizemos
neste Tpico.

FIGURA 154 IMPLEMENTAO QUEUE L


I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
FONTE: O autor
E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
216 TPICO 4 UNIDADE 3

LEITURA COMPLEMENTAR

O Collections Framework

Desde a verso 1.2 do JDK (depois que o renomearam para Java 2 SDK), a plataforma
J2SE inclui um framework de colees (a Collections Framework). Uma coleo um objeto
que representa um grupo de objetos. Um framework de colees uma arquitetura unificada
para representao e manipulao de colees, permitindo que elas sejam manipuladas
independentemente dos detalhes de sua implementao.

As principais vantagens do collections framework so:

- Reduo do esforo de programao, fornecendo estruturas de dados e algoritmos teis,


para que no seja necessrio reescrev-los.

- Aumento da performance, fornecendo implementaes de alta performance. Como as vrias


implementaes de cada interface so substituveis, os programas podem ser facilmente
refinados trocando-se as implementaes.
L
I
N - Interoperabilidade entre APIs no relacionadas, estabelecendo uma linguagem comum para
G
U passagem de colees.
A
G
E
N - Reduo do esforo de aprendizado de APIs, eliminando a necessidade de se aprender vrias
S
APIs de colees diferentes.
D
E

P
- Reduo do esforo de projetar e implementar APIs, eliminando a necessidade de se criar
R
O
APIs de colees prprias.
G
R
A - Promover o reuso de software, fornecendo uma interface padro para colees e algoritmos
M
A para manipul-los.

O
O Collections Framework consiste em:
E

E
S - Interfaces de colees - representam diferentes tipos de coleo, como conjuntos, listas e
T
R arrays associativos. Estas interfaces formam a base do framework.
U
T
U
R - Implementao de uso geral - implementaes bsicas das interfaces de colees.
A

D
E - Implementaes legadas - as classes de colees de verses anteriores, Vector e Hashtable,
D foram remodeladas para implementar as interfaces de colees (mantendo a compatibilidade).
A
D
O
S - Implementaes de wrappers - adicionam funcionalidades, como sincronizao, a outras
UNIDADE 3 TPICO 4 217

implementaes.

- Implementaes convenientes - mini-implementaes de alta performance das interfaces


de colees.

- Implementaes abstratas - implementaes parciais das interfaces de colees, para


facilitar a criao de implementaes personalizadas.

- Algoritmos - mtodos estticos que performam funes teis sobre colees, como a ordenao
de uma lista.

- Utilitrios de Arrays - funes utilitrias para arrays de primitivas e objetos. Estritamente


falando, no pertence ao Collections Framework, porm, esta funcionalidade foi adicionada
plataforma Java ao mesmo tempo, e utiliza parte da mesma infraestrutura.

Colees

Collection
L
I
Interface base para todos os tipos de coleo. Ela define as operaes mais bsicas N
G
para colees de objetos, como adio (add) e remoo (remove) abstratos (sem informaes U
A
quanto ordenao dos elementos), esvaziamento (clear), tamanho (size), converso para G
E
array (toArray), objeto de iterao (iterator), e verificaes de existncia (contains e isEmpty). N
S

D
List E

P
Interface que extende Collection, e que define colees ordenadas (sequncias), onde R
O
se tem o controle total sobre a posio de cada elemento, identificado por um ndice numrico. G
R
Na maioria dos casos, pode ser encarado como um array de tamanho varivel, pois como os A
M
arrays primitivos, acessvel por ndices, alm disso, possui mtodos de insero e remoo. A


O
ArrayList
E

E
Implementao de List que utiliza internamente um array de objetos. Em uma insero S
T
onde o tamanho do array interno no suficiente, um novo array alocado (de tamanho R
U
igual a 1.5 vezes o array original), e todo o contedo copiado para o novo array. Em uma T
U
insero no meio da lista (ndice < tamanho), o contedo posterior ao ndice deslocado em R
A
uma posio. Esta implementao a recomendada quando o tamanho da lista previsvel
D
(evitando realocaes) e as operaes de insero e remoo so feitas, em sua maioria, no fim E

da lista (evitando deslocamentos), ou quando a lista mais lida do que modificada (otimizado D
A
para leitura aleatria). D
O
S
218 TPICO 4 UNIDADE 3

LinkedList

Implementao de List que utiliza internamente uma lista encadeada. A localizao de


um elemento na n-sima posio feita percorrendo-se a lista da ponta mais prxima at o
ndice desejado. A insero feita pela adio de novos ns, entre os ns adjacentes, sendo
que antes necessria a localizao desta posio. Esta implementao recomendada
quando as modificaes so feitas em sua maioria tanto no incio quanto no final da lista, e o
percorrimento feito de forma sequencial (via Iterator) ou nas extremidades, e no aleatria
(por ndices). Um exemplo de uso como um fila (FIFO - First-In-First-Out), onde os elementos
so retirados da lista na mesma sequncia em que so adicionados.

Vector

Implementao de List com o mesmo comportamento da ArrayList, porm, totalmente


sincronizada. Por ter seus mtodos sincronizados, tem performance inferior ao de uma ArrayList,
mas pode ser utilizado em um ambiente multitarefa (acessado por vrios threads) sem perigo
de perda da consistncia de sua estrutura interna.

L Em sistemas reais, essa sincronizao acaba adicionando um overhead desnecessrio,


I
N pois mesmo quando h acesso multitarefa lista (o que no acontece na maioria das vezes),
G
U quase sempre preciso fazer uma nova sincronizao nos mtodos de negcio, para
A
G \atomizarem\ operaes seguidas sobre o Vector. Por exemplo, uma chamada ao mtodo
E
N contains(), seguida de uma chamada do mtodo add() caso o elemento no exista, podem
S
causar condies de corrida, se h acessos de vrios threads ao mesmo tempo. Assim, acaba
D
E sendo necessria uma sincronizao adicional, englobando estas duas operaes e tornando
P desnecessria a sincronizao inerente da classe.
R
O
G
R Portanto, a no ser que hajam acessos simultneos de vrios threads lista, e a
A
M sincronizao simples, provida pela classe Vector, seja o bastante, prefira outras implementaes
A
como ArrayList e LinkedList, que oferecem performance superior.

E Stack
E
S
T
Implementao de List que oferece mtodos de acesso para uso da lista como uma
R
U
pilha (LIFO - Last-In-First-Out), como push(), pop() e peek(). Estende Vector, portanto herda
T
U
as vantagens e desvantagens da sincronizao deste. Pode ser usado para se aproveitar as
R implementaes das operaes especficas de pilha.
A

D
E Set
D
A
D Interface que define uma coleo, ou conjunto, que no contm duplicatas de objetos.
O
S Isto , so ignoradas as adies caso o objeto ou um objeto equivalente j exista na coleo.
UNIDADE 3 TPICO 4 219

Por objetos equivalentes, entenda-se objetos que tenham o mesmo cdigo hash (retornado pelo
mtodo hashCode()) e que retornem verdadeiro na comparao feita pelo mtodo equals().

No garantida a ordenao dos objetos, isto , a ordem de iterao dos objetos no


necessariamente tem qualquer relao com a ordem de insero dos objetos. Por isso, no
possvel indexar os elementos por ndices numricos, como em uma List.

HashSet

Implementao de Set que utiliza uma tabela hash (a implementao da Sun utiliza
a classe HashMap internamente) para armazenar seus elementos. No garante a ordem de
iterao, nem que a ordem permanecer constante com o tempo (uma modificao da coleo
pode alterar a ordenao geral dos elementos). Por utilizar o algoritmo de tabela hash, o acesso
rpido, tanto para leitura quanto para modificao.

LinkedHashSet

Implementao de Set que estende HashSet, mas adiciona previsibilidade ordem de


iterao sobre os elementos, isto , uma iterao sobre seus elementos (utilizando o Iterator) L
I
mantm a ordem de insero (a insero de elementos duplicados no altera a ordem anterior). N
G
Internamente, mantida uma lista duplamente encadeada que mantm esta ordem. Por ter que U
A
manter uma lista paralelamente tabela hash, a modificao deste tipo de coleo acarreta G
E
em uma leve queda na performance em relao HashSet, mas ainda mais rpida que uma N
S
TreeSet, que utiliza comparaes para determinar a ordem dos elementos.
D
E
SortedSet P
R
O
Interface que estende Set, adicionando a semntica de ordenao natural dos elementos. G
R
A posio dos elementos no percorrimento da coleo determinado pelo retorno do mtodo A
M
compareTo(o), caso os elementos implementem a interface Comparable, ou do mtodo A

compare(o1, o2) de um objeto auxiliar que implemente a interface Comparator.
O

E
TreeSet
E
S
T
Implementao de SortedSet que utiliza internamente uma TreeMap, que por sua R
U
vez utiliza o algoritmo Red-Black para a ordenao da rvore de elementos. Isto garante a T
U
ordenao ascendente da coleo, de acordo com a ordem natural dos elementos, definida R
A
pela implementao da interface Comparable ou Comparator. Use esta classe quando precisar
D
de um conjunto (de elementos nicos) que deve estar sempre ordenado, mesmo sofrendo E

modificaes. Para casos onde a escrita feita de uma s vez, antes da leitura dos elementos, D
A
talvez seja mais vantajoso fazer a ordenao em uma List, seguida de uma cpia para uma D
O
LinkedHashSet (dependendo do tamanho da coleo e do nmero de repeties de elementos). S
220 TPICO 4 UNIDADE 3

Map

Interface que define um array associativo, isto , ao invs de nmeros, objetos so usados
como chaves para se recuperar os elementos. As chaves no podem se repetir (seguindo o
mesmo princpio da interface Set), mas os valores podem ser repetidos para chaves diferentes.
Um Map tambm no possui necessariamente uma ordem definida para o percorrimento.

HashMap

Implementao de Map que utiliza uma tabela hash para armazenar seus elementos.
O tempo de acesso aos elementos (leitura e modificao) constante (muito bom) se a funo
de hash for bem distribuda, isto , a chance de dois objetos diferentes retornarem o mesmo
valor pelo mtodo hashCode() pequena.

LinkedHashMap

Implementao de Map que estende HashMap, mas adiciona previsibilidade ordem de


iterao sobre os elementos, isto , uma iterao sobre seus elementos (utilizando o Iterator)
L mantm a ordem de insero (a insero de elementos duplicados no altera a ordem anterior).
I
N Internamente, mantida uma lista duplamente encadeada que mantm esta ordem. Por ter que
G
U manter uma lista paralelamente tabela hash, a modificao deste tipo de coleo acarreta
A
G em uma leve queda na performance em relao HashMap, mas ainda mais rpida que uma
E
N TreeMap, que utiliza comparaes para determinar a ordem dos elementos.
S

D
E Hashtable
P
R
O Assim como o Vector, a Hashtable um legado das primeiras verses do JDK, igualmente
G
R sincronizado em cada uma de suas operaes. Pelos mesmos motivos da classe Vector, d
A
M preferncia a outras implementaes, como a HashMap, LinkedHashMap e TreeMap, pelo
A
ganho na performance.

E Properties
E
S
T
Classe que estende Hashtable, especializada para trabalhar com Strings. No
R
U
propriamente uma coleo (j que se restringe basicamente a Strings), mas serve como exemplo
T
U
de uma implementao especializada da interface Map.
R
A
IdentityHashMap
D
E

D Implementao de Map que intencionalmente viola o contrato da interface, utilizando


A
D a identidade (operador ==) para definir equivalncia das chaves. Esta implementao deve
O
S ser usada apenas em casos raros onde a semntica de identidade referencial deve ser usada
UNIDADE 3 TPICO 4 221

para equivalncia.

WeakHashMap

Implementao de Map que utiliza referncias fracas (WeakReference) como chaves,


permitindo a desalocao pelo Garbage Collector dos objetos nela contidos. Esta classe pode ser
usada como base para a implementao de caches temporrios, com dados automaticamente
desalocados em caso de pouca utilizao.

SortedMap

Interface que estende Map, adicionando a semntica de ordenao natural dos


elementos, anlogo SortedSet. Tambm adiciona operaes de partio da coleo, com os
mtodos headMap(k) - que retorna um SortedMap com os elementos de chaves anteriores a k -,
subMap(k1,k2) - que retorna um SortedMap com os elementos de chaves compreendidas entre
k1 e k2 - e tailMap(k) - que retorna um SortedMap com os elementos de chaves posteriores a k.

TreeMap
L
I
Implementao de SortedMap que utiliza o algoritmo Red-Black para a ordenao da N
G
rvore de elementos. Isto garante a ordenao ascendente da coleo, de acordo com a ordem U
A
natural dos elementos, definida pela implementao da interface Comparable ou Comparator. G
E
Use esta classe quando precisar de um conjunto (de elementos nicos) que deve estar sempre N
S
ordenado, mesmo sofrendo modificaes. Anlogo ao TreeSet, para casos onde a escrita feita
D
de uma s vez, antes da leitura dos elementos, talvez seja mais vantajoso fazer a ordenao E
em uma List, seguida de uma cpia para uma LinkedHashSet (dependendo do tamanho da P
coleo e do nmero de repeties de chaves). R
O
G
R
Interfaces auxiliares A
M
A

O framework Collections define ainda uma srie de interfaces auxiliares, que definem
O
operaes de objetos retornados por mtodos das interfaces de colees.
E

E
Iterator S
T
R
U
Interface que define as operaes bsicas para o percorrimento dos elementos da T
U
coleo. Utiliza o pattern de mesmo nome (Iterator, GoF), desacoplando o cdigo que utiliza R
A
as colees de suas estruturas internas. possvel remover elementos da coleo original
D
utilizando o mtodo remove(), que remove o elemento atual da iterao, mas esta operao E

de implementao opcional, e uma UnsupportedOperationException ser lanada caso esta D


A
no esteja disponvel. D
O
S
222 TPICO 4 UNIDADE 3

ListIterator

Interface que estende Iterator, adicionando funes especficas para colees do tipo
List. obtida atravs do mtodo listIterator() de uma List, e possui operaes de percorrimento
em ambos os sentidos (permitido pela indexao dos elementos feita pela List).

Comparable

Interface que define a operao de comparao do prprio objeto com outro, usado
para definir a ordem natural dos elementos de uma coleo. Pode ser usado caso os objetos
que sero adicionados na coleo j implementem a interface (Integer, Double, String etc.),
ou sero implementados pelo programador, que tem a chance de embutir esta interface em
seu cdigo.

Comparator

Interface que define a operao de comparao entre dois objetos por um objeto externo.
utilizado quando os objetos a serem adicionados no podem ser modificados para aceitarem
L a interface Comparable (so de uma biblioteca de terceiros, por exemplo), ou necessria a
I
N troca da estratgia de ordenao em tempo de execuo (ordenao das linhas de uma tabela,
G
U por exemplo). Esta interface prov maior flexibilidade, sem custo adicional significativo. Prefira
A
G seu uso, ao invs da interface Comparable, a no ser que esta seja necessria (isto , voc
E
N usa uma classe que espera objetos que a implementem) ou se a prpria semntica dos objetos
S
exija essa ordem natural (o que bem subjetivo e especfico do domnio/sistema).
D
E

P Enumeration
R
O
G
R \Ancestral\ da interface Iterator, que prov as mesmas funes, a no ser a retirada de
A
M elementos da coleo. Os nomes de seus mtodos so bem mais longos - hasMoreElements()
A
e nextElement() contra hasNext() e next() - o que dificulta a digitao e a leitura do cdigo.

O utilizada basicamente apenas nas classes Vector e Hashtable, podendo ser praticamente
E ignorada e substituda pela interface Iterator.
E
S
T
RandomAccess
R
U
T
U
Interface marcadora (marker interface), que apenas assinala que determinadas
R implementaes de List so otimizadas para acesso aleatrio (por ndice numrico, ao invs
A
de iterators). Esta informao pode ser usada por algumas classes, para que estas possam
D
E alterar suas estratgias internas para ganho de performance.
D
A
D Classes Utilitrias
O
S
UNIDADE 3 TPICO 4 223

Classes utilitrias, como assumidas aqui, so classes que possuem apenas mtodos
estticos, provendo algoritmos comuns.

Collections

Oferece mtodos que efetuam operaes sobre colees. Algumas operaes disponveis
so: busca binria em listas; substituio dos elementos de uma lista por um determinado
objeto; busca pelo menor ou maior elemento (de acordo com a ordem natural definida pelas
interfaces Comparable ou Comparator); inverso de uma lista; embaralhamento; deslocamento
dos elementos; obteno de colees sincronizadas ou imutveis, baseadas em colees j
existentes (atravs do pattern Decorator).

Arrays

Classe utilitria que oferece operaes sobre arrays, incluindo: ordenao, procura
binria, comparao entre arrays, preenchimento, clculo do hashCode baseados nos elementos
de um array, transformao em String e o invlucro de um array por uma implementao de
tamanho fixo de List.
L
I
Programando por Interfaces N
G
U
A
O Collections framework do Java nos fornece toda uma infraestrutura para estruturas G
E
de dados. E, por usar interfaces bsicas bem definidas (Collection, List, Set, SortedSet, Map, N
S
SortedMap), cria tambm abstraes que aumentam a flexibilidade e a facilidade de modificao.
D
E
Quando programamos usando estas classes, devemos sempre referenci-las pelas P
interfaces. Algum pode dizer: Mas no d para instanciar interfaces! Claro que no. Quando R
O
precisamos instanciar uma coleo, utilizamos a implementao concreta mais apropriada, G
R
mas os tipos de parmetros e retornos dos mtodos devem sempre ser uma destas interfaces A
M
bsicas. A


O
Por exemplo, no cdigo seguinte:
E

E
1. privateVectorlistaDeCompras; S
T
2. publicvoidsetListaDeCompras(Vectorlista){ R
U
3. this.listaDeCompras=lista; T
U
4. } R
A
5. publicVectorgetListaDeCompras(){
D
6. returnthis.listaDeCompras; E

7. } D
A
Suponha que tenhamos notado que no h acesso concorrente a este objeto, e a D
O
sincronizao inerente do Vector est impactando na performance do sistema. Para alterarmos S
224 TPICO 4 UNIDADE 3

o tipo de Vector para ArrayList, eliminando o overhead desnecessrio da sincronizao, temos


que alterar todas as classes que utilizam este mtodo, pois elas passam e esperam um Vector,
no um ArrayList. Ou pior: suponha que estas classes que utilizam nossa lista de compras
(criadas por outras equipes, portanto, mais difceis de serem alteradas) tambm tm suas
prprias estruturas internas de dados, utilizando a classe LinkedList. O inferno est mais prximo
do que voc imagina! Para passar parmetros ou receber valores preciso fazer converses
entre colees diferentes, copiando os elementos de uma para outra, aumentando ainda mais
o problema de performance, alm de dificultar a leitura e a manuteno do cdigo.

Nestes casos, se no lugar de Vector tivssemos usado a interface List, bastaria alterar
o local de instanciao da classe, que todo o resto do cdigo teria automaticamente a nova
implementao, sem modificaes. Uma coleo criada em um componente poderia facilmente
ser utilizada por outro, pois tudo o que ele espera uma implementao de List, e no uma
classe concreta.

Portanto, utilize interfaces sempre que puder, principalmente em assinaturas de mtodos


pblicos, e limite ao mximo referncias a classes concretas, mesmo internamente na classe.

L E que interface usar?


I
N
G
U Temos agora pelo menos seis interfaces para escolher: Collection, List, Set, SortedSet,
A
G Map e SortedMap. Se acrescentarmos as auxiliares de acesso coleo, temos ainda a Iterator
E
N e a ListIterator. Qual delas usar?
S

D
E A Collection a mais genrica, portanto a mais indicada sempre, certo?
P
R
O Errado! Por ser to genrica, suas operaes so muito restritas, dificultando sua
G
R manipulao. Por exemplo, ela no permite o acesso direto a um elemento, toda a leitura
A
M deve ser feita atravs de seu Iterator. Se a coleo ser sempre lida como uma sequncia de
A
elementos, e o acesso aleatrio (por ndice) no faz sentido, isto no problema. Mas se este

O tipo de acesso necessrio (ou mesmo conveniente), faz mais sentido usar uma interface List.
E

E
Este um problema sem uma resposta definitiva, pois depende muito de cada caso.
S
T
Mas posso listar algumas regras bsicas, obtidas da minha prpria experincia. No que isso
R
U
seja grande coisa, mas vale a tentativa.
T
U
R - A interface Collection normalmente usada para conjuntos descartveis, isto , que vo ser
A
lidos apenas uma vez, e no guardados internamente e manipulados (no mximo copiados
D
E para uma outra estrutura).
D - A interface Set serve mais como um marcador da semntica esperada, pois ela no acrescenta
A
D nenhuma operao Collection.
O
S - As interfaces SortedSet e SortedMap servem para forar um contrato, de que os elementos
da coleo viro ordenados. Aparecem, principalmente, como parmetros de mtodos que
UNIDADE 3 TPICO 4 225

esperam por esta ordenao. Porm, na maioria das vezes, as classes TreeSet e TreeMap
sero usadas apenas localmente, como containers temporrios de ordenao.

Exemplos de uso:

Loop tpico em uma Collection, usando o Iterator:


1. Iteratorit=colecao.iterator();
2. while(it.hasNext()){
3. Stringitem=(String)it.next();
4. System.out.println(item);
5. }

Loop tpico em um Map, usando o Iterator:


1. Mapmapa=newHashMap();
2. IteratoritChaves=mapa.keySet().iterator();
3. while(itChaves.hasNext()){
4. Objectchave=itChaves.next();
5. Objectvalor=mapa.get(chave);
6. System.out.println(chave+=+valor); L
I
7. } N
G
U
A
Usando um iterator para retirar elementos de uma coleo: G
E
1. Iteratorit=listaCores.iterator(); N
S
2. while(it.hasNext()){
D
3.Stringitem=(String)it.next(); E
4. if(item.charAt(0)==\v\){//retirandoascoresquecomeamcom\v\ P
5. it.remove(); R
O
6. } G
R
7. } A
M
A

Utilizando um TreeSet para listar o contedo de um Map/Properties de maneira ordenada:
O
1. Propertiesp=newProperties();
E
2. //...
E
3. Iteratorit=newTreeSet(p.keySet()).iterator();//ordenaaschavesantesdecriaroiterator S
T
4. while(it.hasNext()){ R
U
5. Stringkey=(String)it.next(); T
U
6. System.out.println(key+=+p.getProperty(key)); R
A
7. }
D
E

Inicializao de uma Collection: D


A
1. //Versonormal: D
O
2. ListlistaCores=newArrayList(); S
3. listaCores.add(vermelho);
4. listaCores.add(verde);
226 TPICO 4 UNIDADE 3

5. listaCores.add(amarelo);
6. listaCores.add(branco);
7.
8. //Versoabreviadautilizandoumarray
9. ListlistaCores=newArrayList(Arrays.asList(newString[]{
10. vermelho,verde,amarelo,branco}));

Criando e ordenando uma Collection:


1. ListlistaCores=newArrayList(Arrays.asList(newString[]{
2. vermelho,verde,amarelo,branco}));
3.
4. Collections.sort(listaCores);

Criando e ordenando uma Collection:


1. ListlistaCores=newArrayList(Arrays.asList(newString[]{
2. vermelho,verde,amarelo,branco}));
3.
4. Collections.sort(listaCores);
L
I
N Interseco de conjuntos utilizando Set:
G
U 1. SetcoresQuentes=newHashSet(Arrays.asList(newString[]{
A
G 2. vermelho,laranja,amarelo}));
E
N 3.
S
4. SetconjuntoCores=newHashSet(Arrays.asList(newString[]{
D
E 5. vermelho,verde,amarelo,branco}));
P 6.
R
O 7. conjuntoCores.retainAll(coresQuentes);//conjuntoCores=={vermelho,amarelo}O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
UNIDADE 3 TPICO 4 227

RESUMO DO TPICO 4

Neste tpico vimos que:

As filas representam filas de espera; as inseres so feitas na parte superior de uma fila e
as excluses so feitas na parte da frente.

A fila uma verso limitada de uma lista, sendo semelhante a uma fila de caixa de
supermercado, onde a primeira pessoa a ser atendida a primeira da fila, enquanto os
outros clientes entram na fila apenas no fim e esperam ser atendidos.

Os ns da fila so removidos apenas no incio da fila e so removidos somente no final


da fila. Por essa razo, a fila conhecida como uma estrutura de dados primeiro a entrar,
primeiro a sair (first-in, first-out - FIFO).

L
As filas tm muitas aplicaes nos sistemas de computador. A maioria dos computadores I
N
tem apenas um nico processador, portanto apenas um usurio por vez pode ser atendido. G
U
Os pedidos para os outros usurios so colocados em uma fila. O pedido no incio da fila A
G
o prximo a ser atendido. Cada entrada avana gradualmente para o incio da fila medida E
N
que os usurios so atendidos. S

D
E
As filas tambm so muito utilizadas para suportar spooling de impresso. Um ambiente
P
multiusurio pode ter s uma impressora. Muitos usurios podem estar gerando sadas para R
O
impresso. Se a impressora estiver ocupada, outras sadas ainda podem ser geradas. Estas G
R
so colocadas no spool em disco, onde esperam na fila at a impressora ficar disponvel. A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
228 TPICO 4 UNIDADE 3


ID ADE
ATIV
AUTO

1 Considerando os seguintes dados de entrada: 08, 20, 31, 13, 28, 39, 09, 19, 21, 11. Insira
os dados de entrada numa fila. Em seguida retire cada dado da fila e insira numa pilha.
Exiba a pilha. Depois retire os dados da pilha e insira na fila. Exiba a fila. Diante disso,
analise as afirmativas a seguir identificando como as estruturas sero exibidas ao usurio.

I. Pilha: (topo) 11 - 21 - 19 - 09 - 39 - 28 - 13 - 31 - 20 - 08
II. Fila: (comeo) 08 - 20 - 31 - 13 - 28 - 39 - 09 - 19 - 21 - 11 (fim)
III. Fila: (comeo) 11 - 21 - 19 - 09 - 39 - 28 - 13 - 31 - 20 - 08 (fim)
IV. Pilha: (topo) 08 - 20 - 31 - 13 - 28 - 39 - 09 - 19 - 21 - 11
V. A fila mostrada fica com os elementos em ordem invertida dos dados de entrada.

Agora assinale a alternativa correta:


L
I
N
G a) III e IV.
U
A b) II e IV.
G
E c) I, II e III.
N
S d) I, III e V.
D e) I, IV e V.
E

P
R
2 Considere uma estrutura de Fila composta por nmeros inteiros e que possui duas
O
G
operaes bsicas: Inserir(x) e Excluir( ). Alm disso, a representao do estado
R
A
da fila em determinado momento realizada listando os elementos, de forma que o
M primeiro elemento, da esquerda para a direita, o mais antigo presente na fila. Diante
A
disso, analise a sequncia de comandos a seguir, considerando que a lista comea

O vazia.
E

E Inserir (2) > Inserir (3) > Exluir ( ) > Inserir (1) > Excluir( ) > Inserir (4) > Inserir
S
T (5) Excluir ( )
R
U
T
U O estado final da fila ser:
R
A

D a) 1 2 3 4 5
E
b) 2 3 1 4 5
D
A c) 3 1 4
D
O d) 4 5
S
e) 5
UNIDADE 3 TPICO 4 229

IAO
AVAL

Prezado(a) acadmico(a), agora que chegamos ao final


da Unidade 3, voc dever fazer a Avaliao referente a esta
unidade.

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
230 TPICO 4 UNIDADE 3

L
I
N
G
U
A
G
E
N
S

D
E

P
R
O
G
R
A
M
A

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S
231

REFERNCIAS

AGUILAR, Luis J. Fundamentos de programao 3 ed.: Algoritmos, estruturas de dados


e objetos. Traduo: VALLE, Paulo H. C. Reviso Tcnica: SILVA, Flavio S. C. Dados
Eletrnicos. Porto Alegre: AMGH, 2011.

___________ Programao em C ++. Algoritmos, estruturas de dados e objetos. Traduo.


ALONSO, Maria C.; FELICE, Marines P.: 2 ed.: Dados Eletrnicos. Porto Alegre: AMGH,
2011.

AKITA, Fabio. Repensando a web com rails. Rio de Janeiro: Ed. Brasport, 2006.

ALMEIDA, Marilane. Curso essencial de lgica de programao. So Paulo: Ed. Digerati


Books, 2008.

L
ALVES, Ricardo. Recursividade em Java. Disponvel em: <http://www.linhadecodigo.com. I
N
br/artigo/3316/recursividade-em-java.aspx#ixzz3EQu8W9rl>. Acesso em: 08 set. 2014. G
U
A
G
ANCIBE. Conceitos bsicos de linguagem de programao C. Disponvel em: <http:// E
N
www.ancibe.com.br/Apostila%20de%20Algoritmos/apostila%20de%20linguagem%20C%20 S

otima.pdf>. Acesso em: 08 set. 2014. D


E
ARENALES, Marcos; et al. Pesquisa operacional. Rio de Janeiro: Ed. Elsevier, 2011.
P
R
O
BARBOSA, Eduardo; MIYOSHI, Ronaldo A.; GOMES, Marco D. G. Tipos abstratos de G
R
dados. 2008. Disponvel em: <http://www2.dc.ufscar.br/~bsi/materiais/ed/u2.html>. Acesso A
M
em: 3 out. 2014. A


O
BERG, Alexandre; FIGUEIR, Joice P. Lgica de programao. Canoas: Ed. Ulbra, 2006.
E

E
BORAKS, Silvio. Programao com Java: Uma Introduo Abrangente. Rio de Janeiro. Ed. S
T
Bookman, 2013. R
U
T
U
BRAZ. Maria H. Conceitos bsicos de programao. Disponvel em: <https://fenix.tecnico. R
A
ulisboa.pt/downloadFile/3779571246306/aula78911.pdf>. Acesso em: 10 Set. 2014.
D
E
BROOKSHEAR, Glenn J. Cincia da computao, uma viso abrangente. Porto Alegre: D
Ed. Bookman, 2013. A
D
O
S
232

C Progressivo. Funes recursivas: pra aprender recursividade, tem que saber


recursividade. Disponvel em: <http://www.cprogressivo.net/2013/03/O-que-sao-e-como-
usar-funcoes-recursivas-em-linguagem-C.html

CAELUM. Algoritmos e estruturas de dados em java. Disponvel em:


<http://www.ime.usp.br/~cosen/verao/alg.pdf>. Acesso em: 10 out. 2014.

CELES, Waldemar; RANGEL, Jos Luis. Cadeia de caracteres. Disponvel em: <http://
www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap06.pdf>. Acesso em: 1 out.
2014.

__________. Conceitos Fundamentais. 2002. Disponvel em: <http://www.ic.unicamp.


br/~ra069320/PED/MC102/1s2008/Apostilas/Cap01.pdf>. Acesso em: 08 set. 2014.

CENAPAD-SP. Introduo ao Fortran 90. Disponvel em: <http://www.fis.ufba.br/~edmar/


fortran/fortran_apostila.pdf>. Acesso em: 3 out. 2014.

CHAPRA, Steven C. Mtodos numricos aplicados com MATLAB para engenheiros e


L cientistas. Porto Alegre: AMGH, 2012.
I
N
G
U COCIAN, Luis Fernando Espinosa. Manual da linguagem C. Canoas. Ed. ULBRA, 2004,
A
G 500p.
E
N
S
CODEPAD. Disponvel em: <http://codepad.org/>. Acesso em: 08 Set. 2014.
D
E

P COSTA, Daniel G. Administrao de redes com scripts: Bash Script, Python e VBScript. 2
R
O ed. Rio de Janeiro: Ed. Brasport, 2010.
G
R
A
M
COSTA, Umberto S.; NETA, Natlia, S. L. Matemtica aplicada. Disponvel em: <http://
A

www.metropoledigital.ufrn.br/aulas/disciplinas/mat_aplicada/aula_07.html>. Acesso em: 1

O
out. 2014.

E
CRUZ, Adriano. Ponteiros. 1999. Disponvel em: <http://equipe.nce.ufrj.br/adriano/c/apostila/
E
S ponte.htm#matrizes>. Acesso em: 3 out. 2014.
T
R
U
T Deitel. Harvey M.; DEITEL. Paul J. Java, como programar. Traduo Carlos Arthur Lang
U
R Lisba, 4. ed. Porto Alegre: Bookman, 2003.
A

D
E DORNELLES, Adalberto A. F. Fundamentos Linguagem de C. 1997. Disponvel em:
D <http://www.ebah.com.br/content/ABAAAAmX8AL/fundamentos-linguagem-c>. Acesso em:
A
D 08 set. 2014.
O
S
233

EDELWEISS, Nina; LIVI, Maria A. C. Algoritmos e programao com exemplos em


Pascal e C. Porto Alegre: Ed. Bookman, 2014.

EDELWEISS, Nina; GALANTE, Renata. Estrutura de dados. Porto Alegre: Ed. Bookman,
2009.

____________. Estruturas de dados: Volume 18. Porto Alegre: Bookman, 2009.

FARIAS, Ricardo. Estrutura de dados e algoritmos. Disponvel em: <http://www.cos.ufrj.


br/~rfarias/cos121/pilhas.html>. Acesso em: 10 set. 2014.

FEIJ, Bruno; SILVA, Flvio S. C.; CLUA, Esteban. Introduo cincia da computao
Com Jogos. Rio de Janeiro: Ed. Elsevier, 2010.

FEOFILOFF, Paulo. Algoritmos em linguagem C. Rio de Janeiro: Ed. Campus/Elsevier,


2009.

FIALHO, Rodrigo. Operadores aritmticos com variveis, MsgBox e Chr VBA. L


I
Disponvel em: <http://doutorexcel.wordpress.com/2011/03/11/operadores-aritmeticos-com- N
G
variaveis-no-vba/>. Acesso em: 10 set. 2014. U
A
G
E
FILHO, Antnio, M. S. Introduo programao orientada a objetos com C++. Rio de N
S
Janeiro: Ed. Elsevier, 2011.
D
E
FIORESE, Virgilio. Wireless - Introduo s Redes de Telecomunicao Mveis Celulares. P
Rio de Janeiro: Ed. Brasport, 2005. R
O
G
R
FONTES, Fbio F. C. Estrutura e representao. 2009. Disponvel em: <http://www2. A
M
ufersa.edu.br/portal/view/uploads/setores/146/arquivos/aula%205%20-%20Estrutura%20 A

e%20Representa%C3%A7%C3%A3o.ppt>. Acesso em: 3 out. 2014.
O

E
FROZZA, Angelo Augusto. Estrutura de dados variveis compostas. Disponvel
E
em: <http://www.ifc-camboriu.edu.br/~frozza/2011.1/IX10/IX10-EDD-Aula004- S
T
VariaveisCompostas-parcial.pdf >. Acesso em: 1 out. 2014. R
U
T
U
GARCIA, Vincius. Mtodos computacionais. Tipos estruturados. 2010. Disponvel em: R
A
<http://viniciusgarcia.files.wordpress.com/2010/08/aulatiposestruturados.pdf>. Acesso em: 1
D
out. 2014. E

D
A
GACHO, Felipe. Bsico e intermedirio. Disponvel em: <http://www.milfont.org/blog/wp- D
O
content/upload/Manual.pdf>. Acesso em: 10 set. 2014. S
234

GOODRICH, Michael T.; TAMASSIA, Roberto. Projeto de algoritmos, fundamentos,


anlise e exemplos da internet. Porto Alegre: Ed. Artmed, 2002.

_________. Estrutura de dados e algoritmos em java. Traduo Bernardo Copstein e


Joo Batista Oliveira, 2. ed. Porto Alegre: Bookman, 2002.

GRIFFITHS, David e GRIFFITHS, Dawn. O guia amigo do seu crebro. Use a cabea!
(Head First) Rio de Janeiro: Ed. Alta Books, 2013.

GUIMARES, ngelo M.; LAGES, Newton, A. C. Algoritmo e estrutura de dados. Rio de


Janeiro: Ed: LCT, 2013.

HORSTMANN, Cay. Conceitos de computao com Java. Porto Alegre: Ed. Bookman,
2008.

HOROWITZ, Ellis; SAHNI, Sartaj. Fundamentos de estrutura de dados. Traduao


RAWICKI, Thomaz R. Rio de Janeiro: Ed. Campus, 1987.
L
I
N JAVA. O que a tecnologia Java e porque preciso dela. Disponvel em: <http://www.java.
G
U com/pt_BR/download/faq/whatis_java.xml>. Acesso em: 08 set. 2014.
A
G
E
N Javafree.org. O collections Framework. Disponvel em: <http://javafree.uol.com.br/
S
artigo/847654/Collections-Framework.html>. Acesso em: 18 nov. 2014.
D
E

P JPROFESSOR. Estruturas de pilhas em Java. Disponvel em: <http://jprof.pro.br/


R
O exemplos.html#arquivob1>. Acesso em: 10 set. 2014.
G
R
A
M
JUNIOR, Dilermando P.; et al. Algoritmos e programao de computadores. Rio de
A

Janeiro: Ed. Elsevier, 2012.

E
Laboratrio de Programao I. Estruturas de Dados Homognea. Disponvel em: <http://cae.
ucb.br/conteudo/programar/labor1/new_matriz.html>. Acesso em: 3 out. 2014.
E
S
T
R LAUREANO, Marcos. Estrutura de dados com algoritmos. Rio de Janeiro. Brasport. 2008.
U
T
U
R LEITE, Mario. Tcnicas de programao. Uma abordagem Moderna. Rio de Janeiro: Ed.
A
Brasport, 2006.
D
E

D LIMA, Edirlei S. INF 1007 Programao II. Aula 12 Tipos Abstratos de Dados. Disponvel
A
D em: <http://edirlei.3dgb.com.br/aulas/prog2_2014_1/Prog2_Aula_12_TAD.pdf>. Acesso em:
O
S 3 out. 2014.
235

_________. Programao II. Disponvel em: <http://edirlei.3dgb.com.br/aulas/


prog2_2014_1/Prog2_Aula_08_Vetor_Ponteiros_2014.pdf>. Acesso em: 1 out. 2014.

LIMA, Isaias. Introduo estrutura de dados. Disponvel em: <http://www.isaias.unifei.


edu.br/Introducao_ED.pdf >. Acesso em: 1 out. 2014.

LIPSON, Marc e LIPSCHUTZ, Seymour. Matemtica discreta. Porto Alegre: Ed. Bookman,
1997.

LOPES, Arthur V. Introduo programao com ADA 95. Canoas: Ed. Ulbra, 1997.

LOPES, Gills V. Miniturial compilando e rodando programa C no GNU/Linuxmore.


Disponvel em: <http://www.academia.edu/4297165/Minitutorial_Compilando_e_rodando_
programas_C_no_GNU_Linux>. Acesso em: 08 set. 2014.

LORENZI, Fabiano; LOPES, Arthur V. Linguagem de programao Pascal. Canoas: Ed.


Ulbra, 2000.
L
I
LORENZI, MATTOS e CARVALHO 2007. Disponvel em: <file:///C:/Users/05524964992/ N
G
Downloads/85-221-0556-1.pdf>. Acesso em: 10 set. 2014. U
A
G
E
MACEDO, Diego. Converses de Linguagens: Traduo, Montagem, Compilao, N
S
Ligao e Interpretao. Disponvel em: <http://www.diegomacedo.com.br/conversoes-de-
D
linguagens-traducao-montagem-compilacao-ligacao-e-interpretacao/>. Acesso em: 08 set. E
2014. P
R
O
MARTIN, John H. Programao com objective C. 5 ed. Porto Alegre: Ed. Bookman, 2014. G
R
A
M
MATTOS, rico T. Programao Java para Wireless. So Paulo: Ed. Digerati Books, 2005. A


O
MEDEIROS, Higor. Trabalhando com Arrays. Disponvel em: <http://www.devmedia.com.
E
br/trabalhando-com-arrays/5212#ixzz3EeKpuuUh>. Acesso em: 10 set. 2014.
E
S
T
MELO, Pedro O. S. Vaz. Algoritmos e estruturas de dados I. Disponvel em: <http:// R
U
homepages.dcc.ufmg.br/~olmo/aula9-estruturas.pdf>. Acesso em: 1 out. 2014. T
U
R
A
MENDES, Antonio S. F. Introduo programao orientada a objetos com C++. Rio de
D
Janeiro: Ed. Elsevier, 2011. E

D
A
MITCHELL, Mark; OLDHAM, Jeffrey e SAMUEL, Alex. Programao linux avanada. Ed. D
O
S
236

First, 2001.

MOKARZEL, Fbio; SOMA, Nei Y. Introduo Cincia da Computao. Rio de Janeiro: Ed.
Elsevier, 2008.

NETO, Samuel D. Linguagem C intermedirio. Disponvel em: <http://homepages.dcc.


ufmg.br/~joaoreis/Site%20de%20tutoriais/c_int/index.htm#matrizes>. Acesso em: 3 out.
2014.

OLIVEIRA, Gabriel A. Matriz simtrica. Disponvel em: <http://www.mundoeducacao.com/


matematica/matriz-simetrica.htm>. Acesso em: 3 out. 2014.

PALMEIRA, Thiago V. V. Trabalhando com arrays em Java. Disponvel em: <http://www.


devmedia.com.br/trabalhando-com-arrays-em-java/25530>. Acesso em: 10 set. 2014.

PEREIRA, Silvio L. Estruturas de dados fundamentais. Conceitos e Aplicaes. So


Paulo: Ed. rica, 1996.

L PERRY, Greg. Aprenda em 21 dias Visual Basic 6. Traduo FURMANKIEWICZ, Edson.


I
N Rio de Janeiro: Ed. Elsevier, 1999.
G
U
A
G PINHEIRO, Francisco A. C. P. Elementos de programao em C. Dados Eletrnicos. Porto
E
N Alegre: Bookman, 2012.
S

D
E RAMOS, Vincius M; NETO, Joo N.; VEGA, talo S. Linguagens formais. Porto Alegre: Ed.
P Artmed, 2009.
R
O
G
R REBOLLO, Carlos. Introduo linguagem C. 2013. Disponvel em: <http://www.cenapad.
A
M
unicamp.br/servicos/treinamentos/apostilas/apostila_C.pdf>. Acesso em: 09 out. 2014.
A

O
RITA, Sandra. Treinamento em lgica de programao. So Paulo: Ed. Digerati Books,

E
2009.

E
S ROCHA, Csar. Linguagem C: Estruturas e Alocao Dinmica. 2010. Disponvel em:
T
R <http://www.linuxemais.com/cesar/_media/disciplinas/pged/pged_02.pdf>. Acesso em: 10
U
T Set. 2014.
U
R
A
RODRIGUES, Diego M. Linguagem C (Algoritmos). Disponvel em: <http://www.ebah.
D
E com.br/content/ABAAABacgAB/linguagem-c-algoritmo>. Acesso em: 08 set. 2014.
D
A
D S, Robison. Transposio de matrizes. Disponvel em: <http://www.infoescola.com/
O
S matematica/transposicao-de-matrizes/>. Acesso em: 3 out. 2014.
237

SCHEPP, Lus G. 5 dia de Treinamento SAP. 2011. Disponvel em: <http://luisgustavosap.


blogspot.com.br/>. Acesso em: 10 set. 2014.

SCHUTZER, Waldeck; MASSAGO, Sardo. Programao Java. Disponvel em: <http://


www.dm.ufscar.br/~waldeck/curso/java/>. Acesso em: 10 set. 2014.

SEBESTA, Roberto W. Conceitos de linguagem de programao. Porto Alegre: Ed.


Bookman, 2010.

SERSON, Roberto R. Programao orientada a objetos com Java 6: Curso Universitrio.


Rio de Janeiro: Ed. Brasport, 2007.

SOMERA, Guilherme. Treinamento Profissional em Java. So Paulo: Ed. Digerati Books,


2006.

SOUZA, Jackson G. Paradigmas de linguagem de programao. 2009. Disponvel em:


<http://plp2009c.wordpress.com/>. Acesso em: 10 set. 2014.

VEGA, Italo S. Ciclo de programao. 2004. Disponvel em: <http://www.pucsp.br/~dcc- L


I
lp/2004/c22/pucsp-lp-c22-2004-02.pdf>. Acesso em: 10 set. 2014. N
G
U
A
VELOSO, Paulo; SANTOS, Clesio; AZEREDO, Antonio. Estrutura de dados. Rio de G
E
Janeiro: Ed. Elsevier, 1983. N
S

D
WordPress. CEULP. Paradigmas de Linguagem de Programao 2009/1 Ceulp. E
Disponvel em: <http://plp2009c.wordpress.com/>. Acesso em: 08 set. 2014. P
R
O
XAVIER, Denys W. Funes. 2010. Disponvel em: <http://www.tiexpert.net/programacao/ G
R
java/funcoes.php>. Acesso em: 10 set. 2014. A
M
A


O

E
S
T
R
U
T
U
R
A

D
E

D
A
D
O
S

Você também pode gostar