Escolar Documentos
Profissional Documentos
Cultura Documentos
Fundamentos da Programao
Utilizando Mltiplos Paradigmas
Pedro Ado, Fausto Almeida, Ana Cardoso-Cachopo, Pedro Amaro de Matos (editores)
Prembulo
O objectivo desta publicao disponibilizar um conjunto de exerccios que permitam aos alu-
nos da disciplina de Fundamentos de Programao da Licenciatura em Engenharia Informtica
e de Computadores do Instituto Superior Tcnico consolidarem os conhecimentos adquiridos
ao longo do semestre.
Os exerccios esto divididos de acordo com os captulos do livro adoptado na disciplina:
Fundamentos da Programao Utilizando Mltiplos Paradigmas, de Joo Pavo Martins e
Maria dos Remdios Cravo, editado pela IST Press em 2011. Sempre que tal foi considerado
relevante, os exerccios foram subdivididos de acordo com o seu tipo.
Chama-se a ateno dos alunos para a indicao do nvel de dificuldade de 1 a 4, corres-
pondendo o nvel 1 a exerccios muito fceis e o nvel 4 a exerccios francamente difceis. Esta
informao apresentada dentro de um quadrado cinzento antes do enunciado do exerccio a
que diz respeito.
Alguns destes exerccios correspondem a exerccios propostos nas sebentas (a) Exerccios da
cadeira de Introduo Programao, Cludia Antunes, Ana Cardoso Cachopo, Joo Cachopo,
Francisco Couto, Antnio Leito, Ins Lynce, Csar Pimentel e H. Sofia Pinto, editados por
Ins Lynce, 2002, e (b) Exerccios para Programao em Scheme: Introduo Programao
Utilizando Mltiplos Paradigmas, Departamento de Engenharia Informtica, IST.
4
Contedo
1 Noes bsicas 7
1.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2 Abstraco Procedimental 11
2.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 Avaliao de Expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Definio de Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.3 Recurso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.4 Valores aproximados de funes . . . . . . . . . . . . . . . . . . . . . . . 23
4 Estruturao de Procedimentos 37
4.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.1 Estrutura de Blocos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.2 Utilizao de Nomes Locais . . . . . . . . . . . . . . . . . . . . . . . . . 39
5 Abstraco de dados 43
5.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.1 Caixas e ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2 Tipo tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.3 Tipo data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2.4 Complexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.5 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.2.6 rvores Binrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5
6 CONTEDO
7 O desenvolvimento de programas 77
7.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Captulo 1
Noes bsicas
2. O que um algoritmo? Explique cada uma das suas caractersticas: rigor, eficcia e
garantia de terminao.
(a) Constante.
(b) Procedimento primitivo.
(c) Combinao.
(d) Forma especial.
9. Diga o que uma combinao, apresentando a sua sintaxe em notao BNF e explicando
informalmente os smbolos no terminais que a compem.
7
8 CAPTULO 1. NOES BSICAS
(a) (1 + 5) 6 12/3
(b) 2 + 3 4/5
(c) (8 + 7 9/3 2) (8/4 9 + 3)
4. (2) Traduza as seguintes expresses para notao prefixa e calcule o seu valor utilizando
o interpretador do Scheme. Mostre a rvore de avaliao para cada uma delas utilizando
o modo de avaliao de expresses em Scheme.
(a) (5 + 4 3)/(2 + 1)
(b) (5 + 4) 3/2 1
(c) 1 + 2 3/4 5 6/(7 + 8)
5. (1) Suponha que as seguintes expresses so avaliadas pelo Scheme. Na linha imedia-
tamente a seguir a cada uma delas diga o que escrito pelo interpretador do Scheme (se
a avaliao de alguma das expresses der origem a um erro, explique a razo do erro).
(a) (+ 1 20)
(b) (1 + 20)
6. (1) Considere uma mscara de papel feita a partir um crculo de papel de raio 5. Os
dois olhos so crculos de raio 1 recortados, o nariz um quarto de crculo de raio 3
recortado e a boca corresponde a meio crculo de raio 3, tambm recortado. Escreva
uma expresso em Scheme para calcular a rea ocupada pela mscara.
7. (1) Suponha que as seguintes expresses so avaliadas pela ordem apresentada. Diga
o que escrito pelo interpretador do Scheme. Se a avaliao de alguma das expresses
der origem a um erro, explique a razo do erro.
(a) (* 4 (+ 1 7.0))
(b) (define a 5)
(c) (+ a b)
(d) (define b (* (+ 5 a) (+ 2 56)))
(e) (+ a b)
(f) a
(g) (define a (+ a 2))
(h) a
(i) +
(j) 7.0
(k) (* 2 (/ 8 4))
(l) (+ 3 #f)
(m) (define a a)
(n) a
8. (1) Diga qual o resultado de avaliar cada uma das seguintes formas.
Se a avaliao de uma forma no produzir resultados escreva -nada-.
Se a avaliao de uma forma produzir um erro, explique a sua razo.
Abstraco Procedimental
7. O que um ambiente local? Qual o significado de dizer que um nome est ligado num
ambiente?
(a) (3 1)
(b) ((lambda (x) (+ 2 x)) 3)
(c) ((lambda (x) ((lambda (y) (* y 2)) (+ x 3))) 4)
(d) ((lambda (x) (+ x 3)) ((lambda (y) (* y 2)) 4))
12 CAPTULO 2. ABSTRACO PROCEDIMENTAL
2. (1) Diga qual o resultado de avaliar cada uma das seguintes formas. Considere que
estas so fornecidas ao avaliador do Scheme pela ordem apresentada (e consequentemente
cada forma dependente das anteriores).
Se a avaliao de uma forma no produzir resultados escreva -nada-. Se a avaliao de
uma forma produzir um erro, explique a sua razo.
(a) (define a 5)
(b) (if (odd? a) (+ a 2) (* a 3))
(c) (lambda (x) (+ b x))
(d) ((lambda (x)(+ a x)) b)
(define (cont n)
(if (< n 0)
0
(+ 2 (cont (- n 3)))))
Com base nas regras de avaliao, desenhe a rvore que representa o funcionamento
deste procedimento com a avaliao de (cont 5).
(define (proc n)
(cond ((= n 0) 1)
((= n 1) 1)
(else (+ 3 (proc (- n 3))))))
Com base nas regras utilizadas pelo interpretador do Scheme para avaliar uma com-
binao, desenhe a rvore que representa o funcionamento deste procedimento com a
avaliao de (proc 3).
Com base nas regras utilizadas pelo interpretador do Scheme para avaliar uma combi-
nao, desenhe as rvores que representam o funcionamento destes procedimentos com
a avaliao de (g 3) e de (h 3).
2.2. EXERCCIOS DE PROGRAMAO 13
6. (2) Repare que o nosso modelo de avaliao permite a existncia de combinaes cujos
operadores so expresses compostas. Use esta observao para descrever o comporta-
mento do seguinte procedimento:1
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))
(a) (f 2)
(b) (define g (f 3))
(c) (g 4)
(d) (define h f)
(e) (h 6)
5. (1) Escreva o procedimento metade que recebe um nmero inteiro positivo e devolve
um nmero racional que corresponde a metade do seu argumento.
7. (2) Escreva o procedimento digitos->numero que recebe como argumentos trs dgitos
e produz o nmero inteiro de trs algarismos constitudo pelos seus argumentos e pela
ordem em que aparecem.
> (digitos->numero 3 2 8)
328
8. (1) Escreva um procedimento area-circulo que calcula a rea de um crculo cujo raio
r. Note-se que esta rea dada pela frmula r2 .
10. (1) Defina o procedimento media que recebe dois argumentos que devem ser nmeros
e devolve o nmero real que corresponde mdia dos seus argumentos.
11. (1) Escreva um procedimento sinal, que receba um inteiro e devolva 1, 1 ou 0, caso
o nmero seja, respectivamente, maior, menor ou igual a zero.
12. (1) Escreva o procedimento intermedio que recebe trs nmeros e devolve o nmero
com o valor intermdio.
13. (3) Escreva um procedimento quant->qual, que recebe um real, representando uma
nota quantitativa de um aluno (entre 0 e 20), e a transforma numa constante do tipo
cadeia de caracteres que corresponde a uma nota qualitativa, de acordo com a tabela
Nota Nota
quantitativa qualitativa
18 a 20 Muito Bom
14 a 17 Bom
10 a 13 Suficiente
5a9 Mediocre
0a4 Mau
A nota recebida dever ser convertida para um nmero inteiro, antes da converso para
a nota qualitativa.
2.2. EXERCCIOS DE PROGRAMAO 15
14. (1) Escreva um procedimento que recebe as notas de um aluno de uma disciplina C1
(nota do projecto, mdia dos trabalhos das prticas, nota do teste, e nota do exame
final) e calcula a sua nota final de acordo com as seguintes regras:
(a) A nota na disciplina ser calculada por uma mdia ponderada da classificao
obtida nas provas realizadas, com os seguintes pesos: projecto 25%; trabalhos de
casa e aulas prticas 10%; teste 20%; exame final 45%.
(b) Para obter aprovao na disciplina, a nota do exame ter de ser superior a 7,5
valores, a nota do projecto ter de ser superior a 9,5 valores e a mdia ponderada
da disciplina ter de ser superior a 9,5 valores.
O seu procedimento deve devolver a nota final da disciplina (um inteiro) no caso de o
aluno ter sido aprovado ou zero no caso do aluno ter sido reprovado.
15. (1) Utilizando os procedimentos desenvolvidos nos exerccios 13 e 14, escreva um proce-
dimento em Scheme que recebe as notas de um aluno da disciplina C1 (nota do projecto,
mdia dos trabalhos das prticas, nota do teste, e nota do exame final) e calcula a sua
nota qualitativa final.
16. (3) O procedimento primitivo round, quando a parte decimal do nmero a arredondar
0.5, arredonda por excesso ou por defeito (em termos de valor absoluto), consoante a
parte inteira seja mpar ou par. Por exemplo,
Escreva um procedimento arredonda que arredonda sempre por excesso (em termos de
valor absoluto), quando a parte decimal do nmero 0.5. Por exemplo,
17. (2) Escreva um procedimento cinco? que tem o valor verdadeiro se o seu argumento
for 5 e falso no caso contrrio. No utilize o if, nem o cond, nem #t nem #f.
18. (2) Escreva um procedimento (entre? val x y) que devolve verdadeiro, no caso de
val se encontrar entre x e y (x < val < y) e falso no caso contrrio.
19. (2) Escreva o procedimento bissexto? para verificar se um ano bissexto. Um ano
bissexto se for divisvel por 4 e no for divisvel por 100, a no ser que seja tambm
divisvel por 400. Por exemplo, 1984 bissexto, 1100 no , e 2000 bissexto.
16 CAPTULO 2. ABSTRACO PROCEDIMENTAL
20. (2) Escreva o procedimento data-valida? para verificar se uma data vlida. O seu
procedimento deve receber 3 inteiros, em que o primeiro representa o ano, o segundo, o
ms, e o terceiro, o dia, e verificar se a data correspondente existe no calendrio. Por
exemplo, 1998 2 29 e 1945 4 31 no so datas vlidas (porque 1998 no bissexto e Abril
s tem 30 dias, respectivamente) mas 2000 2 29 uma data vlida.
22. (2) Escreva o procedimento classifica que recebe trs nmeros correspondentes aos
comprimentos dos lados de um tringulo e decide se o tringulo equiltero, issceles
ou escaleno.
23. (2) Escreva um procedimento triangulo-rect?, que recebe trs nmeros inteiros po-
sitivos e determina se estes correspondem aos comprimentos dos lados de um tringulo
rectngulo.
O seu procedimento dever satisfazer as seguintes condies:
Note que num tringulo rectngulo, o quadrado de um dos lados igual soma dos
quadrados dos outros dois.
24. (2) Escreva o procedimento idade que recebe como argumentos seis nmeros inteiros
correspondentes a duas datas (um dia, ms, ano para cada data), sendo a primeira data
correspondente data de nascimento de uma pessoa e a segunda correspondente a uma
data posterior, e devolve a idade (nmero de anos) dessa pessoa na segunda data.
2.2. EXERCCIOS DE PROGRAMAO 17
25. (3) Escreva o procedimento anterior? que recebe como argumentos seis nmeros
inteiros correspondentes a duas datas (um dia, ms, ano para cada data) e devolve
verdadeiro se a primeira data for anterior segunda e falso caso contrrio. No utilize
o if, nem o cond, nem #t nem #f.
26. (2) Escreva o procedimento dias-p/-reveillon que recebe como argumentos dois
nmeros inteiros correspondentes a um ms e um ano e que devolve o nmero de dias
desde o dia 1 do ms dado at ao final desse ano.
27. (3) Escreva um procedimento dias-entre-datas que recebe seis nmeros inteiros como
argumentos correspondentes a duas datas (um dia, ms e ano para cada data), sendo
a primeira data anterior segunda e o perodo que decorre entre as datas no superior
a um ano, e devolve o nmero de dias depois da primeira data at segunda data
(inclusive).
28. (3) Escreva o procedimento proximo-29/2 que recebe como argumentos trs nmeros
inteiros correspondentes a uma data (um dia, ms e ano) e devolve o ano da prxima
ocorrncia do dia 29 de Fevereiro depois da data recebida como argumento.
Sugesto: Use o procedimento bissexto? definido na alnea 19.
29. (3) Escreva o procedimento numero-de-29/2s que recebe como argumentos seis n-
meros inteiros correspondentes a duas datas (um dia, ms, ano para cada data), sendo
a primeira data anterior segunda, e devolve o nmero de ocorrncias do dia 29 de
Fevereiro depois da primeira data e at segunda (inclusive).
Sugesto: Use o procedimento proximo-29/2 definido na alnea 28.
18 CAPTULO 2. ABSTRACO PROCEDIMENTAL
30. (3) Escreva o procedimento dias que recebe como argumentos seis nmeros inteiros
correspondentes a duas datas (um dia, ms, ano para cada data), sendo a primeira data
anterior segunda, e devolve o nmero de dias depois da primeira data e at segunda
(inclusive).
Sugesto: Use os procedimentos definidos anteriormente.
2.2.3 Recurso
1. Suponha que em Scheme no existiam as operaes aritmticas +, -, *, /, quotient e
remainder nem os predicados <, >, =, odd? e even? mas que existem os procedimentos
add1, sub1 e zero? que recebem como argumento um inteiro e devolvem, respectiva-
mente, o seu sucessor, o seu antecessor, e o resultado de verificar se o nmero 0.
Neste exerccio apenas poder utilizar estas 3 operaes e outras eventualmente definidas
utilizando estas.
(a) (1) Escreva um procedimento soma que recebe dois nmeros inteiros positivos n
e m, e devolve a soma dos dois.
Sugesto: A soma de dois nmeros n e m pode ser vista como n + 1 + + 1,
m vezes.
> (soma 8 2)
10
(b) (1) Escreva um procedimento multiplica que recebe dois nmeros inteiros posi-
tivos n e m, e devolve a multiplicao dos dois.
Sugesto: A multiplicao de dois nmeros n e m pode ser vista como n + n +
+ n, m vezes.
> (multiplica 8 2)
16
(c) (1) Escreva um procedimento menos que recebe dois nmeros inteiros positivos n
e m, e devolve a diferena dos dois.
Sugesto: Use uma ideia semelhante ao exerccio 1a.
> (menos 8 2)
6
> (menos 2 8)
-6
(d) (2) Escreva um procedimento par? que recebe um nmero inteiro positivo n, e
devolve #t se n for par e #f no caso contrrio.
> (par? 8)
#t
> (par? 5)
#f
(e) (2) Suponha definido um procedimento menor? que recebe dois nmeros inteiros
positivos n e m, e devolve #t se o n for menor do que m e #f no caso contrrio.
2.2. EXERCCIOS DE PROGRAMAO 19
> (somatorio 3)
6
> (somatorio 6)
21
> (soma-quadrados 3)
14
> (soma-quadrados 5)
55
> (factorial 0)
1
> (factorial 5)
120
5. (1) Escreva um procedimento potencia que recebe dois nmeros inteiros positivos b e
n, e devolve a potncia n de b, i.e., bn . Neste exerccio no pode usar o procedimento
expt.
> (potencia 3 2)
9
> (potencia 2 4)
16
7. (2) Suponha definido um procedimento primo? que recebe um nmero inteiro positivo
n, e devolve #t se o nmero for primo e #f no caso contrrio.
Escreva um procedimento numero-primos-menores que recebe um nmero inteiro posi-
tivo n, e devolve o nmero de primos menores ou iguais a n.
> (numero-primos-menores 9)
4
> (numero-primos-menores 23)
9
8. (2) Suponha definido um procedimento primo? que recebe um nmero inteiro positivo
n, e devolve #t se o nmero for primo e #f no caso contrrio.
Escreva um procedimento numero-divisores-primos que recebe um nmero inteiro
positivo n, e devolve o nmero de divisores primos de n. No caso de n ser 0 dever
devolver 0.
> (numero-divisores-primos 1)
0
> (numero-divisores-primos 20)
2
> (numero-divisores-primos 30)
3
10. (3) O logaritmo inteiro de um nmero n na base b o maior nmero inteiro e tal que
be n. Escreva um procedimento logaritmo que recebe dois nmeros inteiros positivos
n e b, e devolve o logaritmo inteiro de n na base b. No caso de n ou b serem 0 dever
devolver 0.
> (logaritmo 8 2)
3
> (logaritmo 7 2)
2
2.2. EXERCCIOS DE PROGRAMAO 21
11. (3) A raiz inteira de ndice e de um nmero n o maior nmero inteiro r tal que
re n. Escreva um procedimento raiz que recebe dois nmeros inteiros positivos n e
e, e devolve a raiz inteira de n de ndice e. No caso de e ser 0 dever devolver 0.
> (raiz 8 3)
2
> (raiz 15 2)
3
12. (4) Suponha definido um procedimento kesimo-factor-primo que recebe dois nmeros
inteiros positivos n e k, e devolve o seu k-simo factor primo de n.
Escreva um procedimento kesimo-expoente que recebe dois nmeros inteiros positivos
n e k, e devolve o expoente do k-simo factor primo de n. No caso de n ter menos de k
factores primos ou k ser 0, dever devolver 0.
> (kesimo-expoente 72 1)
3
> (kesimo-expoente 72 2)
2
Nos exerccios que se seguem poder ser til a utilizao dos seguintes procedimentos
sobre nmeros inteiros:
(remainder n m) devolve o resto da diviso de n por m.
(quotient n m) devolve o quociente da diviso de n por m.
13. (3) Escreva um procedimento numero-digitos que recebe um nmero inteiro positivo
n, e devolve o nmero de dgitos de n.
> (numero-digitos 9)
1
> (numero-digitos 1012)
4
14. (3) Escreva um procedimento soma-digitos que recebe um nmero inteiro positivo n,
e devolve a soma de todos os dgitos de n.
> (soma-digitos 9)
9
> (soma-digitos 1012)
4
> (soma-digitos-pares 9)
0
> (soma-digitos-pares 1412)
6
22 CAPTULO 2. ABSTRACO PROCEDIMENTAL
16. (4) Escreva um procedimento digitos-impares que recebe um nmero inteiro positivo
n, e devolve o nmero composto apenas pelos dgitos mpares de n ou 0, se n no tiver
dgitos mpares.
17. (4) Escreva um procedimento muda-digito que recebe trs nmeros inteiros positivos
n, k e d, e devolve o inteiro que resulta de substituir o dgito na posio k de n por d.
18. (4) O espelho de um nmero inteiro positivo o resultado de inverter a ordem de todos
os seus algarismos. Escreva um procedimento espelho que recebe um nmero inteiro
positivo n, e devolve o seu espelho.
19. (4) Um nmero binrio bn bn1 . . . b1 b0 pode ser transformado num nmero decimal
usando a seguinte formula ni=0 bi 2i . Escreva um procedimento binario-decimal que
P
recebe um nmero b escrito em binrio e devolve a sua representao decimal.
20. (4) Um nmero decimal d pode ser transformado num nmero binrio bn bn1 . . . b1 b0
atravs da seguinte recorrncia: seja q0 = d e qi = quociente(qi1 , 2) para i > 0, e
bi = resto(qi , 2). Escreva um procedimento decimal-binario que recebe um nmero d
escrito em base 10 e devolve a sua representao binria.
Defina um procedimento que calcule o arctg de acordo com a frmula acima. O seu
procedimento dever receber o nmero z para o qual se quer calcular o arctg bem como
o nmero de termos da expresso a calcular.
3. (3) Suponha que o procedimento sqrt no estava definido em Scheme como um pro-
cedimento primitivo.
A raiz quadrada de um nmero, x, pode ser calculada usando um mtodo de aproxima-
es sucessivas, chamado mtodo de Newton, em que um valor aproximado para x, y,
y+ x
sucessivamente melhorado utilizando a frmula 2 y .
Por exemplo, para calcular 3, poderamos efectuar os seguintes clculos:
(define (misterio x)
(cond ((= x 0) (newline))
(else (display (remainder x 10))
(misterio (quotient x 10)))))
(define (misterio?-aux b c)
(cond ((zero? b) #t)
((zero? c) #f)
(else (misterio?-aux (sub1 (sub1 b))
(sub1 (sub1 c))))))
(define (misterio? a)
(misterio?-aux a (sub1 a)))
(define (misterio n)
(misterio-aux n 0))
(define (misterio x n)
(if (= n 0)
0
(+ (* x n) (misterio x (- n 1)))))
n 1 + . . . + (2n 1) n2
1 1= 1
2 1+3 = 4
3 1+3+5 = 9
4 1+3+5+7 = 16
5 1+3+5+7+9 = 25
6 1+3+5+7+9+11 = 36
... ... ...
Note que o dobro de um nmero tambm no pode ser calculado recorrendo operao
de multiplicao.
Escreva dois procedimentos que calculam o quadrado de um nmero natural utilizando
o mtodo descrito.
6. (2) Defina um procedimento recursivo que recebe trs argumentos a, b e n e que devolve
o valor de somar n vezes a a b, i.e., b + a + a + + a, n vezes.
(a) (1) (Seco 2.2.3, Ex 1a) Escreva um procedimento soma, que gere um processo
iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve a soma dos
dois.
Sugesto: A soma de dois nmeros n e m pode ser vista como n + 1 + + 1,
m vezes.
> (soma 8 2)
10
(b) (1) (Seco 2.2.3, Ex 1b) Escreva um procedimento multiplica, que gere um
processo iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve a
multiplicao dos dois.
Sugesto: A multiplicao de dois nmeros n e m pode ser vista como n + n +
+ n, m vezes.
28 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS
> (multiplica 8 2)
16
(c) (1) (Seco 2.2.3, Ex 1c) Escreva um procedimento menos, que gere um processo
iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve a diferena
dos dois.
Sugesto: Use uma ideia semelhante ao exerccio 7a.
> (menos 8 2)
6
> (menos 2 8)
-6
(d) (2) (Seco 2.2.3, Ex 1d) Escreva um procedimento par?, que gere um processo
iterativo, e que recebe um nmero inteiro positivo n, e devolve verdadeiro se n for
par e falso no caso contrrio.
> (par? 8)
#t
> (par? 5)
#f
(e) (1) Escreva um procedimento igual?, e que gere um processo iterativo, que recebe
dois nmeros inteiros positivos n e m, e devolve verdadeiro se o n for igual a m e
falso no caso contrrio.
> (igual? 8 2)
#f
> (igual? 8 8)
#t
> (igual? 2 8)
#f
(f) (1) Escreva um procedimento menor?, e que gere um processo iterativo, que recebe
dois nmeros inteiros positivos n e m, e devolve verdadeiro se o n for menor do que
m e falso no caso contrrio.
> (menor? 8 2)
#f
> (menor? 8 8)
#f
> (menor? 2 8)
#t
(g) (2) (Seco 2.2.3, Ex 1e) Escreva um procedimento quociente, que gere um pro-
cesso iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve o
quociente da diviso de n por m. No caso de m ser 0 dever devolver 0.
Relembre que o quociente da diviso de dois nmeros inteiros positivos n e m o
maior inteiro r tal que r.m n.
Sugesto: Utilize os procedimentos menos e menor? definidos anteriormente.
3.2. EXERCCIOS DE PROGRAMAO 29
> (quociente 8 2)
4
> (quociente 10 3)
3
(h) (2) Escreva um procedimento resto, que gere um processo iterativo, e que recebe
dois nmeros inteiros positivos n e m, e devolve o resto da diviso de n por m. No
caso de m ser 0 dever devolver n.
> (resto 8 2)
0
> (resto 10 3)
1
(i) (2) Escreva um procedimento simetrico, que gere um processo iterativo, e que
recebe um nmero inteiro n, e devolve o simetrico de n.
> (simetrico 8)
-8
> (simetrico -3)
3
> (soma-quadrados 3)
14
> (soma-quadrados 5)
55
> (potencia 3 2)
9
> (potencia 2 4)
16
> (quadrado-perfeito? 4)
#t
> (quadrado-perfeito? 8)
#f
30 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS
12. (3) Um nmero livre de quadrados se no for divisvel por nenhum quadrado perfeito
para alm de 1. Escreva um procedimento livre-quadrados?, que gere um processo
iterativo, e que recebe um nmero n, e devolve verdadeiro se n for livre de quadrados e
falso no caso contrrio.
> (livre-quadrados? 4)
#f
> (livre-quadrados? 50)
#f
> (livre-quadrados? 70)
#t
13. (3) Um nmero n diz-se poderoso se para cada primo p, se p divisor de n ento p2
tambm divisor de n. Escreva um procedimento poderoso?, que gere um processo
iterativo, e que recebe um nmero inteiro positivo n, e devolve verdadeiro se o nmero
for poderoso e falso no caso contrrio.
15. (2) (Seco 2.2.3, Ex 9) Escreva um procedimento soma-divisores, que gere um pro-
cesso iterativo, e que recebe um nmero inteiro positivo n, e devolve a soma de todos os
divisores de n. No caso de n ser 0 dever devolver 0.
16. (3) (Seco 2.2.3, Ex 11) A raiz inteira de ndice e de um nmero n o maior nmero
inteiro r tal que re n. Escreva um procedimento raiz, que gere um processo iterativo,
e que recebe dois nmeros inteiros positivos n e e, e devolve a raiz inteira de n de ndice
e. No caso de e ser 0 dever devolver 0.
> (raiz 8 3)
2
> (raiz 15 2)
3
> (triangular? 6)
#t
> (triangular? 8)
#f
18. (3) Dois nmeros n e m dizem-se primos entre si se no tm nenhum divisor em comum
excepo do 1. Escreva um procedimento primos-entre-si?, que gere um processo
iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve verdadeiro se os
nmeros forem primos entre si e falso no caso contrrio. No caso de n ou m serem 0
dever devolver falso.
20. (4) O mximo divisor comum de dois nmeros n e m o maior inteiro x tal que x
divisor de n e m. Escreva um procedimento mdc, que gere um processo iterativo, e que
recebe dois nmeros inteiros positivos n e m, e devolve o mximo divisor comum dos dois
nmeros. No caso de n e m serem ambos 0 dever devolver 0. Se apenas um deles for 0
dever devolver o outro.
> (mdc 3 0)
3
> (mdc 12 20)
4
> (mdc 10 20)
10
21. (4) O mnimo mltiplo comum de dois nmeros n e m o menor inteiro x tal que x
divisvel por n e m. Escreva um procedimento mmc, que gere um processo iterativo, e
que recebe dois nmeros inteiros positivos n e m, e devolve o mnimo mltiplo comum
dos dois nmeros. No caso de n ou m serem 0 dever devolver 0.
> (mmc 4 6)
12
> (mmc 12 5)
60
22. (3) Um nmero n o n-simo primo se for primo e existirem n 1 nmeros primos
menores que ele. Escreva um procedimento nesimo-primo, que gere um processo itera-
tivo, e que recebe um nmero inteiro positivo n, e devolve o n-simo nmero primo. No
caso de n ser 0 dever devolver 0.
> (nesimo-primo 1)
2
> (nesimo-primo 10)
29
> (nesimo-primo-mersenne 3)
5
> (nesimo-primo-mersenne 9)
61
> (kesimo-divisor 20 3)
4
> (kesimo-divisor 20 6)
20
> (kesimo-divisor 20 7)
0
> (kesimo-factor-primo 3 1)
3
> (kesimo-factor-primo 3 2)
0
> (kesimo-factor-primo 60 3)
5
26. (4) (Seco 2.2.3, Ex 12) Escreva um procedimento kesimo-expoente, que gere um
processo iterativo, e que recebe dois nmeros inteiros positivos n e k, e devolve o expoente
do k-simo factor primo de n. No caso de n ter menos de k factores primos ou k ser 0,
dever devolver 0.
> (kesimo-expoente 72 1)
3
> (kesimo-expoente 72 2)
2
Nos exerccios que se seguem poder ser til a utilizao dos seguintes procedimentos
sobre nmeros inteiros:
(remainder n m) devolve o resto da diviso de n por m.
(quotient n m) devolve o quociente da diviso de n por m.
27. (3) (Seco 2.2.3, Ex 13) Escreva um procedimento numero-digitos, que gere um
processo iterativo, e que recebe um nmero inteiro positivo n, e devolve o nmero de
dgitos de n.
34 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS
> (numero-digitos 9)
1
> (numero-digitos 1012)
4
28. (3) (Seco 2.2.3, Ex 14) Escreva um procedimento soma-digitos, que gere um pro-
cesso iterativo, e que recebe um nmero inteiro positivo n, e devolve a soma de todos os
dgitos de n.
> (soma-digitos 9)
9
> (soma-digitos 1012)
4
29. (3) Escreva um procedimento existe-digito?, que gere um processo iterativo, e que
recebe um nmero inteiro positivo n e um dgito d, e devolve verdadeiro se o dgito d
ocorrer em n e falso no caso contrrio.
30. (4) (Seco 2.2.3, Ex 16) Escreva um procedimento digitos-impares, que gere um
processo iterativo, e que recebe um nmero inteiro positivo n, e devolve o nmero com-
posto apenas pelos dgitos mpares de n.
33. (4) (Seco 2.2.3, Ex 17) Escreva um procedimento muda-digito, que gere um processo
iterativo, e que recebe trs nmeros inteiros positivos n, k e d, e devolve o inteiro que
resulta de substituir o dgito na posio k de n por d.
34. (4) (Seco 2.2.3, Ex 18) O espelho de um nmero inteiro positivo o resultado de
inverter a ordem de todos os seus algarismos. Escreva um procedimento espelho, que
gere um processo iterativo, e que recebe um nmero inteiro positivo n, e devolve o seu
espelho.
35. (1) Usando o procedimento espelho definido acima, reescreva de novo o procedimento
capicua? definido na alnea 32.
36. (4) (Seco 2.2.3, Ex 20) Um nmero decimal d pode ser transformado num nmero bi-
nrio bn bn1 . . . b1 b0 atravs da seguinte recorrncia: seja q0 = d e qi = quociente(qi1 , 2)
para i > 0, e bi = resto(qi , 2). Escreva um procedimento decimal-binario, que gere
um processo iterativo, e que recebe um nmero d escrito em base 10 e devolve a sua
representao binria.
Estruturao de Procedimentos
(define (factorial n)
(if (>= n 0)
(fact-aux n)
(error "factorial: argumento negativo")))
(define (fact-aux n)
(if (= n 0)
1
(* n (fact-aux (- n 1)))))
Alternativa 2:
(define (factorial n)
(define (fact-aux n)
(if (= n 0)
1
(* n (fact-aux (- n 1)))))
(if (>= n 0)
(fact-aux n)
(error "factorial: argumento negativo")))
38 CAPTULO 4. ESTRUTURAO DE PROCEDIMENTOS
(a) Compare estas duas alternativas quanto garantia de que o factorial no calculado
com valores indevidos.
Sugesto: Ser que se pode avaliar directamente (fact-aux -1)?
(b) Como se chama a estrutura definida pela alternativa 2? Qual a sua vantagem?
2. (1) Considere o seguinte procedimento que calcula m! n! (m > n), recorrendo estrutura
de blocos. Identifique as variveis locais e no locais para cada um dos procedimentos.
(define (quociente-de-factoriais m n)
(define (iter m res)
(if (= m n)
res
(iter (- m 1) (* m res))))
(iter m 1))
> (somatorio 3)
6
> (somatorio 6)
21
> (factorial 0)
1
> (factorial 5)
120
> (numero-primos-menores 9)
4
> (numero-primos-menores 23)
9
> (numero-divisores-primos 1)
0
> (numero-divisores-primos 20)
2
> (numero-divisores-primos 30)
3
> (logaritmo 8 2)
3
> (logaritmo 7 2)
2
> (soma-digitos-pares 9)
0
> (soma-digitos-pares 1412)
6
9. (4) (Seco 2.2.3, Ex 19) Um nmero binrio bn bn1 . . . b1 b0 pode ser transformado
num nmero decimal usando a seguinte formula ni=0 bi 2i . Recorrendo estrutura de
P
blocos, escreva um procedimento binario-decimal que recebe um nmero b escrito
em binrio e devolve a sua representao decimal. O seu procedimento deve gerar um
processo iterativo.
(a) (1)
(let ((x 5)
(y 3))
(* x y))
40 CAPTULO 4. ESTRUTURAO DE PROCEDIMENTOS
(b) (1)
(let ((x 4)
(y 3))
(let ((z (* x y)))
(+ z x)))
(c) (2)
(let ((x 5))
(let ((x 3)
(y (* x 2)))
(+ x y)))
(d) (2)
(let ((x 5)
(y 12))
(+ x (let ((x (+ x y)))
(+ x 3))))
2. (2) Suponha que a tem o valor 5 no ambiente global. Diga qual o resultado de avaliar
a seguinte expresso:
(let ((a 3)
(b (* a 4)))
(+ a b))
(c) (1)
((lambda (x)
((lambda (y) (+ (* 2 y) x))
(+ x 3)))
5)
(d) (2)
((lambda (x y)
((lambda (x) (+ (* 2 x)
y))
(+ x y)))
6
2)
(e) (2)
((lambda (x y)
(+ x y ((lambda (z) (* 2 z))
(+ y 1))))
5
2)
5. Para cada uma das seguintes sries, escreva um programa em Scheme que calcula o valor
aproximado da srie. O seu programa deve apresentar uma estrutura de blocos e deve
evitar clculos repetidos. Pode utilizar os procedimentos potencia e factorial sem os
definir.
(a) (2)
1 1 1 1 X 1
1+ + + + + ... =
2 4 8 16 2n
n=0
(b) (2)
1 1 1 1 X 1
1 + + + ... = (1)n+1 = ln(2)
2 3 4 5 n
n=1
(c) (2)
X xn
= ex
n!
n=1
(d) (2)
x2 x4 X x2n2
1 + ... = (1)n+1 = cos(x)
2! 4! (2n 2)!
n=1
42 CAPTULO 4. ESTRUTURAO DE PROCEDIMENTOS
Captulo 5
Abstraco de dados
10. Apresente a metodologia dos tipos abstractos de informao e explique porque que
esta metodologia garante a abstraco de dados.
13. Diga o que uma rvore binria e quais so as suas operaes bsicas, classificando-as
de acordo com os vrios grupos de operaes.
43
44 CAPTULO 5. ABSTRACO DE DADOS
Para cada uma das seguintes expresses escreva o seu valor (o qual pode ser um nmero
inteiro, uma estrutura de pares ou pode originar um erro). No caso de a expresso
originar um erro explique a razo do erro.
(a) (1 . 2)
(b) (1 . ("bom dia". 3))
(c) (1 . (2 . (3 . 4)))
(d) ((1 . 2) . ((3 . (4 . 5)) . (7 . 8)))
2. (1) Escolha uma representao interna para o tipo tempo usando pares.
6. (1) Escreva o procedimento diferenca-tempo que calcula a diferena entre dois ins-
tantes de tempo devolvendo o valor em termos de horas, minutos e segundos. Este
procedimento apenas deve produzir um valor se o segundo tempo for maior do que o
primeiro, gerando uma mensagem de erro se essa condio no se verificar.
7. (2) Escreva o procedimento soma-tempos que calcula o tempo resultante da soma entre
dois instantes de tempo.
8. (2) Suponha agora que pretende representar os elementos do tipo tempo atravs de
inteiros positivos com a forma hmmss, em que h um inteiro no negativo que representa
o nmero de horas, mm e ss so dois inteiros entre 0 e 59 cada um e que representam,
respectivamente, os minutos e os segundos do tempo.
Escreva em Scheme as operaes bsicas, de acordo com esta nova representao.
9. (1) Seria possvel utilizar as operaes definidas nos exerccios anteriores, 47, usando
esta nova representao? Justifique.
2. (2) Escolha uma representao interna para o tipo data usando pares.
4. (1) Supondo que a representao externa para um elemento do tipo data d/m/a (em
que d representa o dia, m o ms e a o ano) escreva o transformador de sada para o tipo
data. Por exemplo,
5. (2) Tendo em conta as operaes bsicas do tipo data, defina um procedimento anterior?
que recebe como argumentos duas datas e tem o valor verdadeiro se a primeira data for
anterior segunda e falso em caso contrrio.
6. (2) Tendo em conta as operaes bsicas do tipo data, defina um procedimento idade
que recebe como argumentos a data de nascimento de uma pessoa e outra data posterior
e devolve a idade da pessoa na segunda data.
5.2.4 Complexos
Suponha que desejava criar o tipo nmero complexo em Scheme. Um nmero complexo
um nmero que constitudo por uma parte real e por uma parte imaginria. Um nmero
complexo pode ser escrito sob a forma a + bi, em que a e b so nmeros reais e i representa
a unidade imaginria. Esta tem a propriedade i2 = 1. Os reais a e b so chamados,
respectivamente, a parte real e a parte imaginria de a + bi. Os nmeros complexos podem ser
representados geometricamente no plano complexo (representao rectangular ou cartesiana),
representando-se a parte real, a, no eixo horizontal e a parte imaginria, b, no eixo vertical.
5. Um nmero complexo diz-se um imaginrio puro se a sua parte real for zero. Usando os
resultados das alneas anteriores, e a abstraco adequada, escreva um procedimento que
recebe um nmero complexo e que decide se este um imaginrio puro. Por exemplo:
(a) Escreva as operaes bsicas e o transformador de sada com base nesta represen-
tao.
(b) Quais as alteraes a fazer nas operaes imaginrio puro e soma e multiplica com-
plexos como consequncia da alterao da representao. Justifique a sua resposta.
9. Uma representao alternativa para o nmero complexo a + bi, conhecida por repre-
sentao polar ou trignomtrica (Figura
5.1), utiliza a distncia do nmero complexo
origem do referencial, o mdulo = a2 + b2 , e o ngulo que a linha que liga a origem
do referencial ao ponto que representa o nmero complexo faz com a parte positiva do
48 CAPTULO 5. ABSTRACO DE DADOS
a x
a + bi = (cos() + sen()i)
Escolha uma representao para nmeros complexos em notao polar e escreva as ope-
raes bsicas para complexos com base nessa representao.
10. Escreva as operaes rect->polar e polar->rect que transformas as representaes
rectangular em polar e vice-versa.
5.2.5 Listas
1. (1) Escreva um procedimento ultimo que recebe uma lista no vazia, e devolve o
ltimo elemento da lista.
2. (1) Escreva um procedimento produto-lista que recebe uma lista de nmeros intei-
ros, e devolve o produto de todos os elementos da lista. Considere que o produto dos
elementos de uma lista vazia tem o valor 1.Exemplo,
5.2. EXERCCIOS DE PROGRAMAO 49
3. (1) Escreva um procedimento conta-pares que recebe uma lista de nmeros inteiros,
e devolve o nmero de elementos pares na lista.
4. (1) Escreva um procedimento conta-menores que recebe uma lista de nmeros inteiros
lst e um nmero inteiro n, e devolve o nmero de elementos da lista lst menores que
n.
> (conta-menores (4 5 6) 4)
0
> (conta-menores (3 5 7) 6)
2
> (numero-ocorrencias (4 5 6) 5)
1
> (numero-ocorrencias (3 5 7) 2)
0
6. (2) Escreva um procedimento todos-pares? que recebe uma lista de nmeros inteiros,
e devolve verdadeiro se a lista for constituda exclusivamente por nmeros pares e falso
no caso contrrio.
7. (2) Escreva um procedimento ocorre-lista? que recebe uma lista de nmeros inteiros
e um nmero inteiro n, e devolve verdadeiro se o nmero n ocorrer na lista e falso no
caso contrrio.
> (ocorre-lista? (3 2 4) 3)
#t
> (ocorre-lista? (3 2 4) 1)
#f
50 CAPTULO 5. ABSTRACO DE DADOS
8. (3) Escreva um procedimento maximo-lista que recebe uma lista no vazia de nmeros
inteiros, e devolve o maior elemento da lista.
9. (2) Escreva um procedimento quadrados-lista que recebe uma lista de nmeros intei-
ros e devolve a lista que resulta de elevar todos os nmeros da lista original ao quadrado.
10. (2) Escreva um procedimento substitui que recebe uma lista de nmeros inteiros lst,
um nmero inteiro v (velho) e um nmero inteiro n (novo), e devolve a lista que resulta
de substituir em lst todas as ocorrncias de v por n.
> (substitui (4 3 2 4) 4 5)
(5 3 2 5)
11. (2) Escreva um procedimento insere-no-fim que recebe uma lista lst e um nmero
n, e devolve a lista que resulta de inserir o elemento n no final da lista lst.
12. (2) Escreva um procedimento remove-ultimo que recebe uma lista no vazia, e devolve
a lista que resulta de remover o ltimo elemento da lista.
13. (2) Escreva um procedimento junta que recebe duas listas, e devolve a lista que resulta
de juntar a segunda lista no final da primeira.
14. (2) Escreva um procedimento inverte que recebe uma lista, e devolve a lista que
resulta de inverter a lista original.
Sugesto: Utilize o procedimento insere-no-fim definido no exerccio 11 ou os proce-
dimentos ultimo e remove-ultimo definidos nos exerccios 1 e 12.
15. (3) Escreva um procedimento alisa que recebe uma lista, cujos elementos podem ser
listas, e devolve a lista com todos os elementos atmicos da lista original.
Sugesto: Utilize o procedimento junta definido no exerccio 13.
16. (3) Escreva um procedimento sublistas que recebe uma lista, e conta o nmero total
de sublistas que esta contm.
17. (2) Escreva um procedimento selecciona-pares que recebe uma lista de nmeros
inteiros, e devolve a lista com todos os nmeros pares da lista original.
18. (2) Escreva um procedimento selecciona-menores que recebe uma lista de nmeros
inteiros e um nmero inteiro n, e devolve a lista com todos os nmeros da lista original
menores que n.
> (selecciona-menores (4 3 2 4) 4)
(3 2)
> (selecciona-menores (7 3 5) 1)
()
19. (2) Escreva um procedimento selecciona-primos que recebe uma lista de nmeros
inteiros, e devolve a lista com todos os nmeros primos da lista original.
20. (2) Escreva um procedimento remove-elemento que recebe uma lista de nmeros intei-
ros e um nmero inteiro n, e devolve a lista que resulta de remover todas as ocorrncias
de n da lista original.
> (remove-elemento (4 3 2 4) 4)
(3 2)
> (remove-elemento (7 3 5) 1)
(7 3 5)
21. (2) Escreva um procedimento altera-posicao que recebe uma lista, um nmero inteiro
positivo p e um nmero inteiro n, e devolve a lista que resulta de alterar o elemento na
posio p da lista para n. Caso a lista tenha menos de p posies dever devolver a lista
original.
22. (2) Escreva um procedimento posicoes-lista que recebe uma lista de nmeros in-
teiros e um nmero inteiro n, e devolve a lista de todas as posies em que n ocorre na
lista.
> (posicoes-lista (4 3 2 2 1 4) 4)
(1 6)
> (posicoes-lista (4 3 2 2 1 4) 6)
()
23. (2) Escreva um procedimento posicoes-dos-pares que recebe uma lista de nmeros
inteiros, e devolve a lista de todas as posies da lista em que ocorrem nmeros pares.
24. (2) Escreva um procedimento ordenada? que recebe uma lista de nmeros inteiros, e
devolve verdadeiro se a lista estiver ordenada de forma crescente e falso no caso contrrio.
25. (3) Escreva um procedimento intercala que recebe duas listas, e devolve a lista que
resulta de intercalar os elementos das duas listas. Se as listas no forem do mesmo
tamanho, o que restar da lista maior dever ser adicionado no fim.
5.2. EXERCCIOS DE PROGRAMAO 53
26. (2) Escreva um procedimento insere-ordenado que recebe uma lista ordenada de
nmeros inteiros e um nmero inteiro n, e devolve a lista que resulta de inserir o nmero
n na posio certa na lista de modo a que o resultado continue uma lista ordenada.
> (insere-ordenado (3 5 7 8) 7)
(3 5 7 7 8)
> (insere-ordenado (3 5 7 8) 1)
(1 3 5 7 8)
> (insere-ordenado (3 5 7 8) 15)
(3 5 7 8 15)
27. (3) Escreva um procedimento parte que recebe uma lista de nmeros inteiros lst e
um nmero inteiro n, e devolve uma lista contendo na primeira posio a lista com os
elementos de lst menores que n, e na segunda posio a lista com os elementos de lst
maiores ou iguais a n. A ordem pela qual os elementos aparecem nas listas devolvidas
irrelevante.
> (parte (6 1 2 9 7) 3)
((1 2) (6 9 7))
> (parte (6 1 2 3 9 7) 3)
((1 2) (6 3 9 7))
> (parte (9 12 5) 4)
(() (9 12 5))
28. (2) Escreva um procedimento capicua? que recebe uma lista de nmeros inteiros, e
devolve verdadeiro se a lista for uma capicua e falso no caso contrrio.
Sugesto: Utilize os procedimentos ultimo e remove-ultimo definidos nos exerccios 1
e 12.
29. (3) Escreva um procedimento capicua que recebe uma lista de nmeros inteiros, e
devolve a lista que se obtm construindo uma capicua com a lista original.
Sugesto: Utilize o procedimento insere-no-fim do exerccio 11.
30. (3) Escreva um procedimento remove-duplicados que recebe uma lista de nmeros
inteiros lst, e fica apenas com uma cpia de cada elemento de lst. A ordem pela qual
os elementos aparecem na lista devolvida irrelevante.
Sugesto: Utilize o procedimento remove-elemento do exerccio 20.
31. (3) Escreva um procedimento elementos-repetidos que recebe uma lista de nmeros
inteiros, e devolve a lista com uma cpia de cada elemento que aparece repetido na lista.
A ordem pela qual os elementos aparecem na lista devolvida irrelevante.
Sugesto: Utilize os procedimentos ocorre-lista? e remove-elemento dos exerc-
cios 7 e 20.
32. (3) Escreva um procedimento conta-elementos que recebe uma lista de nmeros in-
teiros, e devolve uma lista de pares em que cada par contm como primeiro elemento
um elemento da lista e como segundo elemento o nmero de vezes que este aparece na
lista. A ordem pela qual os pares aparecem na lista devolvida irrelevante.
Respeite as barreiras de abstraco, mas lembre-se que est a lidar com dois tipos es-
truturados, a lista e o par.
Sugesto: Utilize os procedimentos ocorre-lista? e remove-elemento dos exerc-
cios 7 e 20.
> (lista-inteiros 7)
(0 1 2 3 4 5 6 7)
(c) Se o seu procedimento gera um processo iterativo, escreva um que gere um processo
recursivo. Se gera um processo recursivo, escreva um que gere um processo iterativo.
34. (4) O Crivo de Eratstenes um algoritmo para calcular nmeros primos que, segundo
a tradio, foi criado pelo matemtico grego Eratstenes (c. 285-194 a.C.), o terceiro
bibliotecrio-chefe da Biblioteca de Alexandria. O algoritmo calcula os nmeros primos
inferiores a n. Para isso, comea-se por criar uma lista com todos os inteiros positivos de
2 a n e seleccionar o nmero 2. Enquanto o nmero seleccionado for menor que n: (a)
removem-se da lista todos os mltiplos desse nmero; (b) passa-se ao nmero seguinte
na lista. No final do algoritmo, quando o nmero seleccionado for superior a n, a lista
apenas contm nmeros primos.
Escreva um procedimento que recebe um inteiro positivo n e calcula a lista de nmeros
primos inferiores a n de acordo com o Crivo de Eratstenes.
Sugesto: Defina um procedimento remove-multiplos que dado uma lista lst e um
nmero inteiro n, remove da lista todos os mltiplos de n.
(define a1 (cria-arv 3
(cria-arv 2
(cria-arv 5 (nova-arv) (nova-arv))
(cria-arv 7 (nova-arv) (nova-arv)))
(cria-arv 5
(cria-arv 1 (nova-arv) (nova-arv))
(cria-arv 6 (nova-arv) (nova-arv)))))
(define a2 (cria-arv 10
(cria-arv 12
(nova-arv)
(nova-arv))
(cria-arv 1
(cria-arv 8 (nova-arv) (nova-arv))
(cria-arv 2 (nova-arv) (nova-arv)))))
(define a3 (cria-arv 5
(nova-arv)
(cria-arv 10
(cria-arv 8 (nova-arv) (nova-arv))
(cria-arv 10 (nova-arv) (nova-arv)))))
3 10 5
2 5 12 1 10
5 7 1 6 8 2 8 10
Exerccios
1. (1) Escreva um procedimento folha? que recebe uma rvore binria, e devolve verda-
deiro se a rvore for uma folha e falso no caso contrrio.
2. (1) Escreva um procedimento tamanho que recebe uma rvore binria, e devolve o
nmero de ns da rvore.
3. (1) Escreva um procedimento soma-arvore que recebe uma rvore binria contendo
nmeros inteiros, e devolve a soma de todos os ns da rvore.
4. (1) Escreva um procedimento procura? que recebe uma rvore binria contendo n-
meros inteiros arv e um nmero inteiro n, e devolve verdadeiro se n ocorre num dos ns
da rvore e falso no caso contrrio.
> (procura? a1 8)
#f
> (procura? a2 8)
#t
5. (1) Escreva um procedimento todos-pares? que recebe uma rvore binria contendo
nmeros inteiros, e devolve verdadeiro se a rvore for constituda exclusivamente por
nmeros pares e falso no caso contrrio.
7. (1) Escreva um procedimento numero-folhas que recebe uma rvore binria, e devolve
o nmero de folhas da rvore.
8. (1) Escreva um procedimento profundidade que recebe uma rvore binria, e devolve
a profundidade da rvore.
9. (2) Escreva um procedimento pai? que recebe uma rvore binria contendo nmeros
inteiros e dois nmeros inteiros p e f, e devolve verdadeiro se p for pai de f na rvore e
falso no caso contrrio.
58 CAPTULO 5. ABSTRACO DE DADOS
> (pai? a1 3 7)
#f
> (pai? a1 3 9)
#f
> (pai? a1 5 1)
#t
10. (2) Escreva um procedimento filho? que recebe uma rvore binria contendo nmeros
inteiros e dois nmeros inteiros f e p, e devolve verdadeiro se f for filho de p na rvore
e falso no caso contrrio.
> (filho? a1 6 3)
#f
> (filho? a1 9 3)
#f
> (filho? a1 5 2)
#t
> (filho? a1 5 3)
#t
11. (2) Escreva um procedimento irmaos? que recebe uma rvore binria contendo n-
meros inteiros e dois nmeros inteiros n e m, e devolve verdadeiro se os nmeros forem
irmos na rvore e falso no caso contrrio.
> (irmaos? a1 2 7)
#f
> (irmaos? a1 2 5)
#t
12. (2) Escreva um procedimento ascendente? que recebe uma rvore binria contendo
nmeros inteiros e dois nmeros inteiros a e d, e devolve verdadeiro se a for ascendente
de d na rvore e falso no caso contrrio.
Sugesto: Utilize o procedimento procura? definido no exerccio 4.
> (ascendente? a1 3 6)
#t
> (ascendente? a1 3 9)
#f
> (ascendente? a1 2 5)
#t
> (ascendente? a1 3 5)
#t
13. (2) Escreva um procedimento descendente? que recebe uma rvore binria contendo
nmeros inteiros e dois nmeros inteiros d e a, e devolve verdadeiro se d for descendente
de a na rvore e falso no caso contrrio.
5.2. EXERCCIOS DE PROGRAMAO 59
> (descendente? a1 6 5)
#t
> (descendente? a1 7 3)
#t
> (descendente? a1 2 5)
#f
14. (2) Uma rvore binria diz-se prpria se todos os seus ns tm dois filhos ou so
folhas. Escreva um procedimento arv-propria? que recebe uma rvore binria, e
devolve verdadeiro se a rvore for prpria e falso no caso contrrio.
15. (2) Uma rvore binria diz-se perfeita se prpria e todas as suas folhas esto ao
mesmo nvel. Escreva um procedimento arv-perfeita? que recebe uma rvore binria,
e devolve verdadeiro se a rvore for perfeita e falso no caso contrrio.
Sugesto: Utilize o procedimento profundidade definido no exerccio 8.
16. (3) Uma rvore binria diz-se balanceada se for prpria e todas as suas folhas diferem
no mximo de um nvel. Escreva um procedimento arv-balanceada? que recebe uma
rvore binria, e devolve verdadeiro se a rvore for balanceada e falso no caso contrrio.
Sugesto: Utilize o procedimento profundidade definido no exerccio 8.
17. (3) Escreva um procedimento maximo que recebe uma rvore binria no vazia contendo
nmeros inteiros, e devolve o maior elemento da rvore.
18. (3) Escreva um procedimento minimo que recebe uma rvore binria no vazia contendo
nmeros inteiros, e devolve o menor elemento da rvore.
19. (3) Escreva um procedimento mais-profundo que recebe uma rvore binria no vazia,
e devolve o n mais profundo da rvore. Caso existam vrios mesma profundidade
dever devolver o mais esquerda na rvore.
Sugesto: Utilize o procedimento profundidade definido no exerccio 8.
20. (4) Escreva um procedimento profundidade-minima que recebe uma rvore binria
no vazia contendo nmeros inteiros e um nmero inteiro n, e devolve a profundidade
mnima a que n ocorre na rvore. Caso o nmero no ocorra na rvore dever devolver
falso.
Sugesto: Utilize o procedimento mais-profundo definido no exerccio 19.
> (profundidade-minima a1 5)
2
> (profundidade-minima a1 1)
3
> (profundidade-minima a1 9)
#f
21. (2) Escreva um procedimento lista-folhas que recebe uma rvore binria, e devolve
a lista com todas as suas folhas comeando da mais esquerda para a mais direita.
Sugesto: Utilize o procedimento junta definido no exerccio 13.
22. (2) Escreva um procedimento espelha que recebe uma rvore binria e devolve uma
nova rvore binria idntica recebida, mas em que em cada nvel da rvore se trocou
a rvore esquerda com a direita, mantendo-se a raiz.
5 2
6 1 7 5
23. (2) Escreva um procedimento substitui que recebe uma rvore binria contendo
nmeros inteiros e dois nmeros inteiros v (velho) e n (novo), e devolve a rvore que
resulta de substituir todas as ocorrncias de v por n.
> (substitui a1 5 8)
2 8
8 7 1 6
24. (2) Escreva um procedimento poda que recebe uma rvore binria, e devolve a rvore
que resulta de remover todas as folhas da rvore.
10
25. (4) Escreva um procedimento promove-irmao que recebe uma rvore binria contendo
nmeros inteiros, e que em cada uma das suas sub-rvores coloca o irmo maior como
raiz da rvore direita.
10
1 12
2 8
62 CAPTULO 5. ABSTRACO DE DADOS
26. (4) Escreva um procedimento promove-descendente que recebe uma rvore binria
contendo nmeros inteiros, e que em cada uma das suas sub-rvores coloca o seu maior
elemento na raiz. Nos casos em que h troca da raiz r por m, ento r dever ocupar o
lugar onde m estava.
Sugesto: Defina um procedimento substitui1 que recebe uma rvore arv e dois
nmeros v e n e substitui uma nica ocorrncia de v por n na rvore arv.
5 6
2 3 1 5
27. (4) Uma rvore binria contendo nmeros inteiros diz-se de procura se a sua raiz
maior que todos os elementos da sua sub-rvore esquerda, menor ou igual que todos os
elementos da sua sub-rvore direita, e o mesmo se passa para todas as suas sub-rvores.
Escreva um procedimento arv-procura? que recebe uma rvore binria, e devolve
verdadeiro se a rvore for uma rvore binria de procura e falso no caso contrrio.
28. (2) Escreva um procedimento existe-arv-procura? que recebe uma rvore binria
de procura contendo nmeros inteiros e um nmero inteiro n, e devolve verdadeiro se o
nmero n ocorre num dos ns da rvore e falso no caso contrrio.
Nota: O seu procedimento deve tirar partido do facto de receber uma rvore binria
de procura e no uma rvore binria qualquer.
> (existe-arv-procura? a3 8)
#t
> (existe-arv-procura? a3 9)
#f
29. (3) Escreva um procedimento insere-arvore-procura que recebe uma rvore binria
de procura contendo nmeros inteiros e um nmero inteiro n, e devolve a rvore binria
de procura que resulta de inserir o nmero n na rvore.
> (insere-arvore-procura a3 9)
5.2. EXERCCIOS DE PROGRAMAO 63
10
8 10
30. (2) Escreva um procedimento cria-arvore-procura que recebe zero ou mais nmeros
inteiros, e devolve uma rvore binria de procura criada a partir desses argumentos. O
primeiro argumento, caso exista, dever ser a raiz da rvore.
> (cria-arvore-procura 2 1 5 3)
1 5
3
64 CAPTULO 5. ABSTRACO DE DADOS
Captulo 6
2. O procedimento somatorio
6. (1) Escreva os procedimentos dos exerccios 10, 11, 12 e 13 da seco 3.2 (quadrado-perfeito?,
primo?, livre-quadrados?, poderoso?) utilizando o procedimento nenhum-p.
6.2. EXERCCIOS DE PROGRAMAO 67
10. (1) Escreva os procedimentos dos exerccios 2 e 9 da seco 2.2.3 (somatorio e soma-divisores)
utilizando o procedimento soma-p.
11. (3) Escreva um procedimento nesimo-p que recebe um nmero inteiro positivo n e um
predicado p, e devolve o n-simo elemento que satisfaz p.
12. (1) Escreva os procedimentos dos exerccios 22, 23, 24, e 25 da seco 3.2 (nesimo-primo,
nesimo-primo-mersenne, k-divisor, e kesimo-factor-primo) utilizando o procedi-
mento nesimo-p.
13. (3) Escreva um procedimento soma-digitos-p que recebe um nmero inteiro positivo
n e um predicado p, e devolve a soma de todos os dgitos de n que satisfazem p.
15. (3) Escreva um procedimento existe-digito-p? que recebe um nmero inteiro posi-
tivo n e um predicado p, e devolve verdadeiro se ocorrer um dgito em n que satisfaa p
e falso no caso contrrio.
17. (4) Escreva um procedimento digitos-p que recebe um nmero inteiro positivo n e
um predicado p, e devolve o nmero composto apenas pelos dgitos de n que satisfazem
p. Se nenhum dos dgitos de n satisfizer p deve devolver 0.
19. (2) Escreva um procedimento conta que recebe uma lista e um predicado unrio, e
devolve o nmero de elementos da lista que satisfazem o predicado.
21. (2) Escreva um procedimento todos? que recebe uma lista e um predicado unrio, e
devolve verdadeiro caso todos os elementos da lista satisfaam o predicado e falso no
caso contrrio.
23. (2) Escreva um procedimento existe? que recebe uma lista e um predicado unrio, e
devolve verdadeiro se existir pelo menos um elemento da lista que satisfaa o predicado
e falso no caso contrrio.
6.2. EXERCCIOS DE PROGRAMAO 69
26. (2) Escreva um procedimento transforma que recebe uma lista e um procedimento
unrio f, e devolve a lista que resulta de aplicar o procedimento a todos os elementos
da lista.
28. (2) Escreva um procedimento filtra que recebe uma lista l e um predicado p, e
devolve a lista que resulta de ficar com todos os elementos da lista l que satisfazem o
predicado p.
29. (2) Escreva os procedimentos dos exerccios 17, 18, 19, e 20 da seco 5.2.5 (selecciona-pares,
selecciona-menors, selecciona-primos, e remove-elemento) utilizando o procedi-
mento filtra.
30. (2) Escreva um procedimento posicoes-p que recebe uma lista e um predicado, e
devolve a lista de todas as posies em que o elemento da lista satisfaz o predicado.
32. (2) Escreva um procedimento da-pares que recebe um procedimento, um valor e uma
lista e que devolve uma lista de pares em que cada par contm o elemento da lista seguido
do valor obtido da aplicao do procedimento ao valor e ao elemento da lista respectivo.
35. (2) Escreva um procedimento conta-arvore que recebe uma rvore binria e um
predicado p que se aplica a cada um dos ns da rvore, e conta quantos elementos
da rvore satisfazem p.
36. (2) Escreva os procedimentos dos exerccios 2, 4, e 6 da seco 5.2.6 (tamanho, procura?,
e conta-pares-arvore) utilizando o procedimento conta-arvore.
37. (2) Escreva um procedimento conta-subarvore que recebe uma rvore binria a e um
predicado p que se aplica a rvores, e conta quantas subrvores de a satisfazem p.
3
> (conta-subarvore a2 dois-filhos?)
2
> (conta-subarvore a3 dois-filhos?)
1
39. (2) Escreva um procedimento aplica-f-arvore que recebe uma rvore binria e um
procedimento f que se aplica raiz de uma rvore, e devolve a rvore que resulta de
aplicar o procedimento a todos os elementos da rvore.
144 1
64 4
2. (a) (2) Escreva um procedimento fn-soma que receba como argumentos dois pro-
cedimentos correspondentes a funes reais de varivel real, f e g, e devolva o
procedimento correspondente funo correspondente soma de f com g.
Por exemplo, com este procedimento podemos gerar a interaco:
> (define (f1 x) (+ x 3))
> (define (f2 y) (* y 10))
> ((fn-soma f1 f2) 12)
135
72 CAPTULO 6. PROCEDIMENTOS DE ORDEM SUPERIOR
3. (2) Defina um procedimento funcao-i que recebe procedimentos para calcular as fun-
es reais de varivel real f , g e h e devolve um procedimento que se comporta como a
seguinte funo matemtica:
4. (2) Escreva um procedimento nega que recebe como argumento um predicado de dois
argumentos e que devolve o procedimento correspondente negao do seu argumento.
(define (derivada f)
(lambda (x)
(/ (- (f (+ x dx)) (f x))
dx)))
(define dx 0.00001)
9. (2) Escreva um procedimento rasto que recebe uma cadeia de caracteres correspon-
dendo ao nome de um procedimento, e um procedimento de um argumento. O procedi-
mento rasto devolve um procedimento de um argumento que escreve no cran (usando
o procedimento primitivo display) a indicao de que o procedimento foi avaliado e o
valor do seu argumento, escreve tambm o resultado do procedimento, e devolve o valor
de aplicar o procedimento original ao argumento recebido. Por exemplo, partindo do
princpio que o procedimento quadrado foi definido, podemos gerar a seguinte interaco:
ou seja, depois dos dois termos iniciais, cada termo da sequncia corresponde soma
dos dois termos anteriores.
Sequncias semelhantes de Fibonacci, mas com termos iniciais diferentes, tm sido des-
cobertas como transcrevendo vrios aspectos da natureza. Um dos exemplos, a sequncia
de Lucas, em honra ao Matemtico francs Franois Lucas (18421891), corresponde
sequncia 3, 1, 4, 5, 9, . . ..
A sequncia de Fibonacci pode ser generalizada a uma coleco de sequncias, para-
metrizadas com base nos dois primeiros termos, a e b e definidas atravs da seguinte
expresso:
a se n = 0
Fa,b (n) = b se n = 1
Fa,b (n 1) + Fa,b (n 2) se n > 1
Assim, F0,1 (n) uma expresso designatria correspondente ao n-simo termo da sequn-
cia de Fibonacci, F3,1 (n), uma expresso designatria correspondente ao n-simo termo
da sequncia de Lucas.
Fa,b (n + 1)
lim =
n Fa,b (n)
em que (leia-se Phi, o qual no deve ser confundido com o nmero ) dado por
1+ 5
= 1.6180
2
Phi um nmero transcendente conhecido por proporo divina, proporo urea ou
nmero de ouro. A proporo divina foi recentemente glorificada no livro de Dan
Brown, O Cdigo da Vinci. Este nmero, frequentemente usado nas propores
das pinturas renascentistas, est envolvido com a natureza do crescimento. O
nmero pode ser encontrado na proporo em conchas, seres humanos, e at
na relao entre os machos e fmeas de qualquer colmeia do mundo. Por esta
6.2. EXERCCIOS DE PROGRAMAO 75
razo, os antigos consideravam que este nmero tinha sido utilizado pelo Criador
do universo e chamavam-lhe a proporo divina. Esta proporo corresponde
relao que resulta quando uma linha dividida de tal modo que o comprimento
total da linha tem a mesma relao com o comprimento do segmento maior que o
comprimento do segmento maior tem com o comprimento do segmento menor.
Usando um mtodo de aproximaes sucessivas semelhante ao apresentado na Sec-
o 2.4.3 do livro, escreva um procedimento de ordem superior que calcule o valor
da proporo divina com uma preciso de 10 casas decimais. O argumento do seu
procedimento dever ser um procedimento para o clculo da sequncia de Fibo-
nacci. O seu procedimento dever utilizar expresses let para evitar clculos
repetidos.
76 CAPTULO 6. PROCEDIMENTOS DE ORDEM SUPERIOR
Captulo 7
O desenvolvimento de programas
3. Em programao podemos ter erros sintcticos e erros semnticos. Defina cada um deles
e d exemplos.
5. O que a depurao? Que tipos de depurao so efectuados nos programas e para que
tipos de erros?
(a) Apenas deve ser escrita aps o programa ter sido concludo.
(b) constituda por vrios tipos de documentos.
(c) No pode ser alterada na fase de manuteno.
(d) Deve ser evitada, sempre que possvel, pois corresponde a um trabalho desnecess-
rio.
2. (1) Com base nos casos de teste concebidos, explique qual o problema com o procedi-
mento saudacao.
(define (misterio a)
(cond ((> a 0) #t)
((< a 3) #t)
((= a 1) (+ a 5))
(else (misterio (- a 2)))))
4. (1) Com base nos casos de teste concebidos, explique qual o problema com o procedi-
mento misterio.