Capítulo 10: Laço Pós-Testado (REPITA-ATE / Do-While / Until Loop)

🎯 Objetivo da Aula

Em muitas situações práticas de software, precisamos que uma ação aconteça pelo menos uma vez antes de qualquer teste. É o caso clássico de um Menu Principal de Sistema (o menu precisa aparecer na tela para o usuário escolher o que fazer) ou de uma Tela de Login / Senha (o sistema precisa pedir a senha antes de testar se ela está certa).

Nesta aula, você aprenderá a:

  1. Compreender o funcionamento do Laço Pós-Testado (repita-ate).
  2. Dominar a Inversão da Lógica de Parada do comando ate (ele repete enquanto for Falso e encerra quando se torna Verdadeiro).
  3. Construir Menus de Navegação Contínuos que só fecham quando o usuário escolhe a opção “Sair”.
  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 registrar entradas e saídas de mercadorias sem que o programa encerre após uma única operação. O programa só deve fechar a janela quando o operador escolher explicitamente a opção 0 (Encerrar Sistema). Além disso, o acesso ao terminal exige uma senha de 4 dígitos com no máximo 3 tentativas.

Missão: Você deve programar o Painel do Operador FastLog, combinando o laço repita-ate com validação de senha e menu de ações contínuo.


🧠 Fundamentos: A Teoria do Laço Pós-Testado

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

CaracterísticaLaço enquanto-faca (While)Laço repita-ate (Until / Do-While)
Momento do TesteNo início (antes de rodar).No final (depois de rodar).
Garantia de ExecuçãoPode rodar 0 vezes (se a condição for falsa logo de cara).Garantido rodar pelo menos 1 vez.
Critério de ContinuaçãoContinua rodando enquanto for VERDADEIRO.Continua rodando enquanto for FALSO (para quando vira VERDADEIRO!).
Uso Mais IndicadoLeitura de arquivos, varredura de dados com sentinela.Menus interativos, validação de senhas e confirmações.
graph TD
    A[Início do Bloco] --> B[1. Exibir Menu de Opções]
    B --> C[2. Ler Opção do Usuário]
    C --> D[3. Processar Opção com Escolha]
    D --> E{ate: Opcao = 0?}
    E -- "FALSO (Continua)" --> B
    E -- "VERDADEIRO (Encerra)" --> F[Fim do Algoritmo]
    
    style B fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style D fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style E fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
    style F fill:#217346,stroke:#fff,stroke-width:2px,color:#fff

2. A Pegadinha da Condição Invertida no repita-ate!

Atenção Máxima à Condição:

  • No enquanto, você escreve a condição para CONTINUAR: enquanto (opcao <> 0) faca.
  • No repita, você escreve a condição para PARAR: ate (opcao = 0).

📖 Exemplo Guiado: Menu Contínuo de Almoxarifado

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
42
43
44
45
46
47
48
49
algoritmo "Menu_Continuo_Almoxarifado"
var
   opcao, saldoEstoque, qtd : inteiro

inicio
   saldoEstoque <- 100 // Estoque inicial

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

      escreval("")
      escolha opcao
         caso 1
            escreva("Quantidade de caixas recebidas: ")
            leia(qtd)
            saldoEstoque <- saldoEstoque + qtd
            escreval(">> [SUCESSO] Entrada registrada! Novo saldo: ", saldoEstoque)
         caso 2
            escreva("Quantidade de caixas despachadas: ")
            leia(qtd)
            se (qtd <= saldoEstoque) entao
               saldoEstoque <- saldoEstoque - qtd
               escreval(">> [SUCESSO] Saída registrada! Novo saldo: ", saldoEstoque)
            senao
               escreval(">> [ERRO]: Saldo insuficiente para atender ao pedido!")
            fimse
         caso 3
            escreval(">> [INVENTÁRIO]: Saldo auditado em sistema = ", saldoEstoque, " un.")
         caso 0
            escreval(">> Encerrando a sessão do operador...")
         outrocaso
            escreval(">> [OPÇÃO INVÁLIDA]: Digite um número válido entre 0 e 3.")
      fimescolha

   ate (opcao = 0) // Repete até que o usuário digite 0!

   escreval("Sessão finalizada com sucesso. Tenha um bom turno!")
fimalgoritmo

🛠️ Prática Obrigatória 1: Validador de Senha com Limite de Tentativas

Passo 1: O Desafio

Crie um algoritmo "Autenticacao_Operador" que solicite a senha numérica do crachá (a senha correta é 1234). O laço repita-ate deve rodar até que:

  1. O usuário acerte a senha (senha = 1234) OU
  2. O usuário atinja o limite máximo de 3 tentativas.

✅ Resultado Esperado (Prática 1):

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

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

🛠️ Prática Obrigatória 2: Validação de Entrada de Dados (Entrada Blindada)

O operador precisa registrar o peso de uma carga. Por regras físicas, o peso deve ser estritamente maior que 0 e menor ou igual a 30.000 kg. Crie um algoritmo "Validacao_Peso" com repita-ate que continue exigindo a digitação do peso enquanto o usuário digitar valores negativos, zero ou acima de 30.000 kg.

✅ Resultado Esperado (Prática 2):

1
2
3
4
5
6
7
Informe o peso da carga (1 a 30000 kg): -50
[ERRO]: Peso fora dos limites permitidos! Digite novamente.
Informe o peso da carga (1 a 30000 kg): 35000
[ERRO]: Peso fora dos limites permitidos! Digite novamente.
Informe o peso da carga (1 a 30000 kg): 12500.5

>>> PESO VALIDADO COM SUCESSO: 12500.50 kg

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_SeuNome_SeuSobrenome.alg.
  2. Teste o menu executando várias operações seguidas e certifique-se de que ele só encerra no 0.
  3. No Microsoft Teams, envie na tarefa “VisuAlg Cap 10 - Laço Repita-Até”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar o padrão REPL (Read-Eval-Print Loop). Todos os interpretadores de linguagens modernas (como o terminal interativo do Python, Node.js e SQL CLI) utilizam um laço pós-testado contínuo para manter a sessão do desenvolvedor aberta.


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

Crie um programa com repita-ate que simule a bomba de diesel do pátio:

  • Exibe menu com: 1 - Abastecer 50 Litros (R$ 290,00), 2 - Abastecer 100 Litros (R$ 580,00) e 0 - Fechar Conta.
  • O programa vai acumulando os abastecimentos até o motorista pedir para fechar a conta.

🔑 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
26
27
28
29
algoritmo "Autenticacao_Operador"
var
   senhaDigitada, tentativas : inteiro
   autenticado : logico
inicio
   tentativas <- 0
   autenticado <- FALSO

   repita
      tentativas <- tentativas + 1
      escreva("Digite a senha de acesso (Tentativa ", tentativas, " de 3): ")
      leia(senhaDigitada)

      se (senhaDigitada = 1234) entao
         autenticado <- VERDADEIRO
      senao
         se (tentativas < 3) entao
            escreval("Senha incorreta! Tente novamente.")
         fimse
      fimse
   ate (autenticado) ou (tentativas = 3)

   escreval("")
   se (autenticado) entao
      escreval(">>> ACESSO AUTORIZADO! Bem-vindo ao sistema de pátio.")
   senao
      escreval(">>> TERMINAL BLOQUEADO! 3 tentativas inválidas consecutivas.")
   fimse
fimalgoritmo

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
algoritmo "Validacao_Peso"
var
   pesoCarga : real
   pesoValido : logico
inicio
   repita
      escreva("Informe o peso da carga (1 a 30000 kg): ")
      leia(pesoCarga)

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

      se (nao pesoValido) entao
         escreval("[ERRO]: Peso fora dos limites permitidos! Digite novamente.")
      fimse
   ate (pesoValido)

   escreval("")
   escreval(">>> PESO VALIDADO COM SUCESSO: ", pesoCarga:8:2, " kg")
fimalgoritmo

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
algoritmo "Bomba_Diesel"
var
   opcao, totalLitros : inteiro
   totalPagar : real
inicio
   totalLitros <- 0
   totalPagar <- 0.0

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

      escolha opcao
         caso 1
            totalLitros <- totalLitros + 50
            totalPagar <- totalPagar + 290.00
            escreval(">> 50L adicionados ao tanque.")
         caso 2
            totalLitros <- totalLitros + 100
            totalPagar <- totalPagar + 580.00
            escreval(">> 100L adicionados ao tanque.")
         caso 0
            escreval(">> Processando fechamento de abastecimento...")
      fimescolha
   ate (opcao = 0)

   escreval("")
   escreval("=== COMPROVANTE DE ABASTECIMENTO ===")
   escreval("Volume Total Abastecido: ", totalLitros, " Litros")
   escreval("TOTAL A DEBITAR NA FROTA : R$ ", totalPagar:8:2)
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. Segundo a tabela comparativa do capítulo, qual é a diferença no “Momento do Teste” entre o laço enquanto-faca e o laço repita-ate?
  2. Segundo a tabela do capítulo, quantas vezes o laço repita-ate é garantido a executar, no mínimo?
  3. Segundo o aviso do capítulo sobre a “Pegadinha da Condição Invertida”, no repita-ate a condição escrita após o ate representa o critério para continuar ou para parar o laço?
  4. Segundo a tabela comparativa, para qual tipo de aplicação o laço repita-ate é mais indicado?
  5. No Exemplo Guiado (Menu Contínuo de Almoxarifado), qual condição foi escrita após o ate para encerrar o laço do menu?
  6. No Exemplo Guiado, quais são as quatro opções apresentadas no menu do Sistema de Estoque FastLog?
  7. Na Prática Obrigatória 1 (Validador de Senha com Limite de Tentativas), quais são as duas condições que fazem o laço repita-ate parar de solicitar a senha?
  8. Na Prática Obrigatória 2 (Validação de Entrada de Dados), qual é a faixa de peso considerada válida para a carga?
  9. Segundo o Checkpoint de Lógica, o que é o padrão REPL (Read-Eval-Print Loop), e quais exemplos de interpretadores o capítulo cita como aplicação desse padrão?
  10. Segundo as Instruções de Entrega, ao testar o menu, o que deve ser garantido quanto ao encerramento do programa?