Temos uma árvore genealógica representada por um dicionário, sendo que as chaves são nomes de pessoas e os valores são os pais dessas pessoas. Trata-se pois de uma representação diferente (inversa) da discutida em post anterior. Pedem-nos um programa em que dado o dicionário e o nome de uma pessoa nos seja devolvido a lista dos avós dessa pessoa. É-nos sugerido que pensemos que os avós são os pais dos pais…
Com esta observação uma abordagem lógica seria começar por determinar os pais de uma pessoa. Como a representação liga uma pessoa (chave) aos seus pais (valor) podemos obter essa informação de modo directo.
1.
def
pais(ag,nome):
2.
return
ag.get(nome,[])
1.
def
avos(ag,nome):
2.
p
=
pais(ag,nome)
3.
return
pais(ag,p[
0
])
+
pais(ag,p[
1
])
Pergunta 3
Partimos de um ficheiro em que cada linha era composta por “nome apelido nota1 nota2 nota3\n” . Queremos criar um novo ficheiro em que cada linha é semelhante à do ficheiro de origem. A diferença é que foi acrescentada informação: a média das três notas e a referência “Aprovado” ou “Reprovado” em função da média ser igual ou superior a 47.5, para aprovação e menor para reprovação. A ideia da solução é simples, pois trata-se de criar um novo ficheiro. Percorremos o ficheiro linha a linha e transformamos cada linha antes de a introduzir no ficheiro de saída. Daí a solução:
01.
def
define_notas(fich_1,fich_2):
02.
with open(fich_1,
'r'
,encoding
=
'utf-8'
) as f_ent:
03.
with open(fich_2,
'w'
,encoding
=
'utf-8'
) as f_saida:
04.
for
linha
in
f_ent:
05.
# define média
06.
nome,apelido,n_1,n_2,n_3
=
linha.strip().split()
07.
media
=
(float(n_1)
+
float(n_2)
+
float(n_3))
/
3
08.
if
media >
=
47.5
:
09.
classific
=
'Aprovado'
10.
else
:
11.
classific
=
'Reprovado'
12.
# escreve nova linha
13.
nova_linha
=
nome
+
' '
+
apelido
+
' '
+
n_1
+
' '
+
n_2
+
' '
+
n_3
+
' '
+
str(
'%4.2f'
%
media)
+
' '
+
classific
+
'\n'
14.
f_saida.write(nova_linha)