Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

O que é e como usar o laço WHILE em C

Com o teste condicional IF ELSE, explicado aqui na apostila C Progressivo, você passou a ter mais controle sobre suas aplicações em C, pois agora você pode escolher o que será rodado em seu programa, dependendo dos valores lógicos que esse teste condicional faz.

Vamos agora introduzir outro importante assunto em linguagem de programação C: laços. Também conhecidos por loopings.

Com laços e testes, você passará a ter total controle do fluxo em seus códigos.

Clique aqui e saiba como obter seu certificado de programação C! Entre já no Mercado de Trabalho!

Repetir e repetir: o que são e para que servem os laços em C

Repetir é uma das coisas mais importantes na programação. Na verdade, elas não se repetem indefinidamente, elas se repetem dependendo dos testes que fazem.

Por exemplo, seu computador faz várias repetições para saber se você está conectado a internet.
Se esse teste der resultado positivo, nada acontece.
Porém, se ele testar e ver que a conexão não existe mais, ele manda uma mensagem dizendo que você perdeu a conexão.

Fazer testes você já está careca de saber.
Porém, como faria todos esses testes? Colocaria um if else a cada segundo, durante 1h?
E se o usuário passar 2h conectado? Ou 1 dia?

E se você fosse contratado para criar um programa em C que diz se cada aluno em uma sala de aula passou.
Se essa sala tem 30 alunos, você vai criar 30 testes condicionais?
E se a sala tiver 60 alunos? Ou se você for contratado para testar as notas de todos os 2mil alunos de uma escola?
2mil blocos de IF ELSE?

Óbvio que não. Lembre-se: você programa em C, então você é quem manda no seu computador.
Você fará sua máquina repetir essas coisas automaticamente.



O laço while: definição e sintaxe

While, em inglês, significa 'enquanto'.
A função do laço while é repetir um determinado trecho ENQUANTO uma determinada condição for verdadeira.

Por exemplo, enquanto (while) o personagem tiver life, o jogo deve continuar.
Enquanto (while) a mp3 não terminar, ela deve continuar tocando.
Enquanto (while) um jogador não ganhar, perder ou der empate, o jogo da velha deve continuar rodando.
Enquanto o usuário não digitar 0, seu programa deve continuar rodando.

E poderíamos dar milhões de exemplos do quanto os laços, como o while, são importantes e essenciais em linguagem C.

Vamos, então, aprender a usá-lo.
A sintaxe é a seguinte:

while( condição )
{
    //código que
    //será repetido
}


Ou seja, o código do bloco só será rodado enquanto a condição der resultado verdadeiro.
Primeiro o while testa a condição, se for verdadeira, ele roda.
Ao término, ele testa novamente e roda novamente se for verdadeira.
Caso, em algum momento, o teste forneça valor lógico FALSO, o while vai parar e seu programa segue o fluxo normalmente.

Essas 'rodadas' de 'testa e roda' do while, e de outros laços, são chamadas de iterações.

E se a condição for sempre verdadeira? Como em:

while( 1 )
{
    printf("O que acontece?\n");
}

Acontece um looping infinito. Esse printf, ou qualquer código naquele lugar, rodaria indefinidamente...só pararia quando você fechasse o aplicativo ou reiniciasse sua máquina.


Na grande maioria dos códigos em C, porém, essa condição vai mudando.
Geralmente é um número que cresce ou decresce, e ao atingir certo ponto, o while recebe FALSE como resultado do teste da condição, e o while termina.

Vamos ver alguns exemplos.

Exemplo comentado de código: 

Programa em C que conta de 1 até 10 usando o laço while

Primeiro declaramos uma variável, e inicializamos ela com o valor inicial, que é 1.
Logo em seguida ,fazemos com que o while dê um printf, mostrando o valor dessa variável ENQUANTO ela for MENOR ou IGUAL a 10.
Após imprimir o número 10, a variável é incrementada e passa a ter valor 11.
Como 11 não é menor ou igual a 10, o laço recebe valor lógico FALSE e termina sua execução.

#include <stdio.h>

int main(void)
{
        int numero=1;

        while(numero <= 10)
        {
            printf("%d\n", numero);
            numero++;
        }

}

Outros testes que resultariam positivo para esse exemplo:
while(numero < 19);
while(numero != 11);

Exemplo: Programa em C que conta de 10 até 1, usando o laço while
Agora vamos fazer o contrário do exemplo passado.
A lógico é a mesma: veja, raciocine e tente entender sozinho:

#include <stdio.h
int main(void)
{
        int numero=10;

        while(numero >= 1)
        {
            printf("%d\n", numero);
            numero--;
        }

}


Exemplo comentado de código: 

Crie um aplicativo em C que peça ao usuário o primeiro elemento de uma P.A, a razão da P.A e o número de elementos a serem exibidos.


O termo inicial P.A será armazenado na variável init.
A razão da P.A será armazenado na variável rate, e o número de elementos da P.A será armazenado na variável term.

Vamos usar duas variáveis de apoio, para contar.
Uma delas é a variável num, que representará o valor de cada termo da P.A. O valor dela será mudado a cada iteração, percorrendo todos os valores da P.A.
Já a variável count será usada para contar os termos da P.A. Os termos começam no primeiro (1) e terminar no último (term).

A fórmula para saber o valor do elemento 'an' de uma P.A é:
an = a1 + (n - 1) * razão

Assim, nosso código em C fica:

#include <stdio.h>

int main(void)
{
        int init,
            rate,
            term;

        int num,
            count=1;

        printf("Digite o numero inicial da P.A: ");
        scanf("%d", &init);

        printf("Digite a razao da P.A: ");
        scanf("%d", &rate);

        printf("Digite o numero de termos da P.A: ");
        scanf("%d", &term);

        while(count <= term)
        {
            num = init + (count - 1) * rate;
            printf("Termo %d: %d\n",count, num);
            count++;
        }

}


Exemplo comentado de código: 

Crie um aplicativo em C que peça ao usuário o primeiro elemento de uma P.G, a razão da P.G e o número de elementos a serem exibidos.
O raciocínio é análogo ao do exemplo anterior. Mas o termo 'an' de uma P.G é diferente da P.A, e é dado por:
an = a1 * (razao)^(n-1)

A única diferença aqui é que vamos usar a função pow da biblioteca math.h.
O uso dela é bem simples: pow(a,b) significa 'a elevado a b'.

Então, nosso código em C fica:

#include <stdio.h>
#include <math.h>

int main(void)
{
        int init,
            rate,
            term;

        int num,
            count=1;

        printf("Digite o numero inicial da P.G: ");
        scanf("%d", &init);

        printf("Digite a razao da P.G: ");
        scanf("%d", &rate);

        printf("Digite o numero de termos da P.G: ");
        scanf("%d", &term);

        while(count <= term)
        {
            num = init*pow(rate,(count-1));
            printf("Termo %d: %d\n",count, num);
            count++;
        }
}

17 comentários:

Guilherme Demoliner disse...

Desculpe a ignorância, mas não entendi o que quer dizer P.A e P.G

Murilo disse...

PA (progressão aritimética) e PG (progressão geométrica).

Unknown disse...

Galera preciso de um help,
quero monta um while desse tipo :
while(jg != 1 || jg !=2){
comandos ...
}
Mas independente do valor contido na variavel "jg" ele executa os comando do mesmo jeito.
o que posso fazer ?

Unknown disse...

Obrigado Galera, já consegui fazer funcionar... no lugar das barras "||", coloquei "&&", fazer um teste fechado , rsrs' Fiquei 1 hora pra lembra isso. Vlw ...
o Código completo é esse :
#include
#include
#include

int main()
{
system("chcp 1252 > chcp.tmp");

int jg,i,num;
printf("\nDigite 1 para entrar no jogo, ou digite 2 para sair:");
scanf("%d",&jg);
while(jg != 1 && jg != 2)
{
printf("\nValor Incorreto, tente novamente.");
printf("\nDigite 1 para entrar no jogo, ou digite 2 para sair:");
scanf("%d",&jg);
}
while(jg == 1)
{
system("cls");
srand( (unsigned)time(NULL) );
printf("\n#######Vamos jogar#######");
printf("\nTente me vencer, escolherei 1 número de 0 a 10,");
printf("\nse você acertar qual o número eu escolhi, você venceu.");
printf("\n\tTente a sorte ;)");
i = 1 + ( rand() % 10 );
printf("\nDê sua opnião = ");
scanf("%d",&num);
if(num == i)
printf("\nParabéns, você me venceu !");
else
printf("\n#SabeDeNadaInocente");
printf("\nDigite 1 para continuar no jogo, ou digite 2 para sair:");
scanf("%d",&jg);
}
printf("\nAperte ENTER para sair!");
return 0;
}

Anônimo disse...

O miolo do meu codigo de PA

while (quant>0)
{
printf ("PA= %f\n", valor);
valor+=razao; //valor inicial mais a razao
quant--; //qunatidade de termos da P.A
}

Testei rodou massa!
testei e tudo comparando com o do site

TÔATÔA disse...
Este comentário foi removido pelo autor.
Anônimo disse...

Ja declarei a biblioteca
mas o compilador ainda não reconhece o 'pow'.

Anônimo disse...

Bom, este é o meu código no exercício da P.G.:

#include
#include

int main()

{
int init, rate, term;
int elemento,
count = 1,
total = 0;

// Recebendo dados do usuário final;
printf("Termo inicial da P.G.: \n");
scanf("%d", &init);
printf("Razao da P.G.: \n");
scanf("%d", &rate);
printf("N de termos da P.G.: \n");
scanf("%d", &term);

// Lógica para determinar a soma dos termos da P.G. (total) com o auxílio da variável 'elemento',
// que analisa cada elemento da P.G. e soma seu resultado à variável 'total';
while(count <= term)
{
elemento = init*pow(rate,(count-1));
total += elemento;
count++;
}
printf("A soma dos termos da P.G. e: %d.", total);
}

Quis criar um código que fosse além do exposto no site, e somasse todos os termos da P.G.; o problema é que o código roda perfeitamente, porém, ao utilizar dados como init:5, rate:5, e term:3, o programa retorna que a soma dos termos equivale a 154, quando na verdade equivale a 155. Testei inumeras entradas semelhantes, e dá o mesmo erro. O que pode estar errado?

Desde já, agradeço a vocês pelo excelente material!

Teste disse...

Olá, ainda não consegui perceber para que serve o void, int main(void), alguem me poderá explicar?

Obrigado

dicas de tudo e mais um pouco... disse...

Estou acompanhando até o momento, mas como nem tudo são flores, vamos lá: Eu acho meio fora da realidade estar ensinando While (o que eu acho um dos difíceis até então) usando Progressão Aritimética e Geometrica. Para mim matou sobre while alim, espero mais para frente ser mais simples...obrigado!

Anônimo disse...

BOA TARDE PRECISO URGENTE SABER QUAL E A DIF, VLW

QUAL A DIFERENÇA DO COMANDO 'DO'DO COMANDO WHILE???????

Lima disse...

Como faço para imprimir um nome várias vezes com while

RICARDO disse...

Boa tarde, pessoal. Alguém se disponibiliza em me orientar de como posso desenvolver este programa,por favor?

Crie um programa, em linguagem C, que calcule o tamanho da árvore da vida, após um determinado número de ciclos de crescimento, levando-se em consideração que a árvore começa com um metro de tamanho.

Uma árvore, com 1 metro de tamanho, após 1 ciclo, fica com 2 metros.
Uma árvore, com 1 metro de tamanho, após 2 ciclos, fica com 3 metros.
Uma árvore, com 1 metro de tamanho, após 3 ciclos, fica com 6 metros.
Uma árvore, com 1 metro de tamanho, após 4 ciclos, fica com 7 metros.
Uma árvore, com 1 metro de tamanho, após 5 ciclos, fica com 14 metros.
Uma árvore, com 1 metro de tamanho, após 6 ciclos, fica com 15 metros.
Uma árvore, com 1 metro de tamanho, após 7 ciclos, fica com 30 metros.

Anônimo disse...

O que esta em baixo do {DO} E A CIMA do {while} vai ser repetido pelomenos uma vez ;mesmo si for verdadeiro ou não , depois que ele faz o teste no while

Anônimo disse...

O que esta abaixo do {do} e acima do {while} vai rodar pelomenos uma vez ,mesmo si for verdadeiro ou não ;

Geovani disse...
Este comentário foi removido pelo autor.
Anônimo disse...

Geovani, ta colocando o incremento em erros para toda vez que a pessoa erra?
ex:


erros++;