Enviar um café pro programador

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

Os comandos CONTINUE e BREAK: pausando e alterando o fluxo de laços e testes condicionais

Apostila de C - Tutoriais completosAté o momento, em nosso curso de C, sempre percorremos os laços do início até o fim, no intervalo que escolhemos.

Porém, nem sempre isso é necessário. Pode ser que no meio do caminho consigamos obter o resultado que esperávamos e a continuação do laço seria mera perda de tempo.

Para controlar melhor os laços, vamos apresentar os comandos BREAK e CONTINUE, que usaremos ao longo de toda nossa apostila de C.


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


O comando BREAK em C: como usar

Break, em inglês, significa pausa, ruptura ou parar bruscamente.

E é basicamente isso que esse comando faz com os laços: se você colocar o comando break dentro de um laço e este for executado, ele vai parar imediatamente o laço e o programa continua após o laço.

Vamos dar um exemplo prático, e você verá melhor como funciona e qual a utilidade do comando break em C, que também existe em diversas outras linguagens de programação, como C++ e Java.

Sua principal função é evitar cálculos desnecessários.
Muitas vezes rodamos um looping, através de um laço (como FOR ou WHILE), para encontrar alguma informação. O break serve para terminar o laço em qualquer momento (como no momento em que encontrarmos essa informação, ao invés de ter que esperar que o looping termine).


Exemplo de código comentando em C 

Ok, assumimos.
A explicação que demos pode parecer um pouco confusa, a primeira vista.

Mas como sempre, você vai entender melhor o uso dos comandos BREAK e CONTINUE através de exemplos resolvidos e comentados de questões. Vamos mostrar alguns exemplos, e você entenderá melhor para que serve e como usar os comandos BREAK e CONTINUE, em C.

Ache o primeiro número, entre 1 e 1 milhão que é divisível por 11, 13 e 17.
Isso quer dizer que temos que encontrar o menor número que, quando dividimos ele por 11, por 13 e por 17 dê resto da divisão nulo.

Uma possível solução é a seguinte:

#include <stdio.h>

int main()
{
        int count,
            numero=0;

        for(count=1 ; count<=1000000 ; count++)
        {
            if(numero == 0)
                if((count%11==0) && (count%13==0) && (count%17==0))
                    numero=count;
        }

        printf("O numero e: %d", numero);

}


A variável 'count' é a que irá contar de 1 até 1 milhão.
O número que queremos será armazenado em 'numero' e inicializamos com valor 0.
Enquanto 'numero' tiver valor 0, é porque o número que estamos procurando ainda não foi achado, pois quando ele for achado a variável 'numero' irá mudar de valor e passará a ser o número que queremos.

Note que esse valor ficará sempre armazenado na variável 'numero', pois agora o primeiro teste condicional nunca mais será satisfeito.

Você vai ver que o número em questão é 2431.
E o que acontece depois que descobrimos esse número?
Ora, o laço continua a contar de 2431 até 1000000, pra nada.
Então o computador está gastando processamento à toa.

Aqui na minha máquina, essa operação durou 10milisegundos
Vamos dar uma otimizada nisso usando o comando BREAK.



Exemplo de código comentado em C

Ache o primeiro número, entre 1 e 1 milhão que é divisível por 11, 13 e 17. Use o comando BREAK.

A idéia do break é simples: quando acharmos o valor que queremos, damos um break e o programa sai do laço.
O código vai ficar assim:

#include <stdio.h>

int main()
{
        int count,
            numero;

        for(count=1 ; count<=1000000 ; count++)
            if((count%11==0) && (count%13==0) && (count%17==0))
            {
                numero=count;
                break;
            }


        printf("O numero e: %d", numero);

}

Note que agora só precisamos de um teste condicional IF.
Aqui na minha máquina, essa operação levou 2milisegundos.
Ou seja, 5x mais rápida. Isso se deve ao fato do laço não precisar mais ir de 2432 até 1 milhão.
Quando ele achou o número que eu queria, ele parou de contar.

Você pode pensar: "Ah, 8milisegundos não fazem a mínima diferença".
Bom, pra esse tipo de aplicação simples, realmente não faz mesmo, é praticamente instantâneo, ainda mais na linguagem C que é reconhecidamente uma das mais rápidas.

Agora imagine um jogo de alta performance ou o código de um Sistema Operacional, onde alguns códigos e rotinas são rodados milhões ou até bilhões de vezes? Esses 5ms virariam segundos ou minutos de lag ou travamento.
Por isso é sempre bom fazer um código limpo e eficiente, sem perder processamento à toa.

O comando break será mais utilizado no próximo artigo do C Progressivo, sobre o teste condicional SWITCH.

O comando CONTINUE em C: como usar

O comando CONTINUE, quando inserido dentro de algum laço, faz com que a iteração atual seja cancelada, e o laço prossegue na próxima iteração.

Ou seja, o BREAK faz todo o laço parar.
Já o CONTINUE, faz somente com que a iteração atual pare, pulando pra próxima.

Exemplo:
Faça um aplicativo em C que some todos os números, de 1 até 100, exceto os múltiplos de 5.

Fazemos o laço for percorrer de 1 até 100.
Testamos se cada número deixa resto 0 quando dividido por 5. Caso deixe, é porque é múltiplo de 5 e não devemos somar.
Para não somar, simplesmente pulamos essa iteração.

Porém, se não for múltiplo de 5, é porque a iteração não foi pulada, ela continua, então vamos somar esse número na soma total.

#include <stdio.h>

int main()
{
        int count,
            soma;

        for(count=1, soma=0 ; count<=100 ; count++)
        {
            if( count%5 ==0)
                continue;

            soma = soma + count;
        }


        printf("Soma %d", soma);

}

Diferente do BREAK, que pode ser usado em laços e no SWITCH (que veremos a seguir), o CONTINUE é utilizado em laços somente.

7 comentários:

Rafael Bizi disse...

Obrigado pelo código meu velho! Ajudou muito :)

Brittivaldo disse...

Gosto muito desse apostila!
Obrigado pela disponibilidade.

Unknown disse...

Fiz com o while e da 1050 e com o for da certo pq?
se eu colocar o continue; antes do S+=i; dá 0;

S=0;
i=1;
while(i<=100){
i++;
if(i%5==0){
S+=i;
continue;

}
}

Danrley disse...

Eu Fiz Com o laço For e deu 4000 Copiei o Exemplo do laço for e Tabem de 4000

Gama disse...

Amigo, você fará um "nível médio" ou avançado de C? Eu gostaria muito, e creio não ser o único. Desde já, agradeço pelas explicações ótimas que você nos tem passado :)

Anônimo disse...

Jonas Felipe, é por que você está somando apenas os múltiplos de 5.

Anônimo disse...

Fazendo dessa forma deu certo!Mas nao sei porque da 4100 quando
inicializa o i=1 com o teste i<=100. Deveria dar certo assim tmb.
#include
main(){
int S=0,i=0;

while(i<100){
i++;
if(i%5 ==0)
continue;

S+=i;

}
printf("Soma %d", S);

}