indicador_passagem.html 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <!--
  2. Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
  3. Introdução ao conceito de indicador de passagem
  4. LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
  5. IME - USP
  6. Material didático
  7. Pode usar livrevemente este material para fins não comerciais, devendo sempre fazer referência à autoria.
  8. Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
  9. Prof. Leônidas de Oliveira Brandão
  10. http://www.ime.usp.br/~leo
  11. http://line.ime.usp.br
  12. http://www.matemtica.br
  13. -->
  14. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  15. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  16. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  17. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  18. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  19. <div class="pagina">
  20. <!--
  21. <center><p>[
  22. <a href="#" title=""></a> &nbsp; | &nbsp;
  23. <a href="#memoria" title=""></a> &nbsp; &nbsp;
  24. ]</p>
  25. </center>
  26. -->
  27. <p class="secao">Introdução ao conceito de indicador de passagem</p>
  28. <p>
  29. Nesta seção será apresentado o conceito de <i>indicador de passagem</i>, bastante útil em algoritmos que precisem detectar
  30. a ocorrência de um evento, não importanto quantos vezes ele ocorre,
  31. como saber se todos os elementos de uma sequência são <i>pares</i>, bastaria um valor <i>ímpar</i> para caracterizar
  32. a resposta como <i>negativa</i>.
  33. </p>
  34. <p class="secao">Ideia que se <i>repetem</i></p>
  35. <p>
  36. Em matemática é comum a existência de ideias que são usadas para resolver variados
  37. problemas, como a <i>soma telescópica</i> (<i>soma<sub>i=1</sub><sup>n</sup> 1/(i (i+1)) =
  38. 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)) =
  39. 1 - 1/(n+1)</i>).
  40. <!-- <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> -->
  41. </p>
  42. <p>
  43. Em desenvolvimento de <i>software</i> (programas computacionais) esse princípio do "reaproveitamento" de ideias é ainda mais usado.
  44. O primeiro exemplo que você deve ter notado desse "reaproveitamento" é a ideia de <i>contador</i>
  45. (sempre que executar determinada instrução, <i>acrescentar 1 ao contador</i>).
  46. </p>
  47. <p class="secao">Ideia de <i>indicador de passagem</i></p>
  48. <p>
  49. A ideia de <b style="color: #0000AA;">indicador de passagem</b> é utilizar uma variável que será usada
  50. para registrar se <i>determinado evento ocorreu</i>.
  51. Por exemplo, deseja-se saber se entre os valores digitados algum deles é negativo, então pode-se implementar
  52. um semelhante ao indicado abaixo (em uma linguagem <i>Portugol</i>):
  53. <pre>
  54. <tt class="com">// O indicador de passagem recebera o nome sugestivo 'existeNegativo'</tt>
  55. existeNegativo = 0; <tt class="com">// 0 =&gt; "ate' aqui" nenhum negativo - ou, "em principio, nao existem negativos"</tt>
  56. <tt class="cmd">repita</tt> N <tt class="cmd">vezes</tt>
  57. <tt class="fnc">leia</tt>(x);
  58. <tt class="cmd">se</tt> (x &lt; 0)
  59. <tt class="cmd">entao</tt> existeNegativo = 1; <tt class="com">// existe negativo! ("nunca mais" elimine o 1 dessa variavel indicadora)</tt>
  60. <tt class="com">// terminado o laco a resposta e' dada olhando se ocorreu o evento (ao menos uma vez)</tt>
  61. <tt class="cmd">se</tt> (existeNegativo == 1)
  62. <tt class="cmd">entao</tt> <tt class="fnc">imprima</tt>("Existe(m) negativo(s)");
  63. <tt class="cmd">senao</tt> <tt class="fnc">imprima</tt>("NAO existe sequer um valor negativo na sequencia digitada!");
  64. </pre>
  65. </p>
  66. <p>
  67. Portanto, esse <i>modelo solução</i> (ou <i>padrão</i>) é útil sempre que estiver interessado em
  68. detectar se um evento ocorre ao menos uma vez.
  69. </p>
  70. <p class="secao">Cuidado com um erro comum ao tentar usar indicadores</p>
  71. <p>
  72. Um erro bastante comum para os iniciantes na <i>arte de programar</i> é, a cada passo, alterar o valor da variável indicadora.
  73. Por exemplo, poder-se-ia "estragar" o código acima se for acrescentado um comando
  74. <tt class="cmd">senao</tt> dentro do laço, do sguinte modo
  75. <center><table><tr><td><pre>
  76. <tt class="com">// <b>Contra-exemplo</b> NAO implemente desse modo!</tt>
  77. existeNegativo = 0; <tt class="com">// 0 =&gt; "ate' aqui" nenhum negativo - ou, "em principio, nao existem negativos"</tt>
  78. <tt class="cmd">repita</tt> N <tt class="cmd">vezes</tt>
  79. <tt class="fnc">leia</tt>(x);
  80. <tt class="cmd">se</tt> (x &lt; 0)
  81. <tt class="cmd">entao</tt> existeNegativo = 1; <tt class="com">// existe negativo! ("nunca mais" elimine o 1 dessa variavel indicadora)</tt>
  82. <tt class="cmd">senao</tt> existeNegativo = 0; <tt class="com">// <b>NAO</b> use uma linha dessa (ela "desfaz" o indicador)!!!!</tt>
  83. <tt class="com">// terminado o laco a resposta SERIA dada olhando se ocorreu o evento</tt>
  84. <tt class="cmd">se</tt> (existeNegativo == 1)
  85. <tt class="cmd">entao</tt> <tt class="fnc">imprima</tt>("Existe(m) negativo(s)");
  86. <tt class="cmd">senao</tt> <tt class="fnc">imprima</tt>("NAO existe sequer um valor negativo na sequencia digitada!");
  87. </pre></td></tr></table></center>
  88. </p>
  89. <p>
  90. 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
  91. <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
  92. se for usado um comando <tt>for</tt> do <i>C</i> ou <i>Python</i>).
  93. <center><table><tr><td><pre> i | x | existeNegativo
  94. 1 | 2 | 0
  95. 2 | -1 | 1
  96. 3 | -3 | 1
  97. 4 | 2 | 0</pre></td></tr></table></center>
  98. </p>
  99. <p>
  100. Note que ao final da simulação, <tt>existeNegativo</tt> está com o valor 0, que indicaria a não existência de
  101. negativos na sequência, mas existem 2 negativos! Logo, solução errada!
  102. </p>
  103. <p>
  104. Na verdade, na implementação <i style="color:#aa0000">errônea</i> acima, a resposta será definida exclusivamente pela
  105. última iteração do laço. Por que?
  106. <br/>
  107. A razão é que, a cada passo a variável <tt>existeNegativo</tt> receberá um valor (esse é o <i style="color:#aa0000">erro</i>),
  108. pois se a condição for <i>verdadeira</i> executa-se
  109. a atribuição <tt>existeNegativo = 1</tt> e se for <i>falsa</i> executa-se
  110. a atribuição <tt>existeNegativo = 0</tt>.
  111. <br/>
  112. Portanto, não importa quais sejam os <tt>N-1</tt> primeiros valores digitados, o único usado para definir o
  113. valor final de <tt>existeNegativo</tt> seria o último! <i style="color:#aa0000">Erro</i>!
  114. </p>
  115. <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>
  116. <p>
  117. Abaixo está indicado em <i>C</i> e em <i>Python</i> o código para digitar <i>N</i> valores (inteiros)
  118. e imprimir se algum negativo foi ou não registrado (digitado).
  119. </p>
  120. <center><table><tr>
  121. <td bgcolor="8aaada"><i>C</i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  122. <td bgcolor="8aaada"><i>Python</i></td></tr>
  123. <tr><td colspan="2"><pre>
  124. <tt class="tipo">int</tt> n, i; <tt class=""></tt>
  125. <tt class="fnc">scanf</tt>("%d", &n); n = <tt class="fnc">int</tt>(<tt class="fnc">input</tt>());
  126. <tt class="">existeNegativo = 0; existeNegativo = 0;
  127. <tt class="cmd">for</tt> (i=0; i&lt; n; i++) <tt class="cmd">for</tt> i in range(n) :
  128. <tt class="cmd">if</tt> (x &lt; 0 ) <tt class="cmd">if</tt> (x &lt; 0 ) :</tt>
  129. <tt class="">existeNegativo = 1; <tt class="">existeNegativo = 1;</tt>
  130. <tt class="cmd">if</tt> (existeNegativo == 1) <tt class="cmd">if</tt> (existeNegativo == 1) :
  131. <tt class="fnc">printf</tt>("Existe(m) negativo(s)\n"); <tt class="fnc">print</tt>("Existe(m) negativo(s)");
  132. <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!");
  133. </pre></td></tr></table></center>
  134. <p class="secao">Outros exemplos de uso do conceito de <i>indicador de passagem</i></p>
  135. <p>
  136. Existe uma quantidade arbitrária de exemplos em que o conceito de <i>indicador de passagem</i> é útil.
  137. Abaixo listo apenas alguns exemplos simples:
  138. <ul>
  139. <li>Verificar se existe algum débito em um extrato bancário (identificar negativo em uma sequência);</li>
  140. <li>Verificar se uma sequência é crescente;</li>
  141. <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>
  142. <li>Verificar se algum dos valores é raíz de determinada equação;</li>
  143. <li>Verificar se um vetor é solução de um sistema linear (sequência seriam os produtos linha vetor candidato).</li>
  144. <!--li></li-->
  145. </ul>
  146. </p>
  147. <p class="autoria">
  148. <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/>
  149. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  150. </p>
  151. <p class="rodape">
  152. <b>Alterações</b>:<br/>
  153. 2020/08/15: novo formato, pequenas revisões<br/>
  154. 2020/08/12: novo formato, pequenas revisões<br/>
  155. 2019/05/08: primeira versão
  156. </p>
  157. </div>