Baixe o app para aproveitar ainda mais
Prévia do material em texto
P3 Programação II 2014.1 Departamento de Informática /PUC-Rio Valor Nota Q1 3.5 Q2A 1.5 Q2B 1.5 Q3 3.5 Total 10.0 Aluno: _______________________________________________________ Matrícula: _______________ Turma: _______ A prova é individual, sem consulta a material ou a professores, e sem perguntas sobre o enunciado. A interpretação do enunciado faz parte da prova. O aluno sempre tem a garantia de que erros graves de enunciado anulam a questão. A prova pode ser feita utilizando-se lápis ou caneta (somente azul ou preta); Dispositivos eletrônicos (celulares, tablets, …) devem ser desligados e guardados. 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) encontrados junto ao aluno implicará no recolhimento imediato da prova e a atribuição de nota ZERO à mesma. Códigos devem ser escritos na linguagem C. Resolva as questões nos espaços reservados para tal (se continuar no verso, indique claramente a região correta para não ser confundida com rascunho). Algumas Funções de Bibliotecas (VOCÊ PODE USAR ESTAS FUNÇÕES EM QUALQUER QUESTÃO DESTA PROVA) 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); 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); QUESTÃO 1 Projete um TAD onde você cria um novo tipo de dados chamado Fracao que é um ponteiro para um tipo estruturado definido por 3 (três) componentes: o numerador (como um número natural), o denominador (como um número natural maior do que zero) e o sinal (0 se positivo e 1 se negativo), isto é: typedef struct fracao * Fracao;. Implemente as funções deste TAD que sejam suficientes para um programador externo escrever um programa no módulo meuPrograma.c que implementa e testa a seguinte função: int fraEhMaior(Fracao p, Fracao q) que verifica se uma fração p é maior do que a fração q. Teste para e . No final dos testes libere as frações. Apresente o TAD e o seu uso nos espaços abaixo, colocando o nome dos módulos no local sublinhado e usando todos os #includes necessários. A função fraCria pode receber quaisquer dois números inteiros, por exemplo: fraCria(6,-9) e fraCria(-6,9) representam e fraCria(-2,-4) representa . Note que para comparar duas frações basta comparar os números reais que correspondem a elas. Módulo Interface do TAD: _________________________ Módulo de implementação do TAD: _________________________ Módulo usuário do TAD: _________________________ QUESTÃO 2 2A) Defina a estrutura pilha para uma pilha de cadeia de caracteres implementada como lista, onde a estrutura contém um ponteiro para o topo da pilha. Também escreva a função pilha_push, considerando que as cadeias de caracteres são alocadas dinamicamente. Não precisa apresentar #include nem testes de falha de alocação dinâmica. Solução da Questão 2A: 2B) Apresente a 2A implementada como vetor, onde a nova estrutura pilha contém a quantidade de elementos na pilha e o vetor com os elementos. Continue considerando que as cadeias de caracteres são alocadas dinamicamente. Não precisa apresentar #include nem testes de falha de alocação dinâmica. Solução da Questão 2B: QUESTÃO 3 Fig.1 Numa árvore binária de números inteiros definida por: struct noArv { int info; struct noArv * esq; struct noArv * dir; }; typedef struct noArv NoArv; considere todos os caminhos possíveis da raiz até às folhas. Escreva a função int temCaminho(NoArv * a, int soma) que verifica se há um destes caminhos cuja soma de seus elementos seja igual a soma. Por exemplo, na árvore da Fig. 1, a função retorna verdade para soma = 27, porque há um caminho que soma 27 (5 – 10 – 8 – 4), mas retorna falso para soma = 23 (pois não há caminho completo que some 23). Solução da Questão 3: 5 de 5
Compartilhar