Estruturas de Controle


1 - Considerações Gerais

Na linguagem C, por não termos um tipo de dado booleano, uma expressão é considerada falsa quando retornar 0 e verdadeira qundo retorna qualquer outro valor.

Qualquer condição em C deve estar entre parênteses.

Delimitadores de Bloco

As chaves {} são usadas como delimitadores, substituindo o begin e o end do Pascal.

Terminador de Comandos

O ponto r vírgula ";" funcionará como um terminador de comandos e não como um separador de comandos, sendo assim, ele aparecerá sempre que precisarmos terminar um comnado, não tendo nenhuma restrição se após ele vem um else ou um delimitador de final de bloco.

2 - Seleção

2.1) If:

Com dois processamentos alternativos.

Forma Geral:

if (< condição >)
< bloco 1 >
else < bloco 2 >

Considerações:
- Se o resultado de condição for igual a zero o bloco 2 será executado, se for qualquer valor diferente de zero, será executado o bloco 1.
- Cada bloco de comandos pode ser constituído de um ou mais comandos de qualquer tipo, incluindo o próprio if.
- O else é opcional (caso não haja cláusula senão, ele não necessita ser usado).
- No caso de múltiplos if's aninhados, o else sempre se associa ao if imediatamente mais próximo.

Ex 1:
if (x == y)
printf("igual");
else
printf("diferente");

Ex 2:
if (z)
{
x +=y;
z = x;
}

2.2) Switch:

Com múltiplos processamentos alternativos

Forma Geral:

switch (< expressão >)
{
case < valor 1 >: {< bloco 1 >}
case < valor 2 >: {< bloco 2 >}
case < valor 3 >: {< bloco 3 >}
case < valor n >: {< bloco n >}
default: {< bloco x >}
}

Considerações:
- Uma única condição (expressão) é avaliada e seu valor comparado com os valores dos casos.
- Poderíamos ter o mesmo processamento utilizando if's aninhados.
- Cada case possui um valor ou expressão constante.
- O "default" é opcional, correspondente ao else do if.
- O switch não é mutuamente exclusivo. O resultado da expressão é comparado com os valores existentes nos CASE's e todos os valores iguais encontrados são executados.
- Para que o switch se torne mutuamente exclusivo é necessário após o bloco de comandos de cada case incluir o comando BREAK, que desvia a execução do algoritmo para o próximo comando após a estrutura switch.

switch (< expressão >)
{
case < valor 1 >: {< bloco 1 > break;}
case < valor 2 >: {< bloco 2 > break;}
case < valor 3 >: {< bloco 3 > break;}
case < valor n >: {< bloco n > break;}
default: {< bloco x >}
}

Após o bloco de comandos do default não é necessário o break, visto que não existe outro bloco após ele. Se o resultado da expressão não for igual a nenhum dos valores listados nos cases, o bloco correspondente ao default será executado.

3 - Repetição

3.1) While:

O número de repetições não é conhecido e o bloco de comandos pode nunca ser executado.

Forma Geral:

While (< condição >)
< bloco >

Considerações:
- O bloco é executado enquanto a condição for verdadeira (ou seja, diferente de 0).

Ex:
while (x < y)
{
x++;
printf("teste");
}

3.2) Do:

O número de repetições não é conhecido e o bloco de comandos é executado pelo menos uma vez.

Forma Geral:

do
< bloco >
While < condição >

Considerações:
- O bloco é executado enquanto a condição for verdadeira (ou seja, diferente de 0).
- O bloco é executado ao menos uma vez.

Ex:
do
{
x++;
printf("teste");
} while ( x < y )

3.3) For:

O número de repetições é conhecido.

Forma Geral:

for ( < expressão 1 > ; < expressão 2 > ; < expressão 3 > )
< bloco >

Considerações:
- expressão 1: inicializa a variável de controle e é executada uma única vez, antes da execução do bloco.
- expressão 2: teste da condição e é executada tantas vezes quantas forem as repetições, antes da execução do bloco.
- expressão 3: incremento da variável de controle e é executada tantas vezes quantas forem as repetições, depois da execução do bloco.

Ex: Se quiséssemos repetir um determinado bloco de comandos 10 vezes, as estruturas utilizadas seriam as seguintes:

for( i = 1; i <= 10; i++ )
printf("%d",i);