Оператор switch сверяет переменную со списком значений, которые называются cases(случай), находит совпадения и выполняет блок кода в том case, где это совпадение было найдено.

Switch case - переключатель.

Синтаксис:

switch (var) {
 case константа:
    // блок кода
    break;
 case константа:
    // блок кода
    break;
 default:
    // блок кода
}

Оператор break позволяет выйти из оператора swich если совпадение было найдено и нет необходимости выполнять код в остальных блоках case. Блок кода в операторах case не заключён в фигурные скобки, а оператор break является завершающим оператором блока кода оператора case.

Блок кода следующий за оператором default выполняется только тогда, когда в операторе switch не было найдено ни одного совпадения.

В следующем примере, игра «flip-flop», показано примерение функции switch case. 

Для понимания программы из этого примера студентам достаточно знать типы и операции C++. Знание других, управляющих ходом выполнения программы функций, кроме switch case, не требуется. 

Ниже приведена принципиальная электрическая схема электронной игры:

Рис. 1.

auto kset = 9, kstart = 10, led_set = 0;


void setup() {
  DDRD  = 0b11111111;
  PORTD = 0b11011000;
  pinMode(kset, INPUT_PULLUP);
  pinMode(kstart, INPUT_PULLUP);
}

void loop() {
  digitalRead(kset) ? 0 : led_set++ ;
  led_set %= 8;
  auto tmp = PORTD;
  while(not digitalRead(kset)){
    bitSet(PORTD, led_set);
    delay(100);
    bitClear(PORTD, led_set);
    delay(100);
  }
  PORTD = tmp;
  digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
  delay(50);
}

Лист. 1. Выбор светодиода

auto kset = 9, kstart = 10, led_set = 0;


void setup() {
  DDRD  = 0b11111111;
  PORTD = 0b11011000;
  pinMode(kset, INPUT_PULLUP);
  pinMode(kstart, INPUT_PULLUP);
}

void loop() {
  digitalRead(kset) ? 0 : led_set++ ;
  led_set %= 8;
  auto tmp = PORTD;
  while(not digitalRead(kset)){
    bitSet(PORTD, led_set);
    delay(100);
    bitClear(PORTD, led_set);
    delay(100);
  }
  PORTD = tmp;
  digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
  switch(led_set) {
    case 0:
      PORTD ^= 1;
      break;
    case 1:
      PORTD ^= 2;
      break;
    case 2:
      PORTD ^= 4;
      break;
    case 3:
      PORTD ^= 8;
      break;
    case 4:
      PORTD ^= 16;
      break;
    case 5:
      PORTD ^= 32;
      break;
    case 6:
      PORTD ^= 64;
      break;
    case 7:
      PORTD ^= 128;
      break;
  }
  while(not digitalRead(kstart)){
    delay(100);
  }
  delay(50);
}

Лист. 2. Инверсия выбранного светодиода

auto kset = 9, kstart = 10, led_set = 0;


void setup() {
  DDRD  = 0b11111111;
  PORTD = 0b11011000;
  pinMode(kset, INPUT_PULLUP);
  pinMode(kstart, INPUT_PULLUP);
}

void loop() {
  digitalRead(kset) ? 0 : led_set++ ;
  led_set %= 8;
  auto tmp = PORTD;
  while(not digitalRead(kset)){
    bitSet(PORTD, led_set);
    delay(100);
    bitClear(PORTD, led_set);
    delay(100);
  }
  PORTD = tmp;
  digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
  switch(led_set) {
    case 0:
      PORTD ^= 128;
      break;
    case 1:
      PORTD ^= 64;
      break;
    case 2:
      PORTD ^= 32;
      break;
    case 3:
      PORTD ^= 16;
      break;
    case 4:
      PORTD ^= 8;
      break;
    case 5:
      PORTD ^= 4;
      break;
    case 6:
      PORTD ^= 2;
      break;
    case 7:
      PORTD ^= 1;
      break;
  }
  while(not digitalRead(kstart)){
    delay(100);
  }
  delay(50);
}

Лист. 3. Инверсия светодиода, противоположного выбранному

auto kset = 9, kstart = 10, led_set = 0;


void setup() {
  DDRD  = 0b11111111;
  PORTD = 0b11011000;
  pinMode(kset, INPUT_PULLUP);
  pinMode(kstart, INPUT_PULLUP);
}

void loop() {
  digitalRead(kset) ? 0 : led_set++ ;
  led_set %= 8;
  auto tmp = PORTD;
  while(not digitalRead(kset)){
    bitSet(PORTD, led_set);
    delay(100);
    bitClear(PORTD, led_set);
    delay(100);
  }
  PORTD = tmp;
  digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
  switch(led_set) {
    case 0:
      PORTD ^= 1;
      PORTD ^= 2;
      PORTD ^= 4;
      PORTD ^= 8;
      PORTD ^= 128;
      break;
    case 1:
      PORTD ^= 1;
      PORTD ^= 2;
      PORTD ^= 4;
      PORTD ^= 8;
      PORTD ^= 64;
      break;
    case 2:
      PORTD ^= 32;
      break;
    case 3:
      PORTD ^= 16;
      break;
    case 4:
      PORTD ^= 8;
      break;
    case 5:
      PORTD ^= 4;
      break;
    case 6:
      PORTD ^= 2;
      break;
    case 7:
      PORTD ^= 1;
      break;
  }
  while(not digitalRead(kstart)){
    delay(100);
  }
  delay(50);
}

Лист. 4. Инверсия строки и колонки

auto kset = 9, kstart = 10, led_set = 0;


void setup() {
  DDRD  = 0b11111111;
  PORTD = 0b11011000;
  pinMode(kset, INPUT_PULLUP);
  pinMode(kstart, INPUT_PULLUP);
}

void loop() {
  digitalRead(kset) ? 0 : led_set++ ;
  led_set %= 8;
  auto tmp = PORTD;
  while(not digitalRead(kset)){
    bitSet(PORTD, led_set);
    delay(100);
    bitClear(PORTD, led_set);
    delay(100);
  }
  PORTD = tmp;
  digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
  switch(led_set) {
    case 0:
      PORTD ^= 0b10001111;
      break;
    case 1:
      PORTD ^= 0b01001111;
      break;
    case 2:
      PORTD ^= 0b00101111;
      break;
    case 3:
      PORTD ^= 0b00011111;
      break;
    case 4:
      PORTD ^= 0b11111000;
      break;
    case 5:
      PORTD ^= 0b11110100;
      break;
    case 6:
      PORTD ^= 0b11110010;
      break;
    case 7:
      PORTD ^= 0b11110001;
      break;
  }
  while(not digitalRead(kstart)){
    delay(100);
  }
  delay(50);
}

Лист. 5. Инверсия строки и колонки

auto kset = 9, kstart = 10, led_set = 0;


void setup() {
  DDRD  = 0b11111111;
  randomSeed(analogRead(0));
  PORTD = random(2,128);
  pinMode(kset, INPUT_PULLUP);
  pinMode(kstart, INPUT_PULLUP);
}

void loop() {
  digitalRead(kset) ? 0 : led_set++ ;
  led_set %= 8;
  auto tmp = PORTD;
  while(not digitalRead(kset)){
    bitSet(PORTD, led_set);
    delay(100);
    bitClear(PORTD, led_set);
    delay(100);
  }
  PORTD = tmp;
  digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
  switch(led_set) {
    case 0:
      PORTD ^= 0b10001111;
      break;
    case 1:
      PORTD ^= 0b01001111;
      break;
    case 2:
      PORTD ^= 0b00101111;
      break;
    case 3:
      PORTD ^= 0b00011111;
      break;
    case 4:
      PORTD ^= 0b11111000;
      break;
    case 5:
      PORTD ^= 0b11110100;
      break;
    case 6:
      PORTD ^= 0b11110010;
      break;
    case 7:
      PORTD ^= 0b11110001;
      break;
  }
  while(not digitalRead(kstart)){
    delay(100);
  }
  delay(50);
}

Лист. 6. Добавлена функция random

auto kset = 9, kstart = 10, led_set = 0;


void setup() {
  DDRD  = 0b11111111;
  randomSeed(analogRead(0));
  PORTD = random(2,128);
  pinMode(kset, INPUT_PULLUP);
  pinMode(kstart, INPUT_PULLUP);
}

void loop() {
  digitalRead(kset) ? 0 : led_set++ ;
  led_set %= 8;
  auto tmp = PORTD;
  while(not digitalRead(kset)){
    bitSet(PORTD, led_set);
    delay(100);
    bitClear(PORTD, led_set);
    delay(100);
  }
  PORTD = tmp;
  digitalRead(kstart) ? bitSet(led_set, 5) : bitClear(led_set, 5);
  if(led_set < 8){
    PORTD ^= 1 << (7-led_set);
    if(led_set < 4){
      PORTD ^= 0b00001111;
    }
    else {
      PORTD ^= 0b11110000;
    }}
  while(not digitalRead(kstart)){
    delay(100);
  }
  delay(50);
}

Лист. 7. Игра написана с использованием функции if