Есть примерно вот такой код: if (xy == 1 && z == 1) { выполнять действие A } if (xy == 1 && z == 2) { выполнять действие B } if (xy == 2 && z == 1) { выполнять действие С } и т.д. Вопрос: можно ли в SWITCH проверять несколько условий и соответственно какой оператор грамотнее применять в данных условиях.
Не зная, насколько простирается и т.д., ответить сложно. Есть несколько вариантов. 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; и т.д. }
Спасибо! Первые два варианта ответа предельно понятны. Третий вариант пока не понял, т. к. "ардуиню" недавно. Ничего сейчас "погуглю" - разберусь.
Без смеха. Не подскажите учебничек по дельнее и по понятнее для чайника. Чтоб не идти как всегда велосипедной тропой.
имхо хайвей Керниган и Риччи, вместе с любой толковой книжкой по ардуине, например тот же Jeremy Blum.