Introdução à Ciência da Computação (ICC) 2001.1 PROVA P2 Sexta-feira 1 de Junho de 2001 Nome do Aluno: ____________________________________________________ Matrícula PUC: ______________________________________________________ Questões 1 (1.5) 2 (1.5) 3a (1.0) 3b (1.0) 3c (1.0) 3d (1.0) 4 (2.0) P2 Revisão Prova (max 9.0) Testes (max 1.0) Grau G2 OBSERVAÇÕES 1. A prova é SEM CONSULTA e SEM PERGUNTAS. 2. Procure responder apenas no espaço indicado. Não serão consideradas respostas apresentadas em folhas de papel extra. 3. Na elaboração das respostas, QUALQUER FUNÇÃO AUXILIAR DEVE SER DEFINIDA POR VOCÊ, exceto os predicados e funções pré-definidos do Scheme (por exemplo, even?, odd?, zero?, null?, sin, cos, sqrt, quotient, remainder… ), os operadores lógicos (and, or, not), as funções básicas para manipulação de listas (cons, car e cdr), as formas compactas para ninhos de car e cdr (por exemplo, cadr, caddr, …) e as funções explicitamente autorizadas no enunciado da questão. 4. Duração máxima da prova: 1:45 h QUESTÃO 1 (Padrões de recursão) Seja uma lista de números, cada um representando o salário dos funcionários de uma determinada empresa. Escreva uma função em Scheme que exiba em uma nova lista os salários dos funcionários que ganham acima de 500 reais aumentados em 10%. Por exemplo: (fq1 '(300 1000 700 120)) -> (1100 770). (fq1 '(300 100 400 120)) -> ( ). (fq1 '(1500 1000 700 2000)) -> (1650 1100 770 2200). Dica: se necessário, usar, sem precisar definir, os padrões de recursão vistos no curso de filtragem (filtra F L) - e mapeamento - (mapeia F L) ou (map F L) – com F sendo a função (ou predicado) de mapeamento/filtragem e L a lista de entrada. QUESTÃO 2 (Manipulação de Árvores Binárias) De acordo com o que foi visto nas aulas, considere a representação de arvores binárias como como listas pré-fixadas e as seguintes funções básicas: (define arvore-vazia '()) (define vazia? null?) (define (folha? a) ( not (list? a) )) (define (raiz a) (if (folha? a) a (car a)) ) (define (esquerda a) (if (folha? a) arvore-vazia (cadr a)) ) (define (direita a) (if (folha? a) arvore-vazia (caddr a)) ) No caso das funções raiz, esquerda e folha, lembrar que assume-se que a árvore binária de entrada nunca é vazia. Escreva a função conta-impar que conta quantos elementos de uma dada árvore binária são ímpares. Por exemplo: (define AQ2 '(5 (2 () 3) (9 8 11)) ) (conta-impar AQ2) -> 4 Atenção: é OBRIGATÓRIO usar apenas as funções relembradas acima quando for preciso operar sobre árvores, procedendo com a abstração das convenções adotadas e da representação interna por listas! Considere também a lista C contendo a relação dos países que pertencem a cada continente. Cada elemento da lista é, por sua vez, uma lista cujo primeiro elemento é a sigla do continente e o segundo elemento é a lista de siglas dos países localizados neste continente. Por exemplo: QUESTÃO 3 C=( (Conjuntos, Tabelas e Á rvores Binárias de Busca) ( “AS” (“BRA” “ARG” “VEN”) ) ( “AN” (“EUA” “CAN” “MEX”) ) ) Representamos a America do Sul por “AS” e a America do Norte por “AN”. Consideramos também siglas de países como “CAN”para Canadá ou “BRA”para Brasil. (3a) Implemente o predicado pertence? para verificar se um literal X (sigla de país) pertence ou não a uma lista de literais L (com siglas de países). Utilizar, se necessário, o predicado string=? do Scheme para comparar se dois literais (textos) são iguais. Exemplos: (pertence? “VEN” ´(“BRA” “ARG” “VEN”)) => #t (pertence? “CHI” ´(“BRA” “ARG” “VEN”)) => #f (3b) Se definirmos como “vizinhos” dois países localizados em um mesmo continente, escreva um predicado vizinhos? para verificar se o país com sigla X é vizinho ou não do país com sigla Y. Além dos parâmetros X e Y, é fornecida na entrada a lista C de continentes. O predicado pertence? (item 3a) pode ser usado aqui mesmo que não tenha sido definido. Por exemplo: (vizinhos? "BRA" "VEN" C) => #t (vizinhos? "BRA" "EUA" C) => #f (3c) Escreva uma função que retorna o continente no qual está localizado um determinado país, sendo passados como parâmetros a sigla X do país e a lista C de continentes. Exemplos: (continente “BRA” C) => “AS” (continente “EUA” C) => “AN” (continente “CHI” C) => “ ” (3d) Desenhe uma arvore binária de busca cujos elementos sejam as siglas dos países exemplificados no conjunto abaixo, considerando-se a ordem alfabética. { “CAN”, “RUS”, “BRA”, “ARG”, “EUA”, “MEX”, “VEN”, “FRA”, “CHI” , “CUB”, “JAP”, “ALE”, “ESP”} Mostre também a representação em lista pré-fixada (scheme) da árvore binária de busca ilustrada em seu desenho. QUESTÃO 4 (Representação de Números Naturais) Como visto na apostila, se os números naturais são representados por listas de átomos cujos comprimentos correspondem ao número natural desejado – por exemplo, o número 1 seria a lista (1), o número 2 a lista (1 1) e assim por diante – podemos definir algumas operações primitivas sobre os naturais da seguinte forma: (define (define (define (define zero ‘( ) ) zer? null? ) inc (lambda (n) (cons 1 n) )) dec (lambda (n) (cdr n) )) Assim, a operação de somar dois números pode ser definida como: (define soma (lambda (n1 n2) (if (zer? n2) n1 (inc (soma n1 (dec n2) ) ) ))) que continuaria funcionando corretamente caso sejam redefinidas as operações primitivas acima, utilizando a representação de números naturais habitual, isto é, o zero ser o número 0, o símbolo + usado para contas de somar, etc. Definir agora uma função potência sobre números naturais, não considerando sua representação, que calcula o valor de um número elevado a outro. Por exemplo, (potencia 2 3) à 8 (potencia 3 2) à 9 Você pode supor disponível (isto é, não é necessário definir) a função mult, que retorna o resultado da multiplicação de dois números naturais. Por exemplo: (mult 4 3) à 12 Obs. Lembrar de propor uma solução conceitual usando apenas um método indutivo (ou seja, sem escrever um programa em Scheme) para justificar sua resposta.