Ver Feed RSS

root@blog:/# chmod o+r *

[Curso de Python] Mais Sobre as Estruturas While

Avalie este Post de Blog

Antes de prosseguir leia os artigos anteriores aqui



Bom dia a todos! Finalmente, estamos quase completando os estudos com a estrutura while. Já vimos praticamente todas as instruções que se aliam a ela: continue, break e o else.

Vou mostrar hoje alguns exemplos da estrutura while de forma mais complexa e depois vou deixar alguns exercícios. Postem os resultados, ok?!

Mais Sobre as Estruturas While



Agora que já conhecemos diversas instruções que alteram o comportamento da estrutura while vale a pena comparar sua utilidade. Vamos começar com um exemplo simples:
1. Buscar a primeira ocorrência de uma letra dentro de uma string passada pelo usuário. Deve ser informada a posição dessa ocorrência ou, caso não exista uma ocorrência, deve ser impresso um texto informando que a letra buscada não foi encontrada.
Vou resolver esse exercício de duas formas, uma será usando apenas o while, a outra será usando as instruções continue, break e else. No final iremos comparar os dois códigos.

Resolução 1
Código :
# Recebe a string
texto = raw_input('Favor informar uma string: ')
# Recebe a letra que será buscada na string
letra = raw_input('Favor informar uma letra para buscarmos: ')
 
# Vamos verificar se por acaso o usuário não passou mais de uma
# letra. Para isso verificamos o comprimento com a função len.
if len(letra) > 1:
    print 'Foi informado a palavra',letra,'.'
    # Pega somente a primeira letra da palavra
    letra = letra[0]
    print 'Sera considerado apenas a primeira letra:', letra
 
 
n = 0
encontrada = False
while n < len(texto):
    # Pega a letra na posição n
    letra_texto = texto[n]
    # incrementa n para a próxima iteração do loop
    n = n + 1
    if letra_texto == letra:
        print 'encontrada a letra',letra,'na posicao',(n-1)
        # Prepara para parar o loop
        encontrada = True
    if encontrada:
        # Como o while testa se n é menor que o comprimento do texto,
        # para parar o while basta alterar n para o comprimento do text
        # dessa fora, essa será a última iteração do loop.
        n = len(texto)
 
 
if encontrada == False:
     # Se 'encontrada' é falso, quer dizer que não foi encontrada
     print 'Nao foi possivel encontrar a letra',letra
print '\n'
Nesse exemplo, logo no início, eu fiz uma verificação para confirmar que o usuário tinha passado uma letra. Caso o tamanho de 'letra' fosse maior que zero teríamos o problema de comparar uma palavra com uma letra.

A execução mostra o seguinte comportamento:
Código :
$ ./busca_letra
Favor informar uma string: este e um teste
Favor informar uma letra para buscarmos: u
encontrada a letra u na posicao 7
 
$ ./busca_letra
Favor informar uma string: este e um teste
Favor informar uma letra para buscarmos: uma
Foi informado a palavra uma .
Sera considerado apenas a primeira letra: u
encontrada a letra u na posicao 7
 
$ ./busca_letra
Favor informar uma string: este e um teste
Favor informar uma letra para buscarmos: z
Nao foi possivel encontrar a letra z
Resolução 2
Agora vamos ver como re-escrever o código acima utilizando as instruções que aprendemos:
Código :
# Recebe a string
texto = raw_input('Favor informar uma string: ')
# Recebe a letra que será buscada na string
letra = raw_input('Favor informar uma letra para buscarmos: ')
 
# Vamos verificar se por acaso o usuário não passou mais de uma
# letra. Para isso verificamos o comprimento com a função len.
if len(letra) > 1:
    print 'Foi informado a palavra',letra,'.'
    # Pega somente a primeira letra da palavra
    letra = letra[0]
    print 'Sera considerado apenas a primeira letra:', letra
 
n = 0
while n < len(texto):
    # Pega a letra na posição n
    letra_texto = texto[n]
    # incrementa n para a próxima iteração do loop
    n = n + 1
    if letra_texto == letra:
        print 'encontrada a letra',letra,'na posicao',(n-1)
        # Vamos quebrar o while.
        break
else:
     # Só atingiremos caso o while tenha chegado ao fim
     print 'Nao foi possivel encontrar a letra',letra
Podemos verificar, rapidamente, que o codigo reduziu de tamanho. Outra coisa é que utilizamos uma variável a menos, a variável 'encontrada'. Isso implica em menos memória e menos processamento para alocar e desalocar essa variável.

Agora, analisando o código, pode surgir uma dúvida quanto ao break e o else. O else só é executado se o loop terminar todas as iterações. Como o break 'quebra' o loop quando a letra é encontrada, o else não é executado. Com isso fica fácil estruturar o programa para indicar que a letra não foi encontrada.

Exercícios



Agora uns exercícios para vocês. Tentem usar as instruções continue, break e else em todos os exemplos.
1: Fazer um programa que busca em um texto, passado pelo usuário, todas as ocorrências de uma letra. Caso não seja encontrado, informar que não foi encontrado a letra buscada.
2: Fazer um programa que recebe palavras do usuário e informe o comprimento da palavra. O programa só deve para quando o usuário digitar a palavra 'pare'.
Desafio: Criar um código que organize a seguinte lista: [3, 4, 2, 1, 5]

Atualizado 01-09-2010 em 09:12 por Magnun

Categorias
Artigos , Artigos , Cursos , Curso de Python

Comentários

Página 1 de 2 12 ÚltimoÚltimo
  1. Avatar de alanteixeira
    # busca de ocorrencia de uma letra em uma string

    entrada = raw_input("Entre com a frase: ")
    letra = raw_input("Entre com a letra a ser procurada: ")

    if len(letra) > 1:
    ....print "So ira ser considerada a letra %s" %letra[0]
    ....letra = letra[0]

    cont=0
    achou=0
    while cont < len(entrada):
    ....letracmp=entrada[cont]
    ....cont+=1
    ....if letra == letracmp:
    ........achou+=1
    else:
    ....print "O numero de ocorrencias da letra %(letra)s foi %(achou)d" %vars()
    Atualizado 26-06-2010 em 01:44 por alanteixeira
  2. Avatar de alanteixeira
    #recebe entrada e informa tamanho da string ate que a palavra pare seja fornecida


    condicao=True

    while condicao:
    ....entrada= raw_input('Entre com a palavra: ')
    ....if entrada == 'pare':
    ........break
    else:
    ....print 'O tamanho desta palavra e de %s letras' %len(entrada)
  3. Avatar de Magnun
    Muito bom alanteixaira! Suas resoluções estão corretas. quanto ao desafio? Já conseguiu?

    Ainda não tinha te visto por aqui, bem vindo ao curso!
  4. Avatar de nennogabriel
    apenas o desafio:
    [PHP]
    lista = [3, 4, 2, 1, 5]
    lista.sort()
    [/PHP]
    simples!!

    lol sem usar o sort(), eu quase me embananei... quase usei while aninhado.. heheh o que tbm daria certo... mas so serviria pra usar o brake...

    [PHP]
    def sortelol(lista):
    '''
    apenas para números inteiros
    '''
    peq = lista[0]
    for i in lista:
    if peq > i:
    peq = i
    lis = []
    lis.append(peq)
    i = lis[-1]
    while len(lis) != len(lista):
    i += 1
    if i in lista:
    lis.append(i)
    print 'era:',lista
    print 'ficou:',lis
    lista = [3, 4, 2, 1, 5]
    sortelol(lista)
    [/PHP]
  5. Avatar de Magnun
    Olá nennogabriel,

    Hehehe... ótimo código cara. Mas ela não é "solução ótima" ainda. Nesse caso, como temos uma lista com valores pequenos a execução tem um desempenho bom. Mas caso a lista tivesse valores muito grandes, o tempo de ordenação poderia levar muito tempo. Você citou uma solução de while aninhados, era por ai mesmo.

    Eu esperei alguém dar uma sugestão para só então postar uma solução. Agora segue o algoritmo de ordenação de vetor:
    Código PHP:
    def ordena(lista):
        
    # Cria cópia da lista original
        
    lista lista[:]
        
    0
        j 
    1
        item 
    0
        
    while len(lista):
            while 
    len(lista):
                print 
    lista,': comparando',lista[i], 'com'lista[j]
                if 
    lista[i] > lista[j]:
                    
    item lista[i]
                    
    lista[i] = lista[j]
                    
    lista[j] = item
                    
    print lista,': trocou'
                
    +1
            
    print '\ndenovo!'
            
    1
            j 
    1
        
    return lista

    = [34215]
    ordena(l
    Vale a pena executar esse algorítmo, ele tem um lógica muito interessante! Dêem uma olhada:

    Código :
    >>> ordena(l)
    [3, 4, 2, 1, 5] : comparando 3 com 4
    [3, 4, 2, 1, 5] : comparando 3 com 2
    [2, 4, 3, 1, 5] : trocou
    [2, 4, 3, 1, 5] : comparando 2 com 1
    [1, 4, 3, 2, 5] : trocou
    [1, 4, 3, 2, 5] : comparando 1 com 5
     
    denovo!
    [1, 4, 3, 2, 5] : comparando 4 com 3
    [1, 3, 4, 2, 5] : trocou
    [1, 3, 4, 2, 5] : comparando 3 com 2
    [1, 2, 4, 3, 5] : trocou
    [1, 2, 4, 3, 5] : comparando 2 com 5
     
    denovo!
    [1, 2, 4, 3, 5] : comparando 4 com 3
    [1, 2, 3, 4, 5] : trocou
    [1, 2, 3, 4, 5] : comparando 3 com 5
     
    denovo!
    [1, 2, 3, 4, 5] : comparando 4 com 5
     
    denovo!
     
    denovo!
    [1, 2, 3, 4, 5]
    >>>

    Até mais...
  6. Avatar de nennogabriel
    pode crer... e assim da pra usar praticamente qualquer valor... nao so numeros interos...
  7. Avatar de cleoson
    Olá Magnun,

    Abaixo a minha solução para o exercício 1:

    Código :
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    print 'Este programa conta a quantidade de ocorrências\nde uma determinada letra no texto informado.\n'
     
    texto = raw_input('Digite um texto: ')
    letra = raw_input('Digite a letra a ser procurada: ')
     
    contador, ind = 0, 0
     
    if len(letra) > 1:
        letra = letra[0]
        print '\nFoi digitado mais de um caracter na letra a ser procurada. Será considerado somente o primeiro caracter.'
     
    while ind < len(texto):
        if letra == texto[ind]:
            contador += 1
        ind += 1
    else:
        if contador == 0:
            print '\nNão foi encontrada nenhuma ocorrência da letra "%(letra)s" no texto informado.'%locals()
        else:
            print '\nForam encontradas %(contador)s ocorrências da letra "%(letra)s" no texto informado.'%locals()

    Um abraço!
  8. Avatar de cleoson
    Olá!

    Agora a minha solução para o exercício 2. O desafio eu vou tentar fazer amanhã!

    Código :
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    print 'Programa que informa a quantidade de caracteres em uma palavra informada.\nPara sair, informa a string "pare" (tudo em letras minúsculas).\n'
     
    palavra = 'continua'
     
    while palavra != 'pare':
        palavra = raw_input('Digite uma palavra: ')
        if palavra == 'pare':
            continue
        print 'A palavra',palavra,'tem',len(palavra),'caracteres.\n'
     
    print '\nVocê digitou "pare"!'


    Um abraço!
  9. Avatar de cleoson
    Olá Magnun,

    Abaixo minha solução para o desafio. Primeiro eu pesquisei sobre algoritmos de ordenação. Depois fiz usando 'if' e 'for'. Depois, peguei o que eu fiz com 'for' e coloquei o 'while'. Até onde testei, funcionou.

    Código :
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    print 'Este programa organiza números em ordem crescente.'
     
    lista = list(input('Digite os números a serem organizados separados por vírgula (ex.: 4, 2, 3, 1, 5): '))
     
    n = len(lista)
    i = 0
     
    while i < n:
        j = i + 1
        while j < n:
            if lista[i] > lista[j]:
                lista[i],lista[j] = lista[j],lista[i]
            j += 1
        i += 1
     
    print lista

    Um abraço!
  10. Avatar de Magnun
    Muito bom, parabéns cleoson, ótimo código explorando funcionalidades bem "obscuras" da linguagem: lista[i],lista[j] = lista[j],lista[i]

    Essa funcionalidade é relativamente pouco divulgada e consequentemente pouco utilizada, mas torna a o código muito mais legível.
Página 1 de 2 12 ÚltimoÚltimo

+ Enviar Comentário