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



Documentos relacionados
Aluno: Para todas as questões desta prova considere os tipos estruturados abaixo:

INF 1620 P4-01/07/08 Questão 1 Nome:

P2 Programação II Departamento de Informática/PUC-Rio

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0

P3 Programação II Departamento de Informática/PUC-Rio 27 de junho de 2013

INF 1620 P3-21/06/08 Questão 1 Nome:

INF 1620 P3-25/11/05 Questão 1 Nome:

INF 1620 P2-14/10/05 Questão 1 Nome:

INF 1620 P1-16/09/06 Questão 1 Nome:

INF 1620 P3-27/11/04 Questão 1 Nome:

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 26/11/2010

INF 1620 P4 11/12/06 Questão 1 Nome:

INF 1620 P2-17/05/08 Questão 1 Nome:

INF 1620 P4 30/06/07 Questão 1 Nome:

INF 1620 P2-23/10/04 Questão 1 Nome:

INF 1620 P3-29/06/04 Questão 1 Nome:

INF 1007 P2 23/10/10 Nome: Instruções:

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

INF 1620 P1-17/09/05 Questão 1 Nome:

INF 1620 P3-06/12/03 Questão 1 Nome:

INF 1620 P1-11/04/08 Questão 1 Nome:

INF 1620 P1-14/04/07 Questão 1 Nome:

INF 1620 P1-18/09/04 Questão 1 Nome:

INF P3-23/06/07 Questão 1 Nome:

P2 Programação II Departamento de Informática/PUC-Rio

SIMULADO PROVA. Questões Nota Revisão 1 (2.0) 2 (1.0) 3 (2.0) 4 (2.0) 5 (2.0) P1 (9,0)

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P1 17/04/2010

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010

INF 1620 P2-01/11/03 Questão 1 Nome:

a) Implemente uma função que retorne uma aproximação do valor de π, de acordo com a F órmula de Leibniz: ( 1)

INF 1007 Programação II

INF 1620 P4-09/07/03 Questão 1 Nome:

Estrutura de um programa em linguagem C

Primeiro Curso de Programação em C 3 a Edição

2ª Lista de Exercícios

Curso de C. Procedimentos e Funções. 6/4/200901/04/09 09:42 Copyright@Arnaldo V Moura, Daniel F Ferber 1

INF 1005 Programação I

INF 1620 P1-04/10/03 Questão 1 Nome:

INF 1620 P3-02/07/02 Questão 1 Nome:

struct LISTA item quant

Strings. Todas as funções apresentadas neste documento estão no arquivo de cabeçalho string.h.

INF 1620 P4-27/06/02 Questão 1 Nome:

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Programação II. Busca em Vetor (search) Bruno Feijó Dept. de Informática, PUC-Rio

Programação de Computadores II. Cap. 16 Ordenação

Estruturas (Registros)

INF 1005 Programação I

INF 1007 Programação II

INF 1620 P4-06/12/02 Questão 1 Nome:

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Exemplos. char c; int i=67;... c= A ; c=c+1; if (c== B )... c=i; i=c; i++; if (i>= C )...

Tabela ASCII de caracteres de controle

Questão 1.a) (2.5 pontos ) tipodabolsa matricula EhBolsista

Métodos Computacionais. Árvores

Estruturas de entrada e saída

Introdução a Computação

Módulo 16 - Ordenação

INF 1620 P1-10/04/02 Questão 1 Nome:

Busca. Pesquisa sequencial

Capítulo 2: Introdução à Linguagem C

INF 1007 Programação II

INF 1007 Programação II

Introdução. Manipulação de arquivos em C. Estrutura de Dados II Prof Jairo Francisco de Souza

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Programação e Sistemas de Informação

Aluno: Matrícula: Turma:

14. Arquivos. W. Celes e J. L. Rangel. Estruturas de Dados PUC-Rio 13-1

Métodos Computacionais. Fila

Linguagem C: Ordenação

Algoritmos e Estruturas de Dados I 01/2013. Arquivos. Pedro O.S. Vaz de Melo

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Trabalho 3: Agenda de Tarefas

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

1. Fazer um programa em C que pergunta um valor em metros e imprime o correspondente em decímetros, centímetros e milímetros.

Árvores Binárias - continuação

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Listas (Parte 2) Túlio Toffolo BCC202 Aula 10 Algoritmos e Estruturas de Dados I

Algoritmos e Programação Estruturada

Curso de C para Engenharias

MAC-115 Introdução à Computação para Ciências Exatas e Tecnologia IO Terceiro Exercício-Programa Entregar até 09/11/2007

17 - Funções e Procedimentos em C Programação Modular

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000

Estruturas de Dados I

CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos:

Aritmética e Álgebra COM10615-Tópicos Especiais em Programação I edmar.kampke@ufes.br

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

10. Listas Encadeadas

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

Algoritmos e Estruturas de Dados I. Arquivos. Pedro O.S. Vaz de Melo

Programação II. Ordenação (sort) Bruno Feijó Dept. de Informática, PUC-Rio

Módulo 16 - Ordenação. Referências

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

Algoritmos de Busca em Tabelas

Transcrição:

ALUNO: MATRÍCULA: (Nome Completo em Letra de Imprensa) ASSINATURA: TURMA: Instruções Gerais: 1. A duração da prova é de 1:50h; 2. A tolerância de entrada é de 30 min após o início da prova. Se um aluno terminar a prova em menos de 30min, deverá aguardar em sala antes de entregar a prova e sair de sala; 3. A prova deve ser resolvida apenas nas folhas recebidas e nos espaços reservados para soluções. Não é permitido destacar folhas da prova; 4. A prova é sem consulta a professores, fiscais ou a qualquer tipo de material. A interpretação dos enunciados faz parte da prova; 5. O aluno só poderá realizar a prova e assinar a lista de presença na sua turma/sala; 6. O aluno só poderá manter junto a si: lápis, borracha e caneta. Caso necessário, o fiscal poderá solicitar ajuda a outro aluno e apenas o fiscal repassará o material emprestado. Instruções Específicas: 1. Esta prova possui 4 folhas, contando com a capa. Confira; 2. As questões devem ser resolvidas usando a linguagem de programação C; 3. A prova deve ser feita preferencialmente à lápis. O aluno deve usar a caneta apenas para preencher o cabeçalho da prova (nome, matrícula, turma) e assinar a lista de presença; 4. Todo papel diferente do distribuído pelo fiscal (independentemente do conteúdo) e/ou qualquer dispositivo eletrônico (celular, tablet, etc) ligado ou não encontrado visível junto ao aluno implicará no recolhimento imediato da prova e a atribuição de nota zero à mesma; 5. Caso o aluno tenha perguntas ou observações a serem feitas ao professor, deverá descrevê-las na folha de rosto, na área reservada para observações stdio.h: int scanf (char* formato,...); int printf (char* formato,...); FILE* fopen (char* nome, char* modo); int fclose (FILE* fp); int fscanf (FILE* fp, char* formato,...); int fprintf (FILE* fp, char* formato,...); char*fgets(char* str, int size, FILE* fp); int sscanf(char* str, char* formato,...); stdlib.h: void* malloc (int nbytes); void free (void* p); Valor Nota (90% G2) Revisão Q1A 0.5 Q1B 2.5 Q2 2.5 Q3A 2.5 Q3B 2.0 Total 10.0 Algumas Funções de Bibliotecas ( NESTA PROVA VOCE PODE USÁ-LAS EM QUALQUER QUESTÃO ) math.h: double sqrt (double x); double pow (double x, double exp); double cos (double radianos); double sin (double radianos); string.h: int strlen (char* s); int strcmp (char* s, char *t); char* strcpy (char* destino, char* fonte); char* strncpy (char* destino, char* fonte, int n); char* strcat (char* destino, char* fonte); char* strdup (char* s); void qsort (void *v, int n, int tam, int (*cmp)(const void*, const void*)); void * bsearch(void * info, void * v, int n, int tam, int (*cmp)(const void *, const void *)); Espaço reservado para observações do aluno e futuros pedidos de revisão: 1

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 typedef struct voo Voo; struct voo int hora; char nomevoo[8]; int minuto; 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 int horario(horario a, Horario b) int ma = 60*a.hora + a.minuto; int mb = 60*b.hora + b.minuto; return ma-mb; 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

Solução 1: static int comparavoos(voo * a, Voo * b) int cmph = horario(a->partida,b->partida); int cmpn = strcmp(a->nomevoo,b->nomevoo); return cmph>0 (cmph==0 && cmpn>0); void quickvoos(voo ** v, int n) // Quick Sort Voo * x = v[0]; Voo * temp; int a = 1; int b = n-1; if (n<=1) return; do while (a < n &&!comparavoos(v[a],x)) a++; while (comparavoos(v[b],x)) b--; if (a < b) temp = v[a]; v[a] = v[b]; v[b] = temp; a++; b--; while (a <= b); v[0] = v[b]; v[b] = x; quickvoos(v,b); quickvoos(&v[a],n-a); Solução 2: static int comparavoos(const void *a, const void *b) Voo **aa = (Voo**)a; Voo **bb = (Voo**)b; int cmph = horario((*aa)->partida, (*bb)->partida); int cmpn = strcmp((*aa)->nomevoo, (*bb)->nomevoo); return cmph>0 (cmph==0 && cmpn>0); void quickvoos(voo ** v, int n) qsort(v, n, sizeof(voo*), comparavoos); 3

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 informacao Informacao; typedef struct no No; struct informacao struct no int codigo; Informacao *info; char nome[31]; No *prox; ; ; 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

Solução No *quebraaomeio(no *lst) No *p1, *p2; int cont; if(lst == NULL lst->prox == NULL) return NULL; cont = 0; for (p1=lst; p1!= NULL; p1= p1->prox) cont++; cont++; p1 = lst; for (cont = cont/2; cont>1; cont--) p1= p1->prox; p2= p1->prox; p1->prox= NULL; return p2; 5

3ª Questão Considere uma clínica com várias especialidades médicas, onde uma especialidade é definida pelo tipo estruturado Especialidade, que contém o nome da especialidade e uma lista encadeada representando os dados de cada médico desta especialidade: 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 endocrino gastro otorrino pneumo edu 100 eli rui vik lia dina bia liz tati leo teo val caio ana mac 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

3.A Solução 1: static int compespec(char * a, Especialidade b) return strcmp(a,b.nomeesp); int buscaespec(int n, Especialidade * v, char * nomeespec) int ini=0; int fim=n-1; int meio, cmp; while (ini <= fim) meio=(ini+fim)/2; cmp=compespec(nomeespec,v[meio]); if (cmp<0) fim=meio-1; else if (cmp>0) ini=meio+1; else return meio; return -1; 3.A Solução 2: static int compespec(const void* a, const void* b) char *info = (char*)a; Especialidade *bb = (Especialidade*)b; return strcmp(info, bb->nomeesp); int buscaespec(int n, Especialidade * v, char *nomeespec) Especialidade *p; p = (Especialidade*)bsearch(nomeEspec, v, 6, sizeof(especialidade), compespec); if (p!= NULL) return p - v; return -1; 7

3.B Solução: Medico * buscamedico(medico * lst, char * nomemed) Medico * p; for (p=lst; p!= NULL; p=p->prox) if(strcmp(nomemed,p->nomedomed)==0) return p; return NULL; Medico * MedicoNaEspecialidade (Especialidade * v, int n, char * nomeesp, char * nomemed) int pos; pos = buscaespec(n,v,nomeesp); // busca binaria if (pos>=0) return buscamedico(v[pos].lstmedicos, nomemed); else return NULL; 8