Capítulo 10: Repita Até Que (Loops Condicionais e Sentinelas)

🎯 Objetivo da Aula

Nem todos os laços de repetição devem rodar para sempre. Em processos operacionais, executamos uma tarefa até que uma meta seja atingida: descarregamos caixas até que o caminhão fique vazio; insistimos na pergunta de senha até que o operador acerte o código. No Scratch, usamos o bloco repita até que <condição>.

Ao final desta aula, você será capaz de:

  1. Compreender a lógica de funcionamento do laço repita até que <condição>.
  2. Compreender a inversão da condição: o Scratch repete enquanto a condição for Falsa e interrompe o laço assim que ela se torna Verdadeira.
  3. Implementar Travas de Validação Defensiva de senhas e dados.
  4. Construir uma Manobra Gradual de Atracamento em Doca com Sensor de Parada.

📥 Material de Apoio e Roteiro de Blocos:


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

Situação: Para ligar o motor elétrico da empilhadeira autônoma do armazém da FastLog, o operador deve digitar o PIN de segurança ("1234"). Se ele errar, o sistema não pode prosseguir: ele deve emitir um bipe de erro e insistir na pergunta até que a senha correta seja inserida.

Missão: Programar a rotina de autenticação do operador e o avanço gradual da empilhadeira de 5 em 5 passos até que ela alcance o palete na prateleira.


🧠 Fundamentos: Como Funciona o repita até que?

1. A Lógica do “Repeat UNTIL”

Ao contrário do comando enquanto (que repete enquanto a condição for verdadeira), o bloco 🟠 repita até que do Scratch foi desenhado com foco na Condição de Parada:

graph TD
    A["Entra no Laço: repita até que <condição>"] --> B{"A condição hexagonal é VERDADEIRA?"}
    B -- "NÃO (Falso)" --> C["Executa o bloco interno<br/>(Pergunta senha ou move passos)"]
    C --> B
    B -- "SIM (Verdadeiro)" --> D["INTERROMPE O LAÇO IMEDIATAMENTE"]
    D --> E["Executa o próximo comando abaixo do laço"]
    
    style B fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
    style C fill:#3498db,stroke:#fff,stroke-width:2px,color:#fff
    style D fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
  • Enquanto for Falso: O Scratch continua repetindo os blocos internos.
  • No momento em que vira Verdadeiro: O Scratch pula imediatamente para fora do laço!

2. A Armadilha do Loop Infinito Involuntário

Cuidado para não criar um loop que nunca para!
Para que o bloco repita até que <(resposta) = [1234]> consiga sair um dia, o bloco 🔷 pergunte ... e espere DEVE estar DENTRO do laço. Se você colocar a pergunta do lado de fora, a resposta nunca mudará e o programa travará eternamente!


📖 Exemplo Guiado: Autenticação de Operador de Empilhadeira

Passo a Passo no Scratch 3.0:

  1. Crie a variável: Tentativas_Senha.
  2. Adicione o ator Terminal_Login e insira o script abaixo:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
quando clicar em 🏁
mude [Tentativas_Senha v] para (0)

// Laço de insistência
repita até que <(resposta) = [1234]>
    pergunte [Digite o PIN de 4 dígitos da empilhadeira:] e espere
    se <não <(resposta) = [1234]>> então
        adicione (1) a [Tentativas_Senha v]
        toque o som [Buzz v]
        diga [PIN INCORRETO! Tente novamente.] por (2) segundos
    fim
fim

// Bloco executado apenas após o acerto:
toque o som [Chime v]
diga [ACESSO LIBERADO: Motor da empilhadeira acionado!] por (3) segundos

🛠️ Prática Obrigatória 1: Aproximação Gradual de Manobra na Doca

O Desafio:

Crie uma manobra gradual e suave:

  1. Posicione o Caminhao em $x: -200, y: 0$.
  2. Posicione o ator Doca_Carga em $x: 100, y: 0$.
  3. Use o bloco: repita até que <tocando em [Doca_Carga v]?>:
    • mova (5) passos
    • espere (0.05) segundos
  4. Fora do laço (quando encostar na doca):
    • Toque o som de freio: toque o som [Car Brake v].
    • Diga: [Atracamento concluído com sucesso! Iniciar descarregamento.] por 3 segundos.

🛠️ Prática Obrigatória 2: Abastecimento de Tanque até o Nível Máximo

O Desafio:

Simule a bomba de abastecimento de diesel:

  1. Crie a variável Nivel_Tanque inicializada em 20 (litros).
  2. Use o laço repita até que <(Nivel_Tanque) > (99)>:
    • Adicione 10 litros ao tanque: adicione (10) a [Nivel_Tanque v].
    • Toque o som de clique: toque o som [Pop v].
    • Diga (junte [Abastecendo... ] com Nivel_Tanque).
    • Espere 0.3 segundos.
  3. Fora do laço, avise: [Tanque 100% cheio! Desligar mangueira.].

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo do projeto com o nome: Atividade_10_SeuNome_SeuSobrenome.sb3.
  2. Teste errando a senha de propósito para comprovar que o sistema insiste.
  3. No Microsoft Teams, envie na tarefa “Scratch Cap 10 - Laços Condicionais”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar o conceito de Validação Sentinela e Tratamento de Polling. Em conexões de rede (como requisições HTTP e conexão via Bluetooth de coletores de dados de almoxarifado), os sistemas enviam pacotes repetidamente até que o servidor retorne um código de sucesso (HTTP 200 OK).


🔥 Desafio de Fixação: Bloqueio por 3 Erros Consecutivos

Aprimore o validador de senha: se o operador errar 3 vezes, encerre o laço com uma trava de segurança e diga: [TERMINAL BLOQUEADO: Contate a chefia de segurança patrimonial!] usando o comando 🟠 pare [este script].


🔑 Gabarito de Código (Blocos do Scratch)

Prática 1:

1
2
3
4
5
6
7
8
9
[Ator: Caminhao]
quando clicar em 🏁
vá para x: (-200) y: (0)
repita até que <tocando em [Doca_Carga v]?>
    mova (5) passos
    espere (0.05) segundos
fim
toque o som [Car Brake v] até o fim
diga [Atracamento concluído com sucesso! Iniciar descarregamento.] por (3) segundos

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Ator: Bomba_Combustivel]
quando clicar em 🏁
mude [Nivel_Tanque v] para (20)
repita até que <(Nivel_Tanque) > (99)>
    adicione (10) a [Nivel_Tanque v]
    toque o som [Pop v]
    diga (junte (junte [Abastecendo: ] (Nivel_Tanque)) [ L]) por (0.2) segundos
    espere (0.3) segundos
fim
toque o som [Bell v]
diga [Tanque 100% cheio! Desligar mangueira.] por (3) segundos

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[Ator: Terminal_Seguranca]
quando clicar em 🏁
mude [Tentativas v] para (0)
repita até que <<(resposta) = [1234]> ou <(Tentativas) = (3)>>
    pergunte [Digite a senha do terminal:] e espere
    se <não <(resposta) = [1234]>> então
        adicione (1) a [Tentativas v]
        diga (junte [Erro #] (Tentativas)) por (1.5) segundos
    fim
fim

se <(Tentativas) = (3)> então
    mude o efeito [cor v] para (0) // Vermelho
    toque o som [Alert v] até o fim
    diga [TERMINAL BLOQUEADO: Contate a chefia de segurança patrimonial!] por (4) segundos
    pare [este script v]
senão
    diga [ACESSO LIBERADO: Bem-vindo ao sistema de pátio.] por (3) segundos
fim

📥 Download do Roteiro Completo desta Aula:
Baixe o arquivo consolidado Capitulo_10.txt ou o pacote compactado (.zip) com os scripts e desafios da aula.


📝 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. No laço repita até que <condição>, em que momento exatamente o Scratch interrompe a repetição?
  2. Por que o bloco pergunte ... e espere DEVE estar dentro do laço repita até que <(resposta) = [1234]>, e não fora dele?
  3. No Exemplo Guiado, qual é o PIN correto de 4 dígitos usado para liberar o motor da empilhadeira?
  4. No Exemplo Guiado, qual é o nome da variável que conta o número de tentativas incorretas de senha?
  5. Na Prática Obrigatória 1, qual é a condição de parada (bloco hexagonal) do laço que move o Caminhao até a Doca_Carga?
  6. Na Prática Obrigatória 1, quantos passos o caminhão avança a cada repetição do laço?
  7. Na Prática Obrigatória 2, com que valor a variável Nivel_Tanque é inicializada, e qual é a condição de parada do laço de abastecimento?
  8. Segundo o Checkpoint, a que código de resposta HTTP o capítulo compara a lógica de “repetir até que o servidor confirme sucesso”?
  9. Na Prática Obrigatória 2, quantos litros são adicionados ao tanque a cada repetição do laço?
  10. Enquanto a condição do repita até que for Falsa, o que o Scratch faz com os blocos internos do laço?