Fundamentos da Programação

Documentos relacionados
Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos de Programação

Fundamentos de Programação

Fundamentos da Programação

Fundamentos da Programação

Fundamentos de 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)

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

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

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

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

arv_esq(árv) recebe uma árvore, árv, e tem como valor a sua árvore esquerda. Se a árvore for vazia, o valor desta operação é indefinido.

Abstração de dados. Capítulo 10

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

1ª Avaliação Oficial Noturno

Programação imperativa

Fundamentos de Programação

Computação 1 - Python Aula 10 - Teórica: Estrutura de Dados - Dicionário. João Carlos, Carla Delgado, Ana Luisa Duboc 1/ 18

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

AULA 2: INTRODUÇÃO A PYTHON. Luís Feliphe Silva Costa

Elementos Básicos de Programação

Fundamentos de Programação

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

Textos de apoio às aulas práticas. Jaime Ramos, Francisco Miguel Dionísio

Abstração de dados. Capítulo 9

Elementos Básicos de Programação

1 a Lista Professor: Claudio Fabiano Motta Toledo Estagiário PAE: Jesimar da Silva Arantes

Estruturação de Procedimentos

Noções de algoritmos - Aula 1

Introdução à Programação. Ciclos 1ª parte

So she went on, wondering more and more at every step, as everything turned into a tree the moment she came up to it.

Nesta aula... Iteração indefinida. 1 Decisões em Python. 2 Funções lógicas. 3 Recursão. 4 Iteração. 5 Ciclo for ou while?

UNIVERSIDADE DA BEIRA INTERIOR

TCC 00308: Programação de Computadores I Introdução

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

Exercícios para Fundamentos da Programação

Fabio G. Cozman, Thiago Martins 2017

Algoritmos e Modelação Computacional. Paulo Mateus MEBiom LMAC 2018

Introdução à Programação

Inteligência Artificial

Exercícios para Fundamentos da Programação

Processamento da Informação

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

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

Programação I Aula 3 Primeiros programas

Abaixo iremos pormenorizar cada um de seus atributos:

Introdução à Programação / Programação I

1 Da aula teórica ao Java

Introdução à Programação / Programação I

IO.println(a+" * "+b+" = "+produto); } }

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

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

(a) Indique, em português, o que realiza a seguinte função. [4 pontos]

Estrutura de Dados. Diego Silveira Costa Nascimento

Introdução à Programação Aula 3 Primeiros programas

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

Programação Procedimental

SCC0124 Introdução à Programação para Engenharias

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

5. SEQUÊNCIAS E SOMAS

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

INF1005: Programação 1. Repetições. 08/03/10 (c) Paula Rodrigues 1

Paradigmas de Programação

Conceitos de Linguagens de Programação

Minicurso de Linguagem de Programação Python.

ao paradigma imperativo

CCM0118 Computação I Curso de Ciências Moleculares Turma 22 Segundo Semestre de 2012 Segunda Prova 25 de outubro de 2012

1 Expressões, valores e tipos 1. 2 Variáveis e atribuições 5. cálculo de expressões segue a estrutura de parênteses e as prioridades dos operadores

Errata da lista 1: Na página 4 (respostas), a resposta da letra e da questão 13 é {2, 3, 5, 7, 11, 13, 17} (faltou o número 17)

Máquinas de Turing - Computabilidade

Entrada e saída. Marco A L Barbosa malbarbo.pro.br. Departamento de Informática Universidade Estadual de Maringá

Fundamentosde Programação

Waldemar Celes e Roberto Ierusalimschy. 29 de Fevereiro de 2012

Curso: Análise e Desenvolvimento de Sistemas. (Conceitos Práticos de Lógica de Programação)

ÍNDICE. PREFÁCIO xv. 3 PROCESSOS GERADOS POR PROCEDIMENTOS Recursão Linear Cálculo de potências Cálculo de factoriais 91

Fundamentos de Programação

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

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

Linguagem Haskell. Riocemar S. de Santana

Universidade Federal de Mato Grosso do Sul. Lista de Exercícios 2

Instituto Federal de Educação, Ciência e Tecnologia do RN Câmpus Currais Novos. LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I

Desenvolvendo o Critério de Eisenstein computacionalmente

Python 3.x Estrutura de Repetição while

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

Noção de Computabilidade

Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e Tecnologia Bacharelado em Sistemas de Informação Estruturas de Dados I Lista II

Programação de Computadores

Proposta de teste de avaliação

Transcrição:

Fundamentos da Programação Exame 9 de Janeiro de 2015 09:00 11:00 1. De um modo sucinto, explique o que é: (a) (0.5) 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) 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 período de tempo finito com uma quantidade de esforço finita. (c) (0.5) A abstracção procedimental. A abstracção procedimental corresponde a abstrair do modo como uma função realiza o seu trabalho, considerando apenas o que ela faz. 2. O Python permite a utilização de três paradigmas de programação, a programação imperativa, a programação por objectos e a programação funcional. Apresente de uma forma sucinta as características principais de cada um destes paradigmas. (a) (0.5) Programação imperativa. Em programação imperativa, um programa é constituido por uma série de ordens dadas ao computador. A programação imperativa depende da instrução de atribuição e da utilização de ciclos. (b) (0.5) Programação por objectos. A programação por objectos baseia-se na utilização de objectos, entidades com estado interno associados a um conjunto de métodos que manipulam esse estado. (c) (0.5) Programação funcional. A programação funcional baseia-se na utilização de funções que devolvem valores que são utilizados por outras funções. Em programação funcional as operações de atribuição e os ciclos podem não existir.

Número: Pág. 2 de 7 3. (1.5) Escreva em Python a função calc_soma que recebe um número real e um número inteiro, x e n, e que calcula o valor da soma. 1+x + x2 2! + x3 xn +...+ 3! n! A sua função deve ter em atenção que o i-ésimo termo da soma pode ser obtido do termo na posição i 1, multiplicando-o por x/i. Não é necessário validar os valores dos argumentos. Por exemplo: >>> calc_soma(2, 3) 6.333333333333333 def calc_soma(x, n): soma = 1 termo = 1 i = 1 while i <= n: termo = termo * (x / i) soma = soma + termo i = i + 1 return soma 4. (1.5) Escreva em Python a função reduzir_por_chave que recebe uma lista de pares (chave, valor) e retorna a lista com a soma dos valores associados a cada chave. A sua função não tem de verificar a correcção do argumento. Por exemplo, Por exemplo, se receber a lista [( abc, 3), ( xxx, 5), ( abc, 10), ( xxx, 20)] deve devolver a lista [( xxx, 25), ( abc, 13)]. def reduzir_por_chave(lst): dict = {} for elem in lst: k = elem[0] if k in dict: dict[k] = dict[k]+elem[1] dict[k] = elem[1] res = [] for i in dict: res = res + [(i,dict[i])] return(res) 5. (1.5) Um número inteiro, n, diz-se triangular se existir um inteiro m tal que n = 1+2+...+(m 1)+m. Escreva uma função chamada triangular que recebe um número inteiro positivo n, e cujo valor é apenas se o número for triangular. No caso de n ser 0 deverá devolver False. Não é necessário validar o valor do argumento. Por exemplo,

Número: Pág. 3 de 7 >>> triangular(6) >>> triangular(8) False def triangular(n): soma = 1 i = 2 while soma <= n: if soma == n: return soma = soma + i i = i + 1 6. Um número primo é um número inteiro maior do que 1 que apenas é divisível por 1 e por si próprio. Por exemplo, 5 é primo porque apenas é divisível por si próprio e por um, ao passo que 6 não é primo pois é divisível por 1, 2, 3, e 6. (a) (1.5) Um método simples, mas pouco eficiente, para determinar se um número, n, é primo consiste em testar se n é múltiplo de algum número entre 2 e p n. Usando este processo, escreva uma função em Python chamada primo que recebe um número inteiro e tem o valor apenas se o seu argumento for primo. Não é necessário validar o valor do argumento. Suponha que a função sqrt já se encontra definida. Por exemplo, >>> primo(23) >>> primo(20) False def primo(n): if n in (0, 1): i = 2 raiz = sqrt(n) while i <= raiz: if n % i == 0: i = i + 1 return (b) (1.5) Um número n éon-ésimo primo se for primo e existirem n 1 números primos menores que ele. Usando a função primo do exercício anterior, escreva uma função com o nome n_esimo_primo que recebe como argumento um número inteiro, n, e devolve o n-ésimo número primo. Não é necessário validar o valor do argumento. Por exemplo, >>> n_esimo_primo(3) 5

Número: Pág. 4 de 7 def n_esimo_primo(n): cont = 0 num = 1 while cont!= n: num = num + 1 if primo(num): cont = cont + 1 return num 7. Considere a seguinte gramática em notação BNF: hfrasei ::= c hmeioi r hmeioi ::= hletrai + hletrai ::= a d (a) (0.5) Diga quais são os símbolos terminais e não terminais desta gramática. Símbolos terminais: c, a, d, r Símbolos não terminais: hfrasei, hmeioi, hletrai (b) (0.5) Descreva a linguagem definida por esta gramática. As frases começam pela letra c, terminam na letra r e entre estas dias letras podem ter qualquer número das letras a e d, existindo pelo menos uma destas duas letras. (c) (1.5) Escreva uma função em Python, chamada reconhece, que recebe como argumento uma cadeia de carateres e devolve verdadeiro se o seu argumento corresponde a uma frase da linguagem definida pela gramática e falso em caso contrário. Por exemplo, reconhece( cdr ) reconhece( cdaaaaaaddddddr ) reconhece( cdaaaaaaddddddra ) False def reconhece(frase): nbchars = len(frase) if frase[0]!= c or frase[-1]!= r or nbchars < 3: for i in range(1, nbchars-1): if frase[i] not in ( d, a ): return 8. (1.5) Escreva em Python a função parte que recebe como argumentos uma lista, lst, e um elemento, e, e que devolve uma lista de dois elementos, contendo na primeira posição a lista com os elementos de lst menores que e, e na segunda

Número: Pág. 5 de 7 posição a lista com os elementos de lst maiores ou iguais a e. Não é necessário validar os valores dos argumentos. Por exemplo, >>> parte([2, 0, 12, 19, 5], 6) [[2, 0, 5], [12, 19]] >>> parte([7, 3, 4, 12], 3) [[], [7, 3, 4, 12]] def parte(lst, el): menores = [] maiores = [] for e in lst: if e < el: menores = menores + [e] maiores = maiores + [e] return [menores, maiores] 9. (1.5) Escreva uma função recursiva, num_oc_lista, que recebe uma lista e um inteiro, e devolve o número de vezes que esse inteiro ocorre na lista e nas suas sublistas, se existirem. A sua função não tem de verificar a correcção dos argumentos. Por exemplo, >>> num_oc_lista([4, 5, 6], 5) 1 >>> num_oc_lista([3, [[3], 5], 7, 3, [2, 3]], 3) 4 def num_oc_lista(lst, num): if lst == []: return 0 elif lst[0] == num: return 1 + num_oc_lista(lst[1:], num) elif isinstance(lst[0], list): return (num_oc_lista(lst[0], num) + num_oc_lista(lst[1:], num)) return num_oc_lista(lst[1:], num) 10. (1.5) Usando recursão, escreva a função num_divisores que recebe um número inteiro positivo n, e devolve o número de divisores de n. No caso de n ser 0 deverá devolver 0. Não é necessário validar o valor do argumento. Por exemplo, >>> num_divisores(20) 6 >>> num_divisores(13) 2

Número: Pág. 6 de 7 def num_divisores_rec(n): def num_div_aux(i): if i > n: return 0 elif n % i == 0: return 1 + num_div_aux(i + 1) return num_div_aux(i + 1) return num_div_aux(1) 11. Suponha que desejava criar o tipo vetor em Python. Um vetor num referencial cartesiano pode ser representado pelas coordenadas da sua extremidade (x, y), estando a sua origem no ponto (0, 0). Podemos considerar as seguintes operações básicas para vetores: Construtor: vetor : real real 7! vetor vetor(x, y) tem como valor o vetor cuja extremidade é o ponto (x, y). Seletores: abcissa : vetor 7! real abcissa(v) tem como valor a abcissa da extremidade do vetor v. ordenada : vetor 7! real ordenada(v) tem como valor a ordenada da extremidade do vetor v. Reconhecedores: eh_vetor : universal 7! lógico eh_vetor(arg) tem valor verdadeiro apenas se arg é um vetor. eh_vetor_nulo : vetor 7! lógico eh_vetor_nulo(v) tem valor verdadeiro apenas se v é o vetor (0, 0). Teste: vetores_iguais : vetor vetor 7! lógico vetores_iguais(v 1,v 2 ) tem valor verdadeiro apenas se os vetores v 1 e v 2 são iguais. (a) (0.5) Defina uma representação para vetores utilizando dicionários. <[(x, y)] = { x : x, y : y}

Número: Pág. 7 de 7 (b) (1.5) Escreva em Python as operações básicas, de acordo com a representação escolhida. def vetor(x, y): return { x : x, y : y} def abcissa(v): return v[ x ] def ordenada(v): return v[ y ] def eh_vetor(x): if isinstance(x, dict) and len(x) == 2 and \ x in x and y in x and \ isinstance(x[ x ],float) and isinstance(x[ y ],float): return def eh_vector_nulo(v): return v[ x ] == 0 and v[ y ] == 0 def vectores_iguais(v1, v2): return v1[ x ] == v2[ x ] and v1[ y ] == v2[ y ] (c) (0.5) Usando as operações básicas, escreva uma função para determinar se um vetor é colinear com o eixo dos xx. def colinear_x(v): return ordenada(v) == 0