quarta-feira, 25 de janeiro de 2012

Exame Época Normal

Pergunta 2

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

1.for i in range(20,-1,-2):
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.

1.def pontos(valores):
2.    valores.sort()
3.    contam = valores[1:-1]
4.    res = sum(contam)/float(len(contam))
5.    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.
01.def media(ficheiro):
02.    # ler dados
03.    f_in = open(ficheiro,'r')
04.    dados = f_in.readlines()
05.    f_in.close()  
06.    # passa a lista de lista de números
07.    for i in range(len(dados)):
08.        dados[i] = [float(elem) for elem in dados[i][:-1].split()]
09.    # identifica os máximos
10.    maximos = [max(elem) for elem in dados]
11.    # calcula média
12.    media = sum(maximos) / float(len(maximos))
13.    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.


1.def esparsa(matriz):
2.    res = {}
3.    for linha in range(len(matriz)):
4.        for coluna in range(len(matriz[0])):
5.            if matriz[linha][coluna] != 0:
6.                res[(linha+1,coluna+1)] = matriz[linha][coluna]
7.    return res