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:
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