5  Estruturas de repetição

Manter a conversa ativa com critérios de parada claros

5.1 Objetivos de aprendizagem

Ao concluir este capítulo, você deverá ser capaz de:

  • escolher entre while, do-while e for;
  • definir uma condição de parada;
  • usar contadores e acumuladores;
  • empregar break e continue sem esconder o fluxo.

5.2 Escolhendo o laço

Fluxo que testa se a conversa está ativa, processa um comando e volta ao teste, ou termina.

Anatomia de um laço com condição de parada.

Use:

  • while quando a quantidade de repetições é desconhecida;
  • do-while quando o bloco precisa executar ao menos uma vez;
  • for quando existe um intervalo ou contador bem definido;
  • for-each para percorrer todos os elementos de uma estrutura.
for (int tentativa = 1; tentativa <= 3; tentativa++) {
    System.out.println("Tentativa " + tentativa);
}

5.3 Chatbot em repetição

import java.util.Scanner;

public class Capitulo04Repeticao {
    public static void main(String[] args) {
        int totalMensagens = 0;

        try (Scanner scanner = new Scanner(System.in)) {
            while (true) {
                System.out.print("Você: ");
                String mensagem = scanner.nextLine().strip();

                if (mensagem.equalsIgnoreCase("sair")) {
                    break;
                }

                if (mensagem.isBlank()) {
                    System.out.println("Bot: Digite uma mensagem.");
                    continue;
                }

                totalMensagens++;
                System.out.println("Bot: Recebi -> " + mensagem);
            }
        }

        System.out.println("Mensagens registradas: " + totalMensagens);
    }
}

A condição de parada está explícita: o comando sair executa break. Entradas em branco usam continue e não são contabilizadas.

5.4 Contadores e acumuladores

O JavaBot repete Olá sem parar até uma estudante perguntar pela condição de saída.

Quadrinho: o laço infinito.

Um contador registra quantas vezes algo aconteceu. Um acumulador agrega valores, como o total de caracteres:

int totalMensagens = 0;
int totalCaracteres = 0;

totalMensagens++;
totalCaracteres += mensagem.length();

Antes de escrever um laço, responda:

  1. qual estado muda em cada iteração?
  2. quando a repetição termina?
  3. o caso vazio foi previsto?
  4. existe risco de acessar uma posição inválida?

5.5 Laços aninhados

Laços aninhados são úteis para tabelas e matrizes, mas multiplicam o número de iterações. Para dois laços que percorrem n elementos, o trabalho pode crescer aproximadamente como \(n^2\). Primeiro escreva uma solução correta; depois avalie se o volume de dados exige outra estrutura.

5.6 Evolução do projeto: versão 4

O chatbot permanece ativo até receber sair, rejeita mensagens vazias e mostra quantas mensagens válidas foram recebidas.

O exemplo completo está em examples/src/Capitulo04Repeticao.java.

5.7 Prática verificável

Acrescente:

  1. limite opcional de cinco mensagens;
  2. contador de comandos desconhecidos;
  3. total de caracteres digitados, sem contar sair.

Casos de teste:

Sequência Resultado esperado
oi, sair uma mensagem registrada
linha vazia, sair zero mensagens
cinco mensagens encerramento pelo limite
SAIR encerramento normal
AvisoErro clássico

Um while em que nenhuma variável altera a condição pode produzir repetição infinita. Verifique a condição de parada antes de executar.