domingo, 20 de dezembro de 2015

Teste #3 - TP2

Pergunta 2
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,[])
Resolvido esta questão vamos então usar a definição de avós: pais dos pais.
1.def avos(ag,nome):
2.    p = pais(ag,nome)
3.    return pais(ag,p[0]) + pais(ag,p[1])
A estratégia é linear: determinamos os fpais e, depois, para cada um dos pais, os seus pais. Notar que o get tem um valor por defeito que é uma lista vazia.
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)

Sem comentários:

Enviar um comentário