Você está na página 1de 13

Comando de repetio while

Sintaxe
while (condio) comando

onde comando pode corresponder a uma instruo simples ou a uma seqncia de instrues entre chaves separados por " ; " e condio uma expresso lgica, cujo resultado pode ser verdadeiro ou falso.

Descrio
Enquanto a condio for verdadeira, o comando repetido. O comando pode ser apenas uma instruo do C ou um bloco de instrues entre chaves. Por exemplo, seja x uma varivel inteira. O segmento de programa abaixo simplesmente subtrai 1 de x, 5 vezes (note que o comando 'x = x-1;' repetido 5 vezes).
x=5; while (x > 0) { x = x -1; } printf("valor de x = %d\n",x);

A figura abaixo mostra graficamente o fluxo de execuo desses comandos. Para entender esse diagrama, cada retngulo representa um bloco de instrues, que so executadas seqencialmente, um bloco de cada vez, de cima para baixo. O primeiro comando, a atribuio x = 5 (a varivel x recebe o valor 5), executado antes do while.

Nessa representao grfica, blocos retangulares podem ser encaixados, como pode ser visto no bloco correspondente ao while. Esse comando testa a condio (x>0) e se ela for verdadeira, executa os comandos do sub-bloco associado, que nesse caso contem apenas a atribuio x = x - 1. Observe a seta na coluna esquerda do bloco do

while. Ela indica que ao terminar o sub-bloco, a condio do while precisa ser testada novamente. Assim, o sub-bloco repetido enquanto a condio do while for verdadeira, e s quando a condio for falsa, o while termina, e a instruo seguinte executada (no caso, o printf). NOTA: para que o seu programa termine, voc precisa garantir que a condio do while seja alterada de alguma forma. Caso contrrio, o programa entra em "looping infinito".

Exemplos comentados:
Exemplo 1:
Dada uma seqncia de nmeros inteiros, calcular os seus quadrados. Soluo: Uma soluo possvel pode ser descrita de modo informal como: 0 - imprima uma mensagem para o usurio saber o que fazer 1 - leia o primeiro nmero da seqncia na varivel num 2 - enquanto num for diferente de zero faa: 2.1 calcule quadrado = num * num 2.2 imprima o valor de quadrado 2.3 leia o prximo nmero da seqncia na varivel num 3. fim O funcionamento do programa pode ser entendido tambm pelo diagrama abaixo:

Em geral, mais simples desenhar o diagrama e, quando voc estiver certo de que ele

funciona, sua "traduo" para a linguagem C simples, basta copiar o esqueleto de um programa em C visto anteriormente, e preencher as lacunas. O programa em C ficaria:
#include <stdio.h> #include <stdlib.h> int main () { /* declaracoes */ int num; /* variavel utilizada para leitura da sequencia */ int quad; /* variavel que armazena o quadrado de um numero */ /* programa */ printf("Digite uma sequencia terminada por zero\n"); scanf("%d", &num); while (num != 0) /* os simbolos '!=' significam diferente */ { quad = num * num ; printf ("O quadrado de %d = %d\n", num, quad); scanf("%d", &num); } /* fim do programa */ system ("pause"); return 0; }

NOTA: programao exige muita ateno a detalhes. Porm, como o nmero de comados bastante limitado, no to difcil assim aprender uma linguagem de programao. Programar porm pode ser considerado difcil por alguns, pois o problema precisa ser decomposto e descrito de modo formal. Vamos resolver vrios exerccios para que voc desenvolva o raciocnio para decompor os problemas.

Exemplo 2:
Dada uma seqncia de nmeros inteiros terminada por zero, calcular a somatria dos nmeros da seqncia. Soluo Para melhor entender o problema, vamos ver um exemplo concreto de entrada e sada. Para a entrada 2 3 -4 5 0 a sada deve ser 6 (2 + 3 - 4 + 5). Uma forma possvel para resolver esse problema imaginar uma varivel que armazena as somas parciais. Essa varivel deve iniciar com o valor zero, e para cada nmero da seqncia, ser somada com mais esse nmero, at o final da seqncia. Assim, para o exemplo acima, o valor de soma torna-se 2 aps processar o primeiro elemento da seqencia (soma-se o 2), 5 aps o segundo (soma-se o 3), 1 aps o terceiro (soma-se o 4), e assim at o final. O diagrama abaixo ilustra um rascunho usando nossa pseudo linguagem de blocos:

Traduzindo esse esboo para C temos:


#include <stdio.h> #include <stdlib.h> int main () { /* declaracoes */ int num; /* variavel utilizada para leitura da sequencia */ int soma; /* variavel que armazena a soma da sequencia */ /* programa */ printf("Digite uma sequencia terminada por zero\n"); scanf("%d", &num); while (num != 0) /* os simbolos '!=' significam diferente */ { soma = soma * num ; scanf("%d", &num); } printf("Soma da sequencia = %d \n", soma); /* fim do programa */ system ("pause"); return 0; }

Exemplo 3:
Vamos alterar um pouco o enunciado do exemplo anterior, para: Dado um nmero inteiro positivo, calcular a soma de seus dgitos. Por exemplo, para o nmero 1234, a sada deve ser 1+2+3+4 = 10.

Soluo A primeira pergunta seria: como a gente pode separar um dgito do nmero, para podermos calcular a soma? A resposta o operador resto, que utilizamos tambm na aula dirigida do compilador Dev-C++ para determinar nmeros pares e mpares. Lembre-se que o resultado de 7%3 1, pois 7 = 2 * 3 + resto, onde resto = 1; e o resultado de 7 / 3 2. A idia geral , separar o dgito mais a direita, atualizar a soma, e tratar o prximo digito, at que todos os digitos sejam somados. O rascunho abaixo ilustra essa idia:

Observe que a varivel dgito recebe o valor do dgito mais a direita de num (digito = num % 10) dentro do comando enquanto (while), e a seguir o nmero modificado para que ele perca o digito processado (num = num / 10). A tabela abaixo ilustra a execuo desse programa, mostrando o que acontece com as variveis para o nmero 123: Comentrio antes do enquanto dentro de enquanto: digito = num % 10 num = num / 10 soma = soma + digito condio do enquanto verdadeira digito = num / 10 num = num / 10 soma = soma + digito 1 5 2 12 3 num 123 3 digito soma 0

condio verdadeira digito = num / 10 num = num / 10 soma = soma + digito condio do enquanto falsa, fim do loop 0 6 1

Traduzindo o pseudo cdigo para C:


#include <stdio.h> #include <stdlib.h> int main ( ) { /* Declaracoes */ int num, soma, digito; printf ("Entre com um numero: "); scanf ("%d", &num); soma = 0; while (num != 0) /* enquanto houver digitos para processar */ { digito = num % 10; /* pega o digito mais a direita */ num = num / 10; /* atualiza o numero, mantedo apenas os digitos no processados */ soma = soma + digito; /* atualiza a soma dos digitos */ } printf ("Soma dos digitos: %d.\n", soma); system("pause"); return 0; }

Comandos de Repetio
Os comandos de repetio so um recurso que permite que um certo trecho do cdigo de um programa seja repetido um certo nmero de vezes. Na liguagem C existem trs comandos de repetio: while, do-while e for.

Comando while
O comando while permite que um certo trecho de programa seja executado ENQUANTO uma certa condio for verdadeira. A forma do comando while a seguinte:
while (condio) { // comandos a serem repetidos

// comandos a serem repetidos } // comandos aps o 'while'

O funcionamento o seguinte: 1. Testa a condio; 2. Se a condio for falsa ento pula todos os comandos do bloco subordinado ao
while e passa a executar os comandos aps o bloco do while.

3. Se condio for verdadeira ento executa cada um dos comandos do bloco 4. Aps executar o ltimo comando do bloco do while volta ao passo 1. O comando while deve ser usado sempre que:
subordinado ao while.

no soubermos exatamente quantas vezes o lao deve ser repetido; o teste deva ser feito antes de iniciar a execuo de um bloco de comandos; houver casos em que o lao no deva ser repetido nenhuma vez.

Exemplos

int continua, contador;


continua = 's'; contador = 0; while (continua == 's') // enquanto for igual a 's' { // comandos a serem repetidos printf("Repentindo....\n"); contador = contador + 1; printf("Tecle 's' se deseja continuar\n"); continua = getch(); } if (contador == 0) printf("O bloco NAO foi repetido."); else printf("O bloco foi repetido %d vezes", contador);

// Programa que calcula a idade mdia de um grupo de pessoas. // A finalizao da entrada de nmeros dada por um -1

int soma, quantidade, idade;

float media; soma = 0; quantidade = 0; idade = 0; while (idade != -1) { // comandos a serem repetidos printf("Idade da pessoa %d. (tecle -1 se quiser encerrar).\n", quantidade+1); scanf("%d", &idade); if (idade >=0) { soma = soma + idade; quantidade = quantidade + 1; } } // Faz o calculo da media de idade if (quantidade >0) { media = (float) soma / quantidade; printf("A media de idade das %d pessoas eh: %5.2f", quantidade, media); } else printf("Nenhum dado foi informado.");

Observao:
Tenha ateno especial com o teste do comando while. As variveis usadas no teste devem ter sido inicializadas antes do teste.

Comando do-while
O comando do-while permite que um certo trecho de programa seja executado ENQUANTO uma certa condio for verdadeira. A forma do comando do-while a seguinte:
do { // comandos a serem repetidos // comandos a serem repetidos } while (condio);

// comandos aps o 'do-while'

O funcionamento o seguinte: 1. Executa os comando dentro do bloco do-while; 2. Testa a condio; 3. Se a condio for falsa ento executa o comando que est logo aps o bloco
subordinado ao do-while . 4. Se condio for verdadeira ento volta ao passo 1.

O comando do-while deve ser usado sempre que:


que no soubermos exatamente quantas vezes o lao deve ser repetido; o teste deva ser feito depois da execuo de um bloco de comandos; o bloco de comandos deve se executado pelo menos 1 vez;

Exemplos

int continua, contador;


contador = 0; // nao precisamos inicializar a varivel 'continua' pois o teste feito // depois do { // comandos a serem repetidos printf("Repentindo....\n"); contador = contador + 1; printf("Tecle 's' se deseja continuar\n"); continua = getch(); } while (continua == 's') printf("O bloco foi repetido %d vezes", contador);

// Programa que calcula a idade mdia de um grupo de pessoas. // A finalizao da entrada de nmeros dada por um -1

int soma, quantidade, idade; float media; soma = 0;

quantidade = 0; do { printf("Idade da pessoa %d. (tecle -1 se quiser encerrar).\n", quantidade+1); scanf("%d", &idade); if (idade >=0) { soma = soma + idade; quantidade = quantidade + 1; } } while (idade != -1); // Faz o calculo da media de idade if (quantidade > 0) { media = (float) soma / quantidade; printf("A media de idade das %d pessoas eh: %5.2f", quantidade, media); } else printf("Nenhum dado foi informado.");

Comando for
O comando for permite que um certo trecho de programa seja executado um determinado nmero de vezes. A forma do comando for a seguinte:
for (comandos de inicializao;condio de teste;incremento/decremento) { // comandos a serem repetidos // comandos a serem repetidos } // comandos aps o 'for'

O funcionamento o seguinte: 1. Executa os comandos de inicializao; 2. Testa a condio; 3. Se a condio for falsa ento executa o comando que est logo aps o bloco
subordinado ao for .

4. Se condio for verdadeira ento executa os comandos que esto subordinados ao


for; 5. Executa os comandos de incremento/decremento; 6. Volta ao passo 2.

O comando for deve ser usado sempre que:


soubermos exatamente quantas vezes o lao deve ser repetido; o teste deva ser feito antes da execuo de um bloco de comandos; houver casos em que o lao no deva ser repetido nenhuma vez.

Exemplos

int contador;
for (contador = 0; contador < 10; contador = contador+1) {

printf("Contador : %d\n",contador);
}

printf("Valor do Contador aps o lao: %d\n",contador);

int contador;
for (contador = 10; contador > 0; contador = contador-1) {

printf("Valor do Contador aps o lao: %d\n",contador);


}

printf("Valor do Contador aps o lao: %d\n",contador);

Observaes:
1. Os comandos de inicializao executados apenas 1 vez; 2. O contador incrementado/decrementado sempre ao final da execuo do bloco; 3. O teste feito sempre antes do incio da execuo do bloco de comandos.

Comandos de Desvios
Os laos em C possuem dois comandos de desvios: break e continue. Estes comandos funcionam com todos os comandos de repetio.

O comando break encerra o lao no ponto em que for executado.

// Este programa le NO MAXIMO 3 nmeros positivos // Caso um nmero negativo seja digitado no meio da seqncia o lao // encerrado de imediato

#include <stdio.h> #include <conio.h> void main() { int contador, numero; for (contador = 1; contador <= 3; contador = contador+1) { scanf("%d",&numero); if (numero < 0) break; // encerra o lao neste ponto !!! } printf ("Foram digitados %d numeros validos", contador-1); getch(); } O comando continue desvia o fluxo para o incio do lao.
#include <stdio.h> #include <conio.h>

void main() { int contador, numero; clrscr(); for (contador = 1; contador <= 5; contador = contador+1) { printf("Inicio do laco. Passo %d\n", contador); if ((contador % 2) == 0) { printf("Terminado antes do tempo....\n"); continue; } printf ("Final do Laco. Passo %d\n", contador); } getch(); }

RESULTADO:

Inicio do laco. Passo 1 Final do Laco. Passo 1 Inicio do laco. Passo 2 Terminado antes do tempo.... Inicio do laco. Passo 3 Final do Laco. Passo 3 Inicio do laco. Passo 4 Terminado antes do tempo.... Inicio do laco. Passo 5 Final do Laco. Passo 5