UNIVERSIDADE DA BEIRA INTERIOR Programação II 1º Semestre Exame Época Normal (15 val) 2h + 30min 21/01/2019 1 [2,00 val = 1,00 val + 1,00 val] - Memória dinâmica Considere as seguintes declarações de variáveis: int **V, *W, N, A, B; e que sizeof(int) = 4 a) Preencha o esquema dado na folha de resposta (em anexo) tendo em conta a execução do seguinte bloco de instruções em linguagem C: W = (int *) malloc(sizeof(int)); **V = 800; for (N = 2; N < 5; N++){ W = (int *) realloc(w, N * sizeof(int)); W[N-1] = N * 100; } W = (int *) realloc(w, N * sizeof(int)); *W = 700; *(W + 4) = 600; *(*V + 1) = 900; b) Usando os valores obtidos com a execução do bloco de instruções anterior, determine os valores de cada uma das seguintes expressões (responder na folha de resposta, em anexo): i) *V + 3 iii) (*V)[2] v) *(*V - 3) vii) *(W + 5) ii) W - 3 iv) &(**V) vi) W[3] viii) *W - 2 2 [1,50 val] - Memória dinâmica Usando memória dinâmica na manipulação dos vetores, implemente uma função que dados um vetor V de elementos do tipo ALUNO, o seu tamanho N e um número inteiro K (parâmetros de entrada da função), construa e devolva um outro vetor do mesmo tipo com apenas os elementos do vetor V cujo campo Nota seja um valor igual a K
3 [2,25 val] Ficheiros binários Considere também o ficheiro binário NotasProgramacaobin que contém a informação relativa às notas finais obtidas por todos os alunos à disciplina de Programação II; ou seja, um ficheiro composto por estruturas do tipo ALUNO para todos os alunos inscritos à disciplina Construa um programa em C que a partir dos dados contidos no ficheiro NotasProgramacaobin crie um ficheiro binário de nome AlunosNotaKbin com os números de aluno de todos os alunos que obtiveram na disciplina de Programação II uma nota igual a um valor inteiro K (campo Nota = K) Este valor K terá que ser pedido ao utilizador Para tal não pode usar vetores e deve usar a função fseek (para além de outras que achar necessárias), e deve ler o mínimo de informação possível para atingir o objetivo proposto Ou seja, depois de inserir um valor inteiro K, a estratégia deve ser a seguinte: para cada estrutura contida no ficheiro NotasProgramacaobin deve ler a respetiva Nota e, caso esta seja igual a K, deve ler o Número de aluno que lhe corresponde e escrever apenas o Número de aluno (campo Numero ) no ficheiro AlunosNotaKbin Algumas funções para manipulação de ficheiros binários: int fread(void *ptr, int size, int n, FILE *fich) Leitura de dados int fwrite(void *ptr, int size, int n, FILE *fich) Escrita de dados ptr (endereço inicial da zona de memória que recebe/tem os dados a ler/escrever); size (número de bytes que cada um dos dados ocupa); n (número de dados a ler/escrever); file (endereço do ficheiro de leitura/escrita) Retorna o número de elementos (não bytes) que conseguiu ler/escrever long ftell (FILE *file) devolve a posição corrente, em bytes, dentro do ficheiro file void rewind (FILE *file) coloca-se no início do ficheiro file int fseek(file *file, long salto, int origem) move-se no ficheiro file salto bytes desde a origem em que origem pode ser início (SEEK_SET), posição corrente (SEEK_CUR) e fim (SEEK_END) 4 [1,25 val] - Recursividade Implemente uma função recursiva que devolva a menor elemento de um vetor V de N valores inteiros Exemplo: V = [ 6-5 2-8 -9 4 ] (N = 6) => -9
5 [1,25 val] - Análise de Complexidade dos Algoritmos Considere o seguinte bloco de código em linguagem C: for (k = 0; k < N; k++){ for (p = N-10; p < N; p++) printf( %d\n, k); } Determine a ordem de complexidade do algoritmo (considerando o pior caso) associado ao bloco de código anterior Justifique, apresentando todos os cálculos efetuados Pode incidir os cálculos sobre a operação que mais vezes é executada, que é a instrução de comparação p < N 6 [2,50 val = 1,25 val + 0,25 val + 0,50 val + 0,50 val] - Tabelas de Dispersão/Hash Considere uma tabela de hash T de tamanho 10 inicialmente vazia e a seguinte função de hash: h(k, i) = ( k % 10 + i 2 ) % 10, i = 0, 1, 2, Responda às questões que se seguem, justificando com os cálculos que são necessários efetuar a) Considerando que as colisões são tratadas com hashing fechado, desenhe a tabela de hash T após a inserção das seguintes chaves (pela ordem apresentada): 30, 34, 54, 19, 75 e 45 b) Redesenhe a tabela anterior após a remoção da chave 30 c) Prove que a chave 39 não se encontra na tabela anterior d) Insira a chave 39 na tabela obtida em b) (ou seja, após remoção da chave 30)
7 [2,00 val + 2,25 val] - Algoritmos de Ordenação e de Pesquisa Considere as seguintes funções (já implementadas): void OrdenarNota (ALUNO V[], int tam); // ordena decrescentemente o vetor V pelo campo Nota int PesquisaBinariaNota (int K, ALUNO V[], int N);// devolve o índice de um elemento de V cujo campo Nota é igual a K ou -1 (se não existe qualquer elemento), em que V está ordenado por ordem decrescente do campo Nota a) Usando a função OrdenarNota, implemente uma função em C que dados como parâmetros da função um vetor do tipo ALUNO não ordenado e o seu tamanho (número de elementos), remova todos os elementos daquele vetor cujos valores do campo Nota são menores do que 10 b) Usando as funções OrdenarNota e PesquisaBinariaNota, implemente uma função em C que dados como parâmetros da função um vetor do tipo ALUNO, o seu tamanho (número de elementos) e um valor inteiro K, determine e devolva a quantidade de elementos do vetor V cujo valor do campo Nota é maior ou igual ao valor de K NOTA: As funções OrdenarNota e PesquisaBinariaNota devem ser usadas de tal forma que sejam fundamentais na resolução dos problemas e que otimizem os algoritmos (com o menor número de operações possível)
UNIVERSIDADE DA BEIRA INTERIOR Programação II Exame Época Normal 21/01/2019 Nº Nome: Responder à questão 1 nesta folha e entregar junto com a folha de prova 1 a) 1 b) (esquema de um bloco de memória) 100500 110164 W EXPRESSÃO *V + 3 W - 3 (*V)[2] &(**V) VALOR 100700 110184 100800 N 110160-100 A 110164 110168 *(*V - 3) W[3] *(W + 5) *W - 2 NOTA: Caso o valor da expressão não seja conhecido deve responder com Indefinido ; ou seja, deve colocar na coluna VALOR na respetiva posição a palavra Indefinido 110172 110176 110180 110184 110188 110192-200 B 110500 100700 V