Fundamentos de Programação Primeiro Teste 6 de Novembro de 200 09:00 0:30 SOLUÇÃO. (.0) Escolha a única afirmação incorrecta. Uma resposta certa vale valor e uma resposta errada desconta 0.4 valores. A. A tradução de 3+6x para a notação do Scheme origina (+ 3 (* 6 x)). B. A tradução da expressão 5(x + 2)/3 para a notação do Scheme origina (/ (* 5 (+ x 2)) 3). C. A tradução da expressão 5(3 + f(x)) para a notação do Scheme origina (* 5 (+ 3 f(x))). D. A tradução da expressão z/y +2para a notação do Scheme origina (+ (/ z y) 2). C. 2. (2.0) Escolha a única resposta correcta para as seguintes questões. Cada resposta certa vale valor e cada resposta errada desconta 0.4 valores. (a) O valor da expressão ((lambda (x) (* x ((lambda (x) (* x x)) x))) 5) é: A. Um erro de execução B. #<procedure> C. 25 D. 5 C. (b) Considere a seguinte interacção em Scheme: > (define x ) > (define y 2) > (let ((x y) (y (+ x 2))) (* x y)) O resultado de avaliar a expressão let origina: A. Um erro de execução B. 6 C. 8 D. 2 B.
Número: Pág. 2 de 6 3. (.5) Defina um procedimento anónimo em Scheme que recebe dois números inteiros e que devolve o número real correspondente à soma dos seus argumentos. O seu procedimento não precisa de verificar se os argumentos são inteiros. (lambda (x y)(*.0 (+ x y))) 4. De um modo sucinto, (a) (0.5) Diga o que é um processo computacional Um ente imaterial que existe dentro de um computador durante a execução de um programa, e cuja evolução ao longo do tempo é ditada pelo programa. (b) (0.5) Diga o que é um algoritmo Uma sequência de passos, bem definida e sem ambiguidades, que, sendo seguida mecanicamente, garante atingir um dado objectivo. (c) (0.5) Diga o que é um procedimento Uma sequência de instruções escritas numa linguagem de programação que definem como atingir um dado objectivo. (d) (0.5) Relacione os três conceitos anteriores. Um procedimento corresponde a um algoritmo escrito numa linguagem de programação. A execução de um procedimento origina um processo computacional. 5. Considere as seguintes definições em notação BNF: <ling> ::= <início><meio><fim> <início> ::= { ( <fim> ::= } ) <meio> ::= <símbolo> <símbolo>, <meio> <símbolo> ::= a b c (a) (0.5) Diga quais são os símbolos terminais. {(}),abc (b) (0.5) Diga quais são os símbolos não terminais. ling início meio fim símbolo (c) (0.5) Para cada uma das seguintes frases, indique se esta pertence ou não pertence à linguagem (todas as frases têm igual cotação). Frase Pertence Não pertence { } X {a} X {a, b) X (a b) X (a, a, a, c, b, b, b) X
Número: Pág. 3 de 6 6. Considere o problema de somar todos os dígitos de um número inteiro. Por exemplo, a soma dos dígitos do número 342 é 9. (a) (.5) Escreva um procedimento que soma os dígitos de um número inteiro utilizando um processo recursivo. O seu procedimento não precisa de verificar se o argumento é um inteiro. (define (soma-digitos-rec n) (if (= n 0) 0 (+ (remainder n 0) (soma-digitos-rec (quotient n 0))))) (b) (.5) Escreva um procedimento que soma os dígitos de um número inteiro utilizando um processo iterativo. O seu procedimento não precisa de verificar se o argumento é um inteiro. (define (soma-digitos-iter n) (define (soma-aux n res) (if (= n 0) res (soma-aux (quotient n 0)(+ (remainder n 0) res)))) (soma-aux n 0)) 7. Considere o seguinte procedimento: (define (p-p a b) (define (p-a x) (if (> x 3) (* x b) (p-a (+ x 3)))) (p-a a)) (a) (.5) Com base nas regras utilizadas pelo interpretador do Scheme para avaliar uma combinação, desenhe a árvore que representa o funcionamento deste procedimento com a avaliação de (p-p 5). Mostre todos os ambiente criados e a avaliação de todos os nomes até chegar apenas a constantes e a procedimentos primitivos.
Número: Pág. 4 de 6 (p-p 5)? p-p : (lambda (a b)...) 5 (lambda (a b) (define (p-a x)...) (p-a a)) {z } (define (p-a x) (if...)? (p-a a) a : b : 5 p-a : (lambda (x)...) (lambda (x) (if (> x 3)...) {z } (if (> x 3) (* x b) (p-a (+ x 3))))? x : (p-a (+ x 3)))? (lambda (x) 4 (if (> x 3)...) {z } (if (> x 3) (* x b) (p-a (+ x 3))))? x : 4 (* x b)? #<primitive *> 4 5 (b) (.5) Considere todos nomes a que o procedimento p-a pode aceder (com excepção dos nomes pré-definidos em Scheme). Classifique-os como locais, livres e globais.
Número: Pág. 5 de 6 p-p: global p-a, a, b: livre x: local 8. Considere o seguinte procedimento: (define (m-p x y) (define (m-p-a z) (if (= z 0) (/ (m-p-a (- z )) x))) (m-p-a y)) (a) (.5) Apresente a evolução do processo na avaliação de (m-p 2 4) (m-p 2 4) (m-p-a 4) (/ (m-p-a 3) 2) (/ (/ (m-p-a 2) 2) 2) (/ (/ (/ (m-p-a ) 2) 2) 2) (/ (/ (/ (/ (m-p-a 0) 2) 2) 2) 2) (/ (/ (/ (/ 2) 2) 2) 2) (/ (/ (/ /2 2) 2) 2) (/ (/ /4 2) 2) (/ /8 2) /6 (b) (.5) O procedimento gera um processo recursivo ou iterativo? Justifique a sua resposta. O procedimento gera um processo recursivo pois existe uma fase de expansão devido à existência de operações adiadas (a divisão) seguido de uma fase de contracção que corresponde à execução dessas operações. (c) (.5) Se o procedimento gerar um processo recursivo, escreva um procedimento equivalente que gere um proceso iterativo; se o procedimento gerar um processo iterativo, escreva um procedimento equivalente que gere um proceso recursivo. (define (m-p x y) (define (m-p-a v z) (if (= z 0) v (m-p-a (/ v x)(- z )))) (m-p-a y)) 9. (.5) O logaritmo, base e, de um número chama-se logaritmo natural e é representado por ln. Uma das formas de calcular o logaritmo natural de um número corresponde a utilizar a fórmula ln(y) =2 n=0 2n + ( ) y 2n+ y +
Número: Pág. 6 de 6 Escreva um procedimento em Scheme que calcula o logaritmo natural de um número utilizando o método de cálculo anterior. É evidente que o seu procedimento não pode somar indefinidamente, pelo que terá de conter uma decisão para paragem. Pode utilizar o procedimento primitivo expt, em que (expt b e) devolve b e. Não é permitida a utilização do procedimento primitivo log. (define (ln y) (define (calc-ln y n) (let* ((doisn-mais-um (+ (* 2 n) )) (termo (* 2 (/.0 doisn-mais-um) (expt (/ (- y )(+ y )) doisn-mais-um)))) (if (desprezável? termo) termo (+ termo (calc-ln y (+ n )))))) (calc-ln y 0)) (define (desprezável? t) (< t 0.00000))