Lógica de Programação
Aqui o programa começa a pensar. Condicionais, loops e funções são as ferramentas que transformam uma sequência de instruções em algo capaz de tomar decisões, repetir tarefas e resolver problemas reais.
Operadores — As Ferramentas do Cálculo
Operadores são símbolos que realizam operações sobre valores. São a matemática e a lógica do programa.
Operadores Aritméticos
let a = 10
let b = 3
alert(a + b) // 13 → Adição
alert(a - b) // 7 → Subtração
alert(a * b) // 30 → Multiplicação
alert(a / b) // 3.333... → Divisão
alert(a % b) // 1 → Resto da divisão (módulo)
alert(a ** b) // 1000 → Potência (10³)
// Atalhos de atribuição
a += 5 // a = a + 5 → 15
a -= 2 // a = a - 2 → 13
a *= 2 // a = a * 2 → 26
a++ // a = a + 1 → 27
a-- // a = a - 1 → 26
Operadores de Comparação
Sempre retornam true ou false:
| Operador | Significado | Exemplo | Resultado |
|---|---|---|---|
=== | Igual (valor E tipo) | 5 === 5 | true |
=== | Igual (valor E tipo) | 5 === "5" | false |
!== | Diferente (valor E tipo) | 5 !== 8 | true |
> | Maior que | 10 > 5 | true |
< | Menor que | 3 < 2 | false |
>= | Maior ou igual | 5 >= 5 | true |
<= | Menor ou igual | 4 <= 3 | false |
Operadores Lógicos
Combinam condições:
let idade = 20
let temCNH = true
// && → E (as DUAS condições precisam ser verdadeiras)
alert(idade >= 18 && temCNH) // true (tem 18+ E tem CNH)
alert(idade >= 18 && !temCNH) // false (tem 18+, mas NÃO tem CNH)
// || → OU (PELO MENOS UMA condição precisa ser verdadeira)
alert(idade >= 18 || temCNH) // true (basta uma ser verdadeira)
// ! → NÃO (inverte o valor)
alert(!true) // false
alert(!false) // true
alert(!temCNH) // false (temCNH é true, ! inverte para false)
Condicionais — O Programa Toma Decisões
Condicionais permitem que o programa execute blocos de código diferentes dependendo de uma situação. É o famoso "SE isso, ENTÃO aquilo".
if / else if / else
let nota = Number( prompt("Digite sua nota (0 a 10):") )
if (nota >= 9) {
alert("🏆 Excelente! Você tirou A!")
} else if (nota >= 7) {
alert("✅ Bom! Você passou com B.")
} else if (nota >= 5) {
alert("⚠️ Recuperação! Você tirou C.")
} else {
alert("❌ Reprovado. Nota abaixo de 5.")
}
// Só o primeiro bloco verdadeiro é executado.
// O else captura tudo o que não entrou nos ifs anteriores.
Condicionais aninhadas
let idade = Number( prompt("Qual a sua idade?") )
let temRG = confirm("Você tem RG?")
if (idade >= 18) {
if (temRG) {
alert("✅ Pode entrar! Maior de idade com documento.")
} else {
alert("⚠️ Maior de idade, mas precisa do documento.")
}
} else {
alert("❌ Menor de idade. Entrada não permitida.")
}
Operador ternário — if em uma linha
// Sintaxe: condição ? valor_se_true : valor_se_false
let idade = Number( prompt("Qual sua idade?") )
// Com if/else (4 linhas)
let status
if (idade >= 18) {
status = "maior de idade"
} else {
status = "menor de idade"
}
// Com ternário (1 linha) — mesma coisa!
let status = idade >= 18 ? "maior de idade" : "menor de idade"
alert("Você é " + status + ".")
switch — muitos casos possíveis
let dia = Number( prompt("Digite o número do dia (1=Seg, 7=Dom):") )
switch (dia) {
case 1:
alert("Segunda-feira 😴")
break
case 2:
alert("Terça-feira")
break
case 3:
alert("Quarta-feira")
break
case 6:
case 7:
alert("Final de semana! 🎉") // case 6 e 7 caem aqui
break
default:
alert("Dia inválido!")
}
// IMPORTANTE: sem o "break", a execução "cai" para o próximo case!
Loops — Repetindo sem Cansar
Loops (laços) executam um bloco de código várias vezes. Sem loops, para imprimir
os números de 1 a 100 você teria que escrever 100 alert()s.
Com um loop, são 3 linhas.
Loop for — quando você sabe quantas vezes
// Estrutura: for (início; condição; incremento)
// início → onde o contador começa
// condição → continua enquanto for true
// incremento→ o que acontece ao fim de cada volta
// Conta de 1 a 5
for (let i = 1; i <= 5; i++) {
alert("Número: " + i)
}
// Exibe: 1, 2, 3, 4, 5
// Conta de 10 a 1 (decrescente)
for (let i = 10; i >= 1; i--) {
console.log(i)
}
// Acumula a soma de 1 até N
let n = Number( prompt("Somar de 1 até qual número?") )
let soma = 0
for (let i = 1; i <= n; i++) {
soma += i // acumula: soma = soma + i
}
alert("A soma de 1 até " + n + " é " + soma)
Loop while — enquanto a condição for verdadeira
// Fica pedindo uma senha até o usuário acertar
let senhaCorreta = "atlas123"
let tentativa = ""
while (tentativa !== senhaCorreta) {
tentativa = prompt("Digite a senha:")
}
alert("✅ Acesso liberado!")
// ⚠️ Cuidado: se a condição nunca ficar falsa,
// o loop nunca para — loop infinito! O browser trava.
// Sempre garanta que a condição vai mudar.
do...while — executa ao menos uma vez
// Perfeito para menus e validação de entrada:
// executa o bloco UMA vez, depois verifica a condição
let resposta
do {
resposta = prompt("Digite um número entre 1 e 10:")
resposta = Number(resposta)
} while (resposta < 1 || resposta > 10)
// Continua pedindo enquanto o número estiver fora do intervalo
alert("Você digitou: " + resposta)
break e continue — controlando o loop
// break → SAI do loop imediatamente
for (let i = 1; i <= 10; i++) {
if (i === 5) break // para quando chega em 5
console.log(i) // exibe 1, 2, 3, 4
}
// continue → PULA para a próxima iteração
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) continue // pula os pares
console.log(i) // exibe 1, 3, 5, 7, 9
}
Funções — Blocos Reutilizáveis de Código
Uma função é um bloco de código com um nome. Você escreve a lógica uma vez e pode usar quantas vezes quiser, em qualquer lugar do programa. É o princípio fundamental de não repetir código (DRY — Don't Repeat Yourself).
Analogia da máquina de pizza: uma função é como uma máquina que recebe ingredientes (parâmetros), executa um processo e entrega o resultado (return). Você não precisa saber como a máquina funciona por dentro toda vez que quiser uma pizza — só precisa chamar a função com os ingredientes certos.
Criando e chamando funções
// 1. Função sem parâmetro, sem retorno
function saudar() {
alert("Olá! Bem-vindo ao Dev Atlas!")
}
saudar() // chamando a função
saudar() // posso chamar quantas vezes quiser
// 2. Função com parâmetros
function saudarPessoa(nome) {
alert("Olá, " + nome + "!")
}
saudarPessoa("Ana") // → "Olá, Ana!"
saudarPessoa("Carlos") // → "Olá, Carlos!"
// 3. Função com retorno (return)
function somar(a, b) {
return a + b // devolve o resultado para quem chamou
}
let resultado = somar(5, 3) // resultado = 8
alert(resultado) // → 8
alert( somar(10, 20) ) // → 30 (direto no alert)
Exemplos práticos
// Verifica se um número é par
function ehPar(numero) {
return numero % 2 === 0 // retorna true ou false
}
alert( ehPar(4) ) // true
alert( ehPar(7) ) // false
// Calcula média de três notas
function calcularMedia(n1, n2, n3) {
let media = (n1 + n2 + n3) / 3
return media
}
let minhaNota1 = Number( prompt("Nota 1:") )
let minhaNota2 = Number( prompt("Nota 2:") )
let minhaNota3 = Number( prompt("Nota 3:") )
let media = calcularMedia(minhaNota1, minhaNota2, minhaNota3)
let situacao = media >= 6 ? "Aprovado ✅" : "Reprovado ❌"
alert("Média: " + media.toFixed(1) + " → " + situacao)
// Função de conversão de temperatura
function celsiusParaFahrenheit(celsius) {
return (celsius * 9 / 5) + 32
}
alert( celsiusParaFahrenheit(100) ) // → 212
alert( celsiusParaFahrenheit(0) ) // → 32
Parâmetro padrão
// Se o argumento não for passado, usa o valor padrão
function saudar(nome = "Visitante") {
alert("Olá, " + nome + "!")
}
saudar("Maria") // → "Olá, Maria!"
saudar() // → "Olá, Visitante!" (usou o padrão)
Arrays na Prática — Listas de Dados
Arrays guardam vários valores em uma única variável. São fundamentais em lógica de programação — praticamente todo problema real envolve uma lista de alguma coisa.
let notas = [8, 6, 9, 5, 7]
// Acessar por índice (começa em 0!)
alert(notas[0]) // → 8 (primeiro)
alert(notas[4]) // → 7 (quinto / último)
// Quantos elementos tem?
alert(notas.length) // → 5
// Percorrer todos com for
for (let i = 0; i < notas.length; i++) {
console.log("Nota " + (i+1) + ": " + notas[i])
}
// Calcular a média de todas as notas
let soma = 0
for (let i = 0; i < notas.length; i++) {
soma += notas[i]
}
let media = soma / notas.length
alert("Média: " + media) // → 7
// Encontrar o maior valor
let maior = notas[0] // começa assumindo que o primeiro é o maior
for (let i = 1; i < notas.length; i++) {
if (notas[i] > maior) {
maior = notas[i] // encontrou um valor maior, atualiza
}
}
alert("Maior nota: " + maior) // → 9
Escopo — Onde a Variável Existe
Escopo define em que partes do código uma variável pode ser acessada. Entender escopo evita muitos bugs confusos.
let nome = "Global" // escopo global — existe em todo o código
function teste() {
let mensagem = "Local" // escopo local — só existe dentro da função
alert(nome) // ✅ Funciona: função pode acessar variável global
alert(mensagem) // ✅ Funciona: está dentro da função
}
teste()
alert(nome) // ✅ Funciona
alert(mensagem) // ❌ ERRO! mensagem só existe dentro de teste()
// Variável de bloco (if, for, while) com let também é local
if (true) {
let dentro = "estou dentro"
alert(dentro) // ✅ OK dentro do bloco
}
alert(dentro) // ❌ ERRO! "dentro" não existe aqui fora
Regra de ouro: prefira variáveis com o escopo mais restrito possível. Use variáveis globais com parcimônia — elas podem ser modificadas acidentalmente em qualquer parte do código, gerando bugs difíceis de rastrear.
Exercícios Práticos
A melhor forma de aprender lógica de programação é praticando. Tente resolver cada exercício por conta própria antes de ver a solução. Copie o código numa estrutura HTML básica e rode no browser.
Como usar: Crie um arquivo exercicio.html
com a estrutura básica do HTML e coloque seu código dentro da tag
<script>. Use alert(), prompt()
e console.log() para entrada e saída. Ao terminar, clique em
"Ver solução" para comparar com a resposta.
prompt().
Em seguida, exiba a mensagem "Olá, [nome]! Bem-vindo ao Dev Atlas!"
usando alert().
prompt() em uma variável e depois
use a variável dentro do alert().
let nome = prompt("Qual é o seu nome?")
alert("Olá, " + nome + "! Bem-vindo ao Dev Atlas!")
prompt() para número com
Number(). Use um if/else para a verificação de maior/menor.
let anoNascimento = Number( prompt("Em que ano você nasceu?") )
let idade = 2025 - anoNascimento
let situacao
if (idade >= 18) {
situacao = "maior de idade ✅"
} else {
situacao = "menor de idade ⚠️"
}
alert("Você tem aproximadamente " + idade + " anos.\nVocê é " + situacao + ".")
numero % 2 === 0).
let numero = Number( prompt("Digite um número:") )
// Par ou ímpar
let paridade = numero % 2 === 0 ? "par" : "ímpar"
// Positivo, negativo ou zero
let sinal
if (numero > 0) sinal = "positivo"
else if (numero < 0) sinal = "negativo"
else sinal = "zero"
alert("O número " + numero + " é " + paridade + " e " + sinal + ".")
for de 1 a 10. Acumule as linhas numa variável
de texto e exiba tudo de uma vez no final com alert().
let numero = Number( prompt("Digite um número para ver a tabuada:") )
let tabuada = "Tabuada do " + numero + ":\n\n"
for (let i = 1; i <= 10; i++) {
tabuada += numero + " x " + i + " = " + (numero * i) + "\n"
}
alert(tabuada)
switch para tratar cada operação como um caso separado.
let num1 = Number( prompt("Digite o primeiro número:") )
let num2 = Number( prompt("Digite o segundo número:") )
let op = prompt("Qual operação? (+, -, *, /)")
let resultado
switch (op) {
case "+":
resultado = num1 + num2
break
case "-":
resultado = num1 - num2
break
case "*":
resultado = num1 * num2
break
case "/":
if (num2 === 0) {
alert("❌ Não é possível dividir por zero!")
} else {
resultado = num1 / num2
}
break
default:
alert("❌ Operação inválida! Use +, -, * ou /")
}
if (resultado !== undefined) {
alert(num1 + " " + op + " " + num2 + " = " + resultado)
}
for para pedir as 5 notas e acumular a soma.
Crie uma função calcularMedia(soma, quantidade) que retorne o resultado.
function calcularMedia(soma, quantidade) {
return soma / quantidade
}
let somaNotas = 0
let total = 5
for (let i = 1; i <= total; i++) {
let nota = Number( prompt("Digite a nota " + i + " (0 a 10):") )
somaNotas += nota
}
let media = calcularMedia(somaNotas, total)
let situacao
if (media >= 6) {
situacao = "✅ Aprovado!"
} else if (media >= 4) {
situacao = "⚠️ Recuperação"
} else {
situacao = "❌ Reprovado"
}
alert("Média: " + media.toFixed(1) + "\nSituação: " + situacao)
Math.floor(Math.random() * 10) + 1 para gerar).
O usuário tem tentativas ilimitadas para adivinhar.
A cada tentativa errada, diga se o número secreto é maior ou
menor que o palpite. Quando acertar, mostre o número de tentativas.
while que continua enquanto o usuário não acertar.
Incremente um contador de tentativas a cada volta do loop.
let secreto = Math.floor(Math.random() * 10) + 1
let tentativas = 0
let palpite = 0
while (palpite !== secreto) {
palpite = Number( prompt("Adivinhe o número (1 a 10):") )
tentativas++
if (palpite < secreto) {
alert("⬆️ O número secreto é MAIOR. Tente de novo!")
} else if (palpite > secreto) {
alert("⬇️ O número secreto é MENOR. Tente de novo!")
}
}
alert("🎉 Parabéns! Você acertou em " + tentativas + " tentativa(s)!")
fatorial(n) que calcule o fatorial de um número.
O fatorial de 5 é 5! = 5 × 4 × 3 × 2 × 1 = 120.
O fatorial de 0 é 1 por definição. Peça um número ao usuário e exiba o resultado.
for que começa em 1 e vai até n,
multiplicando um acumulador (que começa em 1) a cada iteração.
function fatorial(n) {
if (n === 0) return 1 // caso especial: 0! = 1
let resultado = 1
for (let i = 1; i <= n; i++) {
resultado *= i // resultado = resultado * i
}
return resultado
}
let numero = Number( prompt("Digite um número inteiro positivo:") )
alert(numero + "! = " + fatorial(numero))
true se for palíndromo e false caso contrário.
Ignore maiúsculas e minúsculas.
.toLowerCase(), depois use
.split("") para transformar em array de letras,
.reverse() para inverter e .join("") para juntar de volta.
Compare a palavra original com a invertida.
function ehPalindromo(palavra) {
let limpa = palavra.toLowerCase()
let invertida = limpa.split("").reverse().join("")
return limpa === invertida
}
let palavra = prompt("Digite uma palavra:")
if (ehPalindromo(palavra)) {
alert('"' + palavra + '" é um palíndromo! 🔄')
} else {
alert('"' + palavra + '" NÃO é um palíndromo.')
}
// Teste com: arara, radar, ovo, level, Ana
• Se o número for divisível por 3, imprima
"Fizz"• Se for divisível por 5, imprima
"Buzz"• Se for divisível por 3 E 5, imprima
"FizzBuzz"• Caso contrário, imprima o número normalmente.
%) para verificar
divisibilidade — se n % 3 === 0, é divisível por 3.
for (let i = 1; i <= 100; i++) {
if (i % 3 === 0 && i % 5 === 0) {
console.log("FizzBuzz") // divisível por 3 E 5 — vem primeiro!
} else if (i % 3 === 0) {
console.log("Fizz")
} else if (i % 5 === 0) {
console.log("Buzz")
} else {
console.log(i)
}
}
// Abra o DevTools (F12 → Console) para ver os resultados!
📋 Resumo — Lógica de Programação
- Use === para comparar (nunca ==) — ele verifica valor E tipo
- if/else if/else para bifurcações; switch quando há muitos casos do mesmo valor
- O ternário
condição ? a : bé um if/else em uma linha — use com moderação - for quando você sabe quantas repetições; while enquanto uma condição for verdadeira
- break sai do loop; continue pula para a próxima iteração
- Funções recebem parâmetros e devolvem resultados com return
- Variáveis dentro de funções têm escopo local — não existem fora delas
- Arrays + loops são inseparáveis — percorra listas sempre com um
for - O índice de arrays começa em 0, não em 1. O último elemento é
array[array.length - 1] - Pratique os exercícios: a lógica só entra com a mão no teclado