Você está na página 1de 14

Introdução e Listas Lineares

Conteudista: Prof. Amilton Sousa Martha


Revisão Textual: Prof.ª M.ª Rosemary Toffolli

Objetivo da Unidade:

Compreender como estruturar os dados dentro de nossos programas (ou jogos)


para sempre maximizar o seu desempenho, tanto em termos de tempo de
execução como tempo de programação.

📄 Contextualização
📄 Material Teórico
📄 Material Complementar
📄 Referências
📄 Contextualização
Página 1 de 4

Imagine que precisamos implementar um jogo de nave espacial. E queremos que ao movimentar
a nave, nuvens de fumaça saiam de trás da nave.

As nuvens são objetos que têm tamanhos, cores e sombras diferentes, porém possuem a mesma
característica.
Figura 1
Fonte: Getty Images

Reflita
Que tipo de dados podemos usar para representar a nuvem?
Podemos usar uma lista linear para criar as nuvens? Que tipos de
instruções podemos usar para simular as nuvens?
📄 Material Teórico
Página 2 de 4

Introdução
O que é um jogo digital? Um jogo não passa de um programa. E o que é um programa? Entrando
em um nível mais baixo, um programa está dividido em dados e nas instruções que manipulam
esses dados.

Para organizar os dados temos a Estrutura de Dados e para a manipulação deles, temos os
Algoritmos.

Entender Estrutura de Dados é parte fundamental para um programador de jogos, pois é


necessário conhecer o modo com que os dados são manipulados e organizados para melhorar o

desempenho dos jogos digitais.

Todo programa que você escreve trabalha com dados de alguma forma. A unidade básica de
informação dentro da memória do computador é o bit (binary digit), que são representados por 0
ou 1. Obviamente que com um único bit não poderíamos representar muita informação, porém,
agrupados podem representar uma enorme quantidade e variedade de informações. Surge o
conceito de byte, que é o conjunto de 8 bits.

Como regra geral, são necessários n bits para representar 2^n estados. Os dígitos 0 e 1 são
utilizados para cada estado possível de um bit. Assim, vários bits são indicados por uma

sequência de 0s e 1s. No entanto, nenhum elemento da sequência indica que esta representa um
dado em particular. Por exemplo, pode-se representar um inteiro ou um caractere com um
conjunto de bits, mas a interpretação depende do criador do conjunto e não dos seus elementos.
Tipos de Dados
É um conjunto de valores que uma constante, variável ou expressão podem assumir, ou então, a
um conjunto de valores que possam ser gerados por uma função. Um tipo de dados pode ser
entendido também como um método para interpretar os padrões de bits em memória. No
entanto, pode ser visto de uma perspectiva totalmente diferente, não mais em relação às funções
implementadas eletronicamente no computador, mas em relação ao ponto de vista do usuário e
das suas expectativas

Tipos de Tipos Primitivos


São os tipos de dados que além de depender das características do sistema, dependem do

processador. Os tipos de dados primitivos ou básicos são aqueles a partir dos quais podemos
definir os demais tipos ou organizações de informações, quase sempre mais complexas. Estes
tipos de dados primitivos ou básicos são implementados e manipulados pelos compiladores: o
compilador é o responsável do armazenamento e processamento (operações) destes tipos de

dados. Os tipos de dados primitivos mais frequentes e suas operações são:

Tabela 1

Tipo de Algumas operações Exemplo de


dado possíveis utilização

Soma, subtração,
multiplicação, divisão,
Idade, ano, dia,
Inteiro igualdade, etc. Usado para
número de filhos
representar valores que não
podem ter casas decimais.

Real Soma, subtração, Peso, estatura,


multiplicação, divisão, salário
igualdade, etc. Usado para
Tipo de Algumas operações Exemplo de
dado possíveis utilização

representar valores que


podem ser fracionados
(com casas decimais).

Igualdade, concatenação,
etc. Usado para
Nome, endereço,
informações armazenadas
Caracteres cargo
como uma sequência de
ocupacional.
caracteres contáveis de
objetos

E, OU, NÃO Valores


Formado,
Lógico verdadeiro
solteiro.
ou falso.

Igualdade, soma,
FrenteFila,
subtração, etc. Armazenam
Ponteiro primeiro,
um endereço da memória
próximo.
do computador.

Tipos de Dados Estruturados


Os tipos de dados estruturados são organizações de dados que são obtidas a partir dos tipos de
dados primitivos. A maioria das linguagens de programação prove alguns tipos estruturados
para facilitar a organização de dados. Os mais frequentes são os seguintes:

Arranjos (arrays) Array em Pascal, C e BASIC;

Registros Record em Pascal, struct em C, Type em Visual Basic;


Conjuntos Set em Pascal.

Um exemplo de vetor (unidimensional), pode ser escrito em C, BASIC ou Pascal sobre a base dos
tipos de dados primitivos (Ex. tipos primitivos: integer em Pascal ou BASIC, int na linguagem C):

Em Pascal: var X: array [0..50] of integer;

Em VB: dim X(50) as integer;

Em C, C++: int X[51].

Abstração
Um computador é uma máquina fantástica. Com sua ajuda foi possível ao homem pousar na lua,
iniciar expedições exploratórias interplanetárias, mapear o genoma humano, etc. Entretanto, o
computador por si só não é onipotente. Ele ainda tem sérias limitações físicas para a

complexidade do mundo real. De fato, nosso mundo está cheio de sutilezas e de ricos detalhes
que não podem ser inseridos ou representados em computador.

Devido a essas limitações é necessário que utilizemos a abstração. É abstraindo nossa realidade
que podemos capturar o que existe de mais relevante em uma situação real, tornando possível a

construção de modelos que podem ser implementados nos computadores por meio de uma
linguagem de programação.

Tipo Abstrato de Dados (TAD)


Pode ser definido como um conjunto de valores e por uma série de operações que atuam sobre
esses valores. As operações devem ser consistentes com os tipos de valores. Funções e valores
constituem um modelo matemático que pode ser empregado para implementar um tipo de
dados abstrato. Em programação Orientada a Objetos, as classes representam um TAD com os

valores sendo os atributos de uma classe e as operações os métodos.


Para a implementação de um TAD, devemos usar os tipos de dados existentes e implementar as
operações possíveis sobre esses dados.

Utilizamos os tipos de dados quando precisamos declarar variáveis ou objetos para os nossos

programas. Variáveis podem ser tanto tipos primitivos, tipos estruturados ou abstratos.
Variáveis são sempre declaradas dentro de classes, mas o seu escopo pode estar associado com
toda a classe ou apenas com um método ou com um bloco de instruções.

Para identificar uma variável utilizamos identificadores. Na verdade um identificador é qualquer

nome escolhido pelo programador para representar variáveis, objetos, constantes, classes,
métodos ou rótulos. Depois que um identificador é criado ele representa o mesmo objeto em
qualquer lugar onde ele for usado no mesmo bloco de código.

Existem algumas regras a serem seguidas ao se criar um identificador:

O primeiro caractere de um identificar deve ser uma letra, um underscore (_) ou um


símbolo monetário (como $). Os caracteres seguintes podem ser quaisquer desses
ou numerais;

Os caracteres preferencialmente devem ser letras, números e underscore (_),


porém não pode haver espaços em branco entre elas;

Em Java, assim como em C/C++ e muitas outras linguagens modernas,


identificadores são sensíveis ao caso e sensíveis a linguagem. (Nota: a sensibilidade
à linguagem do Java significa que identificadores diferenciam linguagens.
Identificadores são únicos entre linguagens mesmo se os caracteres parecerem o
mesmo visualmente);

Um identificador não pode ser o mesmo de uma das palavras-reservadas da


linguagem;

Não se usa caracteres especiais como !, @, #, %, *, +, - , (, etc.


Listas Lineares
Uma lista linear é um tipo abstrato de dado que representa uma coleção L: [a1, a2, ..., an], n>=0,
cuja propriedade estrutural baseia-se apenas na posição relativa dos elementos, que são
dispostos linearmente. Se n = 0, dizemos que a lista L é vazia; caso contrário, são válidas as
seguintes propriedades:

a1 é o primeiro elemento da lista L;

an é o último elemento da lista L;

ak , 1 < k < n, é precedido pelo elemento ak-1 e seguido por ak+1 na lista L.

Ou seja, a característica fundamental de uma lista linear é o sentido de ordem unidimensional


dos elementos que a compõem. Uma ordem que nos permite dizer com precisão onde a coleção

inicia-se e onde termina, sem possibilidade de dúvida. Temos alguns casos especiais de Listas
Lineares que são frequentemente utilizadas na modelagem de problemas a serem resolvidos
computacionalmente, que são: pilha, fila e lista.

Entre as diversas operações que podemos realizar sobre listas lineares temos:

Acessar um elemento qualquer da lista;

Inserir um elemento numa posição específica da lista;

Remover um elemento de uma posição específica da lista;

Combinar duas listas em uma única;

Particionar uma lista em duas;

Obter cópias de uma lista;


Determinar o total de elementos na lista;

Ordenar os elementos da lista;

Procurar um determinado elemento na lista;

Apagar uma lista.

Ao codificar um programa que utiliza listas, dificilmente iremos usar todas as operações que
podem ser feitas com listas lineares. Na prática, apenas um subconjunto bastante reduzido
destas operações será necessário numa certa aplicação, como veremos posteriormente.

Para podermos implementar as listas lineares, devemos avaliar como armazenaremos os


elementos da lista na memória do computador. A alocação de memória, do ponto de vista do
programador, está dividida em quatro categorias:

Estática Sequencial;

Estática Encadeada;

Dinâmica Sequencial;

Dinâmica Encadeada.

Dizemos que a alocação é estática quando, durante toda a execução, a quantidade de memória
utilizada pelo programa não varia, ou seja, a área de memória alocada já foi prevista no código do
programa, por outro lado, se o programa é capaz de criar novas variáveis enquanto executa, isto
é, se áreas de memória que não foram declaradas no programa passam a existir durante a sua
execução, então dizemos que a alocação é dinâmica.
A alocação sequencial consiste em dispor os elementos de uma lista em células de memória
consecutivas, uma após a outra. Assim, se um elemento está na posição de memória & e cada
elemento possui o mesmo tipo e ocupa k bytes, o elemento posterior da lista estará na posição
(&+k) e o anterior em (&-k). Essa é uma grande vantagem da alocação sequencial, pois dado o
endereço inicial & e o índice i de um elemento qualquer da lista, podemos acessá-lo
imediatamente, com um simples cálculo. O ponto fraco deste tipo de alocação encontra-se
quando precisamos inserir ou deletar elementos no meio de uma lista, quando será mais

complicado pois devemos mover os elementos de modo a abrir um espaço para inserção ou
ocupar um espaço de um elemento excluído.

Porém, na alocação encadeada, os elementos não precisam necessariamente ocupar posições


consecutivas de memória, ou seja, podem ocupar quaisquer células. Contudo, para conseguir

manter uma ordem, cada elemento da lista carrega consigo a posição de memória do próximo
elemento da lista. A grande vantagem na alocação encadeada e a facilidade de inserção e
remoção de elementos, pois não precisamos movimentar os dados, somente precisamos
atualizar o campo de ligação do elemento antecessor àquele que será inserido ou removido. A

desvantagem surge quando desejamos acessar uma posição específica da lista, já que
conhecemos inicialmente somente o endereço do primeiro elemento e precisamos varrer a lista
até encontrar o elemento desejado. É claro que para listas muito extensas está operação pode ser
bastante desvantajosa em relação ao tempo.
📄 Material Complementar
Página 3 de 4

Indicações para saber mais sobre os assuntos abordados nesta Unidade:

Livros

Estruturas de Dados Fundamentais: Conceitos e Aplicações


Com uma linguagem bem simples, a parte de introdução à Estrutura de Dados é bem abordada
nesse livro. Apesar da linguagem ser em pascal, não é necessário o conhecimento da linguagem
para acompanhar o que o autor explica. Iremos utilizar esse livro em capítulos posteriores.

PEREIRA, S. L. Estruturas de Dados Fundamentais: Conceitos e Aplicações. 9. ed. São Paulo:


Erica, 2001.

Estruturas de Dados Usando C


Esse livro é considerado um clássico da estrutura de dados. Usando uma linguagem de baixo
nível, a linguagem C, o autor se aprofunda nas estruturas primitivas de manipulação de bits. É
recomendado para o aluno que deseja se aprofundar na teoria além do que estudamos no curso,
como uso de alocação dinâmica encadeada com ponteiros e deslocamento de bits.
TENENBAUM, A. M.; LANGSAM, Y. Estruturas de Dados Usando C. Sao Paulo: Makron Books do
Brasil, 2005.
Vídeo

Estrutura de Dados (A famosa ED que todo DEV tem que


Aprender) // Dicionário do Programador

Estrutura de Dados (A famosa ED que todo dev tem que aprender)…


aprender)…
📄 Referências
Página 4 de 4

PENTON, R, Data Structures for Game Programmers, Ohio, USA, Focal Press, 2003

PEREIRA, S. L. Estruturas de Dados Fundamentais: Conceitos e Aplicações. 8. ed. São Paulo: Erica,
1996.

VILLAS, M. V. Estruturas de Dados: Conceitos e Técnicas de Implementação. Rio de Janeiro:


Campus, 1993.

Você também pode gostar