Pensamento Computacional - Comandos de repetição no Java: do while() e for()

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

Objetivos

Comando do while()

Em muitas situações, é mais interessante que o controle de execução do loop seja realizado no final da estrutura de repetição, ou seja, as instruções do laço do loop serão realizadas pelo menos uma vez, independente da condição de repetição. Neste caso, aplica-se o comando do while().

Sintaxe e Semântica do 'comando do while()'

O comando 'do while' apresenta a seguinte sintaxe:

do
    instrução
while ( expressao )

onde a a instrução pode ser:

    instrução simples terminada em ';'
ou
    bloco de instruções com chaves

Inicialmente, a instrução/bloco é executada e então a expressão é avaliada. Se verdadeira, a instrução é executada novamente e a expressão avaliada novamente.



Exemplo 1 - Validação de Entrada de dados

Suponha que um programa deve ler um número inteiro mas que seja positivo. Neste caso, o dado deve ser lido e se não positivo uma nova leitura deverá ser realizada.

import java.util.Scanner;

public class EntradaDados {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        int dadoInteiro;
        
        do {
            System.out.println("Entre com um valor inteiro e positivo");
            dadoInteiro = teclado.nextInt();
        } while( dadoInteiro <= 0 );

        System.out.println("Valor lido é " + dadoInteiro);
    }    
}

Deve ser observado que duas instruções estão sob controle do comando "do while" e, portanto, é necessário usar um bloco.

Ao executar o programa, o bloco é executado independente da condicão no while.

Exercício 1

No exemplo de entrada de dados, poderia ser necessário colocar uma mensagem de que foi fornecido um dado negativo ou zero. Acrescente um código para esta mensagem.

Exercício 2

Refazer o exercício do exemplo acima usando o comando while().

Exemplo 2 - Um jogo de adivinhação

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

public class JogoAdivinhacao {
    public static void main(String[] args) {     
        int segredo, sugestao;
        Scanner teclado = new Scanner(System.in);

        Random rand = new Random();

        /* gerar o número secreto: */
        segredo = rand.nextInt(10) + 1;

        do {
            System.out.println ("Adivinhe um número entre (1 a 10): ");
            sugestao = teclado.nextInt();
            if ( segredo < sugestao ) 
                System.out.println ("O número secreto é menor");
            else {
                if ( segredo > sugestao) 
                    System.out.println ("O número secreto é maior");
            }
        } while (segredo!=sugestao);

        System.out.println  ("Parabéns!"); 
    }
}

Exercício 3

Implemente um programa Java para que um usuário adivinhe o arremesso de dois dados.

Comando for()

O comando for() permite uma forma mais elaborada de loop, com controle no início do bloco de repetição.

Este comando é considerado altamente estruturado pois permite agrupar 3 expressões que implementaa:

  • As condições iniciais: "exp1" executada uma única vez ao começar o comando;
  • A expressão de controle que deve ser avaliada para execução do laço do loop: "exp2".
  • A expressão executada no final do laço: "exp3".

As expressões são SEMPRE separadas por ponto e vírgula.

import java.util.Scanner;

public class ComandoFor {
    public static void main(String[] args) {     
       int i;
   
       for ( i=0; i<10; i=i+1 )
           System.out.println("Valor de i é " + i);      
    }    
}

A estrutura do comando é:

for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco)
    instrução_simples;

ou

for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {
    lista_de_instruções
}

No exemplo a seguir é explorado o comando for com um bloco de instruções. Observe a relação com um fluxograma e a ordem de execução das expressões.

FluxogramaComandoFor-Eraldo.jpg
public class ComandoForComBloco {
    public static void main(String[] args) {     
       int i;
   
       for( i=0; i<10; i++ ) {
            System.out.println("Laço de número " + i); 
            if (i==5)
                System.out.println("==== Este é o laço 5 ====");
       }     
    }    
}
Observe que a expressão i=0 é executada SEMPRE e uma única VEZ, no início do comando.

A expressão i<10 é o controle do loop. Se FALSA o loop é encerrado. Ela é executada após a expressão de inicialização e, na sequência, no início de cada loop. A expressão i++ é executada no final de cada loop.

Exemplo 2

Elaborar um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número INCLUSIVE. OBS: Versão não eficiente. Melhor seria ajustar o número para par ANTES do loop.

public class ComandoForComBloco {
    public static void main(String[] args) {   
       int i, N;

       N = teclado.nextInt();

       for ( i=1; i<=N; i=i+1) {
          if (i%2==0)
             System.out.println("número par ====>" + i);
       }
       System.out.println("FIM\n");

    }    
}

Exercício 2

Implementar a versão mais eficiente do programa anterior, mas usando um comando for sem bloco.