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:
1.>>> a = 5
2.>>> b = 5
3.  
4.>>> a = [1,2,3]
5.>>> b= a


Pergunta 2.2

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

01.>>> def prod(x,y):
02....  return x * y
03....
04.>>> a = 5
05.>>> print prod(a,3)
06.15
07.>>> a
08.5
09.>>> x
10.Traceback (most recent call last):
11.  File "<string>", line 1, in <fragment>
12.NameError: name 'x' is not defined
13.>>>
14.</fragment></string>

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.
1.def misterio(n):
2.    res = [0]
3.    for i in range(1,n+1):
4.        res.append(res[-1] + i)
5.    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:
1.>>>    dic = {'ernesto':['carlos', 'jorge','ana'], 'carlos':['ricardo', 'joana'],
2.'joana': [], 'jorge':['carla', 'francisca'], 'ana':[], 'ricardo':['sara']}
3.>>>  <------- A sua definicão aqui
4.>>>  print primos(dic,'ricardo','francisca')
5.True
6.>>>


Resposta

01.def primos(dicio,nome1,nome2):
02.    """
03.    Primos são os filhos de dois irmãos...
04.    """
05.    prog1 = progenitor(dicio,nome1)
06.    prog2 = progenitor(dicio,nome2)
07.    return (prog1 != prog2) and irmaos(dicio,prog1,prog2)
08. 
09.def irmaos(dic,nome1,nome2):
10.    """ Têm o mesmo progenitor?"""
11.    prog1 = progenitor(dic, nome1)
12.    prog2 = progenitor (dic,nome2)
13.    return prog1 == prog2
14. 
15.def progenitor(dic, nome):
16.    """ Devolve o progenitor do nome."""
17.    for chave, valor in dic.items():
18.        if nome in valor:
19.            return chave
20.    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.




1.def main_tarta():
2.    tartaruga = cTurtle.Turtle()
3.    tartaruga.setheading(0)
4.    comandos = 'ADAEAERDAAEARA'
5.    navega(comandos, tartaruga)
6.    tartaruga.exitOnClick()


Resposta

01.def navega(comandos, tartaruga):
02.    """
03.    Navega numa cidade matricial.
04.    Conversão simples.
05.    """
06.    tartaruga.shape('turtle')
07.    tartaruga.dot(20,'green')
08.    for comando in comandos:
09.        if comando == 'E':
10.            tartaruga.left(90)
11.        elif comando == 'D':
12.            tartaruga.right(90)
13.        elif comando == 'A':
14.            tartaruga.forward(50)
15.        elif comando == 'R':
16.            tartaruga.back(50)
17.        else:
18.            print 'Comando desconhecido...'
19.            break
20.    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