Java/Comandos de seleção

Origem: Wikilivros, livros abertos por um mundo aberto.

Como pode-se notar, o conhecimento adquirido até aqui não permite a criação de programas interativos. Eles sempre executam da mesma forma, independente do que o usuário faz ou dos valores que são recebidos. Mas agora iremos aprender a usar alguns comandos que permitem que dependendo das circunstâncias, os programas executem instruções diferentes.

A instrução if[editar | editar código-fonte]

A instrução de seleção única if, também conhecida por if-then, possibilita a execução condicional de um bloco de instruções.

if (expressaoBooleana) {
    //instruções que serão executadas caso a expressaoBooleana resulte true.
}

Depois da palavra-chave if é necessária uma expressão booleana entre parênteses. Caso a expressão booleana resulte no valor true em tempo de execução então o bloco seguinte será executado, caso resulte em false aquele será ignorado. O bloco de instruções pode conter 0 ou mais instruções. As chaves que delimitam o bloco são opcionais caso se tenha apenas uma instrução a ser executada.

int hora = 20;
boolean eManha = false;

// Exemplo 1: com bloco.
if (hora <= 12) {
    eManha = true;
    System.out.print(hora + " AM");
}

//Exemplo 2: sem bloco.
if (!eManha)
    System.out.print(hora - 12 + " PM");
System.out.println(" é o mesmo que " + hora + " horas."); //Esta linha é incondicionalmente exibida
8 PM é o mesmo que 20 horas.

A instrução if...else[editar | editar código-fonte]

Também conhecida como instrução if-then-else, a instrução de seleção dupla if...else tem função complementar à de if: executa instruções no caso da expressão booleana de if resultar em false.

if (expressaoBooleana) {
    //instruções que serão executadas caso a expressaoBooleana resulte true.
} else {
    //instruções que serão executadas caso a expressaoBooleana resulte false.
}

A palavra chave else deve estar logo após da(s) instrução(ões) de if. Após a palavra chave else deve ser colocado o bloco de instruções a serem executadas no caso da expressão booleana de if resultar em false. Assim como if, as chaves delimitadoras de bloco são opcionais caso haja apenas uma instrução a executar.

int hora = 20;

if (hora <= 12) 
    System.out.print(hora + " AM");
else
    System.out.print(hora - 12 + " PM");
System.out.println(" é o mesmo que " + hora + " horas."); //Esta linha é incondicionalmente exibida
8 PM é o mesmo que 20 horas.

Instruções if...else aninhadas[editar | editar código-fonte]

As instruções if ou if...else podem ser aninhadas dentro de outras instruções if ou if...else para casos em que antes de determinadas instruções serem executadas sejam necessárias combinações de resultados de expressões booleanas.

if (expressaoBooleana1) {
    if (expressaoBooleana2) {
    // Instruções a serem executadas caso as expressões booleanas 1 e 2 resultem em true.
    } else {
    // Instruções a serem executadas caso a expressão booleana 1 resulte em true, e a 2 em false.
    }
} else {
     if (expressaoBooleana3) {
    // Instruções a serem executadas caso a expressão booleana 1 resulte em false, e a 2 em true.
    } else {
    // Instruções a serem executadas caso as expressões booleanas 1 e 3 resultem em false.
    }
}

As instruções if e if...else aninhadas não apresentam nenhum comportamento diferente do esperado caso não estivessem aninhadas. Estão sendo abordadas apenas com o intuito de exemplificar a possibilidade de aumento das ramificações de decisões.

int hora = 20;

if (hora < 0 || hora >= 24)
    if (hora < 0)
        System.out.print("Erro: A hora deve ser maior que 0.");
    else
        System.out.print("Erro: A hora deve ser menor que 24.");
else {
    if (hora <= 12) 
        System.out.print(hora + " AM");
    else
        System.out.print(hora - 12 + " PM");
    System.out.println(" é o mesmo que " + hora + " horas."); //Esta linha é incondicionalmente exibida
}

É possível verificar no exemplo acima que a primeira instrução if mesmo contendo mais de uma linha de instruções consegue identificar que o if...else forma uma única ramificação e assim executar a expressão booleana normalmente. Isso se deve ao fato que toda else está vinculada a uma if. Já na else com o escopo mais externo, verifica-se chaves delimitadoras de bloco. Essas chaves são necessárias por conta de uma segunda instrução, nomeadamente System.out.println(), que é executada independentemente do resultado da expressão booleana da if...else.

int hora = 20;

if (hora < 0)
    System.out.print("Erro: A hora deve ser maior que 0.");
else if (hora >= 24)
    System.out.print("Erro: A hora deve ser menor que 24.");
else if (hora <= 12) 
    System.out.print(hora + " AM é o mesmo que " + hora + " horas.");
else
    System.out.print(hora + " PM é o mesmo que " + hora + " horas.");
}

No exemplo acima há um recurso estilístico para indentar o código com a finalidade de aprimorar a legibilidade. As palavras chave if foram anexadas às palavras chave else já que as else têm somente uma instrução cada e por isso não necessitam de chaves para delimitar bloco de instruções. O código abaixo tem exatamente a mesma funcionalidade apesar das quebras de linha.

int hora = 20;

if (hora < 0) 
    System.out.print("Erro: A hora deve ser maior que 0.");
else 
    if (hora >= 24)
        System.out.print("Erro: A hora deve ser menor que 24.");
    else 
        if (hora <= 12) 
            System.out.print(hora + " AM é o mesmo que " + hora + " horas.");
        else
            System.out.print(hora + " PM é o mesmo que " + hora + " horas.");

A instrução switch[editar | editar código-fonte]

A instrução switch por vezes chamada de switch...case possibilita a execução condicional de instruções de acordo com a correspondência entre a expressão avaliada e a constante em case.

switch (expressao) {
    case constante1: 
        // Instruções
        break;
    case constante2: 
        // Instruções
        break;
    case default: 
        // Instruções
}

Dentro do parâmetro da switch pode ser utilizada expressão que resulte em: byte, short, char, int, String e enum. As chaves que delimitam o bloco são necessárias ainda que só haja uma ramificação do fluxo do código. A palavra chave case indica as ramificações de código. Deve ser seguida de uma expressão constante que corresponda ao tipo da expressão inserida no parâmetro da switch, e essa expressão constante, por sua vez, deve ser seguida de : que é o carácter que delimita o início do bloco de instruções relativo à case. Após : podem ser inseridas 0 ou mais instruções, incluindo a palavra chave break que será abordada mais adiante. Ao iniciar outra instrução case ou inserir a chave de fechamento do bloco de switch o bloco anterior é encerrado.

int dia = 5;
final int segunda = 2;
final int sexta = 6;

switch (dia) {
    case segunda:
        System.out.print("Segunda ");
    case 3:
	System.out.print("Terça ");
    case 4:
	System.out.print("Quarta ");
    case 5:
	System.out.print("Quinta ");
    case sexta:
	System.out.print("Sexta ");
    case 7:
	System.out.print("Sábado ");
    case 0:
    case 1:
	System.out.print("Domingo ");
}
Quinta Sexta Sábado Domingo 

Em tempo de execução, a variável dia será comparada com as expressões constantes, definidas em tempo de compilação, de cada case. O case contendo o valor 5 tem valor igual ao da variável dia, então desse ponto em diante todas as instruções serão executadas até que chegue o término do bloco de switch.

A instrução break[editar | editar código-fonte]

Caso seja necessário que apenas sejam executadas instruções vinculadas a determinadas case então deve-se utilizar a instrução break. Após a instrução break o fluxo do programa sai do bloco de switch.

int dia = 5;
final int segunda = 2;
final int sexta = 6;

switch (dia) {
    case segunda:
        System.out.print("Segunda ");
    case 3:
	System.out.print("Terça ");
    case 4:
	System.out.print("Quarta ");
    case 5:
	System.out.print("Quinta ");
    case sexta:
	System.out.print("Sexta ");
	break;
    case 7:
	System.out.print("Sábado ");
    case 0:
    case 1:
	System.out.print("Domingo ");
}
System.out.println("\n-> Fora do bloco de instruções de switch.");

Com a instrução break inserida no bloco da case com valor sexta, o código será executado da case com valor 5 até essa break referida.

Quinta Sexta 
-> Fora do bloco de instruções de switch.

A instrução default[editar | editar código-fonte]

A instrução default pode ser utilizada para o caso da expressão no parâmetro de switch não corresponder a nenhum dos valores das instruções case. default pode aparecer em qualquer ordem e segue o mesmo funcionamento que case no que tange a bloco de instruções e uso de break.

int dia = -5;
final int segunda = 2;
final int sexta = 6;

switch (dia) {
    case segunda:
        System.out.print("Segunda ");
    case 3:
	System.out.print("Terça ");
    case 4:
	System.out.print("Quarta ");
    default:
	System.out.println("erro: dia deve estar entre [0, 7]");
	break;  
    case 5:
	System.out.print("Quinta ");
    case sexta:
	System.out.print("Sexta ");
	break;
    case 7:
	System.out.print("Sábado ");
    case 0:
    case 1:
	System.out.print("Domingo ");
}
erro: dia deve estar entre [0, 7]

Exercícios[editar | editar código-fonte]

// Exercícios 1 e 2.
int a = 5;

if (a > 2)
    if (a < 4)
        System.out.println("a é igual a 3.");
else
    System.out.println("a é menor ou igual a 2.");

Dado o código acima, responda:

1. O que será impresso na tela? A afirmação está correta?
Será exibido a é menor que 2. porém a informação está incorreta. A instrução else está vinculada a if imediatamente anterior, e no parâmetro dessa if a expressão booleana resultará false. Logo, a informação correta seria a é maior ou igual a 4..
2. Como corrigir o código?
int a = 5;

if (a > 2) {
    if (a < 4)
        System.out.println("a é igual a 3.");
} else
    System.out.println("a é menor ou igual a 2.");
// Exercício 3.
double b = 10.5;
double c = 2.0;

if (b == c) 
    System.out.println("b é igual a c");
else if (b > c)
    System.out.println("b é maior que c");
else if (b < c)
    System.out.println("b é menor que c");

Dado o código acima, responda:

3. Remova o código desnecessário, defina blocos de instruções para todas as instruções if...else e indente.
A última expressão booleana (b < c) não é necessária pois caso um número b não seja maior ou igual a um número c, obviamente ele será menor.
double b = 10.5;
double c = 2.0;

if (b == c) {
    System.out.println("b é igual a c");
} else {
    if (b > c) {
        System.out.println("b é maior que c");
    } else {  
        System.out.println("b é menor que c");
    }
}