Controle de Fluxo na Linguagem Java

A classe Scanner no pacote java.util fornece métodos para ler entrada do usuário a partir do console. Introduzida no Java 5, ela facilita a captura de dados formatados.

  • Sintaxe básica para instanciar: Scanner leitor = new Scanner(System.in);
  • É uma boa prática liberar o recurso após o uso com leitor.close();

Para ler strings, os métodos next() e nextLine() são comuns, frequentemente precedidos por verificações como hasNext() e hasNextLine().

  • next(): Lê até encontrar um delimitador (como espaço ou nova linha). Ignora espaços iniciais e não captura strings com espaços internos.
  • nextLine(): Lê toda a linha até a tecla Enter, incluindo espaços em branco.

Exemplos de código modificdaos para ilustrar o uso:

import java.util.Scanner;

public class LeituraDados {
    public static void main(String[] args) {
        Scanner leitor = new Scanner(System.in);
        System.out.println("Digite uma frase:");
        if (leitor.hasNext()) {
            String texto1 = leitor.next();
            System.out.println("Saída (next): " + texto1);
        }
        leitor.close();
    }
}

public class LeituraLinha {
    public static void main(String[] args) {
        Scanner leitor = new Scanner(System.in);
        System.out.println("Digite uma linha completa:");
        if (leitor.hasNextLine()) {
            String texto2 = leitor.nextLine();
            System.out.println("Saída (nextLine): " + texto2);
        }
        leitor.close();
    }
}

public class LeituraNumeros {
    public static void main(String[] args) {
        Scanner leitor = new Scanner(System.in);
        int inteiro = 0;
        float decimal = 0.0f;

        System.out.println("Insira um valor inteiro:");
        if (leitor.hasNextInt()) {
            inteiro = leitor.nextInt();
            System.out.println("Inteiro recebido: " + inteiro);
        } else {
            System.out.println("Entrada não é um inteiro válido.");
        }

        System.out.println("Insira um valor decimal:");
        if (leitor.hasNextFloat()) {
            decimal = leitor.nextFloat();
            System.out.println("Decimal recebido: " + decimal);
        } else {
            System.out.println("Entrada não é um decimal válido.");
        }
        leitor.close();
    }
}

public class CalculoSoma {
    public static void main(String[] args) {
        Scanner leitor = new Scanner(System.in);
        double total = 0.0;
        int contador = 0;

        System.out.println("Insira números decimais (digite algo não numérico para parar):");
        while (leitor.hasNextDouble()) {
            double valor = leitor.nextDouble();
            contador++;
            total += valor;
            System.out.printf("Valor %d adicionado. Soma parcial: %.2f%n", contador, total);
        }
        System.out.printf("Total de %d números. Soma: %.2f. Média: %.2f%n", contador, total, total / contador);
        leitor.close();
    }
}

Estrutura Sequencial

Na estrutura sequencial, as instruções são executadas uma após a outra, na ordem em que aparecem no código. É a base de qualquer algoritmo.

public class ExemploSequencial {
    public static void main(String[] args) {
        System.out.println("Passo 1: Inicialização");
        System.out.println("Passo 2: Processamento");
        System.out.println("Passo 3: Finalização");
    }
}

Estruturas de Seleção

Estrutura if Simples

import java.util.Scanner;

public class VerificarEntrada {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        System.out.println("Digite um texto:");
        String entrada = teclado.nextLine();

        if (entrada.equalsIgnoreCase("iniciar")) {
            System.out.println("Comando reconhecido: " + entrada);
        }
        System.out.println("Fim da verificação.");
        teclado.close();
    }
}

Estrutura if-else

import java.util.Scanner;

public class AvaliarNota {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        System.out.println("Informe a nota:");
        int nota = teclado.nextInt();

        if (nota >= 60) {
            System.out.println("Aprovado");
        } else {
            System.out.println("Reprovado");
        }
        teclado.close();
    }
}

Estrutura if-else Encadeada

import java.util.Scanner;

public class ClassificarNota {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        System.out.println("Insira a pontuação:");
        int pontuacao = teclado.nextInt();

        if (pontuacao == 100) {
            System.out.println("Excelente!");
        } else if (pontuacao >= 90) {
            System.out.println("Nível A");
        } else if (pontuacao >= 80) {
            System.out.println("Nível B");
        } else if (pontuacao >= 70) {
            System.out.println("Nível C");
        } else if (pontuacao >= 60) {
            System.out.println("Nível D");
        } else if (pontuacao >= 0) {
            System.out.println("Abaixo da média");
        } else {
            System.out.println("Pontuação inválida");
        }
        teclado.close();
    }
}

Estrutura if Aninhada

import java.util.Scanner;

public class VerificacaoDupla {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        System.out.println("Digite a nota final:");
        int notaFinal = teclado.nextInt();

        if (notaFinal > 0 && notaFinal <= 100) {
            if (notaFinal >= 90) {
                System.out.println("Desempenho superior");
            }
        }
        teclado.close();
    }
}

Estrutura switch-case

A instrução switch avalia uma expressão e executa o bloco correspondente a um caso. Aceita tipos como byte, short, int, char e String.

public class MapearDia {
    public static void main(String[] args) {
        char dia = 'Q';

        switch (dia) {
            case 'S':
                System.out.println("Segunda-feira");
                break;
            case 'T':
                System.out.println("Terça-feira");
                break;
            case 'Q':
                System.out.println("Quarta-feira");
                break;
            case 'R':
                System.out.println("Quinta-feira");
                break;
            case 'F':
                System.out.println("Sexta-feira");
                break;
            default:
                System.out.println("Dia inválido ou fim de semana");
        }
    }
}

public class BuscarNome {
    public static void main(String[] args) {
        String nome = "Ana";

        switch (nome) {
            case "Ana":
                System.out.println("Usuário Ana identificada.");
                break;
            case "João":
                System.out.println("Usuário João identificado.");
                break;
            default:
                System.out.println("Usuário não reconhecido.");
        }
    }
}

Estruturas de Repetição

Laço while

O laço while repete um bloco enquanto a condição booleana for verdadeira. É crucial garantir que a condição se torne falsa para evitar loops infinitos.

public class SomaSequencia {
    public static void main(String[] args) {
        int acumulador = 0;
        int iterador = 1;
        
        while (iterador <= 50) {
            acumulador += iterador;
            iterador++;
        }
        System.out.println("A soma de 1 a 50 é: " + acumulador);
    }
}

Laço do-while

O laço do-while executa o bloco pelo menos uma vez antes de verificar a condição.

public class SomaDoWhile {
    public static void main(String[] args) {
        int valor = 0;
        int resultado = 0;

        do {
            valor++;
            resultado += valor;
        } while (valor < 25);
        System.out.println("Soma de 1 a 25: " + resultado);
    }
}

Laço for

O laço for é compacto e ideal quando o número de iterações é conhecido.

public class SomaParesImpares {
    public static void main(String[] args) {
        int somaPares = 0;
        int somaImpares = 0;

        for (int num = 0; num <= 100; num++) {
            if (num % 2 == 0) {
                somaPares += num;
            } else {
                somaImpares += num;
            }
        }
        System.out.println("Soma dos pares: " + somaPares);
        System.out.println("Soma dos ímpares: " + somaImpares);
    }
}

public class MultiplosDeCinco {
    public static void main(String[] args) {
        int coluna = 0;
        for (int n = 1; n <= 500; n++) {
            if (n % 5 == 0) {
                System.out.print(n + "\t");
                coluna++;
                if (coluna % 3 == 0) {
                    System.out.println();
                }
            }
        }
    }
}

public class TabuadaMultiplicacao {
    public static void main(String[] args) {
        for (int fator1 = 1; fator1 <= 5; fator1++) {
            for (int fator2 = 1; fator2 <= fator1; fator2++) {
                System.out.printf("%d*%d=%d\t", fator2, fator1, fator2 * fator1);
            }
            System.out.println();
        }
    }
}

Laço for aprimorado (for-each)

Introduzido no Java 5, este laço simplifica a iteração sobre coleções e arrays.

public class IterarArray {
    public static void main(String[] args) {
        double[] valores = {1.5, 2.7, 3.9, 4.1, 5.3};

        System.out.println("Usando for convencional:");
        for (int idx = 0; idx < valores.length; idx++) {
            System.out.println(valores[idx]);
        }

        System.out.println("Usando for-each:");
        for (double elemento : valores) {
            System.out.println(elemento);
        }
    }
}

Instruções break e continue

  • break: Interrompe imediatamente a execução do laço corrente.
  • continue: Pula para a próxima iteração do laço, ignorando o restante do bloco atual.
public class InterromperLaço {
    public static void main(String[] args) {
        int i = 0;
        while (i < 50) {
            i++;
            if (i == 20) {
                System.out.println("Interrompendo no valor 20.");
                break;
            }
            System.out.print(i + " ");
        }
    }
}

public class PularIteracao {
    public static void main(String[] args) {
        for (int k = 1; k <= 30; k++) {
            if (k % 7 == 0) {
                System.out.println(); // Nova linha a cada múltiplo de 7
                continue;
            }
            System.out.print(k + " ");
        }
    }
}

Uso de Rótulos (labels)

Rótulos permitem direcionar break ou continue para laços exterons em estruturas aninhadas.

public class NumerosPrimosComRotulo {
    public static void main(String[] args) {
        externo: for (int candidato = 50; candidato <= 80; candidato++) {
            for (int divisor = 2; divisor <= candidato / 2; divisor++) {
                if (candidato % divisor == 0) {
                    continue externo;
                }
            }
            System.out.print(candidato + " ");
        }
    }
}

Exercício Prático: Desenhar um Triângulo

Considere imprimir um triângulo de asteriscos usando três laços aninhados: um para espaços, um para a primeira metade dos asteriscos e outro para a segunda metade.

public class GerarTriangulo {
    public static void main(String[] args) {
        int linhas = 6;
        
        for (int i = 1; i <= linhas; i++) {
            for (int espaco = linhas; espaco >= i; espaco--) {
                System.out.print(" ");
            }
            for (int ast1 = 1; ast1 <= i; ast1++) {
                System.out.print("*");
            }
            for (int ast2 = 1; ast2 < i; ast2++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

Tags: java Scanner Estruturas de Controle Laços de Repetição Condicionais

Publicado em 6-2 02:28 por Thomas