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: