Escolar Documentos
Profissional Documentos
Cultura Documentos
#PraCegoVer: Nesta figura temos um trecho de có digo de 8 linhas. Enumerando cada linha temos:
Agora que já sabemos o que são abstraçõ es, precisamos estudar alguns pontos relevantes que todo
programador de Java deve compreender para o efetivo estudo de uma estrutura de dados. Vamos em frente!
Memórias voláteis
As que armazenam os dados de forma temporária são chamadas de memórias voláteis , em que
o conteú do armazenado é apagado quando encerramos o computador. Temos como exemplo a
memó ria de acesso aleató rio ou, como conhecemos, memó ria RAM (Random Access Memory).
Já a memó ria que armazena os dados de forma definitiva é chamada de memória não volátil ,
pois não perde os dados quando o computador é desligado, ou seja, não necessita de pulsos
elétricos magnéticos para mantê-los.
Temos, então, que as memó rias são dispositivos que permitem o armazenamento de informaçõ es e
programas, podendo ser voláteis (no caso de programas) ou não. Atallah e Blanton (2010) descrevem a
existência de dois tipos de memó rias para a execução de programas: memó ria interna (RAM) e memó ria
externa (disco rígido).
A memória interna é mais rápida que a externa, porém com capacidade de armazenamento menor. Assim, no
caso de estruturas de dados projetadas para trabalhar com grandes quantidades de dados, é necessário utilizar
o armazenamento na memória externa. Esta, por sua vez, é mais lenta, pois é composta por um meio
magnético, ficando ligadas diretamente à CPU e podem ser desconectadas fisicamente do computador sem
perder informaçõ es, além de possuir um espaço superior ao da memó ria interna.
Quando executamos um programa, ele é alocado na memó ria e executado; já quando finalizado, é retirado da
memó ria. A administração dos recursos no uso da memó ria é realizada pelo Sistema Operacional, que
controla as partes que estão disponíveis ou não. Devido a isso, em determinados momentos, existem locais
que estão ocupados e outros que estão livres. Dentro desses espaços, podemos armazenar variáveis estáticas
e variáveis dinâmicas.
De acordo com Atallah e Blanton (2010), alguns tó picos são relevantes para a compreensão das estruturas de
dados, como a diferença de uma estrutura estática e de uma estrutura dinâmica, assim como também temos
os dados implícitos e os explícitos.
Existem, ainda, mecanismos de organização de dados. Munro e Suwanda (1980) descrevem que a informação
estrutural está implícita na forma como os dados são armazenados, em vez de explícitas, com a utilização de
ponteiros.
Um exemplo de estrutura de dados implícita são os vetores e a matriz, que requerem apenas a sobrecarga
constante do comprimento. Por outro lado, uma estrutura de dados explícita, como a lista vinculada,
possui um ponteiro que “aponta” para o pró ximo. É importante mencionar, nesse sentido, que a linguagem
Java não possui variáveis de ponteiro, mas variáveis de referência. Todas as variáveis que se referem aos
objetos são de referência.
VOCÊ O CONHECE?
James Gosling é um programador que ficou conhecido como o “pai” da linguagem de
programaçã o Java. James, na dé cada de 1990, chefiava uma equipe de programadores
que desenvolveu a linguagem Java, linguagem compilada para um bytecode que é
interpretado por uma má quina virtual, o Java Virtual Machine (JVM). James també m
programou uma versã o do editor de texto “Emacs” do sistema Unix, usado por
programadores e usuá rios que necessitam desenvolver documentos té cnicos. Antes de
se juntar à Sun Microsystems, construiu uma versã o do Unix para má quinas
multiprocessadas, assim como compiladores e sistemas de mensagens eletrônicas
(SCHOFIELD, 2007).
As características de uma classe podem ser dadas por meio de atributos, que são os dados que desejamos
armazenar. Por exemplo, na classe “automó vel”, podemos armazenar os atributos cor, marca, ano, velocidade,
preço e modelo, conforme vemos no esquema retratado na figura a seguir.
Figura 2 - Exemplificação da classe “automó vel” com seus atributos, métodos e objetos
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A imagem mostra uma classe chamada Automó vel que possui como atributos: cor, marca,
ano, velocidade, preço e possui como métodos: ligar(), acelerar(), frear(), trocar_marcha(), desligar(). Ao
lado desta figura tem duas setas apontando para dois possíveis objetos que podem ser criados com essa
figura. Fusca e Carmaro respectivamente.
Dessa forma, uma classe é um modelo para a criação de objetos, que terá as mesmas características da classe
à qual pertence. É na classe que se define o tipo do objeto, especificando os atributos e métodos. Clique nas
abas, para conhecer mais sobre o tema.
O objeto, por sua vez, é uma instância de uma classe que também possui variáveis e
métodos. A classe “automó vel” é formada pelos objetos Fusca e Camaro, por
exemplo. Assim, todos os objetos têm em comum o fato de serem automó veis, mas
Objeto
podem ter características diferentes entre si, como o preço, pois o valor de um Fusca
é diferente do valor de um Camaro; assim como a velocidade que Fusca pode chegar,
que também é diferente da velocidade limite de um Camaro.
Quando desejamos criar mais um objeto, é necessário instanciar. Assim, a instância
Instanciar de uma classe é um novo objeto, sendo que uma classe somente poderá ser utilizada
apó s ser instanciada, ou seja, chamada.
Agora que já aprendemos o que é classe, objeto e instância, podemos prosseguir e aprender mais sobre as
variáveis, que são os atributos que desejamos armazenar.
#PraCegoVer: A figura mostra um trecho de có digo com 12 linhas de programa. Enumerando cada linha
temos:
Uma variável de referência, por outro lado, armazena as localizaçõ es do objeto na memó ria do computador e é
iniciada pelo valor null. Os objetos que são referenciados podem conter várias variáveis de instância e
métodos. Assim, para conseguirmos acessar um objeto e seus métodos de instância, é preciso ter referência a
algum objeto.
CASO
Imagine que desejamos armazenar os dados dos alunos para um programa de
uma escola. Para implementá -lo, devemos escolher um termo abstrato que
represente todas as características e funções bá sicas de um aluno, ou seja, a
classe. Vamos chamar nossa classe de “aluno”, mas també m poderíamos optar por
“estudante” ou outro termo que encaixe no contexto. As características ou os
atributos que podemos armazenar na classe sã o dados como o nome, o telefone
para contato, o endereço, o nú mero da matrícula, as disciplinas, entre outras
informações.
Alé m dos atributos, a classe “aluno” també m conta com funções e, no caso, as
funções poderiam ser: cursar a disciplina, assistir à s aulas, fazer uma prova, fazer
um exercício, apresentar um seminá rio, entre outras. Assim, cada aluno que for
cadastrado terá todas as características e funções que a classe possui.
Vamos considerar um projeto no qual precisamos armazenar informaçõ es sobre automó veis. “Automó vel” é o
termo abstrato que utilizaremos para guardar os dados dos futuros veículos automotores que serão inseridos
no programa. Para iniciar o projeto, devemos responder as seguintes perguntas: quais são as variáveis que
devemos armazenar no projeto de automó veis? Quais são as funçõ es básicas de um automó vel? Como
conseguiremos acessar as informaçõ es desse projeto?
Os atributos relevantes para um automó vel são cor, marca, ano, modelo, velocidade, preço etc. As funçõ es
básicas ou operaçõ es, por sua vez, são o ligar, o acelerar, o frear, o trocar a marcha e o desligar. Assim, para
acessar as informaçõ es de um projeto, devemos usar as variáveis de referência, que são todas aquelas que se
referem aos objetos.
Vamos trabalhar, aqui, com a classe “automó vel”. Com as informaçõ es dos atributos e métodos, podemos
começar a criar um projeto para cadastro de automó veis. Para criar uma classe, devemos, primeiramente,
declarar suas variáveis:
Figura 4 - Declaração da variável do exemplo
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A figura mostra um trecho de có digo de 6 linhas de programa. Enumerando cada linha temos:
Agora que já temos uma classe em Java, que especifica todas as características que um objeto deve conter,
vamos criar um objeto. Para isso, teremos que utilizar o “Projeto.java” para instanciar o objeto, utilizando a
palavra “new”.
Figura 5 - Projeto.java para instanciar objeto
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A figura mostra um trecho de có digo de 5 linhas. Enurando cada linha temos:
O có digo anterior cria um objeto de classe “automó vel”, porém, para acessá-lo, é necessário referenciar o
objeto, por isso, precisamos de uma variável.
Figura 6 - Referenciando objeto por meio de uma variável
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A imagem mostra um trecho de có digo de 6 linhas de programa. Enumerando cada linha
temos:
Por meio do objeto “fusca”, podemos acessar e alterar todas as variáveis que foram declaradas na classe
“automó vel”. Lembre-se de que o objeto é uma instância de uma classe e possui variáveis e métodos da classe.
Figura 7 - Alteração das variáveis
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A imagem mostra um trecho de có digo de 11 linhas de programa: Enumerando cada linha
temos:
Na classe também declaramos os métodos, que são as funçõ es ou os comportamentos da classe, como a
função liga ().
Figura 8 - Declaração dos métodos na classe
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A imagem mostra um trecho de có digo de 11 linhas de programa. Enumerando cada linha
temos:
Temos, com essas construçõ es, os có digos para a criação de classe, seus atributos e métodos. Além disso,
também instanciamos o objeto da classe.
VAMOS PRATICAR?
Crie, na linguagem Java, uma classe com o nome “Gato” e descreva pelo
cinco atributos e quatro mé todos que a classe pode possuir. Depois, crie os
“Persa”, “Siamê s” e “Ragdool” para a classe em questã o.
Na sequência, vamos aprender o que é a estrutura de dados e a diferença entre as estruturas homogêneas e as
heterogêneas. Vejamos!
Os vetores são estruturas que permitem o acesso a uma grande quantidade de dados em memó ria, usando
apenas um nome de variável do vetor. Um vetor também pode ser chamado de matriz de uma dimensão.
Para calcular a média de 100 valores, por exemplo, criamos um vetor com 100 posiçõ es (de 0 a 99). Para
percorrer o vetor, criamos um laço de repetição, que faz a soma de todos os nú meros e, depois, faz o cálculo
da média. Esse laço de repetição que utilizamos para manipular o vetor implica em ganho de tempo e diminui
muitas linhas de có digo, pois o programador não precisa criar 100 variáveis.
Veja um vetor retratado na figura a seguir.
Figura 9 - Representação de um vetor, iniciado na posição 0
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A imagem mostra 5 quadrados, um ao lado do outro. Abaixo de cada quadrado tem uma
numeração em que o primeiro quadrado tem o nú mero 0, o segundo tem nú mero 1, o terceiro tem nú mero 2
e por fim o ú ltimo tem nú mero n.
A figura apresenta um vetor de n posiçõ es. Note que ele é iniciado na posição 0. O vetor em Java é iniciado em
0 e seu valor vai crescendo até a ú ltima posição do vetor. Tamassia e Goodrich (2006, p. 50) descrevem que
“[…] essa forma de organização é extremamente ú til, na medida em que permite computaçõ es interessantes”,
pois podemos percorrer se forma mais ágil um vetor por meio dos laços de repetição. Por ser uma estrutura
de dados unidimensional, ela “cresce” em apenas uma direção.
Imagine que temos um vetor com 50 posiçõ es e só foram preenchidas as 10 primeiras. Dessa forma,
precisamos imprimir os dados na ordem inversa. O que ocorre com os locais que reservamos no vetor que
não foram preenchidos? Eles contêm valores indefinidos que já estavam na memó ria quando o programa
começou a ser executado, por isso, esses valores são chamados de “lixo de memó ria”.
As estruturas multidimensionais homogêneas, por outro lado, são estruturas compostas por duas ou
mais dimensõ es chamadas de “matriz”, que pode ser considerado um vetor de vetores. A matriz, assim como
o vetor, também é uma estrutura de dados simples, sendo uma coleção de variáveis do mesmo tipo, em que é
reservado uma posição no endereço de memó ria da memó ria principal.
A matriz é um array bidimensional ou até um n-dimensional, sendo que cada posição possui um índice,
composto por linhas e colunas para ser acessado, conforme podemos ver na figura a seguir.
Figura 10 - Representação da matriz, composta por linhas e colunas
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A imagem mostra 25 quadrados dispostos em formato matricial, em que na primeira fileira
temos 5 quadrados, um ao lado do outro, na fileira de baixo temos outros 5 quadrados dispostos da mesma
maneira e assim suvessivamente até a quinta e ú ltima fileira.
Na figura anterior, podemos perceber que a matriz possui linhas e colunas que variam de 0 até n. Quando
queremos especificar um elemento da matriz, devemos especificar, também, em qual linha e qual coluna o
elemento está situado. Por exemplo, o elemento destacado em preto na figura pode ser representado por [0,0].
Primeiramente, fazemos o cruzamento da posição da linha e, em seguida, da posição da coluna.
Figura 11 - Matriz tridimensional, com eixos x, y e z
Fonte: Elaborada pela autora, 2019.
Caso a matriz possua mais dimensõ es, como na figura anterior, deve-se fazer o cruzamento de todas as
dimensõ es por meio dos índices. Por exemplo, no plano tridimensional da figura, temos as dimensõ es x, y e z.
Quando desejamos especificar um elemento da matriz, devemos fazer os cruzamentos dos eixos [x, y, z]. O
elemento destacado é [0,1,0], em que x = 0, y = 1 e z = 0.
Agora que compreendemos a diferente entre os tipos de estruturas de dados, na sequência, vamos aprender
como declaramos as estruturas de dados com a linguagem de programação Java. Vejamos!
#PraCegoVer: A imagem mostra 5 quadrados dispostos um ao lado do outro. Em baixo de cada quadrado
tem um texto. Embaixo do primeiro quadrado está escrito vetor[0], embaixo do segundo está está escrito
vetor[1], embaixo do terceiro está escrito vetor[2], embaixo do quarto está escrito vetor[3] e embaixo do
quinto está escrito vetor[4].
Para percorrer um vetor, precisamos do auxílio do laço de repetição (for, por exemplo), para não ser
necessário digitar elemento por elemento.
Observe a figura a seguir, em que temos a inserção de dados, a impressão dos dados e a soma dos elementos
armazenados. A parte reta é o output do console.
Figura 13 - Có digo em Java com criação de um vetor
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A imagem mostra um trecho de có digo de 20 linhas de programa. Enumerando cada linha
temos:
No canto superior direito da imagem tem um quadrado preto com letras brancas mostrando a saída da
execução desse programa. Enuramendo cada linha temos:
Linha 1: 0
Linha 2: 5
Linha 3: 10
Linha 4: 15
Linha 5: 20
Linha 6: Soma dos numeros armazenados no vetor: 50
Na figura anterior, temos a classe “criando vetor”, que está criando um vetor de tamanho 5. No primeiro laço
de repetição for, o programa armazena nú meros inteiros mú ltiplos de 5: [0,5,10,15,20]. No segundo laço, ele
percorre todo o vetor e imprime o resultado. No ú ltimo laço de repetição, é realizada a soma de todos os
elementos do vetor, sendo armazenados na variável “soma”.
Quando alocamos um espaço na memó ria para o vetor, ele não pode ser alterado. Caso precise de mais de
espaço, será necessário criar um novo array, ou seja, um novo vetor com um tamanho maior, em que
podemos copiar os elementos do vetor anterior.
Uma matriz, por sua vez, pode ser considerada um vetor de vetores, que são referenciadas por um nome,
sendo que seus elementos são identificados por índices. Contudo, a linguagem Java não suporta arrays
multidimensionais de forma direta, mas permite que o programador especifique os array unidimensionais,
cujos elementos também são arrays unidimensionais, ou seja, um vetor de vetores (array bidimensional).
Em Java os array são considerados um tipo por referência, sendo uma referência a um objeto array na
memó ria.
Para declarar um array bidimensional, devem ser descritos os nú meros de linhas e colunas, bem como o tipo
de dados (a matriz é uma estrutura de dados homogênea). Sua declaração é muito parecida com o array
unidimensional (vetor).
int m[][] = new int[2][3];
Podemos criar um array bidimensional e iniciá-lo com valores:
int m[][] = {{1, 2, 3}, {4, 5, 6} };
VAMOS PRATICAR?
Crie um vetor (vet_1) de inteiros com tamanho 100, insira os nú meros d
100 em ordem crescente e, depois, crie outro vetor (vet_2) com o valor inv
primeiro vetor. Depois de inserir, crie um terceiro vetor (vet_3) que arm
mé dia dos vetores vet.-1 e vet_2. No final, mostre os valores dos vetores 1, 2
No có digo a seguir, estamos percorrendo um array bidimensional e imprimindo os valores por linha. A parte
reta é o output do console.
Figura 14 - Percorrendo e imprimindo dados em um array bidimensional
Fonte: Elaborada pela autora, 2019.
#PraCegoVer: A imagem mostra um trecho de có digo de 15 linhas de programa. Enumerando cada linha
temos:
1a. linha: 1 2 3
2a. Linha: 4 5 6
Assim, aprendemos como inserir e percorrer arrays unidimensionais e arrays bidimensionais. Esse
conhecimento é fundamental para programadores.
Síntese
Chegamos ao fim da primeira unidade da disciplina de Estrutura de Dados. Aqui, pudemos conhecer conceitos
sobre o que é uma abstração, como funciona a linguagem Java e a Orientação a Objetos. Também pudemos
estudar a respeito das estruturas de dados e suas relaçõ es, bem como entendemos um pouco sobre o uso da
memó ria.
Nesta unidade, você teve a oportunidade de:
Bibliografia
ATALLAH, M. J.; BLANTON, M. Algorithms and Theory of Computation Handbook Second Edition General
Concepts and Techniques. CRC press, 2010.
BIANCHI, F.; FREITAS, R.; JUNIOR, D. Estrutura de dados e técnicas de programação. Amsterdã: Elsevier,
2014.
BÓ SON TREINAMENTOS. Curso de Java – Variáveis de classe e variáveis de instância – Orientação a
Objetos. 12 jul. 2019. Disponível em: https://www.youtube.com/watch?
v=H57gWJsfU3I&feature=youtu.be&list=TLGGUklh0O25d-kxMjA3MjAxOQ&t=152 (http://:
https://www.youtube.com/watch?v=H57gWJsfU3I&feature=youtu.be&list=TLGGUklh0O25d-
kxMjA3MjAxOQ&t=152). Acesso em: 22 jul. 2019.
CANAL TI. Arquitetura de Von Neumann de maneira descomplicada. 14 dez. 2017. Disponível em:
https://www.youtube.com/watch?v=V5qE-u6jGo4 (https://www.youtube.com/watch?v=V5qE-u6jGo4).
Acesso em: 22 jul. 2019.
DEITEL, P.; DEITEL, H. Java: como programar. 8. ed. São Paulo: Pearson Education do Brasil, 2010.
DEVMEDIA. Javas string: manipulando métodos da classe string. Rio de Janeiro, 2013. Disponível em:
https://www.devmedia.com.br/java-string-manipulando-metodos-da-classe-string/29862
(https://www.devmedia.com.br/java-string-manipulando-metodos-da-classe-string/29862). Acesso em: 22
jul. 2019.
FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lógica de programação: a construção de algoritmos e estruturas
de dados. 3. ed. São Paulo: Pearson, 2005.
MUNRO, J. I.; SUWANDA, H. Implicit data structures for fast search and update. Journal of Computer and
System Sciences, v. 21, n. 2, p. 236-250, 1980.
SCHOFIELD, J. James Gosling, o pai do Java. Gazeta do Povo, 16 abr. 2007. Disponível em:
https://www.gazetadopovo.com.br/economia/james-gosling-o-pai-do-java-afz7nojdkx57547vodfwa6zim/
(https://www.gazetadopovo.com.br/economia/james-gosling-o-pai-do-java-afz7nojdkx57547vodfwa6zim/).
Acesso em: 26 jul. 2019.
TAMASSIA, R.; GOODRICH, M. T. Estrutura de dados e algoritmos em Java. Porto Alegre: Bookman, 2006.
WIRTH, N. Algoritmos e estruturas de dados. Rio de Janeiro: Prentice-Hall, 1989.
ZIVIANI, N. Projeto de algoritmos: com implementaçõ es em JAVA e C++. São Paulo: Cengage Learning, 2012.