quarta-feira, 25 de janeiro de 2012

Exame Época Normal

Pergunta 2

Solução: Uma solução possível, a mais natural, seria:


for i in range(20,-1,-2):
print "i= ",i

Notar como tudo se resolve usando range com três argumentos. Note-se que os valores têm que ser impressos por ordem decrescente, incluindo o zero. Como o último argumento não conta temos que deixar ir até -1.

Pergunta 3
Enunciado: Suponha que participa numa competição em que lhe são atribuídos pontos (um número inteiro) por cada jogo que faz. Admita também que a sua pon- tuação final é a média dos pontos que obteve nos jogos, depois de serem retirados o seu melhor e o pior resultados. Escreva um programa que dados os resultados dos vários jogos, devolve a sua pontuação.

Solução: Sabemos que as pontuaçõeds estão guardadas numa lista e que temos que primeiro retirar o valor menor e o valor maior. Podemos para tal, usar as funções max e min. Mas vamos fazer de outro modo, começando por ordenar a lista. Depois disso, basta fazer uma cópia sem o primeiro (o mais pequeno) e o último (o maior) elementos. O cálculo da média depois é trivial, havendo apenas o cuidado de garantir que a divisão envolve floats. Atente-se ainda o modo como podemos somar os elementos de uma lista com a função sum.


def pontos(valores):
valores.sort()
contam = valores[1:-1]
res = sum(contam)/float(len(contam))
return res

Pergunta 4


Enunciado: Suponha um ficheiro formado por várias linhas e em que cada linha contém um certo número de números. A quantidade de números por linha não é necessariamente a mesma. Um exemplo de ficheiro possível ( mas é apenas um exemplo!):

12 15 30 26
100 34 13
34
58 39 9 22

Pretendemos um programa que dado um ficheiro com estas caracterís- ticas, determina o valor mais alto em cada linha, e calcula a média desses valores. Se olharmos para o exemplo acima o resultado devia ser calculado a como (30 + 100 + 34 + 58)/4, ou seja, 55.5.

Solução: Uma vez mais procuraremos uma solução simples. Precisamos de ler e guardar os dados. Fazemos isso, construindo uma lista de cadeias de caracteres (readlines()). Mas o que queremos é manipular números. por isso, a seguir, obtemos os dados na forma de lista de listas, em que cada elemento é uma listqa com os números de uma dada linha. Para isso, recorremos a listas por compreensão, embora também possa ser feito de modo mais convencional com um ciclo for. Vamos depois identificar os maiores valores em cada linha, recorrendo à função max e a listas por compreensão. Obtido estes valores o cálculo da média é trivial.

def media(ficheiro):
# ler dados
f_in = open(ficheiro,'r')
dados = f_in.readlines()
f_in.close()
# passa a lista de lista de números
for i in range(len(dados)):
dados[i] = [float(elem) for elem in dados[i][:-1].split()]
# identifica os máximos
maximos = [max(elem) for elem in dados]
# calcula média
media = sum(maximos) / float(len(maximos))
return media

Pergunta 5

Enunciado: Uma matriz de inteiros pode ser representada em Python por uma lista de listas. Assim, por exemplo, a matriz:

5 0 0
9 0 8
0 0 33

pode ser representada por:
[[5,0,0], [9,0,8],[0,0,33]]
Quando uma matriz tem muitos valores iguais a zero, uma forma mais conveniente de representar essa matriz usando apenas os valores não nulos. Uma forma de fazer isso em Python é através de um dicionário, em que cada elemento da matriz aij = k, k ̸= 0 é representada pelo par (chave:valor) ( (i, j):k). No caso anterior teríamos:
{ (1,1):5, (2,1):9, (2,3): 8, (3,3):33}

Escreva um programa que dada uma matriz representada por uma lista de listas, devolva a matriz equivalente representada por um dicionário.

Solução: Precisamos converter os dados da matriz, inicialmente organizados como uma lista de listas, para um dicionário, onde apenas colocamos os elementos diferentes de zero. A ideia da solução mais abaixo é percorrer a matriz elemento a elemento e testar se o valor é diferente de zero. Se for guardamos no dicionário.



def esparsa(matriz):
res = {}
for linha in range(len(matriz)):
for coluna in range(len(matriz[0])):
if matriz[linha][coluna] != 0:
res[(linha+1,coluna+1)] = matriz[linha][coluna]
return res

2 comentários:

  1. 4.
    def pex(link):
    ficheiro = open(link, 'r')
    lista = [linha[:-1].strip().split() for linha in ficheiro]
    ficheiro.close()
    lista = [[int(j) for j in linha] for linha in lista]
    maximos = [max(linha) for linha in lista]
    return sum(maximos)/len(maximos)

    if __name__ == '__main__':
    link = 'C:\\Users\\Pex\\Desktop\\exame.txt'
    print(pex(link))

    Alguma incorreção ou algo que não deva fazer?
    Ainda tentei juntar a mudança para int na mesma lista, mas já começou a ficar meio complicado. Não poderia mostrar como é? Se der.

    ResponderEliminar
    Respostas
    1. Está perfeito! Só uma nota: nas aulas tenho insistido no modelo linha[:-1].strip().split() por ser geral. Na realidade o strip() só é necessário quando o split não é pelo espaço em branco.

      Eliminar