890 likes | 1.01k Views
Capítulo VI – Variáveis Indexadas. 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias de caracteres.
E N D
Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias de caracteres
6.3 – Aplicações com Vetores Numéricos 6.3.1 – Ordenação dos valores de um vetor • Colocar em ordem crescente ou decrescente os valores dentro dos elementos de um vetor 5 0 0 16 8 45 1 1 72 2 2 16 5 45 3 3 67 4 4 8 70 67 5 5 6 95 72 6 7 74 74 7 80 70 8 8 9 80 95 9 Vetor desordenado V Vetor ordenado crescentemente V
São inúmeros os métodos para a ordenação de vetores apresentados na literatura • Alguns deles são bem simples, porém ineficientes para vetores muito longos • Outros, para vetores longos, são mais eficientes, porém mais complexos • Nesta seção será apresentado o conhecido método Bubble-Sort(método da bolha), que é dos mais simples • Esse nome é dado porque tem-se a impressão de que os elementos borbulham até chegar à sua posição definitiva
O método Bubble-Sort consiste em: • Percorrer o vetor várias vezes • Durante cada percurso, efetuar troca de posição de elementos adjacentes, caso o elemento da esquerda seja maior que o da direita • Em cada percurso, um elemento atinge sua posição definitiva • Se, durante um dos percursos, não houver trocas, considera-se que o vetor está ordenado
(cursor para percorrer o vetor várias vezes) Exemplo: seja o seguinte vetor e o método em seu início 16 0 45 1 2 72 5 3 8 4 5 67 95 6 7 74 70 8 80 9 V (limitante de i a cada percurso) p i trocou (semáforo que acende quando há troca)
Não trocar 16 0 1 45 72 2 5 3 8 4 5 67 95 6 7 74 70 8 80 9 V i p trocou
Não trocar 16 0 1 45 72 2 5 3 8 4 5 67 95 6 7 74 70 8 80 9 V i p trocou
Trocar 16 0 1 45 72 2 5 3 8 4 5 67 95 6 7 74 70 8 80 9 V i p trocou
Trocar 16 0 1 45 5 2 72 3 8 4 5 67 95 6 7 74 70 8 80 9 V i p trocou
Trocar 16 0 1 45 5 2 8 3 72 4 5 67 95 6 7 74 70 8 80 9 V i p trocou
Não trocar 16 0 1 45 5 2 8 3 67 4 5 72 95 6 7 74 70 8 80 9 V i p trocou
Trocar 16 0 1 45 5 2 8 3 67 4 5 72 95 6 7 74 70 8 80 9 V i p trocou
Trocar 16 0 1 45 5 2 8 3 67 4 5 72 74 6 7 95 70 8 80 9 V i p trocou
Trocar 16 0 1 45 5 2 8 3 67 4 5 72 74 6 7 70 95 8 80 9 V i p trocou
95 em sua posição definitiva trocou acesa: começar novo percurso retroceder p 16 0 1 45 5 2 8 3 67 4 5 72 74 6 7 70 80 8 95 9 V p A variável cursora ‘i’ não precisa chegar até V[8] Basta chegar até V[7] trocou
Não trocar 16 0 1 45 5 2 8 3 67 4 5 72 74 6 7 70 80 8 95 9 V i p trocou
Trocar 16 0 1 45 5 2 8 3 67 4 5 72 74 6 7 70 80 8 95 9 V i p trocou
Trocar 16 0 1 5 45 2 8 3 67 4 5 72 74 6 7 70 80 8 95 9 V i p trocou
Não trocar 16 0 1 5 8 2 45 3 67 4 5 72 74 6 7 70 80 8 95 9 V i p trocou
Não trocar 16 0 1 5 8 2 45 3 67 4 5 72 74 6 7 70 80 8 95 9 V i p trocou
Não trocar 16 0 1 5 8 2 45 3 67 4 5 72 74 6 7 70 80 8 95 9 V i p trocou
Trocar 16 0 1 5 8 2 45 3 67 4 5 72 74 6 7 70 80 8 95 9 V i p trocou
Não trocar 16 0 1 5 8 2 45 3 67 4 5 72 70 6 7 74 80 8 95 9 V i p trocou
80 em sua posição definitiva trocou acesa: iniciar novo percurso retroceder p 0 16 5 1 2 8 3 45 4 67 5 72 70 6 74 7 80 8 9 95 V p trocou
Trocar 16 0 1 5 8 2 45 3 67 4 5 72 70 6 7 74 80 8 95 9 V i p trocou
Trocar 5 0 1 16 8 2 45 3 67 4 5 72 70 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 72 70 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 72 70 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 72 70 6 7 74 80 8 95 9 V i p trocou
Trocar 5 0 1 8 16 2 45 3 67 4 5 72 70 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 70 72 6 7 74 80 8 95 9 V i p trocou
74 em sua posição definitiva trocou acesa: novo percurso retroceder p 0 5 8 1 2 16 3 45 4 67 5 70 72 6 74 7 80 8 9 95 V p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 70 72 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 70 72 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 70 72 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 70 72 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 70 72 6 7 74 80 8 95 9 V i p trocou
Não trocar 5 0 1 8 16 2 45 3 67 4 5 70 72 6 7 74 80 8 95 9 V i p trocou
72 em sua posição definitiva trocou apagada: vetor ordenado 0 5 8 1 2 16 3 45 4 67 5 70 72 6 74 7 80 8 9 95 V p trocou
5 0 1 8 2 16 3 45 67 4 5 70 72 6 7 74 80 8 95 9 V p Se, em todos os percursos, a lâmpada acender, o processo termina quando p chegar a -1
Seja este trecho abreviado para Testar e Trocar (i, i+1); • O teste da necessidade de troca entre dois elementos adjacentes pode ser feito pelo seguinte trecho: if (V[i] > V[i+1]) { aux = V[i]; V[i] = V[i+1]; V[i+1] = aux; trocou = true; } • Um percurso genérico da variável i pode ser expresso por: for (trocou = false, i = 0; i <= p; i++) Testar e Trocar (i, i+1); ‘aux’ é uma variável auxiliar para realização de troca de conteúdo entre variáveis Seja este trecho abreviado para Percorrer até (p);
Percorrer até (p); • for (trocou = false, i = 0; i <= p; i++) Testar e Trocar (i, i+1); • Sendo n, o número de elementos do vetor, os diversos percursos necessários para a ordenação podem ser realizados por for (trocou = true, p = n-2; p >= 0 && trocou == true; p--) Percorrer até (p); • A seguir o programa do Bubble-Sort completo
#include <stdio.h> #include <stdlib.h> /* Criacao do tipo logic e suas constantes */ typedefcharlogic; constlogicfalse = 0, true = 1; /* Criacao do tipo vetor */ typedefint vetor[50]; /* Cabecalho e declarações locais */ int main () { int n, i, p, aux; logic trocou; vetor V;
/* Leitura do vetor a ser ordenado */ printf ("Ordenacao de numeros pelo Bubble-Sort\n\n"); printf ("\tNumero de elementos: "); scanf ("%d",&n); printf ("\n\tElementos: "); for (i = 0; i < n; i++) scanf ("%d", &V[i]); /* Escrita do vetor desordenado */ printf ("\n\nVetor desordenado:\n\n"); for (i = 0; i < n; i++) printf ("%4d", V[i]);
/* Aplicação do metodobubble-sort */ for (trocou = true, p = n-2; p >= 0 && trocou == true; p--) for (trocou = false, i = 0; i <= p; i++) if (V[i] > V[i+1]) { aux = V[i]; V[i] = V[i+1]; V[i+1] = aux; trocou = true; } /* Escrita do vetor ordenado */ printf ("\n\nVetor ordenado:\n\n"); for (i = 0; i < n; i++) printf ("%4d", V[i]);
/* Fechamento da tela */ printf ("\n\n"); system ("pause"); return 0; } Ordenacao de numeros pelo Bubble-Sort Numero de elementos: 10 Elementos: 16 45 72 5 8 67 95 74 70 80 Vetor desordenado: 16 45 72 5 8 67 95 74 70 80 Vetor ordenado: 5 8 16 45 67 70 72 74 80 95 Digite algo para encerrar: Resultado de uma execução
6.3.2 – Procura de valores em um vetor • Outro problema muito conhecido: procurar um dado valor entre os elementos de um vetor • Quando o vetor não está ordenado, deve-se percorrê-lo sequencialmente, comparando os valores de seus elementos com o valor procurado • A procura termina quando o valor for encontrado, ou quando se chegar ao final do vetor • Esse tipo de procura é denominado procura sequencial
n 10 Exemplo: seja o seguinte vetor desordenado: • Seja a procura do valor 67: • Percorre-se o vetor com um cursor i, de V[0] em diante • Quando i = 5, V[i] = V[5] = 67 • Então o valor procurado foi encontrado na posição 5 do vetor V i 16 0 1 45 72 2 5 3 4 8 5 67 6 95 7 74 8 70 9 80 Número de elementos do vetor V
n 10 • Seja a procura do valor 50: • Percorre-se o vetor com um cursor i, de V[0] em diante • Para 0 ≤ i ≤ n-1 (n = 10), V[i] ≠ 50 • Então o valor procurado não foi encontrado no vetor V i 16 0 1 45 72 2 3 5 8 4 67 5 95 6 74 7 70 8 9 80 V
n i num 67 10 • Trecho de programa que realiza a procura sequencial: printf ("Numero procurado: "); scanf ("%d", &num); i = 0; while (i < n && V[i] != num) i++; if (i < n) printf ("\n\t%d estah na posicao %d do vetor\n\n", num, i); else printf ("\n\t%d naoestah no vetor\n\n",num); 16 0 45 1 2 72 5 3 4 8 5 67 95 6 74 7 70 8 9 80 Caso ‘n’ seja muito grande e ‘num’ não esteja em ‘V’, o tempo de procura é longo É proporcional a ‘n’ V