В опрос про IF и SWITCH

Тема в разделе "Arduino & Shields", создана пользователем prapor99, 13 фев 2016.

  1. prapor99

    prapor99 Нуб

    Есть примерно вот такой код:

    if (xy == 1 && z == 1)
    {
    выполнять действие A
    }

    if (xy == 1 && z == 2)
    {
    выполнять действие B
    }

    if (xy == 2 && z == 1)
    {
    выполнять действие С
    }

    и т.д.
    Вопрос: можно ли в SWITCH проверять несколько условий и соответственно какой оператор грамотнее применять в данных условиях.
     
  2. geher

    geher Гуру

    Не зная, насколько простирается и т.д., ответить сложно.
    Есть несколько вариантов.
    1. Предполагаем, что значений каждой переменной два, 1 и 2.
    Обычно значения двух разных переменных, используемые в условиях, определяют действие двух разных факторов. В этом случае лучше структурировать код по факторам. Предположим, что фактор, выражаемый переменной xy важнее. Тогда его логично проверять первым.
    Код (Text):

    if (xy == 1) {
      if (z==1){
        выполнять действие A
      } else {
        выполнять действие B
      }
    } else {
      if (z==1){
        выполнять действие C
      } else {
        выполнять действие D
      }
    }
     
    2. Если вариантов много:
    Код (Text):

    switch(xy){
      case 1:
         switch(z){
             case 1:
                  выполнять действие A
                  break;
             case 2:
                  выполнять действие B
                  break;
             и т.д.
         }
         break;
      case 2:
         switch(z){
             case 1:
                  выполнять действие C
                  break;
             case 2:
                  выполнять действие D
                  break;
             и т.д.
         }
         break;
      и т.д.
    }
     
    3. Если вариантов много, но факторы xy и z примерно равнозначны (например, это какие-то координаты точек, случайно разбросанных в плоскости).
    Код (Text):

    switch((xy<<4)+z){
    // величина сдвига зависит от количества вариантов.
    // Сдвиг на 4 позволит работать с 16 вариантами по
    // каждому фактору (значения от 0 до 15)
    // Если надо, например, до 256 вариантов, то сдвигать надо на 8
      case 0x11:
            выполнять действие A
            break;
      case 0x12:
            выполнять действие B
            break;
      case 0x21:
            выполнять действие C
            break;
      case 0x22:
            выполнять действие D
            break;
       и т.д.
    }
     
    Естественно, в каждом из вариантов лучше избавиться от "волшебных чисел" и объявить константы, например, в третьем случае, если мы имеем с координатами, то что-то в духе
    Код (Text):

    #define pointA 0x11
    #define pointB 0x12
    #define pointС 0x21
    #define pointD 0x22
    switch((xy<<4)+z){
      case pointA:
            выполнять действие A
            break;
      case pointB:
            выполнять действие B
            break;
      case pointC:
            выполнять действие C
            break;
      case pointD:
            выполнять действие D
            break;
       и т.д.
    }
     
     
    vvr нравится это.
  3. prapor99

    prapor99 Нуб

    Спасибо! Первые два варианта ответа предельно понятны. Третий вариант пока не понял, т. к. "ардуиню" недавно. Ничего сейчас "погуглю" - разберусь.
     
  4. Unixon

    Unixon Оракул Модератор

    Не нужно ардуинить, изучайте C++.
     
  5. prapor99

    prapor99 Нуб

    Без смеха. Не подскажите учебничек по дельнее и по понятнее для чайника. Чтоб не идти как всегда велосипедной тропой.
     
  6. ИгорьК

    ИгорьК Гуру

    Идти этой тропой.
     
    РоманИ нравится это.
  7. Onkel

    Onkel Гуру

    имхо хайвей Керниган и Риччи, вместе с любой толковой книжкой по ардуине, например тот же Jeremy Blum.