Fundamentos da Programação

Documentos relacionados
OPERAÇÕES COM FRAÇÕES

Simulado de Linguagem de Programação Java

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

Curso de Formação de Oficiais Conhecimentos Específicos ENGENHARIA DE COMPUTAÇÃO CADERNO DE QUESTÕES

Departamento de Informática - PUC-Rio INF 1005 Programação I P1 22/09/2010 Nota

Inteligência Artificial

Carlos de Salles Soares Neto Segundas e Quartas, 17h40 às 19h10

Módulo de Equações do Segundo Grau. Equações do Segundo Grau: Resultados Básicos. Nono Ano

Aula 5. Uma partícula evolui na reta. A trajetória é uma função que dá a sua posição em função do tempo:

Orientação a Objetos

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

PESQUISA OPERACIONAL -PROGRAMAÇÃO LINEAR. Prof. Angelo Augusto Frozza, M.Sc.

Módulo de Princípios Básicos de Contagem. Segundo ano

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

Curso C: Ponteiros e Arrays

UNIVERSIDADE DO TOCANTINS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS PRÁTICA EM PROGRAMAÇÃO DE SISTEMAS

Árvores. ! utilizada em muitas aplicações. ! modela uma hierarquia entre elementos. ! O conceito de árvores está diretamente ligado à recursão

Manual do Desenvolvedor Geração de Tokens

Estruturas de Repetição

2) Escreva um algoritmo que leia um conjunto de 10 notas, armazene-as em uma variável composta chamada NOTA e calcule e imprima a sua média.

Recorrendo à nossa imaginação podemos tentar escrever números racionais de modo semelhante: 1 2 =

Universidade Federal de Goiás Campus Catalão Departamento de Matemática

Fundamentos de Bancos de Dados 3 a Prova Caderno de Questões

I. Conjunto Elemento Pertinência

Sistemas Numéricos. Tiago Alves de Oliveira

Fundamentos de Programação. Diagrama de blocos

a) 2 b) 3 c) 4 d) 5 e) 6

Aula 11: Desvios e Laços

LIBERAÇÃO DE ATUALIZAÇÃO CORDILHEIRA

tipo e tamanho e com os "mesmos" elementos do vetor A, ou seja, B[i] = A[i].

PHP Estruturas de repetição

[RESOLUÇÃO] Economia I; 2012/2013 (2º semestre) Prova da Época Recurso 3 de Julho de 2013

Prof. José Maurício S. Pinheiro - UGB

SICI MANUAL PARA ARQUIVO XML (UPLOAD)

CCS Cadastro de Clientes do SFN. Roteiro de Testes. Versão 2.1.7

ISS Eletrônico. Formato de Arquivos para Transmissão de Documentos Declarados através do aplicativo OFFLINE. Extensão do Arquivo JUNHO2006.

Banco de Dados. Banco de Dados Parte 2. Alcides Pamplona Alcides Pamplona Linguagem de Programação CESBD 2010

Algoritmos e Programação : Conceitos e estruturas básicas. Hudson Victoria Diniz

Programação de Computadores I Estruturas de Repetição PROFESSORA CINTIA CAETANO

Pressuposições à ANOVA

Prática. Exercícios didáticos ( I)

Gerenciamento do Escopo do Projeto (PMBoK 5ª ed.)

Algoritmos APRENDENDO A PROGRAMAR COM C#

AULA 07 Distribuições Discretas de Probabilidade

Arquivo de retorno Boleto Bancário Formato XML

Modelo Entidade Relacionamento (MER) Professor : Esp. Hiarly Alves

Seqüências. George Darmiton da Cunha Cavalcanti CIn - UFPE

SISTEMAS OPERACIONAIS. 3ª. Lista de Exercícios

Probabilidade. Evento (E) é o acontecimento que deve ser analisado.

Tópicos Avançados em Banco de Dados Dependências sobre regime e controle de objetos em Banco de Dados. Prof. Hugo Souza

FÍSICA EXPERIMENTAL 3001

UNIVERSIDADE DO VALE DO RIO DOS SINOS - UNISINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS - CENTRO 06. Funções, variáveis, parâmetros formais

Gabarito de Matemática do 6º ano do E.F.

Lógica para computação Professor Marlon Marcon

Figura 4.1: Diagrama de representação de uma função de 2 variáveis

Compliance. Título: Manual de Política de Rateio de Ordens. Assunto: Rateio de ordens para os fundos. Data: Abril 2016.

Tutorial Extra sobre C. Felipe Santos da Silva

Expressões de sequencias

TESTES SOCIOMÉTRICOS

Aula 15 Amplificadores Operacionais (pág. 453 a 459)

MC Teste de Mesa e Comandos Repetitivos

PROGRAMAÇÃO DE COMPUTADORES

OBSERVAÇÕES: EXERCÍCIOS

FastCube 2.0 Programmer Manual

Formas de Pagamento Resumida Vendas Vendedor Vendas Vendedor Resumido Vendas Vendedor Caixa Vendas por Artigos...

Introdução à orientação a objetos

Comandos de Desvio 1

Emparelhamentos Bilineares Sobre Curvas

10. CPU (Central Processor Unit) Conjunto das instruções Estrutura interna Formato das instruções...

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2

UTILIZAÇÃO DE RECURSOS AVANÇADOS DO EXCEL EM FINANÇAS (PARTE III): GERENCIAMENTO DE CENÁRIOS

Entropia, Entropia Relativa

Conteúdo programático

Ciclo com Contador : instrução for. for de variável := expressão to. expressão do instrução

2 Workshop processamento de artigos em serviços de saúde Recolhimento de artigos esterilizados: é possível evitar?

Dureza Rockwell. No início do século XX houve muitos progressos. Nossa aula. Em que consiste o ensaio Rockwell. no campo da determinação da dureza.

1 Cálculo do valor à vista

Álgebra Linear Aplicada à Compressão de Imagens. Universidade de Lisboa Instituto Superior Técnico. Mestrado em Engenharia Aeroespacial

Registro de Retenções Tributárias e Pagamentos

Leiaute de arquivos XML para Carta-Circular 3254

Algoritmos e Estruturas de Dados I. Variáveis Indexadas. Pedro O.S. Vaz de Melo

UNIMINAS Só é necessário o armazenamento de: Sinal da mantissa: - (menos). Valor da mantissa: Sinal do expoente: -(na realidade, háh

Capítulo 1. Importação de Dados de Instituições Financeiras - Arquivo TXT 3

TUTORIAL MATLAB Victor Breder 2016

Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de 2009

Introdução ao cálculo-λ

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

M =C J, fórmula do montante

ALGORITMOS E COMPLEXIDADE PROBLEMAS E ALGORITMOS

Disponibilizada a rotina Vale Presente (LOJA830) no módulo Controle de Lojas (SIGALOJA), assim como já é utilizada no módulo Front Loja (SIGAFRT).

MATÉRIA TÉCNICA APTTA BRASIL SENSORES MAGNETO-RESTRITIVOS UM CRUZAMENTO DE DOIS TIPOS DE SENSORES CONHECIDOS.

Apontamentos de matemática 5.º ano - Múltiplos e divisores

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Olimpíada Brasileira de Raciocínio Lógico Nível III Fase II 2014

Introdução à Programação de Computadores Parte I

Se inicialmente, o tanque estava com 100 litros, pode-se afirmar que ao final do dia o mesmo conterá.

FATURA ELETRÔNICA DO PRESTADOR Layout do Arquivo Texto Versão 1.1.1

Os passos a seguir servirão de guia para utilização da funcionalidade Acordo Financeiro do TOTVS Gestão Financeira.

POTENCIAÇÃO, RADICIAÇÃO E LOGARITMAÇÂO NOS NÚMEROS REAIS. Potenciação 1

Transcrição:

Fundamentos da Programação Solução do Exame 13 de Janeiro de 2017 09:00 11:00 1. Indique se cada uma das seguintes afirmações é verdadeira ou falsa. No caso de ser falsa, justifique de forma sucinta. (a) (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. Verdadeira. (b) (0.5) Um processo computacional dita a execução de um programa. Falsa. O programa é que dita a evolução do processo computacional. (c) (0.5) No uso de tipos abstractos de dados (TADs) o programador não pode conhecer a representação interna dos elementos do tipo. Falsa, o programador pode conhecer a representação interna, mas não a pode utilizar. 2. (1.0) Escreva uma função em Python com o nome conta_menores que recebe um tuplo contendo números inteiros e um número inteiro e que devolve o número de elementos do tuplo que são menores do que esse inteiro. Não é necessário verificar a validade dos argumentos. Por exemplo, >>> conta_menores((3, 4, 5, 6, 7), 5) 2 >>> conta_menores((3, 4, 5, 6, 7), 2) 0 def conta_menores(t, num): res = 0 for e in t: if e < num: res = res +1 return res

Número: Pág. 2 de 8 3. (1.5) Escreva uma função com o nome soma_divisores que recebe um número inteiro positivo n, e tem como valor a soma de todos os divisores de n. No caso de n ser 0 deverá devolver 0. Por exemplo, >>> soma_divisores(20) 42 >>> soma_divisores(13) 14 def soma_divisores(n): res = 0 for i in range(1, n + 1): if n % i == 0: res = res + i return res 4. Considere a seguinte gramática em notação BNF, cujo símbolo inicial é S hsi :: = hai a hai :: = a hbi hbi :: = hai a b (a) (0.5) Diga quais são os símbolos terminais e quais são os símbolos não terminais da gramática. Símbolos terminais: a, b Símbolos não terminais: hsi, hai, hbi (b) (0.5) Descreva informalmente as frases que pertencem à linguagem. As frases da linguagem começam com um número arbitrários de as (mas pelo menos um), seguidas por um b, seguidas pelo mesmo número de as que aparecem antes do b. (c) (1.5) Escreva a função reconhece que recebe uma cadeia de caracteres e devolve True se o seu argumento corresponde a uma frase gerada pela gramática e False em caso contrário. A sua função deve verificar a correcção do argumento. def reconhece(frase): if isinstance (frase, str): i, nas = 0, 0 while i < len(frase) and frase[i] == a : nas = nas + 1 i = i + 1 if nas == 0: return False

Número: Pág. 3 de 8 return frase == a * nas + b + a * nas return False 5. (1.5) Escreva a função cria_lista_multiplos que recebe um número inteiro positivo, e devolve uma lista com os dez primeiros múltiplos desse número. A sua função deve testar se o seu argumento é um número inteiro positivo e dar uma mensagem de erro adequada em caso contrário. Considere que zero é múltiplo de todos os números. Por exemplo, >>> cria_lista_multiplos(6) [0, 6, 12, 18, 24, 30, 36, 42, 48, 54] def cria_lista_multiplos(n): res = [] for i in range(10): res = res + [i*n] return res 6. (1.5) Escreva a função recursiva parte que recebe uma lista de números e um número e que devolve uma lista de duas listas, a primeira lista contém os elementos da lista original menores que o número dado (pela mesma ordem) e a segunda lista contém os elementos da lista original maiores ou iguais que o número dado (pela mesma ordem). Não é necessário verificar a corecção dos dados de entrada. Sugestão: Use uma função auxiliar. Por exemplo, >>> parte([3, 5, 1, 4, 5, 8, 9], 4) [[3, 1], [5, 4, 5, 8, 9]] def parte (lst, el): def parte_aux(lst, el, menores, maiores): if lst == []: return [menores, maiores] elif lst[0] < el: return parte_aux(lst[1:], el, menores + [lst[0]], maiores) return parte_aux(lst[1:], el, menores, maiores + [lst[0]]) return parte_aux(lst, el, [], []) 7. (1.0) Escreva a função max_div que recebe dois inteiros positivos, n e d, e que devolve o inteiro resultante de dividir n pela maior potência de d pela qual n é divisível. Não é necessário verificar a correcção dos argumentos. Por exemplo, >>> max_div(300, 2) 75 # a maior potência de 2 é 4 >>> max_div(75, 3)

Número: Pág. 4 de 8 25 # a maior potência de 3 é 3 >>> max_div(75, 2) 75 # 75 não é divisível por nenhuma potência de 2 def max_div(n, d): while n % d == 0: n = n//d return n 8. Os números "feios" são aqueles em que os únicos divisores primos são 2, 3 ou 5. Por convenção, o número 1 é feio. Os 10 primeiros números feios são 1, 2, 3, 4, 5, 6, 8, 9, 10 e 12. Para verificar se um número é feio, divide-se sucessivamente o número pelas maiores potências possíveis de 2, 3 e 5. Se o resultado for 1, o número é feio. Seguindo o exemplo da pergunta anterior, 300 é feio. (a) (1.0) Recorrendo à função max_div da pergunta anterior, escreva a função, e_feio que recebe um inteiro positivo, n, e devolve True se n for feio e False em caso contrário. Não é necessário verificar a correcção do argumento. Por exemplo, >>> e_feio(5) True >>> e_feio(11) False def e_feio(n): for d in (2, 3, 5): n = max_div(n, d) return n == 1 (b) (1.0) Recorrendo à função e_feio da alínea anterior, escreva a função n_esimo_feio que recebe um inteiro positivo, n, e que devolve o n-ésimo número feio. Não é necessário verificar a correcção do argumento. Por exemplo, >>> n_esimo_feio(1) 1 >>> n_esimo_feio(10) 12 def n_esimo_feio(n): i = 1 cont = 1 while cont < n: i = i + 1 if e_feio(i): cont = cont + 1 return i 9. (1.0) Utilizando alguns (ou todos) os funcionais sobre listas (filtra, transforma, acumula) escreva uma função que devolve a soma dos quadrados dos elementos de uma lista. O corpo da sua função apenas pode ter uma instrução return.

Número: Pág. 5 de 8 def soma_quadrados_lista(lst): return acumula(lambda x, y: x + y, \ transforma(quadrado, lst)) 10. (1.0) Escreva uma função em Python que recebe um dicionário cujos valores associados às chaves correspondem a listas de inteiros e que devolve o dicionário que se obtém invertendo o dicionário recebido, no qual as chaves são os inteiros que correspondem aos valores do dicionário original e os valores são as chaves do dicionário original às quais os valores estão associados. Por exemplo, >>> inverte_dic({ a : [1, 2], b : [1, 5], c : [9], d : [4]}) {1: [ a, b ], 2: [ a ], 4: [ d ], 5: [ b ], 9: [ c ]} def inverte_dic(d): res = {} for e in d: for v in d[e]: if v in res: res[v] = res[v] + [e] res[v] = [e] return res 11. Suponha que quer representar o tempo, dividindo-o em horas e minutos. No tipo tempo o número de minutos está compreendido entre 0 e 59, e o número de horas apenas está limitado inferiormente a zero. Por exemplo 546:37 é um tempo válido. As operações básicas do tipo tempo são as seguintes: Construtor: cria_tempo : N 0 N 0 7! tempo cria_tempo(h, m), em que h 0 e 0 apple m apple 59 tem como valor o tempo h : m. Seletores: horas : tempo 7! N 0 horas(t) tem como valor as horas do tempo t. minutos : tempo 7! N 0 minutos(t) tem como valor os minutos do tempo t. Reconhecedores: eh_tempo : universal 7! lógico eh_tempo(arg) tem o valor verdadeiro apenas se arg é um tempo. Teste: tempos_iguais : tempo tempo 7! lógico tempos_iguais(t 1,t 2 ) tem o valor verdadeiro apenas se os tempos t 1 e t 2 são iguais. (a) (0.5) Escolha uma representação para o tipo tempo. Dado que um tempo é uma constante, usamos tuplos para o representar Re[h : m] = (h, m)

Número: Pág. 6 de 8 (b) (1.0) Escreva em Python as operações básicas, de acordo com a representação escolhida. def cria_tempo(h, m): if isinstance(h, int) and isinstance(m, int): if h >= 0: if 0 <= m <= 59: return (h, m) raise ValueError( os minutos devem estar compreendidos entre raise ValueError ( as horas devem ser um número positivo ) raise ValueError ( os componentes do tempo devem ser inteiros ) def horas(t): return t[0] def minutos(t): return t[1] def eh_tempo(x): return isinstance(x, tuple) and len(x) == 2 and \ isinstance(x[0], int) and isinstance(x[1], int) and \ x[0] >= 0 and 0 <= x[1] <= 59 def tempos_iguais(t1, t2): return t1 == t2 def escreve_tempo(t): h = str(t[0]) if t[1] < 10: m = 0 + str(t[1]) m = str(t[1]) print(h + : + m) (c) (1.0) Com base nas operações básicas do tipo tempo, escreva a função de alto nível depois : tempo tempo 7! lógico depois(t 1,t 2 ) tem o valor verdadeiro apenas se t 1 corresponder a um instante de tempo posterior a t 2. def depois(t1, t2): return horas(t1) * 60 + minutos(t1) > hotas(t2) * 60 + minutos(t2) 12. Considere a seguinte função definida para inteiros não negativos: n se 0 apple n<3 f(n) = f(n 1) + 2 f(n 2) + 3 f(n 3) se n 3 (a) (1.0) Escreva em Python uma função recursiva que calcula o valor desta função. A sua função deve testar, de modo eficiente, a correcção do argumento. Por exemplo,

Número: Pág. 7 de 8 >>> f(20) 10771211 >>> f(-2) ValueError: f: o argumento deve ser um inteiro não negativo def f(n): def f_aux(n): if n < 3: return n return f_aux(n-1) + 2 * f_aux(n-2) + 3 * f_aux(n-3) if isinstance(n, int) and n >= 0: return f_aux(n) raise ValueError( f: o argumento deve ser + \ um inteiro não negativo ) (b) (0.5) Diga, justificando, qual o tipo de processo gerado por esta função. É um processo recursivo em árvore pois a versão chama três versões de si próprio. (c) (1.5) Como pode verificar, a sua função calcula várias vezes o mesmo valor quando chamada com um argumento superior a 3. Para evitar este problema, podemos definir uma classe, mem_f, cujo estado interno contém informação sobre os valores de f já calculados, apenas calculando um novo valor quando este ainda não é conhecido. Esta classe possui um método val que calcula o valor de f para o inteiro que é seu argumento e um método mem que mostra os valores memorizados. Por exemplo, >>> fm = mem_f() >>> fm.val(8) 1082 >>> fm.mem() {0: 0, 1: 1, 2: 2, 3: 7, 4: 17, 5: 52, 6: 137, 7: 397, 8: 1082} class mem_f: def init (self): self.f = {0: 0, 1: 1, 2: 2} def val(self, n): def val_aux(n): if n in self.f: return self.f[n] f_n_1 = val_aux(n-1) f_n_2 = val_aux(n-2) f_n_3 = val_aux(n-3) self.f[n] = f_n_1 + 2 * f_n_2 + 3 * f_n_2 return self.f[n]

Número: Pág. 8 de 8 if isinstance(n, int) and n >= 0: return val_aux(n) raise ValueError( f: o argumento deve ser + \ um inteiro não negativo ) def mem(self): return self.f