Fundamentos · unidade 2 de 27
Controle de fluxo
Código bom não faz tudo. Faz o necessário.
01 / 07Use as setas do teclado ou deslize
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
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.
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.
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
- 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
- 02Salve sua implementação em
exercises.js, na mesma pasta do teste. - 03Abra o terminal nessa pasta e execute o comando abaixo.
- 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="classifyTriangle" exercises.test.jsComportamentos 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
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";
}