Você está na página 1de 6

Universidade do Minho

Escola de Engenharia
Departamento de Sistemas de Informação

Fundamentos
da
Programação de Computadores

Licenciatura em Tecnologias e Sistemas de Informação

1º Ano — 1º Semestre

Ano Lectivo 2009/2010

— Projecto 03 —

Data de Lançamento: 16 de Outubro de 2009

Data Limite de Entrega: 26 de Outubro de 2009 (9:00)

Prof. Filipe de Sá-Soares

Outubro de 2009
Observações
• A resolução do Projecto pode ser efectuada individualmente ou em grupo. No caso
de resolução por grupo, os grupos de trabalho devem ser compostos por dois ele-
mentos. Adicionalmente, estabelece-se que os grupos sejam formados por elementos
pertencentes ao mesmo turno PL.
• Por norma, a resolução do Projecto deve ser auto-contida, ou seja, os alunos não
devem colaborar uns com os outros na resolução dos problemas propostos, excepto
no caso da resolução em grupo, em que os alunos que formam o grupo colaboram entre
si na resolução do projecto. Se, a tı́tulo excepcional, ocorrerem colaborações com
outros alunos para a resolução dos problemas propostos, tal deve ser explicitamente
indicado nos resultados submetidos (ver ponto adiante).
• A submissão dos resultados alcançados na resolução do Projecto deve ser realizada
via moodle, até à data e hora indicadas anteriormente. Cada aluno deverá submeter
o seu trabalho, quer o mesmo tenha sido elaborado individualmente quer em grupo.
Não serão aceites submissões para além dessa data/hora.
• Os resultados a submeter devem constar de um ficheiro de texto (formato ASCII).
O nome do ficheiro deve ser composto pelos seguintes campos: identificação do
projecto (na forma “Pii”, em que “ii” é o número do projecto), caracter lowline,
números de aluno dos seus autores, separados por lowline, e extensão .txt. Para
o caso de projectos resolvidos de forma individual, apenas deverá ser indicado um
número de aluno (correspondente ao aluno que o resolveu).
O corpo desse ficheiro principiará com a identificação do projecto, seguindo-se a
indicação do(s) número(s) e nome(s) do(s) aluno(s) que resolveu(ram) os problemas
propostos e de eventuais colaborações (números e nomes). Depois, deverão surgir
as respostas aos problemas propostos, com a devida sinalização da questão a que se
refere cada resposta, e sem alteração de ordem (caso não responda a uma questão, não
deixe de sinalizar a identificação dessa questão, apesar de não fornecer resposta).
Seguidamente, dá-se um exemplo do inı́cio de um desses ficheiros de texto, cuja
designação deveria ser P01 12345 12346.txt. Note que nesse exemplo, não foi dada
resposta à questão A.1.iii e não existiram colaborações extra-grupo.

Projecto 01

Autores
12345 - Filipe de Sá-Soares
12346 - Miguel Abrunhosa de Brito

Colaboraç~
oes
sem colaboraç~
oes

A.1.i - 25
A.1.ii - erro
A.1.iii -
A.1.iv - (define a 101)

..
.

2
Questões
A. Introdução à Iteração
1. Identifique uma caracterı́stica distintiva dos processos iterativos.
2. Enumere os passos fundamentais da estratégia de concepção de algoritmos ite-
rativos, explicando em que consiste cada um desses passos.
3. Identifique os componentes dos algoritmos iterativos. Para o seguinte procedi-
mento aponte quais são esses componentes.
(define (priter a b)
(if (= a 0)
b
(if (= b 0)
a
(priter (- a 1) (- b 2)))))
B. Avaliação de Processos Iterativos
1. Uma forma muito conhecida para calcular o máximo divisor comum entre dois
inteiros positivos m e n é o Algoritmo de Euclides. Matematicamente, esse
algoritmo pode ser escrito da seguinte forma:
½
m ⇐n=0
mdc(m, n) =
mdc(n, m mod n) ⇐ n > 0
em que mod é o resto da divisão inteira.
Sabendo que o procedimento Scheme para o cálculo de mod se designa por
remainder, traduza aquela expressão para um procedimento Scheme e aplique
o Modelo de Substituição a cada uma das seguintes expressões:
i. (mdc 0 99)
ii. (mdc 240 32)
iii. (mdc 75 46)
2. Considere a seguinte definição alternativa para o cálculo do factorial de um
inteiro positivo (processo iterativo):
(define (factorial-iter2 n)
(factorial-aux2 1 n))
(define (factorial-aux2 parcial n)
(if (= n 0)
parcial
(factorial-aux2 (* n parcial) (- n 1))))
i. Qual é o valor final retornado por factorial-aux2? (escreva a expressão
e não o seu valor)
ii. Aplique o Modelo de Substituição para avaliar a expressão
(factorial-iter2 3).
C. Escrita de Procedimentos Geradores de Processos Iterativos
Neste grupo de questões não deixe de exercitar a aplicação da estratégia de concepção
de algoritmos iterativos!

3
1. Escreva um procedimento denominado ı́mpar? que, dado um inteiro não nega-
tivo x, retorne #t se x for ı́mpar e #f caso contrário. Não utilize quotient,
remainder, odd?, /, etc. Pode utilizar if ou cond.
2. Escreva um procedimento denominado multip-iter que, dados dois inteiros
positivos a e b, retorne o produto de a por b, utilizando apenas as operações
de adição e de subtracção e predicados simples.
3. Escreva um procedimento denominado exp-lenta-iter que, dados dois inteiros
positivos a e b, retorne o valor de ab , utilizando apenas as operações de adição,
subtracção e multiplicação, e predicados simples.
4. É possı́vel escrever uma outra versão do procedimento ı́mpar? que utilize and,
or e not. Para isso, é preciso tomar partido do facto de and e or serem spe-
cial forms que avaliam os seus argumentos da esquerda para a direita, retor-
nando logo que o valor da form esteja determinado. Escreva um procedimento
ı́mpar-bool? que não use if ou cond, mas sim and, or e not (booleano). Pode
usar + e -, mas não pode usar quotient, remainder, odd?, /, etc.
5. Escreva um procedimento denominado tartaglia que, dado um número na-
tural n, imprima as primeiras n linhas do triângulo de Tartaglia alinhadas à
esquerda (não necessita de apresentar as linhas formatadas de acordo com a
configuração de um triângulo). Utilize o procedimento combi que escreveu em
resposta à questão C.6 do Projecto 02.

D. Lexical Scoping

1. Distinga entre bound object e free object.


2. Explique o que entende por scope de um objecto.
3. Considere o seguinte extracto de código Scheme:

(define (f a b c)
(define (g x)
(+ (k a b) (* c x)))
(define (h y s)
(define (u v)
(+ v 3))
(< (- c y s) (+ y a) (* (u b) s)))
(define (j t)
(* (g t) z))
(if (h (+ a c) z)
(j (- c a b))
(g (+ c a b))))

Classifique em termos de lexical scoping cada um dos seguintes objectos: a, x,


y, t, z, v, g, u e k. Para cada um dos objectos anteriores, indique o seu scope.
4. Apresente duas vantagens da utilização de block structure.
5. O seguinte procedimento (power-close-to) determina a menor potência do
seu primeiro argumento que é maior que o seu segundo argumento.

(define (power-close-to b n)
(power-iter b n 1))

4
(define (power-iter b n e)
(if (> (expt b e) n)
e
(power-iter b n (+ e 1))))

Torne a definição de power-iter interna a power-close-to. Tome partido


do lexical scoping para remover parâmetros desnecessários do procedimento
power-iter e explique porque é que pode remover esses parâmetros.
Nota: o procedimento primitivo (expt a b) calcula o valor de a elevado a b.

E. Ordens de Crescimento de Processos

1. Quando se procede à análise do comportamento de processos computacionais,


quais são os dois recursos normalmente considerados?
2. Identifique e explique as principais ordens de crescimento de processos em ter-
mos de função θ.
3. Qual é a ordem de crescimento no tempo do seguinte procedimento?

(define (ocr n)
(cond ((= n 0) 5)
((= n 1) 7)
(else (* n (ocr (- n 2))))))

4. Qual é a ordem de crescimento no tempo do seguinte procedimento?

(define (pal n)
(cond ((= n 0) 5)
((= n 1) 7)
(else (* (pal (- n 1)) (pal (- n 2))))))

5. Na questão C.3 do Projecto 02, foi pedido que escrevesse um procedimento


denominado log2-simples. Para esse procedimento, indique a ordem de cres-
cimento no tempo e no espaço.
6. Escreva um procedimento que permita determinar o número de Fibonacci de
ı́ndice n e que origine um processo cuja ordem de crescimento no espaço seja
constante.

Prova de Avaliação Experimental


• Para os alunos avaliados segundo o perfil P1 ou segundo o perfil P2, a prova de
avaliação experimental do presente projecto decorrerá na semana que se inicia a 26
de Outubro de 2009, tendo lugar na sessão PL em que o aluno se encontrar inscrito.

• A realização da prova de avaliação experimental deverá ser efectuada com recurso


ao moodle, pelo que cada aluno deve garantir previamente o correcto acesso à sua
conta na comunidade moodle FPC, sob pena de não poder realizar a prova.

• Quando se apresentarem à prova de avaliação experimental, os alunos devem ser


capazes de responder às questões do presente projecto sem necessitarem de recorrer
ao interpretador Scheme.

5
• A não comparência de um aluno avaliado segundo o perfil P1 ou segundo o perfil P2
à prova de avaliação experimental traduz-se na atribuição de uma classificação de
0 (zero) valores nessa prova.