EDAula02 PDF
EDAula02 PDF
EDAula02 PDF
Estrutura de Dados
ESTRUTURA DO CURSO
ED - AULA 2
Aula 3: Listas
CONTEDO
ED - AULA 2
Nessa Aula
Pr-requisitos de Linguagem C
EDUC
PA
01-33*
01-30
MOTIVAO
ED - AULA 2
Exemplo de Algoritmo
ALGORITMO Ordena Vetor
(Mtodo Bubble Sort)
FIM_ALGORITMO
Anlise do Algoritmo
Qual o objetivo?
Ordenao (crescente) de
um conjunto de nmeros
inteiros.
Armazenar um conjunto de
valores inteiros em um vetor
com (Tam) elementos.
MOTIVAO
ED - AULA 2
Aula4_04
#include <stdio.h>
#define TAM 10
int main()
{ //Vetor de int de tamanho TAM.
int vet[TAM];
int i, j, aux;
for (i=0; i<TAM-1; i++)
for (j=i+1; j<TAM; j++)
if (vet[i] > vet[j])
{
aux = vet[i];
vet[i] = vet[j];
vet[j] = aux;
}
}
Problema:
E se os dados a serem ordenados
representassem registros de alunos de
uma faculdade?
MOTIVAO
ED - AULA 2
Exemplo de Algoritmo
ALGORITMO
Crivo de Eratostenes
FIM_ALGORITMO
Anlise do Algoritmo
Qual o objetivo?
Listagem de todos os
nmeros primos menores
que um nmero inteiro k.
Armazenar em um vetor
com (k+1) elementos a
marcao de candidatos a
nmeros primos < k.
Percorrer o vetor
desmarcando as posies
mltiplas de 2, 3, 5, etc. As
posies que no forem
desmarcadas sero referentes
nmeros primos.
MOTIVAO
ED - AULA 2
#include <stdio.h>
#include <math.h>
#define TAM 100
int main()
{
int i, j, vet[TAM+1];
for (i=2; i<=TAM; i++)
vet[i] = 1;
for (i=2; i<sqrt(TAM); i++)
if (vet[i])
for (j=i; (j*i)<=TAM; j++)
vet[i*j] = 0;
for (i=0; i<=TAM; i++)
if (vet[i])
printf("%d ", i);
}
MOTIVAO
ED - AULA 2
Expresses Aritmticas
A seguinte expresso:
x y
p = 2
+k
5
91-94*
MOTIVAO
ED - AULA 2
valid = true;
s = pilha vazia;
while (no lemos a string inteira)
{
l o prximo smbolo (symb) da string;
if (symb == ( || symb == [ || symb == {)
push(s, symb);
if (symb == ) || symb == ] || symb == })
if (empty(s))
valid = false;
else
{
i = pop(s);
if (i no o correspondente iniciador de symb)
valid = false;
}
}
if (!empty(s))
valid = false;
}
EDUC
91-94*
MOTIVAO
ED - AULA 2
10
Ordenao Topolgica
Considere um processo industrial formado por tarefas seqenciais.
1) Tarefas: 1..n
Exemplo
Tarefas: 1..8
Precedncias: 1..9
(1,3)
(1,2)
(5,2)
(5,8)
(3,4)
(2,6)
(8,6)
(6,7)
(7,3)
6
4
7
EDSA
47-51
MOTIVAO
ED - AULA 2
11
6
4
ALGORITMOS
ED - AULA 2
12
Introduo
Definies:
Escolha de uma
Estrutura de Dados
Adequada
6
4
http://en.wikipedia.org/wiki/Dijkstra
2010 FAV Estrutura de Dados
PA
01-03
ALGORITMOS
ED - AULA 2
13
Constatao
Algoritmos e Seus Dados
EDUC
PA
01-33*
01-30
ESTRUTURAS DE DADOS
ED - AULA 2
14
Tipos de Dados
Bsicos
Os tipos bsicos constituem as estruturas mais simples encontradas na
descrio dos algoritmos. Normalmente, fazem parte da coleo de tipos
pr-definidos de qualquer linguagem de programao. Abaixo, ilustra-se
alguns exemplos existentes nas linguagens C e Pascal.
Prof. Dr. Marcelo Augusto Cicogna
Primitivos:
inteiro (int, Integer);
caractere (char, Char);
Compostos:
real (float/double, Real);
cadeias de caractere (char*, String);
enumerados (enum, type);
EDUC
PA
01-07*
24-25
ESTRUTURAS DE DADOS
ED - AULA 2
15
Tipos de Dados
Avanados
16
Em computao, uma Estrutura de Dados (ED) pode ser entendida como uma
forma de armazenar dados para processamento em computadores. Quanto mais
cuidadosa a escolha da estrutura de dados, mais simples e eficiente ser o
processo de implementao de um algoritmo.
Exemplo: carregar em memria um vetor de tipos definidos pelo usurio com o
contedo de um arquivo que armazena um cadastro de produtos.
Um Tipo Abstrato de Dados (TAD) uma derivao do conceito de Estrutura
de Dados com o objetivo de tornar o uso da estrutura independente das regras
internas adotadas em sua implementao. Esse objetivo alcanado com o uso de
interfaces, ou seja, um TAD define uma interface de uso, manipulao e
gerenciamento de uma Estrutura de Dados.
Exemplo: um TAD lista pode ser implementado com alocao esttica de
memria (vetor) ou com alocao dinmica, usando uma lista ligada por
ponteiros (referncias). O uso independente da regra adotada para a construo
da lista. Tudo funo da interface criada.
http://en.wikipedia.org/wiki/Data_structure
2010 FAV Estrutura de Dados
PA
63-72
17
Um Exemplo Prtico
TData
18
Um Exemplo Prtico
TData
Conforme visto na definio de TAD, pode existir uma coleo de
procedimentos (funes) relacionadas ao gerenciamento de um TAD.
Para o exemplo TData, pode-se citar algumas funes desejveis:
TData dataCreate();
Prof. Dr. Marcelo Augusto Cicogna
dataFree(TData data);
dataPrint(TData data);
dataCopy(TData dataDest, TData dataSource);
dataSwap(TData dataA, TData dataB);
int dataComp(TData dataA, TData dataB);
19
Exemplo: TData
TData
Tipo de dado definido pelo
usurio que representa
qualquer poro de
informao de interesse dos
algoritmos de gerenciamento,
armazenamento e
manipulao de dados.
Tipo Definido pelo Usurio
Em pseudo-cdigo define-se
usando a palavra record.
Pseudo-cdigo
record TData
{
//Tipos bsicos.
Integer intField;
Char charField;
Real realField;
String stringField;
...
//Tipos definidos pelo usurio.
TDU1 tdu1Field;
TDU2 tdu2Field;
...
}
20
Exemplo: TData
Linguagem C
TData.h
TData
Tipo de dado definido pelo
usurio que representa
qualquer poro de
informao de interesse dos
algoritmos de gerenciamento,
armazenamento e
manipulao de dados.
Tipo Definido pelo Usurio
Em Linguagem C define-se
usando a palavra struct.
Utiliza-se tambm typedef
para facilitar o uso do tipo
definido.
//Constantes.
#define NOMELEN 40
//Definio do tipo TData.
typedef struct TData
{
int RG;
char* name;
int intValue;
} TData;
Note que name foi definido como um
ponteiro para char (string). Isso nos
obriga a fazer alocao de memria
para esse campo, usando a constante
NOMELEN. Veja dataCreate() na
seqncia.
21
Algoritmo de Criao
Create()
Criar uma varivel do tipo
TData utilizando alocao
dinmica de memria.
Observao:
Em pseudo-cdigo no se faz
diferena entre parmetros
passados por valor ou por
referncia. No entanto, no
momento da implementao em
uma linguagem de programao,
essas diferenas devem ser
devidamente analisadas.
Pseudo-cdigo
//Algoritmo para criar uma varivel
//do tipo TData.
TData dataCreate()
{
new (data);
return (data);
}
22
TData.c
TData*
dataCreate()
/** Funo para a criao (alocao dinmica) de uma varivel TData.
<I>Importante: essa funo deve ser alterada se TData for modificado.</I>
@return Ponteiro para a varivel TData alocada em memria.
Em caso de falha retorno igual a NULL.
@version 1.01
Caso o tipo TData sofra alguma alterao para se
@author Marcelo Augusto Cicogna
adequar a um novo problema, somente o cdigo
*/
compreendido pelos comentrios ALT e Fim ALT
{
devem sofrer ateno do desenvolvedor.
//Alocao da varivel TData.
Essa estratgia torna fcil dar manuteno ao
TData* pData = malloc(sizeof(TData));
cdigo, ou mesmo adapt-lo para um novo
if (pData)
problema com um novo modelo de dados.
{ //Alocao do vetor name.
//ALT: incio do cdito a ser alterado caso exista mudana em TData.
pData->name = malloc(SIZENAME*sizeof(char));
//Fim ALT.
}
return (pData);
}
23
Algoritmo de Liberao
Pseudo-cdigo
Free()
Liberar a memria alocada
para um varivel do tipo
TData.
Observao:
Em funo dos campos declarados
em TData, pode ser necessrio a
liberao de memria para campos
que necessitam de alocao no
momento da criao da varivel
TData. Exemplo: um vetor com
dimenso definida no momento de
sua criao.
24
TData.c
void
dataFree(TData* pData)
/** Funo para a liberao de memria alocada para uma varivel TData.
<I>Importante: essa funo deve ser alterada se TData for modificado.</I>
@param pData ponteiro para varivel a ser liberada da memria.
@version 1.01
@author Marcelo Augusto Cicogna
*/
{
if (pData)
{ //ALT: incio do cdito a ser alterado caso exista mudana em TData.
free (pData->name);
//Fim ALT.
free (pData);
Note que a funo dataFree() depende das
}
alocaes de memria feitas em dataCreate().
}
25
MainData.c
MODULARIZAO
ED - AULA 2
26
TData.h
TData.c
#include TData.h
MainData.c
#include TData.h
Pasta Comum
27
MODULARIZAO
ED - AULA 2
28
TData.h
//-----------------------------------------------------------------------------#ifndef TDataH
#define TDataH
//-----------------------------------------------------------------------------/* Constantes. */
#define SIZERG 6
#define SIZENAME 40
#define SIZEINT 4
//-----------------------------------------------------------------------------/** Definio de TData como um Tipo Abstrato de Dados para uso em outros mdulos. */
typedef struct TData
{
int RG;
char* name;
int intValue;
} TData;
//-----------------------------------------------------------------------------/* Funes de manipulao do tipo TData. */
TData* dataCreate();
TData* dataCreateFields(int RG, char* name, int intValue);
void dataSetFields(TData* pData, int RG, char* name, int intValue);
void dataFree(TData* pData);
No arquivo TData.h vo todas
void dataDefault(TData* pData);
as declaraes de constantes,
void dataRand(TData* pData);
tipos definidos pelo usurio,
void dataPrint(TData* pData);
funes, e procedimentos.
void dataPrintHeader();
int dataCopy(TData* pDataDest, TData* pDataSource);
TData* dataClone(TData* pDataSource);
A lista de funes ao lado foi
void dataSwap(TData* pDataA, TData* pDataB);
feita baseando-se nos exerccios
int dataComp(TData* pDataA, TData* pDataB, int idField);
da Primeira Lista.
//-----------------------------------------------------------------------------#endif
MODULARIZAO
ED - AULA 2
29
TData.c
MODULARIZAO
ED - AULA 2
30
b) No arquivo "Ed Aula02.pdf", estude primeiro o Slide 26. Crie as pastas e os arquivos. Dica:
no mude os nomes usados para ter mais rapidez em usar o cdigo j pronto;
c) Para preencher o contedo total do arquivo "TData.h", utilize o Slide 28. Voc pode copiar e
colar direto do arquivo PDF. Se fizer isso, seja caprichoso, em manter a tabulao original
apresentada no Slide 28. E mais, leia o que voc copiou e colou. Tente entender as pores
do cdigo e traga suas dvidas para a prxima aula;
d) Para preencher o contedo inicial do arquivo "TData.c", utilize o Slide 29. Note que o
arquivo no est completo. Para terminar o trabalho, utilize as funes apresentadas nos
Slides 22 e 24. Voc pode copiar e colar, como no passo anterior. Mais uma vez, seja
caprichoso e refaa a tabulao perdida, lendo com ateno o cdigo que voc copiou/colou;
e) Para preencher o contedo completo do arquivo "MainData.c", utilize o Slide 25.
IMPORTANTE: este arquivo tambm precisa de um cabealho, mas vou deixar essa tarefa
para vocs;
f) No arquivo "MainData.c" est faltando alguns comandos "#include". Vou deixar de
exerccio vocs descobrirem o que est faltando, mas uma dica que a resposta est no
Slide 29.
31
Algoritmo de Troca
Swap()
Troca (swap) de contedo
entre duas variveis do tipo
TData.
Observao:
Em funo dos campos declarados
em TData, pode ser necessrio a
alocao de memria antes de
atribuir valores s variveis. Para
isso, veja na Lista de Exerccios 1 a
funo dataCopy().
Pseudo-cdigo
//Algoritmo para trocar o contedo
//de duas variveis TData.
dataSwap(TData dataA, dataB)
{
TData dataAux;
dataAux := dataA;
dataA
:= dataB;
dataB
:= dataAux;
}
32
TData.c
void
dataSwap(TData* pDataA, TData* pDataB)
/** Funo para a troca (<I>swap</I>) de contedo de variveis TData.
@param pDataA ponteiro para a primeira varivel para a troca.
@param pDataB ponteiro para a segunda varivel para a troca.
@see
#dataCreate dataCreate()
@see
#dataCopy dataCopy()
@see
#dataFree dataFree()
Observe que o cdigo de
@version 1.01
exemplo ao lado, ao utilizar as
funes dataCreate() ,
@author Marcelo Augusto Cicogna
dataCopy() e dataFree(), no
*/
faz nenhum tipo de uso das
{
caractersticas internas do
TData* pDataAux = dataCreate();
tipo TData.
if (pDataA && pDataB && pDataAux)
Qual o benefcio? Se fosse
{
necessrio alterar o tipo TData
dataCopy(pDataAux, pDataA);
como, por exemplo, adicionar
dataCopy(pDataA,
pDataB);
um novo campo, o cdigo ao
dataCopy(pDataB,
pDataAux);
lado no sofreria nenhuma
dataFree(pDataAux);
alterao.
}
}
EXERCCIOS EM LABORATRIO
ED - AULA 2
33
FORMATAO DE TRABALHOS
ED - AULA 2
34
Capa Padro
O Ttulo e o Assunto so
sempre fornecidos pelo
professor.
FORMATAO DE TRABALHOS
ED - AULA 2
35
Cabealho Padro
Cabealho
EXERCCIOS PRTICOS
ED - AULA 2
36
37
MainData.c
int
main(int argc, char *argv[])
/** Funo principal do projeto para exemplo de <B>Tipos Abstratos de Dados</B>.
Teste das funes de manipulao do tipo TData.
@see <a href= {@docroot}/Doc/projects/Data/(Data__globals).html>Mdulo
TData</a>
@author Marcelo Augusto Cicogna
*/
{
TData* pDataA;
TData* pDataB;
//Teste da funo de criao (alocao).
printf("Criando variavel DataA...\n");
pDataA = dataCreate();
//Teste da funo de preenchimento com dados default.
printf("Valores default para DataA...\n");
dataDefault(pDataA);
...
38
MainData.c
39
MainData.c