While Rodando em Círculos.
Autor: Alexandre Richard | Publicado: 2013-05-18T16:32:00-07:00

Outro recurso importante é a habilidade de fazer um loop.
Construção do loop while(enquanto) no C++.

Formato:
while(expressão)
{
&nbsp; //Aqui vai o codigo.
}
//Aqui continua o código após o loop.

Quando o programa encontra o loop while, ele avalia a expressão entre parênteses.
Se a expressão for verdadeira, true, ele passa o controle para a primeira linha dentro de {. Quando o controle chegar a }, o programa volta para a expressão e recomeça.
O controle continua a circular entre as chaves até que a expressão passe para falsa, false, ou até que outra coisa rompa o loop.
Vamos avaliar com um programa:

------------------------------------------------------------------------------------------------------------


#include&lt;cstdio&gt;
#include&lt;cstdlib&gt;
#include&lt;iostream&gt;

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
&nbsp; &nbsp; int nAlvo;
&nbsp; &nbsp; cout &lt;&lt; "Este programa calcula os fatores.\n"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;&lt; "Entre com o numero.";
&nbsp; &nbsp; cin &nbsp;&gt;&gt; nAlvo;
&nbsp; 
&nbsp; &nbsp; int nAcumulador = 1;
&nbsp; &nbsp; int nValor = 1;
&nbsp; &nbsp; while(nValor &lt;= nAlvo)
&nbsp; &nbsp; {
&nbsp; &nbsp; &nbsp; cout &lt;&lt; nAcumulador &lt;&lt; " * "
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;&lt; nValor &lt;&lt; " igual ";
&nbsp; &nbsp; &nbsp; nAcumulador = nAcumulador * nValor;
&nbsp; &nbsp; &nbsp; cout &lt;&lt; nAcumulador &lt;&lt; endl;
&nbsp; &nbsp; &nbsp; nValor++;
&nbsp; &nbsp; }
&nbsp; &nbsp; //Imprimindo o resultado.
&nbsp; &nbsp; cout &lt;&lt; nAlvo &lt;&lt; " Fator = "
&nbsp; &nbsp; &lt;&lt; nAcumulador &lt;&lt; endl;
&nbsp; 
&nbsp; &nbsp; system("PAUSE");
&nbsp; &nbsp; return 0;
}

------------------------------------------------------------------------------------------------------------

Após solicitar o valor para o usuário, o programa coloca o valor em nAlvo e já inicia nAcumulador e nValor para 1.



O programa compara o nValor com nAlvo. Caso tenha digitado o valor 5, surge o primeiro loop com a seguinte questão: 1 é menor ou igual a 5? Como a resposta é true, verdadeira, o loop continua.



Antes de multiplicar, o programa imprime os valores de nAcumulador e nValor, ambos igual a 1.

Feito isto, o programa multiplica nAcumulador por nValor e atribui o resultado da multiplicação para nAcumulador, que passa de 1 para 2.



Em seguida, o loop recomeça com a seguinte pergunta: 2 é menor ou igual a 5? Como a resposta ainda é true, verdadeira, o loop continua.



O loop continua até que nValor chegue a 6, deixando de ser menor ou igual a 5 digitado pelo usuário.

Desta forma, o controle passa para a primeira declaração feita após a chave de fechamento } e imprime o resultado final.



Caso usuário digite 0, o controle vai direto para a instrução após a chave de fechamento } e o loop não será executado nenhuma vez. Isto por que, nValor é menor ou igual a 0 e a declaração foi falsa.&nbsp;



Para interromper um loop em execução, o C++ oferece dois comandos de controle:



Break: sai imediatamente do interior do loop.

Continue: retorna o controle para o inicio do loop.



Vamos ver os dois exemplos em um programa que multiplica valores positivos fornecidos pelo usurário, até que seja digitado um número negativo. O programa ignora zero.
------------------------------------------------------------------------------------------------------------


#include&lt;cstdio&gt;
#include&lt;cstdlib&gt;
#include&lt;iostream&gt;

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
&nbsp; &nbsp; cout &lt;&lt;"Programa para multiplicar os numeros digitados\n\n"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;&lt;"Para parar o programa, digite um numero negativo\n\n"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;&lt;"O programa iguinora zero\n\n"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;&lt; endl;
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int nProduto = 1;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while(true)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int nValor;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; "Digie o numero para multiplicar: ";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cin &gt;&gt; nValor;
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(nValor &lt; 0)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout &lt;&lt; "Saindo. Tchau!\n\n" &lt;&lt; endl;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(nValor == 0)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout &lt;&lt; "O programa iguinora zero. Por gentileza, digite um numero positivo.\n\n" &lt;&lt; endl;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Multiplicando e imprimindo o resultado no console.
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; nProduto &lt;&lt; " * " &lt;&lt; nValor;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nProduto *= nValor;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; " igual " &lt;&lt; nProduto &lt;&lt; endl;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; 
system("PAUSE");
return 0;
}

------------------------------------------------------------------------------------------------------------

O programa começa com o valor inicial de 1 no produto. Depois, avalia a expressão lógica true. Como true é verdadeiro, o programa entra no loop e continua solicitando ao usuário outro número para multiplicação.



Caso um valor negativo seja digitado, o programa envia a frase de despedida antes de executar o break, que passa o controle para fora do loop.



Caso o valor digitado seja zero, o programa notifica o usuário e retorna o controle para continue&nbsp;assim, o usuário pode continuar digitando.



Loops Aninhados.



O corpo de um loop ponde conter outro loop que é conhecido como nested loops ou loop alinhado.

O lopo alinhado deve executar totalmente através do loop externo.


Vamos escrever um programa que utiliza o loop alinhado para criar uma tabela de multiplicação.

Cada posição da tabela sera apenas a fileira de número, vezes a coluna de número.


------------------------------------------------------------------------------------------------------------




#include&lt;cstdio&gt;
#include&lt;cstdlib&gt;
#include&lt;iostream&gt;


using namespace std;



int main(int nNumberofArgs, char* pszArgs[])

{

&nbsp;//Mostrando a coluna

&nbsp;int nColuna = 0;

&nbsp;cout &lt;&lt; " ";

&nbsp;while(nColuna &lt; 0)

&nbsp;{

&nbsp; cout.width(2); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Setando uma constante para imprimir no console dois caracteres ou dois digitos.

&nbsp; cout &lt;&lt; nColuna &lt;&lt; " "; // Agora, imprimindo as colunas

&nbsp; nColuna++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//Incrementa para a proxima coluna

&nbsp;}

&nbsp;cout &lt;&lt; endl;



&nbsp;//Agora, o loop para percorrer as linhas

&nbsp;int nLinha = 0;

&nbsp;while(nLinha &lt; 10)

&nbsp;{

&nbsp; cout &lt;&lt; nLinha &lt;&lt; " - "; //Começando com o valor das linhas.

&nbsp; nColuna = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//Agora para cada linha, iniciamos a coluna 0 e vamos para a coluna 9.

&nbsp; while(nColuna &lt; 10)

&nbsp; {

&nbsp; &nbsp;cout.width(2); &nbsp; &nbsp; &nbsp; //Imprimindo o produto de coluna * linha usando 2 caracteres mesmo quando temos apenas 1 digito.

&nbsp; &nbsp;cout &lt;&lt; nLinha * nColuna &lt;&lt; " ";

&nbsp; &nbsp;nColuna++; &nbsp;//Indo para a proxima coluna

&nbsp; }

&nbsp; nLinha++; &nbsp; &nbsp;//Indo para a proxima linha

&nbsp; cout &lt;&lt; endl;

&nbsp;&nbsp;

&nbsp;}

system("PAUSE");

return 0;

}


------------------------------------------------------------------------------------------------------------

A expressão cout.width(2) ajusta a largura da exibição para duas colunas - C++ coloca um espaço a esquerda em números com apenas 1 digito.