Java #3: Decisões e Loops

Logo do Java por Freepik em www.flaticon.com

Olá pessoas ... e bots.

Como vemos rapidamente em lógica de programação, para um software poder ser realmente útil, é preciso ter um meio de avaliar condições/valores para decidir o que fazer em determinados momentos, além de ser importante haver maneiras práticas de repetir uma determinada tarefa quantas vezes for necessário.
Para mostrar como isso é feito na linguagem Java, vamos voltar alguns passos para rever as instruções para tomada de decisão e laços de repetição, com um pequeno extra ao fim.
Ícone por oNline Web Fonts

TI Livre

Este tutorial de Java faz parte do meu projeto TI Livre, que tem o objetivo de ensinar um pouco do que sei a outras pessoas - porém aproveitando os recursos Google Suite para oferecer uma maior variedade de formatos, tornando esse conteúdo mais acessível.
Cada parte do tutorial, incluindo essa, será publicada junto com uma apresentação de slides - ambos com o conteúdo de um capítulo da apostila online. Entretanto mais formatos podem ser adicionados no futuro.
Sendo um projeto Livre, você pode usar e compartilhar à vontade, só lembre de dar créditos quando o fizer.

Velho conhecido

Esse é exatamente o mesmo exemplo da parte anterior, que mostra na prática o primeiro tópico de hoje.
Ver no Github Gist
Ver no Ideone

Como deve ser fácil de notar para quem estudou Lógica de programação e/ou já conhece outra linguagem da família do C, a parte que interessa agora está no método IntAverage.

Loops

A forma mais simples de executar uma mesma tarefa repetidas vezes, até mesmo um número desconhecido de vezes, é utilizando os laços de repetição (loops): estruturas lógicas que permitem executar um mesmo código quantas vezes necessário.

For

No exemplo de média, é usado para fazer a soma um dos principais laços de repetição suportados pelo Java, o loop for, com o qual adicionamos cada número ao resultado. A sintaxe desse laço pode ser dividida em três partes separadas por ponto e vírgula:

for ({declaração} ; {condição} ; {passo})

No caso do exemplo, a parte de declaração é usada para duas variáveis de nome auto-explicativo: Index e Limit. É uma boa prática sempre declarar variável de limite em loops de ordem crescente, para deixar o código mais claro e por questão de desempenho (variáveis locais tem leitura mais rápida que campos de objetos/arrays), para loops decrescentes é recomendável usar por questão de padronização.
A condição lógica é verificada antes de cada iteração (repetição), servindo como o critério de parada para o loop. No momento em que ela for testada e o resultado for falso, a execução do for acaba.
Por fim, a parte de passo é onde definimos uma ação para ser executada em toda iteração do laço de repetição, normalmente incrementar ou decrementar uma variável de índice.

Foreach

Nessa variação do exemplo de média, mudamos o loop for para sua variante “foreach” – na qual não precisamos lidar com índices e limites, apenas com os valores que nos importam.
Ver no Github Gist
Ver no Ideone

Embora tenha uma sintaxe bem mais conveniente, é preciso lembrar que essa variante é mais lenta em arrays e não permite trabalhar diretamente com índices caso seja necessário.

Decisões

Há duas formas de fazer o próprio programa conseguir decidir o que fazer no Java: decidir por condição lógica ou por valor. Cada forma possui uma instrução própria.

If e Else

A instrução if permite decidir à partir de uma ou mais condições lógicas se um bloco de código deve ser executado caso o resultado seja verdadeiro e, opcionalmente, um outro bloco (else) para o caso do resultado ser falso. Possui a seguinte sintaxe:

if ( {condições} ) {
     // Código se for verdadeiro
} else {
     // Código se for falso
}

Note que o que importa para qual caminho será seguido é apenas o resultado das condições lógicas na instrução if, podendo haver uma expressão com quantas condições forem necessárias. Vale ressaltar que a instrução para caso falso (else) e o bloco de código que a segue são opcionais.
Também é possível “encadear” sequências de diferentes condições lógicas através da instrução else if:

if ( {condição 1} ) {
     ...
} else if ( {condição 2} ) {
     ...
} else {
     ...
}

Switch

Muitas vezes é conveniente apenas verificar se uma variável tem uma certo valor pré-determinado, um teste voltado à mais simples das condições lógicas: igualdade de valor. Quando se precisa testar uma série de valores para uma mesma variável, usar várias decisões com if pode se tornar bastante trabalhoso e desnecessariamente complexo – além de obviamente ser lento testar os valores um a um.
É aí que entra a instrução switch: permite comparar uma variável a diversos valores pré-definidos de uma só vez para decidir o que fazer e, opcionalmente, definir o que fazer caso nenhum dos valores corresponda ao valor recebido. Possui a seguinte sintaxe:

switch ( {variável} ) {
     case {valor 1}:
         // Se tiver primeiro valor
         ...
         break;
     case {valor 2}:
     case {valor 3}:
         // Se tiver o segundo ou o terceiro valor
         ...
         break;
     default:
         // Se não tiver nenhum dos valores
         ...
         break;
}

Cada valor para testar deve ter um bloco case correspondente a esse valor. O código do bloco é executado até a instrução break (que encerra a execução do switch), pulando para o próximo case se o atual não tiver a instrução break. Caso nenhum bloco case corresponda ao valor da variável, o bloco default será executado (se tiver sido declarado).

Mais loops

While

Similar à instrução if, permite repetir a execução de um trecho de código enquanto uma condição for verdadeira. Tem a seguinte sintaxe:

while ( {condição} ) {
     // Código para repetir }

Uma simples aplicação prática:
Ver no Github Gist
Ver no Ideone

While

Em certas circunstâncias precisamos executar um bloco de código antes de saber se a condição é verdadeira, repetindo ele enquanto a condição se mantiver verdadeira.
Para isso usa-se o loop do-while, com a seguinte sintaxe:

do {
     // Código para repetir
} while ( {condição} );

O último exemplo pode ser facilmente re-escrito para usar o loop do-while, o que tornaria desnecessário declarar um valor padrão para a variável Action.

Uma pitada de exceção

Nem sempre a execução de um programa ocorre da forma esperada, podem acontecer erros que o desenvolvedor não pensou em prever - como um usuário digitar letras onde se pede números - ou que estão além de seu controle - como um servidor remoto que o programa tenta acessar ficar fora do ar.
Para lidar com esses erros o Java traz as exceções: classes cujas instâncias armazenam todos os detalhes sobre determinados erros e a sequência de execução até o local onde ocorreu o problema.

Vemos um uso prático de exceção no exemplo do loop while, onde o método inicial (main) declara, através da palavra chave throws, que uma exceção do tipo Exception (o mais geral possível) pode ser lançada durante a execução do software sem nenhum tratamento para o erro. Isso se deve ao uso do método read() de System.in, que gera uma exceção caso haja algum problema na leitura de dados.

Veremos mais sobre Exceções na próxima parte, com o aprofundamento da Orientação a Objetos na linguagem Java.

Comentários