Fundamentos da Programação

Documentos relacionados
Fundamentos da Programação

Fundamentos da Programação

Estrutura de Dados. Diego Silveira Costa Nascimento

Estruturas lineares. Capítulo 13. Para os exercícios deste capítulo, considere definidos os tipos:

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

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

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

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

Revisão: Tipo Abstrato de Dados Recursividade

Variáveis e Entrada de Dados Marco André Lopes Mendes marcoandre.googlepages.

Algoritmos e Estrutura de Dados Aula 08 Pilhas

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

8. Árvores. Fernando Silva DCC-FCUP. Estruturas de Dados. Fernando Silva (DCC-FCUP) 8. Árvores Estruturas de Dados 1 / 38

8. Árvores. Fernando Silva. Estruturas de Dados DCC-FCUP. Fernando Silva (DCC-FCUP) 8. Árvores Estruturas de Dados 1 / 38

1.a) Qual a diferença entre uma linguagem de programação de alto nível e uma linguagem de programação de baixo nível?

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

TÉCNICO DE INFORMÁTICA - SISTEMAS

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

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

Introdução à Programação. Vanessa Braganholo

Introdução à Programação

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?

Lista de Figuras Figura 1 1: Figura 1 2: Figura 1 3: Figura 1 4: Figura 1 5: Figura 1 6: Figura 1 7: Figura 2 1: Figura 2 2: Figura 2 3: Figura 2 4:

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Introdução a Programação. Curso: Sistemas de Informação Programação I José R. Merlin

Fundamentos da Programação. Ano lectivo , 2 o Semestre Projecto Primeira Parte 1. Nim

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

Aula prática 5. Funções Recursivas

Estruturação de Procedimentos

Aula 7 e 8 Filas e suas Aplicações. Prof. Leticia Winkler

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

S U M Á R I O. Definição de Estrutura de Dados. Vetores. Listas Ligadas. Pilhas. Filas

1. Listas sequenciais versus listas ligadas. Lista sequencial

Inteligência Artificial

PRIMEIROS PASSOS COM PYTHON. Prof. Msc. Luis Filipe Alves Pereira 2015

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

CAP Exame de Admissão 16/12/2013. Instruções Gerais (leia atentamente)

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Programação Funcional Aulas 5 & 6

Variáveis, Tipos de Dados e Operadores

Linguagens de Programação Princípios e Paradigmas

5. Expressões aritméticas

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Introdução a Programação

Uma Questão de Estilo Elementos de Estilo Java

Pilhas. ser acessada somente por uma de suas extremidades. pelo topo. S Uma pilha é uma estrutura linear de dados que pode

INTELIGÊNCIA ARTIFICIAL 2008/09

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

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

Conceitos de Linguagens de Programação

Estruturas de Dados Encadeadas

APONTAMENTOS DE PASCAL

Capítulo 7. Expressões e Sentenças de Atribuição

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

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

Principais paradigmas de programação. Programação imperativa Programação funcional Programação lógica Programação OO

Teoria da Computação. 2006/2007 Trabalho prático nº 1. Trabalho realizado por: Pedro Oliveira ( ) Rui Costa ( ) Turma: TP1

Operadores. Tipo de operadores. Aritméticos. Relacionais. Lógicos. Bit a bit. Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc.

EAD PILHA - DEFINIÇÃO

AVALIAÇÃO DE CONHECIMENTO ESPECÍFICO

Capítulo 2 Operadores. A função scanf()

Árvores Binárias. 16/11 Representação e Implementação: Encadeada Dinâmica O TAD

Exercícios de Excel com Programação em VBA. Luís Vieira Lobo

Programação. Folha Prática 5. Lab. 5. Departamento de Informática Universidade da Beira Interior Portugal. Copyright 2010 All rights reserved.

Compiladores - Gramáticas

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Lógica de Programação

Árvores Binárias. 9/11 e 11/11 Conceitos Representação e Implementação

Variáveis Tipos de Dados. APROG (Civil) Aula 2

MAC2166 Introdução à Computação

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

Transcrição:

Fundamentos da Programação Segundo Teste 10 de Janeiro de 2014 09:00 10:30 Nome: Número: Esta prova, individual e sem consulta, tem 8 páginas com 12 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. 1.0 3. 1.5 4. 1.0 5. 1.5 6. 1.5 7. 1.5 8. 3.0 9. 1.5 10. 2.0 11. 3.0 12. 1.5 Total 20.0

Número: Pág. 2 de 8 1. (1.0) Diga quais as fases por que passa o desenvolvimento de um programa e o que se faz em cada uma delas. Análise do problema. O programador, juntamente com o cliente, estuda o problema a resolver com o objectivo de determinar exactamente o que o programa deve fazer. Desenvolvimento de uma solução. Determinação de como vai ser resolvido o problema. Desenvolvimento de um algoritmo e definição abstracta dos tipos de informação usados. Deve usar-se a metodologia do topo para a base. Codificação da solução. Tradução do algoritmo para uma linguagem de programação, e implementação dos tipos de informação. Depuração, i.e., correcção de erros sintácticos e semânticos. Testes. Definição de uma bateria de testes com o objectivo de garantir" que o programa funciona correctamente em todas as situações possíveis. Manutenção. Fase que decorre depois do programa estar em funcionamento. A manutenção é necessária por dois tipos de razões: a descoberta de erros ou a necessidade de introduzir modificações e actualizações nas especificações do programa. 2. (1.0) Explique em que consiste a abstracção de dados, usando os termos barreiras de abstracção, encapsulação da informação e anonimato da representação. A abstracção de dados consiste em separar a o modo como os dados são utilizados do modo como os dados são representados. Para isso definem-se camadas conceptuais lidando com cada um destes aspectos estando estas camadas separadas por "barreiras de abstracção" que definem o modo como os programas acima da barreira podem comunicar com os programas que se encontram abaixo da barreira. Idealmente, os programas que se encontram a um dado nível de abstracção contêm toda a informação necessária para lidar com um certo tipo de dados, a informação está "encapsulada" dentro desta camada conceptual, e escondem das restantes partes do programa o modo como a informação está representada, o que é conhecido por "anonimato da representação". 3. 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. 3 de 8 4. (1.0) Considere as estruturas de informação cujo comportamento é caracterizado por LIFO e FIFO. Explique o significado destes termos e diga quais as estruturas de informação a que estão associados. LIFO significa "Last In First Out" e está associado ao tipo pilha. FIFO significa "First In First Out" e está associado ao tipo fila. 5. (1.5) Escreva uma função recursiva chamada soma_quadrados_digitos que recebe como argumento um número inteiro não negativo n, e devolve a soma dos quadrados dos dígitos de n. A sua função não tem que verificar a correcção do argumento. Por exemplo, >>> soma_quadrados_digitos(322) 17 def soma_quadrados_digitos(num): if num == 0: return 0 digito = num % 10 return digito * digito +\ soma_quadrados_digitos(num // 10) 6. (1.5) Escreva uma função recursiva, numero_ocorrencias_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 que verificar a correcção dos argumentos. Por exemplo, >>> numero_ocorrencias_lista([4, 5, 6], 5) 1 >>> numero_ocorrencias_lista([3, [[3], 5], 7, 3, [2, 3]], 3) 4 def numero_ocorrencias_lista2(lst, num): if lst == []: return 0 elif lst[0] == num: return 1 + numero_ocorrencias_lista2(lst[1:], num) elif isinstance(lst[0], list): return (numero_ocorrencias_lista2(lst[0], num) + numero_ocorrencias_lista2(lst[1:], num)) return numero_ocorrencias_lista2(lst[1:], num) 7. (1.5) Escreva uma função todos_lista que recebe uma lista e um predicado unário, e devolve verdadeiro caso todos os elementos da lista satisfaçam o predicado e falso no caso contrário. A sua função não tem que verificar a correcção dos argumentos. Por exemplo,

Número: Pág. 4 de 8 >>> todos_lista([4, 5, 6], lambda x: x > 5) False >>> todos_lista([4, 5, 6], lambda x: x >= 4) True def todos_lista(lst, pred): for el in lst: if not(pred(el)): return False return True 8. Escreva uma função soma_divisores que recebe um número inteiro não negativo n, e devolve a soma de todos os divisores de n. No caso de n ser 0 deverá devolver 0. A sua função não tem que verificar a correcção do argumento. Por exemplo, >>> soma_divisores(20) 42 >>> soma-divisores(13) 14 (a) (1.0) Usando recursão com operações adiadas. def soma_divisores(n): def soma_aux(n, d): if d == 0: return 0 elif n % d == 0: return d + soma_aux(n, d - 1) return soma_aux(n, d - 1) return soma_aux(n, n) (b) (1.0) Usando recursão sem operações adiadas ou de cauda. def soma_divisores(n): def soma_aux(n, d, soma): if d == 0: return soma elif n % d == 0: return soma_aux(n, d - 1, soma + d) return soma_aux(n, d - 1, soma) return soma_aux(n, n, 0) (c) (1.0) Usando um processo iterativo e um ciclo while.

Número: Pág. 5 de 8 def soma_divisores(n): soma = 0 d = n while d > 0: if n % d == 0: soma = soma + d d = d - 1 return soma 9. (1.5) Escreva uma função, cujo argumento é o nome de um ficheiro de texto, que devolve o número de emoticons :-)" que existem no ficheiro que é seu argumento. As linhas do ficheiro podem conter mais do que um emoticon. Por exemplo, se tst1.txt corresponder ao ficheiro: Teste com alguns destes emoticons :-) :-) :-) numa :-) linha e outro :-) na linha seguinte e se tst2.txt corresponder ao ficheiro: Teste com alguns destes emoticons :-) :-) :-) numa :- ) linha e outro :-) na linha seguinte Podemos obter a interacção: >>> emoticons( tst1.txt ) 5 >>> emoticons( tst2.txt ) 4 A sua função deverá abrir o ficheiro (não é necessário usar encoding) e fechá-lo antes de terminar. def emoticons(ficheiro): cont=0 entrada = open(ficheiro, r ) linha = entrada.readline() while (linha!= ): i=0 l=len(linha) while i < l-3: if linha[i] == : and \ linha[i+1] == - and \ linha[i+2] == ) : cont = cont+1 i=i+1 linha = entrada.readline() entrada.close() return cont

Número: Pág. 6 de 8 10. (2.0) Crie a classe garrafa cujo construtor recebe a capacidade da garrafa em litros. A garrafa inicialmente será criada vazia. Os outros métodos suportados pela classe são: capacidade, que devolve a capacidade total da garrafa; nivel, que devolve o volume de líquido presente na garrafa; despeja, que recebe a quantidade de líquido a remover da garrafa, em litros. Se a quantidade exceder o volume presente na garrafa, o volume presente na garrafa passa a ser 0. enche, que recebe a quantidade de líquido a colocar na garrafa. Se a quantidade de líquido a colocar na garrafa fizer com que esta ultrapasse a sua capacidade, o volume presente na garrafa passa a ser igual à sua capacidade. Por exemplo, >>> g1 = garrafa(1.5) >>> g1.nivel() 0 >>> g1.capacidade() 1.5 >>> g1.despeja(2) >>> g1.nivel() 0 class garrafa: def init (self, capacidade): if isinstance(capacidade, (int, float)) and \ capacidade > 0: self.nivel_actual = 0 self.volume_total = capacidade raise ValueError( garrafa: capacidade deve ser numero positivo ) def nivel(self): return self.nivel_actual def capacidade(self): return self.volume_total def despeja(self, volume): if volume > self.nivel_actual: self.nivel_actual = 0 self.nivel_actual = self.nivel_actual - volume def enche(self, volume): if self.nivel_actual + volume > self.volume_total: self.nivel_actual = self.volume_total self.nivel_actual = self.nivel_actual + volume

Número: Pág. 7 de 8 11. Considere que tem disponíveis as operações básicas do tipo abstracto árvore: nova_arv, cria_arv, raiz, arv_esq, arv_dir, arv_vazia, arv_iguais, escreve_arv. (a) (1.5) Escreva a função conta_nos que recebe como argumento uma árvore e devolve o número total de nós que esta contém. def conta_nos(a): if arv_vazia(a): return 0 return 1 + conta_nos(arv_esq(a)) + conta_nos(arv_dir(a)) (b) (1.5) Uma árvore binária diz-se equilibrada se e só se, para cada uma das suas sub-árvores a diferença entre o número de nós da árvore esquerda e o número de nós da árvore direita nunca é superior a um. A arvore vazia é, por definição, equilibrada. Usando a função conta_nos da alínea anterior, escreva o predicado equilibrada que recebe como argumento uma árvore e devolve verdadeiro apenas se a árvore é equilibrada. def equilibrada(a): if arv_vazia(a): return True ne = conta_nos(arv_esq(a)) nd = conta_nos(arv_dir(a)) if -1 <= ne-nd <= 1: return equilibrada(arv_esq(a)) and equilibrada(arv_dir(a)) return False 12. (1.5) Considerando a existência do tipo pilha, realizada através de funções, com as operações nova_pilha, topo, tira e empurra, escreva um predicado com o nome parenteses_balanceados que recebe uma cadeia de caracteres correspondente a uma expressão aritmética (não verificando a correcção da entrada) e que determina se os seus parêntesis estão balanceados, ou seja cada parênteses que é aberto tem um parênteses fechado correspondente e os pares de parêntesis estão correctamente encadeados. Considere apenas os parêntesis curvos, rectos e as chavetas. Por exemplo, >>> balanceados( 2 * [(5 + 7) * a + b] ) True >>> balanceados( 3) ) False >>> balanceados( ({)} ) False >>> balanceados( ({[[()]]}()) ) True

Número: Pág. 8 de 8 def balanceados (exp): balanc = True pars = nova_pilha() for c in exp: if c in [ (, [, { ]: pars = empurra(pars, c) elif c in [ ), ], } ]: if not pilha_vazia(pars): outro = topo(pars) if (c == ) and outro == ( ) or \ (c == ] and outro == [ ) or \ (c == } and outro == { ) : pars = tira(pars) return False return False return pilha_vazia(pars)