8
Fundamentos de Programação Soluções do primeiro teste 13 de Novembro de 2004 9:00-10:30 Nota Número: 20 Nome: Turma: Escreva o seu número em todas as folhas do teste. O espaço das respostas deve ser limitado ao espaço fornecido para cada pergunta. O teste tem 10 páginas com 13 questões, a cotação de cada questão encontra-se indicada entre parêntesis. Boa sorte. 1. (1.0) Explique os seguintes conceitos: algoritmo, procedimento, processo gerado por um procedimento. Algoritmo: Um algoritmo é uma sequência finita de instruções, bem definidas e não ambíguas, cada uma das quais pode ser executada mecanicamente num intervalo de tempo finito com uma quantidade de esforço finita. Procedimento: Um procedimento é um algoritmo escrito numa dada linguagem de programação. Processo gerado por um procedimento: Um processo computacional é um ente imaterial que existe dentro de um computador durante a execução de um programa, e cuja evolução ao longo do tempo é ditada pelo programa. 2. (1.0) O que é a abstracção procedimental? Qual a sua vantagem? A abstracção procedimental consiste em ignorar o modo como um certo procedimento é realizado, considerando apenas o que este faz. A vantagem da abstracção procedimental é permitir a manipulção de entidades complexas sem a necessidade de nos perdermos com os pormenores que criam essa mesma complexidade.

F u nd amet os d P rg çã - Técnico Lisboa - Autenticação · (1.0) Escreva um procedimento em Scheme que recebe dois números inteiros a e b, retorna #t se a for divisível por

Embed Size (px)

Citation preview

Fundamentos de Programação

Soluções do primeiro teste

13 de Novembro de 2004 9:00-10:30

Nota Número:

20 Nome:

Turma:

Escreva o seu número em todas as folhas do teste. O espaço das respostas deve ser limitado ao espaço fornecido para cada pergunta. O teste tem 10 páginas com 13 questões, a cotação de cada questão encontra-se indicada entre parêntesis. Boa sorte.

1. (1.0) Explique os seguintes conceitos: algoritmo, procedimento, processo gerado

por um procedimento.

Algoritmo: Um algoritmo é uma sequência finita de instruções, bem definidas e não ambíguas, cada uma das quais pode ser executada mecanicamente num intervalo de tempo finito com uma quantidade de esforço finita. Procedimento: Um procedimento é um algoritmo escrito numa dada linguagem de programação. Processo gerado por um procedimento: Um processo computacional é um ente imaterial que existe dentro de um computador durante a execução de um programa, e cuja evolução ao longo do tempo é ditada pelo programa.

2. (1.0) O que é a abstracção procedimental? Qual a sua vantagem?

A abstracção procedimental consiste em ignorar o modo como um certo procedimento é realizado, considerando apenas o que este faz.

A vantagem da abstracção procedimental é permitir a manipulção de entidades complexas sem a necessidade de nos perdermos com os pormenores que criam essa mesma complexidade.

Pág. 2/8 Aluno Nº __________________

3. (1.0) Escreva as regras seguidas pelo Scheme para a avaliação de uma expressão.

1. Se a expressão é uma constante, o seu valor é a própria constante;

2. Se a expressão é um nome, o seu valor é o objecto computacional (valor/procedimento) associado ao nome;

3. Se a expressão corresponde a uma forma especial, o seu valor é calculado pelas regras de avaliação específicas para essa forma especial;

4. Se a expressão é uma combinação:

a. Avaliam-se as subexpressões na combinação por qualquer ordem;

b. Associam-se os parâmetros formais do procedimento correspondente à primeira subexpressão, com os valores resultantes das seguintes expressões;

c. Avalia-se o corpo do procedimento (1.ª subexpressão) no ambiente definido pela associação entre os parâmetros formais e concretos.

4. (1.0) Explique o que é a barreira de abstracção criada pela definição de um tipo

abstracto de informação e quais os inconvenientes de não respeitar essa barreira.

Quando definimos um tipo abstracto de informação especificamos as operações básicas para esse tipo, isto é, as operações que podem ser aplicadas aos elementos do tipo.

A barreira de abstracção impede-nos de aplicar aos elementos do tipo qualquer operação que não seja uma das operações básicas, nas partes do programa que lidam com a utilização do tipo.

As desvantagens de não respeitar a barreira de abstracção são:

• Os programas tornam-se mais difíceis de ler e de compreender, uma vez que temos de pensar em termos da representação interna dos elementos do tipo, e não em termos das características abstractas do tipo.

• Os programas são dependentes da representação interna escolhida para os elementos do tipo, o que significa que se esta for alterada, todas as partes do programa que usam a representação interna têm de ser alteradas para considerar a nova representação.

Pág. 3/8 Aluno Nº __________________

5. Considere a seguinte estrutura de pares, a qual foi nomeada estrutura:

Quais os valores das seguintes expressões?

a) (0.5) (car estrutura)

(3 . 2)

b) (0.5) (car (cdr estrutura))

6

c) (0.5) (car (car (cdr (cdr estrutura))))

8

6. Avalie as seguintes formas. Se alguma das avaliações der origem a um erro,

explique qual a razão do erro.

a.(0.3) 7.0

7.0

b.(0.3) (* 2 (/ 8 4))

4

c.(0.3) (+ 3 #f)

Erro: #f não é número.

d.(0.3) (3 1)

Erro: o primeiro elemento da combinação não é um procedimento.

e.(0.3) ((lambda (x) (+ 2 x)) 3)

5

Pág. 4/8 Aluno Nº __________________

7. a) (1.0) Suponha que iniciou uma sessão de Scheme. Diga o que é escrito como resultado de avaliar as seguintes expressões (se houver situações em que nada é escrito ou houver erro, assinale este facto).

> (define x 1) Nada é escrito > (let ((x 5) (y (* x 3))) (* x y)) 15 > x 1

b) (1.0) Escreva a expressão “let” da alínea a) utilizando a notação lambda.

((lambda (x y)(* x y)) 5 (* x 3))

8. (1.0) Escreva um procedimento em Scheme que recebe dois números inteiros a e

b, retorna #t se a for divisível por b e #f caso contrário. Utilize os procedimentos primitivos que achar necessários. Não é necessário verificar se os argumentos recebidos são, de facto, inteiros.

(define (e-divisivel a b) (and (not (zero? b)) (zero? (remainder a b))))

Pág. 5/8 Aluno Nº __________________

9. (1.0) Considere a definição da seguinte função:

!

f ( n) =

1 se n = 1

2 se n = 2

f( n " 1) n se n > 2

#

$ %

& %

Por exemplo,

!

f ( 4) = f ( 3) 4 = ( f ( 2) 3 ) 4 = ( 23 ) 4 = 4096. Escreva um procedimento em Scheme que calcula os valores desta função. Pode utilizar o procedimento potencia.

(define (f n) (cond ((= n 1) 1) ((= n 2) 2) ((> n 2) (potencia (f (- n 1)) n)) (else "f: argumento < 1"))) (define (potencia x n) (if (= n 0) 1 (* x (potencia x (- n 1)))))

10. (1.0) Defina um procedimento de ordem superior que recebe procedimentos

para calcular as funções reais de variável real f e g e que se comporta como a seguinte função matemática (no desenvolvimento do seu procedimento pode utilizar o procedimento potencia):

h(x) = f(x)2 + 4g(x)3

(define (cria-funcao-h f g) (lambda (x) (+ (potencia (f x) 2) (* 4 (potencia (g x) 3)))))

11. a) (1.0) Escreva um procedimento que recebe como argumento uma lista de

inteiros e que calcula a soma dos quadrados dos elementos da lista. Por exemplo, a avaliação de (soma-quadrados (list 1 2 3)) origina 12+22+32.

(define (soma-quadrado-elementos lst) (if (lista-vazia? lst) 0 (+ (quadrado (primeiro lst)) (soma-quadrado-elementos (resto lst)))))

Pág. 6/8 Aluno Nº __________________

b) (1.0) O seu procedimento gera um processo iterativo ou recursivo? Justifique a resposta.

O procedimento gera um processo recursivo uma vez que deixa operações adiadas.

c) (1.0) Se o seu procedimento gerar um processo recursivo, escreva um

procedimento para o mesmo problema que gere um processo iterativo; se o seu procedimento gerar um processo iterativo, escreva um procedimento para o mesmo problema que gere um processo recursivo.

(define (soma-quadrado-elementos lst) (define (iter ls acc) (if (lista-vazia? ls) acc (iter (resto ls) (+ acc (quadrado (primeiro ls)))))) (iter lst 0))

12. Suponha que deseja definir o tipo de informação número com controle. Os

números com controle são muitos utilizados, por exemplo em números de cheques. A ideia subjacente a um número com controle corresponde a adicionar ao número, um dígito adicional, na posição das unidades, que é tal que a soma de todos os algarismos do número original com o dígito de controle é um múltiplo de 9. Assim, os números 42 e 346 são transformados nos seguintes números com controle 423 e 3465.

a) (1.0) Especifique as operações básicas para o tipo número com controle,

classificando-as nas seguintes categorias:

Construtor: faz-controle: inteiro -> num-controle Devolve o número de controle correspondente ao seu argumento. Selectores: original: num-controle -> inteiro Devolve o número original correpondente ao número de controle. controle: num-controle -> inteiro Devolve o dígito de controle do seu argumento.

Pág. 7/8 Aluno Nº __________________

Reconhecedor: controle?: universal -> lógico Devolve verdadeiro apenas se o seu argumento corresponde a um número de controle.

b) (1.0) Escolha uma representação interna para o tipo número com controle.

Note que esta pode ser extremamente simples.

Um número com controle é representado por um inteiro correspondente à soma do algarismo de controle com o número original multiplicado por 10.

c) (1.0) Escreva em Scheme as operações básicas, de acordo com a

representação escolhida.

(define (faz-num-controle n) (define (controle n) (- 9 (remainder (soma-digitos n) 9))) (+ (* 10 n)(controle n))) (define (original n) (quotient n 10)) (define (controle n) (remainder n 10)) (define (num-controle? n) (and (integer? n) (= (remainder (+ (soma-digitos (original n)) (controle n)) 9) 0))) O procedimento soma-digitos é definido do seguinte modo: (define (soma-digitos n) (if (= n 0) 0 (+ (remainder n 10) (soma-digitos (quotient n 10)))))

d) (1.0) Com base nas operações definidas, escreva um procedimento em

Scheme que recebe dois números com controle e que devolve o número com controle correspondente à soma dos números originais. Utilize as abstracções apropriadas.

Pág. 8/8 Aluno Nº __________________

(define (soma-controle c1 c2) (faz-num-controle (+ (original c1) (original c2))))

13. (1.0) Escreva um procedimento chamado transforma que recebe uma lista de

inteiros e que devolve a lista resultante de aplicar o procedimento correspondente à função

!

f (n) =n2

se n é par

2n em caso contrário

" # $

a todos os elementos da lista. O seu procedimento não tem que verificar a

correcção dos dados recebidos. Pode utilizar o procedimento potencia. Por exemplo, > (transforma (list 2 4 5 2 1)) (4 16 10 4 2)

(define (transforma l) (if (lista-vazia? l) l (insere (f (primeiro l)) (transforma (resto l))))) (define (f n) (if (even? n) (* n n) (* 2 n)))