Tutoriais

Vamos Programar? – Introdução à Programação #11

9 Comentários

Interrupção do fluxo e teste lógico switch

O mundo está constantemente a evoluir: desde o mais pequeno inseto à espécie Humana. Evolução, mudança, futuro – são das palavras que mais são ouvidas atualmente.

A tecnologia tem revolucionado o mundo das mais diversas formas. Se quer entrar no mundo da tecnologia e deixar a sua marca, pode começar aqui.

programacao (2)


[field name=iframe]

 

Visualize este vídeo no YouTube

Interrupção do Fluxo

Os fluxos são algo (quase) indispensável em programas minimamente complexos que, por vezes, precisamos ter  um maior controle sobre os mesmos. Já conhecemos o loop while que nos permite repetir um determinado trecho de código enquanto uma condição for verdadeira.

Mas e se necessitarmos de interromper a continuidade de um fluxo por algum motivo? Se por exemplo, efetuarmos um teste lógico if para saber se é necessário efetuar algo mais dentro de um loop while. Se sim, realiza, mas caso contrário, deverá passar para a próxima iteração (repetição).

break

O primeiro comando que nos permite ter um maior controle sobre os fluxos de repetição é o comando break permite que terminemos o loop atual sem quaisquer problemas.

Exemplo

Precisamos de encontrar o primeiro número divisível por 17, 18 e 20 entre 0 e 1000000. Para o fazermos, bastaria utilizar o seguinte código:

#include 

int main()
{
        int count,
            num;
        
        count = 1;
        num = 0;
        
        while(count <= 1000000) {
            if(num== 0) {
                if((count%17==0) && (count%18==0) && (count%20==0)) {
                    num=count;
                }
            }
            count++;
        }
        
        printf("O número divisível por 17, 18 e 20 entre 1 e 1000000 é: %d", num);
        return 0;
}

Este trecho de código, depois de encontrar o número, que é 3060, continuaria a efetuar testes lógicos até o contador chegar a 1000000. Mas, se já encontrou o número, qual a necessidade de gastar tempo e poder de processamento? Bastaria adicionar um break para colmatar esta situação da seguinte forma:

#include 

int main()
{
        int count,
            num;
        
        count = 1;
        num = 0;
        
        while(count <= 1000000) {
            if(num== 0) {
                if((count%17==0) && (count%18==0) && (count%20==0)) {
                    num=count;
                    break;
                }
            }
            count++;
        }
        
        printf("O número divisível por 17, 18 e 20 entre 1 e 1000000 é: %d", num);
        return 0;
}

continue

O comando continue é o segundo comando deste género que interrompe a iteração atual passando logo para a seguinte iteração.

Exemplo

Precisamos de somar todos os números entre 0 e 1000 que não são múltiplos de 2 nem de 3. Para isso utilizamos o seguinte código:

#include 

int main()
{
    int count,
        sum;
    
    count = 1;
    sum = 0;
    
    while(count <= 1000) {
        
        if(count%2 == 0 || count%3 == 0) {
            count++;
            continue;
        }

        sum += count; //sum = sum + count
        count++;
    }

    printf("Soma %d", sum);
    return 0;
}

O que este código faz é percorrer os números de 1 a 1000 e, se for divisível por 2 ou por 3, passa para a próxima iteração (adicionando um valor ao número atual). Caso a condição não se verifique, o número é acrescentado à soma, adicionado um número a count passando assim para a próxima iteração.

Teste lógico switch

O teste condicional switch é extremamente útil quando precisamos de, por exemplo, efetuar um comando dependendo da opção, entre 0 e 10, que o utilizador escolheu.

Claro que poderíamos utilizar os if porém o código ficaria deveras extenso e um pouco complicado de ler. Veja o seguinte código com um switch:

#include 

int main()
{
    int option;
    
    printf("Insira a opção:\n");
    scanf("%d", &option);
    
    switch(option) {
        case 1:
            printf("Escolheu a opção 1");
            break;
        case 2:
            printf("Escolheu a opção 2");
            break;
        case 3:
            printf("Escolheu a opção 3");
            break;
        case 4:
            printf("Escolheu a opção 4");
            break;
        case 5:
            printf("Escolheu a opção 5");
            break;
        default:
            printf("Opção inexistente.");
            break;        
    }
    
    return 0;
}

Como pode visualizar, o código executado para cada opção pode ser diferente. Caso o inserido não corresponda a nenhuma das opções, o que está em default é executado. Veja o código anterior com if else:

#include 

int main()
{
    int option;
    
    printf("Insira a opção:\n");
    scanf("%d", &option);
    
    if (option == 1) {
        printf("Escolheu a opção 1");
    } else if (option == 2) {
        printf("Escolheu a opção 2");
    } else if (option == 3) {
        printf("Escolheu a opção 3");
    } else if (option == 4) {
        printf("Escolheu a opção 4");
    } else if (option == 5) {
        printf("Escolheu a opção 5");
    } else {
        printf("Opção inexistente.");
    }
    
    return 0;
}

Comparando as duas, é possível verificar que utilizando o switch o código fica mais legível e fácil de ser editado.

Deve ter reparado ainda que no final de cada instrução do switch utilizámos um break. Isto acontece porque, caso não o utilizemos, o programa continuaria a correr os comandos seguintes que existem no switch.

Exercícios

1 – Crie uma calculadora que possibilite fazer adições, subtrações, divisões e multiplicações a mais do que dois números. Utilize um switch e um loop while.

2 – Crie um programa que imprima os três primeiros números divisíveis por 5 e, simultâneamente por 10, entre 100 e 1000 minimizando o processamento recorrendo à interrupção do fluxo.


Mais uma vez, gostávamos de saber a sua opinião. Caso tenha alguma dúvida, pode sempre utilizar os comentários para colocar a questão. Caso o faça,  pedimos que utilize a keyword [DUVIDA] no início do seu comentários.


Resoluções de exercícios.

Esta saga

Henrique Dias

Mais episódios: 
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13][12] [14] [15] [16]
[17] [18] [19] [20] [21] [22] [23][24]

homefacebookgoogle-plus

Também pode gostar

Comentários

9

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Alex
    Alex

    Ola gostaria de saber o nome do editor da foto la em cima do post , acima do video.

    Grato

    Alex Rolim

    1. Avatar de Flávio Pinho
      Flávio Pinho

      Parece-me ser o sublime Text 2..

    2. Avatar de paulo g.
      paulo g.

      Podes usar o codeblocks, que funciona em todas as plataformas, é mesmo muito bom em c e c++.

  2. Avatar de Miguel Machado
    Miguel Machado

    A diferença na performance também se verifica… pelo menos em C# usando o CASE… ou estarei a dizer um disparate?

    1. Avatar de Henrique Dias

      Boa noite Miguel.

      De acordo com os testes que realizei aqui e com algumas informações que li, sim, o “switch” é realizado em menos tempo do que vários “if else”.

      Cumprimentos,

  3. Avatar de pedro
    pedro

    Boa noite

    Desculpem o off-topic mas alguém por aí tem conhecimentos de programação Android ? Ou indicam alguma pessoa dessa área ?
    Obrigado

  4. Avatar de tfae
    tfae

    O botão de download em PDF está a reencaminhar para o tutorial #10.

    1. Avatar de tfae
      tfae

      Afinal é só o título do PDF que está mal 😀

  5. Avatar de Roscas
    Roscas

    Alguém me consegue ajudar com o 2 exercicio ?2 – Crie um programa que imprima os três primeiros
    números divisíveis por 5 e, simultaneamente por 10, entre
    100 e 1000 minimizando o processamento recorrendo à
    interrupção do fluxo.