Escolar Documentos
Profissional Documentos
Cultura Documentos
21 de Dezembro de 2007
19:00–20:30
Nome: Número:
1. (1.0) Explique o que são as barreiras de abstracção criadas por um tipo de infor-
mação e quais os inconvenientes de não as respeitar.
Resposta:
As barreiras de abstracção são uma camada conceptual que é estabelecida ao criar um novo
tipo de informação, a qual apenas permite aceder aos elementos do tipo através das suas
operações básicas.
Os inconcenientes de não a respeitar correspondem a perder a abstracção correspondente
ao tipo de informação e à dependência do código desenvolvido das decisões sobre a repre-
sentação do tipo.
3. (1.0) Quando é que se diz que um objecto tem estado? O que caracteriza o estado
de um objecto?
Resposta:
Um objecto tem estado quando o seu comportamento depende da sua história. O estado de
um objecto é caracterizado por um conjunto de variáveis chamadas variáveis de estado.
4. (1.0) Em que condições se diz que uma variável está não ligada (“unbound") num
dado ambiente?
Resposta:
Uma variável está não ligada num ambiente quando não existe um valor para essa variável
em nenhum dos enquadramentos correspondentes a esse ambiente.
5. (1.0) Diga o que é um ponteiro. Qual a característica que distingue um ponteiro dos
outros tipos de informação?
Resposta:
Um ponteiro é qualquer coisa que aponta. Ao passo que com a utilização de outros tipos
de informação, com os suas entidades estamos fundamentalmente interessados no valor da
entidade, com ponteiros, não estamos interessados no valor do ponteiro, mas sim no valor
para onde ele aponta.
Número: Pág. 2 de 6
6. (1.5) Defina um procedimento chamado otser (resto ao contrário) que recebe como
argumento uma lista e devolve a lista com todos os elementos da lista original ex-
cepto o último. O seu procedimento deve gerar uma mensagem de erro no caso
da lista ser vazia. O seu procedimento deve respeitar as barreiras de abstracção,
utilizando as operações definidas no livro. Por exemplo,
Resposta:
7. (1.5) Utilizando os funcionais sobre listas escreva um procedimento que recebe uma
lista de inteiros e que devolve a soma dos quadrados dos elementos da lista. NOTA:
Poderá utilizar qualquer dos procedimentos transforma, filtra e acumula.
Resposta:
8. (1.5) Considere a operação potência, em que tanto a base como o expoente são
números naturais. Escreva, usando programação imperativa, um procedimento
que recebe dois números naturais e devolve o resultado de elevar o primeiro à
potência especificada pelo segundo argumento.
Resposta:
(define (potencia b e)
(let ((res 1))
(define (potencia-aux)
(if (= e 0)
res
(begin
(set! res (* res b))
(set! e (- e 1))
(potencia-aux))))
(if (< e 0)
(error "potencia: expoente negativo")
(potencia-aux))))
Número: Pág. 3 de 6
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
Resposta:
(define (fib-mem)
(let ((results (list (cons 1 1) (cons 0 0))))
(define (valor-conhecido? n)
(<= n (car (car results))))
(define (valor n resultados)
(if (equal? n (car (car resultados)))
(cdr (car resultados))
(valor n (cdr resultados))))
(define (memoriza n v)
(set! results (cons (cons n v) results)))
(define (calcula-fib n)
(if (valor-conhecido? n)
(valor n results)
(let ((valor-n (+ (calcula-fib (- n 1))
(calcula-fib (- n 2)))))
(memoriza n valor-n)
valor-n)))
(lambda (n)
(calcula-fib n))))
(define fib (fib-mem))
(agua-50cl 20)
(agua-50cl 10)
(agua-33cl 33)
Resposta:
cria-garrafa-agua:
agua-50cl:
agua-33cl:
nivel-inicial: 33
0
parâmetros: inivel-inicial
corpo: (lambda (valor) ...)
nivel-inicial: 50
30
20
parâmetros: valor
corpo: (set! ...)
parâmetros: valor nivel-inicial
corpo: (set! ...)
nivel-inicial
Resposta:
12. (1.5) Considerando o trabalho que desenvolveu para o projecto, escreva o procedi-
mento (digito-valido? <cadeia1> <inteiro>) (em que <cadeia1> repre-
senta uma cadeia de caracteres com comprimento 1 e <inteiro> representa a di-
mensão do problema). A chamada (digito-valido? d n) deverá devolver
verdadeiro se e só se d for um valor válido, para a dimensão n. Por exemplo, se
a dimensão for 9, serão válidos todos os dígitos entre 1 e 9.
Resposta:
(case dim
((4 9) (string-entre? dig "1" (number->string dim)))
(else (or (string-entre? dig "1" "9")
(string-entre? dig "A" "G")))))
13. (1.5) No contexto do projecto, considere que solução é uma variável global do
tipo matriz que contém a solução de um problema que o utilizador está a re-
solver; cada posição da matriz contém uma cadeia de caracteres com um dígito. Es-
creva o procedimento (digito-possivel? <cadeia1> <inteiro> <inteiro>)
(em que <cadeia1> representa uma cadeia de caracteres com comprimento 1). A
chamada (digito-possivel? d l c) deverá devolver verdadeiro se e só se d
for a escolha certa para a posição da linha l e coluna c.
Resposta:
Resposta:
(define (aplica-vector fn v)
(define (aplica-aux n)
(if (>= n 0)
(begin
(vector-set! v n (fn (vector-ref v n)))
(aplica-aux (- n 1)))))
(aplica-aux (- (vector-length v) 1)))
’(BOM NATAL)