Your SlideShare is downloading. ×
0
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
P13 16
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

P13 16

46

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
46
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Programação MEAer e MEEC Bertinho Andrade da Costa 2013/2014 1º Semestre Instituto Superior Técnico Funções e vectores, Algoritmos de ordenação Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 1
  • 2. Sumário   Funções e vectores  Mecanismo de passagem dos vectores  Aplicação dos conceitos no desenvolvimento de funções de ordenação e de procura em vectores. Algoritmos de ordenação e de procura em vectores  Algoritmo I: Bubble-Sort  Algoritmo II: Ordenação com procura do mínimo  Procura binária, num vector que esteja ordenado Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 2
  • 3. Ordenação dos elementos de um vector  Problema:   É necessário desenvolver um programa que efectue a ordenação de um conjunto de números, por ordem crescente de valores. Os números estão armazenados num vector. Considere que o vector tem dimensão DIMV. Algoritmo:  Ordenar os elementos de um vector significa ter que trocar os elementos do vector até que seja verificada a condição de ordenação.  Programação DEEC-IST Existem diversos algoritmos que podem ser utilizados na ordenação, uns mais eficientes (em termos de rapidez) do que outros. O estudo dos algoritmos de ordenação e de procura, assim como o respectivo desempenho será realizado na disciplina de Algoritmos e Estruturas de Dados. Funções e vectores; Algoritmos de ordenação 3
  • 4. Ordenação dos elementos de um vector  Acções:  Ler os números para um vector    Desenvolver o algoritmo de ordenação    Definir a quantidade de números que é necessário armazenar Definir a dimensão do vector Comparar duas posições do vector  Se a[i] > a[j] então trocar os conteúdos Parar a troca de conteúdos quando todos os números estiverem ordenados Apresentar o resultado Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 4
  • 5. Ordenação dos elementos de um vector  Algoritmo I (Bubble-Sort):  Considerem-se os elementos do vector v[ ] e use-se uma variável auxiliar aux para realizar a troca Passo 1 V[0] 10 V[1] 5 V[2] 3 V[3] 1 Passo 2 b a aux 5 c Passo 3 V[0] 5 V[0] 5 V[1] 10 V[2] 3 V[3] 1 b c a aux 3 V[1] 3 V[2] 10 V[3] 1 c b a aux 1 Nota: As letras a, b, c a ordem de execução das acções Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 5
  • 6. Ordenação dos elementos de um vector  Algoritmo I (cont.):  Como o vector não está ordenado é necessário começar do início novamente. Passo 4 V[0] 5 V[1] 3 V[2] 1 V[3] 10 Passo 5 b c a V[1] 1 V[2] 5 V[3] 10 Programação DEEC-IST V[0] 3 V[0] 3 V[1] 5 V[2] 1 aux 3 V[3] 10 Passo 7 V[0] 3 Passo 6 c b V[1] 1 V[2] 5 a aux 1 V[3] 10 c b a aux Passo 8 b a aux 1 c V[0] 1 V[1] 3 V[2] 5 V[3] 10 b c a aux Funções e vectores; Algoritmos de ordenação 6
  • 7. Ordenação dos elementos de um vector  Algoritmo I: Código (Versão 1) /*-------------------------------------+ | Programa: | Ordena os elementos de um vector | de inteiros utilizando o algoritmo | Buble Sort | | Vers„o: 1.0, - Programa sem funÁÐes | Autor: B. Andrade da Costa | Data: 20??/03/30 +-------------------------------------*/ #include <stdio.h> #define DIMV 10 int main( void ) { int v[DIMV]; int ordena, numVoltas, i ,numVec; printf("Leitura dos numeros n"); printf(" f - fimn MAX = %d n", DIMV); Programação DEEC-IST /* Le o maximo de DIMV elementos */ for (i=0; i<DIMV; ++i) { printf("v[%d]=", i); if (0 == scanf("%d", &(v[i]))) break; /* Se erro fim da leitura */ /* Por exemplo quando o utilizador carrega em f */ } /* Numero de elementos no vector */ numVec = i; /* Conta o numero de voltas ao vector */ numVoltas = 1; ordena = 1; while (ordena == 1) { printf ("%d volta ao vector n", numVoltas); ordena = 0; Funções e vectores; Algoritmos de ordenação 7
  • 8. Ordenação dos elementos de um vector  Algoritmo I: Código (Cont.) for (i=0; i<(numVec-1); ++i) if (v[i] > v[i+1]) { /* troca */ int aux; aux = v[i+1]; v[i+1] = v[i]; v[i] = aux; /* E necessario verificar todos mais uma vez */ ordena = 1; } ++numVoltas; } /* Apresenta o resultado */ printf("n"); for (i=0; i<numVec; ++i) printf("v[%d]=%dn", i, v[i]); if (numVec == 0) printf("Vector Vazio n"); printf ("Fim."); return 0; } Programação DEEC-IST Funções e vectores; Algoritmos de ordenação Saída do programa: Leitura dos numeros f - fim MAX = 10 v[0]=4 v[1]=3 v[2]=2 v[3]=1 v[4]=0 v[5]=f 1 volta ao vector 2 volta ao vector 3 volta ao vector 4 volta ao vector 5 volta ao vector v[0]=0 v[1]=1 v[2]=2 v[3]=3 v[4]=4 Fim. 8
  • 9. Ordenação dos elementos de um vector  Comentários relativos ao programa anterior:  A codificação do algoritmo não é a mais adequada.     A leitura e análise do programa não é fácil, devido a que todo o código foi colocado na função main. A reutilização do código do algoritmo de ordenação, num programa, é extremamente difícil dado que o programador tem sempre que se preocupar com os detalhes da solução que foi escrita. Para melhorar a legibilidade do código devem ser utilizadas funções. É fácil concluir que o programa seria mais fácil de analisar e de escrever se estivessem utilizados em funções. Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 9
  • 10. Funções e vectores  Comentários relativos ao programa anterior:  No exemplo anterior é conveniente ter funções com argumentos do tipo vector para:       Ler os números do teclado para o vector. Escrever os elementos do vector no ecrã. Testar se existe necessidade de trocar o conteúdo de duas variáveis do vector. Trocar dois elementos do vector Ordenar os elementos do vector. Coloca-se então o problema da definição de funções que recebem argumentos do tipo “vector”. Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 10
  • 11. Funções e vectores    Em C os vectores são sempre passados por aponatdor (por referência). O nome do vector é interpretado como o endereço do primeiro elemento do vector. Quando é necessário passar um vector como argumento de uma função podem ser utilizadas duas formas:  Notação vectorial, exemplo do protótipo de uma função que recebe um vector de inteiros (int v[]).   int le_vector(int v[], int dimv); Notação com apontador   Programação DEEC-IST Neste caso é importante lembrar que os elementos de um vector estão contíguos em memória. O acesso a cada um desses elementos pode ser realizado utilizando o endereço do primeiro elemento com operações sobre os apontadores. Este assunto será abordado numa próxima aula. int le_vector(int *v, int dimv); Funções e vectores; Algoritmos de ordenação 11
  • 12. Funções e vectores   É importante salientar que uma função não consegue determinar por si só qual é o comprimento do vector. É necessário passar para a função o comprimento do vector. Ou em alternativa o número de elementos que têm informação útil. No exemplo seguinte int le_vector(int v[], int dimv) { ... }  dimv - é uma variável local à função que é utilizada para guardar a dimensão do vector. Esse valor que deve ser fornecido no momento em que a função é invocada.  Note-se que, em princípio, o compilador não verifica as instruções de uma função estão a efectuar acessos ao vector mas fora da memória do vector.   Por exemplo, aceder à posição 20 quando o vector tem só 10 elementos. Quando isso acontece é usual que o programa deixe de funcionar. O programador deve ter muito cuidado quando efectua operações com vectores. Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 12
  • 13. Funções e vectores   Na versão do código que se apresenta, procurou-se dividir o programa em funções de modo a facilitar a escrita e respectiva compreensão. As funções estão colocadas em três ficheiros:  main.c   vect.c   Função principal do programa. Contémas funções de leitura de um vector (do teclado) e escrita no ecrã esc_int.c  Contém as funções que efectuam a manipulação de escalares do tipo int  função de comparação  função de troca de contéudo de variáveis.  ordena.c   Contém a função de ordenação bubble_sort Os ficheiros contém também comentários de modo a facilitar a respectiva leitura e análise. Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 13
  • 14. Funções e vectores  Algoritmo I: Código (Ficheiro main.c) /*-------------------------------------+ | Programa: (ficheiro: main.c) | Ordena os elementos de um vector de inteiros utilizando o algoritmo | Buble Sort | | Vers„o: 2.0, - Programa com funÁÐes | Autor: B. Andrade da Costa | Data: 20??/03/30 +-------------------------------------*/ #include <stdio.h> #define DIMV 10 #define ORDEM_CRES 1 /* Aqui podemos utilizar ficheiros de include com prototipos */ extern int le_vector(char nome[], int vint[], int dimvi); extern void esc_vector (char nome[], int vint[], int dimvi); extern int bubble_sort(int vint[], int dimvi, int odr); int main( void ) { int v[DIMV]; int numElemV; Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 14
  • 15. Funções e vectores  Algoritmo I: Código (Ficheiro main.c) printf("Algoritmo bubble sort n"); printf("Leitura dos numeros n"); printf(" f - fimn MAX = %d n", DIMV); /* Le o maximo de DIMV elementos */ numElemV = le_vector("a", v, DIMV); /* Ordena o vector, ordem crescente */ bubble_sort(v, numElemV, ORDEM_CRES); printf("n"); if (numElemV > 0) { /* Apresenta o resultado so os numElemV elementos */ printf("Vector Ordenado n"); esc_vector("a",v, numElemV); } else printf("Vector Vazio n"); printf ("Fim."); return 0; } Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 15
  • 16. Funções e vectores  Algoritmo I: Código (Ficheiro vect.c) /*-------------------------------------------| Ficheiro: vect.c | | Contem as funcoes: | le_vector : | Le um vector inteiros do teclado | esc_vector : | Escreve um vector de inteiros no ecra | | DependÍncias: Nenhuma | | Vers„o: 2.0, - Programa com funÁÐes | Autor: B. Andrade da Costa | Data: 20??/03/30 +--------------------------------------------*/ Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 16
  • 17. Funções e vectores  Algoritmo I: Código (Ficheiro vect.c) /*--------------------------------------------| Funcao: le_vector | Argumentos: | nome - String com o nome do vector que deve aparecer no ecra | vint - vector de int que vai receber os valores | dimvi - dimensao do vector | | Retorna: Quantidade de numeros no vector +----------------------------------------------*/ int le_vector(char nome[], int vint[], int dimvi) { int i; for (i=0; i < dimvi; ++i) { printf("%s[%d]=", nome, i); if (0 == scanf("%d", &(vint[i]))) break; /* Se erro fim da leitura */ /* Por exemplo quando o utilizador carrega em f */ } return i; } Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 17
  • 18. Funções e vectores  Algoritmo I: Código (Ficheiro vect.c) /*--------------------------------------------| Funcao: esc_vector | Argumentos: | nome - String com o nome do vector que | deve aparecer no ecra | vint - vector de int que tem os valores | dimvi - dimensao do vector ou numero de elementos | a serem imprimidos | +---------------------------------------------*/ void esc_vector (char nome[], int vint[], int dimvi) { int i; for (i=0; i<dimvi; ++i) printf("%s[%d]=%dn", nome, i, vint[i]); } /* Fim do ficheiro vect.c */ Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 18
  • 19. Funções e vectores  Algoritmo I: Código (Ficheiro ordena.c) /*-------------------------------------------| Ficheiro: ordena.c | | Contem as funcoes: | bubble_sort : | Recebe um vector e ordena-o. E possivel | especificar o tipo de ordenacao | | DependÍncias: | Sao necess·rias as funcoes | int compara_ints (int x, int y); | void troca_ints (int *x, int *y) | | Vers„o: 2.0, - Programa com funÁÐes | Autor: B. Andrade da Costa | Data: 20??/03/30 +--------------------------------------------*/ extern int compara_ints (int x, int y); extern void troca_ints (int *x, int *y); Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 19
  • 20. Funções e vectores  Algoritmo I: Código (Ficheiro ordena.c) int bubble_sort(int vint[], int dimvi, int odr) { int i, ordena = 1; if ((odr != 1) && (odr != -1)) return 0; while (ordena == 1) { ordena = 0; for (i=0; i<(dimvi-1); ++i) if (compara_ints(vint[i], vint[i+1]) == odr) { /* troca */ troca_ints(&(vint[i]), &(vint[i+1])); /* E necessario verificar mais uma vez */ ordena = 1; } } return 1; } Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 20
  • 21. Funções e vectores  Algoritmo I: Código (Ficheiro esc_int.c) /*-------------------------------------------| Ficheiro: escalar.c | | Contem as funcoes que manipulam esclares do | tipo int | | compara_ints : Compara as variaveis x e y, | devolve 1 de x > y | devolve 0 de x e igual a y | devolve -1 se x < y | troca_ints :Troca o conteudo de duas variaveis | | Dependencias: Nunhuma | | Vers„o: 2.0, - Programa com funÁÐes | Autor: B. Andrade da Costa | Data: 20??/03/30 +--------------------------------------------*/ Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 21
  • 22. Funções e vectores  Algoritmo I: Código (Ficheiro esc_int.c) /*--------------------------------------------| Funcao: compara_ints | Argumentos: | x e y - variaveis do tipo inteiro | | Retorna: | devolve 1 de x > y | devolve 0 de x e igual a y | devolve -1 se x < y +----------------------------------------------*/ int compara_ints (int x, int y) { if (x > y) return 1; if (x == y) return 0; return -1; } Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 22
  • 23. Funções e vectores  Algoritmo I: Código (Ficheiro esc_int.c) /*--------------------------------------------| Funcao: troca_ints | Argumentos: | x e y - apontadores para as variaveis | | Retorna: | void +---------------------------------------------*/ void troca_ints (int *x, int *y) { int aux; aux = *x; *x = *y; *y = aux; } /* Fim do ficheiro esc_int.c */ Programação DEEC-IST Resultado do programa: Algoritmo bubble sort Leitura dos numeros f - fim MAX = 10 a[0]=2 a[1]=1 a[2]=4 a[3]=3 a[4]=0 a[5]=f Vector Ordenado a[0]=0 a[1]=1 a[2]=2 a[3]=3 a[4]=4 Fim. Funções e vectores; Algoritmos de ordenação 23
  • 24. Ordenação dos elementos de um vector  Algoritmo II:      Considere-se um vector de dimensão n. Utilizem-se as variáveis w = n e p = 1 ; Determinar o menor dos w elementos do vector e a respectiva posição, k. Em seguida trocar o contéudo da posição p do vector com o conteúdo da posição k onde está o valor mínimo. Repetir os passos anteriores, para os w-1 elementos do vector com p = p+1 Passo 1 V[0] 10 V[1] 5 V[2] 3 V[3] 1 Programação DEEC-IST Passo 2 b a aux 1 c Passo 3 V[0] 1 V[0] 1 V[1] 5 V[2] 3 V[3] 10 b c a aux 3 Funções e vectores; Algoritmos de ordenação V[1] 3 V[2] 5 V[3] 10 c b a aux 24
  • 25. Ordenação dos elementos de um vector  Exercício II:   Escreva uma função que realize o algoritmo II de ordenação. Utilize, se possível, as funções que já foram desenvolvidas para o programa de teste do “bubble sort”. Escreva a função main que permita testar a função que desenvolver. Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 25
  • 26. Ordenação dos elementos de um vector  Algoritmo II: Código da função int ordena_alg2(int vint[], int dimvi, int odr) { int i, j, ordena = 1; if ((odr != 1) && (odr != -1)) /* Tipo de ordenação */ return 0; for (i=0; i < (dimvi-1); ++i) int minimo = vint[i]; int pos_minimo = i; { for (j=i+1; j<dimvi; ++j) { if (compara_ints(minimo, vint[j]) == odr) { pos_minimo = j; minimo = vint[j]; } } troca_ints(&(vint[i]), &(vint[pos_minimo])); } Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 26
  • 27. Procurar binária num vector  Problema:   Pretende-se desenvolver uma função que realize a procura binária num vector de inteiros. Assume-se que o vector está ordenado. Esta condição é fundamental para a aplicação do algoritmo. O algoritmo de procura binária consiste nos seguintes passos:   Inicialmente é feito um acesso a um elemento do vector. A escolha da posição do elemento pode ser por exemplo i=N/2 em que N é a dimensão do vector se estiver totalmente preenchido. Aqui podem ocorrer três situações:  O elemento procurado está na posição i e como consequência foi encontrado e a procura termina.  Ou o elemento está estar no intervalo [0; i[  Ou pode estar no intervalo ]i+1; N-1]  Programação DEEC-IST Como o vector está ordenado deve então escolher-se o intervalo onde o elemento pode estar e divide-se esse novo intervalo ao médio. Este processo termina, no pior caso, quando o último intervalo tiver um único elemento Funções e vectores; Algoritmos de ordenação 27
  • 28. Programação DEEC-IST Funções e vectores; Algoritmos de ordenação 28

×