Módulo 9 - Repetições com for e range()

Prática: tabuada automática do jeito que o usuário pedir

11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Construir o programa completo da tabuada de um número escolhido pelo usuário.
  • Converter a entrada com int() e formatar a saída com f-string alinhada.
  • Evoluir para a versão com intervalo: tabuadas do início ao fim pedidos.
  • Testar o programa com um roteiro e encarar os desafios extras.

Versão 1: a tabuada do número que o usuário pedir

A aula passada deixou a tabuada pronta, mas com o número escolhido por você, dentro do código. Programa de verdade pergunta. A versão 1 junta a tabuada com o que você aprendeu no módulo 5: input() para perguntar, int() para transformar a resposta em número. Monte no Playground, sem copiar: são poucas linhas e cada uma já é velha conhecida.

print("=== TABUADA AUTOMÁTICA ===")
numero = int(input("Qual tabuada você quer ver? "))

print(f"--- Tabuada do {numero} ---")
for i in range(1, 11):
    print(f"{numero} x {i:2d} = {numero * i}")

print("Pronto! Rode de novo para outra tabuada.")

Versão 1 completa. Digite 8 e receba a tabuada do 8, alinhada, na hora.

Rode e teste com carinho de testador, não de dono orgulhoso: peça a tabuada do 5, depois a do 1, depois a do 12. Repare que o programa aceita qualquer inteiro, até negativo, e a tabuada do -3 sai matematicamente correta. E teste o caso que quebra: digite oito por extenso e veja o ValueError do int(), velho conhecido do módulo 5. Ainda não temos a ferramenta para tratar esse erro com elegância (ela vem no módulo 14, com try e except); por ora, saber ONDE o programa quebra já é maturidade de programador.

Versão 2: do início ao fim que o usuário escolher

A versão 2 é a evolução natural: em vez de uma tabuada, todas as tabuadas de um intervalo. O usuário diz onde começa e onde termina (do 3 ao 6, por exemplo), e o programa entrega as quatro tabuadas. A estrutura é o for aninhado da aula passada, com uma diferença importante: o loop de fora não roda mais um range fixo, roda o intervalo digitado. E aqui mora o detalhe técnico da prática inteira: o usuário que pede do 3 ao 6 espera VER a tabuada do 6. Fim exclusivo pede range(inicio, fim + 1).

print("=== TABUADAS POR INTERVALO ===")
inicio = int(input("Tabuada inicial: "))
fim = int(input("Tabuada final: "))

for numero in range(inicio, fim + 1):
    print(f"--- Tabuada do {numero} ---")
    for i in range(1, 11):
        print(f"{numero} x {i:2d} = {numero * i}")
    print()

print("Fim das tabuadas!")

Versão 2 completa. Para a entrada 3 e 6, saem as tabuadas do 3, 4, 5 e 6, separadas por linha em branco.

O fim + 1 é o coração da versão 2. Sem ele, o usuário pede do 3 ao 6 e recebe do 3 ao 5: o programa roda sem erro nenhum e entrega menos do que prometeu, o erro silencioso na sua forma mais traiçoeira. Esse padrão, somar 1 ao fim quando o intervalo vem de um humano, você vai repetir a vida inteira em Python, porque gente conta incluindo as pontas e o range não. Traduzir entre a contagem humana e a da máquina é trabalho de programador.

Entrada (início, fim)Tabuadas impressasObservação
3 e 63, 4, 5 e 6O caso comum: quatro tabuadas completas
7 e 7só a do 7Intervalo de tamanho 1 funciona: range(7, 8) tem um número
1 e 10do 1 ao 10Reproduz a tabuada completa da aula 5
6 e 3nenhumarange(6, 4) é vazio: o for não roda e só a mensagem final aparece

Roteiro de teste da versão 2. A última linha é o caso que separa teste de sorte de teste de verdade.

Roteiro de teste e desafios extras

Programa pronto não é programa testado. Passe a versão 2 pelo roteiro da tabela: o caso comum (3 a 6), o intervalo de tamanho 1 (7 a 7), o intervalo cheio (1 a 10) e o intervalo invertido (6 a 3). O invertido merece atenção: o range vazio faz o programa pular direto para a mensagem final, sem imprimir nada e sem avisar o motivo. Não é travamento, mas é experiência ruim para o usuário. Com o que você sabe do módulo 7, dá para melhorar: um if comparando inicio com fim antes do loop, avisando quando o intervalo vier invertido. Considere esse o desafio de aquecimento.

  1. Desafio 1: antes do loop, um if avisa se o início for maior que o fim, em vez de terminar em silêncio.
  2. Desafio 2: pergunte também até que número cada tabuada vai (padrão 10) e use o valor no range de dentro.
  3. Desafio 3: mostre só as linhas de resultado par de cada tabuada, usando o if com o operador de resto (%) do módulo 6.
  4. Desafio 4: some todos os resultados de uma tabuada com um acumulador e mostre o total no fim dela. A do 7 soma 385.
  5. Desafio 5 (para valentes): envolva o programa num while, como o menu do módulo 8, para gerar várias tabuadas sem reiniciar.

Repare no que este módulo fez com você. Há seis aulas, repetir era coisa de while com contador manual. Agora você escolhe entre dois loops com critério, fabrica sequências sob medida com range(), percorre textos, alinha saídas com f-string e escreveu um for dentro de outro sem sofrimento. O desafio 5 junta os módulos 8 e 9 no mesmo programa, e é exatamente assim que o projeto final funciona. No módulo 10, o for ganha a parceira definitiva: a lista, a estrutura que guarda coleções de valores e que o for percorre como se tivessem nascido juntos. Porque nasceram.

Teste rápido

No programa do intervalo, por que o loop de fora usa range(inicio, fim + 1) em vez de range(inicio, fim)?

Perguntas frequentes

O programa quebra se o usuário digitar texto em vez de número. Tudo bem deixar assim?
Por enquanto, sim, e de propósito: a ferramenta que trata esse erro com elegância é o try e except, assunto central do módulo 14, que inclusive reconstrói uma calculadora à prova de erros. Nesta fase, o combinado é saber onde o programa quebra e por quê. O ValueError do int() já é seu conhecido do módulo 5.
Digitei início 6 e fim 3 e não saiu nada. O programa está com defeito?
Não: range(6, 4) é uma sequência vazia, então o for não executa nenhuma volta e o programa pula para a mensagem final. Funciona, mas confunde o usuário, que fica sem saber por que nada apareceu. O desafio 1 corrige isso com um if avisando do intervalo invertido antes do loop.
Posso deixar a tabuada ir além do 10, tipo até o 20?
Pode, mudando o range de dentro para range(1, 21), ou melhor ainda, perguntando ao usuário até onde ir, que é o desafio 2. Se passar de 10, troque o alinhamento para {i:3d}, porque números de dois dígitos viram três casas com folga e as colunas continuam retas.
Qual a diferença real entre a versão 1 e a versão 2?
Uma dimensão a mais. A versão 1 tem um for e responde por uma tabuada. A versão 2 embrulha esse mesmo for dentro de outro, que percorre o intervalo pedido: é o aninhamento da aula 5 aplicado a um problema real. Comparar os dois códigos lado a lado é um ótimo jeito de revisar o módulo.
Por que testar o intervalo 7 a 7 se ele parece inútil?
Porque valores no limite são onde os programas mais erram, e intervalo de tamanho 1 é um limite clássico. range(7, 8) precisa gerar exatamente um número, e o programa precisa imprimir exatamente uma tabuada. Testar limites é hábito profissional: custa segundos e revela erros que o caso comum esconde.
Onde essa prática reaparece no restante do curso?
Em quase tudo. O for percorrendo intervalos volta nas listas (módulo 10) e nos dicionários (módulo 11); a f-string alinhada volta no formatador de nomes (módulo 12) e na listagem do projeto final; o if preventivo do desafio 1 é o embrião da validação de entrada do módulo 14. Esta prática é um dos maiores pontos de conexão do curso.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.