EXERCÍCIOS DE REVISÃO PARA P2 (2013.2)
Parte I: Busca e Ordenação
Considere que uma instituição mantém os dados dos resultados dos candidatos de um concurso
em um vetor de ponteiros para o tipo estruturado definido a seguir:
typedef struct candidato {
int media;
/* media final (0 a 100) */
int redacao;
/* nota da redação (0 a 100) */
int prioridade; /* prioridade atribuida ao candidato (0 a 5) */
char nome[81]; /* nome do candidato */
} Candidato;
Para se poder realizar a alocação de vagas para os candidatos, é necessário ordenar os
candidatos de acordo com o seguinte critério:
• os candidatos devem ser ordenados em ordem decrescente de média
• candidatos com a mesma média devem ser ordenados em ordem decrescente de nota de
redação
• candidatos com mesma média e nota de redação devem ser ordenados em ordem crescente
de prioridade
[1a] Escreva uma função ordenaBolha que, usando o algoritmo bubble sort, ordena um vetor de
ponteiros para Candidato conforme o critério descrito acima. A função deve receber, como
parâmetros, o vetor de candidatos e o número de elementos do vetor:
void ordenaBolha(Candidato **v, int n);
[1b] Escreva uma função ordenaRapida que, usando o algoritmo quick sort, ordena um vetor de
ponteiros para Candidato conforme o critério descrito na questão anterior. Novamente, a função
deve receber, como parâmetros, o vetor de candidatos e o número de elementos do vetor:
void ordenaRapida(Candidato **v, int n);
Neste exercício você pode usar a função qsort da biblioteca padrão de C se desejar. Ela tem o
protótipo, abaixo, descrito em stdlib.h:
void qsort(void *v, int n, int tam, int (*cmp) (const void *, const void *));
[2] Escreva uma função que, considerando que o vetor de ponteiros para Candidato está
ordenado conforme o critério descrito anteriormente, e usando a estratégia de busca binária,
descubra qual a maior nota de redação dentre os candidatos que obtiveram a média
especificada. Caso nenhum candidato tenha obtido a média especificada, a função deve retornar
0. Se encontrar pelo menos um candidato com essa média, a função retornará 1 e preencherá a
maior nota de redação encontrada para essa média no endereço recebido como parâmetro. Os
outros parâmetros para a função são o vetor de candidatos, o número de elementos do vetor e a
média para a qual se deseja a maior nota de redação:
int maiorNotaRedacao(Candidato **v, int n, int media, int *nota);
Parte II: TAD
Neste exercício vamos criar um tipo de dado para representar um número complexo, o tipo
Complexo, e definir algumas operações simples sobre esse tipo. Um número complexo é
expresso por dois números, a parte real e a parte imaginária.
[1a] Crie a interface do tipo Complexo, criando o arquivo complexo.h. Esse arquivo deve conter
a definição (typedef) do tipo Complexo e as operações de criar, liberar, imprimir, somar, subtrair e
multiplicar.
[1b] Crie agora a implementação do tipo Complexo, em um arquivo complexo.c (não esqueça
de incluir, neste arquivo, o arquivo que define a interface desse tipo, complexo.h, além dos
arquivos com os protótipos das funções da biblioteca padrão usadas por essa implementação!)
• Para representar o tipo de dado Complexo, defina uma estrutura para armazenar a parte real
e a imaginária
• Implemente a função que cria complexos. Ela deve alocar dinamicamente a estrutura que
representará o complexo, inicializar seus campos e retornar seu endereço. Caso não seja
possível alocar memória, mostre uma mensagem e retorne NULL.
• Implemente a função que exibe. Ela deve exibir na tela o número complexo na forma
tradicional, por exemplo: "3+2i"
• Implemente a função que libera complexos. Ela deve liberar a memória alocada para a
representação do complexo.
• Implemente as funções de soma, subtração e multiplicação. Relembrando:
• (a+bi) + (c+di) = (a + c) + (b + d)i
• (a+bi) - (c+di) = (a - c) + (b - d)i
• (a+bi) * (c+di) = (ac + bd) + (ad + bc)i
[2] Crie agora um outro arquivo C, usacomplexos.c, para testar a sua implementação. Seu
programa deve usar todas as funções definidas em complexo.h.
[3] Acrescente à interface e à implementação do seu TAD Complexo uma função que verifica se
o número complexo é real. Ela deve retornar 0 se o número complexo não é real, e 1 se ele é real.
Um número complexo é real se a parte imaginária é zero.
[4] Altere seu programa de teste para usar a função que você criou em [3]. Crie no seu programa
dois números complexos que não são reais, mostre que sua função confirma que eles não são
reais, efetue uma operação entre eles que resulte em um número real, e mostre que sua função
confirma que o resultado é real.
Download

Exercícios preparatórios para a P2