Quaddro + MacMagazine: programando em C — estruturas condicionais

Declaração de variável IF

Depois de abordar o trabalho com variável no último texto, desta vez vou ensinar para vocês o trabalho com estruturas condicionais.

Publicidade

Poucos são os programas que além de variáveis não usem algum tipo de condicional ou repetidor, então a partir desses três elementos básicos nós conseguiremos criar códigos bem mais elaborados.

Pré-requisitos

The Game Has Changed, de “TRON: Legacy” ♪

Conceitos: condicionais

Vamos começar falando de condicionais, até porque eles serão necessários nos repetidores. Conceitualmente um condicional é uma estrutura que analisa uma pergunta e dispara códigos diferentes dependendo da resposta.

Publicidade

Por exemplo, imagine que um aplicativo para iPhone mude a cor de fundo da tela de acordo com o horário do aparelho. Como você verbaliza isso?

SE a hora atual for maior que 12 o fundo de tela fica azul, SENÃO o fundo de tela fica verde.

Outra forma possível é:

CASO o valor seja 12 defina o valor azul, CASO o valor seja 13 defina o valor verde.

Percebam uma coisa nessas expressões: nós as verbalizamos como condições, como hipóteses. Desta forma, é fácil saber em que momento do seu código você precisará implementá-las. Se um sistema tem uma execução linear, ou seja, existe apenas um caminho de execução, os condicionais não são necessários. Porém esse tipo de situação é relativamente rara.

Publicidade

Pensando em um jogo com um personagem andando pela tela (no estilo Super Mario Bros.), existem diversas situaçõs de condicionais. Se atingir um objeto ele pode ganhar pontos, ou então perder uma vida se cair em um lugar errado. Se pegar um cogumelo [legalizado…], ele fica maior e mais forte. Se o tempo da fase acabar, ele perde. E por aí vai…

Notaram a quantidade de SEs no parágrafo acima?! Isso indica claramente que, cada vez que ele foi empregado, no seu código você usaria algum tipo de condicional. Então dá para perceber o quanto os condicionais são usados no dia-a-dia.

Vamos colocar tudo isso em código para fixar esses conceitos.

Publicidade

Prática: condicional IF

Crie um novo projeto com o nome Condicional_IF e salve na sua pasta de estudo. Para casar os assuntos, vamos usar condicionais com variáveis.

Nas explicações anteriores eu citei exemplos com o termo SE. Isso nos leva normalmente a uma pergunta com duas possíveis respostas. Desta forma, vamos dar as boas-vindas ao famoso IF/ELSE.

O condicional IF/ELSE é direcionado para situações nas quais temos uma expressão que pode ter valor verdadeiro ou falso. Imagine uma pergunta de SIM ou NÃO. Para vê-lo na prática, vou começar esse código declarando uma variável, definindo alguns comentários e criando um IF:

Declaração de variável IF

A lógica de um IF é muito simples: o compilador vai avaliar a expressão definida e, de acordo com seu resultado, disparar um bloco de código específico. Pergunto: do jeito que está, se nós rodarmos o código teremos o printf executando e mostrando uma mensagem?

..

.

NÃO!

Aos que responderam rápido que sim, analisem novamente tanto o valor da variável quanto a condição da expressão. O nosso código tem um valor de 12 para a variável hora, mas nós perguntamos se o valor era MAIOR que 12 — e não igual.

Pegadinha, hein?! 😛

Para que nosso IF rode, podemos ajustar a condição para MAIOR IGUAL, bastando usar o operador >=. Confirmem que, com isso, seu código deve ter exibido a mensagem definida.

Porém antes desse ajuste nós não tivemos exibição de mensagem. Uma vez que o resultado da expressão não foi verdadeiro, o IF não é executado. Então de acordo com as dicas que temos nos comentários, vamos definir um ELSE e, para que possamos testá-lo, a expressão tem que ser FALSA. Portanto também vou mudar o valor de hora para 10. O código deverá ficar assim:

Código com ELSE

Percebam que o processo aqui é extremamente simples. Se a expressão resultar em SIM temos um pedaço de código rodando, se o resultado for NÃO o sistema executa outro bloco de código.

Trazendo novamente o cenário de um jogo, imagine que se o tempo for menor que 10 a música muda para uma versão acelerada, por exemplo. Isso mostra que, apesar de ser muito útil, o condicional IF/ELSE é bem simples.

Como teste final para esse código, vamos mudar nossa pergunta para saber se a hora é igual a 12. Percebam que no meu código eu mudei o operador e também as mensagens dos printf, para fazer mais sentido o que veremos no console.

Condicional igual no código

Se vocês rodarem o código do jeito que está nessa imagem, nós temos a variável valendo 10, porém o resultado da pergunta se é igual a 12 foi verdadeiro. Essa situação só não é mais perigosa porque o Xcode é uma “mãe” na hora de mostrar que estamos prestes a fazer besteira. Notem que na imagem do meu código, além de existir uma placa amarela de alerta, toda a expressão do IF está sublinhada de vermelho.

Toda vez que uma placa dessas aparecer, clique nela! Entre as mensagens do Xcode está um alerta para um erro comum dos iniciantes de programação. Quando nós usamos um único igual a operação para o sistema é de atribuição. Isso quer dizer que hora = 12 está mudando o conteúdo da variável para 12 e não perguntando seu valor.

Quando nós queremos comparar valores devemos usar duplo igual (==). O Xcode é tão maroto nessa hora que ele até sugere essa alteração. Clicando na placa amarela do alerta, deve ser a última linha: use == para mudar a atribuição para uma comparação de igualdade. Aqui a solução é ter o duplo igual no lugar do igual simples — se você vai usar o “Fix-it” do alerta ou vai mudar na mão, não há diferença.

Essa questão do igual para atribuir e do duplo para comprar pode parecer bobeira, mas se você vacilar com isso (e se o Xcode não alertasse), o seu código sempre executaria o bloco de código verdadeiro. Dessa forma mesmo se você precisasse, seu ELSE nunca rodaria.

·   ·   ·

Até aqui imagino que esteja tudo bem, então vamos para outro tipo de condicional e para não misturar os estudos e comentários vamos criar um novo projeto. Chamem-no de Condicional_Switch.

A ideia do Switch é servir de base para um tipo de condição que possua várias hipóteses de valor. Por exemplo, em vez de perguntar se a hora é maior que 12, nós podemos ter uma cor para cada hora. O código a seguir ilustra a criação de uma variável e seu consequente uso em um Switch:

Condicional Switch no Xcode

A estrutura de um Switch é visualmente mais organizada do que uma sequência de IF/ELSE. E seu uso é recomendado nesse tipo de comparação encadeada, em que a expressão é comparada com vários possíveis valores.

Analisando o código veremos que a variável foi inicializada com valor 12. A ideia do Switch é definir um case para cada possível resposta. Se um dos case tiver o valor correto, seu código é executado e o comando break faz com que o Switch deixe de ser executado.

Mas se vocês reparerem no meu código, vão perceber que eu não defini nenhum case 12 e por isso, ao rodar, o meu código não exibirá nenhuma mensagem. De certa forma seria a situação em um IF que tivesse expressão falsa. No caso do IF nós temos o ELSE, no Switch nós temos o default.

Percebam que quando o Xcode completa a escrita do Switch ele já insere o bloco do default. A ideia é definir no default o que deverá ser executado quando nenhum case for verdadeiro. Eu vou definir um printf de “Nenhuma das alternativas anteriores”.

Assim como o IF, o Switch também é uma estrutura muito útil e simples, porém ela possui algumas observações importantes:

  1. Não esqueça de inserir o comando break quando definir um case. Se você definir uma sequência de cases sem break separando-os, ao rodar um case o sistema dispara os seguintes também. É um bom teste: rode o código com a variável hora = 10 e retire os break. Às vezes esse comportamento é desejado, quase sempre não é!
  2. Um case não pode usar intervalo, logo, não são usados códigos como case hora < 10, pois o sistema utilizará o resultado da expressão (0 para false ou 1 para true).
  3. Em um primeiro momento não podemos declarar variáveis no começo de um bloco de case. Isso acontece pela forma como o Xcode auto-completa a estrutura do Switch/case. Uma solução é definir o conteúdo de um case dentro de chaves.
  4. Cuidado com o uso e um “carinho” excessivo com o IF/ELSE. Já vi alunos dando altas voltas em código de IF quando o Switch era a melhor opção. A dica é não definir “regras absolutas” de uso. Analise cada situação calmamente antes de começar a programar. Não há nada pior do que ter que remendar um código porque ele não começou da melhor maneira possível.

·   ·   ·

Para fechar este texto vou falar agora de um condicional que, por mais legal e prático que seja, pela minha experiência nas aulas da Quaddro descobri que boa parcela dos programadores não conhece.

O chamado condicional ternário é uma forma de definir algo como um IF/ELSE de uma forma bem enxuta, quase sempre em uma única linha. A imagem a seguir ilustra sua sintaxe, uso e comparação com um IF/ELSE tradicional.

Condicional ternário no Xcode

Percebam que, ao declarar variáveis para salário e contas, eu optei pelo tipo float, já que existe a possibilidade de centavos nos valores. Outra observação legal é perceber que podemos declarar uma variável sem valor inicial — foi o caso da variável codigo, que terá seu valor definido dependendo do resultado da condição.

Notem que a abordagem clássica do IF/ELSE não é complicada, mas preenche um espaço considerável no código. Você pode pensar “Mas Danilo, são só 3 linhas”. Sim, gafanhoto, mas poderiam ser 4, 8, 10 situações dessas no seu código. O que mais me agrada no ternário não é nem a economia de linhas, mas sim sua melhor legibilidade.

O ternário é definido por uma expressão sucedida de um ?. Caso o resultado dessa expressão seja verdadeiro, o sistema executa o que está à esquerda do dois pontos, e caso o resultado seja falso ele executa o que está à direta do dois pontos.

Dessa forma é possível fazer uma atribuição com esse resultado. Assim, a variável vai receber a resposta do condicional, ficando bem simples, direta e prática. Isso já dá margem para um estudo com bastantes testes — quanto mais vocês usarem e misturarem os condicionais, mais estarão fixando os conceitos. 😉

Espero que vocês tenham aproveitado esses tópicos e fica a dica do ternário para aqueles que não o conheciam. No próximo texto, trabalharemos com repetidores.

Posts relacionados