Stoa :: C/C++ :: Blog :: O laço for: aspectos básicos - parte 2

setembro 17, 2007

user icon

Descrição: quando o computador encontrar uma instrução for tal como a descrita a seguir, ele irá realizar uma certa sequência de operações, descritas logo abaixo do código.

 

int a;

for ( a = 0; a <= 10; a = a + 1 )

{

   int b;

   printf("\nDigite um valor para b: ");

   scanf("%d", &b);

   printf("\na = %d, b = %d e sua soma = %d.", a, b, a + b);

}

printf("\nA variavel a ainda existe e vale %d.", a);

 

 

A declaração da variável a ocorre antes do laço for. Isto significa que o escopo no qual a está definida abrange todo o laço for considerado.

Assim que o computador encontra a instrução for, ele executa a instrução de inicialização. Neste caso, ele atribui o valor zero à variável a. Note que a execução dessa instrução de inicialização ocorre antes de executar qualquer instrução "dentro" do laço e antes mesmo do teste da condição de término. Em outras palavras, quando um laço for é executado, sua instrução de inicialização é sempre executada.

A segunda operação realizada pelo computador ao percorrer uma instrução for é verificar se a condição de término está satisfeita. Caso essa condição seja falsa, o laço for é encerrado e o computador executará a próxima instrução do programa, que no caso do exemplo seria a impressão da variável a fora do laço for. Mas como no exemplo, na primeira execução a variável a tem valor zero e o teste condiciona a execução do bloco de instruções aos casos em que a é menor ou igual a 10, o bloco será executado.

A execução do bloco segue as regras gerais de C ou C++ para a execução de instruções. Note que "dentro" de um laço for podemos ter outras estruturas de controle de fluxo, como laços for, while, do ... while, switch e if. Com esse recurso, podemos ter um bloco de código que é executado condicional e/ou controladamente dentro de um bloco que já é ele mesmo executado controladamente. Com esse recurso podemos escrever código para problemas que exigem que operações sejam repetidas repetidas vezes, como por exemplo somar vários fatoriais. (Cada fatorial repete a multiplicação de 1 a N, e cada soma soma os fatoriais de 1 a M, por exemplo).

No nosso exemplo, o bloco de instruções cria a variável b e pede que o usuário entre com o valor para b. Depois ele calcula e imprime o valor de a vezes b. Ao chegar no final do bloco - e isto é muito importante - a variável b é destruída, pois o bloco é encerrado. A variável a, como tem um escopo mais amplo que o do laço for, continua a existir.

A última etapa que o computador empreende ao executar uma instrução for é executar a instrução de incremento. No nosso exemplo, a variável a é aumentada em uma unidade. Em seguida o computador retorna à etapa de verificar se a condição de término é satisfeita - note que a instrução de inicialização não é mais executada. Se o teste for verdadeiro, como no nosso caso, o bloco é executado novamente, será destruído e a variável a incrementada novamente (a = 3, agora). Como o teste é verdadeiro, o bloco é executado e então destruído. a é novamente incrementada (a = 4). Esse ciclo ocorre até que a seja maior que 10, e aí o bloco não é executado e o processamento segue seu caminho "para fora" do laço for.

 

 

Exemplo: digamos que seu problema seja somar os números naturais de 1 a 1000. A solução seria criar e inicializar uma variável inteira (digamos a variável "soma") com valor zero, e depois somar a essa variável o valor 1 (soma = 1), depois somar a essa variável o valor 2 (soma = 3), depois somar a essa variável o valor 3 (soma = 6) e assim sucessivamente até mil.

Esse procedimento para obter a soma dos 1000 primeiros naturais consiste em uma operação, "adicione o valor do i-ésimo natural à variável soma", que deve ser repetida de i=1 até i=1000, aumentando i em uma unidade a cada execução. De modo que o laço for que implementa essa solução para esse problema seria (em C):

 

 

/* Soma os 1000 primeiros naturais e armazena em "soma" */

int a, soma = 0;

for ( a=1; a <= 1000; a++ )      /* Lembre-se: "a++" é o mesmo que "a = a + 1". */

   soma += a;

 

 

Exercício: escreva um laço for que calcula o fatorial de 10. (Lembre-se: dez fatorial = 10! = 10*9*8*7*6*5*4*3*2*1 = ?).

 

 

Exemplo: talvez seu problema seja somar os números naturais pares de 1 a 1000. Neste caso, a solução é mudar a instrução de incremento para que aumente a variável de controle em duas unidades a cada execução, e garantir que a instrução de inicialização inicializa a variável com o valor par correto. Em código:

 

 

/* Soma os números naturais pares de 1 a 1000 */

int a, soma = 0;

for ( a=2; a <= 1000; a += 2)     /* Lembre-se que "a += 2" é o mesmo que "a = a + 2". */

   soma += a;

 

 

Exercício: escreva um laço for que soma os números ímpares de 1 a 1000.

 

 

Desafio: escreva um laço for que conta o número de anos bissextos que ocorreram no século XX. Modifique esse laço para que conte os anos bissextos de qualquer século da era atual.

Palavras-chave: exemplos, exercícios, for, laço for

Postado por Renato Callado Borges em C/C++

Você deve entrar no sistema para escrever um comentário.

Termo de Responsabilidade

Todo o conteúdo desta página é de inteira responsabilidade do usuário. O Stoa, assim como a Universidade de São Paulo, não necessariamente corroboram as opiniões aqui contidas.