P2 2008 - Claudio Esperança
1 pág.

P2 2008 - Claudio Esperança


DisciplinaAlgoritmo e Programação1.503 materiais13.578 seguidores
Pré-visualização1 página
Algoritmos e Programação \u2013 2a Prova / 2008
1. (4 pontos) Embora Python não inclua suporte para números fracionários de precisão arbitrária, é 
possível obter essa funcionalidade implementando uma classe para representar números 
racionais. A idéia geral é representar um número racional usando dois inteiros: um para o 
numerador e outro para o denominador. Para evitar múltiplas representações do mesmo número, 
a fração é sempre mantida de forma irredutível, isto é, a fração não pode simplificada. Frações 
negativas são representadas com um numerador negativo. O denominador é sempre positivo. 
Implemente a classe Rac de forma a realizar aritmética simples (as quatro operações) com 
números racionais. Você pode assumir a existência de uma função mdc(a,b) que retorna o 
maior divisor comum entre dois números a e b. Lembre-se que em Python, os métodos 
\u201cmágicos\u201d para as quatro operações têm os nomes __add__, __sub__, __mul__ e __div__. 
Sua solução só será considerada 100% correta se com ela for possível reproduzir o seguinte 
exemplo de utilização:
>>> Rac(10**9,3) 
1000000000/3 
>>> Rac(15,2) * (Rac (-1) - Rac(1,-3)) 
-5/1 
>>> Rac(-3,-7) / Rac(3,4) 
4/7 
2. (2 pontos) Implemente a função substitui(l,a,b) que retorna uma cópia de l onde todos os 
elementos iguais a a foram recursivamente substituidos por b. (Lembrete: uma variável x é uma 
lista, se e somente se isinstance(x,list) retorna True). Eis um exemplo de utilização:
>>> l = [1,[2,[1,2],1]] 
>>> print substitui (l, 1, [4,1]) 
[[4, 1], [2, [[4, 1], 2], [4, 1]]] 
>>> print substitui (l, [1,2], " ") 
[1, [2, ' ', 1]] 
>>> print l 
[1, [2, [1, 2], 1]]
 
3. (3 pontos) Esboce a janela exibida por cada um dos seguintes programas:
(a)from Tkinter import * 
c = Canvas() 
c.pack() 
for i in range(6): 
 c.create_rectangle (50*(i+1),50,50*(i+2),100,tag="ab"[i%2]) 
c.move("a",0,50) 
mainloop()
(b)from Tkinter import * 
for w in "ABCD": 
 Button(text=w).pack(side="left") 
 Button(text=w).pack(side="top") 
mainloop()
4. (1 ponto) O que é impresso pelo seguinte programa?
def f(l): 
 if l == []: return l 
 if l[0] == 0: return f(l[1:])+[1] 
 return [l[0]]+f(l[1:]) 
print f([0,1,1,0,2,0,1,3,0])
	Algoritmos e Programação \u2013 2a Prova / 2008