Mandar um café pro programador

Pode me ajudar a transformar cafeína em código?

Loops Aninhados (Laço dentro de laço)

Neste tutorial de nosso Curso Completo de Python, vamos ensinar o que são loops aninhados (nested), ou seja, vamos colocar laços dentro de laços, ver como é isso, para que serve, como funciona e exemplos reais de uso.




Loops Aninhados

Já falamos aqui em nosso curso sobre Testes Condicionais IF e ELSE aninhados, inclusive demos alguns exemplos de uso.

Agora voltamos ao assunto, porém vamos usar WHILE e FOR dentro de outros WHILE e FOR, por um motivo bem direto: aninhamento é absurdamente importante e usado.




Quando você se tornar uma programador profissional (clique para saber como ganhar dinheiro programando em Python), vai usar muito isso, muito mesmo.

Se você já entendeu a lógica dos IF e ELSE aninhados, já sabe tranquilamente aninhar, em teoria, os laços.

Exemplo de loopings aninhados

O melhor exemplo de loop dentro de loop, é o nosso calendário/relógio.

O ano tem 12 meses.
Todo santo ano, começa em Janeiro, depois Fevereiro, Março...até Dezembro.
Depois conta-se tudo de novo, e de novo, e de novo...é um looping.

Porém, dentro de cada mês tem os dias do mês.
Começa no dia 1, dia 2, dia 3...até o último dia do mês (que varia).
Mas quando acaba, volta tudo de novo...looping.

E dentro do dia temos as horas!
00h...01h...02h...12h...23h...e depois repete, repete.

Dentro de cada hora?
Loop dos minutos.

Dentro de cada minuto?
Loop dos segundos.

Sim, vivemos em loops aninhados.
Vamos colocar isso em prática programando em Python ?

Criando um Tabuleiro

Faça um programa em Python que solicite um número positivo inteiro ao usuário, e depois exiba um tabuleiro na tela, com igual número de linhas e colunas.

Por exemplo, se ele digitar 3 deve aparecer na tela:
x  x  x
x  x  x
x  x  x

Se digitar 2:
x  x
x  x

Se digitar 4:
x  x  x  x
x  x  x  x
x  x  x  x
x  x  x  x

Solução:

Vamos criar um tabuleiro de tamanho N x N, onde esse N o usuário fornece e armazenamos na variável n.

Usaremos duas varáveis de controle: linha e coluna, ok?




O primeiro laço FOR vai ser responsável por percorrer as linhas.
Ele vai percorrer um intervalo de n linhas, ou seja: range(n)

Dentro de cada linha dessa, precisamos desenhar as colunas, onde cada coluna printamos um "". E quantas vezes isso é feito? n vezes.
Ou seja, vamos usar outro intervalo de valor n: range(n)

Vamos usar uma variação da função print, que não quebra a linha automaticamente. Para isso, basta adicionar o end='' na função print, pra definir que no fim dela não fala nada, não coloque nenhum caractere (por padrão ela coloca \n de quebra de linha).

Quando terminar de imprimir cada linha, o que fazemos?
Precisamos dar uma quebra de linha, para o tabuleiro ficar bonitinho, então usamos  print() (isso mesmo, sem nada dentro).

Veja como nosso código ficou:

print("Vamos criar um tabuleiro de tamanho:  N x N")
n=int(input("Valor de N: ") )

for linha in range(n):
    for coluna in range(n):
        print("x  ",end='')
    print()


Guarde esse código com carinho, vamos usar no futuro quando formos programar diversos jogos, como jogo da velha, batalha naval etc.

Exercício resolvido de Python

Crie um programa que exiba todos os segundos e minutos no intervalo de uma hora, no seguinte formato: XXmin YYs
Por exemplo:
12min59s

Vamos usar duas variáveis, a minuto e segundo.
Ambas vão de 0 até 59, ou seja, vamos usar o intervalo de 60: range(60)

O primeiro FOR é para os minutos.
Primeiro o minuto 0. Dentro dele vamos imprimir do 0s até 59s.
Depois o minuto 1. Dentro deles imprimimos de 0s até 59s.
...
Por fim, minuto 59.

O FOR que vai estar aninhado é o responsável por imprimir os segundos.
Veja como ficou o código do programa:


for minutos in range(60):
    for segundos in range(60):
        print(minutos,"min",segundos,"s")

Exercício Resolvido de Python

Faça o mesmo do exemplo acima, mas adicione as horas para ficar no formato: XXh YYmin ZZs
Aqui, basta notar que as horas vão de 0h até 23h: range(24)

for horas in range(24):
    for minutos in range(60):
        for segundos in range(60):
            print(horas,"h",minutos,"min",segundos,"s")

(se demorar muito, e vai demorar, dê um control+C que o shell do Python vai parar de rodar)

Exercício Resolvido de Laço Aninhado

Você foi contratado por uma escola para fazer o seguinte script em Python:
Primeiro, pergunta a quem vai usar o script quantos alunos tem na sala.
Depois, quantas matérias cada aluno estuda.

Em seguida o usuário vai preenchendo a nota de cada matéria, de cada aluno.
Seu programa deve fornecer a média de cada aluno e a média geral da turma.

Solução:

Vamos armazenar o número de alunos na variável alunos e o número de matérias em materias.

O primeiro laço é o que vai percorrer os alunos:
Aluno 1, depois aluno 2, o aluno 3...ou seja: range(alunos)

Depois, para cada aluno vamos dar as respectivas notas de cada matéria.
A cada nota que o usuário der, vamos somar ela na variável 'mediaAluno', e ao final basta dividirmos esse número pelo número de matérias e temos a média daquele aluno.
A cada iteração do primeiro FOR, antes de digitarmos as notas de cada matéria, devemos zerar essa variável!

Quando tivermos a 'mediaAluno', vamos somar esse valor na variável 'mediaTurma', e no final do programa dividimos essa variável pelo número de alunos, para ter a média geral da turma.

Veja como ficou o código final:


alunos=int(input("Quantos alunos tem na turma: ") )
materias=int(input("Quantas matérias eles estudam: ") )

mediaTurma=0
for aluno in range(alunos):
    print("Aluno",aluno+1,":")
    
    mediaAluno=0
    for materia in range(materias):
          print("Nota da materia",materia+1,":", end='')
          nota=int(input())
          mediaAluno += nota

    mediaAluno /= materias
    print("Media desse aluno:",mediaAluno,"\n")
    
    mediaTurma += mediaAluno

mediaTurma /= alunos
print("Media da turma:",mediaTurma)

Python na Mega-Sena

Faça um script em Python que exiba todos os possíveis palpites da Mega-Sena.
Dados:
  1. Cada palpite possui 6 dezenas
  2. As dezenas variam de 1 até 60
  3. Não pode repetir dezena

3 comentários:

  1. #Creio que o correto seria: coluna depois linha

    for coluna in range(n):
    for linha in range(n):
    print("x ",end='')
    print()

    ResponderExcluir
    Respostas
    1. De uma forma ou de outra está correto. O resultado será o mesmo. Mas do ponto de vista mais interpretativo, é do jeito que está no artigo mesmo. Se você fizer um teste de mesa, vai perceber como o programa está ponto cada dígito na tela. Vai notar que o programa consegue formar uma linha, colocando cada X em uma coluna diferente.
      Sendo assim, montar a lógica dessa forma,

      for linha in range(n):
      for coluna in range(n):
      print("x ",end='')
      print()

      seria a abstração correta da solução do problema.

      Excluir
  2. E se eu quisesse no tabuleiro colocar "preto" e "branco" como na dama:
    "preto" "branco" "preto"
    "branco" "preto" "branco"
    "preto" "branco" "preto"

    ResponderExcluir

Bora fazer evoluir o ensino da Programação no Brasil ?

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo