domingo, 10 de janeiro de 2010

Mini Teste Especial

1. Que modos existem para quebrar a execução normal de um ciclo? Quais
são as suas diferenças?

Solução

break: termina imediatamente a execução do ciclo envolvente;

return: termina a execução do ciclo e do programa. Devolve o objecto associado ou None, caso não exista nenhum.

2. Considere a seguinte definição:

def add2me(x):
return x + x

Indique, justificando, quais os resultados esperados ao executar os comandos:

>>> add2me(23.4)
???
>>> add2me({1:’a’})
???
>>> add2me(’toto’)
???
>>> add2me([1,2,3])
???

Solução

O operador + é um operador sobrecarregado, podendo ser utilizado com objectivos de diferentes tipos. No entanto, em cada caso os operandos têm que ser compatíveis: posso somar um inteiro com o float, mas não posso somar um inteiro com um alista.

Na linha 2: 46.8. é o resultado de somar um número real consigo próprio.

Na linha 4: Dá erro pois a operação de soma não está definida para dicionários.

Na linha 6: ‘totototo’. Resulta da concatenação da cadeia de caracteres com ela própria.

Na linha 8: ‘[1,2,3,1,2,3]. Como no caso anterior, mas agora com as listas.

3. Admitindo que seq é uma lista de caracteres, explique o que faz o programa
da listagem abaixo. A sua resposta não pode ser baseada em generalidades.
Em concreto, queremos saber para cada valor de seq qual o valor
devolvido pela instrução return.

def mist(seq):
lst = []
for i in range(len(seq)):
for j in range(i+1):
lst.append(’’.join(seq[j:i+1]))
return lst

Solução

A melhor maneira de perceber o que fazem estas funções mistérios é simular à mão a sua execução. Se utilizarmos como entrada [‘a’,’v’,’e’] o resultado será:
['a', 'av', 'v', 'ave', 've', 'e']

Neste programa temos um nome, lst associado a um objecto do tipo lista e que vai sendo alterado num processo repetitivo. A repetição processa-se em dois tempos: em primeiro lugar, é feito um ciclo indexado pelas posições dos caracteres na lista passada como argumento, isto é, seq. Para cada uma destas posições temos um segundo ciclo. Nele, pegamos num pedaço da sequência inicial, ou seja, numa parte da lista de caracteres, juntamos esses caracteres numa cadeia de caracteres e guardamos o resultado na lista lst. Mas que parte guardamos? A que vai desde a posição j até (exclusivé) i+1. Admitamos que estamos na posição 1, de seq. Então, no ciclo interior vamos juntar as cadeias seq[0:2] e seq[1:2]. No final, o efeito é o de devolver uma lista de cadeias de caracteres formadas por todas as sub-cadeias de seq de comprimento 1,2, ... , len(seq).

4. Suponha que tem um ficheiro com endereços de correio electrónico,
um por linha. Pretendemos um programa que fabrique, a partir desses endereços,
a URL da página pessoal da Internet, de acordo com a regra:
ernesto@ dei.uc.pt dá origem a http://www.dei.uc.pt/ernesto. Os valores obtidos devem ser guardados num ficheiro, uma vez mais com um por linha.

Solução

Como cada endereço está numa linha, a nossa solução vai fazer uso desse facto. Vamos repetir a operação de leitura de uma linha, extracção da informação, fabricação da url, e guardar tudo num novo ficheiro. Daí uma solução simples:

def email_url(fich_in, fich_out):
""" URL a partir do endereço de email."""
f_in = open(fich_in, 'r')
f_out = open(fich_out, 'w')
linha = f_in.readline()
while linha != '':
nome,dominio = linha[:-1].split('@')
url = 'http://' + dominio + '/' + nome + '\n'
f_out.write(url)
linha = f_in.readline()
f_in.close()
f_out.close()

Repare-se como na linha 7, retiramos o ’\n’ que aparece no fim e separamos o resultado na parte anterior e posterior a ’@’, ou seja, respectivamente o nome e o domínio. Na linha 8 construímos o endereço da página web sem nos esquecermos de colocar no final a indicação de fim de linha (’\n’).


5. Suponha que quer ordenar um vector de inteiros positivos, todos diferentes, mas não pode usar nenhuma das primitivas de Python que o permitem
fazer de modo directo. Uma estratégia simples consiste no seguinte: para
cada elemento do vector conto o número de elementos que lhe são inferiores.
Com base nessa contagem, fico a saber a posição definitiva do elemento em
causa. Com efeito se, por exemplo, ele tiver 4 elementos inferiores, deverá ser
colocado na posição 5. Implemente um programa de acordo com a estratégia
de ordenamento indicada.

Solução

Vamos usar uma cópia da lista, onde efectuaremos as alterações. Como vamos precisar dos índices e dos elementos, usamos a função enumerate (linha 3).

def ord_conta(seq):
copia = seq[:]
for i,elem in enumerate(seq):
# Conta
conta = 0
for comp in seq:
if comp < elem :
conta = conta + 1
# Altera
copia[conta] = elem
return copia

Sem comentários:

Enviar um comentário