Introdução ao conceito de indicador de passagem

Nesta seção será apresentado o conceito de indicador de passagem, bastante útil em algoritmos que precisem detectar a ocorrência de um evento, não importanto quantos vezes ele ocorre, como saber se todos os elementos de uma sequência são pares, bastaria um valor ímpar para caracterizar a resposta como negativa.

Ideia que se repetem

Em matemática é comum a existência de ideias que são usadas para resolver variados problemas, como a soma telescópica (somai=1n 1/(i (i+1)) = somai=1n (1/i - 1/(n+1)) = somai=1n = (1-1/2) + (1/2 - 1/3) + ... + (1/n - 1/(n+1)) = 1 - 1/(n+1)).

Em desenvolvimento de software (programas computacionais) esse princípio do "reaproveitamento" de ideias é ainda mais usado. O primeiro exemplo que você deve ter notado desse "reaproveitamento" é a ideia de contador (sempre que executar determinada instrução, acrescentar 1 ao contador).

Ideia de indicador de passagem

A ideia de indicador de passagem é utilizar uma variável que será usada para registrar se determinado evento ocorreu. Por exemplo, deseja-se saber se entre os valores digitados algum deles é negativo, então pode-se implementar um semelhante ao indicado abaixo (em uma linguagem Portugol):

     // O indicador de passagem recebera o nome sugestivo 'existeNegativo'
     existeNegativo = 0; // 0 => "ate' aqui" nenhum negativo - ou, "em principio, nao existem negativos"
     repita N vezes
       leia(x);
       se (x < 0)
       entao existeNegativo = 1; // existe negativo! ("nunca mais" elimine o 1 dessa variavel indicadora)
     // terminado o laco a resposta e' dada olhando se ocorreu o evento (ao menos uma vez)
     se (existeNegativo == 1)
     entao imprima("Existe(m) negativo(s)");
     senao imprima("NAO existe sequer um valor negativo na sequencia digitada!");

Portanto, esse modelo solução (ou padrão) é útil sempre que estiver interessado em detectar se um evento ocorre ao menos uma vez.

Cuidado com um erro comum ao tentar usar indicadores

Um erro bastante comum para os iniciantes na arte de programar é, a cada passo, alterar o valor da variável indicadora. Por exemplo, poder-se-ia "estragar" o código acima se for acrescentado um comando `senao` dentro do laço, do sguinte modo

     // Contra-exemplo NAO implemente desse modo!
     existeNegativo = 0; // 0 => "ate' aqui" nenhum negativo - ou, "em principio, nao existem negativos"
     repita N vezes
       leia(x);
       se (x < 0)
       entao existeNegativo = 1; // existe negativo! ("nunca mais" elimine o 1 dessa variavel indicadora)
       senao existeNegativo = 0; // NAO use uma linha dessa (ela "desfaz" o indicador)!!!!
     // terminado o laco a resposta SERIA dada olhando se ocorreu o evento
     se (existeNegativo == 1)
     entao imprima("Existe(m) negativo(s)");
     senao imprima("NAO existe sequer um valor negativo na sequencia digitada!");

Simule a pseudo-solução acima, usando os seguintes dados como entrada: `N=4` e a sequência de 4 dados como sendo `2, -1, -3, 4`. Será usado `i` para indicar o número de dados digitados (auxiliar, faria parte do código se for usado um comando `for` do C ou Python).

     i |  x | existeNegativo
     1 |  2 |              0
     2 | -1 |              1
     3 | -3 |              1
     4 |  2 |              0

Note que ao final da simulação, `existeNegativo` está com o valor 0, que indicaria a não existência de negativos na sequência, mas existem 2 negativos! Logo, solução errada!

Na verdade, na implementação errônea acima, a resposta será definida exclusivamente pela última iteração do laço. Por que?
A razão é que, a cada passo a variável `existeNegativo` receberá um valor (esse é o erro), pois se a condição for verdadeira executa-se a atribuição `existeNegativo = 1` e se for falsa executa-se a atribuição `existeNegativo = 0`.
Portanto, não importa quais sejam os `N-1` primeiros valores digitados, o único usado para definir o valor final de `existeNegativo` seria o último! Erro!

Códigos em C e em Python para o exemplo acima de indicador de passagem

Abaixo está indicado em C e em Python o código para digitar N valores (inteiros) e imprimir se algum negativo foi ou não registrado (digitado).

C | Python

      int n, i;
      scanf("%d", &n);                      n = int(input());
      existeNegativo = 0;                   existeNegativo = 0;
      for (i=0; i< n; i++)                  for i in range(n) :
        if (x < 0 )                           if (x < 0 ) :
          existeNegativo = 1;                   existeNegativo = 1;
      if (existeNegativo == 1)              if (existeNegativo == 1) :
        printf("Existe(m) negativo(s)\n");    print("Existe(m) negativo(s)");
      else printf("NAO existe!\n");         else : print("NAO existe!");

Outros exemplos de uso do conceito de indicador de passagem

Existe uma quantidade arbitrária de exemplos em que o conceito de indicador de passagem é útil. Abaixo listo apenas alguns exemplos simples:

- Verificar se existe algum débito em um extrato bancário (identificar negativo em uma sequência);
- Verificar se uma sequência é crescente;
- Verificar se uma sequência é ou não uma progressão aritmética (PA) (o candidato à razão poderia ser a diferença do primeiro par);
- Verificar se algum dos valores é raíz de determinada equação;
- Verificar se um vetor é solução de um sistema linear (sequência seriam os produtos linha vetor candidato).

Leônidas de Oliveira Brandão
http://line.ime.usp.br

Alterações:
2020/08/15: novo formato, pequenas revisões
2020/08/12: novo formato, pequenas revisões
2019/05/08: primeira versão