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:

01.>>> x = [] * 4
02.>>> y = [[] for i in range(4)]
03.>>> z = [[]] * 4
04.>>> x
05.??? <---- (a)
06.>>> y
07.??? <---- (b)
08.>>> z
09.??? <---- (c)
10.>>> x == y
11.??? <--- (d)
12.>>> y == z
13.??? <---- (e)
14.>>>


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.

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



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

Usando listas por compreensão:
1.def d_b(x,y):
2.    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.

1.A 1 20
2.B 1 40
3.C 1 30
4.A 2 -10
5.C 2 5
6.B 2 15
7.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.

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


Resposta
01.def dic_max_temp(ficheiro):
02.    """ Do ficheiro ao dicionário."""
03.    f_in = open(ficheiro, 'r')
04.    dic = {}
05.    linha = f_in.readline()
06. 
07.    while linha != '':
08.        cod,num,temp = linha[:-1].split()
09.        dic[cod] = max(dic.get(cod,-100),int(temp))
10.        linha = f_in.readline()
11.    f_in.close()
12.    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.

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




Resposta
01.def tabuleiro(tartaruga,n,lado):
02.    tartaruga.pu()
03.    tartaruga.goto(0,0)
04.    tartaruga.pd()
05.     
06.    for l in range(n):
07.        # reposiciona no início da linha
08.        tartaruga.setx(0)
09.        tartaruga.sety(tartaruga.ycor() + lado)
10.        # desenha linha de quadrados
11.        for c in range(n):
12.            if (c + l) % 2 == 0:
13.                quad(tartaruga,lado,'white')
14.            else:
15.                quad(tartaruga,lado,'black')
16.            tartaruga.setx(tartaruga.xcor() + lado)

Sem comentários:

Enviar um comentário