Fundamentos · unidade 2 de 27

Controle de fluxo

Código bom não faz tudo. Faz o necessário.

5 min de leitura · 7 cards · 16 exercícios

Card 1 de 7: Controle de fluxo01 / 07

Leitura

Break, continue, switch e guard clauses vistos como decisões de negócio — não apenas como sintaxe.

No backend, esse fundamento aparece quando o código transforma entrada em decisão. O detalhe de linguagem deixa de ser acadêmico no momento em que altera um payload, uma regra de negócio ou a forma como uma falha chega à camada seguinte.

A forma mais útil de estudar é ligar a sintaxe a um contrato observável: o que entra, o que pode mudar, qual resultado sai e qual erro deve continuar o fluxo. É esse raciocínio que os exemplos e exercícios desta unidade procuram treinar.

Código

exemplo.js
for (const item of items) {
  if (item.id === targetId) break
}

O que fica

  • Interrompa o trabalho quando a resposta já foi encontrada.
  • Guard clauses deixam o caminho principal mais claro.
  • Cada desvio deve expressar uma decisão do domínio.

Prática guiada.Leia, rode, quebre e explique cada exercício.

Prática guiada / unidade 02

Um problema de cada vez.

Leia o contrato, escreva sua tentativa e confira os casos esperados. A resolução de referência permanece visível ao final de cada exercício.

Fundamentalexercício 01 / 16

classifyTriangle(a, b, c)

01 / Entenda

Enunciado

retorna "equilateral", "isosceles", "scalene" ou "invalid". É inválido se algum lado for <= 0 ou se não satisfizer a desigualdade triangular (soma de dois lados sempre maior que o terceiro).

02 / Implemente

Sua tentativa

Comece pela assinatura e resolva sem olhar a resposta.

ponto de partida
function classifyTriangle(a, b, c) {
  // Escreva sua solução aqui.
}

03 / Preveja

Entrada e saída

Use estes exemplos para entender o contrato antes de programar.

Entrada / chamada

classifyTriangle(5, 5, 5)

Retorno esperado

"equilateral"

Entrada / chamada

classifyTriangle(5, 5, 8)

Retorno esperado

"isosceles"

Entrada / chamada

classifyTriangle(3, 4, 5)

Retorno esperado

"scalene"

Entrada / chamada

classifyTriangle(1, 1, 10)

Retorno esperado

"invalid"

04 / Teste

Prove que funciona

O teste chama sua função e compara o resultado real com o esperado.

Como utilizar este teste

  1. 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
  2. 02Salve sua implementação em exercises.js, na mesma pasta do teste.
  3. 03Abra o terminal nessa pasta e execute o comando abaixo.
  4. 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="classifyTriangle" exercises.test.js

Comportamentos cobertos

  • equilátero, isósceles e escaleno
  • entradas inválidas
Ver código completo do teste
test("classifyTriangle: equilátero, isósceles e escaleno", () => {
  assert.equal(classifyTriangle(5, 5, 5), "equilateral");
  assert.equal(classifyTriangle(5, 5, 8), "isosceles");
  assert.equal(classifyTriangle(3, 4, 5), "scalene");
});

test("classifyTriangle: entradas inválidas", () => {
  assert.equal(classifyTriangle(1, 1, 10), "invalid");
  assert.equal(classifyTriangle(0, 4, 5), "invalid");
  assert.equal(classifyTriangle(-3, 4, 5), "invalid");
});

Ainda travou?

Dicas graduais

Nível 1 — direção, sem código

Para classifyTriangle: antes de comparar os lados entre si, valide a desigualdade triangular. Quais três comparações isso exige?

Nível 2 — pista mais direta

classifyTriangle: a desigualdade triangular falha quando a + b <= c ou a + c <= b ou b + c <= a (para quaisquer três lados positivos).

Nível 3 — quase o código, mas ainda não a solução

classifyTriangle: depois de validar a desigualdade triangular, conte quantos dos três pares a === b, b === c, a === c são verdadeiros: 3 pares → "equilateral", 1 par → "isosceles", 0 pares → "scalene".

05 / Compare

Resolução

Esta área permanece livre em todos os exercícios. O código atual da unidade aparece abaixo para comparação com os testes e casos esperados.
código disponível
function classifyTriangle(a, b, c) {
  if (a <= 0 || b <= 0 || c <= 0) {
    return "invalid";
  }
  if (a + b <= c || a + c <= b || b + c <= a) {
    return "invalid";
  }

  if (a === b && b === c) {
    return "equilateral";
  }

  if ((a === b && a !== c) || (a === c && a !== b) || (b === c && b !== a)) {
    return "isosceles";
  }

  if (a !== b && a !== c && b !== c) {
    return "scalene";
  }
  return "invalid";
}