123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <!--
- Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
- Introdução ao comando de repetição while
- 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 comando de repetição <tt>while</tt></p>
- <p>
- Nas seções sobre
- <a href="#" onclick="trocaPagina('introducao_var.html')" title="seguir para o texto introdutório sobre variaveis">variáveis</a> e sobre
- <a href="#" onclick="trocaPagina('introducao_if.html')" title="introducao ao comando de selecao">comando de seleção</a>, pudemos perceber os conceitos
- básicos da computação que nos permite construir sistemas sofisticados.
- 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
- de acordo com valores que as variáveis assumem.
- </p>
- <p>
- Entretanto, falta um conceito essencial para permitir computação significativa, que é a <i>repetição condicionada</i> de comandos.
- Quer dizer, é possível <i>repetir um bloco de comandos enquanto uma condição é verdadeira</i>. Depois examinaremos outras formas, como
- </i>repetir até determinanda condição se verificar</i> ou <i>repetir um número de vezes</i>.
- com os dois conceitos
- </p>
- <p>
- 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>:
- <ol>
- <li> testa a <b>condição lógica</b>,</li>
- <li> se resultar <b style="color:#00aa00;">verdadeiro</b>, então <b style="color:#0000aa;">entra no laço</b>,
- ou seja, segue o caminho indicado pela seta com rótulo <b>sim</b>;</li>
- <ol>
- <li> executa todos os comandos subordinados ao laço, o <b style="color:#0000aa;">bloco de repetição</b>;</li>
- <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>
- </ol>
- <li> se resultar <b style="color:#00aa00;">falso</b>, então <b style="color:#0000aa;">sai no laço</b>,
- ou seja, segue o caminho indicado pela seta com rótulo <b>não</b>;</li>
- </li>
- </ol>
- <center>
- <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 -->
- <br/>
- <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>.
- </center>
- </p>
- <p>
- 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
- (<tt>while</tt>), seguido de uma expressão lógica (EXPL) depois o bloco de comandos subordinados. Assim, se tiver apenas um comando
- subordinado a sintaxe <i>C</i> e <i>Python</i> são:
- <center>
- <table class="tbCodeLinCol">
- <tr><th>C </th> <th>Python</th></tr>
- <tr><td><table class="tbCode">
- <tr><td><pre><azul>while</azul> (EXPL) <tt class="com">// em C e' obrigatorio os '(' e ')'</tt>
- comando1;</pre></td></tr>
- </table></td>
- <td><table class="tbCode"><pre><azul>while</azul> (EXPL): <cyan># note que em Python '(' e ')' sao opcionais</cyan>
- comando1</pre></td></tr>
- </table></td></tr>
- </table></center>
- </p>
- <p>
- O significado (semântica) do código acima, durante sua execução, é:
- <center><table>
- <tr><td>1. </td> <td>Verifica-se a condição <tt>EXPL</tt>,
- 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>
- <tr><td>2. </td> <td>Executa-se o comando "comando1", depois volta-se a executar o passo 1.</td></tr>
- <tr><td>3. </td> <td>Final do bloco de repetição!</td></tr>
- </table></center>
- </p>
- <p class="subsecao">Vários comandos subordinados ao mesmo comando de repetição <tt>while</tt></p>
- <p>
- Se houver necessidade de vários comandos subordinados ao comando de repetição, então em <i>C</i> deve-se usar as marcas
- '{' e '}' para anotar o início e o fim do bloco. Em <i>Python</i> não é necessário devido à <i>indentação</i>
- ser obrigatória e por ser capaz de identificar todos os comandos subordinados. Assim, vejamos um trecho de código que
- gerar e imprimir os naturais entre 1 e N:
- <center>
- <table class="tbCodeLinCol">
- <tr><th>C </th> <th>Python</th></tr>
- <tr><td><table class="tbCode"><tr><td><pre><verd>scanf</verd>("%d", &N); <cyan>// ler valor limite N</cyan>
- i = 0; <cyan>// variavel para "contar"</cyan>
- <azul>while</azul> (i < N) {
- i = i+1; <cyan>// leia-se como: i recebe o valor de i acrescido de 1</cyan>
- <verd>print</verd>f("i=%d\n", i);
- } <cyan>// final do bloco</cyan>
- <verd>print</verd>f("Final!");</pre></td></tr>
- </table></td>
- <td><table class="tbCode"><tr><td><pre>N = <verm>int</verm>(<verd>input</verd>()); <cyan># ler valor limite N</cyan>
- i = 0 <cyan># variavel para "contar"</cyan>
- <azul>while</azul> (i < N) :
- i = i+1 <cyan># a indentacao indica esta linha</cyan>
- <verd>print</verd>("i=", i) <cyan># e a proxima linha como sobordinadas 'a repeticao</cyan>
- <cyan># para indicar final do bloco basta a proxima linha estar alinhada com o "while"</cyan>
- <verd>print</verd>("Final!")</pre></td></tr>
- </table></td>
- </table></center>
- </p>
- <p class="subsecao">Exercitando a compreenção: simulando o código</p>
- <p>
- É interessante usar <b>simulações</b> para melhor compreender o desenvolvimento dos algoritmos, mais ainda se você detectar
- algum erro em seu código, que portanto precisa ser corrigido.
- Adotaremos o seguinte esquema de simulação: usaremos uma tabela com as variáveis do código e registraremos cada alteração
- 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
- (em qualquer ponto/linha) será o primeiro valor, na coluna da variável, encontrado "olhando" para "cima".
- Indicaremos as atribuições com ":=".
- </p>
- <center><table><tr><td align="left"><pre>
- N | i impressoes
- ---+--- ----------
- * leitura para inteiro N 3 | ?
- i := 0 | 0
- * entra no laco "while" pois 0=i<N=3 |
- i := 1 (pois: i recebe i+1=0+1) | 1
- * saida: i=1 | i=1
- * final do laco "while" volta para condicao |
- * entra no laco "while" pois 1=i<N=3 |
- i := 2 (pois: i recebe i+1=1+1) | 2
- * saida: i=2 | i=2
- * final do laco "while" volta para condicao |
- * entra no laco "while" pois 2=i<N=3 |
- i := 3 (pois: i recebe i+1=2+1) | 3
- * saida: i=3 | i=3
- * final do laco "while" volta para condicao |
- * sai no laco "while" pois 3=i<N=3 = falso!!! | Final!
- </pre></td></tr></table></center>
- <p>
- Para estudar um pouco mais:<ol>
- <li><a href="http://www.ime.usp.br/~hitoshi/introducao/04-ComandoDeRepeticao.pdf"
- title="comando while em Python">em C siga este apontador</a>;</li>
- <li><a href="http://panda.ime.usp.br/pensepy/static/pensepy/07-Iteracao/maisiteracao.html#o-comando-while"
- title="comando while em Python">em Python siga este apontador</a>.</li>
- </ol>
- </p>
- <p>
- <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/20: acertos formato<br/>
- 2020/08/11: imagem diagrama de fluxo (e texto), novo formato, pequenas revisões<br/>
- 2019/03/31: verao 1.1<br/>
- 2017/04/14: verao 1.0
- </p>
- </div>
|