Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C...

22
Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores como parâmetros. Vetores bi e multidimensionais

Transcript of Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C...

Page 1: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Estrutura de Dados

Aula 2: Estruturas de dados em C

Vetores em C. Vetor como um TDA. Vetores Unidimensionais.

Implementação. Vetores como parâmetros. Vetores bi e

multidimensionais

Page 2: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Estruturas de dados em C

� Analisaremos 2 tipos de estruturas que já existem em C� Vetor� Estrutura

� Metas das ED: � Identificar e desenvolver entidades e operações

úteis e determinar a classe de problemas que pode ser solucionada usando essas entidades e operações (tipo de dado de alto nível como ferramenta para solucionar outros problemas)

� Percebe a implementação de tal tipo de dado como um problema a ser resolvido usando os tipos de dados já existentes.

Page 3: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Estruturas em C

� reconhecer as vantagens e desvantagens de cada implementação da ED com relação a uma aplicação especifica. Conhecer os compromissos envolvidos

numa implementação.

� Exemplo: Impossibilidade de representação de inteiros

arbitrários. Que representamos no computador?

� Fatores de eficiência da implementação da estrutura de dados: tempo e espaço.

� Em C não existem muitas estruturas de dados consideradas básicas em outras linguagens de alto nível. Por que?

� UMA IMPLEMENTAÇÃO É A SUA EFICIENCIA

Page 4: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores em C

� Forma mais simples: Vetor unidimensional.

� Especificação de acesso:

� int a[100];

� Operações básicas:

� Extração: Aceita um vetor a e um índice i e retorna o

elemento do vetor (expressão a[i])

� Armazenamento: Aceita um vetor a, um índice i e um

elemento x e atribui o valor de x ao elemento i do vetor a

(comando de atribuição a[i] = x)

� Menor elemento é limite mínimo (C é 0), maior

elemento é limite máximo. Faixa = lmax – lmin + 1

Page 5: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores em C

� Em C os limites nem a faixa podem ser

alterados durante a execução de um

programa.

� O limite mínimo e sempre 0 e o limite

Maximo e definido no inicio do programa.

� Exemplo

int a[100];

for (i = 0; i<100; a[i++] = 0);

Page 6: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores em C

#define NUMELTS 100

int a[NUMELTS];

for (i = 0; i < NUMELTS; a[i++] = 0);

Page 7: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores em C

� Vetor como um TDA: (Suponhamos uma

extensão de convenções tipo type(arg)).

� Definamos o TDA ARRTYPE(ub,thetype)

que indica o TDA correspondente ao vetor

em C thetype vetor[ub]. TDA parametrizado

O verdadeiro TDA será determinado após

fixar o valor dos parâmetros (ub e eltype)

� entidade x ARRTYPE(10,int) seria entidade int

x[10]

Page 8: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Implementação do TDA ARRTYPEabstractabstractabstractabstract typedef<<eltype,ub>>ARRTYPE(ub, eltype);conditionconditionconditioncondition type(ub) == int;

abstractabstractabstractabstract eltype extract (a, i) /*written a[i]*/ARRTYPE (ub, eltype) a;intintintint i;preconditionpreconditionpreconditionprecondition 0<=i<ub;postconditionpostconditionpostconditionpostcondition extract == ai

abstractabstractabstractabstract store (a, i, elt) /*written a[i]=elt*/ARRTYPE(ub, eltype) a; /*Mod Parametros*/intintintint i; eltypeeltypeeltypeeltype elt;preconditionpreconditionpreconditionprecondition 0<=i<ub;postconditionpostconditionpostconditionpostcondition a[i] == elt;

Page 9: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores Unidimensionais em C

� Usados quando necessário manter uma

grande quantidade de itens na memória e

para referenciar todos os itens de maneira

uniforme.

� Exemplo Ler 100 inteiros, encontrar a média

e determinar o quanto cada inteiro se desvia

da média.

Page 10: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

#include <stdio.h>

#include <stdlib.h>

#define NUMELTS 100

int main()

{

int num[NUMELTS], i, total = 0;

float avg; //media dos numeros

float diff; //diferca entre cada num e a media

for(i=0; i<NUMELTS; i++)

{//Ler os numeros no vetor e os soma

scanf("%d", &num[i]); total += num[i];

}//fim for

avg = total/NUMELTS; //calcula a media

printf("\nDiferenca dos numeros");

for(i=0; i<NUMELTS; i++){

diff = num[i] - avg;

printf("\n %d %d", num[i], diff);

}//fim for

printf("\nA media, : %f\n", avg);

system("PAUSE"); return 0;

}

Page 11: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores unidimensionais em C

� Por que usar um único vetor para armazenar os valores do primeiro grupo de números simultaneamente enquanto uma única variável é utilizada para guardar o valor do segundo grupo?

� Os vetores evitam instruções do tiposcanf(%d%d%d...%d, &num1,&num2,...,&num99);

� Referência uniforme a cada elemento

� Cada elemento e recuperado através do índice

Page 12: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores unidimensionais em C Exercício� Suponha uma entrada das vendas de 10 anos do tipo:

1980 5271981 675

...

1989 689Isso pode ser resolvido como:scanf(“%d”,&yr);

switch(yr)

{

case 0: scanf(“%d”, &s0);

case 1: scanf(“%d”, &s1);

...

case 9: scanf(“%d”, &s9);

}

para ler a variável apropriada (venda de cada ano). Escreva uma solução melhor.

Page 13: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Implementando vetores unidimensionais

� int b[100] reserva pos sucessivas de memória. O endereço da primeira posição e chamado endereço base.

� Se o tamanho de um elemento o esize então a referencia a o elemento b[0] é para o elemento na pos. base b[1] referencia a base(b) + esize. Em geral uma referencia a b[i] é para o elemento na pos. base(b) + i*isize.

� A implementação em C é como de uma variável ponteiro

Page 14: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Implementação de vetores unidimensionais

� int b[100] é um ponteiro a inteiro ou int *

� * não aparece porque os colchetes indicam

que a variável é um ponteiro

� Em C todos os elementos do vetor tem o

mesmo tamanho. Outras linguagens de alto

nível permitem a implementação de vetores

com tamanhos diferentes. Ex. vetores de

strings

Page 15: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Implementação de vetores de STRINGS

� Como implementar então vetor de strings de

tamanhos diferentes??

� Precisa calcular a posição que em C é fixa para vetores (esize)

Page 16: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

5 H E L L O

4 O L A ø

2 O I

H E L L O

O L A ø

O I \0

\0

\0

H E L L

O L A ø

O I

O5

4

2

a

b

c

Page 17: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Implementação de vetores de STRINGS

� Em C uma string é ela mesma implementada com um vetor de caracteres encerrada com o valor NULL indicado pela seqüência de escape \0. Outras seqüências de escape que podem ser usadas são \n, \t, \b \, \\, \r, \f.

� Ex. A string “HELLO THERE” é um vetor de 12 elementos onde o espaço em branco e o \0 contam como um caracteres.

Page 18: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores como parâmetros� Os parâmetros de funções em C precisam ser

declarados dentro da função. Entretanto a faixa de

um vetor unidimensional só é especificada no

programa chamador (referencia) . Exemplo:

float avg(a, size)

float a[];

int size;

{

int i; float sum=0;

for (i=0; i<size; i++)

sum += a[i];

return(sum/size);

}

#define ARRANGE 100

float a[ARRANGE];

....

avg(a, ARRANGE)

Page 19: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores bidimensionais

� Define-se 2 índices (chamado muitas vezes

de linha e coluna

� Ex. int a[3][5];

� Tratado logicamente como matriz (resolução

de problemas) porem fisicamente o hard não

dispõe de tais recursos, a memória é

essencialmente linear

Page 20: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores bidimensional

� Para implementar um vetor bidimensional é

necessário desenvolver um método para

organizar seus elementos numa forma linear

e transformar uma referencia bidimensional

para a representação linear.

Page 21: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

[2]a[2]

[1]a[2]

[0]a[2]

[2]a[1]

[1]a[1]

[0]a[1]

[2]a[0]

[1]a[0]

[0]a[0]

20

20

Representação por linhaa[2][2] = base(a)+(2*3+2)*1base(ar)+(i1+r2+i2)*esize

linha 0

linha 1

linha 2

Representação com ponteiros

a[r1][r2]r1 = 2r2 = 3

Base(a)

Page 22: Estrutura de Dados - Tripod · 2009. 3. 6. · Estrutura de Dados Aula 2: Estruturas de dados em C Vetores em C. Vetor como um TDA. Vetores Unidimensionais. Implementação. Vetores

Vetores multidimensionais

� C permite vetores com mais de 2 dimensões

int b[3][2][4];

� especificando um elemento

b[2][0][3] (plano, linha, coluna)

Exemplo vetor temperatura (latitude, longitude e altitude)