A instrução switch..case é uma estrutura condicional que executa diferentes blocos de instruções dependendo do valor de uma variável. Ela equivale a instruções if aninhadas.
Sintaxe da instrução switch
A instrução switch toma geralmente como entrada uma variável sob a forma de inteiro (integer ou int) e executa diferentes blocos de instruções dependendo do seu valor. Os blocos de instruções são colocados sob instruções case. A cada execução, a instrução switch compara o valor de val com os valores de val1, val2, etc. e executa os blocos de código correspondentes.
switch (val) {
case val1:
// instructions si val=val1
break;
case val2:
// instructions si val=val2
break;
default:
// instructions par défaut
break;
}
No exemplo a seguir, definimos uma variável val que se incrementa a cada loop. A instrução switch executa o código correspondente ao valor de val. Podemos observar que, quando o valor de val não é definido num case, o código sob a instrução defaut é executado.
int val=0;
void setup() {
Serial.begin(9600);
}
void loop() {
switch (val) {
case 0:
Serial.println("ZERO");
break;
case 1:
Serial.println("ONE");
break;
case 2:
Serial.println("TWO");
break;
case 3:
Serial.println("THREE");
break;
default:
Serial.println("UNDEFINED");
break;
}
val++;
if(val>5) val=0;
delay(500);
}
Construções anexas
Uso de uma variável de tipo char
A variável a testar é normalmente um inteiro, mas também pode ser uma variável do tipo char. A não se confundir com uma cadeia de caracteres (uma matriz de caracteres ou um String).
char val='a';
void setup() {
Serial.begin(9600);
}
void loop() {
switch (val) {
case 'a':
Serial.println("A");
val='b';
break;
case 'b':
Serial.println("B");
val='d';
break;
case 'c':
Serial.println("C");
val='a';
break;
case 'd':
Serial.println("D");
val='c';
break;
default:
Serial.println("UNDEFINED");
break;
}
delay(500);
}
Reunião de vários cases para um bloco de instruções
Ao remover a instrução break, é possível executar o mesmo bloco de instruções para cases diferentes. Com isso, torna-se desnecessário reescrever o bloco quando a função é a mesma para diferentes cases.
char val=0;
void setup() {
Serial.begin(9600);
}
void loop() {
switch (val) {
case 1:
case 3:
case 5:
case 7:
case 9:
Serial.println("IMPAIR");
break;
case 2:
case 4:
case 6:
case 8:
Serial.println("PAIR");
break;
default:
Serial.println("> 10");
break;
}
val++;
if(val>10) val=0;
delay(500);
}
Para lembrar
- A instrução switch toma como entrada uma variável int ou char colocada entre parênteses.
- O bloco de instruções switch é escrito entre chaves {}.
- A instrução case toma como entrada um int ou um char seguido de “:”.
- Acrescentamos a instrução break após o bloco de instruções case para evitar a execução dos blocos seguintes.
- É possível reunir vários cases para o mesmo bloco de instruções.
- É possível dispensar o bloco de instruções defaut.
Bônus
A declaração switch case é frequentemente utilizada em combinação com numeradores enum, que são um tipo de estrutura contendo inteiros constantes. O emprego do tipo enum é um método de inicialização conveniente para definir uma multiplicidade de inteiros em sequência.
enum alphabet{
ALPHA,
BETA,
GAMMA,
UNKNOWN
};
Neste exemplo, as variáveis ALPHA, BETA, GAMMA, UNKNOWN assumirão os valores 0, 1, 2 e 3 respectivamente. Qualquer variável acrescentada após essa lista terá um valor igual ao valor anterior acrescido de 1. Também é possível, a qualquer momento, definir explicitamente o valor da variável e assim modificar o ponto de partida da enumeração.
enum alphabet{
ALPHA=0,
BETA,
GAMMA=9,
UNKNOWN
};
Neste exemplo, os valores definidos são:
- ALPHA=0
- BETA=1
- GAMMA=9
- UNKNOWN=10
Um numerador pode ser usado para representar uma máquina de estado. Este é um método prático para gerenciar um sistema complexo, como o algoritmo de um robô.
enum States{
INITIALIZED,
WAITING,
FAILED,
VALID
};
int state=0;
void setup() {
Serial.begin(9600);
}
void loop() {
switch (state) {
case INITIALIZED:
Serial.println("INITIALIZED");
break;
case WAITING:
Serial.println("WAITING");
break;
case VALID:
Serial.println("VALID");
break;
case FAILED:
Serial.println("FAILED");
break;
default:
Serial.println("DEFAULT");
break;
}
state++;
if(state>5) state=0;
delay(500);
}
Fontes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

