Capítulo 09: Laço Pré-Testado (ENQUANTO-FACA / While Loop)

🎯 Objetivo da Aula

Em sistemas logísticos e administrativos, processar um único item por vez manualmente é impensável. Quando um navio ou caminhão descarrega centenas de caixas no armazém, o software precisa repetir o mesmo processo de leitura e pesagem até que a última caixa seja conferida.

Nesta aula, você aprenderá a:

  1. Compreender o conceito de Estrutura de Repetição (Loop / Laço).
  2. Dominar o laço pré-testado enquanto (condicao) faca ... fimenquanto (While Loop).
  3. Utilizar com maestria Variáveis Contadoras (cont <- cont + 1) e Variáveis Acumuladoras (soma <- soma + valor).
  4. Aplicar a técnica do Valor Sentinela para interrupção de loops e evitar o temido Loop Infinito.

📥 Material de Apoio e Código-Fonte da Aula:


🏢 O Cenário Prático (Seu Desafio)

Situação: O operador da esteira rolante do galpão da FastLog precisa registrar o peso de todas as caixas que passam pelo sensor da balança. O operador não sabe previamente se o caminhão trouxe 10, 50 ou 200 caixas. Ele deseja digitar os pesos um a um e, quando terminar o lote, digitar o valor 0 (zero) para indicar que a carga terminou.

Missão: Você deve construir o Leitor de Cargas da Esteira, que receba pesos continuamente, acumule o Peso Total e a Quantidade de Caixas, calculando a Média de Peso por Caixa ao final da operação.


🧠 Fundamentos: A Lógica do Laço enquanto-faca

1. O que é um Laço Pré-Testado?

O laço enquanto é chamado de pré-testado porque o computador testa a condição ANTES de executar o bloco de comandos pela primeira vez:

  • Se a condição for VERDADEIRA, ele entra no bloco, executa as instruções e volta para o topo para testar novamente.
  • Assim que a condição se tornar FALSA, ele pula fora do bloco e segue para o fimenquanto.
graph TD
    A[Início: Ler Primeiro Peso] --> B{Peso <> 0?}
    B -- "Sim (VERDADEIRO)" --> C["1. Acumular Peso Total<br/>2. Incrementar Contador (+1)<br/>3. Ler Próximo Peso"]
    C --> B
    B -- "Não (FALSO / Sentinela Digitado)" --> D["Exibir Relatório:<br/>Total de Caixas e Peso Acumulado"]
    D --> E[Fim do Algoritmo]
    
    style B fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style C fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style D fill:#217346,stroke:#fff,stroke-width:2px,color:#fff

2. Contadores vs Acumuladores (A Diferença Vital)

Tipo de VariávelO que faz?Inicialização TípicaExemplo de Código
ContadorConta quantas vezes um evento ocorreu (soma um valor fixo, geralmente + 1).cont <- 0totalCaixas <- totalCaixas + 1
Acumulador (Somador)Soma valores variáveis a cada repetição (acumula o total de dinheiro, peso, etc.).soma <- 0.0pesoTotal <- pesoTotal + pesoCaixa

3. A Regra de Ouro: Prevenindo o Loop Infinito!

Um Loop Infinito ocorre quando a condição do enquanto nunca se torna falsa. O programa trava e consome 100% da CPU.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// ❌ EXEMPLO DE LOOP INFINITO (ERRO GRAVE):
cont <- 1
enquanto (cont <= 10) faca
   escreval("Número: ", cont)
   // Esqueceu de fazer cont <- cont + 1! 'cont' sempre valerá 1, travando o PC.
fimenquanto

// ✅ EXEMPLO CORRETO:
cont <- 1
enquanto (cont <= 10) faca
   escreval("Número: ", cont)
   cont <- cont + 1 // Passo de aproximação do fim!
fimenquanto

📖 Exemplo Guiado: Leitor de Esteira com Sentinela

Código do Algoritmo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
algoritmo "Leitor_Esteira_FastLog"
var
   pesoCaixa, pesoTotalAcumulado, mediaPeso : real
   quantidadeCaixas : inteiro

inicio
   pesoTotalAcumulado <- 0.0
   quantidadeCaixas <- 0

   escreval("=== SISTEMA DE CONFERÊNCIA DE ESTEIRA ===")
   escreval("Digite o peso de cada caixa (ou digite 0 para encerrar):")
   escreval("-----------------------------------------")
   
   // 1. Leitura Inicial (Primeiro Teste)
   escreva("Informe o peso da caixa em kg: ")
   leia(pesoCaixa)

   // 2. Laço de Repetição Condicional
   enquanto (pesoCaixa <> 0.0) faca
      quantidadeCaixas <- quantidadeCaixas + 1
      pesoTotalAcumulado <- pesoTotalAcumulado + pesoCaixa
      
      escreval(">> [REGISTRADO] Caixa Nº ", quantidadeCaixas, " | Peso: ", pesoCaixa:6:2, " kg")
      escreva("Informe o próximo peso (ou 0 para encerrar): ")
      leia(pesoCaixa) // Atualização da variável de controle!
   fimenquanto

   // 3. Relatório Final de Consolidação
   escreval("")
   escreval("============ RELATÓRIO DO LOTE ============")
   escreval("Total de Caixas Conferidas: ", quantidadeCaixas, " unidades")
   escreval("Peso Bruto Consolidado    : ", pesoTotalAcumulado:8:2, " kg")
   
   se (quantidadeCaixas > 0) entao
      mediaPeso <- pesoTotalAcumulado / quantidadeCaixas
      escreval("Média de Peso por Caixa   : ", mediaPeso:6:2, " kg")
   senao
      escreval("Nenhuma mercadoria foi registrada nesta sessão.")
   fimse
   escreval("===========================================")
fimalgoritmo

✅ Exemplo de Execução no Console (F9):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
=== SISTEMA DE CONFERÊNCIA DE ESTEIRA ===
Digite o peso de cada caixa (ou digite 0 para encerrar):
-----------------------------------------
Informe o peso da caixa em kg: 15.5
>> [REGISTRADO] Caixa Nº 1 | Peso:  15.50 kg
Informe o próximo peso (ou 0 para encerrar): 22.8
>> [REGISTRADO] Caixa Nº 2 | Peso:  22.80 kg
Informe o próximo peso (ou 0 para encerrar): 18.2
>> [REGISTRADO] Caixa Nº 3 | Peso:  18.20 kg
Informe o próximo peso (ou 0 para encerrar): 0

============ RELATÓRIO DO LOTE ============
Total de Caixas Conferidas: 3 unidades
Peso Bruto Consolidado    :    56.50 kg
Média de Peso por Caixa   :   18.83 kg
===========================================

🛠️ Prática Obrigatória 1: Somador de Fretes com Sentinela Negativo

Passo 1: O Desafio

Crie um algoritmo "Auditoria_Caixa" que solicite sucessivamente os valores dos fretes faturados no dia. O programa deve parar quando o operador digitar qualquer valor negativo (ex: -1). Ao final, o programa deve exibir:

  • A quantidade total de fretes emitidos.
  • O faturamento total bruto arrecadado.

✅ Resultado Esperado (Prática 1):

1
2
3
4
5
6
Digite o valor do frete (ou -1 para encerrar): 1200.00
Digite o valor do frete (ou -1 para encerrar): 850.50
Digite o valor do frete (ou -1 para encerrar): -1

Total de Fretes Faturados: 2
Faturamento Total do Dia: R$ 2050.50

🛠️ Prática Obrigatória 2: Monitor de Temperatura da Câmara Fria

Crie um algoritmo "Alerta_Camara_Fria" que leia a temperatura de um sensor térmico continuamente. Enquanto a temperatura estiver segura (entre -20.0 e -10.0 graus), o sistema continua lendo e exibindo "Temperatura Estável". Se o operador digitar uma temperatura fora desse intervalo, o laço deve encerrar imediatamente e emitir: "[ALARME ACIONADO] Temperatura Crítica: <valor> °C" seguido de "RISCO DE DESCONGELAMENTO DE CARGA! Equipe de manutenção notificada.".

✅ Resultado Esperado (Prática 2):

1
2
3
4
5
6
7
8
Leitura do Termômetro (°C): -18.0
>> [STATUS OK] Temperatura Estável: -18.0 °C
Próxima Leitura (°C): -12.0
>> [STATUS OK] Temperatura Estável: -12.0 °C
Próxima Leitura (°C): -5.0

[ALARME ACIONADO] Temperatura Crítica:  -5.0 °C
RISCO DE DESCONGELAMENTO DE CARGA! Equipe de manutenção notificada.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_SeuNome_SeuSobrenome.alg.
  2. Teste o código no VisuAlg garantindo que a parada por sentinela funciona e que o programa não entra em loop infinito.
  3. No Microsoft Teams, envie na tarefa “VisuAlg Cap 09 - Laço Enquanto”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar o conceito de Event Loop e Polling. Sistemas de mensageria em nuvem (como Apache Kafka, RabbitMQ e WebSockets) mantêm laços while(conectado) continuamente ativos na memória do servidor para processar requisições em tempo real.


🔥 Desafio de Fixação: Simulador de Financiamento de Frota

Crie um algoritmo que receba o saldo devedor de um caminhão (ex: R$ 80.000,00) e o valor fixo da parcela mensal (ex: R$ 2.500,00). Use um laço enquanto para abater a dívida mês a mês e exibir quantos meses serão necessários para quitar o veículo integralmente.


🔑 Gabarito de Código Completo

Prática 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
algoritmo "Auditoria_Caixa"
var
   valorFrete, faturamentoTotal : real
   qtdFretes : inteiro
inicio
   faturamentoTotal <- 0.0
   qtdFretes <- 0

   escreva("Digite o valor do frete (ou -1 para encerrar): ")
   leia(valorFrete)

   enquanto (valorFrete >= 0.0) faca
      qtdFretes <- qtdFretes + 1
      faturamentoTotal <- faturamentoTotal + valorFrete
      
      escreva("Digite o valor do frete (ou -1 para encerrar): ")
      leia(valorFrete)
   fimenquanto

   escreval("")
   escreval("Total de Fretes Faturados: ", qtdFretes)
   escreval("Faturamento Total do Dia: R$ ", faturamentoTotal:8:2)
fimalgoritmo

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
algoritmo "Alerta_Camara_Fria"
var
   temperatura : real
   emAlerta : logico
inicio
   emAlerta <- FALSO

   escreva("Leitura do Termômetro (°C): ")
   leia(temperatura)

   enquanto (temperatura >= -20.0) e (temperatura <= -10.0) faca
      escreval(">> [STATUS OK] Temperatura Estável: ", temperatura:5:1, " °C")
      escreva("Próxima Leitura (°C): ")
      leia(temperatura)
   fimenquanto

   escreval("")
   escreval("[ALARME ACIONADO] Temperatura Crítica: ", temperatura:5:1, " °C")
   escreval("RISCO DE DESCONGELAMENTO DE CARGA! Equipe de manutenção notificada.")
fimalgoritmo

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
algoritmo "Financiamento_Frota"
var
   saldoDevedor, valorParcela : real
   meses : inteiro
inicio
   escreva("Saldo Devedor do Veículo (R$): ") leia(saldoDevedor)
   escreva("Valor da Parcela Mensal (R$): ") leia(valorParcela)

   meses <- 0

   enquanto (saldoDevedor > 0.0) faca
      meses <- meses + 1
      saldoDevedor <- saldoDevedor - valorParcela
      se (saldoDevedor < 0.0) entao
         saldoDevedor <- 0.0
      fimse
      escreval("Mês ", meses:2, " | Parcela Paga: R$ ", valorParcela:8:2, " | Saldo Restante: R$ ", saldoDevedor:8:2)
   fimenquanto

   escreval("")
   escreval(">>> VEÍCULO 100% QUITADO EM ", meses, " MESES!")
fimalgoritmo

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que foi estudado neste capítulo. Ao concluir, leve o caderno até o professor para correção e visto.

  1. Por que o laço enquanto é chamado de “pré-testado”?
  2. Segundo a tabela do capítulo, qual é a diferença entre uma variável Contadora e uma variável Acumuladora (Somadora)?
  3. O que é um Loop Infinito, e qual erro comum de programação o causa, segundo o exemplo do capítulo?
  4. O que é um “Valor Sentinela”, e qual valor foi usado como sentinela no Cenário Prático do Leitor de Cargas da Esteira?
  5. No Exemplo Guiado, por que o comando leia(pesoCaixa) aparece tanto antes do enquanto quanto dentro do próprio laço?
  6. No Exemplo Guiado, qual fórmula foi usada para calcular a mediaPeso ao final da leitura das caixas?
  7. Na Prática Obrigatória 1 (Somador de Fretes com Sentinela Negativo), qual valor digitado pelo operador deve encerrar o laço de leitura de fretes?
  8. Na Prática Obrigatória 2 (Monitor de Temperatura da Câmara Fria), qual é a faixa de temperatura considerada seguro/estável para manter o laço em execução?
  9. Segundo o Checkpoint de Lógica, o que são “Event Loop e Polling”, e quais sistemas de mensageria em nuvem o capítulo cita como exemplo dessa aplicação?
  10. Segundo as Instruções de Entrega, além da parada por sentinela, o que mais deve ser garantido ao testar o programa antes do envio?