:TITLE: Estruturas de repetição 101 - While
;#
;# RCSID: $Header: /home/cvs/TclTutor3/lesson/Tcl_Portuguese/Tcl_Portuguese9.lsn,v 1.1 2008/08/02 12:37:36 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 29/12/2005
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
<B>Sintaxe: </B> <CODE>while</CODE> <I>teste corpo</I>
<P>
While avalia <CODE>teste</CODE> como uma expressão. Se <CODE>teste</CODE> 
for verdadeiro, o código em <CODE>corpo</CODE> é executado. Depois que
o código em corpo foi executado, o <CODE>teste</CODE> é avaliado novamente.
<P>
Uma declaração <CODE>continue</CODE> dentro do <CODE>corpo</CODE> irá interromper
a execução do código e o teste será reavaliado. Um <CODE>break</CODE> 
dentro do <CODE>corpo</CODE> irá interromper o laço while, e a execução
continuará na próxima linha depois do código do <CODE>corpo</CODE>.
:TEXT_END:
<P>
:LESSON_TEXT_START_LEVEL 1:
Tcl inclui dois comandos para repetição, os comandos <CODE>while</CODE> e 
<CODE>for</CODE>.  Como a declaração <CODE>if</CODE> eles avaliam seus
testes da mesma forma que o comando <CODE>expr</CODE> faz. Nesta lição
nós discutimos o comando <CODE>while</CODE>, e na próxima lição,
o comando <CODE>for</CODE>. Na maioria das circunstâncias onde um
desses comandos pode ser usado, o outro pode ser usado também.
<P>
<B>Sintaxe: </B> <CODE>while</CODE> <I>teste corpo</I>
<P>
O comando <CODE>while</CODE> avalia o <CODE>teste</CODE> como uma expressão. 
Se o <CODE>teste</CODE> for verdadeiro, o código em <CODE>corpo</CODE> é executado.
Depois que o código em <CODE>corpo</CODE> foi executado, o <CODE>teste</CODE> 
é avaliado novamente.
<P>
Uma declaração <CODE>continue</CODE> dentro do <CODE>corpo</CODE> 
irá interromper a execução do código e o teste será reavaliado. Um
<CODE>break</CODE> dentro do <CODE>corpo</CODE> irá finalizar o laço
while, e a execução continuará com a próxima linha de código depois do
<CODE>corpo</CODE>.
<P>
Em Tcl, *tudo* é um procedimento, e tudo passa pela mesma fase de 
substituição. Por essa razão, o <CODE>teste</CODE> deve ser colocado
dentro de chaves. Se o <CODE>teste</CODE> for colocado entre aspas
duplas, a fase de substituição irá substituir quaisquer variáveis com
seus valores atuais, e passará aquele teste para o procedimento
<CODE>while</CODE> avaliar, e desde que o teste só tem números,
ele será sempre avaliado da mesma maneira.
<P>
Observe os dois laços no exemplo. Se você não colocasse o comando
break na segunda repetição, ela ficaria repetindo indefinidamente.
:TEXT_END:
<P>
:LESSON_TEXT_START_LEVEL 2:
Outra característica comum das linguagens de computador é a construção
de uma estrutura de repetição. Essa é uma forma para o programa fazer o
mesmo conjunto de operações várias e várias vezes com diferentes
valores, sem deixar o programador digitar todas as linhas do código.
<P>
Tcl inclui dois comandos para repetição, os comandos <CODE>while</CODE> 
e <CODE>for</CODE>. Como a declaração <CODE>if</CODE>, eles avaliam seus
testes da mesma forma que o comando <CODE>expr</CODE> faz. Nesta lição, nós
discutimos o comando <CODE>while</CODE> e na próxima lição, o comando <CODE>for</CODE>.
Na maioria das circunstâncias onde um desses comandos pode ser usado, o
outro pode ser usado também.
<P>
A sintaxe para o comando while é:
<P>
<B>Sintaxe: </B> <CODE>while</CODE> <I>teste corpo</I>
<P>
Quando o interpretador Tcl encontra um comando while, ele avalia o
<CODE>teste</CODE> imediatamente. Se o <CODE>teste</CODE> é avaliado
como verdadeiro, então o código dentro do <CODE>corpo</CODE> é executado.
Depois que o código no <CODE>corpo</CODE> foi executado, o <CODE>teste</CODE> 
é avaliado novamente. Se o <CODE>teste</CODE> for ainda verdadeiro, então o
corpo é avaliado novamente. Esse processo continua até que <CODE>teste</CODE> 
seja avaliado como falso (ou seja, false), ou um comando <CODE>break</CODE> 
seja encontrado.
<P>
<CODE>Break</CODE> e <CODE>continue</CODE> são dois comandos que
modificam o comportamento de um laço. Quando um <CODE>break</CODE> é
encontrado, o interpretador sai do laço e continua com a próxima
linha de código depois do <CODE>corpo</CODE>. Quando um <CODE>continue</CODE> 
é encontrado, o interpretador salta o <CODE>teste</CODE>, e não executa
o restante do código dentro do <CODE>corpo</CODE>.
<P>
Em Tcl, *tudo* é um procedimento, e tudo passa pela mesma fase de
substituição. Por essa razão, o <CODE>teste</CODE> deve ser colocado
dentro de chaves. Se o <CODE>teste</CODE> é colocado dentro de aspas
duplas, a fase de substituição irá substituir quaisquer variáveis com
seus valores atuais, e irá passar aquele teste para o procedimento
<CODE>while</CODE> avaliar, e como o teste só possui números, ele
sempre irá avaliar a mesma coisa.
<P>
Por exemplo - <CODE> while {$x < 5}</CODE> é passado para o comando
<CODE>while</CODE> como "$x < 5", mas
<CODE>while "$x < 5"</CODE> 
deveria ter o valor atual de x substituído pelo $x, e
(if x == 1) <CODE>, "1 < 5"</CODE> 
seria passado para o procedimento <CODE>while</CODE>. Como 1 é
sempre menor que 5, este código repetiria indefinidamente.
<P>
Observe os dois laços no exemplo. Se você não colocasse o comando
break na segunda repetição, ela ficaria repetindo indefinidamente.
:TEXT_END:
<P>
:CODE_START:
set x 1;
while {$x < 5} {puts "x é $x"; set x [expr $x + 1]}
puts "Saiu do primeiro laço com X igual a $x\n"

;# Quantas vezes esse laço repete?
;# Por que ele não exibe em cada passo?

set x 0;
while "$x < 5" {
	set x [expr $x + 1]
	if {$x >6} break;
 	if "$x > 3" continue;
	puts "x é $x"; 
	}
puts "Saiu do segundo laço com X igual a $x\n"
:TEXT_END: