introducao_for.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <!--
  2. Introdução ao comando de repetição for
  3. -->
  4. <!-- center><p>[
  5. <a href="memoria" title="sobre memoria, bits e bytese">Memória</a> &nbsp; | &nbsp;
  6. <a href="#variaveis" title="variaveis inteiras e reais">Variáveis</a> &nbsp; | &nbsp;
  7. <a href="#expressoes" title="expressoes aritmetics">Expressões</a> &nbsp; | &nbsp;
  8. <a href="#contexto" title="resultado de uma expressao depende do contexto">Contexto</a> &nbsp; &nbsp;
  9. ]</p>
  10. </center -->
  11. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  12. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  13. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  14. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  15. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  16. <div class="pagina">
  17. <p class="secao">Introdução ao comando de repetição for</p>
  18. <p>
  19. Nesta seção examinaremos um novo comando de repetição, bastante útil quando o número de
  20. <i>passos</i> (cada repetição de um bloco de comandos)
  21. é conhecido à priori, ou seja, conhecido ao iniciar o laço.
  22. </p>
  23. <p>
  24. Em várias <i>linguagens de programação</i> (com <em>C</em> e em <em>Python</em>) esse comando recebe o nome de
  25. <b><tt class="cmd">for</tt></b> (<i>para</i>).
  26. Além disso ele deve sempre dispor de um <b>enumerador</b> (ou <i>iterador</i>), ou seja, uma
  27. variável que será utilizada para controlar o número de repetições do bloco de comandos subordinado ao <i>for</i>.
  28. Esse <i>enumerador</i> pode ser usado em comandos do bloco.
  29. </p>
  30. <a name="caracteres"><span style="color: #0050A0">Comando <i>for</i> em <em>C</em></span></a>
  31. <p>
  32. Em <em>C</em> a sintaxe do comando é:
  33. <center>
  34. <table class="tbCodeLinCol">
  35. <tr><th>Comando <tt>for</tt></th><th>Equivalente usando <tt>while</tt></th></tr>
  36. <tr valign="top">
  37. <td><pre><tt class="cmd">for</tt> (varint=valorIni, condicao, incremento)
  38. comandoSubordinado;</pre></td>
  39. <td><pre>varint = valorIni;
  40. <tt class="cmd">while</tt> (condicao) {
  41. comandoSubordinado;
  42. incremento; <tt class="com">// geralmente algo como: varint += passo;</tt>
  43. }</pre></td></tr>
  44. </table>
  45. </center>
  46. Note que dentro da definição do comando também deve-se utilizar o separador ponto-e-vírgula (';').
  47. </p>
  48. <p>
  49. Por exemplo, o programa abaixo que imprime a soma dos <tt>n</tt> primeiros naturais,
  50. mas somando-os em ordem invertida, começando com o <tt>n</tt>, depois somando-se <tt>n-1</tt> e, assim por diante,
  51. até o <tt>1</tt>.
  52. <pre><tt class="head">#include &lt;stdio.h&gt;</tt>
  53. int main (void) {
  54. int n, i; <tt class="com">// declarando o indexador i do comando for e o tamanho do laco n</tt>
  55. int soma = 0;
  56. <tt class="fnc">scanf</tt>("%d", &n); <tt class="com">// ler a quantia desejada de naturais</tt>
  57. <tt class="cmd">for</tt> (i=n; i&gt;0; i--) {
  58. soma += i; <tt class="com">// acumula o atual natural em i</tt>
  59. <tt class="fnc">printf</tt>("%d : %d\n", i, soma); <tt class="com">// imprime contador e a soma parcial
  60. // apos ultimo comando subordinado ao for, executa-se o incremento do contador (ou seja, i &lt;- i-1, entao
  61. // a execucao retorna ao inicio do for e testa se continua (i<u>&gt;</u>0),
  62. // se for repete-se os comandos subordinados, senao finaliza o for</tt>
  63. }
  64. <tt class="fnc">printf</tt>("Soma dos %d primeiros naturais eh igual a %d\n", n, soma);
  65. return 1; <tt class="com">// se foi algum outro programa que invocou este, devolva o valor 1</tt>
  66. }</pre>
  67. </p>
  68. <a name="caracteres"><span style="color: #0050A0">Comando <i>for</i> em <em>Python</em></span></a>
  69. <p>
  70. Em <em>Python</em> é necessário usar um <i>iterador</i>, isso pode ser feito com a função
  71. <tt><tt class="fnc">range</tt>(...)</tt> que pode ter 1, 2 ou 3 parâmetros do tipo número natural.
  72. Se tiver apenas um parâmetro significa que deve gerar os n primeiros naturais.
  73. Se tiver dois parâmetros naturais, neste caso significa os naturais entre ambos, mas
  74. também pode ter três parâmetros e neste caso o último é o tamanho do passo.
  75. Abaixo a forma geral do comando <tt>for</tt>, com um exemplo de <tt>range(...)</tt> usando apenas um parâmetro.
  76. <center><tt><tt class="cmd">for</tt> varint in <tt class="fnc">range</tt>(numeroIteracoes) comandoSubordinado</tt></center>
  77. Nesse exemplo, o <tt>comandoSubordinado</tt> será executado <tt>numeroIteracoes</tt>, na primeira com
  78. <tt>i</tt> valendo <tt>0</tt>, depois <tt>i</tt> valendo <tt>1</tt> e assim por diante, até <tt>i</tt> valendo <tt>numeroIteracoes-1</tt>.
  79. </p>
  80. <p>
  81. Também pode-se fazer o <tt>i</tt> ter outro valor inicial e tamanho de passo diferente, mesmo passos "negativos".
  82. Por exemplo, para imprimir os <tt>n/2</tt> primeiros ímpares pode fazer:
  83. <table>
  84. <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  85. <td><tt class="cmd">for i in <tt class="fnc">range</tt>(1, n, 2) : print("%d " % i, end="");</tt></td></tr>
  86. <tr><td></td><td><tt>print();</tt></table>
  87. Se <tt>n=10</tt>, esse código geraria <tt>1 3 5 7 9</tt>, na mesma linha. Ou seja,
  88. o segundo parâmetro do <tt>range(...)</tt> (o controle <tt>n</tt>), é o limite, "repete-se enquanto" <tt>i <u>&lt;</u>10</tt>.
  89. </p>
  90. <p>
  91. Por exemplo, o programa abaixo que imprime a soma dos <tt>n</tt> primeiros naturais,
  92. mas somando-os em ordem invertida, começando com o <tt>n</tt>, depois somando-se <tt>n-1</tt> e, assim por diante,
  93. até o <tt>1</tt>.
  94. <pre>def main () :
  95. <tt class="com">#inteiros: n, i; :: usaremos como indexador i para o comando for e o tamanho do laco n</tt>
  96. soma = 0;
  97. n = int(<tt class="fnc">input</tt>()); <tt class="com"># ler a quantia desejada de naturais</tt>
  98. <tt class="cmd">for</tt> i in <tt class="fnc">range</tt>(n, 0, -1) :
  99. soma += i; <tt class="com"># acumula o atual natural em i</tt>
  100. <tt class="fnc">print</tt>("%d : %d" % (i,soma)); <tt class="com"># imprime contador e a soma parcial</tt>
  101. # desse ponto, incrementa-se i (ou seja, i &lt;- i-1, entao a execucao retorna ao inicio do for e se i<u>&gt;</u>0,
  102. # repete-se os comandos subordinados ao for
  103. <tt class="fnc">print</tt>("Soma dos %d primeiros naturais eh igual a %d" % (N,soma));
  104. main()</pre>
  105. </p>
  106. <p>
  107. Note que no exemplo acima usamos o marcador <tt><b>%d</b></tt> dentro da função <tt class="fnc">print</tt>,
  108. isso significa que no lugar do primeiro <tt>%d</tt> deverá ser impresso o valor da primeira variável, encontrada
  109. após fechar aspas e após o caractere <tt>%</tt> (i.e., <tt>i</tt>) e no lugar do <tt>%d</tt> deverá ser impresso o valor da
  110. segunda variável (i.e., <tt>soma</tt>).
  111. O <tt>%d</tt> está associado à inteiros, se precisar de caractere deve-se usar o formator <tt>%c</tt>,
  112. se precisar de ponto flutuante deve-se usar o <tt>%f</tt> e se for usar uma variável que guarda caracteres (<i>string</i>),
  113. deve-se usar o formatador <tt>%s</tt>.
  114. <!--
  115. Entretanto, como no exemplo, se existir mais que uma variável/valor, então é obrigatório que esses venham
  116. com a sintaxe de <i>lista</i> e na ordem correspondentes a cada formatador <tt><b>%d</b></tt>, ou seja,
  117. a lista cercada por abre e fecha parênteses.
  118. -->
  119. </p>
  120. <span style="color: #0055AA;font-size:1.em"><b>Exercitando a compreensão: simulando o código</b></span>
  121. <p>
  122. É interessante usar <b>simulações</b> para melhor compreender o desenvolvimento dos algoritmos, mais ainda se você detectar
  123. algum erro em seu código, que portanto precisa ser corrigido.
  124. Adotaremos o seguinte esquema de simulação: usaremos uma tabela com as variáveis do código e registraremos cada alteração
  125. 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
  126. (em qualquer ponto/linha) será o primeiro valor, na coluna da variável, encontrado "olhando" para "cima".
  127. Indicaremos as atribuições com ":=".
  128. </p>
  129. <!--
  130. 3
  131. 0 : 0
  132. 1 : 1
  133. 2 : 3
  134. Soma dos 3 primeiros naturais eh igual a 3
  135. -->
  136. <center><table><tr><td align="left"><pre>
  137. n | soma | i impressoes
  138. ---+------+--- ----------
  139. soma := 0 ? | 0 | ?
  140. * leitura para inteiro n 3 | |
  141. i := 0 (primeiro da lista (0,1,2) | | 0
  142. * entra no laco "for" pois 0=i&lt;n=3 | |
  143. soma := 0 (pois: soma recebe soma+i=0+1) | 0 |
  144. * saida: 0 : 0 | | 0 : 0
  145. i := 1 (segundo da lista (0,1,2)) | | 1
  146. * entra no laco "for" pois 1=i&lt;n=3 | |
  147. soma := 1 (pois: soma recebe soma+i=0+1) | 1 |
  148. * saida: 1 : 1 | | 1 : 1
  149. i := 2 (terceiro da lista (0,1,2)) | | 2
  150. * entra no laco "for" pois 2=i&lt;n=3 | |
  151. soma := 3 (pois: soma recebe soma+i=1+2) | 3 |
  152. * saida: 2 : 3 | | 2 : 3
  153. * nao tem elemento na lista (0,1,2) apos o 2 | |
  154. * final do laco "for" (sem mais elementos) | |
  155. * executa primeira instrucao apos laco "for" | |
  156. * saida: Soma dos 3 primeiros naturais eh igual a 3 | | Soma dos 3 primeiros naturais eh igual a 3
  157. </pre></td></tr></table></center>
  158. <!-- img/img_invisivel.png e img/img_visivel.png -->
  159. <img src="img/img_invisivel.png" onClick="fnc_mostrar('mais_range', 'olho');" id="olho"
  160. title="Clique para ver explicacao adicional sobre 'range'" />
  161. <div class="mais" id="mais_range">
  162. <p>
  163. Em relação à função <tt>range(...)</tt> existe uma diferença interessante entre o <em>Python 2</em> e o
  164. <em>Python 3</em>. No 2 ao usar por exemplo, <tt><tt class="fnc">range</tt>(10)</tt> é gerada uma lista com os
  165. 10 primeiros naturais, assim imediatamente após invocar a função é necessário alocar espaço de
  166. memória para os 10 elemento.
  167. Já no <em>Python 3</em> os elementos são gerados a medida que se precisa deles.
  168. <p>
  169. <!--a href="." onMouseOver="fnc_mostrar_esconder('mais_range');"-->
  170. <p>
  171. Vejamos como funcionam os parâmetros em <tt class="fnc">range</tt>:
  172. <center>
  173. <table class="tbCodeLinCol">
  174. <tr><th># parâmetros</th><th>função</th><th>resultado</th></tr>
  175. <tr valign="top">
  176. <th>1 parâmetro</th>
  177. <td><pre>lst = <tt class="fnc">range</tt>(10)</pre>
  178. <td>Gera uma lista com os naturais <tt>0,1,2,3,4,5,6,7,8,9<tt></td>
  179. </tr>
  180. <tr valign="top">
  181. <th>2 parâmetros</th>
  182. <td><pre>lst = <tt class="fnc">range</tt>(0,10)</pre>
  183. <td>Gera uma lista com os naturais <tt>0,1,2,3,4,5,6,7,8,9<tt></td>
  184. </tr>
  185. <tr valign="top">
  186. <th>2 parâmetros</th>
  187. <td><pre>lst = <tt class="fnc">range</tt>(1,10)</pre>
  188. <td>Gera uma lista com os naturais <tt>1,2,3,4,5,6,7,8,9,10<tt></td>
  189. </tr>
  190. <tr valign="top">
  191. <th>3 parâmetros</th>
  192. <td><pre>lst = <tt class="fnc">range</tt>(0,10,2)</pre>
  193. <td>Gera uma lista com os naturais <tt>0,2,4,6,8<tt></td>
  194. </tr>
  195. </table>
  196. </center>
  197. </p>
  198. </div>
  199. <p class="autoria">
  200. <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/>
  201. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  202. </p>
  203. <p class="rodape">
  204. <b>Alterações</b>:<br/>
  205. 2020/08/15: novo formato, pequenas revisões<br/>
  206. 2019/07/28: Versão 1.2 (vários acertos)<br/>
  207. 2019/03/31: Versão 1.1<br/>
  208. 2017/05/03: versão 1.0
  209. </p>
  210. </div>