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.

01.def nomes(fich, dicio):
02.    """
03.    Usa um ficheiro para extrair nomes
04.    e um dicionário para encontrar nome completo. Ordenamento simples.
05.    ""”
06.    # Ler informação
07.    ficheiro = open(fich)
08.    dados = ficheiro.readlines()
09.    ficheiro.close()
10.    # Extrair dados
11.    lista = []
12.    for elem in dados:
13.        pos = elem.find('~')
14.        nome = elem[pos+1:-1]
15.        if nome in dicio:
16.            completo = dicio[nome][0]
17.            lista.append(completo)
18.    # ordenar
19.    lista.sort()
20.    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.


01.def procura_pad(texto, padrao):
02.   """
03.   Lista com as posições iniciais de todas as ocorrências
04.   do padrão no texto.
05.   """
06.   lista = []
07.   pos = texto.find(padrao)
08.   while pos != -1:
09.       lista.append(pos)
10.       pos = texto.find(padrao,pos + 1)
11.   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.

01.def dif(matriz,numero):
02.   """
03.   Retira a cada elemento da matriz o valor igual ao número. Não podem
04.   existir valores negativos.
05.   """
06.   for lin in range(len(matriz)):
07.       for col in range(len(matriz[0])):
08.           matriz[lin][col] = max(matriz[lin][col] - numero, 0)
09.   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.