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

Mini-teste 2-A, Duração: 45 min, Com Consulta

Nome:


1.
Considere o seguinte procedimento em Scheme:

(define p2
  (lambda (lis)
    (cond ((null? lis) 
           0)
          ((pair? (car lis))
           (+ (p2 (car lis)) (p2 (cdr lis))))
          (else
           (+ (car lis) (p2 (cdr lis)))))))
A.
Analise o procedimentos p2 e diga qual é o resultado de (p2 '((1 2) 3 (4))).
Escolha um nome apropriado para o procedimento e justifique a escolha.


2.
Este exercício relaciona-se com as classificações dos alunos numa prova de avaliação. A lista pesos define a cotação de cada uma das alíneas da prova. A soma de todos os seus elementos deverá ser 20.
A lista teste contém as classificações obtidas por cada um dos alunos, em cada alínea. As alíneas são classificadas de 0 a 10.
Segue-se um exemplo em que o teste é composto por 7 alíneas.
(define pesos (list 4 3 4 1 1 3 4))      ; a soma dos elementos desta lista deverá ser 20

(define teste (list (list 10 10 2 1 2 1 10)   ; aluno 1
                    (list 10 8 8 4 5 3 7)     ; aluno 2
                    (list 3 5 6 6 10 7 8)     ; aluno 3
                    (list 7 9 8 4 5 3 7)      ; aluno 4
                    (list 10 8 7 4 7 10  7)   ; aluno 5
                    (list 10 7 0 3 7 8 10)))  ; aluno 6
Um procedimento, com a designação verifica-classificacoes, verifica se todos os alunos, na lista das classificações, tem o mesmo número de alíneas cotadas. Este procedimento
(define verifica-classificacoes  ; só verifica se o número de classificações lançadas
  (lambda (n clas-teste)         ; em cada aluno é igual a n.
    (let ((tudo-bem (verifica-cla-aux n clas-teste)))
      (if tudo-bem
          (display "classificacoes correctas")
          (display "classificacoes incorrectas")))))

(define verifica-cla-aux
  (lambda (n clas-teste)
    (cond ((null? clas-teste)
           #t)
          ((= (length (car clas-teste))
              n)
           .......................................)
          (else #f))))
A.
Complete o procedimento verifica-cla-aux.


Segue-se agora o cálculo das classificações com o procedimento classificacoes, o qual devolve uma lista com as classificações de todos os alunos, numa escala de 0 a 20.
Também, neste caso, é apresentada uma solução que utiliza um procedimento auxiliar, com a designação calcula-cla, que calcula a classificação de um aluno, numa escala de 0 a 20. Para o teste e pesos indicados, a resposta seria:
> (classificacoes pesos teste)
(12.4 14.2 12.0 13.3 16.1 13.5)

(define classificacoes
  (lambda (pesos-teste clas-teste)
    (if (null? clas-teste)
        '()
        (cons (calcula-cla pesos-teste (car clas-teste))
              (classificacoes pesos-teste (cdr clas-teste))))))

(define calcula-cla
  (lambda ...
B.
Completar o procedimento calcula-cla.