🧠 Lógica de Programação

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

JavaScript
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:

OperadorSignificadoExemploResultado
===Igual (valor E tipo)5 === 5true
===Igual (valor E tipo)5 === "5"false
!==Diferente (valor E tipo)5 !== 8true
>Maior que10 > 5true
<Menor que3 < 2false
>=Maior ou igual5 >= 5true
<=Menor ou igual4 <= 3false

Operadores Lógicos

Combinam condições:

JavaScript
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

JavaScript — 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

JavaScript — if dentro de if
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

JavaScript — Ternário
// 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

JavaScript — switch
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

JavaScript — for
// 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

JavaScript — while
// 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

JavaScript — do...while
// 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

JavaScript — break e continue
// 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

JavaScript — Funções básicas
// 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

JavaScript — Funções do mundo real
// 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

JavaScript — Valor 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.

JavaScript — Arrays com loops
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.

JavaScript — Escopo local vs global
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.

1
Olá, nome!
Fácil
Peça ao usuário que digite o seu nome com prompt(). Em seguida, exiba a mensagem "Olá, [nome]! Bem-vindo ao Dev Atlas!" usando alert().
💡 Dica: guarde o resultado do prompt() em uma variável e depois use a variável dentro do alert().
✅ Solução
JavaScript
let nome = prompt("Qual é o seu nome?")
alert("Olá, " + nome + "! Bem-vindo ao Dev Atlas!")
2
Calculadora de idade
Fácil
Peça o ano de nascimento do usuário. Calcule e exiba a idade aproximada da pessoa (considere o ano atual como 2025). Exiba também uma mensagem dizendo se ela é maior ou menor de idade.
💡 Dica: lembre-se de converter o valor do prompt() para número com Number(). Use um if/else para a verificação de maior/menor.
✅ Solução
JavaScript
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 + ".")
3
Par ou ímpar
Fácil
Peça um número ao usuário. Diga se o número é par ou ímpar. Bônus: diga também se é positivo, negativo ou zero.
💡 Dica: um número é par quando o resto da divisão por 2 é zero (numero % 2 === 0).
✅ Solução
JavaScript
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 + ".")
4
Tabuada
Fácil
Peça um número ao usuário e exiba a tabuada completa desse número (de 1 a 10) usando um loop. Por exemplo, se o usuário digitar 7, exiba: 7 x 1 = 7, 7 x 2 = 14… até 7 x 10 = 70.
💡 Dica: use um loop for de 1 a 10. Acumule as linhas numa variável de texto e exiba tudo de uma vez no final com alert().
✅ Solução
JavaScript
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)
5
Calculadora simples
Médio
Crie uma calculadora que peça dois números e a operação desejada (+, -, * ou /). Exiba o resultado da operação. Se a operação for inválida, exiba uma mensagem de erro. Bônus: se for divisão, verifique se o segundo número é zero.
💡 Dica: use switch para tratar cada operação como um caso separado.
✅ Solução
JavaScript
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)
}
6
Média das notas
Médio
Peça ao usuário que informe 5 notas (uma de cada vez). Calcule a média e exiba se o aluno foi Aprovado (média ≥ 6), em Recuperação (média entre 4 e 5,9) ou Reprovado (média < 4). Use uma função para calcular a média.
💡 Dica: use um loop for para pedir as 5 notas e acumular a soma. Crie uma função calcularMedia(soma, quantidade) que retorne o resultado.
✅ Solução
JavaScript
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)
7
Adivinhe o número
Médio
Crie um jogo onde o computador "pensa" num número entre 1 e 10 (use 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.
💡 Dica: use um loop while que continua enquanto o usuário não acertar. Incremente um contador de tentativas a cada volta do loop.
✅ Solução
JavaScript
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)!")
8
Fatorial
Médio
Crie uma função 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.
💡 Dica: use um loop for que começa em 1 e vai até n, multiplicando um acumulador (que começa em 1) a cada iteração.
✅ Solução
JavaScript
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))
9
Verificar Palíndromo
Difícil
Um palíndromo é uma palavra que se lê igual de frente para trás (ex: "arara", "radar", "ovo"). Crie uma função que receba uma palavra e retorne true se for palíndromo e false caso contrário. Ignore maiúsculas e minúsculas.
💡 Dica: converta para minúsculas com .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.
✅ Solução
JavaScript
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
10
FizzBuzz
Difícil
Um clássico de entrevistas! Imprima no console os números de 1 a 100, mas com estas regras:

• 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.
💡 Dica: verifique o caso FizzBuzz (divisível por 3 E 5) primeiro, antes dos casos individuais. Use o operador módulo (%) para verificar divisibilidade — se n % 3 === 0, é divisível por 3.
✅ Solução
JavaScript
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