⬅ Voltar ao Dashboard Capítulo 5 — Repetições

🌀 Repetições Aninhadas

Seção 5.4 — break avançado e while dentro de while

💵 Cédulas com break

O break pode ser combinado com if/elif para criar lógicas mais complexas. Um exemplo clássico é calcular quantas cédulas (R$ 50, R$ 20, R$ 10, R$ 5 e R$ 1) são necessárias para pagar um determinado valor:

Listagem 5.14 — Contagem de cédulasvalor = int(input("Digite o valor a pagar: ")) cédulas = 0 atual = 50 apagar = valor while True: if atual <= apagar: apagar -= atual cédulas += 1 else: print("%d cédula(s) de R$%d" % (cédulas, atual)) if apagar == 0: break if atual == 50: atual = 20 elif atual == 20: atual = 10 elif atual == 10: atual = 5 elif atual == 5: atual = 1 cédulas = 0

O programa subtrai repetidamente o valor da cédula atual de apagar contando quantas vezes cabe (cédulas). Quando não cabe mais, imprime a quantidade e passa para a cédula menor. O break é ativado quando não há mais nada a pagar (apagar == 0).

💡 Execute o programa com os valores: 501, 745, 384, 2, 7 e 1 para verificar se os resultados estão corretos (Exercício 5.16).

🌀 5.4 Repetições Aninhadas

Podemos combinar vários while de forma a obter resultados mais interessantes. Imagine imprimir as tabuadas de multiplicação de 1 a 10. Podemos fazer isso com um while dentro de outro:

Listagem 5.15 — Impressão de tabuadastabuada = 1 while tabuada <= 10: número = 1 while número <= 10: print("%d x %d = %d" % (tabuada, número, tabuada * número)) número += 1 tabuada += 1

O while externo controla a tabuada (de 1 a 10). O while interno imprime os 10 termos de cada tabuada. Note que número é reinicializado com 1 a cada nova tabuada — por isso fica dentro do bloco externo, mas antes do while interno.

Vejamos o mesmo problema sem usar repetições aninhadas, com apenas um while:

Listagem 5.16 — Tabuadas sem repetições aninhadastabuada = 1 número = 1 while tabuada <= 10: print("%d x %d = %d" % (tabuada, número, tabuada * número)) número += 1 if número == 11: número = 1 tabuada += 1

Quando número chega a 11, ele é reinicializado para 1 e tabuada avança. Essa solução usa apenas um laço, mas é menos intuitiva que a versão aninhada.

💡 Repetições aninhadas são naturais quando o problema tem duas dimensões: por exemplo, linhas e colunas de uma tabela. O while interno executa completamente a cada iteração do while externo.

✏ Exercícios

Exercício 5.15

Escreva um programa para controlar uma pequena máquina registradora. Solicite ao usuário que digite o código do produto e a quantidade comprada. Utilize a tabela abaixo para obter o preço:

CódigoPreço
1R$ 0,50
2R$ 1,00
3R$ 4,00
5R$ 7,00
9R$ 8,00

Exiba o total das compras depois que o usuário digitar 0. Qualquer outro código deve gerar a mensagem de erro "Código inválido".

Exercício 5.16

Execute o programa da Listagem 5.14 para os seguintes valores: 501, 745, 384, 2, 7 e 1. Verifique se os resultados estão corretos.

Exercício 5.17

O que acontece se digitarmos 0 (zero) no valor a pagar do programa da Listagem 5.14?

Exercício 5.18

Modifique o programa da Listagem 5.14 para também trabalhar com notas de R$ 100.

Exercício 5.19

Modifique o programa para aceitar valores decimais, ou seja, também contar moedas de R$ 0,01, R$ 0,02, R$ 0,05, R$ 0,10 e R$ 0,50.

Exercício 5.20

O que acontece se digitarmos 0,01 no programa anterior? Caso ele não funcione, altere-o de forma a corrigir o problema.

Exercício 5.21

Reescreva o programa da Listagem 5.14 de forma a continuar executando até que o valor digitado seja 0. Utilize repetições aninhadas.

Exercício 5.22

Escreva um programa que exiba uma lista de opções (menu): adição, subtração, divisão, multiplicação e sair. Imprima a tabuada da operação escolhida. Repita até que a opção saída seja escolhida.

Exercício 5.23

Escreva um programa que leia um número e verifique se é ou não um número primo. Para isso, calcule o resto da divisão do número por 2 e depois por todos os números ímpares até o número lido. Se o resto de uma dessas divisões for igual a zero, o número não é primo. Observe que 0 e 1 não são primos e que 2 é o único número primo que é par.

Exercício 5.24

Modifique o programa anterior de forma a ler um número n. Imprima os n primeiros números primos.

Exercício 5.25

Escreva um programa que calcule a raiz quadrada de um número usando o método de Newton. Sendo n o número, considere a base b = 2. Calcule p usando a fórmula p = (b + (n / b)) / 2. A cada passo, faça b = p e recalcule. Pare quando a diferença absoluta entre n e o quadrado de p for menor que 0,0001.

Exercício 5.26

Escreva um programa que calcule o resto da divisão inteira entre dois números. Utilize apenas as operações de soma e subtração para calcular o resultado.

Exercício 5.27

Escreva um programa que verifique se um número é palíndromo. Um número é palíndromo se continua o mesmo caso seus dígitos sejam invertidos. Exemplos: 454, 10501.