You are on page 1of 9

Estrutura de Dados

Prof. Esp. Rogrio Lazanha


1

Aula 02 - VARIVEIS UNIDIMENSIONAIS - VETORES

Em muitas aplicaes queremos trabalhar com conjuntos de dados que so semelhantes em tipo. Por
exemplo o conjunto das alturas dos alunos de uma turma, ou um conjunto de seus nomes. Nestes casos, seria
conveniente poder colocar estas informaes sob um mesmo conjunto, e poder referenciar cada dado
individual deste conjunto por um nmero ndice. Em programao, este tipo de estrutura de dados chamada
de vetor (ou array, em ingls) ou, de maneira mais formal estruturas de dados homogneas.
Exemplo: A maneira mais simples de entender um vetor atravs da visualizao de um lista, de elementos
com um nome coletivo e um ndice de referncia aos valores da lista.
n nota
0 8.4
1 6.9
2 4.5
3 4.6
4 7.2

Nesta lista, n representa um nmero de referncia e nota o nome do conjunto. Assim podemos dizer
que a 2
a
nota 6.9 ou representar nota[1] =6.9
Esta no a nica maneira de estruturar conjunto de dados. Tambm podemos organizar dados sob
forma de tabelas. Neste caso, cada dado referenciado por dois ndices e dizemos que se trata de um vetor
bidimensional (ou matriz).

DECLARAO E INICIALIZAO DE VETORES

Em C, um vetor um conjunto de variveis de um mesmo tipo que possuem um nome identificador e
um ndice de referncia. Os vetores precisam ser declarados, como quaisquer outras variveis, para que o
compilador conhea o tipo de matriz e reserve espao de memria suficiente para armazen-la. Os elementos
da matriz so guardados numa seqncia contnua de memria, isto , um seguido ao outro.
Sintaxe: A sintaxe para a declarao de um vetor a seguinte:
tipo nome[tam];
onde:
tipo o tipo dos elementos do vetor: int, float, double ...
nome o nome identificador do vetor. As regras de nomenclatura de vetores so as mesmas
usadas em variveis.
tam o tamanho do vetor, isto , o nmero de elementos que o vetor pode armazenar.

Exemplo: Veja as declaraes seguintes:
int idade[100]; // declara um vetor chamado 'idade' do tipo
// 'int' que recebe 100 elementos.
float nota[25]; // declara um vetor chamado 'nota' do tipo
// 'float' que pode armazenar 25 nmeros.
char nome[80]; // declara um vetor chamado 'nome' do tipo
// 'char' que pode armazenar 80 caracteres.

REFERNCIA A ELEMENTOS DE VETOR


Estrutura de Dados
Prof. Esp. Rogrio Lazanha
2
Cada elemento do vetor referenciado pelo nome do vetor seguido de um ndice inteiro. O primeiro
elemento do vetor tem ndice 0 e o ltimo tem ndice tam-1. O ndice de um vetor deve ser inteiro.

Exemplo: Algumas referncias a vetores:

#define MAX 5
int i =7;
float valor[10]; // declarao de vetor
valor[1] =6.645;
valor[MAX] =3.867;
valor[i] =7.645;
valor[random(MAX)] =2.768;

INICIALIZAO DE VETORES

Assim como podemos inicializar variveis (por exemplo: int j =3;), podemos inicializar vetores.
Sintaxe: A sintaxe para a inicializao dos elementos de um vetor :
tipo nome[tam] ={lista de valores};
onde:
lista de valores uma lista, separada por vrgulas, dos valores de cada elemento do vetor.
Exemplo: Veja as inicializaes seguintes. Observe que a inicializao de nota gera o vetor do
exemplo do incio desta seo.
int dia[7] ={12,30,14,7,13,15,6};
float nota[5] ={8.4,6.9,4.5,4.6,7.2};
char vogal[5] ={'a, e, i, o, u'};

TAMANHO DE UM VETOR E SEGMENTAO DE MEMRIA

Na linguagem C, devemos ter cuidado com os limites de um vetor. Embora na sua declarao,
tenhamos definido o tamanho de um vetor, o C no faz nenhum teste de verificao de acesso a um elemento
dentro do vetor ou no. Por exemplo se declaramos um vetor como int valor[5], teoricamente s tem sentido
usarmos os elementos valor[0], ..., valor[4]. Porm, o C no acusa erro se usarmos valor[12] em algum lugar
do programa. Estes testes de limite devem ser feitos logicamente dentro do programa.

Este fato se deve a maneira como o C trata vetores. A memria do microcomputador um espao
(fsico) particionado em pores de 1 byte. Se declaramos um vetor como int vet[3], estamos reservando 6
bytes (3 segmentos de 2 bytes) de memria para armazenar os seus elementos. O primeiro segmento ser
reservado para vet[0], o segundo segmento para vet[1] e o terceiro segmento para vet[2]. O segmento inicial
chamado de segmento base, de modo que vet[0] ser localizado no segmento base. Quando acessamos o
elemento vet[i], o processador acessa o segmento localizado em base+i. Se i for igual a 2, estamos acessando
o segmento base+2 ou vet[2](o ultimo segmento reservado para o vetor). Porm, se i for igual a 7, estamos a
acessando segmento base+7 que no foi reservado para os elementos do vetor e que provavelmente est
sendo usado por uma outra varivel ou contm informao espria (lixo).

Observe que acessar um segmento fora do espao destinado a um vetor pode destruir informaes
reservadas de outras variveis. Estes erros so difceis de detectar, pois o compilador no gera nenhuma
mensagem de erro. A soluo mais adequada sempre avaliar os limites de um vetor antes de manipul-lo.


Estrutura de Dados
Prof. Esp. Rogrio Lazanha
3
Exemplo 1 Leia um vetor de 5 elementos inteiros e:
a) exiba o vetor lido;
b) exiba a soma dos valores.


#i ncl ude <coni o. h>
#i ncl ude <st di o. h>

#def i ne MAX 5 / / def i ni cao do par amet r o MAX
voi d mai n( ) {
i nt i =3;
i nt val or [ MAX] , soma=0; / / decl ar acao do vet or usando MAX

cl r scr ( ) ;
pr i nt f ( "Ent r e com%d numer os\ n", MAX) ;
f or ( i = 0; i < MAX; i ++)
{ pr i nt f ( "Vet or [ %d] = " , i ) ;
scanf ( "%d", &val or [ i ] ) ;
soma = soma + val or [ i ] ;
}

pr i nt f ( " \ n El ement os di gi t ados f or am: ") ;
f or ( i =0; i <MAX; i ++)
pr i nt f ( " %d ", val or [ i ] ) ;
pr i nt f ( " \ n A soma e: %d" , soma) ;
get ch( ) ;
}


Exerccios:

1. Faa um programa que leia 6 nmeros e exiba:
a) o maior nmero lido;
b) o menor nmero lido;
c) quantos nmeros so iguais ao 1 nmero lido.

2) Faa um programa que leia 8 nmeros inteiros e exiba quantos so maiores que a mdia desses valores.

3) Faa um programa que leia n notas (mximo de 20) de alunos de uma colgio e exiba:
a) quantos alunos foram aprovados;
b) quantos alunos foram reprovados;
obs: faa a consistncia das notas.

4) Leia um vetor A, com no mximo 10 elementos. Crie um vetor B da seguinte forma:
a) coloque os nmeros pares primeiro ;
b) coloque os nmero impares logo aps os pares;
c) exiba o vetor B.

Este exerccio deve ser feito em casa
- Em uma cidade do interior, sabe-se que, de janeiro a abril de 1976 (121 dias), no ocorreu
temperatura inferior a 15C nem superior a 40C. As temperaturas verificadas em cada dia esto disponveis
em uma unidade de entrada de dados.

Estrutura de Dados
Prof. Esp. Rogrio Lazanha
4
Faa um programa que calcule e escreva:
a) a menor temperatura ocorrida
b) a maior temperatura ocorrida
c) a temperatura mdia
d) o nmero de dias nos quais a temperatura foi inferior a mdia das temperaturas.

ORDENAO DE VETORES

Algumas tarefas de programao so to comuns, que, com o passar dos anos, foram desenvolvidos
algoritmos altamente eficientes e padronizados para se encarregar dessas tarefas.

Ordenar corresponde ao processo de rearranjar um conjunto de objetos em uma ordem ascendente ou
descendente. O objetivo principal da ordenao facilitar a recuperao de informaes em um conjunto
ordenado. Os mtodos de ordenao classificam-se em dois grupos: se o arquivo a ser ordenado cabe todo na
memria principal, ento o mtodo de ordenao denominado ordenao interna, caso contrrio,
denominado de ordenao externa.

PRINCPIOS GERAIS DE ORDENAO

Os algoritmos de ordenao apresentados comparam um elemento de um array com outro, e, se os
dois elementos estiverem desordenados, os algoritmos trocam a ordem deles dentro do array. Esse processo
o seguinte:

if (a[i] >a[i+1])
{
aux :=a[i];
a[i] :=a[i+1];
a[i+1] :=aux;
}

A primeira linha do cdigo verifica se os dois elementos do array esto desordenados. Em geral, os
arrays encontram-se em ordem quando o elemento atual menor que o elemento seguinte. Se os elementos
no estiverem adequadamente ordenados, ou seja, se o elemento atual for maior que o elemento seguinte, sua
ordem ser trocada. A troca exige uma varivel de armazenamento temporrio do mesmo tipo que a dos
elementos do array que est sendo ordenado.

Exemplo 1: Leia um vetor de n elementos reais e exiba-o ordenado.


#i ncl ude <coni o. h>
#i ncl ude <st di o. h>
#def i ne MAX 10

voi d mai n( )
{
i nt i , n, bandei r a;
f l oat vet or [ MAX] , aux;

cl r scr ( ) ;
/ / Lei t ur a da quant i dade de el ement os

Estrutura de Dados
Prof. Esp. Rogrio Lazanha
5
n = 0;
whi l e ( ( n <= 0) | | ( n > MAX) )
{ pr i nt f ( "Ent r e comN: " ) ;
scanf ( "%d", &n) ;
}

pr i nt f ( "Lei t ur a dos el ement os do Vet or \ n" ) ;
f or ( i = 0; i < n; i ++)
{ pr i nt f ( "vet or [ %d] = ", i ) ;
scanf ( " %f ", &vet or [ i ] ) ;
}

/ / or denacao
bandei r a = 1;
whi l e ( bandei r a)
{ bandei r a = 0;
f or ( i =0; i <n- 1; i ++)
i f ( vet or [ i ] > vet or [ i +1] )
{ aux = vet or [ i ] ;
vet or [ i ] = vet or [ i +1] ;
vet or [ i +1] = aux;
bandei r a = 1;
}
}

/ / exi bi cao dos el ement os or denados
pr i nt f ( " \ nEl ement os or denados \ n" ) ;
i = 0;
f or ( i =0; i < n; i ++)
pr i nt f ( "%2. 2f ", vet or [ i ] ) ;
get ch( ) ;
}



MTODO DE ORDENAO BUBLE-SORT (BOLHA)

O algoritmo da ordenao BUBLE-SORT simples de ser entendido - ele comea no final do array a
ser ordenado e executa a ordenao na direo do incio do array. A rotina compara cada elemento com seu
precedente. Se os elementos estiverem desordenados, sero trocados. A rotina continua at alcanar o incio
do vetor.

Como a ordenao funciona de trs para frente atravs do array, comparando cada par de elementos
adjacentes (prximos, vizinhos), o elemento de menor valor sempre flutuar no topo depois da primeira
passagem. Aps a segunda passagem, o segundo elemento de menor valor flutuar para a segunda posio do
array, e assim por diante, at que o algoritmo tenha verificado uma vez cada elemento do array.

Exemplo 2: Altere o mtodo de ordenao acima para o mtodo bolha.

#i ncl ude <coni o. h>
#i ncl ude <st di o. h>
#def i ne MAX 10

voi d mai n( )
{

Estrutura de Dados
Prof. Esp. Rogrio Lazanha
6
i nt i , j , n;
f l oat vet or [ MAX] , aux;

. . . .
. . . .

/ / or denacao pel o mt odo bol ha.
f or ( j =1; j <n; j ++)
f or ( i =n- 1; i >=j ; i - - )
i f ( vet or [ i ] < vet or [ i - 1] )
{ aux = vet or [ i ] ;
vet or [ i ] = vet or [ i - 1] ;
vet or [ i - 1] =aux;
}
. . . .
. . . .
get ch( ) ;
}


MTODO DE ORDENAO POR INSERO

A idia bsica deste mtodo inserir um determinado registro em uma seqncia ordenada, de tal
maneira que a seqncia resultante tambm permanea em ordem. Desta forma, em cada passo, a partir de
I=2, o i-simo item da seqncia fonte apanhado e transferido para a seqncia destino, sendo inserido no
seu devido lugar.

Exemplo 3: Altere o mtodo de ordenao acima para o mtodo insero.






/ / or denacao
i = 0;
whi l e ( i < n- 1)
{ j = i +1;
whi l e ( j < n)
{ i f ( vet or [ i ] > vet or [ j ] )
{ aux = vet or [ i ] ;
vet or [ i ] = vet or [ j ] ;
vet or [ j ] =aux;
}
j ++;
}
i ++;
}


PESQUISA EM VETORES (MTODOS DE LOCALIZAO)

Na programao, localizar significa procurar um determinado item dentro de um grupo de itens como,
por exemplo, procurar um determinado nmero inteiro em um array de inteiros, encontrar o nome de uma

Estrutura de Dados
Prof. Esp. Rogrio Lazanha
7
pessoa em um array de cadeias, e assim por diante. Os dois mtodos de localizao aqui apresentados o
seqencial e o binrio chegam ao mesmo objetivo por caminhos diferentes.

LOCALIZAO SEQUENCIAL

O programa simplesmente comea do incio do array a ser ordenado e compara cada elemento com o
valor que est sendo procurado.

#i ncl ude <coni o. h>
#i ncl ude <st di o. h>
#def i ne MAX 10
voi d mai n( )
{
i nt i , n, pos, achou;
f l oat vet or [ MAX] , x;
cl r scr ( ) ;
/ / Lei t ur a da quant i dade de el ement os
n = 0;
whi l e ( ( n <= 0) | | ( n > MAX) )
{ pr i nt f ( "Ent r e comN: ") ;
scanf ( "%d", &n) ;
}

pr i nt f ( "Lei t ur a dos el ement os do Vet or \ n" ) ;
f or ( i = 0; i < n; i ++)
{ pr i nt f ( "vet or [ %d] = " , i ) ;
scanf ( "%f " , &vet or [ i ] ) ;
}

/ / el ement o a ser pesqui sado
pr i nt f ( " El ement o a ser pesqui sado: " ) ;
scanf ( "%f ", &x) ;

/ / pesqui sa sequenci al
i = 0;
achou = 0;
whi l e ( ( i <n) && ( ! achou) )
{ i f ( vet or [ i ] == x)
{
achou = 1;
pos = i ;
}
i ++;
}
i f ( achou)
pr i nt f ( "O el ement o %2. 2f f oi encont r ado na posi cao %d ", x, pos) ;
el se
pr i nt f ( "El ement o %2. 2f nao encont r ado", x) ;
get ch( ) ;
}



LOCALIZAO BINRIA


Estrutura de Dados
Prof. Esp. Rogrio Lazanha
8
A localizao binria representa um dos mais eficientes mtodos de localizao conhecidos e um
grande aperfeioamento da localizao seqencial. Com um array de 100 elementos, por exemplo, uma
localizao seqencial exige uma mdia de 50 comparaes para encontrar um valor coincidente. A
localizao binria exige no mximo sete comparaes e no mnimo quatro para alcanar a mesma meta.
Quanto maior a lista, maior a eficincia relativa da localizao binria.

Para efetuar uma localizao binria, a lista deve estar ordenada. A localizao comea comparando o
elemento alvo com o elemento mediano do array. Se o elemento-alvo for maior que o elemento mediano, a
localizao prossegue na metade superior da lista. Se o valor-alvo for menor que o elemento mediano, o
elemento-alvo estar na metade inferior.

#i ncl ude <coni o. h>
#i ncl ude <st di o. h>
#def i ne MAX 10

voi d mai n( )
{
i nt i , j , n, pos, achou, mei o , i ni ci o, f i m;
f l oat vet or [ MAX] , x, aux;

cl r scr ( ) ;
/ / Lei t ur a da quant i dade de el ement os
n = 0;
whi l e ( ( n <= 0) | | ( n>MAX) )
{ pr i nt f ( "Ent r e comN: " ) ;
scanf ( "%d" , &n) ;
}

pr i nt f ( "Lei t ur a dos el ement os do Vet or \ n" ) ;
f or ( i = 0; i < n; i ++)
{ pr i nt f ( "vet or [ %d] = ", i ) ;
scanf ( "%f " , &vet or [ i ] ) ;
}

/ / or denacao do vet or - met odo i nser cao
i = 0;
whi l e ( i < n- 1)
whi l e ( j < n) { j = i +1;

{ i f ( vet or [ i ] > vet or [ j ] )
{ aux = vet or [ i ] ;
vet or [ i ] = vet or [ j ] ;
vet or [ j ] =aux;
}
j ++;
}
i ++;
}

/ / el ement o a ser pesqui sado

pr i nt f ( " El ement o a ser pesqui sado: " ) ;
scanf ( "%f ", &x) ;



Estrutura de Dados
Prof. Esp. Rogrio Lazanha
9
/ / pesqui sa bi nar i a
achou = 0;
i ni ci o = 0;
f i m= n- 1;
whi l e ( ( i ni ci o <= f i m) && ( ! achou) )
{
mei o = ( i ni ci o + f i m) / 2;
i f ( vet or [ mei o] == x)
{ achou = 1;
pos = mei o;
}
el se i f ( x > vet or [ mei o] )
i ni ci o = mei o + 1;
el se
f i m= mei o - 1;
}
cl r scr ( ) ;
pr i nt f ( " Vet or or denado\ n") ;
f or ( i =0; i <n; i ++)
pr i nt f ( "vet or [ %d] = %2. 2f \ n" , i , vet or [ i ] ) ;

i f ( achou)
pr i nt f ( "\ nO el ement o %2. 2f f oi encont r ado na posi cao %d " , x, pos) ;
el se
pr i nt f ( "\ nEl ement o %2. 2f nao encont r ado", x) ;
get ch( ) ;
}


Este exerccio deve ser feito em casa

- Intercalao o processo utilizado para construir uma tabela ordenada, de tamanho n +m, a partir
de duas tabelas j ordenadas de tamanho n e m. Por exemplo, a partir das tabelas:

A = 1 3 6 7

e
B = 2 4 5

construmos a tabela
C = 1 2 3 4 5 6 7

You might also like