Estruturas de controle

As estruturas de controle em C são usadas para controlar o fluxo de execução de um programa. Existem dois tipos principais de estruturas de controle em C:

  • Estruturas condicionais
  • Estruturas de repetição.

Estruturas condicionais

As estruturas condicionais em C são usadas para executar um bloco de código conforme uma determinada condição seja verdadeira ou falsa.

O C tem duas estruturas condicionais: a instrução if e a instrução switch-case.

A instrução if

A sintaxe da instrução if é a seguinte:

if (condição) {
   // bloco de código a ser executado se a condição fôr verdadeira
}

Se a condição fôr verdadeira o bloco de código é executado, caso contrário não é:

    int nr1 = 24;
    int nr2 = 17;

    if(nr1 >= nr2){
        puts("nr1 maior ou igual a nr2");
    }

No exemplo acima, o output será “nr1 maior ou igual a nr2” uma vez que a condição é verdadeira.

A instrução if … else

A sintaxe da instrução if…else é a seguinte:

if (condição) {
   //bloco de código 1 a ser executado se a condição for verdadeira
}else{
   //bloco de código 2 a ser executado se a condição for falsa
}

Se a condição fôr verdadeira executa o bloco de código 1 senão, executa o bloco de código 2:

    int nr1 = 17;
    int nr2 = 24;

    if(nr1 >= nr2){
        puts("nr1 maior ou igual a nr2");
    }else{
        puts("nr1 menor que nr2");
    }

No exemplo acima o output será “nr1 menor que nr2”, uma vez que a condição é falsa.

A instrução if … else if … else

A instrução if …else if…else é usada para executar diferentes blocos de código com base em condições específicas. Ela permite que o programador controle o fluxo de execução do programa com base em diferentes situações. Você pode testar várias condições e executar um bloco de código correspondente à primeira condição verdadeira encontrada.

Se nenhuma das condições fôr satisfeita, é executado o bloco de código da cláusula else, no final,  caso ela exista.

A sintaxe da instrução é a seguinte:

if (condição1) {
   // bloco de código a ser executado se a condição1 for verdadeira
} else if (condição2) {
   // bloco de código a ser executado se a condição2 for verdadeira
...
} else if (condiçãoN){
   // bloco de código a ser executado se a condiçãoN for verdadeira
} [else {
   // bloco de código a ser executado se nenhuma das condições anteriores for verdadeira
}]

De acordo com a sintaxe, a instrução if… else if…else pode ter vários blocos else if  mas só pode ter um bloco if no inicio e, opcionalmente, um bloco else, no final:

    int nr;
    
    puts("Introduza um numero inteiro entre 1 e 4");
    scanf("%d", &nr);
    
    if(nr == 1){
        puts("Introduziu o nr 1");
    }else if(nr == 2){
        puts("Introduziu o nr 2");
    }else if(nr == 3){
        puts("Introduziu o nr 3");
    }else if(nr == 4){
        puts("Introduziu o nr 4");
    }else{
        puts("Nr inválido");
    }

De notar que, nesta instrução, só um dos blocos é executado.

A instrução switch … case

A instrução switch-case é usada para selecionar um bloco de código a ser executado com base no valor de uma expressão. A instrução switch-case é uma alternativa mais eficiente e legível do que usar várias instruções if-else if .

A sintaxe da instrução switch-case é a seguinte:

switch (expressão) {
   case valor1:
      // código a ser executado se a expressão for igual a valor1
      [break;]
   ...
   case valorN:
      // código a ser executado se a expressão for igual a valorN
      [break;]
   [default:
      // código a ser executado se a expressão não for igual a nenhum dos valores
      break;]
}

De acordo com a sintaxe, a instrução switch-case começa por avaliar uma expressão e executa um dos blocos case consoante o seu valor. Caso não haja nenhuma opção case que corresponda ao valor da expressão, é executada a opção default, se esta existir.

De notar que, quer a instrução break quer o bloco default são opcionais.

Exemplo 1:

int dia;
printf("Digite um número de 1 a 7: ");
scanf("%d", &dia);
switch (dia) {
   case 1:
      printf("Domingo\n");
      break;
   case 2:
      printf("Segunda\n");
      break;
   case 3:
      printf("Terça\n");
      break;
   case 4:
      printf("Quarta\n");
      break;
   case 5:
      printf("Quinta\n");
      break;
   case 6:
      printf("Sexta\n");
      break;
   case 7:
      printf("Sábado\n");
      break;
   default:
      printf("Número inválido\n");
      break;
}

Neste exemplo, verificamos que cada bloco case termina com a instrução break. Esta instrução interrompe a execução da instrução switch, passando para a instrução seguinte.

Caso a instrução break não exista num bloco case, o programa executa os blocos case seguintes até encontrar uma instrução break ou atingir o final na instrução switch.

Exemplo 2:

    int nr = 1;
    
    switch(nr){
    case 1:
        puts("Nr 1");
    case 2:
        puts("Nr 2");
    case 3:
        puts("Nr 3");
        break;
    case 4:
        puts("Nr 4");
    default:
        puts("Nr invalido");
    }

Neste exemplo, o output no ecran será

Nr 1

Nr 2

Nr 3

porque o bloco case 1 será executado assim como os blocos case 2 e case 3 uma vez que os blocos case 1 e case 2 não têm a instrução break.

A instrução switch-case também suporta a utilização de múltiplos casos para um mesmo bloco de código, como por exemplo:

int dia;
printf("Digite um dia da semana de 1 a 7: ");
scanf("%d", &dia);
switch (dia) {
   case 1:
   case 7:
      printf("Fim de semana\n");
      break;
   case 2:
   case 3:
   case 4:
   case 5:
   case 6:
      printf("Dia útil\n");
      break;
   default:
      printf("Número inválido\n");
      break;
}

No exemplo acima, se o dia escolhido fôr 1 ou 7, o bloco case 7 é executado. Se o dia escolhido fôr 2, 3, 4, 5, ou 6, o bloco case 6 é executado.

Estruturas de repetição

As estruturas de repetição em C são usadas para executar um bloco de código várias vezes. Existem três tipos principais de estruturas de repetição em C: for, while e do-while.

Repetição for

A repetição for é usada para executar um bloco de código um número específico de vezes.

De forma a repetição executar um bloco de código um numero especifico de vezes, é usada uma variável inteira que serve para contar as iterações.

A sintaxe da instrução é a seguinte:

for (inicialização; condição; incremento) {
   // código a ser executado enquanto a condição for verdadeira
}

Inicialização: a variável é inicializada com um valor.

Condição: a variável é testada no inicio de cada iteração para confirmar se já atingiu o numero de iterações que se pretende. Se já atingiu a repetição termina senão é executada mais uma iteração.

Incremento: a variável é incrementada de um valor no final de cada iteração.

Exemplo:

int i;
for (i = 1; i <= 10; i++) {
   printf("%d\n", i);
}

Neste exemplo a instrução for executa dez iterações repetindo a instrução printf() esse numero de vezes.

Repetição while

A repetição while em C é usada para executar um bloco de código enquanto uma determinada condição for verdadeira.

A sintaxe da estrutura while é a seguinte:

while (condição) {
   // código a ser executado enquanto a condição for verdadeira
}

Exemplo:

    int nr;
    
    puts("Digite um nr inteiro (0 para terminar");
    scanf("%d", &nr);
    
    while(nr != 0){
        printf("%d\n", nr);
        puts("Digite um nr inteiro (0 para terminar");
        scanf("%d", &nr);
    }

Repetição do … while

A estrutura de repetição do-while em C é usada para executar um bloco de código pelo menos uma vez e, em seguida, repetir o bloco enquanto uma determinada condição for verdadeira.

A sintaxe da estrutura do…while é a seguinte:

do {
   // código a ser executado pelo menos uma vez
} while (condição);

Exemplo:

    int nr;
      
    do{
        puts("Digite um nr inteiro (0 para terminar");
        scanf("%d", &nr);
	  if( nr != 0){
		printf("%d\n", nr);
	  }
		
    } while(nr != 0);

Desvios de controle – break e continue

As instruções break e continue em C são usadas para controlar o fluxo de execução de uma repetição. Estas instruções podem ser usadas nas repetições for, while e do…while.

A instrução break

A instrução break em C é usada para sair imediatamente de uma repetição. Quando a instrução break é executada, a repetição é interrompida e a execução continua na próxima instrução após a repetição. A instrução break é geralmente usada com uma condição dentro da repetição. Se a condição for verdadeira, a instrução break é executada e a repetição é interrompida.

A sintaxe mais comum da instrução break é a seguinte (neste caso aplicada à repetição while):

while (condição) {
   // código a ser executado enquanto a condição for verdadeira
   if (condição_de_saida) {
      break;
   }
}

Exemplo:

int i;
for (i = 1; i <= 10; i++) {
   if (i == 4) {
      break;
   }
   printf("%d\n", i);
}

Neste exemplo, a instrução break é usada para sair da repetição quando a variável i fôr igual a 4. A repetição é executada 4 vezes e os números de 1 a 3 são impressos no ecran.

A instrução continue

A instrução continue em C é usada para saltar uma iteração da repetição e continuar com a próxima iteração. Quando a instrução continue é executada, a repetição é interrompida e a execução continua com a próxima iteração da repetição. A instrução continue é geralmente usada com uma condição dentro da repetição. Se a condição for verdadeira, a instrução continue é executada e a iteração atual da repetição é interrompida.

A sintaxe mais comum da instrução continue é a seguinte:

while (condição) {
   // código a ser executado enquanto a condição for verdadeira
   if (condição_de_salto da iteração) {
      continue;
   }
   // código a ser executado se a condição de salto não for verdadeira
}

Exemplo:

int i;
for (i = 1; i <= 10; i++) {
   if (i == 5) {
      continue;
   }
   printf("%d\n", i);
}

Neste exemplo, a instrução continue é usada para saltar a iteração da repetição quando a variável i fôr igual a 5. A repetição é executado 9 vezes e os números de 1 a 4 e de 6 a 10 são impressos no ecran.