INF1007 - Programação II P1 - 19/09/2014 Nome (legível e por extenso) Matrícula: Turma/Nome Prof: Questões 1.a (1.5) 1.b (3.0) 2 (2.0) 3.a (2.0) 3.b (1.5) P1 (10,0) G1 (90%P1) Nota Revisão ALGUMAS FUNÇÕES DE BIBLIOTECAS 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, ...); int sprintf(char* str, 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); 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 *)); NESTA PROVA VOCE PODE USÁ-LAS EM QUALQUER QUESTÃO Espaço reservado para observações do aluno e futuros pedidos de revisão: AVISOS: 1. 2. 3. 4. A prova é sem consulta e sem perguntas. A interpretação do enunciado faz parte da prova!!! As questões devem ser resolvidas usando a linguagem de programação C. O aluno só pode manter junto a si lápis, borracha e caneta. O empréstimo deste tipo de material para outro aluno é estritamente proibido. 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. 1 INF1007 - Programação II P1 - 19/09/2014 Questão 1.a) (1.5 pontos) Escreva a função ultNome que: - recebe (o ponteiro para) uma cadeia de caracteres contendo o nome completo de uma pessoa. Ou seja, recebe o endereço do primeiro caractere de uma cadeia de caracteres. - retorna um ponteiro para a cadeia de caracteres do último nome dessa pessoa. Isto é, o endereço do primeiro caractere do último nome, sem criar nenhuma nova cadeia de caracteres. Cadeias de caracteres vazias ou contendo apenas espaços em branco não são aceitas como nomes. Assim, assuma que a cadeia recebida pela função contém ao menos um nome. Exemplos: Se o nome completo for “Maria Clara Donato”, será retornado o endereço do caractere ‘D’. A função retorna também o endereço do caractere ‘D’ se o nome completo for apenas “Donato”. Solução: 2 INF1007 - Programação II P1 - 19/09/2014 Questão 1.b) (3.0 pontos) Escreva a função criaNome que gera automaticamente e retorna o nome completo de um bebê, a partir do primeiro nome dado ao bebê, do nome completo de solteira da mãe e do nome completo do pai. O nome do bebê é composto pelo seu primeiro nome + último nome da mãe + último nome do pai, separados por espaços. Função criaNome: - recebe uma cadeia com o primeiro nome do bebê, uma cadeia com o nome completo da mãe e uma cadeia com o nome completo do pai; - cria e retorna uma nova cadeia contendo o nome completo do bebê, gerado de acordo com o critério descrito. Utilizar alocação dinâmica de memória do tamanho exato necessário Retorna NULL quando não for possível alocar dinamicamente. Essa função deve usar, adequadamente, a função do item 1.a, mesmo que você não a tenha feito. Exemplo: a seguinte chamada da função com os argumentos: criaNome("Pedro", "Ana Luiza Resende", "Rui Alberto Medeiros") retornaria (um ponteiro para) uma nova cadeia contendo o nome "Pedro Resende Medeiros" Solução: 3 INF1007 - Programação II P1 - 19/09/2014 Questão 2) (2.0 pontos) Escreva a função recursiva contaAprovados que: - recebe dois vetores de float com as notas da primeira prova e da segunda prova dos alunos de uma turma e o número de alunos dessa turma; - retorna o número de alunos aprovados, ou seja, o número de alunos cuja média aritmética das duas notas é maior ou igual a 6.0. Exemplo: Para p1 = {1.0, 8.0, 6.0, 10.0, 0.0, 7.0, 1.0} e p2 = {10.0, 4.0, 5.5, 3.0, 0.0, 7.0, 1.0}, há 3 alunos aprovados. Obs. Uma possível definição recursiva considera que um vetor ou é vazio ou é definido pelo seu primeiro elemento seguido de um sub-vetor com os elementos subsequentes. Solução: 4 INF1007 - Programação II P1 - 19/09/2014 Questão 3: Considere o tipo estruturado Ponto que representa um ponto no plano: struct ponto { float x, y; }; typedef struct ponto Ponto; Considere também o tipo estruturado Retangulo que representa um retângulo no plano, com base paralela ao eixo x. Para isso são armazenadas as coordenadas x e y do vértice inferior esquerdo (que é um ponto no plano), a base e a altura desse retângulo. struct retangulo { Ponto vie; /* vertice inferior esquerdo */ float base; float altura; }; typedef struct retangulo Retangulo; 3.a (2.0 pontos) Escreva a função obtemVertSupDir que: - recebe um ponteiro para Retangulo - calcula e retorna um ponto com as coordenadas x e y que correspondem ao vértice superior direito desse retângulo. Atenção: o retorno da função não é um ponteiro para Ponto. Assuma que todos os dados são consistentes. Exemplo: Se as coordenadas x e y do vértice inferior esquerdo são 3.5 e 2.0, com base 3.0 e altura 1.8, as coordenadas x e y do vértice superior direito serão: 6.5 e 3.8. 3.b (1.5 ponto) Escreva uma função main que chama a função obtemVertSupDir e exibe os valores do ponto do retângulo correspondentes ao vértice superior direito retornado pela mesma. Crie as variáveis necessárias, atribua valores que julgar apropriados, chame a função do item 3.a (mesmo que você não a tenha feito) e exiba o resultado obtido. O importante é que sua função main seja consistente. Solução: 5 INF1007 - Programação II P1 - 19/09/2014 Solução: 6