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