123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- <!--
- 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>
|