AFF Education Construa seu Futuro

Aula 38 - Estruturas de Controle (anatomia) - Parte 3

Revisão e Aprofundamento em Estruturas de Controle

Nesta aula, vamos revisar e aprofundar os conceitos de estruturas de controle, com ênfase em exemplos práticos e na aplicação de múltiplas estruturas em conjunto.

If-Else If-Else: Exemplo Prático

A estrutura if-else if-else permite avaliar múltiplas condições em sequência, executando o bloco correspondente à primeira condição verdadeira.

public class CalculadoraDeNotas {
    public static void main(String[] args) {
        // Calculando a média e determinando o conceito
        double nota1 = 8.5;
        double nota2 = 7.0;
        double nota3 = 9.0;
        
        // Calculando a média
        double media = (nota1 + nota2 + nota3) / 3;
        
        // Exibindo a média com duas casas decimais
        System.out.printf("Média: %.2f\n", media);
        
        // Determinando o conceito
        System.out.print("Conceito: ");
        
        if (media >= 9.0) {
            System.out.println("A (Excelente)");
        } else if (media >= 8.0) {
            System.out.println("B (Muito Bom)");
        } else if (media >= 7.0) {
            System.out.println("C (Bom)");
        } else if (media >= 6.0) {
            System.out.println("D (Regular)");
        } else if (media >= 5.0) {
            System.out.println("E (Recuperação)");
        } else {
            System.out.println("F (Reprovado)");
        }
        
        // Verificando se o aluno foi aprovado
        if (media >= 6.0) {
            System.out.println("Situação: Aprovado");
        } else if (media >= 5.0) {
            System.out.println("Situação: Em recuperação");
        } else {
            System.out.println("Situação: Reprovado");
        }
    }
}

Média: 8,17

Conceito: B (Muito Bom)

Situação: Aprovado

While vs Do-While: Exemplo Comparativo

As estruturas while e do-while são semelhantes, mas têm uma diferença fundamental: o do-while sempre executa o bloco pelo menos uma vez.

public class ComparacaoWhileDoWhile {
    public static void main(String[] args) {
        // Exemplo com while
        System.out.println("Exemplo com while:");
        int contador1 = 5;
        
        while (contador1 < 5) {  // Condição falsa desde o início
            System.out.println("O contador vale: " + contador1);
            contador1++;
        }
        
        System.out.println("Após o while, contador1 = " + contador1);
        
        // Exemplo com do-while
        System.out.println("\nExemplo com do-while:");
        int contador2 = 5;
        
        do {  // Executa pelo menos uma vez, mesmo com condição falsa
            System.out.println("O contador vale: " + contador2);
            contador2++;
        } while (contador2 < 5);
        
        System.out.println("Após o do-while, contador2 = " + contador2);
        
        // Exemplo com do-while e break
        System.out.println("\nExemplo com do-while e break:");
        int numero = 1;
        
        do {
            System.out.println("Número: " + numero);
            
            // Saindo do loop quando o número for 5
            if (numero == 5) {
                System.out.println("Encontrei o 5! Saindo do loop...");
                break;
            }
            
            numero++;
        } while (true);  // Loop infinito interrompido pelo break
    }
}

Exemplo com while:

Após o while, contador1 = 5

Exemplo com do-while:

O contador vale: 5

Após o do-while, contador2 = 6

Exemplo com do-while e break:

Número: 1

Número: 2

Número: 3

Número: 4

Número: 5

Encontrei o 5! Saindo do loop...

Observação: No primeiro exemplo com while, o bloco de código não é executado porque a condição (contador1 < 5) já é falsa desde o início. No segundo exemplo com do-while, o bloco de código é executado uma vez, mesmo com a condição (contador2 < 5) sendo falsa inicialmente.

For e For-Each: Manipulando Arrays

Java oferece duas formas principais de percorrer arrays: o for tradicional e o for-each (enhanced for).

Diagrama do for-each iterando sobre o array de inteiros numeros
Figura 4 — Visualização do for-each percorrendo o array numeros ({10, 20, 30, 40, 50}). A cada iteração, a variável numero recebe o próximo valor do array — note que não é necessário manipular o índice i, ao contrário do for tradicional.
public class ManipulacaoArrays {
    public static void main(String[] args) {
        // Declarando e inicializando um array de inteiros
        int[] numeros = {10, 20, 30, 40, 50};
        
        // Percorrendo o array com for tradicional
        System.out.println("Percorrendo com for tradicional:");
        for (int i = 0; i < numeros.length; i++) {
            System.out.println("Índice " + i + ": " + numeros[i]);
        }
        
        // Percorrendo o array com for-each (enhanced for)
        System.out.println("\nPercorrendo com for-each:");
        for (int numero : numeros) {
            System.out.println("Valor: " + numero);
        }
        
        // Manipulando um array com for tradicional
        System.out.println("\nMultiplicando cada elemento por 2:");
        for (int i = 0; i < numeros.length; i++) {
            numeros[i] = numeros[i] * 2;
            System.out.println("Índice " + i + ": " + numeros[i]);
        }
        
        // Somando todos os elementos do array
        int soma = 0;
        for (int numero : numeros) {
            soma += numero;
        }
        System.out.println("\nSoma de todos os elementos: " + soma);
        
        // Encontrando o maior valor no array
        int maior = numeros[0];  // Assume que o primeiro elemento é o maior
        
        for (int i = 1; i < numeros.length; i++) {
            if (numeros[i] > maior) {
                maior = numeros[i];
            }
        }
        
        System.out.println("Maior valor no array: " + maior);
    }
}

Percorrendo com for tradicional:

Índice 0: 10

Índice 1: 20

Índice 2: 30

Índice 3: 40

Índice 4: 50

Percorrendo com for-each:

Valor: 10

Valor: 20

Valor: 30

Valor: 40

Valor: 50

Multiplicando cada elemento por 2:

Índice 0: 20

Índice 1: 40

Índice 2: 60

Índice 3: 80

Índice 4: 100

Soma de todos os elementos: 300

Maior valor no array: 100

Dica:

Estruturas de Controle Aninhadas

É comum combinar diferentes estruturas de controle, aninhando-as para criar lógicas mais complexas.

public class EstruturasAninhadas {
    public static void main(String[] args) {
        // Exemplo: classificação de números
        System.out.println("Classificação de números de 1 a 10:");
        
        for (int i = 1; i <= 10; i++) {
            System.out.print(i + " é ");
            
            // Verificando se é par ou ímpar
            if (i % 2 == 0) {
                System.out.print("par");
            } else {
                System.out.print("ímpar");
            }
            
            // Verificando se é primo
            boolean ehPrimo = true;
            
            // Números menores que 2 não são primos
            if (i < 2) {
                ehPrimo = false;
            } else {
                // Verificando divisibilidade de 2 até i-1
                for (int j = 2; j < i; j++) {
                    if (i % j == 0) {
                        ehPrimo = false;
                        break;
                    }
                }
            }
            
            if (ehPrimo) {
                System.out.print(" e primo");
            }
            
            System.out.println(".");
        }
        
        // Exemplo: matriz de multiplicação
        System.out.println("\nMatriz de multiplicação 5x5:");
        
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5; j++) {
                int resultado = i * j;
                
                // Formatando a saída para alinhar os números
                if (resultado < 10) {
                    System.out.print(" ");  // Adiciona um espaço para números com um dígito
                }
                
                System.out.print(resultado + " ");
            }
            System.out.println();  // Nova linha após cada linha da matriz
        }
    }
}

Classificação de números de 1 a 10:

1 é ímpar e primo.

2 é par e primo.

3 é ímpar e primo.

4 é par.

5 é ímpar e primo.

6 é par.

7 é ímpar e primo.

8 é par.

9 é ímpar.

10 é par.

Matriz de multiplicação 5x5:

1 2 3 4 5

2 4 6 8 10

3 6 9 12 15

4 8 12 16 20

5 10 15 20 25

Usando Switch com Scanner para Criar um Menu

Combinando a estrutura switch com a classe Scanner, podemos criar menus interativos para nossos programas.

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. Calcular área do círculo");
            System.out.println("2. Calcular área do retângulo");
            System.out.println("3. Calcular área do triângulo");
            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 com switch
            switch (opcao) {
                case 1:
                    // Cálculo da área do círculo
                    System.out.print("Digite o raio do círculo: ");
                    double raio = scanner.nextDouble();
                    double areaCirculo = Math.PI * Math.pow(raio, 2);
                    System.out.printf("Área do círculo: %.2f unidades quadradas\n", areaCirculo);
                    break;
                    
                case 2:
                    // Cálculo da área do retângulo
                    System.out.print("Digite a base do retângulo: ");
                    double base = scanner.nextDouble();
                    System.out.print("Digite a altura do retângulo: ");
                    double altura = scanner.nextDouble();
                    double areaRetangulo = base * altura;
                    System.out.printf("Área do retângulo: %.2f unidades quadradas\n", areaRetangulo);
                    break;
                    
                case 3:
                    // Cálculo da área do triângulo
                    System.out.print("Digite a base do triângulo: ");
                    double baseTriangulo = scanner.nextDouble();
                    System.out.print("Digite a altura do triângulo: ");
                    double alturaTriangulo = scanner.nextDouble();
                    double areaTriangulo = (baseTriangulo * alturaTriangulo) / 2;
                    System.out.printf("Área do triângulo: %.2f unidades quadradas\n", areaTriangulo);
                    break;
                    
                case 4:
                    System.out.println("Saindo do programa...");
                    break;
                    
                default:
                    System.out.println("Opção inválida! Tente novamente.");
            }
            
        } while (opcao != 4);  // O loop continua até o usuário escolher sair (opção 4)
        
        // Fechando o scanner
        scanner.close();
        System.out.println("Programa encerrado!");
    }
}

===== MENU =====

1. Calcular área do círculo

2. Calcular área do retângulo

3. Calcular área do triângulo

4. Sair

Escolha uma opção: 1

Digite o raio do círculo: 5

Área do círculo: 78,54 unidades quadradas

===== MENU =====

1. Calcular área do círculo

2. Calcular área do retângulo

3. Calcular área do triângulo

4. Sair

Escolha uma opção: 2

Digite a base do retângulo: 10

Digite a altura do retângulo: 5

Área do retângulo: 50,00 unidades quadradas

===== MENU =====

1. Calcular área do círculo

2. Calcular área do retângulo

3. Calcular área do triângulo

4. Sair

Escolha uma opção: 4

Saindo do programa...

Programa encerrado!

Combinando Estruturas de Controle e Métodos

As estruturas de controle podem ser usadas dentro de métodos para criar código mais organizado e reutilizável.

public class ControleDentroDeMetodos {
    public static void main(String[] args) {
        // Chamando métodos que usam diferentes estruturas de controle
        imprimirTabuada(7);
        
        int[] valores = {12, 5, 8, 21, 13, 6};
        separarParesImpares(valores);
        
        verificarPositivoNegativoZero(10);
        verificarPositivoNegativoZero(-5);
        verificarPositivoNegativoZero(0);
    }
    
    // Método que usa for para imprimir a tabuada de um número
    public static void imprimirTabuada(int numero) {
        System.out.println("Tabuada do " + numero + ":");
        
        for (int i = 1; i <= 10; i++) {
            System.out.println(numero + " x " + i + " = " + (numero * i));
        }
        
        System.out.println();  // Linha em branco para separar
    }
    
    // Método que usa for-each e if-else para separar pares e ímpares
    public static void separarParesImpares(int[] numeros) {
        System.out.println("Separando pares e ímpares:");
        
        System.out.print("Números pares: ");
        for (int num : numeros) {
            if (num % 2 == 0) {
                System.out.print(num + " ");
            }
        }
        
        System.out.print("\nNúmeros ímpares: ");
        for (int num : numeros) {
            if (num % 2 != 0) {
                System.out.print(num + " ");
            }
        }
        
        System.out.println("\n");  // Duas linhas em branco para separar
    }
    
    // Método que usa if-else-if para verificar se um número é positivo, negativo ou zero
    public static void verificarPositivoNegativoZero(int numero) {
        System.out.print("O número " + numero + " é ");
        
        if (numero > 0) {
            System.out.println("positivo.");
        } else if (numero < 0) {
            System.out.println("negativo.");
        } else {
            System.out.println("zero.");
        }
    }
}

Tabuada do 7:

7 x 1 = 7

7 x 2 = 14

7 x 3 = 21

7 x 4 = 28

7 x 5 = 35

7 x 6 = 42

7 x 7 = 49

7 x 8 = 56

7 x 9 = 63

7 x 10 = 70

Separando pares e ímpares:

Números pares: 12 8 6

Números ímpares: 5 21 13

O número 10 é positivo.

O número -5 é negativo.

O número 0 é zero.

Exercícios

Teste seus conhecimentos sobre as estruturas de controle em Java:

1. Qual é a principal diferença entre o for tradicional e o for-each (enhanced for) em Java?

O for tradicional Você controla a variável i (index), o que permite acessar o elemento (lista[i]), pular elementos, percorrer de trás para frente ou acessar elementos vizinhos. Como você tem o índice, pode modificar o valor original diretamente na estrutura de dados (ex: arr[i] = novoValor).

2. No código abaixo, o que será impresso?

int x = 10;
if (x > 5) {
    System.out.print("A");
} else if (x > 8) {
    System.out.print("B");
} else {
    System.out.print("C");
}

3. Considere o seguinte código:

int[] numeros = {10, 20, 30, 40, 50};
for (int numero : numeros) {
    numero = numero * 2;
}
System.out.println(numeros[2]);

Qual será o valor impresso?

4. Qual estrutura de controle é mais adequada para validar a entrada do usuário até que ele forneça uma entrada válida?

5. Complete o código para criar um método que verifique se um número é primo:

Números primos são números naturais maiores que 1 que possuem apenas dois divisores positivos distintos: o número 1 e eles mesmos

A sequência dos primeiros números primos é 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, e assim por diante.

public static boolean ehPrimo(int numero) {
    if (numero <= 1) {
        return false;
    }
    
    for (int i = 2; i < numero; i++) {
        if (_______________________) {
            return false;
        }
    }
    
    return true;
}

Exercícios de Aplicação AFF Education

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

1. Em if (a) {...} else if (b) {...} else {...}, se a é falso e b é verdadeiro, qual bloco executa?

2. Em uma cadeia if / else if / else, quantos blocos são executados em uma passagem?