terça-feira, 25 de janeiro de 2011

Problema 5: Exame Normal

Este problema, não sendo difícil, obriga a ter alguma disciplina. Identificamos três questões: (1) ler um ficheiro e extrair a informação relevante; (2) usar essa informação como chave de um dicionário para ir buscar os dados que nos são pedidos; (3) ordenar os dados. Vejamos uma hipótese de solução.


def nomes(fich, dicio):
"""
Usa um ficheiro para extrair nomes
e um dicionário para encontrar nome completo. Ordenamento simples.
""”
# Ler informação
ficheiro = open(fich)
dados = ficheiro.readlines()
ficheiro.close()
# Extrair dados
lista = []
for elem in dados:
pos = elem.find('~')
nome = elem[pos+1:-1]
if nome in dicio:
completo = dicio[nome][0]
lista.append(completo)
# ordenar
lista.sort()
return lista

Porque a informação está logicamente organizada por linhas é assim que a devemos ler. Vamos depois iterar para cada linha na busca do nome do utilizador, o que fazemos usando o método find. Encontrada a posição o nome tem que estar a partir dessa posição até ao final, mas devemos ter o cuidado de retirar o código correspondente à mudança de linha. O teste dentro do ciclo serve apenas para garantir que só extraímos informação se ela estiver efectivamente no dicionário. Finalmente o método sort é usado para ordenar o resultado.

Problema 4: Exame Normal

Pretendemos obter a lista com todas as posições iniciais em que um dado padrão ocorre num texto. Texto e padrão são cadeias de caracteres. Vamos ter que percorrer todo o texto à procura do padrão. Cada vez que encontramos o padrão guardamos a posição inicial, e recomeçamos. Vamos usar os métodos sobre cadeias de caracteres que nos permitem procurar cadeias de caracteres noutras cadeias. Segue uma solução.



def procura_pad(texto, padrao):
"""
Lista com as posições iniciais de todas as ocorrências
do padrão no texto.
"""
lista = []
pos = texto.find(padrao)
while pos != -1:
lista.append(pos)
pos = texto.find(padrao,pos + 1)
return lista

Esta solução faz uso do método find, com dois argumentos, e do conhecimento que temos de que, caso o padrão não ocorra, nos é devolvido o valor -1. Notar que avançamos posição a posição e não por saltos igual ao tamanho do padrão. Assim não perdemos nenhuma ocorrência.

Problema 3: Exame Normal

Trata-se de um problema muito simples. A primeira questão a resolver é como representar a matriz. A escolha óbvia é por recurso a uma lista de listas. Depois apenas precisamos de percorrer a matriz e alterar cada um dos seus elementos retirando o valor de referência. como não podemos ter valores negativos, nos casos em que isso acontece o valor a ser guardado é zero. Dito isto uma solução possível é a seguinte.


def dif(matriz,numero):
"""
Retira a cada elemento da matriz o valor igual ao número. Não podem
existir valores negativos.
"""
for lin in range(len(matriz)):
for col in range(len(matriz[0])):
matriz[lin][col] = max(matriz[lin][col] - numero, 0)
return matriz


Veja-se como evitamos o teste para saber se o resultado é negativo. Também não assumimos, e não o devíamos fazer, que a matriz é quadrada.