• Nenhum resultado encontrado

Laboratório 12 Pesquisa e Ordenação

N/A
N/A
Protected

Academic year: 2021

Share "Laboratório 12 Pesquisa e Ordenação"

Copied!
5
0
0

Texto

(1)

Instituto Politécnico de Setúbal

Escola Superior de Tecnologia

Departamento de Sistemas e Informática

Laboratório 12 – Pesquisa e Ordenação

Disciplina de Introdução à Programação

Ano Lectivo 2006/2007

(2)

Série 12 – Pesquisa e Ordenação

Objectivos da Série:

Com esta série de problemas pretende-se que o aluno:

1. Domine os principais algoritmos de pesquisa e ordenação;

2. Compreenda as diferenças entre eles e em que situações se devem utilizar; 3. Conheça as vantagens da utilização de apontadores para funções.

Exercício 1 – Pesquisa Sequencial

Considere a seguinte inicialização de um vector de inteiros:

int elementos[] = {14, 26, 23, 17, 7, 3, 5, 13, 18, 16, 12, 11, 21, 30, 27, 9, 22, 1, 25, 19, 8, 28, 20, 4, 29, 10, 24, 2, 15, 6};

Implemente o algoritmo de pesquisa Sequencial, com a assinatura

int PesquisaSequencial(int v[], int nelem, int val),

que retorna o índice onde se encontra o valor val, e caso não exista, devolve -1. Este algoritmo, como o nome indica, percorre o vector sequencialmente à procura do elemento pretendido.

Teste o algoritmo, procurando no vector apresentado os valores: 14, 6, 27, 9, 7, 15 e 0.

Exercício 2 – Pesquisa Binária

Num algoritmo de pesquisa Binário a pesquisa começa por seleccionar o elemento central da sequência e compara-o com o valor procurado. Se o elemento escolhido for menor, então exclui-se a primeira parte da sequência e analisa-se apenas a segunda metade. Caso contrário, procura-se apenas na primeira metade. Este processo repete-se até que o elemento procurado seja encontrado, ou até que a sequência obtida não tenha mais elementos para serem analisados. Em que condições pode este algoritmo ser aplicado?

Implemente este algoritmo numa função

int PesquisaBinaria(int v[], int nelem, int val),

Testando-o com uma sequência de 30 elementos e procurando os valores: 14, 6, 27, 9, 7, 15 e 0.

Exercício 3 – Comparação de algoritmos de Pesquisa

(3)

Exercício 4 – Ordenação por Selecção

Implemente o algoritmo Selection Sort para ordenar crescentemente a sequência do Exercício 1.

Com este algoritmo na primeira passagem o elemento menor da sequência fica colocado na primeira posição, na segunda passagem, o segundo menor elemento fica colocado na segunda posição e assim sucessivamente até que na última passagem o segundo maior valor fica colocado na penúltima posição. O elemento maior fica automaticamente na última posição.

Utilize os seguintes subprogramas no decurso da sua implementação:

/* Método que troca dois valores */ void Troca(int *a, int *b)

{

int aux = *a;

*a = *b;

*b = aux;

}

/*

Funcao que devolve o índice do valor mínimo encontrado numa sequência a partir do índice indInicial.

Necessária inclusão de biblioteca <limits.h> para INT_MAX. */

int indiceValorMinimo(int v[], int nelem, int indInicial) {

int minimo = INT_MAX, indice;

for(int i=indInicial; i<nelem; i++)

if(v[i] < minimo) { minimo = v[i]; indice = i; }

return indice; }

Exercício 5 – Ordenação por Inserção

Implemente o algoritmo Insertion Sort para ordenar crescentemente a sequência do Exercício 1.

Exercício 6 – Ordenação por Troca

Implemente o algoritmo Bubble Sort para ordenar crescentemente a sequência do Exercício 1.

Que alteração é necessária para que a ordenação obtida seja decrescente? Teste o algoritmo para este caso.

(4)

Exercício 7 – Comparação de algoritmos de ordenação

Modifique os algoritmos anteriores de modo a que contabilizem o número de comparações entre elementos e as trocas efectuadas. Ordene a sequência do Exercício 1, mostrando no final as estatísticas de cada um dos algoritmos. O que pode concluir?

Exercício 8 – Ordenação de Estruturas

Crie uma lista de contactos que deverá conter um índice de registo, o nome da pessoa, o número de telefone e o e-mail. Para tal, utilize a seguinte definição de estrutura:

typedef struct {

unsigned int id_registo;

char nome[255];

unsigned long telefone;

char email[255];

} TCONTACTO;

Poderá utilizar a seguinte inicialização, ou outra que entenda:

TCONTACTO ListaContactos[] = {

{4, "Bruno Silva", 962661234, "bsilva@est.ips.pt"}, {2, "Rui Madeira", 969871234, "rmadeira@est.ips.pt"}, {5, "Fernando Bota", 919726409, "fbota@est.ips.pt"}, {3, "Antonio Corral", 938741854, "acorral@est.ips.pt"}, {1, "Luis Esteves", 964289844, "lesteves@est.ips.pt"}, {6, "Cedric Grueau", 916429646, "cgrueau@est.ips.pt"}};

(Nota: os números de telefone são fictícios ☺)

Utilize o seguinte procedimento para imprimir a lista de contactos:

void imprimeContactos(TCONTACTO v[], int tamanho) {

for(int i=0; i<tamanho; i++) { printf("Registo %d\n", v[i].id_registo); printf("\tNome:\t %s\n", v[i].nome); printf("\tTel.:\t %ld\n", v[i].telefone); printf("\tE-Mail:\t %s\n", v[i].email); printf("---\n"); } }

Crie subprogramas que sejam capazes de ordenar a lista, utilizando o algoritmo Bubble

Sort, por Registo, Nome, Telefone e E-mail.

(5)

Exercício 9 – Ordenação Avançada de Estruturas

O exercício anterior pode ser optimizado utilizando apontadores para funções, de modo a só haver um subprograma de ordenação.

A ideia é termos várias funções que comparam diferentes campos da estrutura, mas que devolvem o mesmo tipo de dados e tenham os mesmos argumentos. Suponhamos que temos as seguintes funções que comparam os diferentes campos:

a. int comparaContactosPorId(TCONTACTO *c1, TCONTACTO *c2)

b. int comparaContactosPorNome(TCONTACTO *c1, TCONTACTO *c2)

c. int comparaContactosPorTelefone(TCONTACTO *c1, TCONTACTO *c2)

d. int comparaContactosPorEmail(TCONTACTO *c1, TCONTACTO *c2)

Estes subprogramas devolvem o valor 1 caso o contacto c1 seja “maior” (ou menor) que o contacto c2 e 0 caso contrário.

No subprograma que implementa a ordenação pode ser declarado um apontador para estas funções, do seguinte modo:

int (*pFuncao) (TCONTACTO *c1, TCONTACTO *c2);

Consoante o tipo de ordenação necessária, é atribuída a função correspondente a

pFuncao. Por exemplo, se for necessária a ordenação por Telefone:

pFuncao = comparaContactosPorTelefone;

Agora pode-se utilizar pFunc como se estivéssemos a invocar directamente

comparaContactosPorTelefone:

pFuncao(&ListaContactos[0], &ListaContactos[1])

sendo devolvido o valor 0, pois o número de telefone do Bruno é menor que o do Rui. Deste modo os elementos da lista podem ser comparados de uma forma genérica.

Implemente o mecanismo descrito criando um subprograma que ordene a lista de contactos e que tenha a seguinte assinatura:

void ordenaContactos(TCONTACTO lista[], int tamanho, int campo)

Em que o argumento campo pode assumir os seguintes valores, que ditarão a ordenação a ser efectuada:

1 – Id do registo 2 – Nome

3 – Telefone 4 – E-mail

Referências

Documentos relacionados

- A empresa responsável pela carga ou escolta deverá apresentar a GRU comprovando o pagamento do serviço de escolta e batedor PRF, em conformidade com os valores constantes na

Fora do espaço da reunião anual, considerava-se conveniente fortalecer articulações com outras sociedades de ciên- cias humanas, participar de eventos, publicar e convi- dar

34/2017 - Objeto: contratação de empresa especializada em locação, montagem e desmontagem de estruturas temporárias para eventos a fim de atender as demandas da SECULT –

Está ligado ao medidor de combustível através de um cabo mecânico.. Indicador de

- A terapia antirretroviral inibiu de maneira efetiva a replicação viral, com conseqüente diminuição dos níveis plasmáticos de RNA do HIV-1, que foi acompanhada pelo aumento

Não administrar a galinhas poedeiras cujos ovos são destinados para consumo humano. Não utilizar nas 4 semanas antes do início do período de postura nem durante a postura

• O item “c” se aplica especialmente ao canto e aos instrumentos não-harmônicos;.. • Não serão aceitos solos sem acompanhamento, nem acompanhamentos sem solista. Programa da

Partindo de uma concepção construtivista com atenção à diversidade, Zabala (1998) afirma que o professor necessita questionar diferentes sequências didáticas, a fim de