Programação e Computação para Arquitectura – 2007/2008 · 6.(0.5) Defina o predicado par?...
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))