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.
def pais(ag,nome):
    return ag.get(nome,[])
Resolvido esta questão vamos então usar a definição de avós: pais dos pais.
def avos(ag,nome):
    p = pais(ag,nome)
    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:
def define_notas(fich_1,fich_2):
    with open(fich_1,'r',encoding='utf-8') as f_ent:
        with open(fich_2,'w',encoding='utf-8') as f_saida:
            for linha in f_ent:
                # define média
                nome,apelido,n_1,n_2,n_3 = linha.strip().split()
                media = (float(n_1) + float(n_2) + float(n_3))/3
                if media >= 47.5:
                    classific = 'Aprovado'
                else:
                    classific = 'Reprovado'
                # escreve nova linha
                nova_linha = nome + ' ' + apelido + ' ' + n_1 + ' ' + n_2 + ' ' + n_3 + ' ' + str('%4.2f' % media) + ' ' + classific + '\n'
                f_saida.write(nova_linha)

Sem comentários:

Enviar um comentário