capítulo vi – variáveis indexadas

Download Capítulo  VI – Variáveis Indexadas

Post on 13-Jan-2016

37 views

Category:

Documents

2 download

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

  • Captulo VI Variveis Indexadas6.1 A necessidade de variveis indexadas6.2 Vetores e matrizes6.3 Aplicaes com vetores numricos6.4 Aplicaes com matrizes numricas6.5 Cadeias de caracteres6.6 Aplicaes com vetores de cadeias de caracteres

  • 6.3 Aplicaes com Vetores Numricos6.3.1 Ordenao dos valores de um vetor

    Colocar em ordem crescente ou decrescente os valores dentro dos elementos de um vetor

    Vetor desordenadoVetor ordenado crescentemente

  • So inmeros os mtodos para a ordenao de vetores apresentados na literatura

    Alguns deles so bem simples, porm ineficientes para vetores muito longos

    Outros, para vetores longos, so mais eficientes, porm mais complexos

    Nesta seo ser apresentado o conhecido mtodo Bubble-Sort (mtodo da bolha), que dos mais simples

    Esse nome dado porque tem-se a impresso de que os elementos borbulham at chegar sua posio definitiva

  • O mtodo Bubble-Sort consiste em:

    Percorrer o vetor vrias vezes

    Durante cada percurso, efetuar troca de posio de elementos adjacentes, caso o elemento da esquerda seja maior que o da direita

    Em cada percurso, um elemento atinge sua posio definitiva

    Se, durante um dos percursos, no houver trocas, considera-se que o vetor est ordenado

  • Exemplo: seja o seguinte vetor e o mtodo em seu incio(cursor para percorrer o vetor vrias vezes)(limitante de i a cada percurso)(semforo que acende quando h troca)V

  • No trocarV

  • No trocarV

  • TrocarV

  • TrocarV

  • TrocarV

  • No trocarV

  • TrocarV

  • TrocarV

  • TrocarV

  • 95 em sua posio definitiva trocou acesa: comear novo percursoretroceder pVA varivel cursora i no precisa chegar at V[8]

    Basta chegar at V[7]

  • No trocarV

  • TrocarV

  • TrocarV

  • No trocarV

  • No trocarV

  • No trocarV

  • TrocarV

  • No trocarV

  • 80 em sua posio definitivatrocou acesa: iniciar novo percursoretroceder pV

  • TrocarV

  • TrocarV

  • No trocarV

  • No trocarV

  • No trocarV

  • TrocarV

  • No trocarV

  • 74 em sua posio definitivatrocou acesa: novo percursoretroceder pV

  • No trocarV

  • No trocarV

  • No trocarV

  • No trocarV

  • No trocarV

  • No trocarV

  • 72 em sua posio definitivatrocou apagada: vetor ordenadoV

  • VSe, em todos os percursos, a lmpada acender, o processo termina quando p chegar a -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 genrico da varivel i pode ser expresso por:

    for (trocou = false, i = 0; i

  • for (trocou = false, i = 0; i = 0 && trocou == true; p--)Percorrer at (p);

    A seguir o programa do Bubble-Sort completoPercorrer at (p);

  • #include #include

    /*Criacao do tipo logic e suas constantes*/

    typedef char logic; const logic false = 0, true = 1;

    /*Criacao do tipo vetor*/

    typedef int vetor[50];

    /*Cabecalho e declaraes 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]);

  • /*Aplicao do metodo bubble-sort*/

    for (trocou = true, p = n-2; p >= 0 && trocou == true; p--) for (trocou = false, i = 0; 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 execuo

  • 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 no 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

  • Exemplo: seja o seguinte vetor desordenado:

    Seja a procura do valor 67:

    Percorre-se o vetor com um cursor i, de V[0] em dianteQuando i = 5, V[i] = V[5] = 67Ento o valor procurado foi encontrado na posio 5 do vetor V

    Nmero de elementos do vetor

  • Seja a procura do valor 50:

    Percorre-se o vetor com um cursor i, de V[0] em diantePara 0 i n-1 (n = 10), V[i] 50Ento o valor procurado no foi encontrado no vetor V

  • 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);elseprintf ("\n\t%d nao estah no vetor\n\n",num);iCaso n seja muito grande e num no esteja em V, o tempo de procura longo

    proporcional a n

  • Quando o vetor estiver ordenado:

    Seja a procura do valor 67:

    Percorre-se o vetor com um cursor i, de V[0] em diante, enquanto V[i] < 67Quando i = 4, V[i] = V[4] = 67Ento o valor procurado foi encontrado na posio 4 do vetor V

  • Seja a procura do valor 50:

    Percorre-se o vetor com um cursor i, de V[0] em diante, enquanto V[i] < 50Quando i = 4, V[i] = V[4] > 50Ento o valor procurado no foi encontrado no vetor V

  • 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 && V[i] == num)printf ("\n\t%d estah na posicao %d do vetor\n\n", num, i);elseprintf ("\n\t%d nao estah no vetor\n\n",num);iCaso n seja muito grande e num > V[n-1], o problema o mesmo do vetor desordenadoNo pior caso, o tempo proporcional a n, como para o vetor desordenado

    (T(n) O(n) da ordem de n)

  • Procura binria: importante mtodo de procura, para vetores ordenados

    O tempo de procura, no caso do valor no estar no vetor proporcional a log2n, o que, para vetores longos, muito significativo (T(n) O(log2n))

    O mtodo consiste em comparar o valor procurado com o do elemento da posio mdia do vetor

    Se forem iguais, o valor ter sido encontrado

    Caso contrrio, ele estar ou esquerda ou direita do elemento mdio

    O campo de procura fica reduzido pela metade; repete-se o procedimento acima, at encontrar ou at anular esse campo

  • Exemplo: seja o seguinte vetor ordenado:

    Seja a procura do valor 15

    Posio mdia:

    med = (0 + 16)/2 = 815 < V[8]Posio mdia:

    med = (0 + 7)/2 = 315 > V[3]Posio mdia:

    med = (4 + 7)/2 = 515 > V[5]Posio mdia:

    med = (6 + 7)/2 = 615 = V[6]Achou 15 na posio 6

  • Seja a procura do valor 41

    Posio mdia:

    med = (0 + 16)/2 = 841 > V[8]Posio mdia:

    med = (9 + 16)/2 = 1241 > V[12]Posio mdia:

    med = (13 + 16)/2 = 1441 < V[14]Posio mdia:

    med = (13 + 13)/2 = 1341 > V[13]Campo de procura vazio;No achou 41

  • Para os valores 15 e 41, o nmero de comparaes foi 4

    Numa procura sequencial, para o 15 e o 41, seriam necessrias 7 e 15 comparaes, respectivamente

    Para vetores muito longos, essa diferena, no pior caso, seria muito grande (n e log2n)

  • achou = false; inf = 0; sup = n - 1;do {med = (inf + sup) / 2;if (num == V[med]) achou = true;else if (num < V[med]) sup = med - 1;else inf = med + 1;} while (!achou && inf sup, o campo de procura vazio

    A seguir, um programa completo

  • Passos seguidos pelo programa da Procura binria:

    Leitura dos dados sobre o vetor;Verificao da condio de ordenao para o vetor;Se no mnimo um de seus elementos estiver fora de ordem {Emitir mensagem notificando o fato;Encerrar a execuo;}Seno iniciar uma seo de procuras, que deve ser encerrada mediante sinalizao do operador;

  • /*Diretivas de preprocessamanto e declaracoes*/

    #include #include #include

    typedef char logic;const logic false = 0, true = 1;typedef int vetor[50];

    int main () {int n, i, inf, sup, med, num;vetor V;logic achou, erro;char c;

  • /*Leitura dos elementos do vetor*/

    printf ("PROCURA BINARIA EM VETORES\n\n");printf ("Numero de elementos do vetor: "); scanf ("%d",&n);printf ("\nElementos: ");for (i = 0; i < n; i++) scanf ("%d", &V[i]);

    /*Verificacao da ordenacao do vetor*/

    for (i = 0, erro = false; i < n-1 && erro == false; i++)if (V[i] > V[i+1]) erro = true;if (erro == true)printf ("\n\tRelacao desordenada: nao havera procuras\n");

  • /*Secao de procuras*/

    else {clrscr ();printf ("Secao de Procuras:\n\n");printf ("Procurar numero (s/n)?: ");do scanf ("%c", &c);while (c != 's' && c != 'n' && c != 'S' && c != 'N');while (c == 's' || c == 'S') {printf ("\n\n\tNumero: ");

Recommended

View more >