Capitulo 8 - Estruturas de Repetição I

[1]Copyright © 2026 Alyce Suza.

O laço enquanto, Contadores e Acumuladores

8.1 Por que Precisamos de Repetição?

Imagine calcular a média escolar de trinta alunos sem utilizar ciclos automáticos de repetição. Você precisaria escrever mecanicamente trinta comandos de leitura individuais e trinta operações de soma sequenciais no código fonte do seu sistema. Esse cenário braçal é impraticável para turmas pequenas e absolutamente impossível caso o banco de dados exija o processamento de mil alunos cadastrados. As estruturas de repetição, tecnicamente conhecidas na literatura computacional como loops, resolvem esse gargalo de processamento de forma matemática e definitiva, permitindo que a máquina assuma o volume massivo de trabalho sem esgotar o programador.

Analogia da Linha de Montagem Uma fábrica automotiva não produz um carro por vez do zero recomeçando o pensamento do zero a cada unidade. Ela possui uma linha de montagem otimizada. A mesma sequência de operações padronizadas é repetida mecanicamente para cada novo chassi inserido na esteira de produção. Um loop de programação é exatamente a representação lógica disso, agindo como uma sequência de instruções repetida um número exato de vezes. A grande diferença prática é que o processador lógico do computador executa milhões de iterações por segundo sem demonstrar qualquer sinal físico de cansaço.
Manzano e Oliveira (2016) "As estruturas de repetição representam um dos conceitos mais poderosos da programação, pois permitem que um computador realize tarefas repetitivas de forma muito mais rápida e eficiente do que qualquer ser humano."

José Augusto N. G. Manzano e Jayr Figueiredo de Oliveira. Algoritmos: Lógica para Desenvolvimento de Programação. 28. ed. Erica, 2016.

8.2 O Laço enquanto: Pré-Testado

O comando enquanto verifica a condição lógica obrigatoriamente antes de executar o bloco de instruções pela primeira vez. Se a condição inicial já for avaliada como falsa logo na largada do sistema, o computador ignora o bloco inteiro e o código interno nunca chega a ser executado. É por esta característica técnica e comportamental que ele é formalmente chamado de laço pré-testado em ciência da computação.

enquanto (condicao)
{
    // conjunto de instrucoes repetidas ciclicamente enquanto a condicao for VERDADEIRA
}

O exemplo abaixo demonstra a estrutura básica construindo um contador sequencial clássico que vai da unidade um até a dezena.

programa
{
    funcao inicio()
    {
        inteiro contador = 1    // declaracao da variavel de controle do ciclo

        enquanto (contador <= 10)
        {
            escreva(contador, " ")
            contador++    // ETAPA ESSENCIAL: atualiza a variavel de controle no laco
        }
        escreva("\nProcessamento finalizado!\n")
    }
}

Para compreender perfeitamente a mecânica invisível da máquina durante a execução de um loop, precisamos isolar o rastreamento lógico da memória passo a passo.

Momento do Fluxo Ação na Memória Decisão do Sistema
Início absoluto contador = 1 1 <= 10? SIM, o sistema executa o bloco
Iteração 1 O console imprime 1, contador = 2 2 <= 10? SIM, o ciclo continua
Iteração 5 O console imprime 5, contador = 6 6 <= 10? SIM, o ciclo continua
Iteração 10 O console imprime 10, contador = 11 11 <= 10? NÃO, o sistema sai do loop
Finalização O comando escreva fora do bloco roda O programa termina o fluxo vital
Loop infinito: o pesadelo de todo programador Se a condição estruturada nunca se tornar falsa, o programa entra em um ciclo de execução infinito, consome a memória disponível e trava a aplicação severamente. Eu vejo muitos programadores iniciantes criando esse colapso ao esquecerem de atualizar ativamente a variável de controle dentro do bloco de código. Me impressiona como esse detalhe simples e ignorado é a causa raiz da maioria absoluta dos travamentos em sistemas recém-construídos. Sempre pergunte a si mesmo ao revisar o código se existe algum evento lógico dentro do laço capaz de fazer a condição principal virar falsa.

O controle do ciclo não se limita a somas progressivas. Você pode inverter a mecânica lógica e criar um laço perfeitamente regressivo utilizando o operador de decremento matemático.

programa
{
    funcao inicio()
    {
        inteiro i = 10

        enquanto (i >= 1)
        {
            escreva(i, " ")
            i--    // executa o decremento removendo unidades de 10 para 1
        }
        escreva("\nLancamento de foguete autorizado!\n")
    }
}

Também é plenamente viável controlar o passo da variável alterando o valor do incremento, saltando casas numéricas para processar apenas números pares no intervalo.

programa
{
    funcao inicio()
    {
        inteiro n = 2

        escreva("Registro de pares ate o limite de 20: ")
        enquanto (n <= 20)
        {
            escreva(n, " ")
            n = n + 2    // incrementa estritamente de 2 em 2 filtrando so os pares
        }
    }
}

8.3 Contadores: Contando Ocorrências

Um contador é uma variável dedicada de controle que aumenta ou diminui o seu valor numérico em uma unidade exata a cada vez que uma condição específica é atendida por dentro do ciclo de repetição. É evidente para quem sente na pele a depuração frustrante de algoritmos que esquecer de inicializar o contador com o valor zero antes da engrenagem do loop começar gera resultados fantasmas e cálculos completamente corrompidos pela sujeira residual da memória.

programa
{
    funcao inicio()
    {
        inteiro numero, contador = 0
        inteiro positivos = 0, negativos = 0, zeros = 0

        inteiro i = 0
        enquanto (i < 10)
        {
            escreva("Insira o Numero de indice ", i+1, ": ") leia(numero)

            se (numero > 0) { positivos++ }
            senao se (numero < 0) { negativos++ }
            senao { zeros++ }

            contador++
            i++
        }

        escreva("\nContagem de Positivos confirmados: ", positivos, "\n")
        escreva("Contagem de Negativos confirmados: ", negativos, "\n")
        escreva("Contagem de Zeros exatos: ", zeros, "\n")
    }
}

8.4 Acumuladores: Somando Valores

Diferente do contador que atua apenas adicionando unidades fixas para rastrear ocorrências, um acumulador trabalha de forma mais complexa somando valores numéricos variáveis e volumosos ao longo de todas as iterações rodadas do loop. Ele funciona conceitualmente como uma grande caixa registradora de mercado que vai guardando fielmente o valor progressivo e cumulativo das operações em andamento.

programa
{
    funcao inicio()
    {
        real nota, soma = 0    // acumulador obrigatoriamente inicializado com zero
        inteiro i = 1

        enquanto (i <= 5)
        {
            escreva("Registre a Nota ", i, " da avaliacao: ") leia(nota)
            soma = soma + nota    // ACUMULA adicionando o novo valor ao montante total
            i++
        }

        real media = soma / 5
        escreva("Soma total apurada no semestre: ", soma, "\n")
        escreva("Media escolar calculada globalmente: ", media, "\n")
    }
}
Regras de ouro inegociáveis para Contadores e Acumuladores

  • Sempre execute a inicialização garantindo o valor zero antes que o loop seja acionado no código.

  • O contador deve sofrer o incremento rígido de mais um apenas quando uma condição de negócio for verdadeira.

  • O acumulador tem a função de somar o valor elástico da variável de interesse a cada volta do laço para preservar totais.

  • O cálculo estatístico de média exige a divisão do acumulador pelo contador e deve ocorrer exclusivamente depois do loop terminar, nunca aprisionado dentro dele.

8.5 Loops com Sentinela

Um valor sentinela é uma chave numérica especial e predefinida que o usuário digita no console exclusivamente para sinalizar ao sistema computacional que ele deseja interromper a inserção contínua de dados na memória. Essa estratégia arquitetural é vital quando não sabemos de forma antecipada o número exato de repetições que o programa vai exigir, delegando ao operador humano o poder absoluto de encerrar a rotina no momento adequado.

programa
{
    funcao inicio()
    {
        real nota, soma = 0
        inteiro contador = 0

        escreva("Digite notas sequenciais e insira -1 para finalizar a operacao:\n")
        escreva("Nota do aluno: ") leia(nota)

        enquanto (nota != -1)    // o valor -1 assume o papel tecnico de sentinela
        {
            soma = soma + nota
            contador++
            escreva("Nota do aluno: ") leia(nota)
        }

        se (contador > 0)
        {
            escreva("Volume de Notas efetivamente digitadas: ", contador, "\n")
            escreva("Media final da instituicao: ", soma / contador, "\n")
        }
        senao
        {
            escreva("Nenhuma nota letiva foi digitada na sessao de uso.\n")
        }
    }
}

8.6 Exercícios do Capítulo 8

Exercício 8.1: Números ímpares de 1 a 100 Use rigorosamente o laço pré-testado enquanto para processar e exibir todos os números classificados como ímpares no longo intervalo de um a cem.

Ao final da exibição extensa, calcule e exiba no terminal a quantidade matemática total de números ímpares que o sistema encontrou. Construa um bônus prático que também exiba a soma maciça de todos esses números agrupados.

Dica: Lembre que um número ímpar se comprova atestando numero % 2 != 0. Crie um incremento fixo de um em um e aplique o filtro de barreira condicional com a função se.

Exercício 8.2: Estatísticas de uma lista aberta Leia números num fluxo contínuo declarando que todos devem ser estritamente positivos. Estabeleça o uso técnico do zero numérico como chave sentinela dedicada para encerrar a escuta do teclado.

Ao término do recebimento dos dados ordene ao sistema que exiba o volume de ocorrências, a soma acumulada dos valores, a média decimal precisa, bem como a captura seletiva identificando com nitidez o maior e o menor valor digitado nas entradas. Imprima uma mensagem clara de segurança caso o operador trave o sistema sem fornecer nenhum número válido na bateria de uso.

Dica: Inicialize a memória das variáveis maior e menor obrigatoriamente atribuindo a elas o primeiro número sólido lido pelo comando de teclado, e não com zero ou fantasias genéricas preenchidas como 9999.

Exercício 8.3: Jogo da adivinhação programada Defina isoladamente um número secreto dentro da matriz do seu código, por exemplo o quarenta e dois empírico.

Construa um laço dinâmico para repetir exaustivamente o pedido de inserção desafiando o usuário a adivinhar a quantia correta. Forneça instruções interativas exibindo mensagens de que o número é muito baixo se o chute falhar pela base, ou dizendo que está muito alto caso ele exceda o limite traçado. No momento único do acerto encerre o jogo dizendo parabéns e declarando precisamente a quantia integral das tentativas desperdiçadas na caçada.

Dica: Inicialize a variável controladora de chute numérico com o marco irreal de -1, que é obviamente divergente da chave secreta, com o objetivo claro de forçar fisicamente a entrada lógica imposta pela avaliação do bloco de loop logo na primeira barreira.

Gabarito do Capítulo 8

Gabarito do Exercício 8.1 A resolução percorre o escopo temporal empurrando a variável de índice por toda a trilha de números e instaura uma estrutura de condição rígida para auditar quem entra no rol da contagem ímpar, operando contadores simples em harmonia com acumuladores massivos de soma.

programa
{
    funcao inicio()
    {
        inteiro n = 1, cont = 0
        real soma = 0
        
        enquanto (n <= 100)
        {
            se (n % 2 != 0)
            {
                escreva(n, " ")
                cont++
                soma = soma + n
            }
            n++
        }
        escreva("\nFechamento Total de indices apurados: ", cont, " | Soma macica consolidada: ", soma, "\n")
    }
}

O resultado desse laço confirma a contagem de cinquenta ímpares reais produzindo a soma cravada no limiar de 2500, o que comprova na prática as teorias aritméticas declarando que a soma reflete o quadrado da quantidade apurada globalmente nos conjuntos puros.

Gabarito do Exercício 8.2 Ignorar a captura primária para as variáveis de teto e piso numérico gera problemas sérios em algoritmos comerciais que rastreiam valores extremos. Ao registrar o primeiríssimo número válido para essas variáveis antes do fluxo rotineiro do loop ser acionado, nós garantimos bases justas de preenchimento realístico para o cálculo.

programa
{
    funcao inicio()
    {
        real n, soma = 0, maior, menor
        inteiro cont = 0
        
        escreva("Digite um Numero valido ou use 0 como chave sentinela de parada: ") leia(n)
        
        se (n == 0) { escreva("Alerta do fluxo: Nenhum numero gerencial capturado na porta.\n") }
        senao
        {
            maior = n 
            menor = n
            
            enquanto (n != 0)
            {
                soma = soma + n 
                cont++
                
                se (n > maior) { maior = n }
                se (n < menor) { menor = n }
                
                escreva("Proximo Numero para registro: ") leia(n)
            }
            
            escreva("Estatistica de Quantidade final: ", cont, " | Soma acumulada da faixa: ", soma)
            escreva(" | Media padronizada: ", soma/cont, " | Deteccao de Maior pico: ", maior, " | Deteccao de Menor piso: ", menor, "\n")
        }
    }
}

Inicializar o maior e o menor piso estatístico equiparando a v[0] ou o primeiro registro isolado protege a estrutura determinando que qualquer flutuação realística seja confrontada puramente com elementos fidedignos colhidos dentro do banco original e validado da rotina.

Gabarito do Exercício 8.3 Aplicar um valor inicial irreal no gatilho garante que as engrenagens de validação da porta principal destravem livremente para o mergulho inicial no laço, abrindo o canal de comunicação para os testes condicionados que rebatem com inteligência cada tentativa gerada sem acerto pelo teclado.

programa
{
    funcao inicio()
    {
        const inteiro NUMERO_SECRETO = 42
        inteiro chute = -1, tent = 0
        
        escreva("Bem-vindo a logica. Adivinhe o parametro numerico isolado entre 1 e 100!\n")
        
        enquanto (chute != NUMERO_SECRETO)
        {
            escreva("Chute numerico: ") leia(chute) 
            tent++
            
            se (chute < NUMERO_SECRETO) { escreva("Diretriz: Valor lancado se encontra muito baixo na escala!\n") }
            senao se (chute > NUMERO_SECRETO) { escreva("Diretriz: Valor excedeu a fronteira e esta muito alto!\n") }
            senao { escreva("Vitoria atestada! ACERTOU na mosca consumindo exatas ", tent, " tentativas vitais!\n") }
        }
    }
}

O uso de condicionais puramente binárias em cenários amplos simula as origens acadêmicas e fundamentais dos algoritmos de busca mecânica, ensinando as mentes em formação a reduzirem margens numéricas de falha de forma metodológica focando no epicentro invisível do dado cobiçado.


  1. Copyright © 2026 Alyce Suza. Todos os direitos reservados nos termos da Lei 9.610/98. O conteúdo publicado no site https://wiki.suzacybersecurity.com/ é protegido pelas diretrizes brasileiras de propriedade intelectual e a sua autoria é reconhecida desde o momento da criação técnica. O compartilhamento, a reprodução e a distribuição deste material são permitidos e incentivados apenas para finalidades educacionais, acadêmicas ou de consulta técnica, sendo estritamente vedado qualquer tipo de uso comercial. Para que a replicação seja validada e legal, você deve obrigatoriamente atribuir os devidos créditos a Alyce Suza e fornecer um link direto e acessível para a publicação original. A utilização deste material para obter lucro, monetização, venda de materiais ou qualquer vantagem financeira constitui violação de direitos autorais e está sujeita às sanções legais cabíveis, assim como alterações que modifiquem o sentido original das explicações sobre segurança da informação. Para eventuais dúvidas sobre permissões de uso, parcerias ou para reportar replicações indevidas, envie um e-mail para alycesuza@gmail.com. ↩︎