TCL/TK - Controle de fluxo
Autor: Emanuel | Publicado: 2014-11-19T09:46:00-08:00


Com frequência, em programação, nossos programas precisam escolher entre certas direções determinadas, de acordo com certas condições pre-estabelecidas. A isso se chama controle de fluxo de execução do programa. Tcl oferece mecanismos avançados para que o programador possa controlar o fluxo de execução de seus programas. Mais adiante estudaremos cada um dos recursos que Tcl oferece para que controle de fluxo de execução de programas. Mas antes vamos entender um pouco mais o que é fluxo de execução.


Analisaremos&nbsp;a seguinte situação: Precisamos&nbsp; imprimir todos os números ímpares de 0 a 100. O algorítimo do nosso programa ficaria assim:



N = 0

enquanto N &lt; 100 faça {

&nbsp; &nbsp; &nbsp;se resto(N, 2) &lt;&gt; 0 então {

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imprima N

&nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp;incremente N

}



Na primeira linha do nosso programa, iniciamos a variável N como 0. Em seguida entramos em um laço de repetição( uma parte do programa que se repete enquanto uma condição dada permanecer verdadeira ) enquanto N for menor que 100.

No interior do laço de repetição, verificamos se o número N é ímpar( um número é impar se o resto da divisão do número por dois for diferente de zero ). Se for ímpar, imprimimos o número. Incrementamos( somamos mais um ) ao número e repetimos o laço. Cada repetição do laço se chama interação.

Vejamos agora como ficaria cada parte do programa em Tcl:

set N 0&nbsp;

while {$N &lt; 100} {

&nbsp; &nbsp; &nbsp;if {[expr fmod($N,2)]} {

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; puts $N

&nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp;incr N

}



if... then...elseif...else...&nbsp;



A expressão if...then...elseif...else... permite controlar o fluxo de execução do programa de acordo com diferentes condições dadas. A sintaxe é:

if expr1 corpo1 elseif expr2 corpo2... else corpoN&nbsp;

Onde expr1, expr2, exprN são diferentes condições a serem testadas e corpo1, corpo2, corpoN são porções de código que devem ser executadas caso a condição correspondente seja verdadeira. A expressão else somente é executada caso todas as outras expressões sejam avaliadas como falsas.&nbsp;

Exemplo:

if {$x == 0} {

&nbsp; &nbsp; &nbsp;puts "X é igual a 0"

}&nbsp;elseif {$x &lt; 0} {

&nbsp; &nbsp; &nbsp;puts "X é menor que 0"

} else {

&nbsp; &nbsp; &nbsp;puts "X é maior que 0"

}&nbsp;



while...



A expressão while... permite executar um laço de repetição enquanto uma expressão for avaliada como verdadeira. A sintaxe de while é:

while expr1 corpo

Onde expr1 é a expressão que deve ser avaliada como verdadeira( 1, true ou yes ) para que o laço seja repetido. E corpo é o fragmento de código que será executado a cada repetição do laço.

Pode-se interromper a execução de um laço a qualquer momento através do comando break.

Para pular para a próxima interação de um laço, saltando todas as instruções restantes, podemos utilizar o comando continue.

Exemplo:

set x 0

while {$x &lt; 10} {

&nbsp; &nbsp; &nbsp;puts $x;

}



for...



A expressão for... permite executar um laço de repetição enquanto uma expressão for avaliada como verdadeira. A sintaxe de for é:&nbsp;

for início teste próximo corpo&nbsp;

O onde início contém o código de inicialização da variável usada no teste, teste contém uma expressão que deve ser avaliada como verdadeira para que o laço se repita, próximo contém um fragmento de código que é avaliado a cada repetição, e que normalmente é utilizado para incrementar a variável e corpo contém o fragmento de código que se deseja executar a cada interação do laço. &nbsp;

Pode-se interromper a execução de um laço a qualquer momento através do comando break.

Para pular para a próxima interação de um laço, saltando todas as instruções restantes, podemos utilizar o comando continue.&nbsp;

Exemplo:

for {set x 1} {$x &lt; 10} {incr x} {

&nbsp; &nbsp; &nbsp;puts $s

}



foreach...



A expressão foreach... oferece um meio de interagir por todos os elementos de uma lista, de forma simplificada. foreach é muito usada no processamento de informações retornadas por consultas SQL.&nbsp;

A sintaxe de foreach é:&nbsp;

foreach variável lista corpo&nbsp;

Onde variável é o nome de uma variável que irá conter, a cada interação, o valor de um elemento da lista. lista é a lista que será percorrida e corpo é o fragmento de código que será executado a cada interação.&nbsp;

Pode-se interromper a execução de um laço a qualquer momento através do comando break.&nbsp;

Para pular para a próxima interação de um laço, saltando todas as instruções restantes, podemos utilizar o comando continue.

Exemplo:

set lista {vermelho alaranjado amarelo verde azul anil violeta}

foreach cor $lista {

&nbsp; &nbsp; &nbsp;puts $cor

}



switch...&nbsp;



O comando switch é provavelmente o meio mais poderoso para se controlar o fluxo de execução de um programa em Tcl. switch permite que se compare o valor de uma string com diversos valores dados e se execute a porção de código correspondente. switch suporta expressões regulares e é muito usado em comandos definidos pelo usuário para avaliar as opções passadas para o comando.

A sintaxe de switch é:&nbsp;

&nbsp;

switch [-exact] [-regexp] [-glob] string {

&nbsp; &nbsp; &nbsp;valor1 corpo1

&nbsp; &nbsp; &nbsp;valor2 corpo2

&nbsp; &nbsp; &nbsp;valorN corpoN

}



Onde as opções entre cochetes [] são opcionais, string é a string que será comparada com os valores definidos, valor1, valor2, valorN são os valores que serão comparados com a string e corpo1, corpo2, corpoN são os fragmentos de código que serão executados caso o valor correspondente coincida com a string passada para o comando.

Exemplo:

set x "arquivo"

switch x {

&nbsp; &nbsp; &nbsp;arquivo {puts "Você selecionou a opção arquivo"}

&nbsp; &nbsp; &nbsp;editar {puts "Você selecionou a opção editar"}

&nbsp; &nbsp; &nbsp;ajuda {puts "Você selecionou a opção ajuda"}

}



exit...



O comando exit encerra a execução do programa e retorna um valor para o shell.

A sintaxe de exit é:&nbsp;

exit valor

Onde valor é o valor que será retornado ao shell.&nbsp;

Exemplo:

set lista {vermelho alaranjado amarelo verde azul anil violeta}

foreach cor $list {

&nbsp; &nbsp; &nbsp;puts $cor

}

exit 0