## Instruções condicionais

Programas feitos simplesmente de um conjunto de instruções similares ao do exercício anterior são bastante chatos. Eles sempre fazem a mesma coisa, e não reajem a condições externas. Um condicional faz o programa se adaptar fazendo coisas do tipo se está chovendo, pegue um guarda-chuva.

A sintaxe de [!thelang] é a seguinte:

    [!java|scala|c]if (condição) {
        oQueFazerSeForVerdade();
        oQueFazerDepoisSeForVerdade();
    }[/!][!python]if condição:
        oQueFazerSeForVerdade()
        oQueFazerDepoisSeForVerdade()[/!]
    oQueFazerDeUmJeitoOuDeOutro()[!java|c];[/!]

Se a condição for verdade, o código do próximo bloco será executado e então o resto do código continua. Se a condição for falsa, o próximo bloco é ignorado e a execução continua depois disto. O bloco condicional pode conter várias instruções, pode até mesmo conter outros testes, com seus próprios sub-testes.

Neste exemplo, as instruções `oQueFazerSeForVerdade()` e `oQueFazerDepoisSeForVerdade()` serão executadas se e somente se a condição for verdadeira, mas a instrução `oQueFazerDeUmJeitoOuDeOutro()` vai ser executada se a condição for verdadeira ou não.

Em [!thelang], os blocos de código são [!java|scala|c]envolvidos entre chaves: um { abre o bloco, e um } fecha. Espaços em branco não são importantes[/!][!java|c].[/!][!scala], uma vez que suas instruções ainda estejam separadas com um ponto-e-vírgula ou um fim-de-linha.[/!] [!java|scala|c]Ainda assim é muito importante indentar corretamente seu código para mantê-lo legível.[/!] [!python]marcados pela indentação: todas as linhas que estiverem um pouco deslocadas para a direita com espaços pertencem ao bloco. Frequentemente se usam 4 espaços para indentação, mas funciona se você usar mais ou menos espaços. Resumindo, quaisquer linhas do bloco devem usar a mesma quantidade de espaços. O fim do bloco de código Python não é marcado por nenhum caractere específico. Indentar linhas começa um bloco e parar de indentar termina o bloco. Não esqueça do dois-pontos (:) no final da linha do `if`, python precisa dele para saber que um novo bloco vai começar. O fato de que python se baseia em indentação para delimitar blocos é uma ótima propriedade para iniciantes: vai forçar você a aderir a padrões de apresentação de código estritos.[/!] É muito fácil se perder no seu próprio código se ele não for corretamente indentado, então você precisa deixar ele bem arrumado para que trabalhar nele continue sendo agradável e produtivo.

Todas as indentações de um dado bloco devem ser consistentes, e não é possível cortar um bloco. os dois códigos a seguir estão incorretos e devem resultar em erro.

    if condição:
        oQueFazer()
         oQueFazerDepois() # um espaço a mais
    oQueFazerDeUmJeitoOuDeOutro()

    se condição:
        oQueFazer()
    oQueFazerDeUmJeitoOuDeOutro()
        oQueFazerASeguir() # este bloco não está condicionado a uma linha de condição

A condição deve ser uma expressão `[!c]int[/!][!java]boolean[/!][!scala|python]Boolean[/!]`. O bloco interno do código será executado se a expressão for calculada como `[!c]1[/!][!java|scala]true[/!][!python]True[/!]` e será ignorado se for `[!c]0[/!][!java|scala]false[/!][!python]False[/!]`. [!python|scala|java]`[!java|scala]true[/!][!python]True[/!]` e `[!java|scala]false[/!][!python]False[/!]` são valores constantes definidos por [!thelang] diretamente, assim como 0 ou 1 na matemática.[/!]

A condição pode ser uma variável `[!c]int[/!][!java]boolean[/!][!scala|python]Boolean[/!]` (vamos voltar a falar de variáveis num próximo exercício, não se preocupe) ou um teste aritmético, como `x == 5`, que verifica se o valor atual de `x` é 5, ou algo como != (verificando inequação, ou seja, retornando [!c]1[/!][!java|scala]true[/!][!python]True[/!] apenas se o lado esquerdo é diferente do lado direito), < (menor que), > (maior que), <= (menor ou igual a), >= (maior ou igual a).

Cuidado com um erro clássico, que é verificar a igualdade da variável usando = no lugar de ==. Ainda bem que o [!java|scala|c]compilador[/!][!python]interpretador[/!] detecta este problema na maior parte das vezes, mas às vezes passa (como quando você está atribuindo valor a uma variável [!c]int[/!][!java|python|scala]booleana[/!]). Então é bom ter cuidado...

A condição pode também ser uma chamada para alguns métodos particulares que retornam booleano. Por exemplo, o método `estáDeFrenteParaParede()` do buggle retorna [!c]1[/!][!java|python|scala]true[/!] se o buggle está olhando para uma parede, e false caso contrário.

Finalmente, uma condição pode ser composta de várias sub-condições conectadas por operadores booleanos:

- `cond1 [!java|scala|c]&&[/!][!python]and[/!] cond2` é verdadeiro (true) quando `cond1` e `cond2` são ambos verdadeiros (se `cond1` é falso (false), `cond2` não é nem sequer calculado pois sabe-se previamente que a conjunção das duas proposições não pode ser verdadeira).
- `cond1 [!java|scala|c]||[/!][!python]or[/!] cond2` é verdadeiro se `cond1` ou `cond2` é verdadeiro (se `cond1` é verdadeiro, `cond2` não é nem sequer calculada pois já se sabe que a disjunção de ambas as proposições não pode ser verdadeira).
- `[!java|scala|c]![/!][!python]not [/!]cond` é verdadeira se `cond` é falsa.
- Quando a expressão se torna complicada, é melhor adicionar parêntesis para forçar a ordem de cálculo. Não hesite em adicionar mais parêntesis para remover ambiguidades que apareçam na expressão.

Por fim, é possível especificar o que fazer quando a condição é falsa usando a seguinte sintaxe. Neste caso, a instrução `oQueFazerSeForFalso` será executada apenas se a condição for falsa.

    [!java|scala|c]if (condição) {
        oQueFazerSeCondiçãoÉVerdadeira();
    } else {
        oQueFazerSeForFalsa();
    }[/!][!python]if (condição):
        oQueFazerSeCondiçãoÉVerdadeira()
    else:
        oQueFazerSeForFalsa()[/!]

Não esqueça do dois-pontos (:) depois do else, ele indica que um novo bloco está começando.

### Objetivo do exercício

Se o buggle está de cara numa parede, você deve se mover um passo para trás. Se não, você deve se mover um passo para frente. para detectar se você está de cara para uma parede, simplesmente use a função pré-fabricada `estáDeFrenteParaParede()`, que todo buggle entende.

Este exercício é um pouco diferente: seu código tem que funcionar para vários buggles, cada um começando numa posição diferente. O mesmo código será executado para cada um deles.

Quando seu programa funcionar, vá para o próximo exercício, que está escondido numa sub-árvore da janela de seleção.