Fundamentos de Programação

Documentos relacionados
Fundamentos de Programação

Fundamentos de Programação

Fundamentos da Programação

2. Diga qual é a diferença entre tipos de informação elementares e tipos de informação estruturados.

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos de Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Estruturação de Procedimentos

Fundamentos da Programação

Exercícios para Fundamentos da Programação Utilizando Múltiplos Paradigmas

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

PROGRAMAÇÃO EM SCHEME:

Inteligência Artificial Alameda e Taguspark

Inteligência Artificial Alameda e Taguspark

Fundamentos da Programação

FUNDAMENTOS DA PROGRAMAÇÃO 1º Teste, 19 de abril de 2013, 1h30m

if not(isinstance(a, int)) or a < 0: raise ValueError ("misterio: arg nao e inteiro nao negativo") else: return misterio_aux(a, a + 1)

Programação imperativa

FUNDAMENTOS DA PROGRAMAÇÃO 2º Teste, 1 de junho de 2013, 1h30m

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

PROCURA E PLANEAMENTO

Exame de 1ª Época Introdução à Programação IGE e ETI 2003/02/25-1º semestre de 2002/2003 ISCTE

Fundamentos da Programação

Pragmática das Linguagens de

Exercícios da cadeira de Introdução à Programação

Exercícios para Fundamentos da Programação Utilizando Múltiplos Paradigmas

Conceitos básicos de algoritmos

Fundamentos de Programação

Computação e Programação Exame Época de recurso

UNIVERSIDADE TÉCNICA DE LISBOA INSTITUTO SUPERIOR TÉCNICO

Inteligência Artificial

Fundamentos da Programação de Computadores

if not(isinstance(a, int)) or a < 0: raise ValueError ( misterio: arg devia ser inteiro nao negativo ) else: return misterio_aux(a, a + 1)

Correção do 1º Exame de INTRODUÇÃO À PROGRAMAÇÃO Licenciatura em Engenharia Mecânica 30 de Junho de 2006, 2º Semestre

1º Exame de INTRODUÇÃO À PROGRAMAÇÃO Licenciatura em Engenharia Mecânica 30 de Junho de º Semestre

Inteligência Artificial Taguspark

PROVA Duração da prova: 120 minutos. Grupo 1 - Três questões de resposta múltipla de matemática.

Aula prática 5. Funções Recursivas

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Encriptação de Mensagens

Inteligência Artificial

Exercícios para Fundamentos da Programação

RESOLUÇÃO. Computação e Programação (2009/2010-1º Semestre) 1º Teste (11/11/2009) Nome. Número. Leia com atenção os pontos que se seguem:

PROVA ESPECÍFICA MODELO. Duração da prova: 120 minutos

PROVA MODELO Duração da prova: 120 minutos

PROCURA E PLANEAMENTO

PROVA Duração da prova: 120 minutos

É neste ponto que entra o conceito de lógica de programação.

Introdução à Programação Funcional. Conteúdo

Conceitos Básicos de Algoritmos

PROVA Duração da prova: 120 minutos

Resolução De Problemas Em Informática. Docente: Ana Paula Afonso Resolução de Problemas. 1. Analisar o problema

Conceitos de Linguagem de Programação - 2

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

ANÁLISE MATEMÁTICA III A TESTE 1 10 DE OUTUBRO DE :10-16H. Duração: 50 minutos

Universidade Federal de Juiz de Fora Departamento de Matemática

Aula Prática 3. Paradigmas da Programação I / Programação Funcional. ESI/MCC 1 o ano (2005/2006)

Transcrição:

Fundamentos de Programação Primeiro Teste 16 de Abril de 2011 09:00 10:30 Nome: Número: Esta prova, individual e sem consulta, tem 7 páginas com 9 perguntas. A cotação de cada pergunta está assinalada entre parêntesis. Escreva o seu número em todas as folhas da prova. O tamanho das respostas deve ser limitado ao espaço fornecido para cada questão. O corpo docente reserva-se o direito de não considerar a parte das respostas que excedam o espaço indicado. Pode responder usando lápis. Em cima da mesa devem apenas estar o enunciado, caneta ou lápis e borracha e cartão de aluno. Não é permitida a utilização de folhas de rascunho, telemóveis, calculadoras, etc. Boa sorte. Pergunta Cotação Nota 1. 1.0 2. 2.0 3. 1.5 4. 2.0 5. 4.5 6. 2.5 7. 2.5 8. 2.0 9. 2.0 Total 20.0

Número: Pág. 2 de 7 1. (1.0) Escolha a única afirmação incorrecta. Uma resposta certa vale 1 valor e uma resposta errada desconta 0.4 valores. A. A tradução de (5 + 2) < x 2 para a notação do Scheme origina (< (+ 5 2) (/ x 2)). B. A tradução da expressão 6 x + 3 para a notação do Scheme origina (* 6 (+ x 3)). C. A tradução da expressão 5 (3 + f(x)) para a notação do Scheme origina (* 5 (+ 3 (f x))). D. A tradução da expressão x + f(g(x)) para a notação do Scheme origina (+ x (f (g x))). B. 2. (2.0) Escolha a única resposta correcta para as seguintes questões. Cada resposta certa vale 1 valor e cada resposta errada desconta 0.4 valores. (a) O valor da expressão ((lambda (x y) (+ (* 2 x) y)) 3 ((lambda (x) (* x x)) 3)) é: A. Um erro de execução B. #<procedure> C. 9 D. 15 D. (b) Considere a seguinte interacção em Scheme: > (define x 1) > (define y 2) > (let ((x y)) (let ((y (+ x 2))) (* x y))) O resultado de avaliar a expressão let origina: A. Um erro de execução B. 6 C. 8 D. 2 C. 3. (1.5) Defina um procedimento anónimo em Scheme que recebe um argumento e devolve #t se o seu argumento for um inteiro ímpar, e devolve #f em caso contrário. O seu procedimento não deve usar expressões condicionais.

Número: Pág. 3 de 7 (lambda (x)(and (integer? x) (odd? x))) 4. De um modo sucinto, (a) (0.5) Diga o que é 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. (b) (0.5) Diga o que é um algoritmo. Uma sequência de passos, bem definida e sem ambiguidades, que, sendo seguida mecanicamente, garante atingir um dado objectivo. (c) (0.5) Diga o que é um procedimento. Uma sequência de instruções escritas numa linguagem de programação que definem como atingir um dado objectivo. (d) (0.5) Relacione os três conceitos anteriores. Um procedimento corresponde a um algoritmo escrito numa linguagem de programação. A execução de um procedimento origina um processo computacional. 5. (a) (1.5) Escreva um procedimento que calcula a soma dos dígitos ímpares de um número inteiro não negativo. Se o inteiro não tiver dígitos ímpares, o seu procedimento deve devolver zero. O seu procedimento não precisa de verificar se o argumento é válido. (define (soma-dig-impares n) (cond ((= n 0) 0) ((odd? (remainder n 10)) (+ (remainder n 10) (soma-dig-impares (quotient n 10)))) (else (soma-dig-impares (quotient n 10))))) (b) (1.5) O seu procedimento gera um processo recursivo ou iterativo? Justifique a sua resposta. (soma-dig-impares 12345) (+ 1 (soma-dig-impares 2345)) (+ 1 (soma-dig-impares 345)) (+ 1 (+ 3 (soma-dig-impares 45))) (+ 1 (+ 3 (soma-dig-impares 5))) (+ 1 (+ 3 (+ 5 (soma-dig-impares 0)))) (+ 1 (+ 3 (+ 5 0))) (+ 1 (+ 3 5)) (+ 1 8) 9 O processo gerado é recursivo, pois tem uma fase de expansão, correspondente à construção de uma cadeia de operações adiadas, seguida de uma fase de contracção, correspondente à realização dessas operações.

Número: Pág. 4 de 7 (c) (1.5) Se o procedimento gerar um processo recursivo, escreva um procedimento equivalente que gere um processo iterativo; se o procedimento gerar um processo iterativo, escreva um procedimento equivalente que gere um processo recursivo. (define (soma-dig-impares n) (define (soma-aux n res) (cond ((= n 0) res) ((odd? (remainder n 10)) (soma-aux (quotient n 10) (+ res (remainder n 10)))) (else (soma-aux (quotient n 10) res)))) (soma-aux n 0)) 6. Considere a seguinte estrutura de pares, designada por estrutura: 3 4 1 2 Diga o que é devolvido pelo interpretador do Scheme para cada uma das seguintes expressões. Se alguma expressão originar um erro, explique a razão do erro. (a) (0.5) (car estrutura) (1. 2) (b) (0.5) (car (cdr estrutura)) 3 (c) (0.5) (car (car (cdr estrutura))) erro, porque 3 não é um par. (d) (0.5) (pair? (cdr estrutura)) #t (e) (0.5) (lista? estrutura) #t 7. Considere o tipo período de tempo definido como se segue. Um período de tempo é constituído por 3 inteiros não negativos, correspondendo a um número de horas, um número de minutos, e um número de segundos. Tanto o número de minutos como o número de segundos são inferiores a 60. O tipo período de tempo deve disponibilizar as seguintes operações básicas: Construtor.

Número: Pág. 5 de 7 faz-tempo : inteiro inteiro inteiro período de tempo faz-tempo(h, m, s) devolve o período de tempo com h horas, m minutos, e s segundos. Selectores. horas-tempo : período de tempo inteiro horas-tempo(p) devolve o número de horas do período p. minutos-tempo : período de tempo inteiro minutos-tempo(p) devolve o número de minutos do período p. segundos-tempo : período de tempo inteiro segundos-tempo(p) devolve o número de segundos do período p. Reconhecedor. tempo? : universal lógico tempo?(arg) tem o valor verdadeiro, se arg é um período de tempo, e tem o valor falso, em caso contrário. Testes. tempos=? : período de tempo período de tempo lógico tempos=?(p 1, p 2 ) tem o valor verdadeiro, se p 1 e p 2 são períodos de tempo iguais, e tem o valor falso, em caso contrário. tempos<? : período de tempo período de tempo lógico tempos<?(p 1, p 2 ) tem o valor verdadeiro, se p 1 corresponde a um período de tempo inferior a p 2, e tem o valor falso, em caso contrário. (a) (0.5) Escolha uma representação interna para o tipo período de tempo. Um período de tempo é representado por um par em que o primeiro elemento corresponde ao número de horas, e o segundo elemento é um par, cujo primeiro elemento corresponde ao número de minutos, e o segundo ao número de segundos: <horas> <minutos> <segundos> (b) (2.0) Implemente as operações básicas, usando a representação que escolheu na alínea anterior. Não precisa de verificar a validade dos argumentos recebidos. (define (faz-tempo h m s) (cons h (cons m s))) (define (horas-tempo p) (car p)) (define (minutos-tempo p) (car (cdr p))) (define (segundos-tempo p) (cdr (cdr p))) (define (tempo? arg) (and (pair? arg) (pair? (cdr arg))

Número: Pág. 6 de 7 (inteiro-nao-negativo? (car arg)) (inteiro-nao-negativo<60? (car (cdr arg))) (inteiro-nao-negativo<60? (cdr (cdr arg))))) (define (inteiro-nao-negativo? n) (and (integer? n) (>= n 0))) (define (inteiro-nao-negativo<60? n) (and (integer? n) (>= n 0) (< n 60))) (define (tempos=? p1 p2) (and (= (car p1) (car p2)) (= (car (cdr p1)) (car (cdr p2))) (= (cdr (cdr p1)) (cdr (cdr p2))))) (define (tempos<? p1 p2) (let ((h1 (horas-tempo p1)) (m1 (minutos-tempo p1)) (s1 (segundos-tempo p1)) (h2 (horas-tempo p2)) (m2 (minutos-tempo p2)) (s2 (segundos-tempo p2))) (or (< h1 h2) (and (= h1 h2) (< m1 m2)) (and (= h1 h2) (= m1 m2) (< s1 s2))))) 8. (2.0) Escreva um procedimento, tempos-ordenados?, que recebe uma lista de elementos do tipo período de tempo, e devolve verdadeiro se a lista se encontrar ordenada por ordem crescente, e falso em caso contrário. Pode assumir que a lista nunca é vazia e que todos os períodos de tempo são diferentes. Respeite as barreiras de abstracção dos tipos lista e período de tempo. (define (tempos-ordenados? lst) (cond ((lista-vazia? (resto lst)) #t) ((tempos<? (primeiro lst) (primeiro (resto lst))) (tempos-ordenados? (resto lst))) (else #f))) 9. (2.0) Escreva um procedimento, folhas, que recebe uma árvore e devolve uma lista com as folhas da árvore. Utilize os tipos abstractos árvore e lista simplificada definidos nas aulas, respeitando as barreiras de abstracção. Pode usar, sem o definir, o procedimento junta definido nas aulas, que recebe duas listas e devolve a lista que contém os elementos da primeira lista seguidos dos elementos da segunda lista. Por exemplo, se o seu procedimento receber a árvore 1 2 3 4 5 6

Número: Pág. 7 de 7 deve devolver a lista (4 5 6) (a ordem dos elementos não é relevante). (define (folhas arv) (cond ((arv-vazia? arv) (nova-lista)) ((and (arv-vazia? (arv-esq arv)) (arv-vazia? (arv-dir arv))) (list (raiz arv))) (else (junta (folhas (arv-esq arv)) (folhas (arv-dir arv))))))