Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
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
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.
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
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
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);
Vetores em C
#define NUMELTS 100
int a[NUMELTS];
for (i = 0; i < NUMELTS; a[i++] = 0);
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]
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;
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.
#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;
}
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
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.
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
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
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)
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
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.
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)
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
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.
[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)
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)