Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

[Reclamação] Erro na resposta informada como correta em 'Treinando condicionais'

Na seção 'Treinando condicionais', a resposta informada como correta contém um erro:

double calcularTaxaDeJuros(double saldo) {
  if (saldo < 1000) {
    return 0.01;
  } else if (saldo < 5000) {
    return 0.02;
  } else {
    return 0.03;
  }
}

Esta função nunca irá retornar uma taxa de juros de 2%, pois qualquer saldo inferior a R$ 1000 automaticamente retornará uma taxa de juros de 1%, pois a condição do if já atende a condição do else if.

2 respostas
solução!

Olá, Marcos. Como vai?

Muito obrigado por trazer essa observação para o fórum! É muito gratificante ver alunos analisando o código de forma crítica, pois isso demonstra que você está prestando atenção máxima aos detalhes da lógica de programação.

No entanto, analisando friamente a estrutura de controle que você compartilhou, a resposta informada no exercício está tecnicamente correta e a função vai sim retornar a taxa de 2% (ou 0.02) quando for acionada com os valores adequados.

Vamos entender passo a passo o porquê disso acontecer e como o Dart (e a maioria das linguagens de programação) avalia as estruturas if / else if / else:

  • O fluxo é excludente: Quando o Dart entra em uma estrutura condicional ligada por else if, as condições são testadas em ordem (de cima para baixo). Assim que o programa encontra uma condição verdadeira, ele executa o bloco de código correspondente, retorna o valor e ignora completamente todo o resto da estrutura.
  • Por que a taxa de 2% funciona? Se chamarmos a função passando um saldo de 3000 (ex: calcularTaxaDeJuros(3000)), o Dart fará os seguintes testes:
  1. Ele testa o primeiro if: 3000 < 1000? Isto é Falso. Portanto, ele não entra no primeiro bloco e não retorna 0.01.
  2. Ele passa para o próximo teste, o else if: 3000 < 5000? Isto é Verdadeiro. Como a condição é real, ele entra nesse bloco e executa o return 0.02.

O comportamento que você mencionou — de a primeira condição "engolir" a segunda — só aconteceria se as faixas de valores estivessem invertidas no código. Por exemplo, se testássemos saldo < 5000 primeiro e saldo < 1000 no else if, aí sim teríamos um bug de lógica, pois qualquer valor menor que 1000 também é menor que 5000.

Para deixar esse fluxo de tomadas de decisão perfeitamente claro e te ajudar a visualizar como o Dart processou os caminhos, veja este exemplo prático simulando diferentes entradas no console:

void main() {
  print(calcularTaxaDeJuros(500));  // Printa: 0.01 (Cai no IF: 500 é menor que 1000)
  print(calcularTaxaDeJuros(2500)); // Printa: 0.02 (Cai no ELSE IF: não é menor que 1000, mas é menor que 5000)
  print(calcularTaxaDeJuros(7000)); // Printa: 0.03 (Cai no ELSE: não atendeu nenhuma das condições anteriores)
}

double calcularTaxaDeJuros(double saldo) {
  if (saldo < 1000) {
    return 0.01;
  } else if (saldo < 5000) {
    return 0.02;
  } else {
    return 0.03;
  }
}

A lógica aplicada no exercício cria faixas bem delimitadas de forma implícita:

  • Menor que 1000: 1%
  • De 1000 até 4999.99: 2%
  • De 5000 para cima: 3%

Continue testando e quebrando os códigos dessa forma! Esse hábito de depurar mentalmente os fluxos é o que diferencia um desenvolvedor comum de um excelente profissional em Flutter e Dart.

Espero que possa ter lhe ajudado!

Falha minha, Evandro. por distração - e sem os óculos - eu li o primeiro parâmetro com um dígito a mais: 10.000 ao invés de 1.000. Sinto muito.