<!-- Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão Introdução ao conceito de indicador de passagem LInE (Laboratory of Informatics in Education) - http://www.usp.br/line IME - USP Material didático Pode usar livrevemente este material para fins não comerciais, devendo sempre fazer referência à autoria. Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao") Prof. Leônidas de Oliveira Brandão http://www.ime.usp.br/~leo http://line.ime.usp.br http://www.matemtica.br --> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'> <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'> <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'> <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos --> <div class="pagina"> <!-- <center><p>[ <a href="#" title=""></a> | <a href="#memoria" title=""></a> ]</p> </center> --> <p class="secao">Introdução ao conceito de indicador de passagem</p> <p> Nesta seção será apresentado o conceito de <i>indicador de passagem</i>, 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 <i>pares</i>, bastaria um valor <i>ímpar</i> para caracterizar a resposta como <i>negativa</i>. </p> <p class="secao">Ideia que se <i>repetem</i></p> <p> Em matemática é comum a existência de ideias que são usadas para resolver variados problemas, como a <i>soma telescópica</i> (<i>soma<sub>i=1</sub><sup>n</sup> 1/(i (i+1)) = soma<sub>i=1</sub><sup>n</sup> (1/i - 1/(n+1)) = soma<sub>i=1</sub><sup>n</sup> = (1-1/2) + (1/2 - 1/3) + ... + (1/n - 1/(n+1)) = 1 - 1/(n+1)</i>). <!-- <i>1+2+3+...+n = (1/2)(1+2+...+n+1+2+...+n) = (1/2)((n+1)+(n+1)+...+(n+1)) = (1/2) (n x (n+1))</i> --> </p> <p> Em desenvolvimento de <i>software</i> (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 <i>contador</i> (sempre que executar determinada instrução, <i>acrescentar 1 ao contador</i>). </p> <p class="secao">Ideia de <i>indicador de passagem</i></p> <p> A ideia de <b style="color: #0000AA;">indicador de passagem</b> é utilizar uma variável que será usada para registrar se <i>determinado evento ocorreu</i>. 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 <i>Portugol</i>): <pre> <tt class="com">// O indicador de passagem recebera o nome sugestivo 'existeNegativo'</tt> existeNegativo = 0; <tt class="com">// 0 => "ate' aqui" nenhum negativo - ou, "em principio, nao existem negativos"</tt> <tt class="cmd">repita</tt> N <tt class="cmd">vezes</tt> <tt class="fnc">leia</tt>(x); <tt class="cmd">se</tt> (x < 0) <tt class="cmd">entao</tt> existeNegativo = 1; <tt class="com">// existe negativo! ("nunca mais" elimine o 1 dessa variavel indicadora)</tt> <tt class="com">// terminado o laco a resposta e' dada olhando se ocorreu o evento (ao menos uma vez)</tt> <tt class="cmd">se</tt> (existeNegativo == 1) <tt class="cmd">entao</tt> <tt class="fnc">imprima</tt>("Existe(m) negativo(s)"); <tt class="cmd">senao</tt> <tt class="fnc">imprima</tt>("NAO existe sequer um valor negativo na sequencia digitada!"); </pre> </p> <p> Portanto, esse <i>modelo solução</i> (ou <i>padrão</i>) é útil sempre que estiver interessado em detectar se um evento ocorre ao menos uma vez. </p> <p class="secao">Cuidado com um erro comum ao tentar usar indicadores</p> <p> Um erro bastante comum para os iniciantes na <i>arte de programar</i> é, 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 <tt class="cmd">senao</tt> dentro do laço, do sguinte modo <center><table><tr><td><pre> <tt class="com">// <b>Contra-exemplo</b> NAO implemente desse modo!</tt> existeNegativo = 0; <tt class="com">// 0 => "ate' aqui" nenhum negativo - ou, "em principio, nao existem negativos"</tt> <tt class="cmd">repita</tt> N <tt class="cmd">vezes</tt> <tt class="fnc">leia</tt>(x); <tt class="cmd">se</tt> (x < 0) <tt class="cmd">entao</tt> existeNegativo = 1; <tt class="com">// existe negativo! ("nunca mais" elimine o 1 dessa variavel indicadora)</tt> <tt class="cmd">senao</tt> existeNegativo = 0; <tt class="com">// <b>NAO</b> use uma linha dessa (ela "desfaz" o indicador)!!!!</tt> <tt class="com">// terminado o laco a resposta SERIA dada olhando se ocorreu o evento</tt> <tt class="cmd">se</tt> (existeNegativo == 1) <tt class="cmd">entao</tt> <tt class="fnc">imprima</tt>("Existe(m) negativo(s)"); <tt class="cmd">senao</tt> <tt class="fnc">imprima</tt>("NAO existe sequer um valor negativo na sequencia digitada!"); </pre></td></tr></table></center> </p> <p> Simule a pseudo-solução acima, usando os seguintes dados como entrada: <tt>N=4</tt> e a sequência de 4 dados como sendo <tt>2, -1, -3, 4</tt>. Será usado <tt>i</tt> para indicar o número de dados digitados (auxiliar, faria parte do código se for usado um comando <tt>for</tt> do <i>C</i> ou <i>Python</i>). <center><table><tr><td><pre> i | x | existeNegativo 1 | 2 | 0 2 | -1 | 1 3 | -3 | 1 4 | 2 | 0</pre></td></tr></table></center> </p> <p> Note que ao final da simulação, <tt>existeNegativo</tt> 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! </p> <p> Na verdade, na implementação <i style="color:#aa0000">errônea</i> acima, a resposta será definida exclusivamente pela última iteração do laço. Por que? <br/> A razão é que, a cada passo a variável <tt>existeNegativo</tt> receberá um valor (esse é o <i style="color:#aa0000">erro</i>), pois se a condição for <i>verdadeira</i> executa-se a atribuição <tt>existeNegativo = 1</tt> e se for <i>falsa</i> executa-se a atribuição <tt>existeNegativo = 0</tt>. <br/> Portanto, não importa quais sejam os <tt>N-1</tt> primeiros valores digitados, o único usado para definir o valor final de <tt>existeNegativo</tt> seria o último! <i style="color:#aa0000">Erro</i>! </p> <p class="secao">Códigos em <i>C</i> e em <i>Python</i> para o exemplo acima de <i>indicador de passagem</i></p> <p> Abaixo está indicado em <i>C</i> e em <i>Python</i> o código para digitar <i>N</i> valores (inteiros) e imprimir se algum negativo foi ou não registrado (digitado). </p> <center><table><tr> <td bgcolor="8aaada"><i>C</i> </td> <td bgcolor="8aaada"><i>Python</i></td></tr> <tr><td colspan="2"><pre> <tt class="tipo">int</tt> n, i; <tt class=""></tt> <tt class="fnc">scanf</tt>("%d", &n); n = <tt class="fnc">int</tt>(<tt class="fnc">input</tt>()); <tt class="">existeNegativo = 0; existeNegativo = 0; <tt class="cmd">for</tt> (i=0; i< n; i++) <tt class="cmd">for</tt> i in range(n) : <tt class="cmd">if</tt> (x < 0 ) <tt class="cmd">if</tt> (x < 0 ) :</tt> <tt class="">existeNegativo = 1; <tt class="">existeNegativo = 1;</tt> <tt class="cmd">if</tt> (existeNegativo == 1) <tt class="cmd">if</tt> (existeNegativo == 1) : <tt class="fnc">printf</tt>("Existe(m) negativo(s)\n"); <tt class="fnc">print</tt>("Existe(m) negativo(s)"); <tt class="cmd">else</tt> <tt class="fnc">printf</tt>("NAO existe!\n"); <tt class="cmd">else</tt> : <tt class="fnc">print</tt>("NAO existe!"); </pre></td></tr></table></center> <p class="secao">Outros exemplos de uso do conceito de <i>indicador de passagem</i></p> <p> Existe uma quantidade arbitrária de exemplos em que o conceito de <i>indicador de passagem</i> é útil. Abaixo listo apenas alguns exemplos simples: <ul> <li>Verificar se existe algum débito em um extrato bancário (identificar negativo em uma sequência);</li> <li>Verificar se uma sequência é crescente;</li> <li>Verificar se uma sequência é ou não uma <i>progressão aritmética (PA)</i> (o candidato à razão poderia ser a diferença do primeiro par);</li> <li>Verificar se algum dos valores é raíz de determinada equação;</li> <li>Verificar se um vetor é solução de um sistema linear (sequência seriam os produtos linha vetor candidato).</li> <!--li></li--> </ul> </p> <p class="autoria"> <a href="https://www.ime.usp.br/~leo" target="_blank" title="seguir para a pagina do prof. Leônidas">Leônidas de Oliveira Brandão</a><br/> <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a> </p> <p class="rodape"> <b>Alterações</b>:<br/> 2020/08/15: novo formato, pequenas revisões<br/> 2020/08/12: novo formato, pequenas revisões<br/> 2019/05/08: primeira versão </p> </div>