AFF Education Construa seu Futuro

Aula 42 - Loop do-while

A Estrutura de Repetição do-while

O do-while é uma estrutura de repetição em Java que garante que o bloco de código seja executado pelo menos uma vez, pois a condição é verificada após a execução do bloco.

Bloco de código
↓
Condição
↑ ← ← ← ← verdadeiro

Sintaxe:

do {
    // bloco de código a ser executado
} while (condição);

Observação: Diferente do while, o do-while sempre executa o bloco de código pelo menos uma vez, mesmo que a condição seja falsa desde o início.

Comparação entre while e do-while

A principal diferença entre while e do-while é o momento em que a condição é verificada:

public class WhileVsDoWhile {
    public static void main(String[] args) {
        // Exemplo com while
        System.out.println("Exemplo com while (condição falsa de início):");
        int contador1 = 10;
        
        while (contador1 < 5) {
            System.out.println("Contador: " + contador1);
            contador1++;
        }
        
        System.out.println("Valor final do contador: " + contador1);
        
        // Exemplo com do-while
        System.out.println("\nExemplo com do-while (condição falsa de início):");
        int contador2 = 10;
        
        do {
            System.out.println("Contador: " + contador2);
            contador2++;
        } while (contador2 < 5);
        
        System.out.println("Valor final do contador: " + contador2);
    }
}

Exemplo com while (condição falsa de início):

Valor final do contador: 10

Exemplo com do-while (condição falsa de início):

Contador: 10

Valor final do contador: 11

Dica: No exemplo acima, a condição já é falsa desde o início (contador > 5 em ambos os casos). O while não executa nenhuma vez, enquanto o do-while executa uma vez antes de verificar a condição.

Exemplo Básico: Contagem Regressiva

Vamos começar com um exemplo simples de contagem regressiva usando do-while:

public class ContagemRegressiva {
    public static void main(String[] args) {
        // Contagem regressiva de 5 a 1
        int contador = 5;
        
        System.out.println("Contagem regressiva:");
        
        do {
            System.out.print(contador + " ");
            contador--;
        } while (contador > 0);
        
        System.out.println("\nLançamento!");
    }
}

Contagem regressiva:

5 4 3 2 1

Lançamento!

Exemplo: Menu Interativo

Um dos usos mais comuns do do-while é para criar menus interativos, onde o menu é exibido pelo menos uma vez e continua sendo exibido até que o usuário escolha sair:

import java.util.Scanner;

public class MenuInterativo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int opcao;
        
        do {
            // Exibindo o menu
            System.out.println("\n===== MENU =====");
            System.out.println("1. Opção 1");
            System.out.println("2. Opção 2");
            System.out.println("3. Opção 3");
            System.out.println("4. Sair");
            System.out.print("Escolha uma opção: ");
            
            // Lendo a opção do usuário
            opcao = scanner.nextInt();
            
            // Processando a opção
            switch (opcao) {
                case 1:
                    System.out.println("Você escolheu a Opção 1");
                    break;
                case 2:
                    System.out.println("Você escolheu a Opção 2");
                    break;
                case 3:
                    System.out.println("Você escolheu a Opção 3");
                    break;
                case 4:
                    System.out.println("Saindo do programa...");
                    break;
                default:
                    System.out.println("Opção inválida! Tente novamente.");
            }
            
        } while (opcao != 4);  // Continua exibindo o menu até o usuário escolher sair
        
        // Fechando o scanner
        scanner.close();
        System.out.println("Programa encerrado!");
    }
}

===== MENU =====

1. Opção 1

2. Opção 2

3. Opção 3

4. Sair

Escolha uma opção: 1

Você escolheu a Opção 1

===== MENU =====

1. Opção 1

2. Opção 2

3. Opção 3

4. Sair

Escolha uma opção: 3

Você escolheu a Opção 3

===== MENU =====

1. Opção 1

2. Opção 2

3. Opção 3

4. Sair

Escolha uma opção: 4

Saindo do programa...

Programa encerrado!

Observação: Em aplicações reais, é comum usar o do-while para menus interativos porque queremos que o menu seja exibido pelo menos uma vez e continue sendo exibido até que o usuário escolha sair.

Exemplo: Validação de Entrada

Outro uso comum do do-while é para validação de entrada, garantindo que o usuário forneça um valor válido:

import java.util.Scanner;

public class ValidacaoEntrada {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int numero;
        
        // Solicitando um número positivo
        System.out.println("Digite um número positivo:");
        
        do {
            System.out.print("Número: ");
            numero = scanner.nextInt();
            
            if (numero <= 0) {
                System.out.println("Erro: O número deve ser positivo! Tente novamente.");
            }
        } while (numero <= 0);
        
        System.out.println("Você digitou o número positivo: " + numero);
        
        // Solicitando uma nota válida (0-10)
        double nota;
        
        System.out.println("\nDigite uma nota entre 0 e 10:");
        
        do {
            System.out.print("Nota: ");
            nota = scanner.nextDouble();
            
            if (nota < 0 || nota > 10) {
                System.out.println("Erro: A nota deve estar entre 0 e 10! Tente novamente.");
            }
        } while (nota < 0 || nota > 10);
        
        System.out.println("Você digitou a nota válida: " + nota);
        
        // Fechando o scanner
        scanner.close();
    }
}

Digite um número positivo:

Número: -5

Erro: O número deve ser positivo! Tente novamente.

Número: 0

Erro: O número deve ser positivo! Tente novamente.

Número: 7

Você digitou o número positivo: 7

Digite uma nota entre 0 e 10:

Nota: 12

Erro: A nota deve estar entre 0 e 10! Tente novamente.

Nota: -1

Erro: A nota deve estar entre 0 e 10! Tente novamente.

Nota: 8.5

Você digitou a nota válida: 8.5

Dica: O do-while é ideal para validação de entrada porque sempre pedimos pelo menos uma vez, e continuamos pedindo até que a entrada seja válida.

Exemplo: Jogo de Adivinhação

Um exemplo prático de uso do do-while é um jogo de adivinhação, onde o jogador continua tentando adivinhar até acertar:

import java.util.Scanner;
import java.util.Random;

public class JogoAdivinhacao {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();
        
        // Gerando um número aleatório entre 1 e 100
        int numeroSecreto = random.nextInt(100) + 1;
        int palpite;
        int tentativas = 0;
        
        System.out.println("Bem-vindo ao Jogo de Adivinhação!");
        System.out.println("Pensei em um número entre 1 e 100. Tente adivinhar!");
        
        do {
            System.out.print("\nSeu palpite: ");
            palpite = scanner.nextInt();
            tentativas++;
            
            // Verificando o palpite
            if (palpite < numeroSecreto) {
                System.out.println("Muito baixo! Tente um número maior.");
            } else if (palpite > numeroSecreto) {
                System.out.println("Muito alto! Tente um número menor.");
            } else {
                System.out.println("Parabéns! Você acertou em " + tentativas + " tentativas!");
            }
            
        } while (palpite != numeroSecreto);
        
        // Fechando o scanner
        scanner.close();
    }
}

Bem-vindo ao Jogo de Adivinhação!

Pensei em um número entre 1 e 100. Tente adivinhar!

Seu palpite: 50

Muito alto! Tente um número menor.

Seu palpite: 25

Muito baixo! Tente um número maior.

Seu palpite: 37

Muito alto! Tente um número menor.

Seu palpite: 31

Muito baixo! Tente um número maior.

Seu palpite: 34

Parabéns! Você acertou em 5 tentativas!

Combinando do-while com outras estruturas

O do-while pode ser combinado com outras estruturas de controle para criar lógicas mais complexas:

import java.util.Scanner;

public class CalculadoraInterativa {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        char continuar;
        
        do {
            // Solicitando os números
            System.out.print("Digite o primeiro número: ");
            double num1 = scanner.nextDouble();
            
            System.out.print("Digite o segundo número: ");
            double num2 = scanner.nextDouble();
            
            // Solicitando a operação
            System.out.println("\nEscolha a operação:");
            System.out.println("1 - Adição");
            System.out.println("2 - Subtração");
            System.out.println("3 - Multiplicação");
            System.out.println("4 - Divisão");
            System.out.print("Operação: ");
            
            int operacao = scanner.nextInt();
            
            // Executando a operação escolhida
            double resultado = 0;
            boolean operacaoValida = true;
            
            switch (operacao) {
                case 1:
                    resultado = num1 + num2;
                    break;
                case 2:
                    resultado = num1 - num2;
                    break;
                case 3:
                    resultado = num1 * num2;
                    break;
                case 4:
                    if (num2 != 0) {
                        resultado = num1 / num2;
                    } else {
                        System.out.println("Erro: Divisão por zero!");
                        operacaoValida = false;
                    }
                    break;
                default:
                    System.out.println("Operação inválida!");
                    operacaoValida = false;
            }
            
            // Exibindo o resultado
            if (operacaoValida) {
                System.out.println("\nResultado: " + resultado);
            }
            
            // Perguntando se deseja continuar
            System.out.print("\nDeseja fazer outro cálculo? (S/N): ");
            continuar = scanner.next().charAt(0);
            
        } while (continuar == 'S' || continuar == 's');
        
        // Fechando o scanner
        scanner.close();
        System.out.println("\nCalculadora encerrada. Até logo!");
    }
}

Digite o primeiro número: 10

Digite o segundo número: 5

Escolha a operação:

1 - Adição

2 - Subtração

3 - Multiplicação

4 - Divisão

Operação: 3

Resultado: 50.0

Deseja fazer outro cálculo? (S/N): S

Digite o primeiro número: 20

Digite o segundo número: 4

Escolha a operação:

1 - Adição

2 - Subtração

3 - Multiplicação

4 - Divisão

Operação: 4

Resultado: 5.0

Deseja fazer outro cálculo? (S/N): n

Calculadora encerrada. Até logo!

Dicas e Considerações

Atenção: Um erro comum é esquecer o ponto e vírgula no final do do-while, o que causa erro de compilação.

do {
    // bloco de código
} while (condição);  // Observe o ponto e vírgula aqui!
            

Exercícios

Teste seus conhecimentos sobre a estrutura do-while em Java:

1. Qual é a principal diferença entre as estruturas while e do-while?

2. Qual será a saída do seguinte código?

int x = 10;
do {
    System.out.print(x + " ");
    x--;
} while (x > 5);

3. Em quais situações o do-while é mais adequado que o while?

4. O que acontecerá na execução do seguinte código?

int contador = 5;
do {
    System.out.print(contador + " ");
    contador--;
} while (contador > 10);

5. Complete o código para solicitar um número entre 1 e 10 usando do-while:

Scanner scanner = new Scanner(System.in);
int numero;

do {
    System.out.print("Digite um número entre 1 e 10: ");
    numero = scanner.nextInt();
    
    if (numero < 1 || numero > 10) {
        System.out.println("Número inválido! Tente novamente.");
    }
} _____________________;

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Qual a principal característica do laço do-while?

2. Em int i = 5; do { System.out.println(i); i++; } while (i < 3);, quantas vezes imprime?