Estruturas de Repetição em Java
As estruturas de repetição (também chamadas de laços ou loops) são construções fundamentais em linguagens de programação. Elas permitem que um bloco de código seja executado repetidamente enquanto uma condição for verdadeira.
Em Java, existem três formas principais de laços:
for
while
do...while
Laço for
A estrutura do for
segue o seguinte formato:
for ([inicialização]; [condição]; [atualização]) {
// bloco a ser executado
}
Exemplo clássico:
for (int i = 1; i < 9; i++) {
System.out.printf("O quadrado de %d é %d\n", i, i * i);
}
Neste caso:
- A inicialização
int i = 1
cria e define o valor inicial do contador. - A condição
i < 9
determina se o laço continuará ou não. - A atualização
i++
incrementa o contador após cada iteração.
O laço será executado enquanto i
for menor que 9. Nesse exemplo, ele executa 8 vezes, com i
variando de 1 a 8.
Omissão de partes no for
Os três componentes (inicialização
, condição
, atualização
) são tecnicamente opcionais:
int i = 1;
for (;;) {
System.out.printf("O quadrado de %d é %d\n", i, i * i);
}
Esse é um laço infinito, pois não há condição que o interrompa.
Também é possível omitir apenas alguns elementos:
int i = 1;
for (; i < 9;) {
System.out.printf("O quadrado de %d é %d\n", i, i * i);
i++;
}
Esse exemplo é equivalente ao primeiro, mas o contador é inicializado fora do cabeçalho e incrementado dentro do corpo do laço.
Múltiplas variáveis no for
É possível declarar e atualizar mais de uma variável dentro do for
:
int n = 10;
for (int i = 0, j = n - 1; i < j; i++, j--) {
System.out.println(i * j);
}
Neste exemplo, duas variáveis (i
e j
) são manipuladas em direções opostas até se encontrarem.
Laço do...while
O do...while
executa o bloco antes de verificar a condição:
int j = 7;
do {
System.out.println(j);
j--;
} while (j > 0);
Esse laço será executado 7 vezes. A principal característica do do...while
é que o corpo sempre é executado pelo menos uma vez, independentemente da condição.
Por exemplo:
int j = -1;
do {
System.out.println(j);
j--;
} while (j > 0);
Mesmo que j
comece negativo, o bloco será executado uma vez antes da verificação.
Laço while
O while
verifica a condição antes de executar o bloco:
int j = 6;
while (j > 0) {
System.out.println(j);
j--;
}
Esse laço será executado enquanto a condição j > 0
for verdadeira. Se a condição for falsa logo na primeira verificação, o bloco não será executado nenhuma vez.
Instruções break e continue
break
A instrução break
interrompe o laço imediatamente, independentemente da condição:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break;
}
System.out.println(i);
}
Nesse caso, o laço é interrompido quando i
chega a 5. O console exibirá os valores de 0 a 4.
continue
A instrução continue
interrompe a iteração atual e inicia a próxima, ignorando o restante do bloco.
for (int i = 0; i < 10; i++) {
if (i == 5)
continue;
System.out.println(i);
}
Quando i
for igual a 5, a linha System.out.println(i)
será ignorada, e o laço continuará normalmente. O número 5 será pulado na saída.
📝 Exercícios
Tarefa 1
Qual é o último valor exibido por este código? E por quê?
public class Program {
public static void main(String[] args) {
int i = 3;
while (i != 0) {
System.out.println(i--);
}
}
}
Resposta
1
. A variável i
começa em 3 e é decrementada a cada iteração. O loop para quando i
se torna zero, então os valores impressos serão:
3
2
1
Tarefa 2
Quais valores são exibidos pelos dois blocos a seguir? Eles produzem os mesmos resultados?
Código 1:
int i = 0;
while (++i < 5) {
System.out.println(i);
}
Código 2:
int i = 0;
while (i++ < 5) {
System.out.println(i);
}
Resposta
++i
), os valores impressos são:
1
2
3
4
i++
), os valores impressos são:
1
2
3
4
5
Tarefa 3
Os dois for
abaixo imprimem os mesmos valores?
Código 1:
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
Código 2:
for (int i = 0; i < 5; ++i) {
System.out.println(i);
}
Resposta
i++
ou ++i
é executado após o corpo do laço, e nesse contexto, a diferença entre prefixo e pós-fixo não afeta o resultado.
Tarefa 4
Escreva um laço que imprima apenas os números pares de 2 a 10.
Resposta
for (int i = 2; i <= 10; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
Tarefa 5
Transforme este for
em um laço while
mantendo o mesmo resultado.
for (int i = 0; i < 3; i++) {
System.out.println("Número " + i + "!");
}
Resposta
int i = 0;
while (i < 3) {
System.out.println("Número " + i + "!");
i++;
}
Tarefa 6
Escreva um programa que solicite repetidamente um número maior que 100. O loop deve parar se o usuário cancelar ou deixar a entrada vazia.
Resposta
import java.util.Scanner;
public class Program {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input;
int number;
do {
System.out.print("Digite um número maior que 100: ");
input = in.nextLine();
if (input.isEmpty()) break;
number = Integer.parseInt(input);
} while (number <= 100);
in.close();
}
}
Tarefa 7
Escreva um programa que exiba todos os números primos de 2 até n
. O valor de n
pode ser uma constante no código.
Resposta
public class Program {
public static void main(String[] args) {
int n = 10;
for (int i = 2; i <= n; i++) {
boolean prime = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
prime = false;
break;
}
}
if (prime) {
System.out.println(i);
}
}
}
}