Controlo da Execução
Execução Condicional
If
Mais uma vez, por esta altura já devemos estar mais que habituados a expressões if
, else if
e else
: expressões condicionais que permitem exprimir decisões consoante um dado conjunto de condições.
if (/* condição 1 */) {
/* instrução 1 */
} else if (/* condição 2 */) {
/* instrução 2 */
} else {
/* instrução 3 */
}
Switch
Passamos então a uma operação que não foi abordada em FP: switch
(switch-case) corresponde a um problema de decisão com múltiplas opções. Testa-se uma expressão, sendo que se a mesma coincidir com um dado caso, a instrução/conjunto de instruções a ele associadas são executadas. Podemos ainda definir (não obrigatoriamente) um conjunto de instruções para o caso especial em que a expressão não coincide com nenhum dos outros casos: default
.
Devemos por norma colocar um break
no final de cada conjunto de instruções, visto que caso contrário continuaremos a verificar todos os outros casos. Exceções aplicam-se quando queremos que dois case
s distintos seguidos executem o mesmo conjunto de instruções: no trecho abaixo podemos ver isso mesmo com case 'b'
e case 'B'
, que vão executar o mesmo conjunto de instruções.
switch (c = getchar()) {
case 'a':
/* instruções 1 */
break; /* parar a execução dentro do switch aqui */
case 'b':
case 'B':
/* instruções 2 */
default:
/* instruções 3 */
}
Ciclos Genéricos
While
Enquanto uma dada expressão se verificar, uma instrução/conjunto de instruções são executadas.
while (/* expressão */) {
/* instruções */
}
For
for
loops têm a particularidade de ter um cabeçalho, ao contrário de while
loops. Esse mesmo cabeçalho possui:
- uma expressão de inicialização, como por exemplo
int i = 0
: tipicamente a variável que vai ser iterada durante o loop e que normalmente faz parte da condição de ciclo do mesmo; - a condição de ciclo do loop: enquanto esta se verificar, o loop continua;
- uma expressão de incremento/alteração, que altera um dado conjunto de variáveis.
Um exemplo de cabeçalho de um for
loop poderia ser for (int i = 0; i < 10; i++)
: o loop vai ser executado enquanto a variável i
, inicializada a 0 e incrementada em 1 unidade por iteração, tiver valor menor que 10.
for (/* expr inicialização */; /* condição */; /* expr alteração */) {
/* instruções */
}
Do-while
Bastante semelhante ao while
loop, com um twist: o loop é sempre executado pelo menos uma vez, já que a condição só é testada no fim do mesmo.
do {
/* instruções */
} while (/* condição */);
Break e Continue
A instrução break
, como sabemos, permite terminar a execução de um for
, while
, do-while
ou switch
. A instrução continue
, por sua vez, desencadeia a execução da próxima iteração de um for
, while
ou do-while
, ignorando todo o resto das instruções do loop que poderiam ser executadas a seguir.
Exemplo com algumas das funções dadas:
int main() {
char command;
while (1) {
command = getchar(); /* Lê o comando */
switch (command) {
case 'a':
/* Chama a função responsável pela execução do comando a */
break;
case 'b':
/* Chama a função responsável pela execução do comando b */
break;
case 'x':
return 0; /* Termina o programa com sucesso */
default:
printf("ERRO: Comando desconhecido\n");
}
getchar(); /* Lê o '\n' introduzido pelo utilizador */
}
return -1; /* Se chegou aqui algo correu mal */
}