3. 1. Estrutura de Dados
• Programar em qualquer linguagem é criar algoritmos para
trabalhar com dados.
• O essencial são os dados, eles são o objetivo da
programação, portanto programas devem ser voltados a
trabalhar com dados
• A melhor forma de trabalhar com os dados é utilizar
“Dados Estruturados”, ou seja, que tenham em si mesmos
já algum tipo de organização ou estrutura
• Logo um bom programa deve utilizar técnicas estruturadas
em “dados estruturados”.
• Uma analogia entre diferença de dados simples e dados
estruturados é como o uso de um guarda roupas: se as
roupas estão jogadas dentro dele de qualquer forma
(simples) ou se as mesmas tem uma ordem lógica que
facilite o seu manuseio (estruturado).
4. 2. Estrutura de Dados
• A organização dos dados em memória permite a
construção de algoritmos mais sofisticados e
eficientes do que sem ela
• Dados podem apresentar-se estruturados em duas
formas: homogênea e heterogênea
• Homogêneas: são aquelas estruturas onde cada
elemento tem o mesmo tipo. Exemplo: vetor,matriz
• Heterogêneas: são aquelas estruturas onde cada
elemento pode ter tipos diferentes uns dos outros.
Exemplo: registro
• Nesse curso vamos estudar: vetor, matriz e registro
5. 3. Vetores
• São estruturas de dados homogêneas
• Consiste em uma seqüência de valores de um mesmo tipo
onde cada um pode ser acessado pelo nome do Vetor
seguido de abre e fecha colchetes “* +” e entre eles um
índice que é um número inteiro indicando qual elemento
da seqüência estamos nos referindo
• Em Delphi já existe o tipo de dados “Array” que é definido
para conter vetores
• Para declarar um vetor em Delphi faremos desta forma:
“var vet:array[1..10] of integer;” aqui declaramos um vetor
“vet” com dez inteiros (of integer) cujos índices de acesso
vão de 1 a 10. Se quisermos acessar o quinto elemento
usamos esta sintaxe: “vet*5+” e podemos tê-lo. Para
atribuirmos um elemento fazemos assim: “vet*3+ := 0;” –
fazemos o terceiro elemento valer zero.
6. 4. Operações com Vetores
• Definir e declarar um vetor em Delphi
• Preencher e ler dados de um vetor
• Mostrar dados do vetor em ordem inversa
• Ordenar os elementos do vetor
• Buscar um elemento no vetor
7. Declarar um Vetor Preencher Vetor
Var v:array[1..10] of integer; i:integer;
Begin
randomize;
for i:=1 to 10 do
v[i] := random(20000);
End;
Randomize: inicia gerador de números
aleatórios
Random(n:integer):integer; -função que
retorna um aleatório inteiro de 0 a N
Ler dados do Vetor
Var s:string;
Begin
s := ‘ ‘;
for i:=1 to 10 do
s := s+IntToStr ( v[i] );
ShowMessage (s);
End;
Ler dados Invertidos
Var s:string;
Begin
s := ‘ ‘;
for i:=10 downto 1 do
s := s+IntToStr ( v[i] );
ShowMessage (s);
End;
8. Ordenar Vetores
• Ordenar um vetor é colocar os seus elementos
em uma sequência crescente ou decrescente de
acordo com seus valores
• Ex: V = [5,2,1,0,3,4] Ordenando = [0,1,2,3,4,5]
• Existem diversos algoritmos para ordenar um
vetor: bolha, seleção, inserção, quicksort
• Bolha: método mais simples porém o menos
eficiente. Percorrer o vetor de N elementos N-1
vezes e a cada vez trazer o menor elemento antes
do maior, lembrando uma bolha subindo na água
• Exemplo: v=[3,0,2,1], passo1:[0,2,1,3], passo
final:[0,1,2,3]
9. Algoritmo de Ordenação de Vetor pelo
método da Bolha: BubbleSort
Em Pascal / Delphi:
Var aux, i, j, k:integer; v:array[1..100] of integer;
Begin
k := 100-1;
for i:=1 to 100 do begin
j := 1;
while j <= k do begin
if v[j] > v[j+1] then begin
aux := v[j];
v[j] := v[j+1];
v[j+1] := aux;
end;
j := j + 1;
end;
k := k + 1;
end;
End;
10. Ordenação pelo Método Inserção
• Nesse método monta-se um novo vetor destino e a partir do original
vamos transferindo os elementos já ordenando-os de acordo
• Vantagem: simplicidade do algoritmo
• Desvantagem: gasto elevado de memória e baixa eficiência com relação
a performance
11. Ordenação pelo Método Seleção
• O princípio é a cada passo obter o menor valor do vetor e troca-
lo com o primeiro dos ainda não ordenados
• Vantagem: simplicidade de execução
• Desvantagem: lento e consome muito recurso de hardware
QuickSort
• Divide o vetor em dois e aplica-se a
ordenação QuickSort novamente
sobre cada um dos dois, no final a
união de todos os vetores formará o
vetor final ordenado
• Vantagem: é o mais rápido de todos
• Desvantagem: por ser recursivo exige
muito recurso de memória do
equipamento
12. Matrizes
• Matriz é uma estrutura de Dados Estática e
Homogênea que define um grupo de dados
organizado em duas dimensões: linhas X colunas
• Exemplo:
• Em pascal definimos uma Matriz pelo tipo Array de vetores, ou
seja, um array de array
• Ex: var Matriz: array[1..5] of array[1..4] of integer;
• Esse comando declara a matriz desenhada logo acima com 5
linhas X 4 colunas de nome Matriz
• Outra forma é criar um tipo “Vetor” e então definir “Matriz”
como dependente desse tipo
• Ex: type Vetor = array[1..4] of integer;
• Ex: type Matriz = array[1..5] of Vetor;
13. Acessando Elementos das Matrizes
• Uma forma simplificada de declaração em Pascal
ainda pode ser assim:
• Ex: var Matriz: array[1..5,1..4] of integer;
• Todas as declarações criam a mesma estrutura de
dados Matriz
• Para acessar um elemento devemos usar o nome da
matriz seguido de “* +” com os índices dentro
separados por “,”. Exemplo: Matriz*3,2+ é o inteiro “7”
no exemplo da matriz já mostrada antes, ou seja
elemento da Linha “3” e Coluna “2”.
• Para varrer todos os elementos de uma matriz
precisamos de dois comandos “FOR”, um para varrer
as linhas e outro para varrer as células de cada linha
14. Lendo e Mostrando uma Matriz
• Montando uma Matriz lendo do Teclado
• Mostrando uma Matriz NxM
15. Busca em Matriz
• Buscando o elemento “x” na Matriz “w” com dimensões “n” x “m”
• Retorna “True” se ele está na matriz ou “False” caso contrário
16. Registros (record)
• Estrutura de dados Estática e Heterogênea, ou seja contem
vários dados e cada um pode ser de tipo diferente do outro
• Em Pascal / Delphi usamos o comando de tipo “record”
para criar uma estrutura de registro.
• Ex: cria um registro “Registro” com as informações de:
nome, fone (texto) e sexo (caracter), data_nascimento
(data), e CPF (número inteiro longo)
var
Registro : record
nome : string;
fone : string;
sexo : char;
data_nascimento : TDateTime;
CPF : longint;
end;
17. Usando Registro em Pascal
• Depois de definir uma variável do tipo registro
podemos acessar seus elementos usando o nome da
estrutura seguido de “.” (ponto) e depois o nome do
atributo (dado). Usando o exemplo do registro
anterior teriamos:
• Exemplos:
• Registro.nome - devolve o nome do registro
• Registro.fone := ‘(34)9192-1234’; - atribui “fone” ao
registro “Registro”
• Registro.CPF := 00100200304; - atribui um número
de CPF à variável Registro
• Registro.Data_Nascimento; - devolve a data de
nascimento em Registro
18. Combinando Vetores e Registros
• Uma das formas mais usadas em Informática para acesso a um arquivo de
dados é criar vários registros com a mesma estrutura, por exemplo um
cadastro de cliente podemos ter para cada cliente cadastrado:
nome, fone, endereço, cpf
• O tipo desse registro em Pascal seria definido assim:
Type
regCliente = record
nome : string;
fone : string;
endereco : string;
cpf : longint;
end;
• Agora se desejarmos uma variável que represente um arquivo com espaço
para 100 clientes devemos definir um vetor de elementos do tipo
“regCliente”, assim:
• Var arqCliente : array[1..100] of regCliente;
• “arqCliente” é um vetor que irá conter até 100 registros de cliente do tipo
“regCliente”, assim para acessar o nome do primeiro cliente do cadastro
podemos fazer: arqCliente[1].nome; ou seu cpf: arqCliente[1].cpf; e assim
por diante