quinta-feira, 19 de novembro de 2009

Mini Teste # 2

Pergunta 2.1


Diga o que entende por aliasing. Pode usar um exemplo como auxiliar da sua justificação.
Resposta

Falamos de aliasing quando nomes distintos ficam associados (pela identidade) ao mesmo objecto.
Exemplo:

>>> a = 5
>>> b = 5

>>> a = [1,2,3]
>>> b= a


Pergunta 2.2

Explique de modo claro, sintético e rigoroso o que aconteceu na sessão seguinte:


>>> def prod(x,y):
... return x * y
...
>>> a = 5
>>> print prod(a,3)
15
>>> a
5
>>> x
Traceback (most recent call last):
File "", line 1, in
NameError: name 'x' is not defined
>>>

Resposta

Nas linhas 1 e 2 definimos uma função de nome prod. Na linha 4, associamos o nome a ao objecto inteiro 5. Na linha 5, usamos a definição prod, sendo o resultado devolvido impresso por força da instrução print. Quando usamos a definição prod os parâmetros formais x e y vão ficar associados aos parâmetros reais a e 3, como se se tivesse feito no inicio de prod x=a e y = 3. A linha 6 mostra o resultado de executar o comando da linha 5.Na linha 7 perguntamos pelo objecto associado a a , e a resposta é dada na linha 8. Tentamos fazer o mesmo na linha 9 para x, mas dá erro pois x é um parâmetro formal da definição prod e, como tal, só existe no interior da definição.

Pergunta 2.3


Admitindo que n é um número inteiro positivo, explique o que faz o programa da listagem abaixo. A sua resposta não pode ser baseada em generalidades. Em concreto, queremos saber para cada valor de n qual o valor devolvido pela instrução return.

def misterio(n):
res = [0]
for i in range(1,n+1):
res.append(res[-1] + i)
return res[-1]

Resposta

Calcula o somatorio de 1 a n. O processo é iterativo, calculando-se primeiro os diferente somatórios de 1 a i. No final ao devolver o elemento na última posição (res[-1]), este é o valor da soma de todos os elementos.

Pergunta 2.4

Numa das fichas abordámos as árvores genealógicas e referimos que podiam ser organizadas através de um dicionário. As chaves são nomes, e os valores são listas de nomes dos descendentes directos (isto é, filhos(as)). Desenvolva um programa que, dados um dicionário, cujo conteúdo é uma árvore genealógica, e dois nomes, determina se esses dois nomes são primos(as) em primeiro grau. Relembramos que duas pessoas são primas entre si, se são filhos(as) de dois(duas) irmãos(ãs).

Exemplificando:

>>> dic = {'ernesto':['carlos', 'jorge','ana'], 'carlos':['ricardo', 'joana'],
'joana': [], 'jorge':['carla', 'francisca'], 'ana':[], 'ricardo':['sara']}
>>> <------- A sua definicão aqui
>>> print primos(dic,'ricardo','francisca')
True
>>>


Resposta


def primos(dicio,nome1,nome2):
"""
Primos são os filhos de dois irmãos...
"""
prog1 = progenitor(dicio,nome1)
prog2 = progenitor(dicio,nome2)
return (prog1 != prog2) and irmaos(dicio,prog1,prog2)

def irmaos(dic,nome1,nome2):
""" Têm o mesmo progenitor?"""
prog1 = progenitor(dic, nome1)
prog2 = progenitor (dic,nome2)
return prog1 == prog2

def progenitor(dic, nome):
""" Devolve o progenitor do nome."""
for chave, valor in dic.items():
if nome in valor:
return chave
return []

Pergunta 2.5

Suponha que está perdido no meio de uma cidade e não tem GPS para se orientar. Pergunta a um transeunte como pode chegar ao seu destino. Como a cidade é geométrica a resposta é fácil. Recebemos uma sequência de indicações do tipo vira à esquerda (E), depois avança (A), depois roda à direita (D), depois avança (A), depois avança de novo (A), depois recua (R), etc.. Usando o módulo cTurtle desenvolva um programa, que quando executado, simule com a tartaruga os seus movimentos quando esta executa os comandos recebidos.
A imagem mostra o que acontece quando manda correr o programa geral main_tarta(). Por conveniência de visualização marcámos o inicio e o fim do percurso com pontos, verde e vermelho, respectivamente. O seu programa chama-se, no código abaixo, navega.





def main_tarta():
tartaruga = cTurtle.Turtle()
tartaruga.setheading(0)
comandos = 'ADAEAERDAAEARA'
navega(comandos, tartaruga)
tartaruga.exitOnClick()


Resposta


def navega(comandos, tartaruga):
"""
Navega numa cidade matricial.
Conversão simples.
"""
tartaruga.shape('turtle')
tartaruga.dot(20,'green')
for comando in comandos:
if comando == 'E':
tartaruga.left(90)
elif comando == 'D':
tartaruga.right(90)
elif comando == 'A':
tartaruga.forward(50)
elif comando == 'R':
tartaruga.back(50)
else:
print 'Comando desconhecido...'
break
tartaruga.dot(20,'red')

7 comentários:

  1. Professor, com este comando: "tartaruga.shape",
    apenas podemos transformar o cursor numa tartaruga?

    Cumprimentos, João Pedro

    ResponderEliminar
  2. Não. Tal como está o sistema permite as formas 'turtle', 'arrow' (valor por defeito) e 'circle'. Mas também pode você definir outras formas recorrendo à operação addshape do módulo cTurtle. Por exemplo:

    cTurtle.addshape('triangulo',((5, -3),(0,5),(-5,-3)))


    Pode também usar uma imagem em formato gif que tenha no seu disco. Atenção ao tamanho!!

    ResponderEliminar
  3. professor desconhecia o comando dot e por isso ao fazer este exercicio primeiro compus uma função auxilar circulo com o parâmetro 'cor' mas o cursor não iniciava no meio do circulo mas sim na parte inferior. Seria claro mais facil utilizar o dot: este comando efectua um circulo completo de raio x e de cor y? (cTurtle.dot(x,y))??

    obrigado

    ResponderEliminar
  4. import cTurtle

    def circulo(cor):
    cTurtle.up()
    cTurtle.fillcolor(cor)
    cTurtle.fill(True)
    cTurtle.circle(10)
    cTurtle.fill(False)

    def navega(indicacoes):
    cTurtle.up()
    cTurtle.down()
    for i in indicacoes:
    if i=='A':
    cTurtle.fd(50)
    elif i=='D':
    cTurtle.rt(90)
    elif i=='E':
    cTurtle.lt(90)
    elif i=='R':
    cTurtle.back(50)
    else:
    break
    cTurtle.up()
    cTurtle.hideturtle()
    return 'Done'

    def main_tarta():
    circulo('green')
    navega('ADAEAERDAAEARA')
    circulo('red')
    main_tarta()

    A minha soluçao seria esta

    ResponderEliminar
  5. O comando dot deixa uma marca no sítio do cursor. Se usa o circle o efeito não é o mesmo pois o cursor vai ficar exteriorao círculo. Os argumentos de dot sáo o raio e a cor.

    ResponderEliminar
  6. ahh e o dot so deixa a marca de um circulo?

    não conhecia o comando, obrigado professor :)

    ResponderEliminar
  7. Veja a tabela 3 do manual do cTurtle que podem levar para as provas. Depois é só testar. O dot marca um ponto.

    ResponderEliminar