introducao_while.html 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <!--
  2. Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
  3. Introdução ao comando de repetição while
  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 comando de repetição <tt>while</tt></p>
  28. <p>
  29. Nas seções sobre
  30. <a href="#" onclick="trocaPagina('introducao_var.html')" title="seguir para o texto introdutório sobre variaveis">variáveis</a> e sobre
  31. <a href="#" onclick="trocaPagina('introducao_if.html')" title="introducao ao comando de selecao">comando de seleção</a>, pudemos perceber os conceitos
  32. básicos da computação que nos permite construir sistemas sofisticados.
  33. Com variáveis é possível armazenar e trocar valores e com a seleção (<i>if</i>) pode-se desviar o fluxo de execução
  34. de acordo com valores que as variáveis assumem.
  35. </p>
  36. <p>
  37. Entretanto, falta um conceito essencial para permitir computação significativa, que é a <i>repetição condicionada</i> de comandos.
  38. Quer dizer, é possível <i>repetir um bloco de comandos enquanto uma condição é verdadeira</i>. Depois examinaremos outras formas, como
  39. </i>repetir até determinanda condição se verificar</i> ou <i>repetir um número de vezes</i>.
  40. com os dois conceitos
  41. </p>
  42. <p>
  43. A figura 1 ilustra o <b style="color:#0000aa;">fluxo de execução</b> de um comando do tipo <b style="color:#0000aa;">repita enquanto</b>:
  44. <ol>
  45. <li> testa a <b>condição lógica</b>,</li>
  46. <li> se resultar <b style="color:#00aa00;">verdadeiro</b>, então <b style="color:#0000aa;">entra no laço</b>,
  47. ou seja, segue o caminho indicado pela seta com rótulo <b>sim</b>;</li>
  48. <ol>
  49. <li> executa todos os comandos subordinados ao laço, o <b style="color:#0000aa;">bloco de repetição</b>;</li>
  50. <li> volta ao passo 1, ao início do laço (por isso este é classificado como <b style="color:#0000aa;">laço com condição de entrada</b>);</li>
  51. </ol>
  52. <li> se resultar <b style="color:#00aa00;">falso</b>, então <b style="color:#0000aa;">sai no laço</b>,
  53. ou seja, segue o caminho indicado pela seta com rótulo <b>não</b>;</li>
  54. </li>
  55. </ol>
  56. <center>
  57. <img src="img/pt_fluxo_laco_enquanto_entrada.png" title="Ilustração do fluxo de execução do laço 'repita enquanto'" width="250px"/><!-- 346 x 464 -->
  58. <br/>
  59. <i>Fig. 1. Diagrama de fluxo de execução (a) sem o ramo de <i>senão</i> e (b) com o ramo de <i>senão</i> .</i>.
  60. </center>
  61. </p>
  62. <p>
  63. A estrutura básica do comando de <i>repetição com condição de entrada</i> é formado por 3 partes, uma marca indicando o comando
  64. (<tt>while</tt>), seguido de uma expressão lógica (EXPL) depois o bloco de comandos subordinados. Assim, se tiver apenas um comando
  65. subordinado a sintaxe <i>C</i> e <i>Python</i> são:
  66. <center>
  67. <table class="tbCodeLinCol">
  68. <tr><th>C </th> <th>Python</th></tr>
  69. <tr><td><table class="tbCode">
  70. <tr><td><pre><azul>while</azul> (EXPL) <tt class="com">// em C e' obrigatorio os '(' e ')'</tt>
  71. comando1;</pre></td></tr>
  72. </table></td>
  73. <td><table class="tbCode"><pre><azul>while</azul> (EXPL): <cyan># note que em Python '(' e ')' sao opcionais</cyan>
  74. comando1</pre></td></tr>
  75. </table></td></tr>
  76. </table></center>
  77. </p>
  78. <p>
  79. O significado (semântica) do código acima, durante sua execução, é:
  80. <center><table>
  81. <tr><td>1. </td> <td>Verifica-se a condição <tt>EXPL</tt>,
  82. se o seu resultado for verdadeiro executa-se o <i>passo 2</i>, senao vai para <i>passo 3</i> (final do comando)</td></tr>
  83. <tr><td>2. </td> <td>Executa-se o comando "comando1", depois volta-se a executar o passo 1.</td></tr>
  84. <tr><td>3. </td> <td>Final do bloco de repetição!</td></tr>
  85. </table></center>
  86. </p>
  87. <p class="subsecao">Vários comandos subordinados ao mesmo comando de repetição <tt>while</tt></p>
  88. <p>
  89. Se houver necessidade de vários comandos subordinados ao comando de repetição, então em <i>C</i> deve-se usar as marcas
  90. '{' e '}' para anotar o início e o fim do bloco. Em <i>Python</i> não é necessário devido à <i>indentação</i>
  91. ser obrigatória e por ser capaz de identificar todos os comandos subordinados. Assim, vejamos um trecho de código que
  92. gerar e imprimir os naturais entre 1 e N:
  93. <center>
  94. <table class="tbCodeLinCol">
  95. <tr><th>C </th> <th>Python</th></tr>
  96. <tr><td><table class="tbCode"><tr><td><pre><verd>scanf</verd>("%d", &N); <cyan>// ler valor limite N</cyan>
  97. i = 0; <cyan>// variavel para "contar"</cyan>
  98. <azul>while</azul> (i &lt; N) {
  99. i = i+1; <cyan>// leia-se como: i recebe o valor de i acrescido de 1</cyan>
  100. <verd>print</verd>f("i=%d\n", i);
  101. } <cyan>// final do bloco</cyan>
  102. <verd>print</verd>f("Final!");</pre></td></tr>
  103. </table></td>
  104. <td><table class="tbCode"><tr><td><pre>N = <verm>int</verm>(<verd>input</verd>()); <cyan># ler valor limite N</cyan>
  105. i = 0 <cyan># variavel para "contar"</cyan>
  106. <azul>while</azul> (i &lt; N) :
  107. i = i+1 <cyan># a indentacao indica esta linha</cyan>
  108. <verd>print</verd>("i=", i) <cyan># e a proxima linha como sobordinadas 'a repeticao</cyan>
  109. <cyan># para indicar final do bloco basta a proxima linha estar alinhada com o "while"</cyan>
  110. <verd>print</verd>("Final!")</pre></td></tr>
  111. </table></td>
  112. </table></center>
  113. </p>
  114. <p class="subsecao">Exercitando a compreenção: simulando o código</p>
  115. <p>
  116. É interessante usar <b>simulações</b> para melhor compreender o desenvolvimento dos algoritmos, mais ainda se você detectar
  117. algum erro em seu código, que portanto precisa ser corrigido.
  118. Adotaremos o seguinte esquema de simulação: usaremos uma tabela com as variáveis do código e registraremos cada alteração
  119. em uma linha, seguindo o <i>fluxo de execução</i> de cima para baixo, de modo que o último valor de uma variável
  120. (em qualquer ponto/linha) será o primeiro valor, na coluna da variável, encontrado "olhando" para "cima".
  121. Indicaremos as atribuições com ":=".
  122. </p>
  123. <center><table><tr><td align="left"><pre>
  124. N | i impressoes
  125. ---+--- ----------
  126. * leitura para inteiro N 3 | ?
  127. i := 0 | 0
  128. * entra no laco "while" pois 0=i&lt;N=3 |
  129. i := 1 (pois: i recebe i+1=0+1) | 1
  130. * saida: i=1 | i=1
  131. * final do laco "while" volta para condicao |
  132. * entra no laco "while" pois 1=i&lt;N=3 |
  133. i := 2 (pois: i recebe i+1=1+1) | 2
  134. * saida: i=2 | i=2
  135. * final do laco "while" volta para condicao |
  136. * entra no laco "while" pois 2=i&lt;N=3 |
  137. i := 3 (pois: i recebe i+1=2+1) | 3
  138. * saida: i=3 | i=3
  139. * final do laco "while" volta para condicao |
  140. * sai no laco "while" pois 3=i&lt;N=3 = falso!!! | Final!
  141. </pre></td></tr></table></center>
  142. <p>
  143. Para estudar um pouco mais:<ol>
  144. <li><a href="http://www.ime.usp.br/~hitoshi/introducao/04-ComandoDeRepeticao.pdf"
  145. title="comando while em Python">em C siga este apontador</a>;</li>
  146. <li><a href="http://panda.ime.usp.br/pensepy/static/pensepy/07-Iteracao/maisiteracao.html#o-comando-while"
  147. title="comando while em Python">em Python siga este apontador</a>.</li>
  148. </ol>
  149. </p>
  150. <p>
  151. <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/>
  152. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  153. </p>
  154. <p class="rodape">
  155. <b>Alterações</b>:<br/>
  156. 2020/08/20: acertos formato<br/>
  157. 2020/08/11: imagem diagrama de fluxo (e texto), novo formato, pequenas revisões<br/>
  158. 2019/03/31: verao 1.1<br/>
  159. 2017/04/14: verao 1.0
  160. </p>
  161. </div>