Programação e Computação para Arquitectura – 2007/2008 · 6.(0.5) Defina o predicado par?...

7
Instituto Superior Técnico Programação e Computação para Arquitectura – 2007/2008 Segundo Teste/Primeiro Exame – 09/01/2008 Número: Nome: Escreva o seu número em todas as folhas do teste. O tamanho das respostas deve ser limitado ao espaço fornecido para cada pergunta. Pode usar os versos das folhas para rascunho. O exame tem 7 páginas e a duração é de 60/120 minutos. A cotação de cada questão encontra-se indicada entre parêntesis. Boa sorte. Se pretende fazer o Segundo Teste responda apenas às perguntas 11,12,13,14,15 e 16. Se pretende fazer o Exame responda a todas as perguntas. 1. (1.5) A exponenciação b n é uma operação entre dois números b e n designados base e expoente, respectivamente. Quando n é um inteiro positivo, a exponenciação define-se como uma multi- plicação repetida: b n = b × b ×···× b | {z } n (a) (0.5) Embora a definição anterior seja suficientemente clara para um ser humano, não é utili- zável por um computador. Porquê? Justifique a sua resposta. Porque requer o uso de imaginação para adivinhar o que se deve colocar no lugar das reticências e os computadores não possuem imaginação. Para além disso, a definição não é suficientemente clara para se perceber quantas multiplicações são realmente feitas ou o que fa- zer no caso b 1 ou no caso b 0 . (b) (0.5) Sugira uma definição matemática da exponenciação que permita a sua fácil tradução para uma linguagem de programação. b n = ( 1, se n =0 b × b (n-1) , se n N. (c) (0.5) A definição que apresentou na alinea anterior é recursiva? Porquê? A definição é recursiva porque está definida em termos dela pró- pria.

Transcript of Programação e Computação para Arquitectura – 2007/2008 · 6.(0.5) Defina o predicado par?...

Instituto Superior Técnico

Programação e Computaçãopara Arquitectura – 2007/2008

Segundo Teste/Primeiro Exame –09/01/2008

Número:

Nome:

Escreva o seu número em todas as folhas do teste. O tamanho das respostas deve ser limitado ao espaçofornecido para cada pergunta. Pode usar os versos das folhas para rascunho. O exame tem 7 páginas e aduração é de 60/120 minutos. A cotação de cada questão encontra-se indicada entre parêntesis. Boa sorte.

Se pretende fazer o Segundo Teste responda apenas às perguntas 11,12,13,14,15 e 16. Se pretendefazer o Exame responda a todas as perguntas.

1. (1.5) A exponenciação bn é uma operação entre dois números b e n designados base e expoente,respectivamente. Quando n é um inteiro positivo, a exponenciação define-se como uma multi-plicação repetida:

bn = b× b× · · · × b︸ ︷︷ ︸n

(a) (0.5) Embora a definição anterior seja suficientemente clara para um ser humano, não é utili-zável por um computador. Porquê? Justifique a sua resposta.

Porque requer o uso de imaginação para adivinhar o que se devecolocar no lugar das reticências e os computadores não possuemimaginação.Para além disso, a definição não é suficientemente clara para seperceber quantas multiplicações são realmente feitas ou o que fa-zer no caso b1 ou no caso b0.

(b) (0.5) Sugira uma definição matemática da exponenciação que permita a sua fácil traduçãopara uma linguagem de programação.

bn =

{1, se n = 0

b× b(n−1), se n ∈ N.

(c) (0.5) A definição que apresentou na alinea anterior é recursiva? Porquê?A definição é recursiva porque está definida em termos dela pró-pria.

Número: 2

2. (1.0) Converta as seguintes expressões da notação do Lisp para a notação da aritmética:

(a) (* (/ 1 2) 3)12 × 3

(b) (* 1 (- 2 3))

1× (2− 3)(c) (/ (+ 1 2) 3)

1+23

(d) (/ (/ 1 2) 3)12

3(e) (/ 1 (/ 2 3))

123

(f) (- (- 1 2) 3)

(1− 2)− 3(g) (- 1 2 3)

1− 2− 3(h) (- (- 2) 3)

−2− 3(i) (/ (expt (cos (/ 2 (sqrt 5))) 4) 8)

cos4 2√5

8(j) (sqrt (/ 1 (log (expt 2 (abs (- 3 (* 9 (log 28))))))))√

1log 2|(3−9 log 28)|

3. (1.0) Defina uma função Lisp que recebe uma quantidade angular em graus e calcula o valor cor-respondente em radianos. Note que 180 graus correspondem a π radianos.

(defun radianos<-graus (graus)(* pi (/ graus 180.0)))

4. (1.0) Considere uma implementação de coordenadas esféricas tridimensionais baseada na utiliza-ção das funções pesf, esf-ro, esf-fi e esf-psi que satisfazem as equações:

(esf-ro (pesf ρ φ ψ)) = ρ

(esf-fi (pesf ρ φ ψ)) = φ

(esf-psi (pesf ρ φ ψ)) = ψ

(a) (0.2) Quais daquelas funções são construtores?O conjunto dos construtores inclui apenas a função pesf.

(b) (0.2) Quais daquelas funções são selectores?O conjunto dos selectores inclui as funções esf-ro, esf-fi eesf-psi.

(c) (0.6) Usando as funções anteriores, defina a função pesf= que, dados dois pontos represen-tados em coordenadas esféricas, devolve verdade se os pontos são coincidentes e falso nocaso contrário.(defun pesf= (p0 p1)

(and (= (esf-ro p0) (esf-ro p1))(= (esf-fi p0) (esf-fi p1))(= (esf-psi p0) (esf-psi p1))))

Número: 3

5. (1.0) Pretende-se criar um lanço de escada com n espelhos capaz de vencer uma determinadaaltura a em metros. Admitindo que cada degrau tem uma altura do espelho h e uma largura docobertor d que verificam a proporção 2h+ d = 0.64 defina uma função que, a partir da altura avencer e do número de espelhos, calcula o comprimento do lanço de escada.

Se um lanço de escada de altura a tem n espelhos então cada espelhotem uma altura de a

n . Neste caso, de acordo com a proporção, a largurade cada cobertor será 0.64 − 2an . Uma vez que a n espelhos estão asso-ciados n − 1 cobertores, comprimento total do lanço de escadas será,então, (n− 1)(0.64− 2an).

(defun comprimento-lanco-escadas (altura-lanco n-espelhos)(* (- n-espelhos 1)

(- 0.64 (* 2 (/ (float altura-lanco) n-espelhos)))))

6. (0.5) Defina o predicado par? que, dado um número, testa de ele é par, i.e., se o resto da divisãodesse número por dois é zero. Para calcular o resto da divisão de um número por outro, utilizea função pré-definida rem.

(defun par? (x)(= (rem x 2) 0))

7. (1.0) Defina a função pares que, dada uma lista de números como argumento, devolve uma listacontendo apenas os números que forem pares. Por exemplo:

_$ (pares (list 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1))(2 4 6 8 8 6 4 2)

(defun pares (numeros)(cond ((null numeros)

())((par? (car numeros))(cons (car numeros)

(pares (cdr numeros))))(t(pares (cdr numeros)))))

8. (1.0) Defina uma função de ordem superior denominada filtra que, dado um predicado e umalista, colecciona numa outra lista todos os elementos da primeira lista que não satisfazem opredicado. Por exemplo:

_$ (filtra par? (list 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1))(1 3 5 7 9 7 5 3 1)

(defun filtra (predicado lista)(cond ((null lista)

())((not (predicado (car lista)))(cons (car lista)

(filtra predicado (cdr lista))))(t(filtra predicado (cdr lista)))))

Número: 4

9. (1.0) Defina uma função denominada serra que, dado um ponto P , um número de dentes, ocomprimento c de cada dente e a altura a de cada dente, desenha uma serra em AutoCad como primeiro dente a começar a partir do ponto P , tal como se vê na imagem seguinte:

c

a

P

(defun serra (p0 dentes comprimento altura / p1 p2)(if (= dentes 0)

nil(progn

(setq p1 (p+xy p0 (/ comprimento 2.0) altura)p2 (p+xy p0 comprimento 0))

(command "_.pline" p0 p1 p2 "")(serra p2 (1- dentes) comprimento altura))))

10. (1.0) Defina uma função losangulos capaz de criar a figura apresentada em seguida:

Note que os losângulos possuem dimensões que estão em progressão geométrica de razão 12 .

Dito de outra forma, os losângulos mais pequenos têm metade do tamanho do losângulo maiorem cujas extremidades estão centrados. Os losângulos mais pequenos de todos têm larguramaior ou igual a 1. A sua função deverá ter como parâmetros apenas o centro e a largura dolosângulo maior.

(defun losangulos (p c / p0 p1 p2 p3 c2)(if (< c 1)

nil(progn

(setq p0 (p+pol p c 0)p1 (p+pol p c pi/2)p2 (p+pol p c pi)p3 (p+pol p c 3*pi/2)c2 (/ c 2.0))

(command "_.pline" p0 p1 p2 p3 p0 "")(losangulos p0 c2)(losangulos p1 c2)(losangulos p2 c2)(losangulos p3 c2))))

Número: 5

11. (2.0) Considere a construção de uma “esfera” de cones tal como se apresenta na seguinte imagem:

Note que cada cone tem o seu vértice na origem e está orientado de modo a que o centro dabase fica assente numa esfera virtual. Note que todos os “meridianos” e “paralelos” possuemo mesmo número de cones e note também que o raio da base dos cones diminui à medida quenos aproximamos dos “pólos” para que os cones não interfiram uns com os outros.

Escreva um programa em Auto Lisp capaz de construir a “esfera” de cones. Assuma que existea função cone que tem como parâmetros, o centro da base, o raio da base e o vértice. Sugestão:utilize a função enumera e a estrutura de controle foreach.

Uma vez que se pretende uma “esfera,” o melhor será usar coordena-das esféricas para os centros das bases dos cones.

(foreach psi (enumera 0.1 (- pi 0.1) (/ pi 10))(foreach fi (enumera (/ pi 10) 2*pi (/ pi 10))

(cone (pesf 1 fi psi) (* 0.1 (sin psi)) (pxyz 0 0 0))))

12. (1.0) Considere a função parametrica-n que recebe, como parâmetros, uma função f , um limiteinferior de variação t0, um limite superior de variação t1 e um número n e que devolve, comoresultado, uma lista com n valores de f desde t0 até t1.

Defina uma função que calcula uma lista de pontos por onde passa uma espiral de Arquimedes.Esta curva é definida pelas equações paramétricas{

ρ(t) = αt

θ(t) = t

(defun espiral-arquimedes (p alfa t0 t1 n)(parametrica-n

(lambda (ti)(p+pol p (* alfa ti) ti))

t0t1n))

Número: 6

13. (2.0) Defina uma função parede-curva que, dada a espessura e altura de uma parede e dadauma curva descrita por uma lista de pontos, constrói uma parede através do deslocamento deuma secção rectangular com a espessura e altura dadas ao longo de uma spline que passa pelascoordenadas dadas. Se precisar, pode usar a função spline-pontos que, a partir de uma listade pontos, constrói uma spline que passa por esses pontos.

(defun parede-curva (espessura altura pontos-curva / curva seccao)(spline-pontos pontos-curva)(setq curva (entlast))(3dpoly-pontos

(list (pxyz 0 0 0)(pxyz espessura 0 0)(pxyz espessura 0 altura)(pxyz 0 0 altura)(pxyz 0 0 0)))

(setq seccao (entlast))(command "_.sweep" seccao "" curva))

14. (1.0) Defina a função parede-espiral-arquimedes que, a partir de uma espessura e altura eainda dos parâmetros de uma espiral de Arquimedes, cria uma parede em espiral, tal como seapresenta na seguinte imagem:

(defun parede-espiral-arquimedes (espessura altura p alfa t0 t1 n)(parede-curva espessura altura (espiral-arquimedes p alfa t0 t1 n)))

(parede-espiral-arquimedes 4 10.0 (pxy 0 0) 2 0 (* 16 pi) 150)

Número: 7

15. (2.0) Usando a função parametrica-n defina a função cilindros-espiral-arquimedesque constrói n cilindros de raio r e altura h e os coloca ao longo de uma espiral de arquimedes,de acordo com os parâmetros desta espiral, tal como se apresenta na seguinte figura:

(defun cilindros-espiral-arquimedes (r h p alfa t0 t1 n)(parametrica-n

(lambda (ti / p0)(setq p0 (p+pol p (* alfa ti) ti))(cilindro p0 r (p+xyz p0 0 0 h)))

t0t1n))

16. (2.0) Considere o desenho de uma treliça plana, tal como se apresenta na seguinte figura:

a0 a1. . . an−1 an

b0 b1 . . . bn−1

Defina uma função trelica-plana que recebe, como parâmetros, duas listas de pontos cor-

respondentes aos pontos desde a0 até an e desde b0 até bn−1 e que cria os nós nesses pontos e as

barras que os unem. Considere, como pré-definidas, as funções no-trelica que recebe um

ponto como argumento e barra-trelica que recebe dois pontos como argumentos.

(defun trelica-plana (as bs)(if (null bs)

(no-trelica (car as))(progn

(triangulo-trelica (car as) (cadr as) (car bs))(if (null (cdr bs))

nil(barra-trelica (car bs) (cadr bs)))

(trelica-plana (cdr as) (cdr bs)))))

(defun triangulo-trelica (a0 a1 b0)(no-trelica a0)(no-trelica b0)(barra-trelica a0 a1)(barra-trelica a0 b0)(barra-trelica b0 a1))