Neste artigo veremos o conceito de ramificação em programas de computador em geral e naqueles escritos em Java. Vamos falar sobre estruturas de controle como:
if-then
(ouif
)if-then-else
(ouif-else
)switch-case
Ramificação
Vamos começar com os conceitos básicos. Qualquer programa é um conjunto de comandos executados por um computador. Na maioria das vezes, os comandos são executados sequencialmente, um após o outro. Um pouco menos frequentemente (mas ainda com bastante frequência) surgem situações em que você precisa alterar o fluxo sequencial dos comandos do programa. Às vezes, dependendo de certas condições, pode ser necessário executar um bloco de comandos em vez de outro. E quando essas condições mudarem, faça o oposto. Por exemplo, existem vários sites cuja visita é proibida para menores de 18 anos. Normalmente, ao visitar tal recurso pela primeira vez, o usuário é saudado com algum formulário no qual é avisado sobre o limite de idade e solicitado a inserir sua data de nascimento. Então, dependendo dos dados que o usuário inseriu, ele terá permissão para entrar no recurso ou não. Essa funcionalidade é fornecida pelo que é comumente chamado de ramificação. Vamos dar outra analogia. Vamos nos imaginar na encruzilhada de sete estradas. Temos uma escolha: virar à esquerda ou à direita, ou seguir em frente. Nossa escolha é baseada em certas condições. Também não temos oportunidade de percorrer várias estradas ao mesmo tempo. Aqueles. dependendo de algumas condições, teremos que escolher uma estrada. O mesmo princípio se aplica à ramificação. Agora vamos tentar dar uma definição de ramificação. A ramificação é uma construção algorítmica na qual, dependendo da veracidade de alguma condição, uma das diversas sequências de ações é executada. A ramificação é implementada (provavelmente) em absolutamente todas as linguagens de programação. A linguagem de programação Java possui várias construções de controle que permitem implementar ramificações em seu programa. Existem 3 dessas construções na linguagem de programação:- Operador
if-then
- Operador
if-then-else
- Operador ternário
? :
if-else
e switch-case
.
se então
Operadorif-then
, ou simplesmente if
talvez o operador mais comum. A expressão “sim, escreva 1 se” já se popularizou. O operador if
possui a seguinte estrutura:
if (bool_condition) {
statement
}
Neste projeto:
bool_condition
é uma expressão booleana avaliada como verdadeira ou falsa. Esta expressão é chamada de condição.statement
— um comando (pode haver mais de um) que deve ser executado se a condição for verdadeira (bool_statement==true
)
Если (bool_condition), то {statement}
aqui estão alguns exemplos:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
int a = scanner.nextInt();
if (a < 10) {
System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
}
}
Neste programa, o usuário é solicitado a inserir a porcentagem de carga da bateria de seu smartphone. Se restarem menos de 10% da carga, o programa avisará o usuário sobre a necessidade de carregar o smartphone. Este é um exemplo do design mais simples if
. Vale ressaltar que se a variável `a` for maior ou igual a 10, nada acontecerá. O programa continuará a executar o código que segue o arquivo if
. Observe também que neste caso, a construção if
possui apenas uma sequência de ações para executar: imprimir o texto ou não fazer nada. Esta é uma variação de ramificação com um “ramo”. Às vezes isso é necessário. Por exemplo, quando queremos nos proteger de valores incorretos. Por exemplo, não podemos descobrir o número de letras em uma string se a string for null
. Exemplos abaixo:
public static void main(String[] args) {
String x = null;
printStringSize(x);
printStringSize("Не представляю своей жизни без ветвлений...");
printStringSize(null);
printStringSize("Ифы это так захватывающе!");
}
static void printStringSize(String string) {
if (string != null) {
System.out.println("Кол-во символов в строке `" + string + "`=" + string.length());
}
}
Como resultado da execução do método principal, o seguinte será enviado ao console:
Количество символов в строке `Не представляю своей жизни без ветвлений...`=43
Количество символов в строке `Ифы это так захватывающе!`=25
Graças à verificação disso string != null
, conseguimos evitar erros no programa. E não faça nada nos casos em que a variável string
era igual a null
.
se-então-senão
Se, em condições normais,if
um programa tem uma escolha: “fazer algo ou não fazer nada”, então, ao if-else
escolher um programa, a escolha é “fazer uma coisa ou outra”. A opção “não fazer nada” desaparece. Existem duas ou mais variantes de execução (ou número de ramificações) com este tipo de ramificação. Consideremos o caso quando existem duas opções. Então a estrutura de controle tem a seguinte forma:
if (bool_condition) {
statement1
} else {
statement2
}
Aqui:
bool_statement
é uma expressão booleana avaliada como verdadeira ou falsa. Esta expressão é chamada de condição.statement1
— um comando (pode haver mais de um) que deve ser executado se a condição for verdadeira (bool_statement==true
)statement2
— um comando (pode haver mais de um) que deve ser executado se a condição for falsa (bool_statement==false
)
Если (bool_condition), то {statement1}
Иначе {statement2}
Aqui está um exemplo:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
int a = scanner.nextInt();
if (a < 10) {
System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
}
O mesmo exemplo sobre o nível da bateria de um smartphone. Só que se da última vez o programa apenas avisou sobre a necessidade de carregar o smartphone, desta vez temos uma notificação adicional. Vejamos este if
:
if (a < 10) {
System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
Se for a < 10
verdade (nível da bateria inferior a 10), o programa imprimirá um texto. Caso contrário, se a condição a < 10
não for atendida, o programa produzirá um texto completamente diferente. Finalizemos também nosso segundo exemplo, no qual exibimos o número de letras em uma linha. Da última vez, o programa não gerou nada se a string passada fosse igual a null
. Vamos consertar isso transformando o normal if
em if-else
:
public static void main(String[] args) {
String x = null;
printStringSize(x);
printStringSize("Не представляю своей жизни без ветвлений...");
printStringSize(null);
printStringSize("Ифы это так захватывающе!");
}
static void printStringSize(String string) {
if (string != null) {
System.out.println("Кол-во символов в строке `" + string + "`=" + string.length());
} else {
System.out.println("Ошибка! Переданная строка равна null!");
}
}
No método , adicionamos um bloco printStringSize
à construção . Agora, se executarmos o programa, ele exibirá no console não 2 linhas, mas 4, embora a entrada (método ) permaneça a mesma da última vez. O texto que o programa irá gerar: if
else
main
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
As situações são aceitáveis quando else
são seguidas não por comandos de execução, mas por outro if
. Então a construção assume a seguinte forma:
If (bool_condition1) {
statement1
} else if (bool_condition2) {
statement2
} else if (bool_conditionN) {
statementN
} else {
statementN+1
}
Este design tem várias condições:
- bool_condição1
- bool_condição2
- bool_condiçãoN
- declaração1
- declaração2
- declaraçãoN
statement
pode conter 1 ou mais linhas de código. As condições são verificadas uma por uma. Uma vez determinada a primeira condição verdadeira, uma série de comandos “vinculados” à condição verdadeira será executada. Após executar esses comandos, o programa sairá do bloco if
, mesmo que houvesse mais verificações pela frente. A expressão “instruçãoN+1” será executada se nenhuma das condições definidas acima for verdadeira. Esta construção pode ser lida assim:
Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Иначе {statementN+1}
A última linha neste caso é opcional. Você pode passar sem o último solitário else
. E então o design terá a seguinte forma:
If (bool_condition1) {
statement1
} else if (bool_condition2) {
statement2
} else if (bool_conditionN) {
statementN
}
E será assim:
Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Conseqüentemente, se nenhuma das condições for verdadeira, nenhum comando será executado. Passemos aos exemplos. Voltemos à situação do nível de carga do smartphone. Vamos escrever um programa que informará o proprietário com mais detalhes sobre o nível de carga de seu dispositivo:
public static void main(String[] args) {
String alert5 = "Я скоро отключусь, но помни меня бодрым";
String alert10 = "Я так скучаю по напряжению в моих жилах";
String alert20 = "Пора вспоминать, где лежит зарядка";
String alert30 = "Псс, пришло время экономить";
String alert50 = "Хм, больше половины израсходовали";
String alert75 = "Всё в порядке, заряда больше половины";
String alert100 = "Я готов к приключениям, если что..";
String illegalValue = "Такс, кто-то ввел некорректное meaning";
Scanner scanner = new Scanner(System.in);
System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
int a = scanner.nextInt();
if (a <= 0 || a > 100) {
System.out.println(illegalValue);
} else if (a < 5) {
System.out.println(alert5);
} else if (a < 10) {
System.out.println(alert10);
} else if (a < 20) {
System.out.println(alert20);
} else if (a < 30) {
System.out.println(alert30);
} else if (a < 50) {
System.out.println(alert50);
} else if (a < 75) {
System.out.println(alert75);
} else if (a <= 100) {
System.out.println(alert100);
}
}
Por exemplo, neste caso, se o usuário digitar 15, o programa exibirá na tela: “É hora de lembrar onde está o carregador”. Apesar de 15 ser menor e 30 e 50 e 75 e 100, a saída na tela será apenas 1. Vamos escrever outro aplicativo que imprimirá no console em que dia da semana estamos:
public static void main(String[] args) {
// Определим текущий день недели
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
if (dayOfWeek == DayOfWeek.SUNDAY) {
System.out.println("Сегодня воскресенье");
} else if (dayOfWeek == DayOfWeek.MONDAY) {
System.out.println("Сегодня понедельник");
} else if (dayOfWeek == DayOfWeek.TUESDAY) {
System.out.println("Сегодня вторник");
} else if (dayOfWeek == DayOfWeek.WEDNESDAY) {
System.out.println("Сегодня среда");
} else if (dayOfWeek == DayOfWeek.THURSDAY) {
System.out.println("Сегодня четверг");
} else if (dayOfWeek == DayOfWeek.FRIDAY) {
System.out.println("Сегодня пятница");
} else if (dayOfWeek == DayOfWeek.SATURDAY) {
System.out.println("Сегодня суббота");
}
}
É conveniente, claro, mas a abundância de texto monótono deslumbra um pouco os olhos. Nas situações em que temos um grande número de opções, é melhor utilizar a operadora, que será discutida a seguir.
caixa de comutação
Uma alternativa ao negritoif
com muitas ramificações é o operador switch-case
. Este operador parece dizer “Então, temos esta variável. Olha, se o valor dele for igual a `x`, então fazemos isso e aquilo, se o valor dele for igual a `y`, então fazemos de forma diferente, e se não for igual a nenhum dos itens acima, apenas fazemos é assim... ” Este operador possui a seguinte estrutura.
switch (argument) {
case value1:
statement1;
break;
case value2:
statement2;
break;
case valueN:
statementN;
break;
default:
default_statement;
break;
}
Vejamos essa estrutura com mais detalhes. argument
é uma variável cujo valor compararemos com diferentes opções hipotéticas. A variável deve ser final
. Vale dizer também que o operador switch
não suporta nenhum tipo de dado como argumento. Os tipos válidos estão listados abaixo:
- byte e byte
- curto e curto
- int e inteiro
- personagem e personagem
- enumeração
- Corda
case value1 (value2, valueN)
- são valores, constantes específicas com as quais comparamos o valor de uma variável argument
. Além disso, cada caso define um conjunto de comandos que precisam ser executados. statement1
, statement2
, statementN
são comandos que precisarão ser executados se argument
for igual a um de value
. Por exemplo, se argument
for igual a value2
, o programa será executado statement2
. default
e default_statement
são “valores padrão”. Caso argument
não seja igual a nenhum dos apresentados value
, então a ramificação será acionada default
e o comando será executado default_statement
. default
e default_statement
são atributos opcionais do operador switch-case
. break
— você pode notar que no final de cada bloco case há uma instrução break
. Este operador também é opcional e serve para diferenciar o código de diferentes casos. Às vezes é necessário realizar as mesmas ações em casos diferentes: então esses casos podem ser combinados. Neste caso, a palavra-chave break
é omitida e a estrutura do operador switch-case
ficará assim:
switch (argument) {
case value1:
statement1;
break;
case valueX:
case valueY:
statementXY;
break;
}
É importante notar que não há operador entre `case valueX:` e `case valueY:` break
. Aqui, se argument
for igual a value1
, será executado statement1
. E se o argumento for igual valueX
a valueY
, statementXY
. Vamos diluir a teoria difícil de entender em uma prática fácil de entender. Vamos reescrever o exemplo com dias da semana usando o operador switch-case
.
public static void main(String[] args) {
// Определим текущий день недели
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
switch (dayOfWeek) {
case SUNDAY:
System.out.println("Сегодня воскресенье");
break;
case MONDAY:
System.out.println("Сегодня понедельник");
break;
case TUESDAY:
System.out.println("Сегодня вторник");
break;
case WEDNESDAY:
System.out.println("Сегодня среда");
break;
case THURSDAY:
System.out.println("Сегодня четверг");
break;
case FRIDAY:
System.out.println("Сегодня пятница");
break;
case SATURDAY:
System.out.println("Сегодня суббота");
break;
}
}
Agora vamos escrever um programa que mostre se hoje é dia de semana ou fim de semana usando o operador switch-case
.
public static void main(String[] args) {
// Определим текущий день недели
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
switch (dayOfWeek) {
case SUNDAY:
case SATURDAY:
System.out.println("Сегодня выходной");
break;
case FRIDAY:
System.out.println("Завтра выходной");
break;
default:
System.out.println("Сегодня рабочий день");
break;
}
}
Deixe-me explicar um pouco. Neste programa obtemos enum DayOfWeek
, que denota o dia atual da semana. A seguir, verificamos se o valor da nossa variável é igual aos dayOfWeek
valores de SUNDAY
qualquer uma delas SATURDAY
. Se for este o caso, o programa exibe “Hoje é dia de folga”. Caso contrário, verificamos se o valor da variável é igual ao dayOfWeek
valor de FRIDAY
. Se for esse o caso, o programa exibe “Amanhã é dia de folga”. Se neste caso não houver, então temos poucas opções, qualquer dia restante é dia de semana, então por padrão, se hoje NÃO for sexta, NÃO sábado e NÃO domingo, o programa exibirá “Hoje é dia útil”.
Conclusão
Portanto, neste artigo vimos o que é ramificação em um programa de computador. Também descobrimos quais estruturas de controle são usadas para implementar ramificações em Java. Discutimos projetos como:if-then
if-then-else
switch-case
GO TO FULL VERSION