Faculdade de Engenharia da Universidade do Porto
Licenciatura em Engenharia Informática e Computação
Introdução à Programação I
2000/2001

Resolução do Exame de Recurso, 10/2/2001


Resolução 1
1.1

ponto-piramide(lin, col)=
  0, se col>lin
  1, se col=1
  1, se col=lin
  ponto-piramide(lin-1, col-1) + ponto-piramide(lin-1, col), para os outros casos
1.2
(define ponto-piramide
  (lambda (lin col)
    (cond ((> col lin) 0)
          ((= col 1) 1)
          ((= col lin) 1)
          (else (+ (ponto-piramide (sub1 lin)(sub1 col))
                   (ponto-piramide (sub1 lin) col))))))
1.3
(define linha-piramide
  (lambda (lin)
    (letrec ((aux
              (lambda (c)
                (if (= c lin)
                    (list 1)
                    (cons (ponto-piramide lin c)
                           (aux (add1 c)))))))
            (aux 1))))
Resolução 2

; Exercício 2 - Manipulação de polinómios representados por listas de coeficientes
(define coeficiente-polinomio
 (lambda (pol i)
   (if (> i (length pol)) 0 (list-ref pol i))))
2.1
(define multiplica-polinomio
 (lambda (pol x)
   (map (lambda (coef) (* x coef)) pol)))
2.2
(define avalia-polinomio
 (lambda (pol x)
   (if (null? pol) 0 (+ (car pol) (* x (avalia-polinomio (cdr pol) x))))))
2.3
(define cria-polinomio
 (lambda lista-coefs
   (lambda (x)
     (avalia-polinomio lista-coefs x))))

; testes
(define p1 '(1 6 0 2))
(display p1)
(coeficiente-polinomio p1 1) 
(define p2 (multiplica-polinomio p1 2))
(display p2)
(avalia-polinomio p1 1)
(define p3 (cria-polinomio 1 6 0 2)) 
(p3 1)
Resolução 3

; A abstracção jogo-da-vida
;
; O construtor
;
(define faz-jogo-vida
  (lambda (dim n)
    (let ((jogo-vida (make-vector dim))) ; vector das linhas
      (letrec ((constroi!                ; vector das colunas para  cada linha
                (lambda (conta)
                  (if (< conta dim)      ; preenche com "-"
                      (begin
                        (vector-set! jogo-vida conta (make-vector dim "-"))
                        (constroi! (add1 conta))))))
               (aux! 
                (lambda (num-simb)
                  (if (zero? num-simb)
                      jogo-vida
                      (let ((lin (random dim))
                            (col (random dim)))
                        (cond ((equal? (sel-jogo-vida jogo-vida lin col) ; já existe "+"
                                       "+")
                               (aux! num-simb))
                              (else
                               (mod-jogo-vida! jogo-vida lin col "+")    ; altera para "+"
                               (aux! (sub1 num-simb))))))))) 		 ; próximo símbolo
        (constroi! 0)
        (aux! n)))))
;
; Os selectores
;
(define sel-jogo-vida
  (lambda (jogo i j)
    (vector-ref
     (vector-ref jogo i)
     j)))
(define dim-jogo-vida
  (lambda (jogo)
    (vector-length jogo)))
;
; O modificador
;
(define mod-jogo-vida!
  (lambda (jogo i j simb)
    (vector-set! (vector-ref jogo i)
                 j
                 simb)))
;
; O visualizador
;
(define visu-jogo-vida
  (lambda (jogo)
    (let ((dim (vector-length jogo)))
      (letrec ((visu
                (lambda (lin col)
                  (cond ((>= lin dim)
                         (newline))
                        ((= col dim)
                         (newline)
                         (visu (add1 lin) 0))
                        (else
                         (display (sel-jogo-vida jogo lin col))
                         (display " ")
                         (visu lin (add1 col)))))))
        (visu 0 0)))))
3.2
; o modificador que, a partir de um jogo determina a proxima posição...
;
(define proximo!
  (lambda (jogo-vida)
    (let ((dim (dim-jogo-vida jogo-vida)))
      (let ((presente (faz-jogo-vida dim 0)))
        (letrec 
            ;
            ((copia!
              (lambda (lin col)
                (cond ((>= lin dim)
                       'copiado)
                      ((>= col dim)
                       (copia! (add1 lin) 0))
                      (else
                       (mod-jogo-vida! presente 
                                       lin
                                       col
                                       (sel-jogo-vida jogo-vida lin col))
                       (copia! lin (add1 col))))))
             ;
             (actualiza!
              (lambda (lin col)
                (cond ((>= lin dim)
                       'actualizado)
                      ((>= col dim)
                       (actualiza! (add1 lin) 0))
                      ;
                      ((and (equal? "-" (sel-jogo-vida presente lin col))
                            (= 3 (num-vizinhos presente lin col)))
                       (mod-jogo-vida! jogo-vida lin col "+")
                       (actualiza! lin (add1 col)))
                      ((and (equal? "+" (sel-jogo-vida presente lin col))
                            (not (= 3 (num-vizinhos presente lin col))))
                       (mod-jogo-vida! jogo-vida lin col "-")
                       (actualiza! lin (add1 col)))
                      (else
                       (mod-jogo-vida! jogo-vida lin col
                                       (sel-jogo-vida presente lin col))
                       (actualiza! lin (add1 col)))))))
          (copia! 0 0) ; faz uma copia de jogo-vida em jogo-presente
          (actualiza! 0 0)))))) ; actualiza jogo-vida a partir de jogo-presente
;
(define num-vizinhos
  (lambda (jogo lin col)
    (let ((dim (vector-length jogo))
          (lin0 (sub1 lin))
          (col0 (sub1 col))
          (alt 2)
          (larg 2)
          (n-viz 0))
      (if (equal? "+" (sel-jogo-vida jogo lin col)) ; descontar o "+" origem
          (set! n-viz -1))
      (if (= lin 0)
          (begin
            (set! lin0 0)
            (set! alt 1)))
      (if (= col 0)
          (begin 
            (set! col0 0)
            (set! larg 1)))
      (if (= lin (sub1 dim))
          (set! alt (sub1 alt)))
      (if (= col (sub1 dim))
          (set! larg (sub1 larg)))
      
      (letrec ((aux
                (lambda (inc-li inc-co)
                  (cond ((> inc-co larg)
                         (aux (add1 inc-li) 0))
                        ((> inc-li alt)
                         0)
                        ((equal? "+" (sel-jogo-vida jogo 
                                                    (+ lin0 inc-li) 
                                                    (+ col0 inc-co)))
                         (add1 (aux inc-li (add1 inc-co))))
                        (else 
                         (aux inc-li (add1 inc-co)))))))
        (+ n-viz (aux 0 0))))))


[Página da disciplina] [J. Lopes Home page]
João Correia Lopes (jlopes AT fe.up.pt).
Last modified: Mon Feb 12 18:26:14 2001