Contadores, Acumuladores e Sentinela no While | Professor Comia · 2DS
2DS · SISANO1C1B2S8A2 · Aula 2

Como três padrões fundamentais de variáveis de controle transformam um laço genérico em uma ferramenta precisa — e por que essa distinção é o que separa código funcional de código profissional.

loop while Ensino Médio Técnico VisualG · Python Escola Pública

Na aula anterior, o aluno aprendeu que o while executa um bloco de código enquanto uma condição for verdadeira. Mas falta a segunda metade da questão: quem controla essa condição, e como? Sem responder isso com precisão, o laço é uma estrutura frágil — funciona para o exemplo do slide, quebra no mundo real.

Existem três padrões de variáveis de controle que aparecem em praticamente todo programa que usa laços condicionais. São padrões tão recorrentes que têm nomes próprios: contador, acumulador e sentinela. Dominar a distinção entre eles não é um detalhe técnico. É o que permite ao programador escolher conscientemente como um laço vai ser controlado — e garantir que ele vai terminar.

O problema de sala que esta aula resolve

Alunos constroem laços que funcionam para o caso de teste e falham para qualquer outro. O motivo quase sempre é o mesmo: a variável de controle não foi pensada antes do laço, foi adicionada depois por tentativa e erro. Nomear os padrões antecipa o pensamento e elimina esse ciclo.

Por que o contexto do supermercado funciona como âncora pedagógica?

Um caixa rápido tem exatamente 10 itens. Um carrinho de compras acumula valores variáveis. Um sistema de chat aceita mensagens até que o usuário diga “sair”. Esses três cenários mapeiam, com precisão, os três padrões de controle que a aula apresenta.

A escolha do supermercado não é casual — é uma decisão pedagógica de design. O aluno não precisa aprender o contexto antes de aprender o conceito. O contexto é imediato, cotidiano e escalável: os mesmos três padrões aparecem em jogos, servidores, formulários, sistemas de pagamento e automações.

Quais são as definições operacionais dos três padrões?

// contador

Uma variável contadora soma um valor fixo — quase sempre 1 — a cada iteração do laço. Seu propósito exclusivo é registrar quantas vezes o bloco foi executado. Deve ser inicializada antes do laço e incrementada dentro do bloco, em posição que garanta a progressão.

// acumulador

Uma variável acumuladora soma um valor variável a cada iteração — o preço de um produto, a nota de um aluno, o tamanho de um arquivo. Diferencia-se do contador porque o valor somado muda a cada repetição. Deve ser inicializada com zero antes do laço para não contaminar o resultado.

// sentinela

Uma variável sentinela não controla quantas vezes o laço roda, mas quando ele para. Funciona como um valor especial que sinaliza o fim da entrada de dados — algo que não pode ocorrer como dado válido, como -1 em uma lista de preços positivos ou "sair" em um menu de texto.

Como distinguir os três padrões na prática?

Padrão O que varia a cada iteração Condição de parada Caso de uso típico
contador Valor fixo (+1) contador <= limite Exibir N itens de uma lista
acumulador Valor variável (entrada do usuário) Depende do contexto (N leituras ou sentinela) Somar preços, calcular média
sentinela Valor lido a cada iteração Valor lido = valor especial Chat, menus, entrada de volume desconhecido

Como construir um laço com cada padrão de forma correta?

// método — 4 passos universais
  1. Identifique o padrão: o número de repetições é fixo (contador), o dado somado varia (acumulador), ou a parada depende de uma entrada especial (sentinela)?
  2. Declare e inicialize antes do laço: contadores e acumuladores começam com um valor base (geralmente 0 ou 1). Sentinelas exigem uma leitura prévia — o “truque da leitura antecipada” — para ter o que testar na condição.
  3. Garanta a progressão dentro do bloco: incrementar o contador, somar ao acumulador, ou ler a próxima entrada para a sentinela. Sem isso, o laço não tem como terminar.
  4. Teste com casos-limite: entrada vazia, valor-limite exato, valor inválido. Um laço robusto prevê esses cenários antes de ir para produção.

Templates copiáveis — VisualG e Python

ContadorDeItens.alg — VisualG
algoritmo "ContadorDeItens"
Var
   contador: inteiro
Inicio
   // laço fixo — número de repetições conhecido
   para contador de 1 até 10 faca
      escreval("Item ", contador)
   fimpara
Fimalgoritmo
ChatComSentinela.alg — VisualG (padrão sentinela)
algoritmo "ChatComSentinela"
Var
   mensagem: caractere
Inicio
   escreval("Inicie a conversa (digite 'sair' para terminar):")
   leia(mensagem)                  // leitura antecipada — essencial para o while
   enquanto mensagem <> "sair" faca
      escreval("Você disse: ", mensagem)
      escreval("Digite a próxima mensagem:")
      leia(mensagem)                // progressão — atualiza a condição
   fimenquanto
   escreval("Chat encerrado.")
Fimalgoritmo
chat_sentinela.py — Python equivalente
# Padrão sentinela em Python
print("Inicie a conversa (digite 'sair' para terminar):")
mensagem = input()          # leitura antecipada

while mensagem != "sair":
    print(f"Você disse: {mensagem}")
    print("Digite a próxima mensagem:")
    mensagem = input()        # progressão obrigatória

print("Chat encerrado.")
// caso real — escola pública, ensino médio técnico

Do supermercado ao sistema escolar: os mesmos padrões, novo domínio

Os três cenários da aula — caixa rápido, soma de compras e chat com sentinela — são construídos no contexto de um supermercado fictício. Mas o padrão conceitual é imediatamente transferível para qualquer domínio que os alunos venham a desenvolver.

Um sistema de cadastro de alunos usa acumulador para somar notas e calcular média. Um menu de opções usa sentinela para encerrar quando o usuário digita “0”. Um relatório de frequência usa contador para saber quantas presenças foram registradas. Em todos os casos, a lógica de controle é idêntica ao que foi aprendido com o supermercado.

O projeto mais imediato para uma turma de 2DS é integrar os três padrões em um único programa: um sistema que lê notas de alunos (acumulador), conta quantos foram lidos (contador) e para quando o usuário digita -1 (sentinela) — calculando a média ao final. Esse é exatamente o nível de síntese esperado nas atividades práticas da próxima aula.

// expansão estratégica

Além da aula: onde esses padrões constroem sistemas reais

Contador, acumulador e sentinela não são padrões de algoritmo — são padrões de design de software. Aparecem com nomes distintos em contextos mais avançados, mas o raciocínio é o mesmo.

  • Análise de dados (pandas/Python): df.sum() e df.count() são acumuladores e contadores implementados em escala. O aluno que entende o padrão manual entende a abstração da biblioteca.
  • Sistemas embarcados (Arduino/Raspberry Pi): sensores leem dados em laço com sentinela de valor-limite. Um sensor de temperatura que alerta quando a leitura supera 40°C usa exatamente o padrão da aula.
  • Produto de blog e autoridade: a série de aulas sobre estruturas de repetição — aula 1 (while), aula 2 (contadores, acumuladores, sentinela), aula 3 (prática integrada) — forma uma sequência didática documentável e referenciável por outros professores do ensino técnico público.
  • Gamificação no laboratório maker: um jogo simples em Python onde o jogador acumula pontos (acumulador), conta vidas restantes (contador) e encerra quando digita “q” (sentinela) é um projeto de aula completo, realizável em uma sessão de laboratório.
// síntese conceitual

Contadores somam valores fixos (+1) para contar iterações. Acumuladores somam valores variáveis para totalizar dados. Sentinelas sinalizam o fim da entrada com um valor especial. Os três exigem inicialização antes do laço e progressão dentro do bloco. Sem progressão, o laço não termina.

Perguntas frequentes sobre contadores, acumuladores e sentinela

Por que o acumulador precisa ser inicializado com zero antes do laço?

Porque a instrução total := total + valor usa o valor atual de total para calcular o novo valor. Se total não foi inicializado, contém lixo de memória — um valor indefinido que vai contaminar toda a soma. Inicializar com zero garante que a primeira soma seja apenas o primeiro valor lido, sem interferência anterior.

O que é a “leitura antecipada” no padrão sentinela e por que ela é necessária?

O while verifica a condição antes de executar o bloco. Se o primeiro dado lido for o valor sentinela, o programa não deve executar o bloco nenhuma vez. Para isso, a primeira leitura deve acontecer antes da condição do while ser avaliada — e não dentro do bloco. A leitura seguinte, dentro do laço, garante a progressão. Sem a leitura antecipada, o programa ou nunca testa o valor antes de processá-lo, ou entra em loop infinito.

Posso usar um contador junto com um acumulador no mesmo laço?

Sim — e é o padrão mais comum em sistemas que calculam médias. O contador registra quantos valores foram lidos; o acumulador soma esses valores. Ao final do laço, a média é acumulador / contador. As duas variáveis coexistem dentro do mesmo bloco, cada uma cumprindo sua função específica.

Qual critério define um bom valor sentinela?

O valor sentinela deve ser impossível como dado válido no domínio do problema. Para preços, -1 funciona porque preços são positivos. Para nomes, "SAIR" funciona se o sistema não cadastra nomes em maiúsculas. Para idades, 0 pode ser ambíguo — -1 é mais seguro. O critério não é convenção, é garantia de que o valor sentinela não vai ser confundido com um dado real.

Qual a diferença prática entre o laço para (for) e o enquanto (while) no contexto de contadores?

Quando o número de repetições é fixo e conhecido antes da execução, o para é semanticamente mais preciso: ele encapsula a inicialização, a condição e o incremento do contador em uma única linha. O enquanto com contador manual produz o mesmo resultado, mas exige que o programador gerencie a inicialização e o incremento separadamente — mais verboso, mais suscetível a erro. Use para quando sabe o número de iterações; use enquanto quando a condição depende de dados em tempo de execução.

Sequências didáticas completas no blog

Artigos, slides, códigos e projetos do Laboratório de Educação Digital — documentação real do ensino técnico em escola pública.

professorcomia.com.br

A virada conceitual: nomear o padrão antes de codificar

Um aluno que sabe perguntar “essa variável é um contador, um acumulador ou uma sentinela?” antes de escrever a primeira linha de código tem uma vantagem estrutural enorme sobre quem escreve para testar e ajusta por tentativa e erro. O nome não é apenas nomenclatura — é uma ferramenta de raciocínio que organiza a solução antes de ela existir no código.

Ensinar esses padrões com contexto real não é simplificação. É a diferença entre ensinar estruturas de controle como sintaxe de linguagem — que o aluno decora e esquece — e como padrões de pensamento algorítmico, que o aluno carrega para qualquer linguagem, qualquer contexto e qualquer problema que vier a encontrar.

// professorcomia.com.br · laboratorio de educacao digital · codigo: SISANO1C1B2S8A2

Slides da Aula — 2DS

// Estruturas de Repetição: loop while · Aula 2: Contadores e Loops Sentinela · SISANO1C1B2S8A2

slide_01 abertura
Frequência — Código: SISANO1C1B2S8A2

>_Estruturas de Repetição — Loop while

Unidade 2 · Componente 1 · Mapa: Aula 2 de 3

Aula 2: Contadores e Loops Sentinela  |  Turma: 2DS

Um caixa de supermercado conta exatamente 10 itens. Um carrinho acumula o valor de cada produto. Um chat aceita mensagens até o usuário digitar “sair”. O que cada uma dessas situações tem em comum com a estrutura do loop while?
slide_02 objetivos

[ ]O que você vai aprender nesta aula

  • Conceitual: utilizar contadores, acumuladores e variável sentinela para controlar iterações.
  • Procedimental: implementar e depurar loops controlados por condição (while).
  • Atitudinal: manter persistência diante de erros, propondo soluções com organização lógica e responsabilidade técnica.

// recursos: recurso audiovisual · caderno · computador com internet

slide_03 problema_gerador

!Contexto: o supermercado como sistema

Três situações. Três desafios de programação. Uma lógica em comum.

# caixa rápido

Máximo de 10 itens. O sistema precisa contar cada item e alertar quando o limite é atingido.

∑ carrinho

Três produtos com preços diferentes. O sistema precisa somar o valor total da compra.

⊗ chat do atendimento

O cliente pode enviar quantas mensagens quiser. O sistema encerra apenas quando ele digitar "sair".

Em cada situação, o que controla quando o programa para? Como a variável que faz esse controle é diferente nos três casos?
slide_04 conceito · contador

#O que é um contador?

Um contador é uma variável numérica usada dentro de um laço com um único propósito: contar quantas vezes o laço já foi executado. A cada iteração, somamos um valor fixo — quase sempre +1. É como apertar um contador manual a cada pessoa que entra em um ambiente.

ContadorDeItens.alg
para contador de 1 até 10 faca
   escreval("Item ", contador)
fimpara

Usado quando o número de repetições é exato e conhecido antes da execução.

slide_05 conceito · acumulador

O que é um acumulador?

Um acumulador é semelhante ao contador, mas com uma diferença crucial: em vez de somar um valor fixo (+1), ele soma um valor variável a cada iteração. É o carrinho de compras: a cada produto, somamos o preço daquele item — que muda a cada vez.

SomaDeCompras.alg — trecho essencial
total_acumulado := 0          // sempre inicialize com 0
leia(valor_produto)
total_acumulado := total_acumulado + valor_produto

Ideal para somas, totais e médias em que o valor somado varia a cada leitura.

slide_06 conceito · sentinela

Leitura de sentinela

Uma sentinela é um valor especial que sinaliza o fim da entrada de dados. Usada quando não sabemos de antemão quantas repetições serão necessárias. O loop enquanto verifica: enquanto o valor lido for diferente da sentinela, continua.

ChatComSentinela.alg — estrutura do padrão
leia(mensagem)              // leitura antecipada
enquanto mensagem <> "sair" faca
   escreval("Você disse: ", mensagem)
   leia(mensagem)            // progressão: atualiza a condição
fimenquanto

A sentinela deve ser um valor impossível como dado válido no contexto do problema.

slide_07 registro_caderno

Registre no caderno

  • Contador: soma valor fixo (+1) a cada iteração. Controla quantas vezes o laço rodou.
  • Acumulador: soma valor variável a cada iteração. Deve ser inicializado com 0 antes do laço.
  • Sentinela: valor especial que encerra o laço. Exige leitura antecipada fora do bloco.
  • Progressão: instrução dentro do bloco que garante que a condição eventualmente ficará falsa.
  • Loop infinito: causado pela ausência de progressão — a condição nunca muda para falso.
slide_08 pause_e_responda

?Registro — Pause e Responda

Em um programa que calcula o valor total de uma lista de compras, qual variável representa um acumulador?
  • AVariável que soma o preço de cada item ao total.
  • BVariável que verifica se o usuário digitou “fim”.
  • CVariável que conta quantos produtos foram incluídos.
  • DVariável que guarda o nome do produto mais caro.

// responda primeiro no caderno · depois no AVA

slide_09 gabarito

Registro — Resposta correta

Em um programa que calcula o valor total de uma lista de compras, qual variável representa um acumulador?
  • AVariável que soma o preço de cada item ao total.
  • BVariável que verifica se o usuário digitou “fim”. → sentinela
  • CVariável que conta quantos produtos foram incluídos. → contador
  • DVariável que guarda o nome do produto mais caro. → variável comum

O acumulador soma valores variáveis — como os preços de cada produto. Contador, sentinela e variáveis de registro têm funções distintas.

slide_10 aplicacao_conceitual

{}Situação — Ser sempre +

Você é estagiário de dev em uma startup. O gestor reporta via Slack, às 17h30 de sexta-feira, um bug crítico: o feed exibe apenas a primeira postagem repetida, em vez das 100 mais recentes. A exibição funciona — o laço não avança.

Sua resposta deve conter:

  • Confirmação de recebimento da mensagem.
  • Diagnóstico técnico preciso: por que o bug ocorre?
  • Proposta de solução usando estrutura de repetição e progressão.
Escreva no caderno como se fosse uma mensagem no Slack — clara, objetiva e profissional. O raciocínio precede o código.
slide_11 atividade_avaliativa

Resolução escrita ou explicativa

Escreva em pseudocódigo (ou linguagem natural estruturada) o algoritmo que lê os preços de uma lista de compras e exibe o total. O programa deve aceitar qualquer quantidade de produtos e encerrar quando o usuário digitar -1.

obrigatório incluir

Declaração de variáveis · Inicialização do acumulador · Condição do while · Leitura antecipada · Progressão dentro do bloco.

critérios

Lógica correta · Sentinela definida · Acumulador inicializado · Ausência de loop infinito · Clareza na escrita.

// entrega via AVA: resolução escrita + justificativa em 2 linhas: por que usar while com sentinela em vez de for neste caso?
slide_final síntese

Então ficamos assim…

# contador

Soma valor fixo (+1) por iteração. Controla quantas vezes o laço rodou. Usa para quando o total é conhecido.

∑ acumulador

Soma valor variável por iteração. Inicialize com 0. Ideal para totais e médias com dados de entrada variáveis.

⊗ sentinela

Valor especial que encerra o laço. Exige leitura antecipada. A atualização dentro do bloco é obrigatória.

// aula anterior

Estruturas de repetição: conceito, sintaxe e condição de parada do while. Laços fixos vs. condicionais.

// próxima aula

Aula prática: implementar os três padrões combinados em VisualG — sistema de notas com contador, acumulador e sentinela.