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

Vamos apresentar o último, e não menos importante, laço de nosso curso C Progressivo: o laço do ... while.

Como o nome pode sugerir, ele tem muito a ver com o laço WHILE, que já estudamos e treinamos seu uso em tutoriais passados de nossa apostila de C.

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


Para que serve o laço DO WHILE em C

Se você notar bem, em nosso artigo sobre o laço WHILE, pode reparar que esse laço só roda se a condição for verdadeira.
Se essa condição for uma variável ou comparação, por exemplo, devemos sempre nos certificar que, inicialmente, essa condição vai ser verdadeira.

Geralmente inicializamos as variáveis ou pedimos algum dado pro usuário, tudo para nos certificarmos que o programa vai entrar no WHILE, o que as vezes pode ser um pouco incômodo e nada eficiente.

O que o laço DO WHILE faz é executar, PELO MENOS UMA VEZ, o que está dentro dele e só ao final da execução é que ele faz o teste, usando o velho e conhecido laço WHILE.
Ou seja, temos a garantia que o laço vai ser executado uma vez, sempre precisar inicializar variável ou pedir dados ao usuário antes do WHILE (pois fazer isso pode bagunçar o sistema).




Como declarar e usar o laço DO WHILE em C

Lembrando que DO, em inglês e nesse contexto, significa "faça" e WHILE significa "enquanto".

Ou seja, esse laço quer dizer "faça isso" -> código -> "enquanto essa condição for verdadeira, repita" (note como os nomes dos comandos não são escolhidos de forma aleatória, tudo em programação C faz sentido e foi criado com propósitos de facilidade a vida do programador e aumentar sua eficiência).

Resumindo, ele sempre executa seu código ao menos uma vez, o que é uma mão na roda em certas ocasiões.

E qual a diferença do laço DO WHILE para o WHILE ?
Bom, para o WHILE rodar é necessário que a condição seja sempre verdadeira.
Logo, se ela for inicialmente FALSE, o looping while nunca irá rodar.

Já o DO WHILE vai rodar sempre, ao menos uma vez, mesmo que a condição existente no WHILE seja falsa (se for falsa, vai rodar só uma vez e termina).

A sintaxe desse comando é a seguinte

do
{
   //código que
   //será repetido
   //aqui

} while (condição);

Vale realçar aqui que esse laço, diferente dos outros, POSSUI PONTO E VÍRGULA no final! Não se esqueçam!
No mais, não há segredos, é igual ao WHILE, a lógica é a mesma. Sabendo bem o WHILE, saberá bem o laço DO WHILE.

Vamos mostrar um exemplo em que o DO WHILE é bem usado em programação C: exibição de menu.

Exemplo de uso do laço DO WHILE: Criando um MENU

Crie um menu que apresente algumas opções ao usuário, usando o laço DO WHILE e o teste condicional SWITCH em C, para selecionar as opções.
Uma dessas condições é o término da exibição do menu.

Vamos usar apenas uma variável, o inteiro 'opcao' que irá selecionar a opção que o usuário quiser.
Dentro do escopo do do {}, mostramos o menu de opções e pedimos pro usuário digitar algo.

A condição do while é a própria variável.
Se o usuário digitar 0, o WHILE irá receber FALSE como condição e irá encerrar.
Caso o WHILE receba qualquer outra coisa diferente de 0, receberá valor lógico TRUE e irá continuar o laço DO WHILE.

Pois bem, já sabemos o que ocorre quando 0 é digitado.
Então, dentro do SWITCH, quando a opção 0 é selecionada, apenas limpamos a tela e damos um aviso de saída.

Caso 1 ou 2 seja digitado, idem: limpamos a tela e mostramos uma mensagem.

Caso 3 ou 4 seja escolhido, limpamos a tela e não acontece nada, simplesmente o menu é exibido novamente.

Se o usuário não digitar nenhuma dessas opções, é porque ele digitou algo errado e vai cair no case DEFAULT do SWITCH, e informamos que ele errou na escolha da opção.

Assim, nosso código de menu fica:

#include <stdio.h>

int main(void)
{
        int opcao;

        do
        {
            printf("\t\t\nMenu do curso C Progressivo\n");
            printf("0. Sair\n");
            printf("1. Dar Boas vindas\n");
            printf("2. Dar Oi\n");
            printf("3. Repetir o menu\n");
            printf("4. Ler mais uma vez o menu\n");

            printf("Opcao: ");
            scanf("%d", &opcao);

            switch( opcao )
            {
                case 0:
                        system("cls || clear");
                        printf("Saindo do menu...\n");
                        break;
                case 1:
                        system("cls || clear");
                        printf(" Bem-vindo ao menu do portal C Progressivo! \n");
                        break;
                case 2:
                        system("cls || clear");
                        printf(" Oi! \n");
                        break;
                case 3:
                case 4:
                        system("cls || clear");
                        break;
                default:
                        system("cls || clear");
                        printf("Opcao invalida! Tente novamente.\n");
            }
        } while(opcao);

}


Obviamente esse é um exemplo simples, que não faz nada, mas mostra bem o funcionamento do DO WHILE.
E menus são, obviamente, muito usados em programação.

Em nossa apostila online de C, vamos usar menus em aplicativos de simulação de um sistema bancário, em jogos e vários outros aplicativos. Portanto, é essencial que tenha entendio bem o funcionamento do DO WHILE com SWITCH.

Exercício de C:

No artigo sobre o teste condicional SWITCH em C, mostramos como usar ele para fazer uma calculadora.
Refaça essa calculadora, com o mesmo SWITCH, mas agora mostrando as operações matemáticas como opções de um menu, dentro de um laço DO WHILE.

11 comentários:

Atmos Maciel disse...

Olá estou gostando muito do site. NO meu caso eu uso o sublime text, mas esse termo system("cls||clear");
não é reconhcido por nenhum dos meus compiladores... Será que tenho que usar uma IDE, mas completa ao invés de editores de texto? Como o eclipse por exemplo?

Anônimo disse...

Tente adicionar a biblioteca stdlib.h ao seu programa.

Anônimo disse...

é cls ou clean depende do seu sistema operacional

Anônimo disse...

cls || clear
São comando limpar tela.
descrição abaixo:
cls usado S.O windows
clear usado S.O Linux

Anônimo disse...

Esse codigo da bug quando uma opção invalida é citada. Porque? (uso o codeblocks)

Kissaba disse...

excelente curso, estou muito feliz por ter encontrado este site.

Mateus Souza disse...

Atmos Maciel, eu também estou usando o Sublime Text. Basta adicionar a biblioteca stdlib.h

Anônimo disse...

"do while" do C progressivo achei mais claro e didático que o"do while"do Luis Damas. por outro lado, achei interessante scanf("%d",&(espaço0)opcao); ao inves de: scanf("%d, &opcao); substitui o fflush(stdin) e o
"system("cls || clear"); que, o Luis Damas mostra (pg 40) Linguagem C.

Yan Fernandes disse...

Cara muito bacana esse comando system, é exatamente a mesma coisa que estar na propria shell do s.o, todos comandos rodam de boa

unkn0wn_entity ; disse...

Atmos Maciel

Você está usando a função system de uma maneira estranha, com a função system você pode para o programa executar o comando cls||clear (cls ou clear) no sistema.
Vai retornar uma saída de comando não encontrado de alguns dos comandos dois comandos. O ideial serial usar estruturas de controle de fluxo para verificar se saída é falsa ou verdadeira.

Elizabete Venceslau disse...

Eu não consigo entender a função system,já olhei sua referência no site do cpluplus mas mesmo assim não esclareceu nada.Alguém pode me explicar como a função system funciona?

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.