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'
)
Professor, com este comando: "tartaruga.shape",
ResponderEliminarapenas podemos transformar o cursor numa tartaruga?
Cumprimentos, João Pedro
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:
ResponderEliminarcTurtle.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!!
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))??
ResponderEliminarobrigado
import cTurtle
ResponderEliminardef 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
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.
ResponderEliminarahh e o dot so deixa a marca de um circulo?
ResponderEliminarnão conhecia o comando, obrigado professor :)
Veja a tabela 3 do manual do cTurtle que podem levar para as provas. Depois é só testar. O dot marca um ponto.
ResponderEliminar