Fundamentos de Programação

Documentos relacionados
Fundamentos de Programação

Fundamentos de Programação

Fundamentos de Programação

Fundamentosde Programação

Estruturação de Procedimentos

Fundamentos de 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 de Programação

Fundamentos de Programação

Fundamentos da Programação

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

Programação imperativa

Fundamentos da Programação

Fundamentos da Programação

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 EM SCHEME:

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Tipo de argumentos. valor. argumentos

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

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

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

Procedimentos e Algorítmos Programas e Linguagens de Programação Tese de Church-Turing Formas de Representação de Linguagens

Algoritmos - 1. Alexandre Diehl. Departamento de Física - UFPel

Programação e Computação para Arquitectura 2015/2016

Introdução à Programação

EXPRESSÕES ARITMÉTICAS PARTE 1

UNIVERSIDADE TÉCNICA DE LISBOA INSTITUTO SUPERIOR TÉCNICO

PROCURA E PLANEAMENTO

Python 3.x Estrutura de Repetição while

Fundamentos de Programação

Aula prática 5. Funções Recursivas

Fundamentos da Programação de Computadores

Fundamentos da Programação

Algoritmos e Lógica de Programação. 6ª Lista de Exercícios Comandos de Repetição

Análise e Complexidade de Algoritmos

Pragmática das Linguagens de

Programação Procedimental

Técnicas de projeto de algoritmos: Indução

Programação Orientada a Objetos. Programação Funcional

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

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

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

Inteligência Artificial

Tuplos e Ciclos Contados

Métodos Numéricos - Notas de Aula

ANÁLISE DE ALGORITMOS: PARTE 1. Prof. André Backes. Como resolver um problema no computador? Precisamos descrevê-lo de uma forma clara e precisa

Variáveis e instruções de repetição

Exercícios: Vetores e Matrizes

Conceitos de Linguagem de Programação - 2

AGRUPAMENTO DE ESCOLAS D. JOSÉ I - VRSA MATEMÁTICA 5.º ANO 2015/16

Algoritmo. Exemplo. Definição. Programação de Computadores Comparando Algoritmos. Alan de Freitas

Inteligência Artificial

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

Trabalhos de avaliação da cadeira de Introdução à Programação. Ana Cardoso Cachopo

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

Aula 3: Algoritmos: Formalização e Construção

Algoritmos - 1. Alexandre Diehl. Departamento de Física - UFPel

Lógica de Programação

Semântica Denotacional

Exercícios Repetição

Programação científica C++

PROCURA E PLANEAMENTO

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

Aulas Anteriores. Detalhes da linguagem de programação

tipoveiculo = (bicicleta, motociclo, motorizada, automovel, autocomreb, camioneta, autocarro, camiao, reboque); veiculo : tipoveiculo;

15/03/2018. Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções. Prof. Ariel da Silva Dias -

Matemática Computacional

Tipos de Dados e Variáveis

Funções. Capítulo (2) Considere a seguinte interacção em Python: >>> def f1(x):... return x * x... >>> f1(5) 25 >>> f2 = f1 >>>

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Resolução Numérica de Equações (Parte II)

puras um ou mais apenas mesmos

Introdução à Programação

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

Primeira Lista de Exercícios

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto

Computação Fiável Indução - exercícios básicos

SSC304 Introdução à Programação Para Engenharias

Introdução a Algoritmos Parte 08

Exercícios para Fundamentos da Programação

Licenciatura em Informática Introdução a Ciência dos Computadores 1º Ano

Inteligência Artificial Alameda e Taguspark

Técnicas de análise de algoritmos

Exercícios: Comandos de Repetição

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Elementos Básicos de Programação

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

Noção de Computabilidade

UNIVERSIDADE LUSÓFONA DE HUMANIDADES E TECNOLOGIAS 1º Semestre 2011/2012

Transcrição:

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 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 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 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 9. (1.0) Considere a definição da seguinte função: Ï 1 se n = 1 Ô f ( n) = Ì 2 se n = 2 Ô Ó f( n - 1) n se n > 2 Por exemplo, f ( 4) = f ( 3) 4 = ( f ( 2) 3 ) 4 = ( 2 3 ) 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 1 2 +2 2 +3 2. (define (soma-quadrado-elementos lst) (if (lista-vazia? lst) 0 (+ (quadrado (primeiro lst)) (soma-quadrado-elementos (resto lst)))))

Pág. 6/8 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 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) (= (+ (soma-digitos (original n)) (controle n)) 9)) 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 (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) = n 2 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)))