Licenciatura em Engenharia Informática e Computação
Introdução à Programação I
Ano lectivo de 2001/2002

Exame de 1ª chamada, 11/1/2002

RESOLUÇÃO


1.1

(define tira-um-de-1-a-n
  (lambda (n lis)
    (cond ((= 1 n) (cdr lis))
          (else (cons (car lis) (tira-um-de-1-a-n (sub1 n) (cdr lis)))))))
1.2
(define tira-um-a-sorte
  (lambda (lis)
    (let* ((comp (length lis))
           (num (random comp)))
       (tira-um-de-1-a-n (add1 num) lis))))
2.1
(define substitui!
  (lambda (lis velho novo)
    (cond ((null? lis))
          ((equal? (car lis) velho) (set-car! lis novo))
          (else (substitui! (cdr lis) velho novo)))))
2.2
(define mais-um-numero!
  (lambda (aposta num)
    (cond ((member num aposta) 'ok)
          ((member 0 aposta)
            (substitui! aposta 0 num)
            'ok)
          (else
            (let ((max-val (apply max aposta)))
              (if (< num max-val)
                  (substitui! aposta max-val num))
              'ok)))))
3.2
(define faz-jogo-furos
  (lambda ()
    (let ((dim 100))
      (let* ((cartolina (make-vector dim 'vazio))
             (n-cast (round (* .5 dim)))
             (n-amar (round (* .25 dim)))
             (n-verd (round (* .13 dim)))
             (n-azul (round (* .07 dim)))
             (n-verm (- dim (+ n-cast n-amar n-verd n-azul))))
        (poe-codigo! n-cast 'cast cartolina 0)
        (poe-codigo! n-amar 'amar cartolina n-cast)
        (poe-codigo! n-verd 'verd cartolina (+ n-cast n-amar))
        (poe-codigo! n-azul 'azul cartolina (+ n-cast n-amar n-verd))
        (poe-codigo! n-verm 'verm cartolina (+ n-cast n-amar n-verd n-azul))
        (baralha! cartolina)
        cartolina))))

(define poe-codigo!
  (lambda (n cod vect i-partida)
    (letrec ((ciclo 
              (lambda (conta)
                (if (= n conta)
                    'ok
                    (begin
                      (vector-set! vect (inexact->exact (+ i-partida conta)) cod)
                      (ciclo (add1 conta)))))))
      (ciclo 0))))

(define baralha!
  (lambda (vec)
    (let ((comp-vec (vector-length vec)))
      (letrec ((ciclo 
                (lambda (indice)
                  (if (= indice comp-vec)
                      'ok
                      (begin
                        (troca-entre-si! vec indice (random comp-vec))
                        (ciclo (add1 indice)))))))
        (ciclo 0)))))

(define troca-entre-si!
  (lambda (vec i j)
    (let ((temp (vector-ref vec j)))
      (vector-set! vec j (vector-ref vec i))
      (vector-set! vec i temp))))