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

🎯 Objetivo da Aula

No gerenciamento logístico, processar uma única caixa por vez manualmente é inviável. Quando um caminhão descarrega dezenas ou centenas de paletes na esteira, o software precisa repetir as instruções de leitura e pesagem continuamente até que a carga seja finalizada.

Nesta aula, você aprenderá a:

  1. Compreender o conceito de Estrutura de Repetição (Loop / Laço).
  2. Dominar a sintaxe do laço pré-testado enquanto (condicao) { ... } (While Loop).
  3. Utilizar Contadores (i++) e Acumuladores (soma += valor).
  4. Aplicar a técnica do Valor Sentinela para interrupção de loops e prevenção de Loop Infinito.

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


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

Situação: O operador da esteira de descarga do galpão da FastLog precisa registrar o peso de cada pacote que passa pela balança automática. O operador não sabe quantas caixas o caminhão trouxe. Ele deseja digitar os pesos um a um e, quando terminar a carga, digitar 0.0 para sinalizar o fim da sessão.

Missão: Você deve construir o Conferente de Esteira FastLog, recebendo os pesos continuamente, acumulando o Peso Total e a Quantidade de Caixas, calculando a Média de Peso por Caixa ao final da operação.


🧠 Fundamentos: O Laço Pré-Testado enquanto

1. Como Funciona o enquanto?

O laço é chamado de pré-testado porque o computador avalia a condição ANTES de executar as instruções:

  • Se for verdadeiro, ele entra nas chaves { }, executa o bloco e retorna para o topo para testar novamente.
  • Assim que for falso, ele pula fora do bloco e continua o programa.
graph TD
    A[Início: Ler Primeiro Peso] --> B{Peso != 0.0?}
    B -- "Sim (verdadeiro)" --> C["1. Acumular Peso Total (soma += peso)<br/>2. Incrementar Contador (qtd++)<br/>3. Ler Próximo Peso"]
    C --> B
    B -- "Não (falso / Sentinela)" --> D["Exibir Relatório Final:<br/>Total de Caixas e Peso Acumulado"]
    D --> E[Fim do Programa]
    
    style B fill:#8e44ad,stroke:#fff,color:#fff
    style C fill:#2980b9,stroke:#fff,color:#fff
    style D fill:#27ae60,stroke:#fff,color:#fff

2. Contadores vs Acumuladores

Tipo de VariávelO que faz?Inicialização TípicaSintaxe C / Portugol
ContadorConta a quantidade de repetições (soma +1).inteiro cont = 0cont++ ou cont = cont + 1
AcumuladorSoma valores variáveis a cada ciclo (dinheiro, peso).real total = 0.0total += valor

3. Prevenindo o Loop Infinito!

Um loop infinito ocorre quando a condição do enquanto nunca se torna falsa, travando a máquina.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// ❌ LOOP INFINITO (ERRO GRAVE):
inteiro c = 1
enquanto (c <= 10) {
	escreva(c, "\n")
	// Esqueceu de fazer c++! 'c' sempre será 1 para sempre.
}

// ✅ CÓDIGO CORRETO:
inteiro c = 1
enquanto (c <= 10) {
	escreva(c, "\n")
	c++ // Passo que aproxima da condição de parada!
}

📖 Exemplo Guiado: Leitor de Esteira com Sentinela

Código do Programa:

 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
42
43
44
45
programa 
{
	inclua biblioteca Matematica --> mat

	funcao inicio() 
	{
		real pesoCaixa, pesoTotalAcumulado = 0.0, mediaPeso
		inteiro quantidadeCaixas = 0

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

		// 2. Laço Pré-Testado
		enquanto (pesoCaixa != 0.0) 
		{
			quantidadeCaixas++
			pesoTotalAcumulado += pesoCaixa
			
			escreva(">> [REGISTRADO] Caixa Nº ", quantidadeCaixas, " | Peso: ", pesoCaixa, " kg\n")
			escreva("Informe o próximo peso (ou 0 para encerrar): ")
			leia(pesoCaixa) // Atualização da variável de teste!
		}

		// 3. Relatório Final
		escreva("\n============ RELATÓRIO DO LOTE ============\n")
		escreva("Total de Caixas Conferidas: ", quantidadeCaixas, " unidades\n")
		escreva("Peso Total Consolidado    : ", pesoTotalAcumulado, " kg\n")
		
		se (quantidadeCaixas > 0) 
		{
			mediaPeso = mat.arredondar(pesoTotalAcumulado / quantidadeCaixas, 2)
			escreva("Média de Peso por Caixa   : ", mediaPeso, " kg\n")
		} 
		senao 
		{
			escreva("Nenhuma mercadoria foi registrada nesta sessão.\n")
		}
		escreva("===========================================\n")
	}
}

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

Passo 1: O Desafio

Crie um programa auditoria_fretes.por que receba os valores de fretes faturados. O programa deve parar quando o operador digitar qualquer valor negativo (ex: -1.0). Ao final, o programa deve exibir:

  • A quantidade total de fretes faturados.
  • O total bruto arrecadado.

✅ Resultado Esperado (Prática 1):

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

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

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

Crie um programa alarme_temperatura.por que leia a temperatura de um sensor continuamente. Enquanto a temperatura estiver segura (entre -20.0 e -10.0 graus), continue lendo e exibindo ">> Temperatura Estável". Se o operador digitar uma temperatura fora desse intervalo, encerre o laço imediatamente e exiba: "[ALARME ACIONADO] Risco de Descongelamento!".


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_SeuNome_SeuSobrenome.por.
  2. Teste o laço com sentinelas para garantir que ele não trava em loop infinito.
  3. No Microsoft Teams, envie na tarefa “Portugol 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. Servidores Web e sistemas operacionais mantêm laços while(servidorRodando) em execução contínua para escutar requisições de rede e eventos do mouse/teclado.


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

Crie um programa que receba o saldo devedor de um caminhão (ex: R$ 80.000,00) e o valor 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 foram necessários para quitar o veículo.


🔑 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
programa {
	funcao inicio() {
		real valorFrete, faturamentoTotal = 0.0
		inteiro qtdFretes = 0

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

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

		escreva("\nTotal de Fretes Faturados: ", qtdFretes, "\n")
		escreva("Faturamento Total do Dia: R$ ", faturamentoTotal, "\n")
	}
}

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
programa {
	funcao inicio() {
		real temperatura

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

		enquanto (temperatura >= -20.0 e temperatura <= -10.0) {
			escreva(">> [STATUS OK] Temperatura Estável: ", temperatura, " °C\n")
			escreva("Próxima Leitura (°C): ")
			leia(temperatura)
		}

		escreva("\n[ALARME ACIONADO] Temperatura Crítica: ", temperatura, " °C\n")
		escreva("RISCO DE DESCONGELAMENTO! Equipe de manutenção notificada.\n")
	}
}

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
programa {
	funcao inicio() {
		real saldoDevedor, valorParcela
		inteiro meses = 0

		escreva("Saldo Devedor do Veículo (R$): ") leia(saldoDevedor)
		escreva("Valor da Parcela Mensal (R$): ") leia(valorParcela)

		enquanto (saldoDevedor > 0.0) {
			meses++
			saldoDevedor -= valorParcela
			se (saldoDevedor < 0.0) { saldoDevedor = 0.0 }
			escreva("Mês ", meses, " | Parcela: R$ ", valorParcela, " | Saldo: R$ ", saldoDevedor, "\n")
		}

		escreva("\n>>> VEÍCULO 100% QUITADO EM ", meses, " MESES!\n")
	}
}

📝 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”, segundo o capítulo?
  2. Qual é a diferença fundamental entre um Contador e um Acumulador, segundo a tabela do capítulo?
  3. Dê um exemplo de sintaxe de inicialização típica de um Contador e de um Acumulador, conforme a tabela do capítulo.
  4. O que causa um Loop Infinito, segundo o exemplo de código incorreto mostrado no capítulo?
  5. O que é necessário adicionar dentro do laço para evitar um Loop Infinito, segundo o exemplo de código corrigido?
  6. Com base no Cenário Prático e no Exemplo Guiado, qual valor sinaliza o fim da leitura de pesos na esteira (o “Valor Sentinela”)?
  7. Na Prática Obrigatória 1 (Somador de Fretes com Sentinela Negativo), que valor o operador deve digitar para encerrar a leitura de fretes?
  8. Na Prática Obrigatória 2 (Monitor de Temperatura da Câmara Fria), qual é a faixa de temperatura considerada segura?
  9. Segundo o Checkpoint de Lógica, a que conceito (usado por servidores web e sistemas operacionais) o laço enquanto contínuo é comparado?
  10. No Exemplo Guiado (Leitor de Esteira com Sentinela), qual comando é repetido dentro do laço a cada iteração, logo antes de o laço testar a condição novamente?