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 08:12 por Magnun

Categorias
Artigos , Artigos , Cursos , Curso de Python

Comentários

  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 00: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.
  11. Avatar de igorcroush
    ola pessoal,achei muito legal esse site,com esse curso,to estudando nele rsrs
    em,uma opção por que nao usar o operador in nessa string
    passada pelo usuario para encontrar a tao letra?
    eu fiz uns testes deu certo ficaria tipo if letra in texto: print" encontrada",letra
    entenderam?
    é so uma possivel opçao
    quero externar minha gratidao
    por este site
  12. Avatar de dimasters
    Magnun seguinte tenho uma pergunta
    Como o python sabe se ele é do while ou do ultimo if dentro do while?
    Não é comparando mas por exemplo em C
    [CODE]
    void main(){
    int x =0;

    while( true ){
    x++;
    if( x == 10){
    break;
    }
    else{
    printf('%d',x);
    }
    }
    }
    [/CODE]
    Faz tempo que vi C então não reparem o código
    Só pra exclarecer 'C' não deve ter o else para while certo mas vamos supor que tem nele sabemos que else pertence a if e a while ja em python como sabemos disso, no código postado em python com continue e break a única coisa que da pra saber sobre o que pertence a que é pela tabulação do código certo?
    Seu eu quiser colocar esse else do while pro if e deixar o while sem else como ficaria, como ele identifica cada um?
    Abraço
    Atualizado 21-11-2010 em 20:25 por dimasters
  13. Avatar de nennogabriel
    pela identação. por exeplo:

    else do if:
    [PHP]
    i = 0
    while True:
    i += i + 1
    if i % 7 == 0:
    print(i,"é divisível por 7")
    else:
    print(i, "não é divisível por 7")
    [/PHP]

    else do while:
    [PHP]
    i = 0
    while i < 100:
    i += i + 1
    if i % 7 == 0:
    print(i,"é divisível por 7")
    else:
    print("i é maior que 100 : i é igual a", i)
    [/PHP]

    sacou? em python a identação é tudo... sem ela não tem como o interpratador saber onde começa e termina uma condição ou um loop.

    se escrever:
    [PHP]
    i = 0
    while i < 100:
    i += 1
    print("i é maior que 100. i é igual a", i)
    [/PHP]

    o python vai escrever a fraze algumas vezes na hora errada. mas se escrever:
    [PHP]
    i = 0
    while i < 100:
    i += 1
    print("i é maior que 100. i é igual a", i)
    [/PHP]
    ele só escreverá a frase depois que i for maior ou igual a 100

    lembrando que a identação é criada pelo desenvolvedor, pode ser uma marca de tabulação ou 4 espaços (formas mais comuns), mas tbm pode ser apenas um espaço ou 9 espaços. Também pode-se identar de forma variada num mesmo projeto, desde que a identação seja igual a cada loop ou condição.. um exemplo estranho de identação correta seria:

    [PHP]
    i = 0
    while i < 100:
    i += 1
    if i == 5 :
    for n in range(1000):
    print(n)
    print("i é maior que 100. i é igual a", i)
    [/PHP]

    O que não é recomendavel, pois se voce quiser tirar o if e descer o for um nivel, tá no exemplo da pra fazer.. mas num código com paginas e paginas.. complica... recomendo que escolha sua identação e a use...
    eu uso 4 espaços e mando o meu editor de texto trocar o tab por 4 espaços pra facilitar minha vida.

    apenas tome cuidado pois um tab não são 4 espaços... o editor quem converte.

    se:
    [PHP]
    i = 0
    while i < 100:
    i += 1 #imagine que este foi usado um TAB
    print("i é maior que 100. i é igual a", i) #este com 4 espaços
    [/PHP]
    aparentemente estão certos, mas o o interpretador retornará erro na identação.
  14. Avatar de Magnun
    @dimasters
    Você está correto. Como o nennogabriel ressaltou (a quanto tempo não te vejo por aqui cara!), o Python identifica os 'elses' e tudo mais usando a tabulação. Por isso é extremamente importante ter uma endentação concisa no seu código. Então para alterar um else de um if (ou while) para outro basta alterar a tabulação do bloco.
  15. Avatar de silvanofideles
    O programa informa onde consta todas as ocorrências de uma letra ou não. Mas não foi possível usar o continue. Será que tem com "enxugar" o programa???

    [PHP]# 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.


    texto = raw_input('Digite uma frase: ')
    letra = raw_input('Digite uma letra a ser localizada: ')

    if len(letra) > 1:
    print 'Letras informadas:',letra,'.'
    letra = letra[0]
    print '"Eu disse uma letra" vou localizar apenas a letra:', letra

    conta = 0
    tam_texto = 0
    while tam_texto < len(texto):
    letra_texto = texto[tam_texto]
    tam_texto += 1
    if letra in texto:
    if letra_texto == letra:
    print 'letra',letra,'encontrada na posicão:',tam_texto-1
    if tam_texto == len(texto):
    break
    if tam_texto == len(texto):
    break
    else:
    print 'Letra',letra,'nao encontrada em nenhuma posição'[/PHP]
  16. Avatar de fabraga
    Exercício #1:
    Código PHP:
    texto=input("Informe um texto: ")
    letra=input("Informe uma letra para buscarmos: "

    if 
    len(letra)>1:
        print(
    "Foi informada a palavra:",letra,"."
        
    letra=letra[0
        print(
    "Será considerado apenas a primeira letra: ",letra

    n=
    ocorrencias
    =0

    while n<len(texto): 
        
    letra_texto=texto[n
        
    n=n+
        
    if letra_texto == letra:
            
    ocorrencias += 
    if ocorrencias 0:
        print(
    "Encontradas %i ocorrências da letra %s"%(ocorrencias,letra),"."
    else: 
        print(
    "Não foi possível encontrar a letra",letra
    Exercício #2:
    Código PHP:
    palavra=""
    while palavra != "pare":
            if 
    len(palavra)>0:
                    print(
    "A palavra tem",str(len(palavra)),"letras.")
            
    palavra=input("Informe uma palavra (ou 'pare' para parar): "
    Desafio:
    Código PHP:
    = [34215]
    print(
    "Lista original:",l)
    0
    1
    0
    while len(l):
        while 
    len(l):
            if 
    l[m] > l[n]:
                
    l[m]
                
    l[m] = l[n]
                
    l[n] = i
            n 
    += 1
        m 
    += 1
        n 
    m+1
    print("Lista ordenada:",l
    Atualizado 07-06-2011 em 18:46 por fabraga
  17. Avatar de sidtj
    Só pra citar minha solução ao desafio, usando somente recursos ensinados até aqui (fiz antes de ler os comentários, obviamente):

    [CODE]
    lista = [3,4,2,1,5]
    novalista = lista + []
    i,n,imaiores = 0,0,0

    while i < len(lista):
    atual = lista[i]
    while n < len(lista):
    imaiores += 1 if atual < lista[n] else 0
    n += 1

    novalista[len(lista)-imaiores-1] = atual
    i += 1
    n, imaiores = 0,0
    print("Nova lista %(novalista)s" % vars())
    [/CODE]
  18. Avatar de deathglory
    #-*- coding = utf-8 -*-
    # busca todas ocorrências de uma letra em uma string
    string = input('Digite a frase: ')
    tam = len(string)
    cont = 0
    ocorrencia = 0
    while len(string) < 1:
    print ('String vazia')
    string = input('Digite a frase: ')
    else:
    letra = input('Digite a letra para busca: ')
    while len(letra) < 1:
    print ('Isso não me parece uma letra ou espaço')
    letra = input('Digite a letra para busca: ')
    else:
    while cont < tam:
    if letra == string[cont]:
    ocorrencia = ocorrencia + 1
    cont = cont + 1
    else:
    cont = cont + 1
    if cont > 0:
    print ('O número de ocorrências da letra \'%s\' é: %d' % (letra, ocorrencia))
    else:
    print ('Não foi encontrada nenhuma ocorrência dessa letra!')

+ Enviar Comentário



Visite: BR-Linux ·  VivaOLinux ·  Dicas-L