Trilha de aprendizado · Nível 9 · Tutorial 5

Decisões com if e else no firmware

Faça o firmware escolher comandos de saída a partir de condições e faixas numéricas, prevendo qual ramo será executado.

  • Nível: Iniciante
  • Duração: 18 min
  • 8 passos
Decisões com if e else no firmware

O que você vai percorrer

  1. Transforme comparações em condições Avalie comparações simples, reconheça limites inclusivos e evite trocar `==` por `=`. 2 min
  2. Escolha um caminho com if e else Escreva uma decisão de dois caminhos com if e else e preveja o comando aplicado ao LED. 3 min
  3. Combine condições e defina faixas Use operadores lógicos para construir condições de faixa claras, incluindo ou excluindo limites de forma explícita. 3 min
  4. Entenda quando a avaliação para Veja como o curto-circuito determina quais partes de uma condição composta são realmente avaliadas. 2 min
  5. Organize alternativas com else if Use uma cadeia if/else if/else para separar valores abaixo, dentro e acima de uma faixa sem deixar lacunas nos limites. 2 min
  6. Rastreie decisões e o comando final do LED Compare cadeias exclusivas e testes independentes para rastrear cada escrita e determinar o comando final do LED. 2 min
  7. Verifique as decisões na sua placa Teste localmente uma cadeia exclusiva de decisões por faixa usando o LED integrado do Uno R3. 3 min
  8. Aplique e revise suas decisões Aplique comparações, operadores lógicos e estruturas de decisão para validar uma regra completa de comando do LED. 2 min

O que você vai aprender

  • Escrever condições simples e compostas com operadores de comparação e operadores lógicos.
  • Selecionar if, else e else if de acordo com a exclusividade das alternativas.
  • Determinar o ramo executado para valores abaixo, dentro e acima de uma faixa.
  • Rastrear o comando do LED em uma sequência de decisões.
  • Diferenciar uma atribuição de uma comparação em um trecho de código.

Antes de começar

  • Controle de LEDs com saídas digitais
  • Cálculos e conversões numéricas em C/C++

Passo 1 de 8

Transforme comparações em condições

Avalie comparações simples, reconheça limites inclusivos e evite trocar == por =.

Leia a pergunta feita pelo operador

Comparar produz true ou false

Uma comparação pergunta se uma relação é verdadeira ou falsa. Em C/C++, seu resultado é um valor booleano: true ou false.

Com valores inteiros de tipos compatíveis, use:

  • == igual a
  • != diferente de
  • < menor que
  • <= menor ou igual a
  • > maior que
  • >= maior ou igual a

Por exemplo, se temperatura vale 25, temperatura >= 20 resulta em true; temperatura < 20 resulta em false. Uma comparação não muda o valor da variável: ela apenas responde à pergunta feita pelo operador.

O limite pode entrar ou ficar de fora

Reta numérica com ponto preenchido em 20 para uma condição inclusiva e ponto vazio em 20 para uma condição exclusiva, ambas seguindo para valores maiores.

>= 20 inclui 20; > 20 exclui 20.

Não confunda verificação com alteração

`=` altera; `==` verifica

O sinal de igualdade aparece em duas tarefas diferentes:

  • contador = 3; é uma atribuição: grava 3 na variável.
  • contador == 3 é uma comparação: verifica se o valor atual é 3 e produz true ou false.

A comparação tem dois sinais de igual. Ao revisar uma expressão que deveria apenas verificar um valor, confira esse detalhe: trocar == por = pode alterar a variável e ainda permitir que o código seja compilado.

Exemplos com um mesmo valor

Considere int nivel = 7;. As seis primeiras linhas apenas comparam; a última altera a variável.

cpp
nivel == 7    // true
nivel != 7    // false
nivel < 10    // true
nivel <= 7    // true
nivel > 7     // false
nivel >= 10   // false

nivel = 3;    // atribuição: agora nivel vale 3

Dica

Atenção ao limite

No valor-limite, a presença de = faz diferença: se nivel vale 7, nivel < 7 é false, enquanto nivel <= 7 é true. Escolha o operador de acordo com a regra: incluir ou excluir o limite.

Nomeie cada comparação

Relacione operador e significado

Associe cada operador ao significado da comparação. Os operadores que contêm = incluem a igualdade no teste.

Significado dos operadores

Faça as associações corretas.

Toque em um item e depois no par correspondente.

Avalie sem alterar a variável

Avalie cada expressão

Agora avalie resultados que não estão resolvidos no código. Considere int leitura = 12; e determine a sequência de valores booleanos, na ordem das expressões:

  1. leitura < 12
  2. leitura <= 12
  3. leitura != 9
  4. leitura > 15

A primeira dupla mostra a diferença entre excluir e incluir exatamente o limite 12.

Resultados booleanos

Qual é a sequência correta de resultados?

Verifique sem modificar

Complete apenas o operador que verifica se leitura é igual a 12. A variável não deve ser alterada.

Complete uma comparação segura

Preencha a lacuna com o operador de igualdade.

cpp
int leitura = 12;
bool estaNoLimite = (leitura  12);

Passo 2 de 8

Escolha um caminho com if e else

Escreva uma decisão de dois caminhos com if e else e preveja o comando aplicado ao LED.

Escrevendo if e else

Estrutura de dois caminhos

Uma decisão, dois caminhos

Use if quando um comando deve ocorrer somente se a condição for verdadeira. A condição fica entre parênteses e o bloco que ela controla fica entre chaves.

Acrescente else quando houver uma alternativa para o caso falso. O firmware executa um dos blocos e, depois, continua na primeira instrução após as chaves.

Fluxo de if e else

Fluxograma com uma decisão: o caminho verdadeiro acende o LED, o falso apaga, e ambos se unem depois.

A condição escolhe apenas um caminho; os dois voltam ao mesmo ponto do programa.

Código de uma decisão

Considere valor já definido como um inteiro. Esta decisão comanda o LED integrado.

cpp
if (valor >= 10) {
  digitalWrite(LED_BUILTIN, HIGH);
} else {
  digitalWrite(LED_BUILTIN, LOW);
}

Lendo o caminho escolhido

Qual bloco é executado?

Leia o código de cima para baixo:

  • Se valor >= 10 resultar em true, executa digitalWrite(..., HIGH).
  • Se resultar em false, ignora o primeiro bloco e executa o bloco do else: digitalWrite(..., LOW).
  • As chaves deixam explícito quais instruções pertencem a cada ramo, mesmo que hoje cada bloco tenha apenas uma linha.

Não coloque ponto e vírgula entre if (condição) e {. As chaves devem vir logo em seguida.

Atenção

Ponto e vírgula muda o fluxo

Evite isto:

if (valor >= 10); {
  digitalWrite(LED_BUILTIN, HIGH);
}

Esse ponto e vírgula termina o if com uma instrução vazia. O bloco entre chaves passa a executar sempre, independentemente da condição. Escreva if (condição) { sem ponto e vírgula no meio.

Pratique os dois ramos

Monte a decisão

Complete as duas partes que tornam esta uma decisão completa: a condição do if e a palavra que inicia o caminho falso.

Prática: if com else

Preencha as lacunas.

cpp
if () {
  digitalWrite(LED_BUILTIN, HIGH);
}  {
  digitalWrite(LED_BUILTIN, LOW);
}

Sem else, o que acontece?

Quando não há alternativa

Sem else, uma condição falsa simplesmente não executa o bloco do if. Ela não cria, por conta própria, um comando LOW.

Suponha que o LED já foi comandado para HIGH antes deste trecho e que valor vale 3.

Um if sem else

Trecho executado depois de o LED já estar em HIGH.

cpp
if (valor > 5) {
  digitalWrite(LED_BUILTIN, LOW);
}

Preveja sem else

Qual é o comando do LED depois desse trecho?

Passo 3 de 8

Combine condições e defina faixas

Use operadores lógicos para construir condições de faixa claras, incluindo ou excluindo limites de forma explícita.

Visualize os limites

Faixas usam duas comparações

Uma faixa numérica é definida por dois limites. Para verificar se valor está dentro da faixa de 10 a 20, incluindo as pontas, as duas comparações precisam ser verdadeiras:

(valor >= 10) && (valor <= 20)

  • && significa “e”: exige as duas condições verdadeiras.
  • || significa “ou”: basta uma condição verdadeira.
  • ! significa “não”: inverte o resultado de uma condição.

Use parênteses em cada comparação. Eles deixam claro o que está sendo comparado e tornam a condição mais fácil de revisar.

Incluindo ou excluindo os limites

Duas retas numéricas com a faixa entre 10 e 20: uma com pontos fechados nos extremos e outra com pontos abertos.

>= 10 e <= 20 incluem os limites. Já > 10 e < 20 excluem os limites.

Limites da faixa

Escolha o operador de comparação conforme a regra da faixa.

Exemplos considerando os limites 10 e 20.
RegraCondição para valor = 10Condição para valor = 20
Inclui os dois limitesvalor >= 10valor <= 20
Exclui os dois limitesvalor > 10valor < 20
Inclui só o limite inferiorvalor >= 10valor < 20
Inclui só o limite superiorvalor > 10valor <= 20

Escreva cada comparação por completo

Dentro, fora e negação

Há três formas úteis de descrever a mesma região numérica:

  • Dentro, de 10 a 20 inclusive: (valor >= 10) && (valor <= 20).
  • Fora dessa faixa: (valor < 10) || (valor > 20).
  • Não dentro da faixa: !((valor >= 10) && (valor <= 20)).

No último caso, os dois pares de parênteses mostram que ! nega o resultado da condição inteira, e não apenas uma das comparações.

Condições compostas em C/C++

Três formas de expressar regras para o mesmo valor.

cpp
int valor = 15;

bool dentro = (valor >= 10) && (valor <= 20);
bool fora = (valor < 10) || (valor > 20);
bool naoDentro = !((valor >= 10) && (valor <= 20));

Atenção

Evite desigualdade encadeada

Não escreva 10 <= valor <= 20. Em C/C++, isso não representa uma faixa matemática encadeada.

Escreva as duas comparações completas e una os resultados:

(valor >= 10) && (valor <= 20)

Assim, cada lado de && produz um resultado verdadeiro ou falso.

Pratique operadores de faixa

Complete as condições

Complete os operadores lógicos para uma faixa inclusiva de 10 a 20.

cpp
int valor = 20;

bool dentro = (valor >= 10)  (valor <= 20);
bool fora = (valor < 10)  (valor > 20);
bool naoDentro = ((valor >= 10) && (valor <= 20));

Confira valores de fronteira

Classifique os limites e as regiões

Associe cada valor à sua classificação para a condição (valor >= 10) && (valor <= 20).

Toque em um item e depois no par correspondente.

Passo 4 de 8

Entenda quando a avaliação para

Veja como o curto-circuito determina quais partes de uma condição composta são realmente avaliadas.

Curto-circuito nas condições

A avaliação pode parar

Em uma condição composta, C/C++ avalia primeiro o operando à esquerda. Só então decide se precisa avaliar o operando à direita.

  • Com &&, se a parte esquerda for false, o resultado já será false. A parte direita é ignorada.
  • Com ||, se a parte esquerda for true, o resultado já será true. A parte direita é ignorada.

Esse comportamento é chamado de curto-circuito. Quando não há curto-circuito, o operando direito é avaliado normalmente.

Curto-circuito em && e ||

Diagrama de dois fluxos: um resultado falso à esquerda interrompe uma condição AND; um resultado verdadeiro à esquerda interrompe uma condição OR.

O primeiro resultado pode determinar a condição inteira e impedir a avaliação do operando direito.

Dica

Ignorar não é obter falso

Ignorada não significa “avaliada como falsa”. Compare:

  • (8 < 3) && (10 / 0 > 1): o lado esquerdo é false. O lado direito é ignorado; a divisão não ocorre.
  • (8 > 3) && (2 < 1): o lado esquerdo é true. O lado direito é avaliado, resulta em false e torna a condição completa falsa.

As duas condições completas resultam em false, mas o caminho de avaliação é diferente. Com ||, se o lado esquerdo for false, o lado direito precisa ser avaliado para decidir o resultado.

Rastreie o segundo operando

O lado direito será consultado?

Para cada expressão, determine o que acontece com o operando da direita. Considere somente as comparações mostradas: não é necessário executar código na placa.

Caso com && e lado esquerdo falso

Na expressão (4 < 2) && (9 > 1), como fica o operando direito (9 > 1)?

Caso com && e lado esquerdo verdadeiro

Na expressão (4 > 2) && (9 < 1), como fica o operando direito (9 < 1)?

Caso com || e lado esquerdo verdadeiro

Na expressão (4 > 2) || (9 < 1), como fica o operando direito (9 < 1)?

Caso com || e lado esquerdo falso

Na expressão (4 < 2) || (9 > 1), como fica o operando direito (9 > 1)?

Ordem que evita divisão inválida

Proteja a divisão pela ordem

Para evitar uma divisão por zero, coloque a verificação do divisor à esquerda de &&. Se denominador for zero, denominador != 0 resulta em false; assim, a divisão à direita é ignorada.

Quando o denominador não é zero, o lado esquerdo é true e a divisão pode ser avaliada.

Teste seguro com &&

Condição usada antes de acender o LED quando a média inteira for maior que 3.

cpp
if ((denominador != 0) && (total / denominador > 3)) {
  digitalWrite(LED_BUILTIN, HIGH);
}

Atenção

A proteção vem primeiro

Não inverta a condição:

(total / denominador > 3) && (denominador != 0)

Se denominador for zero, o programa tentará calcular a divisão antes de chegar à verificação. A proteção só funciona quando vem primeiro.

Pratique a proteção

Complete a parte esquerda da condição. Ela deve impedir que soma / divisor seja avaliada quando divisor valer zero.

Complete a condição segura

Preencha a condição de proteção.

cpp
if (() && (soma / divisor >= 5)) {
  digitalWrite(LED_BUILTIN, HIGH);
}

Passo 5 de 8

Organize alternativas com else if

Use uma cadeia if/else if/else para separar valores abaixo, dentro e acima de uma faixa sem deixar lacunas nos limites.

Classifique em três regiões

Uma cadeia, um ramo

Quando há alternativas mutuamente exclusivas, encadeie if, else if e else. A cadeia é examinada de cima para baixo e executa somente o primeiro bloco cuja condição for verdadeira. Depois disso, os demais ramos são ignorados.

Para classificar leitura em relação à faixa inclusiva de 20 a 80:

  • abaixo de 20;
  • de 20 a 80, incluindo os limites;
  • acima de 80.

O segundo teste pode ser apenas leitura <= 80: para alcançá-lo, o primeiro (leitura < 20) já foi falso. Logo, nesse ponto, sabemos que leitura >= 20.

Fluxo exclusivo por faixa

Fluxograma de uma cadeia exclusiva que separa valores abaixo, dentro e acima de uma faixa numérica.

Apenas um caminho é percorrido: o primeiro ramo cuja condição for verdadeira.

Limites sem lacunas

Faixa inclusiva para comandar o LED

O else final não possui condição: ele atende qualquer valor que não tenha sido aceito pelos testes anteriores. As chaves deixam explícito qual comando pertence a cada ramo.

cpp
int leitura = 80;

if (leitura < 20) {
  digitalWrite(LED_BUILTIN, LOW);
} else if (leitura <= 80) {
  digitalWrite(LED_BUILTIN, HIGH);
} else {
  digitalWrite(LED_BUILTIN, LOW);
}

Qual ramo é escolhido?

Rastreamento da cadeia para valores de fronteira e valores internos.

A faixa acende o LED somente de 20 a 80, inclusive.
leitura1º teste: < 202º teste: <= 80RamoLED
19verdadeiro—ifLOW
20falsoverdadeiroelse ifHIGH
50falsoverdadeiroelse ifHIGH
80falsoverdadeiroelse ifHIGH
81falsofalsoelseLOW

Pratique a cadeia exclusiva

Complete a classificação

Complete as duas condições para acender o LED somente na faixa inclusiva de 20 a 80.

cpp
if () {
  digitalWrite(LED_BUILTIN, LOW);
} else if () {
  digitalWrite(LED_BUILTIN, HIGH);
} else {
  digitalWrite(LED_BUILTIN, LOW);
}

Revise a ordem

Detecte um ramo inalcançável

Considere esta cadeia:

if (leitura >= 20) {
  digitalWrite(LED_BUILTIN, HIGH);
} else if ((leitura >= 20) && (leitura <= 80)) {
  digitalWrite(LED_BUILTIN, HIGH);
} else {
  digitalWrite(LED_BUILTIN, LOW);
}

Qual afirmação descreve corretamente o efeito dessa ordem de testes?

Passo 6 de 8

Rastreie decisões e o comando final do LED

Compare cadeias exclusivas e testes independentes para rastrear cada escrita e determinar o comando final do LED.

Escolha a estrutura pela regra

Dois modelos de decisão

Até aqui, você usou uma cadeia if / else if / else para escolher um único ramo. Nela, assim que uma condição é verdadeira, as alternativas seguintes são ignoradas.

Já vários if separados são decisões independentes: cada condição é testada, mesmo que uma anterior tenha sido verdadeira. Por isso, mais de um bloco pode escrever no mesmo LED durante uma passagem por loop().

Quando a regra pede apenas uma classificação — por exemplo, abaixo, dentro ou acima de uma faixa — prefira a cadeia exclusiva. Use if independentes somente quando cada ação puder ocorrer junto das demais.

Exclusividade ou decisões independentes

Comparação visual entre uma cadeia exclusiva, que percorre um caminho, e dois if independentes, que podem executar dois comandos para o mesmo LED.

Em uma cadeia exclusiva, há um ramo escolhido. Em if independentes, pode haver várias escritas na mesma passagem.

Rastreie escritas sucessivas

A última escrita define o comando final

Observe dois if independentes. Para valor = 12, as duas condições são verdadeiras. A execução segue de cima para baixo: primeiro o LED recebe HIGH; depois recebe LOW.

O comando final é, portanto, LOW, pois é a última escrita executada. Isso não apaga o fato de que o primeiro ramo também foi percorrido.

Rastreamento de valor 12

Dois testes independentes escrevem no mesmo LED.

cpp
int valor = 12;

if (valor >= 10) {
  digitalWrite(LED_BUILTIN, HIGH);
}

if (valor <= 15) {
  digitalWrite(LED_BUILTIN, LOW);
}

Preveja o resultado

Considere que o LED começou com comando LOW antes desses testes. Para valor = 12, qual rastreamento está correto?

Rastreamento dos dois if

Qual rastreamento está correto para valor = 12?

Leia a tabela sem confundir causa e efeito

Registre cada resultado

Uma tabela separa o caminho percorrido do estado final. Considere o comando inicial LOW e o código com os dois if independentes da tela anterior.

Tabela de rastreamento

Rastreamento para três valores usando dois if independentes.

O comando final só muda quando uma chamada a `digitalWrite` é executada.
valorvalor >= 10valor <= 15ramos executadoscomando final
8falsoverdadeiro2º ifLOW
12verdadeiroverdadeiro1º e 2º ifLOW
20verdadeirofalso1º ifHIGH

Dica

Ramo não é sinônimo de estado

Para valor = 8, apenas o segundo ramo é percorrido e o resultado é LOW. Para valor = 12, dois ramos são percorridos, mas o resultado final também é LOW.

Logo, observar o LED em LOW não identifica sozinho qual ramo ocorreu. Valores diferentes — e até percursos diferentes — podem terminar no mesmo comando.

Rastreie ausência de escrita e escolha a estrutura

Caso sem escrita posterior

Agora o LED recebe um comando inicial conhecido antes de duas decisões independentes.

cpp
int valor = 7;

digitalWrite(LED_BUILTIN, HIGH);

if (valor > 10) {
  digitalWrite(LED_BUILTIN, LOW);
}

if (valor < 5) {
  digitalWrite(LED_BUILTIN, LOW);
}

Quando nenhuma condição escreve

Qual rastreamento descreve corretamente esse código?

Escolha a estrutura adequada

Qual situação pede uma cadeia if / else if / else, e não dois if independentes?

Passo 7 de 8

Verifique as decisões na sua placa

Teste localmente uma cadeia exclusiva de decisões por faixa usando o LED integrado do Uno R3.

Objetivo e preparação

Prepare a verificação

Nesta prática, use somente o LED integrado do Uno R3 e a alimentação USB. O programa classifica um valor inteiro como abaixo da faixa, dentro da faixa inclusiva ou acima dela. O LED acende somente no ramo central.

Os ramos “abaixo” e “acima” comandam LOW. Portanto, um LED apagado confirma que o valor está fora da faixa, mas não informa sozinho qual desses dois ramos ocorreu. Antes de olhar a placa, use o valor atribuído e as condições para prever o caminho.

Faixa inclusiva e comando do LED

Reta numérica com a faixa inclusiva entre 10 e 20 destacada; o LED aparece aceso apenas na região central.

Os valores 10 e 20 pertencem à faixa e devem comandar o LED para HIGH.

Dica

Segurança da prática

Antes de gravar, desconecte qualquer circuito externo que esteja nos pinos da placa. Esta prática não usa botão, sensor nem LED externo.

Grave o sketch

Sketch para testar a faixa

Crie um sketch local, substitua o conteúdo pelo código abaixo e grave-o no seu Uno R3. Em cada tentativa, altere somente a atribuição de valorTeste, salve, compile e grave novamente.

cpp
const int LIMITE_INFERIOR = 10;
const int LIMITE_SUPERIOR = 20;
const int valorTeste = 15;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if (valorTeste < LIMITE_INFERIOR) {
    digitalWrite(LED_BUILTIN, LOW);
  } else if ((valorTeste >= LIMITE_INFERIOR) &&
             (valorTeste <= LIMITE_SUPERIOR)) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}
Saída esperada
Com valorTeste = 15, o LED integrado deve permanecer aceso (HIGH).

O LED integrado é a saída observável; o sketch não produz texto no Monitor Serial. Para o valor inicial 15, confira o LED integrado após a gravação.

Teste uma alteração por vez

Todos os ramos enviam um comando explícito ao LED. Assim, o resultado de cada gravação não depende de um comando anterior.

O valor inicial 15 está entre 10 e 20, incluindo os limites. Depois de confirmar esse caso, teste um valor por vez: altere a linha de valorTeste, salve, compile, grave e observe o LED.

Preveja os casos de fronteira

Revise a condição central

Antes de consultar o gabarito ou gravar cada versão, complete a condição do ramo central. Ela deve aceitar os dois limites e os valores entre eles.

Complete a condição da faixa

Preencha os operadores que tornam a faixa de 10 a 20 inclusiva.

cpp
else if ((valorTeste  LIMITE_INFERIOR) 
         (valorTeste  LIMITE_SUPERIOR)) {
  digitalWrite(LED_BUILTIN, HIGH);
}

Faça suas previsões

Sem executar ainda os cinco casos, registre sua previsão para valorTeste = 9, 10, 15, 20 e 21. Para cada valor, indique o ramo — abaixo, central ou acima — e o comando esperado: HIGH ou LOW.

Use a sequência, por exemplo: 9: abaixo, LOW; 10: .... Depois grave uma versão por vez para comparar a previsão com a observação.

Escreva pelo menos 60 caracteres (0/60).

Compare com a placa

Gabarito de rastreamento

Compare agora suas previsões com este rastreamento. Os dois limites são inclusivos: tanto 10 quanto 20 alcançam o ramo central. Os valores 9 e 21 deixam o LED apagado, mas percorrem ramos diferentes.

O estado LOW ocorre em dois ramos distintos; por isso, ele não identifica o ramo sem considerar o valor testado.
valorTesteRamo executadoComando esperado
9Abaixo da faixaLOW
10Central: limite inferiorHIGH
15Central: dentro da faixaHIGH
20Central: limite superiorHIGH
21Acima da faixaLOW

Confronte previsão e observação

Após testar 9, 10, 15, 20 e 21, registre o que observou. Se houver divergência, confira se alterou valorTeste, salvou o arquivo, compilou e gravou a versão correspondente; confira também a placa e a porta selecionadas na IDE.

Relate os cinco estados e, se necessário, a verificação que você fez. Não é necessário enviar arquivos.

Escreva pelo menos 80 caracteres (0/80).

Passo 8 de 8

Aplique e revise suas decisões

Aplique comparações, operadores lógicos e estruturas de decisão para validar uma regra completa de comando do LED.

Traduza a regra

Da regra ao teste

Regra a implementar: acenda o LED integrado somente quando modo for igual a 1 e valor estiver de 20 a 30, incluindo 20 e 30. Em qualquer outro caso, apague o LED.

Há somente dois comandos finais possíveis: HIGH ou LOW. Por isso, uma condição composta seguida de if e else expressa a regra sem criar ramos concorrentes.

Antes de escrever, transforme a frase em testes: igualdade para o modo; >= para o limite inferior; <= para o superior.

Faixa inclusiva e condição de modo

Reta numérica com os extremos 20 e 30 incluídos em uma faixa central, regiões externas excluídas e um símbolo adicional representando uma condição de modo ativa.

Os pontos fechados nos extremos indicam que os valores-limite pertencem à faixa.

Escreva a condição

Complete a decisão

Complete os operadores para implementar a regra. Observe que a atribuição =, usada nas declarações, não serve para testar igualdade.

cpp
const int LIMITE_INFERIOR = 20;
const int LIMITE_SUPERIOR = 30;
int valor = 20;
int modo = 1;

bool modoAtivo = (modo  1);
bool naFaixa = (valor  LIMITE_INFERIOR) &&
                (valor  LIMITE_SUPERIOR);

if (modoAtivo && naFaixa) {
  digitalWrite(LED_BUILTIN, HIGH);
} else {
  digitalWrite(LED_BUILTIN, LOW);
}

Escolha a organização

Escolha a estrutura

A regra do LED possui dois resultados mutuamente exclusivos: acender ou apagar. Qual estrutura é a mais adequada para o código apresentado?

Revise e conclua

Rastreie os casos de fronteira

Associe cada caso ao resultado da condição composta, ao ramo executado e ao comando final do LED.

Toque em um item e depois no par correspondente.

Resumo

Síntese

Para validar uma decisão no firmware:

  1. Escreva a regra em linguagem clara.
  2. Converta cada parte em comparações completas.
  3. Escolha if/else para dois resultados exclusivos, else if para classificações exclusivas ou if independentes para ações que podem coexistir.
  4. Teste valores abaixo, nos limites, dentro e acima da faixa.
  5. Registre o ramo executado e o último comando efetivamente enviado ao LED.

Comece com valores definidos no próprio sketch. Depois, uma leitura de entrada poderá fornecer o valor usado na decisão.

  • == compara; = atribui.
  • Uma faixa inclusiva usa >= e <=.
  • && exige que todas as condições sejam verdadeiras.
  • Causas diferentes podem tornar uma condição falsa e alcançar o mesmo else.
  • Valide a regra com valores controlados, incluindo as fronteiras.

Tutorial concluído

Parabéns! Você concluiu: Decisões com if e else no firmware

Você consegue transformar uma regra em decisões de firmware, prever os ramos e validar limites com valores controlados.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso