Capítulo 10: Laço Pós-Testado (FACA-ENQUANTO / Do-While Loop)

🎯 Objetivo da Aula

Em muitas aplicações reais, precisamos que uma ação aconteça obrigatoriamente pelo menos uma vez antes de qualquer teste. É o caso clássico de um Menu Principal de Sistema (o menu precisa ser desenhado na tela para o usuário escolher o que fazer) ou de uma Tela de Senha (o sistema precisa pedir a digitação antes de avaliar se a senha está correta).

Nesta aula, você aprenderá a:

  1. Compreender o funcionamento do Laço Pós-Testado (faca ... enquanto).
  2. Dominar a sintaxe e a semântica de Condição de Permanência (continua rodando ENQUANTO a condição for verdadeira).
  3. Construir Menus de Navegação Contínuos que só encerram quando o usuário digita a opção 0.
  4. Implementar rotinas de Validação de Entrada e Limite de Tentativas de Acesso.

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


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

Situação: O terminal do almoxarifado da FastLog precisa de um sistema contínuo que permita ao conferente dar entrada e saída em paletes de mercadorias sem que o programa feche após uma única operação. O programa só deve fechar quando o operador escolher explicitamente a opção 0 (Sair). Além disso, o acesso ao terminal exige autenticação por senha de 4 dígitos.

Missão: Você deve construir o Painel Operacional Contínuo FastLog, integrando o laço faca-enquanto com menu de navegação e autenticação de segurança.


🧠 Fundamentos: O Laço Pós-Testado faca-enquanto

1. enquanto (Pré-testado) vs faca-enquanto (Pós-testado)

CaracterísticaLaço enquanto (While)Laço faca-enquanto (Do-While)
Momento do TesteNo início (antes de rodar o bloco).No final (depois de rodar o bloco).
Garantia de ExecuçãoPode rodar 0 vezes (se a condição for falsa logo de cara).Garantido rodar pelo menos 1 vez.
Ponto e Vírgula FinalNão usa.Opcional/Recomendado ao final do enquanto(condicao).
Uso IdealLeitura de arquivos e sentinelas.Menus de navegação e validação de senhas.
graph TD
    A[Início do Bloco faca] --> B[1. Exibir Menu de Opções]
    B --> C[2. Ler Opção do Usuário]
    C --> D[3. Processar Ação com Escolha]
    D --> E{enquanto: opcao != 0?}
    E -- "verdadeiro (Continua no Loop)" --> B
    E -- "falso (opcao == 0 -> Encerra)" --> F[Fim do Programa]
    
    style B fill:#2980b9,stroke:#fff,color:#fff
    style D fill:#8e44ad,stroke:#fff,color:#fff
    style E fill:#f39c12,stroke:#fff,color:#fff
    style F fill:#27ae60,stroke:#fff,color:#fff

2. A Sintaxe no Portugol Studio

1
2
3
4
5
6
7
faca 
{
	// Bloco executado OBRIGATORIAMENTE pelo menos uma vez
	escreva("Digite uma opção (0 para sair): ")
	leia(opcao)
} 
enquanto (opcao != 0)

📖 Exemplo Guiado: Menu Contínuo de Almoxarifado

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
46
47
48
49
50
51
52
53
54
55
56
57
programa 
{
	funcao inicio() 
	{
		inteiro opcao, saldoEstoque = 100, qtd

		// Início do Laço Pós-Testado
		faca 
		{
			escreva("\n=== SISTEMA DE ESTOQUE FASTLOG ===\n")
			escreva(" Saldo Atual: ", saldoEstoque, " unidades\n")
			escreva("----------------------------------\n")
			escreva(" [1] Dar Entrada de Mercadoria (+)\n")
			escreva(" [2] Dar Baixa de Expedição (-)\n")
			escreva(" [3] Consultar Status do Saldo\n")
			escreva(" [0] Encerrar e Sair do Sistema\n")
			escreva("==================================\n")
			escreva("Escolha uma ação: ")
			leia(opcao)

			escreva("\n")
			escolha (opcao) 
			{
				caso 1:
					escreva("Quantidade de caixas recebidas: ")
					leia(qtd)
					saldoEstoque += qtd
					escreva(">> [SUCESSO] Entrada registrada! Novo saldo: ", saldoEstoque, "\n")
					pare
				caso 2:
					escreva("Quantidade de caixas despachadas: ")
					leia(qtd)
					se (qtd <= saldoEstoque) 
					{
						saldoEstoque -= qtd
						escreva(">> [SUCESSO] Saída registrada! Novo saldo: ", saldoEstoque, "\n")
					} 
					senao 
					{
						escreva(">> [ERRO]: Saldo insuficiente para atender o pedido!\n")
					}
					pare
				caso 3:
					escreva(">> [INVENTÁRIO]: Saldo auditado = ", saldoEstoque, " un.\n")
					pare
				caso 0:
					escreva(">> Encerrando a sessão do operador...\n")
					pare
				caso contrario:
					escreva(">> [OPÇÃO INVÁLIDA]: Digite um número de 0 a 3.\n")
			}

		} enquanto (opcao != 0) // Repete ENQUANTO for diferente de zero!

		escreva("Sessão finalizada com sucesso. Tenha um bom turno!\n")
	}
}

🛠️ Prática Obrigatória 1: Autenticação de Operador com 3 Tentativas

Passo 1: O Desafio

Crie um programa autenticacao.por que solicite a senha de acesso (a senha correta é 1234). O laço faca-enquanto deve continuar pedindo a senha enquanto a senha estiver errada E o número de tentativas for menor que 3.

✅ Resultado Esperado (Prática 1):

1
2
3
4
5
6
Digite a senha de acesso (Tentativa 1/3): 9999
Senha incorreta! Tente novamente.

Digite a senha de acesso (Tentativa 2/3): 1234

>>> ACESSO AUTORIZADO! Bem-vindo ao sistema de pátio.

🛠️ Prática Obrigatória 2: Validação Defensiva de Peso de Carga

O operador precisa digitar o peso de um caminhão. O peso deve ser maior que 0 e menor ou igual a 30.000 kg. Crie um programa validacao_peso.por com faca-enquanto que force o operador a redigitar o peso caso ele insira um valor inválido.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_SeuNome_SeuSobrenome.por.
  2. Teste o menu com várias operações consecutivas garantindo que ele só encerra no 0.
  3. No Microsoft Teams, envie na tarefa “Portugol Cap 10 - Laço Faça-Enquanto”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de dominar o padrão REPL (Read-Eval-Print Loop). Todos os terminais interativos (como Python CLI, Node REPL e consoles de bancos de dados SQL) rodam sobre um laço pós-testado contínuo.


🔥 Desafio de Fixação: Caixa Rápido de Abastecimento

Crie um programa com faca-enquanto que simule a bomba de abastecimento do pátio:

  • Menu: 1 - Abastecer 50L (R$ 290.00), 2 - Abastecer 100L (R$ 580.00) e 0 - Fechar Conta.
  • O programa acumula os abastecimentos e exibe o comprovante final ao sair.

🔑 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
24
25
programa {
	funcao inicio() {
		inteiro senhaDigitada, tentativas = 0
		logico autenticado = falso

		faca {
			tentativas++
			escreva("Digite a senha de acesso (Tentativa ", tentativas, "/3): ")
			leia(senhaDigitada)

			se (senhaDigitada == 1234) {
				autenticado = verdadeiro
			} senao se (tentativas < 3) {
				escreva("Senha incorreta! Tente novamente.\n\n")
			}
		} enquanto (nao autenticado e tentativas < 3)

		escreva("\n")
		se (autenticado) {
			escreva(">>> ACESSO AUTORIZADO! Bem-vindo ao sistema de pátio.\n")
		} senao {
			escreva(">>> TERMINAL BLOQUEADO! 3 tentativas inválidas consecutivas.\n")
		}
	}
}

Prática 2:

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

		faca {
			escreva("Informe o peso da carga (1 a 30000 kg): ")
			leia(pesoCarga)

			pesoValido = (pesoCarga > 0.0) e (pesoCarga <= 30000.0)

			se (nao pesoValido) {
				escreva("[ERRO]: Peso fora dos limites permitidos! Digite novamente.\n")
			}
		} enquanto (nao pesoValido)

		escreva("\n>>> PESO VALIDADO COM SUCESSO: ", pesoCarga, " kg\n")
	}
}

Desafio:

 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
programa {
	funcao inicio() {
		inteiro opcao, totalLitros = 0
		real totalPagar = 0.0

		faca {
			escreva("\n=== POSTO INTERNO FASTLOG ===\n")
			escreva(" [1] Abastecer 50 Litros (R$ 290.00)\n")
			escreva(" [2] Abastecer 100 Litros (R$ 580.00)\n")
			escreva(" [0] Finalizar Abastecimento\n")
			escreva("Opção: ")
			leia(opcao)

			escolha (opcao) {
				caso 1:
					totalLitros += 50
					totalPagar += 290.00
					escreva(">> 50L adicionados ao tanque.\n")
					pare
				caso 2:
					totalLitros += 100
					totalPagar += 580.00
					escreva(">> 100L adicionados ao tanque.\n")
					pare
				caso 0:
					escreva(">> Processando fechamento...\n")
					pare
			}
		} enquanto (opcao != 0)

		escreva("\n=== COMPROVANTE DE ABASTECIMENTO ===\n")
		escreva("Volume Total Abastecido : ", totalLitros, " Litros\n")
		escreva("TOTAL A DEBITAR NA FROTA: R$ ", totalPagar, "\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. Qual é a principal diferença entre o laço enquanto (pré-testado) e o laço faca-enquanto (pós-testado), segundo a tabela comparativa do capítulo?
  2. Quantas vezes o bloco de um laço faca-enquanto é garantido a executar, no mínimo?
  3. Na sintaxe faca { ... } enquanto (condicao), o teste da condição ocorre antes ou depois do bloco de instruções?
  4. Segundo a tabela comparativa do capítulo, para que tipo de situações (dois exemplos citados) o laço faca-enquanto é mais indicado?
  5. No Exemplo Guiado (Menu Contínuo de Almoxarifado), qual opção do menu o usuário deve escolher para encerrar o programa?
  6. Na Prática Obrigatória 1 (Autenticação de Operador), qual é a senha correta de acesso e quantas tentativas o operador tem no máximo?
  7. Na Prática Obrigatória 2 (Validação Defensiva de Peso de Carga), qual é a faixa de peso considerada válida para o caminhão?
  8. Segundo o Checkpoint de Lógica, a que padrão de terminal interativo (sigla em inglês) o laço pós-testado contínuo é comparado?
  9. Dê dois exemplos, citados no Checkpoint de Lógica, de terminais interativos reais que seguem esse padrão.
  10. Segundo o Objetivo da Aula, por que uma Tela de Senha é um exemplo típico de uso do laço pós-testado (o que precisa acontecer antes de qualquer teste da condição)?