PROVA P2 INF1007 - 31/10/2014
Programação II
1ª Questão Considere um vetor de ponteiros para o tipo estruturado Voo, com os vôos que partem de um aeroporto em
um determinado dia.
typedef struct horario Horario;
struct horario
{ int hora;
int minuto;
};
typedef struct voo Voo;
struct voo
{ char nomeVoo[8];
Horario partida;
char destino[21];
}
1.A (0,5 ponto) Escreva a função int horário (Horario a, Horario b) que compara dois horários dados e
retorna um número positivo, caso a seja um horário maior que b; um número negativo, caso a seja menor que b ou 0
(zero) se a e b forem iguais. Por exemplo, se a for 15:30 e b for 15:40, então a função retorna um valor negativo.
Solução
1.B (2,5 pontos) Escreva a função quickVoos, que:
 recebe um vetor de ponteiros para Voo e o número total de vôos;
 ordena o vetor crescentemente por horário de partida. Para um mesmo horário de partida, os vôos devem ficar
ordenados alfabeticamente por nomeVoo. A sua função deve implementar o método de ordenação rápida (quick
sort) e deve usar uma função auxiliar de comparação, chamada comparaVoos, para comparar 2 vôos de acordo
com o critério descrito acima. Se quiser, você pode usar a função qsort da biblioteca. Mesmo que você não tenha
resolvido o item 1.A, a função horario poderá ser utilizada neste item.
Exemplo:
Fig.1
2
PROVA P2 INF1007 - 31/10/2014
Programação II
2ª Questão (2,5 pontos) Considere que uma loja guarda os códigos numéricos e alfanuméricos de seus produtos em
uma lista encadeada do tipo estruturado No:
typedef struct no No;
struct no
{ Informacao *info;
No *prox;
};
typedef struct informacao Informacao;
struct informacao
{ int codigo;
char nome[31];
};
Escreva a função quebraAoMeio que quebra esta lista encadeada do tipo estruturado No em duas sublistas e retorna o
endereço do primeiro nó da segunda metade da lista original. Se o número total de elementos da lista original é ímpar, o
elemento extra fica na primeira metade. Se este número é menor que 2, a lista retornada é vazia.
Fig 2
Fig. 2
Solução
4
PROVA P2 INF1007 - 31/10/2014
Programação II
typedef struct medico Medico;
struct medico
{ char nomeDoMed[51]; /* nome do medico */
float valorDaConsulta; /* valor da consulta com esse medico */
Medico *prox; /* ponteiro para o próximo médico da lista */
};
typedef struct especialidade Especialidade;
struct especialidade
{ char nomeEsp [21]; /*nome da especialidade */
Medico *lstMedicos; /* ponteiro para o primeiro nó de uma lista simplesmente encadeada de médicos dessa especialidade */
};
Considere agora a existência de um vetor de Especialidade, já ordenado alfabeticamente pelo nome da especialidade
(nomeEsp) (Fig.3).
3.A (2,5 pontos) Escreva a função buscaEspec que faz uma busca binária no vetor de especialidades por um nome de
uma dada especialidade e retorna o índice dessa especialidade, se encontrar, ou retorna -1 se não encontrar. Por
exemplo, para a especialidade “otorrino” na Fig. 3, a função retorna o índice 4. Use obrigatoriamente uma função
auxiliar de comparação.
3.B (2,0 pontos) Usando obrigatoriamente a função buscaEspec da questão anterior (mesmo que você não a tenha
definido) escreva a função MedicoNaEspecialidade que:
- recebe 4 parâmetros: um vetor de Especialidade ordenado alfabeticamente por nome, o número total de
especialidades, o nome de uma especialidade e o nome de um médico, e
- retorna o endereço da estrutura Medico que contém o médico procurado naquela especialidade ou retorna
NULL se a especialidade ou o médico em questão não são encontrados.
No exemplo da Fig. 3, para nome da especialidade “otorrino” e nome do médico “ana”, a função retorna o ponteiro para
a estrutura indicada pela caixa sombreada.
alergia
dermato
edu
eli
bia
liz
val
endocrino
gastro
otorrino
rui
vik
lia
tati
leo
teo
caio
ana
mac
pneumo
dina
cris
Fig. 3
Os valores de valorDaConsulta não estão indicados ao lado de cada nome de médico para simplificar a figura.
6
Download

PROVA P2 INF1007 - 31/10/2014 Programação II