sexta-feira, 5 de Fevereiro de 2010

Exame de Recurso

P1 a)
O que distingue os objectos mutáveis dos objectos imutáveis?

Resposta

No caso dos objectos mutáveis podemos alterar o valor sem alterar a identidade, nos imutáveis não.

P1 b)

Os ficheiros e as cadeias de caracteres são tipos de dados equivalentes? Isto é: tudo o que posso fazer com um objecto de um dos tipos, posso fazer com um objecto do outro. Justifique a sua opinião.

Resposta
Um tipo de dados remete para objectos e operações comuns com esses objectos. Por exemplo, os inteiros e os floats são tipos de dados equivalentes. O mesmo não se pode dizer dos ficheiros de texto e das cadeias de caracteres. Um ficheiro é uma longa cadeia de caracteres, estruturada em linhas, mutável e armazenada de forma permanente. As cadeias de caracteres não têm estrutura interna, são imutáveis e apenas existem durante a execução do programa onde estão definidas. Quanto às operações elas são diversas. No caso dos ficheiros temos operações de consulta por elemento (read), por linha (readline) ou por linhas (readlines). O acesso para consulta é sequencial, ao contrário das cadeias, em que o acesso é directo (indexação ou fatiamento). A operação de escrita (alteração) existe nos ficheiros (por elemento, por linha). alterar uma cadeia de caracteres obriga a criar um novo objecto.


P2
Imagine a seguinte sessão no interpretador de Python:


>>> x = [] * 4
>>> y = [[] for i in range(4)]
>>> z = [[]] * 4
>>> x
??? <---- (a)
>>> y
??? <---- (b)
>>> z
??? <---- (c)
>>> x == y
??? <--- (d)
>>> y == z
??? <---- (e)
>>>


Indique, justificando, o resultado devolvido pelo interpretador nas posições assinaladas por ???.

Resposta

O operador de *, quando um dos operandos é numérico e o outro uma sequência, significa repetição. Repete-se o conteúdo, devolvendo-se o resultado dentro da sequência.


(a) []
(b) [[],[],[],[]]
(c) [[],[],[],[]]
(d) False
(e) True

O operador == significa igualdade dos valores e não igualdade das identidades. Isso explica os resultados booleanos (d) e (e). x, y e z são objectos com identidades diferentes, mas y e z têm o mesmo valor.

P3

Suponha que tem duas listas de inteiros. Uma forma de determinar em que medida são diferentes consiste em calcular a soma das diferenças absolutas dos seus elementos. Uma fórmula simples será:





Aqui as listas são x e y, e têm n elementos. As barras verticais denotam o valor absoluto, isto é, correspondem à operação abs em Python.
Implemente o respectivo programa. Os argumentos são as duas listas de inteiros, como se mostra no exemplo da listagem abaixo.


>>> print distancia([1,2,3],[4,8,12])
18
>>>



Resposta

def d(x,y):
""" A distância entre duas listas de inteiros."""
soma = 0
for i in range(len(x)):
soma = soma + abs(x[i] - y[i])
return soma

Usando listas por compreensão:

def d_b(x,y):
return sum([ abs(x[i] - y[i]) for i in range(len(x))])

P4

Suponha que tem um ficheiro de texto onde guarda em cada linha o código da amostra de um produto, seguido do número de uma experiência feita com a amostra, seguido finalmente do valor da temperatura a que a experiência foi feita. A listagem abaixo mostra a parte inicial de um ficheiro tipo.


A 1 20
B 1 40
C 1 30
A 2 -10
C 2 5
B 2 15
B 3 60


Desenvolva um programa que leia esta informação e crie um dicionário em que as chaves são o código do produto e o valor a máxima temperatura a que a experiência foi feita. Admita que a temperatura pode variar entre -100 e 100 graus centígrados. A listagem abaixo mostra o resultado de executar o programa caso o ficheiro tivesse apenas os dados acima indicados.


>>> print dic_max_temp('/tempo/data/exame_r.txt')
{'A': 20, 'C': 30, 'B': 60}
>>>


Resposta

def dic_max_temp(ficheiro):
""" Do ficheiro ao dicionário."""
f_in = open(ficheiro, 'r')
dic = {}
linha = f_in.readline()

while linha != '':
cod,num,temp = linha[:-1].split()
dic[cod] = max(dic.get(cod,-100),int(temp))
linha = f_in.readline()
f_in.close()
return dic

P5

Usando o módulo cTurtle construa um programa que desenhe um tabuleiro quadrado semelhante ao da figura .






Por semelhante entende-se que pode ter outra dimensão. Suponha que tem ao seu dispor o programa que lhe permite desenhar um quadrado da cor que precisar, como se mostra na listagem abaixo.


def quad(tartaruga,lado,cor):
"""Desenha Quadrado da cor."""
tartaruga.begin_fill()
tartaruga.pen(shown=False, pencolor='black', fillcolor= cor)
for i in range(4):
tartaruga.fd(lado)
tartaruga.rt(90)
tartaruga.end_fill()




Resposta

def tabuleiro(tartaruga,n,lado):
tartaruga.pu()
tartaruga.goto(0,0)
tartaruga.pd()

for l in range(n):
# reposiciona no início da linha
tartaruga.setx(0)
tartaruga.sety(tartaruga.ycor() + lado)
# desenha linha de quadrados
for c in range(n):
if (c + l) % 2 == 0:
quad(tartaruga,lado,'white')
else:
quad(tartaruga,lado,'black')
tartaruga.setx(tartaruga.xcor() + lado)

Sem comentários:

Enviar um comentário